feat: build objective from factors dict in product or sum mode

This commit is contained in:
Pagwin 2026-06-11 19:28:20 -04:00
parent 43636d330e
commit 98eeb18e3c
No known key found for this signature in database
GPG key ID: 81137023740CA260

View file

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