Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
03/11/17 20:07:13 (7 years ago)
Author:
pkimmesw
Message:

#2665 PooledPushProgram reduces memory usage and increases performance

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushProblem.cs

    r14745 r14746  
    1212  using HeuristicLab.BenchmarkSuite;
    1313  using HeuristicLab.Data;
     14  using HeuristicLab.Problems.ProgramSynthesis.Push.Data.Pool;
     15
    1416  using Instances;
    1517  using Interpreter;
     
    2628    private readonly PushConfiguration config;
    2729    private PushInterpreterPool pool;
     30    private ManagedPoolProvider<PushProgram> pushProgramPoolProvider;
    2831
    2932    public PushProblem() {
    3033      config = new PushConfiguration();
    3134      pool = new PushInterpreterPool(config);
     35
     36      pushProgramPoolProvider = new ManagedPoolProvider<PushProgram>(1024);
     37      pushProgramPoolProvider.InitDummyPartition(() => new PushProgram());
    3238
    3339      InitEvents();
     
    5662      pool = new PushInterpreterPool(config);
    5763      Instructions = config;
     64
     65      pushProgramPoolProvider = new ManagedPoolProvider<PushProgram>(1024);
     66      pushProgramPoolProvider.InitDummyPartition(() => new PushProgram());
    5867
    5968      InitEvents();
     
    404413
    405414    public override double Evaluate(Individual individual, IRandom random) {
     415      if (DataBounds[0, 1] <= 0) return default(double);
    406416
    407417      var program = individual.PushProgram(config.EnabledExpressions as IReadOnlyList<string>);
    408       var expandExpression = new PushProgram(program);
    409       var results = new List<double>();
     418      var result = 0d;
    410419
    411420      using (var interpreter = pool.GetInstance(random)) {
    412421        for (var i = DataBounds[0, 0]; i < DataBounds[0, 1]; i++) {
    413           var example = this.DataDescriptor.Examples[i];
     422          var example = DataDescriptor.Examples[i];
    414423
    415424          interpreter.BooleanStack.Push(example.InputBoolean);
     
    417426          interpreter.FloatStack.Push(example.InputFloat);
    418427
    419           interpreter.Run(expandExpression);
    420 
    421           var diff = GetDiff(example.OutputInt, interpreter.IntegerStack, this.DataDescriptor.WorstResult, LongDiffer) +
    422                      GetDiff(example.OutputFloat, interpreter.FloatStack, this.DataDescriptor.WorstResult, DoubleDiffer) +
    423                      GetDiff(example.OutputBoolean, interpreter.BooleanStack, this.DataDescriptor.WorstResult, BooleanDiffer);
    424 
    425           results.Add(diff);
     428          using (interpreter.PushProgramPool = pushProgramPoolProvider.CreatePool()) {
     429            interpreter.Run(program);
     430          }
     431
     432          result += GetDiff(example.OutputInt, interpreter.IntegerStack, DataDescriptor.WorstResult, LongDiffer)
     433                  + GetDiff(example.OutputFloat, interpreter.FloatStack, DataDescriptor.WorstResult, DoubleDiffer)
     434                  + GetDiff(example.OutputBoolean, interpreter.BooleanStack, DataDescriptor.WorstResult, BooleanDiffer);
     435
    426436          interpreter.Clear();
    427437        }
    428438      }
    429439
    430       return results.Count == 0 ? 0d : results.Average();
     440      return result / DataBounds[0, 1];
    431441    }
    432442
Note: See TracChangeset for help on using the changeset viewer.