Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for branching constraints #124

Open
spoorendonk opened this issue Apr 29, 2020 · 1 comment
Open

Support for branching constraints #124

spoorendonk opened this issue Apr 29, 2020 · 1 comment

Comments

@spoorendonk
Copy link
Contributor

spoorendonk commented Apr 29, 2020

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 a DecompCut/DecompCutOsi to AlpsDecompTreeNode and then roll them on/off in

int AlpsDecompTreeNode::process(bool isRoot,

@tkralphs
Copy link
Member

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

child = new AlpsDecompNodeDesc(m, newLbs, newUbs);

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:
AlpsDecompNodeDesc(AlpsDecompModel* m,
const double* lb,
const double* ub)
:
AlpsNodeDesc(m),
branchedDir_(0),
basis_(NULL) {
numberCols_ = m->getNumCoreCols();
assert(numberCols_);
lowerBounds_ = new double [numberCols_];
upperBounds_ = new double [numberCols_];
memcpy(lowerBounds_, lb, sizeof(double)*numberCols_);
memcpy(upperBounds_, ub, sizeof(double)*numberCols_);
}

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants