diff --git a/solve.py b/solve.py index 2baa9ee..64189bc 100644 --- a/solve.py +++ b/solve.py @@ -1596,26 +1596,23 @@ def solve( # ====================================================================== # OBJECTIVE IS SET HERE # ====================================================================== - def Eprod(v): - return v * v - - def Bprod(v): - return v - - def Sprod(v): - return v * v - - prodEE = m.NewIntVar(0, Eprod(capE), "prodEE") - m.AddMultiplicationEquality(prodEE, [finalE, finalE]) - prodSS = m.NewIntVar(0, Sprod(capS), "prodSS") - m.AddMultiplicationEquality(prodSS, [finalS, finalS]) - prodBB = m.NewIntVar(0, Bprod(capB), "prodBB") - m.AddMultiplicationEquality(prodBB, [finalB]) - prodEB = m.NewIntVar(0, Eprod(capE) * Bprod(capB), "prodEB") - m.AddMultiplicationEquality(prodEB, [prodEE, prodBB]) - obj = m.NewIntVar(0, Eprod(capE) * Bprod(capB) * Sprod(capS), "obj") - m.AddMultiplicationEquality(obj, [prodEB, prodSS]) - m.Maximize(obj) + if objective_mode == "sum": + # Linear: CP-SAT takes weighted sums (negative weights included) + # directly, no auxiliary variables needed. + m.Maximize(sum(f * finals[k] for k, f in obj_factors.items() if f)) + else: + # Product: maximize prod(finals[k] ** obj_factors[k]). Expand the + # exponents into a flat factor list and fold pairwise, carrying a + # running upper bound from the Phase-1 caps. + factor_keys = [k for k, f in obj_factors.items() for _ in range(f)] + obj = finals[factor_keys[0]] + bound = caps[factor_keys[0]] + for k in factor_keys[1:]: + bound *= caps[k] + nxt = m.NewIntVar(0, bound, "") + m.AddMultiplicationEquality(nxt, [obj, finals[k]]) + obj = nxt + m.Maximize(obj) # ---- Phase 2: solve the product to optimality ---- solver = cp_model.CpSolver()