htm.java icon indicating copy to clipboard operation
htm.java copied to clipboard

CoordinateEncoder: java.lang.IllegalStateException: java.lang.ClassCastException: java.lang.Double cannot be cast to [I

Open matheus-fatguys opened this issue 6 years ago • 0 comments

I'm experimenting with GeospatialCoordinateEncoder, CoordinateEncoder and FileSensor Everything works fine with GeospatialCoordinateEncoder but CoordinateEncoder throws the mentioned exception: java.lang.IllegalStateException: java.lang.ClassCastException: java.lang.Double cannot be cast to [I I found that exception is thrown in this line: List<int[]> neighs = neighbors((int[])inputData.get(0), (double)inputData.get(1));

That's because inputData.get(0) is a double value parsed from the input file line string.

At GeospatialCoordinateEncoder the following lines convert the double value to int and than callsCoordinateEncoder.encodeIntoArray without a problem.

@Override
	public void encodeIntoArray(Tuple inputData, int[] output) {
		double longitude = (double)inputData.get(0);
		double lattitude = (double)inputData.get(1);
		double speed = (double)inputData.get(2);
		int[] coordinate = coordinateForPosition(longitude, lattitude);
		double radius = radiusForSpeed(speed);
		
		super.encodeIntoArray(new Tuple(coordinate, radius), output);
	}
	
	public int[] coordinateForPosition(double longitude, double lattitude) {
		double[] coordinate = toMercator(longitude, lattitude);
		coordinate[0] /= scale;
		coordinate[1] /= scale;
		return new int[] { (int)coordinate[0], (int)coordinate[1] };
	}

I made a change on FieldMetaType as follows:

	/**
	 * Returns the input type for the {@code FieldMetaType} that this is...
	 * @param input
	 * @param enc
	 * @return
	 */
	@SuppressWarnings("unchecked")
    public <T> T decodeType(String input, Encoder<?> enc) {
	    switch(this) {
            case LIST : 
            case STRING : return (T)input;
            case DATETIME : return (T)((DateEncoder)enc).parse(input);
            case BOOLEAN : return (T)(Boolean.valueOf(input) == true ? new Double(1) : new Double(0));
            case COORD :{
            	String[] parts = input.split("[\\s]*\\;[\\s]*");
                int[] coord =new int[2];
                coord[0]=Integer.parseInt(parts[0]);
                coord[1]=Integer.parseInt(parts[1]);
            	return (T)new Tuple(coord, Double.parseDouble(parts[2]));
            } 
            case GEO :  {
            	String[] parts = input.split("[\\s]*\\;[\\s]*");
            	return (T)new Tuple(Double.parseDouble(parts[0]), Double.parseDouble(parts[1]), Double.parseDouble(parts[2]));
            }
            case INTEGER : 
            case FLOAT : return (T)new Double(input);
            case SARR :
            case DARR: { 
                return (T)Arrays.stream(input.replace("[","").replace("]","")
                    .split("[\\s]*\\,[\\s]*")).mapToInt(Integer::parseInt).toArray();
            }
            default : return null;
        }
	}

And other change on CoordinateEncoder as follows:

/** * {@inheritDoc} */ @Override public void encodeIntoArray(Tuple inputData, int[] output) { List<int[]> neighs = neighbors((int[])inputData.get(0), Math.max((double)inputData.get(1), w)); int[][] neighbors = new int[neighs.size()][]; for(int i = 0;i < neighs.size();i++) neighbors[i] = neighs.get(i);

	int[][] winners = topWCoordinates(this, neighbors, w);

	for(int i = 0;i < winners.length;i++) {
		int bit = bitForCoordinate(winners[i], n);
		output[bit] = 1;
	}
}

And now it's working and doesn't throw any exceptions.

May I request a pull to submit my code?

My .csv file is like this:

timestamp,position datetime,coord T, 09/18/2018 00:00,0;1;1 09/18/2018 00:01,0.0999983333416666;0.999950000416665;0.00999995833338542 09/18/2018 00:02,0.199986666933331;0.999800006666578;0.00999995833338542 09/18/2018 00:03,0.299955002024957;0.999550033748988;0.00999995833338541 09/18/2018 00:04,0.399893341866342;0.999200106660978;0.00999995833338542

java.lang.RuntimeException: Unhandled Exception in Sensor Layer [Region 1:Layer 2/3] Thread at org.numenta.nupic.network.Layer$6.uncaughtException(Layer.java:2054) at java.lang.Thread.dispatchUncaughtException(Thread.java:1952) Caused by: java.lang.IllegalStateException: java.lang.ClassCastException: java.lang.Double cannot be cast to [I at org.numenta.nupic.encoders.MultiEncoder.encodeIntoArray(MultiEncoder.java:105) at org.numenta.nupic.encoders.Encoder.encode(Encoder.java:625) at org.numenta.nupic.network.sensor.HTMSensor.input(HTMSensor.java:429) at org.numenta.nupic.network.sensor.HTMSensor.lambda$getOutputStream$46(HTMSensor.java:362) at org.numenta.nupic.network.sensor.HTMSensor$$Lambda$29/1349859160.apply(Unknown Source) at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) at java.util.Spliterators$IteratorSpliterator.tryAdvance(Spliterators.java:1812) at java.util.stream.StreamSpliterators$WrappingSpliterator.lambda$initPartialTraversalState$220(StreamSpliterators.java:294) at java.util.stream.StreamSpliterators$WrappingSpliterator$$Lambda$9/209813603.getAsBoolean(Unknown Source) at java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.fillBuffer(StreamSpliterators.java:206) at java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.doAdvance(StreamSpliterators.java:161) at java.util.stream.StreamSpliterators$WrappingSpliterator.tryAdvance(StreamSpliterators.java:300) at java.util.Spliterators$1Adapter.hasNext(Spliterators.java:681) at org.numenta.nupic.network.sensor.HTMSensor$Copy.hasNext(HTMSensor.java:280) at java.util.Iterator.forEachRemaining(Iterator.java:115) at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418) at org.numenta.nupic.network.Layer$5.run(Layer.java:2037) Caused by: java.lang.ClassCastException: java.lang.Double cannot be cast to [I at org.numenta.nupic.encoders.CoordinateEncoder.encodeIntoArray(CoordinateEncoder.java:167) at org.numenta.nupic.encoders.CoordinateEncoder.encodeIntoArray(CoordinateEncoder.java:34) at org.numenta.nupic.encoders.MultiEncoder.encodeIntoArray(MultiEncoder.java:103) ... 22 more java.lang.RuntimeException: Unhandled Exception in Sensor Layer [Region 1:Layer 2/3] Thread at org.numenta.nupic.network.Layer$6.uncaughtException(Layer.java:2054) at java.lang.Thread.dispatchUncaughtException(Thread.java:1952) Caused by: java.lang.IllegalStateException: java.lang.ClassCastException: java.lang.Double cannot be cast to [I at org.numenta.nupic.encoders.MultiEncoder.encodeIntoArray(MultiEncoder.java:105) at org.numenta.nupic.encoders.Encoder.encode(Encoder.java:625) at org.numenta.nupic.network.sensor.HTMSensor.input(HTMSensor.java:429) at org.numenta.nupic.network.sensor.HTMSensor.lambda$getOutputStream$46(HTMSensor.java:362) at org.numenta.nupic.network.sensor.HTMSensor$$Lambda$29/1349859160.apply(Unknown Source) at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) at java.util.Spliterators$IteratorSpliterator.tryAdvance(Spliterators.java:1812) at java.util.stream.StreamSpliterators$WrappingSpliterator.lambda$initPartialTraversalState$220(StreamSpliterators.java:294) at java.util.stream.StreamSpliterators$WrappingSpliterator$$Lambda$9/209813603.getAsBoolean(Unknown Source) at java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.fillBuffer(StreamSpliterators.java:206) at java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.doAdvance(StreamSpliterators.java:161) at java.util.stream.StreamSpliterators$WrappingSpliterator.tryAdvance(StreamSpliterators.java:300) at java.util.Spliterators$1Adapter.hasNext(Spliterators.java:681) at org.numenta.nupic.network.sensor.HTMSensor$Copy.hasNext(HTMSensor.java:280) at java.util.Iterator.forEachRemaining(Iterator.java:115) at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418) at org.numenta.nupic.network.Layer$5.run(Layer.java:2037) Caused by: java.lang.ClassCastException: java.lang.Double cannot be cast to [I at org.numenta.nupic.encoders.CoordinateEncoder.encodeIntoArray(CoordinateEncoder.java:167) at org.numenta.nupic.encoders.CoordinateEncoder.encodeIntoArray(CoordinateEncoder.java:34) at org.numenta.nupic.encoders.MultiEncoder.encodeIntoArray(MultiEncoder.java:103) ... 22 more java.lang.RuntimeException: Unhandled Exception in Sensor Layer [Region 1:Layer 2/3] Thread at org.numenta.nupic.network.Layer$6.uncaughtException(Layer.java:2054) at java.lang.Thread.dispatchUncaughtException(Thread.java:1952) Caused by: java.lang.IllegalStateException: java.lang.ClassCastException: java.lang.Double cannot be cast to [I at org.numenta.nupic.encoders.MultiEncoder.encodeIntoArray(MultiEncoder.java:105) at org.numenta.nupic.encoders.Encoder.encode(Encoder.java:625) at org.numenta.nupic.network.sensor.HTMSensor.input(HTMSensor.java:429) at org.numenta.nupic.network.sensor.HTMSensor.lambda$getOutputStream$46(HTMSensor.java:362) at org.numenta.nupic.network.sensor.HTMSensor$$Lambda$29/1349859160.apply(Unknown Source) at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) at java.util.Spliterators$IteratorSpliterator.tryAdvance(Spliterators.java:1812) at java.util.stream.StreamSpliterators$WrappingSpliterator.lambda$initPartialTraversalState$220(StreamSpliterators.java:294) at java.util.stream.StreamSpliterators$WrappingSpliterator$$Lambda$9/209813603.getAsBoolean(Unknown Source) at java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.fillBuffer(StreamSpliterators.java:206) at java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.doAdvance(StreamSpliterators.java:161) at java.util.stream.StreamSpliterators$WrappingSpliterator.tryAdvance(StreamSpliterators.java:300) at java.util.Spliterators$1Adapter.hasNext(Spliterators.java:681) at org.numenta.nupic.network.sensor.HTMSensor$Copy.hasNext(HTMSensor.java:280) at java.util.Iterator.forEachRemaining(Iterator.java:115) at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418) at org.numenta.nupic.network.Layer$5.run(Layer.java:2037) Caused by: java.lang.ClassCastException: java.lang.Double cannot be cast to [I at org.numenta.nupic.encoders.CoordinateEncoder.encodeIntoArray(CoordinateEncoder.java:167) at org.numenta.nupic.encoders.CoordinateEncoder.encodeIntoArray(CoordinateEncoder.java:34) at org.numenta.nupic.encoders.MultiEncoder.encodeIntoArray(MultiEncoder.java:103) ... 22 more

matheus-fatguys avatar Sep 19 '18 20:09 matheus-fatguys