Working with multiple models: submodels, coordination, communication, and parallelization
|
|
|
| Type: | Programming |
| Rating: | 3 (intermediate) |
| Description: | The Mosel module mmjobs enables the user to work with several models concurrently. We show here a series of examples of basic tasks that typically need to be performed when working with several models in Mosel: Parallel computing:
|
| File(s): | runtestsub.mos, testsub.mos (submodel), runsubevnt.mos, runsubevnt2.mos, testsubev.mos (submodel), runsubwait.mos, runsubmem.mos, runrtparam.mos, runrtparam2.mos, rtparams.mos, runrtparseq.mos, runrtparprl.mos, runrtparqueue.mos, runsubshm.mos, testsubshm.mos (submodel), runsubshmr.mos, testsubshmr.mos (submodel), runsubpip.mos, testsubpip.mos (submodel) |
|
|
|
| runtestsub.mos |
(!*******************************************************
Mosel Example Problems
======================
file runtestsub.mos
```````````````````
Running a model from another Mosel model,
waiting for the submodel termination.
(c) 2008 Fair Isaac Corporation
author: S. Heipcke, May 2006
*******************************************************!)
model "Run model testsub"
uses "mmjobs"
declarations
modSub: Model
end-declarations
! Compile the model file
if compile("testsub.mos")<>0 then exit(1); end-if
load(modSub, "testsub.bim") ! Load the bim file
! Uncomment one of the following lines to redirect the submodel output
! setdefstream(modSub, F_OUTPUT, "testout.txt") ! Output to file
! setdefstream(modSub, F_OUTPUT, "tee:testout.txt&")
! Output to file and on screen
! setdefstream(modSub, F_OUTPUT, "null:") ! Disable all output
run(modSub) ! Start model execution
wait ! Wait for model termination
dropnextevent ! Ignore termination event message
end-model
|
| testsub.mos |
(!*******************************************************
Mosel Example Problems
======================
file testsub.mos
````````````````
Simple model printing some output.
*** Not intended to be run standalone - run from runtestsub.mos ***
(c) 2008 Fair Isaac Corporation
author: S. Heipcke, May 2006
*******************************************************!)
model "Test submodel"
! Uncomment one of the following lines to redirect output to a file
! fopen("testout.txt", F_OUTPUT+F_APPEND) ! Output to file (in append mode)
! fopen("tee:testout.txt&", F_OUTPUT) ! Output to file and on screen
! fopen("null:", F_OUTPUT) ! Disable all output
forall(i in 10..20) write(i^2, " ")
writeln
! Uncomment if output is redirected
! fclose(F_OUTPUT)
end-model
|
| runsubevnt.mos |
(!*******************************************************
Mosel Example Problems
======================
file runsubevnt.mos
```````````````````
Running a model from another Mosel model,
getting the submodel termination status.
(c) 2008 Fair Isaac Corporation
author: S. Heipcke, May 2006
*******************************************************!)
model "Run model testsub"
uses "mmjobs"
declarations
modSub: Model
ev: Event
end-declarations
! Compile the model file
if compile("testsub.mos")<>0 then exit(1); end-if
load(modSub, "testsub.bim") ! Load the bim file
run(modSub) ! Start model execution
wait(1) ! Wait 1 second for an event
if isqueueempty then ! No event has been sent: model still runs
stop(modSub) ! Stop the model
wait ! Wait for model termination
end-if
ev:=getnextevent ! An event is available: model finished
writeln("Event class: ", getclass(ev))
writeln("Event value: ", getvalue(ev))
writeln("Exit code : ", getexitcode(modSub))
end-model
|
| runsubevnt2.mos |
(!*******************************************************
Mosel Example Problems
======================
file runsubevnt2.mos
````````````````````
Running a model from another Mosel model,
getting the submodel termination status.
- User event sent by the submodel -
(c) 2011 Fair Isaac Corporation
author: S. Heipcke, Apr. 2011
*******************************************************!)
model "Run model testsub"
uses "mmjobs"
declarations
modSub: Model
ev: Event
SUBMODREADY = 2 ! User event code
end-declarations
! Compile the model file
if compile("testsubev.mos")<>0 then exit(1); end-if
load(modSub, "testsubev.bim") ! Load the bim file
run(modSub) ! Start model execution
wait ! Wait for an event
if getclass(getnextevent) <> SUBMODREADY then
writeln("Problem with submodel run")
exit(1)
end-if
wait(1) ! Let the submodel run for 1 second
if isqueueempty then ! No event has been sent: model still runs
stop(modSub) ! Stop the model
wait ! Wait for model termination
end-if
ev:=getnextevent ! An event is available: model finished
writeln("Event class: ", getclass(ev))
writeln("Event value: ", getvalue(ev))
writeln("Exit code : ", getexitcode(modSub))
end-model
|
| testsubev.mos |
(!*******************************************************
Mosel Example Problems
======================
file testsubev.mos
````````````````
Simple model printing some output
and sending a user event.
*** Not intended to be run standalone - run from runsubevnt2.mos ***
(c) 2011 Fair Isaac Corporation
author: S. Heipcke, Apr. 2011
*******************************************************!)
model "Test submodel (Event)"
uses "mmjobs"
declarations
SUBMODREADY = 2 ! User event code
end-declarations
send(SUBMODREADY, 0) ! Send "submodel ready" event
! Uncomment one of the following lines to redirect output to a file
! fopen("testout.txt", F_OUTPUT+F_APPEND) ! Output to file (in append mode)
! fopen("tee:testout.txt&", F_OUTPUT) ! Output to file and on screen
! fopen("null:", F_OUTPUT) ! Disable all output
forall(i in 10..20) write(i^2, " ")
writeln
! Uncomment if output is redirected
! fclose(F_OUTPUT)
end-model
|
| runsubwait.mos |
(!*******************************************************
Mosel Example Problems
======================
file runsubwait.mos
```````````````````
Running a model from another Mosel model,
waiting for the submodel termination.
(c) 2008 Fair Isaac Corporation
author: S. Heipcke, May 2006
*******************************************************!)
model "Run model testsub"
uses "mmjobs"
declarations
modSub: Model
end-declarations
! Compile the model file
if compile("testsub.mos")<>0 then exit(1); end-if
load(modSub, "testsub.bim") ! Load the bim file
run(modSub) ! Start model execution
wait(1) ! Wait 1 second for an event
if isqueueempty then ! No event has been sent: model still runs
writeln("Stopping the submodel")
stop(modSub) ! Stop the model
wait ! Wait for model termination
end-if
dropnextevent ! Ignore termination event message
end-model
|
| runsubmem.mos |
(!*******************************************************
Mosel Example Problems
======================
file runsubmem.mos
``````````````````
Running a model from another Mosel model,
compilation to memory.
(c) 2008 Fair Isaac Corporation
author: S. Heipcke, May 2006
*******************************************************!)
model "Run model testsub"
uses "mmjobs", "mmsystem"
declarations
modSub: Model
end-declarations
! Compile the model file
if compile("", "testsub.mos", "shmem:testsubbim")<>0 then
exit(1)
end-if
load(modSub, "shmem:testsubbim") ! Load the bim file from memory
fdelete("shmem:testsubbim") ! ... and release the memory block
run(modSub) ! Start model execution
wait ! Wait for model termination
dropnextevent ! Ignore termination event message
end-model
|
| runrtparam.mos |
(!*******************************************************
Mosel Example Problems
======================
file runrtparam.mos
```````````````````
Running a model from another Mosel model,
passing runtime parameters to the submodel.
(c) 2008 Fair Isaac Corporation
author: S. Heipcke, May 2006
*******************************************************!)
model "Run model rtparams"
uses "mmjobs"
declarations
modPar: Model
end-declarations
! Compile the model file
if compile("rtparams.mos")<>0 then exit(1); end-if
load(modPar, "rtparams.bim") ! Load the bim file
! Start model execution
run(modPar, "PARAM1=" + 2 + ",PARAM2=" + 3.4 +
",PARAM3='a string'" + ",PARAM4=" + true)
wait ! Wait for model termination
dropnextevent ! Ignore termination event message
end-model
|
| runrtparam2.mos |
(!*******************************************************
Mosel Example Problems
======================
file runrtparam2.mos
````````````````````
Running a model from another Mosel model,
passing runtime parameters to the submodel.
- Using 'setmodpar' -
(c) 2014 Fair Isaac Corporation
author: S. Heipcke, Sep. 2014
*******************************************************!)
model "Run model rtparams"
uses "mmjobs", "mmsystem"
declarations
modPar: Model
params: text
end-declarations
! Compile the model file
if compile("rtparams.mos")<>0 then exit(1); end-if
load(modPar, "rtparams.bim") ! Load the bim file
setmodpar(params, "PARAM1", 2) ! Set values for model parameters
setmodpar(params, "PARAM2", 3.4)
setmodpar(params, "PARAM3", 'a string')
setmodpar(params, "PARAM4", true)
run(modPar, params) ! Start model execution
params:= "" ! Delete the parameters definition
wait ! Wait for model termination
dropnextevent ! Ignore termination event message
end-model
|
| rtparams.mos |
(!*******************************************************
Mosel Example Problems
======================
file rtparams.mos
`````````````````
Model with different runtime parameter types;
can be run as submodel from models 'runrtpar*.mos'.
(c) 2008 Fair Isaac Corporation
author: S. Heipcke, May 2006
*******************************************************!)
model "Runtime parameters"
parameters
PARAM1 = 0
PARAM2 = 0.5
PARAM3 = ''
PARAM4 = false
end-parameters
writeln(PARAM1, " ", PARAM2, " ", PARAM3, " ", PARAM4)
end-model
|
| runrtparseq.mos |
(!*******************************************************
Mosel Example Problems
======================
file runrtparseq.mos
````````````````````
Running several instances of a model from another
Mosel model.
- Sequential submodels -
(c) 2008 Fair Isaac Corporation
author: S. Heipcke, May 2006, rev. May 2010
*******************************************************!)
model "Run model rtparams in sequence"
uses "mmjobs"
declarations
A = 1..10
modPar: Model
end-declarations
! Compile the model file
if compile("rtparams.mos")<>0 then exit(1); end-if
load(modPar, "rtparams.bim") ! Load the bim file
forall(i in A) do ! Start model execution
run(modPar, "PARAM1=" + i + ",PARAM2=" + 0.1*i +
",PARAM3='string " + i + "'" + ",PARAM4=" + isodd(i))
wait ! Wait for model termination
dropnextevent ! Ignore termination event message
end-do
end-model
|
| runrtparprl.mos |
(!*******************************************************
Mosel Example Problems
======================
file runrtparprl.mos
````````````````````
Running several instances of a model from another
Mosel model.
- Parallel submodels -
(c) 2008 Fair Isaac Corporation
author: S. Heipcke, May 2006, rev. May 2010
*******************************************************!)
model "Run model rtparams in parallel"
uses "mmjobs"
declarations
A = 1..10
modPar: array(A) of Model
end-declarations
! Compile the model file
if compile("rtparams.mos")<>0 then exit(1); end-if
forall(i in A) do
load(modPar(i), "rtparams.bim") ! Load the bim file
! Start model execution
run(modPar(i), "PARAM1=" + i + ",PARAM2=" + 0.1*i +
",PARAM3='string " + i + "'" + ",PARAM4=" + isodd(i))
end-do
forall(i in A) do
wait ! Wait for model termination
dropnextevent ! Ignore termination event message
end-do
end-model
|
| runrtparqueue.mos |
(!*******************************************************
Mosel Example Problems
======================
file runrtparqueue.mos
``````````````````````
Running several instances of a model from another
Mosel model.
- Queuing submodels for parallel execution
in a limited number of processes -
(c) 2010 Fair Isaac Corporation
author: S. Heipcke, Apr. 2010, rev. Jun. 2015
*******************************************************!)
model "Run model rtparams with job queue"
uses "mmjobs"
parameters
J=10 ! Number of jobs to run
NUMPAR=2 ! Number of parallel model executions
end-parameters ! (preferrably <= no. of processors)
forward procedure start_next_job(submod: Model)
declarations
RM = 1..NUMPAR ! Model indices
JOBS = 1..J ! Job (instance) indices
modPar: array(RM) of Model ! Models
jobid: array(set of integer) of integer ! Job index for model UIDs
JobList: list of integer ! List of jobs
JobsRun: set of integer ! Set of finished jobs
JobSize: integer ! Number of jobs to be executed
Msg: Event ! Messages sent by models
end-declarations
! Compile the model file
if compile("rtparams.mos")<>0 then exit(1); end-if
forall(m in RM) do
load(modPar(m), "rtparams.bim") ! Load the bim file
modPar(m).uid:= m ! Store the model ID
end-do
JobList:= sum(i in JOBS) [i] ! Define the list of jobs (instances)
JobSize:=JobList.size ! Store the number of jobs
JobsRun:={} ! Set of terminated jobs is empty
!**** Start initial lot of model runs ****
forall(m in RM)
if JobList<>[] then
start_next_job(modPar(m))
end-if
!**** Run all remaining jobs ****
while (JobsRun.size<JobSize) do
wait ! Wait for model termination
! Start next job
Msg:= getnextevent
if Msg.class=EVENT_END then ! We are only interested in "end" events
m:= Msg.fromuid ! Retrieve the model ID
JobsRun+={jobid(m)} ! Keep track of job termination
writeln("End of job ", jobid(m), " (model ", m, ")")
if JobList<>[] then ! Start a new run if queue not empty
start_next_job(modPar(m))
end-if
end-if
end-do
!*************************************************************************
procedure start_next_job(submod: Model)
i:=getfirst(JobList) ! Retrieve first job in the list
cuthead(JobList,1) ! Remove first entry from job list
jobid(submod.uid):= i ! Save job index for this model
writeln("Start job ", i, " (model ", submod.uid, ")")
run(submod, "PARAM1=" + i + ",PARAM2=" + 0.1*i +
",PARAM3='string " + i + "'" + ",PARAM4=" + isodd(i))
end-procedure
end-model
|
| runsubshm.mos |
(!*******************************************************
Mosel Example Problems
======================
file runsubshm.mos
``````````````````
Running a model from another Mosel model.
Communication of data from/to master model
using 'shmem' IO driver with 'bin'.
(c) 2011 Fair Isaac Corporation
author: S. Heipcke, April 2011
*******************************************************!)
model "Run model testsubshm"
uses "mmjobs"
declarations
modSub: Model
A = 30..40
B: array(A) of real
end-declarations
! Compile the model file
if compile("testsubshm.mos")<>0 then exit(1); end-if
load(modSub, "testsubshm.bim") ! Load the bim file
initializations to "bin:shmem:indata"
A
end-initializations
run(modSub) ! Start model execution
wait ! Wait for model termination
dropnextevent ! Ignore termination event message
initializations from "bin:shmem:resdata"
B
end-initializations
writeln(B)
end-model
|
| testsubshm.mos |
(!*******************************************************
Mosel Example Problems
======================
file testsubshm.mos
```````````````````
Simple model printing some output.
Communication of data from/to master model
using 'shmem' IO driver with 'bin'.
*** Not intended to be run standalone - run from runsubshm.mos ***
(c) 2011 Fair Isaac Corporation
author: S. Heipcke, April 2011
*******************************************************!)
model "Test submodel"
declarations
A: range
B: array(A) of real
end-declarations
initializations from "bin:shmem:indata"
A
end-initializations
forall(i in A) B(i):= i^2
initializations to "bin:shmem:resdata"
B
end-initializations
end-model
|
| runsubshmr.mos |
(!*******************************************************
Mosel Example Problems
======================
file runsubshmr.mos
```````````````````
Running a model from another Mosel model.
Communication of data from/to master model
using 'shmem' IO driver with 'raw'.
(c) 2008 Fair Isaac Corporation
author: S. Heipcke, May 2006
*******************************************************!)
model "Run model testsubshmr"
uses "mmjobs"
declarations
modSub: Model
A = 30..40
B: array(A) of real
end-declarations
! Compile the model file
if compile("testsubshmr.mos")<>0 then exit(1); end-if
load(modSub, "testsubshmr.bim") ! Load the bim file
initializations to "raw:"
A as "shmem:A"
end-initializations
run(modSub) ! Start model execution
wait ! Wait for model termination
dropnextevent ! Ignore termination event message
initializations from "raw:"
B as "shmem:B"
end-initializations
writeln(B)
end-model
|
| testsubshmr.mos |
(!*******************************************************
Mosel Example Problems
======================
file testsubshmr.mos
````````````````````
Simple model printing some output.
Communication of data from/to master model
using 'shmem' IO driver with 'raw'.
*** Not intended to be run standalone - run from runsubshmr.mos ***
(c) 2008 Fair Isaac Corporation
author: S. Heipcke, May 2006
*******************************************************!)
model "Test submodel"
declarations
A: range
B: array(A) of real
end-declarations
initializations from "raw:"
A as "shmem:A"
end-initializations
forall(i in A) B(i):= i^2
initializations to "raw:"
B as "shmem:B"
end-initializations
end-model
|
| runsubpip.mos |
(!*******************************************************
Mosel Example Problems
======================
file runsubpip.mos
``````````````````
Running a model from another Mosel model.
Communication of data from/to master model
using 'mempipe' IO driver.
(c) 2008 Fair Isaac Corporation
author: S. Heipcke, May 2006
*******************************************************!)
model "Run model testsubpip"
uses "mmjobs"
declarations
modSub: Model
A = 30..40
B: array(A) of real
end-declarations
! Compile the model file
if compile("testsubpip.mos")<>0 then exit(1); end-if
load(modSub, "testsubpip.bim") ! Load the bim file
run(modSub) ! Start model execution
initializations to "mempipe:indata"
A
end-initializations
initializations from "mempipe:resdata"
B
end-initializations
wait ! Wait for model termination
dropnextevent ! Ignore termination event message
writeln(B)
end-model
|
| testsubpip.mos |
(!*******************************************************
Mosel Example Problems
======================
file testsubpip.mos
```````````````````
Simple model printing some output.
Communication of data from/to master model
using 'mempipe' IO driver.
*** Not intended to be run standalone - run from runsubpip.mos ***
(c) 2008 Fair Isaac Corporation
author: S. Heipcke, May 2006
*******************************************************!)
model "Test submodel"
declarations
A: range
B: array(A) of real
end-declarations
initializations from "mempipe:indata"
A
end-initializations
forall(i in A) B(i):= i^2
initializations to "mempipe:resdata"
B
end-initializations
end-model
|
© 2001-2019 Fair Isaac Corporation. All rights reserved. This documentation is the property of Fair Isaac Corporation (“FICO”). Receipt or possession of this documentation does not convey rights to disclose, reproduce, make derivative works, use, or allow others to use it except solely for internal evaluation purposes to determine whether to purchase a license to the software described in this documentation, or as otherwise set forth in a written software license agreement between you and FICO (or a FICO affiliate). Use of this documentation and the software described in it must conform strictly to the foregoing permitted uses, and no other use is permitted.
