                 Changes in version 1.0.0 (2026-10-14)                  

New features

  - smr_alloc() generates allocation sequences by Sandwich Mixed
    Randomization (SMR), with the three generation paths of the
    methodology paper:
    
      - Path 1: N < 4 * ratio_sum — complete randomization in one block;
      - Path 2: n1 + permuted blocks with varying sizes + n1 — the full
        sandwich;
      - Path 3: N == 2 * n1 — head and tail blocks only.

  - The head-block size n1 is always sampled at random (no need to
    pre-specify it, and no fixed n1 override is accepted).

  - The imbalance is the spread of the deviations from the target
    allocation (spread = max_g(dev_g) - min_g(dev_g)), which equals the
    between-group count difference for 1:1 and is zero for an exactly
    proportional block.

  - smr_streams() derives non-overlapping L'Ecuyer-CMRG sub-streams from
    one base seed, so high-frequency loops never re-use the same random
    numbers.

  - smr_reproduce() regenerates a sequence from its stored
    specification.

  - smr_verify(), smr_balance(), smr_blocks(), smr_imbalance(),
    smr_spread() and smr_simulate() provide verification and
    diagnostics.

  - smr_correct_guesses() and smr_pcg() evaluate allocation
    unpredictability with the Blackwell-Hodges proportion of correct
    guesses; smr_simulate() now reports this alongside the imbalance
    metrics.

  - smr_rtf() and smr_write_csv() release the list, honouring
    keep.blocks for ICH E9 / GCP compliance.

Notes

  - This package is an optimization and refactor of the earlier
    sandwichrand package and of the SAS macro SanMR2. The changes focus
    on (i) random head-block size, (ii) the spread-based imbalance
    measure, (iii) independent per-call random streams, and (iv) a
    cleaner and faster core.
