Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
b229cee
Add plan for #216: HamiltonianCircuit model
GiggleLiu Mar 13, 2026
8ae3ac9
Implement #216: Add HamiltonianCircuit model
GiggleLiu Mar 13, 2026
c3d5a0d
chore: remove plan file after implementation
GiggleLiu Mar 13, 2026
876459f
Merge origin/main into issue-216-hamiltonian-circuit
GiggleLiu Mar 14, 2026
5c740ed
fix: guard against n < 3 in HamiltonianCircuit::evaluate
GiggleLiu Mar 14, 2026
31b5fe0
Merge remote-tracking branch 'origin/main' into issue-216-hamiltonian…
GiggleLiu Mar 14, 2026
b306deb
Merge remote changes from issue-216-hamiltonian-circuit
GiggleLiu Mar 14, 2026
888ff0a
fix: address review findings for HamiltonianCircuit
GiggleLiu Mar 14, 2026
1b05530
Merge branch 'issue-216-hamiltonian-circuit' of github.com:CodingThru…
GiggleLiu Mar 14, 2026
c5b0971
Merge origin/main into issue-216-hamiltonian-circuit
GiggleLiu Mar 14, 2026
26153c7
Merge branch 'issue-216-hamiltonian-circuit' of https://github.com/Co…
GiggleLiu Mar 14, 2026
9e4417e
Add HamiltonianCircuit to prelude and regenerate JSON artifacts
GiggleLiu Mar 14, 2026
ba1e534
Fix formatting and update reduction_graph.json complexity
GiggleLiu Mar 14, 2026
61714d5
Merge branch 'issue-216-hamiltonian-circuit' of https://github.com/Co…
GiggleLiu Mar 14, 2026
7a7f2bf
Merge origin/main, regenerate reduction_graph.json
zazabap Mar 15, 2026
5771f68
Merge origin/main into issue-216-hamiltonian-circuit
isPANN Mar 18, 2026
aa3857b
Regenerate example fixtures after merging main
isPANN Mar 18, 2026
836748d
Remove duplicate bjorklund2014 BibTeX entry
isPANN Mar 18, 2026
2223e21
Merge branch 'main' into issue-216-hamiltonian-circuit
isPANN Mar 18, 2026
e55ad67
Add paper example and extract is_valid_hamiltonian_circuit helper
isPANN Mar 18, 2026
9b4b43e
Merge branch 'main' into issue-216-hamiltonian-circuit
isPANN Mar 18, 2026
d57ca3a
Merge branch 'main' into issue-216-hamiltonian-circuit
isPANN Mar 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions docs/paper/reductions.typ
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
"MinimumVertexCover": [Minimum Vertex Cover],
"MaxCut": [Max-Cut],
"GraphPartitioning": [Graph Partitioning],
"HamiltonianCircuit": [Hamiltonian Circuit],
"BiconnectivityAugmentation": [Biconnectivity Augmentation],
"HamiltonianPath": [Hamiltonian Path],
"UndirectedTwoCommodityIntegralFlow": [Undirected Two-Commodity Integral Flow],
Expand Down Expand Up @@ -595,6 +596,65 @@ Biconnectivity augmentation is a classical network-design problem: add backup li
caption: [Biconnectivity Augmentation on a 6-vertex path with $B = 4$. Existing edges are black; green arcs show the selected augmentation $F'$ (total weight 4); dashed gray arcs are unselected candidates. The resulting graph $G' = (V, E union F')$ is biconnected.],
) <fig:biconnectivity-augmentation>
]
#{
let x = load-model-example("HamiltonianCircuit")
let nv = graph-num-vertices(x.instance)
let ne = graph-num-edges(x.instance)
let edges = x.instance.graph.inner.edges.map(e => (e.at(0), e.at(1)))
let sol = x.optimal.at(0)
let circuit = sol.config
// Build circuit edges from consecutive vertices (including wrap-around)
let circuit-edges = range(circuit.len()).map(i => (circuit.at(i), circuit.at(calc.rem(i + 1, circuit.len()))))
[
#problem-def("HamiltonianCircuit")[
*Instance:* An undirected graph $G = (V, E)$.

*Question:* Does $G$ contain a _Hamiltonian circuit_ --- a closed path that visits every vertex exactly once?
][
The Hamiltonian Circuit problem is one of Karp's original 21 NP-complete problems @karp1972, and is listed as GT37 in Garey & Johnson @garey1979.
It is closely related to the Traveling Salesman Problem: while TSP seeks to minimize the total weight of a Hamiltonian cycle on a weighted complete graph, the Hamiltonian Circuit problem simply asks whether _any_ such cycle exists on a general (unweighted) graph.

A configuration is a permutation $pi$ of the vertices, interpreted as the order in which they are visited.
The circuit is valid when every consecutive pair $(pi(i), pi(i+1 mod n))$ is an edge in $G$.

*Algorithms.*
The classical Held--Karp dynamic programming algorithm @heldkarp1962 solves the problem in $O(n^2 dot 2^n)$ time and $O(n dot 2^n)$ space.
Björklund's randomized "Determinant Sums" algorithm achieves $O^*(1.657^n)$ time for general graphs and $O^*(sqrt(2)^n)$ for bipartite graphs @bjorklund2014.

*Example.* Consider the triangular prism graph $G$ on #nv vertices with #ne edges. The permutation $[#circuit.map(v => str(v)).join(", ")]$ forms a Hamiltonian circuit: each consecutive pair #circuit-edges.map(((u, v)) => $(#u, #v)$).join($,$) is an edge of $G$, and the path returns to the start.

#figure({
let blue = graph-colors.at(0)
let gray = luma(200)
canvas(length: 1cm, {
import draw: *
// Triangular prism: outer triangle + inner triangle
let r-out = 1.8
let r-in = 0.9
let verts = range(3).map(k => {
let angle = 90deg - k * 120deg
(calc.cos(angle) * r-out, calc.sin(angle) * r-out)
}) + range(3).map(k => {
let angle = 90deg - k * 120deg
(calc.cos(angle) * r-in, calc.sin(angle) * r-in)
})
for (u, v) in edges {
let on-circuit = circuit-edges.any(e => (e.at(0) == u and e.at(1) == v) or (e.at(0) == v and e.at(1) == u))
g-edge(verts.at(u), verts.at(v), stroke: if on-circuit { 2pt + blue } else { 1pt + gray })
}
for (k, pos) in verts.enumerate() {
g-node(pos, name: "v" + str(k),
fill: blue,
label: text(fill: white)[$v_#k$])
}
})
},
caption: [Hamiltonian Circuit in the triangular prism graph. Blue edges show the circuit $#circuit.map(v => $v_#v$).join($arrow$) arrow v_#(circuit.at(0))$.],
) <fig:hamiltonian-circuit>
]
]
}


#problem-def("BoundedComponentSpanningForest")[
Given an undirected graph $G = (V, E)$ with vertex weights $w: V -> ZZ_(gt.eq 0)$, a positive integer $K <= |V|$, and a positive bound $B$, determine whether there exists a partition of $V$ into $t$ non-empty sets $V_1, dots, V_t$ with $1 <= t <= K$ such that each induced subgraph $G[V_i]$ is connected and each part satisfies $sum_(v in V_i) w(v) <= B$.
Expand Down
22 changes: 11 additions & 11 deletions docs/paper/references.bib
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,17 @@ @inproceedings{zamir2021
doi = {10.4230/LIPIcs.ICALP.2021.113}
}

@article{bjorklund2014,
author = {Andreas Bj\"{o}rklund},
title = {Determinant Sums for Undirected {H}amiltonicity},
journal = {SIAM Journal on Computing},
volume = {43},
number = {1},
pages = {280--299},
year = {2014},
doi = {10.1137/110839229}
}

@article{bjorklund2009,
author = {Andreas Bj\"{o}rklund and Thore Husfeldt and Mikko Koivisto},
title = {Set Partitioning via Inclusion-Exclusion},
Expand All @@ -322,17 +333,6 @@ @article{bjorklund2009
doi = {10.1137/070683933}
}

@article{bjorklund2014,
author = {Andreas Bj{\"o}rklund},
title = {Determinant Sums for Undirected Hamiltonicity},
journal = {SIAM Journal on Computing},
volume = {43},
number = {1},
pages = {280--299},
year = {2014},
doi = {10.1137/110839229},
}

@article{aspvall1979,
author = {Bengt Aspvall and Michael F. Plass and Robert Endre Tarjan},
title = {A Linear-Time Algorithm for Testing the Truth of Certain Quantified Boolean Formulas},
Expand Down
1 change: 1 addition & 0 deletions problemreductions-cli/src/cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,7 @@ Flags by problem type:
MinimumMultiwayCut --graph, --terminals, --edge-weights
PartitionIntoTriangles --graph
GraphPartitioning --graph
HamiltonianCircuit, HC --graph
BoundedComponentSpanningForest --graph, --weights, --k, --bound
UndirectedTwoCommodityIntegralFlow --graph, --capacities, --source-1, --sink-1, --source-2, --sink-2, --requirement-1, --requirement-2
IsomorphicSpanningTree --graph, --tree
Expand Down
31 changes: 28 additions & 3 deletions problemreductions-cli/src/commands/create.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ use anyhow::{bail, Context, Result};
use problemreductions::export::{ModelExample, ProblemRef, ProblemSide, RuleExample};
use problemreductions::models::algebraic::{ClosestVectorProblem, BMF};
use problemreductions::models::graph::{
GraphPartitioning, HamiltonianPath, LengthBoundedDisjointPaths, MinimumMultiwayCut,
MultipleChoiceBranching, SteinerTree, StrongConnectivityAugmentation,
GraphPartitioning, HamiltonianCircuit, HamiltonianPath, LengthBoundedDisjointPaths,
MinimumMultiwayCut, MultipleChoiceBranching, SteinerTree, StrongConnectivityAugmentation,
};
use problemreductions::models::misc::{
BinPacking, FlowShopScheduling, LongestCommonSubsequence, MinimumTardinessSequencing,
Expand Down Expand Up @@ -299,6 +299,7 @@ fn example_for(canonical: &str, graph_type: Option<&str>) -> &'static str {
"QUBO" => "--matrix \"1,0.5;0.5,2\"",
"SpinGlass" => "--graph 0-1,1-2 --couplings 1,1",
"KColoring" => "--graph 0-1,1-2,2-0 --k 3",
"HamiltonianCircuit" => "--graph 0-1,1-2,2-3,3-0",
"MinimumSumMulticenter" => {
"--graph 0-1,1-2,2-3 --weights 1,1,1,1 --edge-weights 1,1,1 --k 2"
}
Expand Down Expand Up @@ -634,6 +635,19 @@ pub fn create(args: &CreateArgs, out: &OutputConfig) -> Result<()> {
)
}

// Hamiltonian Circuit (graph only, no weights)
"HamiltonianCircuit" => {
let (graph, _) = parse_graph(args).map_err(|e| {
anyhow::anyhow!(
"{e}\n\nUsage: pred create HamiltonianCircuit --graph 0-1,1-2,2-3,3-0"
)
})?;
(
ser(HamiltonianCircuit::new(graph))?,
resolved_variant.clone(),
)
}

// Biconnectivity augmentation
"BiconnectivityAugmentation" => {
let (graph, _) = parse_graph(args).map_err(|e| {
Expand Down Expand Up @@ -3068,6 +3082,17 @@ fn create_random(
(ser(GraphPartitioning::new(graph))?, variant)
}

// Hamiltonian Circuit (graph only, no weights)
"HamiltonianCircuit" => {
let edge_prob = args.edge_prob.unwrap_or(0.5);
if !(0.0..=1.0).contains(&edge_prob) {
bail!("--edge-prob must be between 0.0 and 1.0");
}
let graph = util::create_random_graph(num_vertices, edge_prob, args.seed);
let variant = variant_map(&[("graph", "SimpleGraph")]);
(ser(HamiltonianCircuit::new(graph))?, variant)
}

// HamiltonianPath (graph only, no weights)
"HamiltonianPath" => {
let edge_prob = args.edge_prob.unwrap_or(0.5);
Expand Down Expand Up @@ -3219,7 +3244,7 @@ fn create_random(
"Random generation is not supported for {canonical}. \
Supported: graph-based problems (MIS, MVC, MaxCut, MaxClique, \
MaximumMatching, MinimumDominatingSet, SpinGlass, KColoring, TravelingSalesman, \
SteinerTree, OptimalLinearArrangement, HamiltonianPath)"
HamiltonianCircuit, SteinerTree, OptimalLinearArrangement, HamiltonianPath)"
),
};

Expand Down
1 change: 1 addition & 0 deletions src/example_db/fixtures/examples.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
{"problem":"DirectedTwoCommodityIntegralFlow","variant":{},"instance":{"capacities":[1,1,1,1,1,1,1,1],"graph":{"inner":{"edge_property":"directed","edges":[[0,2,null],[0,3,null],[1,2,null],[1,3,null],[2,4,null],[2,5,null],[3,4,null],[3,5,null]],"node_holes":[],"nodes":[null,null,null,null,null,null]}},"requirement_1":1,"requirement_2":1,"sink_1":4,"sink_2":5,"source_1":0,"source_2":1},"samples":[{"config":[1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1],"metric":true}],"optimal":[{"config":[0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0],"metric":true},{"config":[0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,1],"metric":true},{"config":[0,0,0,1,0,0,1,0,0,1,1,0,0,1,0,1],"metric":true},{"config":[0,0,0,1,0,0,1,0,0,1,1,0,1,0,0,1],"metric":true},{"config":[0,0,0,1,0,0,1,0,1,0,0,0,0,1,0,0],"metric":true},{"config":[0,0,0,1,0,0,1,0,1,0,1,0,1,1,0,0],"metric":true},{"config":[0,0,0,1,0,0,1,0,1,1,0,0,0,1,0,1],"metric":true},{"config":[0,0,0,1,0,0,1,0,1,1,0,0,1,0,0,1],"metric":true},{"config":[0,0,0,1,0,0,1,0,1,1,1,0,1,1,0,1],"metric":true},{"config":[0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,1],"metric":true},{"config":[0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,1],"metric":true},{"config":[0,0,1,0,1,0,0,0,0,1,0,1,0,0,1,1],"metric":true},{"config":[0,0,1,0,1,0,0,0,1,0,0,0,0,1,0,0],"metric":true},{"config":[0,0,1,0,1,0,0,0,1,0,0,1,0,1,0,1],"metric":true},{"config":[0,0,1,0,1,0,0,0,1,0,0,1,0,1,1,0],"metric":true},{"config":[0,0,1,0,1,0,0,0,1,1,0,0,0,1,0,1],"metric":true},{"config":[0,0,1,0,1,0,0,0,1,1,0,0,0,1,1,0],"metric":true},{"config":[0,0,1,0,1,0,0,0,1,1,0,1,0,1,1,1],"metric":true},{"config":[0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,1],"metric":true},{"config":[0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,1],"metric":true},{"config":[0,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0],"metric":true},{"config":[0,0,1,1,1,0,0,1,1,1,0,0,0,1,1,0],"metric":true},{"config":[0,0,1,1,1,0,1,0,0,1,0,0,0,0,0,1],"metric":true},{"config":[0,0,1,1,1,0,1,0,1,0,0,0,0,1,0,0],"metric":true},{"config":[0,0,1,1,1,0,1,0,1,1,0,0,0,1,0,1],"metric":true},{"config":[0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,1],"metric":true},{"config":[0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0],"metric":true},{"config":[0,1,0,0,0,0,1,0,0,0,1,1,0,1,0,1],"metric":true},{"config":[0,1,0,0,0,0,1,0,0,0,1,1,1,0,0,1],"metric":true},{"config":[0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,0],"metric":true},{"config":[0,1,0,0,0,0,1,0,1,0,0,1,0,1,0,1],"metric":true},{"config":[0,1,0,0,0,0,1,0,1,0,0,1,1,0,0,1],"metric":true},{"config":[0,1,0,0,0,0,1,0,1,0,1,0,1,1,0,0],"metric":true},{"config":[0,1,0,0,0,0,1,0,1,0,1,1,1,1,0,1],"metric":true},{"config":[0,1,0,1,0,0,1,1,0,0,1,0,0,1,0,0],"metric":true},{"config":[0,1,0,1,0,0,1,1,1,0,0,0,0,1,0,0],"metric":true},{"config":[0,1,0,1,0,0,1,1,1,0,1,0,1,1,0,0],"metric":true},{"config":[0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1],"metric":true},{"config":[0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1],"metric":true},{"config":[0,1,1,0,1,0,0,1,1,0,0,0,0,1,0,0],"metric":true},{"config":[0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0],"metric":true},{"config":[0,1,1,0,1,0,1,0,0,0,0,1,0,0,0,1],"metric":true},{"config":[0,1,1,0,1,0,1,0,1,0,0,0,0,1,0,0],"metric":true},{"config":[0,1,1,0,1,0,1,0,1,0,0,1,0,1,0,1],"metric":true},{"config":[0,1,1,1,1,0,1,1,1,0,0,0,0,1,0,0],"metric":true},{"config":[1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1],"metric":true},{"config":[1,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0],"metric":true},{"config":[1,0,0,0,1,0,0,0,0,0,1,1,0,1,0,1],"metric":true},{"config":[1,0,0,0,1,0,0,0,0,0,1,1,0,1,1,0],"metric":true},{"config":[1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1],"metric":true},{"config":[1,0,0,0,1,0,0,0,0,1,0,1,0,0,1,1],"metric":true},{"config":[1,0,0,0,1,0,0,0,0,1,1,0,0,1,0,1],"metric":true},{"config":[1,0,0,0,1,0,0,0,0,1,1,0,0,1,1,0],"metric":true},{"config":[1,0,0,0,1,0,0,0,0,1,1,1,0,1,1,1],"metric":true},{"config":[1,0,0,1,0,1,1,0,0,1,0,0,0,0,0,1],"metric":true},{"config":[1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1],"metric":true},{"config":[1,0,0,1,1,0,0,1,0,0,1,0,0,1,0,0],"metric":true},{"config":[1,0,0,1,1,0,0,1,0,1,1,0,0,1,1,0],"metric":true},{"config":[1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0],"metric":true},{"config":[1,0,0,1,1,0,1,0,0,1,0,0,0,0,0,1],"metric":true},{"config":[1,0,0,1,1,0,1,0,0,1,1,0,0,1,0,1],"metric":true},{"config":[1,0,1,0,1,1,0,0,0,0,0,1,0,0,0,1],"metric":true},{"config":[1,0,1,0,1,1,0,0,0,1,0,0,0,0,0,1],"metric":true},{"config":[1,0,1,0,1,1,0,0,0,1,0,1,0,0,1,1],"metric":true},{"config":[1,0,1,1,1,1,1,0,0,1,0,0,0,0,0,1],"metric":true},{"config":[1,1,0,0,0,1,1,0,0,0,0,1,0,0,0,1],"metric":true},{"config":[1,1,0,0,0,1,1,0,0,0,1,1,1,0,0,1],"metric":true},{"config":[1,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0],"metric":true},{"config":[1,1,0,0,1,0,0,1,0,0,1,1,0,1,1,0],"metric":true},{"config":[1,1,0,0,1,0,1,0,0,0,0,1,0,0,0,1],"metric":true},{"config":[1,1,0,0,1,0,1,0,0,0,1,0,0,1,0,0],"metric":true},{"config":[1,1,0,0,1,0,1,0,0,0,1,1,0,1,0,1],"metric":true},{"config":[1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0],"metric":true},{"config":[1,1,1,0,1,1,1,0,0,0,0,1,0,0,0,1],"metric":true}]},
{"problem":"ExactCoverBy3Sets","variant":{},"instance":{"subsets":[[0,1,2],[0,2,4],[3,4,5],[3,5,7],[6,7,8],[1,4,6],[2,5,8]],"universe_size":9},"samples":[{"config":[1,0,1,0,1,0,0],"metric":true}],"optimal":[{"config":[1,0,1,0,1,0,0],"metric":true}]},
{"problem":"Factoring","variant":{},"instance":{"m":2,"n":3,"target":15},"samples":[{"config":[1,1,1,0,1],"metric":{"Valid":0}}],"optimal":[{"config":[1,1,1,0,1],"metric":{"Valid":0}}]},
{"problem":"HamiltonianCircuit","variant":{"graph":"SimpleGraph"},"instance":{"graph":{"inner":{"edge_property":"undirected","edges":[[0,1,null],[1,2,null],[2,0,null],[3,4,null],[4,5,null],[5,3,null],[0,3,null],[1,4,null],[2,5,null]],"node_holes":[],"nodes":[null,null,null,null,null,null]}}},"samples":[{"config":[0,1,2,5,4,3],"metric":true}],"optimal":[{"config":[0,1,2,5,4,3],"metric":true},{"config":[0,1,4,3,5,2],"metric":true},{"config":[0,2,1,4,5,3],"metric":true},{"config":[0,2,5,3,4,1],"metric":true},{"config":[0,3,4,5,2,1],"metric":true},{"config":[0,3,5,4,1,2],"metric":true},{"config":[1,0,2,5,3,4],"metric":true},{"config":[1,0,3,4,5,2],"metric":true},{"config":[1,2,0,3,5,4],"metric":true},{"config":[1,2,5,4,3,0],"metric":true},{"config":[1,4,3,5,2,0],"metric":true},{"config":[1,4,5,3,0,2],"metric":true},{"config":[2,0,1,4,3,5],"metric":true},{"config":[2,0,3,5,4,1],"metric":true},{"config":[2,1,0,3,4,5],"metric":true},{"config":[2,1,4,5,3,0],"metric":true},{"config":[2,5,3,4,1,0],"metric":true},{"config":[2,5,4,3,0,1],"metric":true},{"config":[3,0,1,2,5,4],"metric":true},{"config":[3,0,2,1,4,5],"metric":true},{"config":[3,4,1,0,2,5],"metric":true},{"config":[3,4,5,2,1,0],"metric":true},{"config":[3,5,2,0,1,4],"metric":true},{"config":[3,5,4,1,2,0],"metric":true},{"config":[4,1,0,2,5,3],"metric":true},{"config":[4,1,2,0,3,5],"metric":true},{"config":[4,3,0,1,2,5],"metric":true},{"config":[4,3,5,2,0,1],"metric":true},{"config":[4,5,2,1,0,3],"metric":true},{"config":[4,5,3,0,2,1],"metric":true},{"config":[5,2,0,1,4,3],"metric":true},{"config":[5,2,1,0,3,4],"metric":true},{"config":[5,3,0,2,1,4],"metric":true},{"config":[5,3,4,1,0,2],"metric":true},{"config":[5,4,1,2,0,3],"metric":true},{"config":[5,4,3,0,1,2],"metric":true}]},
{"problem":"HamiltonianPath","variant":{"graph":"SimpleGraph"},"instance":{"graph":{"inner":{"edge_property":"undirected","edges":[[0,1,null],[0,2,null],[1,3,null],[2,3,null],[3,4,null],[3,5,null],[4,2,null],[5,1,null]],"node_holes":[],"nodes":[null,null,null,null,null,null]}}},"samples":[{"config":[0,2,4,3,1,5],"metric":true}],"optimal":[{"config":[0,1,5,3,2,4],"metric":true},{"config":[0,1,5,3,4,2],"metric":true},{"config":[0,2,4,3,1,5],"metric":true},{"config":[0,2,4,3,5,1],"metric":true},{"config":[1,0,2,4,3,5],"metric":true},{"config":[1,5,3,4,2,0],"metric":true},{"config":[2,0,1,5,3,4],"metric":true},{"config":[2,4,3,5,1,0],"metric":true},{"config":[3,4,2,0,1,5],"metric":true},{"config":[3,5,1,0,2,4],"metric":true},{"config":[4,2,0,1,3,5],"metric":true},{"config":[4,2,0,1,5,3],"metric":true},{"config":[4,2,3,5,1,0],"metric":true},{"config":[4,3,2,0,1,5],"metric":true},{"config":[4,3,5,1,0,2],"metric":true},{"config":[5,1,0,2,3,4],"metric":true},{"config":[5,1,0,2,4,3],"metric":true},{"config":[5,1,3,4,2,0],"metric":true},{"config":[5,3,1,0,2,4],"metric":true},{"config":[5,3,4,2,0,1],"metric":true}]},
{"problem":"ILP","variant":{"variable":"i32"},"instance":{"constraints":[{"cmp":"Le","rhs":5.0,"terms":[[0,1.0],[1,1.0]]},{"cmp":"Le","rhs":28.0,"terms":[[0,4.0],[1,7.0]]}],"num_vars":2,"objective":[[0,-5.0],[1,-6.0]],"sense":"Minimize"},"samples":[{"config":[0,4],"metric":{"Valid":-24.0}}],"optimal":[{"config":[3,2],"metric":{"Valid":-27.0}}]},
{"problem":"IsomorphicSpanningTree","variant":{},"instance":{"graph":{"inner":{"edge_property":"undirected","edges":[[0,1,null],[0,2,null],[0,3,null],[1,2,null],[1,3,null],[2,3,null]],"node_holes":[],"nodes":[null,null,null,null]}},"tree":{"inner":{"edge_property":"undirected","edges":[[0,1,null],[0,2,null],[0,3,null]],"node_holes":[],"nodes":[null,null,null,null]}}},"samples":[{"config":[0,1,2,3],"metric":true}],"optimal":[{"config":[0,1,2,3],"metric":true},{"config":[0,1,3,2],"metric":true},{"config":[0,2,1,3],"metric":true},{"config":[0,2,3,1],"metric":true},{"config":[0,3,1,2],"metric":true},{"config":[0,3,2,1],"metric":true},{"config":[1,0,2,3],"metric":true},{"config":[1,0,3,2],"metric":true},{"config":[1,2,0,3],"metric":true},{"config":[1,2,3,0],"metric":true},{"config":[1,3,0,2],"metric":true},{"config":[1,3,2,0],"metric":true},{"config":[2,0,1,3],"metric":true},{"config":[2,0,3,1],"metric":true},{"config":[2,1,0,3],"metric":true},{"config":[2,1,3,0],"metric":true},{"config":[2,3,0,1],"metric":true},{"config":[2,3,1,0],"metric":true},{"config":[3,0,1,2],"metric":true},{"config":[3,0,2,1],"metric":true},{"config":[3,1,0,2],"metric":true},{"config":[3,1,2,0],"metric":true},{"config":[3,2,0,1],"metric":true},{"config":[3,2,1,0],"metric":true}]},
Expand Down
4 changes: 2 additions & 2 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ pub mod prelude {
pub use crate::models::graph::{
BalancedCompleteBipartiteSubgraph, BicliqueCover, BiconnectivityAugmentation,
BoundedComponentSpanningForest, DirectedTwoCommodityIntegralFlow, GraphPartitioning,
HamiltonianPath, IsomorphicSpanningTree, LengthBoundedDisjointPaths, SpinGlass,
SteinerTree, StrongConnectivityAugmentation, SubgraphIsomorphism,
HamiltonianCircuit, HamiltonianPath, IsomorphicSpanningTree, LengthBoundedDisjointPaths,
SpinGlass, SteinerTree, StrongConnectivityAugmentation, SubgraphIsomorphism,
};
pub use crate::models::graph::{
KColoring, MaxCut, MaximalIS, MaximumClique, MaximumIndependentSet, MaximumMatching,
Expand Down
Loading
Loading