@@ -23,6 +23,7 @@ from sage.structure.sage_object cimport SageObject
23
23
24
24
from .matrix_cmr_sparse cimport Matrix_cmr_chr_sparse, _sage_edge, _sage_graph
25
25
from .matrix_space import MatrixSpace
26
+ from .args cimport MatrixArgs
26
27
27
28
28
29
cdef class DecompositionNode(SageObject):
@@ -40,6 +41,34 @@ cdef class DecompositionNode(SageObject):
40
41
CMR_CALL(CMRmatroiddecFree(cmr, & self ._dec))
41
42
self ._dec = dec
42
43
self ._root = root
44
+ self ._row_keys = None
45
+ self ._column_keys = None
46
+
47
+ cdef _set_row_keys(self , row_keys):
48
+ # """
49
+ # Set the row keys with consistency checking: if the
50
+ # value was previously set, it must remain the same.
51
+ # """
52
+ # if self._row_keys is not None and self._row_keys != row_keys:
53
+ # raise ValueError(f"inconsistent row keys: should be {self._row_keys} "
54
+ # f"but got {row_keys}")
55
+ # if row_keys is not None and self.nrows() != len(row_keys):
56
+ # raise ValueError(f"inconsistent row keys: should be of cardinality {self.nrows()} "
57
+ # f"but got {row_keys}")
58
+ self ._row_keys = row_keys
59
+
60
+ # def _set_column_keys(self, column_keys):
61
+ # """
62
+ # Set the column keys with consistency checking: if the
63
+ # value was previously set, it must remain the same.
64
+ # """
65
+ # if self._column_keys is not None and self._column_keys != column_keys:
66
+ # raise ValueError(f"inconsistent column keys: should be {self._column_keys} "
67
+ # f"but got {column_keys}")
68
+ # if column_keys is not None and self.ncols() != len(column_keys):
69
+ # raise ValueError(f"inconsistent column keys: should be of cardinality {self.ncols()} "
70
+ # f"but got {column_keys}")
71
+ # self._column_keys = column_keys
43
72
44
73
def __dealloc__ (self ):
45
74
self ._set_dec(NULL , None )
@@ -90,24 +119,24 @@ cdef class DecompositionNode(SageObject):
90
119
result._root = self ._root or self
91
120
return result
92
121
93
- # def row_keys(self):
94
- # r"""
95
- # OUTPUT: a tuple or ``None``
96
- # """
97
- # return self._row_keys
122
+ def row_keys (self ):
123
+ r """
124
+ OUTPUT: a tuple or ``None``
125
+ """
126
+ return self ._row_keys
98
127
99
- # def column_keys(self):
100
- # r"""
101
- # OUTPUT: a tuple or ``None``
102
- # """
103
- # return self._column_keys
128
+ def column_keys (self ):
129
+ r """
130
+ OUTPUT: a tuple or ``None``
131
+ """
132
+ return self ._column_keys
104
133
105
- # @cached_method
106
- # def morphism(self):
107
- # r"""
134
+ @cached_method
135
+ def morphism (self ):
136
+ r """
108
137
109
- # """
110
- # return matrix (self.matrix(), row_keys= self.row_keys(), column_keys= self.column_keys())
138
+ """
139
+ return MatrixArgs (self .matrix(), MatrixSpace(ZZ, self .row_keys(), self .column_keys() ))
111
140
112
141
113
142
@cached_method
@@ -284,22 +313,33 @@ cdef class DecompositionNode(SageObject):
284
313
"""
285
314
return CMRmatroiddecNumChildren(self ._dec)
286
315
316
+ # cdef _CMRelement_to_key(self, CMR_ELEMENT element):
317
+ # if not CMRelementIsValid(element):
318
+ # raise ValueError('CMRelement index not valid')
319
+ # if CMRelementIsRow(element):
320
+ # return self.row_keys[CMRelementToRowIndex(element)]
321
+ # else:
322
+ # return self.column_keys[CMRelementToColumnIndex(element)]
323
+
287
324
def _create_child_node (self , index ):
325
+ return create_DecompositionNode(CMRmatroiddecChild(self ._dec, index), root = self ._root or self )
326
+ # row_keys = self.row_keys()
327
+ # column_keys = self.column_keys()
328
+ # cdef CMR_MATROID_DEC *child_dec = CMRmatroiddecChild(self._dec, index)
329
+ # cdef CMR_ELEMENT *parent_rows = CMRmatroiddecRowsParent(child_dec)
330
+ # cdef CMR_ELEMENT *parent_columns = CMRmatroiddecColumnsParent(child_dec)
288
331
289
- return create_DecompositionNode(CMRmatroiddecChild(self ._dec, index),
290
- self ._root or self )
291
- # row_keys = self.row_keys()
292
- # column_keys = self.column_keys()
293
- # if row_keys is not None and column_keys is not None:
294
- # cdef CMR_MATROID_DEC *child = CMRmatroiddecChild(self._dec, index)
295
- # cdef CMR_ELEMENT *parent_rows = CMRmatroiddecRowsParent(child)
296
- # cdef CMR_ELEMENT *parent_columns = CMRmatroiddecColumnsParent(child)
297
- # child_row_keys = tuple(row_keys[parent_rows[.....]])
332
+ # child = create_DecompositionNode(child_dec, root = self._root or self)
298
333
299
- # return create_DecompositionNode(,
300
- # self._root or self,
334
+ # if row_keys is None or column_keys is None:
335
+ # child_row_keys = tuple(self._CMRelement_to_key(parent_rows[i])
336
+ # for i in range(child.nrows()))
337
+ # child_column_keys = tuple(self._CMRelement_to_key(parent_columns[i])
338
+ # for i in range(child.ncols()))
339
+ # child._set_row_keys(child_row_keys)
340
+ # child._set_column_keys(child_column_keys)
301
341
302
- # )
342
+ # return child
303
343
304
344
305
345
@cached_method
@@ -600,6 +640,11 @@ cdef class TwoSumNode(SumNode):
600
640
601
641
cdef class ThreeSumNode(SumNode):
602
642
643
+ @cached_method
644
+ def _children (self ):
645
+ return tuple (self ._create_child_node(index)
646
+ for index in range (self .nchildren()))
647
+
603
648
def is_distributed_ranks (self ):
604
649
r """
605
650
EXAMPLES::
@@ -825,6 +870,7 @@ cdef class SpecialLeafNode(DecompositionNode):
825
870
826
871
827
872
cdef class PivotsNode(DecompositionNode):
873
+
828
874
def npivots (self ):
829
875
return CMRmatroiddecNumPivots(self ._dec)
830
876
@@ -905,8 +951,8 @@ cdef create_DecompositionNode(CMR_MATROID_DEC *dec, root=None, row_keys=None, co
905
951
return None
906
952
cdef DecompositionNode result = < DecompositionNode> _class(dec)()
907
953
result._set_dec(dec, root)
908
- # result._row_keys = row_keys
909
- # result._column_keys = column_keys
954
+ result._set_row_keys( row_keys)
955
+ # result._set_column_keys( column_keys)
910
956
return result
911
957
912
958
0 commit comments