public static void TestFuncs()
{
ExpressionSolver solver = new ExpressionSolver();
solver.SetGlobalVariable("zero",0);
var exp1 = solver.SymbolicateExpression("sin(pi/2)-cos(zero)");
AssertSameValue(exp1.Evaluate(),0);
var exp2 = solver.SymbolicateExpression("2*e^zero - exp(zero)");
AssertSameValue(exp2.Evaluate(),1);
var exp3 = solver.SymbolicateExpression("log(e^6)");
AssertSameValue(exp3.Evaluate(),6);
var exp4 = solver.SymbolicateExpression("sqrt(2)-2^0.5");
AssertSameValue(exp4.Evaluate(),0);
var exp5 = solver.SymbolicateExpression("exp(log(6))");
AssertSameValue(exp5.Evaluate(),6);
var rnd = new System.Random();
solver.AddCustomFunction("Rnd1",2, delegate(double[] p) {
return p[0] + (p[1]-p[0])*(rnd.NextDouble());
},false);
var exp6 = solver.SymbolicateExpression("Rnd1(0,1)");
var firstRnd = exp6.Evaluate();
int iter = 0;
while (true)
{
var secondRnd = exp6.Evaluate();
if (firstRnd != secondRnd)
{
break;
}
iter++;
if (iter==10000)
{
// Probability of this happening is miniscule if everything works as it should
throw new System.Exception("ExpressionSolverTest failed");
}
}
solver.AddCustomFunction("Rnd2",2, delegate(double[] p) {
return p[0] + (p[1]-p[0])*(rnd.NextDouble());
},true);
var exp7 = solver.SymbolicateExpression("Rnd2(0,1)");
AssertSameValue(exp7.Evaluate(),exp7.Evaluate());
var exp8 = solver.SymbolicateExpression("cos(0)+1*2");
AssertSameValue(exp8.Evaluate(),3);
solver.AddCustomFunction("dist",5, delegate(double[] p) {
return System.Math.Pow( (p[2]-p[0])*(p[2]-p[0]) + (p[3]-p[1])*(p[3]-p[1]) ,p[4]);
},true);
var exp9 = solver.SymbolicateExpression("dist(3*x,(4*x),+6*x,-1*x,sin(x))","x");
double x = 21;
exp9.SetVariable("x",x);
AssertSameValue(exp9.Evaluate(),System.Math.Pow( (3*x-6*x)*(3*x-6*x)+(4*x+x)*(4*x+x),System.Math.Sin(x) ));
}