 FICO Xpress Optimization Examples Repository
 FICO Optimization Community FICO Xpress Optimization Home   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

```   