Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
02/24/21 22:22:21 (3 years ago)
Author:
bburlacu
Message:

#3087: Implement NativeInterpreter and ParameterOptimizer classes. The ParameterOptimizer offers an interface to Ceres and its options and to the variable projection optimization method. Added unit tests.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/3087_Ceres_Integration/HeuristicLab.Tests/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4/SymbolicDataAnalysisExpressionTreeInterpreterTest.cs

    r17180 r17844  
    119119    public void LinearInterpreterTestArithmeticGrammarPerformance() {
    120120      TestArithmeticGrammarPerformance(new SymbolicDataAnalysisExpressionTreeLinearInterpreter(), 12.5e6);
     121    }
     122
     123    [TestMethod]
     124    [TestCategory("Problems.DataAnalysis.Symbolic")]
     125    [TestProperty("Time", "long")]
     126    public void NativeInterpreterTestTypeCoherentGrammarPerformance() {
     127      TestTypeCoherentGrammarPerformance(new NativeInterpreter(), 12.5e6);
     128    }
     129    [TestMethod]
     130    [TestCategory("Problems.DataAnalysis.Symbolic")]
     131    [TestProperty("Time", "long")]
     132    public void NativeInterpreterTestFullGrammarPerformance() {
     133      TestFullGrammarPerformance(new NativeInterpreter(), 12.5e6);
     134    }
     135    [TestMethod]
     136    [TestCategory("Problems.DataAnalysis.Symbolic")]
     137    [TestProperty("Time", "long")]
     138    public void NativeInterpreterTestArithmeticGrammarPerformance() {
     139      TestArithmeticGrammarPerformance(new NativeInterpreter(), 12.5e6);
     140    }
     141
     142    [TestMethod]
     143    [TestCategory("Problems.DataAnalysis.Symbolic")]
     144    [TestProperty("Time", "long")]
     145    public void NativeInterpreterTestCeres() {
     146      var parser = new InfixExpressionParser();
     147      var random = new FastRandom(1234);
     148      const int nRows = 20;
     149
     150      var x1 = Enumerable.Range(0, nRows).Select(_ => UniformDistributedRandom.NextDouble(random, -1, 1)).ToArray();
     151      var x2 = Enumerable.Range(0, nRows).Select(_ => UniformDistributedRandom.NextDouble(random, -1, 1)).ToArray();
     152      var x3 = Enumerable.Range(0, nRows).Select(_ => UniformDistributedRandom.NextDouble(random, -1, 1)).ToArray();
     153
     154      var optimalAlpha = new double[] { -2, -3, -5 };
     155      var y = Enumerable.Range(0, nRows).Select(i =>
     156          Math.Exp(x1[i] * optimalAlpha[0]) +
     157          Math.Exp(x2[i] * optimalAlpha[1]) +
     158          Math.Exp(x3[i] * optimalAlpha[2])).ToArray();
     159
     160      var initialAlpha = Enumerable.Range(0, 3).Select(_ => UniformDistributedRandom.NextDouble(random, -1, 1)).ToArray();
     161      var ds = new Dataset(new[] { "x1", "x2", "x3", "y" }, new[] { x1, x2, x3, y });
     162
     163      var expr = "EXP(x1) + EXP(x2) + EXP(x3)";
     164      var tree = parser.Parse(expr);
     165      var rows = Enumerable.Range(0, nRows).ToArray();
     166      var options = new SolverOptions {
     167        Minimizer = (int)MinimizerType.TRUST_REGION,
     168        Iterations = 20,
     169        TrustRegionStrategy = (int)TrustRegionStrategyType.LEVENBERG_MARQUARDT,
     170        LinearSolver = (int)LinearSolverType.DENSE_QR
     171      };
     172
     173      var nodesToOptimize = new HashSet<ISymbolicExpressionTreeNode>(tree.IterateNodesPrefix().Where(x => x is VariableTreeNode));
     174      int idx = 0;
     175      foreach(var node in nodesToOptimize) {
     176        (node as VariableTreeNode).Weight = initialAlpha[idx++];
     177        Console.WriteLine((node as VariableTreeNode).Weight);
     178
     179      }
     180
     181      var summary = new OptimizationSummary();
     182      var parameters = ParameterOptimizer.OptimizeTree(tree, ds, rows, "y", nodesToOptimize, options, ref summary);
     183
     184      Console.Write("Optimized parameters: ");
     185      foreach (var t in parameters) {
     186        Console.Write(t.Value + " ");
     187      }
     188      Console.WriteLine();
     189
     190      Console.WriteLine("Optimization summary:");
     191      Console.WriteLine("Initial cost:         " + summary.InitialCost);
     192      Console.WriteLine("Final cost:           " + summary.FinalCost);
     193      Console.WriteLine("Successful steps:     " + summary.SuccessfulSteps);
     194      Console.WriteLine("Unsuccessful steps:   " + summary.UnsuccessfulSteps);
     195      Console.WriteLine("Residual evaluations: " + summary.ResidualEvaluations);
     196      Console.WriteLine("Jacobian evaluations: " + summary.JacobianEvaluations);
     197    }
     198
     199    [TestMethod]
     200    [TestCategory("Problems.DataAnalysis.Symbolic")]
     201    [TestProperty("Time", "long")]
     202    public void NativeInterpreterTestCeresVariableProjection() {
     203      var parser = new InfixExpressionParser();
     204      var random = new FastRandom(1234);
     205      const int nRows = 20;
     206
     207      var x1 = Enumerable.Range(0, nRows).Select(_ => UniformDistributedRandom.NextDouble(random, -1, 1)).ToArray();
     208      var x2 = Enumerable.Range(0, nRows).Select(_ => UniformDistributedRandom.NextDouble(random, -1, 1)).ToArray();
     209      var x3 = Enumerable.Range(0, nRows).Select(_ => UniformDistributedRandom.NextDouble(random, -1, 1)).ToArray();
     210
     211      var optimalAlpha = new double[] { -2, -3, -5 };
     212      var y = Enumerable.Range(0, nRows).Select(i =>
     213        Math.Exp(x1[i] * optimalAlpha[0]) +
     214        Math.Exp(x2[i] * optimalAlpha[1]) +
     215        Math.Exp(x3[i] * optimalAlpha[2])).ToArray();
     216
     217      var initialAlpha = Enumerable.Range(0, 3).Select(_ => UniformDistributedRandom.NextDouble(random, -1, 1)).ToArray();
     218      var ds = new Dataset(new[] { "x1", "x2", "x3", "y" }, new[] { x1, x2, x3, y });
     219
     220      var expr = new[] { "EXP(x1)", "EXP(x2)", "EXP(x3)" };
     221      var trees = expr.Select(x => parser.Parse(x)).ToArray();
     222      var rows = Enumerable.Range(0, nRows).ToArray();
     223      var options = new SolverOptions {
     224        Minimizer = (int)MinimizerType.TRUST_REGION,
     225        Iterations = 100,
     226        TrustRegionStrategy = (int)TrustRegionStrategyType.LEVENBERG_MARQUARDT,
     227        LinearSolver = (int)LinearSolverType.DENSE_QR
     228      };
     229
     230      var summary = new OptimizationSummary();
     231
     232      var nodesToOptimize = new HashSet<ISymbolicExpressionTreeNode>(trees.SelectMany(t => t.IterateNodesPrefix().Where(x => x is VariableTreeNode)));
     233      int idx = 0;
     234      Console.Write("Initial parameters: ");
     235      foreach (var node in nodesToOptimize) {
     236        (node as VariableTreeNode).Weight = initialAlpha[idx++];
     237        Console.Write((node as VariableTreeNode).Weight + " ");
     238      }
     239      Console.WriteLine();
     240
     241      var coeff = new double[trees.Length + 1];
     242      var parameters = ParameterOptimizer.OptimizeTree(trees, ds, rows, "y", nodesToOptimize, options, coeff, ref summary);
     243      Console.Write("Optimized parameters: ");
     244      foreach (var t in parameters) {
     245        Console.Write(t.Value + " ");
     246      }
     247      Console.WriteLine();
     248
     249      Console.Write("Coefficients: ");
     250      foreach (var v in coeff) Console.Write(v + " ");
     251      Console.WriteLine();
     252
     253      Console.WriteLine("Optimization summary:");
     254      Console.WriteLine("Initial cost:         " + summary.InitialCost);
     255      Console.WriteLine("Final cost:           " + summary.FinalCost);
     256      Console.WriteLine("Successful steps:     " + summary.SuccessfulSteps);
     257      Console.WriteLine("Unsuccessful steps:   " + summary.UnsuccessfulSteps);
     258      Console.WriteLine("Residual evaluations: " + summary.ResidualEvaluations);
     259      Console.WriteLine("Jacobian evaluations: " + summary.JacobianEvaluations);
    121260    }
    122261
Note: See TracChangeset for help on using the changeset viewer.