Skip to content

Commit a56f0a0

Browse files
authored
refactor(graphs): remove unused coloring workflow (#1308)
1 parent 6c269fe commit a56f0a0

9 files changed

Lines changed: 69 additions & 942 deletions

File tree

src/jacobian/contracts/graph_coloring.py

Lines changed: 0 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@
66

77
from pydantic import Field, StrictInt, StringConstraints, model_validator
88

9-
from jacobian.contracts.common import ArtifactUri, Sha256Digest
109
from jacobian.contracts.results import ContractModel
11-
from jacobian.contracts.sat import CanonicalCnf
1210

1311
GraphVertex = Annotated[
1412
str,
@@ -41,71 +39,6 @@ def require_simple_graph(self) -> Self:
4139
return self
4240

4341

44-
class GraphColoringEncodingRequest(ContractModel):
45-
"""Materialize the exact CNF semantics of k-colorability."""
46-
47-
graph: ChromaticGraph
48-
colors: StrictInt = Field(ge=1, le=32)
49-
50-
51-
class GraphColoringEncodingClaim(ContractModel):
52-
"""Claim that one graph/color-count pair has a canonical encoding."""
53-
54-
claim_schema_version: Literal["1"] = "1"
55-
predicate: Literal["GRAPH_K_COLORABILITY_ENCODING"] = (
56-
"GRAPH_K_COLORABILITY_ENCODING"
57-
)
58-
graph: ChromaticGraph
59-
colors: StrictInt = Field(ge=1, le=32)
60-
61-
62-
class GraphColoringEncodingScope(ContractModel):
63-
"""Graph-owned scope binding the encoding to the SAT CNF artifact."""
64-
65-
scope_schema_version: Literal["1"] = "1"
66-
graph: ChromaticGraph
67-
colors: StrictInt = Field(ge=1, le=32)
68-
cnf_uri: ArtifactUri
69-
cnf_object_digest: Sha256Digest
70-
cnf: CanonicalCnf
71-
72-
73-
class GraphColoringEncodingCandidate(ContractModel):
74-
"""Pointer candidate checked against the graph-owned encoding scope."""
75-
76-
candidate_schema_version: Literal["1"] = "1"
77-
cnf_uri: ArtifactUri
78-
scope_uri: ArtifactUri
79-
80-
81-
class GraphColoringEncodingReplay(ContractModel):
82-
"""Certificate payload for independent graph-to-CNF replay."""
83-
84-
method: Literal["INDEPENDENT_GRAPH_COLORING_CNF_REPLAY"] = (
85-
"INDEPENDENT_GRAPH_COLORING_CNF_REPLAY"
86-
)
87-
claim_uri: ArtifactUri
88-
candidate_uri: ArtifactUri
89-
scope_uri: ArtifactUri
90-
91-
92-
class GraphColoringEncodingOutput(ContractModel):
93-
"""Materialized encoding and its replay certificate."""
94-
95-
graph: ChromaticGraph
96-
colors: StrictInt = Field(ge=1, le=32)
97-
cnf_uri: ArtifactUri
98-
scope_uri: ArtifactUri
99-
claim_uri: ArtifactUri
100-
candidate_uri: ArtifactUri
101-
certificate_uri: ArtifactUri
102-
variable_count: StrictInt = Field(ge=0, le=1_000_000)
103-
clause_count: StrictInt = Field(ge=0, le=1_000_000)
104-
encoding_version: Literal["exactly-one-and-edge-separation/v1"] = (
105-
"exactly-one-and-edge-separation/v1"
106-
)
107-
108-
10942
class ChromaticNumberBudget(ContractModel):
11043
"""Total wall-clock budget for the bounded coloring search."""
11144

src/jacobian/domains/graph_optimization/operations.py

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,53 @@
1010
ChromaticSearchStep,
1111
GraphChromaticNumberOutput,
1212
)
13-
from jacobian.graphs.coloring_semantics import canonical_graph, coloring_cnf
13+
14+
15+
def canonical_graph(graph: ChromaticGraph) -> ChromaticGraph:
16+
"""Normalize vertex and undirected edge order for solver input."""
17+
18+
edges = tuple(
19+
sorted(
20+
(min(edge_left, edge_right), max(edge_left, edge_right))
21+
for edge_left, edge_right in graph.edges
22+
)
23+
)
24+
return ChromaticGraph(vertices=tuple(sorted(graph.vertices)), edges=edges)
25+
26+
27+
def coloring_cnf(
28+
graph: ChromaticGraph,
29+
colors: int,
30+
) -> tuple[tuple[str, ...], tuple[tuple[int, ...], ...]]:
31+
"""Build exactly-one and edge-separation clauses for one graph and k."""
32+
33+
variable_names = tuple(
34+
f"v{vertex:02d}_c{color:02d}"
35+
for vertex in range(len(graph.vertices))
36+
for color in range(colors)
37+
)
38+
39+
def variable(vertex: int, color: int) -> int:
40+
return vertex * colors + color + 1
41+
42+
clauses: list[tuple[int, ...]] = []
43+
for vertex in range(len(graph.vertices)):
44+
clauses.append(tuple(variable(vertex, color) for color in range(colors)))
45+
for color_left in range(colors):
46+
for color_right in range(color_left + 1, colors):
47+
clauses.append(
48+
(-variable(vertex, color_left), -variable(vertex, color_right))
49+
)
50+
vertex_index = {vertex: index for index, vertex in enumerate(graph.vertices)}
51+
for edge_left, edge_right in graph.edges:
52+
for color in range(colors):
53+
clauses.append(
54+
(
55+
-variable(vertex_index[edge_left], color),
56+
-variable(vertex_index[edge_right], color),
57+
)
58+
)
59+
return variable_names, tuple(clauses)
1460

1561

1662
def build_simple_graph(graph: ChromaticGraph) -> Any:

src/jacobian/graphs/__init__.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
1-
"""Graph construction, property, coloring, and composition capabilities."""
1+
"""Graph construction, property, and composition capabilities."""
22

3-
from jacobian.graphs.coloring import (
4-
GraphColoringInstallation,
5-
install_graph_coloring_capabilities,
6-
)
73
from jacobian.graphs.composition import (
84
GraphCompositionInstallation,
95
install_graph_composition_capabilities,
@@ -15,12 +11,10 @@
1511
)
1612

1713
__all__ = [
18-
"GraphColoringInstallation",
1914
"GraphCompositionInstallation",
2015
"GraphInstallation",
2116
"GraphIsomorphismInstallation",
2217
"install_graph_capabilities",
23-
"install_graph_coloring_capabilities",
2418
"install_graph_composition_capabilities",
2519
"install_graph_isomorphism",
2620
]

0 commit comments

Comments
 (0)