Skip to content

ACEAPEX 2.4.0

Choose a tag to compare

@yasha1971-coder yasha1971-coder released this 28 Oct 01:37
· 84 commits to main since this release
d6c504e

ACEAPEX 2.4.0 — 2026-10-28

The FAST profile: the ACEPX2 container without an entropy stage. Independent 1 MiB blocks, a fixed-width token
stream, one decoder that is safe by construction, the same archive for the C++ library, the C99 decoder and the
Python package. Default-profile archives are unchanged byte for byte. Specification: docs/FORMAT_FAST.md.

What changed

  • Header version 3 under the same magic; profile and min_match in the header; u64 block table; blocks of
    u32 tokens (literal length 6 bits, match code 6 bits, distance 20 bits), extensions, literals, a 64-byte pad.
  • Levels 11..18 (--profile fast --level 1..8): minimum match 16 / 12 / 8 / 5, greedy-lazy parse; 15..18 the same
    with an optimal parse. The minimum match is the level's one knob and it is read from the header.
  • One decoder: exact-size buffers, the fast path only while a token fits in the output and the literal read lands in
    the pad; no second "unsafe" decoder. scripts/fast_fuzz.cpp (ASan/UBSan) in make test with a negative control.
  • Readers: aceapex_decompress[_mt], _region, _ranges, _stream, the CLI (c, d, d --out -, pipes, r,
    faidx), axdec, libaceapex_decode.so, pip install aceapex. Not in 2.4.0: GPU (E_HEADER),
    aceapex_decode_streams (ACEAPEX_ERR_DATA).
  • Five new conformance fixtures (verify/fixtures/conf/*_fast_*), six new claims (scripts/fast_test.sh).

Numbers (ace-core: AMD EPYC 4344P, 8 cores / 16 threads; scripts/fast_bench.sh)

aceapex t --level L --threads T: encode on T threads, then 7 decodes of the in-memory archive, median; every run
compared with the input. Tables: results/fast-bench-2026-10-27-9f8a4ab.md (levels 11 and 12: b000c99 gives these
levels the decoder variant of 9f8a4ab) and results/fast-bench-2026-10-27-0d3a065.md (levels 13-15).

corpus level min match ratio (%) encode MB/s (8 T) decode 1 thread MB/s decode 8 threads MB/s
silesia.tar 11 16 61.35 176.09 10877.14 16644.56
silesia.tar 12 12 54.13 167.14 9777.05 17080.82
silesia.tar 13 8 44.95 164.16 8802.73 17382.81
silesia.tar 14 5 40.68 169.84 7125.30 17558.03
silesia.tar 15 16 (optimal) 55.36 8.02 10285.72 16746.69
chr1.fa 11 16 91.44 1269.25 12756.01 18536.63
enwik9 11 16 78.76 296.00 10617.25 15375.65

lzbench, the published single-thread method (-t8,8 -o1c4, one pinned core, median of 7 runs, same binary): a clean
lzbench 2cc81a8 after scripts/lzbench_sync.sh (no manual edits), codec aceapex_fast levels 1 / 2 = levels 11 / 12,
started at load average 0.08 / 0.60 / 0.88 (results/fast3-lzbench-2026-10-28.log):

codec ratio decompress MB/s compress MB/s
aceapex -11 61.35 % 10 956 25.9
aceapex -12 54.13 % 9 840 24.5
zxc 0.15.0 -1 61.67 % 10 636 1 016
misa77 0.6.0 -1 42.64 % 9 604 121

Research numbers of the same layout before the release, same host and method (research/fastblk/d1-lzbench-2026-10-26.md,
research/fastblk/d1b-lzbench-2026-10-27.log): min match 16 at 61.34 % decoded 11 523 MB/s (unsafe decoder) / 10 535 (research safe
decoder) against zxc -1 at 61.67 % and 10 634 MB/s. The release decoder (safe by construction) lands at 10 956 MB/s:
4.9 % below the research unsafe decoder, 4.0 % above the research safe one, 3.0 % above zxc -1 in the same binary.

Where it loses

  • Ratio: silesia at min match 16 is 61 % of the input; the default profile is 32.6 %. Genomes: no DNA transform.
  • Encoder: 25-28 MB/s on one core at levels 11-14, ~1 MB/s at 15-18 (TurboBench's rank weighs compression speed).
  • GPU: not in 2.4.0.

Check it

make test (claims head_fast_*), bash scripts/fast_test.sh, bash scripts/fast_bench.sh. Fixtures and
their inputs: scripts/make_fixtures.py --regen --only text_fast_200K,rand_fast_70K,zeros_fast_1500K,dna_fast_opt_2MiB,rand_fast_7B.

Binary

aceapex-2.4.0-linux-x86_64.tar.gz (static, x86-64-v2, zstd 1.5.7; scripts/package_linux.sh). Built on bd3e2c4 (VERSION inside the tarball): between it and the tag only logs, text (README, docs moved by #5) and two GPU measurement scripts from #6 (scripts/gpu_hash_ab.cu, scripts/colab_hash_ab.sh, not part of the CLI) changed; the sources of the binary are the same.

f2e6810612dd6dcc4e0f185cf8590811149dcd1423786ad1ca240c180e7eb577  aceapex-2.4.0-linux-x86_64.tar.gz
b9e88f1340a5cf17bdaaeeb7a37d6a5a4767ef9a6482c2ef0fa43b273f1e557d  aceapex (binary inside the tarball)