Reusing non-constant integer variables was causing constraints to
propagate in unintended ways, resulting in incorrect restrictions on the
solver's output.
This should not be an issue for constants, as they are already
restricted to one value.
Intermediate variables should not be necessary if the equivalent
expression is a constant or a variable with the same bounds.
This change reduces the total number of variables in the model.
The documentation of BoneMarketModel.NewIntermediateIntVar has been
tweaked to allow for any number of constraints.
For the sake of maintainability, it is very important the parameters and
results of the helper functions are spelled out explicitly.
Union type hints are being left until Python 3.10 is supported.
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 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.
Intermediate integer variables can now be created for compatible partial
methods, which massively increases the expressiveness of each helper
function.
This change should allow the compound helper functions, such as
AddDivisionMultiplicationEquality, to be removed entirely. It will also
allow even the most complex buyers to avoid intermediate variables.
This update, despite ostensibly being a minor version, includes breaking
changes that must be accounted for.
Overflow is much more strictly checked, so the magnitude of certain
constants has been decreased.
CP-SAT's default number of workers has been changed to reflect the
default of this script. As such, the script no longer needs to change
that parameter unless a specific number of workers has been specified.
In light of the breaking changes, the OR-Tools version is now pinned at
9.1 instead of being permitted to use future minor versions.
This method allows a series of constraints to be applied all at once
using the same enforcement literal, which can substantially improve
readability and writability.
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.
Action is now a frozen data class.
All properties of Action now have type hints, and __slots__ are used
for properties without default values (that is, name).
This option lists enumeration identifiers, along with their string forms
for clarity's sake. This makes it much easier to blacklist things
without reading the source code.
A note about listing has been added to the Blacklisting section of the
README.
A dedicated action has been created for the list command.
This bug would have caused an error if BlacklistAction were used with a
different nargs.
The "verbose" argument no longer has a default specified. Instead, the
code that checks it supplies a default for itself.
Configuration files allow common arguments like --shadowy-level and
--blacklist to be saved and referenced rather being typed out each time.
ArgumentParser has been subclassed to allow more freedom when parsing
configuration files.
Blacklisting uses a dedicated action to parse arguments into enumeration
members.
Choices are not provided for this option, as it would utterly overwhelm
the help interface. This means that errors may not be as helpful,
however.
The README has been updated with a small section on blacklisting, how to
do it, and why you may wish to do it.
Options that were previously commented out are now enabled, since the
user can simply blacklist them instead.
EnumAction was erasing nargs before passing it to the superclass
initializer, which broke handling for arguments with consecutive values.
The help text for --desired-buyer has been updated to reflect that you
actually can specify multiple values with a single declaration now.
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.