[kepler-users] problem in output port data type
Edward A. Lee
eal at eecs.berkeley.edu
Fri Aug 10 07:49:37 PDT 2007
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
More information about the Kepler-users
mailing list