Also: - support networkx 3.1 (sagemath#35584) - support linbox 1.7.0 (sagemath#35612) - support maxima 5.46.0 (sagemath#35619) - support sympy 1.12 (sagemath#35635)
92 lines
3.6 KiB
Diff
92 lines
3.6 KiB
Diff
diff --git a/src/sage/graphs/graph.py b/src/sage/graphs/graph.py
|
|
index c2e42bcbd38..0d13f071dc4 100644
|
|
--- a/src/sage/graphs/graph.py
|
|
+++ b/src/sage/graphs/graph.py
|
|
@@ -6786,13 +6786,26 @@ def cliques_number_of(self, vertices=None, cliques=None):
|
|
{(0, 0): 2, (0, 1): 3, (0, 2): 2, (1, 0): 2, (1, 1): 3, (1, 2): 2}
|
|
sage: F.cliques_number_of(vertices=[(0, 1), (1, 2)])
|
|
{(0, 1): 3, (1, 2): 2}
|
|
+ sage: F.cliques_number_of(vertices=(0, 1))
|
|
+ 3
|
|
sage: G = Graph({0:[1,2,3], 1:[2], 3:[0,1]})
|
|
sage: G.show(figsize=[2,2])
|
|
sage: G.cliques_number_of()
|
|
{0: 2, 1: 2, 2: 1, 3: 1}
|
|
"""
|
|
- import networkx
|
|
- return networkx.number_of_cliques(self.networkx_graph(), vertices, cliques)
|
|
+ if cliques is None:
|
|
+ cliques = self.cliques_maximal()
|
|
+
|
|
+ if vertices in self: # single vertex
|
|
+ return sum(1 for c in cliques if vertices in c)
|
|
+
|
|
+ from collections import Counter
|
|
+ count = Counter()
|
|
+
|
|
+ for c in cliques:
|
|
+ count.update(c)
|
|
+
|
|
+ return {v : count[v] for v in vertices or self}
|
|
|
|
@doc_index("Clique-related methods")
|
|
def cliques_get_max_clique_graph(self):
|
|
@@ -7493,17 +7506,32 @@ def cliques_containing_vertex(self, vertices=None, cliques=None):
|
|
|
|
sage: C = Graph('DJ{')
|
|
sage: C.cliques_containing_vertex()
|
|
- {0: [[4, 0]], 1: [[4, 1, 2, 3]], 2: [[4, 1, 2, 3]], 3: [[4, 1, 2, 3]], 4: [[4, 0], [4, 1, 2, 3]]}
|
|
+ {0: [[0, 4]],
|
|
+ 1: [[1, 2, 3, 4]],
|
|
+ 2: [[1, 2, 3, 4]],
|
|
+ 3: [[1, 2, 3, 4]],
|
|
+ 4: [[0, 4], [1, 2, 3, 4]]}
|
|
+ sage: C.cliques_containing_vertex(4)
|
|
+ [[0, 4], [1, 2, 3, 4]]
|
|
+ sage: C.cliques_containing_vertex([0, 1])
|
|
+ {0: [[0, 4]], 1: [[1, 2, 3, 4]]}
|
|
sage: E = C.cliques_maximal()
|
|
sage: E
|
|
[[0, 4], [1, 2, 3, 4]]
|
|
sage: C.cliques_containing_vertex(cliques=E)
|
|
- {0: [[0, 4]], 1: [[1, 2, 3, 4]], 2: [[1, 2, 3, 4]], 3: [[1, 2, 3, 4]], 4: [[0, 4], [1, 2, 3, 4]]}
|
|
+ {0: [[0, 4]],
|
|
+ 1: [[1, 2, 3, 4]],
|
|
+ 2: [[1, 2, 3, 4]],
|
|
+ 3: [[1, 2, 3, 4]],
|
|
+ 4: [[0, 4], [1, 2, 3, 4]]}
|
|
|
|
sage: G = Graph({0:[1,2,3], 1:[2], 3:[0,1]})
|
|
sage: G.show(figsize=[2,2])
|
|
sage: G.cliques_containing_vertex()
|
|
- {0: [[0, 1, 2], [0, 1, 3]], 1: [[0, 1, 2], [0, 1, 3]], 2: [[0, 1, 2]], 3: [[0, 1, 3]]}
|
|
+ {0: [[0, 1, 2], [0, 1, 3]],
|
|
+ 1: [[0, 1, 2], [0, 1, 3]],
|
|
+ 2: [[0, 1, 2]],
|
|
+ 3: [[0, 1, 3]]}
|
|
|
|
Since each clique of a 2 dimensional grid corresponds to an edge, the
|
|
number of cliques in which a vertex is involved equals its degree::
|
|
@@ -7518,8 +7546,20 @@ def cliques_containing_vertex(self, vertices=None, cliques=None):
|
|
sage: sorted(sorted(x for x in L) for L in d[(0, 1)])
|
|
[[(0, 0), (0, 1)], [(0, 1), (0, 2)], [(0, 1), (1, 1)]]
|
|
"""
|
|
- import networkx
|
|
- return networkx.cliques_containing_node(self.networkx_graph(), vertices, cliques)
|
|
+ if cliques is None:
|
|
+ cliques = self.cliques_maximal()
|
|
+
|
|
+ if vertices in self: # single vertex
|
|
+ return [c for c in cliques if vertices in c]
|
|
+
|
|
+ from collections import defaultdict
|
|
+ d = defaultdict(list)
|
|
+
|
|
+ for c in cliques:
|
|
+ for v in c:
|
|
+ d[v].append(c)
|
|
+
|
|
+ return {v : d[v] for v in vertices or self}
|
|
|
|
@doc_index("Clique-related methods")
|
|
def clique_complex(self):
|