Пример #1
0
 private void updateParameterValues()
 {
     foreach (var variableParameter in _allVariableParameters)
     {
         variableParameter.Value = _parameterValueCache[variableParameter.Path];
     }
     _simModelSimulation.SetParameterValues(_allVariableParameters);
 }
Пример #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));
                }
            }
        }