From 1175575c927325780cd87b8379ec70a6aa9208a2 Mon Sep 17 00:00:00 2001 From: Jeremy Saklad Date: Sat, 16 Oct 2021 13:11:51 -0500 Subject: [PATCH] Remove BoneMarketModel.AddDivisionApproximateExponentiationEquality This function has been obsoleted by the ability to pass partial methods as parameters to helper functions. Use of this function has been replaced with partial methods accordingly. This has allowed some intermediate variables to be removed entirely, allowing for further simplification. --- bonemarketsolver/objects/bone_market_model.py | 16 --------- bonemarketsolver/solve.py | 36 +++++++++++-------- 2 files changed, 22 insertions(+), 30 deletions(-) diff --git a/bonemarketsolver/objects/bone_market_model.py b/bonemarketsolver/objects/bone_market_model.py index 6e24ddc..232bd19 100644 --- a/bonemarketsolver/objects/bone_market_model.py +++ b/bonemarketsolver/objects/bone_market_model.py @@ -22,22 +22,6 @@ Set `upto` to a value that is unlikely to come into play. Each parameter is interpreted as a BoundedLinearExpression, and a layer of indirection is applied such that each Constraint in the returned tuple can accept an enforcement literal.""" return self.AddAllowedAssignments((target, var), ((int(base**exp), base) for base in range(upto + 1))) - def AddDivisionApproximateExponentiationEquality(self, target, num, denom, exp, upto): - """Adds `target == (num // denom)**exp` using a lookup table. - -Set `upto` to a value that is unlikely to come into play. - -`target`, `num`, and `denom` are interpreted as a BoundedLinearExpression, and a layer of indirection is applied such that each Constraint in the returned tuple can accept an enforcement literal.""" - quotient = self.NewIntVar(f'{repr(target)} == ({repr(num)} // {repr(denom)})**{repr(exp)}: quotient') - intermediate_num, num_constraint = self.NewIntermediateIntVar(num, f'{repr(target)} == ({repr(num)} // {repr(denom)})**{repr(exp)}: num', lb = 0) - intermediate_denom, denom_constraint = self.NewIntermediateIntVar(denom, f'{repr(target)} == ({repr(num)} // {repr(denom)})**{repr(exp)}: denom', lb = 1) - intermediate_target, target_constraint = self.NewIntermediateIntVar(target, f'{repr(target)} == ({repr(num)} // {repr(denom)})**{repr(exp)}: target') - - super().AddDivisionEquality(quotient, intermediate_num, intermediate_denom) - super().AddAllowedAssignments((intermediate_target, quotient), ((int(base**exp), base) for base in range(upto + 1))) - - return (num_constraint, denom_constraint, target_constraint) - def AddDivisionEquality(self, target, num, denom): """Adds `target == num // denom` (integer division rounded towards 0). diff --git a/bonemarketsolver/solve.py b/bonemarketsolver/solve.py index 13c7e7a..a76ce26 100644 --- a/bonemarketsolver/solve.py +++ b/bonemarketsolver/solve.py @@ -956,25 +956,33 @@ def Solve(shadowy_level, bone_market_fluctuations = None, zoological_mania = Non menace, ) } - for fascination, criteria in ( - ('BIRD', (cp_model.BoundedLinearExpression(skeleton_in_progress, (180, 189)),)), - ('FISH', (cp_model.BoundedLinearExpression(skeleton_in_progress, (190, 199)),)), - ('INSECT', (cp_model.BoundedLinearExpression(skeleton_in_progress, (210, 219)),)), - ('REPTILE', (cp_model.BoundedLinearExpression(skeleton_in_progress, (160, 169)),)), - ('SKULLS', (skeleton_in_progress >= 100, skulls >= 5)), - ): - compromising_documents = model.NewIntVar(f'{getattr(DiplomatFascination, fascination).name}: compromising documents') - compromising_documents_constraints = model.AddDivisionApproximateExponentiationEquality(compromising_documents, cp_model.LinearExpr.Sum((amalgamy, antiquity, menace)), 3, 2.2, MAXIMUM_ATTRIBUTE) + { model.AddIf(actions[getattr(DiplomatFascination, fascination).value], *criteria, partialmethod(BoneMarketModel.AddDivisionMultiplicationEquality, primary_revenue - 50, value, 50), - secondary_revenue == 50*compromising_documents, - compromising_documents_constraints, # Applies enforcement literal to intermediate calculations + partialmethod(BoneMarketModel.AddMultiplicationEquality, + secondary_revenue, + (50, + partialmethod(BoneMarketModel.AddApproximateExponentiationEquality, + var = partialmethod(BoneMarketModel.AddDivisionEquality, + num = cp_model.LinearExpr.Sum((amalgamy, antiquity, menace)), + denom = 3 + ), + exp = 2.2, + upto = MAXIMUM_ATTRIBUTE + ) + ) + ), difficulty_level == 0, partialmethod(BoneMarketModel.AddDivisionEquality, added_exhaustion, secondary_revenue, 5000), - ) - else: - del fascination, criteria, compromising_documents, compromising_documents_constraints + ) for fascination, criteria in ( + ('BIRD', (cp_model.BoundedLinearExpression(skeleton_in_progress, (180, 189)),)), + ('FISH', (cp_model.BoundedLinearExpression(skeleton_in_progress, (190, 199)),)), + ('INSECT', (cp_model.BoundedLinearExpression(skeleton_in_progress, (210, 219)),)), + ('REPTILE', (cp_model.BoundedLinearExpression(skeleton_in_progress, (160, 169)),)), + ('SKULLS', (skeleton_in_progress >= 100, skulls >= 5)), + ) + } # Maximize profit margin