Changeset 17370
- Timestamp:
- 11/25/19 13:39:43 (5 years ago)
- Location:
- branches/2971_named_intervals
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2971_named_intervals/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionSingleObjectiveConstraintConstOptEvaluator.cs
r16924 r17370 94 94 if (!constraint.IsDerivation) { 95 95 var res = intervalInterpreter.GetSymbolicExpressionTreeInterval(solution, variableRanges); 96 if (!constraint.Interval.Contains(res, constraint.InclusiveLowerBound, 97 constraint.InclusiveUpperBound)) { 96 if (!constraint.Interval.Contains(res)) { 98 97 return true; 99 98 } … … 104 103 } 105 104 var res = intervalInterpreter.GetSymbolicExpressionTreeInterval(tree, variableRanges); 106 if (!constraint.Interval.Contains(res, constraint.InclusiveLowerBound, 107 constraint.InclusiveUpperBound)) { 105 if (!constraint.Interval.Contains(res)) { 108 106 return true; 109 107 } -
branches/2971_named_intervals/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/SymbolicRegressionConstraintAnalyzer.cs
r16927 r17370 115 115 } 116 116 117 var satisfied = constraint.Interval.Contains(resultInterval , constraint.InclusiveLowerBound, constraint.InclusiveUpperBound);117 var satisfied = constraint.Interval.Contains(resultInterval); 118 118 return satisfied; 119 119 } -
branches/2971_named_intervals/HeuristicLab.Problems.DataAnalysis.Views/3.4/IntervalConstraintView.Designer.cs
r16898 r17370 47 47 this.lowerboundLabel = new System.Windows.Forms.Label(); 48 48 this.upperboundLabel = new System.Windows.Forms.Label(); 49 this.incllowerboundLabel = new System.Windows.Forms.Label();50 this.inclupperboundLabel = new System.Windows.Forms.Label();51 49 this.variableLabel = new System.Windows.Forms.Label(); 52 50 this.numberderivationLabel = new System.Windows.Forms.Label(); … … 55 53 this.variableInput = new System.Windows.Forms.TextBox(); 56 54 this.groupBox1 = new System.Windows.Forms.GroupBox(); 55 this.enabledLabel = new System.Windows.Forms.Label(); 57 56 this.label1 = new System.Windows.Forms.Label(); 58 57 this.numberderivationInput = new System.Windows.Forms.ComboBox(); … … 60 59 this.expressionInput = new System.Windows.Forms.TextBox(); 61 60 this.expressionLabel = new System.Windows.Forms.Label(); 62 this.inclupperboundInput = new System.Windows.Forms.CheckBox();63 this.incllowerboundInput = new System.Windows.Forms.CheckBox();64 61 this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components); 65 this.enabledLabel = new System.Windows.Forms.Label();66 62 this.groupBox1.SuspendLayout(); 67 63 ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit(); … … 73 69 this.lowerboundLabel.Location = new System.Drawing.Point(8, 101); 74 70 this.lowerboundLabel.Name = "lowerboundLabel"; 75 this.lowerboundLabel.Size = new System.Drawing.Size( 69, 13);71 this.lowerboundLabel.Size = new System.Drawing.Size(90, 17); 76 72 this.lowerboundLabel.TabIndex = 2; 77 73 this.lowerboundLabel.Text = "Lowerbound:"; … … 82 78 this.upperboundLabel.Location = new System.Drawing.Point(8, 126); 83 79 this.upperboundLabel.Name = "upperboundLabel"; 84 this.upperboundLabel.Size = new System.Drawing.Size( 69, 13);80 this.upperboundLabel.Size = new System.Drawing.Size(91, 17); 85 81 this.upperboundLabel.TabIndex = 3; 86 82 this.upperboundLabel.Text = "Upperbound:"; 87 //88 // incllowerboundLabel89 //90 this.incllowerboundLabel.AutoSize = true;91 this.incllowerboundLabel.Location = new System.Drawing.Point(8, 153);92 this.incllowerboundLabel.Name = "incllowerboundLabel";93 this.incllowerboundLabel.Size = new System.Drawing.Size(92, 13);94 this.incllowerboundLabel.TabIndex = 4;95 this.incllowerboundLabel.Text = "Incl. Lowerbound:";96 //97 // inclupperboundLabel98 //99 this.inclupperboundLabel.AutoSize = true;100 this.inclupperboundLabel.Location = new System.Drawing.Point(8, 178);101 this.inclupperboundLabel.Name = "inclupperboundLabel";102 this.inclupperboundLabel.Size = new System.Drawing.Size(92, 13);103 this.inclupperboundLabel.TabIndex = 5;104 this.inclupperboundLabel.Text = "Incl. Upperbound:";105 83 // 106 84 // variableLabel … … 109 87 this.variableLabel.Location = new System.Drawing.Point(8, 47); 110 88 this.variableLabel.Name = "variableLabel"; 111 this.variableLabel.Size = new System.Drawing.Size( 48, 13);89 this.variableLabel.Size = new System.Drawing.Size(64, 17); 112 90 this.variableLabel.TabIndex = 7; 113 91 this.variableLabel.Text = "Variable:"; … … 118 96 this.numberderivationLabel.Location = new System.Drawing.Point(8, 74); 119 97 this.numberderivationLabel.Name = "numberderivationLabel"; 120 this.numberderivationLabel.Size = new System.Drawing.Size( 65, 13);98 this.numberderivationLabel.Size = new System.Drawing.Size(84, 17); 121 99 this.numberderivationLabel.TabIndex = 8; 122 100 this.numberderivationLabel.Text = "#Derivation:"; … … 128 106 this.upperboundInput.Location = new System.Drawing.Point(108, 123); 129 107 this.upperboundInput.Name = "upperboundInput"; 130 this.upperboundInput.Size = new System.Drawing.Size(473, 2 0);108 this.upperboundInput.Size = new System.Drawing.Size(473, 22); 131 109 this.upperboundInput.TabIndex = 11; 132 110 this.upperboundInput.Validating += new System.ComponentModel.CancelEventHandler(this.upperboundInput_Validating); … … 139 117 this.lowerboundInput.Location = new System.Drawing.Point(108, 98); 140 118 this.lowerboundInput.Name = "lowerboundInput"; 141 this.lowerboundInput.Size = new System.Drawing.Size(473, 2 0);119 this.lowerboundInput.Size = new System.Drawing.Size(473, 22); 142 120 this.lowerboundInput.TabIndex = 12; 143 121 this.lowerboundInput.Validating += new System.ComponentModel.CancelEventHandler(this.lowerboundInput_Validating); … … 150 128 this.variableInput.Location = new System.Drawing.Point(108, 44); 151 129 this.variableInput.Name = "variableInput"; 152 this.variableInput.Size = new System.Drawing.Size(473, 2 0);130 this.variableInput.Size = new System.Drawing.Size(473, 22); 153 131 this.variableInput.TabIndex = 15; 154 132 // … … 161 139 this.groupBox1.Controls.Add(this.expressionInput); 162 140 this.groupBox1.Controls.Add(this.expressionLabel); 163 this.groupBox1.Controls.Add(this.inclupperboundInput);164 this.groupBox1.Controls.Add(this.incllowerboundInput);165 141 this.groupBox1.Controls.Add(this.variableInput); 166 142 this.groupBox1.Controls.Add(this.lowerboundInput); … … 168 144 this.groupBox1.Controls.Add(this.numberderivationLabel); 169 145 this.groupBox1.Controls.Add(this.variableLabel); 170 this.groupBox1.Controls.Add(this.inclupperboundLabel);171 this.groupBox1.Controls.Add(this.incllowerboundLabel);172 146 this.groupBox1.Controls.Add(this.upperboundLabel); 173 147 this.groupBox1.Controls.Add(this.lowerboundLabel); … … 180 154 this.groupBox1.Text = "Interval Constraints Detail"; 181 155 // 156 // enabledLabel 157 // 158 this.enabledLabel.AutoSize = true; 159 this.enabledLabel.Location = new System.Drawing.Point(8, 153); 160 this.enabledLabel.Name = "enabledLabel"; 161 this.enabledLabel.Size = new System.Drawing.Size(64, 17); 162 this.enabledLabel.TabIndex = 29; 163 this.enabledLabel.Text = "Enabled:"; 164 // 182 165 // label1 183 166 // … … 185 168 this.label1.Location = new System.Drawing.Point(11, -105); 186 169 this.label1.Name = "label1"; 187 this.label1.Size = new System.Drawing.Size( 49, 13);170 this.label1.Size = new System.Drawing.Size(64, 17); 188 171 this.label1.TabIndex = 28; 189 172 this.label1.Text = "Enabled:"; … … 196 179 this.numberderivationInput.Location = new System.Drawing.Point(108, 71); 197 180 this.numberderivationInput.Name = "numberderivationInput"; 198 this.numberderivationInput.Size = new System.Drawing.Size(473, 2 1);181 this.numberderivationInput.Size = new System.Drawing.Size(473, 24); 199 182 this.numberderivationInput.TabIndex = 27; 200 183 this.numberderivationInput.SelectedIndexChanged += new System.EventHandler(this.numberderivationInput_SelectedIndexChanged); … … 203 186 // 204 187 this.ischeckedCheckBox.AutoSize = true; 205 this.ischeckedCheckBox.Location = new System.Drawing.Point(108, 200);188 this.ischeckedCheckBox.Location = new System.Drawing.Point(108, 154); 206 189 this.ischeckedCheckBox.Name = "ischeckedCheckBox"; 207 this.ischeckedCheckBox.Size = new System.Drawing.Size(1 5, 14);190 this.ischeckedCheckBox.Size = new System.Drawing.Size(18, 17); 208 191 this.ischeckedCheckBox.TabIndex = 26; 209 192 this.ischeckedCheckBox.UseVisualStyleBackColor = true; … … 216 199 this.expressionInput.Location = new System.Drawing.Point(108, 19); 217 200 this.expressionInput.Name = "expressionInput"; 218 this.expressionInput.Size = new System.Drawing.Size(473, 2 0);201 this.expressionInput.Size = new System.Drawing.Size(473, 22); 219 202 this.expressionInput.TabIndex = 25; 220 203 // … … 224 207 this.expressionLabel.Location = new System.Drawing.Point(8, 22); 225 208 this.expressionLabel.Name = "expressionLabel"; 226 this.expressionLabel.Size = new System.Drawing.Size( 61, 13);209 this.expressionLabel.Size = new System.Drawing.Size(81, 17); 227 210 this.expressionLabel.TabIndex = 24; 228 211 this.expressionLabel.Text = "Expression:"; 229 212 // 230 // inclupperboundInput231 //232 this.inclupperboundInput.AutoSize = true;233 this.inclupperboundInput.Location = new System.Drawing.Point(108, 177);234 this.inclupperboundInput.Name = "inclupperboundInput";235 this.inclupperboundInput.Size = new System.Drawing.Size(15, 14);236 this.inclupperboundInput.TabIndex = 23;237 this.inclupperboundInput.UseVisualStyleBackColor = true;238 this.inclupperboundInput.CheckedChanged += new System.EventHandler(this.inclupperboundInput_CheckedChanged);239 //240 // incllowerboundInput241 //242 this.incllowerboundInput.AutoSize = true;243 this.incllowerboundInput.Location = new System.Drawing.Point(108, 153);244 this.incllowerboundInput.Name = "incllowerboundInput";245 this.incllowerboundInput.Size = new System.Drawing.Size(15, 14);246 this.incllowerboundInput.TabIndex = 22;247 this.incllowerboundInput.UseVisualStyleBackColor = true;248 this.incllowerboundInput.CheckedChanged += new System.EventHandler(this.incllowerboundInput_CheckedChanged);249 //250 213 // errorProvider 251 214 // 252 215 this.errorProvider.ContainerControl = this; 253 216 this.errorProvider.RightToLeft = true; 254 //255 // enabledLabel256 //257 this.enabledLabel.AutoSize = true;258 this.enabledLabel.Location = new System.Drawing.Point(8, 200);259 this.enabledLabel.Name = "enabledLabel";260 this.enabledLabel.Size = new System.Drawing.Size(49, 13);261 this.enabledLabel.TabIndex = 29;262 this.enabledLabel.Text = "Enabled:";263 217 // 264 218 // IntervalConstraintView … … 278 232 private System.Windows.Forms.Label lowerboundLabel; 279 233 private System.Windows.Forms.Label upperboundLabel; 280 private System.Windows.Forms.Label incllowerboundLabel;281 private System.Windows.Forms.Label inclupperboundLabel;282 234 private System.Windows.Forms.Label variableLabel; 283 235 private System.Windows.Forms.Label numberderivationLabel; … … 286 238 private System.Windows.Forms.TextBox variableInput; 287 239 private System.Windows.Forms.GroupBox groupBox1; 288 private System.Windows.Forms.CheckBox inclupperboundInput;289 private System.Windows.Forms.CheckBox incllowerboundInput;290 240 private System.Windows.Forms.TextBox expressionInput; 291 241 private System.Windows.Forms.Label expressionLabel; -
branches/2971_named_intervals/HeuristicLab.Problems.DataAnalysis.Views/3.4/IntervalConstraintView.cs
r16936 r17370 64 64 lowerboundInput.Enabled = Content != null && !Locked && !ReadOnly; 65 65 upperboundInput.Enabled = Content != null && !Locked && !ReadOnly; 66 incllowerboundInput.Enabled = Content != null && !Locked && !ReadOnly;67 inclupperboundInput.Enabled = Content != null && !Locked && !ReadOnly;68 66 ischeckedCheckBox.Enabled = Content != null && !Locked && !ReadOnly; 69 67 } … … 99 97 lowerboundInput.Text = string.Empty; 100 98 upperboundInput.Text = string.Empty; 101 incllowerboundInput.Checked = true;102 inclupperboundInput.Checked = true;103 99 return; 104 100 } … … 107 103 lowerboundInput.Text = Content.Interval.LowerBound.ToString(); 108 104 upperboundInput.Text = Content.Interval.UpperBound.ToString(); 109 incllowerboundInput.Checked = Content.InclusiveLowerBound; 110 inclupperboundInput.Checked = Content.InclusiveUpperBound; 105 111 106 variableInput.Text = Content.Variable; 112 107 if (!Content.IsDerivation) { … … 177 172 } 178 173 179 private void incllowerboundInput_CheckedChanged(object sender, EventArgs e) {180 Content.InclusiveLowerBound = incllowerboundInput.Checked;181 }182 183 private void inclupperboundInput_CheckedChanged(object sender, EventArgs e) {184 Content.InclusiveUpperBound = inclupperboundInput.Checked;185 }186 187 174 private void ischeckedCheckBox_CheckedChanged(object sender, EventArgs e) { 188 175 Content.Enabled = ischeckedCheckBox.Checked; … … 192 179 if (numberderivationInput.SelectedItem == null) { 193 180 Content.NumberOfDerivation = 0; 181 numberderivationInput.Enabled = false; 194 182 return; 195 183 } -
branches/2971_named_intervals/HeuristicLab.Problems.DataAnalysis.Views/3.4/ProblemDataConstraintView.designer.cs
r17250 r17370 143 143 "3. Add the keyword in" + Environment.NewLine + 144 144 "4. Specify the interval with [lowerbound .. upperbound]" + Environment.NewLine + 145 "5. Open or closed square brackets denotes if an interval is open or closed" + Environment.NewLine + Environment.NewLine +146 145 "To define a derivation constraint: " + Environment.NewLine + 147 146 "1. Start with d or \u2202" + Environment.NewLine + 148 147 "2. Specify the target between '-characters" + Environment.NewLine + 149 "3. Sep erate taget and derivation variable with /" + Environment.NewLine +148 "3. Separate target and derivation variable with /" + Environment.NewLine + 150 149 "4. Add derivation variable between '-characters'" + Environment.NewLine + 151 "5. Follow the steps 3- 5from above";150 "5. Follow the steps 3-4 from above"; 152 151 // 153 152 // intervalConstraintsView -
branches/2971_named_intervals/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Interval/Interval.cs
r17368 r17370 71 71 } 72 72 73 public bool Contains(Interval other, bool lowerBoundInclusive = true, bool upperBoundInclusive = false) { 74 if (double.IsNegativeInfinity(this.LowerBound) && double.IsPositiveInfinity(this.UpperBound)) 75 return true; 76 //Left-unbounded and right-bounded: 77 if (double.IsNegativeInfinity(this.LowerBound)) { 78 if (upperBoundInclusive) 79 return other.LowerBound <= this.UpperBound && other.UpperBound <= this.UpperBound; 80 return other.LowerBound < this.UpperBound && other.UpperBound < this.UpperBound; 81 } 82 83 //Left-bounded and right-unbounded: 84 if (double.IsPositiveInfinity(this.UpperBound)) { 85 if (lowerBoundInclusive) 86 return other.LowerBound >= this.LowerBound && other.UpperBound >= this.LowerBound; 87 return other.LowerBound > this.LowerBound && other.UpperBound > this.LowerBound; 88 } 89 90 //Proper and bounded: 91 //Closed: 92 if (lowerBoundInclusive && upperBoundInclusive) { 93 return this.LowerBound <= other.LowerBound && other.UpperBound <= this.UpperBound; 94 } 95 96 //Open: 97 if (!lowerBoundInclusive && !upperBoundInclusive) { 98 return this.LowerBound < other.LowerBound && other.UpperBound < this.UpperBound; 99 } 100 101 //Left-closed, right-open: 102 if (lowerBoundInclusive) { 103 return this.LowerBound <= other.LowerBound && other.UpperBound < this.UpperBound; 104 } 105 106 //Left-open, right-closed: 107 return this.LowerBound < other.LowerBound && other.UpperBound <= this.UpperBound; 73 public bool Contains(Interval other) { 74 if (double.IsNegativeInfinity(LowerBound) && double.IsPositiveInfinity(UpperBound)) return true; 75 if (other.LowerBound >= LowerBound && other.UpperBound <= UpperBound) return true; 76 77 return false; 108 78 } 109 79 -
branches/2971_named_intervals/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Interval/IntervalConstraint.cs
r16964 r17370 98 98 99 99 [Storable] 100 private bool inclusiveLowerBound;101 public bool InclusiveLowerBound {102 get => inclusiveLowerBound;103 set {104 if (inclusiveLowerBound == value) return;105 inclusiveLowerBound = value;106 UpdateExpression();107 OnChanged();108 }109 }110 111 [Storable]112 private bool inclusiveUpperBound;113 public bool InclusiveUpperBound {114 get => inclusiveUpperBound;115 set {116 if (inclusiveUpperBound == value) return;117 inclusiveUpperBound = value;118 UpdateExpression();119 OnChanged();120 }121 }122 123 [Storable]124 100 private bool enabled; 125 101 public bool Enabled { … … 135 111 private IntervalConstraint(StorableConstructorFlag _) : base(_) { } 136 112 137 public IntervalConstraint(string expression, string variable, string target, int numberOfDerivation, Interval interval, bool inclusiveLowerBound, 138 bool inclusiveUpperBound, bool enabled) : base(){ 113 public IntervalConstraint(string expression, string variable, string target, int numberOfDerivation, Interval interval, bool enabled) : base(){ 139 114 this.expression = expression; 140 115 this.variable = variable; … … 142 117 this.numberOfDerivation = numberOfDerivation; 143 118 this.interval = interval; 144 this.inclusiveLowerBound = inclusiveLowerBound;145 this.inclusiveUpperBound = inclusiveUpperBound;146 119 this.enabled = enabled; 147 120 } … … 158 131 this.NumberOfDerivation = original.NumberOfDerivation; 159 132 this.Interval = original.Interval; 160 this.InclusiveLowerBound = original.InclusiveLowerBound;161 this.InclusiveUpperBound = original.InclusiveUpperBound;162 133 this.Enabled = original.Enabled; 163 134 } … … 189 160 expression = string.Format("Target:{0} in {1}{2} .. {3}{4}", 190 161 Variable, 191 (InclusiveLowerBound) ? "[" : "]",162 "[", 192 163 Interval?.LowerBound, 193 164 Interval?.UpperBound, 194 (InclusiveUpperBound) ? "]" : "[");165 "]"); 195 166 Expression = expression; 196 167 return; … … 199 170 Variable, 200 171 Target, 201 (InclusiveLowerBound) ? "[" : "]",172 "[", 202 173 Interval?.LowerBound, 203 174 Interval?.UpperBound, 204 (InclusiveUpperBound) ? "]" : "[",175 "]", 205 176 GetDerivationString(numberOfDerivation)); 206 177 Expression = expression; -
branches/2971_named_intervals/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Interval/IntervalConstraintsParser.cs
r17250 r17370 33 33 if (string.IsNullOrEmpty(target)) throw new ArgumentNullException("No target variable has been provided."); 34 34 if (variables == null) throw new ArgumentNullException("No variables have been provided."); 35 if (!variables.Any()) throw new ArgumentException("Varia lbes are empty.");35 if (!variables.Any()) throw new ArgumentException("Variables are empty."); 36 36 37 37 var lines = inputText.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None); … … 44 44 var targetConstraint = trimmedLine.Substring(start, end - start); 45 45 var match = Regex.Match(targetConstraint, 46 @"(['](.*)[']|(.*[^\s]))\s*(\bin\b)\s*([\[ \]])\s*(\S*)\s*(\.{2})\s*(\S*)\s*([\[\]])");46 @"(['](.*)[']|(.*[^\s]))\s*(\bin\b)\s*([\[])\s*(\S*)\s*(\.{2})\s*(\S*)\s*([\]])"); 47 47 if (match.Success) { 48 48 if (match.Groups.Count != 10) { … … 63 63 var parsedTarget = match.Groups[1].Value.Trim(); 64 64 var variable = targetVariable; 65 var inclLowerBound = match.Groups[5].Value.Trim() == "[";66 var inclUpperBound = match.Groups[9].Value.Trim() == "]";67 65 var isEnabled = true; 68 66 var numberOfDerivation = 0; 69 67 var interval = new Interval(lowerBound, upperBound); 70 68 71 var constraint = new IntervalConstraint(expression, variable, parsedTarget, numberOfDerivation, interval, i nclLowerBound, inclUpperBound, isEnabled);69 var constraint = new IntervalConstraint(expression, variable, parsedTarget, numberOfDerivation, interval, isEnabled); 72 70 73 71 yield return constraint; … … 79 77 } else if (trimmedLine.StartsWith("d") || trimmedLine.StartsWith("\u2202")) { 80 78 var match = Regex.Match(trimmedLine, 81 @"([d∂])([²³]?)\s*(['](.*)[']|(.*[^\s]))\s*(\/)\s*([d∂])\s*(['](.*)[']|(.*[^\s²³]))\s*([²³]?)\s*\bin\b\s*([\[ \]])\s*(\S*)\s*(\.{2})\s*(\S*)\s*([\[\]])");79 @"([d∂])([²³]?)\s*(['](.*)[']|(.*[^\s]))\s*(\/)\s*([d∂])\s*(['](.*)[']|(.*[^\s²³]))\s*([²³]?)\s*\bin\b\s*([\[])\s*(\S*)\s*(\.{2})\s*(\S*)\s*([\]])"); 82 80 83 81 if (match.Success) { … … 115 113 var parsedTarget = derivationTarget; 116 114 var isEnabled = true; 117 var inclLowerBound = match.Groups[12].Value.Trim() == "[";118 var inclUpperBound = match.Groups[16].Value.Trim() == "]";119 115 var variable = derivationVariable; 120 116 var numberOfDerivation = ParseDerivationCount(match.Groups[2].Value.Trim()); 121 117 var interval = new Interval(lowerBound, upperBound); 122 118 123 var constraint = new IntervalConstraint(expression, variable, parsedTarget, numberOfDerivation, interval, i nclLowerBound, inclUpperBound, isEnabled);119 var constraint = new IntervalConstraint(expression, variable, parsedTarget, numberOfDerivation, interval, isEnabled); 124 120 125 121 yield return constraint; -
branches/2971_named_intervals/HeuristicLab.Problems.DataAnalysis/3.4/ProblemDataConstraint.cs
r17256 r17370 37 37 "# Example for constraint on model parameter: " + Environment.NewLine + 38 38 "d'y'/d'x' in [0 .. 10]" + Environment.NewLine + 39 "∂²'y'/∂'x'² in ]-1 .. inf.[";39 "∂²'y'/∂'x'² in [-1 .. inf.]"; 40 40 41 41 [Storable]
Note: See TracChangeset
for help on using the changeset viewer.