| myconstants.mos | 
| (!******************************************
  Mosel Examples
  ==============
  File myconstants.mos
  ````````````````````
  Example package defining 
    constants
  of different types.
  (c) 2008 Fair Isaac Corporation
      author: S. Heipcke, 2005
*******************************************!)
package myconstants
 public declarations
  MYCST_BIGM = 10000          ! A large integer value
  MYCST_TOL = 0.00001         ! A tolerance value
  MYCST_LINE =                ! String constant
     "----------------------------------------------------------------"
  MYCST_FLAG = true           ! Constant with value true
  MYCST_NOFLAG = false        ! Constant with value false
 end-declarations
end-package
 | 
| 
 | 
| myconst_test.mos | 
| (!******************************************************
   Mosel NI Examples
   =================
   File myconst_test.mos
   `````````````````````
   Using module myconstants
   *** Compile myconstants.mos before running this model ****
   (c) 2008 Fair Isaac Corporation 
       author: S. Heipcke, 2002
*******************************************************!)
model "Test myconstants module"
 uses "myconstants"
 writeln(MYCST_LINE)
 writeln("BigM value: ", MYCST_BIGM, ", tolerance value: ", MYCST_TOL)
 writeln("Boolean flags: ", MYCST_FLAG, " ", MYCST_NOFLAG)
 writeln(MYCST_LINE)
 
end-model
 | 
| 
 | 
| solarraypkg.mos | 
| (!******************************************
   Mosel Example Problems
   ======================
   File solarraypkg.mos
   ````````````````````
   Example package providing the procedure
     solarray(array of mpvar, array of real)
   for getting solutions into an array.
   (c) 2008 Fair Isaac Corporation
       author: S. Heipcke, May 2005
*******************************************!)
package solarraypkg 
! **** Integer indices (including ranges) ****
 public procedure solarray(x:array(R:set of integer) of mpvar,
                           s:array(set of integer) of real)
  forall(i in R) s(i):=getsol(x(i))
 end-procedure 
 public procedure solarray(x:array(R1:set of integer,
                                   R2:set of integer) of mpvar,
                           s:array(set of integer, set of integer) of real)
  forall(i in R1, j in R2) s(i,j):=getsol(x(i,j))
 end-procedure 
 
 public procedure solarray(x:array(R1:set of integer,
                                   R2:set of integer,
				   R3:set of integer) of mpvar,
                           s:array(set of integer,
			           set of integer,
				   set of integer) of real)
  forall(i in R1, j in R2, k in R3) s(i,j,k):=getsol(x(i,j,k))
 end-procedure 
 public procedure solarray(x:array(R1:set of integer,
                                   R2:set of integer,
                                   R3:set of integer,
				   R4:set of integer) of mpvar,
                           s:array(set of integer, set of integer,
			           set of integer, set of integer) of real)
  forall(i in R1, j in R2, k in R3, l in R4) s(i,j,k,l):=getsol(x(i,j,k,l))
 end-procedure 
! ****String indices ****
 public procedure solarray(x:array(R:set of string) of mpvar,
                           s:array(set of string) of real)
  forall(i in R) s(i):=getsol(x(i))
 end-procedure 
 public procedure solarray(x:array(R1:set of string,
                                   R2:set of string) of mpvar,
                           s:array(set of string, set of string) of real)
  forall(i in R1, j in R2) s(i,j):=getsol(x(i,j))
 end-procedure 
 
 public procedure solarray(x:array(R1:set of string,
                                   R2:set of string,
				   R3:set of string) of mpvar,
                           s:array(set of string,
			           set of string,
				   set of string) of real)
  forall(i in R1, j in R2, k in R3) s(i,j,k):=getsol(x(i,j,k))
 end-procedure 
 public procedure solarray(x:array(R1:set of string,
                                   R2:set of string,
                                   R3:set of string,
				   R4:set of string) of mpvar,
                           s:array(set of string, set of string,
			           set of string, set of string) of real)
  forall(i in R1, j in R2, k in R3, l in R4) s(i,j,k,l):=getsol(x(i,j,k,l))
 end-procedure   
end-package
 | 
| 
 | 
| solarrpkg_test.mos | 
| (!******************************************************
   Mosel Example Problems
   ======================
   File solarrpkg_test.mos
   ```````````````````````
   Using the package 'solarraypkg'
   *** Compile solarraypkg.mos before running this model ****
   (c) 2008 Fair Isaac Corporation 
       author: S. Heipcke, 2005
*******************************************************!)
model "Test solarraypkg package"
 uses "solarraypkg", "mmxprs"
 declarations
  R1=1..2
  R2={6,7,9}
  R3={5,-1}
  x: array(R1,R2,R3) of mpvar
  sol: array(R1,R2,R3) of real
 end-declarations
! Define and solve a small problem  
 sum(i in R1, j in R2, k in R3) (i+j+2*k) * x(i,j,k) <= 20
 forall(i in R1, j in R2, k in R3) x(i,j,k)<=1
 maximize(sum(i in R1, j in R2, k in R3) (i+2*j+k) * x(i,j,k))
! Get the solution array  
 solarray(x,sol)
! Print the solution 
 forall(i in R1, j in R2, k in R3)
  writeln(" (", i, ",", j, ",", k, ") ", sol(i,j,k), " ", getsol(x(i,j,k)))
 writeln(sol)
end-model
 | 
| 
 | 
| solarrayanypkg.mos | 
| (!******************************************
   Mosel Example Problems
   ======================
   File solarrayanypkg.mos
   ```````````````````````
   Example package providing the procedure
     solarray(array of mpvar, array of real)
   for getting solutions into an array.
   -- Implementation via union types and reflection --
   (c) 2022 Fair Isaac Corporation
       author: S. Heipcke, Jan 2022
*******************************************!)
package solarrayanypkg 
 uses "mmreflect"
 ! Utility routine checking whether 2 arrays have the same index set types
 function checkindices(x:any, s:any): boolean
   returned:= x.array.nbdim=s.array.nbdim and     
     and(i in 1.. x.array.nbdim) 
       x.array.index(i).eltype=s.array.index(i).eltype
 end-function
 ! Generic implementation of solarray routine
 public procedure solarray(x:any, s:any)
   declarations
     it: iterator
   end-declarations
   if x is array of mpvar and s is array of real then
     if checkindices(x,s) then
       inititer(it,x.array)
       reset(s.array)
       while (nextcell(it)) s.array(it).real:= x.array(it).mpvar.sol
     else
       writeln("SOLARRAY: array indices don't match")
     end-if
   else
     writeln("SOLARRAY: arguments must be arrays of type mpvar / real")
   end-if
 end-procedure 
 
end-package
 | 
| 
 | 
| solarranypkg_test.mos | 
| (!******************************************************
   Mosel Example Problems
   ======================
   File solarranypkg_test.mos
   ``````````````````````````
   Using the package 'solarrayanypkg'
   *** Compile solarrayanypkg.mos before running this model ****
   (c) 2022 Fair Isaac Corporation 
       author: S. Heipcke, Jan 2022
*******************************************************!)
model "Test solarrayanypkg package"
 uses "solarrayanypkg", "mmxprs"
 declarations
  R1=1..2
  R2={6,7,9}
  R3={5,-1}
  x: array(R1,R2,R3) of mpvar
  sol: array(R1,R2,R3) of real
  sola: array(integer,integer,integer) of real
  x2: array(R2,R3) of mpvar
  sol2: array(R2,R3) of real
  sol3: array(R1,R2,R3) of integer
  sol4: array(R1,R2,string) of real
 end-declarations
! Define and solve a small problem  
 sum(i in R1, j in R2, k in R3) (i+j+2*k) * x(i,j,k) <= 20
 forall(i in R1, j in R2, k in R3) x(i,j,k)<=1
 forall(j in R2, k in R3) x(1,j,k)=x2(j,k)
 maximize(sum(i in R1, j in R2, k in R3) (i+2*j+k) * x(i,j,k))
! Get the solution array  
 solarray(x,sol)
! Print the solution (3-dimensional array)
 forall(i in R1, j in R2, k in R3)
  writeln(" (", i, ",", j, ",", k, ") ", sol(i,j,k), " ", getsol(x(i,j,k)))
 writeln(sol)
 solarray(x,sola)
 writeln(sola)
! Testing with 2-dimensional array
 solarray(x2,sol2)
 writeln(sol2)
! Testing various error situations
 solarray(x,sol2)
 solarray(x,sol3)
 solarray(x,sol4)
end-model
 | 
| 
 | 
| arcpkg.mos | 
| (!******************************************************
   Mosel User Guide Example Problems
   ================================= 
   file arcpkg.mos
   ```````````````
   Definition of the type 'arc'.
   
   (c) 2008 Fair Isaac Corporation
       author: S. Heipcke, Jan. 2007, rev. June 2018
*******************************************************!)
package arcpkg
 public declarations
  arc = public record                   ! Arcs:
   Source,Sink: string                  !   Source and sink of arc
   Cost: real                           !   Cost coefficient
  end-record 
 end-declarations
(! Alternatively:
 declarations
  public arc = record                   ! Arcs:
   public Source,Sink: string           !   Source and sink of arc
   public Cost: real                    !   Cost coefficient
  end-record 
 end-declarations
!)
 public function is_neighbor(n1,n2: string, A: array(Arcs:set of integer) of arc): boolean
(!  
  returned:=or(a in Arcs ) ((A(a).Source=n1 and A(a).Sink=n2) or
                            (A(a).Source=n2 and A(a).Sink=n1))
!)
  returned:= or(a in Arcs, source=A(a).Source, sink=A(a).Sink) 
                ((source=n1 and sink=n2) or (source=n2 and sink=n1))
 end-function  
end-package 
 | 
| 
 | 
| arc_test.mos | 
| (!******************************************************
   Mosel Example Problems
   ======================
   file arc_test.mos
   `````````````````
   Using the package 'arcpkg'.
   *** Compile arcpkg.mos before running this model ****
   
   (c) 2008 Fair Isaac Corporation
       author: S. Heipcke, Jan. 2007, rev. June 2018
*******************************************************!)
model "Arcs"
 uses "arcpkg"
 declarations
  NODES: set of string                  ! Set of nodes
  ARC: array(ARCSET:range) of arc       ! Arcs
 end-declarations
 initializations from 'arcs.dat'
  ARC
 end-initializations
! Calculate the set of nodes
 NODES:=union(a in ARCSET) {ARC(a).Source, ARC(a).Sink}
 writeln(NODES)
 writeln("Average arc cost: ", sum(a in ARCSET) ARC(a).Cost / getsize(ARCSET) )
 writeln("Neighbors A and F: ", is_neighbor("A","F",ARC))
 writeln("Neighbors A and B: ", is_neighbor("A","B",ARC))
end-model 
 | 
| 
 | 
| parpkg.mos | 
| (!******************************************************
   Mosel User Guide Example Problems
   ================================= 
   file parpkg.mos
   ```````````````
   Definition of package parameters.
   
   (c) 2018 Fair Isaac Corporation
       author: Y. Colombani, May 2018
*******************************************************!)
package parpkg
 ! Specify parameter names and types
 parameters
  "p1":real
  "p2":integer
  "p3":string
  "p4":boolean
 end-parameters
 ! Entities for storing current parameter values
 declarations
  myp1: real
  myp2: integer
  myp3: string
  myp4: boolean
 end-declarations
 ! Get value of a real parameter
 public function parpkg~getrparam(p:string):real
  case p of
   "p1": returned:=myp1
  end-case
 end-function
 ! Get value of an integer parameter
 public function parpkg~getiparam(p:string):integer
  case p of
   "p2": returned:=myp2
  end-case
 end-function
 ! Get value of a string parameter
 public function parpkg~getsparam(p:string):string
  case p of
   "p3": returned:=myp3
  end-case
 end-function
 ! Get value of a boolean parameter
 public function parpkg~getbparam(p:string):boolean
  case p of
   "p4": returned:=myp4
  end-case
 end-function
 ! Set value for real parameters
 public procedure parpkg~setparam(p:string,v:real)
  case p of
   "p1": myp1:=v
  end-case
 end-procedure
 ! Set value for integer parameters
 public procedure parpkg~setparam(p:string,v:integer)
  case p of
   "p2": myp2:=v
  end-case
 end-procedure
 ! Set value for string parameters
 public procedure parpkg~setparam(p:string,v:string)
  case p of
   "p3": myp3:=v
  end-case
 end-procedure
 ! Set value procedure for boolean parameters
 public procedure parpkg~setparam(p:string,v:boolean)
  case p of
   "p4": myp4:=v
  end-case
 end-procedure
 ! Set default values for parameters
 myp1:=0.25
 myp2:=10
 myp3:="default"
 myp4:=true
end-package
 | 
| 
 | 
| params_test.mos | 
| (!******************************************************
   Mosel User Guide Example Problems
   ================================= 
   file params_test.mos
   ````````````````````
   Working with package parameters.
   *** Compile parpkg.mos before running this model ****
   
   (c) 2018 Fair Isaac Corporation
       author: Y. Colombani, May 2018
*******************************************************!)
model "Packages with parameters"
 uses 'parpkg'
 ! Display default parameter values
 writeln("Default values:", 
   " p1=", getparam("parpkg.P1"), " p2=", getparam("P2"), 
   " p3=", getparam("parpkg.p3"), " p4=", getparam("p4"))
 ! Change values
 setparam("p1",133); setparam("parpkg.p2",-77)
 setparam("P3","tluafed"); setparam("parpkg.P4",not getparam("parpkg.P4"))
end-model
 | 
| 
 |