Repository navigation
What's Changed
Features
- feat(io/nwb): SpatialRatesResult round-trip (write_spatial_rates/read_place_field) + lazy reads (92cb14a)
- feat(decoding): add immutable BayesianDecoder (fit/predict/predict_summary/score) over the decode core (5ec00da)
- feat(recording): add frozen Session bundle + load_session (from_arrays/from_nwb, with_environment/restrict) (5edf393)
- feat(behavior): add restrict/in_epochs/restrict_spike_trains (array or IntervalSet epochs) (9b940fa)
- feat(encoding): add SpikeTrains ragged-spike container (label access, filter, unit_table) (1eba7ca)
- feat(typing): add PositionLike/SpikeTrainsLike/EnvironmentLike Protocols + pynapple ingress (optional) (b35330c)
- feat(decoding): honor float32 end-to-end through decode_session(_summary) via a dtype knob (fd58811)
- feat(encoding): speed filtering masks both spikes and occupancy in encode path (c514061)
- feat(decoding): add memory-safe summary decode + dtype/time_chunk on decode_position (afc1d68)
- feat: Update documentation and code to reflect 'unit' terminology for v0.6 API consistency (a5520ab)
- feat: Add ux-reviewer agent for evaluating user experience in scientific software (b2d3cdb)
- feat: Update API for detect_region_crossings and enhance documentation (0c0488e)
- feat(environment): experiment-shaped factory presets (open_field, linear_track, maze) (928a921)
- feat(encoding,behavior,decoding): enforce naming contract (classify/label_cell_types/is_place_cell/peak_location; decode_position result arg; deprecation aliases) (e3c9c94)
- feat(results)!: split terminal verbs — dense to_dataframe + new summary_table; PSTH ResultMixin (breaking, D1) (ccc72a6)
- feat(results)!: to_xarray returns a labeled xr.Dataset (breaking, D1) (14fe4f3)
- feat(encoding,events): thread unit_ids through population results and compute functions (c3e29e9)
- feat(decoding): add decode_session() one-call encode->bin->decode golden path (b1fabc4)
Bug Fixes
- Merge pull request #25 from edeno/phase-3-pynapple-validation (6d8f7e2)
- fix(io/pynapple): validate shapes in to_pynapple (ValueError, not raw AssertionError) (241ed10)
- Merge pull request #24 from edeno/phase-3-trajectory-extra (3d635b1)
- fix(decoding): drop nonexistent neurospatial[trajectory] hints (scikit-image is core) (51e1ac5)
- Merge pull request #23 from edeno/phase-3-nwb-extra-msgs (8f4ac4d)
- fix(io/nwb): ndx-pose/ndx-events ImportError hints name the real [nwb] extra (14a8d93)
- Merge pull request #22 from edeno/phase-3-bugfixes (e5c11d9)
- fix(interop): restrict speed under fit(epoch=); mixed-type unit_ids; correct nwb extra name (56d0b51)
- fix(io/nwb): persist+validate env on rates round-trip (no degenerate env); atomic write; occupancy integrity; lazy length checks + unit caching; add nwb CI job (fefe6c3)
- fix(decoding): score warns/raises on undecodable bins; validate BayesianDecoder config+fitted state; add is_fitted, warn_on_drop, score distance=; error provenance (ff606f3)
- fix(recording): raise on malformed NWB env (not silent None); add environment_name; warn on empty restrict; Position self-validates (822ebc4)
- fix(behavior): raise on ambiguous nested-list epochs; validate closed on empty epochs; doc NaN exclusion (a3d6ee2)
- fix(typing): extract TsGroup trains by unit-id index (not iterate-keys); narrow EnvironmentLike; fix pynapple tests (9fd8d86)
- fix(decoding): route log_poisson_likelihood/poisson_likelihood dt through shared validate_dt (9b939a5)
- fix(decoding): validate dt in decode_position_summary too; test decode_position(_summary) dt guards; unify dt message; fix examples README sync wording (917ad4b)
- fix(decoding): unify dt validation (reject str/bool) via shared helper; clean ValueError for unparseable dtype (726ed71)
- fix(decoding): clean error for non-numeric/bool dt; restrict sync prune to numbered examples (23501df)
- fix(decoding): validate dt (finite, >0) in decode_session(_summary) before grid math (2766022)
- fix(decoding): preserve float32 in result-object handoff; validate time_chunk as positive int (not bool/float/str) (20b0e63)
- fix(decoding): reject time_chunk=None in summary decoders (it defeats the never-materialize-full-posterior contract) (eeb3d80)
- fix(encoding): warn when interval filtering empties the rate map (max_gap/out-of-bounds, not just min_speed) (7536d53)
- fix(decoding): validate prior shape in decode_position_summary (was silently truncating over-long 2D priors) (8b18f59)
- fix(encoding): align spike counts with occupancy on the FULL interval mask (max_gap, out-of-bounds, speed) (87b2164)
- fix(encoding): raise on speed-without-min_speed; warn on all-excluded speed filter; tighten final-sample gate (d13c968)
- fix(decoding): robust scaling test, precise float32 summary reductions, quiet degenerate-row warning (0847aa7)
- fix: address Phase 1 PR review (linear_track NaN guard, unit_table validation, all-NaN peaks, decode_position error, maze kind, honest annotations, docs) (92067e7)
- fix(encoding,docs): add peak_locations() to batch results; correct CLAUDE.md peak/cell-type contract; dedup CHANGELOG (aee29bf)
- fix(environment): order-based (coordinate-independent) maze topology; no track_graph mutation (9d9cc69)
- fix(results): raise (not silently skip) on xarray coord shape mismatch; omit None units (eeac275)
- fix(decoding): validate times up front in decode_session (beginner-grade non-finite error) (ec427eb)
- fix(decoding): warn on out-of-window spike drop in decode_session (units footgun) (09b1dea)
- fix: address Phase 0 PR review findings (E1006 code, docs accuracy, test gaps) (3f779e7)
- fix(decoding): keep decode_session export in neurospatial.decoding only (e6b2030)
- fix(environment): distance_to raises RegionNotFoundError for missing region (KeyError-compatible) (85410c0)
- fix(errors): remove internal-doc (CLAUDE.md) references from user-facing errors (63c8062)
- fix(environment): correct factory examples + error code in bare-Environment() message (3eaa207)
- fix(environment): beginner-grade error for bare Environment() pointing to factories (80d6ae7)
- fix(events): reject Inf event_times in align_spikes_to_events (matches docstring) (a364db1)
- fix(behavior): normalize array-likes at trajectory public boundaries before .ndim (2d4b5f8)
- fix(encoding): address review findings on spike-drop warning (4b3dfa5)
- fix(encoding): warn when spikes are dropped outside trajectory window or inactive bins (0d04d01)
Documentation
- docs(interop): add Interoperability guide (session-first-optional: pynapple/NWB/Session/SpikeTrains/BayesianDecoder) (7848436)
- docs(plan): add Phase 3 interop/ergonomics design RFC (locks Protocols, Session, BayesianDecoder) (a0dc512)
- docs(decoding): widen likelihood Raises docstrings to match new dt validation (65b0e2c)
- docs(changelog): sync hosted changelog with latest v0.6 fixes (dt/dtype validation, float32 result handoff, time_chunk) (bdf2afd)
- docs(animation): fix broken per-frame memmap rate-map example; clarify jupytext vs docs-mirror sync; soften index parity claim (06f5e91)
- docs(examples): add missing example-23 row to index; correct CI sync guidance; prune stale mirrors in sync script (ebf0397)
- docs: surface decode_session_summary/scale APIs (api index, workflow long-session callout, batch processing, snippet CI) (15dd728)
- docs(changelog): sync hosted changelog with v0.6 scale API (dtype end-to-end, time_chunk hybrid + None rejection, summary speed forwarding) (e3eb03c)
- docs(encoding): correct compute_spatial_rates dtype note for R8 (decode_session now honors float32 end-to-end); test blockwise prior validation (cc7c498)
- docs: teach compute_spatial_rates batch path in README/animation/overlays/metrics (not per-neuron loops) (fe83cc4)
- docs(changelog): smoothing kernels warn and proceed (no hard gate / allow_large) (4a099e2)
- docs(examples): re-sync stale bayesian-decoding mirror from source; add CI sync guard (961ea4c)
- docs(decoding): teach batch/decode_session path not the per-neuron loop; add Phase 2 entries to docs changelog (241a8d5)
- docs/fix(decoding): correct time_chunk memory claim; DecodingSummary map_estimate + post-init validation; test gaps (59b3a56)
- docs(encoding): clarify float32 dtype decode-memory scope; fix batch return annotations (4dbfbc9)
- docs(encoding): teach compute_spatial_rates batch path, not the per-neuron loop (952b861)
- docs(encoding): note joblib warning-swallowing in population_coverage; coerce label_cell_types score dtype (27be8cf)
- docs: v0.6 naming contract in CLAUDE.md + migration guide + breaking-change CHANGELOG (1.6, 1.7) (c91184a)
- docs(encoding): note is_place_cell (field-based) vs classify (info-threshold) divergence (review nit) (d725d9f)
- docs,fix(encoding,events): document unit_ids/unit_table/unit_id; guard ndim; honest unit_id scalar (2a4d1ac)
- docs: sync Phase 0 plan §0.7 to shipped decode_session; archive re-review (d5cb4eb)
- docs(reviews): archive Phase 0 independent review with resolution note (d296b58)
- docs,ci: bump installation.md to v0.5.0; execute nb-20 in notebook CI (0abba24)
- docs: align decode_session example with manual path + execute notebook (review fixes) (b0b1e55)
- docs: teach decode_session as the one-call decode golden path (720547f)
- docs: fix degenerate Workflow 1 example + review nits (Phase 0.6) (4bb7636)
- docs: teach one canonical beginner path; fix broken API snippets (Phase 0.6) (da3ba4c)
- fix(errors): remove internal-doc (CLAUDE.md) references from user-facing errors (63c8062)
- docs(plan): apply independent + maintainer review findings to v0.6 plan (8cf9c92)
- docs(plan): add v0.6 UX implementation plan + review synthesis (9ccf0f7)
- docs: update CHANGELOG.md for v0.5.0 (9552a27)
Other Changes
- Merge pull request #27 from edeno/chore/release-0.6.0 (ce62eff)
- chore(release): 0.6.0 — bump version, cut CHANGELOG [0.6.0], sync docs; fix stale doc refs (aa3e80f)
- chore(reviews): strip trailing blank line at EOF (git diff --check hygiene) (b393fd3)
- Merge pull request #21 from edeno/phase-3-simplify (19beb30)
- refactor(interop): dedup pynapple adapters, collapse Session spike coercion, avoid double spike/interval normalization (35af797)
- refactor(encoding): store SpikeTrains.trains as an immutable tuple; fix lazy-export comment (229135e)
- test(io): cover to_pynapple TypeError guard for non-result + values=None (3d27e81)
- chore(deps): lock pynapple optional extra (quantities, tabulate) (dd06e7e)
- test(decoding): structural throughput guard for summary decoders (per-block decode count = ceil(n_time/time_chunk), independent of n_neurons) (b0da2c1)
- test(encoding): enforce batch throughput contract — occupancy/kernel computed once, not per-neuron (deterministic call-count) (2aa7c21)
- test(decoding): cover decode_position time_chunk<1 guard; route summary prior-shape check through shared helper (f0d40d7)
- refactor(smoothing): warn (don't hard-gate) on high-bin dense kernels; drop allow_large/_KERNEL_HARD_LIMIT_BINS (a3e74eb)
- refactor(decoding): make decode_session_summary block-alignment check unconditional (survive -O) (08568b9)
- test(encoding): guard population_coverage docstring arg order (55c6bee)
- refactor(environment): sync compute_kernel protocol signature with allow_large (63c6d09)
- refactor: Remove type ignore comments for clarity in various encoding functions (fe31432)
- refactor: Rename methods and update docstrings for clarity in encoding tests (64d30ab)
- feat(encoding,behavior,decoding): enforce naming contract (classify/label_cell_types/is_place_cell/peak_location; decode_position result arg; deprecation aliases) (e3c9c94)
- test(encoding): rename stale to_dataframe/neuron_id test names to summary_table/unit_id (review nit) (7e882c0)
- refactor(decoding): let encoder own the drop warning in decode_session None branch (891a5be)
- refactor(encoding): rename normalize_spike_times -> as_spike_trains (f4cf99a)
- refactor(decoding): polish decode_session per review (times guard, ArrayLike, tests) (9bd454d)
- test: let CLAUDE.md backstop raise on unreadable file (review nit) (5ae370c)
- fix(environment): beginner-grade error for bare Environment() pointing to factories (80d6ae7)
- test(events): strengthen finite-event_times assertion (review nit) (8cad979)
- test(behavior): add list-input normalization tests for traveled_path_length (b81d78b)
- chore(worktrees): ignore .claude/worktrees/ for per-task subagent worktrees (994e796)
Full Changelog: v0.5.0...v0.6.0