Changeset 15060 for stable/HeuristicLab.Algorithms.DataAnalysis/3.4/MctsSymbolicRegression/ExpressionEvaluator.cs
- Timestamp:
- 06/25/17 15:59:39 (7 years ago)
- Location:
- stable
- Files:
-
- 3 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
stable
- Property svn:mergeinfo changed
/trunk/sources merged: 13645,13648,13650-13652,13654,13657-13659,13661-13662,13669,13708,14142
- Property svn:mergeinfo changed
-
stable/HeuristicLab.Algorithms.DataAnalysis
- Property svn:mergeinfo changed
/trunk/sources/HeuristicLab.Algorithms.DataAnalysis merged: 13645,13650-13652,13657-13659,13661-13662,13669,14142
- Property svn:mergeinfo changed
-
stable/HeuristicLab.Algorithms.DataAnalysis/3.4/MctsSymbolicRegression/ExpressionEvaluator.cs
r13645 r15060 2 2 /* HeuristicLab 3 3 * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL) 4 * and the BEACON Center for the Study of Evolution in Action.5 4 * 6 5 * This file is part of HeuristicLab. … … 29 28 internal class ExpressionEvaluator { 30 29 // manages it's own vector buffers 31 private readonly List<double[]> vectorBuffers = new List<double[]>(); 32 private readonly List<double[]> scalarBuffers = new List<double[]>(); // scalars are vectors of length 1 (to allow mixing scalars and vectors on the same stack) 30 private readonly double[][] vectorBuffers; 31 private readonly double[][] scalarBuffers; // scalars are vectors of length 1 (to allow mixing scalars and vectors on the same stack) 32 private int lastVecBufIdx; 33 private int lastScalarBufIdx; 33 34 34 35 35 36 private double[] GetVectorBuffer() { 36 var v = vectorBuffers[vectorBuffers.Count - 1]; 37 vectorBuffers.RemoveAt(vectorBuffers.Count - 1); 38 return v; 37 return vectorBuffers[--lastVecBufIdx]; 39 38 } 40 39 private double[] GetScalarBuffer() { 41 var v = scalarBuffers[scalarBuffers.Count - 1]; 42 scalarBuffers.RemoveAt(scalarBuffers.Count - 1); 43 return v; 40 return scalarBuffers[--lastScalarBufIdx]; 44 41 } 45 42 46 43 private void ReleaseBuffer(double[] buf) { 47 (buf.Length == 1 ? scalarBuffers : vectorBuffers).Add(buf); 44 if (buf.Length == 1) { 45 scalarBuffers[lastScalarBufIdx++] = buf; 46 } else { 47 vectorBuffers[lastVecBufIdx++] = buf; 48 } 48 49 } 49 50 … … 74 75 75 76 // preallocate buffers 77 vectorBuffers = new double[MaxStackSize * (1 + MaxParams)][]; 78 scalarBuffers = new double[MaxStackSize * (1 + MaxParams)][]; 76 79 for (int i = 0; i < MaxStackSize; i++) { 77 80 ReleaseBuffer(new double[vLen]); … … 95 98 short arg; 96 99 // checked at the end to make sure we do not leak buffers 97 int initialScalarCount = scalarBuffers.Count;98 int initialVectorCount = vectorBuffers.Count;100 int initialScalarCount = lastScalarBufIdx; 101 int initialVectorCount = lastVecBufIdx; 99 102 100 103 while (true) { … … 180 183 181 184 var f = 1.0 / (maxFx * consts[curParamIdx]); 182 // adjust c so that maxFx*c = 1 185 // adjust c so that maxFx*c = 1 TODO: this is not ideal as it enforces positive arguments to exp() 183 186 consts[curParamIdx] *= f; 184 187 … … 212 215 } 213 216 ReleaseBuffer(r); 214 Contract.Assert( vectorBuffers.Count== initialVectorCount);215 Contract.Assert( scalarBuffers.Count== initialScalarCount);217 Contract.Assert(lastVecBufIdx == initialVectorCount); 218 Contract.Assert(lastScalarBufIdx == initialScalarCount); 216 219 return; 217 220 } … … 233 236 234 237 // checked at the end to make sure we do not leak buffers 235 int initialScalarCount = scalarBuffers.Count;236 int initialVectorCount = vectorBuffers.Count;238 int initialScalarCount = lastScalarBufIdx; 239 int initialVectorCount = lastVecBufIdx; 237 240 238 241 while (true) { … … 401 404 } 402 405 403 Contract.Assert( vectorBuffers.Count== initialVectorCount);404 Contract.Assert( scalarBuffers.Count== initialScalarCount);406 Contract.Assert(lastVecBufIdx == initialVectorCount); 407 Contract.Assert(lastScalarBufIdx == initialScalarCount); 405 408 return; // break loop 406 409 } … … 509 512 s = 0; 510 513 if (op == (byte)OpCodes.LoadVar) { 511 s = (short)(( (short)code[pc] << 8) | (short)code[pc + 1]);514 s = (short)((code[pc] << 8) | code[pc + 1]); 512 515 pc += 2; 513 516 }
Note: See TracChangeset
for help on using the changeset viewer.