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

Approximating PI number

Description
This example shows how to approximate the PI number by executing Mosel models on a remote nodes. The C or Java XPRD program (piap.c or piap.java) connects to a remote node, there compiles the model piapprox.mos, loads it several times, runs all models instances in parallel and retrieves the result via an event message.

Further explanation of this example: 'XPRD: Mosel remote invocation library reference manual'


Source Files





piapprox.mos

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

   file piapprox.mos
   `````````````````
   Approximating the value of pi by integrating the
   function 1/(1+x^2) over the interval [0,1].
   The integral is approximated by dividing the interval [0,1]
   into N subintervals and calculating the sum of their areas.   
   
   integral 0 to 1  1/(1+x^2)dx
   = arctan(1)-arctan(0)
   = arctan(1)
   = pi/4   
   
   (c) 2010 Fair Isaac Corporation
       author: S. Heipcke, June 2010, rev. Nov. 2018
  *******************************************************!)

model "approximating pi"
 uses "mmjobs"
 
 parameters
  N = 1000000                  ! Number of intervals
  K = 20                       ! Number of submodels to run
  NUM = 0                      ! 0 in master model, else >=1
 end-parameters
 
 if N<1 then exit(1); end-if

!!! Configure this list with machines in your local network,
!!! there must be at least 1 entry in this list.
  NODELIST:=["","localhost"]
 
 declarations
  A = 1..K
  B: range
  modPar: array(A) of Model
  moselInst: array(B) of Mosel
  NODES: array(B) of string

  h,res: real
  M: integer
  
  NEWSUM = 2
  ev: Event
 end-declarations 
 
! Start child nodes
 if NUM=0 then
  forall(n in NODELIST, ct as counter) NODES(ct):=n
  M:= getsize(B)

  forall(i in B) do
    create(moselInst(i))            
    if connect(moselInst(i), NODES(i))<>0 then exit(2); end-if
  end-do
  
  if compile("piapprox.mos")<>0 then exit(3); end-if
  forall(j in A) do
    load(moselInst(j mod M + 1), modPar(j), "rmt:piapprox.bim")  
                                   ! Start remote model execution
    run(modPar(j), "NUM="+j+",N="+N)
  end-do
 
 else
 ! Calculate a part of pi
   h:=1/N
   i:=NUM
   while(i <= N) do
     x:=h*(i-0.5)
     pisum+= 4/(1+x^2)
     i+=K
   end-do 
   mypi:=h*pisum

   writeln(NUM, "(", getparam("NODENUMBER"), ",", getparam("JOBID"), "): ",
     strfmt(mypi,20,19))
 end-if
 
 if NUM>0 then
 ! Return the solution value
   send(NEWSUM, mypi)
 else 
 ! Add up values for parts returned by child models
   modct:=0
   while (modct<K) do
     ev:=getnextevent
     if getclass(ev)=NEWSUM then
       mypi+=getvalue(ev)
       modct+=1 
     end-if  
   end-do

 ! Solution output
   writeln("pi approximation: ", strfmt(mypi,20,19))
   writeln("pi (built-in):    ", strfmt(M_PI,20,19))
   writeln("difference   :    ", strfmt(abs(mypi-M_PI),20,19))
 end-if
 
end-model  

Back to examples browserPrevious exampleNext example