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++; } } } }
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++; } } } }
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(); }