public static double EvaluateFunction(IList <decimal> values) { if (_log != null) { _log.LogIteration(_iterations + 1); } //_log?.LogIteration(_iterations + 1); //var strMessage = "Iteration " + _iterations + Environment.NewLine; //strMessage += $"Maximize: {BolMaximize}" + Environment.NewLine; //MessageBox.Show(strMessage); //MessageBox.Show("Variable Values: " + string.Join(" ",values)); if (values == null) { _resultType = OptimizationResult.ResultType.SolverStopped; return(double.NaN); } //Log Parameters if (_log != null) { _log.LogParameters(string.Join(",", values), _stopwatchLoop); } //_log?.LogParameters(string.Join(",", values), _stopwatchLoop); _updateElapsed = _stopwatchTotal.ElapsedMilliseconds - _stopwatchPreviousMilliseconds; _stopwatchLoop.Reset(); _stopwatchLoop.Start(); //Run a new solution if (_worker.CancellationPending) { return(double.NaN); } _component.OptimizationWindow.GrasshopperStatus = OptimizationWindow.GrasshopperStates.RequestSent; //Call component to recalculate Grasshopper _worker.ReportProgress(0, values); //should add a time limit for this to break loop while (_component.OptimizationWindow.GrasshopperStatus != OptimizationWindow.GrasshopperStates.RequestProcessed) /*just wait*/ } {
//Run Solver (Main function) private static OptimizationResult RunOptimizationLoop(BackgroundWorker worker, int presetIndex) { _iterations = 0; _iterationsCurrentBest = 0; _bestValue = BolMaximize ? double.NegativeInfinity : double.PositiveInfinity; _bestParams = new List <decimal>(); _resultType = OptimizationResult.ResultType.Unknown; //Get variables var variables = _component.GhInOut.Variables; //MessageBox.Show($"Parameter String: {variables}", "FrOG Parameters"); //Stopwatches _stopwatchTotal = Stopwatch.StartNew(); _stopwatchLoop = Stopwatch.StartNew(); _stopwatchTotal.Start(); _stopwatchPreviousMilliseconds = _updateFrequency; //Clear Best Value List BestValues.Clear(); //Prepare Solver if (worker.CancellationPending) { return(null); } var solver = SolverList.GetSolverByIndex(PresetIndex); var preset = SolverList.GetPresetByIndex(presetIndex); //Prepare Log //_log = BolLog ? new Log(String.Format("{0}\\{1}.txt", Path.GetDirectoryName(_ghInOut.DocumentPath), LogName)) : null; _loggerLog = BolLog ? new LoggerLog(String.Format("{0}\\{1}.txt", Path.GetDirectoryName(_component.GhInOut.DocumentPath), LogName)) : null; //Log Settings if (_log != null) { _log.LogSettings(preset); } //_log?.LogSettings(preset); //Run Solver //MessageBox.Show("Starting Solver", "FrOG Debug"); var bolSolverStarted = solver.RunSolver(variables, EvaluateFunction, preset, solversettings, _component.GhInOut.ComponentFolder, _component.GhInOut.DocumentPath); if (!bolSolverStarted) { MessageBox.Show("Solver could not be started!"); return(null); } //Show Messagebox with FrOG error if (worker.CancellationPending) { _resultType = OptimizationResult.ResultType.UserStopped; } else if (_resultType == OptimizationResult.ResultType.SolverStopped || _resultType == OptimizationResult.ResultType.Unknown) { var strError = solver.GetErrorMessage(); if (!string.IsNullOrEmpty(strError)) { MessageBox.Show(strError, "FrOG Error"); } } //Result _stopwatchLoop.Stop(); _stopwatchTotal.Stop(); var result = new OptimizationResult(_bestValue, _bestParams, _iterations, _resultType); if (_log != null) { _log.LogResult(result, _stopwatchTotal, MaxIter, MaxIterNoProgress, MaxDuration); } //_log?.LogResult(result, _stopwatchTotal, MaxIter, MaxIterNoProgress, MaxDuration); return(result); }