numenta / htm.java

Hierarchical Temporal Memory implementation in Java - an official Community-Driven Java port of the Numenta Platform for Intelligent Computing (NuPIC).
GNU Affero General Public License v3.0
310 stars 160 forks source link

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

Open matheus-fatguys opened 6 years ago

matheus-fatguys commented 6 years ago

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:

/**

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