From eb21ed002d8be0ca920412bb451c1e1f678622c0 Mon Sep 17 00:00:00 2001 From: Michael Sevestre Date: Mon, 24 Jan 2022 17:00:26 +0100 Subject: [PATCH] Fixes #719 call dispose --- R/utilities-simulation.R | 54 +++++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/R/utilities-simulation.R b/R/utilities-simulation.R index ef56321bf..965a117c7 100644 --- a/R/utilities-simulation.R +++ b/R/utilities-simulation.R @@ -216,30 +216,38 @@ runSimulations <- function(simulations, population = NULL, agingData = NULL, sim } .runSimulationsConcurrently <- function(simulations, simulationRunOptions, silentMode = FALSE) { - validateIsOfType(simulations, Simulation) simulationRunner <- getNetTask("ConcurrentSimulationRunner") - rClr::clrSet(simulationRunner, "SimulationRunOptions", simulationRunOptions$ref) - - # Map of simulations ids to simulations objects - simulationIdSimulationMap <- vector("list", length(simulations)) - - # Add simulations - for (simulationIdx in seq_along(simulations)) { - simulation <- simulations[[simulationIdx]] - simulationIdSimulationMap[[simulationIdx]] <- simulation - names(simulationIdSimulationMap)[[simulationIdx]] <- simulation$id - - rClr::clrCall(simulationRunner, "AddSimulation", simulation$ref) - } - # Run all simulations - results <- rClr::clrCall(simulationRunner, "RunConcurrently") - - # Ids of the results are Ids of the simulations - resultsIdSimulationIdMap <- names(simulationIdSimulationMap) - names(resultsIdSimulationIdMap) <- names(simulationIdSimulationMap) - simulationResults <- .getConcurrentSimulationRunnerResults(results = results, resultsIdSimulationIdMap = resultsIdSimulationIdMap, simulationIdSimulationMap = simulationIdSimulationMap, silentMode = silentMode) - - return(simulationResults) + tryCatch( + { + validateIsOfType(simulations, Simulation) + rClr::clrSet(simulationRunner, "SimulationRunOptions", simulationRunOptions$ref) + + # Map of simulations ids to simulations objects + simulationIdSimulationMap <- vector("list", length(simulations)) + + # Add simulations + for (simulationIdx in seq_along(simulations)) { + simulation <- simulations[[simulationIdx]] + simulationIdSimulationMap[[simulationIdx]] <- simulation + names(simulationIdSimulationMap)[[simulationIdx]] <- simulation$id + + rClr::clrCall(simulationRunner, "AddSimulation", simulation$ref) + } + # Run all simulations + results <- rClr::clrCall(simulationRunner, "RunConcurrently") + + # Ids of the results are Ids of the simulations + resultsIdSimulationIdMap <- names(simulationIdSimulationMap) + names(resultsIdSimulationIdMap) <- names(simulationIdSimulationMap) + simulationResults <- .getConcurrentSimulationRunnerResults(results = results, resultsIdSimulationIdMap = resultsIdSimulationIdMap, simulationIdSimulationMap = simulationIdSimulationMap, silentMode = silentMode) + + return(simulationResults) + }, + finally = { + # Dispose of the runner to release any possible instances still in memory (.NET side) + rClr::clrCall(simulationRunner, "Dispose") + } + ) } #' @title Creates and returns an instance of a `SimulationBatch` that can be used to efficiently vary parameters and initial values in a simulation