internal static void AddInvokeSymbol(ISymbolicExpressionTreeGrammar grammar, string functionName, int nArgs, CutPoint startCutPoint, IEnumerable<CutPoint> argumentCutPoints) {
      if (!grammar.ContainsSymbol(startCutPoint.Child.Symbol)) return;

      var invokeSym = new InvokeFunction(functionName);
      grammar.AddSymbol(invokeSym);
      grammar.SetSubtreeCount(invokeSym, nArgs, nArgs);

      //allow invoke symbol everywhere, where the child of the startCutPoint was allowed
      SetAllowedParentSymbols(grammar, startCutPoint.Child.Symbol, invokeSym);

      if (nArgs > 0) {
        //set allowed child symbols of invoke symbol 
        foreach (ISymbol child in grammar.Symbols) {
          if (child.Name == invokeSym.Name) continue;
          int i = 0;
          foreach (CutPoint argumentCutPoint in argumentCutPoints) {
            if (grammar.IsAllowedChildSymbol(argumentCutPoint.Parent.Symbol, child, argumentCutPoint.ChildIndex))
              grammar.AddAllowedChildSymbol(invokeSym, child, i);
            i++;
          }
        }
      }
    }
Example #2
0
        internal static void AddInvokeSymbol(ISymbolicExpressionTreeGrammar grammar, string functionName, int nArgs, CutPoint startCutPoint, IEnumerable <CutPoint> argumentCutPoints)
        {
            if (!grammar.ContainsSymbol(startCutPoint.Child.Symbol))
            {
                return;
            }

            var invokeSym = new InvokeFunction(functionName);

            grammar.AddSymbol(invokeSym);
            grammar.SetSubtreeCount(invokeSym, nArgs, nArgs);

            //allow invoke symbol everywhere, where the child of the startCutPoint was allowed
            SetAllowedParentSymbols(grammar, startCutPoint.Child.Symbol, invokeSym);

            if (nArgs > 0)
            {
                //set allowed child symbols of invoke symbol
                foreach (ISymbol child in grammar.Symbols)
                {
                    if (child.Name == invokeSym.Name)
                    {
                        continue;
                    }
                    int i = 0;
                    foreach (CutPoint argumentCutPoint in argumentCutPoints)
                    {
                        if (grammar.IsAllowedChildSymbol(argumentCutPoint.Parent.Symbol, child, argumentCutPoint.ChildIndex))
                        {
                            grammar.AddAllowedChildSymbol(invokeSym, child, i);
                        }
                        i++;
                    }
                }
            }
        }
Example #3
0
        private static void SelectCrossoverPoint(IRandom random, ISymbolicExpressionTree parent0, double internalNodeProbability, int maxBranchLength, int maxBranchDepth, out CutPoint crossoverPoint)
        {
            if (internalNodeProbability < 0.0 || internalNodeProbability > 1.0)
            {
                throw new ArgumentException("internalNodeProbability");
            }
            List <CutPoint> internalCrossoverPoints = new List <CutPoint>();
            List <CutPoint> leafCrossoverPoints     = new List <CutPoint>();

            parent0.Root.ForEachNodePostfix((n) => {
                if (n.SubtreeCount > 0 && n != parent0.Root)
                {
                    //avoid linq to reduce memory pressure
                    for (int i = 0; i < n.SubtreeCount; i++)
                    {
                        var child = n.GetSubtree(i);
                        if (child.GetLength() <= maxBranchLength &&
                            child.GetDepth() <= maxBranchDepth)
                        {
                            if (child.SubtreeCount > 0)
                            {
                                internalCrossoverPoints.Add(new CutPoint(n, child));
                            }
                            else
                            {
                                leafCrossoverPoints.Add(new CutPoint(n, child));
                            }
                        }
                    }

                    // add one additional extension point if the number of sub trees for the symbol is not full
                    if (n.SubtreeCount < n.Grammar.GetMaximumSubtreeCount(n.Symbol))
                    {
                        // empty extension point
                        internalCrossoverPoints.Add(new CutPoint(n, n.SubtreeCount));
                    }
                }
            }
                                            );

            if (random.NextDouble() < internalNodeProbability)
            {
                // select from internal node if possible
                if (internalCrossoverPoints.Count > 0)
                {
                    // select internal crossover point or leaf
                    crossoverPoint = internalCrossoverPoints[random.Next(internalCrossoverPoints.Count)];
                }
                else
                {
                    // otherwise select external node
                    crossoverPoint = leafCrossoverPoints[random.Next(leafCrossoverPoints.Count)];
                }
            }
            else if (leafCrossoverPoints.Count > 0)
            {
                // select from leaf crossover point if possible
                crossoverPoint = leafCrossoverPoints[random.Next(leafCrossoverPoints.Count)];
            }
            else
            {
                // otherwise select internal crossover point
                crossoverPoint = internalCrossoverPoints[random.Next(internalCrossoverPoints.Count)];
            }
        }
    private static void SelectCrossoverPoint(IRandom random, ISymbolicExpressionTree parent0, double internalNodeProbability, int maxBranchLength, int maxBranchDepth, out CutPoint crossoverPoint) {
      if (internalNodeProbability < 0.0 || internalNodeProbability > 1.0) throw new ArgumentException("internalNodeProbability");
      List<CutPoint> internalCrossoverPoints = new List<CutPoint>();
      List<CutPoint> leafCrossoverPoints = new List<CutPoint>();
      parent0.Root.ForEachNodePostfix((n) => {
        if (n.SubtreeCount > 0 && n != parent0.Root) {
          //avoid linq to reduce memory pressure
          for (int i = 0; i < n.SubtreeCount; i++) {
            var child = n.GetSubtree(i);
            if (child.GetLength() <= maxBranchLength &&
                child.GetDepth() <= maxBranchDepth) {
              if (child.SubtreeCount > 0)
                internalCrossoverPoints.Add(new CutPoint(n, child));
              else
                leafCrossoverPoints.Add(new CutPoint(n, child));
            }
          }

          // add one additional extension point if the number of sub trees for the symbol is not full
          if (n.SubtreeCount < n.Grammar.GetMaximumSubtreeCount(n.Symbol)) {
            // empty extension point
            internalCrossoverPoints.Add(new CutPoint(n, n.SubtreeCount));
          }
        }
      }
    );

      if (random.NextDouble() < internalNodeProbability) {
        // select from internal node if possible
        if (internalCrossoverPoints.Count > 0) {
          // select internal crossover point or leaf
          crossoverPoint = internalCrossoverPoints[random.Next(internalCrossoverPoints.Count)];
        } else {
          // otherwise select external node
          crossoverPoint = leafCrossoverPoints[random.Next(leafCrossoverPoints.Count)];
        }
      } else if (leafCrossoverPoints.Count > 0) {
        // select from leaf crossover point if possible
        crossoverPoint = leafCrossoverPoints[random.Next(leafCrossoverPoints.Count)];
      } else {
        // otherwise select internal crossover point
        crossoverPoint = internalCrossoverPoints[random.Next(internalCrossoverPoints.Count)];
      }
    }
    private static void SelectCrossoverPoint(IRandom random, ISymbolicExpressionTree parent0, int maxBranchLength, int maxBranchDepth, out CutPoint crossoverPoint, PercentMatrix probabilities) {
      List<CutPoint> internalCrossoverPoints = new List<CutPoint>();
      List<CutPoint> leafCrossoverPoints = new List<CutPoint>();
      parent0.Root.ForEachNodePostfix((n) => {
        if (n.SubtreeCount > 0 && n != parent0.Root) {
          //avoid linq to reduce memory pressure
          for (int i = 0; i < n.SubtreeCount; i++) {
            var child = n.GetSubtree(i);
            if (child.GetLength() <= maxBranchLength &&
                child.GetDepth() <= maxBranchDepth) {
              if (child.SubtreeCount > 0)
                internalCrossoverPoints.Add(new CutPoint(n, child));
              else
                leafCrossoverPoints.Add(new CutPoint(n, child));
            }
          }

          // add one additional extension point if the number of sub trees for the symbol is not full
          if (n.SubtreeCount < n.Grammar.GetMaximumSubtreeCount(n.Symbol)) {
            // empty extension point
            internalCrossoverPoints.Add(new CutPoint(n, n.SubtreeCount));
          }
        }
      }
    );

      List<CutPoint> allCrossoverPoints = new List<CutPoint>();
      allCrossoverPoints.AddRange(internalCrossoverPoints);
      allCrossoverPoints.AddRange(leafCrossoverPoints);
      var weights = allCrossoverPoints.Select(x => probabilities[probabilities.RowNames.ToList().IndexOf(x.Child.Symbol.Name), 0]);
      crossoverPoint = allCrossoverPoints.SampleProportional(random, 1, weights).First();
    }
        private static void SelectCrossoverPoint(IRandom random, ISymbolicExpressionTree parent0, int maxBranchLength, int maxBranchDepth, out CutPoint crossoverPoint, PercentMatrix probabilities)
        {
            List <CutPoint> internalCrossoverPoints = new List <CutPoint>();
            List <CutPoint> leafCrossoverPoints     = new List <CutPoint>();

            parent0.Root.ForEachNodePostfix((n) => {
                if (n.SubtreeCount > 0 && n != parent0.Root)
                {
                    //avoid linq to reduce memory pressure
                    for (int i = 0; i < n.SubtreeCount; i++)
                    {
                        var child = n.GetSubtree(i);
                        if (child.GetLength() <= maxBranchLength &&
                            child.GetDepth() <= maxBranchDepth)
                        {
                            if (child.SubtreeCount > 0)
                            {
                                internalCrossoverPoints.Add(new CutPoint(n, child));
                            }
                            else
                            {
                                leafCrossoverPoints.Add(new CutPoint(n, child));
                            }
                        }
                    }

                    // add one additional extension point if the number of sub trees for the symbol is not full
                    if (n.SubtreeCount < n.Grammar.GetMaximumSubtreeCount(n.Symbol))
                    {
                        // empty extension point
                        internalCrossoverPoints.Add(new CutPoint(n, n.SubtreeCount));
                    }
                }
            }
                                            );

            List <CutPoint> allCrossoverPoints = new List <CutPoint>();

            allCrossoverPoints.AddRange(internalCrossoverPoints);
            allCrossoverPoints.AddRange(leafCrossoverPoints);
            var weights = allCrossoverPoints.Select(x => probabilities[probabilities.RowNames.ToList().IndexOf(x.Child.Symbol.Name), 0]);

            crossoverPoint = allCrossoverPoints.SampleProportional(random, 1, weights).First();
        }