Opened 19 months ago

Last modified 14 months ago

#2997 assigned defect

When using multi encoding in combination with several symbolic expression trees, only the grammar of the first used symbolic expression tree is used to generate syntax trees.

Reported by: rhanghof Owned by: rhanghof
Priority: medium Milestone: HeuristicLab 3.3.17
Component: Encodings.SymbolicExpressionTreeEncoding Version:
Keywords: Cc:

Description (last modified by rhanghof)

When using multi encoding in combination with several symbolic expression trees, only the grammar of the first used symbolic expression tree is used to generate syntax trees. The grammar for creating the syntax trees is stored in the Global Scope and cloned from the grammar of the first syntax tree in the encoding when first used. The setting of the cloned grammar in the global scope can be found in the method InstrumentedApply of the class SymbolicExpressionTreeCreator.
Due to the query if (ClonedSymbolicExpressionTreeGrammarParameter.ActualValue == null) it is only set the very first time. Thus it is not possible to set the grammar for another symbolic expression tree.

Attachments (2)

Genetic Algorithm (GA) - Syntax Expression Tree MultiEncoding sample.hl (153.7 KB) - added by rhanghof 18 months ago.
Syntax expression tree multi-encoding sample
Genetic Algorithm (GA) - Syntax Expression Tree MultiEncoding sample - update.hl (104.7 KB) - added by rhanghof 18 months ago.
Syntax expression tree multi-encoding sample

Download all attachments as: .zip

Change History (9)

comment:1 Changed 19 months ago by rhanghof

  • Component changed from Problems.DataAnalysis.Symbolic to Encodings.SymbolicExpressionTreeEncoding
  • Description modified (diff)

comment:2 Changed 19 months ago by mkommend

Please attach a minimal sample (multi-encoding with two symbolic expression tree encodings and vastly different grammars) that reproduces the issue for debugging purposes.

Last edited 19 months ago by mkommend (previous) (diff)

Changed 18 months ago by rhanghof

Syntax expression tree multi-encoding sample

comment:3 Changed 18 months ago by mkommend

Unfortunately the provided example cannot be loaded with a standard version of HL, because it uses a proprietary plugin HeuristicLab.Problems.Matlab.ModelLearning or HeuristicLab.Problems.Matlab.ModelLearning.Optimization and maybe even others.

comment:4 Changed 18 months ago by mkommend

  • Owner set to rhanghof
  • Status changed from new to assigned

Changed 18 months ago by rhanghof

Syntax expression tree multi-encoding sample

comment:5 Changed 15 months ago by gkronber

Here is another small example where I have just spotted the same bug. Trees for t2 also contain terminals x,y,z instead of a,b,c.

namespace HeuristicLab.Problems.Programmable {
  public class CompiledSingleObjectiveProblemDefinition : CompiledProblemDefinition, ISingleObjectiveProblemDefinition {
    public bool Maximization { get { return false; } }

    public override void Initialize() {
      var g1 = new SimpleSymbolicExpressionGrammar();
      var g2 = new SimpleSymbolicExpressionGrammar();
      g1.AddSymbols(new string[] {"max", "add"}, 2, 2);
      g1.AddTerminalSymbols(new string[] {"x", "y", "z"});
      g2.AddSymbols(new string[] {"max", "add"}, 2, 2);
      g2.AddTerminalSymbols(new string[] {"a", "b", "c"});
     
      Encoding = new MultiEncoding()
        .Add(new SymbolicExpressionTreeEncoding("t1", g1, 50, 12))
        .Add(new SymbolicExpressionTreeEncoding("t2", g2, 50, 12))
      ;
    }

    public double Evaluate(Individual individual, IRandom random) {
      var trees = individual.Values.Select(v => v.Value).OfType<ISymbolicExpressionTree>().ToArray();
      
      var numAs = 0;
      var numXs = 0;
      foreach(var n in trees[0].Root.IterateNodesPrefix()) {
        if(n.Symbol.Name == "x") numXs++;
        else if(n.Symbol.Name == "a") numAs++;
      }
      foreach(var n in trees[1].Root.IterateNodesPrefix()) {
        if(n.Symbol.Name == "x") numXs++;
        else if(n.Symbol.Name == "a") numAs++;
      }
      
      return numAs + numXs;
    }

    public void Analyze(Individual[] individuals, double[] qualities, ResultCollection results, IRandom random) { }
    
    public IEnumerable<Individual> GetNeighbors(Individual individual, IRandom random) {  return Enumerable.Empty<Individual>();  }
  }
}

comment:6 Changed 15 months ago by abeham

  • Version 3.3.15 deleted

comment:7 Changed 14 months ago by gkronber

  • Milestone changed from HeuristicLab 3.3.16 to HeuristicLab 3.3.17
Note: See TracTickets for help on using tickets.