Changeset 17325 for branches/2994-AutoDiffForIntervals/HeuristicLab.Problems.DataAnalysis.Regression.Symbolic.Extensions/ConstrainedNLS.cs
- Timestamp:
- 10/09/19 11:13:11 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2994-AutoDiffForIntervals/HeuristicLab.Problems.DataAnalysis.Regression.Symbolic.Extensions/ConstrainedNLS.cs
r17311 r17325 10 10 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 11 11 using HeuristicLab.Analysis; 12 using System.Collections.Generic; 12 13 13 14 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression { … … 157 158 Results.AddOrUpdateResult("Qualities", qualitiesTable); 158 159 159 var curConstraintValue = new DoubleValue(0); 160 Results.AddOrUpdateResult("Current Constraint Value", curConstraintValue); 161 var curConstraintIdx = new IntValue(0); 162 Results.AddOrUpdateResult("Current Constraint Index", curConstraintIdx); 163 164 var curConstraintRow = new DataRow("Constraint Value"); 165 var constraintsTable = new DataTable("Constraints"); 166 167 constraintsTable.Rows.Add(curConstraintRow); 160 var constraintRows = new List<IndexedDataRow<int>>(); // for access via index 161 var constraintsTable = new IndexedDataTable<int>("Constraints"); 168 162 Results.AddOrUpdateResult("Constraints", constraintsTable); 163 foreach (var constraint in problem.ProblemData.IntervalConstraints.Constraints.Where(c => c.Enabled)) { 164 if (constraint.Interval.LowerBound > double.NegativeInfinity) { 165 var constraintRow = new IndexedDataRow<int>("-" + constraint.Expression + " < " + (-constraint.Interval.LowerBound)); 166 constraintRows.Add(constraintRow); 167 constraintsTable.Rows.Add(constraintRow); 168 } 169 if (constraint.Interval.UpperBound < double.PositiveInfinity) { 170 var constraintRow = new IndexedDataRow<int>(constraint.Expression + " < " + (constraint.Interval.UpperBound)); 171 constraintRows.Add(constraintRow); 172 constraintsTable.Rows.Add(constraintRow); 173 } 174 } 175 176 var parametersTable = new IndexedDataTable<int>("Parameters"); 169 177 170 178 #endregion … … 175 183 var formatter = new InfixExpressionFormatter(); 176 184 var constraintDescriptions = state.ConstraintDescriptions.ToArray(); 177 foreach (var constraintTree in state.constraintTrees) {185 foreach (var constraintTree in state.constraintTrees) { 178 186 // HACK to remove parameter nodes which occurr multiple times 179 187 var reparsedTree = parser.Parse(formatter.Format(constraintTree)); … … 186 194 state.ConstraintEvaluated += State_ConstraintEvaluated; 187 195 188 state.Optimize( );196 state.Optimize(ConstrainedNLSInternal.OptimizationMode.UpdateParametersAndKeepLinearScaling); 189 197 bestError.Value = state.BestError; 190 198 curQualityRow.Values.Add(state.CurError); … … 205 213 curQualityRow.Values.Add(state.CurError); 206 214 bestQualityRow.Values.Add(bestError.Value); 215 216 // on the first call create the data rows 217 if(!parametersTable.Rows.Any()) { 218 for(int i=0;i<state.BestSolution.Length;i++) { 219 parametersTable.Rows.Add(new IndexedDataRow<int>("p" + i)); 220 } 221 } 222 for (int i = 0; i < state.BestSolution.Length; i++) { 223 parametersTable.Rows["p" + i].Values.Add(Tuple.Create(functionEvaluations.Value, state.BestSolution[i])); // TODO: remove access via string 224 } 207 225 } 208 226 209 227 // local function 210 228 void State_ConstraintEvaluated(int constraintIdx, double value) { 211 curConstraintIdx.Value = constraintIdx; 212 curConstraintValue.Value = value; 213 curConstraintRow.Values.Add(value); 229 constraintRows[constraintIdx].Values.Add(Tuple.Create(functionEvaluations.Value, value)); 214 230 } 215 231 } … … 217 233 private static ISymbolicRegressionSolution CreateSolution(ISymbolicExpressionTree tree, IRegressionProblemData problemData) { 218 234 var model = new SymbolicRegressionModel(problemData.TargetVariable, tree, new SymbolicDataAnalysisExpressionTreeLinearInterpreter()); 219 // model.Scale(problemData); 235 // model.CreateRegressionSolution produces a new ProblemData and recalculates intervals ==> use SymbolicRegressionSolution.ctor instead 236 var sol = new SymbolicRegressionSolution(model, (IRegressionProblemData)problemData.Clone()); 237 // NOTE: the solution has slightly different derivative values because simplification of derivatives can be done differently when parameter values are fixed. 238 220 239 // var sol = model.CreateRegressionSolution((IRegressionProblemData)problemData.Clone()); 221 // model.CreateRegressionSolution produces a new ProblemData and recalculates intervals 222 223 var sol = new SymbolicRegressionSolution(model, (IRegressionProblemData)problemData.Clone()); 224 225 // ==> set variable ranges to same range as in original problemData 226 // foreach(var interval in problemData.VariableRanges.GetIntervals()) { 227 // sol.ProblemData.VariableRanges.SetInterval 228 // } 240 229 241 return sol; 230 242 }
Note: See TracChangeset
for help on using the changeset viewer.