/*
* Encog(tm) Core v3.3 - Java Version
* http://www.heatonresearch.com/encog/
* https://github.com/encog/encog-java-core
* Copyright 2008-2014 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.analyst.script.normalize;
import java.util.ArrayList;
import java.util.List;
import org.encog.app.analyst.AnalystError;
import org.encog.app.analyst.missing.DiscardMissing;
import org.encog.app.analyst.missing.HandleMissingValues;
import org.encog.app.analyst.missing.MeanAndModeMissing;
import org.encog.app.analyst.missing.NegateMissing;
import org.encog.app.analyst.script.AnalystClassItem;
import org.encog.app.analyst.script.AnalystScript;
import org.encog.app.analyst.script.DataField;
import org.encog.app.analyst.script.prop.ScriptProperties;
import org.encog.util.arrayutil.ClassItem;
import org.encog.util.arrayutil.NormalizationAction;
/**
* This class holds information about the fields that the Encog Analyst will
* normalize.
*
*/
public class AnalystNormalize {
/**
* The normalized fields. These fields define the order and format
* that data will be presented to the ML method.
*/
private final List<AnalystField> normalizedFields
= new ArrayList<AnalystField>();
/**
* The parent script.
*/
private AnalystScript script;
/**
* Construct the object.
* @param theScript The script.
*/
public AnalystNormalize(AnalystScript theScript) {
this.script = theScript;
}
/**
* @return Calculate the input columns.
*/
public int calculateInputColumns() {
int result = 0;
for (final AnalystField field : this.normalizedFields) {
if (field.isInput()) {
result += field.getColumnsNeeded();
}
}
return result;
}
/**
* Calculate the output columns.
* @return The output columns.
*/
public int calculateOutputColumns() {
int result = 0;
for (final AnalystField field : this.normalizedFields) {
if (field.isOutput()) {
result += field.getColumnsNeeded();
}
}
return result;
}
/**
* @return Count the active fields.
*/
public int countActiveFields() {
int result = 0;
for (final AnalystField field : this.normalizedFields) {
if (field.getAction() != NormalizationAction.Ignore) {
result++;
}
}
return result;
}
/**
* @return the normalizedFields
*/
public List<AnalystField> getNormalizedFields() {
return this.normalizedFields;
}
/**
* Init the normalized fields.
* @param script The script.
*/
public void init(final AnalystScript script) {
if (this.normalizedFields == null) {
return;
}
for (final AnalystField norm : this.normalizedFields) {
final DataField f = script.findDataField(norm.getName());
if (f == null) {
throw new AnalystError("Normalize specifies unknown field: "
+ norm.getName());
}
if (norm.getAction() == NormalizationAction.Normalize) {
norm.setActualHigh(f.getMax());
norm.setActualLow(f.getMin());
}
if ((norm.getAction() == NormalizationAction.Equilateral)
|| (norm.getAction() == NormalizationAction.OneOf)
|| (norm.getAction() == NormalizationAction.SingleField)) {
int index = 0;
for (final AnalystClassItem item : f.getClassMembers()) {
norm.getClasses().add(
new ClassItem(item.getName(), index++));
}
}
}
}
/** {@inheritDoc} */
@Override
public String toString() {
final StringBuilder result = new StringBuilder("[");
result.append(getClass().getSimpleName());
result.append(": ");
if (this.normalizedFields != null) {
result.append(this.normalizedFields.toString());
}
result.append("]");
return result.toString();
}
/**
* @return the missingValues
*/
public HandleMissingValues getMissingValues() {
final String type = this.script.getProperties().getPropertyString(
ScriptProperties.ML_CONFIG_TYPE);
if( type.equals("DiscardMissing") ) {
return new DiscardMissing();
} else if( type.equals("MeanAndModeMissing") ) {
return new MeanAndModeMissing();
} else if( type.equals("NegateMissing") ) {
return new NegateMissing();
} else {
return new DiscardMissing();
}
}
/**
* @param missingValues the missingValues to set
*/
public void setMissingValues(HandleMissingValues missingValues) {
this.script.getProperties().setProperty(
ScriptProperties.NORMALIZE_MISSING_VALUES, missingValues.getClass().getSimpleName());
}
}