Skip to content

Commit

Permalink
Merge pull request #153 from hrntsm/feature/toggle-realtime-opt-resul…
Browse files Browse the repository at this point in the history
…t-ui

Feature/toggle realtime opt result UI
  • Loading branch information
hrntsm authored Mar 18, 2023
2 parents d2f07ce + f95ced1 commit e6f309c
Show file tree
Hide file tree
Showing 11 changed files with 253 additions and 152 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ Please see [here](https://github.com/hrntsm/Tunny/releases) for the data release
- Mode that works faster instead of saving optimization results during optimization.
- Support Journal storage.
- Since saving to the sqlite storage format that had been used up to now sometimes resulted in errors during optimization, a different storage format was supported.
- Checkbox to toggle whether results are shown in the UI in Realtime.
- There was a problem that the display of results on the UI in Realtime, which was added in v0.6, caused the optimization speed to gradually slow down.

### Changed

Expand All @@ -32,6 +34,8 @@ Please see [here](https://github.com/hrntsm/Tunny/releases) for the data release

### Security

- Bump torch from 1.12.0 to 1.13.1

## [v0.6.0] -2022-12-23

### Added
Expand Down
1 change: 1 addition & 0 deletions Tunny/Settings/Optimize.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@ public class Optimize
public int SelectSampler { get; set; }
public double Timeout { get; set; }
public GcAfterTrial GcAfterTrial { get; set; } = GcAfterTrial.HasGeometry;
public bool ShowRealtimeResult { get; set; }
}
}
97 changes: 57 additions & 40 deletions Tunny/Solver/Algorithm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public class Algorithm
private string[] ObjNickName { get; set; }
private TunnySettings Settings { get; set; }
private Func<ProgressState, int, EvaluatedGHResult> EvalFunc { get; set; }
private double[] XOpt { get; set; }
public double[] XOpt { get; private set; }
private double[] FxOpt { get; set; }
public EndState EndState { get; set; }
public Dictionary<string, FishEgg> FishEgg { get; set; }
Expand Down Expand Up @@ -189,28 +189,14 @@ private void RunOptimize(int nTrials, double timeout, dynamic study, dynamic sto
result = new EvaluatedGHResult();
int trialNum = 0;
DateTime startTime = DateTime.Now;

EnqueueTrial(study, enqueueItems);

while (true)
{
if (trialNum >= nTrials)
{
EndState = EndState.AllTrialCompleted;
break;
}
else if (timeout > 0 && (DateTime.Now - startTime).TotalSeconds >= timeout)
{
EndState = EndState.Timeout;
break;
}
else if (OptimizeLoop.IsForcedStopOptimize)
if (CheckOptimizeComplete(nTrials, timeout, trialNum, startTime))
{
EndState = EndState.StoppedByUser;
OptimizeLoop.IsForcedStopOptimize = false;
break;
}

int progress = trialNum * 100 / nTrials;
dynamic trial = study.ask();

Expand All @@ -225,19 +211,7 @@ private void RunOptimize(int nTrials, double timeout, dynamic study, dynamic sto
: trial.suggest_float(Variables[j].NickName, Variables[j].LowerBond, Variables[j].UpperBond, step: Variables[j].Epsilon);
}

dynamic[] bestTrials = study.best_trials;
double[][] bestValues = bestTrials.Select(t => (double[])t.values).ToArray();
var pState = new ProgressState
{
TrialNumber = trialNum,
ObjectiveNum = ObjNickName.Length,
BestValues = bestValues,
Values = xTest.Select(v => (decimal)v).ToList(),
HypervolumeRatio = trialNum == 0 ? 0 : trialNum == 1 || ObjNickName.Length == 1 ? 1 : Hypervolume.Compute2dHypervolumeRatio(study),
EstimatedTimeRemaining = timeout <= 0
? TimeSpan.FromSeconds((DateTime.Now - startTime).TotalSeconds * (nTrials - trialNum) / (trialNum + 1))
: TimeSpan.FromSeconds(timeout - (DateTime.Now - startTime).TotalSeconds)
};
ProgressState pState = SetProgressState(nTrials, timeout, xTest, trialNum, startTime, study);
result = EvalFunc(pState, progress);

if (result.ObjectiveValues.Contains(double.NaN))
Expand Down Expand Up @@ -273,6 +247,60 @@ private void RunOptimize(int nTrials, double timeout, dynamic study, dynamic sto
}
}

private bool CheckOptimizeComplete(int nTrials, double timeout, int trialNum, DateTime startTime)
{
bool isOptimizeCompleted = false;
if (trialNum >= nTrials)
{
EndState = EndState.AllTrialCompleted;
isOptimizeCompleted = true;
}
else if (timeout > 0 && (DateTime.Now - startTime).TotalSeconds >= timeout)
{
EndState = EndState.Timeout;
isOptimizeCompleted = true;
}
else if (OptimizeLoop.IsForcedStopOptimize)
{
EndState = EndState.StoppedByUser;
OptimizeLoop.IsForcedStopOptimize = false;
isOptimizeCompleted = true;
}

return isOptimizeCompleted;
}

private ProgressState SetProgressState(int nTrials, double timeout, double[] xTest, int trialNum, DateTime startTime, dynamic study)
{
ComputeBestValues(study, trialNum, out double[][] bestValues, out double hypervolumeRatio);
return new ProgressState
{
TrialNumber = trialNum,
ObjectiveNum = ObjNickName.Length,
BestValues = bestValues,
Values = xTest.Select(v => (decimal)v).ToList(),
HypervolumeRatio = hypervolumeRatio,
EstimatedTimeRemaining = timeout <= 0
? TimeSpan.FromSeconds((DateTime.Now - startTime).TotalSeconds * (nTrials - trialNum) / (trialNum + 1))
: TimeSpan.FromSeconds(timeout - (DateTime.Now - startTime).TotalSeconds)
};
}

private void ComputeBestValues(dynamic study, int trialNum, out double[][] bestValues, out double hypervolumeRatio)
{
if (Settings.Optimize.ShowRealtimeResult)
{
dynamic[] bestTrials = study.best_trials;
bestValues = bestTrials.Select(t => (double[])t.values).ToArray();
hypervolumeRatio = trialNum == 0 ? 0 : trialNum == 1 || ObjNickName.Length == 1 ? 1 : Hypervolume.Compute2dHypervolumeRatio(study);
}
else
{
bestValues = null;
hypervolumeRatio = 0;
}
}

private void CopyInMemoryStudy(dynamic storage)
{
dynamic optuna = Py.Import("optuna");
Expand Down Expand Up @@ -393,17 +421,6 @@ private dynamic SetSamplerSettings(int samplerType, ref int nTrials, dynamic opt
}
return sampler;
}

public double[] GetXOptimum()
{
return XOpt;
}

public double[] GetFxOptimum()
{
return FxOpt;
}

}

public enum GcAfterTrial
Expand Down
2 changes: 1 addition & 1 deletion Tunny/Solver/Optuna.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ EvaluatedGHResult Eval(ProgressState pState, int progress)
{
var optimize = new Algorithm(variables, _hasConstraint, objNickName, fishEggs, _settings, Eval);
optimize.Solve();
XOpt = optimize.GetXOptimum();
XOpt = optimize.XOpt;

ShowEndMessages(optimize);
return true;
Expand Down
20 changes: 17 additions & 3 deletions Tunny/UI/OptimizationWindow.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

43 changes: 22 additions & 21 deletions Tunny/UI/OptimizationWindow.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public OptimizationWindow(FishingComponent component)
FormClosingXButton(this, null);
}
LoadSettingJson();
InitializeUIValues();
SetUIValues();
RunPythonInstaller();
SetOptimizeBackgroundWorker();
SetOutputResultBackgroundWorker();
Expand Down Expand Up @@ -99,26 +99,6 @@ private void LoadSettingJson()
}
}

private void InitializeUIValues()
{
samplerComboBox.SelectedIndex = _settings.Optimize.SelectSampler;
nTrialNumUpDown.Value = _settings.Optimize.NumberOfTrials;
timeoutNumUpDown.Value = (decimal)_settings.Optimize.Timeout;

// Study Name GroupBox
studyNameTextBox.Text = _settings.StudyName;
continueStudyCheckBox.Checked = _settings.Optimize.ContinueStudy;
existingStudyComboBox.Enabled = continueStudyCheckBox.Checked;
studyNameTextBox.Enabled = !continueStudyCheckBox.Checked;
copyStudyCheckBox.Enabled = _settings.Optimize.CopyStudy;
UpdateStudyComboBox();

outputModelNumTextBox.Text = _settings.Result.OutputNumberString;
visualizeTypeComboBox.SelectedIndex = _settings.Result.SelectVisualizeType;
visualizeClusterNumUpDown.Value = _settings.Result.NumberOfClusters;
InitializeSamplerSettings();
}

private void UpdateGrasshopper(IList<decimal> parameters)
{
GrasshopperStatus = GrasshopperStates.RequestProcessing;
Expand Down Expand Up @@ -148,13 +128,34 @@ private void FormClosingXButton(object sender, FormClosingEventArgs e)
outputResultBackgroundWorker?.Dispose();
}

private void SetUIValues()
{
samplerComboBox.SelectedIndex = _settings.Optimize.SelectSampler;
nTrialNumUpDown.Value = _settings.Optimize.NumberOfTrials;
timeoutNumUpDown.Value = (decimal)_settings.Optimize.Timeout;

// Study Name GroupBox
studyNameTextBox.Text = _settings.StudyName;
continueStudyCheckBox.Checked = _settings.Optimize.ContinueStudy;
existingStudyComboBox.Enabled = continueStudyCheckBox.Checked;
studyNameTextBox.Enabled = !continueStudyCheckBox.Checked;
copyStudyCheckBox.Enabled = _settings.Optimize.CopyStudy;
UpdateStudyComboBox();
ShowRealtimeResultCheckBox.Checked = _settings.Optimize.ShowRealtimeResult;

outputModelNumTextBox.Text = _settings.Result.OutputNumberString;
visualizeTypeComboBox.SelectedIndex = _settings.Result.SelectVisualizeType;
visualizeClusterNumUpDown.Value = _settings.Result.NumberOfClusters;
InitializeSamplerSettings();
}
private void GetUIValues()
{
_settings.Optimize.SelectSampler = samplerComboBox.SelectedIndex;
_settings.Optimize.NumberOfTrials = (int)nTrialNumUpDown.Value;
_settings.Optimize.Timeout = (double)timeoutNumUpDown.Value;
_settings.Optimize.ContinueStudy = continueStudyCheckBox.Checked;
_settings.Optimize.CopyStudy = copyStudyCheckBox.Checked;
_settings.Optimize.ShowRealtimeResult = ShowRealtimeResultCheckBox.Checked;
_settings.Storage.Type = inMemoryCheckBox.Checked ? StorageType.InMemory : _settings.Storage.Type;
_settings.StudyName = studyNameTextBox.Text;
_settings.Result.OutputNumberString = outputModelNumTextBox.Text;
Expand Down
3 changes: 0 additions & 3 deletions Tunny/UI/OptimizationWindow.resx
Original file line number Diff line number Diff line change
Expand Up @@ -123,9 +123,6 @@
<metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>633, 17</value>
</metadata>
<metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>633, 17</value>
</metadata>
<data name="cmaEsUseSaparableCmaCheckBox.ToolTip" xml:space="preserve">
<value>If this is True,
the covariance matrix is constrained to be diagonal.
Expand Down
Loading

0 comments on commit e6f309c

Please sign in to comment.