Commit Graph

62 Commits

Author SHA1 Message Date
Jeremy Saklad aa6a294d55
feat: Add segment property to actions
This is used to track the number of segments in a skeleton, which
is affected by a new bone.
2022-05-26 06:55:02 -06:00
Jeremy Saklad 57a2e9ce36
fix: Restore default number of workers
OR-Tools 9.3 no longer seems to use more than one worker by default, so
this parameter is once again set by the script.

The parameter has also been changed from num_search_workers to
num_workers internally, though the former is mapped to the latter.
2022-04-19 10:02:03 -05:00
Jeremy Saklad a074b44b87
Fix regression in help output
Argument parsing seems to intermittently choke on --help if a default
value for verbosity is not explicitly supplied.
2022-04-11 14:59:16 -05:00
Jeremy Saklad 8cb2ba5676
Update OR-Tools to 9.3
Despite being a minor version, OR-Tools 9.3 has breaking changes to
CP-SAT in the form of renamed methods.
2022-04-11 13:38:25 -05:00
Jeremy Saklad 497e052ad7
Fix regression in intermediate variables
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.
2022-02-15 09:55:55 -06:00
Jeremy Saklad 0a7de36807
Create intermediate integer variables for non-constants
Reusing an intermediate variable causes constraints on the intermediate
to be applied to the original, which can have unintended consequences.
2022-02-15 09:51:25 -06:00
Jeremy Saklad 551363b9b7
Replace unnecessary variables with lambdas
Variables that are only used in one line lend undue complexity to code.
Using a one-shot lambda makes the use of a declaration much more
obvious.
2022-01-02 17:57:53 -06:00
Jeremy Saklad 15317f6298
Avoid extraneous intermediate variables
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.
2022-01-02 17:28:58 -06:00
Jeremy Saklad c6ae446fa0
Add leg fascination to Diplomat
This fascination works similarly to the skull-based fascination.
2021-11-02 15:26:08 -05:00
Jeremy Saklad 69cbaeeb48
Remove unnecessary model hints
These hints don't actually improve performance in practice, so they have
no reason to remain.
2021-10-28 00:20:30 -05:00
Jeremy Saklad 6e4a3a0117
Add amphibian fascination for Diplomat
This fascination works similarly to other declaration-based fascinations.
2021-10-28 00:19:39 -05:00
Jeremy Saklad 39df88eedd
Refactor complex buyers
Buyer requirements now use helper methods and control flow to increase
readability and compactness.

The main benefit of this is no longer having to declare intermediate
variables.
2021-10-19 22:20:02 -05:00
Jeremy Saklad e211becb30
Add type hints to helper functions
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.
2021-10-16 17:17:56 -05:00
Jeremy Saklad 40246c4815
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.
2021-10-16 15:11:12 -05:00
Jeremy Saklad 1175575c92
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.
2021-10-16 13:14:30 -05:00
Jeremy Saklad 6b9643041a
Overload BoneMarketModel.NewIntermediateIntVar
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.
2021-10-16 13:04:31 -05:00
Jeremy Saklad fd8abb7501
Update Trifling Diplomat to use new formulae
The Trifling Diplomat fascinations that previously exhibited quasi-cubic
scaling have a new formula using the mean of amalgamy, antiquity, and
menace.

To eliminate unnecessary reptition, all fascinations have been
completely refactored and combined using the new helper methods and design patterns.

A comment has been added to mark The Trifling Diplomat's code, since it
is noticeably less readable than that of other refactored buyers.
2021-10-16 10:28:07 -05:00
Jeremy Saklad 9671190059
Add BoneMarketModel.AddDivisionApproximateExponentiationEquality
This method combines two common operations, avoiding the need for
intermediate variables at the call site.
2021-10-16 10:22:31 -05:00
Jeremy Saklad b5a047889d
Add menace fascination for Diplomat
This fascination scales quadratically with menace.
2021-10-15 21:39:41 -05:00
Jeremy Saklad 110f524f62
Update OR-Tools to v9.1
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.
2021-10-15 21:32:55 -05:00
Jeremy Saklad 5a3f4f6454
Refactor simpler buyers
Buyer requirements now use helper methods and control flow to increase
readability and compactness.

The main benefit of this is no longer having to declare intermediate variables directly.

This is a work-in-progress, as some buyers have complex formulae that
necessitate more work or additional helper methods to refactor.
2021-10-15 17:46:13 -05:00
Jeremy Saklad 77db9fef92
Clamp attributes to zero or more
Amalgamy, antiquity, menace, and implausibility are now clamped to be
non-negative. This simplifies a number of calculations, eliminates a few
insiduous calculation errors, and reflects the actual game.

This change impacts the output of the program, which previously showed
negative values even though they weren't actually possible.
2021-10-15 17:12:20 -05:00
Jeremy Saklad 1bf18fe8e1
Add BoneMarketModel.AddDivisionMultiplicationEquality
This method combines two common operations, avoiding the need for
intermediate variables at the call site.
2021-10-15 15:05:17 -05:00
Jeremy Saklad 46edfcb35b
Override CpModel.AddDivisionEquality
The overridden method supports enforcement literals using indirection.
2021-10-15 15:05:07 -05:00
Jeremy Saklad 06dd19bb45
Refactor declaration requirements
Declaration requirements now use helper methods and generator
expressions to increase readability and compactness.

Requirements are ordered and grouped by quantity.

The comments on declaration requirements have been removed, as the new
pattern is far easier to read.
2021-10-15 15:04:37 -05:00
Jeremy Saklad 6f0e0ac379
Add BoneMarketModel.AddIf method
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.
2021-10-15 15:04:37 -05:00
Jeremy Saklad 17add382ec
Replace BoneMarketModel.NewIntermediateBoolVar
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.
2021-10-15 15:04:37 -05:00
Jeremy Saklad 3d90d61deb
Replace helper functions with subclass
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.
2021-10-15 15:03:55 -05:00
Jeremy Saklad 95a86b43ae
Change Withered Tentacle source
The Adulterine Castle has an option that yields four Withered Tentacles
for just one action.

Cost.WARBLER_SKELETON has been removed, as it is no longer used by
anything.
2021-09-21 11:48:08 -05:00
Jeremy Saklad 5ef972295b
Use f-strings and multiline strings
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.
2021-09-18 20:01:30 -05:00
Jeremy Saklad 807c3d834c
Add __slots__ to internal printer class
This slightly reduces memory usage.
2021-09-18 19:18:40 -05:00
Jeremy Saklad 97aedc0895
Add __slots__ to data enumerations
These types still have a __dict__, since they inherit from Enum, but
using __slots__ for the inherited properties can still improve access
times.
2021-09-18 19:18:40 -05:00
Jeremy Saklad 50625cdc27
Add __slots__ to internal parser types
Dynamic properties are not used by these types, so using __slots__ is
slightly more efficient. Public inherited properties are also included.
2021-09-18 19:18:39 -05:00
Jeremy Saklad 21ea715dd1
Refactor Action as data class
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).
2021-09-18 19:18:39 -05:00
Jeremy Saklad 72506b2cff
Increase cost of Crustacean Pincer
Spear-fishing is difficult, and only available a fourth of the time.
2021-09-14 19:47:55 -05:00
Jeremy Saklad f60b8b6f6f
Fix name of tail-skipping action
It is possible to skip tails while some are already present. The wiki
had the old name when this was added to the solver, but it has since
been corrected.
2021-09-11 17:05:36 -05:00
Jeremy Saklad 3ff1b2fd46
Update quadratic buyers to reflect balance changes
The Investment-Minded Ambassador yields 80% of their former secondary
revenue, while the Tentacled Entrepreneur and Teller of Terrors yield
400% of theirs.
2021-09-11 15:11:01 -05:00
Jeremy Saklad 32531d2b58
Update Teller of Terrors
The Teller now pays quadruple their previous secondary revenue.
2021-09-11 13:03:05 -05:00
Jeremy Saklad 479bad798b
Update Tentacled Entrepreneur
The Entrepreneur now pays quadruple their previous secondary revenue.
2021-09-11 12:46:03 -05:00
Jeremy Saklad e0b070d2eb
Update Investment-Minded Ambassador
The Ambassador now pays four-fifths of their previous secondary revenue.
2021-09-10 20:55:41 -05:00
Jeremy Saklad 8cc1ddc0b5
Decouple Zoological Mania's bonus from value
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.
2021-09-10 14:58:56 -05:00
Jeremy Saklad 0f7eb10da8
Implement menace scaling for Vake skulls
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.
2021-09-01 14:04:18 -05:00
Jeremy Saklad ebd2c2fc48
Implement scaling implausibility for Vake skulls
Vake skulls now have scaling implausibility, which is calculated using a
partial sum formula.

Implausibility calculation has been reorganized to accomodate the
change.
2021-09-01 13:21:47 -05:00
Jeremy Saklad 5d7c972169
Implement scaling value for Vake skulls
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.
2021-09-01 12:03:53 -05:00
Jeremy Saklad abd5139aad
Limit Vake skulls to 1 temporarily
Vake skulls are now nerfed when using more than one. Until the
diminishing returns are understood, this script will now use only 1 at
most.
2021-09-01 07:23:33 -05:00
Jeremy Saklad f2a421afca
Correct Searing Enigma cost
Acquiring Searing Enigmas through Khan's Heart costs two Intercepted
Cablegrams, which must also be acquired through Khan's Heart.
2021-08-31 17:06:03 -05:00
Jeremy Saklad 57908feb50
Update cost for Searing Enigmas
Searing Enigmas can be obtained semi-reliably at Khan's Heart through
network expansion.
2021-08-24 07:27:54 -05:00
Jeremy Saklad b2a98cbe15
Add reptile fascination for Diplomat
This fascination effectively requires a Reptile declaration, and scales
with all three skeleton attributes multiplied together.
2021-08-24 07:27:54 -05:00
Jeremy Saklad 35663dd8d4
Add list option
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.
2021-08-14 17:55:45 -05:00
Jeremy Saklad 3b1ca61104
Fix BlacklistAction bug
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.
2021-08-14 14:40:15 -05:00