Right... As I said, lossy conversions cannot be done
as a type cast, which is what this is. You have to use
the Java Double class methods to parse the string.
Edward
At 06:21 AM 8/10/2007, [BE] Ufuk Utku Turuncoglu wrote:
>No, Kepler does not have 'StringToDouble' actor. So i do some tests. First, i
>try to define type of the output port as BaseType.DOUBLE_MATRIX but it failed.
>After that i define it as,
>
>output.setTypeEquals(new ArrayType(BaseType.DOUBLE));
>
>and at the end of the code (when sending output),
>
>output.send(0, new ArrayToken(BaseType.DOUBLE, dataIntTokens));
>
>like StringToIntArray actor in Ptolemy. But it fails also and i get following
>error message,
>
>"Conversion is not supported from ptolemy.data.StringToken "...." to the type
>double becuse the type of the token is higher or incomperable with the given
>type."
>
>so, i am working on it and if i solve my problem, i will let you know.
>
>Thanks for all,
>
>Ufuk
>
>Edward A. Lee wrote:
>>Type casting from string to a numeric type won't work.
>>Type casts are only supported when conversion is guaranteed
>>to be lossless, and this isn't true for string to numeric.
>>So the conversion has to be done in Java code. Do we have
>>a StringToDouble conversion actor? If not, we should...
>>
>>Edward
>>
>>At 03:48 AM 8/10/2007, [BE] Ufuk Utku Turuncoglu wrote:
>>
>>>Hi,
>>>
>>>In the previous postings to the list, i had a problem reading ASCII file in
>>>Kepler but after getting some idea from list it solved. Now i write a new
>>>actor that substract the specified column of the multi column ASCII file
>>>after reading it. The code is attached to mail as 'ArrayColumn.java'. It
>>>gets two parameter; first one is number of column in ASCII file and second
>>>one is index of the first data (must be less than number of column !!!). So
>>>using theses values it ouputs the defined column of the array.
>>>
>>>My problem is controlling data type of the output port. It gets the input
>>>from 'String Splitter' actor (it is used after reading ASCII file with \s
>>>regular expression) and results is the same data type with input
>>>(ArrayType(String)). So, i need to convert them into float or other numeric
>>>data types to calculate the maximum, minimum or average. How can i control
>>>the output port data type automatically? Is it neccecary to fix it inside of
>>>the code such as type casting? Any idea must be very helpful.
>>>
>>>Best regards,
>>>
>>>Ufuk Utku Turuncoglu
>>>
>>>
>>>package edu.tutorial.turuncu;
>>>
>>>//import ptolemy.actor.TypedAtomicActor;
>>>//import ptolemy.actor.TypedIOPort;
>>>import ptolemy.actor.lib.Transformer;
>>>import ptolemy.actor.parameters.PortParameter;
>>>import ptolemy.data.ArrayToken;
>>>import ptolemy.data.IntToken;
>>>import ptolemy.data.Token;
>>>import ptolemy.data.StringToken;
>>>import ptolemy.data.type.Type;
>>>//import ptolemy.data.expr.Parameter;
>>>import ptolemy.data.type.ArrayType;
>>>import ptolemy.data.type.BaseType;
>>>import ptolemy.kernel.CompositeEntity;
>>>import ptolemy.kernel.util.IllegalActionException;
>>>import ptolemy.kernel.util.InternalErrorException;
>>>import ptolemy.kernel.util.NameDuplicationException;
>>>import ptolemy.kernel.util.Workspace;
>>>
>>>//public class ArrayColumn extends TypedAtomicActor {
>>>public class ArrayColumn extends Transformer {
>>>
>>> public ArrayColumn (CompositeEntity container, String name)
>>> throws NameDuplicationException, IllegalActionException {
>>> super(container, name);
>>>
>>> //output.setTypeAtLeast(ArrayType.elementType(input));
>>> output.setTypeAtLeast(input);
>>> output.setTypeAtLeast(ArrayType.ARRAY_UNSIZED_BOTTOM);
>>>
>>> //output = new TypedIOPort(this, "array", false, true);
>>> //output.setTypeEquals(new ArrayType(BaseType.INT));
>>>
>>> //input = new TypedIOPort(this, "array", true, false);
>>> //input.setTypeEquals(new ArrayType(BaseType.STRING));
>>>
>>> //ind = new Parameter(this, "column #", new IntToken(2));
>>> ndims = new PortParameter(this, "# dimension");
>>> ndims.setTypeEquals(BaseType.INT);
>>> ndims.setExpression("1");
>>>
>>> index = new PortParameter(this, "first index");
>>> index.setTypeEquals(BaseType.INT);
>>> index.setExpression("0");
>>>
>>> // icon
>>> //_attachText("_iconDescription", "<svg>\n"
>>> // + "<polygon points=\"-30,-20 30,-4 30,4 -30,20\" "
>>> // + "style=\"fill:white\"/>\n"
>>> // + "</svg>\n");
>>> }
>>>
>>> ///////////////////////////////////////////////////////////////////
>>> //// ports and parameters ////
>>>
>>> /** The input port, which contains the string.
>>> */
>>> //public TypedIOPort output = null;
>>> /** The output port, which contains the array.
>>> */
>>> //public TypedIOPort input = null;
>>> /** The parameter, which specifies the regular expression.
>>> */
>>> //public Parameter ind;
>>> public PortParameter ndims;
>>> public PortParameter index;
>>>
>>> ///////////////////////////////////////////////////////////////////
>>> //// public methods ////
>>>
>>> public Object clone(Workspace workspace) throws
>>> CloneNotSupportedException {
>>> ArrayColumn newObject = (ArrayColumn) super.clone(workspace);
>>> try {
>>> newObject.output.setTypeAtLeast(ArrayType
>>> .elementType(newObject.input));
>>> } catch (IllegalActionException e) {
>>> // Should have been caught before.
>>> throw new InternalErrorException(e);
>>> }
>>> return newObject;
>>> }
>>>
>>> public void fire() throws IllegalActionException {
>>> super.fire();
>>> // Get number of dimension
>>> ndims.update();
>>> int dimsCount = ((IntToken) ndims.getToken()).intValue();
>>>
>>> // Get dimension index
>>> index.update();
>>> int indexValue = ((IntToken) index.getToken()).intValue();
>>>
>>> // Get specified column data
>>> if (input.hasToken(0)) {
>>> ArrayToken inputValue = (ArrayToken) input.get(0);
>>> Type inputElementType = inputValue.getElementType();
>>>
>>> Token[] outputArray = new Token[inputValue.length()/dimsCount];
>>> int j=0;
>>> for (int i = indexValue; i < inputValue.length(); i+=dimsCount) {
>>> outputArray[j] = Float.parseFloat(inputValue.getElement(i));
>>> j=j+1;
>>> }
>>>
>>> output.send(0, new ArrayToken(inputElementType, outputArray));
>>> }
>>> }
>>>}
>>>
>>>_______________________________________________
>>>Kepler-users mailing list
>>>Kepler-users at ecoinformatics.org
>>>http://mercury.nceas.ucsb.edu/ecoinformatics/mailman/listinfo/kepler-users
>>>
>>
>>------------ Edward A. Lee
>>Chair of EECS and Robert S. Pepper Distinguished Professor
>>231 Cory Hall, UC Berkeley, Berkeley, CA 94720-1770
>>phone: 510-642-0253, fax: 510-642-2845
>>eal at eecs.Berkeley.EDU, http://ptolemy.eecs.berkeley.edu/~eal
>>
>
>
------------
Edward A. Lee
Chair of EECS and Robert S. Pepper Distinguished Professor
231 Cory Hall, UC Berkeley, Berkeley, CA 94720-1770
phone: 510-642-0253, fax: 510-642-2845
eal at eecs.Berkeley.EDU, http://ptolemy.eecs.berkeley.edu/~eal