Skip to content

Commit 6802d3f

Browse files
hmyuuuclaudezazabapGiggleLiu
authored
Fix #184: Add MinimumMultiwayCut model (#221)
* Add plan for #184: MinimumMultiwayCut model Co-authored-by: Claude <noreply@anthropic.com> * feat: add MinimumMultiwayCut model (#184) Implement the Minimum Multiway Cut problem — find minimum-weight edge set whose removal disconnects all terminal pairs. Edge-based binary variables with BFS feasibility check. Solved via BruteForce. - Model struct with Problem/OptimizationProblem traits - CLI dispatch and alias (mmc) - 10 unit tests + example program - Regenerated schemas and reduction graph Co-authored-by: Claude <noreply@anthropic.com> * fix: CLI support, paper entry, and QA for MinimumMultiwayCut (#184) - Add `pred create MinimumMultiwayCut` with --terminals, --edge-weights, --graph - Add problem-def entry in Typst paper with example figure - Improve `pred solve` error: suggest --solver brute-force when no ILP path - Remove spurious MMC alias (not a well-known abbreviation) - Regenerate reduction graph and schema exports - Delete implementation plan Co-authored-by: Claude <noreply@anthropic.com> * docs: improve MinimumMultiwayCut discoverability and update CLI docs - Document edge weight ordering and config encoding on `new()` docstring - Add MinimumMultiwayCut create example to CLI docs - Update `pred list` output in CLI docs (17 → 25 problem types) - Add CVP and MaxMatching aliases to CLI docs alias table Co-authored-by: Claude <noreply@anthropic.com> * fix: use defensive bounds checking in MinimumMultiwayCut evaluate Use config.get(idx) and edge_weights.get(idx) instead of direct indexing to avoid panics on malformed input, matching the codebase convention used by MaximumIndependentSet, TravelingSalesman, etc. Made-with: Cursor * fix: resolve merge conflicts with main and update ProblemSchemaEntry Add missing fields (display_name, aliases, dimensions) required by updated ProblemSchemaEntry struct, and add opt/default to declare_variants. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * chore: remove per-model example file (not needed) Per reviewer comment: example binaries should be utility/export tools or pedagogical demos, not per-model files. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: address structural review findings - Add MinimumMultiwayCut to trait_consistency tests - Add canonical model example in example_db - Strengthen brute-force test to verify specific optimal config - Strengthen short_config test assertions - Regenerate problem_schemas.json Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: add coverage tests and CLI terminal validation for MinimumMultiwayCut Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: data-driven paper example, CLI tests, dispatch cleanup for MinimumMultiwayCut - Convert paper problem-def to use load-model-example(), deriving all concrete values (vertices, edges, terminals, cut edges, cost) from the canonical example fixture instead of hardcoded literals - Add CLI tests: create with flags, create with --example, reject single terminal - dispatch.rs already uses registry-based dispatch (no manual arms) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: remove duplicate terminals field and parse_terminals from merge The merge with main introduced duplicate `terminals` CLI field (from SteinerTree) and duplicate `parse_terminals` function. Removed the duplicates — both problems now share a single `--terminals` flag and validation function. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: remove duplicate terminals field and Vec<u64> match arm The branch had a duplicate `terminals` field in CreateArgs (lines 354 and 426) and a duplicate `Vec<u64>` match arm in type_format_hint, both caused by merge with main. Removes the earlier duplicates to fix the Code Coverage CI build failure. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: update pred list output in cli.md to match current state The pred list table was stale (25 types/58 reductions). Updated to current output (50 types/59 reductions/69 variant nodes) with full problem catalog including aliases, rules, and complexity columns. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: zazabap <sweynan@icloud.com> Co-authored-by: GiggleLiu <cacate0129@gmail.com>
1 parent 156e184 commit 6802d3f

12 files changed

Lines changed: 653 additions & 33 deletions

File tree

docs/paper/reductions.typ

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@
9696
"BoundedComponentSpanningForest": [Bounded Component Spanning Forest],
9797
"BinPacking": [Bin Packing],
9898
"ClosestVectorProblem": [Closest Vector Problem],
99+
"MinimumMultiwayCut": [Minimum Multiway Cut],
99100
"OptimalLinearArrangement": [Optimal Linear Arrangement],
100101
"RuralPostman": [Rural Postman],
101102
"LongestCommonSubsequence": [Longest Common Subsequence],
@@ -1069,6 +1070,50 @@ is feasible: each set induces a connected subgraph, the component weights are $2
10691070
]
10701071
]
10711072
}
1073+
#{
1074+
let x = load-model-example("MinimumMultiwayCut")
1075+
let nv = graph-num-vertices(x.instance)
1076+
let ne = graph-num-edges(x.instance)
1077+
let edges = x.instance.graph.inner.edges.map(e => (e.at(0), e.at(1)))
1078+
let weights = x.instance.edge_weights
1079+
let terminals = x.instance.terminals
1080+
let sol = x.optimal.at(0)
1081+
let cut-edge-indices = sol.config.enumerate().filter(((i, v)) => v == 1).map(((i, _)) => i)
1082+
let cut-edges = cut-edge-indices.map(i => edges.at(i))
1083+
let cost = sol.metric.Valid
1084+
[
1085+
#problem-def("MinimumMultiwayCut")[
1086+
Given an undirected graph $G=(V,E)$ with edge weights $w: E -> RR_(>0)$ and a set of $k$ terminal vertices $T = {t_1, ..., t_k} subset.eq V$, find a minimum-weight set of edges $C subset.eq E$ such that no two terminals remain in the same connected component of $G' = (V, E backslash C)$.
1087+
][
1088+
The Minimum Multiway Cut problem generalizes the classical minimum $s$-$t$ cut: for $k=2$ it reduces to max-flow and is solvable in polynomial time, but for $k >= 3$ on general graphs it becomes NP-hard @dahlhaus1994. The problem arises in VLSI design, image segmentation, and network design. A $(2 - 2 slash k)$-approximation is achievable in polynomial time by taking the union of the $k - 1$ cheapest isolating cuts @dahlhaus1994. The best known exact algorithm runs in $O^*(1.84^k)$ time (suppressing polynomial factors) via submodular functions on isolating cuts @cao2013.
1089+
1090+
*Example.* Consider a graph with $n = #nv$ vertices, $m = #ne$ edges, and $k = #terminals.len()$ terminals $T = {#terminals.map(t => $#t$).join(", ")}$, with edge weights #edges.zip(weights).map(((e, w)) => $w(#(e.at(0)), #(e.at(1))) = #w$).join(", "). The optimal multiway cut removes edges ${#cut-edges.map(e => $(#(e.at(0)), #(e.at(1)))$).join(", ")}$ with total weight #cut-edge-indices.map(i => $#(weights.at(i))$).join($+$) $= #cost$, placing each terminal in a distinct component.
1091+
1092+
#figure({
1093+
let verts = ((0, 0.8), (1.2, 1.5), (2.4, 0.8), (1.8, -0.2), (0.6, -0.2))
1094+
canvas(length: 1cm, {
1095+
for (idx, (u, v)) in edges.enumerate() {
1096+
let is-cut = cut-edge-indices.contains(idx)
1097+
g-edge(verts.at(u), verts.at(v),
1098+
stroke: if is-cut { (paint: red, thickness: 2pt, dash: "dashed") } else { 1pt + luma(120) })
1099+
let mx = (verts.at(u).at(0) + verts.at(v).at(0)) / 2
1100+
let my = (verts.at(u).at(1) + verts.at(v).at(1)) / 2
1101+
let dy = if idx == 5 { 0.15 } else { 0 }
1102+
draw.content((mx, my + dy), text(7pt, fill: luma(80))[#weights.at(idx)])
1103+
}
1104+
for (k, pos) in verts.enumerate() {
1105+
let is-terminal = terminals.contains(k)
1106+
g-node(pos, name: "v" + str(k),
1107+
fill: if is-terminal { graph-colors.at(0) } else { luma(180) },
1108+
label: text(fill: white)[$#k$])
1109+
}
1110+
})
1111+
},
1112+
caption: [Minimum Multiway Cut with terminals ${#terminals.map(t => $#t$).join(", ")}$ (blue). Dashed red edges form the optimal cut (weight #cost).],
1113+
) <fig:multiway-cut>
1114+
]
1115+
]
1116+
}
10721117
#problem-def("OptimalLinearArrangement")[
10731118
Given an undirected graph $G=(V,E)$ and a non-negative integer $K$, is there a bijection $f: V -> {0, 1, dots, |V|-1}$ such that $sum_({u,v} in E) |f(u) - f(v)| <= K$?
10741119
][

docs/paper/references.bib

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,26 @@ @article{ibarra1975
514514
doi = {10.1145/321906.321909}
515515
}
516516

517+
@article{dahlhaus1994,
518+
author = {Elias Dahlhaus and David S. Johnson and Christos H. Papadimitriou and Paul D. Seymour and Mihalis Yannakakis},
519+
title = {The Complexity of Multiterminal Cuts},
520+
journal = {SIAM Journal on Computing},
521+
volume = {23},
522+
number = {4},
523+
pages = {864--894},
524+
year = {1994},
525+
doi = {10.1137/S0097539292225297}
526+
}
527+
528+
@inproceedings{cao2013,
529+
author = {Yixin Cao and Jianer Chen and Jianxin Wang},
530+
title = {An Improved Fixed-Parameter Algorithm for the Minimum Weight Multiway Cut Problem},
531+
booktitle = {Fundamentals of Computation Theory (FCT 2013)},
532+
pages = {96--107},
533+
year = {2013},
534+
doi = {10.1007/978-3-642-40164-0_11}
535+
}
536+
517537
@article{maier1978,
518538
author = {David Maier},
519539
title = {The Complexity of Some Problems on Subsequences and Supersequences},

docs/src/cli.md

Lines changed: 79 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -111,29 +111,82 @@ Lists all registered problem types with their short aliases.
111111

112112
```bash
113113
$ pred list
114-
Registered problems: 17 types, 48 reductions, 25 variant nodes
115-
116-
Problem Aliases Variants Reduces to
117-
───────────────────── ────────── ──────── ──────────
118-
CircuitSAT 1 1
119-
Factoring 1 2
120-
ILP 1 1
121-
KColoring 2 3
122-
KSatisfiability 3SAT, KSAT 3 7
123-
MaxCut 1 1
124-
MaximumClique 1 1
125-
MaximumIndependentSet MIS 4 10
126-
MaximumMatching 1 2
127-
MaximumSetPacking 2 4
128-
MinimumDominatingSet 1 1
129-
MinimumSetCovering 1 1
130-
MinimumVertexCover MVC 1 4
131-
QUBO 1 1
132-
Satisfiability SAT 1 5
133-
SpinGlass 2 3
134-
TravelingSalesman TSP 1 1
135-
136-
Use `pred show <problem>` to see variants, reductions, and fields.
114+
Registered problems: 50 types, 59 reductions, 69 variant nodes
115+
116+
Problem Aliases Rules Complexity
117+
──────────────────────────────────────────────── ─────────── ───── ──────────────────────────────────────────────────────────────────
118+
BMF * O(2^(cols * rank + rank * rows))
119+
BicliqueCover * O(2^num_vertices)
120+
BiconnectivityAugmentation/SimpleGraph/i32 * O(2^num_potential_edges)
121+
BinPacking/f64 1 O(2^num_items)
122+
BinPacking/i32 * O(2^num_items)
123+
BoundedComponentSpanningForest/SimpleGraph/i32 * O(3^num_vertices)
124+
CircuitSAT * 2 O(2^num_variables)
125+
ClosestVectorProblem/f64 CVP O(2^num_basis_vectors)
126+
ClosestVectorProblem/i32 * O(2^num_basis_vectors)
127+
DirectedTwoCommodityIntegralFlow * D2CIF O((max_capacity + 1)^(2 * num_arcs))
128+
ExactCoverBy3Sets * X3C O(2^universe_size)
129+
Factoring * 2 O(exp((m + n)^0.3333333333333333 * log(m + n)^0.6666666666666666))
130+
FlowShopScheduling * O(factorial(num_jobs))
131+
GraphPartitioning/SimpleGraph * O(2^num_vertices)
132+
HamiltonianPath/SimpleGraph * O(1.657^num_vertices)
133+
ILP/bool * 2 O(2^num_vars)
134+
ILP/i32 O(num_vars^num_vars)
135+
IsomorphicSpanningTree * O(factorial(num_vertices))
136+
KColoring/SimpleGraph/KN * 3 O(2^num_vertices)
137+
KColoring/SimpleGraph/K2 O(num_edges + num_vertices)
138+
KColoring/SimpleGraph/K3 O(1.3289^num_vertices)
139+
KColoring/SimpleGraph/K4 O(1.7159^num_vertices)
140+
KColoring/SimpleGraph/K5 O(2^num_vertices)
141+
KSatisfiability/KN * KSAT 6 O(2^num_variables)
142+
KSatisfiability/K2 O(num_clauses + num_variables)
143+
KSatisfiability/K3 O(1.307^num_variables)
144+
Knapsack * 1 O(2^(0.5 * num_items))
145+
LengthBoundedDisjointPaths/SimpleGraph * O(2^(num_paths_required * num_vertices))
146+
LongestCommonSubsequence * LCS 1 O(2^min_string_length)
147+
MaxCut/SimpleGraph/i32 * 1 O(2^(0.7906666666666666 * num_vertices))
148+
MaximalIS/SimpleGraph/i32 * O(3^(0.3333333333333333 * num_vertices))
149+
MaximumClique/SimpleGraph/i32 * 2 O(1.1996^num_vertices)
150+
MaximumIndependentSet/SimpleGraph/One * MIS 14 O(1.1996^num_vertices)
151+
MaximumIndependentSet/KingsSubgraph/One O(2^sqrt(num_vertices))
152+
MaximumIndependentSet/SimpleGraph/i32 O(1.1996^num_vertices)
153+
MaximumIndependentSet/UnitDiskGraph/One O(2^sqrt(num_vertices))
154+
MaximumIndependentSet/KingsSubgraph/i32 O(2^sqrt(num_vertices))
155+
MaximumIndependentSet/TriangularSubgraph/i32 O(2^sqrt(num_vertices))
156+
MaximumIndependentSet/UnitDiskGraph/i32 O(2^sqrt(num_vertices))
157+
MaximumMatching/SimpleGraph/i32 * MaxMatching 2 O(num_vertices^3)
158+
MaximumSetPacking/One * 6 O(2^num_sets)
159+
MaximumSetPacking/f64 O(2^num_sets)
160+
MaximumSetPacking/i32 O(2^num_sets)
161+
MinimumDominatingSet/SimpleGraph/i32 * 1 O(1.4969^num_vertices)
162+
MinimumFeedbackArcSet/i32 * FAS O(2^num_vertices)
163+
MinimumFeedbackVertexSet/i32 * FVS O(1.9977^num_vertices)
164+
MinimumMultiwayCut/SimpleGraph/i32 * O(num_vertices^3 * 1.84^num_terminals)
165+
MinimumSetCovering/i32 * 1 O(2^num_sets)
166+
MinimumSumMulticenter/SimpleGraph/i32 * pmedian O(2^num_vertices)
167+
MinimumTardinessSequencing * O(2^num_tasks)
168+
MinimumVertexCover/SimpleGraph/i32 * MVC 2 O(1.1996^num_vertices)
169+
MultipleChoiceBranching/i32 * O(2^num_arcs)
170+
OptimalLinearArrangement/SimpleGraph * OLA O(2^num_vertices)
171+
PaintShop * O(2^num_cars)
172+
PartitionIntoTriangles/SimpleGraph * O(2^num_vertices)
173+
QUBO/f64 * 2 O(2^num_vars)
174+
RuralPostman/SimpleGraph/i32 * RPP O(num_vertices^2 * 2^num_vertices)
175+
Satisfiability * SAT 5 O(2^num_variables)
176+
SequencingWithinIntervals * O(2^num_tasks)
177+
SetBasis * O(2^(basis_size * universe_size))
178+
ShortestCommonSupersequence * SCS O(alphabet_size^bound)
179+
SpinGlass/SimpleGraph/f64 3 O(2^num_spins)
180+
SpinGlass/SimpleGraph/i32 * O(2^num_spins)
181+
SteinerTree/SimpleGraph/One O(num_vertices * 3^num_terminals)
182+
SteinerTree/SimpleGraph/i32 * O(num_vertices * 3^num_terminals)
183+
SubgraphIsomorphism * O(num_host_vertices^num_pattern_vertices)
184+
SubsetSum * O(2^(0.5 * num_elements))
185+
TravelingSalesman/SimpleGraph/i32 * TSP 2 O(2^num_vertices)
186+
UndirectedTwoCommodityIntegralFlow * O(5^num_edges)
187+
188+
* = default variant
189+
Use `pred show <problem>` to see reductions and fields.
137190
```
138191
139192
### `pred show` — Inspect a problem
@@ -291,6 +344,7 @@ pred create QUBO --matrix "1,0.5;0.5,2" -o qubo.json
291344
pred create KColoring --k 3 --graph 0-1,1-2,2-0 -o kcol.json
292345
pred create SpinGlass --graph 0-1,1-2 -o sg.json
293346
pred create MaxCut --graph 0-1,1-2,2-0 -o maxcut.json
347+
pred create MinimumMultiwayCut --graph 0-1,1-2,2-3,3-0 --terminals 0,2 --edge-weights 3,1,2,4 -o mmc.json
294348
pred create SteinerTree --graph 0-1,0-3,1-2,1-3,2-3,2-4,3-4 --edge-weights 2,5,2,1,5,6,1 --terminals 0,2,4 -o steiner.json
295349
pred create UndirectedTwoCommodityIntegralFlow --graph 0-2,1-2,2-3 --capacities 1,1,2 --source-1 0 --sink-1 3 --source-2 1 --sink-2 3 --requirement-1 1 --requirement-2 1 -o utcif.json
296350
pred create LengthBoundedDisjointPaths --graph 0-1,1-6,0-2,2-3,3-6,0-4,4-5,5-6 --source 0 --sink 6 --num-paths-required 2 --bound 3 -o lbdp.json
@@ -511,6 +565,8 @@ You can use short aliases instead of full problem names (shown in `pred list`):
511565
| `SAT` | `Satisfiability` |
512566
| `3SAT` / `KSAT` | `KSatisfiability` |
513567
| `TSP` | `TravelingSalesman` |
568+
| `CVP` | `ClosestVectorProblem` |
569+
| `MaxMatching` | `MaximumMatching` |
514570
515571
You can also specify variants with a slash: `MIS/UnitDiskGraph`, `SpinGlass/SimpleGraph`.
516572

problemreductions-cli/src/cli.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ Flags by problem type:
221221
QUBO --matrix
222222
SpinGlass --graph, --couplings, --fields
223223
KColoring --graph, --k
224+
MinimumMultiwayCut --graph, --terminals, --edge-weights
224225
PartitionIntoTriangles --graph
225226
GraphPartitioning --graph
226227
BoundedComponentSpanningForest --graph, --weights, --k, --bound
@@ -419,7 +420,7 @@ pub struct CreateArgs {
419420
/// Processing lengths for SequencingWithinIntervals (comma-separated, e.g., "3,1,1")
420421
#[arg(long)]
421422
pub lengths: Option<String>,
422-
/// Terminal vertices for SteinerTree (comma-separated indices, e.g., "0,2,4")
423+
/// Terminal vertices for SteinerTree or MinimumMultiwayCut (comma-separated indices, e.g., "0,2,4")
423424
#[arg(long)]
424425
pub terminals: Option<String>,
425426
/// Tree edge list for IsomorphicSpanningTree (e.g., 0-1,1-2,2-3)

problemreductions-cli/src/commands/create.rs

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ use anyhow::{bail, Context, Result};
99
use problemreductions::export::{ModelExample, ProblemRef, ProblemSide, RuleExample};
1010
use problemreductions::models::algebraic::{ClosestVectorProblem, BMF};
1111
use problemreductions::models::graph::{
12-
GraphPartitioning, HamiltonianPath, LengthBoundedDisjointPaths, MultipleChoiceBranching,
13-
SteinerTree,
12+
GraphPartitioning, HamiltonianPath, LengthBoundedDisjointPaths, MinimumMultiwayCut,
13+
MultipleChoiceBranching, SteinerTree,
1414
};
1515
use problemreductions::models::misc::{
1616
BinPacking, FlowShopScheduling, LongestCommonSubsequence, MinimumTardinessSequencing,
@@ -223,6 +223,7 @@ fn type_format_hint(type_name: &str, graph_type: Option<&str>) -> &'static str {
223223
},
224224
"Vec<u64>" => "comma-separated integers: 1,1,2",
225225
"Vec<W>" => "comma-separated: 1,2,3",
226+
"Vec<usize>" => "comma-separated indices: 0,2,4",
226227
"Vec<(usize, usize, W)>" | "Vec<(usize,usize,W)>" => {
227228
"comma-separated weighted edges: 0-2:3,1-3:5"
228229
}
@@ -279,6 +280,7 @@ fn example_for(canonical: &str, graph_type: Option<&str>) -> &'static str {
279280
}
280281
"PartitionIntoTriangles" => "--graph 0-1,1-2,0-2",
281282
"Factoring" => "--target 15 --m 4 --n 4",
283+
"MinimumMultiwayCut" => "--graph 0-1,1-2,2-3 --terminals 0,2 --edge-weights 1,1,1",
282284
"SequencingWithinIntervals" => "--release-times 0,0,5 --deadlines 11,11,6 --lengths 3,1,1",
283285
"SteinerTree" => "--graph 0-1,1-2,1-3,3-4 --edge-weights 2,2,1,1 --terminals 0,2,4",
284286
"OptimalLinearArrangement" => "--graph 0-1,1-2,2-3 --bound 5",
@@ -1181,6 +1183,21 @@ pub fn create(args: &CreateArgs, out: &OutputConfig) -> Result<()> {
11811183
)
11821184
}
11831185

1186+
// MinimumMultiwayCut
1187+
"MinimumMultiwayCut" => {
1188+
let (graph, _) = parse_graph(args).map_err(|e| {
1189+
anyhow::anyhow!(
1190+
"{e}\n\nUsage: pred create MinimumMultiwayCut --graph 0-1,1-2,2-3 --terminals 0,2 [--edge-weights 1,1,1]"
1191+
)
1192+
})?;
1193+
let terminals = parse_terminals(args, graph.num_vertices())?;
1194+
let edge_weights = parse_edge_weights(args, graph.num_edges())?;
1195+
(
1196+
ser(MinimumMultiwayCut::new(graph, terminals, edge_weights))?,
1197+
resolved_variant.clone(),
1198+
)
1199+
}
1200+
11841201
// MinimumTardinessSequencing
11851202
"MinimumTardinessSequencing" => {
11861203
let deadlines_str = args.deadlines.as_deref().ok_or_else(|| {
@@ -1794,7 +1811,7 @@ fn parse_terminals(args: &CreateArgs, num_vertices: usize) -> Result<Vec<usize>>
17941811
let s = args
17951812
.terminals
17961813
.as_deref()
1797-
.ok_or_else(|| anyhow::anyhow!("SteinerTree requires --terminals (e.g., \"0,2,4\")"))?;
1814+
.ok_or_else(|| anyhow::anyhow!("--terminals required (e.g., \"0,2,4\")"))?;
17981815
let terminals: Vec<usize> = s
17991816
.split(',')
18001817
.map(|t| t.trim().parse::<usize>())
@@ -2514,8 +2531,8 @@ fn create_random(
25142531

25152532
#[cfg(test)]
25162533
mod tests {
2517-
use super::*;
25182534
use super::problem_help_flag_name;
2535+
use super::*;
25192536

25202537
#[test]
25212538
fn test_problem_help_uses_bound_for_length_bounded_disjoint_paths() {
@@ -2538,7 +2555,6 @@ mod tests {
25382555
);
25392556
}
25402557

2541-
25422558
fn empty_args() -> CreateArgs {
25432559
CreateArgs {
25442560
problem: Some("BiconnectivityAugmentation".to_string()),

0 commit comments

Comments
 (0)