Set declatation with scalar inside

Hi,

I would like to do something like this, with t_max as a scalar:

set t /0*t_max/ ;


The problem is that this doesn`t work in GAMS. Is there a syntax which I could use?

Thanks in advance!

You need to understand the difference between compile- and runtime in GAMS (https://www.gams.com/latest/docs/UG_GamsCall.html#UG_GamsCall_TwoPass). All potential set elements need to be known at compile time. Therefore you can use a scalar to declare labels. You can though use the value of the scalar at compile time to define the set elements, or use a compile time constant to both declare the value of the scalar and the set elements. Compile time variables can be fed in to GAMS via command line double-dash parameters (https://www.gams.com/latest/docs/UG_GamsCall.html#UG_GamsCall_DoubleDashParametersEtc):

scalar t_max / 100 /;
$eval T_MAX t_max
set t / 0*%T_MAX% /;

or

$if not set T_MAX $set T_MAX 100
scalar t_max / %T_MAX% /;
set t / 0*%T_MAX% /;

-Michael

Thanks for your reply.

So do I understand correctly that if t_max has to be calculated, it´s not possible to use it for the defintion of the set t?

That´s my current (not working) code:

Dmax=sum(i,d(i));

scalar   t_max;

t_max= Dmax+10  ;

set       t    / 0*t_max /  ;

Correct. What one usually does it to overestimate t_max to declare a superset tt (don’t make BIG too large, GAMS needs to store all these labels) and then work with a dynamic set t:

Dmax=sum(i,d(i));
scalar   t_max;
t_max= Dmax+10  ;
$if not set BIG $set BIG 1000
set tt / 0*%BIG% /;
set       t(tt) ;
t(tt) = ord(tt)<=tmax;

-Michael