Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
02/24/12 17:30:16 (12 years ago)
Author:
bburlacu
Message:

#1772: Merged changes from trunk, rigged the TournamentSelector to track clones, improved tracking code.

Location:
branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4
Files:
1 deleted
3 edited

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/Analyzers/SymbolicExpressionTreeGenealogyAnalyzer.cs

    r7515 r7522  
    3636using HeuristicLab.Problems.DataAnalysis;
    3737using HeuristicLab.Problems.DataAnalysis.Symbolic;
    38 
     38using HeuristicLab.Problems.DataAnalysis.Symbolic.Regression;
    3939using CloneMapType = HeuristicLab.Core.ItemDictionary<HeuristicLab.Core.IItem, HeuristicLab.Core.IItem>;
    4040using TraceMapType = HeuristicLab.Core.ItemDictionary<HeuristicLab.Core.IItem, HeuristicLab.Core.IItemList<HeuristicLab.Core.IItem>>;
     
    229229        // add all individuals to the evolutionary graph
    230230        int generation = Generations.Value;
    231         int count = GlobalTraceMap.Count;
    232231        string label;
    233232
     
    238237            var tree = qualities.ElementAt(i).Key;
    239238            label = (i + 1).ToString(CultureInfo.InvariantCulture);
    240             graph.AddNode(tree, qualities[tree], label, generation);
     239            graph.AddNode(tree, qualities[tree], label, generation, i < Elites.Value);
    241240          }
    242241          return base.Apply();
    243242        }
    244243
    245         // mark and add elites
    246         // elites do not appear in the trace map (because they are never the product of a genetic operation)
    247         var elites = qualities.OrderByDescending(x => x.Value).Take(Elites.Value).Select(x => x.Key).ToList();
    248         for (int i = 0; i != Elites.Value; ++i) {
    249           label = (generation * count + i + 1).ToString(CultureInfo.InvariantCulture);
    250           var elite = elites[i];
    251           if (!graph.HasNode(elite))
    252             graph.AddNode(elite, qualities[elite], label, Generations.Value, true);
    253           else
    254             graph.GetNode(elite).Label += "\\n" + label;
    255 
    256           graph.GetNode(elite).Color = new Color { R = 0, G = 100, B = 150 };
    257         }
    258 
    259         for (int i = 0; i != count; ++i) {
    260           var trace = GlobalTraceMap.ElementAt(i);
    261           var child = (ISymbolicExpressionTree)trace.Key;
    262 
    263           if (!graph.HasNode(child)) {
    264             // due to the structure of the trace map, qualities[child] will never throw an exception, so we use it directly
    265             label = (generation * count + i + 1 + Elites.Value).ToString(CultureInfo.InvariantCulture);
     244        for (int i = 0; i != qualities.Count; ++i) {
     245          var child = qualities.ElementAt(i).Key;
     246          label = (generation * qualities.Count + i + 1).ToString(CultureInfo.InvariantCulture);
     247          if (i < Elites.Value) {
     248            if (graph.HasNode(child))
     249              graph.GetNode(child).Label += "\\n" + label;
     250            else
     251              graph.AddNode(child, qualities[child], label, generation, true);
     252          } else
    266253            graph.AddNode(child, qualities[child], label, generation);
    267           }
    268           var parents = trace.Value;
     254          if (!GlobalTraceMap.ContainsKey(child)) continue;
     255          var parents = GlobalTraceMap[child];
    269256          foreach (var parent in parents) {
    270             if (!graph.HasNode(parent)) {
    271               // if the node is a clone introduced pre-mutation, then its quality value has to be evaluated
    272               if (!qualities.ContainsKey(parent))
    273                 qualities[parent] = Evaluate((ISymbolicExpressionTree)parent);
    274               label = ((generation - 1) * count + i + 1).ToString(CultureInfo.InvariantCulture);
    275               graph.AddNode(parent, qualities[parent], label, generation - 1);
     257            if (GlobalTraceMap.ContainsKey(parent)) {
     258              double quality = Evaluate((ISymbolicExpressionTree)parent);
     259              graph.AddNode(parent, quality, "", generation - 0.5);
     260              foreach (var p in GlobalTraceMap[parent])
     261                graph.AddArc(p, parent);
    276262            }
    277263            graph.AddArc(parent, child);
    278264          }
    279265        }
    280         GlobalTraceMap.Clear(); // no need to check for null here (see line 212)
    281 
    282         // if we've reached the end of the run
     266
     267        GlobalTraceMap.Clear();
     268        GlobalCloneMap.Clear();
     269
     270        #region end of the run
    283271        bool maxGenerationsReached = (Generations.Value == MaximumGenerations.Value);
    284272        bool isOsga = (SelectionPressure != null && MaximumSelectionPressure != null);
    285273        bool maxSelectionPressureReached = isOsga && (SelectionPressure.Value >= MaximumSelectionPressure.Value);
    286 
    287         #region end of the run
    288274        if (maxGenerationsReached || maxSelectionPressureReached) {
    289275          var path = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
     
    300286
    301287          // calculate impact values of nodes in the best solution, attempt to trace those with high impact to their origins
    302           //var impactValuesCalculator = new RegressionSolutionImpactValuesCalculator();
    303           //var impactValues = impactValuesCalculator.CalculateImpactValues(bestSolution, SymbolicExpressionInterpreter, SymbolicRegressionProblemData);
    304           ////var impactValues = CalculateImpactValues(bestSolution);
    305           //foreach (var pair in impactValues.Where(pair => !(pair.Key is ConstantTreeNode || pair.Key is VariableTreeNode) && pair.Value > 0.9)) {
    306           //  var node = pair.Key;
    307 
    308           //  foreach (var ancestor in genealogy.Keys) {
    309           //    graph.GetNode(ancestor).Color = ContainsSubtree(ancestor as ISymbolicExpressionTree, node) ? new Color { R = 0, G = 0, B = 150 } : new Color { R = 255, G = 255, B = 255 };
    310           //  }
    311           //}
    312           //WriteDot(path + @"\impactancestry.dot", genealogy);
     288          var calculator = new SymbolicRegressionSolutionValuesCalculator();
     289          var impactValues = calculator.CalculateImpactValues(bestSolution, SymbolicExpressionInterpreter, SymbolicRegressionProblemData, 0, 0);
     290          foreach (var pair in impactValues.Where(pair => !(pair.Key is ConstantTreeNode || pair.Key is VariableTreeNode) && pair.Value > 0.9)) {
     291            var node = pair.Key;
     292
     293            foreach (var ancestor in genealogy.Keys) {
     294              graph.GetNode(ancestor).Color = ContainsSubtree(ancestor as ISymbolicExpressionTree, node) ? new Color { R = 0, G = 0, B = 150 } : new Color { R = 255, G = 255, B = 255 };
     295            }
     296          }
     297          WriteDot(path + @"\impactancestry.dot", genealogy);
    313298
    314299          // trim the graph
     
    361346        foreach (var node in graph.Values) {
    362347          string fillColor = String.Format("#{0:x2}{1:x2}{2:x2}", node.Color.R, node.Color.G, node.Color.B);
     348          string shape = "circle";
    363349          if (node.IsElite)
    364             fillColor = String.Format("#{0:x2}{1:x2}{2:x2}", node.Color.R, node.Color.G, 150);
    365           file.WriteLine("\t\"" + node.Id + "\" [fillcolor=\"" + fillColor + "\",label=\"" + node.Label + "\"];");
     350            shape = "doublecircle";
     351          file.WriteLine("\t\"" + node.Id + "\" [shape=" + shape + ",fillcolor=\"" + fillColor + "\",label=\"" + node.Label + "\"];");
    366352          if (node.InEdges == null)
    367353            continue;
     
    371357          }
    372358        }
    373         foreach (var g in graph.Values.GroupBy(x => x.Generation)) {
     359        foreach (var g in graph.Values.GroupBy(x => x.Rank)) {
    374360          var sb = new StringBuilder();
    375361          sb.Append("\t{rank=same;");
     
    380366        }
    381367        file.WriteLine("}");
    382       }
    383     }
    384     #endregion
    385 
    386     #region Impact values (code for calculating to be moved in separate class)
    387     private Dictionary<ISymbolicExpressionTreeNode, double> CalculateImpactValues(ISymbolicExpressionTree tree) {
    388       var interpreter = SymbolicExpressionInterpreter;
    389       var problemData = (IRegressionProblemData)SymbolicDataAnalysisEvaluator.Parameters["ProblemData"].ActualValue;
    390       var dataset = problemData.Dataset;
    391       var rows = problemData.TrainingIndizes;
    392       string targetVariable = problemData.TargetVariable;
    393       var impactValues = new Dictionary<ISymbolicExpressionTreeNode, double>();
    394       var nodes = tree.Root.GetSubtree(0).GetSubtree(0).IterateNodesPostfix().ToList();
    395       var originalOutput = interpreter.GetSymbolicExpressionTreeValues(tree, dataset, rows);
    396       var targetValues = dataset.GetDoubleValues(targetVariable, rows);
    397       OnlineCalculatorError errorState;
    398       double originalR2 = OnlinePearsonsRSquaredCalculator.Calculate(targetValues, originalOutput, out errorState);
    399       if (errorState != OnlineCalculatorError.None) originalR2 = 0.0;
    400 
    401       var constantNode = ((ConstantTreeNode)new Constant().CreateTreeNode());
    402       var root = new ProgramRootSymbol().CreateTreeNode(); // root node
    403       var start = new StartSymbol().CreateTreeNode(); // start node
    404       root.AddSubtree(start);
    405       var tempTree = new SymbolicExpressionTree(root);
    406 
    407       foreach (ISymbolicExpressionTreeNode node in nodes) {
    408         var parent = node.Parent;
    409         constantNode.Value = CalculateReplacementValue(tempTree, node, tree);
    410         ISymbolicExpressionTreeNode replacementNode = constantNode;
    411         SwitchNode(parent, node, replacementNode);
    412         var newOutput = interpreter.GetSymbolicExpressionTreeValues(tree, dataset, rows);
    413         double newR2 = OnlinePearsonsRSquaredCalculator.Calculate(targetValues, newOutput, out errorState);
    414         if (errorState != OnlineCalculatorError.None) newR2 = 0.0;
    415 
    416         // impact = 0 if no change
    417         // impact < 0 if new solution is better
    418         // impact > 0 if new solution is worse
    419         impactValues[node] = originalR2 - newR2;
    420         SwitchNode(parent, replacementNode, node);
    421       }
    422       return impactValues;
    423     }
    424 
    425     private double CalculateReplacementValue(ISymbolicExpressionTree tempTree, ISymbolicExpressionTreeNode node, ISymbolicExpressionTree sourceTree) {
    426       // remove old ADFs
    427       while (tempTree.Root.SubtreeCount > 1) tempTree.Root.RemoveSubtree(1);
    428       // clone ADFs of source tree
    429       for (int i = 1; i < sourceTree.Root.SubtreeCount; i++) {
    430         tempTree.Root.AddSubtree((ISymbolicExpressionTreeNode)sourceTree.Root.GetSubtree(i).Clone());
    431       }
    432       var start = tempTree.Root.GetSubtree(0);
    433       while (start.SubtreeCount > 0) start.RemoveSubtree(0);
    434       start.AddSubtree((ISymbolicExpressionTreeNode)node.Clone());
    435       var interpreter = SymbolicExpressionInterpreter;
    436       var rows = SymbolicRegressionProblemData.TrainingIndizes;
    437       return interpreter.GetSymbolicExpressionTreeValues(tempTree, SymbolicRegressionProblemData.Dataset, rows).Median();
    438     }
    439 
    440     private static void SwitchNode(ISymbolicExpressionTreeNode root, ISymbolicExpressionTreeNode oldBranch, ISymbolicExpressionTreeNode newBranch) {
    441       for (int i = 0; i < root.SubtreeCount; i++) {
    442         if (root.GetSubtree(i) == oldBranch) {
    443           root.RemoveSubtree(i);
    444           root.InsertSubtree(i, newBranch);
    445           return;
    446         }
    447368      }
    448369    }
  • branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/GenealogyGraph.cs

    r7515 r7522  
    8484    /// <param name="l">The node label</param>
    8585    /// <param name="elite">Specifies if this node is an elite</param>
    86     public void AddNode(object t, double q = 0.0, string l = "", int g = 0, bool elite = false) {
     86    public void AddNode(object t, double q = 0.0, string l = "", double g = 0, bool elite = false) {
    8787      if (HasNode(t)) return;
    8888      var color = new Color { R = (byte)(255 - 255 * q), G = (byte)(255 * q), B = 50 };
    89       _dictionary[t] = new Node { Data = t, Quality = q, Label = l, IsElite = elite, Generation = g, Color = color };
     89      _dictionary[t] = new Node { Data = t, Quality = q, Label = l, IsElite = elite, Rank = g, Color = color };
    9090    }
    9191
     
    186186    public object Data { get; set; }
    187187    public double Quality { get; set; }
    188     public int Generation { get; set; }
     188    public double Rank { get; set; }
    189189    public Color Color { get; set; }
    190190
  • branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking/3.4/HeuristicLab.EvolutionaryTracking-3.4.csproj

    r7515 r7522  
    102102    <Compile Include="Plugin.cs" />
    103103    <Compile Include="Properties\AssemblyInfo.cs" />
    104     <Compile Include="RegressionSolutionImpactValuesCalculator.cs">
    105       <SubType>UserControl</SubType>
    106     </Compile>
    107104  </ItemGroup>
    108105  <ItemGroup>
Note: See TracChangeset for help on using the changeset viewer.