Initializing help system before first use

Language extensions - Distributed and concurrent models


Type: Distributed computing
Rating: 3 (intermediate)
Description:
  • runprime.mos: Running a submodel (requires prime.mos)
  • runprime2.mos: Submodel handling, compiling to memory (requires prime.mos)
  • runprimedistr.mos: Distributed computing: Running a model on a remote Mosel instance (requires prime.mos or prime3.mos)
  • runprimeio.mos: Data exchange via shared memory, using 'bin' and 'shmem' drivers (requires primeio.mos or prime3io.mos)
  • runprimeior.mos: Data exchange via shared memory, using 'raw' and 'shmem' drivers (requires primeior.mos or prime3ior.mos)
File(s): runprime.mos, prime.mos, runprime2.mos, runprimedistr.mos, prime3.mos, runprimeio.mos, primeio.mos, prime3io.mos, runprimeior.mos, primeior.mos, prime3ior.mos

runprime.mos
(!******************************************************
   Mosel User Guide Example Problems
   ================================= 

   file runprime.mos 
   `````````````````
   Model handling.
 
   (c) 2008 Fair Isaac Corporation
       author: S. Heipcke, 2005
*******************************************************!)

model "Run model prime"
 uses "mmjobs"

 declarations
  modPrime: Model
  event: Event
 end-declarations
                               ! Compile 'prime.mos'
 if compile("prime.mos")<>0 then exit(1); end-if

 load(modPrime, "prime.bim")   ! Load bim file

 run(modPrime, "LIMIT=50000")  ! Start execution and
 wait(2)                       ! wait 2 seconds for an event

 if isqueueempty then          ! No event has been sent...
  writeln("Model too slow: stopping it!")
  stop(modPrime)               ! ... stop the model, then wait
  wait
 end-if
                               ! An event is available: model finished
 event:=getnextevent
 writeln("Exit status: ", getvalue(event))
 writeln("Exit code  : ", getexitcode(modPrime))

 unload(modPrime)              ! Unload the submodel
end-model 

prime.mos
(!******************************************************
   Mosel User Guide Example Problems
   ================================= 

   file prime.mos 
   `````````````
   Working with sets.
 
   (c) 2008 Fair Isaac Corporation
       author: S. Heipcke, 2001
*******************************************************!)

model Prime 

 parameters
  LIMIT=100                     ! Search for prime numbers in 2..LIMIT
 end-parameters

 declarations
  SNumbers: set of integer      ! Set of numbers to be checked
  SPrime: set of integer        ! Set of prime numbers
 end-declarations

 SNumbers:={2..LIMIT} 
 
 writeln("Prime numbers between 2 and ", LIMIT, ":")

 n:=2
 repeat
   while (not(n in SNumbers)) n+=1
   SPrime += {n}                ! n is a prime number
   i:=n
   while (i<=LIMIT) do          ! Remove n and all its multiples
     SNumbers-= {i}
     i+=n
   end-do
 until SNumbers={}    
 
 writeln(SPrime)
 writeln(" (", getsize(SPrime), " prime numbers.)")
 
end-model


runprime2.mos
(!******************************************************
   Mosel User Guide Example Problems
   ================================= 

   file runprime2.mos 
   ``````````````````
   Model handling. Compiling to memory.
 
   (c) 2008 Fair Isaac Corporation
       author: S. Heipcke, 2005
*******************************************************!)

model "Run model prime (2)"
 uses "mmjobs", "mmsystem"

 declarations
  modPrime: Model
  event: Event
 end-declarations

                               ! Compile 'prime.mos' to memory
 if compile("","prime.mos","shmem:bim")<>0 then
  exit(1)
 end-if

 load(modPrime,"shmem:bim")    ! Load bim file from memory...
 fdelete("shmem:bim")          ! ... and release the memory block

 run(modPrime, "LIMIT=50000")  ! Start execution and
 wait(2)                       ! wait 2 seconds for an event

 if isqueueempty then          ! No event has been sent...
  writeln("Model too slow: stopping it!")
  stop(modPrime)               ! ... stop the model, then wait
  wait
 end-if
                               ! An event is available: model finished
 event:=getnextevent
 writeln("Exit status: ", getvalue(event))
 writeln("Exit code  : ", getexitcode(modPrime))

 unload(modPrime)              ! Unload the submodel
end-model 

runprimedistr.mos
(!******************************************************
   Mosel User Guide Example Problems
   ================================= 

   file runprimedistr.mos 
   ``````````````````````
   Distributed computing: 
   Running a model on a remote Mosel instance.

   *** ATTENTION: This model will return an error if ***
   *** no more than one Xpress licence is available. ***
  
   (c) 2010 Fair Isaac Corporation
       author: S. Heipcke, July 2010
*******************************************************!)

model "Run model prime remotely"
 uses "mmjobs"

 declarations
  moselInst: Mosel
  modPrime: Model
  event: Event
 end-declarations
                               ! Compile 'prime.mos' locally
 if compile("prime.mos")<>0 then exit(1); end-if

                               ! Start a remote Mosel instance: 
                               ! "" means the node running this model
 if connect(moselInst, "")<>0 then exit(2); end-if

                               ! Load bim file into remote instance
 load(moselInst, modPrime, "rmt:prime.bim")

 run(modPrime, "LIMIT=50000")  ! Start execution and
 wait(2)                       ! wait 2 seconds for an event

 if isqueueempty then          ! No event has been sent...
  writeln("Model too slow: stopping it!")
  stop(modPrime)               ! ... stop the model, then wait
  wait
 end-if
                               ! An event is available: model finished
 event:=getnextevent
 writeln("Exit status: ", getvalue(event))
 writeln("Exit code  : ", getexitcode(modPrime))

 unload(modPrime)              ! Unload the submodel
end-model 

prime3.mos
(!******************************************************
   Mosel User Guide Example Problems
   ================================= 

   file prime3.mos 
   ```````````````
   Prime number algorithm for large values of LIMIT.
 
   (c) 2008 Fair Isaac Corporation
       author: S. Heipcke, 2006
*******************************************************!)

model "Prime (array)"

 parameters
  LIMIT=20000                   ! Search for prime numbers in 2..LIMIT
 end-parameters

 declarations
  INumbers = 2..LIMIT           ! Set of numbers to be checked
  SNumbers: array(INumbers) of boolean   
  SPrime: set of integer        ! Set of prime numbers
 end-declarations

 writeln("Prime numbers between 2 and ", LIMIT, ":")

 n:=2
 repeat
   SPrime += {n}                ! n is a prime number
   i:=n
   while (i<=LIMIT) do          ! Remove n and all its multiples
     SNumbers(i):= true
     i+=n
   end-do
   while (n <= LIMIT and SNumbers(n)) n+=1
 until (n>LIMIT)   
 
 writeln(SPrime)
 writeln(" (", getsize(SPrime), " prime numbers.)")
 
end-model

runprimeio.mos
(!******************************************************
   Mosel User Guide Example Problems
   ================================= 

   file runprimeio.mos 
   ```````````````````
   Data exchange via shared memory.
 
   (c) 2008 Fair Isaac Corporation
       author: S. Heipcke, 2005, rev. Apr. 2011
*******************************************************!)

model "Run model primeio"
 uses "mmjobs"

 declarations
  modPrime: Model
  NumP: integer                ! Number of prime numbers found
  SetP: set of integer         ! Set of prime numbers
  STOPMOD = 2                  ! "Stop submodel" user event
  MODREADY = 3                 ! "Submodel ready" user event
 end-declarations

                               ! Compile 'prime.mos'
 if compile("primeio.mos")<>0 then exit(1); end-if

 load(modPrime, "primeio.bim") ! Load bim file

                               ! Disable submodel output
 setdefstream(modPrime,"","null:","null:")
 run(modPrime, "LIMIT=35000")  ! Start execution and
 wait                          ! ... wait for an event
 if getclass(getnextevent) <> MODREADY then
  writeln("Problem with submodel run")
  exit(1)
 end-if 

 wait(2)                       ! Let the submodel run for 2 seconds

 if isqueueempty then          ! No event has been sent...
  writeln("Model too slow: stopping it!")
  send(modPrime, STOPMOD, 0)   ! ... stop the model, then wait
  wait
 end-if
 
 initializations from "bin:shmem:resdata"
  NumP  SetP as "SPrime"
 end-initializations
 
 writeln(SetP)                 ! Output the result
 writeln(" (", NumP, " prime numbers.)")

 unload(modPrime)
end-model 

primeio.mos
(!******************************************************
   Mosel User Guide Example Problems
   ================================= 

   file primeio.mos 
   ```````````````
   Data exchange via memory.
 
   (c) 2008 Fair Isaac Corporation
       author: S. Heipcke, 2005, rev. Jan. 2013
*******************************************************!)

model "Prime IO" 
 uses "mmjobs"

 parameters
  LIMIT=100                     ! Search for prime numbers in 2..LIMIT
  OUTPUTFILE = "bin:shmem:resdata"
 end-parameters

 declarations
  SNumbers: set of integer      ! Set of numbers to be checked
  SPrime: set of integer        ! Set of prime numbers
  STOPMOD = 2                   ! "Stop submodel" user event
  MODREADY = 3                  ! "Submodel ready" user event
 end-declarations

 send(MODREADY,0)               ! Send "model ready" event 

 SNumbers:={2..LIMIT} 
 
 writeln("Prime numbers between 2 and ", LIMIT, ":")

 n:=2
 repeat
   while (not(n in SNumbers)) n+=1
   SPrime += {n}                ! n is a prime number
   i:=n
   while (i<=LIMIT) do          ! Remove n and all its multiples
     SNumbers-= {i}
     i+=n
   end-do
 until (SNumbers={} or not isqueueempty)     
 
 NumP:= getsize(SPrime)
 
 initializations to OUTPUTFILE
  NumP  SPrime 
 end-initializations
 
end-model

prime3io.mos
(!******************************************************
   Mosel User Guide Example Problems
   ================================= 

   file prime3io.mos 
   `````````````````
   Prime number algorithm for large values of LIMIT.
 
   (c) 2008 Fair Isaac Corporation
       author: S. Heipcke, 2006, rev. Apr. 2011
*******************************************************!)

model "Prime (array)"
 uses "mmjobs"

 parameters
  LIMIT=20000                   ! Search for prime numbers in 2..LIMIT
 end-parameters

 declarations
  INumbers = 2..LIMIT           ! Set of numbers to be checked
  SNumbers: array(INumbers) of boolean   
  SPrime: set of integer        ! Set of prime numbers
  STOPMOD = 2                   ! "Stop submodel" user event
  MODREADY = 3                  ! "Submodel ready" user event
 end-declarations

 send(MODREADY,0)               ! Send "model ready" event 

 writeln("Prime numbers between 2 and ", LIMIT, ":")

 n:=2
 repeat
   SPrime += {n}                ! n is a prime number
   i:=n
   while (i<=LIMIT) do          ! Remove n and all its multiples
     SNumbers(i):= true
     i+=n
   end-do
   while (n <= LIMIT and SNumbers(n)) n+=1
 until (n>LIMIT or not isqueueempty)   
 
 NumP:= getsize(SPrime)
 
 initializations to "bin:shmem:resdata"
  NumP  SPrime
 end-initializations
 
end-model

runprimeior.mos
(!******************************************************
   Mosel User Guide Example Problems
   ================================= 

   file runprimeior.mos 
   ````````````````````
   Data exchange via shared memory.
   - Using 'raw' driver -
 
   (c) 2008 Fair Isaac Corporation
       author: S. Heipcke, 2005, rev. Apr. 2011
*******************************************************!)

model "Run model primeior"
 uses "mmjobs"

 declarations
  modPrime: Model
  NumP: integer                ! Number of prime numbers found
  SetP: set of integer         ! Set of prime numbers
  STOPMOD = 2                  ! "Stop submodel" user event
  MODREADY = 3                 ! "Submodel ready" user event
 end-declarations

                                ! Compile 'prime.mos'
 if compile("primeior.mos")<>0 then exit(1); end-if

 load(modPrime, "primeior.bim") ! Load bim file

                                ! Disable model output
 setdefstream(modPrime,"","null:","null:")
 run(modPrime, "LIMIT=35000")   ! Start execution and
 wait                           ! ... wait for an event
 if getclass(getnextevent) <> MODREADY then
  writeln("Problem with submodel run")
  exit(1)
 end-if 

 wait(2)                        ! Let the submodel run for 2 seconds

 if isqueueempty then           ! No event has been sent...
  writeln("Model too slow: stopping it!")
  send(modPrime, STOPMOD, 0)    ! ... stop the model, then wait
  wait
 end-if
 
 initializations from "raw:"
  NumP as "shmem:NumP" SetP as "shmem:SPrime"
 end-initializations
 
 writeln(SetP)                  ! Output the result
 writeln(" (", NumP, " prime numbers.)")

 unload(modPrime)
end-model 

primeior.mos
(!******************************************************
   Mosel User Guide Example Problems
   ================================= 

   file primeior.mos 
   `````````````````
   Data exchange via memory.
   - Using 'raw' driver -
 
   (c) 2008 Fair Isaac Corporation
       author: S. Heipcke, 2005, rev. Apr. 2011
*******************************************************!)

model "Prime IO" 
 uses "mmjobs"

 parameters
  LIMIT=100                     ! Search for prime numbers in 2..LIMIT
 end-parameters

 declarations
  SNumbers: set of integer      ! Set of numbers to be checked
  SPrime: set of integer        ! Set of prime numbers
  STOPMOD = 2                   ! "Stop submodel" user event
  MODREADY = 3                  ! "Submodel ready" user event
 end-declarations

 send(MODREADY,0)               ! Send "model ready" event 

 SNumbers:={2..LIMIT} 
 
 writeln("Prime numbers between 2 and ", LIMIT, ":")

 n:=2
 repeat
   while (not(n in SNumbers)) n+=1
   SPrime += {n}                ! n is a prime number
   i:=n
   while (i<=LIMIT) do          ! Remove n and all its multiples
     SNumbers-= {i}
     i+=n
   end-do
 until (SNumbers={} or not isqueueempty)     
 
 NumP:= getsize(SPrime)
 
 initializations to "raw:"
  NumP as "shmem:NumP" SPrime as "shmem:SPrime"
 end-initializations
 
end-model

prime3ior.mos
(!******************************************************
   Mosel User Guide Example Problems
   ================================= 

   file prime3ior.mos 
   ``````````````````
   Prime number algorithm for large values of LIMIT.
   - Using 'raw' driver -
 
   (c) 2008 Fair Isaac Corporation
       author: S. Heipcke, 2006
*******************************************************!)

model "Prime (array)"
 uses "mmjobs"

 parameters
  LIMIT=20000                   ! Search for prime numbers in 2..LIMIT
 end-parameters

 declarations
  INumbers = 2..LIMIT           ! Set of numbers to be checked
  SNumbers: array(INumbers) of boolean   
  SPrime: set of integer        ! Set of prime numbers
  STOPMOD = 2                   ! "Stop submodel" user event
  MODREADY = 3                  ! "Submodel ready" user event
 end-declarations

 send(MODREADY,0)               ! Send "model ready" event 

 writeln("Prime numbers between 2 and ", LIMIT, ":")

 n:=2
 repeat
   SPrime += {n}                ! n is a prime number
   i:=n
   while (i<=LIMIT) do          ! Remove n and all its multiples
     SNumbers(i):= true
     i+=n
   end-do
   while (n <= LIMIT and SNumbers(n)) n+=1
 until (n>LIMIT or not isqueueempty)   
 
 NumP:= getsize(SPrime)
 
 initializations to "raw:"
  NumP as "shmem:NumP" SPrime as "shmem:SPrime"
 end-initializations
 
end-model