Beispiel #1
0
        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*/ } {
Beispiel #2
0
        //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);
        }