help-glpk
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Help-glpk] manipulating parameter indices


From: glpk xypron
Subject: Re: [Help-glpk] manipulating parameter indices
Date: Thu, 05 Jul 2012 06:53:00 +0200

Hello Kevin,

setABC will be calculated once only.

Best regards

Xypron

-------- Original-Nachricht --------
> Datum: Wed, 04 Jul 2012 15:32:51 -0400
> Betreff: Re: [Help-glpk] manipulating parameter indices

> At 10:03am -0400 Wed, 04 Jul 2012, Andrew Makhorin wrote:
> > In the current mathprog implementation no query optimization is
> > performed, that is, all intermediate and resulting objects are
> > evaluated literally as specified by corresponding expressions. (This
> > is exactly the same problem that appears in the relational database
> > systems.) For example,
> >
> >     param foo{i in I} := sum{j in J: (i,j) in E} x[i,j];
> >
> > will be evaluated as follows:
> >
> >     for all i in I do
> >     {  s := 0;
> >        for all j in J do
> >        {  if (i,j) in E then
> >              s := s + x[i,j]
> >        }
> >        foo[i] := s
> >     }
> 
> Ah, I see.  So how about a compound situation like below?
> 
>    # i.e. a generated set.  Does this get created once and then used as
>    # a "first class" set?  Or does the "such that" operator get
>    # evaluated for every use if setABC?
> set setABC := {a in setA, b in setB, c in setC : a + b = c };
> 
> set setABCD := {(a, b, c) in setABC, d in setD : a + c = d };
> 
> s.t. C1 {(a, b, c) in setABC} :
>   VarX[a, b, c] <=  sum{(a, b, c, d) in setABCD} ParamX[a, b, c, d];
> 
> s.t. C2 {(a, b, c) in setABC} :
>   VarX[a, b, c] >= -sum{(a, b, c, d) in setABCD} ParamY[a, b, c, d];
> 
> So, when executing the s.t. line of C1, if setABC has not yet been used, 
> does it get "instantiated" before C1 gets to use it, or is the code 
> '(a, b, c) in setABC' effectively now an alias for:
> 
> {a in setA, b in setB, c in setC : a * c > 10}
> 
> such that it's use in the C2 constraint does not get the benefit of the 
> cached result?
> 
> In a similar vein, is there a more efficient method to sum over common 
> indices?  In other words, the fact that a, b, and c are already set in 
> the loop for '(a, b, c, d) in setABCD'?  As I understand the pseudo-code 
> above, those lines translate to something like
> 
> {
>     s := 0
>     for all (da, db, dc, d) in setABCD do {   # da = "dummy a"
>        if a == da and b == db and c == dc then
>           s := s + ParamX[a, b, c, d]
>     }
> }
> 
> If this is case, would it behoove to me create my own specific cache 
> subsets, like
> 
>    # return sets of (a,b,c) that return d in setABCD
> set D_ABC{(a, b, c) in setABC} := setof{(a,b,c,d) in setABCD} d;
> 
> And then use as:
> 
> s.t. C1 {(a, b, c) in setABC} :
>   VarX[a, b, c] <=  sum{d in setD_ABC[a, b, c]} ParamX[a, b, c, d];
> 
> Many thanks for your input, Andrew!
> 
> Kevin
> 
> _______________________________________________
> Help-glpk mailing list
> address@hidden
> https://lists.gnu.org/mailman/listinfo/help-glpk



reply via email to

[Prev in Thread] Current Thread [Next in Thread]