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)

Location:
trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3
Files:
1 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPCoordinatesPathEvaluator.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 TSP solution given in path representation which should be evaluated."));
    5555      Parameters.Add(new LookupParameter<DoubleMatrix>("Coordinates", "The x- and y-Coordinates of the cities."));
    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 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
     
    6174      if (UseDistanceMatrixParameter.ActualValue.Value) {
    6275        Permutation p = PermutationParameter.ActualValue;
    63         DoubleMatrix dm = DistanceMatrixParameter.ActualValue;
     76        DistanceMatrix dm = DistanceMatrixParameter.ActualValue;
    6477
    6578        if (dm == null) {  // calculate distance matrix
    6679          DoubleMatrix c = CoordinatesParameter.ActualValue;
    6780
    68           dm = new DoubleMatrix(c.Rows, c.Rows);
     81          dm = new DistanceMatrix(c.Rows, c.Rows);
    6982          for (int i = 0; i < dm.Rows; i++) {
    7083            for (int j = 0; j < dm.Columns; j++)
    7184              dm[i, j] = CalculateDistance(c[i, 0], c[i, 1], c[j, 0], c[j, 1]);
    7285          }
    73           DistanceMatrixParameter.ActualValue = (DoubleMatrix)dm.AsReadOnly();
     86          DistanceMatrixParameter.ActualValue = (DistanceMatrix)dm.AsReadOnly();
    7487        }
    7588
  • trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/HeuristicLab.Problems.TravelingSalesman-3.3.csproj

    r4703 r4825  
    109109    <Compile Include="Analyzers\TSPPopulationDiversityAnalyzer.cs" />
    110110    <Compile Include="Analyzers\TSPAlleleFrequencyAnalyzer.cs" />
     111    <Compile Include="DistanceMatrix.cs" />
    111112    <Compile Include="Evaluators\TSPEuclideanPathEvaluator.cs" />
    112113    <Compile Include="Evaluators\TSPGeoPathEvaluator.cs" />
  • trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/Interfaces/ITSPCoordinatesPathEvaluator.cs

    r4068 r4825  
    2929  public interface ITSPCoordinatesPathEvaluator : ITSPPathEvaluator {
    3030    ILookupParameter<DoubleMatrix> CoordinatesParameter { get; }
    31     ILookupParameter<DoubleMatrix> DistanceMatrixParameter { get; }
     31    ILookupParameter<DistanceMatrix> DistanceMatrixParameter { get; }
    3232    ILookupParameter<BoolValue> UseDistanceMatrixParameter { get; }
    3333  }
  • trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/Interfaces/ITSPPathMoveEvaluator.cs

    r4068 r4825  
    2727  public interface ITSPPathMoveEvaluator : ITSPMoveEvaluator, IPermutationMoveOperator {
    2828    ILookupParameter<DoubleMatrix> CoordinatesParameter { get; }
    29     ILookupParameter<DoubleMatrix> DistanceMatrixParameter { get; }
     29    ILookupParameter<DistanceMatrix> DistanceMatrixParameter { get; }
    3030    ILookupParameter<BoolValue> UseDistanceMatrixParameter { get; }
    3131  }
  • 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  }
  • trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/ThreeOpt/TSPTranslocationMovePathEvaluator.cs

    r4722 r4825  
    8282    }
    8383
    84     protected override double EvaluateByDistanceMatrix(Permutation permutation, DoubleMatrix distanceMatrix) {
     84    protected override double EvaluateByDistanceMatrix(Permutation permutation, DistanceMatrix distanceMatrix) {
    8585      TranslocationMove move = TranslocationMoveParameter.ActualValue;
    8686      int edge1source = permutation.GetCircular(move.Index1 - 1);
  • trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/TwoOpt/TSPInversionMovePathEvaluator.cs

    r4722 r4825  
    6767    }
    6868
    69     protected override double EvaluateByDistanceMatrix(Permutation permutation, DoubleMatrix distanceMatrix) {
     69    protected override double EvaluateByDistanceMatrix(Permutation permutation, DistanceMatrix distanceMatrix) {
    7070      InversionMove move = InversionMoveParameter.ActualValue;
    7171      int edge1source = permutation.GetCircular(move.Index1 - 1);
  • trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs

    r4722 r4825  
    5555      get { return (ValueParameter<DoubleMatrix>)Parameters["Coordinates"]; }
    5656    }
    57     public OptionalValueParameter<DoubleMatrix> DistanceMatrixParameter {
    58       get { return (OptionalValueParameter<DoubleMatrix>)Parameters["DistanceMatrix"]; }
     57    public OptionalValueParameter<DistanceMatrix> DistanceMatrixParameter {
     58      get { return (OptionalValueParameter<DistanceMatrix>)Parameters["DistanceMatrix"]; }
    5959    }
    6060    public ValueParameter<BoolValue> UseDistanceMatrixParameter {
     
    8989      set { CoordinatesParameter.Value = value; }
    9090    }
    91     public DoubleMatrix DistanceMatrix {
     91    public DistanceMatrix DistanceMatrix {
    9292      get { return DistanceMatrixParameter.Value; }
    9393      set { DistanceMatrixParameter.Value = value; }
     
    144144      : base(original, cloner) {
    145145      this.operators = original.operators.Select(x => (IOperator)cloner.Clone(x)).ToList();
    146       this.DistanceMatrixParameter.Value = original.DistanceMatrixParameter.Value;
    147146      AttachEventHandlers();
    148147    }
     
    157156      Parameters.Add(new ValueParameter<BoolValue>("Maximization", "Set to false as the Traveling Salesman Problem is a minimization problem.", new BoolValue(false)));
    158157      Parameters.Add(new ValueParameter<DoubleMatrix>("Coordinates", "The x- and y-Coordinates of the cities."));
    159       Parameters.Add(new OptionalValueParameter<DoubleMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities."));
     158      Parameters.Add(new OptionalValueParameter<DistanceMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities."));
    160159      Parameters.Add(new ValueParameter<BoolValue>("UseDistanceMatrix", "True if a distance matrix should be calculated and used for evaluation, otherwise false.", new BoolValue(true)));
    161160      Parameters.Add(new ValueParameter<IPermutationCreator>("SolutionCreator", "The operator which should be used to create new TSP solutions.", creator));
     
    163162      Parameters.Add(new OptionalValueParameter<DoubleValue>("BestKnownQuality", "The quality of the best known solution of this TSP instance."));
    164163      Parameters.Add(new OptionalValueParameter<Permutation>("BestKnownSolution", "The best known solution of this TSP instance."));
     164
     165      DistanceMatrixParameter.ReactOnValueToStringChangedAndValueItemImageChanged = false;
    165166
    166167      Coordinates = new DoubleMatrix(new double[,] {
     
    258259      // BackwardsCompatibility3.3
    259260      #region Backwards compatible code (remove with 3.4)
     261      OptionalValueParameter<DoubleMatrix> oldDistanceMatrixParameter = Parameters["DistanceMatrix"] as OptionalValueParameter<DoubleMatrix>;
     262      if (oldDistanceMatrixParameter != null) {
     263        Parameters.Remove(oldDistanceMatrixParameter);
     264        Parameters.Add(new OptionalValueParameter<DistanceMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities."));
     265        DistanceMatrixParameter.GetsCollected = oldDistanceMatrixParameter.GetsCollected;
     266        DistanceMatrixParameter.ReactOnValueToStringChangedAndValueItemImageChanged = false;
     267        if (oldDistanceMatrixParameter.Value != null) {
     268          DoubleMatrix oldDM = oldDistanceMatrixParameter.Value;
     269          DistanceMatrix newDM = new DistanceMatrix(oldDM.Rows, oldDM.Columns, oldDM.ColumnNames, oldDM.RowNames);
     270          newDM.SortableView = oldDM.SortableView;
     271          for (int i = 0; i < newDM.Rows; i++)
     272            for (int j = 0; j < newDM.Columns; j++)
     273              newDM[i, j] = oldDM[i, j];
     274          DistanceMatrixParameter.Value = (DistanceMatrix)newDM.AsReadOnly();
     275        }
     276      }
     277
    260278      if (operators == null) InitializeOperators();
    261279      #endregion
Note: See TracChangeset for help on using the changeset viewer.