From 57c21571348900fbe297bcba1ae3f6d088df48b5 Mon Sep 17 00:00:00 2001 From: Pagwin Date: Thu, 11 Jun 2026 19:30:52 -0400 Subject: [PATCH] feat: report prints the actually maximized objective Co-Authored-By: Claude Sonnet 4.6 --- solve.py | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/solve.py b/solve.py index 64189bc..e618c0b 100644 --- a/solve.py +++ b/solve.py @@ -1682,6 +1682,8 @@ def solve( capital_spent, fence_deposits, baron_deposits, + obj_factors=obj_factors, + obj_mode=objective_mode, ) return solver, status @@ -1736,6 +1738,8 @@ def _report( capital_spent=None, fence_deposits=None, baron_deposits=None, + obj_factors=None, + obj_mode=None, ): print("status:", solver.StatusName(status)) if status not in (cp_model.OPTIMAL, cp_model.FEASIBLE): @@ -1890,9 +1894,32 @@ def _report( ) fe, fb, fs = solver.Value(finalE), solver.Value(finalB), solver.Value(finalS) + vals = {"E": fe, "B": fb, "S": fs, "C": solver.Value(C[NUM_STEPS + 1])} + if obj_factors is None: + # Legacy fallback: old hardcoded E*B*S display. + obj_str = f"product(scaled) = {fe * fb * fs / 1000}" + elif obj_mode == "sum": + terms = [ + f"{f}{k}" if abs(f) != 1 else (k if f > 0 else f"-{k}") + for k, f in obj_factors.items() + if f + ] + expr = " + ".join(terms).replace("+ -", "- ") + raw = sum(f * vals[k] for k, f in obj_factors.items()) + obj_str = f"objective {expr} = {raw / 10:.1f}" + else: + expr = "*".join( + k if f == 1 else f"{k}^{f}" for k, f in obj_factors.items() if f + ) + raw, n = 1, 0 + for k, f in obj_factors.items(): + raw *= vals[k] ** f + n += f + # Resource values are x10-scaled, so descale by 10^(sum of exponents). + obj_str = f"objective {expr} = {raw / 10**n}" print( f"\nFINAL E={fe / 10:.1f} B={fb / 10:.1f} S={fs / 10:.1f} " - f"product(scaled) = {fe * fb * fs / 1000} sum = {(fe + fb + fs) / 10:.1f}" + f"{obj_str} sum = {(fe + fb + fs) / 10:.1f}" )