From a4cb9760e91b634e8ebf105cd6e011e36c626186 Mon Sep 17 00:00:00 2001 From: NATSUME Hiroaki Date: Tue, 7 May 2024 17:47:20 +0900 Subject: [PATCH 01/14] Fix analyzer notification --- .../Operation/ConstructFishAttribute.cs | 32 +++++++++++++------ Tunny/Util/GrasshopperInOut.cs | 2 +- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/Tunny/Component/Operation/ConstructFishAttribute.cs b/Tunny/Component/Operation/ConstructFishAttribute.cs index 43a0fb8b..37ca19d4 100644 --- a/Tunny/Component/Operation/ConstructFishAttribute.cs +++ b/Tunny/Component/Operation/ConstructFishAttribute.cs @@ -106,16 +106,28 @@ private bool CheckIsNicknameDuplicated() public IGH_Param CreateParameter(GH_ParameterSide side, int index) { - return side == GH_ParameterSide.Input - ? index == 0 - ? SetGeometryParameterInput() - : index == 1 - ? SetNumberParameterInput() - : SetGenericParameterInput(index) - : null; + if (side == GH_ParameterSide.Input) + { + if (index == 0) + { + return SetGeometryParameterInput(); + } + else + { + if (index == 1) + { + return SetNumberParameterInput(); + } + else + { + return SetGenericParameterInput(index); + } + } + } + return null; } - private static IGH_Param SetGenericParameterInput(int index) + private static Param_GenericObject SetGenericParameterInput(int index) { var p = new Param_GenericObject(); p.Name = p.NickName = $"Attr{index}"; @@ -125,7 +137,7 @@ private static IGH_Param SetGenericParameterInput(int index) return p; } - private static IGH_Param SetNumberParameterInput() + private static Param_Number SetNumberParameterInput() { var p = new Param_Number(); p.Name = p.NickName = "Constraint"; @@ -136,7 +148,7 @@ private static IGH_Param SetNumberParameterInput() return p; } - private static IGH_Param SetGeometryParameterInput() + private static Param_Geometry SetGeometryParameterInput() { var p = new Param_Geometry(); p.Name = p.NickName = "Geometry"; diff --git a/Tunny/Util/GrasshopperInOut.cs b/Tunny/Util/GrasshopperInOut.cs index fdba457d..2234345b 100644 --- a/Tunny/Util/GrasshopperInOut.cs +++ b/Tunny/Util/GrasshopperInOut.cs @@ -420,7 +420,7 @@ private void ExpireInput(IGH_Param input) foreach (Guid guid in input.Sources.Select(p => p.InstanceGuid)) { IGH_DocumentObject obj = _document.FindObject(guid, false); - if(!obj.Attributes.IsTopLevel) + if (!obj.Attributes.IsTopLevel) { Guid topLevelGuid = obj.Attributes.GetTopLevel.InstanceGuid; obj = _document.FindObject(topLevelGuid, true); From 9a1e56db51473133a4fefb9f4f95d0045945f288 Mon Sep 17 00:00:00 2001 From: NATSUME Hiroaki Date: Wed, 8 May 2024 12:40:49 +0900 Subject: [PATCH 02/14] Fix attribute off by 1 error --- Tunny/Component/Operation/ConstructFishAttribute.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tunny/Component/Operation/ConstructFishAttribute.cs b/Tunny/Component/Operation/ConstructFishAttribute.cs index 37ca19d4..a51b5c03 100644 --- a/Tunny/Component/Operation/ConstructFishAttribute.cs +++ b/Tunny/Component/Operation/ConstructFishAttribute.cs @@ -120,7 +120,7 @@ public IGH_Param CreateParameter(GH_ParameterSide side, int index) } else { - return SetGenericParameterInput(index); + return SetGenericParameterInput(index - 1); } } } From ffd61addf4a84db9f76a89a33e83c8760749b489 Mon Sep 17 00:00:00 2001 From: NATSUME Hiroaki Date: Wed, 8 May 2024 13:56:10 +0900 Subject: [PATCH 03/14] Fix - SolutionExpire timing was off when using ValueList. --- CHANGELOG.md | 7 ++ .../Grasshopper/Human-in-the-loop/facade.gh | Bin 25882 -> 25648 bytes .../Grasshopper/categorical_optimization.gh | Bin 13069 -> 14365 bytes Tunny/Component/Input/TunnyValueList.cs | 107 ++++++++++++++++++ Tunny/Util/GrasshopperInOut.cs | 12 +- 5 files changed, 120 insertions(+), 6 deletions(-) create mode 100644 Tunny/Component/Input/TunnyValueList.cs diff --git a/CHANGELOG.md b/CHANGELOG.md index 75450b17..0ebb2970 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,13 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p Please see [here](https://github.com/hrntsm/Tunny/releases) for the data released for each version. +## [v0.11.1] -YYYY-MM-DD + +### Fixed + +- SolutionExpire timing was off when using ValueList. +- FishAttribute component "Attr" input index off by one error. + ## [v0.11.0] -2024-03-20 ### Added diff --git a/Examples/Grasshopper/Human-in-the-loop/facade.gh b/Examples/Grasshopper/Human-in-the-loop/facade.gh index 71801364ffd0113da2939faf91fed6f57f151ced..2ee5fd4f83c27be78321413c8582a26ddea01f7e 100644 GIT binary patch literal 25648 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
n^ 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%0A-O}yKmDBN{U--d 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�C!64t@CN1+mTWHNMKw92MF->8x$Z*gOf4`_K5f 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 b5AdV!Lr2at5k#Y3I?KzbNT*3Yc>MnW)85E| diff --git a/Tunny/Component/Input/TunnyValueList.cs b/Tunny/Component/Input/TunnyValueList.cs new file mode 100644 index 00000000..572a5803 --- /dev/null +++ b/Tunny/Component/Input/TunnyValueList.cs @@ -0,0 +1,107 @@ +using System; +using System.Drawing; + +using Grasshopper.GUI.Canvas; +using Grasshopper.Kernel.Special; + +namespace Tunny.Component.Util +{ + public class TunnyValueList : GH_ValueList + { + public TunnyValueList() : base() + { + Category = "Tunny"; + SubCategory = "Input"; + Name = "Tunny Value List"; + NickName = "<')))<<"; + Description = "Value list with Tunny styling"; + ListMode = GH_ValueListMode.CheckList; + ListItems.Clear(); + ListItems.Add(new GH_ValueListItem("Tuna", "1")); + ListItems.Add(new GH_ValueListItem("Salmon", "2")); + ListItems.Add(new GH_ValueListItem("Cod", "3")); + ListItems.Add(new GH_ValueListItem("Trout", "4")); + } + + public override void CreateAttributes() + { + m_attributes = new TunnyValueListAttributes(this); + } + + public override Guid ComponentGuid => new Guid("e29b732d-72bc-4734-a520-642bc9b518fb"); + + public void SelectItemUnsafe(int index) + { + if (index < 0 || index >= ListItems.Count) + { + return; + } + + bool flag = false; + int num = ListItems.Count - 1; + for (int i = 0; i <= num; i++) + { + if (i == index) + { + if (!ListItems[i].Selected) + { + flag = true; + break; + } + } + else if (ListItems[i].Selected) + { + flag = true; + break; + } + } + + if (flag) + { + RecordUndoEvent("Select: " + ListItems[index].Name); + int num2 = ListItems.Count - 1; + for (int j = 0; j <= num2; j++) + { + ListItems[j].Selected = j == index; + } + + ExpireSolution(recompute: false); + } + } + } + + internal sealed class TunnyValueListAttributes : GH_ValueListAttributes + { + public TunnyValueListAttributes(GH_ValueList owner) : base(owner) + { + } + + protected override void Render(GH_Canvas canvas, Graphics graphics, GH_CanvasChannel channel) + { + switch (channel) + { + case GH_CanvasChannel.Objects: + DrawObjects(canvas, graphics, channel); + break; + default: + base.Render(canvas, graphics, channel); + break; + } + } + + private void DrawObjects(GH_Canvas canvas, Graphics graphics, GH_CanvasChannel channel) + { + var style = new GH_PaletteStyle(Color.CornflowerBlue, Color.DarkBlue, Color.Black); + GH_PaletteStyle normalStyle = GH_Skin.palette_normal_standard; + GH_PaletteStyle warningStyle = GH_Skin.palette_warning_standard; + GH_PaletteStyle hiddenStyle = GH_Skin.palette_hidden_standard; + GH_Skin.palette_normal_standard = style; + GH_Skin.palette_warning_standard = style; + GH_Skin.palette_hidden_standard = style; + base.Render(canvas, graphics, channel); + GH_Skin.palette_normal_standard = normalStyle; + GH_Skin.palette_warning_standard = warningStyle; + GH_Skin.palette_hidden_standard = hiddenStyle; + } + } +} diff --git a/Tunny/Util/GrasshopperInOut.cs b/Tunny/Util/GrasshopperInOut.cs index 2234345b..b6273951 100644 --- a/Tunny/Util/GrasshopperInOut.cs +++ b/Tunny/Util/GrasshopperInOut.cs @@ -16,6 +16,7 @@ using Rhino.Geometry; using Tunny.Component.Params; +using Tunny.Component.Util; using Tunny.Core.Input; using Tunny.Core.Util; using Tunny.Input; @@ -32,7 +33,7 @@ public class GrasshopperInOut private List _genePool; private GH_FishAttribute _attributes; private List _sliders; - private List _valueLists; + private List _valueLists; public Objective Objectives { get; private set; } public List Variables { get; private set; } @@ -57,7 +58,7 @@ private bool SetVariables() { TLog.MethodStart(); _sliders = new List(); - _valueLists = new List(); + _valueLists = new List(); _genePool = new List(); _inputGuids.AddRange(_component.Params.Input[0].Sources.Select(source => source.InstanceGuid)); @@ -100,7 +101,7 @@ private bool FilterInputVariables() case GalapagosGeneListObject genePool: _genePool.Add(genePool); break; - case GH_ValueList valueList: + case TunnyValueList valueList: _valueLists.Add(valueList); break; case Param_FishEgg fishEgg: @@ -325,7 +326,7 @@ private void SetCategoryValues(string[] categoryParameters) { TLog.MethodStart(); int i = 0; - foreach (GH_ValueList valueList in _valueLists) + foreach (TunnyValueList valueList in _valueLists) { if (valueList == null) { @@ -337,8 +338,7 @@ private void SetCategoryValues(string[] categoryParameters) { return; } - valueList.SelectItem(index); - valueList.ExpireSolution(false); + valueList.SelectItemUnsafe(index); } } From 51c6707212f6d182cd94c85021235acca1e77bb4 Mon Sep 17 00:00:00 2001 From: NATSUME Hiroaki Date: Wed, 8 May 2024 14:06:24 +0900 Subject: [PATCH 04/14] Update optuna library --- CHANGELOG.md | 6 ++++++ Tunny/Lib/requirements.txt | 8 ++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ebb2970..d4c7221e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,12 @@ Please see [here](https://github.com/hrntsm/Tunny/releases) for the data release ## [v0.11.1] -YYYY-MM-DD +### Changed + +- Bump optuna library + - optuna 3.6.0 => 3.6.1 + - optuna-dashboard 0.15.0 => 0.15.1 + ### Fixed - SolutionExpire timing was off when using ValueList. diff --git a/Tunny/Lib/requirements.txt b/Tunny/Lib/requirements.txt index c005f6d7..6053d4f8 100644 --- a/Tunny/Lib/requirements.txt +++ b/Tunny/Lib/requirements.txt @@ -9,7 +9,7 @@ fsspec==2023.12.2 gpytorch==1.11.0 greenlet==2.0.2 jaxtyping==0.2.25 -Jinja2==3.1.3 +Jinja2==3.1.4 joblib==1.3.2 linear-operator==0.5.1 Mako==1.2.4 @@ -19,9 +19,9 @@ multipledispatch==0.6.0 networkx==3.2.1 numpy==1.26.0 opt-einsum==3.3.0 -optuna==3.6.0 +optuna==3.6.1 optuna-integration==3.6.0 -optuna-dashboard==0.15.0 +optuna-dashboard==0.15.1 packaging==23.1 plotly==5.16.1 pyro-api==0.1.2 @@ -35,6 +35,6 @@ sympy==1.12 tenacity==8.2.3 threadpoolctl==3.2.0 torch==2.1.2 -tqdm==4.66.1 +tqdm==4.66.3 typeguard==2.13.3 typing_extensions==4.8.0 From 7509b1ccc0dead20edc412528d06bba5f840bd7a Mon Sep 17 00:00:00 2001 From: NATSUME Hiroaki Date: Wed, 8 May 2024 14:10:10 +0900 Subject: [PATCH 05/14] update test workflow name --- .github/workflows/test-and-coverage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-and-coverage.yml b/.github/workflows/test-and-coverage.yml index 3f709abe..66043363 100644 --- a/.github/workflows/test-and-coverage.yml +++ b/.github/workflows/test-and-coverage.yml @@ -3,7 +3,7 @@ name: test and coverage on: [pull_request] jobs: - build: + test: runs-on: windows-latest steps: From 1f26e444450aa1b6b074afd7da0e7065d1435a5d Mon Sep 17 00:00:00 2001 From: NATSUME Hiroaki Date: Wed, 8 May 2024 17:49:28 +0900 Subject: [PATCH 06/14] Fix categorical example --- .../Grasshopper/categorical_optimization.gh | Bin 14365 -> 14375 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Examples/Grasshopper/categorical_optimization.gh b/Examples/Grasshopper/categorical_optimization.gh index 4fc882363444708bcb03ff5d2888a48a91fb2d85..f36b5cda0c0faf1b447a671a96e68021a1e09fd9 100644 GIT binary patch literal 14375 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 literal 14365 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�C!64t@CN1+mTWHNMKw92MF->8x$Z*gOf4`_K5f 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 XHPH`F)ReRpD Date: Wed, 8 May 2024 18:15:27 +0900 Subject: [PATCH 07/14] Add ignore duplicate sample impl --- Tunny.Core/Handler/ProgressState.cs | 1 + Tunny/Handler/OptimizeLoop.cs | 8 +++-- Tunny/Input/Objective.cs | 13 ++++++-- Tunny/PostProcess/TrialGrasshopperItems.cs | 13 ++++++++ Tunny/Solver/Algorithm.cs | 38 ++++++++++++++++++++-- Tunny/UI/OptimizeWindowTab/OptimizeTab.cs | 5 ++- 6 files changed, 71 insertions(+), 7 deletions(-) diff --git a/Tunny.Core/Handler/ProgressState.cs b/Tunny.Core/Handler/ProgressState.cs index ab6c0d2c..05f988e0 100644 --- a/Tunny.Core/Handler/ProgressState.cs +++ b/Tunny.Core/Handler/ProgressState.cs @@ -13,5 +13,6 @@ public class ProgressState public double[][] BestValues { get; set; } public double HypervolumeRatio { get; set; } public TimeSpan EstimatedTimeRemaining { get; set; } + public bool IsReportOnly { get; set; } } } diff --git a/Tunny/Handler/OptimizeLoop.cs b/Tunny/Handler/OptimizeLoop.cs index 4a6fa0bf..2cd917df 100644 --- a/Tunny/Handler/OptimizeLoop.cs +++ b/Tunny/Handler/OptimizeLoop.cs @@ -71,9 +71,13 @@ private static Parameter[] RunOptimizationLoop(BackgroundWorker worker) private static TrialGrasshopperItems EvaluateFunction(ProgressState pState, int progress) { TLog.MethodStart(); - Component.GrasshopperStatus = GrasshopperStates.RequestSent; - s_worker.ReportProgress(progress, pState); + if (pState.IsReportOnly) + { + return null; + } + + Component.GrasshopperStatus = GrasshopperStates.RequestSent; while (Component.GrasshopperStatus != GrasshopperStates.RequestProcessed) { /*just wait*/ } diff --git a/Tunny/Input/Objective.cs b/Tunny/Input/Objective.cs index 1c920c84..b59624f6 100644 --- a/Tunny/Input/Objective.cs +++ b/Tunny/Input/Objective.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Drawing; using System.Linq; @@ -7,8 +8,6 @@ using Grasshopper.Kernel.Parameters; using Grasshopper.Kernel.Types; -using Python.Runtime; - using Rhino.Geometry; using Tunny.Component.Params; @@ -29,6 +28,16 @@ public class Objective public int Length => Numbers.Length + Images.Length + (Geometries.Length > 0 ? 1 : 0); public int NoNumberLength => Images.Length + (Geometries.Length > 0 ? 1 : 0); + + public Objective(double[] values) + { + TLog.MethodStart(); + Numbers = values; + Images = Array.Empty(); + Geometries = Array.Empty(); + HumanInTheLoopType = HumanInTheLoopType.None; + } + public Objective(List sources) { TLog.MethodStart(); diff --git a/Tunny/PostProcess/TrialGrasshopperItems.cs b/Tunny/PostProcess/TrialGrasshopperItems.cs index 70f79016..01b307e7 100644 --- a/Tunny/PostProcess/TrialGrasshopperItems.cs +++ b/Tunny/PostProcess/TrialGrasshopperItems.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using Tunny.Input; @@ -10,5 +11,17 @@ public class TrialGrasshopperItems public string[] GeometryJson { get; set; } public Dictionary> Attribute { get; set; } public Artifact Artifacts { get; set; } + + public TrialGrasshopperItems() + { + } + + public TrialGrasshopperItems(double[] values) + { + Objectives = new Objective(values); + GeometryJson = Array.Empty(); + Attribute = new Dictionary>(); + Artifacts = new Artifact(); + } } } diff --git a/Tunny/Solver/Algorithm.cs b/Tunny/Solver/Algorithm.cs index 1545b511..24189ce2 100644 --- a/Tunny/Solver/Algorithm.cs +++ b/Tunny/Solver/Algorithm.cs @@ -296,6 +296,7 @@ private TrialGrasshopperItems RunSingleOptimizeStep(OptimizationHandlingInfo opt var result = new TrialGrasshopperItems(); int nullCount = 0; + while (true) { if (optInfo.Preferential != null && !optInfo.Study.should_generate() && !OptimizeLoop.IsForcedStopOptimize) @@ -306,9 +307,19 @@ private TrialGrasshopperItems RunSingleOptimizeStep(OptimizationHandlingInfo opt trial = optInfo.Study.ask(); SetOptimizationParameter(parameter, trial); - ProgressState pState = SetProgressState(optInfo, parameter, trialNum, startTime); - result = EvalFunc(pState, progress); + if (CheckDuplicateSample(trial, out result)) + { + TLog.Info($"Trial {trialNum} is duplicate sample."); + pState.IsReportOnly = true; + EvalFunc(pState, progress); + break; + } + else + { + result = EvalFunc(pState, progress); + } + if (optInfo.HumanSliderInput != null) { optInfo.HumanSliderInput.SaveNote(optInfo.Study, trial, result.Objectives.Images); @@ -339,6 +350,7 @@ private TrialGrasshopperItems RunSingleOptimizeStep(OptimizationHandlingInfo opt { result.Artifacts.UploadArtifacts(optInfo.ArtifactBackend, trial); } + if (result.Attribute.TryGetValue("IsFAIL", out List isFail) && isFail.Contains("True")) { dynamic optuna = Py.Import("optuna"); @@ -364,6 +376,28 @@ private TrialGrasshopperItems RunSingleOptimizeStep(OptimizationHandlingInfo opt return result; } + private static bool CheckDuplicateSample(dynamic trial, out TrialGrasshopperItems result) + { + PyModule ps = Py.CreateScope(); + double[] values; + ps.Exec( + "def check_duplicate(trial):\n" + + " import optuna\n" + + " from optuna.trial import TrialState\n" + + " states_to_consider = (TrialState.COMPLETE,)\n" + + " trials_to_consider = trial.study.get_trials(deepcopy=False, states=states_to_consider)\n" + + " for t in reversed(trials_to_consider):\n" + + " if trial.params == t.params:\n" + + " trial.set_user_attr('NOTE', f'trial {t.number} and trial {trial.number} were duplicate parameters.')\n" + + " return t.values\n" + + " return None\n" + ); + dynamic checkDuplicate = ps.Get("check_duplicate"); + values = checkDuplicate(trial); + result = new TrialGrasshopperItems(values); + return values != null; + } + private void SetOptimizationParameter(Parameter[] parameter, dynamic trial) { TLog.MethodStart(); diff --git a/Tunny/UI/OptimizeWindowTab/OptimizeTab.cs b/Tunny/UI/OptimizeWindowTab/OptimizeTab.cs index 91721efd..9cf750eb 100644 --- a/Tunny/UI/OptimizeWindowTab/OptimizeTab.cs +++ b/Tunny/UI/OptimizeWindowTab/OptimizeTab.cs @@ -242,7 +242,10 @@ private void OptimizeProgressChangedHandler(object sender, ProgressChangedEventA { TLog.MethodStart(); var pState = (ProgressState)e.UserState; - _component.UpdateGrasshopper(pState.Parameter); + if (!pState.IsReportOnly) + { + _component.UpdateGrasshopper(pState.Parameter); + } const string trialNumLabel = "Trial: "; optimizeTrialNumLabel.Text = e.ProgressPercentage == 100 ? trialNumLabel + "#" From 141a254fffd3a7cd7c8ee1b997e37c6f3e9eba88 Mon Sep 17 00:00:00 2001 From: NATSUME Hiroaki Date: Wed, 8 May 2024 18:54:44 +0900 Subject: [PATCH 08/14] Add ignore ui --- Tunny.Core/Settings/Optimize.cs | 1 + Tunny/Solver/Algorithm.cs | 4 +- Tunny/UI/OptimizationWindow.Designer.cs | 769 ++++++++++++---------- Tunny/UI/OptimizationWindow.cs | 3 + Tunny/UI/OptimizeWindowTab/SettingsTab.cs | 6 + 5 files changed, 440 insertions(+), 343 deletions(-) diff --git a/Tunny.Core/Settings/Optimize.cs b/Tunny.Core/Settings/Optimize.cs index 108c4554..66776d17 100644 --- a/Tunny.Core/Settings/Optimize.cs +++ b/Tunny.Core/Settings/Optimize.cs @@ -13,5 +13,6 @@ public class Optimize public double Timeout { get; set; } public GcAfterTrial GcAfterTrial { get; set; } = GcAfterTrial.HasGeometry; public bool ShowRealtimeResult { get; set; } + public bool IgnoreDuplicateSampling { get; set; } } } diff --git a/Tunny/Solver/Algorithm.cs b/Tunny/Solver/Algorithm.cs index 24189ce2..5f28a437 100644 --- a/Tunny/Solver/Algorithm.cs +++ b/Tunny/Solver/Algorithm.cs @@ -308,7 +308,7 @@ private TrialGrasshopperItems RunSingleOptimizeStep(OptimizationHandlingInfo opt trial = optInfo.Study.ask(); SetOptimizationParameter(parameter, trial); ProgressState pState = SetProgressState(optInfo, parameter, trialNum, startTime); - if (CheckDuplicateSample(trial, out result)) + if (Settings.Optimize.IgnoreDuplicateSampling && IsSampleDuplicate(trial, out result)) { TLog.Info($"Trial {trialNum} is duplicate sample."); pState.IsReportOnly = true; @@ -376,7 +376,7 @@ private TrialGrasshopperItems RunSingleOptimizeStep(OptimizationHandlingInfo opt return result; } - private static bool CheckDuplicateSample(dynamic trial, out TrialGrasshopperItems result) + private static bool IsSampleDuplicate(dynamic trial, out TrialGrasshopperItems result) { PyModule ps = Py.CreateScope(); double[] values; diff --git a/Tunny/UI/OptimizationWindow.Designer.cs b/Tunny/UI/OptimizationWindow.Designer.cs index 3bab8de5..4bc20f77 100644 --- a/Tunny/UI/OptimizationWindow.Designer.cs +++ b/Tunny/UI/OptimizationWindow.Designer.cs @@ -156,6 +156,7 @@ private void InitializeComponent() this.qmcScrambleCheckBox = new System.Windows.Forms.CheckBox(); this.qmcWarnIndependentSamplingCheckBox = new System.Windows.Forms.CheckBox(); this.Misc = new System.Windows.Forms.TabPage(); + this.ignoreDuplicateSamplingCheckBox = new System.Windows.Forms.CheckBox(); this.miscLogComboBox = new System.Windows.Forms.ComboBox(); this.miscLogLevelLabel = new System.Windows.Forms.Label(); this.checkPythonLibrariesCheckBox = new System.Windows.Forms.CheckBox(); @@ -216,10 +217,10 @@ private void InitializeComponent() // // optimizeRunButton // - this.optimizeRunButton.Location = new System.Drawing.Point(48, 296); - this.optimizeRunButton.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.optimizeRunButton.Location = new System.Drawing.Point(32, 197); + this.optimizeRunButton.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.optimizeRunButton.Name = "optimizeRunButton"; - this.optimizeRunButton.Size = new System.Drawing.Size(153, 34); + this.optimizeRunButton.Size = new System.Drawing.Size(102, 23); this.optimizeRunButton.TabIndex = 0; this.optimizeRunButton.Text = "RunOptimize"; this.optimizeRunButton.UseVisualStyleBackColor = true; @@ -228,10 +229,10 @@ private void InitializeComponent() // optimizeStopButton // this.optimizeStopButton.Enabled = false; - this.optimizeStopButton.Location = new System.Drawing.Point(246, 296); - this.optimizeStopButton.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.optimizeStopButton.Location = new System.Drawing.Point(164, 197); + this.optimizeStopButton.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.optimizeStopButton.Name = "optimizeStopButton"; - this.optimizeStopButton.Size = new System.Drawing.Size(126, 34); + this.optimizeStopButton.Size = new System.Drawing.Size(84, 23); this.optimizeStopButton.TabIndex = 1; this.optimizeStopButton.Text = "Stop"; this.optimizeStopButton.UseVisualStyleBackColor = true; @@ -239,15 +240,15 @@ private void InitializeComponent() // // nTrialNumUpDown // - this.nTrialNumUpDown.Location = new System.Drawing.Point(246, 52); - this.nTrialNumUpDown.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.nTrialNumUpDown.Location = new System.Drawing.Point(164, 35); + this.nTrialNumUpDown.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.nTrialNumUpDown.Maximum = new decimal(new int[] { 10000, 0, 0, 0}); this.nTrialNumUpDown.Name = "nTrialNumUpDown"; - this.nTrialNumUpDown.Size = new System.Drawing.Size(165, 30); + this.nTrialNumUpDown.Size = new System.Drawing.Size(110, 23); this.nTrialNumUpDown.TabIndex = 2; this.nTrialNumUpDown.ThousandsSeparator = true; this.nTrialNumUpDown.Value = new decimal(new int[] { @@ -259,20 +260,19 @@ private void InitializeComponent() // nTrialText // this.nTrialText.AutoSize = true; - this.nTrialText.Location = new System.Drawing.Point(15, 56); - this.nTrialText.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.nTrialText.Location = new System.Drawing.Point(10, 37); this.nTrialText.Name = "nTrialText"; - this.nTrialText.Size = new System.Drawing.Size(151, 23); + this.nTrialText.Size = new System.Drawing.Size(102, 15); this.nTrialText.TabIndex = 3; this.nTrialText.Text = "Number of trials"; // // continueStudyCheckBox // this.continueStudyCheckBox.AutoSize = true; - this.continueStudyCheckBox.Location = new System.Drawing.Point(164, 72); - this.continueStudyCheckBox.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.continueStudyCheckBox.Location = new System.Drawing.Point(109, 48); + this.continueStudyCheckBox.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.continueStudyCheckBox.Name = "continueStudyCheckBox"; - this.continueStudyCheckBox.Size = new System.Drawing.Size(114, 27); + this.continueStudyCheckBox.Size = new System.Drawing.Size(77, 19); this.continueStudyCheckBox.TabIndex = 5; this.continueStudyCheckBox.Text = "Continue"; this.continueStudyCheckBox.UseVisualStyleBackColor = true; @@ -280,10 +280,10 @@ private void InitializeComponent() // // optimizeProgressBar // - this.optimizeProgressBar.Location = new System.Drawing.Point(20, 340); - this.optimizeProgressBar.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.optimizeProgressBar.Location = new System.Drawing.Point(13, 227); + this.optimizeProgressBar.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.optimizeProgressBar.Name = "optimizeProgressBar"; - this.optimizeProgressBar.Size = new System.Drawing.Size(388, 24); + this.optimizeProgressBar.Size = new System.Drawing.Size(259, 16); this.optimizeProgressBar.TabIndex = 6; // // samplerComboBox @@ -299,38 +299,36 @@ private void InitializeComponent() "EvolutionStrategy (CMA-ES)", "Quasi-MonteCarlo", "Random"}); - this.samplerComboBox.Location = new System.Drawing.Point(104, 14); - this.samplerComboBox.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.samplerComboBox.Location = new System.Drawing.Point(69, 9); + this.samplerComboBox.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.samplerComboBox.Name = "samplerComboBox"; - this.samplerComboBox.Size = new System.Drawing.Size(306, 28); + this.samplerComboBox.Size = new System.Drawing.Size(205, 22); this.samplerComboBox.TabIndex = 7; // // samplerTypeText // this.samplerTypeText.AutoSize = true; - this.samplerTypeText.Location = new System.Drawing.Point(15, 16); - this.samplerTypeText.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.samplerTypeText.Location = new System.Drawing.Point(10, 11); this.samplerTypeText.Name = "samplerTypeText"; - this.samplerTypeText.Size = new System.Drawing.Size(81, 23); + this.samplerTypeText.Size = new System.Drawing.Size(56, 15); this.samplerTypeText.TabIndex = 8; this.samplerTypeText.Text = "Sampler"; // // studyNameLabel // this.studyNameLabel.AutoSize = true; - this.studyNameLabel.Location = new System.Drawing.Point(8, 30); - this.studyNameLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.studyNameLabel.Location = new System.Drawing.Point(5, 20); this.studyNameLabel.Name = "studyNameLabel"; - this.studyNameLabel.Size = new System.Drawing.Size(166, 23); + this.studyNameLabel.Size = new System.Drawing.Size(114, 15); this.studyNameLabel.TabIndex = 9; this.studyNameLabel.Text = "Create New Study"; // // studyNameTextBox // - this.studyNameTextBox.Location = new System.Drawing.Point(202, 30); - this.studyNameTextBox.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.studyNameTextBox.Location = new System.Drawing.Point(135, 20); + this.studyNameTextBox.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.studyNameTextBox.Name = "studyNameTextBox"; - this.studyNameTextBox.Size = new System.Drawing.Size(180, 30); + this.studyNameTextBox.Size = new System.Drawing.Size(121, 23); this.studyNameTextBox.TabIndex = 10; this.studyNameTextBox.Text = "study1"; // @@ -341,11 +339,11 @@ private void InitializeComponent() this.optimizeTabControl.Controls.Add(this.outputTabPage); this.optimizeTabControl.Controls.Add(this.settingsTabPage); this.optimizeTabControl.Controls.Add(this.fileTabPage); - this.optimizeTabControl.Location = new System.Drawing.Point(0, -2); - this.optimizeTabControl.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.optimizeTabControl.Location = new System.Drawing.Point(0, -1); + this.optimizeTabControl.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.optimizeTabControl.Name = "optimizeTabControl"; this.optimizeTabControl.SelectedIndex = 0; - this.optimizeTabControl.Size = new System.Drawing.Size(436, 478); + this.optimizeTabControl.Size = new System.Drawing.Size(291, 319); this.optimizeTabControl.TabIndex = 11; // // optimizeTabPage @@ -364,11 +362,11 @@ private void InitializeComponent() this.optimizeTabPage.Controls.Add(this.nTrialNumUpDown); this.optimizeTabPage.Controls.Add(this.optimizeProgressBar); this.optimizeTabPage.Controls.Add(this.nTrialText); - this.optimizeTabPage.Location = new System.Drawing.Point(4, 32); - this.optimizeTabPage.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.optimizeTabPage.Location = new System.Drawing.Point(4, 24); + this.optimizeTabPage.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.optimizeTabPage.Name = "optimizeTabPage"; - this.optimizeTabPage.Padding = new System.Windows.Forms.Padding(4, 6, 4, 6); - this.optimizeTabPage.Size = new System.Drawing.Size(428, 442); + this.optimizeTabPage.Padding = new System.Windows.Forms.Padding(3, 4, 3, 4); + this.optimizeTabPage.Size = new System.Drawing.Size(283, 291); this.optimizeTabPage.TabIndex = 0; this.optimizeTabPage.Text = "Optimize"; this.optimizeTabPage.UseVisualStyleBackColor = true; @@ -376,9 +374,10 @@ private void InitializeComponent() // ShowRealtimeResultCheckBox // this.ShowRealtimeResultCheckBox.AutoSize = true; - this.ShowRealtimeResultCheckBox.Location = new System.Drawing.Point(141, 382); + this.ShowRealtimeResultCheckBox.Location = new System.Drawing.Point(94, 255); + this.ShowRealtimeResultCheckBox.Margin = new System.Windows.Forms.Padding(2); this.ShowRealtimeResultCheckBox.Name = "ShowRealtimeResultCheckBox"; - this.ShowRealtimeResultCheckBox.Size = new System.Drawing.Size(22, 21); + this.ShowRealtimeResultCheckBox.Size = new System.Drawing.Size(15, 14); this.ShowRealtimeResultCheckBox.TabIndex = 17; this.toolTip1.SetToolTip(this.ShowRealtimeResultCheckBox, "Enable real-time display of BestValue during optimization.\r\nIf enabled, optimizat" + "ion will slow down as the number of trials increases."); @@ -387,27 +386,30 @@ private void InitializeComponent() // EstimatedTimeRemainingLabel // this.EstimatedTimeRemainingLabel.AutoSize = true; - this.EstimatedTimeRemainingLabel.Location = new System.Drawing.Point(21, 411); + this.EstimatedTimeRemainingLabel.Location = new System.Drawing.Point(14, 274); + this.EstimatedTimeRemainingLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.EstimatedTimeRemainingLabel.Name = "EstimatedTimeRemainingLabel"; - this.EstimatedTimeRemainingLabel.Size = new System.Drawing.Size(272, 23); + this.EstimatedTimeRemainingLabel.Size = new System.Drawing.Size(184, 15); this.EstimatedTimeRemainingLabel.TabIndex = 16; this.EstimatedTimeRemainingLabel.Text = "Estimated Time Remaining: #"; // // optimizeBestValueLabel // this.optimizeBestValueLabel.AutoSize = true; - this.optimizeBestValueLabel.Location = new System.Drawing.Point(170, 380); + this.optimizeBestValueLabel.Location = new System.Drawing.Point(113, 253); + this.optimizeBestValueLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.optimizeBestValueLabel.Name = "optimizeBestValueLabel"; - this.optimizeBestValueLabel.Size = new System.Drawing.Size(129, 23); + this.optimizeBestValueLabel.Size = new System.Drawing.Size(87, 15); this.optimizeBestValueLabel.TabIndex = 15; this.optimizeBestValueLabel.Text = "BestValue: # "; // // optimizeTrialNumLabel // this.optimizeTrialNumLabel.AutoSize = true; - this.optimizeTrialNumLabel.Location = new System.Drawing.Point(21, 380); + this.optimizeTrialNumLabel.Location = new System.Drawing.Point(14, 253); + this.optimizeTrialNumLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.optimizeTrialNumLabel.Name = "optimizeTrialNumLabel"; - this.optimizeTrialNumLabel.Size = new System.Drawing.Size(80, 23); + this.optimizeTrialNumLabel.Size = new System.Drawing.Size(55, 15); this.optimizeTrialNumLabel.TabIndex = 14; this.optimizeTrialNumLabel.Text = "Trial: # "; // @@ -420,9 +422,11 @@ private void InitializeComponent() this.groupBox2.Controls.Add(this.studyNameLabel); this.groupBox2.Controls.Add(this.continueStudyCheckBox); this.groupBox2.Controls.Add(this.studyNameTextBox); - this.groupBox2.Location = new System.Drawing.Point(20, 134); + this.groupBox2.Location = new System.Drawing.Point(13, 89); + this.groupBox2.Margin = new System.Windows.Forms.Padding(2); this.groupBox2.Name = "groupBox2"; - this.groupBox2.Size = new System.Drawing.Size(390, 153); + this.groupBox2.Padding = new System.Windows.Forms.Padding(2); + this.groupBox2.Size = new System.Drawing.Size(260, 102); this.groupBox2.TabIndex = 13; this.groupBox2.TabStop = false; this.groupBox2.Text = "Study Name"; @@ -430,10 +434,10 @@ private void InitializeComponent() // inMemoryCheckBox // this.inMemoryCheckBox.AutoSize = true; - this.inMemoryCheckBox.Location = new System.Drawing.Point(12, 69); - this.inMemoryCheckBox.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.inMemoryCheckBox.Location = new System.Drawing.Point(8, 46); + this.inMemoryCheckBox.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.inMemoryCheckBox.Name = "inMemoryCheckBox"; - this.inMemoryCheckBox.Size = new System.Drawing.Size(124, 27); + this.inMemoryCheckBox.Size = new System.Drawing.Size(86, 19); this.inMemoryCheckBox.TabIndex = 15; this.inMemoryCheckBox.Text = "InMemory"; this.inMemoryCheckBox.UseVisualStyleBackColor = true; @@ -442,26 +446,29 @@ private void InitializeComponent() // existedStudyNameLabel // this.existedStudyNameLabel.AutoSize = true; - this.existedStudyNameLabel.Location = new System.Drawing.Point(8, 111); + this.existedStudyNameLabel.Location = new System.Drawing.Point(5, 74); + this.existedStudyNameLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.existedStudyNameLabel.Name = "existedStudyNameLabel"; - this.existedStudyNameLabel.Size = new System.Drawing.Size(135, 23); + this.existedStudyNameLabel.Size = new System.Drawing.Size(90, 15); this.existedStudyNameLabel.TabIndex = 14; this.existedStudyNameLabel.Text = "Existing Study"; // // existingStudyComboBox // this.existingStudyComboBox.FormattingEnabled = true; - this.existingStudyComboBox.Location = new System.Drawing.Point(202, 108); + this.existingStudyComboBox.Location = new System.Drawing.Point(135, 72); + this.existingStudyComboBox.Margin = new System.Windows.Forms.Padding(2); this.existingStudyComboBox.Name = "existingStudyComboBox"; - this.existingStudyComboBox.Size = new System.Drawing.Size(180, 31); + this.existingStudyComboBox.Size = new System.Drawing.Size(121, 23); this.existingStudyComboBox.TabIndex = 13; // // copyStudyCheckBox // this.copyStudyCheckBox.AutoSize = true; - this.copyStudyCheckBox.Location = new System.Drawing.Point(304, 72); + this.copyStudyCheckBox.Location = new System.Drawing.Point(203, 48); + this.copyStudyCheckBox.Margin = new System.Windows.Forms.Padding(2); this.copyStudyCheckBox.Name = "copyStudyCheckBox"; - this.copyStudyCheckBox.Size = new System.Drawing.Size(80, 27); + this.copyStudyCheckBox.Size = new System.Drawing.Size(55, 19); this.copyStudyCheckBox.TabIndex = 12; this.copyStudyCheckBox.Text = "Copy"; this.copyStudyCheckBox.UseVisualStyleBackColor = true; @@ -469,15 +476,15 @@ private void InitializeComponent() // // timeoutNumUpDown // - this.timeoutNumUpDown.Location = new System.Drawing.Point(246, 94); - this.timeoutNumUpDown.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.timeoutNumUpDown.Location = new System.Drawing.Point(164, 63); + this.timeoutNumUpDown.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.timeoutNumUpDown.Maximum = new decimal(new int[] { 10000000, 0, 0, 0}); this.timeoutNumUpDown.Name = "timeoutNumUpDown"; - this.timeoutNumUpDown.Size = new System.Drawing.Size(164, 30); + this.timeoutNumUpDown.Size = new System.Drawing.Size(109, 23); this.timeoutNumUpDown.TabIndex = 12; this.timeoutNumUpDown.ThousandsSeparator = true; this.toolTip1.SetToolTip(this.timeoutNumUpDown, "After this time has elapsed, optimization stops.\r\nIf 0 is entered, no stop by tim" + @@ -486,10 +493,9 @@ private void InitializeComponent() // Timeout // this.Timeout.AutoSize = true; - this.Timeout.Location = new System.Drawing.Point(15, 94); - this.Timeout.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.Timeout.Location = new System.Drawing.Point(10, 63); this.Timeout.Name = "Timeout"; - this.Timeout.Size = new System.Drawing.Size(132, 23); + this.Timeout.Size = new System.Drawing.Size(89, 15); this.Timeout.TabIndex = 11; this.Timeout.Text = "Timeout (sec)"; // @@ -509,11 +515,11 @@ private void InitializeComponent() this.visualizeTabPage.Controls.Add(this.visualizeNumClusterLabel); this.visualizeTabPage.Controls.Add(this.visualizeShowPlotButton); this.visualizeTabPage.Controls.Add(this.visualizeSavePlotButton); - this.visualizeTabPage.Location = new System.Drawing.Point(4, 32); - this.visualizeTabPage.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.visualizeTabPage.Location = new System.Drawing.Point(4, 24); + this.visualizeTabPage.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.visualizeTabPage.Name = "visualizeTabPage"; - this.visualizeTabPage.Padding = new System.Windows.Forms.Padding(4, 6, 4, 6); - this.visualizeTabPage.Size = new System.Drawing.Size(428, 442); + this.visualizeTabPage.Padding = new System.Windows.Forms.Padding(3, 4, 3, 4); + this.visualizeTabPage.Size = new System.Drawing.Size(283, 291); this.visualizeTabPage.TabIndex = 1; this.visualizeTabPage.Text = "Visualize"; this.visualizeTabPage.UseVisualStyleBackColor = true; @@ -524,9 +530,10 @@ private void InitializeComponent() this.visualizeIncludeDominatedCheckBox.Checked = true; this.visualizeIncludeDominatedCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; this.visualizeIncludeDominatedCheckBox.Enabled = false; - this.visualizeIncludeDominatedCheckBox.Location = new System.Drawing.Point(26, 404); + this.visualizeIncludeDominatedCheckBox.Location = new System.Drawing.Point(17, 269); + this.visualizeIncludeDominatedCheckBox.Margin = new System.Windows.Forms.Padding(2); this.visualizeIncludeDominatedCheckBox.Name = "visualizeIncludeDominatedCheckBox"; - this.visualizeIncludeDominatedCheckBox.Size = new System.Drawing.Size(380, 27); + this.visualizeIncludeDominatedCheckBox.Size = new System.Drawing.Size(255, 19); this.visualizeIncludeDominatedCheckBox.TabIndex = 27; this.visualizeIncludeDominatedCheckBox.Text = "Include dominated trials in pareto front"; this.visualizeIncludeDominatedCheckBox.UseVisualStyleBackColor = true; @@ -534,38 +541,42 @@ private void InitializeComponent() // visualizeTypeLabel // this.visualizeTypeLabel.AutoSize = true; - this.visualizeTypeLabel.Location = new System.Drawing.Point(22, 110); + this.visualizeTypeLabel.Location = new System.Drawing.Point(15, 73); + this.visualizeTypeLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.visualizeTypeLabel.Name = "visualizeTypeLabel"; - this.visualizeTypeLabel.Size = new System.Drawing.Size(132, 23); + this.visualizeTypeLabel.Size = new System.Drawing.Size(89, 15); this.visualizeTypeLabel.TabIndex = 22; this.visualizeTypeLabel.Text = "Visualize Type"; // // visualizeTargetStudyNameLabel // this.visualizeTargetStudyNameLabel.AutoSize = true; - this.visualizeTargetStudyNameLabel.Location = new System.Drawing.Point(22, 62); + this.visualizeTargetStudyNameLabel.Location = new System.Drawing.Point(15, 41); + this.visualizeTargetStudyNameLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.visualizeTargetStudyNameLabel.Name = "visualizeTargetStudyNameLabel"; - this.visualizeTargetStudyNameLabel.Size = new System.Drawing.Size(120, 23); + this.visualizeTargetStudyNameLabel.Size = new System.Drawing.Size(83, 15); this.visualizeTargetStudyNameLabel.TabIndex = 21; this.visualizeTargetStudyNameLabel.Text = "Target Study"; // // visualizeObjectiveListBox // this.visualizeObjectiveListBox.FormattingEnabled = true; - this.visualizeObjectiveListBox.ItemHeight = 23; - this.visualizeObjectiveListBox.Location = new System.Drawing.Point(222, 200); + this.visualizeObjectiveListBox.ItemHeight = 15; + this.visualizeObjectiveListBox.Location = new System.Drawing.Point(148, 133); + this.visualizeObjectiveListBox.Margin = new System.Windows.Forms.Padding(2); this.visualizeObjectiveListBox.Name = "visualizeObjectiveListBox"; this.visualizeObjectiveListBox.ScrollAlwaysVisible = true; this.visualizeObjectiveListBox.SelectionMode = System.Windows.Forms.SelectionMode.MultiSimple; - this.visualizeObjectiveListBox.Size = new System.Drawing.Size(190, 73); + this.visualizeObjectiveListBox.Size = new System.Drawing.Size(128, 49); this.visualizeObjectiveListBox.TabIndex = 26; // // visualizeTargetStudyComboBox // this.visualizeTargetStudyComboBox.FormattingEnabled = true; - this.visualizeTargetStudyComboBox.Location = new System.Drawing.Point(184, 58); + this.visualizeTargetStudyComboBox.Location = new System.Drawing.Point(123, 39); + this.visualizeTargetStudyComboBox.Margin = new System.Windows.Forms.Padding(2); this.visualizeTargetStudyComboBox.Name = "visualizeTargetStudyComboBox"; - this.visualizeTargetStudyComboBox.Size = new System.Drawing.Size(216, 31); + this.visualizeTargetStudyComboBox.Size = new System.Drawing.Size(145, 23); this.visualizeTargetStudyComboBox.TabIndex = 20; this.visualizeTargetStudyComboBox.SelectedIndexChanged += new System.EventHandler(this.VisualizeTargetStudy_Changed); // @@ -582,44 +593,47 @@ private void InitializeComponent() "slice", "hypervolume", "clustering"}); - this.visualizeTypeComboBox.Location = new System.Drawing.Point(184, 110); - this.visualizeTypeComboBox.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.visualizeTypeComboBox.Location = new System.Drawing.Point(123, 73); + this.visualizeTypeComboBox.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.visualizeTypeComboBox.Name = "visualizeTypeComboBox"; - this.visualizeTypeComboBox.Size = new System.Drawing.Size(216, 31); + this.visualizeTypeComboBox.Size = new System.Drawing.Size(145, 23); this.visualizeTypeComboBox.TabIndex = 0; this.visualizeTypeComboBox.SelectedIndexChanged += new System.EventHandler(this.VisualizeType_Changed); // // visualizeVariableListBox // this.visualizeVariableListBox.FormattingEnabled = true; - this.visualizeVariableListBox.ItemHeight = 23; - this.visualizeVariableListBox.Location = new System.Drawing.Point(26, 200); + this.visualizeVariableListBox.ItemHeight = 15; + this.visualizeVariableListBox.Location = new System.Drawing.Point(17, 133); + this.visualizeVariableListBox.Margin = new System.Windows.Forms.Padding(2); this.visualizeVariableListBox.Name = "visualizeVariableListBox"; this.visualizeVariableListBox.ScrollAlwaysVisible = true; this.visualizeVariableListBox.SelectionMode = System.Windows.Forms.SelectionMode.MultiSimple; - this.visualizeVariableListBox.Size = new System.Drawing.Size(190, 73); + this.visualizeVariableListBox.Size = new System.Drawing.Size(128, 49); this.visualizeVariableListBox.TabIndex = 25; // // visualizeTargetVariableLabel // this.visualizeTargetVariableLabel.AutoSize = true; - this.visualizeTargetVariableLabel.Location = new System.Drawing.Point(218, 162); + this.visualizeTargetVariableLabel.Location = new System.Drawing.Point(145, 108); + this.visualizeTargetVariableLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.visualizeTargetVariableLabel.Name = "visualizeTargetVariableLabel"; - this.visualizeTargetVariableLabel.Size = new System.Drawing.Size(139, 23); + this.visualizeTargetVariableLabel.Size = new System.Drawing.Size(95, 15); this.visualizeTargetVariableLabel.TabIndex = 24; this.visualizeTargetVariableLabel.Text = "Target Variable"; // // visualizeClusterNumUpDown // this.visualizeClusterNumUpDown.Enabled = false; - this.visualizeClusterNumUpDown.Location = new System.Drawing.Point(308, 358); + this.visualizeClusterNumUpDown.Location = new System.Drawing.Point(205, 239); + this.visualizeClusterNumUpDown.Margin = new System.Windows.Forms.Padding(2); this.visualizeClusterNumUpDown.Minimum = new decimal(new int[] { 1, 0, 0, 0}); this.visualizeClusterNumUpDown.Name = "visualizeClusterNumUpDown"; - this.visualizeClusterNumUpDown.Size = new System.Drawing.Size(93, 30); + this.visualizeClusterNumUpDown.Size = new System.Drawing.Size(62, 23); this.visualizeClusterNumUpDown.TabIndex = 13; this.visualizeClusterNumUpDown.Value = new decimal(new int[] { 3, @@ -630,18 +644,18 @@ private void InitializeComponent() // visualizeTargetObjectiveLabel // this.visualizeTargetObjectiveLabel.AutoSize = true; - this.visualizeTargetObjectiveLabel.Location = new System.Drawing.Point(22, 162); + this.visualizeTargetObjectiveLabel.Location = new System.Drawing.Point(15, 108); + this.visualizeTargetObjectiveLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.visualizeTargetObjectiveLabel.Name = "visualizeTargetObjectiveLabel"; - this.visualizeTargetObjectiveLabel.Size = new System.Drawing.Size(152, 23); + this.visualizeTargetObjectiveLabel.Size = new System.Drawing.Size(104, 15); this.visualizeTargetObjectiveLabel.TabIndex = 23; this.visualizeTargetObjectiveLabel.Text = "Target Objective"; // // dashboardButton // - this.dashboardButton.Location = new System.Drawing.Point(81, 10); - this.dashboardButton.Margin = new System.Windows.Forms.Padding(4); + this.dashboardButton.Location = new System.Drawing.Point(54, 7); this.dashboardButton.Name = "dashboardButton"; - this.dashboardButton.Size = new System.Drawing.Size(267, 33); + this.dashboardButton.Size = new System.Drawing.Size(178, 22); this.dashboardButton.TabIndex = 11; this.dashboardButton.Text = "Open Optuna-Dashboard"; this.dashboardButton.UseVisualStyleBackColor = true; @@ -650,18 +664,19 @@ private void InitializeComponent() // visualizeNumClusterLabel // this.visualizeNumClusterLabel.AutoSize = true; - this.visualizeNumClusterLabel.Location = new System.Drawing.Point(22, 366); + this.visualizeNumClusterLabel.Location = new System.Drawing.Point(15, 244); + this.visualizeNumClusterLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.visualizeNumClusterLabel.Name = "visualizeNumClusterLabel"; - this.visualizeNumClusterLabel.Size = new System.Drawing.Size(166, 23); + this.visualizeNumClusterLabel.Size = new System.Drawing.Size(112, 15); this.visualizeNumClusterLabel.TabIndex = 14; this.visualizeNumClusterLabel.Text = "Number of cluster"; // // visualizeShowPlotButton // - this.visualizeShowPlotButton.Location = new System.Drawing.Point(36, 304); - this.visualizeShowPlotButton.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.visualizeShowPlotButton.Location = new System.Drawing.Point(24, 203); + this.visualizeShowPlotButton.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.visualizeShowPlotButton.Name = "visualizeShowPlotButton"; - this.visualizeShowPlotButton.Size = new System.Drawing.Size(165, 34); + this.visualizeShowPlotButton.Size = new System.Drawing.Size(110, 23); this.visualizeShowPlotButton.TabIndex = 2; this.visualizeShowPlotButton.Text = "Show"; this.visualizeShowPlotButton.UseVisualStyleBackColor = true; @@ -669,9 +684,10 @@ private void InitializeComponent() // // visualizeSavePlotButton // - this.visualizeSavePlotButton.Location = new System.Drawing.Point(236, 304); + this.visualizeSavePlotButton.Location = new System.Drawing.Point(157, 203); + this.visualizeSavePlotButton.Margin = new System.Windows.Forms.Padding(2); this.visualizeSavePlotButton.Name = "visualizeSavePlotButton"; - this.visualizeSavePlotButton.Size = new System.Drawing.Size(165, 34); + this.visualizeSavePlotButton.Size = new System.Drawing.Size(110, 23); this.visualizeSavePlotButton.TabIndex = 3; this.visualizeSavePlotButton.Text = "Save"; this.visualizeSavePlotButton.UseVisualStyleBackColor = true; @@ -686,10 +702,11 @@ private void InitializeComponent() this.outputTabPage.Controls.Add(this.outputParatoSolutionButton); this.outputTabPage.Controls.Add(this.outputStopButton); this.outputTabPage.Controls.Add(this.outputProgressBar); - this.outputTabPage.Location = new System.Drawing.Point(4, 32); + this.outputTabPage.Location = new System.Drawing.Point(4, 24); + this.outputTabPage.Margin = new System.Windows.Forms.Padding(2); this.outputTabPage.Name = "outputTabPage"; - this.outputTabPage.Padding = new System.Windows.Forms.Padding(3); - this.outputTabPage.Size = new System.Drawing.Size(428, 442); + this.outputTabPage.Padding = new System.Windows.Forms.Padding(2); + this.outputTabPage.Size = new System.Drawing.Size(283, 291); this.outputTabPage.TabIndex = 3; this.outputTabPage.Text = "Output"; this.outputTabPage.UseVisualStyleBackColor = true; @@ -699,28 +716,28 @@ private void InitializeComponent() this.outputUseModelNumberGroupBox.Controls.Add(this.outputModelNumTextBox); this.outputUseModelNumberGroupBox.Controls.Add(this.outputModelNumberButton); this.outputUseModelNumberGroupBox.Controls.Add(this.reflectToSliderButton); - this.outputUseModelNumberGroupBox.Location = new System.Drawing.Point(8, 146); + this.outputUseModelNumberGroupBox.Location = new System.Drawing.Point(5, 97); + this.outputUseModelNumberGroupBox.Margin = new System.Windows.Forms.Padding(2); this.outputUseModelNumberGroupBox.Name = "outputUseModelNumberGroupBox"; - this.outputUseModelNumberGroupBox.Size = new System.Drawing.Size(393, 202); + this.outputUseModelNumberGroupBox.Padding = new System.Windows.Forms.Padding(2); + this.outputUseModelNumberGroupBox.Size = new System.Drawing.Size(262, 135); this.outputUseModelNumberGroupBox.TabIndex = 21; this.outputUseModelNumberGroupBox.TabStop = false; this.outputUseModelNumberGroupBox.Text = "Use Model Number"; // // outputModelNumTextBox // - this.outputModelNumTextBox.Location = new System.Drawing.Point(21, 45); - this.outputModelNumTextBox.Margin = new System.Windows.Forms.Padding(4); + this.outputModelNumTextBox.Location = new System.Drawing.Point(14, 30); this.outputModelNumTextBox.Name = "outputModelNumTextBox"; - this.outputModelNumTextBox.Size = new System.Drawing.Size(360, 30); + this.outputModelNumTextBox.Size = new System.Drawing.Size(241, 23); this.outputModelNumTextBox.TabIndex = 12; this.outputModelNumTextBox.Text = "0"; // // outputModelNumberButton // - this.outputModelNumberButton.Location = new System.Drawing.Point(206, 94); - this.outputModelNumberButton.Margin = new System.Windows.Forms.Padding(4); + this.outputModelNumberButton.Location = new System.Drawing.Point(137, 63); this.outputModelNumberButton.Name = "outputModelNumberButton"; - this.outputModelNumberButton.Size = new System.Drawing.Size(176, 82); + this.outputModelNumberButton.Size = new System.Drawing.Size(117, 55); this.outputModelNumberButton.TabIndex = 13; this.outputModelNumberButton.Text = "Output the above number models"; this.outputModelNumberButton.UseVisualStyleBackColor = true; @@ -728,10 +745,9 @@ private void InitializeComponent() // // reflectToSliderButton // - this.reflectToSliderButton.Location = new System.Drawing.Point(21, 94); - this.reflectToSliderButton.Margin = new System.Windows.Forms.Padding(4); + this.reflectToSliderButton.Location = new System.Drawing.Point(14, 63); this.reflectToSliderButton.Name = "reflectToSliderButton"; - this.reflectToSliderButton.Size = new System.Drawing.Size(176, 82); + this.reflectToSliderButton.Size = new System.Drawing.Size(117, 55); this.reflectToSliderButton.TabIndex = 16; this.reflectToSliderButton.Text = "Reflect the result on the sliders"; this.reflectToSliderButton.UseVisualStyleBackColor = true; @@ -740,26 +756,27 @@ private void InitializeComponent() // outputTargetStudyComboBox // this.outputTargetStudyComboBox.FormattingEnabled = true; - this.outputTargetStudyComboBox.Location = new System.Drawing.Point(170, 24); + this.outputTargetStudyComboBox.Location = new System.Drawing.Point(113, 16); + this.outputTargetStudyComboBox.Margin = new System.Windows.Forms.Padding(2); this.outputTargetStudyComboBox.Name = "outputTargetStudyComboBox"; - this.outputTargetStudyComboBox.Size = new System.Drawing.Size(220, 31); + this.outputTargetStudyComboBox.Size = new System.Drawing.Size(148, 23); this.outputTargetStudyComboBox.TabIndex = 20; // // outputTargetStudyLabel // this.outputTargetStudyLabel.AutoSize = true; - this.outputTargetStudyLabel.Location = new System.Drawing.Point(34, 27); + this.outputTargetStudyLabel.Location = new System.Drawing.Point(23, 18); + this.outputTargetStudyLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.outputTargetStudyLabel.Name = "outputTargetStudyLabel"; - this.outputTargetStudyLabel.Size = new System.Drawing.Size(120, 23); + this.outputTargetStudyLabel.Size = new System.Drawing.Size(83, 15); this.outputTargetStudyLabel.TabIndex = 19; this.outputTargetStudyLabel.Text = "Target Study"; // // outputAllTrialsButton // - this.outputAllTrialsButton.Location = new System.Drawing.Point(214, 84); - this.outputAllTrialsButton.Margin = new System.Windows.Forms.Padding(4); + this.outputAllTrialsButton.Location = new System.Drawing.Point(143, 56); this.outputAllTrialsButton.Name = "outputAllTrialsButton"; - this.outputAllTrialsButton.Size = new System.Drawing.Size(176, 34); + this.outputAllTrialsButton.Size = new System.Drawing.Size(117, 23); this.outputAllTrialsButton.TabIndex = 18; this.outputAllTrialsButton.Text = "All trials"; this.outputAllTrialsButton.UseVisualStyleBackColor = true; @@ -767,10 +784,9 @@ private void InitializeComponent() // // outputParatoSolutionButton // - this.outputParatoSolutionButton.Location = new System.Drawing.Point(28, 84); - this.outputParatoSolutionButton.Margin = new System.Windows.Forms.Padding(4); + this.outputParatoSolutionButton.Location = new System.Drawing.Point(19, 56); this.outputParatoSolutionButton.Name = "outputParatoSolutionButton"; - this.outputParatoSolutionButton.Size = new System.Drawing.Size(176, 34); + this.outputParatoSolutionButton.Size = new System.Drawing.Size(117, 23); this.outputParatoSolutionButton.TabIndex = 17; this.outputParatoSolutionButton.Text = "Pareto solutions"; this.outputParatoSolutionButton.UseVisualStyleBackColor = true; @@ -779,10 +795,9 @@ private void InitializeComponent() // outputStopButton // this.outputStopButton.Enabled = false; - this.outputStopButton.Location = new System.Drawing.Point(326, 372); - this.outputStopButton.Margin = new System.Windows.Forms.Padding(4); + this.outputStopButton.Location = new System.Drawing.Point(217, 248); this.outputStopButton.Name = "outputStopButton"; - this.outputStopButton.Size = new System.Drawing.Size(75, 34); + this.outputStopButton.Size = new System.Drawing.Size(50, 23); this.outputStopButton.TabIndex = 15; this.outputStopButton.Text = "Stop"; this.outputStopButton.UseVisualStyleBackColor = true; @@ -790,19 +805,18 @@ private void InitializeComponent() // // outputProgressBar // - this.outputProgressBar.Location = new System.Drawing.Point(28, 372); - this.outputProgressBar.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.outputProgressBar.Location = new System.Drawing.Point(19, 248); + this.outputProgressBar.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.outputProgressBar.Name = "outputProgressBar"; - this.outputProgressBar.Size = new System.Drawing.Size(273, 34); + this.outputProgressBar.Size = new System.Drawing.Size(182, 23); this.outputProgressBar.TabIndex = 14; // // settingsTabPage // this.settingsTabPage.Controls.Add(this.settingsTabControl); - this.settingsTabPage.Location = new System.Drawing.Point(4, 32); - this.settingsTabPage.Margin = new System.Windows.Forms.Padding(4); + this.settingsTabPage.Location = new System.Drawing.Point(4, 24); this.settingsTabPage.Name = "settingsTabPage"; - this.settingsTabPage.Size = new System.Drawing.Size(428, 442); + this.settingsTabPage.Size = new System.Drawing.Size(283, 291); this.settingsTabPage.TabIndex = 2; this.settingsTabPage.Text = "Settings"; this.settingsTabPage.UseVisualStyleBackColor = true; @@ -817,10 +831,11 @@ private void InitializeComponent() this.settingsTabControl.Controls.Add(this.CMAES); this.settingsTabControl.Controls.Add(this.QMC); this.settingsTabControl.Controls.Add(this.Misc); - this.settingsTabControl.Location = new System.Drawing.Point(3, 3); + this.settingsTabControl.Location = new System.Drawing.Point(2, 2); + this.settingsTabControl.Margin = new System.Windows.Forms.Padding(2); this.settingsTabControl.Name = "settingsTabControl"; this.settingsTabControl.SelectedIndex = 0; - this.settingsTabControl.Size = new System.Drawing.Size(420, 429); + this.settingsTabControl.Size = new System.Drawing.Size(280, 286); this.settingsTabControl.TabIndex = 0; // // TPE @@ -839,19 +854,21 @@ private void InitializeComponent() this.TPE.Controls.Add(this.tpeConsiderEndpointsCheckBox); this.TPE.Controls.Add(this.tpeConsiderMagicClipCheckBox); this.TPE.Controls.Add(this.tpeConsiderPriorCheckBox); - this.TPE.Location = new System.Drawing.Point(4, 32); + this.TPE.Location = new System.Drawing.Point(4, 24); + this.TPE.Margin = new System.Windows.Forms.Padding(2); this.TPE.Name = "TPE"; - this.TPE.Padding = new System.Windows.Forms.Padding(3); - this.TPE.Size = new System.Drawing.Size(412, 393); + this.TPE.Padding = new System.Windows.Forms.Padding(2); + this.TPE.Size = new System.Drawing.Size(272, 258); this.TPE.TabIndex = 0; this.TPE.Text = "TPE"; this.TPE.UseVisualStyleBackColor = true; // // tpeDefaultButton // - this.tpeDefaultButton.Location = new System.Drawing.Point(300, 350); + this.tpeDefaultButton.Location = new System.Drawing.Point(200, 233); + this.tpeDefaultButton.Margin = new System.Windows.Forms.Padding(2); this.tpeDefaultButton.Name = "tpeDefaultButton"; - this.tpeDefaultButton.Size = new System.Drawing.Size(100, 38); + this.tpeDefaultButton.Size = new System.Drawing.Size(67, 25); this.tpeDefaultButton.TabIndex = 13; this.tpeDefaultButton.Text = "Default"; this.toolTip1.SetToolTip(this.tpeDefaultButton, "Set to Optuna\'s default value."); @@ -861,9 +878,10 @@ private void InitializeComponent() // tpeNEICandidatesLabel // this.tpeNEICandidatesLabel.AutoSize = true; - this.tpeNEICandidatesLabel.Location = new System.Drawing.Point(4, 44); + this.tpeNEICandidatesLabel.Location = new System.Drawing.Point(3, 29); + this.tpeNEICandidatesLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.tpeNEICandidatesLabel.Name = "tpeNEICandidatesLabel"; - this.tpeNEICandidatesLabel.Size = new System.Drawing.Size(225, 23); + this.tpeNEICandidatesLabel.Size = new System.Drawing.Size(151, 15); this.tpeNEICandidatesLabel.TabIndex = 12; this.tpeNEICandidatesLabel.Text = "Number of EI candidates"; this.toolTip1.SetToolTip(this.tpeNEICandidatesLabel, "Number of candidate samples used to calculate\r\nthe expected improvement."); @@ -871,9 +889,10 @@ private void InitializeComponent() // tpeNStartupTrialsLabel // this.tpeNStartupTrialsLabel.AutoSize = true; - this.tpeNStartupTrialsLabel.Location = new System.Drawing.Point(4, 8); + this.tpeNStartupTrialsLabel.Location = new System.Drawing.Point(3, 5); + this.tpeNStartupTrialsLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.tpeNStartupTrialsLabel.Name = "tpeNStartupTrialsLabel"; - this.tpeNStartupTrialsLabel.Size = new System.Drawing.Size(219, 23); + this.tpeNStartupTrialsLabel.Size = new System.Drawing.Size(148, 15); this.tpeNStartupTrialsLabel.TabIndex = 11; this.tpeNStartupTrialsLabel.Text = "Number of startup trials"; this.toolTip1.SetToolTip(this.tpeNStartupTrialsLabel, "The random sampling is used instead of the TPE algorithm\r\nuntil the given number " + @@ -882,23 +901,25 @@ private void InitializeComponent() // tpePriorWeightLabel // this.tpePriorWeightLabel.AutoSize = true; - this.tpePriorWeightLabel.Location = new System.Drawing.Point(4, 80); + this.tpePriorWeightLabel.Location = new System.Drawing.Point(3, 53); + this.tpePriorWeightLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.tpePriorWeightLabel.Name = "tpePriorWeightLabel"; - this.tpePriorWeightLabel.Size = new System.Drawing.Size(118, 23); + this.tpePriorWeightLabel.Size = new System.Drawing.Size(78, 15); this.tpePriorWeightLabel.TabIndex = 10; this.tpePriorWeightLabel.Text = "Prior Weight"; this.toolTip1.SetToolTip(this.tpePriorWeightLabel, "The weight of the prior."); // // tpeEINumUpDown // - this.tpeEINumUpDown.Location = new System.Drawing.Point(306, 42); + this.tpeEINumUpDown.Location = new System.Drawing.Point(204, 28); + this.tpeEINumUpDown.Margin = new System.Windows.Forms.Padding(2); this.tpeEINumUpDown.Minimum = new decimal(new int[] { 1, 0, 0, 0}); this.tpeEINumUpDown.Name = "tpeEINumUpDown"; - this.tpeEINumUpDown.Size = new System.Drawing.Size(94, 30); + this.tpeEINumUpDown.Size = new System.Drawing.Size(63, 23); this.tpeEINumUpDown.TabIndex = 9; this.tpeEINumUpDown.Value = new decimal(new int[] { 24, @@ -908,7 +929,8 @@ private void InitializeComponent() // // tpeStartupNumUpDown // - this.tpeStartupNumUpDown.Location = new System.Drawing.Point(306, 6); + this.tpeStartupNumUpDown.Location = new System.Drawing.Point(204, 4); + this.tpeStartupNumUpDown.Margin = new System.Windows.Forms.Padding(2); this.tpeStartupNumUpDown.Maximum = new decimal(new int[] { 1000, 0, @@ -920,7 +942,7 @@ private void InitializeComponent() 0, 0}); this.tpeStartupNumUpDown.Name = "tpeStartupNumUpDown"; - this.tpeStartupNumUpDown.Size = new System.Drawing.Size(94, 30); + this.tpeStartupNumUpDown.Size = new System.Drawing.Size(63, 23); this.tpeStartupNumUpDown.TabIndex = 8; this.tpeStartupNumUpDown.Value = new decimal(new int[] { 10, @@ -936,9 +958,10 @@ private void InitializeComponent() 0, 0, 65536}); - this.tpePriorNumUpDown.Location = new System.Drawing.Point(306, 78); + this.tpePriorNumUpDown.Location = new System.Drawing.Point(204, 52); + this.tpePriorNumUpDown.Margin = new System.Windows.Forms.Padding(2); this.tpePriorNumUpDown.Name = "tpePriorNumUpDown"; - this.tpePriorNumUpDown.Size = new System.Drawing.Size(94, 30); + this.tpePriorNumUpDown.Size = new System.Drawing.Size(63, 23); this.tpePriorNumUpDown.TabIndex = 7; this.tpePriorNumUpDown.Value = new decimal(new int[] { 10, @@ -949,9 +972,10 @@ private void InitializeComponent() // tpeConstantLiarCheckBox // this.tpeConstantLiarCheckBox.AutoSize = true; - this.tpeConstantLiarCheckBox.Location = new System.Drawing.Point(242, 202); + this.tpeConstantLiarCheckBox.Location = new System.Drawing.Point(161, 135); + this.tpeConstantLiarCheckBox.Margin = new System.Windows.Forms.Padding(2); this.tpeConstantLiarCheckBox.Name = "tpeConstantLiarCheckBox"; - this.tpeConstantLiarCheckBox.Size = new System.Drawing.Size(152, 27); + this.tpeConstantLiarCheckBox.Size = new System.Drawing.Size(104, 19); this.tpeConstantLiarCheckBox.TabIndex = 6; this.tpeConstantLiarCheckBox.Text = "Constant Liar"; this.toolTip1.SetToolTip(this.tpeConstantLiarCheckBox, "If True, \r\npenalize running trials to avoid suggesting parameter configurations n" + @@ -964,9 +988,10 @@ private void InitializeComponent() this.tpeWarnIndependentSamplingCheckBox.Checked = true; this.tpeWarnIndependentSamplingCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; this.tpeWarnIndependentSamplingCheckBox.Enabled = false; - this.tpeWarnIndependentSamplingCheckBox.Location = new System.Drawing.Point(4, 238); + this.tpeWarnIndependentSamplingCheckBox.Location = new System.Drawing.Point(3, 159); + this.tpeWarnIndependentSamplingCheckBox.Margin = new System.Windows.Forms.Padding(2); this.tpeWarnIndependentSamplingCheckBox.Name = "tpeWarnIndependentSamplingCheckBox"; - this.tpeWarnIndependentSamplingCheckBox.Size = new System.Drawing.Size(284, 27); + this.tpeWarnIndependentSamplingCheckBox.Size = new System.Drawing.Size(191, 19); this.tpeWarnIndependentSamplingCheckBox.TabIndex = 5; this.tpeWarnIndependentSamplingCheckBox.Text = "Warn Independent Sampling"; this.toolTip1.SetToolTip(this.tpeWarnIndependentSamplingCheckBox, "If this is True and multivariate=True, \r\na warning message is emitted\r\nwhen the v" + @@ -977,9 +1002,10 @@ private void InitializeComponent() // tpeGroupCheckBox // this.tpeGroupCheckBox.AutoSize = true; - this.tpeGroupCheckBox.Location = new System.Drawing.Point(242, 170); + this.tpeGroupCheckBox.Location = new System.Drawing.Point(161, 113); + this.tpeGroupCheckBox.Margin = new System.Windows.Forms.Padding(2); this.tpeGroupCheckBox.Name = "tpeGroupCheckBox"; - this.tpeGroupCheckBox.Size = new System.Drawing.Size(89, 27); + this.tpeGroupCheckBox.Size = new System.Drawing.Size(61, 19); this.tpeGroupCheckBox.TabIndex = 4; this.tpeGroupCheckBox.Text = "Group"; this.toolTip1.SetToolTip(this.tpeGroupCheckBox, "If this and multivariate are True,\r\nthe multivariate TPE with the group decompose" + @@ -989,9 +1015,10 @@ private void InitializeComponent() // tpeMultivariateCheckBox // this.tpeMultivariateCheckBox.AutoSize = true; - this.tpeMultivariateCheckBox.Location = new System.Drawing.Point(242, 136); + this.tpeMultivariateCheckBox.Location = new System.Drawing.Point(161, 91); + this.tpeMultivariateCheckBox.Margin = new System.Windows.Forms.Padding(2); this.tpeMultivariateCheckBox.Name = "tpeMultivariateCheckBox"; - this.tpeMultivariateCheckBox.Size = new System.Drawing.Size(138, 27); + this.tpeMultivariateCheckBox.Size = new System.Drawing.Size(95, 19); this.tpeMultivariateCheckBox.TabIndex = 3; this.tpeMultivariateCheckBox.Text = "Multivariate"; this.toolTip1.SetToolTip(this.tpeMultivariateCheckBox, "If this is True, \r\nthe multivariate TPE is used when suggesting parameters. \r\nThe" + @@ -1001,9 +1028,10 @@ private void InitializeComponent() // tpeConsiderEndpointsCheckBox // this.tpeConsiderEndpointsCheckBox.AutoSize = true; - this.tpeConsiderEndpointsCheckBox.Location = new System.Drawing.Point(4, 170); + this.tpeConsiderEndpointsCheckBox.Location = new System.Drawing.Point(3, 113); + this.tpeConsiderEndpointsCheckBox.Margin = new System.Windows.Forms.Padding(2); this.tpeConsiderEndpointsCheckBox.Name = "tpeConsiderEndpointsCheckBox"; - this.tpeConsiderEndpointsCheckBox.Size = new System.Drawing.Size(205, 27); + this.tpeConsiderEndpointsCheckBox.Size = new System.Drawing.Size(136, 19); this.tpeConsiderEndpointsCheckBox.TabIndex = 2; this.tpeConsiderEndpointsCheckBox.Text = "Consider Endpoints"; this.toolTip1.SetToolTip(this.tpeConsiderEndpointsCheckBox, "Take endpoints of domains into account\r\nwhen calculating variances of Gaussians i" + @@ -1015,9 +1043,10 @@ private void InitializeComponent() this.tpeConsiderMagicClipCheckBox.AutoSize = true; this.tpeConsiderMagicClipCheckBox.Checked = true; this.tpeConsiderMagicClipCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.tpeConsiderMagicClipCheckBox.Location = new System.Drawing.Point(4, 202); + this.tpeConsiderMagicClipCheckBox.Location = new System.Drawing.Point(3, 135); + this.tpeConsiderMagicClipCheckBox.Margin = new System.Windows.Forms.Padding(2); this.tpeConsiderMagicClipCheckBox.Name = "tpeConsiderMagicClipCheckBox"; - this.tpeConsiderMagicClipCheckBox.Size = new System.Drawing.Size(207, 27); + this.tpeConsiderMagicClipCheckBox.Size = new System.Drawing.Size(138, 19); this.tpeConsiderMagicClipCheckBox.TabIndex = 1; this.tpeConsiderMagicClipCheckBox.Text = "Consider Magic Clip"; this.toolTip1.SetToolTip(this.tpeConsiderMagicClipCheckBox, "Enable a heuristic to limit the smallest variances of Gaussians used in the Parze" + @@ -1029,9 +1058,10 @@ private void InitializeComponent() this.tpeConsiderPriorCheckBox.AutoSize = true; this.tpeConsiderPriorCheckBox.Checked = true; this.tpeConsiderPriorCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.tpeConsiderPriorCheckBox.Location = new System.Drawing.Point(4, 136); + this.tpeConsiderPriorCheckBox.Location = new System.Drawing.Point(3, 91); + this.tpeConsiderPriorCheckBox.Margin = new System.Windows.Forms.Padding(2); this.tpeConsiderPriorCheckBox.Name = "tpeConsiderPriorCheckBox"; - this.tpeConsiderPriorCheckBox.Size = new System.Drawing.Size(159, 27); + this.tpeConsiderPriorCheckBox.Size = new System.Drawing.Size(107, 19); this.tpeConsiderPriorCheckBox.TabIndex = 0; this.tpeConsiderPriorCheckBox.Text = "Consider Prior"; this.toolTip1.SetToolTip(this.tpeConsiderPriorCheckBox, "Enhance the stability of Parzen estimator by imposing a Gaussian prior when True." + @@ -1044,19 +1074,21 @@ private void InitializeComponent() this.tabPage1.Controls.Add(this.gpDeterministicObjectiveCheckBox); this.tabPage1.Controls.Add(this.gpNStartupTrialsLabel); this.tabPage1.Controls.Add(this.gpStartupNumUpDown); - this.tabPage1.Location = new System.Drawing.Point(4, 32); + this.tabPage1.Location = new System.Drawing.Point(4, 24); + this.tabPage1.Margin = new System.Windows.Forms.Padding(2); this.tabPage1.Name = "tabPage1"; - this.tabPage1.Padding = new System.Windows.Forms.Padding(3); - this.tabPage1.Size = new System.Drawing.Size(412, 393); + this.tabPage1.Padding = new System.Windows.Forms.Padding(2); + this.tabPage1.Size = new System.Drawing.Size(272, 258); this.tabPage1.TabIndex = 7; this.tabPage1.Text = "GP(Optuna)"; this.tabPage1.UseVisualStyleBackColor = true; // // gpDefaultButton // - this.gpDefaultButton.Location = new System.Drawing.Point(300, 350); + this.gpDefaultButton.Location = new System.Drawing.Point(200, 233); + this.gpDefaultButton.Margin = new System.Windows.Forms.Padding(2); this.gpDefaultButton.Name = "gpDefaultButton"; - this.gpDefaultButton.Size = new System.Drawing.Size(100, 38); + this.gpDefaultButton.Size = new System.Drawing.Size(67, 25); this.gpDefaultButton.TabIndex = 24; this.gpDefaultButton.Text = "Default"; this.toolTip1.SetToolTip(this.gpDefaultButton, "Set to Optuna\'s default value."); @@ -1066,9 +1098,10 @@ private void InitializeComponent() // gpDeterministicObjectiveCheckBox // this.gpDeterministicObjectiveCheckBox.AutoSize = true; - this.gpDeterministicObjectiveCheckBox.Location = new System.Drawing.Point(10, 44); + this.gpDeterministicObjectiveCheckBox.Location = new System.Drawing.Point(7, 29); + this.gpDeterministicObjectiveCheckBox.Margin = new System.Windows.Forms.Padding(2); this.gpDeterministicObjectiveCheckBox.Name = "gpDeterministicObjectiveCheckBox"; - this.gpDeterministicObjectiveCheckBox.Size = new System.Drawing.Size(239, 27); + this.gpDeterministicObjectiveCheckBox.Size = new System.Drawing.Size(163, 19); this.gpDeterministicObjectiveCheckBox.TabIndex = 23; this.gpDeterministicObjectiveCheckBox.Text = "Deterministic Objective"; this.toolTip1.SetToolTip(this.gpDeterministicObjectiveCheckBox, resources.GetString("gpDeterministicObjectiveCheckBox.ToolTip")); @@ -1077,9 +1110,10 @@ private void InitializeComponent() // gpNStartupTrialsLabel // this.gpNStartupTrialsLabel.AutoSize = true; - this.gpNStartupTrialsLabel.Location = new System.Drawing.Point(6, 8); + this.gpNStartupTrialsLabel.Location = new System.Drawing.Point(4, 5); + this.gpNStartupTrialsLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.gpNStartupTrialsLabel.Name = "gpNStartupTrialsLabel"; - this.gpNStartupTrialsLabel.Size = new System.Drawing.Size(219, 23); + this.gpNStartupTrialsLabel.Size = new System.Drawing.Size(148, 15); this.gpNStartupTrialsLabel.TabIndex = 15; this.gpNStartupTrialsLabel.Text = "Number of startup trials"; this.toolTip1.SetToolTip(this.gpNStartupTrialsLabel, "Number of initial trials, that is the number of trials to resort to independent s" + @@ -1087,7 +1121,8 @@ private void InitializeComponent() // // gpStartupNumUpDown // - this.gpStartupNumUpDown.Location = new System.Drawing.Point(306, 8); + this.gpStartupNumUpDown.Location = new System.Drawing.Point(204, 5); + this.gpStartupNumUpDown.Margin = new System.Windows.Forms.Padding(2); this.gpStartupNumUpDown.Maximum = new decimal(new int[] { 1000, 0, @@ -1099,7 +1134,7 @@ private void InitializeComponent() 0, 0}); this.gpStartupNumUpDown.Name = "gpStartupNumUpDown"; - this.gpStartupNumUpDown.Size = new System.Drawing.Size(94, 30); + this.gpStartupNumUpDown.Size = new System.Drawing.Size(63, 23); this.gpStartupNumUpDown.TabIndex = 14; this.gpStartupNumUpDown.Value = new decimal(new int[] { 10, @@ -1112,19 +1147,21 @@ private void InitializeComponent() this.GP.Controls.Add(this.boTorchDefaultButton); this.GP.Controls.Add(this.boTorchNStartupTrialsLabel); this.GP.Controls.Add(this.boTorchStartupNumUpDown); - this.GP.Location = new System.Drawing.Point(4, 32); + this.GP.Location = new System.Drawing.Point(4, 24); + this.GP.Margin = new System.Windows.Forms.Padding(2); this.GP.Name = "GP"; - this.GP.Padding = new System.Windows.Forms.Padding(3); - this.GP.Size = new System.Drawing.Size(412, 393); + this.GP.Padding = new System.Windows.Forms.Padding(2); + this.GP.Size = new System.Drawing.Size(272, 258); this.GP.TabIndex = 1; this.GP.Text = "GP(BoTorch)"; this.GP.UseVisualStyleBackColor = true; // // boTorchDefaultButton // - this.boTorchDefaultButton.Location = new System.Drawing.Point(300, 350); + this.boTorchDefaultButton.Location = new System.Drawing.Point(200, 233); + this.boTorchDefaultButton.Margin = new System.Windows.Forms.Padding(2); this.boTorchDefaultButton.Name = "boTorchDefaultButton"; - this.boTorchDefaultButton.Size = new System.Drawing.Size(100, 38); + this.boTorchDefaultButton.Size = new System.Drawing.Size(67, 25); this.boTorchDefaultButton.TabIndex = 14; this.boTorchDefaultButton.Text = "Default"; this.toolTip1.SetToolTip(this.boTorchDefaultButton, "Set to Optuna\'s default value."); @@ -1134,9 +1171,10 @@ private void InitializeComponent() // boTorchNStartupTrialsLabel // this.boTorchNStartupTrialsLabel.AutoSize = true; - this.boTorchNStartupTrialsLabel.Location = new System.Drawing.Point(6, 8); + this.boTorchNStartupTrialsLabel.Location = new System.Drawing.Point(4, 5); + this.boTorchNStartupTrialsLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.boTorchNStartupTrialsLabel.Name = "boTorchNStartupTrialsLabel"; - this.boTorchNStartupTrialsLabel.Size = new System.Drawing.Size(219, 23); + this.boTorchNStartupTrialsLabel.Size = new System.Drawing.Size(148, 15); this.boTorchNStartupTrialsLabel.TabIndex = 13; this.boTorchNStartupTrialsLabel.Text = "Number of startup trials"; this.toolTip1.SetToolTip(this.boTorchNStartupTrialsLabel, "Number of initial trials, that is the number of trials to resort to independent s" + @@ -1144,7 +1182,8 @@ private void InitializeComponent() // // boTorchStartupNumUpDown // - this.boTorchStartupNumUpDown.Location = new System.Drawing.Point(306, 8); + this.boTorchStartupNumUpDown.Location = new System.Drawing.Point(204, 5); + this.boTorchStartupNumUpDown.Margin = new System.Windows.Forms.Padding(2); this.boTorchStartupNumUpDown.Maximum = new decimal(new int[] { 1000, 0, @@ -1156,7 +1195,7 @@ private void InitializeComponent() 0, 0}); this.boTorchStartupNumUpDown.Name = "boTorchStartupNumUpDown"; - this.boTorchStartupNumUpDown.Size = new System.Drawing.Size(94, 30); + this.boTorchStartupNumUpDown.Size = new System.Drawing.Size(63, 23); this.boTorchStartupNumUpDown.TabIndex = 12; this.boTorchStartupNumUpDown.Value = new decimal(new int[] { 10, @@ -1177,9 +1216,10 @@ private void InitializeComponent() this.NSGAII.Controls.Add(this.nsga2CrossoverProbLabel); this.NSGAII.Controls.Add(this.nsga2CrossoverProbUpDown); this.NSGAII.Controls.Add(this.nsga2MutationProbUpDown); - this.NSGAII.Location = new System.Drawing.Point(4, 32); + this.NSGAII.Location = new System.Drawing.Point(4, 24); + this.NSGAII.Margin = new System.Windows.Forms.Padding(2); this.NSGAII.Name = "NSGAII"; - this.NSGAII.Size = new System.Drawing.Size(412, 393); + this.NSGAII.Size = new System.Drawing.Size(272, 258); this.NSGAII.TabIndex = 3; this.NSGAII.Text = "NSGAII"; this.NSGAII.UseVisualStyleBackColor = true; @@ -1195,19 +1235,20 @@ private void InitializeComponent() "SBX", "VSBX", "UNDX"}); - this.nsga2CrossoverComboBox.Location = new System.Drawing.Point(266, 154); - this.nsga2CrossoverComboBox.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.nsga2CrossoverComboBox.Location = new System.Drawing.Point(177, 103); + this.nsga2CrossoverComboBox.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.nsga2CrossoverComboBox.Name = "nsga2CrossoverComboBox"; - this.nsga2CrossoverComboBox.Size = new System.Drawing.Size(134, 31); + this.nsga2CrossoverComboBox.Size = new System.Drawing.Size(91, 23); this.nsga2CrossoverComboBox.TabIndex = 33; this.nsga2CrossoverComboBox.Text = "Uniform"; // // nsga2CrossoverCheckBox // this.nsga2CrossoverCheckBox.AutoSize = true; - this.nsga2CrossoverCheckBox.Location = new System.Drawing.Point(14, 154); + this.nsga2CrossoverCheckBox.Location = new System.Drawing.Point(9, 103); + this.nsga2CrossoverCheckBox.Margin = new System.Windows.Forms.Padding(2); this.nsga2CrossoverCheckBox.Name = "nsga2CrossoverCheckBox"; - this.nsga2CrossoverCheckBox.Size = new System.Drawing.Size(122, 27); + this.nsga2CrossoverCheckBox.Size = new System.Drawing.Size(84, 19); this.nsga2CrossoverCheckBox.TabIndex = 24; this.nsga2CrossoverCheckBox.Text = "Crossover"; this.toolTip1.SetToolTip(this.nsga2CrossoverCheckBox, "Crossover to be applied when creating child individuals. "); @@ -1216,9 +1257,10 @@ private void InitializeComponent() // // nsga2DefaultButton // - this.nsga2DefaultButton.Location = new System.Drawing.Point(300, 350); + this.nsga2DefaultButton.Location = new System.Drawing.Point(200, 233); + this.nsga2DefaultButton.Margin = new System.Windows.Forms.Padding(2); this.nsga2DefaultButton.Name = "nsga2DefaultButton"; - this.nsga2DefaultButton.Size = new System.Drawing.Size(100, 38); + this.nsga2DefaultButton.Size = new System.Drawing.Size(67, 25); this.nsga2DefaultButton.TabIndex = 23; this.nsga2DefaultButton.Text = "Default"; this.toolTip1.SetToolTip(this.nsga2DefaultButton, "Set to Optuna\'s default value."); @@ -1228,9 +1270,10 @@ private void InitializeComponent() // nsga2MutationProbCheckBox // this.nsga2MutationProbCheckBox.AutoSize = true; - this.nsga2MutationProbCheckBox.Location = new System.Drawing.Point(14, 8); + this.nsga2MutationProbCheckBox.Location = new System.Drawing.Point(9, 5); + this.nsga2MutationProbCheckBox.Margin = new System.Windows.Forms.Padding(2); this.nsga2MutationProbCheckBox.Name = "nsga2MutationProbCheckBox"; - this.nsga2MutationProbCheckBox.Size = new System.Drawing.Size(212, 27); + this.nsga2MutationProbCheckBox.Size = new System.Drawing.Size(142, 19); this.nsga2MutationProbCheckBox.TabIndex = 22; this.nsga2MutationProbCheckBox.Text = "Mutation Probability"; this.toolTip1.SetToolTip(this.nsga2MutationProbCheckBox, "If False, \r\nthe solver automatically calculates mutation probability."); @@ -1240,16 +1283,18 @@ private void InitializeComponent() // nsga2PopulationSizeLabel // this.nsga2PopulationSizeLabel.AutoSize = true; - this.nsga2PopulationSizeLabel.Location = new System.Drawing.Point(9, 117); + this.nsga2PopulationSizeLabel.Location = new System.Drawing.Point(6, 78); + this.nsga2PopulationSizeLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.nsga2PopulationSizeLabel.Name = "nsga2PopulationSizeLabel"; - this.nsga2PopulationSizeLabel.Size = new System.Drawing.Size(144, 23); + this.nsga2PopulationSizeLabel.Size = new System.Drawing.Size(95, 15); this.nsga2PopulationSizeLabel.TabIndex = 21; this.nsga2PopulationSizeLabel.Text = "Population Size"; this.toolTip1.SetToolTip(this.nsga2PopulationSizeLabel, "Number of individuals (trials) in a generation."); // // nsga2PopulationSizeUpDown // - this.nsga2PopulationSizeUpDown.Location = new System.Drawing.Point(309, 116); + this.nsga2PopulationSizeUpDown.Location = new System.Drawing.Point(206, 77); + this.nsga2PopulationSizeUpDown.Margin = new System.Windows.Forms.Padding(2); this.nsga2PopulationSizeUpDown.Maximum = new decimal(new int[] { 1000, 0, @@ -1261,7 +1306,7 @@ private void InitializeComponent() 0, 0}); this.nsga2PopulationSizeUpDown.Name = "nsga2PopulationSizeUpDown"; - this.nsga2PopulationSizeUpDown.Size = new System.Drawing.Size(94, 30); + this.nsga2PopulationSizeUpDown.Size = new System.Drawing.Size(63, 23); this.nsga2PopulationSizeUpDown.TabIndex = 20; this.nsga2PopulationSizeUpDown.Value = new decimal(new int[] { 50, @@ -1272,9 +1317,10 @@ private void InitializeComponent() // nsga2SwappingProbLabel // this.nsga2SwappingProbLabel.AutoSize = true; - this.nsga2SwappingProbLabel.Location = new System.Drawing.Point(9, 81); + this.nsga2SwappingProbLabel.Location = new System.Drawing.Point(6, 54); + this.nsga2SwappingProbLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.nsga2SwappingProbLabel.Name = "nsga2SwappingProbLabel"; - this.nsga2SwappingProbLabel.Size = new System.Drawing.Size(194, 23); + this.nsga2SwappingProbLabel.Size = new System.Drawing.Size(128, 15); this.nsga2SwappingProbLabel.TabIndex = 19; this.nsga2SwappingProbLabel.Text = "Swapping Probability"; this.toolTip1.SetToolTip(this.nsga2SwappingProbLabel, "Probability of swapping each parameter of the parents during crossover."); @@ -1287,14 +1333,15 @@ private void InitializeComponent() 0, 0, 131072}); - this.nsga2SwappingProbUpDown.Location = new System.Drawing.Point(309, 80); + this.nsga2SwappingProbUpDown.Location = new System.Drawing.Point(206, 53); + this.nsga2SwappingProbUpDown.Margin = new System.Windows.Forms.Padding(2); this.nsga2SwappingProbUpDown.Maximum = new decimal(new int[] { 1, 0, 0, 0}); this.nsga2SwappingProbUpDown.Name = "nsga2SwappingProbUpDown"; - this.nsga2SwappingProbUpDown.Size = new System.Drawing.Size(94, 30); + this.nsga2SwappingProbUpDown.Size = new System.Drawing.Size(63, 23); this.nsga2SwappingProbUpDown.TabIndex = 18; this.nsga2SwappingProbUpDown.Value = new decimal(new int[] { 5, @@ -1305,9 +1352,10 @@ private void InitializeComponent() // nsga2CrossoverProbLabel // this.nsga2CrossoverProbLabel.AutoSize = true; - this.nsga2CrossoverProbLabel.Location = new System.Drawing.Point(9, 45); + this.nsga2CrossoverProbLabel.Location = new System.Drawing.Point(6, 30); + this.nsga2CrossoverProbLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.nsga2CrossoverProbLabel.Name = "nsga2CrossoverProbLabel"; - this.nsga2CrossoverProbLabel.Size = new System.Drawing.Size(195, 23); + this.nsga2CrossoverProbLabel.Size = new System.Drawing.Size(130, 15); this.nsga2CrossoverProbLabel.TabIndex = 17; this.nsga2CrossoverProbLabel.Text = "Crossover Probability"; this.toolTip1.SetToolTip(this.nsga2CrossoverProbLabel, "Probability that a crossover (parameters swapping between parents)\r\nwill occur wh" + @@ -1321,14 +1369,15 @@ private void InitializeComponent() 0, 0, 131072}); - this.nsga2CrossoverProbUpDown.Location = new System.Drawing.Point(309, 44); + this.nsga2CrossoverProbUpDown.Location = new System.Drawing.Point(206, 29); + this.nsga2CrossoverProbUpDown.Margin = new System.Windows.Forms.Padding(2); this.nsga2CrossoverProbUpDown.Maximum = new decimal(new int[] { 1, 0, 0, 0}); this.nsga2CrossoverProbUpDown.Name = "nsga2CrossoverProbUpDown"; - this.nsga2CrossoverProbUpDown.Size = new System.Drawing.Size(94, 30); + this.nsga2CrossoverProbUpDown.Size = new System.Drawing.Size(63, 23); this.nsga2CrossoverProbUpDown.TabIndex = 16; this.nsga2CrossoverProbUpDown.Value = new decimal(new int[] { 9, @@ -1345,14 +1394,15 @@ private void InitializeComponent() 0, 0, 131072}); - this.nsga2MutationProbUpDown.Location = new System.Drawing.Point(309, 8); + this.nsga2MutationProbUpDown.Location = new System.Drawing.Point(206, 5); + this.nsga2MutationProbUpDown.Margin = new System.Windows.Forms.Padding(2); this.nsga2MutationProbUpDown.Maximum = new decimal(new int[] { 1, 0, 0, 0}); this.nsga2MutationProbUpDown.Name = "nsga2MutationProbUpDown"; - this.nsga2MutationProbUpDown.Size = new System.Drawing.Size(94, 30); + this.nsga2MutationProbUpDown.Size = new System.Drawing.Size(63, 23); this.nsga2MutationProbUpDown.TabIndex = 14; // // NSGAIII @@ -1368,11 +1418,10 @@ private void InitializeComponent() this.NSGAIII.Controls.Add(this.nsga3CrossoverProbLabel); this.NSGAIII.Controls.Add(this.nsga3CrossoverProbUpDown); this.NSGAIII.Controls.Add(this.nsga3MutationProbUpDown); - this.NSGAIII.Location = new System.Drawing.Point(4, 32); - this.NSGAIII.Margin = new System.Windows.Forms.Padding(4); + this.NSGAIII.Location = new System.Drawing.Point(4, 24); this.NSGAIII.Name = "NSGAIII"; - this.NSGAIII.Padding = new System.Windows.Forms.Padding(4); - this.NSGAIII.Size = new System.Drawing.Size(412, 393); + this.NSGAIII.Padding = new System.Windows.Forms.Padding(3); + this.NSGAIII.Size = new System.Drawing.Size(272, 258); this.NSGAIII.TabIndex = 6; this.NSGAIII.Text = "NSGAIII"; this.NSGAIII.UseVisualStyleBackColor = true; @@ -1388,19 +1437,20 @@ private void InitializeComponent() "SBX", "VSBX", "UNDX"}); - this.nsga3CrossoverComboBox.Location = new System.Drawing.Point(264, 154); - this.nsga3CrossoverComboBox.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.nsga3CrossoverComboBox.Location = new System.Drawing.Point(176, 103); + this.nsga3CrossoverComboBox.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.nsga3CrossoverComboBox.Name = "nsga3CrossoverComboBox"; - this.nsga3CrossoverComboBox.Size = new System.Drawing.Size(134, 31); + this.nsga3CrossoverComboBox.Size = new System.Drawing.Size(91, 23); this.nsga3CrossoverComboBox.TabIndex = 44; this.nsga3CrossoverComboBox.Text = "Uniform"; // // nsga3CrossoverCheckBox // this.nsga3CrossoverCheckBox.AutoSize = true; - this.nsga3CrossoverCheckBox.Location = new System.Drawing.Point(12, 154); + this.nsga3CrossoverCheckBox.Location = new System.Drawing.Point(8, 103); + this.nsga3CrossoverCheckBox.Margin = new System.Windows.Forms.Padding(2); this.nsga3CrossoverCheckBox.Name = "nsga3CrossoverCheckBox"; - this.nsga3CrossoverCheckBox.Size = new System.Drawing.Size(122, 27); + this.nsga3CrossoverCheckBox.Size = new System.Drawing.Size(84, 19); this.nsga3CrossoverCheckBox.TabIndex = 43; this.nsga3CrossoverCheckBox.Text = "Crossover"; this.toolTip1.SetToolTip(this.nsga3CrossoverCheckBox, "Crossover to be applied when creating child individuals. "); @@ -1409,9 +1459,10 @@ private void InitializeComponent() // // nsga3DefaultButton // - this.nsga3DefaultButton.Location = new System.Drawing.Point(298, 348); + this.nsga3DefaultButton.Location = new System.Drawing.Point(199, 232); + this.nsga3DefaultButton.Margin = new System.Windows.Forms.Padding(2); this.nsga3DefaultButton.Name = "nsga3DefaultButton"; - this.nsga3DefaultButton.Size = new System.Drawing.Size(100, 39); + this.nsga3DefaultButton.Size = new System.Drawing.Size(67, 26); this.nsga3DefaultButton.TabIndex = 42; this.nsga3DefaultButton.Text = "Default"; this.toolTip1.SetToolTip(this.nsga3DefaultButton, "Set to Optuna\'s default value."); @@ -1421,9 +1472,10 @@ private void InitializeComponent() // nsga3MutationProbCheckBox // this.nsga3MutationProbCheckBox.AutoSize = true; - this.nsga3MutationProbCheckBox.Location = new System.Drawing.Point(12, 6); + this.nsga3MutationProbCheckBox.Location = new System.Drawing.Point(8, 4); + this.nsga3MutationProbCheckBox.Margin = new System.Windows.Forms.Padding(2); this.nsga3MutationProbCheckBox.Name = "nsga3MutationProbCheckBox"; - this.nsga3MutationProbCheckBox.Size = new System.Drawing.Size(212, 27); + this.nsga3MutationProbCheckBox.Size = new System.Drawing.Size(142, 19); this.nsga3MutationProbCheckBox.TabIndex = 41; this.nsga3MutationProbCheckBox.Text = "Mutation Probability"; this.toolTip1.SetToolTip(this.nsga3MutationProbCheckBox, "If False, \r\nthe solver automatically calculates mutation probability."); @@ -1433,16 +1485,18 @@ private void InitializeComponent() // nsga3PopulationSizeLabel // this.nsga3PopulationSizeLabel.AutoSize = true; - this.nsga3PopulationSizeLabel.Location = new System.Drawing.Point(8, 116); + this.nsga3PopulationSizeLabel.Location = new System.Drawing.Point(5, 77); + this.nsga3PopulationSizeLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.nsga3PopulationSizeLabel.Name = "nsga3PopulationSizeLabel"; - this.nsga3PopulationSizeLabel.Size = new System.Drawing.Size(144, 23); + this.nsga3PopulationSizeLabel.Size = new System.Drawing.Size(95, 15); this.nsga3PopulationSizeLabel.TabIndex = 40; this.nsga3PopulationSizeLabel.Text = "Population Size"; this.toolTip1.SetToolTip(this.nsga3PopulationSizeLabel, "Number of individuals (trials) in a generation."); // // nsga3PopulationSizeUpDown // - this.nsga3PopulationSizeUpDown.Location = new System.Drawing.Point(308, 114); + this.nsga3PopulationSizeUpDown.Location = new System.Drawing.Point(205, 76); + this.nsga3PopulationSizeUpDown.Margin = new System.Windows.Forms.Padding(2); this.nsga3PopulationSizeUpDown.Maximum = new decimal(new int[] { 1000, 0, @@ -1454,7 +1508,7 @@ private void InitializeComponent() 0, 0}); this.nsga3PopulationSizeUpDown.Name = "nsga3PopulationSizeUpDown"; - this.nsga3PopulationSizeUpDown.Size = new System.Drawing.Size(94, 30); + this.nsga3PopulationSizeUpDown.Size = new System.Drawing.Size(63, 23); this.nsga3PopulationSizeUpDown.TabIndex = 39; this.nsga3PopulationSizeUpDown.Value = new decimal(new int[] { 50, @@ -1465,9 +1519,10 @@ private void InitializeComponent() // nsga3SwappingProbLabel // this.nsga3SwappingProbLabel.AutoSize = true; - this.nsga3SwappingProbLabel.Location = new System.Drawing.Point(8, 80); + this.nsga3SwappingProbLabel.Location = new System.Drawing.Point(5, 53); + this.nsga3SwappingProbLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.nsga3SwappingProbLabel.Name = "nsga3SwappingProbLabel"; - this.nsga3SwappingProbLabel.Size = new System.Drawing.Size(194, 23); + this.nsga3SwappingProbLabel.Size = new System.Drawing.Size(128, 15); this.nsga3SwappingProbLabel.TabIndex = 38; this.nsga3SwappingProbLabel.Text = "Swapping Probability"; this.toolTip1.SetToolTip(this.nsga3SwappingProbLabel, "Probability of swapping each parameter of the parents during crossover."); @@ -1480,14 +1535,15 @@ private void InitializeComponent() 0, 0, 131072}); - this.nsga3SwappingProbUpDown.Location = new System.Drawing.Point(308, 78); + this.nsga3SwappingProbUpDown.Location = new System.Drawing.Point(205, 52); + this.nsga3SwappingProbUpDown.Margin = new System.Windows.Forms.Padding(2); this.nsga3SwappingProbUpDown.Maximum = new decimal(new int[] { 1, 0, 0, 0}); this.nsga3SwappingProbUpDown.Name = "nsga3SwappingProbUpDown"; - this.nsga3SwappingProbUpDown.Size = new System.Drawing.Size(94, 30); + this.nsga3SwappingProbUpDown.Size = new System.Drawing.Size(63, 23); this.nsga3SwappingProbUpDown.TabIndex = 37; this.nsga3SwappingProbUpDown.Value = new decimal(new int[] { 5, @@ -1498,9 +1554,10 @@ private void InitializeComponent() // nsga3CrossoverProbLabel // this.nsga3CrossoverProbLabel.AutoSize = true; - this.nsga3CrossoverProbLabel.Location = new System.Drawing.Point(8, 44); + this.nsga3CrossoverProbLabel.Location = new System.Drawing.Point(5, 29); + this.nsga3CrossoverProbLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.nsga3CrossoverProbLabel.Name = "nsga3CrossoverProbLabel"; - this.nsga3CrossoverProbLabel.Size = new System.Drawing.Size(195, 23); + this.nsga3CrossoverProbLabel.Size = new System.Drawing.Size(130, 15); this.nsga3CrossoverProbLabel.TabIndex = 36; this.nsga3CrossoverProbLabel.Text = "Crossover Probability"; this.toolTip1.SetToolTip(this.nsga3CrossoverProbLabel, "Probability that a crossover (parameters swapping between parents)\r\nwill occur wh" + @@ -1514,14 +1571,15 @@ private void InitializeComponent() 0, 0, 131072}); - this.nsga3CrossoverProbUpDown.Location = new System.Drawing.Point(308, 42); + this.nsga3CrossoverProbUpDown.Location = new System.Drawing.Point(205, 28); + this.nsga3CrossoverProbUpDown.Margin = new System.Windows.Forms.Padding(2); this.nsga3CrossoverProbUpDown.Maximum = new decimal(new int[] { 1, 0, 0, 0}); this.nsga3CrossoverProbUpDown.Name = "nsga3CrossoverProbUpDown"; - this.nsga3CrossoverProbUpDown.Size = new System.Drawing.Size(94, 30); + this.nsga3CrossoverProbUpDown.Size = new System.Drawing.Size(63, 23); this.nsga3CrossoverProbUpDown.TabIndex = 35; this.nsga3CrossoverProbUpDown.Value = new decimal(new int[] { 9, @@ -1538,14 +1596,15 @@ private void InitializeComponent() 0, 0, 131072}); - this.nsga3MutationProbUpDown.Location = new System.Drawing.Point(308, 6); + this.nsga3MutationProbUpDown.Location = new System.Drawing.Point(205, 4); + this.nsga3MutationProbUpDown.Margin = new System.Windows.Forms.Padding(2); this.nsga3MutationProbUpDown.Maximum = new decimal(new int[] { 1, 0, 0, 0}); this.nsga3MutationProbUpDown.Name = "nsga3MutationProbUpDown"; - this.nsga3MutationProbUpDown.Size = new System.Drawing.Size(94, 30); + this.nsga3MutationProbUpDown.Size = new System.Drawing.Size(63, 23); this.nsga3MutationProbUpDown.TabIndex = 34; // // CMAES @@ -1566,9 +1625,10 @@ private void InitializeComponent() this.CMAES.Controls.Add(this.cmaEsIncPopSizeUpDown); this.CMAES.Controls.Add(this.cmaEsSigmaCheckBox); this.CMAES.Controls.Add(this.cmaEsSigmaNumUpDown); - this.CMAES.Location = new System.Drawing.Point(4, 32); + this.CMAES.Location = new System.Drawing.Point(4, 24); + this.CMAES.Margin = new System.Windows.Forms.Padding(2); this.CMAES.Name = "CMAES"; - this.CMAES.Size = new System.Drawing.Size(412, 393); + this.CMAES.Size = new System.Drawing.Size(272, 258); this.CMAES.TabIndex = 2; this.CMAES.Text = "CMA-ES"; this.CMAES.UseVisualStyleBackColor = true; @@ -1578,10 +1638,9 @@ private void InitializeComponent() this.cmaEsWithMarginCheckBox.AutoSize = true; this.cmaEsWithMarginCheckBox.Checked = true; this.cmaEsWithMarginCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.cmaEsWithMarginCheckBox.Location = new System.Drawing.Point(260, 75); - this.cmaEsWithMarginCheckBox.Margin = new System.Windows.Forms.Padding(4); + this.cmaEsWithMarginCheckBox.Location = new System.Drawing.Point(173, 50); this.cmaEsWithMarginCheckBox.Name = "cmaEsWithMarginCheckBox"; - this.cmaEsWithMarginCheckBox.Size = new System.Drawing.Size(144, 27); + this.cmaEsWithMarginCheckBox.Size = new System.Drawing.Size(98, 19); this.cmaEsWithMarginCheckBox.TabIndex = 38; this.cmaEsWithMarginCheckBox.Text = "With margin"; this.cmaEsWithMarginCheckBox.UseVisualStyleBackColor = true; @@ -1591,19 +1650,19 @@ private void InitializeComponent() // this.cmaEsWarmStartComboBox.Enabled = false; this.cmaEsWarmStartComboBox.FormattingEnabled = true; - this.cmaEsWarmStartComboBox.Location = new System.Drawing.Point(218, 252); - this.cmaEsWarmStartComboBox.Margin = new System.Windows.Forms.Padding(6); + this.cmaEsWarmStartComboBox.Location = new System.Drawing.Point(145, 168); + this.cmaEsWarmStartComboBox.Margin = new System.Windows.Forms.Padding(4); this.cmaEsWarmStartComboBox.Name = "cmaEsWarmStartComboBox"; - this.cmaEsWarmStartComboBox.Size = new System.Drawing.Size(180, 31); + this.cmaEsWarmStartComboBox.Size = new System.Drawing.Size(121, 23); this.cmaEsWarmStartComboBox.TabIndex = 37; // // cmaEsWarmStartCmaEsCheckBox // this.cmaEsWarmStartCmaEsCheckBox.AutoSize = true; - this.cmaEsWarmStartCmaEsCheckBox.Location = new System.Drawing.Point(10, 222); - this.cmaEsWarmStartCmaEsCheckBox.Margin = new System.Windows.Forms.Padding(6); + this.cmaEsWarmStartCmaEsCheckBox.Location = new System.Drawing.Point(7, 148); + this.cmaEsWarmStartCmaEsCheckBox.Margin = new System.Windows.Forms.Padding(4); this.cmaEsWarmStartCmaEsCheckBox.Name = "cmaEsWarmStartCmaEsCheckBox"; - this.cmaEsWarmStartCmaEsCheckBox.Size = new System.Drawing.Size(210, 27); + this.cmaEsWarmStartCmaEsCheckBox.Size = new System.Drawing.Size(145, 19); this.cmaEsWarmStartCmaEsCheckBox.TabIndex = 36; this.cmaEsWarmStartCmaEsCheckBox.Text = "Warm Start CMA-ES"; this.cmaEsWarmStartCmaEsCheckBox.UseVisualStyleBackColor = true; @@ -1612,15 +1671,14 @@ private void InitializeComponent() // cmaEsPopulationSizeUpDown // this.cmaEsPopulationSizeUpDown.Enabled = false; - this.cmaEsPopulationSizeUpDown.Location = new System.Drawing.Point(303, 140); - this.cmaEsPopulationSizeUpDown.Margin = new System.Windows.Forms.Padding(4); + this.cmaEsPopulationSizeUpDown.Location = new System.Drawing.Point(202, 93); this.cmaEsPopulationSizeUpDown.Minimum = new decimal(new int[] { 1, 0, 0, 0}); this.cmaEsPopulationSizeUpDown.Name = "cmaEsPopulationSizeUpDown"; - this.cmaEsPopulationSizeUpDown.Size = new System.Drawing.Size(94, 30); + this.cmaEsPopulationSizeUpDown.Size = new System.Drawing.Size(63, 23); this.cmaEsPopulationSizeUpDown.TabIndex = 35; this.cmaEsPopulationSizeUpDown.Value = new decimal(new int[] { 10, @@ -1631,10 +1689,9 @@ private void InitializeComponent() // cmaEsPopulationSizeLabel // this.cmaEsPopulationSizeLabel.AutoSize = true; - this.cmaEsPopulationSizeLabel.Location = new System.Drawing.Point(6, 146); - this.cmaEsPopulationSizeLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.cmaEsPopulationSizeLabel.Location = new System.Drawing.Point(4, 97); this.cmaEsPopulationSizeLabel.Name = "cmaEsPopulationSizeLabel"; - this.cmaEsPopulationSizeLabel.Size = new System.Drawing.Size(144, 23); + this.cmaEsPopulationSizeLabel.Size = new System.Drawing.Size(95, 15); this.cmaEsPopulationSizeLabel.TabIndex = 34; this.cmaEsPopulationSizeLabel.Text = "Population Size"; this.toolTip1.SetToolTip(this.cmaEsPopulationSizeLabel, "A population size of CMA-ES. \r\nWhen set restart_strategy is checked,\r\nthis is use" + @@ -1642,9 +1699,10 @@ private void InitializeComponent() // // cmaEsDefaultButton // - this.cmaEsDefaultButton.Location = new System.Drawing.Point(300, 350); + this.cmaEsDefaultButton.Location = new System.Drawing.Point(200, 233); + this.cmaEsDefaultButton.Margin = new System.Windows.Forms.Padding(2); this.cmaEsDefaultButton.Name = "cmaEsDefaultButton"; - this.cmaEsDefaultButton.Size = new System.Drawing.Size(100, 38); + this.cmaEsDefaultButton.Size = new System.Drawing.Size(67, 25); this.cmaEsDefaultButton.TabIndex = 33; this.cmaEsDefaultButton.Text = "Default"; this.toolTip1.SetToolTip(this.cmaEsDefaultButton, "Set to Optuna\'s default value."); @@ -1654,10 +1712,9 @@ private void InitializeComponent() // cmaEsRestartCheckBox // this.cmaEsRestartCheckBox.AutoSize = true; - this.cmaEsRestartCheckBox.Location = new System.Drawing.Point(10, 108); - this.cmaEsRestartCheckBox.Margin = new System.Windows.Forms.Padding(4); + this.cmaEsRestartCheckBox.Location = new System.Drawing.Point(7, 72); this.cmaEsRestartCheckBox.Name = "cmaEsRestartCheckBox"; - this.cmaEsRestartCheckBox.Size = new System.Drawing.Size(171, 27); + this.cmaEsRestartCheckBox.Size = new System.Drawing.Size(120, 19); this.cmaEsRestartCheckBox.TabIndex = 32; this.cmaEsRestartCheckBox.Text = "RestartStrategy"; this.toolTip1.SetToolTip(this.cmaEsRestartCheckBox, "If given False, \r\nCMA-ES will not restart.\r\nStrategy for restarting CMA-ES optimi" + @@ -1669,10 +1726,9 @@ private void InitializeComponent() // this.cmaEsUseSaparableCmaCheckBox.AutoSize = true; this.cmaEsUseSaparableCmaCheckBox.Enabled = false; - this.cmaEsUseSaparableCmaCheckBox.Location = new System.Drawing.Point(10, 74); - this.cmaEsUseSaparableCmaCheckBox.Margin = new System.Windows.Forms.Padding(4); + this.cmaEsUseSaparableCmaCheckBox.Location = new System.Drawing.Point(7, 49); this.cmaEsUseSaparableCmaCheckBox.Name = "cmaEsUseSaparableCmaCheckBox"; - this.cmaEsUseSaparableCmaCheckBox.Size = new System.Drawing.Size(204, 27); + this.cmaEsUseSaparableCmaCheckBox.Size = new System.Drawing.Size(140, 19); this.cmaEsUseSaparableCmaCheckBox.TabIndex = 31; this.cmaEsUseSaparableCmaCheckBox.Text = "Use Separable CMA"; this.toolTip1.SetToolTip(this.cmaEsUseSaparableCmaCheckBox, resources.GetString("cmaEsUseSaparableCmaCheckBox.ToolTip")); @@ -1682,9 +1738,10 @@ private void InitializeComponent() // cmaEsNStartupTrialsLabel // this.cmaEsNStartupTrialsLabel.AutoSize = true; - this.cmaEsNStartupTrialsLabel.Location = new System.Drawing.Point(8, 4); + this.cmaEsNStartupTrialsLabel.Location = new System.Drawing.Point(5, 3); + this.cmaEsNStartupTrialsLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.cmaEsNStartupTrialsLabel.Name = "cmaEsNStartupTrialsLabel"; - this.cmaEsNStartupTrialsLabel.Size = new System.Drawing.Size(219, 23); + this.cmaEsNStartupTrialsLabel.Size = new System.Drawing.Size(148, 15); this.cmaEsNStartupTrialsLabel.TabIndex = 30; this.cmaEsNStartupTrialsLabel.Text = "Number of startup trials"; this.toolTip1.SetToolTip(this.cmaEsNStartupTrialsLabel, "The independent sampling is used instead of the CMA-ES algorithm\r\nuntil the given" + @@ -1692,7 +1749,8 @@ private void InitializeComponent() // // cmaEsStartupNumUpDown // - this.cmaEsStartupNumUpDown.Location = new System.Drawing.Point(309, 4); + this.cmaEsStartupNumUpDown.Location = new System.Drawing.Point(206, 3); + this.cmaEsStartupNumUpDown.Margin = new System.Windows.Forms.Padding(2); this.cmaEsStartupNumUpDown.Maximum = new decimal(new int[] { 1000, 0, @@ -1704,7 +1762,7 @@ private void InitializeComponent() 0, 0}); this.cmaEsStartupNumUpDown.Name = "cmaEsStartupNumUpDown"; - this.cmaEsStartupNumUpDown.Size = new System.Drawing.Size(94, 30); + this.cmaEsStartupNumUpDown.Size = new System.Drawing.Size(63, 23); this.cmaEsStartupNumUpDown.TabIndex = 29; this.cmaEsStartupNumUpDown.Value = new decimal(new int[] { 1, @@ -1716,10 +1774,9 @@ private void InitializeComponent() // this.cmaEsConsiderPruneTrialsCheckBox.AutoSize = true; this.cmaEsConsiderPruneTrialsCheckBox.Enabled = false; - this.cmaEsConsiderPruneTrialsCheckBox.Location = new System.Drawing.Point(15, 536); - this.cmaEsConsiderPruneTrialsCheckBox.Margin = new System.Windows.Forms.Padding(4); + this.cmaEsConsiderPruneTrialsCheckBox.Location = new System.Drawing.Point(10, 357); this.cmaEsConsiderPruneTrialsCheckBox.Name = "cmaEsConsiderPruneTrialsCheckBox"; - this.cmaEsConsiderPruneTrialsCheckBox.Size = new System.Drawing.Size(230, 27); + this.cmaEsConsiderPruneTrialsCheckBox.Size = new System.Drawing.Size(155, 19); this.cmaEsConsiderPruneTrialsCheckBox.TabIndex = 28; this.cmaEsConsiderPruneTrialsCheckBox.Text = "Consider Pruned Trials"; this.toolTip1.SetToolTip(this.cmaEsConsiderPruneTrialsCheckBox, "If this is True, \r\nthe PRUNED trials are considered for sampling."); @@ -1731,10 +1788,9 @@ private void InitializeComponent() this.cmaEsWarnIndependentSamplingCheckBox.Checked = true; this.cmaEsWarnIndependentSamplingCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; this.cmaEsWarnIndependentSamplingCheckBox.Enabled = false; - this.cmaEsWarnIndependentSamplingCheckBox.Location = new System.Drawing.Point(10, 308); - this.cmaEsWarnIndependentSamplingCheckBox.Margin = new System.Windows.Forms.Padding(4); + this.cmaEsWarnIndependentSamplingCheckBox.Location = new System.Drawing.Point(7, 205); this.cmaEsWarnIndependentSamplingCheckBox.Name = "cmaEsWarnIndependentSamplingCheckBox"; - this.cmaEsWarnIndependentSamplingCheckBox.Size = new System.Drawing.Size(284, 27); + this.cmaEsWarnIndependentSamplingCheckBox.Size = new System.Drawing.Size(191, 19); this.cmaEsWarnIndependentSamplingCheckBox.TabIndex = 27; this.cmaEsWarnIndependentSamplingCheckBox.Text = "Warn Independent Sampling"; this.toolTip1.SetToolTip(this.cmaEsWarnIndependentSamplingCheckBox, "If this is True, \r\na warning message is emitted when the value of a parameter is " + @@ -1744,10 +1800,9 @@ private void InitializeComponent() // cmaEsIncPopsizeLabel // this.cmaEsIncPopsizeLabel.AutoSize = true; - this.cmaEsIncPopsizeLabel.Location = new System.Drawing.Point(6, 182); - this.cmaEsIncPopsizeLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.cmaEsIncPopsizeLabel.Location = new System.Drawing.Point(4, 121); this.cmaEsIncPopsizeLabel.Name = "cmaEsIncPopsizeLabel"; - this.cmaEsIncPopsizeLabel.Size = new System.Drawing.Size(240, 23); + this.cmaEsIncPopsizeLabel.Size = new System.Drawing.Size(159, 15); this.cmaEsIncPopsizeLabel.TabIndex = 26; this.cmaEsIncPopsizeLabel.Text = "Increasing Population Size"; this.toolTip1.SetToolTip(this.cmaEsIncPopsizeLabel, "Multiplier for increasing population size before each restart."); @@ -1755,15 +1810,14 @@ private void InitializeComponent() // cmaEsIncPopSizeUpDown // this.cmaEsIncPopSizeUpDown.Enabled = false; - this.cmaEsIncPopSizeUpDown.Location = new System.Drawing.Point(303, 182); - this.cmaEsIncPopSizeUpDown.Margin = new System.Windows.Forms.Padding(4); + this.cmaEsIncPopSizeUpDown.Location = new System.Drawing.Point(202, 121); this.cmaEsIncPopSizeUpDown.Minimum = new decimal(new int[] { 1, 0, 0, 0}); this.cmaEsIncPopSizeUpDown.Name = "cmaEsIncPopSizeUpDown"; - this.cmaEsIncPopSizeUpDown.Size = new System.Drawing.Size(94, 30); + this.cmaEsIncPopSizeUpDown.Size = new System.Drawing.Size(63, 23); this.cmaEsIncPopSizeUpDown.TabIndex = 25; this.cmaEsIncPopSizeUpDown.Value = new decimal(new int[] { 2, @@ -1774,9 +1828,10 @@ private void InitializeComponent() // cmaEsSigmaCheckBox // this.cmaEsSigmaCheckBox.AutoSize = true; - this.cmaEsSigmaCheckBox.Location = new System.Drawing.Point(10, 39); + this.cmaEsSigmaCheckBox.Location = new System.Drawing.Point(7, 26); + this.cmaEsSigmaCheckBox.Margin = new System.Windows.Forms.Padding(2); this.cmaEsSigmaCheckBox.Name = "cmaEsSigmaCheckBox"; - this.cmaEsSigmaCheckBox.Size = new System.Drawing.Size(101, 27); + this.cmaEsSigmaCheckBox.Size = new System.Drawing.Size(70, 19); this.cmaEsSigmaCheckBox.TabIndex = 24; this.cmaEsSigmaCheckBox.Text = "Sigma0"; this.toolTip1.SetToolTip(this.cmaEsSigmaCheckBox, "Initial standard deviation of CMA-ES. By default, sigma0 is set to min_range / 6," + @@ -1794,9 +1849,10 @@ private void InitializeComponent() 0, 0, 131072}); - this.cmaEsSigmaNumUpDown.Location = new System.Drawing.Point(309, 38); + this.cmaEsSigmaNumUpDown.Location = new System.Drawing.Point(206, 25); + this.cmaEsSigmaNumUpDown.Margin = new System.Windows.Forms.Padding(2); this.cmaEsSigmaNumUpDown.Name = "cmaEsSigmaNumUpDown"; - this.cmaEsSigmaNumUpDown.Size = new System.Drawing.Size(94, 30); + this.cmaEsSigmaNumUpDown.Size = new System.Drawing.Size(63, 23); this.cmaEsSigmaNumUpDown.TabIndex = 23; // // QMC @@ -1807,18 +1863,20 @@ private void InitializeComponent() this.QMC.Controls.Add(this.qmcWarnAsyncSeedingCheckBox); this.QMC.Controls.Add(this.qmcScrambleCheckBox); this.QMC.Controls.Add(this.qmcWarnIndependentSamplingCheckBox); - this.QMC.Location = new System.Drawing.Point(4, 32); + this.QMC.Location = new System.Drawing.Point(4, 24); + this.QMC.Margin = new System.Windows.Forms.Padding(2); this.QMC.Name = "QMC"; - this.QMC.Size = new System.Drawing.Size(412, 393); + this.QMC.Size = new System.Drawing.Size(272, 258); this.QMC.TabIndex = 4; this.QMC.Text = "QMC"; this.QMC.UseVisualStyleBackColor = true; // // qmcDefaultButton // - this.qmcDefaultButton.Location = new System.Drawing.Point(300, 350); + this.qmcDefaultButton.Location = new System.Drawing.Point(200, 233); + this.qmcDefaultButton.Margin = new System.Windows.Forms.Padding(2); this.qmcDefaultButton.Name = "qmcDefaultButton"; - this.qmcDefaultButton.Size = new System.Drawing.Size(100, 38); + this.qmcDefaultButton.Size = new System.Drawing.Size(67, 25); this.qmcDefaultButton.TabIndex = 33; this.qmcDefaultButton.Text = "Default"; this.toolTip1.SetToolTip(this.qmcDefaultButton, "Set to Optuna\'s default value."); @@ -1831,19 +1889,20 @@ private void InitializeComponent() this.qmcTypeComboBox.Items.AddRange(new object[] { "sobol", "halton"}); - this.qmcTypeComboBox.Location = new System.Drawing.Point(267, 10); - this.qmcTypeComboBox.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.qmcTypeComboBox.Location = new System.Drawing.Point(178, 7); + this.qmcTypeComboBox.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.qmcTypeComboBox.Name = "qmcTypeComboBox"; - this.qmcTypeComboBox.Size = new System.Drawing.Size(134, 31); + this.qmcTypeComboBox.Size = new System.Drawing.Size(91, 23); this.qmcTypeComboBox.TabIndex = 32; this.qmcTypeComboBox.Text = "sobol"; // // qmcTypeLabel // this.qmcTypeLabel.AutoSize = true; - this.qmcTypeLabel.Location = new System.Drawing.Point(3, 14); + this.qmcTypeLabel.Location = new System.Drawing.Point(2, 9); + this.qmcTypeLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.qmcTypeLabel.Name = "qmcTypeLabel"; - this.qmcTypeLabel.Size = new System.Drawing.Size(97, 23); + this.qmcTypeLabel.Size = new System.Drawing.Size(66, 15); this.qmcTypeLabel.TabIndex = 31; this.qmcTypeLabel.Text = "QMC Type"; this.toolTip1.SetToolTip(this.qmcTypeLabel, "The type of QMC sequence to be sampled.\r\n"); @@ -1854,9 +1913,10 @@ private void InitializeComponent() this.qmcWarnAsyncSeedingCheckBox.Checked = true; this.qmcWarnAsyncSeedingCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; this.qmcWarnAsyncSeedingCheckBox.Enabled = false; - this.qmcWarnAsyncSeedingCheckBox.Location = new System.Drawing.Point(8, 122); + this.qmcWarnAsyncSeedingCheckBox.Location = new System.Drawing.Point(5, 81); + this.qmcWarnAsyncSeedingCheckBox.Margin = new System.Windows.Forms.Padding(2); this.qmcWarnAsyncSeedingCheckBox.Name = "qmcWarnAsyncSeedingCheckBox"; - this.qmcWarnAsyncSeedingCheckBox.Size = new System.Drawing.Size(284, 27); + this.qmcWarnAsyncSeedingCheckBox.Size = new System.Drawing.Size(190, 19); this.qmcWarnAsyncSeedingCheckBox.TabIndex = 30; this.qmcWarnAsyncSeedingCheckBox.Text = "Warn Asynchronous Seeding"; this.toolTip1.SetToolTip(this.qmcWarnAsyncSeedingCheckBox, "If this is True, \r\na warning message is emitted \r\nwhen the scrambling (randomizat" + @@ -1867,9 +1927,10 @@ private void InitializeComponent() // qmcScrambleCheckBox // this.qmcScrambleCheckBox.AutoSize = true; - this.qmcScrambleCheckBox.Location = new System.Drawing.Point(8, 56); + this.qmcScrambleCheckBox.Location = new System.Drawing.Point(5, 37); + this.qmcScrambleCheckBox.Margin = new System.Windows.Forms.Padding(2); this.qmcScrambleCheckBox.Name = "qmcScrambleCheckBox"; - this.qmcScrambleCheckBox.Size = new System.Drawing.Size(116, 27); + this.qmcScrambleCheckBox.Size = new System.Drawing.Size(81, 19); this.qmcScrambleCheckBox.TabIndex = 29; this.qmcScrambleCheckBox.Text = "Scramble"; this.toolTip1.SetToolTip(this.qmcScrambleCheckBox, "If this option is True, \r\nscrambling (randomization) is applied to the QMC sequen" + @@ -1882,9 +1943,10 @@ private void InitializeComponent() this.qmcWarnIndependentSamplingCheckBox.Checked = true; this.qmcWarnIndependentSamplingCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; this.qmcWarnIndependentSamplingCheckBox.Enabled = false; - this.qmcWarnIndependentSamplingCheckBox.Location = new System.Drawing.Point(8, 88); + this.qmcWarnIndependentSamplingCheckBox.Location = new System.Drawing.Point(5, 59); + this.qmcWarnIndependentSamplingCheckBox.Margin = new System.Windows.Forms.Padding(2); this.qmcWarnIndependentSamplingCheckBox.Name = "qmcWarnIndependentSamplingCheckBox"; - this.qmcWarnIndependentSamplingCheckBox.Size = new System.Drawing.Size(284, 27); + this.qmcWarnIndependentSamplingCheckBox.Size = new System.Drawing.Size(191, 19); this.qmcWarnIndependentSamplingCheckBox.TabIndex = 28; this.qmcWarnIndependentSamplingCheckBox.Text = "Warn Independent Sampling"; this.toolTip1.SetToolTip(this.qmcWarnIndependentSamplingCheckBox, "If this is True, \r\na warning message is emitted when the value of a parameter\r\nis" + @@ -1893,20 +1955,34 @@ private void InitializeComponent() // // Misc // + this.Misc.Controls.Add(this.ignoreDuplicateSamplingCheckBox); this.Misc.Controls.Add(this.miscLogComboBox); this.Misc.Controls.Add(this.miscLogLevelLabel); this.Misc.Controls.Add(this.checkPythonLibrariesCheckBox); this.Misc.Controls.Add(this.miscDefaultButton); this.Misc.Controls.Add(this.runGarbageCollectionComboBox); this.Misc.Controls.Add(this.runGarbageCollectionLabel); - this.Misc.Location = new System.Drawing.Point(4, 32); + this.Misc.Location = new System.Drawing.Point(4, 24); + this.Misc.Margin = new System.Windows.Forms.Padding(2); this.Misc.Name = "Misc"; - this.Misc.Padding = new System.Windows.Forms.Padding(3); - this.Misc.Size = new System.Drawing.Size(412, 393); + this.Misc.Padding = new System.Windows.Forms.Padding(2); + this.Misc.Size = new System.Drawing.Size(272, 258); this.Misc.TabIndex = 5; this.Misc.Text = "Misc"; this.Misc.UseVisualStyleBackColor = true; // + // ignoreDuplicateSamplingCheckBox + // + this.ignoreDuplicateSamplingCheckBox.AutoSize = true; + this.ignoreDuplicateSamplingCheckBox.Location = new System.Drawing.Point(7, 94); + this.ignoreDuplicateSamplingCheckBox.Margin = new System.Windows.Forms.Padding(2); + this.ignoreDuplicateSamplingCheckBox.Name = "ignoreDuplicateSamplingCheckBox"; + this.ignoreDuplicateSamplingCheckBox.Size = new System.Drawing.Size(176, 19); + this.ignoreDuplicateSamplingCheckBox.TabIndex = 40; + this.ignoreDuplicateSamplingCheckBox.Text = "Ignore duplicate sampling"; + this.ignoreDuplicateSamplingCheckBox.UseVisualStyleBackColor = true; + this.ignoreDuplicateSamplingCheckBox.CheckedChanged += new System.EventHandler(this.IgnoreDuplicateSamplingCheckBox_CheckedChanged); + // // miscLogComboBox // this.miscLogComboBox.FormattingEnabled = true; @@ -1914,10 +1990,10 @@ private void InitializeComponent() "Verbose", "Debug", "Info"}); - this.miscLogComboBox.Location = new System.Drawing.Point(236, 56); - this.miscLogComboBox.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.miscLogComboBox.Location = new System.Drawing.Point(157, 37); + this.miscLogComboBox.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.miscLogComboBox.Name = "miscLogComboBox"; - this.miscLogComboBox.Size = new System.Drawing.Size(169, 31); + this.miscLogComboBox.Size = new System.Drawing.Size(114, 23); this.miscLogComboBox.TabIndex = 39; this.miscLogComboBox.Text = "Info"; this.miscLogComboBox.SelectedIndexChanged += new System.EventHandler(this.MiscLogComboBox_SelectedIndexChanged); @@ -1925,9 +2001,10 @@ private void InitializeComponent() // miscLogLevelLabel // this.miscLogLevelLabel.AutoSize = true; - this.miscLogLevelLabel.Location = new System.Drawing.Point(6, 60); + this.miscLogLevelLabel.Location = new System.Drawing.Point(4, 40); + this.miscLogLevelLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.miscLogLevelLabel.Name = "miscLogLevelLabel"; - this.miscLogLevelLabel.Size = new System.Drawing.Size(88, 23); + this.miscLogLevelLabel.Size = new System.Drawing.Size(59, 15); this.miscLogLevelLabel.TabIndex = 38; this.miscLogLevelLabel.Text = "Log level"; this.toolTip1.SetToolTip(this.miscLogLevelLabel, "Setting output log level. verbose has most information."); @@ -1935,18 +2012,20 @@ private void InitializeComponent() // checkPythonLibrariesCheckBox // this.checkPythonLibrariesCheckBox.AutoSize = true; - this.checkPythonLibrariesCheckBox.Location = new System.Drawing.Point(10, 106); + this.checkPythonLibrariesCheckBox.Location = new System.Drawing.Point(7, 71); + this.checkPythonLibrariesCheckBox.Margin = new System.Windows.Forms.Padding(2); this.checkPythonLibrariesCheckBox.Name = "checkPythonLibrariesCheckBox"; - this.checkPythonLibrariesCheckBox.Size = new System.Drawing.Size(377, 27); + this.checkPythonLibrariesCheckBox.Size = new System.Drawing.Size(252, 19); this.checkPythonLibrariesCheckBox.TabIndex = 37; this.checkPythonLibrariesCheckBox.Text = "Run Python installer at window startup"; this.checkPythonLibrariesCheckBox.UseVisualStyleBackColor = true; // // miscDefaultButton // - this.miscDefaultButton.Location = new System.Drawing.Point(300, 350); + this.miscDefaultButton.Location = new System.Drawing.Point(200, 233); + this.miscDefaultButton.Margin = new System.Windows.Forms.Padding(2); this.miscDefaultButton.Name = "miscDefaultButton"; - this.miscDefaultButton.Size = new System.Drawing.Size(100, 38); + this.miscDefaultButton.Size = new System.Drawing.Size(67, 25); this.miscDefaultButton.TabIndex = 36; this.miscDefaultButton.Text = "Default"; this.toolTip1.SetToolTip(this.miscDefaultButton, "Set to Tunny\'s default value."); @@ -1959,10 +2038,10 @@ private void InitializeComponent() "Always", "HasGeometry", "NoExecute"}); - this.runGarbageCollectionComboBox.Location = new System.Drawing.Point(236, 14); - this.runGarbageCollectionComboBox.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.runGarbageCollectionComboBox.Location = new System.Drawing.Point(157, 9); + this.runGarbageCollectionComboBox.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.runGarbageCollectionComboBox.Name = "runGarbageCollectionComboBox"; - this.runGarbageCollectionComboBox.Size = new System.Drawing.Size(169, 31); + this.runGarbageCollectionComboBox.Size = new System.Drawing.Size(114, 23); this.runGarbageCollectionComboBox.TabIndex = 34; this.runGarbageCollectionComboBox.Text = "HasGeometry"; this.runGarbageCollectionComboBox.SelectedIndexChanged += new System.EventHandler(this.RunGarbageCollectionComboBox_SelectedIndexChanged); @@ -1970,9 +2049,10 @@ private void InitializeComponent() // runGarbageCollectionLabel // this.runGarbageCollectionLabel.AutoSize = true; - this.runGarbageCollectionLabel.Location = new System.Drawing.Point(6, 16); + this.runGarbageCollectionLabel.Location = new System.Drawing.Point(4, 11); + this.runGarbageCollectionLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.runGarbageCollectionLabel.Name = "runGarbageCollectionLabel"; - this.runGarbageCollectionLabel.Size = new System.Drawing.Size(214, 23); + this.runGarbageCollectionLabel.Size = new System.Drawing.Size(142, 15); this.runGarbageCollectionLabel.TabIndex = 33; this.runGarbageCollectionLabel.Text = "Run Garbage Collection"; this.toolTip1.SetToolTip(this.runGarbageCollectionLabel, "Setting whether or not per-trial data is targeted for garbage collection"); @@ -1982,19 +2062,21 @@ private void InitializeComponent() this.fileTabPage.Controls.Add(this.outputDebugLogButton); this.fileTabPage.Controls.Add(this.groupBox1); this.fileTabPage.Controls.Add(this.licenseGroupBox); - this.fileTabPage.Location = new System.Drawing.Point(4, 32); + this.fileTabPage.Location = new System.Drawing.Point(4, 24); + this.fileTabPage.Margin = new System.Windows.Forms.Padding(2); this.fileTabPage.Name = "fileTabPage"; - this.fileTabPage.Padding = new System.Windows.Forms.Padding(3); - this.fileTabPage.Size = new System.Drawing.Size(428, 442); + this.fileTabPage.Padding = new System.Windows.Forms.Padding(2); + this.fileTabPage.Size = new System.Drawing.Size(283, 291); this.fileTabPage.TabIndex = 4; this.fileTabPage.Text = "File"; this.fileTabPage.UseVisualStyleBackColor = true; // // outputDebugLogButton // - this.outputDebugLogButton.Location = new System.Drawing.Point(80, 388); + this.outputDebugLogButton.Location = new System.Drawing.Point(53, 259); + this.outputDebugLogButton.Margin = new System.Windows.Forms.Padding(2); this.outputDebugLogButton.Name = "outputDebugLogButton"; - this.outputDebugLogButton.Size = new System.Drawing.Size(264, 38); + this.outputDebugLogButton.Size = new System.Drawing.Size(176, 25); this.outputDebugLogButton.TabIndex = 10; this.outputDebugLogButton.Text = "Output Debug Log"; this.outputDebugLogButton.UseVisualStyleBackColor = true; @@ -2005,19 +2087,21 @@ private void InitializeComponent() this.groupBox1.Controls.Add(this.setResultFilePathButton); this.groupBox1.Controls.Add(this.clearResultButton); this.groupBox1.Controls.Add(this.openResultFolderButton); - this.groupBox1.Location = new System.Drawing.Point(22, 6); + this.groupBox1.Location = new System.Drawing.Point(15, 4); + this.groupBox1.Margin = new System.Windows.Forms.Padding(2); this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(378, 200); + this.groupBox1.Padding = new System.Windows.Forms.Padding(2); + this.groupBox1.Size = new System.Drawing.Size(252, 133); this.groupBox1.TabIndex = 9; this.groupBox1.TabStop = false; this.groupBox1.Text = "Result"; // // setResultFilePathButton // - this.setResultFilePathButton.Location = new System.Drawing.Point(58, 34); - this.setResultFilePathButton.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.setResultFilePathButton.Location = new System.Drawing.Point(39, 23); + this.setResultFilePathButton.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.setResultFilePathButton.Name = "setResultFilePathButton"; - this.setResultFilePathButton.Size = new System.Drawing.Size(264, 39); + this.setResultFilePathButton.Size = new System.Drawing.Size(176, 26); this.setResultFilePathButton.TabIndex = 7; this.setResultFilePathButton.Text = "Set file path"; this.setResultFilePathButton.UseVisualStyleBackColor = true; @@ -2025,10 +2109,10 @@ private void InitializeComponent() // // clearResultButton // - this.clearResultButton.Location = new System.Drawing.Point(58, 136); - this.clearResultButton.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.clearResultButton.Location = new System.Drawing.Point(39, 91); + this.clearResultButton.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.clearResultButton.Name = "clearResultButton"; - this.clearResultButton.Size = new System.Drawing.Size(264, 42); + this.clearResultButton.Size = new System.Drawing.Size(176, 28); this.clearResultButton.TabIndex = 5; this.clearResultButton.Text = "Clear file"; this.clearResultButton.UseVisualStyleBackColor = true; @@ -2036,10 +2120,10 @@ private void InitializeComponent() // // openResultFolderButton // - this.openResultFolderButton.Location = new System.Drawing.Point(58, 86); - this.openResultFolderButton.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.openResultFolderButton.Location = new System.Drawing.Point(39, 57); + this.openResultFolderButton.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.openResultFolderButton.Name = "openResultFolderButton"; - this.openResultFolderButton.Size = new System.Drawing.Size(264, 39); + this.openResultFolderButton.Size = new System.Drawing.Size(176, 26); this.openResultFolderButton.TabIndex = 6; this.openResultFolderButton.Text = "Open folder"; this.openResultFolderButton.UseVisualStyleBackColor = true; @@ -2049,19 +2133,21 @@ private void InitializeComponent() // this.licenseGroupBox.Controls.Add(this.showThirdPartyLicenseButton); this.licenseGroupBox.Controls.Add(this.showTunnyLicenseButton); - this.licenseGroupBox.Location = new System.Drawing.Point(22, 212); + this.licenseGroupBox.Location = new System.Drawing.Point(15, 141); + this.licenseGroupBox.Margin = new System.Windows.Forms.Padding(2); this.licenseGroupBox.Name = "licenseGroupBox"; - this.licenseGroupBox.Size = new System.Drawing.Size(378, 158); + this.licenseGroupBox.Padding = new System.Windows.Forms.Padding(2); + this.licenseGroupBox.Size = new System.Drawing.Size(252, 105); this.licenseGroupBox.TabIndex = 8; this.licenseGroupBox.TabStop = false; this.licenseGroupBox.Text = "License"; // // showThirdPartyLicenseButton // - this.showThirdPartyLicenseButton.Location = new System.Drawing.Point(58, 98); - this.showThirdPartyLicenseButton.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.showThirdPartyLicenseButton.Location = new System.Drawing.Point(39, 65); + this.showThirdPartyLicenseButton.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.showThirdPartyLicenseButton.Name = "showThirdPartyLicenseButton"; - this.showThirdPartyLicenseButton.Size = new System.Drawing.Size(264, 42); + this.showThirdPartyLicenseButton.Size = new System.Drawing.Size(176, 28); this.showThirdPartyLicenseButton.TabIndex = 8; this.showThirdPartyLicenseButton.Text = "Show Third Party License"; this.showThirdPartyLicenseButton.UseVisualStyleBackColor = true; @@ -2069,10 +2155,10 @@ private void InitializeComponent() // // showTunnyLicenseButton // - this.showTunnyLicenseButton.Location = new System.Drawing.Point(58, 44); - this.showTunnyLicenseButton.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.showTunnyLicenseButton.Location = new System.Drawing.Point(39, 29); + this.showTunnyLicenseButton.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.showTunnyLicenseButton.Name = "showTunnyLicenseButton"; - this.showTunnyLicenseButton.Size = new System.Drawing.Size(264, 42); + this.showTunnyLicenseButton.Size = new System.Drawing.Size(176, 28); this.showTunnyLicenseButton.TabIndex = 7; this.showTunnyLicenseButton.Text = "Show Tunny License"; this.showTunnyLicenseButton.UseVisualStyleBackColor = true; @@ -2080,13 +2166,13 @@ private void InitializeComponent() // // OptimizationWindow // - this.AutoScaleDimensions = new System.Drawing.SizeF(144F, 144F); + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; - this.ClientSize = new System.Drawing.Size(434, 484); + this.ClientSize = new System.Drawing.Size(289, 323); this.Controls.Add(this.optimizeTabControl); this.Font = new System.Drawing.Font("Meiryo UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6); + this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.Name = "OptimizationWindow"; this.Text = "Tunny"; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormClosingXButton); @@ -2291,6 +2377,7 @@ private void InitializeComponent() private System.Windows.Forms.NumericUpDown gpStartupNumUpDown; private System.Windows.Forms.CheckBox gpDeterministicObjectiveCheckBox; private System.Windows.Forms.Button gpDefaultButton; + private System.Windows.Forms.CheckBox ignoreDuplicateSamplingCheckBox; } } diff --git a/Tunny/UI/OptimizationWindow.cs b/Tunny/UI/OptimizationWindow.cs index c71e7d09..df4408b4 100644 --- a/Tunny/UI/OptimizationWindow.cs +++ b/Tunny/UI/OptimizationWindow.cs @@ -165,7 +165,9 @@ private void SetUIValues() runGarbageCollectionComboBox.SelectedIndex = (int)_settings.Optimize.GcAfterTrial; miscLogComboBox.SelectedIndex = (int)_settings.LogLevel; + ignoreDuplicateSamplingCheckBox.Checked = _settings.Optimize.IgnoreDuplicateSampling; } + private void GetUIValues() { TLog.MethodStart(); @@ -181,6 +183,7 @@ private void GetUIValues() _settings.Result.SelectVisualizeType = visualizeTypeComboBox.SelectedIndex; _settings.Result.NumberOfClusters = (int)visualizeClusterNumUpDown.Value; _settings.CheckPythonLibraries = checkPythonLibrariesCheckBox.Checked; + _settings.Optimize.IgnoreDuplicateSampling = ignoreDuplicateSamplingCheckBox.Checked; _settings.Optimize.Sampler = GetSamplerSettings(_settings.Optimize.Sampler); _settings.Optimize.GcAfterTrial = (GcAfterTrial)runGarbageCollectionComboBox.SelectedIndex; _settings.LogLevel = (LogEventLevel)miscLogComboBox.SelectedIndex; diff --git a/Tunny/UI/OptimizeWindowTab/SettingsTab.cs b/Tunny/UI/OptimizeWindowTab/SettingsTab.cs index a0de7873..cb658037 100644 --- a/Tunny/UI/OptimizeWindowTab/SettingsTab.cs +++ b/Tunny/UI/OptimizeWindowTab/SettingsTab.cs @@ -349,5 +349,11 @@ private void MiscLogComboBox_SelectedIndexChanged(object sender, EventArgs e) TLog.SetLoggingLevel(level); _settings.LogLevel = level; } + + private void IgnoreDuplicateSamplingCheckBox_CheckedChanged(object sender, EventArgs e) + { + TLog.MethodStart(); + _settings.Optimize.IgnoreDuplicateSampling = ignoreDuplicateSamplingCheckBox.Checked; + } } } From 68a3ed6dd4d323985e5515d12e59728a076e9838 Mon Sep 17 00:00:00 2001 From: NATSUME Hiroaki Date: Wed, 8 May 2024 18:56:22 +0900 Subject: [PATCH 09/14] Add ignore duplicate sampling setting --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d4c7221e..3bb857a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ Please see [here](https://github.com/hrntsm/Tunny/releases) for the data release ## [v0.11.1] -YYYY-MM-DD +### Added + +- Ignore duplicate sampling setting + ### Changed - Bump optuna library From fee0063699ea592f0cc5b8080dd401910cd32f62 Mon Sep 17 00:00:00 2001 From: NATSUME Hiroaki Date: Wed, 8 May 2024 19:03:57 +0900 Subject: [PATCH 10/14] Clean code --- Tunny/Input/Objective.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Tunny/Input/Objective.cs b/Tunny/Input/Objective.cs index b59624f6..18a5c112 100644 --- a/Tunny/Input/Objective.cs +++ b/Tunny/Input/Objective.cs @@ -28,7 +28,6 @@ public class Objective public int Length => Numbers.Length + Images.Length + (Geometries.Length > 0 ? 1 : 0); public int NoNumberLength => Images.Length + (Geometries.Length > 0 ? 1 : 0); - public Objective(double[] values) { TLog.MethodStart(); From e6523110cb5fb31ea11576829a046fb87e9a889f Mon Sep 17 00:00:00 2001 From: NATSUME Hiroaki Date: Thu, 9 May 2024 19:22:39 +0900 Subject: [PATCH 11/14] Fix ignore dup error when trial has constraint --- Tunny/Solver/Algorithm.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Tunny/Solver/Algorithm.cs b/Tunny/Solver/Algorithm.cs index 5f28a437..a0b146a5 100644 --- a/Tunny/Solver/Algorithm.cs +++ b/Tunny/Solver/Algorithm.cs @@ -378,8 +378,8 @@ private TrialGrasshopperItems RunSingleOptimizeStep(OptimizationHandlingInfo opt private static bool IsSampleDuplicate(dynamic trial, out TrialGrasshopperItems result) { - PyModule ps = Py.CreateScope(); double[] values; + PyModule ps = Py.CreateScope(); ps.Exec( "def check_duplicate(trial):\n" + " import optuna\n" + @@ -389,6 +389,8 @@ private static bool IsSampleDuplicate(dynamic trial, out TrialGrasshopperItems r " for t in reversed(trials_to_consider):\n" + " if trial.params == t.params:\n" + " trial.set_user_attr('NOTE', f'trial {t.number} and trial {trial.number} were duplicate parameters.')\n" + + " if 'Constraint' in t.user_attrs:\n" + + " trial.set_user_attr('Constraint', t.user_attrs['Constraint'])\n" + " return t.values\n" + " return None\n" ); From 7a411bd5432457d1cb4863e57c1a90dc395029aa Mon Sep 17 00:00:00 2001 From: NATSUME Hiroaki Date: Fri, 10 May 2024 13:36:01 +0900 Subject: [PATCH 12/14] Bump the version up to v0.11.1 --- CHANGELOG.md | 4 ++-- Optuna/Optuna.csproj | 1 + PYTHON_PACKAGE_LICENSES | 4 ++-- Tunny.Core/Tunny.Core.csproj | 2 +- Tunny/Tunny.csproj | 2 +- Tunny/TunnyInfo.cs | 2 +- Yak/manifest.yml | 2 +- 7 files changed, 9 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3bb857a7..fd523ce7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p Please see [here](https://github.com/hrntsm/Tunny/releases) for the data released for each version. -## [v0.11.1] -YYYY-MM-DD +## [v0.11.1] -2024-05-10 ### Added @@ -20,7 +20,7 @@ Please see [here](https://github.com/hrntsm/Tunny/releases) for the data release ### Fixed -- SolutionExpire timing was off when using ValueList. +- SolutionExpire timing was wrong when using ValueList. - FishAttribute component "Attr" input index off by one error. ## [v0.11.0] -2024-03-20 diff --git a/Optuna/Optuna.csproj b/Optuna/Optuna.csproj index b92c7f14..0750b3ee 100644 --- a/Optuna/Optuna.csproj +++ b/Optuna/Optuna.csproj @@ -2,6 +2,7 @@ net48 + 0.11.1 True latest-recommended diff --git a/PYTHON_PACKAGE_LICENSES b/PYTHON_PACKAGE_LICENSES index d58db3f1..df9e3640 100644 --- a/PYTHON_PACKAGE_LICENSES +++ b/PYTHON_PACKAGE_LICENSES @@ -32,8 +32,8 @@ summary | networkx | 3.2.1 | BSD License | | numpy | 1.26.0 | BSD License | | opt-einsum | 3.3.0 | MIT | -| optuna | 3.6.0 | MIT License | -| optuna-dashboard | 0.15.0 | MIT License | +| optuna | 3.6.1 | MIT License | +| optuna-dashboard | 0.15.1 | MIT License | | packaging | 23.1 | Apache Software License; BSD License | | pip | 23.2.1 | MIT License | | plotly | 5.16.1 | MIT License | diff --git a/Tunny.Core/Tunny.Core.csproj b/Tunny.Core/Tunny.Core.csproj index cda4026e..ac3e67bc 100644 --- a/Tunny.Core/Tunny.Core.csproj +++ b/Tunny.Core/Tunny.Core.csproj @@ -2,7 +2,7 @@ net48 - 0.11.0 + 0.11.1 True latest-recommended diff --git a/Tunny/Tunny.csproj b/Tunny/Tunny.csproj index 721031f8..ba04b0f9 100644 --- a/Tunny/Tunny.csproj +++ b/Tunny/Tunny.csproj @@ -2,7 +2,7 @@ net48 - 0.11.0 + 0.11.1 Tunny Tunny is an optimization component wrapped in optuna. .gha diff --git a/Tunny/TunnyInfo.cs b/Tunny/TunnyInfo.cs index 89c71d45..9deba5b3 100644 --- a/Tunny/TunnyInfo.cs +++ b/Tunny/TunnyInfo.cs @@ -10,7 +10,7 @@ namespace Tunny public class Tunny : GH_AssemblyInfo { public override string Name => "Tunny"; - public override string Version => "0.11.0"; + public override string Version => "0.11.1"; public override Bitmap Icon => Resource.TunnyIcon; public override string Description => "Tunny is an optimization component wrapped in optuna."; public override Guid Id => new Guid("01E58960-AFAA-48FF-BC90-174FDC4A9D64"); diff --git a/Yak/manifest.yml b/Yak/manifest.yml index 6ceb48aa..26835db4 100644 --- a/Yak/manifest.yml +++ b/Yak/manifest.yml @@ -1,6 +1,6 @@ --- name: Tunny -version: 0.11.0 +version: 0.11.1 authors: - hrntsm description: 🐟Tunny🐟 is Grasshopper's optimization component using Optuna, an open source hyperparameter auto-optimization framework. Tunny includes some features such as multi-objective optimization with constraint, Quasi-MonteCarlo sampling and dashboards for results analysis etc. From 98fc321f05e59a8ccefdbc47d26111407846e425 Mon Sep 17 00:00:00 2001 From: NATSUME Hiroaki Date: Fri, 10 May 2024 13:46:38 +0900 Subject: [PATCH 13/14] Add ProgressState tests --- Tunny.CoreTests/Handler/ProgressStateTests.cs | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 Tunny.CoreTests/Handler/ProgressStateTests.cs diff --git a/Tunny.CoreTests/Handler/ProgressStateTests.cs b/Tunny.CoreTests/Handler/ProgressStateTests.cs new file mode 100644 index 00000000..40dd2b36 --- /dev/null +++ b/Tunny.CoreTests/Handler/ProgressStateTests.cs @@ -0,0 +1,41 @@ +using System.Collections.Generic; + +using Xunit; + +namespace Tunny.Core.Handler.Tests +{ + public class ProgressStateTests + { + [Fact] + public void ProgressStateCtorTest() + { + var progressState = new ProgressState(); + Assert.NotNull(progressState); + } + + [Fact] + public void ProgressStatePropertiesTest() + { + var param = new List(); + double[][] bests = new double[1][]; + var progressState = new ProgressState + { + Parameter = param, + TrialNumber = 0, + ObjectiveNum = 0, + BestValues = bests, + HypervolumeRatio = 0, + EstimatedTimeRemaining = new System.TimeSpan(), + IsReportOnly = false + }; + + Assert.Equal(param, progressState.Parameter); + Assert.Equal(0, progressState.TrialNumber); + Assert.Equal(0, progressState.ObjectiveNum); + Assert.Equal(bests, progressState.BestValues); + Assert.Equal(0, progressState.HypervolumeRatio); + Assert.Equal(new System.TimeSpan(), progressState.EstimatedTimeRemaining); + Assert.False(progressState.IsReportOnly); + } + } +} From e28837ba8e4c910c1969c9ed6fae971ce68d7f0d Mon Sep 17 00:00:00 2001 From: NATSUME Hiroaki Date: Fri, 10 May 2024 14:04:23 +0900 Subject: [PATCH 14/14] Fix codacy issue --- Tunny/Component/Input/TunnyValueList.cs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Tunny/Component/Input/TunnyValueList.cs b/Tunny/Component/Input/TunnyValueList.cs index 572a5803..02758ba2 100644 --- a/Tunny/Component/Input/TunnyValueList.cs +++ b/Tunny/Component/Input/TunnyValueList.cs @@ -8,7 +8,7 @@ namespace Tunny.Component.Util { public class TunnyValueList : GH_ValueList { - public TunnyValueList() : base() + public TunnyValueList() { Category = "Tunny"; SubCategory = "Input"; @@ -78,26 +78,26 @@ public TunnyValueListAttributes(GH_ValueList owner) : base(owner) protected override void Render(GH_Canvas canvas, Graphics graphics, GH_CanvasChannel channel) { - switch (channel) + if (channel == GH_CanvasChannel.Objects) { - case GH_CanvasChannel.Objects: - DrawObjects(canvas, graphics, channel); - break; - default: - base.Render(canvas, graphics, channel); - break; + DrawObjects(canvas, graphics, channel); + } + else + { + base.Render(canvas, graphics, channel); } } private void DrawObjects(GH_Canvas canvas, Graphics graphics, GH_CanvasChannel channel) { - var style = new GH_PaletteStyle(Color.CornflowerBlue, Color.DarkBlue, Color.Black); + var tunnyStyle = new GH_PaletteStyle(Color.CornflowerBlue, Color.DarkBlue, Color.Black); + GH_PaletteStyle normalStyle = GH_Skin.palette_normal_standard; GH_PaletteStyle warningStyle = GH_Skin.palette_warning_standard; GH_PaletteStyle hiddenStyle = GH_Skin.palette_hidden_standard; - GH_Skin.palette_normal_standard = style; - GH_Skin.palette_warning_standard = style; - GH_Skin.palette_hidden_standard = style; + GH_Skin.palette_normal_standard = tunnyStyle; + GH_Skin.palette_warning_standard = tunnyStyle; + GH_Skin.palette_hidden_standard = tunnyStyle; base.Render(canvas, graphics, channel); GH_Skin.palette_normal_standard = normalStyle; GH_Skin.palette_warning_standard = warningStyle;