FICO
FICO Xpress Optimization Examples Repository
FICO Optimization Community FICO Xpress Optimization Home
Back to examples browserPrevious exampleNext example

Working with multiple models: submodels, coordination, communication, and parallelization

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:
  • Running a submodel from another Mosel model: runtestsub.mos (main model executing testsub.mos)
  • Retrieving termination status from submodels (means of coordination of different models): runsubevnt.mos (main model executing testsub.mos)
  • Retrieving user event sent by the submodel: runsubevnt2.mos (main model executing testsubev.mos)
  • Stopping a submodel: runsubwait.mos (main model executing testsub.mos)
  • Compiling to memory: runsubmem.mos (main model executing testsub.mos)
  • Setting runtime parameters: runrtparam.mos (main model executing rtparams.mos)
  • Sequential execution of submodels: runrtparseq.mos (main model executing rtparams.mos)
  • Parallel execution of submodels: runrtparprl.mos (main model executing rtparams.mos)
  • Parallel execution with cloning of submodels: runrtparclone.mos (main model executing rtparams.mos)
  • Job queue for parallel execution of submodels: runrtparqueue.mos (main model executing rtparams.mos)
  • Using the shmem (shared memory) I/O driver for data exchange (bin format): runsubshm.mos (main model executing testsubshm.mos)
  • Using the shmem (shared memory) I/O driver for data exchange (raw format): runsubshmr.mos (main model executing testsubshmr.mos)
  • Using the mempipe (memory pipe) I/O driver for data exchange: runsubpip.mos (main model executing testsubpip.mos)
  • Sharing data between cloned models: runsubclone.mos (main model executing a copy of itself)
Distributed computing:
  • Check for available remote Mosel servers: findservers.mos
  • Run a single model on a remote machine: runrtdistr.mos (main model executing rtparams.mos)
  • Run a single model on a remote machine with configuration options: runrtdistrconf.mos (main model executing rtparams.mos)
  • Running parallel submodels in a distributed architecture: runrtpardistr.mos (main model executing rtparams3.mos)
  • Queuing submodels for parallel execution in a distributed architecture with one or several models per node: runrtparqueued.mos (main model executing rtparams3.mos)
  • 3-level tree of (parallel) submodels: runrtpartree.mos (main model executing rtparams2.mos)
  • Running a submodel that detaches itself from its parent: runrtdetach.mos (main model executing rtparams4.mos)
  • Using the shmem (shared memory) I/O driver for data exchange (bin format): runsubshmdistr.mos (main model executing testsubshm.mos)
Further explanation of this example: Xpress Whitepaper 'Multiple models and parallel solving with Mosel', Section 'Basic tasks'.


Source Files





runrtpardistr.mos

(!*******************************************************
   Mosel Example Problems 
   ======================

   file runrtpardistr.mos
   ``````````````````````
   Running several instances of a model from another
   Mosel model.
   - Parallel submodels in distributed architecture -

   Before running this model, you need to set up the array
   NODENAMES with machine names/addresses of your local network.
   All nodes that are used need to have the same version of
   Xpress installed and suitably licensed, and the server 
   "xprmsrv" must have been started on these machines.
   
   All files are local to the root node, no write access is
   required at remote nodes.
       
   (c) 2010 Fair Isaac Corporation
       author: S. Heipcke, May 2010, rev. Jan. 2013
*******************************************************!)

model "Run model rtparams in distributed architecture"
 uses "mmjobs", "mmsystem"

 declarations
  NUMI = 5
  A = 1..2*NUMI
  B = 1..NUMI
  modPar: array(A) of Model
  moselInst: array(B) of Mosel
  NODENAMES: array(B) of string
 end-declarations

                                 !!! Select the (remote) machines to be used:
				 !!! Use names, IP addresses, or empty string
				 !!! for the node running this model
 forall(i in B) NODENAMES(i):= if(isodd(i), "localhost", "xssh:127.0.0.1")
! NODENAMES:: (1..5)["localhost","","","rcmd:mosel -r","rcmd:mosel -r"]

 writeln("Node: ", getparam("NODENUMBER"))
 
                                   ! Compile the model file locally on root
 if compile("rtparams3.mos")<>0 then exit(1); end-if

 instct:=0
 forall(i in A) do            
  if isodd(i) then
   instct+=1                       ! Connect to a remote machine
   if connect(moselInst(instct), NODENAMES(instct))<>0 then exit(2); end-if
  end-if
  
  writeln("Current node: ", getsysinfo(SYS_NODE), 
          " submodel node: ", getsysinfo(moselInst(instct), SYS_NODE))
  
                                   ! Load the bim file (located at root node)
  load(moselInst(instct), modPar(i), "rmt:rtparams3.bim")  
                                   ! Start remote 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

 fdelete("rtparams3.bim")          ! Cleaning up
 
end-model 

Back to examples browserPrevious exampleNext example