- (#284) Allow scoring of all-the-work compositions, using the
atw_weightparameter. - (#306) Add new option
base_music = "complib", which adds base music which exactly matches that of CompLib (except that Monument can't count wraps). Thanks, @samuelsenior! - (#319) Remove non-duffer pruning. The non-duffer implementation was fiddly and complex and difficult to both use and to maintain. It was useful, but just didn't justify its complexity.
- (#323) Automatically expand courses which don't exist in other parts. This is particularly
relevant to link-method cyclic compositions, where previously one would have to provide every
cyclic course (
"1234567890", "1023456789", "19023456789", etc.). Now, only one is required and the rest are inferred.
- (#205) Remove chunks and links which contribute too much method counts. This should have a small speed improvement for compositions which include one lead of each method in each part (e.g. 23-spliced Surprise Major).
- (#221) In the guide, always use valid values for
{start,end}_rows. - (#309) Align columns correctly when the maximum composition length is 2-digits long.
- (#314) Don't display "default music" warning if user explicitly asks for Complib music.
- (#314) Add
require_atwoption, which filters out any non-atw compositions in Monument's output. - (#314) Display which order the compositions in the final output were emitted, even in the sorted summary output.
- (#203) Automate the release workflow. Now,
cargo cut-releaseis enough to trigger the whole release pipeline. - (#204, #304, #310) Implement benchmark runner, and add benchmarks from real use-case (first contribution; thanks @samuelsenior!).
- (#296) Add
ARCHITECTURE.mdto help new contributors getting an idea of the code - (#303) Completely rewrite the interface of Monument's internal library to make it more amenable to a graphical interface.
- (#320) Remove the cached data stored in
Query(and generate it from scratch). This leads to... - (#322) Fully remove
Query. Now, all the composition-parameter data is calculated directly fromParameters. - (#324) Remove a lot of cached data from
Composition, which was dependent on the specific set ofParametersused to generate that composition.
- (#221) Add
Bell::MAX, which returns the largestBellpossible (i.e. the 254th) - (#221) Stop bell-path methods (e.g.
Block::path_of) from returningOption. Instead, passing aBellout of theBlock'sStagewill cause a panic. - (#221) Add
Mask::contains, returningtrueif theMaskconstrains thatBell. - (#321) Almost all operations will panic on
Stagemismatch, rather than returning aResult<_, IncompatibleStages>.
- (#201) Print an extra header line every 50 compositions.
- (#200) Remove
debug_symboland calculate it automatically for bobs. - (#200) Replace
allow_falsewithrequire_truth - (#185) Rename
ch_weightstocourse_weights, andcourse_headstocourses
- (#167) Remove dependence on
serdefrom Monument's library. Now, all the handling of TOML files is inmonument_cli. - (#171) Don't store test cases in Markdown files, instead storing them all as individual TOML files. Apart from massively simplifying the code, this also means that all test cases can be easily run directly from the command line (a very useful feature for debugging).
- (#172) Test Monument's
stdoutoutput, rather than driving the library directly. - (no PR) Fix test case path that was invalid on Windows.
- (#156) Implement non-duffer pruning. In short, you specify courses which are 'non-duffer' (e.g. those with 4-bell runs) and then you can enforce a limit on how much contiguous/total 'duffer' rows can be rung. Think MBD's no-duffer Bristol, but this works for any composition.
- (#143) Use explicit memory limit. Set by
--mem-limitor-M, defaults to90%80% of available system memory.
- (#165) Only require clippy lints on releases.
- (#146) Merge fields of
graph::build::MethodDataintoquery::Method. - (#142) Implement builder API to make
monumenteasier to use as a library - (#142) Make
Queryprivate and buildSearches directly. - (#140) Rename some fields of
Query(which, after #138, are no longer exposed externally) - (#138) Heavily clean up the API of the
monumentlibrary. This PR focusses on removing as much API surface as possible, so that the remaining API can be made as easy as possible to use. With some more attention, it should be possible to embed themonumentlibrary into programs other than its CLI interface.
- (#166) Output correct contiguous duffer lengths in multi-parts.
- (#166) Make
Chunks non-duffer only if they are a non-duffer in every part. - (#145) Reduce memory limit from 90% to 80% of the available memory.
- (#140) Rename
Mask::fix_bellstoMask::with_fixed_bells. - (#140) Don't return borrowed data in the error from
MethodLib::get_by_title_with_suggestions. - (#156) Only implement
Add/SubforBellwithi16(i.e. notu8ori8). If you want to add/subtractBells withi8oru8, cast them toi16. - (#156) Add
Method::lead_end(to complementMethod::lead_head). - (#156) Add
Mask::from_{bells,vec}andMask::bells.
- (#116) Much smarter way of determining default method balance. (Nerdy details:) Method counts are weighted by the square root of each method's lead length (so shorter methods won't need as many rows), and will round 'outwards' for cases like cyclic spliced where a 'perfect' method balance actually has a wide range of different counts.
- (#121) Renamed
lead_locationtolabel(for brevity). - (#120) Allow
queue_limitandgraph_size_limitto be set in the TOML format. - (#116) Prove which lengths and method counts are actually possible, and error if the two can't match.
- (#122) Stop graph optimisation when all passes fail to make progress once (rather than waiting for an entire run of passes to not make progress).
- (#115) Demote 'default music' message from
WARNtoINFO. - (#112) Massively speed up falseness generation when using custom CHs in cyclic comps, by computing all the false lead heads rather than computing falseness between all pairs of masks.
- (#124) Fix incorrect output for single-method cyclic comps.
- (#113) Remove unnecessary threading from the search code (which can currently only use one thread anyway).
- (#112) Refactor
FalsenessTable::newinto multiple helper functions - (#110) Exclusively use
{Total,PerPart}Lengthto refer to lengths (as opposed tousize), thus allowing the compiler to spot when we mix them up. - (#109) Encapsulate all the part-head logic into
PartHeadGroup/PartHead/PhRotation.
- (#117) Rationalise the use of
unsafeinbellframe. - (#115) Remove unnecessary
unsafeinbellframe::music. - (#115) Fix integer underflow when computing internal runs.
- (#115) Implement
OrdforMask - (#112) Rename
Mask::combinetoMask::intersect
- (#105) Completely rewrite and simplify the graph building code. Lots of things relating to
course_headsand multi-parts should now Just Work™:- Incompatible course heads are no longer a thing. You can now do things like
course_heads = ["*78", "12345*"]and it will Just Work™. Previously this would error because12345867could be given two different course heads. course_headsalways Just Works™, even in e.g. cyclic multi-parts. Previously cyclic comps would simply ignorecourse_heads.- Specifying multiple start/end indices now Just Works™ in multi-parts - i.e. snap start/finishes are allowed, but Monument won't mix them or put an illegal splice over the part head. This would previously cause a crash (found by Jadd Virji - thanks!).
- Incompatible course heads are no longer a thing. You can now do things like
- (#96) Add music presets for:
- Near misses (for any stage)
- CRUs (for >= Triples)
- 5678 combinations (for both Triples and Major) Load them with, e.g.:
music = [ { preset = "5678 combinations" }, { preset = "near misses" }, { preset = "crus" }, ]
- (#105) Add
start_rowandend_rowfor making compositions start/stop at a row other than rounds. Useful for using Monument to extend 720s to get QPs of Minor. - (#105) Remove
splice_style = "call locations"(which would allow splices only where a call could have been made). - (#105)
start_strokenow refers to the row afterstart_row(i.e. the first non-rounds row). - (#104) Fix column alignments for (a) negative scores and (b) long (i.e. at least 5-digit) lengths.
- (#105) Fix bug where Monument would, in obscure situations, produce false compositions (found by David Thomas - thanks!). Monument now expands the rows of each composition generated and explicitly checks for truth - so if falseness bugs do creep in, you'll know about it (and hopefully the large test suite will catch it before it reaches you).
- (#105) Remove
monument::Layoutand addMethods andCalls explicitly to aQuery. - (#104) Make all test cases deterministic by (a) rounding the composition scores and (b) making sure that all test cases are exhaustive searches (to negate Monument's non-deterministic search order).
- (#104) Implement
OrdforStroke. - (#104) Add
Mulimplementations for every combination of&Row/&RowBuf/RowBufversus anything from&Row/&RowBuf/RowBufor&Mask/Mask. - (#104) Fix bug in
Block::extend_range, where too many annotations would be copied. - (#104) Add new methods:
Row::copy_from: in-place write to an&mut Row(i.e. requiring the stages to match), analogous to<[T]>::copy_from_slice.Block::with_leftover_row: create a newBlockwith only the specified leftover row.Block::leftover_row_mut: to mutably borrow the leftover row of aBlock.
- (#97) Enforce extra invariants for
music::Pattern(making it much more robust, at the cost of needing to handle some errors that should have been handled anyway). - (#97) Rename
music::Regextomusic::Pattern(it isn't anywhere near as powerful as true regexes). - (#96) Add
Stage::extent, which returns aSameStageVeccontaining every possibleRowof thatStagein an arbitrary order. - (#96) Allow addition/subtraction between
Stages andu8s with+/-, panicking on overflow or aStageof 0.checked_addandchecked_subare the non-panicking versions. - (#96) Add conversions from
Row/RowBuftoMaskandRegex(via theFromtrait)
- (#94) Replace
default_musicwithbase_music(to be consistent withbase_calls). - (#92) Print music as part of the composition summary.
- (#95) Suggest using
{bob,single}s_only = trueif{single,bob}_weightis set to a large negative value.{bob,single}s_onlyis faster than using{single,bob}_weight, but sometimes both call types are required to bring a composition round with the right length so Monument can't automatically set{bob,single}s_only. - (#92) Remove fixed tenors from part heads in summary (e.g.
1342567890ETis now be just1342). - (#91) Calls can now go from/to different lead labels. Set this with e.g.
label = { from = "2nds", to = "HL" }. Useful for adding finer control over where calls can be placed. - (#91) Allow multiple labels on the same row within a lead. Also reversed the syntax from e.g.
labels = { 0 = "LE", 16 = "HL" }tolabels = { LE = 0, HL = 16 }. The same label can be added to multiple rows likelabels = { SE = [3, 9] }(for Six-Ends in Stedman).
- (#89) Refactor the search algorithm (splitting the node expansion from the best-first search code)
- (#92) Give
Regexes a specificStage. - (#91) Allow multiple lead labels to be placed on the same row
- (No PR) Fix incorrect 'ETs at back' to 'TEs at back' in the default music
- (#82) Add
calling_bellparameter to override the bell used when determining calling positions (a.k.a. the 'observation' bell). If unspecified, this defaults to the heaviest bell in the stage. - (#81) Fall back on a default music profile if no music is specified.
default_music = falsewill disable this. Now, Monument will produce good results even if you only specifylengthandmethod.
- (#73)
splice_style = "calls"will no longer generate splices over part heads. - (#73)
splice_weightis now applied to splices over part heads. - (#73)
splice_style = "calls"now works for cyclic compositions.
- (#80) Add error for CHs that aren't in other parts (e.g. setting
course_heads = ["*78", "*7856"]andpart_head = "134265"now produces an error, because*7856becomes*7865in even-numbered parts). - (#79) Generate a final 'search complete' progress update just after the search finishes.
- (#79) Print number of compositions generated in the progress line.
- (#77) When outputting compositions, tie-break equally musical compositions by their average overall score per row.
- (#71) Allow specifying an exact count with e.g.
count = 224rather thancount = { min = 224, max = 224 }.
- (#70) New graph optimisation: remove links between mutually false chunks.
- (#69) Allow weights on method splicing with
splice_weight(defaults to 0). - (#67) Add error messages for giving the same debug/display name to multiple calls (specifically, two calls at the same lead location but with different place notations).
- (#66) Allow method counts to be overridden per-method (by adding a
countparameter to methods).
- (#64) Use
goldilocks-json-fmtto format the test result files.
- (#58) Add nice error messages for all custom errors (TOML parsing errors are still lacking, but they are substantially harder to fix).
- (#54) Print comp list even when a search is aborted with
ctrl-C. - (#50) Add
bobs_onlyandsingles_only.
- (#58) Allow
calling_positions = "<string>"to set the calling positions of a call to the characters in<string>(previouslycalling_positionshad to be an array). - (#56) Allow
to-complib.pyto handle multiple-letter method shorthands. - (#55) Print warning for using plain-bob style calls in Grandsire or Stedman (Grandsire and Stedman are still pretty buggy anyway, though).
- (#54) Don't bother freeing memory allocated during the search algorithm. This makes Monument terminate instantly, often shaving 10s of seconds from the search time.
- (#53) Add limit on graph size. Set with
--graph-size-limit, defaults to 100K chunks.
- (#58) Allow multiple test cases to be stored in one file
- (#57) Fix mistake in
guide.mdwhich turned a large part of the guide into a giant code block. - (#50) Fix some dead links in Monument's guide.
- (#58) Fix incorrect indices for
PnBlockParseError
- (#48) Allow
start_indices/end_indicesto be overridden for each method. - (#48) Allow negative values for
start_indices/end_indices(still relative to 0 as a standard start). - (#49) Sort final composition list by absolute music score.
- (#47) Rename
AnnotBlocktoBlock(removing the type-defBlock = AnnotBlock<()>). - (#47) Use
u8instead ofusizeas the underlying representation forBell,Stageand places.
- (#48) Make integration tests error on unspecified/new test cases.
- (#44) Rewrite the test harness, which now doesn't depend on Python and also allows error messages to be tested.
- (#43) Add READMEs on Monument's pages on crates.io.
- (#42) Add
handbell_coursing_weightto easily addch_weightsfor handbells in their coursing positions. - (#41) Display score from music in CLI output, rather than the total scores.
- (#40) Set default of
num_compsto 100.
- (#39) Rework all
READMEs and Monument's guide to make them more clear and readable. - (#36) Remove self-false nodes even in single-parts. This happens if a method is false within its own lead. I can't see why anyone would ask Monument for such a thing, but if you do then Monument will now correctly declare it impossible.
- (#31) Output large numbers in a human-friendly way (e.g.
10.3Mrather than10300000). Similar pretty output for the search time (e.g.5m 32.3srather than332.3s)
- (#36) Add
Truth, as abool-like for representing truth in a way that the compiler checks.
- (#38) Rename
NodetoChunkand-D searchto-D no-searchfor clarity - (#37) Add extra integration tests for false method splices (i.e. a splice between mutually-false leads) and half-lead calls.
- (#32) Run CI in debug mode for a small speed gain.
- (#26) Fix off-by-one error when outputting part heads of multi-part compositions
- (#17, #24) Add a guide for the TOML input format (#24 fixes a mistake in the example)
- (#21) Allow course-head masks to be specified per-method
- (#24) Add
examples/andto-complib.pyto the pre-built releases.
- (#26) Add
Row::order, along withRowAccumulator::accumulate_uncheckedandRowAccumulator::pre_accumulate_unchecked.