Operations Research topics: SAS/OR,
SAS Optimization, and SAS Simulation Studio

summation of non-zero elements of sparse matrix using optmodel

Reply
Contributor
Posts: 35

summation of non-zero elements of sparse matrix using optmodel

I have a constraint which sums the nonzero elements of a sparse matrix. To do this, I am using the SLICE expression, so my constraint reads
like this:

con test{t in ASC}:sum{u in slice(<t,*>,Map)}y>=0;

Here 'Map' is a sparse matrix, with 2 mapped variables - ASC and UIN, i.e. 'Map' contains all eligible pairs of ASC and UIN.
The constraint should work like this: For each element 't' of ASC, it should check whether 't' has a corresponding value 'u' for UIN variable. If there is, then it adds y for that row.
However, when I run this constraint, I get a "Constraint is empty" error.

What am I doing wrong here/is there a better way of doing this?

SAS Employee
Posts: 448

Re: summation of non-zero elements of sparse matrix using optmodel

You can write this more compactly by using an "implicit" slice:

     con test{t in ASC}: sum{<(t),u> in Map} y >= 0;

See this doc example for more discussion:

SAS/OR(R) 13.2 User's Guide: Mathematical Programming Examples

Contributor
Posts: 35

Re: summation of non-zero elements of sparse matrix using optmodel

Thanks for the link.

Somehow the constraint you gave doesn't seem to work(again a "Constraint is empty" error). But the following constraint worked(I got it from the link you gave):

con test{t in ASC}:sum{u in UIN:<u,t> in Map}y>=0;

SAS Employee
Posts: 448

Re: summation of non-zero elements of sparse matrix using optmodel

Your latest version is not equivalent to the other two.  Instead, it should be:

     con test{t in ASC}:sum{u in UIN:<t,u> in Map}y>=0;

Also, the "Constraint is empty" message is only a NOTE and not an ERROR.  If you use the EXPAND statement, you will see that the constraint is 0 >= 0 because the sum is empty.  If you really want to avoid generating these constraints, you can use a logical condition:

     con test{t in ASC: card(slice(<t,*>,Map)) > 0}:sum{u in slice(<t,*>,Map)}y>=0;

Ask a Question
Discussion stats
  • 3 replies
  • 371 views
  • 3 likes
  • 2 in conversation