docs: record the 2026-09-25 HDF5 audit fixes and open gaps
CI / test-arm64 (pull_request) Successful in 1m21s
CI / test (pull_request) Successful in 5m59s

CHANGELOG: upgrade notes (changed read results for max-shape files,
saturating conversions, new writer errors, format-crate API changes) and
the reader/writer correctness fixes. known-issues: the silent-wrong-data
table with before/after sweep numbers, the gaps still open, and a
correction to the Extensible Array entry, which said files we wrote were
unaffected. CLAUDE.md: clawhdf5-gpu is vector distance computation, not
I/O, and clawhdf5-filters holds only deflate backends (no Blosc).

Also a facade test that libhdf5's 20-bit N-Bit float test data reads as
libhdf5's values.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
osobh
2026-09-25 21:26:56 -05:00
co-authored by Claude Opus 5.5
parent 650f355219
commit 72b9cfb1e1
4 changed files with 206 additions and 5 deletions
@@ -372,3 +372,29 @@ with h5py.File("{path}", "r") as f:
}
}
}
/// libhdf5's N-Bit float test data is stored as a 20-bit custom float
/// (`le_data.h5` from the HDF5 test suite). The N-Bit filter restores the
/// file type's bytes; the typed reader must then decode that layout the way
/// libhdf5 converts it (h5py reads 0.3333435, 0.666687, 1, ...).
#[test]
fn nbit_custom_float_decodes_like_libhdf5() {
let path = concat!(
env!("CARGO_MANIFEST_DIR"),
"/../clawhdf5-format/tests/fixtures/filters/le_data.h5"
);
let f = File::open(path).unwrap();
// Exactly representable in the 20-bit type, so exact in f32 and f64.
let expected = [
0.333343505859375,
0.66668701171875,
1.0,
1.3333740234375,
1.6666259765625,
2.0,
];
for name in ["Nbit_float_data_le", "Nbit_float_data_be"] {
let got = f.dataset(name).unwrap().read_f64().unwrap();
assert_eq!(&got[..6], &expected, "{name}");
}
}