1# cython: embedsignature=True
2
3import numpy as np
4cimport numpy as np
5
6
7cdef class CyCoinPackedMatrix:
8    '''
9    ``CyCoinPackedMatrix`` interfaces ``CoinPackedMatrix``
10
11    **Usage Example**
12
13    >>> import numpy as np
14    >>> from cylp.cy import CyCoinPackedMatrix
15    >>> rows = np.array([1, 3, 4], np.int32)
16    >>> cols = np.array([0, 2, 1], np.int32)
17    >>> elements = np.array([1.5, -1, 2])
18    >>> # colOrdered is True if we store the matrix by column (csc)
19    >>> m = CyCoinPackedMatrix(colOrdered=True, rowIndices=rows,
20    ...                           colIndices=cols, elements=elements)
21    >>> m.majorDim
22    3
23    >>> m.minorDim
24    5
25    '''
26    def __cinit__(self, colOrdered=True,
27                        np.ndarray[np.int32_t, ndim=1] rowIndices=None,
28                        np.ndarray[np.int32_t, ndim=1] colIndices=None,
29                        np.ndarray[np.double_t, ndim=1] elements=None):
30        if rowIndices is None:
31            self.CppSelf = new_CppCoinPackedMatrix()
32        else:
33            self.CppSelf = new CppCoinPackedMatrix(colOrdered,
34                                    <int*>rowIndices.data,
35                                    <int*> colIndices.data,
36                                    <double*> elements.data,
37                                    len(rowIndices))
38
39    property indices:
40        def __get__(self):
41            return <object>self.CppSelf.np_getIndices()
42
43    property elements:
44        def __get__(self):
45            return <object>self.CppSelf.np_getElements()
46
47    property vectorStarts:
48        def __get__(self):
49            return <object>self.CppSelf.np_getVectorStarts()
50
51    #cpdef reserve(self, n):
52    #   self.CppSelf.reserve(n)
53
54    property nElements:
55        def __get__(self):
56            return self.CppSelf.getNumElements()
57
58    property majorDim:
59        def __get__(self):
60            return self.CppSelf.getMajorDim()
61
62    property minorDim:
63        def __get__(self):
64            return self.CppSelf.getMinorDim()
65
66    property isColOrdered:
67        def __get__(self):
68            return self.CppSelf.isColOrdered()
69
70    def reserve(self,  newMaxMajorDim,  newMaxSize,  create=0):
71        self.CppSelf.reserve(newMaxMajorDim, newMaxSize, create)
72
73    def appendRow(self, np.ndarray[np.int32_t, ndim=1] vecInd=None,
74                  np.ndarray[np.double_t, ndim=1] elements=None):
75
76        cdef int* i
77        cdef double* d
78        if vecInd:
79            self.CppSelf.appendRow(len(elements), <int*>vecInd.data,
80                                            <double*>elements.data)
81        else:
82            self.CppSelf.appendRow(0, i, d)
83
84    def appendCol(self, np.ndarray[np.int32_t, ndim=1] vecInd=None,
85                  np.ndarray[np.double_t, ndim=1] elements=None):
86
87        cdef int* i
88        cdef double* d
89        if vecInd:
90            self.CppSelf.appendCol(len(elements), <int*>vecInd.data,
91                                            <double*>elements.data)
92        else:
93            self.CppSelf.appendCol(0, i, d)
94
95    def dumpMatrix(self, char* s):
96        #if s:
97        self.CppSelf.dumpMatrix(s)
98        #else:
99        #    self.CppSelf.dumpMatrix(s)
100
101    def hasGaps(self):
102        return self.CppSelf.hasGaps()
103
104    def removeGaps(self, removeValue=-1.0):
105        self.CppSelf.removeGaps(removeValue)
106
107    #def __getitem__(self, n):
108    #   return self.CppSelf.getItem(n)
109
110    #def __setitem__(self, key, value):
111    #   self.CppSelf.setItem(key, value)
112