Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
10/08/21 16:28:53 (3 years ago)
Author:
dpiringe
Message:

#3136

  • modified InfixExpressionParser to fully support SubFunctionSymbol
    • created a SubFunctionTreeNode to store the function arguments
  • modified StructureTemplateView to regenerate the content state
  • first implementation for the main tree build up logic
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/StructuredSymbolicRegressionSingleObjectiveProblem.cs

    r18063 r18065  
    2424    private const string GrammarParameterName = "Grammar";
    2525    private const string StructureTemplateParameterName = "Structure Template";
    26 
     26    private const string MainTreeResultParameterName = "Main Tree";
    2727    #endregion
    2828
     
    3131    public IFixedValueParameter<StringValue> StructureDefinitionParameter => (IFixedValueParameter<StringValue>)Parameters[StructureDefinitionParameterName];
    3232    public IFixedValueParameter<StructureTemplate> StructureTemplateParameter => (IFixedValueParameter<StructureTemplate>)Parameters[StructureTemplateParameterName];
    33     public IValueParameter<ISymbolicDataAnalysisGrammar> GrammarParameter => (IValueParameter<ISymbolicDataAnalysisGrammar>)Parameters[GrammarParameterName]; // könnte auch weg?
     33    public IValueParameter<ISymbolicDataAnalysisGrammar> GrammarParameter => (IValueParameter<ISymbolicDataAnalysisGrammar>)Parameters[GrammarParameterName];
     34    public IResultParameter<ISymbolicExpressionTree> MainTreeResultParameter => (IResultParameter<ISymbolicExpressionTree>)Parameters[MainTreeResultParameterName];
    3435    #endregion
    3536
     
    7677      varSym.Enabled = true;
    7778
     79      var structureTemplate = new StructureTemplate();
     80      structureTemplate.Changed += (sender, args) => {
     81        foreach (var e in Encoding.Encodings.ToArray())
     82          Encoding.Remove(e);
     83
     84        foreach(var sf in structureTemplate.SubFunctions.Values) {
     85          Encoding.Add(new SymbolicExpressionTreeEncoding(sf.Name, sf.Grammar, sf.MaximumSymbolicExpressionTreeLength, sf.MaximumSymbolicExpressionTreeDepth));
     86        }
     87      };
     88
    7889      Parameters.Add(new ValueParameter<RegressionProblemData>(ProblemDataParameterName, problemData));
    79       Parameters.Add(new FixedValueParameter<StringValue>(StructureDefinitionParameterName, new StringValue("e^f(x)/F(y)")));
    80       Parameters.Add(new FixedValueParameter<StructureTemplate>(StructureTemplateParameterName, new StructureTemplate()));
     90      Parameters.Add(new FixedValueParameter<StructureTemplate>(StructureTemplateParameterName, structureTemplate));
    8191      Parameters.Add(new ValueParameter<ISymbolicDataAnalysisGrammar>(GrammarParameterName, grammar));
    82       var parser = new InfixExpressionParser();
    83       var tree = parser.Parse(StructureDefinition);
    84      
    85       GetSubFunctions(tree);
     92      Parameters.Add(new ResultParameter<ISymbolicExpressionTree>(MainTreeResultParameterName, ""));
     93      MainTreeResultParameter.DefaultValue = new SymbolicExpressionTree();
    8694    }
    8795
     
    9098    [StorableConstructor]
    9199    protected StructuredSymbolicRegressionSingleObjectiveProblem(StorableConstructorFlag _) : base(_) { }
     100    #endregion
    92101
     102    #region Cloning
    93103    public override IDeepCloneable Clone(Cloner cloner) =>
    94104      new StructuredSymbolicRegressionSingleObjectiveProblem(this, cloner);
    95105    #endregion
    96106
    97     public void GetSubFunctions(ISymbolicExpressionTree tree) {
    98       int count = 1;
    99       foreach(var node in tree.IterateNodesPrefix())
    100         if(node.Symbol is SubFunctionSymbol)
    101           Encoding.Add(new SymbolicExpressionTreeEncoding($"f{count++}", Grammar/*new LinearScalingGrammar()*/, 25, 8));
    102     }
     107    public override double Evaluate(Individual individual, IRandom random) {
     108      var templateTree = (ISymbolicExpressionTree)StructureTemplate.Tree.Clone();
     109      var subFunctionDict = StructureTemplate.SubFunctions;
     110         
     111      // build main tree
     112      foreach (var n in templateTree.IterateNodesPrefix()) {
     113        if(n is SubFunctionTreeNode subFunctionTreeNode) {
     114          if(subFunctionDict.TryGetValue(subFunctionTreeNode, out SubFunction subFunction)) {
     115            var subFunctionTree = individual.SymbolicExpressionTree(subFunction.Name);
     116            var parent = n.Parent;
     117            // remove all subtrees
    103118
    104     public override double Evaluate(Individual individual, IRandom random) {
    105       Console.WriteLine(StructureTemplate.Template);
     119            var subtreeCount = parent.SubtreeCount;
     120            for (int idx = 0; idx < subtreeCount; ++idx)
     121              parent.RemoveSubtree(idx);
     122
     123            // add new tree
     124            parent.AddSubtree(subFunctionTree.Root);
     125          }
     126        }
     127      }
     128
     129      MainTreeResultParameter.ActualValue = templateTree;
     130      /*
    106131      foreach (var kvp in individual.Values) {
    107132        if(kvp.Value is SymbolicExpressionTree tree) {
     
    111136            }
    112137          }
    113           Console.WriteLine(tree);
    114138        }
    115139      }
     140      */
    116141      return 0.0;
    117142    }
Note: See TracChangeset for help on using the changeset viewer.