- Timestamp:
- 06/12/12 01:47:25 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Optimizer/3.3/CreateExperimentDialog.cs
r7976 r7985 56 56 private int repetitions; 57 57 private Dictionary<IProblemInstanceProvider, HashSet<IDataDescriptor>> instances; 58 private Dictionary<IValueParameter, Tuple<int, int, int>> intParameters;59 private Dictionary<IValueParameter, Tuple<double, double, double>> doubleParameters;58 private Dictionary<IValueParameter, IntArray> intParameters; 59 private Dictionary<IValueParameter, DoubleArray> doubleParameters; 60 60 private HashSet<IValueParameter> boolParameters; 61 61 private Dictionary<IValueParameter, HashSet<IItem>> multipleChoiceParameters; … … 77 77 78 78 instances = new Dictionary<IProblemInstanceProvider, HashSet<IDataDescriptor>>(); 79 intParameters = new Dictionary<IValueParameter, Tuple<int, int, int>>();80 doubleParameters = new Dictionary<IValueParameter, Tuple<double, double, double>>();79 intParameters = new Dictionary<IValueParameter, IntArray>(); 80 doubleParameters = new Dictionary<IValueParameter, DoubleArray>(); 81 81 boolParameters = new HashSet<IValueParameter>(); 82 82 multipleChoiceParameters = new Dictionary<IValueParameter, HashSet<IItem>>(); … … 118 118 119 119 if (isConstrainedValueParameter) { 120 if (e.Item.Checked) { 121 multipleChoiceParameters.Add(parameter, new HashSet<IItem>()); 122 } else { 123 multipleChoiceParameters.Remove(parameter); 124 } 120 if (e.Item.Checked) multipleChoiceParameters.Add(parameter, new HashSet<IItem>()); 121 else multipleChoiceParameters.Remove(parameter); 125 122 } 126 123 … … 128 125 if (intValue != null) { 129 126 if (e.Item.Checked) { 130 int minimum = intValue.Value; 131 int maximum = intValue.Value; 132 int step = 1; 133 intParameters.Add(parameter, new Tuple<int, int, int>(minimum, maximum, step)); 127 intParameters.Add(parameter, new IntArray()); 128 intParameters[parameter].Reset += new EventHandler(ValuesArray_Reset); 134 129 } else intParameters.Remove(parameter); 135 130 } … … 138 133 if (doubleValue != null) { 139 134 if (e.Item.Checked) { 140 double minimum = doubleValue.Value; 141 double maximum = doubleValue.Value; 142 double step = 1; 143 doubleParameters.Add(parameter, new Tuple<double, double, double>(minimum, maximum, step)); 135 doubleParameters.Add(parameter, new DoubleArray()); 136 doubleParameters[parameter].Reset += new EventHandler(ValuesArray_Reset); 144 137 } else doubleParameters.Remove(parameter); 145 138 } … … 174 167 if (isConstrainedValueParameter) { 175 168 detailsTypeLabel.Text = "Choices:"; 176 choicesListView.Enabled = true;177 choicesListView.Visible = true;178 169 choicesListView.Tag = parameter; 179 170 180 if (!multipleChoiceParameters.ContainsKey(parameter)) return;181 171 dynamic constrainedValuedParameter = parameter; 182 172 dynamic validValues = constrainedValuedParameter.ValidValues; … … 184 174 choicesListView.Items.Add(new ListViewItem(choice.ToString()) { 185 175 Tag = choice, 186 Checked = multipleChoiceParameters[parameter].Contains(choice) 176 Checked = multipleChoiceParameters.ContainsKey(parameter) 177 && multipleChoiceParameters[parameter].Contains(choice) 187 178 }); 188 179 } 180 choicesListView.Enabled = multipleChoiceParameters.ContainsKey(parameter); 181 detailsTypeLabel.Visible = true; 182 choicesListView.Visible = true; 189 183 return; 190 184 } 191 185 192 if (!(parameter.Value is ValueTypeValue<bool>)) { 193 minimumLabel.Visible = true; minimumTextBox.Visible = true; 194 maximumLabel.Visible = true; maximumTextBox.Visible = true; 195 stepSizeLabel.Visible = true; stepSizeTextBox.Visible = true; 196 } else detailsTypeLabel.Text = "Boolean parameter: True / False"; 186 if (parameter.Value is ValueTypeValue<bool>) { 187 detailsTypeLabel.Text = "Boolean parameter: True / False"; 188 detailsTypeLabel.Visible = true; 189 } 197 190 198 191 var intValue = parameter.Value as ValueTypeValue<int>; 199 192 if (intValue != null) { 200 detailsTypeLabel.Text = "Integer parameter:"; 201 if (!intParameters.ContainsKey(parameter)) return; 202 string min = intParameters[parameter].Item1.ToString(); 203 string max = intParameters[parameter].Item2.ToString(); 204 string step = intParameters[parameter].Item3.ToString(); 205 UpdateMinMaxStepSize(parameter, min, max, step); 193 if (intParameters.ContainsKey(parameter)) 194 stringConvertibleArrayView.Content = intParameters[parameter]; 195 stringConvertibleArrayView.Visible = true; 196 stringConvertibleArrayView.ReadOnly = !intParameters.ContainsKey(parameter); 197 generateButton.Tag = parameter; 198 generateButton.Enabled = intParameters.ContainsKey(parameter); 199 generateButton.Visible = true; 206 200 return; 207 201 } … … 209 203 var doubleValue = parameter.Value as ValueTypeValue<double>; 210 204 if (doubleValue != null) { 211 detailsTypeLabel.Text = "Double parameter:"; 212 if (!doubleParameters.ContainsKey(parameter)) return; 213 string min = doubleParameters[parameter].Item1.ToString(); 214 string max = doubleParameters[parameter].Item2.ToString(); 215 string step = doubleParameters[parameter].Item3.ToString(); 216 UpdateMinMaxStepSize(parameter, min, max, step); 205 if (doubleParameters.ContainsKey(parameter)) 206 stringConvertibleArrayView.Content = doubleParameters[parameter]; 207 stringConvertibleArrayView.Visible = true; 208 stringConvertibleArrayView.ReadOnly = !doubleParameters.ContainsKey(parameter); 209 generateButton.Tag = parameter; 210 generateButton.Enabled = doubleParameters.ContainsKey(parameter); 211 generateButton.Visible = true; 217 212 return; 218 213 } … … 222 217 private void choiceListView_ItemChecked(object sender, ItemCheckedEventArgs e) { 223 218 var parameter = (IValueParameter)choicesListView.Tag; 224 if (e.Item.Checked) { 225 multipleChoiceParameters[parameter].Add((IItem)e.Item.Tag); 226 } else multipleChoiceParameters[parameter].Remove((IItem)e.Item.Tag); 227 228 UpdateVariationsLabel(); 229 } 230 231 private void detailsTextBox_Validating(object sender, CancelEventArgs e) { 232 var parameter = (IValueParameter)((TextBox)sender).Tag; 233 errorProvider.Clear(); 234 235 var intValue = parameter.Value as ValueTypeValue<int>; 236 if (intValue != null) { 237 int value; 238 if (!int.TryParse(((TextBox)sender).Text, out value)) { 239 errorProvider.SetError(((TextBox)sender), "Please enter a valid integer number."); 240 e.Cancel = true; 241 } else { 242 var before = intParameters[parameter]; 243 var after = default(Tuple<int, int, int>); 244 if (sender == minimumTextBox) after = new Tuple<int, int, int>(value, before.Item2, before.Item3); 245 else if (sender == maximumTextBox) after = new Tuple<int, int, int>(before.Item1, value, before.Item3); 246 else if (sender == stepSizeTextBox) after = new Tuple<int, int, int>(before.Item1, before.Item2, value); 247 intParameters[parameter] = after; 248 } 249 } 250 251 var doubleValue = parameter.Value as ValueTypeValue<double>; 252 if (doubleValue != null) { 253 double value; 254 if (!double.TryParse(((TextBox)sender).Text, NumberStyles.Float, CultureInfo.CurrentCulture.NumberFormat, out value)) { 255 errorProvider.SetError(((TextBox)sender), "Please enter a valid number."); 256 e.Cancel = true; 257 } else { 258 var before = doubleParameters[parameter]; 259 var after = default(Tuple<double, double, double>); 260 if (sender == minimumTextBox) after = new Tuple<double, double, double>(value, before.Item2, before.Item3); 261 else if (sender == maximumTextBox) after = new Tuple<double, double, double>(before.Item1, value, before.Item3); 262 else if (sender == stepSizeTextBox) after = new Tuple<double, double, double>(before.Item1, before.Item2, value); 263 doubleParameters[parameter] = after; 264 } 265 } 266 219 if (multipleChoiceParameters.ContainsKey(parameter)) { 220 if (e.Item.Checked) { 221 multipleChoiceParameters[parameter].Add((IItem)e.Item.Tag); 222 } else multipleChoiceParameters[parameter].Remove((IItem)e.Item.Tag); 223 224 UpdateVariationsLabel(); 225 } 226 } 227 228 private void generateButton_Click(object sender, EventArgs e) { 229 var parameter = (IValueParameter)generateButton.Tag; 230 bool integerOnly = intParameters.ContainsKey(parameter); 231 double min = 0, max = 1, step = 1; 232 #region Try to calculate some meaningful values 233 if (integerOnly) { 234 int len = intParameters[parameter].Length; 235 if (len > 0) { 236 min = intParameters[parameter].Min(); 237 max = intParameters[parameter].Max(); 238 step = len >= 2 ? Math.Abs((intParameters[parameter][len - 1] - intParameters[parameter][len - 2])) : 1; 239 } 240 } else { 241 int len = doubleParameters[parameter].Length; 242 if (len > 0) { 243 min = doubleParameters[parameter].Min(); 244 max = doubleParameters[parameter].Max(); 245 step = len >= 2 ? Math.Abs((doubleParameters[parameter][len - 1] - doubleParameters[parameter][len - 2])) : 1; 246 } 247 } 248 #endregion 249 using (var dialog = new DefineArithmeticProgressionDialog(integerOnly, min, max, step)) { 250 if (dialog.ShowDialog() == DialogResult.OK) { 251 var values = dialog.Values; 252 if (integerOnly) { 253 intParameters[parameter].Reset -= new EventHandler(ValuesArray_Reset); 254 intParameters[parameter] = new IntArray(values.Select(x => (int)x).ToArray()); 255 intParameters[parameter].Reset += new EventHandler(ValuesArray_Reset); 256 stringConvertibleArrayView.Content = intParameters[parameter]; 257 } else { 258 doubleParameters[parameter].Reset -= new EventHandler(ValuesArray_Reset); 259 doubleParameters[parameter] = new DoubleArray(values.ToArray()); 260 doubleParameters[parameter].Reset += new EventHandler(ValuesArray_Reset); 261 stringConvertibleArrayView.Content = doubleParameters[parameter]; 262 } 263 UpdateVariationsLabel(); 264 } 265 } 266 } 267 268 private void ValuesArray_Reset(object sender, EventArgs e) { 267 269 UpdateVariationsLabel(); 268 270 } … … 459 461 int intParameterVariations = 1; 460 462 foreach (var intParam in intParameters.Values) { 461 if (intParam.Item3 == 0) continue; 462 intParameterVariations *= (intParam.Item2 - intParam.Item1) / intParam.Item3 + 1; 463 intParameterVariations *= Math.Max(intParam.Length, 1); 463 464 } 464 465 int doubleParameterVariations = 1; 465 466 foreach (var doubleParam in doubleParameters.Values) { 466 if (doubleParam.Item3 == 0) continue; 467 doubleParameterVariations *= (int)Math.Floor((doubleParam.Item2 - doubleParam.Item1) / doubleParam.Item3) + 1; 467 doubleParameterVariations *= Math.Max(doubleParam.Length, 1); 468 468 } 469 469 int boolParameterVariations = 1; … … 480 480 481 481 private void SetMode(DialogMode mode) { 482 createBatchRunCheckBox.Enabled = mode == DialogMode.Normal; 483 repetitionsNumericUpDown.Enabled = mode == DialogMode.Normal; 484 parametersSplitContainer.Enabled = mode == DialogMode.Normal || mode == DialogMode.DiscoveringInstances; 485 selectAllCheckBox.Enabled = mode == DialogMode.Normal; 486 selectNoneCheckBox.Enabled = mode == DialogMode.Normal; 487 instancesTreeView.Enabled = mode == DialogMode.Normal; 488 instancesTreeView.Visible = mode == DialogMode.Normal || mode == DialogMode.CreatingExperiment || mode == DialogMode.PreparingExperiment; 489 okButton.Enabled = mode == DialogMode.Normal; 490 okButton.Visible = mode != DialogMode.CreatingExperiment && mode != DialogMode.PreparingExperiment; 491 cancelButton.Enabled = mode != DialogMode.PreparingExperiment; 492 instanceDiscoveryProgressLabel.Visible = mode == DialogMode.DiscoveringInstances; 493 instanceDiscoveryProgressBar.Visible = mode == DialogMode.DiscoveringInstances; 494 experimentCreationProgressBar.Visible = mode == DialogMode.CreatingExperiment || mode == DialogMode.PreparingExperiment; 482 if (InvokeRequired) Invoke((Action<DialogMode>)SetMode, mode); 483 else { 484 createBatchRunCheckBox.Enabled = mode == DialogMode.Normal; 485 repetitionsNumericUpDown.Enabled = mode == DialogMode.Normal; 486 parametersSplitContainer.Enabled = mode == DialogMode.Normal || mode == DialogMode.DiscoveringInstances; 487 selectAllCheckBox.Enabled = mode == DialogMode.Normal; 488 selectNoneCheckBox.Enabled = mode == DialogMode.Normal; 489 instancesTreeView.Enabled = mode == DialogMode.Normal; 490 instancesTreeView.Visible = mode == DialogMode.Normal || mode == DialogMode.CreatingExperiment || mode == DialogMode.PreparingExperiment; 491 okButton.Enabled = mode == DialogMode.Normal; 492 okButton.Visible = mode != DialogMode.CreatingExperiment && mode != DialogMode.PreparingExperiment; 493 cancelButton.Enabled = mode != DialogMode.PreparingExperiment; 494 instanceDiscoveryProgressLabel.Visible = mode == DialogMode.DiscoveringInstances; 495 instanceDiscoveryProgressBar.Visible = mode == DialogMode.DiscoveringInstances; 496 experimentCreationProgressBar.Visible = mode == DialogMode.CreatingExperiment || mode == DialogMode.PreparingExperiment; 497 } 495 498 } 496 499 497 500 private void ClearDetailsView() { 498 minimumLabel.Visible = false; 499 minimumTextBox.Text = string.Empty; 500 minimumTextBox.Enabled = false; 501 minimumTextBox.Visible = false; 502 maximumLabel.Visible = false; 503 maximumTextBox.Text = string.Empty; 504 maximumTextBox.Enabled = false; 505 maximumTextBox.Visible = false; 506 stepSizeLabel.Visible = false; 507 stepSizeTextBox.Text = string.Empty; 508 stepSizeTextBox.Enabled = false; 509 stepSizeTextBox.Visible = false; 501 stringConvertibleArrayView.Visible = false; 502 stringConvertibleArrayView.Content = null; 503 stringConvertibleArrayView.ReadOnly = true; 504 generateButton.Visible = false; 505 detailsTypeLabel.Visible = false; 510 506 choicesListView.Items.Clear(); 511 507 choicesListView.Enabled = false; … … 513 509 } 514 510 515 private void UpdateMinMaxStepSize(IValueParameter parameter, string min, string max, string step) {516 minimumLabel.Visible = true;517 minimumTextBox.Text = min;518 minimumTextBox.Enabled = true;519 minimumTextBox.Visible = true;520 minimumTextBox.Tag = parameter;521 maximumLabel.Visible = true;522 maximumTextBox.Text = max;523 maximumTextBox.Enabled = true;524 maximumTextBox.Visible = true;525 maximumTextBox.Tag = parameter;526 stepSizeLabel.Visible = true;527 stepSizeTextBox.Text = step;528 stepSizeTextBox.Enabled = true;529 stepSizeTextBox.Visible = true;530 stepSizeTextBox.Tag = parameter;531 }532 533 511 private void UpdateVariationsLabel() { 534 512 variationsLabel.Text = GetNumberOfVariations().ToString("#,#", CultureInfo.CurrentCulture); … … 538 516 private IEnumerable<Dictionary<IValueParameter, int>> GetIntParameterConfigurations() { 539 517 var configuration = new Dictionary<IValueParameter, int>(); 540 var indices = new Dictionary<IValueParameter, int>();518 var enumerators = new Dictionary<IValueParameter, IEnumerator<int>>(); 541 519 bool finished; 542 520 do { 543 521 foreach (var p in intParameters) { 544 if (!indices.ContainsKey(p.Key)) indices.Add(p.Key, 0); 545 var value = p.Value.Item1 + p.Value.Item3 * indices[p.Key]; 546 configuration[p.Key] = value; 522 if (!enumerators.ContainsKey(p.Key)) { 523 enumerators[p.Key] = p.Value.GetEnumerator(); 524 enumerators[p.Key].MoveNext(); 525 } 526 configuration[p.Key] = enumerators[p.Key].Current; 547 527 } 548 528 yield return configuration; 549 529 550 530 finished = true; 551 foreach (var p in intParameters.Keys) { 552 var newValue = intParameters[p].Item1 + intParameters[p].Item3 * (indices[p] + 1); 553 if (newValue > intParameters[p].Item2 || intParameters[p].Item3 == 0) 554 indices[p] = 0; 555 else { 556 indices[p]++; 531 foreach (var p in intParameters) { 532 if (!enumerators[p.Key].MoveNext()) { 533 enumerators[p.Key] = p.Value.GetEnumerator(); 534 enumerators[p.Key].MoveNext(); 535 } else { 557 536 finished = false; 558 537 break; … … 564 543 private IEnumerable<Dictionary<IValueParameter, double>> GetDoubleParameterConfigurations() { 565 544 var configuration = new Dictionary<IValueParameter, double>(); 566 var indices = new Dictionary<IValueParameter, int>();545 var enumerators = new Dictionary<IValueParameter, IEnumerator<double>>(); 567 546 bool finished; 568 547 do { 569 548 foreach (var p in doubleParameters) { 570 if (!indices.ContainsKey(p.Key)) indices.Add(p.Key, 0); 571 var value = p.Value.Item1 + p.Value.Item3 * indices[p.Key]; 572 configuration[p.Key] = value; 549 if (!enumerators.ContainsKey(p.Key)) { 550 enumerators[p.Key] = p.Value.GetEnumerator(); 551 enumerators[p.Key].MoveNext(); 552 } 553 configuration[p.Key] = enumerators[p.Key].Current; 573 554 } 574 555 yield return configuration; 575 556 576 557 finished = true; 577 foreach (var p in doubleParameters.Keys) { 578 var newValue = doubleParameters[p].Item1 + doubleParameters[p].Item3 * (indices[p] + 1); 579 if (newValue > doubleParameters[p].Item2 || doubleParameters[p].Item3 == 0) 580 indices[p] = 0; 581 else { 582 indices[p]++; 558 foreach (var p in doubleParameters) { 559 if (!enumerators[p.Key].MoveNext()) { 560 enumerators[p.Key] = p.Value.GetEnumerator(); 561 enumerators[p.Key].MoveNext(); 562 } else { 583 563 finished = false; 584 564 break; … … 732 712 } 733 713 if (localExperiment != null) { 734 // don't do GUI stuff in do_work735 714 // this step can take some time 715 SetMode(DialogMode.PreparingExperiment); 736 716 experimentCreationBackgroundWorker.ReportProgress(-1); 737 717 localExperiment.Prepare(true); … … 844 824 experimentCreationProgressBar.Value = e.ProgressPercentage; 845 825 } else { 846 SetMode(DialogMode.PreparingExperiment);847 848 826 experimentCreationProgressBar.Style = ProgressBarStyle.Marquee; 849 827 }
Note: See TracChangeset
for help on using the changeset viewer.