Skip to content

Commit 8e4517e

Browse files
isPANNclaude
andcommitted
use asymptotic overhead formulas, drop constant factors
Overhead expressions describe scaling (O(·)), not exact sizes. Revert constant-factor adjustments and keep only the two genuinely wrong asymptotic formulas: - CircuitSAT → SpinGlass: O(A) → O(A·V) (gate arity scales with variables) - SpinGlass → MaxCut edges: O(m) → O(m+n) (ancilla edges are O(n)) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 161e39d commit 8e4517e

7 files changed

Lines changed: 18 additions & 26 deletions

src/rules/circuit_spinglass.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -414,8 +414,8 @@ where
414414

415415
#[reduction(
416416
overhead = {
417-
num_spins = "4 * num_assignments * num_variables",
418-
num_interactions = "6 * num_assignments * num_variables",
417+
num_spins = "num_assignments * num_variables",
418+
num_interactions = "num_assignments * num_variables",
419419
}
420420
)]
421421
impl ReduceTo<SpinGlass<SimpleGraph, i32>> for CircuitSAT {

src/rules/maximumindependentset_gridgraph.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ impl ReductionResult for ReductionISSimpleOneToGridOne {
3333
#[reduction(
3434
overhead = {
3535
num_vertices = "num_vertices * num_vertices",
36-
num_edges = "num_vertices * num_vertices * num_vertices",
36+
num_edges = "num_vertices * num_vertices",
3737
}
3838
)]
3939
impl ReduceTo<MaximumIndependentSet<KingsSubgraph, One>>

src/rules/maximumindependentset_triangular.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ impl ReductionResult for ReductionISSimpleToTriangular {
3434

3535
#[reduction(
3636
overhead = {
37-
num_vertices = "num_vertices * num_vertices * num_vertices",
38-
num_edges = "num_vertices * num_vertices * num_vertices",
37+
num_vertices = "num_vertices * num_vertices",
38+
num_edges = "num_vertices * num_vertices",
3939
}
4040
)]
4141
impl ReduceTo<MaximumIndependentSet<TriangularSubgraph, i32>>

src/rules/sat_circuitsat.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ impl ReductionResult for ReductionSATToCircuit {
3636

3737
#[reduction(
3838
overhead = {
39-
num_variables = "2 * num_vars + num_clauses + 1",
40-
num_assignments = "num_vars + num_clauses + 2",
39+
num_variables = "num_vars + num_clauses",
40+
num_assignments = "num_vars + num_clauses",
4141
}
4242
)]
4343
impl ReduceTo<CircuitSAT> for Satisfiability {

src/rules/sat_coloring.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -296,8 +296,8 @@ impl ReductionSATToColoring {
296296

297297
#[reduction(
298298
overhead = {
299-
num_vertices = "2 * num_vars + 5 * num_literals + 3",
300-
num_edges = "3 * num_vars + 11 * num_literals + 3",
299+
num_vertices = "num_vars + num_literals",
300+
num_edges = "num_vars + num_literals",
301301
}
302302
)]
303303
impl ReduceTo<KColoring<K3, SimpleGraph>> for Satisfiability {

src/rules/spinglass_maxcut.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ where
132132

133133
#[reduction(
134134
overhead = {
135-
num_vertices = "num_spins + 1",
135+
num_vertices = "num_spins",
136136
num_edges = "num_interactions + num_spins",
137137
}
138138
)]

src/unit_tests/reduction_graph.rs

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -424,34 +424,26 @@ fn test_3sat_to_mis_triangular_overhead() {
424424
assert_eq!(edges[2].get("num_edges").unwrap().eval(&test_size), 36.0);
425425

426426
// Edge 3: MIS{SimpleGraph,One} → MIS{TriangularSubgraph,i32}
427-
// num_vertices = num_vertices^3, num_edges = num_vertices^3
427+
// num_vertices = num_vertices², num_edges = num_vertices²
428428
assert_eq!(
429429
edges[3].get("num_vertices").unwrap().eval(&test_size),
430-
1000.0
431-
);
432-
assert_eq!(
433-
edges[3].get("num_edges").unwrap().eval(&test_size),
434-
1000.0
430+
100.0
435431
);
432+
assert_eq!(edges[3].get("num_edges").unwrap().eval(&test_size), 100.0);
436433

437434
// Compose overheads symbolically along the path.
438435
// The composed overhead maps 3-SAT input variables to final MIS{Triangular} output.
439436
//
440437
// K3SAT → KN_SAT: {num_clauses: C, num_vars: V, num_literals: L} (identity cast)
441438
// KN_SAT → SAT: {num_clauses: C, num_vars: V, num_literals: L} (identity)
442439
// SAT → MIS{SG,One}: {num_vertices: L, num_edges: L²}
443-
// MIS{SG,One→Tri}: {num_vertices: V³, num_edges: V³}
440+
// MIS{SG,One→Tri}: {num_vertices: V², num_edges: V²}
444441
//
445-
// Composed: num_vertices = L³, num_edges = L³
442+
// Composed: num_vertices = L², num_edges = L²
446443
let composed = graph.compose_path_overhead(&path);
447-
// Evaluate composed at input: L=6, so L^3=216
448-
assert_eq!(
449-
composed.get("num_vertices").unwrap().eval(&test_size),
450-
216.0
451-
);
452-
assert_eq!(
453-
composed.get("num_edges").unwrap().eval(&test_size),
454-
216.0
444+
// Evaluate composed at input: L=6, so L²=36
445+
assert_eq!(composed.get("num_vertices").unwrap().eval(&test_size), 36.0);
446+
assert_eq!(composed.get("num_edges").unwrap().eval(&test_size), 36.0
455447
);
456448
}
457449

0 commit comments

Comments
 (0)