/* * 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.app.quant.indicators; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import org.encog.app.analyst.csv.basic.BaseCachedColumn; import org.encog.app.analyst.csv.basic.BasicCachedFile; import org.encog.app.analyst.csv.basic.FileData; import org.encog.app.quant.QuantError; import org.encog.util.csv.ReadCSV; /** * Process indicators and generate output. */ public class ProcessIndicators extends BasicCachedFile { /** * Allocate storage. */ private void allocateStorage() { for (final BaseCachedColumn column : getColumns()) { column.allocate(getRecordCount()); } } /** * Calculate the indicators. */ private void calculateIndicators() { for (final BaseCachedColumn column : getColumns()) { if (column.isOutput()) { if (column instanceof Indicator) { final Indicator indicator = (Indicator) column; indicator.calculate(getColumnMapping(), getRecordCount()); } } } } /** * @return Get the beginning index. */ private int getBeginningIndex() { int result = 0; for (final BaseCachedColumn column : getColumns()) { if (column instanceof Indicator) { final Indicator ind = (Indicator) column; result = Math.max(ind.getBeginningIndex(), result); } } return result; } /** * @return Get the ending index. */ private int getEndingIndex() { int result = getRecordCount() - 1; for (final BaseCachedColumn column : getColumns()) { if (column instanceof Indicator) { final Indicator ind = (Indicator) column; result = Math.min(ind.getEndingIndex(), result); } } return result; } /** * Process and write the specified output file. * * @param output * The output file. */ public final void process(final File output) { validateAnalyzed(); allocateStorage(); readFile(); calculateIndicators(); writeCSV(output); } /** * Read the CSV file. */ private void readFile() { ReadCSV csv = null; try { csv = new ReadCSV(getInputFilename().toString(), isExpectInputHeaders(), getFormat()); resetStatus(); int row = 0; while (csv.next() && !shouldStop()) { updateStatus("Reading data"); for (final BaseCachedColumn column : getColumns()) { if (column instanceof FileData) { if (column.isInput()) { final FileData fd = (FileData) column; final String str = csv.get(fd.getIndex()); final double d = getFormat().parse(str); fd.getData()[row] = d; } } } row++; } } finally { reportDone("Reading data"); if (csv != null) { csv.close(); } } } /** * Rename a column. * * @param index * The column index. * @param newName * The new name. */ public final void renameColumn(final int index, final String newName) { getColumnMapping().remove(getColumns().get(index).getName()); getColumns().get(index).setName(newName); getColumnMapping().put(newName, getColumns().get(index)); } /** * Write the CSV. * * @param filename * The target filename. */ private void writeCSV(final File filename) { PrintWriter tw = null; try { resetStatus(); tw = new PrintWriter(new FileWriter(filename)); // write the headers if (isExpectInputHeaders()) { final StringBuilder line = new StringBuilder(); for (final BaseCachedColumn column : getColumns()) { if (column.isOutput()) { if (line.length() > 0) { line.append(getFormat().getSeparator()); } line.append("\""); line.append(column.getName()); line.append("\""); } } tw.println(line.toString()); } // starting and ending index final int beginningIndex = getBeginningIndex(); final int endingIndex = getEndingIndex(); // write the file data for (int row = beginningIndex; row <= endingIndex; row++) { updateStatus("Writing data"); final StringBuilder line = new StringBuilder(); for (final BaseCachedColumn column : getColumns()) { if (column.isOutput()) { if (line.length() > 0) { line.append(getFormat().getSeparator()); } final double d = column.getData()[row]; line.append(getFormat().format(d, getPrecision())); } } tw.println(line.toString()); } } catch (final IOException e) { throw (new QuantError(e)); } finally { if (tw != null) { tw.close(); } } } }