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