-
Notifications
You must be signed in to change notification settings - Fork 0
Run RiskPaths Model from R in cloud
It is a convenient to use GNU R to prepare model parameters and analyze output values. There are two different R APIs which we can use for openM++ models:
- openMpp package: simple and convenient specially for desktop users, upstream and downstream analysis;
-
oms
JSON web-service API: preferable choice to run models on computational clusters and in cloud.
There is also an excelent R package created by Matthew T. Warkentin available at: mattwarkentin.github.io/openmpp.
Below is an example of oms
JSON web-service usage to run RiskPaths model on cloud grid from RStudio in cloud.
There is an identical example to:
- run RiskPaths model in cloud from local PC Rstudio
- run RiskPaths model on desktop using openMpp package.
Following R example is running "RiskPaths" model to analyze childlessness by varying two parameters:
- Age baseline for first union formation
- Relative risks of union status on first pregnancy by following scale factor:
scaleValues <- seq(from = 0.44, to = 1.00, by = 0.08)
Please keep in mind, scaling above result in 64 runs of RiskPaths model, to reduce waiting time we are using only 1024 simulation cases in script below.
#
# R integration example using RiskPaths model
# to analyze contribution of delayed union formations
# versus decreased fertility on childlessness
#
# Prerequisite:
#
# download openM++ release from https://github.com/openmpp/main/releases/latest
# unpack it into any directory
# start oms web-service:
# Windows:
# cd C:\my-openmpp-release
# bin\ompp_ui.bat
# Linux:
# cd ~/my-openmpp-release
# bin/oms
#
# Script below is using openM++ web-service "oms"
# to run the model, modify parameters and read output values.
#
# If jsonlite or httr is not installed then do:
# install.packages("jsonlite")
# install.packages("httr")
#
library("jsonlite")
library("httr")
# Include openM++ helper functions from your $HOME directory
# on Windows HOME directory is: "C:\Users\User Name Here\Documents"
#
# if you don't have omsCommon.R then download it from https://github.com/openmpp/R/oms-R
# if you have omsCommon.R in some other location then update path below
#
source("~/omsCommon.R")
#
# Using RiskPaths model
# to analyze contribution of delayed union formations
# versus decreased fertility on childlessness
#
# Input parameters:
# AgeBaselineForm1: age baseline for first union formation
# UnionStatusPreg1: relative risks of union status on first pregnancy
# Output value:
# T05_CohortFertility: Cohort fertility, expression 1
#
# Model name: RiskPaths
#
# If you have multiple versions of the model with the same name
# then instead of:
# ModelName = "RiskPaths"
# use model digest to identify specific model version, for example:
# ModelDigest = "d90e1e9a49a06d972ecf1d50e684c62b"
#
md <- "RiskPaths"
# oms web-service URL, it can be hard-coded, for example: "http://localhost:4040/api/"
#
apiUrl <- getOmsApiUrl()
# Find first model run to use it as our base run
#
# Parameters AgeBaselineForm1 and UnionStatusPreg1 are varied by this script
# and the rest of parameters we are getting from base model run
#
rsp <- GET(paste0(
apiUrl, "model/", md, "/run/status/first"
))
if (http_type(rsp) != 'application/json') {
stop("Failed to get first run status")
}
jr <- content(rsp)
firstRunDigest <- jr$RunDigest
# get initial values for AgeBaselineForm1 and UnionStatusPreg1 parameters
# by reading it from first model run results
#
rsp <- GET(paste0(
apiUrl, "model/", md, "/run/", firstRunDigest, "/parameter/AgeBaselineForm1/value/start/0/count/0"
))
if (http_type(rsp) != 'application/json') {
stop("Failed to get parameter AgeBaselineForm1")
}
ageFirstUnion <- content(rsp)
rsp <- GET(paste0(
apiUrl, "model/", md, "/run/", firstRunDigest, "/parameter/UnionStatusPreg1/value/start/0/count/0"
))
if (http_type(rsp) != 'application/json') {
stop("Failed to get parameter UnionStatusPreg1")
}
unionStatusPreg <- content(rsp)
# Create multiple input scenarios and save all of it as our modelling task:
# apply scale in range from 0.44 to 1.0
# to AgeBaselineForm1 and UnionStatusPreg1 parameters
#
# scaleStep <- 0.08 # do 64 model runs
# scaleStep <- 0.5 # use this for quick test
#
scaleStep <- 0.08
scaleValues <- seq(from = 0.44, to = 1.00, by = scaleStep)
nameLst <- c() # input scenario names, automatically generated
for (scaleAgeBy in scaleValues)
{
print(c("Scale age: ", scaleAgeBy))
ag <- ageFirstUnion
for (k in 1:length(ag))
{
ag[[k]]$Value <- ageFirstUnion[[k]]$Value * scaleAgeBy
}
for (scaleUnionBy in scaleValues)
{
un <- unionStatusPreg
un[[1]]$Value <- un[[1]]$Value * scaleUnionBy # change only first two values
un[[2]]$Value <- un[[2]]$Value * scaleUnionBy # of UnionStatusPreg1 parameter
# create new input scenario
# automatically generate unique names for each input scenario
#
pd <- list(
ModelName = md,
Name = "",
BaseRunDigest = firstRunDigest,
IsReadonly = TRUE,
Txt = list(
list(LangCode = "EN", Descr = paste("Scale age:", scaleAgeBy, ", union status", scaleUnionBy)),
list(LangCode = "FR", Descr = paste("Échelle d'âge:", scaleAgeBy, ", statut syndical", scaleUnionBy))
),
Param = list(
list(
Name = "AgeBaselineForm1",
SubCount = 1,
Value = ag,
Txt = list(
list(LangCode = "FR", Note = paste("Mettre à l'échelle l'âge par:", scaleAgeBy))
)
),
list(
Name = "UnionStatusPreg1",
SubCount = 1,
Value = un,
Txt = list(
list(LangCode = "EN", Note = paste("Scale union status by:", scaleAgeBy))
)
)
)
)
jv <- toJSON(pd, pretty = TRUE, auto_unbox = TRUE)
# create input scenario by submitting request to oms web-service
rsp <- PUT(paste0(
apiUrl, "workset-create"
),
body = jv,
content_type_json()
)
if (http_type(rsp) != 'application/json') {
stop("Failed to create input set")
}
jr <- content(rsp)
sn <- jr$Name # name of new input scenario generated by oms web-service
if (is.na(sn) || sn == "") stop("Fail to create input set, scales:", scaleAgeBy, scaleUnionBy)
nameLst <- c(nameLst, sn)
}
}
# Create modeling task from all input sets
# automatically generate unique name for the task
#
inpLen <- length(nameLst)
print(paste("Create task from", inpLen, "input scenarios"))
pd <- list(
ModelName = md,
Name = "",
Set = nameLst,
Txt = list(
list(
LangCode = "EN",
Descr = paste("Task to run RiskPaths", inpLen, "times"),
Note = paste("Task scales AgeBaselineForm1 and UnionStatusPreg1 parameters from 0.44 to 1.00 with step", scaleStep)
)
)
)
jv <- toJSON(pd, pretty = TRUE, auto_unbox = TRUE)
# create task by submitting request to oms web-service
rsp <- PUT(paste0(
apiUrl, "task-new"
),
body = jv,
content_type_json()
)
if (http_type(rsp) != 'application/json') {
stop("Failed to create modeling task")
}
jr <- content(rsp)
taskName <- jr$Name # name of new task generated by oms web-service
if (is.na(taskName) || taskName == "") stop("Fail to create modeling task")
#
# Run RiskPaths with modeling task and wait until task is completed
# It is a sequential run, not parallel.
#
# Running 4 RiskPaths_mpi instances: "root" leader process and 3 computational processes
# each computational process using modelling 4 threads
# root process does only database operations and coordinate child workoload.
#
print(paste("Starting modeling task:", taskName))
# use explicit model run stamp to avoid compatibility issues between cloud model run queue and desktop MPI
stamp <- sub('.' , '_', fixed = TRUE, format(Sys.time(),"%Y_%m_%d_%H_%M_%OS3"))
# prepare model run options
pd <- list(
ModelDigest = md,
Mpi = list(
Np = 5, # MPI cluster: run 5 processes: 4 for model and rott process
IsNotOnRoot = TRUE # MPI cluster: do not use root process for modelling
),
Template = "mpi.RiskPaths.template.txt", # MPI cluster: model run tempate
Opts = list(
OpenM.TaskName = taskName,
OpenM.RunStamp = stamp, # use explicit run stamp
Parameter.SimulationCases = "1024", # use 1024 simulation cases to get quick results
OpenM.BaseRunDigest = firstRunDigest, # base run to get the rest of input parameters
OpenM.SubValues = "16", # use 16 sub-values (sub-samples)
OpenM.Threads = "4", # use 4 modeling threads
OpenM.ProgressPercent = "100" # reduce amount of progress messages in the log file
)
)
jv <- toJSON(pd, pretty = TRUE, auto_unbox = TRUE)
# run modeling task
rsp <- POST(paste0(
apiUrl, "run"
),
body = jv,
content_type_json()
)
if (http_type(rsp) != 'application/json') {
stop("Failed to run the model")
}
jr <- content(rsp)
submitStamp <- jr$SubmitStamp # model run submission stamp: not empty if model run submitted to run queue
runStamp <- jr$RunStamp # model run stamp: by default empty until model run not started
# wait until task completed
runDigests <- waitForTaskCompleted(taskName, stamp, apiUrl, md)
#
# get results of task run, cohort fertility: T05_CohortFertility.Expr1
#
pd <- list(
Name = "T05_CohortFertility",
ValueName = "Expr1",
Size = 0 # read all rows of T05_CohortFertility.Expr1
)
jv <- toJSON(pd, pretty = TRUE, auto_unbox = TRUE)
scaleLen <- length(scaleValues)
childlessnessMat <- matrix(data = NA, nrow = scaleLen, ncol = scaleLen, byrow = TRUE)
runIdx <- 1
for (k in 1:scaleLen)
{
for (j in 1:scaleLen)
{
# for each run digest get T05_CohortFertility.Expr1 value
#
rsp <- POST(paste0(
apiUrl, "model/", md, "/run/", runDigests[runIdx], "/table/value"
),
body = jv,
content_type_json()
)
if (http_type(rsp) != 'application/json') {
stop("Failed to get T05_CohortFertility.Expr1")
}
jt <- content(rsp, type = "text", encoding = "UTF-8")
cf <- fromJSON(jt, flatten = TRUE)
# value is not NULL then use it else keep default NA
if (!cf$Page$IsNull)
{
childlessnessMat[k, j] = cf$Page$Value
}
runIdx <- runIdx + 1
}
}
#
# display the results
#
persp(
x = scaleValues,
y = scaleValues,
z = childlessnessMat,
zlim = range(childlessnessMat, na.rm = TRUE),
xlab = "Decreased union formation",
ylab = "Decreased fertility",
zlab = "Childlessness",
theta = 30, phi = 30, expand = 0.5, ticktype = "detailed",
col = "lightgreen",
cex.axis = 0.7
)
- Windows: Quick Start for Model Users
- Windows: Quick Start for Model Developers
- Linux: Quick Start for Model Users
- Linux: Quick Start for Model Developers
- MacOS: Quick Start for Model Users
- MacOS: Quick Start for Model Developers
- Model Run: How to Run the Model
- MIT License, Copyright and Contribution
- Model Code: Programming a model
- Windows: Create and Debug Models
- Linux: Create and Debug Models
- MacOS: Create and Debug Models
- MacOS: Create and Debug Models using Xcode
- Modgen: Convert case-based model to openM++
- Modgen: Convert time-based model to openM++
- Modgen: Convert Modgen models and usage of C++ in openM++ code
- Model Localization: Translation of model messages
- How To: Set Model Parameters and Get Results
- Model Run: How model finds input parameters
- Model Output Expressions
- Model Run Options and ini-file
- OpenM++ Compiler (omc) Run Options
- OpenM++ ini-file format
- UI: How to start user interface
- UI: openM++ user interface
- UI: Create new or edit scenario
- UI: Upload input scenario or parameters
- UI: Run the Model
- UI: Use ini-files or CSV parameter files
- UI: Compare model run results
- UI: Aggregate and Compare Microdata
- UI: Filter run results by value
- UI: Disk space usage and cleanup
- UI Localization: Translation of openM++
- Authored Model Documentation
- Built-in Attributes
- Censor Event Time
- Create Import Set
- Derived Tables
- Entity Attributes in C++
- Entity Function Hooks
- Entity Member Packing
- Entity Tables
- Enumerations
- Events
- Event Trace
- External Names
- Generated Model Documentation
- Groups
- Illustrative Model
Align1
- Lifecycle Attributes
- Local Random Streams
- Memory Use
- Microdata Output
- Model Code
- Model Documentation
- Model Languages
- Model Localization
- Model Metrics Report
- Model Resource Use
- Model Symbols
- Parameter and Table Display and Content
- Population Size and Scaling
- Screened Tables
- Symbol Labels and Notes
- Tables
- Test Models
- Time-like and Event-like Attributes
- Use Modules
- Weighted Tabulation
- File-based Parameter Values
- Oms: openM++ web-service
- Oms: openM++ web-service API
- Oms: How to prepare model input parameters
- Oms: Cloud and model runs queue
- Use R to save output table into CSV file
- Use R to save output table into Excel
- Run model from R: simple loop in cloud
- Run RiskPaths model from R: advanced run in cloud
- Run RiskPaths model in cloud from local PC
- Run model from R and save results in CSV file
- Run model from R: simple loop over model parameter
- Run RiskPaths model from R: advanced parameters scaling
- Run model from Python: simple loop over model parameter
- Run RiskPaths model from Python: advanced parameters scaling
- Windows: Use Docker to get latest version of OpenM++
- Linux: Use Docker to get latest version of OpenM++
- RedHat 8: Use Docker to get latest version of OpenM++
- Quick Start for OpenM++ Developers
- Setup Development Environment
- 2018, June: OpenM++ HPC cluster: Test Lab
- Development Notes: Defines, UTF-8, Databases, etc.
- 2012, December: OpenM++ Design
- 2012, December: OpenM++ Model Architecture, December 2012
- 2012, December: Roadmap, Phase 1
- 2013, May: Prototype version
- 2013, September: Alpha version
- 2014, March: Project Status, Phase 1 completed
- 2016, December: Task List
- 2017, January: Design Notes. Subsample As Parameter problem. Completed
GET Model Metadata
- GET model list
- GET model list including text (description and notes)
- GET model definition metadata
- GET model metadata including text (description and notes)
- GET model metadata including text in all languages
GET Model Extras
GET Model Run results metadata
- GET list of model runs
- GET list of model runs including text (description and notes)
- GET status of model run
- GET status of model run list
- GET status of first model run
- GET status of last model run
- GET status of last completed model run
- GET model run metadata and status
- GET model run including text (description and notes)
- GET model run including text in all languages
GET Model Workset metadata: set of input parameters
- GET list of model worksets
- GET list of model worksets including text (description and notes)
- GET workset status
- GET model default workset status
- GET workset including text (description and notes)
- GET workset including text in all languages
Read Parameters, Output Tables or Microdata values
- Read parameter values from workset
- Read parameter values from workset (enum id's)
- Read parameter values from model run
- Read parameter values from model run (enum id's)
- Read output table values from model run
- Read output table values from model run (enum id's)
- Read output table calculated values from model run
- Read output table calculated values from model run (enum id's)
- Read output table values and compare model runs
- Read output table values and compare model runs (enun id's)
- Read microdata values from model run
- Read microdata values from model run (enum id's)
- Read aggregated microdata from model run
- Read aggregated microdata from model run (enum id's)
- Read microdata run comparison
- Read microdata run comparison (enum id's)
GET Parameters, Output Tables or Microdata values
- GET parameter values from workset
- GET parameter values from model run
- GET output table expression(s) from model run
- GET output table calculated expression(s) from model run
- GET output table values and compare model runs
- GET output table accumulator(s) from model run
- GET output table all accumulators from model run
- GET microdata values from model run
- GET aggregated microdata from model run
- GET microdata run comparison
GET Parameters, Output Tables or Microdata as CSV
- GET csv parameter values from workset
- GET csv parameter values from workset (enum id's)
- GET csv parameter values from model run
- GET csv parameter values from model run (enum id's)
- GET csv output table expressions from model run
- GET csv output table expressions from model run (enum id's)
- GET csv output table accumulators from model run
- GET csv output table accumulators from model run (enum id's)
- GET csv output table all accumulators from model run
- GET csv output table all accumulators from model run (enum id's)
- GET csv calculated table expressions from model run
- GET csv calculated table expressions from model run (enum id's)
- GET csv model runs comparison table expressions
- GET csv model runs comparison table expressions (enum id's)
- GET csv microdata values from model run
- GET csv microdata values from model run (enum id's)
- GET csv aggregated microdata from model run
- GET csv aggregated microdata from model run (enum id's)
- GET csv microdata run comparison
- GET csv microdata run comparison (enum id's)
GET Modeling Task metadata and task run history
- GET list of modeling tasks
- GET list of modeling tasks including text (description and notes)
- GET modeling task input worksets
- GET modeling task run history
- GET status of modeling task run
- GET status of modeling task run list
- GET status of modeling task first run
- GET status of modeling task last run
- GET status of modeling task last completed run
- GET modeling task including text (description and notes)
- GET modeling task text in all languages
Update Model Profile: set of key-value options
- PATCH create or replace profile
- DELETE profile
- POST create or replace profile option
- DELETE profile option
Update Model Workset: set of input parameters
- POST update workset read-only status
- PUT create new workset
- PUT create or replace workset
- PATCH create or merge workset
- DELETE workset
- POST delete multiple worksets
- DELETE parameter from workset
- PATCH update workset parameter values
- PATCH update workset parameter values (enum id's)
- PATCH update workset parameter(s) value notes
- PUT copy parameter from model run into workset
- PATCH merge parameter from model run into workset
- PUT copy parameter from workset to another
- PATCH merge parameter from workset to another
Update Model Runs
- PATCH update model run text (description and notes)
- DELETE model run
- POST delete model runs
- PATCH update run parameter(s) value notes
Update Modeling Tasks
Run Models: run models and monitor progress
Download model, model run results or input parameters
- GET download log file
- GET model download log files
- GET all download log files
- GET download files tree
- POST initiate entire model download
- POST initiate model run download
- POST initiate model workset download
- DELETE download files
- DELETE all download files
Upload model runs or worksets (input scenarios)
- GET upload log file
- GET all upload log files for the model
- GET all upload log files
- GET upload files tree
- POST initiate model run upload
- POST initiate workset upload
- DELETE upload files
- DELETE all upload files
Download and upload user files
- GET user files tree
- POST upload to user files
- PUT create user files folder
- DELETE file or folder from user files
- DELETE all user files
User: manage user settings
Model run jobs and service state
- GET service configuration
- GET job service state
- GET disk usage state
- POST refresh disk space usage info
- GET state of active model run job
- GET state of model run job from queue
- GET state of model run job from history
- PUT model run job into other queue position
- DELETE state of model run job from history
Administrative: manage web-service state
- POST a request to refresh models catalog
- POST a request to close models catalog
- POST a request to close model database
- POST a request to open database file
- POST a request to cleanup database file
- GET the list of database cleanup log(s)
- GET database cleanup log file(s)
- POST a request to pause model run queue
- POST a request to pause all model runs queue
- PUT a request to shutdown web-service