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
methodon 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
thresholdkwarg is unchanged. -
⚠ Breaking Feature standardize permutation count kwarg to n_permute
-
Breaking: Adjacency.generate_permutations now takes
n_permuteinstead ofn_perm, matching the convention already used in Adjacency.similarity, plot_silhouette, stats_label_distance, and BrainCollection.isc_test/permutation_test[2]. BrainCollection.align'sn_iterstays (optimizer iterations, not permutations). -
⚠ Breaking Feature flip similarity diagonal flag to include_diag
-
Breaking: Adjacency.similarity now takes
include_diag=Falseinstead ofignore_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
radiuskwargs taking a sphere/searchlight radius in millimeters are renamed toradius_mmfor 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_dmandnltools.io.file_readerare removed. UseDesignMatrix(path, run_length=N, TR=t)(orevents_to_dmfor 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 storesconfoundsmetadata attr (waspolys). 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
limitkwarg + change slices default view to "z" -
Breaking:
BrainData.plot()returnslist[Figure]for multi-image glass/slices plots instead of a single Figure. The default slicesviewchanged from"xyz"to"z"; passview="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 = […]anddm.confounds = […]now raiseAttributeError. Pass via theconvolved=/confounds=constructor kwargs, or use.append(other, axis=1)(raw DataFrames are auto-marked as confounds;as_confounds=Truepromotes 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:]orspikes.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=...). Theview=kwarg is canonical withview='ortho'(default).bg_img=matches nilearn naming. Thenltools[interactive_plots]extra is gone —anywidgetis 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
filenamecolumn. - 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;scaledefault 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(wasfigsize). Pass figsize=... as a keyword. dm.plot() with no args is unchanged. -
⚠ Breaking Improvement rename BrainCollectionPipeline.normalize → standardize
-
Breaking:
BrainCollection.cv(...).normalize(...)is nowstandardize(...). -
⚠ Breaking Improvement BrainCollectionPipeline.predict returns BrainData
-
Breaking:
BrainCollectionPipeline.predictno longer returnsBrainCollectionCVResult; that class is removed. Downstream code reading.mean_score/.scorescontinues to work since the attributes live on the BrainData now (note:.scoresis renamed to.cv_scoresto 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
.viewerand.threshold_sliderattributes are gone; the threshold window is reactive via thecal_min/cal_maxtraits.ipyniivueis 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 acceptsdesign_clean,design_clean_thresh,design_clean_exclude_confounds, ordesign_clean_fill_na, and no longer runsDesignMatrix.clean()implicitly. It estimates exactly the design it is given. Callers who want columns dropped callDesignMatrix.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= —
metricnow 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 acceptoversampling,time_length,onsetpositionally. -
⚠ 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; callstandardize(method='zscore', columns=...). The no-argument form standardizes only non-confound columns, wherezscore()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 nowsimilarity(data=…), andmetricis keyword-only; no metric default changed. - Breaking:
Adjacency.plot(axes=…)is nowplot(ax=…);limitandaxare keyword-only and the unused*argspassthrough is gone. - Breaking:
BrainData.appendno longer accepts**kwargs; an unexpected keyword raisesTypeError. - Breaking:
DesignMatrix.append(dm=…)is nowappend(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')andBrainData.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. Useupper=/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_c0appended (notablycompute_contrasts("A - B")becomescompute_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)becomesone_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.csvnow emits comma-separated data (it emitted tabs before, which its own reader could not parse). Code parsing nltools-written.csvfiles with an explicit tab delimiter must switch to comma or passsep="\t"towrite(). - 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=, notconv_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 nowmake_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
- Breaking:
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*andapi/algorithms/{corrections,outliers,signal, similarity,regression,hrf,alignment*,inference_*}are now the task pages underapi/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