Skip to content

Commit 176962d

Browse files
committed
refactored row/column to parent element mapping
1 parent 03fcdd3 commit 176962d

File tree

2 files changed

+30
-35
lines changed

2 files changed

+30
-35
lines changed

src/sage/libs/cmr/cmr.pxd

+5-5
Original file line numberDiff line numberDiff line change
@@ -237,9 +237,9 @@ cdef extern from "cmr/matroid.h":
237237
int8_t CMRmatroiddecCographicness(CMR_MATROID_DEC* dec)
238238
int8_t CMRmatroiddecRegularity(CMR_MATROID_DEC* dec)
239239
size_t CMRmatroiddecNumRows(CMR_MATROID_DEC* dec)
240-
CMR_ELEMENT* CMRmatroiddecRowsParent(CMR_MATROID_DEC* dec)
241240
size_t CMRmatroiddecNumColumns(CMR_MATROID_DEC* dec)
242-
CMR_ELEMENT* CMRmatroiddecColumnsParent(CMR_MATROID_DEC* dec)
241+
CMR_ELEMENT* CMRmatroiddecChildRowsToParent(CMR_MATROID_DEC* dec, size_t childIndex)
242+
CMR_ELEMENT* CMRmatroiddecChildColumnsToParent(CMR_MATROID_DEC* dec, size_t childIndex)
243243
CMR_GRAPH* CMRmatroiddecGraph(CMR_MATROID_DEC* dec)
244244
CMR_GRAPH_EDGE* CMRmatroiddecGraphForest(CMR_MATROID_DEC* dec)
245245
size_t CMRmatroiddecGraphSizeForest(CMR_MATROID_DEC* dec)
@@ -255,9 +255,9 @@ cdef extern from "cmr/matroid.h":
255255
size_t CMRmatroiddecNumPivots(CMR_MATROID_DEC* dec)
256256
size_t* CMRmatroiddecPivotRows(CMR_MATROID_DEC* dec)
257257
size_t* CMRmatroiddecPivotColumns(CMR_MATROID_DEC* dec)
258-
# CMR_ERROR CMRmatroiddecPrint(CMR* cmr, CMR_MATROID_DEC* dec, FILE* stream, size_t indent, bool printChildren, bool printParentElements, bool printMatrices, bool printGraphs, bool printReductions, bool printPivots)
259-
CMR_ERROR CMRmatroiddecFree(CMR* cmr, CMR_MATROID_DEC** pdec)
260-
CMR_ERROR CMRmatroiddecFreeNode(CMR* cmr, CMR_MATROID_DEC** pdec)
258+
# CMR_ERROR CMRmatroiddecPrint(CMR* cmr, CMR_MATROID_DEC* dec, FILE* stream, bool printChildren, bool printParentElements, bool printMatrices, bool printGraphs, bool printReductions, bool printPivots)
259+
CMR_ERROR CMRmatroiddecCapture(CMR* cmr, CMR_MATROID_DEC* dec)
260+
CMR_ERROR CMRmatroiddecRelease(CMR* cmr, CMR_MATROID_DEC** pdec)
261261

262262
cdef extern from "cmr/separation.h":
263263

src/sage/matrix/seymour_decomposition.pyx

+25-30
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ cdef class DecompositionNode(SageObject):
3939
if self._root is None or self._root is self:
4040
if self._dec != NULL:
4141
# We own it, so we have to free it.
42-
CMR_CALL(CMRmatroiddecFree(cmr, &self._dec))
42+
CMR_CALL(CMRmatroiddecRelease(cmr, &self._dec))
4343
self._dec = dec
4444
self._root = root
4545

@@ -193,26 +193,7 @@ cdef class DecompositionNode(SageObject):
193193
sage: C.parent_rows_and_columns()
194194
((r1, i, r3, r4, r5, r6, r7, r8, r9), (a, b, c, d, e, f, g, h, r2, j, k, l))
195195
"""
196-
cdef CMR_ELEMENT *parent_rows = CMRmatroiddecRowsParent(self._dec)
197-
cdef CMR_ELEMENT *parent_columns = CMRmatroiddecColumnsParent(self._dec)
198-
if parent_rows == NULL or all(parent_rows[i] == 0 for i in range(self.nrows())):
199-
parent_rows_tuple = None
200-
else:
201-
if self.row_keys() is not None:
202-
parent_rows_tuple = tuple(self.row_keys())
203-
else:
204-
parent_rows_tuple = tuple(CMRelementToRowIndex(parent_rows[i])
205-
for i in range(self.nrows()))
206-
if parent_columns == NULL or all(parent_columns[i] == 0 for i in range(self.ncols())):
207-
parent_columns_tuple = None
208-
else:
209-
if self.column_keys() is not None:
210-
parent_columns_tuple = tuple(self.column_keys())
211-
else:
212-
parent_columns_tuple = tuple(CMRelementToColumnIndex(parent_columns[i])
213-
for i in range(self.ncols()))
214-
215-
return parent_rows_tuple, parent_columns_tuple
196+
return self.row_keys(), self.column_keys()
216197

217198
def as_ordered_tree(self):
218199
r"""
@@ -283,19 +264,33 @@ cdef class DecompositionNode(SageObject):
283264
row_keys = self.row_keys()
284265
column_keys = self.column_keys()
285266
cdef CMR_MATROID_DEC *child_dec = CMRmatroiddecChild(self._dec, index)
286-
cdef CMR_ELEMENT *parent_rows = CMRmatroiddecRowsParent(child_dec)
287-
cdef CMR_ELEMENT *parent_columns = CMRmatroiddecColumnsParent(child_dec)
267+
cdef CMR_ELEMENT *parent_rows = CMRmatroiddecChildRowsToParent(self._dec, index)
268+
cdef CMR_ELEMENT *parent_columns = CMRmatroiddecChildColumnsToParent(self._dec, index)
269+
child_nrows = CMRmatroiddecNumRows(child_dec)
270+
child_ncols = CMRmatroiddecNumColumns(child_dec)
288271

289272
if row_keys is not None and column_keys is not None:
290273
child_row_keys = tuple(self._CMRelement_to_key(parent_rows[i])
291-
for i in range(CMRmatroiddecNumRows(child_dec)))
274+
for i in range(child_nrows))
292275
child_column_keys = tuple(self._CMRelement_to_key(parent_columns[i])
293-
for i in range(CMRmatroiddecNumColumns(child_dec)))
276+
for i in range(child_ncols))
294277
child = create_DecompositionNode(child_dec, root=self._root or self,
295278
row_keys=child_row_keys,
296279
column_keys=child_column_keys)
297280
else:
298-
child = create_DecompositionNode(child_dec, root=self._root or self)
281+
if parent_rows == NULL or all(parent_rows[i] == 0 for i in range(child_nrows)):
282+
parent_rows_tuple = None
283+
else:
284+
parent_rows_tuple = tuple(CMRelementToRowIndex(parent_rows[i])
285+
for i in range(child_nrows))
286+
if parent_columns == NULL or all(parent_columns[i] == 0 for i in range(child_ncols)):
287+
parent_columns_tuple = None
288+
else:
289+
parent_columns_tuple = tuple(CMRelementToColumnIndex(parent_columns[i])
290+
for i in range(child_ncols))
291+
child = create_DecompositionNode(child_dec, root=self._root or self,
292+
row_keys=parent_rows_tuple,
293+
column_keys=parent_columns_tuple)
299294
return child
300295

301296
@cached_method
@@ -655,13 +650,13 @@ cdef class ThreeSumNode(SumNode):
655650
raise ValueError("ThreeSumNode has exactly two children")
656651

657652
cdef CMR_MATROID_DEC *child1_dec = CMRmatroiddecChild(self._dec, 0)
658-
cdef CMR_ELEMENT *parent_rows1 = CMRmatroiddecRowsParent(child1_dec)
659-
cdef CMR_ELEMENT *parent_columns1 = CMRmatroiddecColumnsParent(child1_dec)
653+
cdef CMR_ELEMENT *parent_rows1 = CMRmatroiddecChildRowsToParent(self._dec, 0)
654+
cdef CMR_ELEMENT *parent_columns1 = CMRmatroiddecChildColumnsToParent(self._dec, 0)
660655
cdef CMR_CHRMAT *mat1 = CMRmatroiddecGetMatrix(child1_dec)
661656

662657
cdef CMR_MATROID_DEC *child2_dec = CMRmatroiddecChild(self._dec, 1)
663-
cdef CMR_ELEMENT *parent_rows2 = CMRmatroiddecRowsParent(child2_dec)
664-
cdef CMR_ELEMENT *parent_columns2 = CMRmatroiddecColumnsParent(child2_dec)
658+
cdef CMR_ELEMENT *parent_rows2 = CMRmatroiddecChildRowsToParent(self._dec, 1)
659+
cdef CMR_ELEMENT *parent_columns2 = CMRmatroiddecChildColumnsToParent(self._dec, 1)
665660
cdef CMR_CHRMAT *mat2 = CMRmatroiddecGetMatrix(child2_dec)
666661

667662
cdef size_t index1, index2

0 commit comments

Comments
 (0)