/*
* 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.prop;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.encog.Encog;
import org.encog.app.analyst.AnalystError;
import org.encog.app.analyst.AnalystFileFormat;
import org.encog.app.analyst.AnalystGoal;
import org.encog.app.analyst.util.ConvertStringConst;
import org.encog.app.generate.TargetLanguage;
import org.encog.util.csv.CSVFormat;
/**
* Holds all of the properties for a script. Constants are provided to define
* "well known" properties.
*
*/
public class ScriptProperties {
/**
* Property for: "HEADER:DATASOURCE_sourceFile".
*/
public static final String HEADER_DATASOURCE_SOURCE_FILE
= "HEADER:DATASOURCE_sourceFile";
/**
* Property for: "HEADER:DATASOURCE_rawFile".
*/
public static final String HEADER_DATASOURCE_RAW_FILE
= "HEADER:DATASOURCE_rawFile";
/**
* Property for: "HEADER:DATASOURCE_sourceHeaders".
*/
public static final String HEADER_DATASOURCE_SOURCE_HEADERS
= "HEADER:DATASOURCE_sourceHeaders";
/**
* Property for: "SETUP:CONFIG_maxClassCount".
*/
public static final String SETUP_CONFIG_MAX_CLASS_COUNT
= "SETUP:CONFIG_maxClassCount";
/**
* Property for: = "SETUP:CONFIG_allowedClasses".
*/
public static final String SETUP_CONFIG_ALLOWED_CLASSES
= "SETUP:CONFIG_allowedClasses";
/**
* Property for: "SETUP:CONFIG_inputHeaders".
*/
public static final String SETUP_CONFIG_INPUT_HEADERS
= "SETUP:CONFIG_inputHeaders";
/**
* Property for: "SETUP:CONFIG_csvFormat".
*/
public static final String SETUP_CONFIG_CSV_FORMAT
= "SETUP:CONFIG_csvFormat";
/**
* Property for: "DATA:CONFIG_goal".
*/
public static final String DATA_CONFIG_GOAL
= "DATA:CONFIG_goal";
/**
* Property for: "NORMALIZE:CONFIG_sourceFile".
*/
public static final String NORMALIZE_CONFIG_SOURCE_FILE
= "NORMALIZE:CONFIG_sourceFile";
/**
* Property for: "NORMALIZE:CONFIG_targetFile".
*/
public static final String NORMALIZE_CONFIG_TARGET_FILE
= "NORMALIZE:CONFIG_targetFile";
/**
* Property for: "NORMALIZE:CONFIG_missingValues".
*/
public static final String NORMALIZE_MISSING_VALUES
= "NORMALIZE:CONFIG_missingValues";
/**
* Property for: "BALANCE:CONFIG_sourceFile".
*/
public static final String BALANCE_CONFIG_SOURCE_FILE
= "BALANCE:CONFIG_sourceFile";
/**
* Property for: "BALANCE:CONFIG_targetFile".
*/
public static final String BALANCE_CONFIG_TARGET_FILE
= "BALANCE:CONFIG_targetFile";
/**
* Property for: "BALANCE:CONFIG_balanceField".
*/
public static final String BALANCE_CONFIG_BALANCE_FIELD
= "BALANCE:CONFIG_balanceField";
/**
* Property for: "BALANCE:CONFIG_countPer".
*/
public static final String BALANCE_CONFIG_COUNT_PER
= "BALANCE:CONFIG_countPer";
/**
* Property for: "RANDOMIZE:CONFIG_sourceFile".
*/
public static final String RANDOMIZE_CONFIG_SOURCE_FILE
= "RANDOMIZE:CONFIG_sourceFile";
/**
* Property for: "RANDOMIZE:CONFIG_targetFile".
*/
public static final String RANDOMIZE_CONFIG_TARGET_FILE
= "RANDOMIZE:CONFIG_targetFile";
/**
* Property for: "SEGREGATE:CONFIG_sourceFile".
*/
public static final String SEGREGATE_CONFIG_SOURCE_FILE
= "SEGREGATE:CONFIG_sourceFile";
/**
* Property for: "GENERATE:CONFIG_sourceFile".
*/
public static final String GENERATE_CONFIG_SOURCE_FILE
= "GENERATE:CONFIG_sourceFile";
/**
* Property for: "GENERATE:CONFIG_targetFile".
*/
public static final String GENERATE_CONFIG_TARGET_FILE
= "GENERATE:CONFIG_targetFile";
/**
* Property for: "ML:CONFIG_trainingFile".
*/
public static final String ML_CONFIG_TRAINING_FILE
= "ML:CONFIG_trainingFile";
/**
* Property for: "ML:CONFIG_evalFile".
*/
public static final String ML_CONFIG_EVAL_FILE
= "ML:CONFIG_evalFile";
/**
* Property for: "ML:CONFIG_machineLearningFile".
*/
public static final String ML_CONFIG_MACHINE_LEARNING_FILE
= "ML:CONFIG_machineLearningFile";
/**
* Property for: "ML:CONFIG_outputFile".
*/
public static final String ML_CONFIG_OUTPUT_FILE
= "ML:CONFIG_outputFile";
/**
* Property for: = ML:CONFIG_type".
*/
public static final String ML_CONFIG_TYPE
= "ML:CONFIG_type";
/**
* Property for: "ML:CONFIG_architecture".
*/
public static final String ML_CONFIG_ARCHITECTURE
= "ML:CONFIG_architecture";
/**
* Property for "ML:CONFIG_query"
*/
public static final String ML_CONFIG_QUERY = "ML:CONFIG_query";
/**
* Property for: "ML:TRAIN_type".
*/
public static final String ML_TRAIN_TYPE
= "ML:TRAIN_type";
/**
* Property for: "ML:TRAIN_arguments".
*/
public static final String ML_TRAIN_ARGUMENTS
= "ML:TRAIN_arguments";
/**
* Property for: "ML:TRAIN_targetError".
*/
public static final String ML_TRAIN_TARGET_ERROR
= "ML:TRAIN_targetError";
/**
* Property for: "ML:TRAIN_cross".
*/
public static final String ML_TRAIN_CROSS
= "ML:TRAIN_cross";
/**
* Property for: "CLUSTER:CONFIG_sourceFile".
*/
public static final String CLUSTER_CONFIG_SOURCE_FILE
= "CLUSTER:CONFIG_sourceFile";
/**
* Property for: "CLUSTER:CONFIG_targetFile".
*/
public static final String CLUSTER_CONFIG_TARGET_FILE
= "CLUSTER:CONFIG_targetFile";
/**
* Property for: "CLUSTER:CONFIG_type".
*/
public static final String CLUSTER_CONFIG_TYPE
= "CLUSTER:CONFIG_type";
/**
* Property for: "CLUSTER:CONFIG_clusters".
*/
public static final String CLUSTER_CONFIG_CLUSTERS
= "CLUSTER:CONFIG_clusters";
/**
* Property for: "GENERATE:CONFIG_targetLanguage".
*/
public static final String CODE_CONFIG_TARGET_LANGUAGE
= "CODE:CONFIG_targetLanguage";
/**
* Property for: "GENERATE:CONFIG_targetFile".
*/
public static final String CODE_CONFIG_TARGET_FILE
= "CODE:CONFIG_targetFile";
/**
* Property for: "GENERATE:CONFIG_embedData".
*/
public static final String CODE_CONFIG_EMBED_DATA
= "CODE:CONFIG_embedData";
/**
* Property for: "PROCESS:CONFIG,sourceFile".
*/
public static final String PROCESS_CONFIG_SOURCE_FILE =
"PROCESS:CONFIG_sourceFile";
/**
* Property for: "PROCESS:CONFIG,targetFile".
*/
public static final String PROCESS_CONFIG_TARGET_FILE =
"PROCESS:CONFIG_targetFile";
/**
* Property for: "PROCESS:CONFIG,backwardSize".
*/
public static final String PROCESS_CONFIG_BACKWARD_SIZE =
"PROCESS:CONFIG_backwardSize";
/**
* Property for: "PROCESS:CONFIG,forwardSize".
*/
public static final String PROCESS_CONFIG_FORWARD_SIZE =
"PROCESS:CONFIG_forwardSize";
/**
* Convert a key to the dot form.
*
* @param str
* The key form.
* @return The dot form.
*/
public static final String toDots(final String str) {
final int index1 = str.indexOf(':');
if (index1 == -1) {
return null;
}
final int index2 = str.indexOf('_');
if (index2 == -1) {
return null;
}
final String section = str.substring(0, index1);
final String subSection = str.substring(index1 + 1, index2);
final String name = str.substring(index2 + 1);
return section + "." + subSection + "." + name;
}
/**
* Properties are stored in this map.
*/
private final Map<String, String> data = new HashMap<String, String>();
/**
* Clear out all filenames.
*/
public final void clearFilenames() {
final Object[] array = this.data.keySet().toArray();
for (final Object element : array) {
final String key = (String) element;
if (key.startsWith("SETUP:FILENAMES")) {
this.data.remove(key);
}
}
}
/**
* Get a filename.
* @param file The file.
* @return The filename.
*/
public final String getFilename(final String file) {
final String key2 = "SETUP:FILENAMES_" + file;
if (!this.data.containsKey(key2)) {
throw new AnalystError("Undefined file: " + file);
}
return this.data.get(key2);
}
/**
* Get all filenames.
* @return The filenames in a list.
*/
public final List<String> getFilenames() {
final List<String> result = new ArrayList<String>();
for (final String key : this.data.keySet()) {
if (key.startsWith("SETUP:FILENAMES")) {
final int index = key.indexOf('_');
if (index != -1) {
result.add(key.substring(index + 1));
}
}
}
return result;
}
/**
* Get a property as an object.
*
* @param name
* The name of the property.
* @return The property value.
*/
public final Object getProperty(final String name) {
return this.data.get(name);
}
/**
* Get a property as a boolean.
* @param name The property name.
* @return A boolean value.
*/
public final boolean getPropertyBoolean(final String name) {
if (!this.data.containsKey(name)) {
return false;
} else {
return this.data.get(name).toLowerCase().startsWith("t");
}
}
/**
* Get a property as a format.
* @param name The property name.
* @return A format value.
*/
public final CSVFormat getPropertyCSVFormat(final String name) {
final String value = this.data.get(name);
final AnalystFileFormat code = ConvertStringConst
.string2AnalystFileFormat(value);
return ConvertStringConst.convertToCSVFormat(code);
}
/**
* Get a property as a double.
* @param name The property name.
* @return A double value.
*/
public final double getPropertyDouble(final String name) {
final String value = this.data.get(name);
return CSVFormat.EG_FORMAT.parse(value);
}
/**
* Get a property as a file.
* @param name The property name.
* @return A file value.
*/
public final String getPropertyFile(final String name) {
return this.data.get(name);
}
/**
* Get a property as a format.
* @param name The property name.
* @return A format value.
*/
public final AnalystFileFormat getPropertyFormat(final String name) {
final String value = this.data.get(name);
return ConvertStringConst.string2AnalystFileFormat(value);
}
/**
* Get a property as a int.
* @param name The property name.
* @return A int value.
*/
public final int getPropertyInt(final String name) {
try {
final String value = this.data.get(name);
if (value == null || value.length()==0) {
return 0;
}
return Integer.parseInt(value);
} catch (final NumberFormatException ex) {
throw new AnalystError(ex);
}
}
/**
* Get a property as a string.
*
* @param name
* The name of the property.
* @return The property value.
*/
public final String getPropertyString(final String name) {
if (!this.data.containsKey(name)) {
return null;
}
return this.data.get(name).toString();
}
/**
* Get a property as a url.
* @param name The property name.
* @return A url value.
*/
public final URL getPropertyURL(final String name) {
try {
return new URL(this.data.get(name));
} catch (final MalformedURLException e) {
throw new AnalystError(e);
}
}
/**
* Perform a revert.
* @param revertedData The source data to revert from.
*/
public final void performRevert(final Map<String, String> revertedData) {
this.data.clear();
this.data.putAll(revertedData);
}
/**
* Prepare a revert.
* @return Data that can be used to revert properties.
*/
public final Map<String, String> prepareRevert() {
final Map<String, String> result = new HashMap<String, String>();
result.putAll(this.data);
return result;
}
/**
* Set a filename.
* @param key The key.
* @param value The value.
*/
public final void setFilename(final String key, final String value) {
final String key2 = "SETUP:FILENAMES_" + key;
this.data.put(key2, value);
}
/**
* Set the property to a format.
*
* @param name
* The name of the property.
* @param format
* The value of the property.
*/
public final void setProperty(final String name,
final AnalystFileFormat format) {
if (format == null) {
this.data.put(name, "");
} else {
this.data.put(name,
ConvertStringConst.analystFileFormat2String(format));
}
}
/**
* Set a property.
* @param name The name.
* @param value The value.
*/
public final void setProperty(final String name, final AnalystGoal value) {
switch (value) {
case Classification:
this.data.put(name, "classification");
break;
case Regression:
this.data.put(name, "regression");
break;
default:
this.data.put(name, "");
}
}
/**
* Set a property as a boolean.
*
* @param name
* The name of the property.
* @param b
* The value to set.
*/
public final void setProperty(final String name, final boolean b) {
if (b) {
this.data.put(name, "t");
} else {
this.data.put(name, "f");
}
}
/**
* Set a property as a double.
* @param name The name of the property.
* @param d The value.
*/
public final void setProperty(final String name, final double d) {
this.data.put(name, CSVFormat.EG_FORMAT.format(d,
Encog.DEFAULT_PRECISION));
}
/**
* Get a property as an object.
*
* @param name
* The name of the property.
* @param f
* The filename value.
*/
public final void setProperty(final String name, final File f) {
this.data.put(name, f.toString());
}
/**
* Set a property to an int.
* @param name The property name.
* @param i The value.
*/
public final void setProperty(final String name, final int i) {
this.data.put(name, "" + i);
}
/**
* Set the property to the specified value.
*
* @param name
* The property name.
* @param value
* The property value.
*/
public final void setProperty(final String name, final String value) {
this.data.put(name, value);
}
/**
* Get a property as an object.
*
* @param name
* The name of the property.
* @param url
* The url of the property.
*/
public final void setProperty(final String name, final URL url) {
this.data.put(name, url.toExternalForm());
}
/**
* Set a property as a target language.
* @param name The name of the property.
* @param targetLanguage The target language.
*/
public final void setProperty(final String name, final TargetLanguage targetLanguage) {
this.data.put(name, targetLanguage.toString().toUpperCase());
}
/**
* Get the property as a target language.
* @param name The name of the property.
* @return The target language.
*/
public final TargetLanguage getPropertyTargetLanguage(final String name) {
if (!this.data.containsKey(name)) {
return null;
}
String value = this.data.get(name);
for(TargetLanguage v : TargetLanguage.values() ) {
if( v.toString().equalsIgnoreCase(value)) {
return v;
}
}
return TargetLanguage.NoGeneration;
}
/** {@inheritDoc} */
@Override
public final String toString() {
final StringBuilder result = new StringBuilder("[");
result.append(getClass().getSimpleName());
result.append(" :");
result.append(this.data.toString());
result.append("]");
return result.toString();
}
}