Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/17/10 07:41:28 (13 years ago)
Author:
swagner
Message:

Fixed memory leak when using parameters whose values are not deeply cloned (#1268)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/TSPPathMoveEvaluator.cs

    r4722 r4825  
    4040      get { return (ILookupParameter<DoubleMatrix>)Parameters["Coordinates"]; }
    4141    }
    42     public ILookupParameter<DoubleMatrix> DistanceMatrixParameter {
    43       get { return (ILookupParameter<DoubleMatrix>)Parameters["DistanceMatrix"]; }
     42    public ILookupParameter<DistanceMatrix> DistanceMatrixParameter {
     43      get { return (ILookupParameter<DistanceMatrix>)Parameters["DistanceMatrix"]; }
    4444    }
    4545    public ILookupParameter<BoolValue> UseDistanceMatrixParameter {
     
    5454      Parameters.Add(new LookupParameter<Permutation>("Permutation", "The solution as permutation."));
    5555      Parameters.Add(new LookupParameter<DoubleMatrix>("Coordinates", "The city's coordinates."));
    56       Parameters.Add(new LookupParameter<DoubleMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities."));
     56      Parameters.Add(new LookupParameter<DistanceMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities."));
    5757      Parameters.Add(new LookupParameter<BoolValue>("UseDistanceMatrix", "True if a distance matrix should be calculated (if it does not exist already) and used for evaluation, otherwise false."));
     58    }
     59
     60    [StorableHook(HookType.AfterDeserialization)]
     61    private void AfterDeserialization() {
     62      // BackwardsCompatibility3.3
     63      #region Backwards compatible code (remove with 3.4)
     64      LookupParameter<DoubleMatrix> oldDistanceMatrixParameter = Parameters["DistanceMatrix"] as LookupParameter<DoubleMatrix>;
     65      if (oldDistanceMatrixParameter != null) {
     66        Parameters.Remove(oldDistanceMatrixParameter);
     67        Parameters.Add(new LookupParameter<DistanceMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities."));
     68        DistanceMatrixParameter.ActualName = oldDistanceMatrixParameter.ActualName;
     69      }
     70      #endregion
    5871    }
    5972
     
    6376      double relativeQualityDifference = 0;
    6477      if (UseDistanceMatrixParameter.ActualValue.Value) {
    65         DoubleMatrix distanceMatrix = DistanceMatrixParameter.ActualValue;
     78        DistanceMatrix distanceMatrix = DistanceMatrixParameter.ActualValue;
    6679        if (distanceMatrix == null) {
    6780          distanceMatrix = CalculateDistanceMatrix(coordinates);
     
    7790
    7891    protected abstract double CalculateDistance(double x1, double y1, double x2, double y2);
    79     protected abstract double EvaluateByDistanceMatrix(Permutation permutation, DoubleMatrix distanceMatrix);
     92    protected abstract double EvaluateByDistanceMatrix(Permutation permutation, DistanceMatrix distanceMatrix);
    8093    protected abstract double EvaluateByCoordinates(Permutation permutation, DoubleMatrix coordinates);
    8194
    82     private DoubleMatrix CalculateDistanceMatrix(DoubleMatrix c) {
    83       DoubleMatrix distanceMatrix = new DoubleMatrix(c.Rows, c.Rows);
     95    private DistanceMatrix CalculateDistanceMatrix(DoubleMatrix c) {
     96      DistanceMatrix distanceMatrix = new DistanceMatrix(c.Rows, c.Rows);
    8497      for (int i = 0; i < distanceMatrix.Rows; i++) {
    8598        for (int j = 0; j < distanceMatrix.Columns; j++)
    8699          distanceMatrix[i, j] = CalculateDistance(c[i, 0], c[i, 1], c[j, 0], c[j, 1]);
    87100      }
    88       return distanceMatrix;
     101      return (DistanceMatrix)distanceMatrix.AsReadOnly();
    89102    }
    90103  }
Note: See TracChangeset for help on using the changeset viewer.