$title Repeated computation of percentiles within a loop (rank04,SEQ=138) $onText Dear Prof Rutherford, I am sorry to bother you again. If you recall I was having difficulty with the ‘rank’ function. I wasn’t able to run it in loop and use the 95th percentile value as a constraint in the next run of the loop, while also retaining a value of the 95th percentile for every iteration of the loop. [model below]. In the loop $libinclude rank call I ask GAMS to place the ranked values in pct, it only runs for 1 iteration before the ‘user error’ in rank. Whereas if I ask gams to put the ranked values in pct2, it runs for 2 iterations before saying ‘user error’. This must mean that the rank function only allows pct to be over-written once, after which it ‘fills up’ and generates a user error? How can I over come this? In your last email you though the problem was that the original values are being over written. So I introduced xparam95(iter). I think rank does not allow them to be overwritten. I am only a novice and have been stuck on this for sometime, your help will be invaluable. Kind regards, Ashar $offText Set iter 'Iterations' / iter1*iter10 / week 'Weeks in the year' / 1*52 / percentile 'Percentiles (all of them)' / 1*100 / pctl(percentile) 'Percentiles to be computed' / 50, 75, 80, 95 /; Parameter z(week) 'Values to be sorted' rnk(week) 'Rank values' pct(*) 'Percentiles to be computed (input) and those values (output)' pct0(*) 'Percentiles to be computed' pctval(iter,*) 'Percentile values in successive iterations'; * Generate a "permanent copy" of the percentiles to be computed. * This will be used to initialize pct before each call to rank; pct0(percentile)$pctl(percentile) = ord(percentile); * Assume that a model solution delivers the values; z(week) = uniform(0,1); * Assign the percentile values to be computed here: pct(pctl) = pct0(pctl); display 'Here are the INPUT values of PCT0 and PCT prior to the call to rank:', pct0, pct; $libInclude rank z week rnk pct display 'Here are the values of PCT0 and PCT after the call to rank:', pct0, 'Note that rank has changed the OUTPUT value of pct', pct; * Do several iterations, computing percentiles in each step: loop(iter, * Substitute a call to the NLP solver by a call to the random * number generator. In many applications, this substitution * produces profoundly more sensible results. * * solve catchment using nlp maximizing max; z(week) = uniform(0,1); * If you want to retrieve percentile values, you need to reassign * the percentiles that you wish to retrieve at this point in the * program. If pct() were not reassigned at this point, the INPUT * values would correspond to the OUTPUTs from the previous call. pct(pctl) = pct0(pctl); $ libInclude rank z week rnk pct pctval(iter,pctl) = pct(pctl); ); display pctval;