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.
  • 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.
  • GRIMMER_test() now supports multi-item scales, as Aurélien Allard kindly extended his algorithm
  • 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
  • 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.