The replacement method, BoolExpression, accepts a
BoundedLinearExpression directly, and uses memoization to reuse Boolean
variables. This technique is unsuitable for other methods, as
constraints need to be applied separately, but in this case it is fine.
The new method is much easier to understand, and far easier to read at
call sites.
Variable names are generated from the expression, rather than being
explicitly specified.
The new subclass, BoneMarketModel, overrides CpModel's methods with
improvements such as default parameters and support for enforcement
literals.
This should allow substantial improvements to the readability of the
solver in the future.
In addition, various lists have been replaced with tuples where
appropriate.
Inline string expressions are far easier to read, particularly for
complicated strings like the skeleton printer's output.
Care has been taken to ensure that no behavior has been changed in the
process.
The Investment-Minded Ambassador yields 80% of their former secondary
revenue, while the Tentacled Entrepreneur and Teller of Terrors yield
400% of theirs.
Zoological Mania's bonus is now saved upon skeleton declaration,
and used when calculating results rather than being added to value
directly.
Not all buyers benefit from the bonus, so this change better reflects
the actual game.
A crash caused by failing to specify Zoological Mania has been fixed.
Vake skulls now have diminishing returns beyond the first skull.
Menace calculation has been reorganized to accomodate the change.
Vake skulls are no longer capped, as the new scaling has been fully
implemented.
Vake skulls now have scaling implausibility, which is calculated using a
partial sum formula.
Implausibility calculation has been reorganized to accomodate the
change.
Vake skulls now have diminishing returns beyond the first skull, which
are calculated using a partial sum formula similar to joint addition.
Value calculation has been reorganized to accomodate the change.
All scripts are now contained in a package named "bonemarketsolver".
The command-line interface has been moved to __main__.py.
The solver script has been moved to solve.py.
Relative module imports are now used where appropriate.
The invocation method of the CLI has changed: instead of running Python
itself, you can now use "pipenv run bone_market_solver".
The README has been updated to reflect the new usage method.