public SymbolicateExpression ( string formula, string localVariable ) : Expression | ||
formula | string | |
localVariable | string | |
return | Expression |
public static void TestUndefinedVariablePolicies() { ExpressionSolver solver = new ExpressionSolver(); try { solver.SymbolicateExpression("test"); throw new System.Exception("ExpressionSolverTest failed"); } catch (AK.ESUnknownExpressionException) { // Expected behaviour } solver.undefinedVariablePolicy = ExpressionSolver.UndefinedVariablePolicy.DefineGlobalVariable; var exp2 = solver.SymbolicateExpression("test2"); AssertSameValue(solver.GetGlobalVariable("test2").value, 0); AssertSameValue(exp2.Evaluate(), 0); solver.undefinedVariablePolicy = ExpressionSolver.UndefinedVariablePolicy.DefineExpressionLocalVariable; var exp3 = solver.SymbolicateExpression("sin(test3)"); var test3 = exp3.GetVariable("test3"); AssertSameValue(test3.value, 0); test3.value = System.Math.PI / 2; AssertSameValue(exp3.Evaluate(), 1); }
public void UpdateFunctions() { Clear(); //if (es.CompileAll()) //{ es.CompileAll(); expX = solver.SymbolicateExpression(es.expressions["X"].expression); expY = solver.SymbolicateExpression(es.expressions["Y"].expression); expZ = solver.SymbolicateExpression(es.expressions["Z"].expression); //} //else //{ // return; //} //try //{ // expX = solver.SymbolicateExpression(expressionX); // expY = solver.SymbolicateExpression(expressionY); // expZ = solver.SymbolicateExpression(expressionZ); //} //catch //{ // return; //} CalculateVectors(); DrawVectorField(); }
public void SetupSolver() { depth = parameter_names.Count; width = (int)Mathf.Pow(PARTICLE_COUNT, 1f / (float)depth); for (int i = 0; i < depth; i++) { string name = parameter_names[i]; indexedParam[i] = name; parameterMin[name] = (float)solver.EvaluateExpression(parameter_min[name]); parameterMax[name] = (float)solver.EvaluateExpression(parameter_max[name]); solver.SetGlobalVariable(name, 0); } expr1 = solver.SymbolicateExpression(expression1); expr2 = solver.SymbolicateExpression(expression2); expr3 = solver.SymbolicateExpression(expression3); for (int i = 0; i < depth; i++) { string name = parameter_names[i]; AK.Variable var = solver.GetGlobalVariable(name); //vars.Add(var); vars[name] = var; } }
public static void TestGlobalConstants() { ExpressionSolver solver = new ExpressionSolver(); solver.SetGlobalVariable("test", 1); var exp1 = solver.SymbolicateExpression("test+1"); AssertSameValue(2.0, exp1.Evaluate()); solver.SetGlobalVariable("test", 2); var exp2 = solver.SymbolicateExpression("test+1"); AssertSameValue(3.0, exp2.Evaluate()); AssertSameValue(exp1.Evaluate(), exp2.Evaluate()); }
public static void TestExpLocalConstants() { ExpressionSolver solver = new ExpressionSolver(); var exp1 = solver.SymbolicateExpression("test+1", new string[] { "test" }); exp1.SetVariable("test", 1.0); var exp2 = solver.SymbolicateExpression("test+1", "test"); // If you define only one variable, you don't need to use the string[] format exp2.SetVariable("test", 2.0); solver.SetGlobalVariable("test", 1000); // If there is name clash with a exp-local variable, we prefer the exp-local variable. AssertSameValue(exp1.Evaluate(), 2); AssertSameValue(exp2.Evaluate(), 3); var exp3 = solver.SymbolicateExpression("test^2"); AssertSameValue(exp3.Evaluate(), 1000 * 1000); }
// Evaluate all equations for a given x (called by a thread), and popluate arrays with the results void ThreadedEvaluate(float x_temp, int inOrderCount) { AK.ExpressionSolver subSolver = new AK.ExpressionSolver(); AK.Expression subExp = new AK.Expression(); subSolver.SetGlobalVariable("x", 0); subSolver.SetGlobalVariable("y", 0); subSolver.SetGlobalVariable("z", 0); AK.Variable subX = subSolver.GetGlobalVariable("x"); AK.Variable subY = subSolver.GetGlobalVariable("y"); AK.Variable subZ = subSolver.GetGlobalVariable("z"); subExp = subSolver.SymbolicateExpression(es.expressions["X"].expression); for (float y_temp = ymin; y_temp < ymax; y_temp += delta) { for (float z_temp = zmin; z_temp < zmax; z_temp += delta) { if ((int)((z_temp - zmin) / delta) % sleepInterval == 0) { Thread.Sleep(1); } subX.value = x_temp; subY.value = z_temp; subZ.value = y_temp; float x = (float)subExp.Evaluate(); //Mathf.Clamp(x, -Mathf.Exp(20), Mathf.Exp(20)); //float y = (float)expY.Evaluate(); //Mathf.Clamp(y, -Mathf.Exp(20), Mathf.Exp(20)); //float z = (float)expZ.Evaluate(); //Mathf.Clamp(z, -Mathf.Exp(20), Mathf.Exp(20)); Vector3 target = new Vector3(x_temp, y_temp, z_temp); Vector3 result = new Vector3(x, 0, 0); if (float.IsNaN(x) // || float.IsNaN(y) // || float.IsNaN(z) || Mathf.Abs(x) == 0) { result = new Vector3(0, 0, 0); } //Vector3 direction = result.normalized; lock (lck) { max_magnitude = (Mathf.Abs(x) > max_magnitude) ? Mathf.Abs(x) : max_magnitude; } startPts[inOrderCount] = target; offsets[inOrderCount] = result; inOrderCount++; } } // numComplete++; }
public void Go(string sfx, string sfy, string sfu, string sfv) { this.sfx = sfx; this.sfy = sfy; this.sfu = sfu; this.sfv = sfv; fxexp = solver.SymbolicateExpression(this.sfx, new string[] { "s", "t", "a" }); fyexp = solver.SymbolicateExpression(this.sfy, new string[] { "s", "t", "a" }); fuexp = solver.SymbolicateExpression(this.sfu, new string[] { "s", "t", "a" }); fvexp = solver.SymbolicateExpression(this.sfv, new string[] { "s", "t", "a" }); UpdatePoints(); }
public virtual bool GenerateAKSolver(AK.ExpressionSolver solver) { try { AKExpression = solver.SymbolicateExpression(rawText); } catch (System.Exception exception) { return(false); } return(true); }
void ThreadedEvaluate(int TID, int chunkSize, int extra) { AK.ExpressionSolver solver_ = new AK.ExpressionSolver(); AK.Variable u_ = solver_.SetGlobalVariable("theta", 0); AK.Variable v_ = solver_.SetGlobalVariable("phi", 0); AK.Expression exp_ = solver_.SymbolicateExpression(expr); float umin = (float)solver_.EvaluateExpression(uminExpr); float umax = (float)solver_.EvaluateExpression(umaxExpr); float vmin = (float)solver_.EvaluateExpression(vminExpr); float vmax = (float)solver_.EvaluateExpression(vmaxExpr); System.Random rand = new System.Random(); for (int i = 0; i < chunkSize + extra; i++) { float u = (float)(chunkSize * TID + i) / (resolution - 1); u_.value = umin + (umax - umin) * u; for (int j = 0; j < resolution; j++) { float v = (float)j / (resolution - 1); v_.value = vmin + (vmax - vmin) * v; float result = (float)exp_.Evaluate(); Vector3 spherical = new Vector3((float)u_.value, (float)v_.value, result); Vector3 cartesian = SphericalToCartesian(spherical); Vector3 vel = new Vector3( (float)rand.NextDouble(), (float)rand.NextDouble(), (float)rand.NextDouble()); vel = vel.normalized * 0.1f; float sqrt2 = Mathf.Sqrt(2.0f); Color c = Color.cyan * Mathf.Sqrt(u * u + v * v) / sqrt2 + Color.yellow * (1.0f - Mathf.Sqrt(u * u + v * v) / sqrt2) + Color.red * Mathf.Sqrt(u * u + (1 - v) * (1 - v)) / sqrt2 + Color.green * (1.0f - Mathf.Sqrt(u * u + (1 - v) * (1 - v)) / sqrt2); Vector3 pos = new Vector3(cartesian.x, cartesian.z, cartesian.y); Particle p = new Particle() { position = pos, velocity = vel, color = c }; lock (insert_lck) { results.Add(p); } } } }
// Use this for initialization void Awake() { mesh = GetComponent <MeshFilter>().mesh; // aww yisss Awake > Start for variable value initialization solver = GlobalDataStore.getSolver(); zFn = GlobalDataStore.getZFn(); // incase we start from "main" scene directly. if (solver == null) { solver = new AK.ExpressionSolver(); solver.SetGlobalVariable("x", 0); solver.SetGlobalVariable("y", 0); zFn = solver.SymbolicateExpression("(x^2 + y^2) / (x*y+1)"); } }
// Reset the threads and prepare to run new calculations so long as the plotter is not graphing public void UpdateFunctions() { if (drawn) { drawn = false; Clear(); //if (es.CompileAll()) //{ es.CompileAll(); expX = solver.SymbolicateExpression(es.expressions["X"].expression); CalculateVectors(); } else { drawQueue++; } //DrawDensityPlot(); }
public static void TestComplexFormulas() { ExpressionSolver solver = new ExpressionSolver(); { var exp = solver.SymbolicateExpression("sin(1/(0.5*x))", "x"); var x = 21.0; exp.SetVariable("x", x); AssertSameValue(exp.Evaluate(), System.Math.Sin(1 / (0.5 * x))); } { var exp = solver.SymbolicateExpression("(1+1)+.5"); AssertSameValue(exp.Evaluate(), 2.5f); } { var exp = solver.SymbolicateExpression("sin(2/(1-0.5*x))", "x"); var x = 21.0; exp.SetVariable("x", x); AssertSameValue(exp.Evaluate(), System.Math.Sin(2 / (1 - 0.5 * x))); } { var exp = solver.SymbolicateExpression("sin((2/(1-0.5*x))/2)", "x"); var x = 21.0; exp.SetVariable("x", x); AssertSameValue(exp.Evaluate(), System.Math.Sin((2 / (1 - 0.5 * x)) / 2)); } { var exp = solver.SymbolicateExpression("1/(1+sin((2/(1-0.5*x))/2))", "x"); var x = 21.0; exp.SetVariable("x", x); AssertSameValue(exp.Evaluate(), 1 / (1 + System.Math.Sin((2 / (1 - 0.5 * x)) / 2))); } { var exp = solver.SymbolicateExpression(" (1-(3*(x/( (x+22)/x)-1*2*x))^0.5)/(x+1) ", "x"); var x = -21.0; exp.SetVariable("x", x); AssertSameValue(exp.Evaluate(), (1 - System.Math.Pow(3 * (x / ((x + 22) / x) - 1 * 2 * x), 0.5)) / (x + 1)); } { var exp = solver.SymbolicateExpression("(1+1/x)^x", "x"); var x = 30000000.0; exp.SetVariable("x", x); AssertSameValue(exp.Evaluate(), System.Math.E); } }
public void setZFn() { string userInputFunction = InputField.GetComponent <InputField>().text; if (userInputFunction.Length == 0) { userInputFunction = "(x^2+y^2)/(xy)"; } userInputFunction = EnsafenFnString(userInputFunction); // make 5x -> 5*x, etc Expression zFn = solver.SymbolicateExpression(EnsafenFnString(userInputFunction)); setArgs(5, 10); Debug.Log("Result: " + zFn.Evaluate()); GlobalDataStore.setSolver(solver); GlobalDataStore.setZFn(zFn); SceneManager.LoadScene("main"); }
public static void TestSum() { const int N = 10000; ExpressionSolver solver = new ExpressionSolver(); var exp = solver.SymbolicateExpression("1/2^i", "i"); double sum = 0; for (int i = 0; i < N; i++) { exp.SetVariable("i", i); sum += exp.Evaluate(); } AssertSameValue(sum, 2); sum = 0; var variable = exp.GetVariable("i"); for (int i = 0; i < N; i++) { variable.value = i; sum += exp.Evaluate(); } AssertSameValue(sum, 2); }
public static void TestComplexFormulas() { ExpressionSolver solver = new ExpressionSolver(); { var exp = solver.SymbolicateExpression("sin(1/(0.5*x))","x"); var x = 21.0; exp.SetVariable("x",x); AssertSameValue(exp.Evaluate(),System.Math.Sin(1/(0.5*x)) ); } { var exp = solver.SymbolicateExpression("(1+1)+.5"); AssertSameValue(exp.Evaluate(),2.5f); } { var exp = solver.SymbolicateExpression("sin(2/(1-0.5*x))","x"); var x = 21.0; exp.SetVariable("x",x); AssertSameValue(exp.Evaluate(),System.Math.Sin(2/(1-0.5*x)) ); } { var exp = solver.SymbolicateExpression("sin((2/(1-0.5*x))/2)","x"); var x = 21.0; exp.SetVariable("x",x); AssertSameValue(exp.Evaluate(),System.Math.Sin((2/(1-0.5*x))/2)); } { var exp = solver.SymbolicateExpression("1/(1+sin((2/(1-0.5*x))/2))","x"); var x = 21.0; exp.SetVariable("x",x); AssertSameValue(exp.Evaluate(),1/(1+System.Math.Sin((2/(1-0.5*x))/2))); } { var exp = solver.SymbolicateExpression(" (1-(3*(x/( (x+22)/x)-1*2*x))^0.5)/(x+1) ","x"); var x = -21.0; exp.SetVariable("x",x); AssertSameValue(exp.Evaluate(), (1-System.Math.Pow(3*(x/( (x+22)/x)-1*2*x),0.5))/(x+1) ); } { var exp = solver.SymbolicateExpression("(1+1/x)^x","x"); var x = 30000000.0; exp.SetVariable("x",x); AssertSameValue(exp.Evaluate(),System.Math.E); } }
public static void TestExpLocalConstants() { ExpressionSolver solver = new ExpressionSolver(); var exp1 = solver.SymbolicateExpression("test+1",new string[]{"test"}); exp1.SetVariable("test",1.0); var exp2 = solver.SymbolicateExpression("test+1","test"); // If you define only one variable, you don't need to use the string[] format exp2.SetVariable("test",2.0); solver.SetGlobalVariable("test",1000); // If there is name clash with a exp-local variable, we prefer the exp-local variable. AssertSameValue(exp1.Evaluate(),2); AssertSameValue(exp2.Evaluate(),3); var exp3 = solver.SymbolicateExpression("test^2"); AssertSameValue(exp3.Evaluate(),1000*1000); }
public static void TestUndefinedVariablePolicies() { ExpressionSolver solver = new ExpressionSolver(); try { solver.SymbolicateExpression("test"); throw new System.Exception("ExpressionSolverTest failed"); } catch (AK.ESUnknownExpressionException) { // Expected behaviour } solver.undefinedVariablePolicy = ExpressionSolver.UndefinedVariablePolicy.DefineGlobalVariable; var exp2 = solver.SymbolicateExpression("test2"); AssertSameValue(solver.GetGlobalVariable("test2").value,0); AssertSameValue(exp2.Evaluate(),0); solver.undefinedVariablePolicy = ExpressionSolver.UndefinedVariablePolicy.DefineExpressionLocalVariable; var exp3 = solver.SymbolicateExpression("sin(test3)"); var test3 = exp3.GetVariable("test3"); AssertSameValue(test3.value,0); test3.value = System.Math.PI/2; AssertSameValue(exp3.Evaluate(),1); }
public static void TestSum() { const int N = 10000; ExpressionSolver solver = new ExpressionSolver(); var exp = solver.SymbolicateExpression("1/2^i","i"); double sum = 0; for (int i=0;i<N;i++) { exp.SetVariable("i",i); sum += exp.Evaluate(); } AssertSameValue(sum,2); sum = 0; var variable = exp.GetVariable("i"); for (int i=0;i<N;i++) { variable.value = i; sum += exp.Evaluate(); } AssertSameValue(sum,2); }
public static void TestStringFuncs() { ExpressionSolver solver = new ExpressionSolver(); solver.AddCustomFunction("strlen",1, delegate(object[] p) { return ((string)p[0]).Length; },true); var exp = solver.SymbolicateExpression("strlen('123')"); AssertSameValue(exp.Evaluate(),3.0); exp = solver.SymbolicateExpression("strlen('12\\'3')"); AssertSameValue(exp.Evaluate(),4.0); exp = solver.SymbolicateExpression("strlen('12\\'3 4')"); AssertSameValue(exp.Evaluate(),6.0); solver.AddCustomFunction("strlen2",2, delegate(object[] p) { return ((string)p[0]).Length*(double)p[1]; }); exp = solver.SymbolicateExpression("strlen2('12\\'3 4',2.5)"); AssertSameValue(exp.Evaluate(),6.0*2.5); string[] erroneousStrings = new string[]{"strlen(''')","strlen('''')","''"}; foreach (var errorString in erroneousStrings) { try { exp = solver.SymbolicateExpression(errorString); throw new System.Exception("ExpressionSolverTest failed"); } catch (ESSyntaxErrorException) { // Parameters were not given correctly - syntax error expected } catch (System.Exception) { throw new System.Exception("ExpressionSolverTest failed"); } } // Because strlen should be evaluated at symbolication time, the following should reduce to one real value symbol: exp = solver.SymbolicateExpression("(1+strlen('123')+1)/strlen('12345')"); Assert(exp.root.type == SymbolType.RealValue); AssertSameValue(exp.root.value,1); // But if one of the parameters is not constant, then we cant do it: exp = solver.SymbolicateExpression("strlen('123')+x", new string[]{"x"}); Assert(exp.root.type == SymbolType.SubExpression); // Test string variables. Both exp-local and global exp = solver.SymbolicateExpression("strlen(stringVariableTest)","$stringVariableTest"); exp.SetVariable("stringVariableTest","test"); AssertSameValue(exp.Evaluate(),4); try { exp.SetVariable("stringVariableTest",121); Assert(false); } catch (ESParameterTypeChangedException) { } solver.SetGlobalVariable("striva","123"); exp = solver.SymbolicateExpression("strlen( ( striva ) )/3"); AssertSameValue(exp.Evaluate(),1); try { solver.SetGlobalVariable("striva",42141.0); Assert(false); } catch (ESParameterTypeChangedException) { } }
public static void TestGlobalConstants() { ExpressionSolver solver = new ExpressionSolver(); solver.SetGlobalVariable("test",1); var exp1 = solver.SymbolicateExpression("test+1"); AssertSameValue(2.0,exp1.Evaluate()); solver.SetGlobalVariable("test",2); var exp2 = solver.SymbolicateExpression("test+1"); AssertSameValue(3.0,exp2.Evaluate()); AssertSameValue(exp1.Evaluate(),exp2.Evaluate()); }
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) )); }
public static void TestStringFuncs() { ExpressionSolver solver = new ExpressionSolver(); solver.AddCustomFunction("strlen", 1, delegate(object[] p) { return(((string)p[0]).Length); }, true); var exp = solver.SymbolicateExpression("strlen('123')"); AssertSameValue(exp.Evaluate(), 3.0); exp = solver.SymbolicateExpression("strlen('12\\'3')"); AssertSameValue(exp.Evaluate(), 4.0); exp = solver.SymbolicateExpression("strlen('12\\'3 4')"); AssertSameValue(exp.Evaluate(), 6.0); solver.AddCustomFunction("strlen2", 2, delegate(object[] p) { return(((string)p[0]).Length * (double)p[1]); }); exp = solver.SymbolicateExpression("strlen2('12\\'3 4',2.5)"); AssertSameValue(exp.Evaluate(), 6.0 * 2.5); string[] erroneousStrings = new string[] { "strlen(''')", "strlen('''')", "''" }; foreach (var errorString in erroneousStrings) { try { exp = solver.SymbolicateExpression(errorString); throw new System.Exception("ExpressionSolverTest failed"); } catch (ESSyntaxErrorException) { // Parameters were not given correctly - syntax error expected } catch (System.Exception) { throw new System.Exception("ExpressionSolverTest failed"); } } // Because strlen should be evaluated at symbolication time, the following should reduce to one real value symbol: exp = solver.SymbolicateExpression("(1+strlen('123')+1)/strlen('12345')"); Assert(exp.root.type == SymbolType.RealValue); AssertSameValue(exp.root.value, 1); // But if one of the parameters is not constant, then we cant do it: exp = solver.SymbolicateExpression("strlen('123')+x", new string[] { "x" }); Assert(exp.root.type == SymbolType.SubExpression); // Test string variables. Both exp-local and global exp = solver.SymbolicateExpression("strlen(stringVariableTest)", "$stringVariableTest"); exp.SetVariable("stringVariableTest", "test"); AssertSameValue(exp.Evaluate(), 4); try { exp.SetVariable("stringVariableTest", 121); Assert(false); } catch (ESParameterTypeChangedException) { } solver.SetGlobalVariable("striva", "123"); exp = solver.SymbolicateExpression("strlen( ( striva ) )/3"); AssertSameValue(exp.Evaluate(), 1); try { solver.SetGlobalVariable("striva", 42141.0); Assert(false); } catch (ESParameterTypeChangedException) { } }
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))); }
void SamplePoints() { Vector3 start = referencePoint.lastLocalPos; //lck = new object(); //thread_num = SystemInfo.processorCount; //thread_num = 1; //thread_num = (thread_num > 2) ? 2 : thread_num; tmin = (float)solver.EvaluateExpression(t_min); tmin = (tmin > 0) ? 0 : tmin; tmax = (float)solver.EvaluateExpression(t_max); tmax = (tmax < 0) ? 0 : tmax; currLocalPos = referencePoint.lastLocalPos; currExpX = vectorField.expressionX; currExpY = vectorField.expressionY; currExpZ = vectorField.expressionZ; int lastCount = positions.Count; positions.Clear(); solver = new AK.ExpressionSolver(); solver.SetGlobalVariable("x", referencePoint.lastLocalPos.x); solver.SetGlobalVariable("y", referencePoint.lastLocalPos.y); solver.SetGlobalVariable("z", referencePoint.lastLocalPos.z); expX = solver.SymbolicateExpression(vectorField.es.expressions[ExpressionSet.ExpOptions.X].expression); expY = solver.SymbolicateExpression(vectorField.es.expressions[ExpressionSet.ExpOptions.Y].expression); expZ = solver.SymbolicateExpression(vectorField.es.expressions[ExpressionSet.ExpOptions.Z].expression); varX = solver.GetGlobalVariable("x"); varY = solver.GetGlobalVariable("y"); varZ = solver.GetGlobalVariable("z"); //solvers = new AK.ExpressionSolver[thread_num]; //expXs = new AK.Expression[thread_num]; //expYs = new AK.Expression[thread_num]; //expZs = new AK.Expression[thread_num]; //for(int i = 0; i < thread_num; i++) //{ // solvers[i] = new AK.ExpressionSolver(); // solvers[i].SetGlobalVariable("x", 0); // solvers[i].SetGlobalVariable("y", 0); // solvers[i].SetGlobalVariable("z", 0); // expXs[i] = solvers[i].SymbolicateExpression(vectorField.es.expressions[ExpressionSet.ExpOptions.X].expression); // expYs[i] = solvers[i].SymbolicateExpression(vectorField.es.expressions[ExpressionSet.ExpOptions.Y].expression); // expZs[i] = solvers[i].SymbolicateExpression(vectorField.es.expressions[ExpressionSet.ExpOptions.Z].expression); //} //Thread[] threads = new Thread[thread_num]; float positiveCount = tmax / time_step; positiveCount = (positiveCount > 50000) ? 50000 : positiveCount; float negativeCount = -tmin / time_step; negativeCount = (negativeCount > 50000) ? 50000 : negativeCount; //Vector3[] startPts = new Vector3[thread_num]; //startPts[0] = referencePoint.lastLocalPos; //for(int i = 1; i < thread_num; i++) //{ // startPts[i] = RK4(startPts[i - 1], time_step); //} //for(int i = 0; i < thread_num; i++) //{ // int index = i; // threads[i] = new Thread(() => ThreadedSampling(index, startPts[index], time_step * thread_num, positiveCount / thread_num, // negativeCount / thread_num)); // threads[i].Start(); //} ////for (int i = 0; i < 5; i++) ////{ //// yield return null; ////} //for (int i = 0; i < thread_num; i++) //{ // threads[i].Join(); //} Vector3 curr = start; for (int i = 0; i < positiveCount; i++) { curr = RK4(curr, time_step); positions.Add(i + 1, curr); } curr = start; for (int i = 0; i < negativeCount; i++) { curr = RK4(curr, -time_step); positions.Add(-i, curr); } if (positions.Count != lastCount) { InitializeParticleSystem(); } //RenderParticles(); currHighlight = 0; thread_finished = true; }