FICO Xpress Optimization Examples Repository
 FICO Optimization Community FICO Xpress Optimization Home

Using 'exists' for loops over sparse arrays

Description
The models loop.mos/looph.mos and proj.mos show the effect of using the keyword exists in conditions on loops over sparse arrays. As can be seen, the careful formulation of loops may result in a considerable speedup of the model execution time. Mosel defines two forms of sparse arrays, namely dynamic arrays and hashmap arrays. The model sparsearrays.mos compares the performance of these two forms for different cases of enumerations.

Further explanation of this example: 'Mosel User Guide', Appendix 'Good modeling practice' explains in detail the correct use of exists.

Source Files
By clicking on a file name, a preview is opened at the bottom of this page.

Data Files

loop.mos

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

file loop.mos

Demonstrate effect of exists'

(c) 2008 Fair Isaac Corporation
author: S. Heipcke, 2002, rev. Nov. 2021
*******************************************************!)

model "loop"
uses "mmsystem"

public declarations
R1,R2,R3,R4,R5: range
Cost: dynamic array(R1,R2,R3,R4,R5) of real
x: dynamic array(R1,R2,R3,R4,R5) of mpvar
end-declarations

! This would normally be read in from a file
Cost(1,1,1,1,1) := 1.1
Cost(1,30,1,3,3) := 2.2
Cost(1,1,30,1,4) := 3.3
Cost(1,1,1,30,1) := 4.4
Cost(1,6,1,1,30) := 5.5
Cost(30,1,1,1,3) := 6.6

forall(i1 in R1, i2 in R2, i3 in R3, i4 in R4, i5 in R5 |
exists(Cost(i1,i2,i3,i4,i5)) )  create(x(i1,i2,i3,i4,i5))

starttime:=gettime

! 'exists' is not required here from a logical point of view, since the
! sum  will only contain the variables that have been created, but it
! helps speeding up things. Compare the running times with and without it:

sum(i1 in R1, i2 in R2, i3 in R3, i4 in R4, i5 in R5 |
exists(Cost(i1,i2,i3,i4,i5)) )
Cost(i1,i2,i3,i4,i5) * x(i1,i2,i3,i4,i5) = 1

writeln("Time using exists': ", gettime-starttime)

sum(i1 in R1, i2 in R2, i3 in R3, i4 in R4, i5 in R5 )
Cost(i1,i2,i3,i4,i5) * x(i1,i2,i3,i4,i5) = 1

writeln("Time without exists': ", gettime-starttime)

! Display the resulting constraint definitions on screen
exportprob("")
end-model