/*
* Encog(tm) Core v3.4 - Java Version
* http://www.heatonresearch.com/encog/
* https://github.com/encog/encog-java-core
* Copyright 2008-2016 Heaton Research, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* For more information on Heaton Research copyrights, licenses
* and trademarks visit:
* http://www.heatonresearch.com/copyright
*/
package org.encog.ml.data.buffer;
import org.encog.NullStatusReportable;
import org.encog.StatusReportable;
import org.encog.ml.data.MLData;
import org.encog.ml.data.MLDataPair;
import org.encog.ml.data.MLDataSet;
import org.encog.ml.data.basic.BasicMLData;
import org.encog.ml.data.basic.BasicMLDataPair;
import org.encog.ml.data.basic.BasicMLDataSet;
import org.encog.ml.data.buffer.codec.DataSetCODEC;
/**
* This class is used, together with a CODEC, load training data from some
* external file into an Encog memory-based training set.
*/
public class MemoryDataLoader {
/**
* The CODEC to use.
*/
private final DataSetCODEC codec;
/**
* Used to report the status.
*/
private StatusReportable status;
/**
* The dataset to load into.
*/
private BasicMLDataSet result;
/**
* Construct a loader with the specified CODEC.
*
* @param theCodec
* The codec to use.
*/
public MemoryDataLoader(final DataSetCODEC theCodec) {
this.codec = theCodec;
this.status = new NullStatusReportable();
}
/**
* Convert an external file format, such as CSV, to an Encog memory training
* set.
*
* @return The binary file to create.
*/
public final MLDataSet external2Memory() {
this.status.report(0, 0, "Importing to memory");
if (this.result == null) {
this.result = new BasicMLDataSet();
}
final double[] input = new double[this.codec.getInputSize()];
final double[] ideal = new double[this.codec.getIdealSize()];
final double[] significance = new double[1];
this.codec.prepareRead();
int currentRecord = 0;
int lastUpdate = 0;
while (this.codec.read(input, ideal, significance)) {
MLData a = null, b = null;
a = new BasicMLData(input);
if (this.codec.getIdealSize() > 0) {
b = new BasicMLData(ideal);
}
final MLDataPair pair = new BasicMLDataPair(a, b);
pair.setSignificance(significance[0]);
this.result.add(pair);
currentRecord++;
lastUpdate++;
if (lastUpdate >= 10000) {
lastUpdate = 0;
this.status.report(0, currentRecord, "Importing...");
}
}
this.codec.close();
this.status.report(0, 0, "Done importing to memory");
return this.result;
}
/**
* @return The CODEC that is being used.
*/
public DataSetCODEC getCodec() {
return this.codec;
}
/**
* @return The resuling dataset.
*/
public BasicMLDataSet getResult() {
return this.result;
}
/**
* @return The object that status is reported to.
*/
public StatusReportable getStatus() {
return this.status;
}
/**
* Set the resulting dataset.
*
* @param theResult
* The resulting dataset.
*/
public void setResult(final BasicMLDataSet theResult) {
this.result = theResult;
}
/**
* Set the object that status will be reported to.
*
* @param theStatus
* The object to report status to.
*/
public void setStatus(final StatusReportable theStatus) {
this.status = theStatus;
}
}