Remove BoneMarketModel.AddDivisionMultiplicationEquality

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.

In addition, the following code style has been applied: partial methods that
contain a nested partial method have the function arguments broken into
distinct lines. This means that the bottom partial method is formatted in the
same manner as a partial method without any nesting.
This commit is contained in:
Jeremy Saklad 2021-10-16 15:11:12 -05:00
parent 1175575c92
commit 40246c4815
Signed by: Jeremy Saklad
GPG Key ID: 9CA2149583EDBF84
2 changed files with 60 additions and 41 deletions

View File

@ -33,24 +33,6 @@ Each parameter is interpreted as a BoundedLinearExpression, and a layer of indir
super().AddDivisionEquality(intermediate_target, intermediate_num, intermediate_denom)
return (target_constraint, num_constraint, denom_constraint)
def AddDivisionMultiplicationEquality(self, target, num, denom, multiple = None):
"""Adds `target == (num // denom) * multiple`.
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.
`multiple` defaults to the same value as `denom` if unspecified."""
quotient = self.NewIntVar(f'{repr(target)} == ({repr(num)} // {repr(denom)}) * {repr(multiple)}: quotient')
intermediate_num, num_constraint = self.NewIntermediateIntVar(num, f'{repr(target)} == ({repr(num)} // {repr(denom)}) * {repr(multiple)}: num', lb = 0)
intermediate_denom, denom_constraint = self.NewIntermediateIntVar(denom, f'{repr(target)} == ({repr(num)} // {repr(denom)}) * {repr(multiple)}: denom', lb = 1)
intermediate_target, target_constraint = self.NewIntermediateIntVar(target, f'{repr(target)} == ({repr(num)} // {repr(denom)}) * {repr(multiple)}: target')
if multiple:
intermediate_multiple, multiple_constraint = self.NewIntermediateIntVar(multiple, f'{repr(target)} == ({repr(num)} // {repr(denom)}) * {repr(multiple)}: multiple')
super().AddDivisionEquality(quotient, intermediate_num, intermediate_denom)
super().AddMultiplicationEquality(intermediate_target, (quotient, intermediate_multiple if multiple else intermediate_denom))
return (num_constraint, denom_constraint, target_constraint, *((multiple_constraint,) if multiple else ()))
def AddIf(self, variable, *constraints):
"""Add constraints to the model, only enforced if the specified variable is true.

View File

@ -538,7 +538,10 @@ def Solve(shadowy_level, bone_market_fluctuations = None, zoological_mania = Non
model.AddIf(actions[Buyer.A_NAIVE_COLLECTOR],
skeleton_in_progress >= 100,
partialmethod(BoneMarketModel.AddDivisionMultiplicationEquality, primary_revenue, value + zoological_mania_bonus, 250),
partialmethod(BoneMarketModel.AddMultiplicationEquality,
primary_revenue,
(250, partialmethod(BoneMarketModel.AddDivisionEquality, num=value + zoological_mania_bonus, denom=250)),
),
secondary_revenue == 0,
difficulty_level == 25*implausibility,
added_exhaustion == 0,
@ -547,7 +550,10 @@ def Solve(shadowy_level, bone_market_fluctuations = None, zoological_mania = Non
model.AddIf(actions[Buyer.A_FAMILIAR_BOHEMIAN_SCULPTRESS],
skeleton_in_progress >= 100,
antiquity == 0,
partialmethod(BoneMarketModel.AddDivisionMultiplicationEquality, primary_revenue - 1000, value + zoological_mania_bonus, 250),
partialmethod(BoneMarketModel.AddMultiplicationEquality,
primary_revenue - 1000,
(250, partialmethod(BoneMarketModel.AddDivisionEquality, num=value + zoological_mania_bonus, denom=250)),
),
secondary_revenue == 250*counter_church,
difficulty_level == 50*implausibility,
added_exhaustion == 0,
@ -556,7 +562,10 @@ def Solve(shadowy_level, bone_market_fluctuations = None, zoological_mania = Non
model.AddIf(actions[Buyer.A_PEDAGOGICALLY_INCLINED_GRANDMOTHER],
skeleton_in_progress >= 100,
menace == 0,
partialmethod(BoneMarketModel.AddDivisionMultiplicationEquality, primary_revenue - 1000, value + zoological_mania_bonus, 50),
partialmethod(BoneMarketModel.AddMultiplicationEquality,
primary_revenue - 1000,
(50, partialmethod(BoneMarketModel.AddDivisionEquality, num=value + zoological_mania_bonus, denom=50)),
),
secondary_revenue == 0,
difficulty_level == 50*implausibility,
added_exhaustion == 0,
@ -565,7 +574,10 @@ def Solve(shadowy_level, bone_market_fluctuations = None, zoological_mania = Non
model.AddIf(actions[Buyer.A_THEOLOGIAN_OF_THE_OLD_SCHOOL],
skeleton_in_progress >= 100,
amalgamy == 0,
partialmethod(BoneMarketModel.AddDivisionMultiplicationEquality, primary_revenue - 1000, value + zoological_mania_bonus, 250),
partialmethod(BoneMarketModel.AddMultiplicationEquality,
primary_revenue - 1000,
(250, partialmethod(BoneMarketModel.AddDivisionEquality, num=value + zoological_mania_bonus, denom=250)),
),
secondary_revenue == 0,
difficulty_level == 50*implausibility,
added_exhaustion == 0,
@ -574,7 +586,10 @@ def Solve(shadowy_level, bone_market_fluctuations = None, zoological_mania = Non
model.AddIf(actions[Buyer.AN_ENTHUSIAST_OF_THE_ANCIENT_WORLD],
skeleton_in_progress >= 100,
antiquity > 0,
partialmethod(BoneMarketModel.AddDivisionMultiplicationEquality, primary_revenue, value + zoological_mania_bonus, 50),
partialmethod(BoneMarketModel.AddMultiplicationEquality,
primary_revenue,
(50, partialmethod(BoneMarketModel.AddDivisionEquality, num=value + zoological_mania_bonus, denom=50)),
),
secondary_revenue == 250*(antiquity + (1 if bone_market_fluctuations == Fluctuation.ANTIQUITY else 0)),
difficulty_level == 45*implausibility,
added_exhaustion == 0,
@ -583,7 +598,10 @@ def Solve(shadowy_level, bone_market_fluctuations = None, zoological_mania = Non
model.AddIf(actions[Buyer.MRS_PLENTY],
skeleton_in_progress >= 100,
menace > 0,
partialmethod(BoneMarketModel.AddDivisionMultiplicationEquality, primary_revenue, value + zoological_mania_bonus, 50),
partialmethod(BoneMarketModel.AddMultiplicationEquality,
primary_revenue,
(50, partialmethod(BoneMarketModel.AddDivisionEquality, num=value + zoological_mania_bonus, denom=50)),
),
secondary_revenue == 250*menace,
difficulty_level == 45*implausibility,
added_exhaustion == 0,
@ -592,7 +610,10 @@ def Solve(shadowy_level, bone_market_fluctuations = None, zoological_mania = Non
model.AddIf(actions[Buyer.A_TENTACLED_SERVANT],
skeleton_in_progress >= 100,
amalgamy > 0,
partialmethod(BoneMarketModel.AddDivisionMultiplicationEquality, primary_revenue - 250, value + zoological_mania_bonus, 50),
partialmethod(BoneMarketModel.AddMultiplicationEquality,
primary_revenue - 250,
(50, partialmethod(BoneMarketModel.AddDivisionEquality, num=value + zoological_mania_bonus, denom=50)),
),
secondary_revenue == 250*(amalgamy + (1 if bone_market_fluctuations == Fluctuation.AMALGAMY else 0)),
difficulty_level == 45*implausibility,
added_exhaustion == 0,
@ -813,7 +834,10 @@ def Solve(shadowy_level, bone_market_fluctuations = None, zoological_mania = Non
model.AddIf(actions[Buyer.A_CONSTABLE],
cp_model.BoundedLinearExpression(skeleton_in_progress, (110, 119)),
partialmethod(BoneMarketModel.AddDivisionMultiplicationEquality, primary_revenue - 1000, value, 50),
partialmethod(BoneMarketModel.AddMultiplicationEquality,
primary_revenue - 1000,
(50, partialmethod(BoneMarketModel.AddDivisionEquality, num=value, denom=50)),
),
secondary_revenue == 0,
difficulty_level == 50*implausibility,
added_exhaustion == 0,
@ -846,7 +870,10 @@ def Solve(shadowy_level, bone_market_fluctuations = None, zoological_mania = Non
cp_model.BoundedLinearExpression(skeleton_in_progress, (110, 299)),
amalgamy == 0,
counter_church == 0,
partialmethod(BoneMarketModel.AddDivisionMultiplicationEquality, primary_revenue - 300, value + zoological_mania_bonus, 3),
partialmethod(BoneMarketModel.AddMultiplicationEquality,
primary_revenue - 300,
(3, partialmethod(BoneMarketModel.AddDivisionEquality, num=value + zoological_mania_bonus, denom=3)),
),
secondary_revenue == 250,
difficulty_level == 100*implausibility,
added_exhaustion == 0,
@ -857,7 +884,10 @@ def Solve(shadowy_level, bone_market_fluctuations = None, zoological_mania = Non
skeleton_in_progress >= 100,
implausibility >= 2,
attribute >= 4,
partialmethod(BoneMarketModel.AddDivisionMultiplicationEquality, primary_revenue - 100, value + zoological_mania_bonus, 50),
partialmethod(BoneMarketModel.AddMultiplicationEquality,
primary_revenue - 100,
(50, partialmethod(BoneMarketModel.AddDivisionEquality, num=value + zoological_mania_bonus, denom=50)),
),
partialmethod(BoneMarketModel.AddMultiplicationEquality, secondary_revenue - 250, (250, attribute, implausibility)),
difficulty_level == 0,
partialmethod(BoneMarketModel.AddDivisionEquality, added_exhaustion, secondary_revenue, 5000),
@ -926,7 +956,10 @@ def Solve(shadowy_level, bone_market_fluctuations = None, zoological_mania = Non
model.AddIf(actions[Buyer.THE_DUMBWAITER_OF_BALMORAL],
cp_model.BoundedLinearExpression(skeleton_in_progress, (180, 189)),
value >= 250,
partialmethod(BoneMarketModel.AddDivisionMultiplicationEquality, primary_revenue, value, 250),
partialmethod(BoneMarketModel.AddMultiplicationEquality,
primary_revenue,
(250, partialmethod(BoneMarketModel.AddDivisionEquality, num=value, denom=250)),
),
secondary_revenue == 0,
difficulty_level == 200,
added_exhaustion == 0,
@ -946,7 +979,10 @@ def Solve(shadowy_level, bone_market_fluctuations = None, zoological_mania = Non
model.AddIf(actions[getattr(DiplomatFascination, str(attribute).upper()).value],
skeleton_in_progress >= 100,
attribute >= 5,
partialmethod(BoneMarketModel.AddDivisionMultiplicationEquality, primary_revenue - 50, value, 50),
partialmethod(BoneMarketModel.AddMultiplicationEquality,
primary_revenue - 50,
(50, partialmethod(BoneMarketModel.AddDivisionEquality, num=value, denom=50)),
),
partialmethod(BoneMarketModel.AddMultiplicationEquality, secondary_revenue, (50, attribute, attribute)),
difficulty_level == 0,
partialmethod(BoneMarketModel.AddDivisionEquality, added_exhaustion, secondary_revenue, 5000),
@ -959,19 +995,20 @@ def Solve(shadowy_level, bone_market_fluctuations = None, zoological_mania = Non
{
model.AddIf(actions[getattr(DiplomatFascination, fascination).value],
*criteria,
partialmethod(BoneMarketModel.AddDivisionMultiplicationEquality, primary_revenue - 50, value, 50),
partialmethod(BoneMarketModel.AddMultiplicationEquality,
primary_revenue - 50,
(50, partialmethod(BoneMarketModel.AddDivisionEquality, num=value, denom=50)),
),
partialmethod(BoneMarketModel.AddMultiplicationEquality,
secondary_revenue,
(50,
(
50,
partialmethod(BoneMarketModel.AddApproximateExponentiationEquality,
var = partialmethod(BoneMarketModel.AddDivisionEquality,
num = cp_model.LinearExpr.Sum((amalgamy, antiquity, menace)),
denom = 3
var=partialmethod(BoneMarketModel.AddDivisionEquality, num = amalgamy+antiquity+menace, denom=3),
exp=2.2,
upto=MAXIMUM_ATTRIBUTE,
),
),
exp = 2.2,
upto = MAXIMUM_ATTRIBUTE
)
)
),
difficulty_level == 0,
partialmethod(BoneMarketModel.AddDivisionEquality, added_exhaustion, secondary_revenue, 5000),