package org.neuroph.contrib.model.sampling;

import org.neuroph.core.data.DataSet;
import org.neuroph.core.data.DataSetRow;
import org.neuroph.util.data.sample.Sampling;

import java.util.ArrayList;
import java.util.List;

/**
 * Skeleton class which makes easy to implement concrete Sampling algorithms
 * TODO: Remove this class
 */
public abstract class AbstractSampling implements Sampling {

    protected final int numberOfSamples;

    public AbstractSampling(int numberOfSamples) {
        this.numberOfSamples = numberOfSamples;
    }


    /**
     * Skeleton implementation for sample method
     *
     * @param dataSet initial data set
     * @return DataSets created using sampling algorithm
     */
    @Override
    public List sample(DataSet dataSet) {
        populateInternalDataStructure(dataSet);

        List dataSets = new ArrayList<>(numberOfSamples);
        for (int i = 0; i < numberOfSamples; i++) {
            dataSets.add(createDataSetFold(dataSet));
        }
        return dataSets;
    }


    private DataSet createDataSetFold(DataSet dataSet) {

        DataSet foldSet = new DataSet(dataSet.getInputSize(), dataSet.getOutputSize());
        for (int j = 0; j < getSampleSize(); j++) {
            foldSet.addRow(getNextDataSetRow());
        }

        return foldSet;
    }

    protected abstract int getSampleSize();


    /**
     * SPI method which has to  be implemented in concrete Sampling algorithms
     *
     * @return DataSetRow using concrete sampling algorithm
     */
    protected abstract DataSetRow getNextDataSetRow();

    /**
     * SPI method which has to  be implemented in concrete Sampling algorithms
     *
     * @param dataSet creates and populates data structure required by sampling algorithm
     */
    protected abstract void populateInternalDataStructure(DataSet dataSet);


}

 

Ads help maintain this website.