User Tools

Site Tools


gams:reverse_loops_in_gams

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

gams:reverse_loops_in_gams [2007/03/20 09:21]
127.0.0.1 external edit
gams:reverse_loops_in_gams [2020/05/20 11:44] (current)
Frederik Fiand
Line 9: Line 9:
 alias (i,ri); alias (i,ri);
 set revi(i,ri); set revi(i,ri);
-the idea is to populate the sw-ne diagonal of revi. +The idea is to populate the sw-ne diagonal of revi. 
-then looping through i in forward order gives us +Then looping through i in forward order gives us 
-* i in reverse order by taking the second index of revi +* i in reverse order by taking the second index of revi. 
-this will work, but it is very slow, o(n^2)! +The follwing assignment would create revi, but it is very slow, o(n^2)! 
-* revi(i,​ri)$(ord(i) + ord(ri) eq n+1) = yes; +* revi(i,​ri)$(ord(i) + ord(ri) eq card(i)+1) = yes; 
-this is much faster, o(n)+* 
 +* This formulation ​is much faster, o(n).
 revi(i,​i+[card(i)-2*ord(i)+1]) = yes; revi(i,​i+[card(i)-2*ord(i)+1]) = yes;
 +
 parameter c(i); parameter c(i);
 c(i) = uniform(0,​1);​ c(i) = uniform(0,​1);​
Line 38: Line 40:
 1                   0.17 1                   0.17
 </​code>​ </​code>​
-Just a note on efficiency: The loop over revi goes very fast, since we are taking the first index, i, in order, and each row or revi has only one element. However, accessing c(ri) in reverse order is not so efficient, and may be a problem for very large i. To see this work, increase the dimension of set i and  ​run the model using profiling.+Just a note on efficiency: The loop over revi goes very fast, since we are taking the first index, i, in order, and each row of revi has only one element. However, accessing c(ri) in reverse order is not so efficient, and may be a problem for very large i.  
 +To see this work, increase the dimension of set irun the model using [[https://​www.gams.com/​latest/​docs/​UG_GamsCall.html#​GAMSAOprofile|profiling]] and analyze what happens if you replace the "​slow"​ <​code>​put ri.tl, c(ri)/;</​code>​ by <​code>​put i.tl, c(i)/;</​code>​.
  
  
IMPRESSUM / LEGAL NOTICEPRIVACY POLICY gams/reverse_loops_in_gams.txt · Last modified: 2020/05/20 11:44 by Frederik Fiand