visit_array buffer
sized to grammar interval count (was series length); could overflow and
segfault when seed >= 0 enabled the
seeded random-search path. Tier-B tests now exercise
seed = 0 on ecg0606.seed = 0);
w150/p7/a4 asserts the top discord is not a zero-distance boundary
gap.\examples{}
on sax_via_window, SAX-VSM bag/TF·IDF helpers, and
cosine_sim; clarify cosine_dist() title and
find_discords_rra() defaults in .Rd files;
Codecov badge URL → app.codecov.io (CRAN incoming
check).NEWS.md in the
tarball; exclude agent audit HTML from builds; refresh
DESCRIPTION summary; roxygen2 8.0.0 metadata.rule_record
by-value), RRA, and cosine_sim (Valgrind-clean on long
runs)._paa2 in-place fractional PAA,
_znorm_slice, unified _sax_via_window path
(~2.3× on bag construction).w_size
z-norm windows (~1.3× on ecg0606); identical results and distance-call
counts.idx_to_letter() validates index range [1,
26]._is_equal_mindist(std::string) in SAX
numerosity reduction; remove unused HOT-SAX state; clarify
cosine_dist() roxygen.Matrix Profile / MASS convention: - znorm now uses POPULATION
standard deviation (divide by n) instead of sample std (n-1). Each
normalized window then has empirical variance exactly 1, the assumption
behind SAX’s equiprobable Gaussian breakpoints. - SAX symbol assignment
maps a value exactly on a breakpoint to the symbol ABOVE the cut
(cuts[j] <= ts[i]), matching the jmotif Java original and saxpy.
Previously a strict < mapped on-cut values to the symbol
below. - PAA: fixed a floating-point boundary bug in the fractional PAA
(_paa2, the public paa() / sax_by_chunking path). The final segment
break paa_num * (len/paa_num) can round above len in IEEE-754
(e.g. 7(29/7) = 29.000000000000004), which dropped the last sample
from the final segment and corrupted its mean on ~5-6% of non-divisible
(n, paa_num) shapes. The final break is now snapped to len, matching the
saxpy / Java fractional PAA. NOTE: all three are behavioral changes –
SAX words for windows whose normalized PAA values fall near a breakpoint
may differ from 1.2.x output. HOT-SAX and brute-force discord
discovery now measure the nearest-neighbour distance on Z-NORMED windows
(the SAX premise of shape similarity): - find_discords_hotsax: the three
internal _znorm() calls had been left commented out, so distances were
computed on RAW subsequences – it reported raw-amplitude outliers
(e.g. ecg0606 pos 411 / 1.50) instead of true z-normed shape discords
(pos 430 / 5.28). The windows are now z-normed and compared with an
early-abandoning Euclidean distance. - find_discords_brute_force now
z-normalizes too and gained an n_threshold parameter
(default 0.01); previously it had no threshold and ran on raw
subsequences. It is again a valid z-normed reference for HOT-SAX. - Both
now use a deterministic lowest-index tie-break and a +/-(w-1) exclusion
zone, so results are reproducible and match saxpy / Java exactly
(ecg0606 top discords: 430/5.279, 318/4.176, 2080/2.393). NOTE:
behavioral change – discord positions/distances differ from 1.2.x, which
reported raw-distance discords.
Pre-release development version.
Added the Re-Pair grammatical inference algorithm implementation.
Added grammatical “rule coverage” curve implementation facilitating a time series anomaly discovery.
Added RRA (Rare Rule Anomaly) algorithm implementation for grammar-based variable length time series anomaly discovery.
Added the HOT-SAX time series discord finding algorithm implementation.
Added the brute-force time series discord finding algorithm implementation based on the early-abandoning Euclidean distance.