Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
06/12/12 01:47:25 (12 years ago)
Author:
abeham
Message:

#1851: Allow to specify each value of numeric parameters explicitly as well as provide a dialog for generating the values

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Optimizer/3.3/CreateExperimentDialog.cs

    r7976 r7985  
    5656    private int repetitions;
    5757    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;
    6060    private HashSet<IValueParameter> boolParameters;
    6161    private Dictionary<IValueParameter, HashSet<IItem>> multipleChoiceParameters;
     
    7777
    7878      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>();
    8181      boolParameters = new HashSet<IValueParameter>();
    8282      multipleChoiceParameters = new Dictionary<IValueParameter, HashSet<IItem>>();
     
    118118
    119119      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);
    125122      }
    126123
     
    128125      if (intValue != null) {
    129126        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);
    134129        } else intParameters.Remove(parameter);
    135130      }
     
    138133      if (doubleValue != null) {
    139134        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);
    144137        } else doubleParameters.Remove(parameter);
    145138      }
     
    174167      if (isConstrainedValueParameter) {
    175168        detailsTypeLabel.Text = "Choices:";
    176         choicesListView.Enabled = true;
    177         choicesListView.Visible = true;
    178169        choicesListView.Tag = parameter;
    179170
    180         if (!multipleChoiceParameters.ContainsKey(parameter)) return;
    181171        dynamic constrainedValuedParameter = parameter;
    182172        dynamic validValues = constrainedValuedParameter.ValidValues;
     
    184174          choicesListView.Items.Add(new ListViewItem(choice.ToString()) {
    185175            Tag = choice,
    186             Checked = multipleChoiceParameters[parameter].Contains(choice)
     176            Checked = multipleChoiceParameters.ContainsKey(parameter)
     177            && multipleChoiceParameters[parameter].Contains(choice)
    187178          });
    188179        }
     180        choicesListView.Enabled = multipleChoiceParameters.ContainsKey(parameter);
     181        detailsTypeLabel.Visible = true;
     182        choicesListView.Visible = true;
    189183        return;
    190184      }
    191185
    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      }
    197190
    198191      var intValue = parameter.Value as ValueTypeValue<int>;
    199192      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;
    206200        return;
    207201      }
     
    209203      var doubleValue = parameter.Value as ValueTypeValue<double>;
    210204      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;
    217212        return;
    218213      }
     
    222217    private void choiceListView_ItemChecked(object sender, ItemCheckedEventArgs e) {
    223218      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) {
    267269      UpdateVariationsLabel();
    268270    }
     
    459461      int intParameterVariations = 1;
    460462      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);
    463464      }
    464465      int doubleParameterVariations = 1;
    465466      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);
    468468      }
    469469      int boolParameterVariations = 1;
     
    480480
    481481    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      }
    495498    }
    496499
    497500    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;
    510506      choicesListView.Items.Clear();
    511507      choicesListView.Enabled = false;
     
    513509    }
    514510
    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 
    533511    private void UpdateVariationsLabel() {
    534512      variationsLabel.Text = GetNumberOfVariations().ToString("#,#", CultureInfo.CurrentCulture);
     
    538516    private IEnumerable<Dictionary<IValueParameter, int>> GetIntParameterConfigurations() {
    539517      var configuration = new Dictionary<IValueParameter, int>();
    540       var indices = new Dictionary<IValueParameter, int>();
     518      var enumerators = new Dictionary<IValueParameter, IEnumerator<int>>();
    541519      bool finished;
    542520      do {
    543521        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;
    547527        }
    548528        yield return configuration;
    549529
    550530        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 {
    557536            finished = false;
    558537            break;
     
    564543    private IEnumerable<Dictionary<IValueParameter, double>> GetDoubleParameterConfigurations() {
    565544      var configuration = new Dictionary<IValueParameter, double>();
    566       var indices = new Dictionary<IValueParameter, int>();
     545      var enumerators = new Dictionary<IValueParameter, IEnumerator<double>>();
    567546      bool finished;
    568547      do {
    569548        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;
    573554        }
    574555        yield return configuration;
    575556
    576557        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 {
    583563            finished = false;
    584564            break;
     
    732712      }
    733713      if (localExperiment != null) {
    734         // don't do GUI stuff in do_work
    735714        // this step can take some time
     715        SetMode(DialogMode.PreparingExperiment);
    736716        experimentCreationBackgroundWorker.ReportProgress(-1);
    737717        localExperiment.Prepare(true);
     
    844824        experimentCreationProgressBar.Value = e.ProgressPercentage;
    845825      } else {
    846         SetMode(DialogMode.PreparingExperiment);
    847 
    848826        experimentCreationProgressBar.Style = ProgressBarStyle.Marquee;
    849827      }
Note: See TracChangeset for help on using the changeset viewer.