public static void PurgeUnusedConstants(int varnumber, ref List <int> code, ref ConstantsSet constantsSet) { var newConstants = new ConstantsSet(constantsSet.NormalDistribution); var newCode = new List <int>(); foreach (int instruction in code) { Symbols symbol; int qualifier; DecodeSymbol(varnumber, instruction, out symbol, out qualifier); switch (symbol) { case Symbols.IntegerLiteral: newCode.Add(Codec.EncodeSymbol(varnumber, symbol, newConstants.Integers.Include(constantsSet.Integers[qualifier]))); break; case Symbols.DoubleLiteral: newCode.Add(Codec.EncodeSymbol(varnumber, symbol, newConstants.Doubles.Include(constantsSet.Doubles[qualifier]))); break; default: newCode.Add(instruction); break; } } code = newCode; constantsSet = newConstants; }
private Program(Random rd, int depth, int varnumber, ConstantsSet constantsSet, int workingVariablesCount) { _varnumber = varnumber; _constantsSet = _constantsSet == null ? new ConstantsSet() : constantsSet; WorkingVariablesCount = workingVariablesCount; _code = new List <int>(Grow(rd, depth)); }
public Program(int varnumber, IEnumerable <int> code, ConstantsSet constantsSet, int workingVariableCount) { _varnumber = varnumber; _code = new List <int>(code); _constantsSet = constantsSet; WorkingVariablesCount = workingVariableCount; }
public Program Crossover(Random rd, Program parent) { int len = Traverse(0); int parentLen = parent.Traverse(0); int nodeToRemove = FindRelativelyShortSubTree(rd, len, out int endOfNodeToRemove); int nodeToInsert = parent.FindRelativelyShortSubTree(rd, parentLen, out int endOfNodeToInsert); var childCode = new List <int>(len + nodeToRemove - endOfNodeToRemove + endOfNodeToInsert - nodeToInsert); IList <int> integerRhs2MergedMapping; IList <int> doubleRhs2MergedMapping; ConstantsSet childConstants = Constants.Merge(parent.Constants, out integerRhs2MergedMapping, out doubleRhs2MergedMapping); childCode.AddRange(Code.GetRange(0, nodeToRemove)); int varnumber = Math.Max(_varnumber, parent._varnumber); int workingVarialbesCount = Math.Max(WorkingVariablesCount, parent.WorkingVariablesCount); for (int i = nodeToInsert; i < endOfNodeToInsert; ++i) { childCode.Add(RecodeSymbol(varnumber, parent.Code[i], integerRhs2MergedMapping, doubleRhs2MergedMapping)); } childCode.AddRange(Code.GetRange(endOfNodeToRemove, len - endOfNodeToRemove)); if (rd.NextDouble() <= 0.5) { PurgeUnusedConstants(varnumber, ref childCode, ref childConstants); } if (rd.NextDouble() <= 0.5) { CompactWorkingVariables(varnumber, childCode, ref workingVarialbesCount); } return(new Program(varnumber, childCode, childConstants, workingVarialbesCount)); }
private Program(int varnumber, List <int> code, ConstantsSet constantsSet, int workingVariablesCount) { _varnumber = varnumber; _code = code; _constantsSet = constantsSet; WorkingVariablesCount = workingVariablesCount; //For testing: Traverse(0); }
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)); }
private Parser(IEnumerable <Token> tokens) { _tokenEnumerator = new Lookahead <Token>(tokens); _constantsSet = new ConstantsSet(); }