Skip to content

Commit 23afad9

Browse files
authored
Merge pull request #725 from xgi-org/remove-empty-edges
feat: add empties option to cleanup methods (#570)
2 parents b7a899d + d5d0a43 commit 23afad9

4 files changed

Lines changed: 32 additions & 2 deletions

File tree

tests/core/test_hypergraph.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1000,3 +1000,22 @@ def test_cleanup():
10001000
assert cleanH["name"] == "test"
10011001

10021002
assert cleanH._edge == xgi.dual_dict(cleanH._node)
1003+
1004+
1005+
def test_cleanup_empties():
1006+
"""cleanup should remove empty edges by default and keep them with empties=True."""
1007+
H = xgi.Hypergraph([[1, 2, 3], [3, 4]])
1008+
H._edge[2] = set()
1009+
H._edge_attr[2] = {}
1010+
assert H.num_edges == 3
1011+
assert set(H.edges.empty()) == {2}
1012+
1013+
# default: remove empties
1014+
cleanH = H.cleanup(connected=False, relabel=False, in_place=False)
1015+
assert cleanH.num_edges == 2
1016+
assert set(cleanH.edges.empty()) == set()
1017+
1018+
# empties=True: keep them
1019+
cleanH = H.cleanup(connected=False, empties=True, relabel=False, in_place=False)
1020+
assert cleanH.num_edges == 3
1021+
assert set(cleanH.edges.empty()) == {2}

xgi/core/dihypergraph.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1041,12 +1041,14 @@ def copy(self):
10411041

10421042
return cp
10431043

1044-
def cleanup(self, isolates=False, relabel=True, in_place=True):
1044+
def cleanup(self, isolates=False, empties=False, relabel=True, in_place=True):
10451045
if in_place:
10461046
_DH = self
10471047
else:
10481048
_DH = self.copy()
10491049

1050+
if not empties:
1051+
_DH.remove_edges_from(_DH.edges.empty())
10501052
if not isolates:
10511053
_DH.remove_nodes_from(_DH.nodes.isolates())
10521054
if relabel:

xgi/core/hypergraph.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1469,6 +1469,7 @@ def cleanup(
14691469
self,
14701470
isolates=False,
14711471
singletons=False,
1472+
empties=False,
14721473
multiedges=False,
14731474
connected=True,
14741475
relabel=True,
@@ -1482,6 +1483,8 @@ def cleanup(
14821483
Whether isolated nodes are allowed, by default False.
14831484
singletons : bool, optional
14841485
Whether singleton edges are allowed, by default False.
1486+
empties : bool, optional
1487+
Whether empty edges (edges with no nodes) are allowed, by default False.
14851488
multiedges : bool, optional
14861489
Whether multiedges are allowed, by default False.
14871490
connected : bool, optional
@@ -1504,6 +1507,8 @@ def cleanup(
15041507
_H.merge_duplicate_edges()
15051508
if not singletons:
15061509
_H.remove_edges_from(_H.edges.singletons())
1510+
if not empties:
1511+
_H.remove_edges_from(_H.edges.empty())
15071512
if not isolates:
15081513
_H.remove_nodes_from(_H.nodes.isolates())
15091514
if connected:

xgi/core/simplicialcomplex.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -831,11 +831,15 @@ def copy(self):
831831

832832
return cp
833833

834-
def cleanup(self, isolates=False, connected=True, relabel=True, in_place=True):
834+
def cleanup(
835+
self, isolates=False, empties=False, connected=True, relabel=True, in_place=True
836+
):
835837
if in_place:
836838
_S = self
837839
else:
838840
_S = self.copy()
841+
if not empties:
842+
_S.remove_simplex_ids_from(_S.edges.empty())
839843
if not isolates:
840844
_S.remove_nodes_from(_S.nodes.isolates())
841845
if connected:

0 commit comments

Comments
 (0)