You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Condense the 2.0 changelog into curated release notes
Consume the 355 accumulated news fragments with towncrier and replace the
generated output with a hand-curated 2.0.0 section: a Highlights list
ordered by significance (intrinsic units, multi-valued units, closed-form
relations, matching, the 2026 formalism default, performance), then the
eight fragment categories with related entries merged and intermediate
development states collapsed into the final 1.2.0 -> 2.0 delta. Fixes for
behavior that never shipped are compressed into a pointer at git history.
Set towncrier's start_string to the marker comment in CHANGELOG.md; without
it, builds prepend new sections above the file header instead of inserting
at the marker. Update the P15 roadmap row.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PEAxNzhDCaTrntX3o1JqMV
| P11 cluster backends | ✅ landed | 4 | Both halves shipped. **Dask backend** (2026-07-20): `DaskScheduler` distributes map-reduce over a user-connected `distributed.Client` (snapshot propagation, cost-balanced chunks, deterministic short-circuit prefixes; nested dispatch runs in-task); `cluster` extra; `docs/howto/chtc.md` covers CHTC (the Dask worker-pool pattern remains documented as a pilot pending CHTC port-access confirmation — an external facilitation question, not code work). **Campaign surface** (cycles 1+2, 2026-07-20/21): `pyphi.campaign` tasks-as-data batch campaigns — sweep cells (substrates axis on `sweep()`, cost-balanced packing, admission control, condor emitter, campaign ≡ local sweep proven end-to-end) and scoped CES sharding for one system: declarative `AxisScope`/`CESScope` (explicit lists, order bounds, unit containment; serialized into tasks and provenance), scope-aware `estimate_analysis` + per-mechanism `mechanism_workloads`, a three-rung planner (mechanism → purview-range → partition-stride, `bottleneck_first` ordering for sparse reducibility), exact tie-preserving merges (sharded ≡ unsharded verified under both IIT 4.0 presets, winner identity included — per-shard winners restored to global enumeration order), three SIA modes (merged strides / precomputed / intrinsic-state with no Φₛ), version+scheme merge guards, and a certified scope report (exact Σφ_r lower bound + measured upper bounds from `iit4/bounds.py`). MCP: `prepare_campaign`, `prepare_ces_campaign`, `campaign_status`, `collect_campaign`, scope-aware `estimate_cost`, `campaigns` topic; `docs/howto/campaigns.md`. Specs: `docs/superpowers/specs/2026-07-20-htcondor-campaign-design.md` + `2026-07-20-ces-sharding-design.md`. **Follow-ups (2026-07-21, merge `c2229d20`):** `prepare_ces` now sweeps substrates × states × subsets × formalisms under one scope (plan-once-per-group, multi-cell `SweepResult` collection, per-cell scope reports); per-shard `request_memory` estimated from the largest purview repertoire with memory-stratified packing (`request_memory` = floor); order-dependent purview caps (`CESScope.max_purview_order_by_mechanism_order` via the single `purview_axis` selection point); `limit=` threading with a single planning walk; SIA short-circuit handling on weakly-connected subsets; fat-node crossover criteria in the how-tos. Spec: `2026-07-21-scoped-ces-campaign-followups-design.md`. **Production-scale fixes (2026-07-22):** the first 21-unit campaign surfaced four gaps, all landed — purview order caps threaded into the enumeration itself, substrate files at raw-array size (msgpack + verified factor trim, `FORMAT_VERSION` 2), per-cell resolution states for multi-cell campaigns, and specified-state computation scaling past ~14 units; see the 2026-07-22 section below. |
45
45
| Parallel engine unification | ✅ landed | 4 | Collapsed the two coexisting map-reduce implementations into one flat path: replaced the one-shot `MapReduce` class with a `pyphi.parallel.map_reduce()` function over the Scheduler Protocol, migrated all 10 call-sites, deleted the vestigial execution tree (`tree.py`/`test_tree.py` + dead `branch_factor`/`max_*` kwargs), and deduped the ~5 copied helpers. Backend selection (`config.parallel_backend`) is now honored from the public entry. Net ~900 lines removed; result-preserving (N2 + goldens + perf gate green). Prerequisite for B18. Spec/plan: `docs/superpowers/{specs,plans}/2026-06-23-unify-parallel-engine*`|
46
46
| B18 adaptive chunking | ✅ landed | 4 | Activated `ChunkingPolicy.size_func`: a pure `cost_balanced_partition` LPT-packs items into cost-balanced chunks, and the chunk count is floored at `num_workers` (a general core-utilization win, de-risked empirically — 2.8–3× at every per-item cost, no overhead penalty). Cheap `size_func` proxies wired at the heterogeneous sites — relations (`overlap×degree`), purview eval (`2^|purview|`), concept eval (`2^|mechanism|`). Result-preserving (N2 incl. a forced-chunk concept test, goldens, perf gate). `pyphi/parallel/chunking.py`; spec/plan `docs/superpowers/{specs,plans}/2026-06-23-cost-balanced-chunking*`. **Dispatch-gate follow-up (2026-07-07)**: measured the below-chunksize regime (`benchmarks/b18_dispatch_gate.py` + `benchmarks/b18_dispatch_gate_results/`) and flipped the gate — `sequential_threshold` is now the sole dispatch gate; an explicit `chunksize` governs granularity only (a cost-sampled chunksize still gates, since it estimates ~1 s of work). Wins: purview eval 3–4× at 64–230 purviews, system partitions 2.5–4× at 64–2048, complexes 1.2–1.6× at 16–31 candidates; no regression on reducible short-circuiting systems. Per-level thresholds retuned to measured per-item costs (partition 1024→64, mech-partition & relations 1024→8192). The study also surfaced and fixed a per-item `hash(repr(snapshot))` (~1.3 ms) in the process-scheduler worker wrapper that dominated cheap-item workloads (~250× sequential relations speedup on its own) |
47
-
| P15 | 🟡 partial | 5 | Import-surface cleanup landed (eager submodule walk → explicit registry imports + PEP-562 lazy `__getattr__`, guarded by a registry-contents test). jsonify→msgspec landed (`pyphi.serialize` replaces `pyphi.jsonify`; the per-class `to_json`/`from_json` hooks removed) **plus its loading surface** (path-based `serialize.save`/`load`, top-level `pyphi.save`/`pyphi.load`, `.save()`/`.load()` on the result types via a delegation-only `Serializable` mixin, deferred type registration, `substrate.from_json` removed, transparent gzip on `.gz` paths). pandas-extend done (display → B21). Project-stage markers stripped from `pyphi/` + a docstring narrative-removal slice landed. PR triage done (audit against `main`: nothing left to absorb; closes pending a maintainer). Test suite reorganized to mirror the `pyphi/` package layout (`test/<subpackage>/` + `test/integration/`). Remaining: the comprehensive docstring/docs sweep (now its own [Documentation overhaul](#documentation-overhaul-20--iit-40) project), changelog condense |
47
+
| P15 | 🟡 partial | 5 | Import-surface cleanup landed (eager submodule walk → explicit registry imports + PEP-562 lazy `__getattr__`, guarded by a registry-contents test). jsonify→msgspec landed (`pyphi.serialize` replaces `pyphi.jsonify`; the per-class `to_json`/`from_json` hooks removed) **plus its loading surface** (path-based `serialize.save`/`load`, top-level `pyphi.save`/`pyphi.load`, `.save()`/`.load()` on the result types via a delegation-only `Serializable` mixin, deferred type registration, `substrate.from_json` removed, transparent gzip on `.gz` paths). pandas-extend done (display → B21). Project-stage markers stripped from `pyphi/` + a docstring narrative-removal slice landed. PR triage done (audit against `main`: nothing left to absorb; closes pending a maintainer). Test suite reorganized to mirror the `pyphi/` package layout (`test/<subpackage>/` + `test/integration/`). Changelog condensed into curated 2.0.0 release notes (2026-07-23: 355 fragments consumed; hand-edited Highlights + category sections in `CHANGELOG.md`). Remaining: the comprehensive docstring/docs sweep (now its own [Documentation overhaul](#documentation-overhaul-20--iit-40) project) |
48
48
| B17 drop dead deps | ✅ landed | 5 | Removed the declared-but-unused `tblib`; deleted the unused `OrderedSet`/`HashableOrderedSet` types (a sorted tuple is the better unit representation) and dropped `ordered-set`; migrated `toolz` to stdlib `itertools.chain.from_iterable`, `more_itertools.unique_everseen`, and `functools.partial`. Landed with the import-surface cleanup; spec/plan `docs/superpowers/{specs,plans}/2026-06-24-import-surface-cleanup*`|
49
49
| MCP server | ✅ landed | — | Local Model Context Protocol server (`pip install pyphi[mcp]`, `pyphi-mcp` console script; `pyphi/mcp/`) exposing PyPhi to AI assistants: tools wrapping `pyphi.analyze`/examples/`Substrate`/`serialize` (build/load/describe substrates, `analyze` with a soft node-count guardrail + compact-vs-full detail, `inspect` into result slices, `plot` surfacing PyPhi's built-in visualizations — ces/repertoires/connectivity/tpm, plotly→interactive HTML + matplotlib→PNG), plus a bundled IIT teaching layer surfaced three ways (always-loaded `instructions`, `pyphi://theory/*` resources, and a `get_iit_reference` tool) with citation-checked reference content authored from `papers/`, and two workflow prompts. Built on the official `mcp` SDK's FastMCP; doctest collection guarded when the extra is absent. `test/mcp/test_server.py` (known-Φ regression; 2026 differentiation-cap and IIT-3.0 cases); how-to `docs/howto/mcp-server.md`. **Parallelization surfaces (2026-07-16):** a `parallelization` reference topic (the conditions under which work actually parallelizes, the seven levels, which levels pay for which workloads), per-call `analyze(parallel=…, workers=…)`, and a persistent `configure_parallel` tool; alongside, the `parallel_concept_evaluation` config option was renamed to `parallel_distinction_evaluation` (it governs the distinctions loop under every formalism) and the parallel how-to's two factual errors were fixed (the global flag is a gate, not a switch; no `pyphi[parallel]` extra exists) |
50
50
| EMD backend → POT | ✅ landed | 5 | Swapped deprecated `pyemd` for POT (`ot.emd2`) behind `OptionalEMD`; `pyphi[emd]` extra now installs `pot`. Backends agree to machine epsilon (binary + k-ary, 3600 cases); the IIT 3.0 CES-distance EMD was reformulated to proper non-negative OT (the negative-null-mass / signed-φ case), which **reproduces the existing goldens exactly** — no regen needed. |
0 commit comments