Opened 3 months ago

Last modified 17 hours 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.16
Component: Encodings.SymbolicExpressionTreeEncoding Version: 3.3.15
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 3 months ago.
Syntax expression tree multi-encoding sample
Genetic Algorithm (GA) - Syntax Expression Tree MultiEncoding sample - update.hl (104.7 KB) - added by rhanghof 3 months ago.
Syntax expression tree multi-encoding sample

Download all attachments as: .zip

Change History (7)

comment:1 Changed 3 months ago by rhanghof

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

comment:2 Changed 3 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 3 months ago by mkommend (previous) (diff)

Changed 3 months ago by rhanghof

Syntax expression tree multi-encoding sample

comment:3 Changed 3 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 3 months ago by mkommend

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

Changed 3 months ago by rhanghof

Syntax expression tree multi-encoding sample

comment:5 Changed 17 hours 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>();  }
  }
}

Note: See TracTickets for help on using tickets.