Changeset 15017 for branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Simplifier/Simplifier.cs
- Timestamp:
- 06/01/17 09:28:34 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Simplifier/Simplifier.cs
r14952 r15017 1 1 namespace HeuristicLab.Problems.ProgramSynthesis.Push.Simplifier { 2 2 using System; 3 using System.Collections.Generic;4 3 5 4 using Expressions; 6 5 6 using HeuristicLab.Common; 7 7 using HeuristicLab.Problems.ProgramSynthesis.Push.Configuration; 8 8 using HeuristicLab.Problems.ProgramSynthesis.Push.Data.Tree; 9 using HeuristicLab.Problems.ProgramSynthesis.Push.Interpreter;10 9 11 10 public static class Simplifier { 12 11 private static readonly TreeNode<Expression> NoopNode = 13 new TreeNode<Expression>(ExpressionTable.GetStatelessExpression< CodeNoopExpression>());12 new TreeNode<Expression>(ExpressionTable.GetStatelessExpression<ExecNoopExpression>()); 14 13 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) { 16 15 var bestResult = evaluator(program); 17 //var noopFreeProgram = RemoveNoops(program, config);18 16 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); 20 19 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; 23 28 } 24 29 25 // not working so far, an expression can only be a noop if it is a noop for all examples of a problem26 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(); 29 34 30 interpreter.Run(pushProgram, true); 35 return optimizedPrgram; 36 } 31 37 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]; 36 41 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)); 38 45 } 39 46 40 return new PushProgram(expressions);47 return program; 41 48 } 42 49 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) { 44 51 for (var i = 0; i < node.Children.Count; i++) { 45 52 var child = node.Children[i]; … … 49 56 var currentResult = evaluator(currentProgram); 50 57 51 if (currentResult <= bestResult) { 58 if ((improveIfPossible && currentResult <= bestResult) || 59 (!improveIfPossible && currentResult.IsAlmost(bestResult))) { 52 60 bestResult = currentResult; 53 61 } else if (child.Value.IsProgram) {
Note: See TracChangeset
for help on using the changeset viewer.