diff --git a/CHANGELOG.md b/CHANGELOG.md index 0dadd7965..2692cd430 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Unreleased ### Added +- Added support for OR-constraints - Added getLinearConsIndicator - Added SCIP_LPPARAM, setIntParam, setRealParam, getIntParam, getRealParam, isOptimal, getObjVal, getRedcost for lpi - Added isFeasPositive diff --git a/src/pyscipopt/scip.pxd b/src/pyscipopt/scip.pxd index f53421164..9a939a460 100644 --- a/src/pyscipopt/scip.pxd +++ b/src/pyscipopt/scip.pxd @@ -1648,6 +1648,16 @@ cdef extern from "scip/cons_xor.h": SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode) + + int SCIPgetNVarsOr(SCIP* scip, + SCIP_CONS* cons) + + SCIP_VAR** SCIPgetVarsOr(SCIP* scip, + SCIP_CONS* cons) + + SCIP_VAR* SCIPgetResultOr(SCIP* scip, + SCIP_CONS* cons) + cdef extern from "scip/scip_cons.h": SCIP_RETCODE SCIPprintCons(SCIP* scip, SCIP_CONS* cons, diff --git a/src/pyscipopt/scip.pxi b/src/pyscipopt/scip.pxi index 3b847ef60..59f37754a 100644 --- a/src/pyscipopt/scip.pxi +++ b/src/pyscipopt/scip.pxi @@ -6039,6 +6039,81 @@ cdef class Model: return pyCons + def getNVarsOr(self, Constraint constraint): + """ + Get number of variables in an OR-constraint. + + Parameters + ---------- + constraint : Constraint + Constraint to get the number of variables from. + + Returns + ------- + int + + """ + cdef int nvars + return SCIPgetNVarsOr(self._scip, constraint.scip_cons) + + def getVarsOr(self, Constraint constraint): + """ + Get variables in an OR-constraint. + + Parameters + ---------- + constraint : Constraint + Constraint to get the variables from. + + Returns + ------- + list of Variable + """ + cdef SCIP_VAR** _vars + cdef int nvars + cdef int i + cdef list vars = [] + nvars = SCIPgetNVarsOr(self._scip, constraint.scip_cons) + _vars = malloc(nvars * sizeof(SCIP_VAR*)) + _vars = SCIPgetVarsOr(self._scip, constraint.scip_cons) + for i in range(nvars): + ptr = (_vars[i]) + # check whether the corresponding variable exists already + if ptr in self._modelvars: + vars.append(self._modelvars[ptr]) + else: + # create a new variable + var = Variable.create(_vars[i]) + assert var.ptr() == ptr + self._modelvars[ptr] = var + vars.append(var) + free(_vars) + return vars + + def getResultantOr(self, Constraint constraint): + """ + Get the resultant variable of an OR-constraint. + + Parameters + ---------- + constraint : Constraint + Constraint to get the resultant variable from. + + Returns + ------- + Variable + """ + cdef SCIP_VAR* _resvar + _resvar = SCIPgetResultantOr(self._scip, constraint.scip_cons) + ptr = (_resvar) + # check whether the corresponding variable exists already + if ptr not in self._modelvars: + # create a new variable + var = Variable.create(_resvar) + assert var.ptr() == ptr + self._modelvars[ptr] = var + return self._modelvars[ptr] + def addConsXor(self, vars, rhsvar, name="XORcons", initial=True, separate=True, enforce=True, check=True, propagate=True, local=False, modifiable=False, dynamic=False,