1# cython: embedsignature=True 2 3 4from cylp.cy cimport CyWolfePivot 5 6cdef class CyWolfePivot(CyClpPrimalColumnPivotBase): 7 8 cdef pivotColumn(self, CppCoinIndexedVector* cppupdates, CppCoinIndexedVector* cppspareRow1, 9 CppCoinIndexedVector* cppspareRow2, CppCoinIndexedVector* cppspareCol1, 10 CppCoinIndexedVector* cppspareCol2): 11 updates = CyCoinIndexedVector() 12 updates.setCppSelf(cppupdates) 13 spareRow1 = CyCoinIndexedVector() 14 spareRow1.setCppSelf(cppspareRow1) 15 spareRow2 = CyCoinIndexedVector() 16 spareRow2.setCppSelf(cppspareRow2) 17 spareCol1 = CyCoinIndexedVector() 18 spareCol1.setCppSelf(cppspareCol1) 19 spareCol2 = CyCoinIndexedVector() 20 spareCol2.setCppSelf(cppspareCol2) 21 22 m = self.cyModel 23 24 # Update the reduced costs, for both the original and the slack variables 25 26 s = self.cyModel 27 28 if updates.nElements: 29 m.updateColumnTranspose(spareRow2, updates) 30 m.transposeTimes(-1, updates, spareCol2, spareCol1) 31 m.reducedCosts[s.nVariables:][updates.indices] -= updates.elements[:updates.nElements] 32 m.reducedCosts[:s.nVariables][spareCol1.indices] -= spareCol1.elements[:spareCol1.nElements] 33 updates.clear() 34 spareCol1.clear() 35 36 # cdef CyClpSimplex.Status s 37 cdef double* reducedCosts = self.getReducedCosts() 38 cdef int dim = self.nCols() + self.nRows() 39 40 cdef double bestDj = self.cyModel.dualTolerance 41 cdef int bestSequence = -1 42 cdef i = -1 43 while i < dim - 1: 44 i += 1 45 if self.model().flagged(i): 46 continue 47 rc = reducedCosts[i] 48 s = self.CppSelf.model().getStatus(i) 49 if s == 1 or s == 5: 50 continue 51 elif s == 2: 52 if rc > bestDj: 53 bestDj = rc 54 bestSequence = i 55 return bestSequence 56 elif s == 3: 57 if rc < -bestDj: 58 bestDj = -rc 59 bestSequence = i 60 return bestSequence 61 return bestSequence 62 63 cdef CyClpPrimalColumnPivot* clone(self, bint copyData): 64 cdef CyClpPrimalColumnPivot* ret = \ 65 <CyClpPrimalColumnPivot*> new CppClpPrimalColumnPivotBase( 66 <cpy_ref.PyObject*>self, 67 <runPivotColumn_t>RunPivotColumn, 68 <runClone_t>RunClone, 69 <runSaveWeights_t>RunSaveWeights) 70 return ret 71 72 cdef void saveWeights(self, CyClpSimplex.CppIClpSimplex * model, int mode): 73 self.CppSelf.setModel(model) 74