Skip to content

Commit e346156

Browse files
committed
Address final-review findings on #1067
- MinimumDiscretePlanarInverseKinematics: simplify complexity string from "num_links * total_configurations" to "total_configurations" so it matches issue #994's stated O(prod_{j=1}^n m_j) baseline literally (the extra num_links factor was per-config feasibility-check work, not configs). - MinimumCostCirculation: add test_minimum_cost_circulation_issue_example_1030 that constructs issue #1030's verbatim 2-vertex example (arcs 0->1 cap=2 cost=3 and 1->0 cap=1 cost=-5, optimum -2). The existing richer 3-vertex canonical instance is kept as the primary discriminator.
1 parent 8c067b2 commit e346156

2 files changed

Lines changed: 22 additions & 1 deletion

File tree

src/models/misc/minimum_discrete_planar_inverse_kinematics.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ impl Problem for MinimumDiscretePlanarInverseKinematics {
247247
}
248248

249249
crate::declare_variants! {
250-
default MinimumDiscretePlanarInverseKinematics => "num_links * total_configurations",
250+
default MinimumDiscretePlanarInverseKinematics => "total_configurations",
251251
}
252252

253253
#[cfg(feature = "example-db")]

src/unit_tests/models/graph/minimum_cost_circulation.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,27 @@ fn test_minimum_cost_circulation_negative_cycle_beats_zero() {
132132
assert_eq!(problem.evaluate(&[0, 0]), Min(Some(0)));
133133
}
134134

135+
#[test]
136+
fn test_minimum_cost_circulation_issue_example_1030() {
137+
// Verbatim instance from issue #1030: vertices {0,1}, arcs
138+
// 0->1 cap=2 cost= 3
139+
// 1->0 cap=1 cost=-5
140+
// Bottleneck is the back-arc (cap=1), so the optimum sends one unit
141+
// around the cycle: cost = 1*3 + 1*(-5) = -2.
142+
let problem = MinimumCostCirculation::new(
143+
DirectedGraph::new(2, vec![(0, 1), (1, 0)]),
144+
vec![2, 1],
145+
vec![3, -5],
146+
);
147+
let solver = BruteForce::new();
148+
let witness = solver
149+
.find_witness(&problem)
150+
.expect("instance must be feasible");
151+
assert_eq!(witness, vec![1, 1]);
152+
assert_eq!(problem.total_cost(&witness), -2);
153+
assert_eq!(problem.evaluate(&[0, 0]), Min(Some(0)));
154+
}
155+
135156
#[test]
136157
fn test_minimum_cost_circulation_serialization() {
137158
let problem = canonical_instance();

0 commit comments

Comments
 (0)