예제 #1
0
        private GeneticAlgorithm CreateCFGGPSample()
        {
            GeneticAlgorithm ga = new GeneticAlgorithm();

            #region Problem Configuration
            CFGPythonProblem cfgPythonProblem = new CFGPythonProblem();
            cfgPythonProblem.Name        = "Smallest Problem";
            cfgPythonProblem.Description = "Smallest (described in: http://dl.acm.org/citation.cfm?id=2754769)";
            var     provider = new BenchmarkSuiteListInstanceProvider();
            var     instance = provider.GetDataDescriptors().Single(x => x.Name.Equals("Smallest"));
            CFGData data     = (CFGData)provider.LoadData(instance);
            data.Input  = File.ReadAllLines(@"Data\Smallest-Input.txt");
            data.Output = File.ReadAllLines(@"Data\Smallest-Output.txt");
            cfgPythonProblem.Load(data);

            // configure remaining problem parameters
            cfgPythonProblem.MaximumSymbolicExpressionTreeLengthParameter.Value.Value = 250;
            cfgPythonProblem.MaximumSymbolicExpressionTreeDepthParameter.Value.Value  = 100;
            #endregion
            #region Algorithm Configuration
            ga.Problem     = cfgPythonProblem;
            ga.Name        = "Genetic Programming - CFG Python";
            ga.Description = "A standard genetic programming algorithm to solve a cfg python problem";
            SamplesUtils.ConfigureGeneticAlgorithmParameters <LexicaseSelector, SubtreeCrossover, MultiSymbolicExpressionTreeManipulator>(
                ga, 100, 1, 10, 0.05, 5);
            var mutator = (MultiSymbolicExpressionTreeManipulator)ga.Mutator;
            mutator.Operators.SetItemCheckedState(mutator.Operators
                                                  .OfType <FullTreeShaker>()
                                                  .Single(), false);
            mutator.Operators.SetItemCheckedState(mutator.Operators
                                                  .OfType <OnePointShaker>()
                                                  .Single(), false);
            #endregion
            return(ga);
        }
예제 #2
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);
        }