/* * 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.analyst.commands; import java.io.File; import java.util.Random; import org.encog.app.analyst.AnalystError; import org.encog.app.analyst.EncogAnalyst; import org.encog.app.analyst.script.DataField; import org.encog.app.analyst.script.ml.ScriptOpcode; import org.encog.app.analyst.script.normalize.AnalystField; import org.encog.app.analyst.script.prop.ScriptProperties; import org.encog.ml.MLMethod; import org.encog.ml.bayesian.BayesianNetwork; import org.encog.ml.data.buffer.EncogEGBFile; import org.encog.ml.factory.MLMethodFactory; import org.encog.ml.prg.VariableMapping; import org.encog.ml.prg.expvalue.ValueType; import org.encog.ml.prg.extension.EncogOpcodeRegistry; import org.encog.ml.prg.extension.ProgramExtensionTemplate; import org.encog.ml.prg.generator.RampedHalfAndHalf; import org.encog.ml.prg.train.PrgPopulation; import org.encog.persist.EncogDirectoryPersistence; import org.encog.util.logging.EncogLogging; /** * The Encog Analyst create command. This command is used to create a Machine * Learning method. * */ public class CmdCreate extends Cmd { /** * The name of this command. */ public static final String COMMAND_NAME = "CREATE"; /** * Construct the create command. * * @param theAnalyst * The analyst to use. */ public CmdCreate(final EncogAnalyst theAnalyst) { super(theAnalyst); } /** * {@inheritDoc} */ @Override public boolean executeCommand(final String args) { // get filenames final String trainingID = getProp().getPropertyString( ScriptProperties.ML_CONFIG_TRAINING_FILE); final String resourceID = getProp().getPropertyString( ScriptProperties.ML_CONFIG_MACHINE_LEARNING_FILE); final File trainingFile = getScript().resolveFilename(trainingID); final File resourceFile = getScript().resolveFilename(resourceID); final String type = getProp().getPropertyString( ScriptProperties.ML_CONFIG_TYPE); final String arch = getProp().getPropertyString( ScriptProperties.ML_CONFIG_ARCHITECTURE); EncogLogging.log(EncogLogging.LEVEL_DEBUG, "Beginning create"); EncogLogging.log(EncogLogging.LEVEL_DEBUG, "training file:" + trainingID); EncogLogging.log(EncogLogging.LEVEL_DEBUG, "resource file:" + resourceID); EncogLogging.log(EncogLogging.LEVEL_DEBUG, "type:" + type); EncogLogging.log(EncogLogging.LEVEL_DEBUG, "arch:" + arch); final EncogEGBFile egb = new EncogEGBFile(trainingFile); egb.open(); final int input = egb.getInputCount(); final int ideal = egb.getIdealCount(); egb.close(); final MLMethodFactory factory = new MLMethodFactory(); final MLMethod obj = factory.create(type, arch, input, ideal); if (obj instanceof BayesianNetwork) { final String query = getProp().getPropertyString( ScriptProperties.ML_CONFIG_QUERY); ((BayesianNetwork) obj).defineClassificationStructure(query); } else if (obj instanceof PrgPopulation) { handlePrgPopulation((PrgPopulation) obj); } EncogDirectoryPersistence.saveObject(resourceFile, obj); return false; } private void handlePrgPopulation(PrgPopulation pop) { // create the variables int classType = 0; pop.getContext().clearDefinedVariables(); for(AnalystField field : getScript().getNormalize().getNormalizedFields() ) { DataField df = getScript().findDataField(field.getName()); String varName = field.getName(); VariableMapping mapping; switch( field.getAction() ) { case Ignore: mapping = null; break; case PassThrough: if( df.isInteger() ) { mapping = new VariableMapping(varName, ValueType.intType); } else if( df.isReal() ) { mapping = new VariableMapping(varName, ValueType.floatingType); } else { mapping = new VariableMapping(varName, ValueType.stringType); } break; case Equilateral: case OneOf: case Normalize: mapping = new VariableMapping(varName, ValueType.floatingType); break; case SingleField: if( df.isClass() ) { mapping = new VariableMapping(varName, ValueType.enumType, classType++, df.getClassMembers().size() ); } else if( df.isInteger() ) { mapping = new VariableMapping(varName, ValueType.intType ); } else { mapping = new VariableMapping(varName, ValueType.floatingType); } break; default: throw new AnalystError("Unknown normalization action: " + field.getAction().toString()); } if( field.isOutput() ) { pop.getContext().setResult(mapping); } else { pop.getContext().defineVariable(mapping); } } // populate the opcodes if (this.getScript().getOpcodes().size() > 0) { for (ScriptOpcode op : this.getScript().getOpcodes()) { ProgramExtensionTemplate temp = EncogOpcodeRegistry.INSTANCE .findOpcode(op.getName(), op.getArgCount()); pop.getContext().getFunctions().addExtension(temp); } } // generate initial population RampedHalfAndHalf generate = new RampedHalfAndHalf(pop.getContext(), 1, 6); generate.generate(new Random(), pop); } /** * {@inheritDoc} */ @Override public String getName() { return CmdCreate.COMMAND_NAME; } }