/*******************************************************************************
 * 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.