int DippyDecompApp::generateCuts(const double* x, DecompCutList& cutList) { if (!m_pyGenerateCuts) { return 0; } // PyObject *pSolutionList = pyTupleList_FromDoubleArray(x, m_colList); // MO (28/2/2012) - Don't need this anymore as solution is contained within node PyObject* pPackagedNode = pyTupleList_FromNode(getDecompAlgo(), STAT_FEASIBLE); PyObject* pCutList = PyObject_CallMethod(m_pProb, "generateCuts", "O", pPackagedNode); if (pCutList == NULL) { throw UtilException("Error calling method prob.generateCuts()", "generateCuts", "DippyDecompApp"); } // This should never happen, pyGenerateCuts should be set to false in dippy.py if (pCutList == Py_None) // method exists, but is not implemented, return 0 { return 0; } // generateCuts returns constraints, i.e., dictionary of (variable, value) pairs also with name, lb, ub const int len = PyObject_Length(pCutList); // loop through each cut // We can use these to construct a C++ DecompVar objects double lb, ub; PyObject *pLb, *pUb; string name; double value; for (int i = 0; i < len; i++) { PyObject* pRow = PySequence_GetItem(pCutList, i); pLb = PyObject_CallMethod(pRow, "getLb", NULL); if (pLb == NULL) { throw UtilException("Error calling method row.getLb()", "generateCuts", "DippyDecompApp"); } pUb = PyObject_CallMethod(pRow, "getUb", NULL); if (pUb == NULL) { throw UtilException("Error calling method row.getUb()", "generateCuts", "DippyDecompApp"); } lb = (pLb == Py_None) ? -m_infinity : PyFloat_AsDouble(pLb); ub = (pUb == Py_None) ? m_infinity : PyFloat_AsDouble(pUb); int* varInds = NULL; double* varVals = NULL; int numPairs = pyColDict_AsPackedArrays(pRow, m_colIndices, &varInds, &varVals); assert(numPairs == PyObject_Length(pRow)); // arrays are now owned by the Cut object DippyDecompCut* cut = new DippyDecompCut(lb, ub, numPairs, varInds, varVals); cutList.push_back(cut); } return len; }
void DippyAlgoMixin::postProcessNode(DecompAlgo* algo, DecompStatus decompStatus) { if (!m_utilParam->GetSetting("pyPostProcessNode", true)) { return; } PyObject* pOutput = pyTupleList_FromNode(algo, decompStatus); PyObject* pResult = PyObject_CallMethod(m_pProb, "postProcessNode", "O", pOutput); }