/* * 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.util.Collection; import java.util.HashMap; import java.util.Map; /** * Holds all known EPL opcodes. Extension programs should add new opcodes here. * The FunctionFactory selects a subset of opcodes from here that will be run. * * An opcode is identified by its name, and the number of parameters it accepts. * It is okay to add an opcode multiple times, the new opcode replaces the * previous. * */ public enum EncogOpcodeRegistry { INSTANCE; /** * Construct a lookup key for the hash map. * * @param functionName * The name of the opcode. * @param argCount * The number of parameters this opcode accepts. * @return Return the string key. */ public static String createKey(final String functionName, final int argCount) { return functionName + '`' + argCount; } /** * A lookup for all of the opcodes. */ private final Map<String, ProgramExtensionTemplate> registry = new HashMap<String, ProgramExtensionTemplate>(); /** * Construct the opcode registry with all known opcodes. User programs can * always add additional opcodes later. */ private EncogOpcodeRegistry() { add(StandardExtensions.EXTENSION_NOT_EQUAL); add(StandardExtensions.EXTENSION_NOT); add(StandardExtensions.EXTENSION_VAR_SUPPORT); add(StandardExtensions.EXTENSION_CONST_SUPPORT); add(StandardExtensions.EXTENSION_NEG); add(StandardExtensions.EXTENSION_ADD); add(StandardExtensions.EXTENSION_SUB); add(StandardExtensions.EXTENSION_MUL); add(StandardExtensions.EXTENSION_DIV); add(StandardExtensions.EXTENSION_POWER); add(StandardExtensions.EXTENSION_AND); add(StandardExtensions.EXTENSION_OR); add(StandardExtensions.EXTENSION_EQUAL); add(StandardExtensions.EXTENSION_GT); add(StandardExtensions.EXTENSION_LT); add(StandardExtensions.EXTENSION_GTE); add(StandardExtensions.EXTENSION_LTE); add(StandardExtensions.EXTENSION_ABS); add(StandardExtensions.EXTENSION_ACOS); add(StandardExtensions.EXTENSION_ASIN); add(StandardExtensions.EXTENSION_ATAN); add(StandardExtensions.EXTENSION_ATAN2); add(StandardExtensions.EXTENSION_CEIL); add(StandardExtensions.EXTENSION_COS); add(StandardExtensions.EXTENSION_COSH); add(StandardExtensions.EXTENSION_EXP); add(StandardExtensions.EXTENSION_FLOOR); add(StandardExtensions.EXTENSION_LOG); add(StandardExtensions.EXTENSION_LOG10); add(StandardExtensions.EXTENSION_MAX); add(StandardExtensions.EXTENSION_MIN); add(StandardExtensions.EXTENSION_PDIV); add(StandardExtensions.EXTENSION_POWFN); add(StandardExtensions.EXTENSION_RANDOM); add(StandardExtensions.EXTENSION_ROUND); add(StandardExtensions.EXTENSION_SIN); add(StandardExtensions.EXTENSION_SINH); add(StandardExtensions.EXTENSION_SQRT); add(StandardExtensions.EXTENSION_TAN); add(StandardExtensions.EXTENSION_TANH); add(StandardExtensions.EXTENSION_TODEG); add(StandardExtensions.EXTENSION_TORAD); add(StandardExtensions.EXTENSION_LENGTH); add(StandardExtensions.EXTENSION_FORMAT); add(StandardExtensions.EXTENSION_LEFT); add(StandardExtensions.EXTENSION_RIGHT); add(StandardExtensions.EXTENSION_CINT); add(StandardExtensions.EXTENSION_CFLOAT); add(StandardExtensions.EXTENSION_CSTR); add(StandardExtensions.EXTENSION_CBOOL); add(StandardExtensions.EXTENSION_IFF); add(StandardExtensions.EXTENSION_CLAMP); add(StandardExtensions.EXTENSION_CONST_COMMON_POOL); } /** * Add an opcode. User programs should add opcodes here. * * @param ext * The opcode to add. */ public void add(final ProgramExtensionTemplate ext) { this.registry.put( EncogOpcodeRegistry.createKey(ext.getName(), ext.getChildNodeCount()), ext); } public Collection<ProgramExtensionTemplate> findAllOpcodes() { return this.registry.values(); } /** * Find the specified opcode. * * @param name * The name of the opcode. * @param args * The number of arguments. * @return The opcode if found, null otherwise. */ public ProgramExtensionTemplate findOpcode(final String name, final int args) { final String key = EncogOpcodeRegistry.createKey(name, args); if (this.registry.containsKey(key)) { return this.registry.get(key); } else { return null; } } }