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  

Reply via email to