Open spoorendonk opened 4 years ago
Yeah, the way that it's done has to do with how Dip interacts with Alps. I'm not sure quite how easy this is going to be, actually, There may be some hidden gotchas in how the subproblems are created. The general mechanism is that the branching disjunction is selected in DecompAlpsTreeNode::process()
by cal;ling DecompAlgo::chooseBranchSet()
, then the node is marked with status AlpsNodeStatusPregnant
and put back into the queue. When it's chosen again, AlpsDecompTreeNode::branch()
is called to create the children with the call
https://github.com/coin-or/Dip/blob/b0e1f03ee3cb6656a52ff6b7e86c1f8fbd708cd2/Dip/src/AlpsDecompTreeNode.cpp#L504
So the first thing would probably be to modify AlpsDecompNodeDesc
so that the constructor is a bit more general. At the moment, it's pretty simplistic:
https://github.com/coin-or/Dip/blob/b0e1f03ee3cb6656a52ff6b7e86c1f8fbd708cd2/Dip/src/AlpsDecompNodeDesc.h#L104-L118
After that, I guess you would need to look at where the subproblem is actually created and installed from the description and make sure that whatever information is in the description is correctly applied. That is the bulk of the work I guess. Hopefully, that's enough to get you started. Let me know if anything is unclear.
In the default implementation DIP branches on variable bounds.
In general one may like to support GUB/SOS1 branching? For derived branching decisions one may want to add problem specific branch constraints.
Not sure how to start this. Adding a
DecompConstraintSet
or aDecompCut
/DecompCutOsi
toAlpsDecompTreeNode
and then roll them on/off inhttps://github.com/coin-or/Dip/blob/b0e1f03ee3cb6656a52ff6b7e86c1f8fbd708cd2/Dip/src/AlpsDecompTreeNode.cpp#L104