Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
06/01/17 09:28:34 (7 years ago)
Author:
pkimmesw
Message:

#2665 Fixed Benchmark Problem Definition, Converted LoopExpressions to stateless expressions, Added several unit test to ensure funcionality, Fixed UI bugs

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Simplifier/Simplifier.cs

    r14952 r15017  
    11namespace HeuristicLab.Problems.ProgramSynthesis.Push.Simplifier {
    22  using System;
    3   using System.Collections.Generic;
    43
    54  using Expressions;
    65
     6  using HeuristicLab.Common;
    77  using HeuristicLab.Problems.ProgramSynthesis.Push.Configuration;
    88  using HeuristicLab.Problems.ProgramSynthesis.Push.Data.Tree;
    9   using HeuristicLab.Problems.ProgramSynthesis.Push.Interpreter;
    109
    1110  public static class Simplifier {
    1211    private static readonly TreeNode<Expression> NoopNode =
    13       new TreeNode<Expression>(ExpressionTable.GetStatelessExpression<CodeNoopExpression>());
     12      new TreeNode<Expression>(ExpressionTable.GetStatelessExpression<ExecNoopExpression>());
    1413
    15     public static PushProgram Simplify(PushProgram program, IReadOnlyPushConfiguration config, Func<PushProgram, double> evaluator) {
     14    public static PushProgram Simplify(PushProgram program, IReadOnlyPushConfiguration config, Func<PushProgram, double> evaluator, bool improveIfPossible = false) {
    1615      var bestResult = evaluator(program);
    17       //var noopFreeProgram = RemoveNoops(program, config);
    1816      var tree = program.ToTree();
    19       var optimizedTree = RemoveUnnecessaryExpressions(tree, tree, ref bestResult, evaluator);
     17      var optimizedTree = RemoveUnnecessaryExpressions(tree, tree, ref bestResult, evaluator, improveIfPossible);
     18      var tmp = RemoveUnnecessaryExpressions(optimizedTree, optimizedTree, ref bestResult, evaluator, improveIfPossible);
    2019
    21       var optimizedPrgram = optimizedTree.ToPushProgram(e => !ReferenceEquals(e, NoopNode.Value));
    22       return optimizedPrgram; // RemoveNoops(optimizedPrgram, config);
     20      while (tmp.Count < optimizedTree.Count) {
     21        optimizedTree = tmp;
     22      }
     23
     24      var optimizedProgram = optimizedTree.ToPushProgramWithoutNoopExpressions();
     25      optimizedProgram = SimplifySubPrograms(optimizedProgram);
     26
     27      return optimizedProgram;
    2328    }
    2429
    25     // not working so far, an expression can only be a noop if it is a noop for all examples of a problem
    26     private static PushProgram RemoveNoops(PushProgram pushProgram, IReadOnlyPushConfiguration config) {
    27       var expressions = new List<Expression>();
    28       var interpreter = new PushInterpreter(config);
     30    public static PushProgram SimplifySubPrograms(PushProgram program) {
     31      var tree = program.ToTree();
     32      var optimizedTree = SimplifySubPrograms(tree);
     33      var optimizedPrgram = optimizedTree.ToPushProgram();
    2934
    30       interpreter.Run(pushProgram, true);
     35      return optimizedPrgram;
     36    }
    3137
    32       while (interpreter.CanStep) {
    33         var isNoop = interpreter.ExecStack.Top.IsNoop(interpreter);
    34         if (!isNoop)
    35           expressions.Add(interpreter.ExecStack.Top);
     38    private static TreeNode<Expression> SimplifySubPrograms(TreeNode<Expression> program) {
     39      while (program.Children.Count == 1)
     40        program = program.Children[0];
    3641
    37         interpreter.Step();
     42      for (var i = 0; i < program.Children.Count; i++) {
     43        var child = program.Children[i];
     44        program.ReplaceNode(i, SimplifySubPrograms(child));
    3845      }
    3946
    40       return new PushProgram(expressions);
     47      return program;
    4148    }
    4249
    43     private static TreeNode<Expression> RemoveUnnecessaryExpressions(Tree<Expression> program, TreeNode<Expression> node, ref double bestResult, Func<PushProgram, double> evaluator) {
     50    private static TreeNode<Expression> RemoveUnnecessaryExpressions(TreeNode<Expression> program, TreeNode<Expression> node, ref double bestResult, Func<PushProgram, double> evaluator, bool improveIfPossible = false) {
    4451      for (var i = 0; i < node.Children.Count; i++) {
    4552        var child = node.Children[i];
     
    4956        var currentResult = evaluator(currentProgram);
    5057
    51         if (currentResult <= bestResult) {
     58        if ((improveIfPossible && currentResult <= bestResult) ||
     59            (!improveIfPossible && currentResult.IsAlmost(bestResult))) {
    5260          bestResult = currentResult;
    5361        } else if (child.Value.IsProgram) {
Note: See TracChangeset for help on using the changeset viewer.