Beispiel #1
0
        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;
        }
Beispiel #2
0
 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));
 }
Beispiel #3
0
 public Program(int varnumber, IEnumerable <int> code, ConstantsSet constantsSet, int workingVariableCount)
 {
     _varnumber            = varnumber;
     _code                 = new List <int>(code);
     _constantsSet         = constantsSet;
     WorkingVariablesCount = workingVariableCount;
 }
Beispiel #4
0
        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));
        }
Beispiel #5
0
 private Program(int varnumber, List <int> code, ConstantsSet constantsSet, int workingVariablesCount)
 {
     _varnumber            = varnumber;
     _code                 = code;
     _constantsSet         = constantsSet;
     WorkingVariablesCount = workingVariablesCount;
     //For testing:
     Traverse(0);
 }
Beispiel #6
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);
        }
Beispiel #7
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));
        }
Beispiel #8
0
 private Parser(IEnumerable <Token> tokens)
 {
     _tokenEnumerator = new Lookahead <Token>(tokens);
     _constantsSet    = new ConstantsSet();
 }