Skip to content

chore(main): release nyxus 0.12.0 - #380

Open
github-actions[bot] wants to merge 1 commit into
mainfrom
release-please--branches--main--components--nyxus
Open

github-actions[bot] wants to merge 1 commit into
mainfrom
release-please--branches--main--components--nyxus

Conversation

@github-actions

@github-actions github-actions Bot commented Jul 17, 2026 •

Copy link
Copy Markdown

🤖 I have created a release beep boop

0.12.0 (2026-10-22)

⚠ BREAKING CHANGES

  • omezarr: OME-Zarr support now requires z5 3.0.1 and C++20; xtensor/xsimd are no longer used.

Features

  • add 2D test coverage for touch and morphology feature families (3f576d9)
  • add IBSI Intensity Histogram features, per-bin HISTOGRAM output, and --mergerois (5b517f4)
  • add unittest coverage to all 214 3D features, labeling tests with clear ground truth (b89a9ac)
  • Benchmark area fix (#345) (b532f21)
  • helpers: add ceil_pow2 (tight next power of two) (d0992dc)
  • hounsfield: --preserve-hu CT/Hounsfield intensity preservation (1b5667f)
  • hounsfield: keep HU offset base at scanned slide min under fp-options; enable bare CLI --preserve-hu (43f8063)
  • hounsfield: wire --preserve-hu through the 3D NIfTI loader (65c9ad9)
  • io: add the OME metadata, plane addressing and out-of-core machinery (e500077)
  • io: read every pass through one streamed path, addressed by channel and timeframe (773ea75)
  • io: stream oversized 3D volumetric ROIs out-of-core across all texture families (04857e2)
  • omezarr: migrate to z5 3.0.1 ArrayView API, drop xtensor (225b9b9)
  • re-organize and create complete implementation unit test coverage for 492 2D features (#346) (011df60)
  • vetting: check_coverage CLI (--check/--write) + drift guard (0ad65ee)
  • vetting: check_coverage registry load + schema/token validation (44d2bfa)
  • vetting: coverage stats + markdown report generation (0f85581)

Bug Fixes

  • 2d zernike: seed the angular tables at repetition 0, not 1 (2eb3cc3)
  • 3d gldzm: hold the ROI mark in the distance cube, and index the vetted features (334936c)
  • 3d gldzm: keep a ROI voxel whose grey level is zero, and say what the family costs (ea9dd3a)
  • 3d gldzm: over the ROI, at 26-connectivity, at the IBSI distance (cf5d971)
  • 3d gldzm: refuse an out-of-core box whose border distance outgrows its 16-bit buffer (2eed988)
  • 3d morphology: compute 3MESH_VOLUME out-of-core too, and keep 3AREA as on main (d457455)
  • 3d morphology: hull the mesh vertices, and sum both volumes exactly (8cbe064)
  • 3d morphology: integrate the ROI surface mesh, and build the hull in double (9b9be52)
  • 3d morphology: make the convex hull exact on lattice voxels (8b7ba7c)
  • 3d ngtdm: default the neighbourhood radius so the family is not NaN (53b04b5)
  • 3d-ngldm: DCNU/DCNUN summed the wrong marginal (== GLNU) (d3198e5)
  • 3d-shape: correct mislabeled axis lengths + vet 7 morphology features (0af100b)
  • 3d: compute 3ROBUST_MEAN (was hardcoded 0) + vet 18 3D first-order features (79d0974)
  • anisotropy: measure an oversized 2D ROI's geometry on the resampled ROI (933d243)
  • anisotropy: measure intensity and texture on the voxels as acquired (62a0f88)
  • anisotropy: measure the intensity-weighted 2D geometry on the pixels as acquired (3949f10)
  • anisotropy: size an anisotropic whole slide for its pass as acquired (427fa9c)
  • anisotropy: split the 2D passes by feature method, and carry on past an emptied ROI (10b346e)
  • audit and fix 2D feature tests 1/n (c5cf260)
  • caliper: correct Martin/Nassenstein diameters + vet 12 features vs imea (bc3e92a)
  • caliper: float-precision hull rotation + address PR #381 review (3377183)
  • categorize and name feature unit tests and expected values (d854679)
  • chords: correct max-chord angle index and all-chords histogram source (bd9a930)
  • cleare state and start fresh to avoid random test failure. (495f05c)
  • convex-hull: Pick's-theorem hull area so SOLIDITY <= 1 (0319932)
  • emit per-bin HISTOGRAM values in arrow/parquet output (01ac9c2)
  • feature settings: resolve a feature's settings by its dynamic type (981add1)
  • feature settings: resolve the oversized 3D pass's settings by the dynamic type (2828f8f)
  • feature_mgr: extend check_11_correspondence() to Feature3D (b188e50)
  • feature_mgr: loop 3D correspondence check from Feature3D::FIRST (9287f3c)
  • fractal-dim: adaptive box counting and a clean divider perimeter (c981743)
  • fractal-dim: address PR review comments (98a4f2d)
  • fractal-dim: align the ROI to the box-counting grid (98e53ec)
  • fractal-dim: mean log-log slope for box-count, Richardson D for perimeter (af37142)
  • gabor: keep filter-response magnitudes real-valued, then vet GABOR vs scikit-image (2b2c7d7)
  • glcm: default co-occurrence offset to 1 and exclude background (02c5a75)
  • glcm: normalize HOM2/ENTROPY by sum_p (2D+3D) + fully oracle-vet GLCM (60a1ebb)
  • gldm: exclude background from the dependence matrix (f1f8eb4)
  • gldzm: build zones from the full 8-neighbourhood (fc0bbde)
  • handle multi-valued HISTOGRAM in buffer output (Python pandas/arrow) (246f4dd)
  • hexagonality,lstsq: use std::abs so gcc/Linux doesn't truncate doubles to int (88a6f53)
  • imq: average LOCAL_FOCUS_SCORE over every tile, and return on a thin ROI (feb8603)
  • imq: correct FOCUS_SCORE overflow + abs()-variance, vet 4 imq features vs OpenCV and CellProfiler (7eed701)
  • imq: score oversized ROIs like in-RAM ones and give a thin ROI the soft-NaN (76c0b59)
  • intensity_histogram: report IH_ROBUST_MEAN_IDX as a 1-based bin index (0527f48)
  • intensity: keep a header-rescaled slide's stored integers, and carry the rescale in the inverse (c79c822)
  • intensity: make the recorded map match what the loaders actually store (ce5f74b)
  • intensity: mirror the loaders' upper clamp, and survive degenerate input (6bf9735)
  • intensity: one narrowing for every load-time map, saturated at both ends (ed36627)
  • intensity: report first-order features in the slide's own intensity domain (1a4e956)
  • intensity: restore the HU rounding, and finish the guards it skipped (b243ff5)
  • intensity: settle a slide that measured nothing, and close the last unguarded cast (f25d7e1)
  • io: read compressed striped TIFFs past the first strip, and refuse a failed scanline (a02393a)
  • io: refuse an unsupported file type at every loader dispatch (fe5586b)
  • io: refuse the complex TIFF sample formats in all four loaders (b413ffd)
  • io: release the pair an image loader holds when it opens another (71aa025)
  • io: stream a single-ROI mask's whole foreground, and fail a pair whose out-of-core feature fails (9e24e70)
  • io: write the CLI test's volume fixture as Z-planes, not RGBA (e06fc2f)
  • issue 327 single roi polus (#330) (03eeb0c)
  • loader: clamp negative signed-int pixels so int16 CT doesn't wrap to a huge unsigned value (fac1bac)
  • make imagecodecs PIP_ONLY_BINARY (b5fa20a)
  • migrate build_and_test from macos-15-intel to macos-14 (ac70de1)
  • mitigate exposed bug due to incorrect reading of bx in 3d_surface (24d18ee)
  • moments: correct Hu invariant h5/h6 formulas (9x bracket, stray +eta03) (73f6ca8)
  • moments: use fractional centroid in 2D central moments (drop (int) truncation) (5cbf94a)
  • morphology: geodetic length/thickness from real perimeter (was size_t-truncated) (ce7716f)
  • morphology: report ROI radii as distances, taken exactly (5bb289b)
  • neighbors: exact min distance for the touch/radius test (PERCENT_TOUCHING) (92de774)
  • neighbors: implement closest-neighbor dist/ang and cap PERCENT_TOUCHING (4322c88)
  • nested: carry every non-feature column into the nested-ROI table (f60d8d0)
  • ngldm: compute the 3D NGLDM over the ROI, over 26 neighbours, at the IBSI dependence count (558aa79)
  • ome: read only named TIFF extensions and keep X and Y units apart (8ec6b03)
  • ome: refuse a plane count past size_t and a non-object Zarr axis (9dada69)
  • omezarr: say why a store will not open, and where its image is (455c13a)
  • ooc: make the 2D out-of-core feature paths match the in-RAM path (9a9ad02)
  • python: release an instance's Environment so a recycled id() cannot inherit it (6dd550f)
  • remove redundant calculations and avoid flushing valid old values (cdf48cf)
  • review comments on PR 352 (ec42edc)
  • roi buffers: refuse a pixel outside the box that sizes its buffer (2273638)
  • stop featurize() mutating its shared default name lists (372172e)
  • upgrade Docker build to CUDA 12.6 and Python 3.11 (80b548d)
  • use raw docstrings to silence invalid escape sequence SyntaxWarning (e3bf05c)
  • vetting: band the 3D GLSZM entropy pin for a platform, not for a machine (ab8573e)
  • vetting: correct radial follow-up records (7c4657a)
  • vetting: let the NGTDM coverage scanner read one-line TEST registrations (51df88e)
  • vetting: normalize oracle_coverage.csv to LF, drop dead current_test notes (7dc26ed)
  • vetting: write every generated CSV and report with LF (91eb35e)

Performance Improvements

  • 3d gldzm: gather the ROI's mark and grey levels in one pass (c37f58b)
  • imq: read the out-of-core focus-score image a row at a time (d418b9d)
  • io: decode each row of a striped TIFF once per tile-row scan (c1bacd1)
  • morphology: read ROI radii from a distance transform where it is cheaper (14a67eb)
  • ngldm: build the 3D NGLDM from the ROI's voxels, in one pass for the mask and grey levels (685da53)
  • omezarr: open the z5 dataset once, not per tile (9b36f84)

Documentation

  • 3d gldzm: record what the retired coverage sweep checked, and what it did not (483dbbc)
  • 3d morphology: compare 3MESH_VOLUME with PyRadiomics MeshVolume (75a2ea7)
  • 3d morphology: correct the PyRadiomics mesh comparison (69fb83d)
  • 3d morphology: correct the PyRadiomics mesh comparison for orientation and spacing (202f9f9)
  • 3d morphology: tighten the PyRadiomics mesh comparison (4ea101d)
  • 3d ngldm: say what the generator verifies, and what the Ns agreement proves (9310932)
  • add CLAUDE.md codebase and workflow guide (e301fe6)
  • answer the second review of the pages, scripts and registry (f3f54c3)
  • api: rewrite the Python docstrings in numpydoc style and check them against the code (c76f641)
  • build: build the site without the compiled extension and fail CI on warnings (1ded975)
  • caliper: correct inaccurate/stale comments (no code change) (cc5b4de)
  • CLAUDE: add git workflow and tests/vetting conformance rules (a548b57)
  • CLAUDE: address PR #388 review — C++20; agentic git workflow (466c038)
  • CLAUDE: address PR #388 review — generalize paths, drop z5py pin, add no-local-paths rule (4235e0c)
  • cli: generate the command-line reference and correct the usage pages (428b1f8)
  • correct the pages, scripts and registry rows named in review (2c2f295)
  • devguide: rewrite the developer guide and correct the project notes (8fccc2b)
  • features: add the 3D intensity, shape and texture pages (c92ac6b)
  • features: generate the feature list, the groups and the family indexes (91c3573)
  • features: rewrite the 2D intensity, histogram and image quality pages (e2b0286)
  • features: rewrite the 2D morphology, erosion, fractal and radial pages (3cd4a4d)
  • features: rewrite the GLCM, GLRLM and GLSZM pages (0eaa6f3)
  • features: rewrite the GLDM, GLDZM, NGLDM and NGTDM pages (0a87b6e)
  • features: rewrite the moments, Zernike and Gabor pages (cb7616e)
  • guide: add IBSI mode, validation and troubleshooting pages (dde7609)
  • imq: say in the matrix that this pass vets the in-RAM paths only (1591760)
  • io: describe the supported formats, the output and the shared conventions (9c2e03b)
  • io: state the strip band's memory footprint and that ram_limit omits it (ab01215)
  • link the known defects to their issues (8b23ce6)
  • morphology: describe the ROI radius features rather than the change to them (edb9f5d)
  • readme: slim the README and add the entry pages (494352d)
  • scale: document large images, volumes and GPU acceleration (2daf705)
  • test: correct IQR/QCoD _IDX framing — discrete percentile is IBSI-conformant, not a bug (29214ba)
  • tests: add vetting audit baseline, fraclac oracle, and README (e5232c0)
  • tests: box-count golden is FracLac-vetted, not a self-consistency pin (8ccc76b)
  • tests: neighbor features are partly tool-vetted (CellProfiler), not analytic-only (7910549)
  • tests: oracle tool local-setup research (TOOLS.md) (65e0b79)
  • tests: spec for the oracle-vetting test framework (f44ff25)
  • vetting: add skimage to the SPEC 4 oracle-token set (3ee1dfd)
  • vetting: add the 2D morphology CellProfiler vetting report (9d0db5f)
  • vetting: add the missing radial config matrix (fe4ef56)
  • vetting: audit the 2D GLCM goldens against fresh oracle runs (0484103)
  • vetting: audit the 2D GLRLM goldens against fresh oracle runs (67f24ed)
  • vetting: correct 3D first-order oracle accounting (f6ad06a)
  • vetting: correct split to 16 ibsi + 4 analytic; file IQR_IDX flooring bug (726b082)
  • vetting: correct the 3D NGLDM report's file-inventory claim, and widen the generator's shift (1a762a1)
  • vetting: correct what the 3D first-order MATLAB oracle backs (2ccd560)
  • vetting: design for IBSI-vetted IH dispersion/index tests (07b1b75)
  • vetting: drop the references to the deleted 3D morphology MATLAB header (071b52d)
  • vetting: fix stale token count in plan example (16 ibsi + 4 analytic) (3255fef)
  • vetting: give the constant-ROI cell a SPEC disposition, not an invented one (834e59d)
  • vetting: give the neighbour rows a tier, a test name, a benchmark and a matrix (7981b2a)
  • vetting: implementation plan for IBSI-vetted IH dispersion/index tests (4dfb1ff)
  • vetting: lead the 3D first-order report with the current state (004bfc5)
  • vetting: lead the 3D first-order report with the current state (25c57f2)
  • vetting: migration map + seeded oracle_coverage.csv (Phase 1, no code changes) (77f3d07)
  • vetting: name BasicMorphologyFeatures as MASS_DISPLACEMENT's producer (d33a168)
  • vetting: name Octave wherever the matlab oracle is presented (d70e3fe)
  • vetting: narrow what the 3D coverage sweep asserts that nothing else does (2a75d34)
  • vetting: point the IMQ mechanics-guard comment at scan_other_tests (bb1981c)
  • vetting: record licensed 2D first-order provenance (06ad1be)
  • vetting: record licensed 2D morphology provenance (3d039d6)
  • vetting: record reconciled IBSI IH phantom config + index base (99df244)
  • vetting: record the 2D GLDM audit (3ee009d)
  • vetting: record the 2D GLDZM audit (f29924d)
  • vetting: record the 2D GLSZM audit (176476a)
  • vetting: record the 2D neighbour audit (50d0ff8)
  • vetting: record the 2D NGTDM audit (23c609f)
  • vetting: record the 3D GLDM default cell and the degenerate ROI it discards (12ef315)
  • vetting: record the 3D GLDM recipes, matrix, benchmarks and audit (cac4e99)
  • vetting: record the 3D GLSZM audit, its recipes and its benchmark (33e0fbe)
  • vetting: record the 3D NGTDM audit, its recipes and its benchmark (55d5e90)
  • vetting: record the config scope of the gldm promotions (7 are mode-invariant) (0780912)
  • vetting: record the config scope of the glrlm promotions (285bc39)
  • vetting: record the config scope of the glszm promotions (c4bb8b1)
  • vetting: record what the 3D GLSZM review round measured (b7126de)
  • vetting: resolve missing oracles via deep-dive research (Phase 2) (2fa0515)
  • vetting: resolve the Phase-2 reconciliation decisions (SPEC 6) (8b45ddd)
  • vetting: retract unproven 3D NGLDM "ibsi" promotions; document MIRP disagreement (b924f8e)
  • vetting: scaffold matrix/ and oracles/gen_ conventions (GLCM example) (61fdc66)
  • vetting: seed config_recipes.md (b64c82b)
  • vetting: separate unproven provenance from unreproducible provenance (058cb00)
  • vetting: update golden_regen doc for the flat rel=1e-8 tolerance (f84773f)

Code Refactoring

  • 3d surface: describe the eigenvalue ordering rather than the defect it replaced (34a74c2)
  • address PR #351 review nits (c623405)
  • feature settings: key the settings registry by std::type_index (9381158)
  • tests: route fractal fixture through the shared masked-loader helper (050e672)

Build System

  • arrow: require Boost for Arrow instead of Z5 (43a584f)

Continuous Integration

  • release-please: use manifest config so 0.x breaking = minor, and pin 0.12.0 (a500bd9)

This PR was generated with Release Please. See documentation.

@github-actions
github-actions Bot force-pushed the release-please--branches--main--components--nyxus branch 8 times, most recently from c247198 to a53d4d8 Compare July 22, 2026 04:31
@github-actions
github-actions Bot force-pushed the release-please--branches--main--components--nyxus branch 9 times, most recently from 43791c2 to 58c38f4 Compare August 10, 2026 16:27
@github-actions
github-actions Bot force-pushed the release-please--branches--main--components--nyxus branch 7 times, most recently from 1e5be3e to 9d826ee Compare August 14, 2026 15:40
@github-actions
github-actions Bot force-pushed the release-please--branches--main--components--nyxus branch 5 times, most recently from cffbea0 to f58fe14 Compare August 21, 2026 14:42
@github-actions
github-actions Bot force-pushed the release-please--branches--main--components--nyxus branch 11 times, most recently from cad856b to 4e1b43b Compare September 2, 2026 14:12
@github-actions
github-actions Bot force-pushed the release-please--branches--main--components--nyxus branch 4 times, most recently from d2b8708 to f9166c0 Compare September 16, 2026 17:05
@github-actions
github-actions Bot force-pushed the release-please--branches--main--components--nyxus branch 3 times, most recently from 96e84f3 to 776d0c9 Compare September 21, 2026 16:22
@github-actions
github-actions Bot force-pushed the release-please--branches--main--components--nyxus branch 8 times, most recently from 3477a8d to a03ad37 Compare October 7, 2026 14:45
@github-actions
github-actions Bot force-pushed the release-please--branches--main--components--nyxus branch 3 times, most recently from 9785711 to 459f9c8 Compare October 14, 2026 20:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants