Exemplo n.º 1
0
 public SimulationRunResults RunSimulation()
 {
     try
     {
         updateParameterValues();
         _simModelSimulation.RunSimulation();
         return(new SimulationRunResults(success: true, warnings: WarningsFrom(_simModelSimulation.SolverWarnings), results: getResults()));
     }
     catch (Exception e)
     {
         return(new SimulationRunResults(success: false, warnings: WarningsFrom(_simModelSimulation.SolverWarnings), results: new DataRepository(), error: e.FullMessage()));
     }
     finally
     {
         _parameterValueCache.Clear();
     }
 }
Exemplo n.º 2
0
        /// <summary>
        ///    Perform single simulation run
        /// </summary>
        /// <param name="simulation">SimModel simulation (loaded and finalized)</param>
        /// <param name="coreIndex">0..NumberOfCores-1</param>
        /// <param name="cancellationToken">Token used to cancel the action if required</param>
        private void simulate(SimModelNET.ISimulation simulation, int coreIndex, CancellationToken cancellationToken)
        {
            var allIndividuals = _populationDataSplitter.GetIndividualIdsFor(coreIndex);

            var variableParameters = simulation.VariableParameters;
            var initialValues      = simulation.VariableSpecies;

            foreach (var individualId in allIndividuals)
            {
                cancellationToken.ThrowIfCancellationRequested();

                //get row indices for the simulations on current core
                _populationDataSplitter.UpdateParametersAndInitialValuesForIndividual(individualId, variableParameters, initialValues);

                //set new parameter values into SimModel
                simulation.SetParameterValues(variableParameters);

                //set new initial values into SimModel
                simulation.SetSpeciesProperties(initialValues);

                try
                {
                    simulation.RunSimulation();
                    _populationRunResults.Add(individualResultsFrom(simulation, individualId));
                }
                catch (Exception ex)
                {
                    _populationRunResults.AddFailure(individualId, ex.FullMessage());
                }
                finally
                {
                    var warnings = simulation.SolverWarnings;
                    _populationRunResults.AddWarnings(individualId, warnings);

                    //Could lead to a wrong progress if two threads are accessing the value at the same time
                    SimulationProgress(this, new PopulationSimulationProgressEventArgs(++_numberOfProcessedSimulations, _numberOfSimulationsToRun));
                }
            }
        }