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;
                }
            }
        }
Example #3
0
        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);
        }