Skip to content

Changelog

All notable changes to nltools are documented here.

Unreleased

Features

  • Feature Implement efficient copying for method chaining (~80% performance improvement)
  • Feature Add backend abstraction for CPU/GPU operations
  • Feature Add ridge regression algorithms with SVD decomposition
  • Feature Add cluster thresholding to Brain_Data.threshold() method
  • Feature Complete ridge regression test suite (Cycles 2.2 & 2.3)
  • Feature Migrate apply_mask to nilearn for better performance
  • Feature Implement BaseModel and Ridge model classes with GPU support
  • Feature Extract HyperAlignment class from align() function
  • Feature Add Glm model class wrapping nilearn FirstLevelModel
  • Feature Add CLI-based benchmarking with dry-run and progress tracking
  • Feature Add sklearn-style fit/predict API and deprecate regress()
  • Feature Add cross-validation support to Brain_Data.fit()
  • Feature Polars migration TDD scaffolding for Design_Matrix
  • Feature Implement DesignMatrix Phase 1 - Construction and basic operations
  • Feature Implement DesignMatrix Phase 2 - Statistical operations
  • Feature Implement DesignMatrix Phase 3 - HRF convolution
  • Feature Implement DesignMatrix Phase 4 & Phase 5a/5b - Polynomials and basic append
  • Feature Implement DesignMatrix Phase 5c - Polynomial separation (multi-run support)
  • Feature Implement DesignMatrix Phase 6 - Diagnostics (VIF and clean)
  • Feature Complete DesignMatrix Polars migration - Phase 7 (Utilities)
  • Feature feat(polars): Complete DesignMatrix Polars migration with GLM integration
  • Feature Implement 2-tier testing strategy with 16× speedup
  • Feature Complete file_reader integration with DesignMatrix methods
  • Feature Complete Polars DesignMatrix integration - fix Adjacency.regress()
  • Feature gpu acceleration one-sample test
  • Feature GPU-accelerated inference module with clean architecture
  • Feature Add GPU-accelerated correlation permutation test module
  • Feature Add Spearman and Kendall correlation metrics to correlation module
  • Feature Add matrix permutation test (Mantel test) module
  • Feature Add GPU-accelerated Intersubject Correlation (ISC) module
  • Feature add three user-requested enhancements for v0.6.0
  • Feature Add BrainCollection class for multi-subject data
  • Feature Add group inference and transformation methods
  • Feature Add searchlight neighborhood caching infrastructure
  • Feature Add ISC computation methods
  • Feature Add isc_test() for permutation testing
  • Feature Add GLM/Ridge workflow helper functions
  • Feature Add cortical flatmap visualization
  • Feature Add BrainCollection.fit_glm() for group-level GLM
  • Feature Add BrainCollection.fit_ridge() for group encoding models
  • Feature Add compute_contrasts() and select_feature() methods
  • Feature Change fit_ridge() default output to CV scores
  • Feature Unified predict() API for timeseries and MVPA decoding
  • Feature Add tests for map(axis=1), isc_test, and ISC ROI extraction
  • Feature Add unified BrainCollection.fit() API matching BrainData
  • Feature Add Phase 2 tests and docs for BrainCollection.fit() API
  • Feature Add workflow integration tests (MVPA, Group Inference, ISC)
  • Feature Add MNI-aligned VTC masks and update ISC tests
  • Feature Add RSA workflow tests
  • Feature Add SRM workflow validation tests
  • Feature Add cross-subject pooled decoding test for SRM workflow
  • Feature Add pipeline infrastructure for fluent CV and Pool API (Phases 1-6)
  • Feature Add alignment pipeline step for SRM/HyperAlignment (Phase 7)
  • Feature Add Phase 8 terminals and advanced CV (ISC, RSA, Permutation, Nested CV)
  • Feature Refactor BrainData.predict() to use Pipeline infrastructure (Phase 9)
  • Feature Add LocalAlignment stub for Phase 1 (nltools-oqil)
  • Feature Implement LocalAlignment Phase 1 with searchlight alignment (nltools-oqil)
  • Feature Add piecewise scheme support to LocalAlignment (nltools-oqil.4)
  • Feature Add generator-based batching to LocalAlignment (nltools-pc2i)
  • Feature Add CPU parallelization to LocalAlignment (Phase 3)
  • Feature Add GPU/Backend integration to LocalAlignment (Phase 4)
  • Feature Add BrainCollection.align() for functional alignment (Phase 5)
  • Feature v0.6.0 prep - LocalAlignment complete, GH issue reconciliation
  • Feature Add explicit tail options for MCP-compatible p-values (GH #315)
  • Feature Complete P1 API improvements for v0.6.0
  • Feature Complete P2 API improvements for v0.6.0
  • Feature Add type annotations and pipe() tests for v0.6.0 P2 items
  • Feature Support unequal sample counts in SRM and LocalAlignment (GH #410)
  • Feature add verbose parameter to standardize() to suppress sklearn warnings
  • Feature rewrite GLM tutorial and auto-detect duplicate intercept in add_poly
  • Feature restore BrainData.ttest / add ttest2
  • ⚠ Breaking Feature replace parallel kwarg with device on user-facing methods

    • Breaking: BrainCollection.{permutation_test,permutation_test2,isc,isc_test,align} now take device='cpu'|'gpu' and n_jobs, instead of the old parallel='cpu'|'gpu'|None. Use n_jobs=1 for single-threaded execution. Returned dict key 'parallel' renamed to 'device'.
    • ⚠ Breaking Feature standardize progress flag to progress_bar; default False

    • Breaking: All show_progress kwargs across BrainData, BrainCollection, and their submodules renamed to progress_bar. Defaults flipped from True to False to match scikit-learn convention. verbose retained where it controls log-level output (sklearn warning suppression in standardize, info prints in DesignMatrix.clean/append).

    • ⚠ Breaking Feature standardize algorithm-choice kwarg to method

    • Breaking: rename algorithm/icc_type/extract_type/scheme/kind/noise_model/mode to method on user-facing BrainData, Adjacency, BrainCollection methods. Adjacency.similarity perm_type renamed to permutation_method to avoid collision with metric. Algorithm-layer APIs (CVScheme.scheme, Glm.noise_model, compute_icc_voxelwise.icc_type, LocalAlignment.scheme) retain their names; the class facades translate at the boundary. predict.estimator unchanged (would collide with existing method= on that signature).

    • ⚠ Breaking Feature rename plot thr_upper/thr_lower to upper/lower

    • Breaking: BrainData.plot now accepts upper/lower (matching the canonical threshold method signature used across BrainData/Adjacency/BrainCollection) instead of thr_upper/thr_lower. The convenience scalar threshold kwarg is unchanged.

    • ⚠ Breaking Feature standardize permutation count kwarg to n_permute

    • Breaking: Adjacency.generate_permutations now takes n_permute instead of n_perm, matching the convention already used in Adjacency.similarity, plot_silhouette, stats_label_distance, and BrainCollection.isc_test/permutation_test[2]. BrainCollection.align's n_iter stays (optimizer iterations, not permutations).

    • ⚠ Breaking Feature flip similarity diagonal flag to include_diag

    • Breaking: Adjacency.similarity now takes include_diag=False instead of ignore_diagonal=False. The polarity is flipped to match Adjacency.distance's kwarg, AND the default is changed: self-similarity on the diagonal is trivially 1.0 and uninformative, so directed matrices now exclude it by default. Symmetric matrices never store the diagonal, so this is a no-op for them.

    • ⚠ Breaking Feature rename user-facing radius kwargs to radius_mm

    • Breaking: All user-facing radius kwargs taking a sphere/searchlight radius in millimeters are renamed to radius_mm for unit clarity.

    • Feature restore legacy h5 read support for nltools <= 0.5.1 files
    • Feature add load_haxby_example offline demo dataset
    • Feature append(axis=1) accepts pandas/polars DataFrames
    • Feature construct from a numpy array + explicit mask
    • ⚠ Breaking Feature ttest returns {mean, t, z, p} uniformly

    • Breaking: the returned dict keys have changed. Parametric callers that read result["t"]/result["p"] continue to work unchanged. Permutation callers previously got {"mean", "p"} — "p" still works, and "mean" still works; no keys were removed.

    • Feature compute_contrasts(contrast_type="all") + glm_ docs
    • ⚠ Breaking Feature load from BIDS file paths + rename polys→confounds

    • Breaking: - nltools.io.onsets_to_dm and nltools.io.file_reader are removed. Use DesignMatrix(path, run_length=N, TR=t) (or events_to_dm for in-memory frames) + explicit .convolve(). - DesignMatrix.polys → DesignMatrix.confounds (attribute + init kwarg). DesignMatrix.vif(exclude_polys=) → exclude_confounds=. DesignMatrix.clean(exclude_polys=) → exclude_confounds=. - DesignMatrix.write() to HDF5 stores confounds metadata attr (was polys). No DM HDF5 reader exists, so no legacy files to migrate.

    • ⚠ Breaking Feature lazy-fetch niftis from HF dataset

    • Breaking: huggingface-hub is a new runtime dep. First template access requires network. Wheel no longer ships niftis. Missing-file exception changed from FileNotFoundError to huggingface_hub.errors.EntryNotFoundError (LocalEntryNotFoundError when offline-and-uncached). Pyodide async path is a NotImplementedError stub for now.

    • ⚠ Breaking Feature default model='glm' in fit(); tighten validation

    • Breaking: Error type for unknown model changed from ValueError to TypeError. Calls passing model=None previously raised TypeError("model must be provided"); now they succeed using glm.

    • ⚠ Breaking Feature add design_clean kwargs to fit() for GLM validation

    • Breaking: GLM designs containing regressors with abs® >= 0.95 are now auto-cleaned by default. Pass design_clean=False to preserve the previous behavior of keeping all regressors regardless of collinearity.

    • Feature pyodide async seed + sync fetch
    • ⚠ Breaking Feature add limit kwarg + change slices default view to "z"

    • Breaking: BrainData.plot() returns list[Figure] for multi-image glass/slices plots instead of a single Figure. The default slices view changed from "xyz" to "z"; pass view="xyz" to restore the prior three-figure layout.

    • Feature IDBFS-backed persistent cache for pyodide
    • ⚠ Breaking Feature gate MNI-only plot paths on standard-space data

    • Breaking: bd.plot(method='glass') and bd.plot_flatmap()/plot_surf() now raise ValueError on non-standard-space data instead of silently rendering against MNI scaffolding. bd.plot(method='slices') without bg_img also raises (previously warned + fell back to the MNI 2mm template). Pass bg_img= for native-space data, or call bd.resample() to bring data into standard space first. The one

    • ⚠ Breaking Feature per-voxel α + held-out predictions through BrainData CV path

    • Breaking: - cv_results_["best_alpha"] is now a (n_voxels,) array (was scalar) when local_alpha=True. Pass local_alpha=False for the legacy scalar-α-shared-across-voxels behavior. - BrainData.fit's signature is now keyword-only after model (the * marker after the primary positional arg).

    • ⚠ Breaking Feature copy-constructor + read-only convolved/confounds

    • Breaking: dm.convolved = […] and dm.confounds = […] now raise AttributeError. Pass via the convolved= / confounds= constructor kwargs, or use .append(other, axis=1) (raw DataFrames are auto-marked as confounds; as_confounds=True promotes a DesignMatrix's columns).

    • ⚠ Breaking Feature HRF-convolve events files by default

    • Breaking: DesignMatrix(events_path, run_length=N, TR=t) previously returned boxcar regressors; now returns HRF-convolved by default. Callers that relied on the boxcar output (e.g., to build interaction terms before convolution) need to add hrf_model=None.

    • Feature with_columns + pl.Expr in setitem
    • ⚠ Breaking Feature find_spikes returns DesignMatrix

    • Breaking: Code that did find_spikes(data).iloc[:, 1:] or spikes.drop('TR', axis=1) will break — drop the index manipulation and use the returned DesignMatrix directly via .append(spikes, axis=1).

    • Feature list_resources() for HF dataset discoverability
    • ⚠ Breaking Feature rebuild iplot() as anywidget viewer with 4D step-through

    • Breaking: iplot(surface=True, anatomical=...) → iplot(view='surface', bg_img=...). The view= kwarg is canonical with view='ortho' (default). bg_img= matches nilearn naming. The nltools[interactive_plots] extra is gone — anywidget is now a hard dep.

    • ⚠ Breaking Feature iplot threshold panel + drag-end render fix

    • Breaking: BrainViewerWidget.threshold / threshold_min / threshold_max / threshold_step traitlets are gone — replaced by lower / upper / vmax_abs / data_min / data_max / pct_table_*. Direct widget users need to update; iplot() callers passing threshold= are unaffected.

    • ⚠ Breaking Feature rewrite BrainData.predict() with kwargs API + Predict dataclass

    • Breaking: - BrainData.predict(y=) returns Predict dataclass instead of BrainData; result['weight_map'] → result.weight_map. - estimator= renamed to model= (mirrors bd.fit(model=)). - 'ridge' shortcut now means Ridge regressor; for RidgeClassifier use 'ridge_classifier'. - scoring='auto' default replaces hardcoded 'accuracy'. - BrainData.cv() and the .cv().normalize().reduce().pipe().predict() fluent chain removed; pass cv=, standardize=, reduce='pca', and/or model=Pipeline(...) on bd.predict() instead. - n_jobs default 1 (was -1) for searchlight/roi.

    • ⚠ Breaking Feature brain-space Predict fields + ROI per-fold scores + decoding tutorial

    • Breaking: - Predict.weight_map / fold_weight_maps / final_weight_map / accuracy_map are BrainData, not ndarray. Numpy via .data. - bd.predict(..., inplace=True) attaches with predict_ prefix (bd.predict_weight_map, etc.), not flat names. - ROI dispatch repurposes scores/mean_score/std_score with array shapes (n_folds,n_rois)/(n_rois,) instead of leaving them None. - model=Pipeline(...) auto-flips standardize to False (with warning); pass standardize=True explicitly to keep the old wrapping behavior.

    • ⚠ Breaking Feature ROI dispatch produces voxel-space weight maps
    • ⚠ Breaking Feature spatial_scale axis for ROI/searchlight RSA + predict rename

    • Breaking: predict() no longer accepts method= for spatial scope; use spatial_scale=. method= is reserved for algorithm choice.

    • Feature implement distance(searchlight) and align(roi)
    • Feature cluster reports with anatomical labeling
    • ⚠ Breaking Feature rebuild BrainData.iplot() on ipyniivue (niivue)

    • Breaking: BrainData.iplot() signature changed. Removed: mode=, units=, cut_coords=, symmetric_cmap=, and view="surface" (raises, pointing to view="render" / plot_flatmap / plot_surf). cmap default RdBu_r -> warm (matplotlib names auto-mapped with a warning). lower/upper reinterpreted as window endpoints. New: atlas=, opacity=, outline=. **kwargs now forward to ipyniivue.NiiVue(). Returns ipyniivue.NiiVue, not BrainViewerWidget.

    • Feature add marimo->ipynb converter for JupyterLite tutorials
    • Feature add poe docs-jupyterlite task to build the tutorial JupyterLite bundle
    • Feature make GLM + MVPA tutorials run in JupyterLite on trimmed HF data
    • Feature add "Try it live" JupyterLite nav link + deploy-ready build
    • ⚠ Breaking Feature iplot() colorbar + interactive threshold slider

    • Breaking: iplot() now returns an ipywidgets.VBox by default (with .viewer and .threshold_slider) instead of an ipyniivue.NiiVue. Access the widget via .viewer, or pass controls=False for the bare NiiVue.

    • ⚠ Breaking Feature host pain dataset on HF so fetch_pain() works in Pyodide

    • Breaking: fetch_pain() signature changed from (data_dir=None, verbose=1) to (verbose=0). The data_dir arg is removed — cache location is now governed by huggingface_hub (HF_HOME). fetch_pain().X columns changed from the raw Neurovault metadata to the curated schema above.

    • ⚠ Breaking Feature host emotion-rating dataset on HF for fetch_emotion_ratings()

    • Breaking: fetch_emotion_ratings() signature changed from (data_dir=None, verbose=1) to (verbose=0); data_dir removed (HF cache governs location). X columns are the curated Neurovault table keyed by a new filename column.

    • Feature serve tutorials as interactive marimo/WASM notebooks
    • Feature land core helpers, init, indexing, parallel _apply
    • Feature implement load/unload/write/read/cleanup + memory_estimate
    • Feature GLM fit + HDF5 bundles + compute_contrasts
    • Feature reductions, perm tests, ISC, align, from_bids/from_glob, predict dispatch
    • Feature ridge fit bundles + bc.predict(X_new=) per-subject path
    • Feature stage encoding + ISC datasets for nltools/niftis
    • Feature wire max_gpu_memory_gb into ridge_svd GPU batching (F022)
    • ⚠ Breaking Feature user-controlled scale/standardize preprocessing

    • Breaking: BrainData.fit / BrainCollection.fit drop scale_value; scale default changes from True (grand-mean) to 'auto' (off). GLM no longer mean-scales by default (betas now in native units unless scale=True; t/z/p unaffected). Ridge now z-scores its targets by default. Bundle schema 1->2 (old fit caches invalid).

    • Feature GLM predict(X)/coef_ parity + nilearn report (F182)
    • ⚠ Breaking Feature append(axis=1) refuses bitwise-duplicate columns

    • Breaking: DesignMatrix.append(axis=1) raises ValueError when an appended column's values are bitwise identical to another column's, where it previously appended silently. Drop or modify one of the columns first.

    • Feature make the rank-deficiency warning diagnostic and actionable
    • ⚠ Breaking Feature machine-enforce the canonical kwarg vocabulary from api-vocabulary.yml

    • Breaking: BrainData.fit defaults progress_bar=False and no longer inherits bd.verbose when unset (verbose is reserved for log-level only). SphereNeighborhoods.iter_neighborhoods takes progress_bar keyword-only. Deliberate deviations are now recorded as manifest exemptions with reasons (BrainData.predict n_jobs=1 memory guard; align n_iter solver iterations).

    • ⚠ Breaking Feature one canonical tail= vocabulary across every p-value (#474)

    • Breaking: the v0.5 -1/'upper'/'lower' public forms now raise ValueError (negate the data / swap groups / flip the contrast for the negative direction; _compute_pvalue keeps them internally for forced-tail sites). BrainData.ttest and Adjacency.ttest previously ignored tail= on the parametric path (always two-sided); tail now maps onto scipy's alternative=, and the z map matches the requested tail.

    • ⚠ Breaking Feature reserve the .nl_ namespace for generated columns

    • Breaking: all generated DesignMatrix / find_spikes column names gained the .nl_ prefix, and run-separated columns changed shape from {run}_{col} to .nl_r{run}_{col}. Code selecting generated columns by name must be updated; see the (reserved-column-prefix) section of the migration guide.

    • ⚠ Breaking Feature one core GPU execution layer — measured budgets, OOM recovery, run-or-raise

    • Breaking: SRM/DetSRM.fit() no longer accepts max_gpu_memory_gb and parallel='gpu' raises; LocalAlignment rejects unknown parallel= values and gpu-without-torch; max_gpu_memory_gb defaults changed from 4.0 to None (measured) across inference/ridge/braindata entry points; seeded null distributions from BrainCollection.permutation_test/ permutation_test2 change (engine RNG replaces the hand-rolled loop). Migration guide: (gpu-execution-layer).

    • ⚠ Breaking Feature carve out predict_group(); remove the legacy cv() pipeline

    • Breaking: BrainCollection.predict(y=...) raises (use predict_group); BrainCollection.cv() and BrainCollectionPipeline are removed. Migration guide: (predict-group).

    • ⚠ Breaking Feature iplot robust autoscaling + shared zero-aware percentile thresholds

    • Breaking: threshold(upper="98%") results change on any map containing zeros (percentile now over nonzero voxels); iplot's default window is autoscaled rather than min/max. Migration guide: (iplot-autoscale).

    • ⚠ Breaking Feature sklearn-style cv names — 'logo'/'loo' replace 'loso'/'loro'

    • Breaking: cv='loso'/'loro' removed; use cv='logo' with groups=. predict_group(cv=) with a classifier now stratifies folds.

    • ⚠ Breaking Feature predict() decodes against the stored .Y slot — labels travel with the data

    • Breaking: predict(cv=, groups=...) now group-aware; previously groups was ignored for int cv specs.

    • Feature PredictCollection — per-subject decoding results container
    • ⚠ Breaking Feature predict(y=) maps per-subject decoding — closes the #478 map-reduce gap

    • Breaking: predict(y=...) previously raised (and before that, aggregated across subjects — that operation is predict_group since the phase-1 carve-out). predict() with no arguments now decodes stored .Y instead of raising for a missing X_new.

    • ⚠ Breaking Feature predict_group permutation null for roi and searchlight

    • Breaking: Predict.permutation_pvalue is no longer always float | None — a per-ROI ndarray for spatial_scale='roi' and a BrainData map for 'searchlight' (both previously crashed, so no working code changes meaning). Whole-brain results are numerically unchanged for a given random_state.

    • Feature warn on near-collinear full-rank designs
    • ⚠ Breaking Feature align display ranges across renderers

    • Breaking: plot_surf() and plot_flatmap() now infer sign-aware colormaps and ranges when cmap, vmin, or vmax are omitted; iplot() defaults to symmetric="auto".

    • Feature fetch dataset resources directly under Pyodide
    • Feature put load_haxby_example on the 3 mm MNI grid
    • Feature add plot_stacked for two-triangle similarity comparisons
    • Feature add the frozen FitResult record
    • Feature write a fit or a contrast to a directory of files
    • Feature carry the fit through the HDF5 round trip
    • Feature let load_haxby_example share the block order across runs
    • Feature decide the ridge solver form from the design shape
    • Feature fit wide ordinary ridge designs in Himalaya's kernel form
    • Feature fit wide banded ridge designs in Himalaya's kernel form

Improvements

  • Improvement refactor and improve brain data dunder math. improve first tutorial
  • Improvement refactor onsets_to_dm to wrap new nilearn functionality instead
  • Improvement Convert .shape(), .isempty(), .dtype() to properties + quick fixes
  • Improvement Convert shape() and isempty() to properties
  • Improvement Reorganize Brain_Data tests into class-based structure
  • Improvement Reorganize Adjacency tests into class-based structure
  • Improvement Reorganize Design_Matrix tests into class-based structure
  • Improvement Organize test_stats.py with section headers and docstrings
  • Improvement Organize test suite into subdirectories following architectural patterns
  • Improvement Integrate Glm model into Brain_Data.regress()
  • Improvement Optimize DesignMatrix with idiomatic Polars patterns
  • Improvement Optimize DesignMatrix with selectors and enhanced errors
  • Improvement Consolidate design_matrix files and remove old implementation
  • Improvement Remove dead Design_Matrix_Series code
  • Improvement Standardize on DesignMatrix naming throughout codebase
  • Improvement Complete Polars optimization with native resampling
  • Improvement refactor inference tests and add two sample statistica correcteness tests
  • Improvement improve isc group
  • Improvement refactor tests
  • Improvement refactor tests
  • Improvement refactoring tests
  • Improvement improve resampling
  • Improvement move Adjacency to subdirectory structure
  • Improvement Complete P0 deprecations for v0.6.0 release
  • Improvement split brain_data.py into braindata/ subpackage with facade pattern
  • Improvement split design_matrix.py into design_matrix/ subpackage
  • Improvement rename design_matrix/ to designmatrix/
  • Improvement split adjacency/init.py into submodules
  • Improvement split collection.py into collection/ subpackage
  • Improvement remove leading underscores from module filenames
  • Improvement restructure data/ to use only subpackage dirs
  • Improvement clean BrainData facade — no private methods, alphabetical ordering
  • Improvement clean Adjacency facade — no private methods, alphabetical ordering
  • Improvement restructure BrainData tests into braindata/ subdir
  • Improvement clean DesignMatrix facade — no private methods, alphabetical ordering
  • Improvement restructure Adjacency tests into adjacency/ subdir
  • Improvement restructure DesignMatrix tests into designmatrix/ subdir
  • Improvement rename tests/shell → tests/data, tests/data → tests/fixtures
  • Improvement restructure model tests into models/ subdir
  • Improvement move models tests from tests/core/ to tests/models/
  • Improvement move Simulator and Roc into nltools/data/ packages
  • Improvement move neighborhoods and cache into data/braindata/
  • Improvement move check_brain_data helpers into braindata/utils.py
  • Improvement consolidate template resolution into MNI_Template_Factory
  • Improvement create nltools/io/ package, move HDF5 and file_reader into it
  • Improvement add tests/io_tests/ with h5 and file_reader test classes
  • Improvement move BrainData Args to class docstring, drop params-move logic
  • Improvement reorganize nltools/stats.py into focused subpackage
  • Improvement move stats tests to tests/stats/ for flatter hierarchy
  • Improvement add stats/permutation.py facade and update imports
  • Improvement reorganize nltools/plotting.py into focused subpackage
  • Improvement consolidate alignment algorithms and move validation into inference
  • Improvement consolidate ridge/backends into top-level Backend class
  • Improvement remove deprecated neurovault download shims
  • Improvement replace prefs.MNI_Template with templates/ module
  • Improvement lazy-import pandas across nltools modules
  • Improvement rewrite plotting/adjacency label-distance and silhouette as polars-native
  • Improvement polars-first stats.outliers.zscore and stats.intersubject input boundaries
  • Improvement sweep pandas out of scattered small modules
  • Improvement relocate backends to algorithms/ and thread resolve_backend
  • Improvement validate_frame returns polars, accepts pandas/numpy/csv
  • Improvement BrainData.X/.Y are polars DataFrames, never None
  • Improvement drop pandas from braindata/analysis.py
  • Improvement drop vestigial pandas branch in parse_contrast_string
  • Improvement rewrite BrainData h5 persistence on h5py + polars
  • Improvement Simulator.create_data builds polars frames and writes via pl
  • Improvement Adjacency.Y invariant is polars via property setter
  • Improvement drop pandas from Adjacency CSV read/write
  • Improvement rewrite Adjacency h5 persistence on h5py + polars
  • Improvement numpy-native Adjacency label-distance and cluster helpers
  • Improvement BrainCollection.metadata invariant is polars
  • Improvement build BrainCollection result metadata as polars
  • Improvement rename plotting functions to plot_* convention
  • Improvement lean on nilearn for HRFs and resample plumbing
  • Improvement drop BrainData.nifti_masker, use functional apply_mask/unmask
  • Improvement drop Simulator.nifti_masker, use functional apply_mask/unmask
  • Improvement drop pandas-compat shims from stats and DesignMatrix
  • Improvement drop legacy PyTables h5 support and plotting underscore re-exports
  • Improvement drop glover_hrf lambda wrapper in onsets_to_dm
  • ⚠ Breaking Improvement canonical trailing-kwarg order across facades
  • ⚠ Breaking Improvement replace **kwargs passthroughs with explicit signatures (½)

    • Breaking: Remove **kwargs catch-all from user-facing methods that delegate internally; expose previously hidden kwargs explicitly.
    • ⚠ Breaking Improvement replace **kwargs passthroughs with explicit signatures (2/2)

    • Breaking: Expose previously hidden permutation and bootstrap kwargs explicitly instead of forwarding via **kwargs.

    • ⚠ Breaking Improvement keyword-only marker for init and complex methods

    • Breaking: Enforce keyword-only args after the primary data arg for all four data-class init methods, plus selected public methods with many optional kwargs. Callers passing these positionally must update.

    • Improvement route progress_bar to nilearn verbose
    • Improvement simplify extract_roi PCA, stop mutating caller headers
    • Improvement broaden check_brain_data to accept Niimg-like inputs
    • Improvement use np.trunc instead of deprecated np.fix
    • Improvement expand ruff with UP/C4/PIE/RUF022/RET/SIM families
    • Improvement improve first tutorial and make plotting fixes
    • ⚠ Breaking Improvement polars passthrough, unify data attr, drop details()

    • Breaking: DesignMatrix._df is now .data. DesignMatrix.details() is removed — use print(dm) or repr(dm) instead.

    • ⚠ Breaking Improvement drop fetch_haxby; migrate GLM tutorial to localizer

    • Breaking: nltools.datasets.fetch_haxby removed. Use nilearn directly (fetch_localizer_first_level, fetch_spm_auditory, etc.) and convert events.tsv to a DesignMatrix with nltools.io.onsets_to_dm.

    • Improvement rename fetch_nifti → fetch_resource
    • Improvement extract indexing helpers to indexing.py
    • Improvement extract aggregation helpers to aggregation.py
    • Improvement extract conversions to conversions.py
    • Improvement move memory_estimate/load/unload to io.py
    • Improvement consolidate stateless helpers in core.py
    • Improvement drop unused TypeVar import
    • ⚠ Breaking Improvement scaffold v0.6.0 BrainCollection redesign

    • Breaking: BrainCollection is being rewritten from scratch. Removes FittedBrainCollection, BrainCollectionCVResult (CV results are now plain BrainData), fit_glm/fit_from_events/fit_ridge (one .fit() instead), to_stacked/from_stacked/to_list/to_tensor, axis= on reductions, output=/save= on fit, checkpoint(), and the per-axis _map_axis0/½ / _aggregate_axis0/½ handlers. Shape semantics drop the 3D framing; mean()/std()/etc. collapse subjects only. Old test files for the removed APIs are deleted.

    • ⚠ Breaking Improvement tighten decompose signature

    • Breaking: BrainData.decompose and analysis.decompose are now keyword-only after the data arg. Positional calls beyond self/bd (which were silently swallowed by the old *args) now raise TypeError.

    • ⚠ Breaking Improvement drop final_weight_map, weight_map = all-data refit

    • Breaking: - Predict.final_weight_map field removed (folded into weight_map). - Predict.final_estimator renamed to Predict.estimator. - bd.predict(refit=...) kwarg removed; the all-data fit is always-on. - bd.predict(inplace=True) now attaches bd.predict_estimator (was bd.predict_final_estimator) and no longer attaches predict_final_*.

    • ⚠ Breaking Improvement generalize .plot() into method= dispatcher; add .corr()

    • Breaking: DesignMatrix.plot()'s first positional arg is now method (was figsize). Pass figsize=... as a keyword. dm.plot() with no args is unchanged.

    • ⚠ Breaking Improvement rename BrainCollectionPipeline.normalize → standardize

    • Breaking: BrainCollection.cv(...).normalize(...) is now standardize(...).

    • ⚠ Breaking Improvement BrainCollectionPipeline.predict returns BrainData

    • Breaking: BrainCollectionPipeline.predict no longer returns BrainCollectionCVResult; that class is removed. Downstream code reading .mean_score / .scores continues to work since the attributes live on the BrainData now (note: .scores is renamed to .cv_scores to mirror the BrainData CV path).

    • ⚠ Breaking Improvement align bc.predict with new BD.predict + GLM tutorial

    • Breaking: BrainCollection.predict kwargs estimator=/return_weights= removed; use model= to match BrainData.predict.

    • Improvement memoize fetch_resource, skip network revalidation
    • Improvement add coalesced_gc() and wrap masking-heavy operations
    • Improvement validate GLM-fit result mask once per map-list
    • ⚠ Breaking Improvement remove superseded standalone Pipeline/MultiSubject orchestration

    • Breaking: nltools.pipelines.Pipeline, MultiSubjectPipeline, NestedCVScheme, the *Terminal and *Result classes, and PooledData.cv() are removed. Multi-subject CV now lives on BrainCollection (bc.cv().standardize().reduce().predict()); custom single-dataset preprocessing uses model=make_pipeline(...) on BrainData.predict().

    • Improvement extract API-doc postprocess into its own module
    • ⚠ Breaking Improvement remove dead standalone pipeline surface

    • Breaking: nltools.pipelines no longer exports AlignStep, FittedAlign, or Terminal.

    • ⚠ Breaking Improvement strip ICC functionality entirely (F012/F048/F140/F177/F194)

    • Breaking: BrainData.icc(), nltools.stats.compute_icc, and nltools.algorithms.inference.compute_icc_voxelwise are removed. Compute ICC externally (e.g. pingouin.intraclass_corr) on extracted values. See the migration guide.

    • ⚠ Breaking Improvement canonical-kwarg sweep — banned-kwarg renames + **kwargs hygiene

    • Breaking: renamed public kwargs — permutation tests parallel=->device=, BrainCollection.align scheme=->spatial_scale=, regress mode=->method=, BrainCollectionPipeline.predict algorithm=->method=, compute_contrasts contrast_type=->method=. DesignMatrix.up/downsample and Roc.plot no longer accept **kwargs.

    • ⚠ Breaking Improvement add keyword-only * marker to 61 public functions (F-kwonly)

    • Breaking: kwargs on the following are now keyword-only (positional calls TypeError). Callers overwhelmingly already used keywords; positional callers and facade→backing delegations were converted.

    • ⚠ Breaking Improvement rename compute_contrasts statistic selector method→statistic

    • Breaking: compute_contrasts(..., method='t'|'beta'|'all') → statistic=.

    • ⚠ Breaking Improvement canonicalize remaining kwarg names across facades

    • Breaking: many public kwargs renamed to the v0.6.0 canonical vocabulary (see list above). Notably: DesignMatrix.clean now defaults to silent (progress_bar=False, was verbose=True); BrainData.standardize uses suppress_warnings=False (was verbose=True); BrainCollection.isc_test uses n_samples=; BrainCollection.align uses roi_mask=; Roc uses method=; Adjacency.cluster_summary/similarity/plot_mds and stats.isc/compute_similarity kwargs renamed.

    • ⚠ Breaking Improvement close AUDIT-0.6.0 dead-code bucket (23 findings)

    • Breaking: BrainData.regress(), BrainData.predict_multi(), StatResult.to_nifti(), and FittedBrainCollection are removed. Use fit(model='glm', X=...) for regression and predict(y=...) for whole-brain MVPA (see migration guide).

    • ⚠ Breaking Improvement remove orphaned pool.py two-stage aggregation (F118/F111)

    • Breaking: nltools.pipelines no longer exports PooledData, StatResult, or ResultDict; the two-stage bc.fit(...).pool() GLM aggregation workflow is removed.

    • Improvement functional GLM map extraction, no per-contrast round-trips
    • Improvement functional compute_contrasts, no Nifti round-trip
    • Improvement annotate models layer + fix Any/hint gaps (F107/F009/F017/F046/F085)
    • Improvement single-source helpers + frozen dataclass cleanups (F006/F061/F154/F183/F192)
    • ⚠ Breaking Improvement co-locate pipeline primitives under data/collection/pipesteps

    • Breaking: nltools.pipelines is removed; import the primitives from nltools.data.collection.pipesteps (or its .base/.cv/.steps submodules) instead.

    • ⚠ Breaking Improvement canonicalize spatial_scale vocab in LocalAlignment

    • Breaking: LocalAlignment now takes spatial_scale=('searchlight'|'roi') and roi_mask= instead of scheme=('searchlight'|'piecewise') and parcellation=. No compat aliases. BrainCollection.align(spatial_scale='whole_brain') now raises NotImplementedError instead of leaking a LocalAlignment ValueError.

    • Improvement remove 7 dead validation/utility functions
    • Improvement rewrite as a speed+memory harness over the current API
    • ⚠ Breaking Improvement canonicalize device selection to device= across facades

    • Breaking: Ridge(backend=) -> Ridge(device=); BrainData.fit(model='ridge') backend=/parallel= in **kwargs now raise TypeError (use device=); BrainData.bootstrap(backend=) -> device=; nltools.stats.phase_randomize(backend=) -> device=.

    • Improvement run pairwise ISC bootstrap on the GPU
    • ⚠ Breaking Improvement rebuild BrainData.iplot() on a self-owned niivue anywidget

    • Breaking: BrainData.iplot() now returns a NiivueViewer (anywidget.AnyWidget) instead of an ipyniivue.NiiVue / ipywidgets.VBox. The .viewer and .threshold_slider attributes are gone; the threshold window is reactive via the cal_min/cal_max traits. ipyniivue is no longer a dependency.

    • Improvement make find_spikes deduplication unconditional; drop clean=
    • ⚠ Breaking Improvement stop cleaning the design in fit(); warn on rank deficiency

    • Breaking: BrainData.fit() no longer accepts design_clean, design_clean_thresh, design_clean_exclude_confounds, or design_clean_fill_na, and no longer runs DesignMatrix.clean() implicitly. It estimates exactly the design it is given. Callers who want columns dropped call DesignMatrix.clean() explicitly. fit() now emits a UserWarning when the design matrix is rank deficient.

    • Improvement make maybe_tqdm/make_progress_bar the single library-wide progress mechanism
    • ⚠ Breaking Improvement enforce the keyword-only marker convention uniformly across the package

    • Breaking: options on the newly-marked public functions must now be passed by keyword (e.g. KFoldStratified(5, True) -> KFoldStratified(5, shuffle=True)).

    • ⚠ Breaking Improvement remove nltools.stats; consolidate the functional core into nltools.algorithms

    • Breaking: nltools.stats is removed. Implementations moved: corrections.py, outliers.py, regression.py as-is; timeseries.py -> algorithms/signal.py and correlation.py -> algorithms/similarity.py (avoids name echoes with the inference engine's modules); intersubject.py -> algorithms/inference/; alignment.py -> algorithms/alignment/procrustes.py. stats/permutation.py is deleted outright — the nltools.algorithms permutation exports ARE the algorithms.inference engine functions (identity, no wrapper layer), so facade/engine drift is structurally impossible.

    • Breaking: the inference engine speaks the canonical device= vocabulary directly. parallel= -> device= on every algorithms.inference entry point (values unchanged: 'cpu' | 'gpu' | None), validate_parallel_parameter -> validate_device_parameter, and result dicts report a 'device' key instead of 'parallel'. phase_randomize(backend='numpy'|'torch') is now keyword-only device='cpu'|'gpu'|'auto' with warn-and-fallback on unknown values. The ridge and alignment layers keep parallel= internally (documented Backend abstraction); facades still translate at those boundaries.
    • ⚠ Breaking Improvement canonicalize the ISC vocabulary (summary=/metric=/null_dist)

    • Breaking: isc_permutation_test / isc_group_permutation_test rename metric= (the 'median'|'mean' central-tendency choice) to summary=, and sim_metric= (the similarity metric) to metric= — metric now means the same thing here as everywhere else in the API. isc_group() and BrainCollection.isc/.isc_test likewise take summary= instead of metric= (isc() already used summary=).

    • Breaking: every ISC result — engines, the isc/isc_group wrappers, and BrainCollection — exposes the null under the engine-standard 'null_dist' key; the legacy 'null_distribution' key is removed.
    • ⚠ Breaking Improvement canonicalize cluster_summary and extract_roi kwargs

    • Breaking: Adjacency.cluster_summary renames method= -> summary= ('mean'|'median'|None central tendency) and its old summary= (within/between scope) -> scope=. BrainData.extract_roi renames metric= -> method= ('mean'|'median'|'pca' selects an extraction variant; metric stays reserved for similarity metrics). Closes the last two mean/median-vocabulary violations flagged in the #474 consolidation follow-up.

    • Improvement isc_test p-values via the shared _compute_pvalue helper
    • Improvement thread tail through the bootstrap engines; drop the facade closures
    • Improvement one GPU bootstrap driver, two thin wrappers
    • Improvement stop materializing np.abs(arr) three times per iplot window
    • Improvement one shared manifest module for the lint-api trio
    • ⚠ Breaking Improvement HRF wrapper options are keyword-only

    • Breaking: nltools.algorithms.hrf.* no longer accept oversampling, time_length, onset positionally.

    • ⚠ Breaking Improvement autoscale is a bool, and the robust-range citation is honest

    • Breaking: iplot(autoscale=(lo_pct, hi_pct)) is removed; pass lower="60%", upper="98%" instead. autoscale takes True or False only and raises TypeError otherwise.

    • ⚠ Breaking Improvement defer BrainCollection and repair BrainData ownership

    • Breaking: BrainCollection, PredictCollection and collection-only Predict permutation fields are removed from 0.6.0. Derived BrainData outputs own mutable state and append rejects incompatible row metadata. See the migration guide.

    • ⚠ Breaking Improvement define DesignMatrix forwarding and ownership contract

    • Breaking: eager forwarded DataFrame results return DesignMatrix; dedicated pandas export and direct pandas append are removed. Metadata propagation and invalid constructor inputs follow the approved contract.

    • ⚠ Breaking Improvement define Adjacency storage and ownership contract

    • Breaking: Remove Adjacency spatial_scale, SpatialScale, to_brain and similarity project. Enforce the approved matrix shape, symmetry, metadata and copying contracts; spatial mapping now uses explicit external helpers.

    • ⚠ Breaking Improvement implement the shared one-sample t-test contract

    • Breaking: Adjacency.ttest gains popmean and the mean and z keys; its permutation "t" is now the t-statistic rather than a mislabeled mean; both facades return null_dist with permutation=True, return_null=True; results are float64.

    • Improvement remove BrainData.ttest2
    • Improvement remove BaseModel and add ContrastResult
    • Improvement delegate Ridge fitting to Himalaya
    • Improvement rewrite Glm on nilearn run_glm
    • Improvement align the BrainData GLM facade with the approved contracts
    • Improvement align the BrainData Ridge facade and bootstrap refits with the adapter
    • Improvement align the BrainData.predict signature, dispatch and cross-validation
    • Improvement align the Predict record with the approved prediction contract
    • Improvement implement the decoding pipelines and back-projection contract
    • Improvement implement bounded bootstrap results with streaming intervals
    • Improvement align BrainData spatial transforms and persistence with the contracts
    • Improvement rename alignment parameters to the API vocabulary and make align() explicit
    • Improvement return the v0.5.1 align container with owned BrainData values
    • Improvement adopt nilearn's millimetre radius convention for spheres and the Simulator
    • Improvement complete public exports, SimulateGrid correction handling and the isfc signature
    • ⚠ Breaking Improvement pare the alignment package back to the v0.5.1 surface

    • Breaking: every Procrustes path returns transformation_matrix in the scipy orientation, transformed = original @ T, back-projected with @ T.T. BrainData.align and align() on numpy input previously stored the transpose; one migration row records the change.

    • Improvement GPU applies to ridge only; delete the GPU permutation and ISC paths
    • Improvement simplify inference validation and give isc() the summary statistic
    • Improvement prune the BrainData package
    • ⚠ Breaking Improvement prune the DesignMatrix, Adjacency, Predict and Simulator surfaces

    • Breaking: HDF5 files written by nltools 0.5.1 and earlier are no longer readable. Export them under 0.5.1 first (BrainData.write('x.nii.gz') for images, Adjacency.write('x.csv') for matrices), then load the exports. Adjacency.similarity(method='2d') raises ValueError on NaN input instead of warning; drop or impute NaNs first.

    • ⚠ Breaking Improvement unify standardize and align the shared data-class signatures

    • Breaking: DesignMatrix.zscore(columns) is removed; call standardize(method='zscore', columns=...). The no-argument form standardizes only non-confound columns, where zscore() standardized every column including the polynomial and intercept terms.

    • ⚠ Breaking Improvement unify the v0.5.1-visible operand and axes spellings on the data classes

    • Breaking: BrainData.similarity(image=…) is now similarity(data=…), and metric is keyword-only; no metric default changed.

    • Breaking: Adjacency.plot(axes=…) is now plot(ax=…); limit and ax are keyword-only and the unused *args passthrough is gone.
    • Breaking: BrainData.append no longer accepts **kwargs; an unexpected keyword raises TypeError.
    • Breaking: DesignMatrix.append(dm=…) is now append(data=…); positional calls are unaffected.
    • ⚠ Breaking Improvement prune the HRF wrappers, the ridge sizing layers, and the duplicate OLS

    • Breaking: regress(X, Y, method='ols'), compute_multivariate_similarity(y, X, method='ols') and BrainData.multivariate_similarity(images, method='ols') now raise TypeError; drop the keyword. The HRF wrappers are gone — import them from nilearn.glm.first_level. compute_multivariate_similarity takes its standard errors from a pseudo-inverse, so a rank-deficient predictor set returns the least-norm solution instead of nan.

    • Improvement prune the template-match record and the surface-plotting duplication
    • Improvement move each shared helper next to the domain it serves
    • ⚠ Breaking Improvement trim the public export surface to the user-facing table

    • Breaking: v0.5.1 top-level imports moved. create_sphere, expand_mask and collapse_mask now come from nltools.mask. SRM and DetSRM are internal behind BrainData.align and the standalone align(). nltools.stats.double_center and nltools.stats.u_center have no public successor.

    • ⚠ Breaking Improvement restore the v0.5.1 decoding figures and scale the predict shortcuts

    • Breaking: Adjacency.regress loses its algorithm keyword (v0.5.1 mode='ols', 0.6.0 method='ols'); 'ols' was always its only value, and tail is now keyword-only. The 'ridge' and 'ridge_classifier' shortcuts change their default penalty: they select it by an inner cross-validation instead of fitting at scikit-learn's alpha=1. Pass estimator_kwargs={'alphas': ...} or your own sklearn object for a fixed penalty.

    • Improvement prefix every internal function and class with an underscore
    • Improvement name plot_stacked's second matrix data
    • Improvement rename Predict to PredictResult
    • Improvement record a fit on data.model instead of eight attributes
    • Improvement let the fit producer own the record's maps
    • Improvement keep the shared record writer off the facade
    • Improvement return only the scalar from Procrustes permutation workers
    • Improvement share one new-subject transform between the SRM estimators
    • Improvement share one upsample implementation
    • Improvement name the covariance block slice
    • Improvement read each mask's support once instead of per combine
    • Improvement one mask-argument resolver, clearer names and docstrings
    • Improvement memoize file-backed mask supports in one module-level cache
    • Improvement name the two mask helpers apart and document the resolver
    • Improvement resolve the ROI distance atlas through the shared helper
    • Improvement one ISC summary path and a stricter resample reshape
    • Improvement say which correspondence check failed, and fix stale prose
    • Improvement share the ridge fit's input conversion and state recovery
    • Improvement recover kernel-form coefficients and refit wide designs as Himalaya does
    • Improvement reuse Himalaya's linear kernel and scipy's log-sum-exp in ridge

Bug Fixes

  • Bug Fix fix formatting
  • Bug Fix fix warnings 1
  • Bug Fix fix warnings 2
  • Bug Fix fix us few more things
  • Bug Fix fix neurovault downloaders and add tests
  • Bug Fix fix tutorial and log
  • Bug Fix fix nilearn resampling messages
  • Bug Fix fix Brain_Data eq. Update tests
  • Bug Fix fixup collection and tutorial v1
  • Bug Fix fix up collection issue
  • Bug Fix Handle model attributes in Brain_Data.copy() to prevent pickle errors
  • Bug Fix Complete Round 1 audit fixes - 4 critical bugs resolved
  • Bug Fix Achieve perfect backward compatibility via deterministic RNG pattern
  • Bug Fix Achieve perfect cross-backend determinism for all permutation tests
  • Bug Fix fix statistical correctness of inference module
  • Bug Fix fix docs
  • Bug Fix fix ruff complaints
  • Bug Fix fix adjacenecy bootstrap. Add gpu optimized correlation and timeseries functions
  • Bug Fix fix/add gpu optimizations
  • Bug Fix fix up bootstrapping with ridge
  • Bug Fix fix up docs for algorithms
  • Bug Fix fix cross-validation
  • Bug Fix fix brain-data fit progress bar
  • Bug Fix fix resampling
  • Bug Fix fix beads git tracking and add GitHub issues
  • Bug Fix fix Brain_Data squeeze flattening single-item lists (#449)
  • Bug Fix fix nilearn darkness parameter deprecation warning
  • Bug Fix fix nilearn nearest interpolation deprecation warning
  • Bug Fix fix NiftiMasker mask warning in simulator
  • Bug Fix fix memory resampling warnings in tests
  • Bug Fix convert Backend object to parallel string in Ridge CV calls
  • Bug Fix handle NaN values in Adjacency.similarity() (#432)
  • Bug Fix resolve API mismatches in BrainData and test expectations
  • Bug Fix prevent fitted model state from propagating to copies
  • Bug Fix resolve pandas deprecation and logic bug in Adjacency
  • Bug Fix replace legacy tier1/tier2 markers with slow/gpu
  • Bug Fix Adjacency.regress() now correctly sets is_single_matrix for single-regressor DesignMatrix case
  • Bug Fix ISC calculation in align() now correctly handles all axis/data_type combos
  • Bug Fix atlas/label data now correctly uses nearest-neighbor interpolation (#446)
  • Bug Fix Adjacency.similarity() NaN handling with perm_type='2d' (#432)
  • Bug Fix Brain_Data.threshold() now works when upper=0 or lower=0 (#370)
  • Bug Fix fix docs build: add jupytext config for .py tutorials
  • Bug Fix Adjacency.shape returns (n_nodes, n_nodes) for API consistency
  • Bug Fix Remove incorrect \@pytest.mark.slow markers from fast tests
  • Bug Fix MultiSubjectPipeline.align() now works with LOSO CV (nltools-7j3g)
  • Bug Fix Skip CI for beads sync commits, skip surface tests when files missing
  • Bug Fix CI test failures - FittedBrainCollection, thresholds, tolerance
  • Bug Fix More robust CI tests - tolerance, nan handling, constant input checks
  • Bug Fix Use unbiased sigma estimator in regression (GH #287)
  • Bug Fix Correct type annotations for ty type checker
  • Bug Fix relax SVD reconstruction tolerance for float32 precision
  • Bug Fix seed RNG in SVD test to eliminate flaky precision failures
  • Bug Fix configure ty type checker and resolve 18 type errors
  • Bug Fix fixup tutorials
  • Bug Fix resolve ty type-checking errors
  • Bug Fix guard scale_data grand-mean branch against divide-by-zero
  • Bug Fix fix up docs and poe commands
  • Bug Fix fix toc
  • Bug Fix update ridge benchmark to parallel API
  • Bug Fix rewrite mvpa_roi for correct per-ROI MVPA decoding
  • Bug Fix serialize polars frames to h5 via Arrow IPC
  • ⚠ Breaking Bug Fix make out-of-mask voxels transparent in BrainData.plot

    • Breaking: plot(threshold=t) is now nilearn's absolute-value transparency cutoff (hide voxels with |value| < t) instead of a signed remap to upper/lower. Negative thresholds raise. Use upper= / lower= for one-sided data thresholding.
    • Bug Fix make slices + flatmap plotting usable again
    • Bug Fix fixup plotting and add plot_surf()
    • Bug Fix fix up design matrix, autoscale for plotting, include constant for .add_dct_basis by default to match .add_poly
    • Bug Fix fix up design mat
    • ⚠ Breaking Bug Fix compute_contrasts returns real t-stats, not beta sums

    • Breaking: compute_contrasts default behavior now returns t-statistics. Code that treated the old return as effect sizes must pass contrast_type="beta" explicitly.

    • ⚠ Breaking Bug Fix return matplotlib Figure from BrainData/DesignMatrix .plot()

    • Breaking: BrainData.plot() returns matplotlib.figure.Figure, not a nilearn Display. DesignMatrix.plot() returns matplotlib.figure.Figure, not Axes.

    • Bug Fix honor fit_intercept and CV splitters; add BrainData.size
    • Bug Fix re-stub predict_multi; bounds-trim default slice cut_coords
    • ⚠ Breaking Bug Fix always suffix convolved columns with _c{i}

    • Breaking: column lookups by trial-type name after a .convolve() chain need _c0 appended (notably compute_contrasts("A - B") becomes compute_contrasts("A_c0 - B_c0")).

    • Bug Fix make .convolve() idempotent over already-convolved columns
    • Bug Fix relax accidental numpy floor; pin nilearn in pyodide smoke test
    • Bug Fix restore the interactive_plots optional extra (ipywidgets)
    • Bug Fix deterministic cell ids for generated tutorial notebooks
    • Bug Fix deterministic tiebreak for same-second step subdirs
    • Bug Fix strip leaked RST directives from re-exported docstrings
    • Bug Fix correct Attributes-section removal over-match in API generation
    • Bug Fix correct invalid p-values/CIs and permutation nulls (0.6.0 audit)
    • Bug Fix crashes/silent-empty on realistic inputs (0.6.0 audit)
    • Bug Fix silent metadata loss and threshold/stack bugs (0.6.0 audit)
    • Bug Fix seaborn 0.13.2 crashes, dropped returns, triangle swap (0.6.0 audit)
    • Bug Fix always-raising ctor, copy-paste + wrong SE bugs (0.6.0 audit)
    • Bug Fix schema check + non-integer downsample ratios (0.6.0 audit)
    • Bug Fix all attribute errors and mutable default (0.6.0 audit)
    • Bug Fix filter crash, resource leaks, CV-index + MVPA seed bugs (0.6.0 audit)
    • Bug Fix NaN-poisoning, silent-wrong + crash bugs (0.6.0 audit)
    • Bug Fix n_subjects referenced nonexistent BrainCollection.n_images (0.6.0 audit)
    • Bug Fix restore ISC bootstrap null centering dropped in refactor (F066)
    • Bug Fix HyperAlignment auto_pad zero-pads instead of truncating (F001)
    • Bug Fix implement PooledData.repool for real fitted_state shapes (F111)
    • Bug Fix share one integer cluster_id space between peaks and clusters (F043)
    • Bug Fix complete parallel→device + contrast_type→method renames missed in 9b1b0eb4
    • ⚠ Breaking Bug Fix drop invalid permutation CVScheme, add predict(n_permute=) null (F112)

    • Breaking: CVScheme no longer accepts scheme='permutation' / cv(method='permutation'). Use BrainCollectionPipeline.predict(n_permute=N) for the permutation-accuracy null.

    • ⚠ Breaking Bug Fix stop advertising kwargs that do nothing (F068/F021/F182)

    • Breaking: BrainCollection.isc/isc_test no longer accept radius_mm, device, n_jobs or progress_bar (they were silently ignored); roi_mask now actually scopes the computation and the returned maps carry the ROI mask, so results from code that passed roi_mask will CHANGE (previously whole-brain). The ridge solvers no longer accept n_jobs.

    • Bug Fix apply_mask inherits target space for raw Niimg masks
    • Bug Fix clearer errors + robust input handling (F098/F031/F159/F157)
    • Bug Fix to_nifti preserves data precision instead of quantizing to mask dtype
    • Bug Fix align feeds LocalAlignment correct orientation + wire cache= (F073)
    • Bug Fix repair docstring rendering bugs in API reference
    • Bug Fix make marimo-WASM tutorials boot in Pyodide
    • Bug Fix run GPU legs on CUDA hosts, not just MPS
    • Bug Fix stream leave-one-out ISC instead of materializing all subjects
    • Bug Fix correct regress standard errors, all_same, copy() docs
    • ⚠ Breaking Bug Fix wire GPU into pairwise ISC; fail fast on unsupported metric

    • Breaking: isc_permutation_test(parallel='gpu', summary_statistic='pairwise', sim_metric != 'correlation') now raises ValueError instead of silently running on CPU.

    • Bug Fix sequential micropip install for marimo-WASM; adopt niivue viewer
    • Bug Fix use Python # comments in Pyodide micropip.install string
    • Bug Fix make h5py a core dependency; BrainCollection.fit() requires it
    • Bug Fix stop find_spikes() emitting duplicate spike regressors
    • Bug Fix a design matrix with no regressors keeps its row count
    • Bug Fix make n_rows survive copies and reject conflicting values
    • Bug Fix point the rank-deficiency warning at regularization, not deletion
    • ⚠ Breaking Bug Fix add progress_bar to the permutation and bootstrap family

    • Breaking: progress bars are now off by default. isc_permutation_test and isc_group_permutation_test previously defaulted to progress_bar=True and now default to False; every other function in the family previously had no way to disable its bar. Pass progress_bar=True to restore the old output.

    • Bug Fix thread progress_bar through the bootstrap and Adjacency stat facades
    • ⚠ Breaking Bug Fix make options keyword-only across the inference layer

    • Breaking: options must now be passed by keyword. one_sample_permutation_test(data, 5000) becomes one_sample_permutation_test(data, n_permute=5000). The leading data arguments remain positional.

    • ⚠ Breaking Bug Fix make write() and the file constructor round-trip

    • Breaking: write() to a .csv now emits comma-separated data (it emitted tabs before, which its own reader could not parse). Code parsing nltools-written .csv files with an explicit tab delimiter must switch to comma or pass sep="\t" to write().

    • Bug Fix compare OOM-recovered results at float32-ulp tolerance, not bitwise
    • ⚠ Breaking Bug Fix timeseries GPU draws match CPU exactly; conjugate pairing fixed in batched phase randomization

    • Breaking: GPU null distributions for timeseries_correlation_permutation_ test change (they now equal the CPU nulls for a given seed).

    • Bug Fix relay worker warnings to the parent — deduplicated, categories preserved
    • Bug Fix adjacency plots rendered twice
    • ⚠ Breaking Bug Fix GPU Spearman ranks ties correctly; device validation is run-or-raise

    • Breaking: GPU-computed Spearman correlations and null distributions over tied data (integer ratings, discrete scores) change — they were wrong and now match the CPU/scipy path; continuous untied data is unaffected. phase_randomize with an invalid device= now raises ValueError instead of warning and falling back to CPU.

    • Bug Fix one-tailed z maps stay finite; single shared z-from-p helper
    • ⚠ Breaking Bug Fix ttest(popmean=X, permutation=True) tests mean != popmean

    • Breaking: BrainData.ttest(popmean=X, permutation=True) with X != 0 returns different (now correct) p-values and a popmean-subtracted 'mean' map. popmean=0 calls are numerically unchanged.

    • Bug Fix string class labels decode and persist end to end
    • Bug Fix predict worker closures no longer capture the collection
    • Bug Fix classify .h5 items by bundle_kind, not bare suffix
    • Bug Fix predict-bundle model_spec is a real refit spec, not a repr
    • Bug Fix plot_between_label_distance crashed on its default permutation path
    • Bug Fix validate the separator-recovery re-parse instead of trusting the header hint
    • Bug Fix translate pre-.nl_ generated names when loading a legacy h5
    • Bug Fix make the GPU bootstrap per-sample hooks private
    • Bug Fix qualify vocabulary suppressions by module path
    • Bug Fix move check_kwonly's inline EXEMPT dict into the vocabulary manifest
    • Bug Fix move the _NullProgressBar nosemgrep suppressions into the semgrep config
    • Bug Fix serialize in-memory masks in BrainData h5 files
    • Bug Fix GPU bootstrap guard accepts torch-cuda
    • Bug Fix keep refit alpha indices on the compute device
    • Bug Fix cap measured-budget batch sizing at a saturation ceiling
    • Bug Fix bench_inference GPU leg passed the harness probe string as device=
    • Bug Fix provenance label auto-detects the GPU; record the benchmarked commit
    • ⚠ Breaking Bug Fix plot_mds uses the sklearn 1.8 MDS API

    • Breaking: nltools now requires scikit-learn>=1.8.

    • ⚠ Breaking Bug Fix standardize is exact on raw BOLD and drops suppress_warnings

    • Breaking: BrainData.standardize(suppress_warnings=...) is removed; drop the kwarg.

    • Bug Fix plot zero-fills non-finite voxels instead of letting nilearn warn
    • Bug Fix shape counts a single-image item as one observation
    • Bug Fix remove the causes of tutorial warnings and attribute every warning to the caller
    • Bug Fix resample dispatches to BrainData.resample_to
    • ⚠ Breaking Bug Fix the iplot autoscale floor can no longer hide a real voxel

    • Breaking: build_viewer(cal_min=, cal_max=) are now required keyword arguments and precede view= in the signature. Callers resolve the window with compute_display_window() first; iplot() is unaffected.

    • ⚠ Breaking Bug Fix enforce execution and collection contracts

    • Breaking: Explicit GPU requests no longer fall back to CPU, and undersized explicit memory budgets now raise.

    • ⚠ Breaking Bug Fix simplify BrainData fit and result contracts

    • Breaking: fit(inplace=False) now returns an independently fitted BrainData, and the Fit/fitresults API has been removed.

    • Bug Fix clean obsolete API pages and refresh generated output
    • Bug Fix honour the Roc threshold rule and stop plot() overwriting computed results
    • Bug Fix resample the extract_roi mask onto the object's grid before extracting
    • Bug Fix pin gzip mtime so identical volumes serialize identically
    • Bug Fix accept a BrainData atlas in predict(spatial_scale='roi')
    • Bug Fix drop NaN observations in the permutation means
    • ⚠ Breaking Bug Fix compute every HRF regressor the way nilearn does

    • Breaking: convolve()'s kernel argument is kernel=, not conv_func=, with no alias, and its default string is 'glover'; 'hrf' is rejected. Every convolved regressor changes, and with it every beta, t and

    • Bug Fix integer cv is group-aware with groups and stratified for regressors
    • Bug Fix the threshold floor can never reach zero
    • Bug Fix parse the polars version without assuming X.Y.Z
    • Bug Fix harden the Pyodide fetch path
    • Bug Fix drop every duplicate of a kept column in clean
    • Bug Fix draw glass brains unthresholded by default
    • Bug Fix anchor divergent matrices at zero in plot
    • Bug Fix fill the square diagonal by matrix type
    • Bug Fix keep the banded ridge feature-space order through HDF5
    • Bug Fix make a written record's sidecar match its own files
    • Bug Fix score ridge targets once, and report a non-finite target as NaN
    • Bug Fix refuse to wrap zero-padded Procrustes results on a smaller mask
    • Bug Fix release a failed call's memory before retrying it smaller
    • Bug Fix convert state maps to float before replacing zero-variance columns
    • Bug Fix require a 3-D mask for searchlight neighborhoods
    • Bug Fix compute alignment ISC once instead of stacking Adjacency copies
    • Bug Fix reject an SRM feature count no subject's voxels can support
    • Bug Fix reject a multi-target y in KFoldStratified
    • Bug Fix order the SRM checks by axis and name the padded-result escape
    • Bug Fix apply generator expressions in with_columns
    • Bug Fix stop clean dropping through a removed column
    • Bug Fix own the frame returned by a no-op transform
    • Bug Fix refuse a convolution that would overwrite a column
    • Bug Fix carry the confound role through convolution
    • Bug Fix reject a nonpositive or nonfinite resample target
    • Bug Fix keep downsample's grouping key out of the data
    • Bug Fix resample the row count of a column-less design
    • Bug Fix validate and coerce Roc inputs in one place
    • Bug Fix evaluate the ROC curve at its empirical operating points
    • Bug Fix pair forced-choice errors by subject
    • Bug Fix derive forced-choice centering instead of rewriting the scores
    • Bug Fix keep the empty corner out of threshold selection
    • Bug Fix require a finite criterion value
    • Bug Fix collapse masks on the input's own voxel axis and drop every overlap
    • Bug Fix read voxel sizes from the affine's column norms
    • Bug Fix return simulated data on the simulator's own brain mask
    • Bug Fix size each covariance block by its own region
    • Bug Fix draw noise for every repetition, not one shared image
    • Bug Fix take peak extents from nltools' own cluster labeling
    • Bug Fix drop voxels exactly at the cluster-report threshold
    • Bug Fix build the signal box exactly signal_width wide
    • Bug Fix count negative discoveries in the false discovery rate
    • Bug Fix clear fitted results when add_signal replaces the data
    • Bug Fix threshold with the arguments plot_grid_simulation was given
    • Bug Fix stop expand_mask rounding the caller's labeled image
    • Bug Fix reject a zero entry in roi_to_brain_from_atlas's roi_labels
    • Bug Fix record the FDR cutoff at the q that was requested
    • Bug Fix report a zero extent for a peak outside every cluster
    • Bug Fix draw silhouettes on the supplied axis and relabel graphs by copy
    • Bug Fix balance transform_pairwise labels and squeeze dot_product
    • Bug Fix refuse to bootstrap fewer than two matrices
    • Bug Fix exclude the diagonal from every SRM average
    • Bug Fix pair reciprocal dyads in the social relations model
    • Bug Fix compute the SRM two-tailed p-value from |t|
    • Bug Fix keep the declared matrix type through generate_permutations
    • Bug Fix draw one-panel stacks and give every panel its shared labels
    • Bug Fix read a flat similarity operand as the source matrix type
    • Bug Fix look up pivoted label columns by their string names
    • Bug Fix match label columns in polars' own spelling
    • Bug Fix lend the source matrix kind only when there is one to lend
    • Bug Fix always sample the volume on the pial surface
    • Bug Fix write adjacency labels from the array the dtype was probed on
    • Bug Fix store banded feature spaces under ordinal HDF5 names
    • Bug Fix count loose kwargs in front of a later keyword-only marker
    • Bug Fix wrap a cell's final expression at its column
    • Bug Fix count pytest errors as an unsuccessful release test state
    • Bug Fix refuse a tutorial trim that cuts through an event
    • Bug Fix count pytest errors only in the summary line
    • Bug Fix re-home data the loader accepts onto the mask's exact affine
    • Bug Fix re-extract when a replacement mask changes the support
    • Bug Fix re-extract stored HDF5 columns onto a caller-supplied mask
    • Bug Fix keep metadata and honour mask= when constructing from a list
    • Bug Fix keep the field of view when resampling to a resolution
    • Bug Fix collapse only a leading singleton image axis on construction
    • Bug Fix count a single image as one image, not one per voxel
    • Bug Fix replace metadata rows by column name without changing dtypes
    • Bug Fix validate metadata row counts at ingress
    • Bug Fix own the mask and metadata inherited from a source BrainData
    • Bug Fix restore gc.collect once every coalescing frame has left
    • Bug Fix compare shapes when testing BrainData equality
    • Bug Fix require the same voxels to combine two BrainData objects
    • Bug Fix weight a single image with a length-one vector
    • Bug Fix compare similarity on shared voxels, not shared support size
    • Bug Fix require an observation axis before bootstrapping
    • Bug Fix keep the requested tail when thresholding with clusters
    • Bug Fix stop truncating standardized integer and boolean data
    • Bug Fix classify an extract_roi atlas by its nonzero labels
    • Bug Fix make regions(is_mask=True) reachable and honour min_region_size
    • Bug Fix carry filter row metadata through nilearn's run ordering
    • Bug Fix resolve the scorer once before searchlight and ROI decoding
    • Bug Fix percent-encode feature-space names when writing a fit
    • Bug Fix forward ax to nilearn's glass and slice plots
    • Bug Fix show the weight map that predict(plot=True) promises
    • Bug Fix reject an axis for multi-image plots and hide detach_single
    • Bug Fix let limit=1 satisfy the single-map axis guard
    • Bug Fix promote integer input before the Euclidean fast path
    • Bug Fix keep voxelwise phase-randomized surrogates in float64
    • Bug Fix accumulate the subject mean in float64 on every path
    • Bug Fix refuse two ISC groups with different voxel counts
    • Bug Fix mask bootstrap self-correlations by subject identity, not by value
    • Bug Fix summarize ISC resamples over the draws that are defined
    • Bug Fix report NaN for a feature whose observed ISC is undefined
    • Bug Fix budget and plan workers from what a replicate really holds
    • Bug Fix honour n_jobs and progress_bar on the surrogate ISC methods
    • Bug Fix keep a merged accumulator's retained capacity
    • Bug Fix return a float p-value for two-dimensional ISC input
    • Bug Fix raise when a NeuroVault collection downloads no images
    • Bug Fix rank spearman permutations in float
    • Bug Fix stop holm_bonf at the first failed comparison
    • Bug Fix check voxel correspondence and keep the thresholded shape
    • Bug Fix promote an integer design to float before the covariance
    • Bug Fix count residual degrees of freedom by the design's rank
    • Bug Fix report an undefined fit as NaN instead of t = 0, p = 1
    • Bug Fix count the cutoff itself as a closest existing value
    • Bug Fix skip missing values when taking quantile cutoffs
    • Bug Fix attribute a frame difference to the volume it moved into
    • Bug Fix bin downsample groups by floor, and keep the grouping key private
    • Bug Fix floor the whitening scale in the fitted dtype
    • Bug Fix keep both axes of a returned null distribution
    • Bug Fix wrap an oversized circle shift instead of ignoring it
    • Bug Fix squeeze only trailing singleton axes in find_spikes
    • Bug Fix drop non-numeric columns in upsample, as documented
    • Bug Fix report the residual df multivariate_similarity actually used
    • Bug Fix interpolate Boolean columns in upsample instead of dropping them
    • ⚠ Breaking Bug Fix name make_cosine_basis's second argument for what it takes

    • Breaking: make_cosine_basis(nsamples, sampling_freq=...) is now make_cosine_basis(nsamples, sampling_interval=...). There is no alias. Positional calls are unchanged.

    • Bug Fix let align default n_features to the smallest subject
    • Bug Fix recover ordinary kernel coefficients in the working dtype
    • Bug Fix route and budget the kernel form per space, assign state after the solve
    • Bug Fix round atlas labels to integers instead of truncating them
    • Bug Fix linearly detrend each voxel before spike detection

Documentation

  • Docs Streamline CLAUDE.md and add token-efficient pytest guidance
  • Docs Update documentation to reflect completed test suite refactoring
  • Docs Update documentation for R², effect variance, and filter method
  • Docs Update nilearn-log.md with Phase 1 & 2 completion status
  • Docs Update nilearn-log.md with Phase 3 completion status
  • Docs Update REFACTORING_PLAN.md with Priority 2.5 completion
  • Docs Add systematic benchmarking framework and update project specs
  • Docs Add remaining v0.6.0 tasks to refactoring plan
  • Docs Improve API documentation infrastructure and organization
  • Docs Refactor documentation into focused, purpose-built files
  • Docs suppress sphinx build warnings with exclude patterns
  • Docs eliminate all Sphinx build warnings (45→0)
  • Docs docs scaffold
  • Docs Document parallel testing safety with pytest-xdist
  • Docs Convert all docstrings from NumPy to Google style
  • Docs Enforce parallel-first and permission-gated tier2 testing
  • Docs Update refactor docs and archive completed research
  • Docs Complete documentation update for GPU-accelerated inference module
  • Docs add GitHub issues audit for v0.6.0 planning
  • Docs add update notices to tutorials using deprecated localizer dataset
  • Docs document API issues in migration guide
  • Docs Add BrainCollection tutorial
  • Docs Update migration guide and API docs for v0.6.0
  • Docs Add encoding models tutorial (08_encoding_models.py)
  • Docs Consolidate group_analysis + thresholding tutorials
  • Docs Heavy prune 01_glm.py tutorial
  • Docs Prune tutorials removing pedagogy, keeping practical code
  • Docs Add CHANGELOG.md with pipeline infrastructure release notes
  • Docs Add Pipeline workflow tutorials
  • Docs Document predict algorithms and class_weight='balanced' (GH #182, #177)
  • Docs Add comprehensive v0.6.0 codebase audit
  • Docs Fix all 236 documentation build warnings
  • Docs standardize docstrings to Google-style and fill gaps
  • Docs add API doc pages for pipelines, simulator, neighborhoods, and cache
  • Docs fix migration guide inaccuracies and add missing SRM docs
  • Docs clarify mask handling behavior in migration guide
  • Docs organize BrainData API page into navigable grouped sections
  • Docs fix docstrings across braindata subpackage
  • Docs fix docstrings and add API pages for design_matrix subpackage
  • Docs add API pages for collection subpackage, clean up braindata imports
  • Docs migrate from Jupyter Book v1 to v2 (mystmd)
  • Docs rewrite BrainData tutorial with execution support
  • Docs add class renames, import paths, and ttest removal to migration guide
  • Docs rewrite DesignMatrix tutorial with execution support
  • Docs rewrite Adjacency tutorial with execution support
  • Docs improve BrainData API page layout and griffe2md postprocessing
  • Docs apply same API page improvements to DesignMatrix class
  • Docs apply same API page improvements to Adjacency class
  • Docs remove unused paired .py files for rewritten tutorials
  • Docs apply same API page improvements to BrainCollection class
  • Docs rewrite BrainCollection tutorial with execution support
  • Docs suppress progress bars in BrainCollection tutorial
  • Docs docs updates
  • Docs add gallery index page for API Classes sidebar section
  • Docs include tutorial pages as hidden TOC entries
  • Docs docs updates
  • Docs capture v0.6.0 API conventions and breaking-commit format
  • Docs sync migration guide with last month of breaking commits
  • Docs fix tutorial kwarg names and ridge-regression xref
  • Docs regenerate from current source
  • Docs use load_haxby_example in first-level GLM
  • Docs merge group analysis into the GLM tutorial
  • Docs add explicit decompose mentions
  • Docs PPI worked example using v0.6.0 idioms
  • Docs loading canonical brain images section
  • Docs regenerate api docs to pick up docstring drift
  • Docs switch tutorial atlas from k200 to k50 for faster builds
  • Docs refresh Multivariate_Prediction migration guidance
  • Docs mark Multivariate_Prediction migration done
  • Docs enable RSA tutorial and rewrite for current API
  • Docs rewrite RSA tutorial for trial-level RSA in MNI space
  • Docs add marimo→myst pipeline and GLM tutorial template
  • Docs consolidate workflows into 4 standardized notebooks
  • Docs remove broken BrainCollection basics card
  • Docs align API doc generation with the uv-cleanup module layout
  • Docs standardize docstrings to Google/Markdown, automate changelog, fix migration guide
  • Docs fix broken cross-reference links in generated API docs
  • Docs document iplot() colorbar + threshold slider; ipywidgets in JupyterLite
  • Docs explicit page-scoped MyST targets to silence heading-ref warnings
  • Docs silence remaining mystmd build warnings (frontmatter, grid, docstrings)
  • Docs regenerate API reference (fetch_pain signature + docstring fixes)
  • Docs update SPEC status header to reflect implemented state
  • Docs regenerate API reference after BrainCollection bring-over
  • Docs regenerate collection_core after seq-tiebreak
  • Docs regenerate API reference for statistic rename + permutation removal
  • Docs fix docstring/RST-leakage bucket + regenerate API reference
  • Docs regenerate API reference (F068/F021/F182 + owed drift)
  • Docs wire encoding + isc notebooks for in-browser WASM data (#3673)
  • Docs commit the 0.6.0 pre-release hygiene audit record
  • Docs fix stale Adjacency.similarity/regress/isc claims
  • ⚠ Breaking Docs reorder summary tables to Parameters/Attributes/Classes/Methods

    • Breaking: visible API-doc section order changes across many pages.
    • Docs reconcile Args/Returns docstrings with actual signatures
    • Docs tidy module docstrings (dedupe, drop leftover headings)
    • Docs tidy first-line docstring summaries for griffe tables
    • Docs add BrainCollection basics notebook
    • Docs normalize docstring style (Note: header, typos, models blank line)
    • Docs add interactive design tour + wire standalone-page build
    • Docs add static-markdown tutorial build mode (default) + simplify docs poe tasks
    • Docs trim CLAUDE.md to load-bearing guidance
    • Docs clean up and fix stale references
    • Docs remind to use vendored nilearn/marimo skills
    • Docs delete superseded SPEC.md and ridge design docs; repoint to docs/development
    • Docs reconcile docstrings/comments with implementation across data/stats
    • Docs fix similarity result-key docs to 'correlation'; add semgrep guard
    • Docs reconcile remaining algorithm-layer docstrings with implementation
    • Docs generate canonical-kwarg vocab from a single source
    • Docs regenerate API docs (griffe2md)
    • Docs integrate pikachu CUDA run, make perf doc host-aware
    • Docs correct the nilearn cluster-forming threshold scale
    • Docs batched regeneration — API sources, changelog, tail-docstring cleanup
    • Docs per-subject predict + sklearn cv names — migration guide, execution model, vocabulary
    • ⚠ Breaking Docs plain marimo notebooks, executed previews; defer browser support to 0.6.1

    • Breaking: removed nltools.templates.seed_resources and the Pyodide/IDBFS fetch path, nltools.datasets.PAIN_RESOURCES / EMOTION_METADATA / emotion_resources, scripts/build_marimo_wasm.py, the docs-wasm and test-pyodide poe tasks, the pyodide CI job, and nltools/tests/pyodide. All of it is preserved on the 0.6.1-browser branch.

    • Docs regenerate changelog for the commits since the batched docs pass
    • Docs close the gaps found by the breaking-commit audit
    • Docs regenerate API sources and changelog for the review-fix commits
    • Docs refresh pikachu CUDA baseline at 55e44f06
    • Docs regenerate API reference and changelog for the CUDA-verification and benchmark commits
    • Docs type every Returns entry so griffe2md renders two-column tables
    • Docs one page per module, frontmatter titles, two-column Returns tables
    • Docs fix rendering issues found in the executed-site UI audit
    • Docs regenerate hrf pages for the keyword-only signatures
    • Docs surface griffe warnings, restore class signatures, scope Methods to classes
    • Docs analyses that raise no warnings, and a build that proves it
    • Docs "Open in molab" badge and edit/source links that point at the notebook
    • Docs every public docstring renders correctly
    • ⚠ Breaking Docs organize the reference by task instead of by module layout

    • Breaking: the per-module API pages are gone; api/plotting, api/mask, api/io, api/dataset, api/crossval, api/analysis, api/simulator, api/data/atlases* and api/algorithms/{corrections,outliers,signal, similarity,regression,hrf,alignment*,inference_*} are now the task pages under api/tasks/. Old deep links break.

    • Docs task-oriented User Guide between the tutorials and the reference
    • Docs specify modeling and data facade contracts
    • Docs complete BrainData bootstrap contract
    • Docs define BrainData ownership and persistence
    • Docs refine collection and spatial contracts
    • Docs track 0.6.0 recovery plan in kata
    • Docs specify shared t-test dictionary contract
    • Docs record the 0.6.0 release verification matrix
    • Docs drop the performance page and move benchmark tables to the development docs
    • Docs scaffold the zensical site and convert the static pages
    • Docs generate the API reference with mkdocstrings-python
    • Docs render the marimo tutorials through markdown-exec at build time
    • Docs port the data-operations examples as marimo tutorials
    • Docs port the analysis examples as marimo tutorials
    • Docs replay recorded tutorial outputs and make docs-serve self-contained
    • Docs rearrange the nav around ported and new tutorials (work in progress)
    • Docs delete the interactive design tour
    • Docs state the two-layer architecture and the user-facing surface in CLAUDE.md
    • Docs explain why the niivue canvas sits in a fixed-height wrapper
    • Docs drop the kata workflow block from the agent instructions
    • Docs the alignment estimators are internal after the export trim
    • Docs cut the site to the pages that are stable today
    • Docs make AGENTS.md a symlink to CLAUDE.md
    • Docs move the maintainer design notes out of the site build
    • Docs fold the parked guide's gotchas into the reference docstrings
    • Docs rewrite the migration guide as a brief user-facing document
    • Docs prose review of the migration guide
    • Docs consolidate five BrainData notebooks into one tutorial
    • Docs build the BrainData tutorial page into the site
    • Docs prose review of the BrainData tutorial
    • Docs state extract_roi's ROIs-by-images return shape
    • Docs draw fewer glass brains in the BrainData tutorial
    • Docs consolidate the DesignMatrix notebooks into one tutorial
    • Docs build the DesignMatrix tutorial page into the site
    • Docs prose review of the DesignMatrix tutorial
    • Docs one output per cell in the DesignMatrix tutorial
    • Docs list the tutorials flat under the Tutorials heading
    • Docs one output per cell in the BrainData tutorial
    • Docs consolidate the Adjacency notebooks into one tutorial
    • Docs build the Adjacency tutorial page into the site
    • Docs prose review of the Adjacency tutorial
    • Docs add a browser quickstart on zensical's pyodide fence
    • Docs render figures and HTML from pyodide cells
    • Docs point the quickstart at the first tutorial page
    • Docs write the quickstart as a marimo notebook
    • Docs make the quickstart's simulations show what they claim
    • Docs link the quickstart to the Adjacency tutorial
    • Docs prose review of the quickstart
    • Docs read the ridge fit through the facade in the quickstart
    • Docs render anywidget results in the live pyodide cells
    • Docs show the interactive viewer in the quickstart
    • Docs open the quickstart viewer thresholded at the top five percent
    • Docs record the three plotting default changes in the migration guide
    • Docs give plot_stacked its vocabulary rows and migration entry
    • Docs read the fit through data.model everywhere
    • Docs say what a restored fit can still do
    • Docs say why a ridge bootstrap still takes the training features
    • Docs make the estimator-persistence note a note
    • Docs record who owns a result record's payloads
    • Docs run the quickstart on the Haxby example dataset
    • Docs tighten the quickstart's new prose
    • Docs label the quickstart's intersubject RSA subjects
    • Docs give the quickstart more features than timepoints, and one load for five subjects
    • Docs install the version the live page was built from
    • Docs smooth the quickstart's first brain map before viewing it
    • Docs window the quickstart's first map to the top 0.5%
    • Docs prose review of the revised quickstart
    • Docs import the real class names in the estimator examples
    • Docs record the DesignMatrix and Roc behaviour changes
    • Docs name the infinite endpoint of criterion_values
    • Docs import fetch_resource from its advertised namespace
    • Docs record the simulator, mask, cluster-report and brain-space fixes
    • Docs record the visible Adjacency sweep fixes
    • Docs drop two rows that do not describe v0.5.1
    • Docs fix the flatmap examples and name the nilearn delegates
    • Docs call the margin values decision function scores
    • Docs record the ordinal feature-space layout in the spec
    • Docs name the wrapped nilearn calls and correct the resample=False note
    • Docs record the BrainData core behaviour changes
    • Docs record the BrainData modeling and plotting fixes
    • Docs correct the regions, write and mask-check docstrings
    • Docs record the identity-based self-correlation mask
    • Docs say that make_cosine_basis takes a TR, not a frequency
    • Docs record the visible statistics sweep fixes
    • Docs use the shared block order instead of re-sorting TRs
    • Docs state make_cosine_basis's real basis count and why add_dct_basis inverts
    • Docs name the axis align's default n_features measures
    • Docs record load_haxby_example's block_order keyword
    • Docs describe the site as it is built today
    • Docs record the ridge solver form and its kernel branches

0.5.0 (2023-10-31)

Bug Fixes

  • Bug Fix fix documentation build errors
  • Bug Fix fix testing bug
  • Bug Fix fix #413
  • Bug Fix fix up test bugs, support pandas 2.0, pin numpy until we replace deepdish, use only pip for GA
  • Bug Fix fix #409
  • Bug Fix fix #392
  • Bug Fix fix up docs testing. merge cron and push GA files
  • Bug Fix fix bug in downloading data

0.4.6 (2022-08-15)

Improvements

  • Improvement refactored trim and winsorize to single subfunction
  • Improvement refactored correlation_permutation with combined case testing.
  • Improvement refactored tests
  • Improvement refactored code using sourcery
  • Improvement refactored code using sourcery
  • Improvement refactored roi_to_brain to be much faster

Bug Fixes

  • Bug Fix fixed bug
  • Bug Fix fixed bug
  • Bug Fix fixed predict problems
  • Bug Fix fixed bug with plotting with no Xval
  • Bug Fix fixed bug
  • Bug Fix fix error related to email alert
  • Bug Fix fix an undefined variable; format the code layout
  • Bug Fix fix undefined attribute
  • Bug Fix fix numpy's ValueError: The truth value of an array with more...
  • Bug Fix fixed dist_from_hyperplane_plot bug
  • Bug Fix fixed tests
  • Bug Fix fixed simulator test
  • Bug Fix fixed pytests
  • Bug Fix fixed cross_validation bug from updating to sklearn 0.17
  • Bug Fix fixed bug in analysis.Predict and updated tutorials
  • Bug Fix fixed bug when self.Y is empty
  • Bug Fix fixed bug in similarity metric
  • Bug Fix fixed small bug
  • Bug Fix fixed bug in Brain_Data.bootstrap() method related to indexing
  • Bug Fix fixed bug with Brain_Data.similarity
  • Bug Fix fixed roc figure return type
  • Bug Fix fixed icc bugs
  • Bug Fix fixed bug on Brain_Data list import
  • Bug Fix fixed extract_roi bug
  • Bug Fix fixed bugs with permutation ttest
  • Bug Fix fixed cross-val bug and added test
  • Bug Fix fixed typo
  • Bug Fix fixed bug
  • Bug Fix fixed bug with upload naming
  • Bug Fix fixed bug in Adjacency import function
  • Bug Fix fixed bugs
  • Bug Fix fixed downsample bug
  • Bug Fix fixed bugs in tutorials
  • Bug Fix fixed bugs in cross-validation
  • Bug Fix fixed bug with apply_mask
  • Bug Fix fixed bug with apply mask
  • Bug Fix fixed test tolerance
  • Bug Fix fixed test
  • Bug Fix fixed bug with Adjacency.append()
  • Bug Fix fix auto-rounding bug in extract_roi
  • Bug Fix fixed bug with reading directed flat adjacency data
  • Bug Fix fix mn_score bug in Roc.calculate for forced choice
  • Bug Fix fix forced_choice_idx in Roc.calculate function
  • Bug Fix fix the line up issue in analysis.py line 95
  • Bug Fix fixed roc forced choice plotting bug
  • Bug Fix fixed bug in roc forced choice plotting
  • Bug Fix fixed bug with create sphere and mask
  • Bug Fix fixed neurovault_upload method
  • Bug Fix fixed tests
  • Bug Fix fixed tests
  • Bug Fix fixed bug with cross-validation in predict
  • Bug Fix fixed bug in simulator
  • Bug Fix fixed bug in test_analysis
  • Bug Fix fixed typo
  • Bug Fix fixed roc forced choice accuracy
  • Bug Fix fixed kwargs bug
  • Bug Fix fix issue #152, rename Stimulus to Stim to keep the naming consistent
  • Bug Fix fixed bug that requires creating a copy of input data on align function.
  • Bug Fix fixed Brain_Data.threshold bug
  • Bug Fix fixed random seed issue with permutations/bootstraps and joblib
  • Bug Fix fixed check_random_state imports
  • Bug Fix fixed transform pairwise and added tests
  • Bug Fix fixed bug in test and crucial missing line in function
  • Bug Fix fixed nilearn version dependency
  • Bug Fix fixed bug regression bug with 2d arrays
  • Bug Fix fixed bugs in regression
  • Bug Fix fixed missing plot call
  • Bug Fix fixed check_brain_data bug
  • Bug Fix fixed typos
  • Bug Fix fixed bug with social relations model
  • Bug Fix fixed bug in fetch_localizer
  • Bug Fix fixed predict Y warnings.
  • Bug Fix fixed pearsonr bug
  • Bug Fix fixed bug with glover_hrf function
  • Bug Fix fixed bug with labels in Adjacency.plot_silhouette
  • Bug Fix fixed issues with labels in plot_mds
  • Bug Fix fixed silent errors to roi_to_brain
  • Bug Fix fixed doc string for roi_to_brain
  • Bug Fix fixed extract_roi bug and added new functionality
  • Bug Fix fixed import error with ipywidgets
  • Bug Fix fixed isc bugs
  • Bug Fix fixed smooth bug
  • Bug Fix fixed codacy recs.
  • Bug Fix fixed new smooth test.
  • Bug Fix fixed align check.
  • Bug Fix fixed spacing.
  • Bug Fix fix ga. fix bug in design matrix repr. pin pandas version until deepdish updates.
  • Bug Fix fixes #364
  • Bug Fix fixed broken tests
  • Bug Fix fixed cluster_summary in adjacency tutorial
  • Bug Fix fix ci badge. try to fix failing gallery build on ga
  • Bug Fix fix #396, fix #398, remove uneccesary files for doc build
  • Bug Fix fix nilearn warnings and onsets_to_dm warnings