Beispiel #1
0
        private static void BenchMarkCalculationEngineRandomFunctionBuild(CalculationEngine engine, List<string> functions, 
            int numberOfTests)
        {
            Random random = new Random();

            DateTime start = DateTime.Now;

            Parallel.ForEach(functions,(functionText)=>
                {
                    Func<int, int, int, double> function = (Func<int, int, int, double>)engine.Formula(functionText)
                        .Parameter("var1", DataType.Integer)
                        .Parameter("var2", DataType.Integer)
                        .Parameter("var3", DataType.Integer)
                        .Result(DataType.FloatingPoint)
                        .Build();

                    for (int i = 0; i < numberOfTests; i++)
                    {
                        function(random.Next(), random.Next(), random.Next());
                    }
                });

            DateTime end = DateTime.Now;

            Console.WriteLine("Total duration: {0}", end - start);
        }
Beispiel #2
0
 public void TestFormulaBuilderInvalidParameterName()
 {
     CalculationEngine          engine   = new CalculationEngine();
     Func <int, double, double> function = (Func <int, double, double>)engine.Formula("sin+2")
                                           .Parameter("sin", DataType.Integer)
                                           .Build();
 }
Beispiel #3
0
 public void TestFormulaBuilderDuplicateParameterName()
 {
     CalculationEngine          engine   = new CalculationEngine();
     Func <int, double, double> function = (Func <int, double, double>)engine.Formula("var1+2")
                                           .Parameter("var1", DataType.Integer)
                                           .Parameter("var1", DataType.FloatingPoint)
                                           .Build();
 }
Beispiel #4
0
 public void TestFormulaBuilderInvalidParameterName()
 {
     AssertExtensions.ThrowsException <ArgumentException>(() =>
     {
         CalculationEngine engine            = new CalculationEngine();
         Func <int, double, double> function = (Func <int, double, double>)engine.Formula("sin+2")
                                               .Parameter("sin", DataType.Integer)
                                               .Build();
     });
 }
Beispiel #5
0
 public void TestFormulaBuilderDuplicateParameterName()
 {
     AssertExtensions.ThrowsException <ArgumentException>(() =>
     {
         CalculationEngine engine            = new CalculationEngine();
         Func <int, double, double> function = (Func <int, double, double>)engine.Formula("var1+2")
                                               .Parameter("var1", DataType.Integer)
                                               .Parameter("var1", DataType.FloatingPoint)
                                               .Build();
     });
 }
        public void TestCalculatePowCompiled()
        {
            CalculationEngine engine = new CalculationEngine();

            Func <float> f = engine
                             .Formula("2^3.0")
                             .Build();

            float result = f();

            Assert.AreEqual(8.0f, result);
        }
        public void TestCalculateFormula1()
        {
            CalculationEngine engine = new CalculationEngine();

            Func <float> f = engine
                             .Formula("2+3")
                             .Build();

            float result = f();

            Assert.AreEqual(5.0f, result);
        }
        public void TestExpressionArguments2()
        {
            CalculationEngine engine = new CalculationEngine();

            Func <float> f = engine
                             .Formula("if(0.57 < (3000-500)/(1500-500), 10, 20)")
                             .Build();

            float result = f();

            Assert.AreEqual(10, result);
        }
        public void TestCalculateCosineFunctionCompiled()
        {
            CalculationEngine engine = new CalculationEngine();

            Func <float> f = engine
                             .Formula("cos(41)")
                             .Build();

            float result = f();

            Assert.AreEqual(Mathf.Cos(41.0f), result);
        }
        public void TestOr2Compiled()
        {
            CalculationEngine engine = new CalculationEngine();

            Func <float> f = engine
                             .Formula("(0 || 0)")
                             .Build();

            float result = f();

            Assert.AreEqual(0, result);
        }
        public void TestPiMultiplication()
        {
            CalculationEngine engine = new CalculationEngine();

            Func <float> f = engine
                             .Formula("2 * pi")
                             .Build();

            float result = f();

            Assert.AreEqual(2 * Mathf.PI, result);
        }
        public void TestMultiplicationWithNegativeConstant()
        {
            CalculationEngine engine = new CalculationEngine();

            Func <float> f = engine
                             .Formula("5*-100")
                             .Build();

            float result = f();

            Assert.AreEqual(-500.0f, result);
        }
        public void TestCalculationFormula1FloatingPointCompiled()
        {
            CalculationEngine engine = new CalculationEngine();

            Func <float> f = engine
                             .Formula("2.0+3.0")
                             .Build();

            float result = f();

            Assert.AreEqual(5.0f, result);
        }
        public void TestCalculateLognFunctionCompiled()
        {
            CalculationEngine engine = new CalculationEngine();

            Func <float> f = engine
                             .Formula("logn(14, 3)")
                             .Build();

            float result = f();

            Assert.AreEqual(Mathf.Logn(14.0f, 3.0f), result);
        }
        public void TestComplicatedPrecedence2()
        {
            CalculationEngine engine = new CalculationEngine();

            Func <float> f = engine
                             .Formula("1+2-3*4/sqrt(25)+6-7*8/9+0")
                             .Build();

            float result = f();

            Assert.AreEqual(0.378f, Mathf.Round(result, 3));
        }
        public void TestUnaryMinus5Compiled()
        {
            CalculationEngine engine = new CalculationEngine();

            Func <float> f = engine
                             .Formula("-(1*2)^3")
                             .Build();

            float result = f();

            Assert.AreEqual(-8.0f, result);
        }
        public void TestVariableNameCaseSensitivityNoToLowerCompiled()
        {
            CalculationEngine engine = new CalculationEngine();

            Func <float, float> f = engine
                                    .Formula("2 * BlAbLa")
                                    .Parameter("BlAbLa")
                                    .Build();

            float result = f(42.5f);

            Assert.AreEqual(85.0f, result);
        }
Beispiel #18
0
        public void TestFormulaBuilderCompiled()
        {
            CalculationEngine          engine   = new CalculationEngine(CultureInfo.InvariantCulture, ExecutionMode.Compiled);
            Func <int, double, double> function = (Func <int, double, double>)engine.Formula("var1+2*(3*age)")
                                                  .Parameter("var1", DataType.Integer)
                                                  .Parameter("age", DataType.FloatingPoint)
                                                  .Result(DataType.FloatingPoint)
                                                  .Build();

            double result = function(2, 4);

            Assert.AreEqual(26.0, result);
        }
        public void TestVariableUnderscoreCompiled()
        {
            CalculationEngine engine = new CalculationEngine();

            Func <float, float, float> f = engine
                                           .Formula("var_var_1 + var_var_2")
                                           .Parameter("var_var_1")
                                           .Parameter("var_var_2")
                                           .Build();

            float result = f(1, 2);

            Assert.AreEqual(3.0f, result);
        }
        public void TestEqualCompiled()
        {
            CalculationEngine engine = new CalculationEngine();

            Func <float, float, float> f = engine
                                           .Formula("var1 == 2")
                                           .Parameter("var1")
                                           .Parameter("var2")
                                           .Build();

            float result = f(2, 2);

            Assert.AreEqual(1.0f, result);
        }
Beispiel #21
0
        public void TestCalculationFormulaBuildingWithConstants3Interpreted()
        {
            CalculationEngine engine = new CalculationEngine(CultureInfo.InvariantCulture, ExecutionMode.Interpreted, true, true, false);

            Func <double, double> formula = (Func <double, double>)engine.Formula("a+A")
                                            .Parameter("A", DataType.FloatingPoint)
                                            .Constant("a", 1)
                                            .Result(DataType.FloatingPoint)
                                            .Build();

            double result = formula(2.0);

            Assert.AreEqual(3.0, result);
        }
        public void TestReservedVariableName()
        {
            CalculationEngine engine = new CalculationEngine();

            Assert.ThrowsException <ArgumentException>(() =>
            {
                Func <float, float> f = engine
                                        .Formula("2 * pI")
                                        .Parameter("pi")
                                        .Build();

                float result = f(18.0f);
            });
        }
        public void TestCustomFunctionCompiled()
        {
            CalculationEngine engine = new CalculationEngine();

            engine.AddFunction("test", (a, b) => a + b);

            Func <float> f = engine
                             .Formula("test(2, 3)")
                             .Build();

            float result = f();

            Assert.AreEqual(5.0f, result);
        }
        public void TestGreaterThan1Compiled()
        {
            CalculationEngine engine = new CalculationEngine();

            Func <float, float, float> f = engine
                                           .Formula("var1 > var2")
                                           .Parameter("var1")
                                           .Parameter("var2")
                                           .Build();

            float result = f(2, 3);

            Assert.AreEqual(0.0f, result);
        }
        public void TestCalculateFormulaWithVariables()
        {
            CalculationEngine engine = new CalculationEngine();

            Func <float, float, float> f = engine
                                           .Formula("var1*var2")
                                           .Parameter("var1")
                                           .Parameter("var2")
                                           .Build();

            float result = f(2.5f, 3.4f);

            Assert.AreEqual(8.5f, result);
        }
Beispiel #26
0
        public void TestCalculationFormulaBuildingWithConstants2Compiled()
        {
            CalculationEngine engine = new CalculationEngine(CultureInfo.InvariantCulture, ExecutionMode.Compiled);

            Func <double, double, double> formula = (Func <double, double, double>)engine.Formula("a+b+c")
                                                    .Parameter("b", DataType.FloatingPoint)
                                                    .Parameter("c", DataType.FloatingPoint)
                                                    .Constant("a", 1)
                                                    .Result(DataType.FloatingPoint)
                                                    .Build();

            double result = formula(2.0, 2.0);

            Assert.AreEqual(5.0, result);
        }
Beispiel #27
0
        public void TestFormulaBuilderConstantInterpreted()
        {
            CalculationEngine engine = new CalculationEngine(CultureInfo.InvariantCulture, ExecutionMode.Interpreted);

            engine.AddConstant("age", 18.0);

            Func <int, double> function = (Func <int, double>)engine.Formula("age+var1")
                                          .Parameter("var1", DataType.Integer)
                                          .Result(DataType.FloatingPoint)
                                          .Build();

            double result = function(3);

            Assert.AreEqual(21.0, result);
        }
        public void TestCustomFunctionFunc11Compiled()
        {
            CalculationEngine engine = new CalculationEngine();

            engine.AddFunction("test", (a, b, c, d, e, f, g, h, i, j, k) => a + b + c + d + e + f + g + h + i + j + k);

            Func <float> func = engine
                                .Formula("test(1,2,3,4,5,6,7,8,9,10,11)")
                                .Build();

            float result   = func();
            float expected = (11 * (11 + 1)) / 2.0f;

            Assert.AreEqual(expected, result);
        }
        public void TestCalculateFormulaVariableNotDefinedCompiled()
        {
            CalculationEngine engine = new CalculationEngine();

            Dictionary <string, float> variables = new Dictionary <string, float>();

            variables.Add("var1", 2.5f);

            Assert.ThrowsException <VariableNotDefinedException>(() =>
            {
                Func <float, float> f = engine
                                        .Formula("var1*var2")
                                        .Parameter("var1")
                                        .Build();
            });
        }
Beispiel #30
0
        public void TestFormulaBuilder()
        {
            CalculationEngine          engine   = new CalculationEngine();
            Func <int, double, double> function = (Func <int, double, double>)engine.Formula("var1+2*(3*age)")
                                                  .Parameter("var1", DataType.Integer)
                                                  .Parameter("age", DataType.FloatingPoint)
                                                  .Result(DataType.FloatingPoint)
                                                  .Build();

            double result = function(2, 4);

#if !NETCORE
            Assert.AreEqual(26.0, result);
#else
            Assert.Equal(26.0, result);
#endif
        }
 /// <summary>
 /// Loads the interpolation function.
 /// </summary>
 /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
 public bool LoadFunction()
 {
     try
     {
         CalculationEngine engine = new CalculationEngine();
         this.InterpolationFunction = (Func <double, double>)engine.Formula(this.main.Text)
                                      .Parameter("X", Jace.DataType.FloatingPoint)
                                      .Result(Jace.DataType.FloatingPoint)
                                      .Build();
         for (int i = 0; i < 100; i++)
         {
             this.InterpolationFunction(((double)i) / 3);
         }
     }
     catch (Exception error)
     {
         MessageBox.Show("Wrong formula!\n" + error.Report(), "FORMULA PARSING Error", MessageBoxButton.OK, MessageBoxImage.Error);
         return(false);
     }
     return(true);
 }
Beispiel #32
0
        private static void BenchMarkCalculationEngineFunctionBuild(CalculationEngine engine, string functionText)
        {
            DateTime start = DateTime.Now;

            Func<int, int, int, double> function = (Func<int, int, int, double>)engine.Formula(functionText)
                .Parameter("var1", DataType.Integer)
                .Parameter("var2", DataType.Integer)
                .Parameter("something", DataType.Integer)
                .Result(DataType.FloatingPoint)
                .Build();

            Random random = new Random();

            for (int i = 0; i < NumberOfTests; i++)
            {
                function(random.Next(), random.Next(), random.Next());
            }

            DateTime end = DateTime.Now;

            Console.WriteLine("Total duration: {0}", end - start);
        }
Beispiel #33
0
        private static void BenchMarkCalculationEngineRandomFunctionBuild(CalculationEngine engine, List<string> functions, 
            int numberOfTests)
        {
            Random random = new Random();

            DateTime start = DateTime.Now;

            List<Task> tasks = new List<Task>();

            foreach (string functionText in functions)
            {
                Task task = new Task(() =>
                {
                    Func<int, int, int, double> function = (Func<int, int, int, double>)engine.Formula(functionText)
                        .Parameter("var1", DataType.Integer)
                        .Parameter("var2", DataType.Integer)
                        .Parameter("var3", DataType.Integer)
                        .Result(DataType.FloatingPoint)
                        .Build();

                    for (int i = 0; i < numberOfTests; i++)
                    {
                        function(random.Next(), random.Next(), random.Next());
                    }
                });

                tasks.Add(task);
                task.Start();
            }

            Task.WaitAll(tasks.ToArray());

            DateTime end = DateTime.Now;

            Console.WriteLine("Total duration: {0}", end - start);
        }
 public void TestFormulaBuilderInvalidParameterName()
 {
     AssertExtensions.ThrowsException<ArgumentException>(() =>
         {
             CalculationEngine engine = new CalculationEngine();
             Func<int, double, double> function = (Func<int, double, double>)engine.Formula("sin+2")
                 .Parameter("sin", DataType.Integer)
                 .Build();
         });
 }
 public void TestFormulaBuilderDuplicateParameterName()
 {
     AssertExtensions.ThrowsException<ArgumentException>(() =>
         {
             CalculationEngine engine = new CalculationEngine();
             Func<int, double, double> function = (Func<int, double, double>)engine.Formula("var1+2")
                 .Parameter("var1", DataType.Integer)
                 .Parameter("var1", DataType.FloatingPoint)
                 .Build();
         });
 }
        public void TestFormulaBuilderCompiled()
        {
            CalculationEngine engine = new CalculationEngine(CultureInfo.InvariantCulture, ExecutionMode.Compiled);
            Func<int, double, double> function = (Func<int, double, double>)engine.Formula("var1+2*(3*age)")
                .Parameter("var1", DataType.Integer)
                .Parameter("age", DataType.FloatingPoint)
                .Result(DataType.FloatingPoint)
                .Build();

            double result = function(2, 4);
            Assert.AreEqual(26.0, result);
        }
Beispiel #37
0
 public void TestFormulaBuilderInvalidParameterName()
 {
     CalculationEngine engine = new CalculationEngine();
     Func<int, double, double> function = (Func<int, double, double>)engine.Formula("sin+2")
         .Parameter("sin", DataType.Integer)
         .Build();
 }
Beispiel #38
0
 public void TestFormulaBuilderDuplicateParameterName()
 {
     CalculationEngine engine = new CalculationEngine();
     Func<int, double, double> function = (Func<int, double, double>)engine.Formula("var1+2")
         .Parameter("var1", DataType.Integer)
         .Parameter("var1", DataType.FloatingPoint)
         .Build();
 }