gams-math

Conditional expression for excluding equation from GAMS


I am using GAMS, and have defined two sets in the following way:

Sets
      i        index
     /a    
      b   
      C    
      d    /

j 
/h 
k
/

I now wish to declare a variable of dimension (i,j) as X(i,j):

Variables

X(i,j);

However, I do not wish that the equation list include the specific i value of d and j value of k. Essentially, I would like it to de-select EQX("d,"k") only, while keeping all the other equations for each combination of i and j.

I would normally type:

Equations
EQX(i,j) ;

EQX(i,j)$ (not sameAs(i,"d") and not sameAs(j, "k"))..

However, in stead of de-selecting that EQ, the script de-selects all equations. Is there something off with my syntax?


Solution

  • New reply based on the comments:

    You need to makes sure, the you get the order of and and not right. So, what you want is $(not (sameAs(i,"d") and sameAs(j, "k"))) (which is equivalent to $(not sameAs(i,"d") or not sameAs(j, "k"))) instead of $(not sameAs(i,"d") and not sameAs(j, "k")). So, here is a dummy model using that:

    Sets  i index / a, b, c, d /
          j       / h, k /;
          
    Variables X(i,j), dummy;
    Equations EQX(i,j);
    
    EQX(i,j)$(not (sameAs(i,"d") and sameAs(j, "k"))).. X(i,j) =e= dummy;
    
    Model m /EQX/;
    Solve m min dummy use lp;
    

    And looking at the equation listing, this is the result:

    ---- EQX  =E=  
    
    EQX(a,h)..  X(a,h) - dummy =E= 0 ; (LHS = 0)
         
    EQX(a,k)..  X(a,k) - dummy =E= 0 ; (LHS = 0)
         
    EQX(b,h)..  X(b,h) - dummy =E= 0 ; (LHS = 0)
         
    EQX(b,k)..  X(b,k) - dummy =E= 0 ; (LHS = 0)
         
    EQX(c,h)..  X(c,h) - dummy =E= 0 ; (LHS = 0)
         
    EQX(c,k)..  X(c,k) - dummy =E= 0 ; (LHS = 0)
         
    EQX(d,h)..  X(d,h) - dummy =E= 0 ; (LHS = 0)
    

    EDIT: Some details based on a question in the comments

    The syntax is a bit tricky!! Is there a reason why the order is important here?

    Think of it like this:

    You are concerned about exactly one element of the couple (i,j) and that it 'd'.'k'. You get this element by writing sameAs(i,"d") and sameAs(j, "k"). And since this element should be excluded from the list of all possible elements in (i,j), you need to negate this operation using not. For this, you need to keep in mind the order of operations (or operator precedence), which is higher for not than it is for and, so that you have to use quotes and write not (sameAs(i,"d") and sameAs(j, "k")).

    Note that the order of operations is not specific to GAMS, but a general concept in math and programming languages, see for example here.