|
8 | 8 | target: e.target, |
9 | 9 | source-name: graph-data.nodes.at(e.source).name, |
10 | 10 | target-name: graph-data.nodes.at(e.target).name, |
11 | | - overhead: e.overhead, |
| 11 | + size-fields: e.size_fields, |
| 12 | + size-contract-error: e.size_contract_error, |
12 | 13 | )) |
13 | 14 |
|
14 | 15 | #let _edges-by-source-name = { |
|
552 | 553 | if parts.len() > 0 { [#base (#parts.join(", "))] } else { base } |
553 | 554 | } |
554 | 555 |
|
555 | | -// Format overhead fields as inline text |
556 | | -#let format-overhead(overhead) = { |
557 | | - let parts = overhead.map(o => raw(o.field + " = " + o.formula)) |
558 | | - [_Overhead:_ #parts.join(", ").] |
| 556 | +// Format explicitly classified size fields as inline text. |
| 557 | +#let format-size-contract(fields) = { |
| 558 | + let parts = fields.map(o => { |
| 559 | + if o.contract == "exact" { raw(o.field + " = " + o.formula) } |
| 560 | + else if o.contract == "bound-only" { raw(o.field + " <= " + o.formula) } |
| 561 | + else { raw(o.field + " unavailable: " + o.reason) } |
| 562 | + }) |
| 563 | + [_Size contract:_ #parts.join(", ").] |
559 | 564 | } |
560 | 565 |
|
561 | 566 | // Unified function for reduction rules: theorem + proof + optional example |
|
576 | 581 | else { display-name.at(target) } |
577 | 582 | let src-lbl = label("def:" + source) |
578 | 583 | let tgt-lbl = label("def:" + target) |
579 | | - let overhead = if edge != none and edge.overhead.len() > 0 { edge.overhead } else { none } |
| 584 | + let size-fields = if edge != none and edge.size-fields.len() > 0 { edge.size-fields } else { none } |
580 | 585 | let thm-lbl = label("thm:" + source + "-to-" + target) |
581 | 586 | covered-rules.update(old => old + ((source, target),)) |
582 | 587 |
|
583 | 588 | [ |
584 | 589 | #v(1em) |
585 | 590 | #theorem[ |
586 | 591 | *(*#context { if query(src-lbl).len() > 0 { link(src-lbl)[#src-disp] } else [#src-disp] }* #arrow *#context { if query(tgt-lbl).len() > 0 { link(tgt-lbl)[#tgt-disp] } else [#tgt-disp] }*)* #theorem-body |
587 | | - #if overhead != none { linebreak(); format-overhead(overhead) } |
| 592 | + #if size-fields != none { linebreak(); format-size-contract(size-fields) } |
588 | 593 | ] #thm-lbl] |
589 | 594 |
|
590 | 595 | proof[#proof-body] |
@@ -11426,10 +11431,10 @@ In all graph problems below, $G = (V, E)$ denotes an undirected graph with $|V| |
11426 | 11431 |
|
11427 | 11432 | = Reductions <sec:reductions> |
11428 | 11433 |
|
11429 | | -Each reduction is presented as a *Rule* (with linked problem names and overhead from the graph data), followed by a *Proof* (construction, correctness, variable mapping, solution extraction), and optionally a *Concrete Example* (a small instance with verified solution). Problem names in the rule title link back to their definitions in @sec:problems. |
| 11434 | +Each reduction is presented as a *Rule* (with linked problem names and explicit size contracts from the graph data), followed by a *Proof* (construction, correctness, variable mapping, solution extraction), and optionally a *Concrete Example* (a small instance with verified solution). Problem names in the rule title link back to their definitions in @sec:problems. |
11430 | 11435 |
|
11431 | 11436 | The command blocks assume `route.json` contains the explicitly chosen direct route for |
11432 | | -the displayed rule, extracted from the corresponding `pred path` Pareto-front item. |
| 11437 | +the displayed rule, extracted from the corresponding `pred path` entry. |
11433 | 11438 |
|
11434 | 11439 |
|
11435 | 11440 | #let max2sat_mc = load-example("Maximum2Satisfiability", "MaxCut") |
@@ -12110,7 +12115,7 @@ the displayed rule, extracted from the corresponding `pred path` Pareto-front it |
12110 | 12115 | $ w_(i,p) = 2^p quad (0 <= p < L_i - 1), quad w_(i,L_i-1) = r_i + 1 - 2^(L_i - 1) $ |
12111 | 12116 | so that every bit vector represents an offset in ${0, dots, r_i}$. Then |
12112 | 12117 | $ x_i = ell_i + sum_(p=0)^(L_i-1) w_(i,p) z_(i,p) $ |
12113 | | - and the total number of QUBO variables is $N = sum_i L_i$, exactly the exported overhead `num_vars = num_encoding_bits`. |
| 12118 | + and the total number of QUBO variables is $N = sum_i L_i$, exactly the exported size map `num_vars = num_encoding_bits`. |
12114 | 12119 |
|
12115 | 12120 | Let $G = A^top A$ and $h = A^top bold(t)$. Writing $bold(x) = bold(ell) + B bold(z)$ for the encoding matrix $B in RR^(n times N)$ gives |
12116 | 12121 | $ norm(A bold(x) - bold(t))_2^2 = bold(z)^top (B^top G B) bold(z) + 2 bold(z)^top B^top (G bold(ell) - h) + "const" $ |
@@ -16757,10 +16762,10 @@ See #link("https://github.com/CodingThrust/problem-reductions/blob/main/examples |
16757 | 16762 |
|
16758 | 16763 | == Variant Cast Reductions |
16759 | 16764 |
|
16760 | | -Problems parameterized by graph type, weight type, or clause-width ($k$) admit identity reductions between specialised and general variants. Each cast preserves the problem structure exactly (same number of vertices/variables, same constraints), converting only the type parameter to a more general one. These are registered as self-edges in the reduction graph with identity overhead. |
| 16765 | +Problems parameterized by graph type, weight type, or clause-width ($k$) admit identity reductions between specialised and general variants. Each cast preserves the problem structure exactly (same number of vertices/variables, same constraints), converting only the type parameter to a more general one. These are registered as self-edges in the reduction graph with exact identity size maps. |
16761 | 16766 |
|
16762 | 16767 | #reduction-rule("MaximumIndependentSet", "MaximumIndependentSet")[ |
16763 | | - The graph hierarchy $"KingsSubgraph" subset "UnitDiskGraph" subset "SimpleGraph"$ and weight hierarchy $"One" subset ZZ subset RR$ induce identity-overhead casts between MIS variants. Graph casts discard geometric information (grid coordinates $arrow.r$ Euclidean coordinates $arrow.r$ adjacency list); weight casts embed unit weights into integers ($1 arrow.r 1_ZZ$) or integers into floats ($w arrow.r w_RR$). All edges and weights are preserved verbatim. |
| 16768 | + The graph hierarchy $"KingsSubgraph" subset "UnitDiskGraph" subset "SimpleGraph"$ and weight hierarchy $"One" subset ZZ subset RR$ induce exact identity size maps between MIS variants. Graph casts discard geometric information (grid coordinates $arrow.r$ Euclidean coordinates $arrow.r$ adjacency list); weight casts embed unit weights into integers ($1 arrow.r 1_ZZ$) or integers into floats ($w arrow.r w_RR$). All edges and weights are preserved verbatim. |
16764 | 16769 | ][ |
16765 | 16770 | _Construction._ Given $"MIS"(G, bold(w))$ with graph type $G_"sub"$ and weight type $W_"sub"$, construct $"MIS"(G', bold(w)')$ where $G' = "cast"(G_"sub")$ lifts the graph to its parent type and $bold(w)' = "cast"(bold(w))$ lifts each weight. The `CastToParent` trait defines the concrete maps: |
16766 | 16771 | - _KingsSubgraph $arrow.r$ UnitDiskGraph:_ integer grid positions $(i, j)$ map to float coordinates with radius $r = 1.5$. |
@@ -16849,7 +16854,7 @@ Problems parameterized by graph type, weight type, or clause-width ($k$) admit i |
16849 | 16854 |
|
16850 | 16855 | == Resource Estimation from Examples |
16851 | 16856 |
|
16852 | | -The following table shows concrete variable overhead for example instances, taken directly from the canonical fixture examples. |
| 16857 | +The following table shows concrete target-variable counts for example instances, taken directly from the canonical fixture examples. |
16853 | 16858 |
|
16854 | 16859 | #let example-files = ( |
16855 | 16860 | (source: "MaximumIndependentSet", target: "MinimumVertexCover"), |
@@ -19727,7 +19732,7 @@ The following table shows concrete variable overhead for example instances, take |
19727 | 19732 | "pred reduce pcsf.json --via route.json -o bundle.json", |
19728 | 19733 | "pred solve bundle.json", |
19729 | 19734 | ) |
19730 | | - The canonical PCSF source has $beta = #pcsf_st.source.instance.beta$, $omega = #pcsf_st.source.instance.omega$, and prizes $p = (#pcsf_st_prizes.at(0), #pcsf_st_prizes.at(1), #pcsf_st_prizes.at(2))$. The target SteinerTree has $|V_H| = n + k + 1 = #(pcsf_st_n + pcsf_st_k + 1)$ vertices, $|E_H| = m + n + 2 k = #(pcsf_st_m + pcsf_st_n + 2 * pcsf_st_k)$ edges, and $|T_H| = k + 1 = #(pcsf_st_k + 1)$ terminals, matching the registered overhead formulas. |
| 19735 | + The canonical PCSF source has $beta = #pcsf_st.source.instance.beta$, $omega = #pcsf_st.source.instance.omega$, and prizes $p = (#pcsf_st_prizes.at(0), #pcsf_st_prizes.at(1), #pcsf_st_prizes.at(2))$. The target SteinerTree has $|V_H| = n + k + 1 = #(pcsf_st_n + pcsf_st_k + 1)$ vertices, $|E_H| = m + n + 2 k = #(pcsf_st_m + pcsf_st_n + 2 * pcsf_st_k)$ edges, and $|T_H| = k + 1 = #(pcsf_st_k + 1)$ terminals, matching the registered exact size formulas. |
19731 | 19736 | ], |
19732 | 19737 | )[ |
19733 | 19738 | Bienstock, Goemans, Simchi-Levi, Williamson @BienstockGoemansSimchiLeviWilliamson1993 introduced the prize/penalty framework for prize-collecting network design; Tuncbag and coauthors @TuncbagEtAl2013PCSF @TuncbagEtAl2012RECOMB used the same artificial-root idea to translate PCSF into a rooted prize-collecting Steiner tree on biological networks. The combined construction recorded here adds a per-vertex auxiliary-terminal gadget that compiles the remaining omitted-prize term `beta * p(v)` into ordinary Steiner-tree edge costs, so the target is a plain (unweighted-prize) Steiner Tree instance. |
|
0 commit comments