/*
* 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.prg.extension;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import org.encog.ml.prg.EncogProgramContext;
import org.encog.ml.prg.ProgramNode;
import org.encog.ml.prg.expvalue.ExpressionValue;
import org.encog.ml.prg.expvalue.ValueType;
/**
* Defines an opcode. Opcodes are used to extend Encog programs.
*/
public interface ProgramExtensionTemplate extends Serializable {
/**
* Defines a very low precidence.
*/
public static final int NO_PREC = 100;
/**
* No parameters.
*/
public static final List<ParamTemplate> NO_PARAMS = new ArrayList<ParamTemplate>();
/**
* Evaluate the specified actual program node, using this opcode template.
*
* @param actual
* The tree node in the actual program.
* @return The result of the evaluation.
*/
ExpressionValue evaluate(ProgramNode actual);
/**
* @return Get the number of child nodes that this opcode requires.
*/
int getChildNodeCount();
/**
* @return The size of extra data that is stored by this node.
*/
int getDataSize();
/**
* @return Get the name of this opcode.
*/
String getName();
/**
* @return The node type.
*/
NodeType getNodeType();
/**
* @return The parameters (child nodes) required by this node.
*/
List<ParamTemplate> getParams();
/**
* @return The operator precedence.
*/
int getPrecedence();
/**
* @return The return value for this opcode.
*/
ParamTemplate getReturnValue();
/**
* Determines if the specified return type is a possible return type.
*
* @param context
* The program context.
* @param rtn
* The potential return type to check.
* @return True, if the specified type is a possible return type.
*/
boolean isPossibleReturnType(EncogProgramContext context, ValueType rtn);
/**
* @return Returns true if this node is variable.
*/
boolean isVariable();
/**
* Randomize this actual tree node.
*
* @param rnd
* Random number generator.
* @param desiredType
* The desired type of the randomization, if allowed.
* @param actual
* The actual program node to randomize.
* @param minValue
* The minimum value to use for randomization.
* @param maxValue
* The maximum value to use for randomization.
*/
void randomize(Random rnd, List<ValueType> desiredType, ProgramNode actual,
double minValue, double maxValue);
}