本文整理汇总了C#中ISymbolicExpressionTree.IterateNodesPostfix方法的典型用法代码示例。如果您正苦于以下问题:C# ISymbolicExpressionTree.IterateNodesPostfix方法的具体用法?C# ISymbolicExpressionTree.IterateNodesPostfix怎么用?C# ISymbolicExpressionTree.IterateNodesPostfix使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ISymbolicExpressionTree
的用法示例。
在下文中一共展示了ISymbolicExpressionTree.IterateNodesPostfix方法的7个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: InitTree
public static void InitTree(ISymbolicExpressionTree tree, MersenneTwister twister, List<string> varNames) {
foreach (var node in tree.IterateNodesPostfix()) {
if (node is VariableTreeNode) {
var varNode = node as VariableTreeNode;
varNode.Weight = twister.NextDouble() * 20.0 - 10.0;
varNode.VariableName = varNames[twister.Next(varNames.Count)];
} else if (node is ConstantTreeNode) {
var constantNode = node as ConstantTreeNode;
constantNode.Value = twister.NextDouble() * 20.0 - 10.0;
}
}
}
示例2: Calculate
public static double[] Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IRegressionProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling, int decimalPlaces) {
double r2 = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate(interpreter, solution, lowerEstimationLimit, upperEstimationLimit, problemData, rows, applyLinearScaling);
if (decimalPlaces >= 0)
r2 = Math.Round(r2, decimalPlaces);
return new double[2] { r2, solution.IterateNodesPostfix().OfType<VariableTreeNode>().Count() }; // count the number of variables
}
示例3: IsValid
public static void IsValid(ISymbolicExpressionTree tree) {
int reportedSize = tree.Length;
int actualSize = tree.IterateNodesPostfix().Count();
Assert.AreEqual(actualSize, reportedSize);
foreach (var defunTreeNode in tree.Root.Subtrees.OfType<DefunTreeNode>()) {
int arity = defunTreeNode.NumberOfArguments;
foreach (var argTreenode in defunTreeNode.IterateNodesPrefix().OfType<ArgumentTreeNode>()) {
Assert.IsTrue(argTreenode.SubtreeCount == 0);
Assert.IsTrue(((Argument)argTreenode.Symbol).ArgumentIndex < arity);
}
foreach (var argSymbol in Enumerable.Range(0, defunTreeNode.NumberOfArguments).Select(x => new Argument(x))) {
Assert.IsTrue(defunTreeNode.Grammar.ContainsSymbol(argSymbol));
Assert.IsTrue(defunTreeNode.Grammar.GetMaximumSubtreeCount(argSymbol) == 0);
Assert.IsTrue(defunTreeNode.Grammar.GetMinimumSubtreeCount(argSymbol) == 0);
}
var invoke = new InvokeFunction(defunTreeNode.FunctionName);
foreach (var otherRootNode in tree.Root.Subtrees) {
if (otherRootNode.Grammar.ContainsSymbol(invoke)) {
Assert.IsTrue(otherRootNode.Grammar.GetMinimumSubtreeCount(invoke) == arity);
Assert.IsTrue(otherRootNode.Grammar.GetMaximumSubtreeCount(invoke) == arity);
Assert.IsFalse(otherRootNode.Grammar.IsAllowedChildSymbol(invoke, invoke));
for (int i = 0; i < arity; i++) {
Assert.IsFalse(otherRootNode.Grammar.IsAllowedChildSymbol(invoke, invoke, i));
}
}
}
}
foreach (var subtree in tree.Root.Subtrees) {
if (tree.Root.Grammar.GetType().Name != "EmptySymbolicExpressionTreeGrammar")
Assert.AreNotSame(subtree.Grammar, tree.Root.Grammar);
IsValid(subtree.Grammar);
}
IsValid(tree.Root.Grammar);
IsValid(tree.Root);
}
示例4: IsValid
private bool IsValid(ISymbolicExpressionTree tree) {
treeChart.Tree = tree;
treeChart.Repaint();
bool valid = !tree.IterateNodesPostfix().Any(node => node.SubtreeCount < GetMinArity(node.Symbol) || node.SubtreeCount > node.Symbol.MaximumArity);
if (valid) {
btnOptimizeConstants.Enabled = true;
btnSimplify.Enabled = true;
treeStatusValue.Visible = false;
} else {
btnOptimizeConstants.Enabled = false;
btnSimplify.Enabled = false;
treeStatusValue.Visible = true;
}
this.Refresh();
return valid;
}
示例5: GenerateHeader
private void GenerateHeader(StringBuilder strBuilder, ISymbolicExpressionTree symbolicExpressionTree) {
strBuilder.AppendLine("using System;");
strBuilder.AppendLine("using System.Linq;" + Environment.NewLine);
strBuilder.AppendLine("namespace HeuristicLab.Models {");
strBuilder.AppendLine("public static class Model {");
GenerateAverageSource(strBuilder);
GenerateIfThenElseSource(strBuilder);
strBuilder.Append(Environment.NewLine + "public static double Evaluate (");
HashSet<string> varNames = new HashSet<string>();
foreach (var node in symbolicExpressionTree.IterateNodesPostfix().Where(x => x is VariableTreeNode)) {
varNames.Add(((VariableTreeNode)node).VariableName);
}
var orderedNames = varNames.OrderBy(n => n, new NaturalStringComparer()).Select(n => "double " + n);
strBuilder.Append(string.Join(", ", orderedNames));
strBuilder.AppendLine(") {");
strBuilder.Append("double result = ");
}
示例6: CreateNewArgumentForDefun
private static bool CreateNewArgumentForDefun(IRandom random, ISymbolicExpressionTree tree, DefunTreeNode defunBranch, ArgumentTreeNode newArgumentNode) {
// select a random cut point in the function defining branch
// the branch at the cut point is to be replaced by a new argument node
var cutPoints = (from node in defunBranch.IterateNodesPrefix()
where node.Subtrees.Count() > 0 &&
!node.IterateNodesPrefix().OfType<ArgumentTreeNode>().Any() &&
!node.IterateNodesPrefix().OfType<InvokeFunctionTreeNode>().Any()
from subtree in node.Subtrees
select new CutPoint(node, subtree)).ToList();
if (cutPoints.Count() == 0)
// no cut point found => abort;
return false;
var selectedCutPoint = cutPoints[random.Next(cutPoints.Count)];
// replace the branch at the cut point with an argument node
var replacedBranch = selectedCutPoint.Child;
selectedCutPoint.Parent.RemoveSubtree(selectedCutPoint.ChildIndex);
selectedCutPoint.Parent.InsertSubtree(selectedCutPoint.ChildIndex, newArgumentNode);
// find all old invocations of the selected ADF and attach a cloned version of the replaced branch (with all argument-nodes expanded)
// iterate in post-fix order to make sure that the subtrees of n are already adapted when n is processed
var invocationNodes = (from node in tree.IterateNodesPostfix().OfType<InvokeFunctionTreeNode>()
where node.Symbol.FunctionName == defunBranch.FunctionName
where node.Subtrees.Count() == defunBranch.NumberOfArguments
select node).ToList();
// do this repeatedly until no matching invocations are found
while (invocationNodes.Count > 0) {
List<ISymbolicExpressionTreeNode> newlyAddedBranches = new List<ISymbolicExpressionTreeNode>();
foreach (var invocationNode in invocationNodes) {
// check that the invocation node really has the correct number of arguments
if (invocationNode.Subtrees.Count() != defunBranch.NumberOfArguments) throw new InvalidOperationException();
// append a new argument branch after expanding all argument nodes
var clonedBranch = (ISymbolicExpressionTreeNode)replacedBranch.Clone();
clonedBranch = ReplaceArgumentsInBranch(clonedBranch, invocationNode.Subtrees);
invocationNode.InsertSubtree(newArgumentNode.Symbol.ArgumentIndex, clonedBranch);
newlyAddedBranches.Add(clonedBranch);
}
// iterate in post-fix order to make sure that the subtrees of n are already adapted when n is processed
invocationNodes = (from newlyAddedBranch in newlyAddedBranches
from node in newlyAddedBranch.IterateNodesPostfix().OfType<InvokeFunctionTreeNode>()
where node.Symbol.FunctionName == defunBranch.FunctionName
where node.Subtrees.Count() == defunBranch.NumberOfArguments
select node).ToList();
}
// increase expected number of arguments of function defining branch
// it's possible that the number of actually referenced arguments was reduced (all references were replaced by a single new argument)
// but the number of expected arguments is increased anyway
defunBranch.NumberOfArguments++;
defunBranch.Grammar.AddSymbol(newArgumentNode.Symbol);
defunBranch.Grammar.SetSubtreeCount(newArgumentNode.Symbol, 0, 0);
// allow the argument as child of any other symbol
GrammarModifier.SetAllowedParentSymbols(defunBranch.Grammar, selectedCutPoint.Child.Symbol, newArgumentNode.Symbol);
foreach (var subtree in tree.Root.Subtrees) {
// when the changed function is known in the branch then update the number of arguments
var matchingSymbol = subtree.Grammar.Symbols.OfType<InvokeFunction>().Where(s => s.FunctionName == defunBranch.FunctionName).SingleOrDefault();
if (matchingSymbol != null) {
subtree.Grammar.SetSubtreeCount(matchingSymbol, defunBranch.NumberOfArguments, defunBranch.NumberOfArguments);
foreach (var symb in subtree.Grammar.Symbols) {
if (symb is StartSymbol || symb is ProgramRootSymbol) continue;
if (symb.Name == matchingSymbol.Name) continue; //don't allow invoke as child of invoke
if (subtree.Grammar.IsAllowedChildSymbol(selectedCutPoint.Parent.Symbol, symb, selectedCutPoint.ChildIndex))
subtree.Grammar.AddAllowedChildSymbol(matchingSymbol, symb, newArgumentNode.Symbol.ArgumentIndex);
}
}
}
return true;
}
示例7: Calculate
public static double[] Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IRegressionProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling, int decimalPlaces) {
double r2 = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate(interpreter, solution, lowerEstimationLimit, upperEstimationLimit, problemData, rows, applyLinearScaling);
if (decimalPlaces >= 0)
r2 = Math.Round(r2, decimalPlaces);
return new double[2] { r2, solution.IterateNodesPostfix().Sum(n => n.GetLength()) }; // sum of the length of the whole sub-tree for each node
}