/*
* Copyright 2006, United States Government as represented by the Administrator
* for the National Aeronautics and Space Administration. No copyright is
* claimed in the United States under Title 17, U.S. Code. All Other Rights
* Reserved.
*/
package gov.nasa.ial.mde.solver.symbolic;
public class Action {
/** An Operator. */
public static final int CORRUPTED = -2,
NO_OP = -1,
U_MINUS = 0,
SUM = 1,
RECIPROCAL = 2,
PRODUCT = 3,
POWER = 4,
SQRT = 5,
EXPONENTIAL = 6,
LOG = 7,
SINE = 8,
COSINE = 9,
TANGENT = 10,
ABS = 11,
FIRST_FUNCTION = SQRT;
/** Evaluator object. */
static final OperatorObject[] EVALUATOR = {
new UnaryMinusObject(),
new SumObject(),
new ReciprocalObject(),
new ProductObject(),
new PowerObject(),
new SqrtObject(),
new ExpObject(),
new LogObject(),
new SineObject(),
new CosineObject(),
new TangentObject(),
new AbsObject() };
/** Symbolic function name. */
static final String[] FNAMES = { "-", "+", "/", "*", "^", "sqrt", "exp", "log", "sin", "cos", "tan", "abs" };
/**
* Constructs an Action.
*/
public Action() {
super();
}
/**
* Returns the index to the first match in the list to the target.
*
* @param target the tartget string to match.
* @param list the list of string to compare against.
* @return the index to the first match in the list.
*/
public int findFirst(String target, String[] list) {
// System.out.println ("Target = "+target);
for (int i = 0; i < list.length; i++) {
// System.out.println ("Checking "+list[i]);
if (target.startsWith(list[i])) {
return i;
}
} // end for i
return NO_OP;
} // end findFirst
} // end class Action
class OperatorObject {
double eval(ParseNode[] values) {
return 0.0;
} // end eval
} // end operatorObjectk
class UnaryMinusObject extends OperatorObject {
double eval(ParseNode[] values) {
return -values[0].eval();
} // end eval
} // end class UnaryMinusObject
class SumObject extends OperatorObject {
double eval(ParseNode[] values) {
double s = 0.0;
for (int i = 0; i < values.length; i++)
s += values[i].eval();
return s;
} // end eval
} // end class SumObject
class ReciprocalObject extends OperatorObject {
double eval(ParseNode[] values) {
return 1.0 / values[0].eval();
} // end eval
} // end reciprocalObjec
class ProductObject extends OperatorObject {
double eval(ParseNode[] values) {
double p = 1.0;
for (int i = 0; i < values.length; i++)
p *= values[i].eval();
return p;
} // end eval
} // end ProductObject
class PowerObject extends OperatorObject {
double eval(ParseNode[] values) {
return Math.pow(values[0].eval(), values[1].eval());
} // end eval
} // end PowerObject
class SqrtObject extends OperatorObject {
double eval(ParseNode[] values) {
return Math.sqrt(values[0].eval());
} // end eval
} // end SqrtObject
class ExpObject extends OperatorObject {
double eval(ParseNode[] values) {
return Math.exp(values[0].eval());
} // end eval
} // end ExpObject
class LogObject extends OperatorObject {
double eval(ParseNode[] values) {
return Math.log(values[0].eval());
} // end eval
} // end LogObject
class SineObject extends OperatorObject {
double eval(ParseNode[] values) {
return Math.sin(values[0].eval());
} // end eval
} // end SineObject
class CosineObject extends OperatorObject {
double eval(ParseNode[] values) {
return Math.cos(values[0].eval());
} // end eval
} // end CosineObject
class TangentObject extends OperatorObject {
double eval(ParseNode[] values) {
return Math.tan(values[0].eval());
} // end eval
} // end TangentObject
class AbsObject extends OperatorObject {
double eval(ParseNode[] values) {
return Math.abs(values[0].eval());
} // end eval
} // end AbsObject