예제 #1
0
        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);
        }
예제 #2
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);
        }
예제 #3
0
        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));
        }