amidst / toolbox

A Java Toolbox for Scalable Probabilistic Machine Learning
http://www.amidsttoolbox.com
Apache License 2.0
119 stars 35 forks source link

Filter on DataSteam class not working #71

Closed rcabanasdepaz closed 7 years ago

rcabanasdepaz commented 7 years ago

The following code:

    //Generate the data stream using the class DataSetGenerator
    DataStream<DataInstance> data = DataSetGenerator.generate(1,10,5,5);

    data.filter(d -> d.getValue(data.getAttributes().getAttributeByName("DiscreteVar0")) == 1)
        .forEach(d -> System.out.println(d));

produces this exception:

Exception in thread "main" java.lang.StackOverflowError at eu.amidst.core.datastream.DataStream$1.stream(DataStream.java:116) at eu.amidst.core.datastream.DataStream$1.stream(DataStream.java:116) at eu.amidst.core.datastream.DataStream$1.stream(DataStream.java:116) at eu.amidst.core.datastream.DataStream$1.stream(DataStream.java:116) at eu.amidst.core.datastream.DataStream$1.stream(DataStream.java:116) at eu.amidst.core.datastream.DataStream$1.stream(DataStream.java:116) ...

rcabanasdepaz commented 7 years ago

Filter returns the following object:

default DataStream filter(Predicate<? super E> predicate){ DataStream s = new DataStream() {

        @Override
        public Attributes getAttributes() {
            return this.getAttributes();
        }

        @Override
        public void close() {
            this.close();
        }

        @Override
        public boolean isRestartable() {
            return this.isRestartable();
        }

        @Override
        public void restart() {
            this.restart();
        }

        @Override
        public Stream<E> stream() {
            return this.stream().filter(predicate);
        }
    };
    return s;
}

This object is not of the same inner class. When .forEach() method is called, internally stream() is invoked. Then it enters in a infinite loop