Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.BottomUpTreeDistance/HeuristicLab.Tests/Util.cs @ 11219

Last change on this file since 11219 was 11219, checked in by bburlacu, 10 years ago

#2215: Refactored the tree distance calculators as similarity calculators (extending SingleObjectiveSolutionSimilarityCalculator). Removed ISymbolicExpressionTreeDistanceCalculator interface. Made small performance enhancements to the BottomUpSimilarityCalculator. Added unit tests to check correctness and performance of bottom up similarity. Added SingleObjectivePopulationDiversityAnalyzer in the default operators list along with the BottomUpSimilarityCalculator.

File size: 4.4 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections.Generic;
24using System.Diagnostics;
25using System.Linq;
26using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
27using HeuristicLab.Random;
28namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Tests {
29  internal class Util {
30
31    public static void InitTree(ISymbolicExpressionTree tree, MersenneTwister twister, List<string> varNames) {
32      foreach (var node in tree.IterateNodesPostfix()) {
33        if (node is VariableTreeNode) {
34          var varNode = node as VariableTreeNode;
35          varNode.Weight = twister.NextDouble() * 20.0 - 10.0;
36          varNode.VariableName = varNames[twister.Next(varNames.Count)];
37        } else if (node is ConstantTreeNode) {
38          var constantNode = node as ConstantTreeNode;
39          constantNode.Value = twister.NextDouble() * 20.0 - 10.0;
40        }
41      }
42    }
43
44
45    public static ISymbolicExpressionTree[] CreateRandomTrees(MersenneTwister twister, Dataset dataset, ISymbolicExpressionGrammar grammar, int popSize) {
46      return CreateRandomTrees(twister, dataset, grammar, popSize, 1, 200, 3, 3);
47    }
48
49    public static ISymbolicExpressionTree[] CreateRandomTrees(MersenneTwister twister, Dataset dataset, ISymbolicExpressionGrammar grammar,
50      int popSize, int minSize, int maxSize,
51      int maxFunctionDefinitions, int maxFunctionArguments) {
52      foreach (Variable variableSymbol in grammar.Symbols.OfType<Variable>()) {
53        variableSymbol.VariableNames = dataset.VariableNames.Skip(1);
54      }
55      ISymbolicExpressionTree[] randomTrees = new ISymbolicExpressionTree[popSize];
56      for (int i = 0; i < randomTrees.Length; i++) {
57        randomTrees[i] = ProbabilisticTreeCreator.Create(twister, grammar, maxSize, 10);
58      }
59      return randomTrees;
60    }
61
62
63    public static Dataset CreateRandomDataset(MersenneTwister twister, int rows, int columns) {
64      double[,] data = new double[rows, columns];
65      for (int i = 0; i < rows; i++) {
66        for (int j = 0; j < columns; j++) {
67          data[i, j] = twister.NextDouble() * 2.0 - 1.0;
68        }
69      }
70      IEnumerable<string> variableNames = new string[] { "y" }.Concat(Enumerable.Range(0, columns - 1).Select(x => "x" + x.ToString()));
71      Dataset ds = new Dataset(variableNames, data);
72      return ds;
73    }
74
75    public static double NodesPerSecond(long nNodes, Stopwatch watch) {
76      return nNodes / (watch.ElapsedMilliseconds / 1000.0);
77    }
78
79    public static double CalculateEvaluatedNodesPerSec(ISymbolicExpressionTree[] trees, ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, Dataset dataset, int repetitions) {
80      // warm up
81      IEnumerable<int> rows = Enumerable.Range(0, dataset.Rows);
82      long nNodes = 0;
83      double c = 0;
84      for (int i = 0; i < trees.Length; i++) {
85        nNodes += trees[i].Length * (dataset.Rows - 1);
86        c = interpreter.GetSymbolicExpressionTreeValues(trees[i], dataset, rows).Count(); // count needs to evaluate all rows
87      }
88
89      Stopwatch watch = new Stopwatch();
90      for (int rep = 0; rep < repetitions; rep++) {
91        watch.Start();
92        c = 0;
93        for (int i = 0; i < trees.Length; i++) {
94          interpreter.GetSymbolicExpressionTreeValues(trees[i], dataset, rows).Count(); // count needs to evaluate all rows
95        }
96        watch.Stop();
97      }
98      Console.WriteLine("Random tree evaluation performance of " + interpreter.GetType() + ": " +
99        watch.ElapsedMilliseconds + "ms " +
100        Util.NodesPerSecond(nNodes * repetitions, watch) + " nodes/sec");
101      return Util.NodesPerSecond(nNodes * repetitions, watch);
102    }
103  }
104}
Note: See TracBrowser for help on using the repository browser.