public int Traverse(int pc) { bool was0 = pc == 0; int maximumDepth; Skip(ref pc, out maximumDepth); if (was0) { if (pc != Code.Count) { var stringBuilder = new StringBuilder(); int newPc = 0; new CallTree(this, ref newPc); Print(stringBuilder); if (Code.Count > pc) { var missingCallTree = new CallTree(this, ref newPc); var missingProgram = new Program(Varnumber, new List <int>(missingCallTree.Encode()), _constantsSet, WorkingVariablesCount); missingProgram.Print(stringBuilder); } Console.Out.Write(stringBuilder); throw new Exception("Traverse(0) renders wrong length"); } } return(pc); }
private Program SimplifyNode(int ix) { var callTree = new CallTree(_varnumber, _code, ref ix); var constantsSet = new ConstantsSet(_constantsSet); CallTree simplifiedCallTree = callTree.Simplify(constantsSet); if (simplifiedCallTree != null) { return(new Program(_varnumber, new List <int>(simplifiedCallTree.Encode()), constantsSet, WorkingVariablesCount)); } return(null); }
public Program Simplify(FitnessEvaluation fitnessEvaluation, StringBuilder stringBuilder) { int pc = 0; var callTree = new CallTree(_varnumber, _code, ref pc); var constantsSet = new ConstantsSet(_constantsSet); CallTree simplifiedCallTree; if (fitnessEvaluation != null) { Print(stringBuilder); } do { callTree.Reset(); simplifiedCallTree = callTree.Simplify(constantsSet, fitnessEvaluation != null ? stringBuilder : null); if (fitnessEvaluation != null && simplifiedCallTree != null) { stringBuilder.AppendLine("After removing redundant code:"); var simplifiedprogram = new Program(_varnumber, new List <int>(simplifiedCallTree.Encode()), constantsSet, WorkingVariablesCount); simplifiedprogram.Print(stringBuilder); if (AnalyzeTestCasedifferences(fitnessEvaluation, simplifiedprogram, stringBuilder)) { break; } } CallTree tmpCallTree = (simplifiedCallTree ?? callTree).PurgeUnassignedVariables(constantsSet, new List <int>(), stringBuilder); if (tmpCallTree != null) { simplifiedCallTree = tmpCallTree; if (fitnessEvaluation != null) { stringBuilder.AppendLine("After removing unassigned variables:"); var simplifiedprogram = new Program(_varnumber, new List <int>(simplifiedCallTree.Encode()), constantsSet, WorkingVariablesCount); simplifiedprogram.Print(stringBuilder); if (AnalyzeTestCasedifferences(fitnessEvaluation, simplifiedprogram, stringBuilder)) { break; } } } tmpCallTree = (simplifiedCallTree ?? callTree).PurgeUnusedAssignmentsToVariables(constantsSet, new List <int>(), stringBuilder); if (tmpCallTree != null) { simplifiedCallTree = tmpCallTree; if (fitnessEvaluation != null) { stringBuilder.AppendLine("After removing assignments to variables not used again:"); var simplifiedprogram = new Program(_varnumber, new List <int>(simplifiedCallTree.Encode()), constantsSet, WorkingVariablesCount); simplifiedprogram.Print(stringBuilder); if (AnalyzeTestCasedifferences(fitnessEvaluation, simplifiedprogram, stringBuilder)) { break; } } } tmpCallTree = (simplifiedCallTree ?? callTree).PurgeRedundantUsagesOfAssignedVariables(constantsSet, new Dictionary <int, CallTree>()); if (tmpCallTree != null) { simplifiedCallTree = tmpCallTree; if (fitnessEvaluation != null) { stringBuilder.AppendLine("After removing redundant usages of assigned variables:"); var simplifiedprogram = new Program(_varnumber, new List <int>(simplifiedCallTree.Encode()), constantsSet, WorkingVariablesCount); simplifiedprogram.Print(stringBuilder); if (AnalyzeTestCasedifferences(fitnessEvaluation, simplifiedprogram, stringBuilder)) { break; } } } if (simplifiedCallTree != null && simplifiedCallTree.Equals(callTree)) { stringBuilder.AppendLine("Simplified call tree is equal to original call tree, giving up"); new Program(_varnumber, new List <int>(callTree.Encode()), constantsSet, WorkingVariablesCount).Print(stringBuilder); //break; } callTree = simplifiedCallTree ?? callTree; } while (simplifiedCallTree != null); return(new Program(_varnumber, new List <int>(callTree.Encode()), constantsSet, WorkingVariablesCount)); }