                     Changes in version 0.2.1.9002                      

Fixes affecting ordinary use

  - Fixed reconstruction with exact endpoint restrictions, singleton
    response sets, and fully fixed samples. Restriction names now map to
    unique lattice responses, including decimal names and multi-item
    scales. Saved parameter objects remain supported.

  - Reconstruction consistently accepts rounding ties, checks the final
    candidate and all success invariants, and returns the closest
    observed SD with matching values on failure. Iterations count SD
    adjustments, so an initial match reports zero. Restricted downward
    moves now receive the same gap repair as upward moves.

  - Search stopping rules count every attempt and consecutive duplicate
    correctly, including the final success. Explicit search seeds
    preserve the caller's RNG state. dont_test = TRUE now skips all
    statistical prechecks while retaining input validation.

  - Clarified the singular result's values field and the limits of
    stochastic reconstruction.

  - Fixed distribution plots to retain complete endpoint bars and show
    exact response frequencies, including multi-item scales, gaps, and
    constant distributions. Empty search results now produce a clear
    plotting diagnostic.

  - Corrected precision inference for negative numbers and scientific
    notation, including inference from the SD itself in boundary checks.
    Rounded zero SDs and multi-item constant samples now pass GRIMMER
    when compatible. Floating-point tolerance also prevents false
    rejection at sum-of-squares boundaries on ordinary multi-item
    scales.

  - GRIMMER now consistently honours its return modes and returns
    compatible SD candidates for the tested interval. Empty candidate
    vectors always indicate failure. Each compatible mean is also
    checked against the minimum variance on the response lattice. Added
    quiet controls and clarified that passing this screening test does
    not prove that a sample exists.

  - Corrected GRIM's nearest reported means, including ties, and avoided
    enumerating candidates for logical-only GRIM checks.

Edge cases and input hardening

  - Hardened unusual or invalid inputs: rejected missing flags and
    invalid restriction counts, handled zero requested distributions,
    made .equalish() respect its tolerance, and removed an unused
    constant.
  - For rarely encountered malformed manual data, invalid distribution
    vectors and scalar controls now produce clear errors; density plots
    reject distributions with fewer than two distinct responses.
  - Stabilised SD bounds and GRIMMER calculations for scales with
    unusually large offsets. Reconstruction also retains numeric
    restriction targets and compares lattice positions to prevent
    precision loss on these scales.
  - Tightened validation of finite statistics, positive counts, scalar
    flags, explicit precisions, and ordered integer scale bounds.
    Undefined boundary ranges consistently return two numeric missing
    values when requested. Extremely large arithmetic or candidate
    enumerations now fail explicitly.

Maintenance

  - Fixed workflow syntax and enabled package checks on pull requests.
    Documentation is committed only after successful checks on branch
    pushes. These changes improve release checks and do not alter
    statistical results.

Earlier development changes

  - Changed implementation of GRIM_test() to more direct calculation
    rather than iterative check to increase transparency and efficiency.
    If requested to return the nearest possible means, the function now
    also correctly returns two values if there are two equidistant
    values. (For users wishing to use the original algorithm, it is
    presently retained as an unexported function that can be called with
    rsprite2:::GRIM_test_old().)
  - Changed implementation of GRIMMER_test() to account for the fact
    that multiple exact means may be compatible with the reported means,
    if the mean is reported to a lower precision than the standard
    deviation. The previous version missed some valid SDs in this rare
    case. Also optimised the implementation of the algorithm to catch
    special cases explicitly and run a lot faster.
  - Added a boundary_test() function that tests whether a standard
    deviation is within the possible range. This tests was already part
    of GRIMMER, but is now exported and separately documented for
    transparency. The underlying function to calculate SD limits now
    also accounts for various rounding choices for values ending in .5,
    i.e. up, down or to even, to reduce the risk of false positives, and
    is vectorised to increase speed.

                     Changes in version 0.2.1.9000                      

  - Bug fixed in the boundary test, ensuring that SD limits are
    calculated correctly even when the mean is on (or very near) the
    scale limits.
  - Removed potential issue with floating point imprecision in the
    GRIMMER_test() function, which could lead to false positives in some
    cases.

                 Changes in version 0.2.1 (2023-07-06)                  

  - GRIMMER_test() now supports multi-item scales, as Aurélien Allard
    kindly extended his algorithm

                 Changes in version 0.2.0 (2022-09-27)                  

  - Added GRIMMER test (GRIMMER_test()) to catch impossible standard
    deviations, using the algorithm developed by Aurélien Allard

                 Changes in version 0.1.0 (2021-09-22)                  

  - Ported SPRITE algorithm from rSPRITE 0.17 by Nick Brown
  - Added support for multi-scale responses, inspired by pySPRITE
  - Added support for more complex restrictions, including minimum
    frequencies
  - First submission to CRAN

                        Changes in version 0.0.0                        

  - set_parameters does not consider the restrictions provided when
    running the GRIM test. Doing so would help to catch some impossible
    restrictions at this stage.
