commit c8f9ac70c10489931a8f8aab584498ba776523b3
parent eaa48d4405bb27a3efda400051e8c385ae3d1595
Author: triesap <tyson@radroots.org>
Date: Mon, 21 Sep 2026 13:56:14 +0000
core: represent alternative plans and planner limitations
Diffstat:
2 files changed, 51 insertions(+), 1 deletion(-)
diff --git a/src/hyf_application/match_plan.mojo b/src/hyf_application/match_plan.mojo
@@ -133,3 +133,32 @@ def partial_outcome(
def partial_discloses_deficit() -> Bool:
return True
+
+
+@fieldwise_init
+struct PlannerOffer(Copyable, Movable):
+ var plans: List[MatchPlan]
+ var supported_mode: String
+ var unsupported: List[String]
+ var alternatives_are_simultaneous: Bool
+
+
+def alternative_plans(
+ plans: List[MatchPlan], unsupported: List[String]
+) raises -> PlannerOffer:
+ var copied = List[MatchPlan]()
+ for plan in plans:
+ copied.append(plan.copy())
+ var unsupported_copied = List[String]()
+ for entry in unsupported:
+ unsupported_copied.append(String(entry))
+ return PlannerOffer(
+ plans=copied^,
+ supported_mode="single_supplier_compatible_lots",
+ unsupported=unsupported_copied^,
+ alternatives_are_simultaneous=False,
+ )
+
+
+def unsupported_mode_means_no_supply() -> Bool:
+ return False
diff --git a/tests/test_application.mojo b/tests/test_application.mojo
@@ -515,7 +515,7 @@ from hyf_application.match_plan import (
group_lots_by_supplier,
multi_supplier_is_supported,
)
-from hyf_core.domain.plan import LotCapacity, plan_conservation_violations
+from hyf_core.domain.plan import LotCapacity, MatchPlan, plan_conservation_violations
def test_supplier_grouping_and_bounded_allocation() raises:
@@ -590,3 +590,24 @@ def test_explicit_partial_fulfillment_outcome() raises:
var disallowed = partial_outcome(50, 30, False)
assert_true(not disallowed.permitted)
assert_true(partial_discloses_deficit())
+
+
+from hyf_application.match_plan import (
+ alternative_plans,
+ unsupported_mode_means_no_supply,
+)
+
+
+def test_alternative_plans_and_planner_limitations() raises:
+ var capacities = List[LotCapacity]()
+ capacities.append(LotCapacity(lot_id="lot-1", revision="l1", value=50, scale=0))
+ var plans = List[MatchPlan]()
+ plans.append(allocate_single_line("p1", "line-1", "farm-1", 25, 0, capacities))
+ plans.append(allocate_single_line("p2", "line-1", "farm-1", 30, 0, capacities))
+ var unsupported = List[String]()
+ unsupported.append("multi_supplier")
+ var offer = alternative_plans(plans, unsupported)
+ assert_equal(len(offer.plans), 2)
+ assert_true(not offer.alternatives_are_simultaneous)
+ assert_equal(len(offer.unsupported), 1)
+ assert_true(not unsupported_mode_means_no_supply())