Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
03/07/22 15:45:30 (2 years ago)
Author:
pfleck
Message:

#3040 Changed SubVector symbol to include end-index in result.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Mutators/NestedOptimizerSubVectorImprovementManipulator.cs

    r18229 r18230  
    9494
    9595    #region Parameter Properties
    96     public IConstrainedValueParameter<IAlgorithm> NestedOptimizerParameter {
    97       get { return (IConstrainedValueParameter<IAlgorithm>)Parameters["NestedOptimizer"]; }
     96    public OptionalConstrainedValueParameter<IAlgorithm> NestedOptimizerParameter {
     97      get { return (OptionalConstrainedValueParameter<IAlgorithm>)Parameters["NestedOptimizer"]; }
    9898    }
    9999
     
    119119      var rs = new RandomSearchAlgorithm() {
    120120        Problem = problem,
    121         BatchSize = 10,
    122         MaximumEvaluatedSolutions = 100
     121        BatchSize = 100,
     122        MaximumEvaluatedSolutions = 1000
    123123      };
    124124
     
    126126        Problem = problem,
    127127        PlusSelection = new BoolValue(true),
    128         PopulationSize = new IntValue(1),
     128        PopulationSize = new IntValue(10),
    129129        Children = new IntValue(10),
    130130        MaximumGenerations = new IntValue(100)
     
    158158      var optimizers = new ItemSet<IAlgorithm>() { rs, es, ga, osga };
    159159
    160       Parameters.Add(new ConstrainedValueParameter<IAlgorithm>("NestedOptimizer", optimizers, rs));
     160      Parameters.Add(new OptionalConstrainedValueParameter<IAlgorithm>("NestedOptimizer", optimizers, rs));
    161161      Parameters.Add(new FixedValueParameter<PercentValue>("PercentOptimizedSubVectorNodes", new PercentValue(1.0)));
    162162    }
     
    170170    [StorableConstructor]
    171171    private NestedOptimizerSubVectorImprovementManipulator(StorableConstructorFlag _) : base(_) { }
     172    [StorableHook(HookType.AfterDeserialization)]
     173    private void AfterDeserialization() {
     174      if (Parameters.TryGetValue("NestedOptimizer", out var param)) {
     175        if (param is ConstrainedValueParameter<IAlgorithm> constrainedParam) {
     176          Parameters.Remove("NestedOptimizer");
     177          Parameters.Add(new OptionalConstrainedValueParameter<IAlgorithm>("NestedOptimizer",
     178            new ItemSet<IAlgorithm>(constrainedParam.ValidValues), constrainedParam.Value)
     179          );
     180        }
     181      }
     182    }
    172183
    173184    public override void Manipulate(IRandom random, ISymbolicExpressionTree symbolicExpressionTree) {
     185      if (NestedOptimizer == null)
     186        return;
     187     
    174188      int vectorLengths = GetVectorLengths(ProblemDataParameter.ActualValue);
    175189     
     
    183197      algorithm.Start(CancellationToken);
    184198
    185       if (algorithm.ExecutionState != ExecutionState.Stopped)
    186         throw new InvalidOperationException("Nested Algorithm did not finish.");
    187 
     199      //if (algorithm.ExecutionState != ExecutionState.Stopped)
     200      //  return;
     201
     202      if (!algorithm.Results.ContainsKey(BestSolutionParameterName))
     203        return;
     204     
     205      // use the latest best result
    188206      var solution = (IntegerVector)algorithm.Results[BestSolutionParameterName].Value;
    189207      UpdateFromVector(symbolicExpressionTree, selectedSubVectorNodes, solution, vectorLengths);
     
    204222    }
    205223
    206     private static int GetVectorLengths(T problemData) {  // ToDo evaluate a tree to get vector length per node
     224    private static int GetVectorLengths(T problemData) { // ToDo evaluate a tree to get vector length per node
    207225      var vectorLengths = problemData.Dataset.DoubleVectorVariables
    208226        .Select(v => problemData.Dataset.GetDoubleVectorValue(v, row: 0).Count)
     
    217235      foreach (var nodeIdx in selectedNodes) {
    218236        var node = nodes[nodeIdx];
    219         node.Offset = (double)solution[i++] / (vectorLength - 1);
    220         node.Length = (double)solution[i++] / (vectorLength - 1);
     237        node.Offset = (double)solution[i++] / (vectorLength - 1); // round in case of float
     238        node.Length = (double)solution[i++] / (vectorLength - 1); // round in case of float
    221239      }
    222240    }
     
    231249      return tree.Root.GetSubtree(0).GetSubtree(0);
    232250    }
    233 
    234251  }
    235252}
Note: See TracChangeset for help on using the changeset viewer.