/*******************************************************************************
* Copyright 2012 Yuriy Lagodiuk
*
* 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.
******************************************************************************/
package com.lagodiuk.gp.symbolic.interpreter;
import java.util.LinkedList;
import java.util.List;
import org.apache.commons.math3.util.FastMath;
public enum Functions implements Function {
CONSTANT {
private int coefficientsCount = 1;
@Override
public int argumentsCount() {
return 0;
}
@Override
public int coefficientsCount() {
return this.coefficientsCount;
}
@Override
public List getCoefficients(Expression expression) {
return expression.getCoefficientsOfNode().subList(0, this.coefficientsCount);
}
@Override
public void setCoefficients(Expression expression, List coefficients, int startIndex) {
expression.removeCoefficients();
for (int i = 0; i < this.coefficientsCount; i++) {
expression.addCoefficient(coefficients.get(startIndex + i));
}
}
@Override
public boolean isVariable() {
return false;
}
@Override
public boolean isCommutative() {
return true;
}
@Override
public double eval(Expression expression, Context context) {
return expression.getCoefficientsOfNode().get(0);
}
@Override
public String print(Expression expression) {
double retVal = expression.getCoefficientsOfNode().get(0);
String retStr = null;
if (retVal < 0) {
retStr = String.format("(%s)", retVal);
} else {
retStr = "" + retVal;
}
return retStr;
}
@Override
public boolean isNumber() {
return true;
}
},
VARIABLE {
private int coefficientsCount = 0;
@Override
public int coefficientsCount() {
return this.coefficientsCount;
}
@Override
public List getCoefficients(Expression expression) {
return new LinkedList();
}
@Override
public void setCoefficients(Expression expression, List coefficients, int startIndex) {
expression.removeCoefficients();
}
@Override
public int argumentsCount() {
return 0;
}
@Override
public boolean isVariable() {
return true;
}
@Override
public boolean isNumber() {
return false;
}
@Override
public boolean isCommutative() {
return true;
}
@Override
public double eval(Expression expression, Context context) {
return context.lookupVariable(expression.getVariable());
}
@Override
public String print(Expression expression) {
return expression.getVariable();
}
},
ADD {
private int coefficientsCount = 0;
@Override
public int coefficientsCount() {
return this.coefficientsCount;
}
@Override
public List getCoefficients(Expression expression) {
return new LinkedList();
}
@Override
public void setCoefficients(Expression expression, List coefficients, int startIndex) {
expression.removeCoefficients();
}
@Override
public int argumentsCount() {
return 2;
}
@Override
public boolean isVariable() {
return false;
}
@Override
public boolean isNumber() {
return false;
}
@Override
public boolean isCommutative() {
return true;
}
@Override
public double eval(Expression expression, Context context) {
List childs = expression.getChilds();
double left = childs.get(0).eval(context);
double right = childs.get(1).eval(context);
return (left + right);
}
@Override
public String print(Expression expression) {
List childs = expression.getChilds();
String left = childs.get(0).print();
String right = childs.get(1).print();
return String.format("(%s + %s)", left, right);
}
},
SUB {
private int coefficientsCount = 0;
@Override
public int coefficientsCount() {
return this.coefficientsCount;
}
@Override
public List getCoefficients(Expression expression) {
return new LinkedList();
}
@Override
public void setCoefficients(Expression expression, List coefficients, int startIndex) {
expression.removeCoefficients();
}
@Override
public int argumentsCount() {
return 2;
}
@Override
public boolean isVariable() {
return false;
}
@Override
public boolean isNumber() {
return false;
}
@Override
public boolean isCommutative() {
return false;
}
@Override
public double eval(Expression expression, Context context) {
List childs = expression.getChilds();
double left = childs.get(0).eval(context);
double right = childs.get(1).eval(context);
return (left - right);
}
@Override
public String print(Expression expression) {
List childs = expression.getChilds();
String left = childs.get(0).print();
String right = childs.get(1).print();
return String.format("(%s - %s)", left, right);
}
},
MUL {
private int coefficientsCount = 0;
@Override
public int coefficientsCount() {
return this.coefficientsCount;
}
@Override
public List getCoefficients(Expression expression) {
return new LinkedList();
}
@Override
public void setCoefficients(Expression expression, List coefficients, int startIndex) {
expression.removeCoefficients();
}
@Override
public int argumentsCount() {
return 2;
}
@Override
public boolean isVariable() {
return false;
}
@Override
public boolean isNumber() {
return false;
}
@Override
public boolean isCommutative() {
return true;
}
@Override
public double eval(Expression expression, Context context) {
List childs = expression.getChilds();
double left = childs.get(0).eval(context);
double right = childs.get(1).eval(context);
return (left * right);
}
@Override
public String print(Expression expression) {
List childs = expression.getChilds();
String left = childs.get(0).print();
String right = childs.get(1).print();
return String.format("(%s * %s)", left, right);
}
},
DIV {
private int coefficientsCount = 0;
@Override
public int coefficientsCount() {
return this.coefficientsCount;
}
@Override
public List getCoefficients(Expression expression) {
return new LinkedList();
}
@Override
public void setCoefficients(Expression expression, List coefficients, int startIndex) {
expression.removeCoefficients();
}
@Override
public int argumentsCount() {
return 2;
}
@Override
public boolean isVariable() {
return false;
}
@Override
public boolean isNumber() {
return false;
}
@Override
public boolean isCommutative() {
return false;
}
@Override
public double eval(Expression expression, Context context) {
List childs = expression.getChilds();
double left = childs.get(0).eval(context);
double right = childs.get(1).eval(context);
return (left / right);
}
@Override
public String print(Expression expression) {
List childs = expression.getChilds();
String left = childs.get(0).print();
String right = childs.get(1).print();
return String.format("(%s / %s)", left, right);
}
},
SQRT {
private int coefficientsCount = 0;
@Override
public int coefficientsCount() {
return this.coefficientsCount;
}
@Override
public List getCoefficients(Expression expression) {
return new LinkedList();
}
@Override
public void setCoefficients(Expression expression, List coefficients, int startIndex) {
expression.removeCoefficients();
}
@Override
public int argumentsCount() {
return 1;
}
@Override
public boolean isVariable() {
return false;
}
@Override
public boolean isNumber() {
return false;
}
@Override
public boolean isCommutative() {
return true;
}
@Override
public double eval(Expression expression, Context context) {
List childs = expression.getChilds();
double arg = childs.get(0).eval(context);
return FastMath.sqrt(FastMath.abs(arg));
}
@Override
public String print(Expression expression) {
List childs = expression.getChilds();
String arg = childs.get(0).print();
return String.format("sqrt(abs(%s))", arg);
}
},
POW {
private int coefficientsCount = 0;
@Override
public int coefficientsCount() {
return this.coefficientsCount;
}
@Override
public List getCoefficients(Expression expression) {
return new LinkedList();
}
@Override
public void setCoefficients(Expression expression, List coefficients, int startIndex) {
expression.removeCoefficients();
}
@Override
public int argumentsCount() {
return 2;
}
@Override
public boolean isVariable() {
return false;
}
@Override
public boolean isNumber() {
return false;
}
@Override
public boolean isCommutative() {
return false;
}
@Override
public double eval(Expression expression, Context context) {
List childs = expression.getChilds();
double arg1 = childs.get(0).eval(context);
double arg2 = childs.get(1).eval(context);
return FastMath.pow(arg1, arg2);
}
@Override
public String print(Expression expression) {
List childs = expression.getChilds();
String arg1 = childs.get(0).print();
String arg2 = childs.get(1).print();
return String.format("(%s ^ %s)", arg1, arg2);
}
},
LN {
private double threshold = 1e-5;
private int coefficientsCount = 0;
@Override
public int coefficientsCount() {
return this.coefficientsCount;
}
@Override
public List getCoefficients(Expression expression) {
return new LinkedList();
}
@Override
public void setCoefficients(Expression expression, List coefficients, int startIndex) {
expression.removeCoefficients();
}
@Override
public int argumentsCount() {
return 1;
}
@Override
public boolean isVariable() {
return false;
}
@Override
public boolean isNumber() {
return false;
}
@Override
public boolean isCommutative() {
return true;
}
@Override
public double eval(Expression expression, Context context) {
List childs = expression.getChilds();
double arg = childs.get(0).eval(context);
return FastMath.log(FastMath.abs(arg) + this.threshold);
}
@Override
public String print(Expression expression) {
List childs = expression.getChilds();
String arg = childs.get(0).print();
return String.format("ln(abs(%s) + %s)", arg, this.threshold);
}
},
SIN {
private int coefficientsCount = 0;
@Override
public int coefficientsCount() {
return this.coefficientsCount;
}
@Override
public List getCoefficients(Expression expression) {
return new LinkedList();
}
@Override
public void setCoefficients(Expression expression, List coefficients, int startIndex) {
expression.removeCoefficients();
}
@Override
public int argumentsCount() {
return 1;
}
@Override
public boolean isVariable() {
return false;
}
@Override
public boolean isNumber() {
return false;
}
@Override
public boolean isCommutative() {
return true;
}
@Override
public double eval(Expression expression, Context context) {
List childs = expression.getChilds();
double arg = childs.get(0).eval(context);
return FastMath.sin(arg);
}
@Override
public String print(Expression expression) {
List childs = expression.getChilds();
String arg = childs.get(0).print();
return String.format("sin(%s)", arg);
}
},
COS {
private int coefficientsCount = 0;
@Override
public int coefficientsCount() {
return this.coefficientsCount;
}
@Override
public List getCoefficients(Expression expression) {
return new LinkedList();
}
@Override
public void setCoefficients(Expression expression, List coefficients, int startIndex) {
expression.removeCoefficients();
}
@Override
public int argumentsCount() {
return 1;
}
@Override
public boolean isVariable() {
return false;
}
@Override
public boolean isNumber() {
return false;
}
@Override
public boolean isCommutative() {
return true;
}
@Override
public double eval(Expression expression, Context context) {
List childs = expression.getChilds();
double arg = childs.get(0).eval(context);
return FastMath.cos(arg);
}
@Override
public String print(Expression expression) {
List childs = expression.getChilds();
String arg = childs.get(0).print();
return String.format("cos(%s)", arg);
}
},
}
Ads help maintain this website.