[Dip] Implicit Polyhedra and GAP

Kipp Martin kmartin at chicagobooth.edu
Tue Sep 7 12:42:35 EDT 2010


Hi Matt:
> 
>     I ran the GAP example for  VERSION1. Got it to run with no problem.
>     Very useful. I was hoping you could clarify the folloiwng.
> 
>     1) It looks like the only place where the blocks get defined are in
>     235-238:
> 
>        for(i = 0; i < nMachines; i++){
>           modelName = "KP" + UtilIntToStr(i);
>           setModelRelax(NULL, modelName, i);
>        }
> 
>     It looks like you are NOT creating a DecompConstraintSet for each
>     block and you are NOT specifying the variables that go into the
>     blocks. Is this correct? You simply tell the master how many blocks
>     there are with setModelRelax().
> 
> 
> That is correct. There is no "explicit" polyhedron in this example. It 
> is implicitly defined by the oracle (solveRelaxed).

The above is easy and simple, I like it.
> 

> 
> Yes, master-only would be included in redCostX and as a user you would 
> want to ignore them. Each master-only is considered its own block and is 
> dealt with internally. I guess I should add an example that shows 
> implicit polyhdreon and master-only variables? Is that the case you 
> have? If so, I can work on that soon. Yes, you should delcare them and 
> explicitly state them as master-only.

Yes, it is the case I have, depending on how I organize my blocks and 
coupling constrains.
> 
> 
> 
>  
> 
> 
>     4) This is related to 3). If indeed, redCostX is the vector of all
>     variables then I suppose I could easily do what I wrote you about
>     earlier this  summer, namely solve the blocks in parallel. That is I
>     could take redCostX and in my own code, in parallel solve a problem
>     for each block and then when each solveRelaxed() is called in turn,
>     give it the solution from my parallel solve. Does this make sense?
> 
> 
> Not yet. Two issues there. (1) the logic by default is to loop over all 
> blocks and call the solveRelaxed for each value of whichBlock. So, if 
> you solved all in parallel, you'd get too many. You, could, of course, 
> just solve the "first one" for all and then skip the rest. But, that is 
> an ugly hack. (2) The argument convexDual is the dual associated with 
> the convexity constraint for `whichBlock`. To do what you want, you 
> really need all the duals for the convexity constraint. Again, you could 
> "get this" by grabbing the full dual vector from the master LP and 
> parsing it yourself - but that gets tricky when you add in cut and 
> branch constraints to the master -- the accounting is tricky.



But for each block, convexDual affects the value of the reduced cost, 
but it has no effect on which column I choose. The convexDual does not 
affect the subproblem solution, only the solution value. Therefore, in 
the first call to solveRelaxed (whichBlock = 1) I can use redCostX for 
all the variables and simultaneously find the best column for each 
subproblem. Then when the other subproblems are called (whichBlock >1) I 
simply take the column from the first call (do not solve again) and 
return it. The convexDual did not affect that solution. Hope I  am 
making sense here.

Actually the reason I am interested in this is two fold. First, in the 
generic case I want to setup a parallel solve in OS. Second, in my 
specific application, I actually have some coupling constraints across 
the blocks that do not put into the core constraints, but I have a 
pseudo-polynomial algorithm for solving the resulting subproblem. Hard 
to explain by email.


-- 
Kipp Martin
Professor of Operations Research
and Computing Technology
Booth School of Business
University of Chicago
5807 South Woodlawn Avenue
Chicago, IL 60637
773-702-7456
kmartin at chicagobooth.edu
http://www.chicagobooth.edu/faculty/bio.aspx?person_id=12825325568
http://projects.coin-or.org/OS



More information about the Dip mailing list