Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/20/15 00:50:47 (8 years ago)
Author:
bburlacu
Message:

#2442: Added CreateDelegate method to be able to get the lambda expression corresponding to a symbolic expression tree, performed minor cosmetic enhancements of the SymbolicDataAnalysisExpressionCompiledTreeInterpreter. Updated unit tests, added unit test for testing the correctness of the SymbolicDataAnalysisExpressionCompiledTreeInterpreter which can show exactly which operations cause deviations.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/SymbolicDataAnalysisExpressionCompiledTreeInterpreter.cs

    r13288 r13313  
    133133
    134134    public static Func<int, IList<double>[], double> CompileTree(ISymbolicExpressionTree tree, IDataset dataset) {
     135      var lambda = CreateDelegate(tree, dataset);
     136      return lambda.Compile();
     137    }
     138
     139    public static Expression<Func<int, IList<double>[], double>> CreateDelegate(ISymbolicExpressionTree tree, IDataset dataset) {
    135140      var row = Expression.Parameter(typeof(int));
    136141      var columns = Expression.Parameter(typeof(IList<double>[]));
     
    138143      var expr = MakeExpr(tree, variableIndices, row, columns);
    139144      var lambda = Expression.Lambda<Func<int, IList<double>[], double>>(expr, row, columns);
    140       return lambda.Compile();
     145      return lambda;
    141146    }
    142147
     
    243248            var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns);
    244249            var isNaN = Expression.Call(IsNaN, arg);
    245             var gamma = Expression.Call(Gamma, arg);
    246250
    247251            var result = Expression.Variable(typeof(double));
     
    251255                isNaN,
    252256                Expression.Assign(result, Expression.Constant(double.NaN)),
    253                 Expression.Assign(result, gamma)
     257                Expression.Assign(result, Expression.Call(Gamma, arg))
    254258                ),
    255259              result
     
    260264            var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns);
    261265            var isNaN = Expression.Call(IsNaN, arg);
    262             var psi = Expression.Call(Psi, arg);
    263266
    264267            var result = Expression.Variable(typeof(double));
     
    274277                    Expression.Call(IsAlmost, Expression.Subtract(floor, arg), Expression.Constant(0.0))),
    275278                  Expression.Assign(result, Expression.Constant(double.NaN)),
    276                   Expression.Assign(result, psi))
     279                  Expression.Assign(result, Expression.Call(Psi, arg)))
    277280                ),
    278281              result);
     
    283286            var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns);
    284287            var isNaN = Expression.Call(IsNaN, arg);
    285             var exprDawsonIntegral = Expression.Call(DawsonIntegral, arg);
    286             var result = Expression.Variable(typeof(double));
    287 
     288            var result = Expression.Variable(typeof(double));
    288289            var expr = Expression.Block(
    289290              new[] { result },
    290291              Expression.IfThenElse(isNaN,
    291292                Expression.Assign(result, Expression.Constant(double.NaN)),
    292                 Expression.Assign(result, exprDawsonIntegral)),
     293                Expression.Assign(result, Expression.Call(DawsonIntegral, arg))),
    293294              result
    294295              );
     
    299300            var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns);
    300301            var isNaN = Expression.Call(IsNaN, arg);
    301             var expIntegrapEi = Expression.Call(ExponentialIntegralEi, arg);
    302302            var result = Expression.Variable(typeof(double));
    303303            var expr = Expression.Block(
     
    305305              Expression.IfThenElse(isNaN,
    306306                Expression.Assign(result, Expression.Constant(double.NaN)),
    307                 Expression.Assign(result, expIntegrapEi)),
     307                Expression.Assign(result, Expression.Call(ExponentialIntegralEi, arg))),
    308308              result
    309309              );
     
    316316            var si = Expression.Variable(typeof(double));
    317317            var ci = Expression.Variable(typeof(double));
    318             var sinCosIntegrals = Expression.Call(SineCosineIntegrals, arg, si, ci);
    319318            var block = Expression.Block(
    320319              new[] { si, ci },
    321               sinCosIntegrals,
     320              Expression.Call(SineCosineIntegrals, arg, si, ci),
    322321              si
    323322              );
     
    337336            var si = Expression.Variable(typeof(double));
    338337            var ci = Expression.Variable(typeof(double));
    339             var sinCosIntegrals = Expression.Call(SineCosineIntegrals, arg, si, ci);
    340338            var block = Expression.Block(
    341339              new[] { si, ci },
    342               sinCosIntegrals,
     340              Expression.Call(SineCosineIntegrals, arg, si, ci),
    343341              ci
    344342              );
     
    398396            var s = Expression.Variable(typeof(double));
    399397            var c = Expression.Variable(typeof(double));
    400             var fresnel = Expression.Call(FresnelIntegral, arg, c, s);
    401             var block = Expression.Block(new[] { s, c }, fresnel, s);
     398            var block = Expression.Block(new[] { s, c }, Expression.Call(FresnelIntegral, arg, c, s), s);
    402399            var result = Expression.Variable(typeof(double));
    403400            var expr = Expression.Block(new[] { result },
     
    415412            var s = Expression.Variable(typeof(double));
    416413            var c = Expression.Variable(typeof(double));
    417             var fresnel = Expression.Call(FresnelIntegral, arg, c, s);
    418             var block = Expression.Block(new[] { s, c }, fresnel, c);
     414            var block = Expression.Block(new[] { s, c }, Expression.Call(FresnelIntegral, arg, c, s), c);
    419415            var result = Expression.Variable(typeof(double));
    420416            var expr = Expression.Block(new[] { result },
     
    434430            var bi = Expression.Variable(typeof(double));
    435431            var bip = Expression.Variable(typeof(double));
    436             var airy = Expression.Call(Airy, arg, ai, aip, bi, bip);
    437             var block = Expression.Block(new[] { ai, aip, bi, bip }, airy, ai);
     432            var block = Expression.Block(new[] { ai, aip, bi, bip }, Expression.Call(Airy, arg, ai, aip, bi, bip), ai);
    438433            var result = Expression.Variable(typeof(double));
    439434            var expr = Expression.Block(new[] { result },
     
    453448            var bi = Expression.Variable(typeof(double));
    454449            var bip = Expression.Variable(typeof(double));
    455             var airy = Expression.Call(Airy, arg, ai, aip, bi, bip);
    456             var block = Expression.Block(new[] { ai, aip, bi, bip }, airy, bi);
     450            var block = Expression.Block(new[] { ai, aip, bi, bip }, Expression.Call(Airy, arg, ai, aip, bi, bip), bi);
    457451            var result = Expression.Variable(typeof(double));
    458452            var expr = Expression.Block(new[] { result },
     
    467461        case OpCodes.Norm: {
    468462            var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns);
    469             var isNaN = Expression.Call(IsNaN, arg);
    470463            var result = Expression.Variable(typeof(double));
    471464            return Expression.Block(
    472465              new[] { result },
    473466              Expression.IfThenElse(
    474                 isNaN,
    475                 Expression.Assign(result, Expression.Constant(double.NaN)),
     467                Expression.Call(IsNaN, arg),
     468                Expression.Assign(result, arg),
    476469                Expression.Assign(result, Expression.Call(NormalDistribution, arg))),
    477470              result);
Note: See TracChangeset for help on using the changeset viewer.