private static string FormatScript(ISymbolicExpressionTree symbolicExpressionTree, ICFGPythonProblemData problemData, int loopBreakConst, IEnumerable <string> variables, string variableSettings) { Regex r = new Regex(@"^(.*?)\s*=", RegexOptions.Multiline); string variableSettingsSubstitute = r.Replace(variableSettings, "${1}_setting ="); return(String.Format(EVAL_TRACE_SCRIPT, problemData.HelperCode.Value, String.Format("'{0}'", String.Join("','", variables)), variableSettingsSubstitute, String.Join(",", variables), String.Join(",", variables.Select(x => x + "_setting")), PythonHelper.FormatToProgram(symbolicExpressionTree, loopBreakConst, " "))); }
protected override void Manipulate(IRandom random, ISymbolicExpressionTree symbolicExpressionTree) { MutationExceptionsParameter.ActualValue = new ItemCollection <StringValue>(); var pythonSemanticHelper = new PythonProcessSemanticHelper(ProblemData.Variables.GetVariableNames(), 1000); // hardcoded value!!! // TODO: object created for every mutation var input = PythonHelper.ConvertToPythonValues(ProblemData.Input, ProblemData.TrainingIndices); var output = PythonHelper.ConvertToPythonValues(ProblemData.Output, ProblemData.TrainingIndices); var beforeResults = pythonSemanticHelper.EvaluateAndTraceProgram(PythonProcessParameter.ActualValue, PythonHelper.FormatToProgram(symbolicExpressionTree, ProblemData.LoopBreakConst, ProblemData.FullHeader, ProblemData.FullFooter), input, output, ProblemData.TrainingIndices, ProblemData.FullHeader, ProblemData.FullFooter, symbolicExpressionTree, Timeout); ReplaceBranch(random, symbolicExpressionTree, ProblemData, Semantics, PythonProcess, Timeout, MaximumSymbolicExpressionTreeLength.Value, MaximumSymbolicExpressionTreeDepth.Value, MaxCompares.Value); var afterResults = pythonSemanticHelper.EvaluateAndTraceProgram(PythonProcessParameter.ActualValue, PythonHelper.FormatToProgram(symbolicExpressionTree, ProblemData.LoopBreakConst, ProblemData.FullHeader, ProblemData.FullFooter), input, output, ProblemData.TrainingIndices, ProblemData.FullHeader, ProblemData.FullFooter, symbolicExpressionTree, Timeout); if (SemanticallyEquivalentMutationParameter.ActualValue.Value == NoMutation) { AddStatisticsNoMutation(); } else { AddStatistics(beforeResults, afterResults); } }
protected void AddStatistics(ItemArray <PythonStatementSemantic> semantic0, ISymbolicExpressionTree child) { if (NumberOfPossibleBranchesSelectedParameter.ActualValue == null) { NumberOfPossibleBranchesSelected = 0; } if (NumberOfAllowedBranchesParameter.ActualValue == null) { NumberOfAllowedBranches = 0; } if (NumberOfNoChangeDetectedParameter.ActualValue == null) { NumberOfNoChangeDetected = 0; } if (NumberOfCrossoverTriesParameter.ActualValue == null) { NumberOfCrossoverTries = 0; } if (TypeSelectedForSimilarityParameter.ActualValue == null) { TypeSelectedForSimilarityParameter.ActualValue = new StringValue("Random crossover"); } var parentQualities = QualityParameter.ActualValue; double parent0Quality = parentQualities[0].Value; double parent1Quality = parentQualities[1].Value; var pythonSemanticHelper = new PythonProcessSemanticHelper(ProblemData.Variables.GetVariableNames(), 1000); // hardcoded value!!! // TODO: object created for every crossover var childResults = pythonSemanticHelper.EvaluateAndTraceProgram(PythonProcessParameter.ActualValue, PythonHelper.FormatToProgram(child, ProblemData.LoopBreakConst, ProblemData.FullHeader, ProblemData.FullFooter), PythonHelper.ConvertToPythonValues(ProblemData.Input, ProblemData.TrainingIndices), PythonHelper.ConvertToPythonValues(ProblemData.Output, ProblemData.TrainingIndices), ProblemData.TrainingIndices, ProblemData.FullHeader, ProblemData.FullFooter, child, Timeout); var childQuality = childResults.Item3; SemanticLocalityParameter.ActualValue = new DoubleValue(Math.Abs(parent0Quality - childQuality)); ConstructiveEffectParameter.ActualValue = new IntValue(childQuality < parent0Quality ? childQuality < parent1Quality ? 2 : 1 : 0); if (!String.IsNullOrEmpty(childResults.Item4)) { SemanticallyDifferentFromRootedParentParameter.ActualValue = new BoolValue(true); return; // no semantics is available, but the child is different because it failed, which is different from its parent } // first semantic statement is <predefined> which contains all code and therefore all changes to res* var parent0Semantic = semantic0.First(); var childSemantic = childResults.Item5.First(); // check all results var resKeys = parent0Semantic.After.Keys.Where(x => x.StartsWith("res")); SemanticallyDifferentFromRootedParentParameter.ActualValue = new BoolValue(false); foreach (var resKey in resKeys) { var parent0Res = parent0Semantic.After.Keys.Contains(resKey) ? parent0Semantic.After[resKey] : parent0Semantic.Before[resKey]; var child0Res = childSemantic.After.Keys.Contains(resKey) ? childSemantic.After[resKey] : childSemantic.Before[resKey]; var enumParent = parent0Res.GetEnumerator(); var enumChild = child0Res.GetEnumerator(); var type = ProblemData.Variables.GetTypesOfVariables().First(x => x.Value.Contains(resKey)).Key; if (type.IsListType()) { // always move forward both enumerators (do not use short-circuit evaluation!) while (enumParent.MoveNext() & enumChild.MoveNext()) { if (!JToken.EqualityComparer.Equals((JArray)enumParent.Current, (JArray)enumChild.Current)) { SemanticallyDifferentFromRootedParentParameter.ActualValue.Value = true; break; } } if (enumParent.MoveNext() || enumChild.MoveNext()) { SemanticallyDifferentFromRootedParentParameter.ActualValue.Value = true; } } else { // always move forward both enumerators (do not use short-circuit evaluation!) while (enumParent.MoveNext() & enumChild.MoveNext()) { if (!enumParent.Current.Equals(enumChild.Current)) { SemanticallyDifferentFromRootedParentParameter.ActualValue.Value = true; break; } } if (enumParent.MoveNext() || enumChild.MoveNext()) { SemanticallyDifferentFromRootedParentParameter.ActualValue.Value = true; } } // break if a change has already been found if (SemanticallyDifferentFromRootedParentParameter.ActualValue.Value) { break; } } }
public void SemanticsTest() { BenchmarkSuiteInstanceProvider prov = new BenchmarkSuiteListInstanceProvider(); var prob = new CFGPythonProblem(); prob.Load(prov.LoadData(prov.GetDataDescriptors().First(x => x.Name == "Smallest"))); var grammar = prob.Grammar; var root = (SymbolicExpressionTreeTopLevelNode)grammar.ProgramRootSymbol.CreateTreeNode(); root.SetGrammar(grammar.CreateExpressionTreeGrammar()); //var root = new SymbolicExpressionTreeNode(new ProgramRootSymbol()); var start = new SymbolicExpressionTreeNode(new StartSymbol()); root.AddSubtree(start); var gstart = new SymbolicExpressionTreeNode(grammar.StartSymbol); start.AddSubtree(gstart); var predefined = new SymbolicExpressionTreeNode(GetSymbol(grammar, "'i0 = int(); i1 = int(); i2 = int()'\r\n'b0 = bool(); b1 = bool(); b2 = bool()'\r\n'res0 = int()'\r\n<code>")); gstart.AddSubtree(predefined); var codestatementSym = GetSymbol(grammar, "<code><statement>'\\n'"); var code0 = new SymbolicExpressionTreeNode(codestatementSym); var code1 = new SymbolicExpressionTreeNode(codestatementSym); var code2 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "<statement>'\\n'")); //predefined.AddSubtree(code1); predefined.AddSubtree(code0); code0.AddSubtree(code1); code1.AddSubtree(code2); var assign0 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "<assign>")); var assign1 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "<assign>")); code2.AddSubtree(assign0); //code0.AddSubtree(assign1); var if0 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "<if>")); code1.AddSubtree(if0); var bool_assign0 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "<bool_var>' = '<bool>")); var int_assign1 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "<int_var>' = '<int>")); assign0.AddSubtree(bool_assign0); assign1.AddSubtree(int_assign1); var bool_var0 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "<bool_var>")); var int_var1 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "<int_var>")); var b0 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "'b0'")); var i1 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "'res0'")); bool_assign0.AddSubtree(bool_var0); int_assign1.AddSubtree(int_var1); bool_var0.AddSubtree(b0); int_var1.AddSubtree(i1); var bool_const0 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "<bool_const>")); var int_const1 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "'int('<number>'.0)'")); //var num0 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "<num>")); var num1 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "<num>")); var boolconstTrue = new SymbolicExpressionTreeNode(GetSymbol(grammar, "'True'")); var intconst2 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "'2'")); bool_assign0.AddSubtree(bool_const0); int_assign1.AddSubtree(int_const1); bool_const0.AddSubtree(boolconstTrue); int_const1.AddSubtree(num1); num1.AddSubtree(intconst2); var ifthenelse0 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "'if '<bool>':{:\\n'<code>':}else:{:\\n'<code>':}'")); var b0_2 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "'b0'")); if0.AddSubtree(ifthenelse0); ifthenelse0.AddSubtree(b0_2); var statement1 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "<statement>'\\n'")); var assign2 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "<assign>")); var int_assign2 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "<int_var>' = '<int>")); var i1_2 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "'res0'")); var intconst7 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "'7'")); ifthenelse0.AddSubtree(statement1); statement1.AddSubtree(assign2); assign2.AddSubtree(int_assign2); int_assign2.AddSubtree(i1_2); int_assign2.AddSubtree(intconst7); var statement2 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "<statement>'\\n'")); var assign3 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "<assign>")); var int_assign3 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "<int_var>' = '<int>")); var i1_3 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "'res0'")); var intconst8 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "'9'")); ifthenelse0.AddSubtree(statement2); statement2.AddSubtree(assign3); assign3.AddSubtree(int_assign3); int_assign3.AddSubtree(i1_3); int_assign3.AddSubtree(intconst8); var while0 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "'loopBreak% = 0\\nwhile '<bool>':{:\\n'<code>'\\nif loopBreak% > loopBreakConst or stop.value:{:\\nbreak\\n:}loopBreak% += 1\\n:}'")); var b0_3 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "'b0'")); var code4 = new SymbolicExpressionTreeNode(codestatementSym); var statement3 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "<statement>'\\n'")); var bool_assign1 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "<bool_var>' = '<bool>")); var bool_var1 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "<bool_var>")); var b0_4 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "'b0'")); var bool_const1 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "<bool_const>")); var boolconstFalse = new SymbolicExpressionTreeNode(GetSymbol(grammar, "'False'")); bool_assign1.AddSubtree(bool_var1); bool_var1.AddSubtree(b0_4); bool_assign1.AddSubtree(bool_const1); bool_const1.AddSubtree(boolconstFalse); statement3.AddSubtree(bool_assign1); //var statement4 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "<statement>'\\n'")); var assign4 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "<assign>")); var int_assign4 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "<int_var>' = '<int>")); var i1_4 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "'res0'")); var intconst9 = new SymbolicExpressionTreeNode(GetSymbol(grammar, "'1'")); //statement4.AddSubtree(assign4); assign4.AddSubtree(int_assign4); int_assign4.AddSubtree(i1_4); int_assign4.AddSubtree(intconst9); code4.AddSubtree(statement3); code4.AddSubtree(assign4); ((List <string>)((CFGProduction)while0.Symbol).parts)[0] = "x = 5\n" + ((List <string>)((CFGProduction)while0.Symbol).parts)[0]; while0.AddSubtree(b0_3); while0.AddSubtree(code4); code0.AddSubtree(while0); var tree = new SymbolicExpressionTree(root); var code = CFGSymbolicExpressionTreeStringFormatter.StaticFormat(tree); System.Console.WriteLine(code); //PythonProcessSemanticHelper ppsh = new PythonProcessSemanticHelper(prob.ProblemData.Variables.GetVariableNames(), 10); traceCodeWithVariables = String.Format(traceCode, String.Join("', '", prob.ProblemData.Variables.GetVariableNames().Where(x => !String.IsNullOrWhiteSpace(x))), 10); var bla = PythonHelper.FormatToProgram(tree, prob.ProblemData.LoopBreakConst, prob.ProblemData.FullHeader, prob.ProblemData.FullFooter); // var blub = ppsh.EvaluateAndTraceProgram(prob.PythonProcess, var blub = EvaluateAndTraceProgram(prob.PythonProcess, bla, PythonHelper.ConvertToPythonValues(prob.ProblemData.Input, prob.ProblemData.TrainingIndices), PythonHelper.ConvertToPythonValues(prob.ProblemData.Output, prob.ProblemData.TrainingIndices), prob.ProblemData.TrainingIndices, prob.ProblemData.FullHeader, prob.ProblemData.FullFooter, tree); Console.WriteLine(blub); }