| 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
 | 
| 
 |