Skip to content

Commit 4bb7cfb

Browse files
authored
Make networkx and scipy optional even for nxapi (#30)
1 parent 3057831 commit 4bb7cfb

File tree

12 files changed

+62
-25
lines changed

12 files changed

+62
-25
lines changed

graphblas_algorithms/interface.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import networkx as nx
21
import pytest
32

43
from . import nxapi
@@ -70,6 +69,8 @@ class Dispatcher:
7069

7170
@staticmethod
7271
def convert(graph, weight=None):
72+
import networkx as nx
73+
7374
from .classes import DiGraph, Graph, MultiDiGraph, MultiGraph
7475

7576
if isinstance(graph, nx.MultiDiGraph):
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
1-
import networkx as nx
2-
31
from graphblas_algorithms import algorithms
42
from graphblas_algorithms.classes.digraph import to_graph
53
from graphblas_algorithms.utils import not_implemented_for
64

5+
from ..exception import NetworkXError, NetworkXPointlessConcept, PowerIterationFailedConvergence
6+
77
__all__ = ["eigenvector_centrality"]
88

99

1010
@not_implemented_for("multigraph")
1111
def eigenvector_centrality(G, max_iter=100, tol=1.0e-6, nstart=None, weight=None):
1212
G = to_graph(G, weight=weight, dtype=float)
1313
if len(G) == 0:
14-
raise nx.NetworkXPointlessConcept("cannot compute centrality for the null graph")
14+
raise NetworkXPointlessConcept("cannot compute centrality for the null graph")
1515
x = G.dict_to_vector(nstart, dtype=float, name="nstart")
1616
try:
1717
result = algorithms.eigenvector_centrality(G, max_iter=max_iter, tol=tol, nstart=x)
1818
except algorithms.exceptions.ConvergenceFailure as e:
19-
raise nx.PowerIterationFailedConvergence(*e.args) from e
19+
raise PowerIterationFailedConvergence(*e.args) from e
2020
except algorithms.exceptions.GraphBlasAlgorithmException as e:
21-
raise nx.NetworkXError(*e.args) from e
21+
raise NetworkXError(*e.args) from e
2222
return G.vector_to_nodemap(result)

graphblas_algorithms/nxapi/centrality/katz.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import networkx as nx
2-
31
from graphblas_algorithms import algorithms
42
from graphblas_algorithms.classes.digraph import to_graph
53
from graphblas_algorithms.utils import not_implemented_for
64

5+
from ..exception import NetworkXError, PowerIterationFailedConvergence
6+
77
__all__ = ["katz_centrality"]
88

99

@@ -28,13 +28,13 @@ def katz_centrality(
2828
try:
2929
b = G.dict_to_vector(beta, dtype=float, name="beta")
3030
except (TypeError, ValueError, AttributeError) as e:
31-
raise nx.NetworkXError(*e.args) from e
31+
raise NetworkXError(*e.args) from e
3232
try:
3333
result = algorithms.katz_centrality(
3434
G, alpha=alpha, beta=b, max_iter=max_iter, tol=tol, nstart=x, normalized=normalized
3535
)
3636
except algorithms.exceptions.ConvergenceFailure as e:
37-
raise nx.PowerIterationFailedConvergence(*e.args) from e
37+
raise PowerIterationFailedConvergence(*e.args) from e
3838
except algorithms.exceptions.GraphBlasAlgorithmException as e:
39-
raise nx.NetworkXError(*e.args) from e
39+
raise NetworkXError(*e.args) from e
4040
return G.vector_to_nodemap(result)

graphblas_algorithms/nxapi/dag.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
from networkx import NetworkXError
2-
31
from graphblas_algorithms import algorithms
42
from graphblas_algorithms.classes.digraph import to_graph
53

4+
from .exception import NetworkXError
5+
66
__all__ = ["descendants", "ancestors"]
77

88

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
try:
2+
import networkx as nx
3+
except ImportError:
4+
5+
class NetworkXError(Exception):
6+
pass
7+
8+
class NetworkXPointlessConcept(Exception):
9+
pass
10+
11+
class NodeNotFound(Exception):
12+
pass
13+
14+
class PowerIterationFailedConvergence(Exception):
15+
pass
16+
17+
else:
18+
from networkx import (
19+
NetworkXError,
20+
NetworkXPointlessConcept,
21+
NodeNotFound,
22+
PowerIterationFailedConvergence,
23+
)
24+
try:
25+
import scipy as sp
26+
except ImportError:
27+
28+
class ArpackNoConvergence(Exception):
29+
def __init__(self, msg, eigenvalues, eigenvectors):
30+
super().__init__(msg)
31+
self.eigenvalues = eigenvalues
32+
self.eigenvectors = eigenvectors
33+
34+
else:
35+
from scipy.sparse.linalg import ArpackNoConvergence

graphblas_algorithms/nxapi/link_analysis/hits_alg.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
from scipy.sparse.linalg import ArpackNoConvergence
2-
31
from graphblas_algorithms import algorithms
42
from graphblas_algorithms.classes.digraph import to_graph
53

4+
from ..exception import ArpackNoConvergence
5+
66
__all__ = ["hits"]
77

88

graphblas_algorithms/nxapi/link_analysis/pagerank_alg.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import networkx as nx
2-
31
from graphblas_algorithms import algorithms
42
from graphblas_algorithms.classes.digraph import to_graph
53

4+
from ..exception import PowerIterationFailedConvergence
5+
66
_all = ["pagerank"]
77

88

@@ -41,4 +41,4 @@ def pagerank(
4141
)
4242
return G.vector_to_nodemap(result, fillvalue=0.0)
4343
except algorithms.exceptions.ConvergenceFailure as e:
44-
raise nx.PowerIterationFailedConvergence(*e.args) from e
44+
raise PowerIterationFailedConvergence(*e.args) from e

graphblas_algorithms/nxapi/reciprocity.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
from networkx import NetworkXError
2-
31
from graphblas_algorithms import algorithms
42
from graphblas_algorithms.classes.digraph import to_directed_graph
53
from graphblas_algorithms.utils import not_implemented_for
64

5+
from .exception import NetworkXError
6+
77
__all__ = ["reciprocity", "overall_reciprocity"]
88

99

graphblas_algorithms/nxapi/shortest_paths/generic.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
from networkx import NodeNotFound
2-
31
from graphblas_algorithms import algorithms
42
from graphblas_algorithms.classes.digraph import to_graph
53

4+
from ..exception import NodeNotFound
5+
66
__all__ = ["has_path"]
77

88

graphblas_algorithms/nxapi/smetric.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
from networkx import NetworkXError
2-
31
from graphblas_algorithms import algorithms
42
from graphblas_algorithms.classes.digraph import to_graph
53

4+
from .exception import NetworkXError
5+
66
__all__ = ["s_metric"]
77

88

0 commit comments

Comments
 (0)