Skip to content

Commit

Permalink
Pull request #102: Hotfix/hyp338
Browse files Browse the repository at this point in the history
Merge in HYP/hypernetx from hotfix/hyp338 to master

* commit '11d34b0ee266f8d94af2f665a97ad32ba3a558b4':
  bump: version 2.0.2 → 2.0.3
  updated hotfix in response to comments
  debugged hypergraph.remove method as per hyp-338
  • Loading branch information
brendapraggastis authored and bonicim committed Jul 25, 2023
2 parents 9e5a277 + 11d34b0 commit 97ccb93
Show file tree
Hide file tree
Showing 7 changed files with 55 additions and 16 deletions.
2 changes: 1 addition & 1 deletion .cz.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.commitizen]
name = "cz_conventional_commits"
version = "2.0.2"
version = "2.0.3"
version_files = [
"setup.py",
"docs/source/conf.py",
Expand Down
2 changes: 1 addition & 1 deletion docs/source/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import os


__version__ = "2.0.2"
__version__ = "2.0.3"


# If extensions (or modules to document with autodoc) are in another directory,
Expand Down
2 changes: 1 addition & 1 deletion hypernetx/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,4 @@
from hypernetx.utils import *
from hypernetx.utils.toys import *

__version__ = "2.0.2"
__version__ = "2.0.3"
32 changes: 20 additions & 12 deletions hypernetx/classes/hypergraph.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import warnings
from collections import defaultdict
from collections.abc import Sequence, Iterable
from typing import Optional, Any, TypeVar, Union, Mapping
from typing import Optional, Any, TypeVar, Union, Mapping, Hashable

import networkx as nx
import numpy as np
Expand Down Expand Up @@ -1513,13 +1513,15 @@ def remove(self, keys, level=None, name=None):
Parameters
----------
keys : list | tuple | set
node and/or edge id to restrict to
keys : list | tuple | set | Hashable
node and/or edge id(s) to restrict to
level : None, optional
Enter 0 to remove edges with ids in keys.
Enter 1 to remove nodes with ids in keys.
If None then all objects in nodes and edges with the id will
be removed.
name : str, optional
Name of new hypergraph
Returns
-------
Expand All @@ -1528,25 +1530,30 @@ def remove(self, keys, level=None, name=None):
"""
rdfprop = self.properties.copy()
rdf = self.dataframe.copy()
if not isinstance(keys, (list, tuple, set)):
keys = list(keys)
if isinstance(keys, (list, tuple, set)):
nkeys = keys
elif isinstance(keys, Hashable):
nkeys = list()
nkeys.append(keys)
else:
raise TypeError("`keys` parameter must be list | tuple | set | Hashable")
if level == 0:
kdx = set(keys).intersection(set(self._state_dict["labels"]["edges"]))
kdx = set(nkeys).intersection(set(self._state_dict["labels"]["edges"]))
for k in kdx:
rdfprop = rdfprop.drop((0, k))
rdf = rdf.loc[~rdf[self._edge_col].isin(kdx)]
rdf = rdf.loc[~(rdf[self._edge_col].isin(kdx))]
elif level == 1:
kdx = set(keys).intersection(set(self._state_dict["labels"]["nodes"]))
kdx = set(nkeys).intersection(set(self._state_dict["labels"]["nodes"]))
for k in kdx:
rdfprop = rdfprop.drop((1, k))
rdf = rdf.loc[~rdf[self._node_col].isin(kdx)]
rdf = rdf.loc[~(rdf[self._node_col].isin(kdx))]
else:
rdfprop = rdfprop.reset_index()
kdx = set(keys).intersection(rdfprop.id.unique())
kdx = set(nkeys).intersection(rdfprop.id.unique())
rdfprop = rdfprop.set_index("id")
rdfprop = rdfprop.drop(index=kdx)
rdf = rdf.loc[~rdf[self._edge_col].isin(kdx)]
rdf = rdf.loc[~rdf[self._node_col].isin(kdx)]
rdf = rdf.loc[~(rdf[self._edge_col].isin(kdx))]
rdf = rdf.loc[~(rdf[self._node_col].isin(kdx))]

return Hypergraph(
setsystem=rdf,
Expand All @@ -1556,6 +1563,7 @@ def remove(self, keys, level=None, name=None):
misc_cell_properties_col=self.edges._misc_cell_props_col,
properties=rdfprop,
misc_properties_col=self.edges._misc_props_col,
name=name,
)

def toplexes(self, name=None):
Expand Down
15 changes: 15 additions & 0 deletions hypernetx/classes/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,16 @@ def __init__(self):
self.hypergraph = Hypergraph(self.edgedict, name="TriLoop")


class TriLoop2:
"""Triloop example with redundant node and edge"""

def __init__(self):
A, B, C, D, E = "A", "B", "C", "D", "E"
AB, BC, ACD, ACD2 = "AB", "BC", "ACD", "ACD2"
self.edgedict = {AB: {A, B}, BC: {B, C}, ACD: {A, C, D, E}, ACD2: {A, C, D, E}}
self.hypergraph = Hypergraph(self.edgedict, name="TriLoop2")


class SBSDupes:
def __init__(self):
self.edgedict = OrderedDict(
Expand Down Expand Up @@ -156,6 +166,11 @@ def triloop():
return TriLoop()


@pytest.fixture
def triloop2():
return TriLoop2()


@pytest.fixture
def sbs_hypergraph(sbs):
return Hypergraph(sbs.edgedict, name="sbsh")
Expand Down
16 changes: 16 additions & 0 deletions hypernetx/classes/tests/test_hypergraph.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,22 @@ def test_remove_edges(sbs):
assert H.shape == (6, 4)


def test_remove(triloop2):
H = triloop2.hypergraph
k = "ACD2"
assert H.shape == (5, 4)
newH = H.remove(k)
assert newH.shape == (5, 3)
newH = H.remove("E", level=1)
assert newH.shape == (4, 4)
newH = H.remove("ACD", level=0)
assert newH.shape == (5, 3)
newH = H.remove(["ACD", "E"])
assert newH.shape == (4, 3)
with pytest.raises(TypeError):
H.remove({"ACD": "edge"})


def test_remove_nodes():
a, b, c, d = "a", "b", "c", "d"
hbug = Hypergraph({0: [a, b], 1: [a, c], 2: [a, d]})
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from setuptools import setup

__version__ = "2.0.2"
__version__ = "2.0.3"

setup(version=__version__)

0 comments on commit 97ccb93

Please sign in to comment.