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