Saturday, August 9, 2008

Loops are slow in GAMS

When optimizing GAMS code it is always worthwhile to see if you can remove loops. Here is an example of an if,then,else construct:

   1  set i /i1*i200/;
2
3 alias (i,j,k);
4 parameter a(i,j,k),b(i,j,k),c(i,j,k);
5 a(i,j,k) = uniform(0.1,1);
6 b(i,j,k) = uniform(0.1,1);
7 c(i,j,k) = uniform(0.1,1);
8
9 parameter p1(i,j,k),p2(i,j,k),p3(i,j,k);
10
11 * this is fast
12 p1(i,j,k) = ifthen(b(i,j,k)>0.5,a(i,j,k)/b(i,j,k),c(i,j,k));
13
14 * this is slow
15 loop((i,j,k),
16 if(b(i,j,k)>0.5,
17 p2(i,j,k) = a(i,j,k)/b(i,j,k)
18 else
19 p2(i,j,k) = c(i,j,k)
20 );
21 );
22
23 * this is fast but I feel uneasy about assumption that
24 * these conditions are quaranteed mutual exclusive
25 * for floating point numbers
26 p3(i,j,k) = [a(i,j,k)/b(i,j,k)]$(b(i,j,k)>0.5) + c(i,j,k)$(b(i,j,k)<=0.5);



The profiling info clearly indicates the loop is the slowest alternative:

----      1 ExecInit                 0.000     0.000 SECS      3 Mb
---- 5 Assignment a 1.762 1.762 SECS 261 Mb 8000000
---- 6 Assignment b 1.748 3.510 SECS 518 Mb 8000000
---- 7 Assignment c 1.747 5.257 SECS 775 Mb 8000000
---- 12 Assignment p1 3.307 8.564 SECS 1,032 Mb 8000000
---- 15 Loop 22.027 30.591 SECS 1,288 Mb
---- 26 Assignment p3 3.900 34.491 SECS 1,545 Mb 8000000



I prefer the ifthen construct as this has a real 'else'. The assignment to p3 uses two different $ conditions, which makes me feel uneasy.

1 comment:

  1. Hi, Thanks for the post.
    There are some speed issues with my program because of loops in GAMS. The program is quite fast for small instances but the time increases drastically when the problem size increases.
    The program has to go through all the elements in 3 sets and check certain conditions. If the conditions don't satisfy, it should add constraints in the GAMS model and solve it.
    To do this, I am using 3 loops. I checked the profiling information and it states that most of the time is needed for loops.
    Do you have any suggestions for avoiding loops in this situation? I would be very grateful for your help. Thanks in advance.

    ReplyDelete