Changeset 15973 for branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour
- Timestamp:
- 06/28/18 11:13:37 (6 years ago)
- Location:
- branches/2522_RefactorPluginInfrastructure
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2522_RefactorPluginInfrastructure
- Property svn:ignore
-
old new 24 24 protoc.exe 25 25 obj 26 .vs
-
- Property svn:mergeinfo changed
- Property svn:ignore
-
branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.DataAnalysis
- Property svn:mergeinfo changed
-
branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.DataAnalysis/3.4
-
Property
svn:mergeinfo
set to
(toggle deleted branches)
/stable/HeuristicLab.Algorithms.DataAnalysis/3.4 merged eligible /trunk/HeuristicLab.Algorithms.DataAnalysis/3.4 merged eligible /branches/1721-RandomForestPersistence/HeuristicLab.Algorithms.DataAnalysis/3.4 10321-10322 /branches/Async/HeuristicLab.Algorithms.DataAnalysis/3.4 13329-15286 /branches/Benchmarking/sources/HeuristicLab.Algorithms.DataAnalysis/3.4 6917-7005 /branches/ClassificationModelComparison/HeuristicLab.Algorithms.DataAnalysis/3.4 9070-13099 /branches/CloningRefactoring/HeuristicLab.Algorithms.DataAnalysis/3.4 4656-4721 /branches/DataAnalysis Refactoring/HeuristicLab.Algorithms.DataAnalysis/3.4 5471-5808 /branches/DataAnalysis SolutionEnsembles/HeuristicLab.Algorithms.DataAnalysis/3.4 5815-6180 /branches/DataAnalysis/HeuristicLab.Algorithms.DataAnalysis/3.4 4458-4459,4462,4464 /branches/DataPreprocessing/HeuristicLab.Algorithms.DataAnalysis/3.4 10085-11101 /branches/GP.Grammar.Editor/HeuristicLab.Algorithms.DataAnalysis/3.4 6284-6795 /branches/GP.Symbols (TimeLag, Diff, Integral)/HeuristicLab.Algorithms.DataAnalysis/3.4 5060 /branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Algorithms.DataAnalysis/3.4 11570-12508 /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Algorithms.DataAnalysis/3.4 11130-12721 /branches/HeuristicLab.RegressionSolutionGradientView/HeuristicLab.Algorithms.DataAnalysis/3.4 13819-14091 /branches/HeuristicLab.TimeSeries/HeuristicLab.Algorithms.DataAnalysis/3.4 8116-8789 /branches/LogResidualEvaluator/HeuristicLab.Algorithms.DataAnalysis/3.4 10202-10483 /branches/NET40/sources/HeuristicLab.Algorithms.DataAnalysis/3.4 5138-5162 /branches/ParallelEngine/HeuristicLab.Algorithms.DataAnalysis/3.4 5175-5192 /branches/ProblemInstancesRegressionAndClassification/HeuristicLab.Algorithms.DataAnalysis/3.4 7773-7810 /branches/QAPAlgorithms/HeuristicLab.Algorithms.DataAnalysis/3.4 6350-6627 /branches/Restructure trunk solution/HeuristicLab.Algorithms.DataAnalysis/3.4 6828 /branches/SpectralKernelForGaussianProcesses/HeuristicLab.Algorithms.DataAnalysis/3.4 10204-10479 /branches/SuccessProgressAnalysis/HeuristicLab.Algorithms.DataAnalysis/3.4 5370-5682 /branches/Trunk/HeuristicLab.Algorithms.DataAnalysis/3.4 6829-6865 /branches/VNS/HeuristicLab.Algorithms.DataAnalysis/3.4 5594-5752 /branches/Weighted TSNE/3.4 15451-15531 /branches/histogram/HeuristicLab.Algorithms.DataAnalysis/3.4 5959-6341 /branches/symbreg-factors-2650/HeuristicLab.Algorithms.DataAnalysis/3.4 14232-14825 /trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4 13402-15674
-
Property
svn:mergeinfo
set to
(toggle deleted branches)
-
branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour/NearestNeighbourClassification.cs
r13238 r15973 1 1 #region License Information 2 2 /* HeuristicLab 3 * Copyright (C) 2002-201 5Heuristic and Evolutionary Algorithms Laboratory (HEAL)3 * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL) 4 4 * 5 5 * This file is part of HeuristicLab. … … 22 22 using System; 23 23 using System.Linq; 24 using System.Threading; 24 25 using HeuristicLab.Common; 25 26 using HeuristicLab.Core; … … 40 41 private const string KParameterName = "K"; 41 42 private const string NearestNeighbourClassificationModelResultName = "Nearest neighbour classification solution"; 43 private const string WeightsParameterName = "Weights"; 44 42 45 43 46 #region parameter properties 44 47 public IFixedValueParameter<IntValue> KParameter { 45 48 get { return (IFixedValueParameter<IntValue>)Parameters[KParameterName]; } 49 } 50 public IValueParameter<DoubleArray> WeightsParameter { 51 get { return (IValueParameter<DoubleArray>)Parameters[WeightsParameterName]; } 46 52 } 47 53 #endregion … … 53 59 else KParameter.Value.Value = value; 54 60 } 61 } 62 public DoubleArray Weights { 63 get { return WeightsParameter.Value; } 64 set { WeightsParameter.Value = value; } 55 65 } 56 66 #endregion … … 64 74 : base() { 65 75 Parameters.Add(new FixedValueParameter<IntValue>(KParameterName, "The number of nearest neighbours to consider for regression.", new IntValue(3))); 76 Parameters.Add(new OptionalValueParameter<DoubleArray>(WeightsParameterName, "Optional: use weights to specify individual scaling values for all features. If not set the weights are calculated automatically (each feature is scaled to unit variance)")); 66 77 Problem = new ClassificationProblem(); 67 78 } 68 79 [StorableHook(HookType.AfterDeserialization)] 69 private void AfterDeserialization() { } 80 private void AfterDeserialization() { 81 // BackwardsCompatibility3.3 82 #region Backwards compatible code, remove with 3.4 83 if (!Parameters.ContainsKey(WeightsParameterName)) { 84 Parameters.Add(new OptionalValueParameter<DoubleArray>(WeightsParameterName, "Optional: use weights to specify individual scaling values for all features. If not set the weights are calculated automatically (each feature is scaled to unit variance)")); 85 } 86 #endregion 87 } 70 88 71 89 public override IDeepCloneable Clone(Cloner cloner) { … … 74 92 75 93 #region nearest neighbour 76 protected override void Run() { 77 var solution = CreateNearestNeighbourClassificationSolution(Problem.ProblemData, K); 94 protected override void Run(CancellationToken cancellationToken) { 95 double[] weights = null; 96 if (Weights != null) weights = Weights.CloneAsArray(); 97 var solution = CreateNearestNeighbourClassificationSolution(Problem.ProblemData, K, weights); 78 98 Results.Add(new Result(NearestNeighbourClassificationModelResultName, "The nearest neighbour classification solution.", solution)); 79 99 } 80 100 81 public static IClassificationSolution CreateNearestNeighbourClassificationSolution(IClassificationProblemData problemData, int k ) {101 public static IClassificationSolution CreateNearestNeighbourClassificationSolution(IClassificationProblemData problemData, int k, double[] weights = null) { 82 102 var problemDataClone = (IClassificationProblemData)problemData.Clone(); 83 return new NearestNeighbourClassificationSolution( problemDataClone, Train(problemDataClone, k));103 return new NearestNeighbourClassificationSolution(Train(problemDataClone, k, weights), problemDataClone); 84 104 } 85 105 86 public static INearestNeighbourModel Train(IClassificationProblemData problemData, int k ) {106 public static INearestNeighbourModel Train(IClassificationProblemData problemData, int k, double[] weights = null) { 87 107 return new NearestNeighbourModel(problemData.Dataset, 88 108 problemData.TrainingIndices, … … 90 110 problemData.TargetVariable, 91 111 problemData.AllowedInputVariables, 112 weights, 92 113 problemData.ClassValues.ToArray()); 93 114 } -
branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour/NearestNeighbourClassificationSolution.cs
r12012 r15973 1 1 #region License Information 2 2 /* HeuristicLab 3 * Copyright (C) 2002-201 5Heuristic and Evolutionary Algorithms Laboratory (HEAL)3 * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL) 4 4 * 5 5 * This file is part of HeuristicLab. … … 43 43 : base(original, cloner) { 44 44 } 45 public NearestNeighbourClassificationSolution(I ClassificationProblemData problemData, INearestNeighbourModel nnModel)45 public NearestNeighbourClassificationSolution(INearestNeighbourModel nnModel, IClassificationProblemData problemData) 46 46 : base(nnModel, problemData) { 47 47 } -
branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour/NearestNeighbourModel.cs
r12509 r15973 1 1 #region License Information 2 2 /* HeuristicLab 3 * Copyright (C) 2002-201 5Heuristic and Evolutionary Algorithms Laboratory (HEAL)3 * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL) 4 4 * 5 5 * This file is part of HeuristicLab. … … 34 34 [StorableClass] 35 35 [Item("NearestNeighbourModel", "Represents a nearest neighbour model for regression and classification.")] 36 public sealed class NearestNeighbourModel : NamedItem, INearestNeighbourModel { 37 36 public sealed class NearestNeighbourModel : ClassificationModel, INearestNeighbourModel { 37 38 private readonly object kdTreeLockObject = new object(); 38 39 private alglib.nearestneighbor.kdtree kdTree; 39 40 public alglib.nearestneighbor.kdtree KDTree { … … 48 49 } 49 50 50 [Storable] 51 private string targetVariable; 51 52 public override IEnumerable<string> VariablesUsedForPrediction { 53 get { return allowedInputVariables; } 54 } 55 52 56 [Storable] 53 57 private string[] allowedInputVariables; … … 56 60 [Storable] 57 61 private int k; 62 [Storable(DefaultValue = null)] 63 private double[] weights; // not set for old versions loaded from disk 64 [Storable(DefaultValue = null)] 65 private double[] offsets; // not set for old versions loaded from disk 58 66 59 67 [StorableConstructor] … … 91 99 92 100 k = original.k; 93 targetVariable = original.targetVariable; 101 isCompatibilityLoaded = original.IsCompatibilityLoaded; 102 if (!IsCompatibilityLoaded) { 103 weights = new double[original.weights.Length]; 104 Array.Copy(original.weights, weights, weights.Length); 105 offsets = new double[original.offsets.Length]; 106 Array.Copy(original.offsets, this.offsets, this.offsets.Length); 107 } 94 108 allowedInputVariables = (string[])original.allowedInputVariables.Clone(); 95 109 if (original.classValues != null) 96 110 this.classValues = (double[])original.classValues.Clone(); 97 111 } 98 public NearestNeighbourModel(IDataset dataset, IEnumerable<int> rows, int k, string targetVariable, IEnumerable<string> allowedInputVariables, double[] classValues = null) { 112 public NearestNeighbourModel(IDataset dataset, IEnumerable<int> rows, int k, string targetVariable, IEnumerable<string> allowedInputVariables, IEnumerable<double> weights = null, double[] classValues = null) 113 : base(targetVariable) { 99 114 Name = ItemName; 100 115 Description = ItemDescription; 101 116 this.k = k; 102 this.targetVariable = targetVariable;103 117 this.allowedInputVariables = allowedInputVariables.ToArray(); 104 105 var inputMatrix = AlglibUtil.PrepareInputMatrix(dataset, 106 allowedInputVariables.Concat(new string[] { targetVariable }), 107 rows); 108 109 if (inputMatrix.Cast<double>().Any(x => double.IsNaN(x) || double.IsInfinity(x))) 118 double[,] inputMatrix; 119 if (IsCompatibilityLoaded) { 120 // no scaling 121 inputMatrix = dataset.ToArray( 122 this.allowedInputVariables.Concat(new string[] { targetVariable }), 123 rows); 124 } else { 125 this.offsets = this.allowedInputVariables 126 .Select(name => dataset.GetDoubleValues(name, rows).Average() * -1) 127 .Concat(new double[] { 0 }) // no offset for target variable 128 .ToArray(); 129 if (weights == null) { 130 // automatic determination of weights (all features should have variance = 1) 131 this.weights = this.allowedInputVariables 132 .Select(name => 1.0 / dataset.GetDoubleValues(name, rows).StandardDeviationPop()) 133 .Concat(new double[] { 1.0 }) // no scaling for target variable 134 .ToArray(); 135 } else { 136 // user specified weights (+ 1 for target) 137 this.weights = weights.Concat(new double[] { 1.0 }).ToArray(); 138 if (this.weights.Length - 1 != this.allowedInputVariables.Length) 139 throw new ArgumentException("The number of elements in the weight vector must match the number of input variables"); 140 } 141 inputMatrix = CreateScaledData(dataset, this.allowedInputVariables.Concat(new string[] { targetVariable }), rows, this.offsets, this.weights); 142 } 143 144 if (inputMatrix.ContainsNanOrInfinity()) 110 145 throw new NotSupportedException( 111 "Nearest neighbour classificationdoes not support NaN or infinity values in the input dataset.");146 "Nearest neighbour model does not support NaN or infinity values in the input dataset."); 112 147 113 148 this.kdTree = new alglib.nearestneighbor.kdtree(); … … 131 166 } 132 167 168 private static double[,] CreateScaledData(IDataset dataset, IEnumerable<string> variables, IEnumerable<int> rows, double[] offsets, double[] factors) { 169 var transforms = 170 variables.Select( 171 (_, colIdx) => 172 new LinearTransformation(variables) { Addend = offsets[colIdx] * factors[colIdx], Multiplier = factors[colIdx] }); 173 return dataset.ToArray(variables, transforms, rows); 174 } 175 133 176 public override IDeepCloneable Clone(Cloner cloner) { 134 177 return new NearestNeighbourModel(this, cloner); … … 136 179 137 180 public IEnumerable<double> GetEstimatedValues(IDataset dataset, IEnumerable<int> rows) { 138 double[,] inputData = AlglibUtil.PrepareInputMatrix(dataset, allowedInputVariables, rows); 181 double[,] inputData; 182 if (IsCompatibilityLoaded) { 183 inputData = dataset.ToArray(allowedInputVariables, rows); 184 } else { 185 inputData = CreateScaledData(dataset, allowedInputVariables, rows, offsets, weights); 186 } 139 187 140 188 int n = inputData.GetLength(0); 141 189 int columns = inputData.GetLength(1); 142 190 double[] x = new double[columns]; 143 double[] y = new double[1];144 191 double[] dists = new double[k]; 145 192 double[,] neighbours = new double[k, columns + 1]; … … 149 196 x[column] = inputData[row, column]; 150 197 } 151 int actNeighbours = alglib.nearestneighbor.kdtreequeryknn(kdTree, x, k, false); 152 alglib.nearestneighbor.kdtreequeryresultsdistances(kdTree, ref dists); 153 alglib.nearestneighbor.kdtreequeryresultsxy(kdTree, ref neighbours); 198 int numNeighbours; 199 lock (kdTreeLockObject) { // gkronber: the following calls change the kdTree data structure 200 numNeighbours = alglib.nearestneighbor.kdtreequeryknn(kdTree, x, k, false); 201 alglib.nearestneighbor.kdtreequeryresultsdistances(kdTree, ref dists); 202 alglib.nearestneighbor.kdtreequeryresultsxy(kdTree, ref neighbours); 203 } 154 204 155 205 double distanceWeightedValue = 0.0; 156 206 double distsSum = 0.0; 157 for (int i = 0; i < actNeighbours; i++) {207 for (int i = 0; i < numNeighbours; i++) { 158 208 distanceWeightedValue += neighbours[i, columns] / dists[i]; 159 209 distsSum += 1.0 / dists[i]; … … 163 213 } 164 214 165 public IEnumerable<double> GetEstimatedClassValues(IDataset dataset, IEnumerable<int> rows) {215 public override IEnumerable<double> GetEstimatedClassValues(IDataset dataset, IEnumerable<int> rows) { 166 216 if (classValues == null) throw new InvalidOperationException("No class values are defined."); 167 double[,] inputData = AlglibUtil.PrepareInputMatrix(dataset, allowedInputVariables, rows); 168 217 double[,] inputData; 218 if (IsCompatibilityLoaded) { 219 inputData = dataset.ToArray(allowedInputVariables, rows); 220 } else { 221 inputData = CreateScaledData(dataset, allowedInputVariables, rows, offsets, weights); 222 } 169 223 int n = inputData.GetLength(0); 170 224 int columns = inputData.GetLength(1); … … 178 232 x[column] = inputData[row, column]; 179 233 } 180 int actNeighbours = alglib.nearestneighbor.kdtreequeryknn(kdTree, x, k, false); 181 alglib.nearestneighbor.kdtreequeryresultsdistances(kdTree, ref dists); 182 alglib.nearestneighbor.kdtreequeryresultsxy(kdTree, ref neighbours); 183 234 int numNeighbours; 235 lock (kdTreeLockObject) { 236 // gkronber: the following calls change the kdTree data structure 237 numNeighbours = alglib.nearestneighbor.kdtreequeryknn(kdTree, x, k, false); 238 alglib.nearestneighbor.kdtreequeryresultsdistances(kdTree, ref dists); 239 alglib.nearestneighbor.kdtreequeryresultsxy(kdTree, ref neighbours); 240 } 184 241 Array.Clear(y, 0, y.Length); 185 for (int i = 0; i < actNeighbours; i++) {242 for (int i = 0; i < numNeighbours; i++) { 186 243 int classValue = (int)Math.Round(neighbours[i, columns]); 187 244 y[classValue]++; … … 201 258 } 202 259 203 public INearestNeighbourRegressionSolution CreateRegressionSolution(IRegressionProblemData problemData) { 204 return new NearestNeighbourRegressionSolution(new RegressionProblemData(problemData), this); 205 } 260 206 261 IRegressionSolution IRegressionModel.CreateRegressionSolution(IRegressionProblemData problemData) { 207 return CreateRegressionSolution(problemData); 208 } 209 public INearestNeighbourClassificationSolution CreateClassificationSolution(IClassificationProblemData problemData) { 210 return new NearestNeighbourClassificationSolution(new ClassificationProblemData(problemData), this); 211 } 212 IClassificationSolution IClassificationModel.CreateClassificationSolution(IClassificationProblemData problemData) { 213 return CreateClassificationSolution(problemData); 262 return new NearestNeighbourRegressionSolution(this, new RegressionProblemData(problemData)); 263 } 264 public override IClassificationSolution CreateClassificationSolution(IClassificationProblemData problemData) { 265 return new NearestNeighbourClassificationSolution(this, new ClassificationProblemData(problemData)); 214 266 } 215 267 … … 223 275 #endregion 224 276 277 278 // BackwardsCompatibility3.3 279 #region Backwards compatible code, remove with 3.4 280 281 private bool isCompatibilityLoaded = false; // new kNN models have the value false, kNN models loaded from disc have the value true 282 [Storable(DefaultValue = true)] 283 public bool IsCompatibilityLoaded { 284 get { return isCompatibilityLoaded; } 285 set { isCompatibilityLoaded = value; } 286 } 287 #endregion 225 288 #region persistence 226 289 [Storable] -
branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour/NearestNeighbourRegression.cs
r13238 r15973 1 1 #region License Information 2 2 /* HeuristicLab 3 * Copyright (C) 2002-201 5Heuristic and Evolutionary Algorithms Laboratory (HEAL)3 * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL) 4 4 * 5 5 * This file is part of HeuristicLab. … … 21 21 22 22 using System; 23 using System.Threading; 23 24 using HeuristicLab.Common; 24 25 using HeuristicLab.Core; … … 39 40 private const string KParameterName = "K"; 40 41 private const string NearestNeighbourRegressionModelResultName = "Nearest neighbour regression solution"; 42 private const string WeightsParameterName = "Weights"; 41 43 42 44 #region parameter properties 43 45 public IFixedValueParameter<IntValue> KParameter { 44 46 get { return (IFixedValueParameter<IntValue>)Parameters[KParameterName]; } 47 } 48 49 public IValueParameter<DoubleArray> WeightsParameter { 50 get { return (IValueParameter<DoubleArray>)Parameters[WeightsParameterName]; } 45 51 } 46 52 #endregion … … 52 58 else KParameter.Value.Value = value; 53 59 } 60 } 61 62 public DoubleArray Weights { 63 get { return WeightsParameter.Value; } 64 set { WeightsParameter.Value = value; } 54 65 } 55 66 #endregion … … 63 74 : base() { 64 75 Parameters.Add(new FixedValueParameter<IntValue>(KParameterName, "The number of nearest neighbours to consider for regression.", new IntValue(3))); 76 Parameters.Add(new OptionalValueParameter<DoubleArray>(WeightsParameterName, "Optional: use weights to specify individual scaling values for all features. If not set the weights are calculated automatically (each feature is scaled to unit variance)")); 65 77 Problem = new RegressionProblem(); 66 78 } 79 67 80 [StorableHook(HookType.AfterDeserialization)] 68 private void AfterDeserialization() { } 81 private void AfterDeserialization() { 82 // BackwardsCompatibility3.3 83 #region Backwards compatible code, remove with 3.4 84 if (!Parameters.ContainsKey(WeightsParameterName)) { 85 Parameters.Add(new OptionalValueParameter<DoubleArray>(WeightsParameterName, "Optional: use weights to specify individual scaling values for all features. If not set the weights are calculated automatically (each feature is scaled to unit variance)")); 86 } 87 #endregion 88 } 69 89 70 90 public override IDeepCloneable Clone(Cloner cloner) { … … 73 93 74 94 #region nearest neighbour 75 protected override void Run() { 76 var solution = CreateNearestNeighbourRegressionSolution(Problem.ProblemData, K); 95 protected override void Run(CancellationToken cancellationToken) { 96 double[] weights = null; 97 if (Weights != null) weights = Weights.CloneAsArray(); 98 var solution = CreateNearestNeighbourRegressionSolution(Problem.ProblemData, K, weights); 77 99 Results.Add(new Result(NearestNeighbourRegressionModelResultName, "The nearest neighbour regression solution.", solution)); 78 100 } 79 101 80 public static IRegressionSolution CreateNearestNeighbourRegressionSolution(IRegressionProblemData problemData, int k ) {102 public static IRegressionSolution CreateNearestNeighbourRegressionSolution(IRegressionProblemData problemData, int k, double[] weights = null) { 81 103 var clonedProblemData = (IRegressionProblemData)problemData.Clone(); 82 return new NearestNeighbourRegressionSolution( clonedProblemData, Train(problemData, k));104 return new NearestNeighbourRegressionSolution(Train(problemData, k, weights), clonedProblemData); 83 105 } 84 106 85 public static INearestNeighbourModel Train(IRegressionProblemData problemData, int k ) {107 public static INearestNeighbourModel Train(IRegressionProblemData problemData, int k, double[] weights = null) { 86 108 return new NearestNeighbourModel(problemData.Dataset, 87 109 problemData.TrainingIndices, 88 110 k, 89 111 problemData.TargetVariable, 90 problemData.AllowedInputVariables); 112 problemData.AllowedInputVariables, 113 weights); 91 114 } 92 115 #endregion -
branches/2522_RefactorPluginInfrastructure/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour/NearestNeighbourRegressionSolution.cs
r12012 r15973 1 1 #region License Information 2 2 /* HeuristicLab 3 * Copyright (C) 2002-201 5Heuristic and Evolutionary Algorithms Laboratory (HEAL)3 * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL) 4 4 * 5 5 * This file is part of HeuristicLab. … … 43 43 : base(original, cloner) { 44 44 } 45 public NearestNeighbourRegressionSolution(I RegressionProblemData problemData, INearestNeighbourModel nnModel)45 public NearestNeighbourRegressionSolution(INearestNeighbourModel nnModel, IRegressionProblemData problemData) 46 46 : base(nnModel, problemData) { 47 47 }
Note: See TracChangeset
for help on using the changeset viewer.