jaxfne 0.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. jaxfne-0.1.1/.github/workflows/ci.yml +81 -0
  2. jaxfne-0.1.1/.github/workflows/publish.yml +47 -0
  3. jaxfne-0.1.1/.gitignore +128 -0
  4. jaxfne-0.1.1/AGENTS.md +107 -0
  5. jaxfne-0.1.1/CHANGELOG.md +183 -0
  6. jaxfne-0.1.1/LICENSE +21 -0
  7. jaxfne-0.1.1/PKG-INFO +411 -0
  8. jaxfne-0.1.1/README.md +373 -0
  9. jaxfne-0.1.1/docs/AUDIT_v0.0.18_PREMERGE.md +69 -0
  10. jaxfne-0.1.1/docs/COLAB_SMOKE_V010.md +100 -0
  11. jaxfne-0.1.1/docs/DOCTRINE.md +138 -0
  12. jaxfne-0.1.1/docs/RELEASE_CHECKLIST.md +34 -0
  13. jaxfne-0.1.1/docs/roadmaps/gemini_cli_prompt_next_101.md +134 -0
  14. jaxfne-0.1.1/docs/roadmaps/v0.0.18_longterm/00_audit_summary.md +30 -0
  15. jaxfne-0.1.1/docs/roadmaps/v0.0.18_longterm/01_repo_api_runtime_audit.md +42 -0
  16. jaxfne-0.1.1/docs/roadmaps/v0.0.18_longterm/02_source_field_physics_plan_steps_001_100.md +907 -0
  17. jaxfne-0.1.1/docs/roadmaps/v0.0.18_longterm/03_emitters_cells_networks_plan_steps_101_200.md +907 -0
  18. jaxfne-0.1.1/docs/roadmaps/v0.0.18_longterm/04_fields_probes_modalities_plan_steps_201_300.md +907 -0
  19. jaxfne-0.1.1/docs/roadmaps/v0.0.18_longterm/05_objectives_spectrolaminar_omission_plan_steps_301_400.md +907 -0
  20. jaxfne-0.1.1/docs/roadmaps/v0.0.18_longterm/06_optimization_nulls_ablations_plan_steps_401_500.md +907 -0
  21. jaxfne-0.1.1/docs/roadmaps/v0.0.18_longterm/07_runtime_io_manifest_validation_plan_steps_501_600.md +907 -0
  22. jaxfne-0.1.1/docs/roadmaps/v0.0.18_longterm/08_examples_docs_colab_release_plan_steps_601_700.md +907 -0
  23. jaxfne-0.1.1/docs/roadmaps/v0.0.18_longterm/09_modalities_empirical_bridges_plan_steps_701_850.md +1357 -0
  24. jaxfne-0.1.1/docs/roadmaps/v0.0.18_longterm/10_governance_papers_release_plan_steps_851_1000.md +1357 -0
  25. jaxfne-0.1.1/docs/roadmaps/v0.1.x_next_101_actions.md +191 -0
  26. jaxfne-0.1.1/examples/00_minimal_column.py +41 -0
  27. jaxfne-0.1.1/examples/01_source_field_manifest.py +17 -0
  28. jaxfne-0.1.1/examples/02_omission_scaffold.py +87 -0
  29. jaxfne-0.1.1/examples/03_objective_and_tune_smoke.py +140 -0
  30. jaxfne-0.1.1/examples/04_blackbox_tuning_loop.py +47 -0
  31. jaxfne-0.1.1/examples/05_dataset_bridge_manifest.py +46 -0
  32. jaxfne-0.1.1/examples/06_edge_list_recurrent_backend.py +52 -0
  33. jaxfne-0.1.1/jaxfne/__init__.py +198 -0
  34. jaxfne-0.1.1/jaxfne/bridges.py +73 -0
  35. jaxfne-0.1.1/jaxfne/core.py +3320 -0
  36. jaxfne-0.1.1/jaxfne/emitters.py +610 -0
  37. jaxfne-0.1.1/jaxfne/fields.py +310 -0
  38. jaxfne-0.1.1/jaxfne/io.py +194 -0
  39. jaxfne-0.1.1/jaxfne/optim.py +303 -0
  40. jaxfne-0.1.1/jaxfne/presets.py +122 -0
  41. jaxfne-0.1.1/pyproject.toml +32 -0
  42. jaxfne-0.1.1/scripts/release_rehearsal.sh +117 -0
  43. jaxfne-0.1.1/scripts/upload_pypi.sh +42 -0
  44. jaxfne-0.1.1/scripts/upload_testpypi.sh +36 -0
  45. jaxfne-0.1.1/tests/test_api_smoke.py +159 -0
  46. jaxfne-0.1.1/tests/test_config_schema_v015.py +314 -0
  47. jaxfne-0.1.1/tests/test_edge_backend_v009.py +75 -0
  48. jaxfne-0.1.1/tests/test_laminar_geometry_v013.py +191 -0
  49. jaxfne-0.1.1/tests/test_manifest_readout_compat.py +128 -0
  50. jaxfne-0.1.1/tests/test_manifest_v005.py +192 -0
  51. jaxfne-0.1.1/tests/test_objective_report_v018.py +141 -0
  52. jaxfne-0.1.1/tests/test_objectives.py +229 -0
  53. jaxfne-0.1.1/tests/test_optim_tune.py +224 -0
  54. jaxfne-0.1.1/tests/test_package_version_alignment.py +30 -0
  55. jaxfne-0.1.1/tests/test_paradigm.py +225 -0
  56. jaxfne-0.1.1/tests/test_readout_spec_v017.py +206 -0
  57. jaxfne-0.1.1/tests/test_run_receipt_v016.py +197 -0
  58. jaxfne-0.1.1/tests/test_semantic_correctness_v020.py +357 -0
  59. jaxfne-0.1.1/tests/test_spectrolaminar_readiness_v011.py +301 -0
  60. jaxfne-0.1.1/tests/test_stimulus_injection_v012.py +191 -0
  61. jaxfne-0.1.1/tests/test_synapse_metadata_v010.py +149 -0
  62. jaxfne-0.1.1/tests/test_synaptic_kernel_v011.py +221 -0
  63. jaxfne-0.1.1/tests/test_trial_runner_v014.py +258 -0
  64. jaxfne-0.1.1/tests/test_v006_v008.py +167 -0
  65. jaxfne-0.1.1/tests/test_v021_config_runtime_source_fidelity.py +408 -0
@@ -0,0 +1,81 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main, dev]
6
+ pull_request:
7
+ branches: [main, dev]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ matrix:
14
+ python-version: ["3.10", "3.11", "3.12"]
15
+
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+
19
+ - name: Set up Python ${{ matrix.python-version }}
20
+ uses: actions/setup-python@v5
21
+ with:
22
+ python-version: ${{ matrix.python-version }}
23
+
24
+ - name: Install package and dev deps
25
+ run: |
26
+ python -m pip install --upgrade pip
27
+ pip install -e ".[dev]"
28
+
29
+ - name: Compileall
30
+ run: python -m compileall -q jaxfne tests examples
31
+
32
+ - name: Run tests
33
+ run: PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 PYTHONPATH=. python -m pytest -q --tb=short
34
+
35
+ - name: Run examples
36
+ run: |
37
+ for ex in examples/00_minimal_column.py examples/01_source_field_manifest.py \
38
+ examples/02_omission_scaffold.py examples/03_objective_and_tune_smoke.py \
39
+ examples/04_blackbox_tuning_loop.py examples/05_dataset_bridge_manifest.py \
40
+ examples/06_edge_list_recurrent_backend.py; do
41
+ PYTHONPATH=. python "$ex" > /dev/null && echo "PASS: $ex" || { echo "FAIL: $ex"; exit 1; }
42
+ done
43
+
44
+ build:
45
+ runs-on: ubuntu-latest
46
+ needs: test
47
+ steps:
48
+ - uses: actions/checkout@v4
49
+
50
+ - name: Set up Python
51
+ uses: actions/setup-python@v5
52
+ with:
53
+ python-version: "3.11"
54
+
55
+ - name: Install build tools
56
+ run: python -m pip install build twine
57
+
58
+ - name: Build wheel and sdist
59
+ run: python -m build
60
+
61
+ - name: Twine check
62
+ run: python -m twine check dist/*
63
+
64
+ - name: Wheel install smoke (from /tmp)
65
+ run: |
66
+ python -m venv /tmp/jaxfne_ci_smoke
67
+ /tmp/jaxfne_ci_smoke/bin/python -m pip install --upgrade pip
68
+ /tmp/jaxfne_ci_smoke/bin/python -m pip install dist/jaxfne-*.whl
69
+ cd /tmp && /tmp/jaxfne_ci_smoke/bin/python -c "
70
+ import json, jaxfne as jtfne
71
+ assert 'site-packages' in jtfne.__file__
72
+ cfg = jtfne.configuration().network(n=8).emitter().field().probe(n_contacts=4)
73
+ model = jtfne.construct(cfg)
74
+ signals = model.simulate(jtfne.simulation(duration_ms=5.0, dt_ms=0.1, seed=0))
75
+ readouts = model.compute_readout(signals, [jtfne.readout_spec('r', 'spike_rate_hz')])
76
+ manifest = model.manifest(signals, readouts)
77
+ json.dumps(manifest, allow_nan=False)
78
+ assert manifest['truth_mode'] == 'truth_safe_unverified'
79
+ assert manifest['physical_amplitude_claim_allowed'] is False
80
+ print('CI wheel smoke OK', jtfne.__version__)
81
+ "
@@ -0,0 +1,47 @@
1
+ name: Publish
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ release:
6
+ types: [published]
7
+
8
+ jobs:
9
+ publish-testpypi:
10
+ name: Publish to TestPyPI
11
+ runs-on: ubuntu-latest
12
+ environment: testpypi
13
+ permissions:
14
+ id-token: write
15
+ if: github.event_name == 'workflow_dispatch'
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+ - uses: actions/setup-python@v5
19
+ with:
20
+ python-version: '3.10'
21
+ - name: Build distributions
22
+ run: |
23
+ python -m pip install --upgrade pip build
24
+ python -m build
25
+ - name: Publish to TestPyPI
26
+ uses: pypa/gh-action-pypi-publish@release/v1
27
+ with:
28
+ repository-url: https://test.pypi.org/legacy/
29
+
30
+ publish-pypi:
31
+ name: Publish to PyPI
32
+ runs-on: ubuntu-latest
33
+ environment: pypi
34
+ permissions:
35
+ id-token: write
36
+ if: github.event_name == 'release'
37
+ steps:
38
+ - uses: actions/checkout@v4
39
+ - uses: actions/setup-python@v5
40
+ with:
41
+ python-version: '3.10'
42
+ - name: Build distributions
43
+ run: |
44
+ python -m pip install --upgrade pip build
45
+ python -m build
46
+ - name: Publish to PyPI
47
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,128 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ build/
8
+ develop-eggs/
9
+ dist/
10
+ downloads/
11
+ eggs/
12
+ .eggs/
13
+ lib/
14
+ lib64/
15
+ parts/
16
+ sdist/
17
+ var/
18
+ wheels/
19
+ pip-wheel-metadata/
20
+ share/python-wheels/
21
+ *.egg-info/
22
+ .installed.cfg
23
+ *.egg
24
+ MANIFEST
25
+
26
+ # Virtual environments
27
+ venv/
28
+ venv_push/
29
+ ENV/
30
+ env/
31
+ .venv
32
+ env.bak/
33
+ venv.bak/
34
+
35
+ # IDE
36
+ .vscode/
37
+ .idea/
38
+ *.swp
39
+ *.swo
40
+ *~
41
+ .DS_Store
42
+ .sublime-project
43
+ .sublime-workspace
44
+ *.code-workspace
45
+
46
+ # Testing
47
+ .pytest_cache/
48
+ .coverage
49
+ htmlcov/
50
+ .tox/
51
+ .hypothesis/
52
+ .pytest_cache
53
+ *.cover
54
+ .coverage.*
55
+ .cache
56
+ nosetests.xml
57
+ coverage.xml
58
+ *.cover
59
+ .hypothesis/
60
+ .pytest_cache/
61
+
62
+ # Jupyter
63
+ .ipynb_checkpoints
64
+ *.ipynb_checkpoints
65
+ *.ipynb~
66
+
67
+ # Data & artifacts
68
+ *.pkl
69
+ *.pickle
70
+ *.h5
71
+ *.hdf5
72
+ *.npy
73
+ *.npz
74
+ *.csv
75
+ *.log
76
+ outputs/
77
+ artifacts/
78
+ results/
79
+ data/
80
+ *.tmp
81
+
82
+ # JAX/NumPy
83
+ *.jax
84
+ *.npy.swp
85
+ .jax_cache/
86
+
87
+ # mypy
88
+ .mypy_cache/
89
+ .dmypy.json
90
+ dmypy.json
91
+
92
+ # Secrets (CRITICAL)
93
+ .env
94
+ .env.local
95
+ .env.*.local
96
+ *.key
97
+ *.pem
98
+ *.pem.pub
99
+ secrets.json
100
+ credentials.json
101
+ config.local.py
102
+
103
+ # OS
104
+ .DS_Store
105
+ .DS_Store?
106
+ ._*
107
+ .Spotlight-V100
108
+ .Trashes
109
+ ehthumbs.db
110
+ Thumbs.db
111
+
112
+ # Temporary files
113
+ *.bak
114
+ *.orig
115
+ *.tmp
116
+ *.temp
117
+ *~
118
+
119
+ # Build artifacts
120
+ *.so
121
+ *.o
122
+ *.c
123
+ *.cpp.swp
124
+
125
+ # macOS
126
+ .AppleDouble
127
+ .LSOverride
128
+ *.localized
jaxfne-0.1.1/AGENTS.md ADDED
@@ -0,0 +1,107 @@
1
+ # Agent Coordination
2
+
3
+ **Protocol version:** 1.0
4
+ **Repo:** jaxfne
5
+ **truth_mode:** truth_safe_unverified
6
+
7
+ ---
8
+
9
+ ## Branch ownership
10
+
11
+ | Agent | Owns | Never commits directly to |
12
+ |---|---|---|
13
+ | `claude-sonnet` | `main` — source edits, tests, version bumps, merges | `dev` |
14
+ | `gemini-cli` | `dev` — docs, roadmaps, large-context reads, bulk drafts | `main` |
15
+
16
+ Flow: `dev` → PR / fast-forward → `main` (Claude merges).
17
+
18
+ ---
19
+
20
+ ## Session start checklist (both agents)
21
+
22
+ ```bash
23
+ cd /Users/hamednejat/workspace/main/jaxfne
24
+ git fetch origin
25
+ git log --oneline -3 # verify known HEAD matches below
26
+ cat AGENTS.md # read active locks before touching anything
27
+ ```
28
+
29
+ ---
30
+
31
+ ## Last known state
32
+
33
+ | Branch | SHA | Status |
34
+ |---|---|---|
35
+ | `main` | `c1e89f9` | v0.0.23 hardening complete |
36
+ | `dev` | `cced014` (pushed) | v0.1.0 practical OOP core freeze; hardening pass complete; CI workflow added; release scripts added |
37
+
38
+ **Version:** `0.1.0`
39
+ **Tests:** 244 passed, 0 failed (verify with pytest before release)
40
+ **Working tree:** clean after hardening commit; PyPI blocked — no account/token access
41
+ **Next safe action:** Create `~/.pypirc` with TestPyPI token, then run `./scripts/upload_testpypi.sh`
42
+
43
+ ---
44
+
45
+ ## Active locks
46
+
47
+ | Agent | Scope | Since | Status |
48
+ |---|---|---|---|
49
+ | (none) | v0.1.0 hardening pass complete; CI + release scripts + Colab docs added; awaiting PyPI credentials | 2026-05-18 | cleared — no active lock |
50
+
51
+ ---
52
+
53
+ ## Completed work log
54
+
55
+ | Agent | Scope | Commit | Notes |
56
+ |---|---|---|---|
57
+ | `claude-sonnet` | v0.1.0 post-RC hardening: CI workflow, release scripts, Colab docs, RELEASE_CHECKLIST | (pending commit) | scripts/release_rehearsal.sh, upload_testpypi.sh, upload_pypi.sh; .github/workflows/ci.yml; docs/COLAB_SMOKE_V010.md; docs/RELEASE_CHECKLIST.md; README patches; no code change; PyPI blocked by missing credentials |
58
+ | `claude-sonnet` | v0.0.23 package hardening (LICENSE, example naming 00-06, pytest reliability) | `77485e7` | MIT LICENSE added; examples renamed; 236 tests pass in 36s; 7/7 examples pass; per external audit |
59
+ | `claude-sonnet` | v0.0.23 packaging validation smoke (wheel/sdist build, twine check, fresh venv install, version bump) | `e45e93b` | 236 tests pass, 7/7 examples pass; pushed to origin/dev; awaiting hardening per audit |
60
+ | `gemini-cli` | v0.0.22 docs/packaging/Colab hardening | `27495a4` | Added Colab scaffold, packaging docs, version bump to 0.0.22 |
61
+ | `claude-sonnet` | v0.0.22 version alignment fix (pyproject.toml sync, test assertion updates) | `cd2fbd3` | Fixed misalignment from Gemini's v0.0.22 bump; fast-forwarded main |
62
+ | `claude-sonnet` | v0.0.21 config/runtime/source fidelity (Tasks C–J validation, test suite, doc updates) | `29bbe0a` | 236 tests pass, 7 examples pass; pushed to origin/dev |
63
+ | `claude-sonnet` | v0.0.20 semantic hardening (receipts/readouts/manifest/probes/sim validation) | `e24f4e5` | 216 tests pass; pushed to origin |
64
+ | `gemini-cli` | `docs/roadmaps/v0.0.18_longterm/` | `d7bf899` | 10 roadmap docs staged on dev-v0.0.18; captured at merge |
65
+ | `gemini-cli` | `README.md` hero snippet | `d7bf899` | run_receipt/compute_readout example; captured at merge |
66
+ | `claude-sonnet` | BETA audit + truth_mode fix | `07d2119` | blocking defect resolved; 3 new tests |
67
+ | `claude-sonnet` | README + .gitignore hardening | `ff385f2` | pre-merge hygiene pass |
68
+ | `claude-sonnet` | v0.0.18 roadmap commit | `d7bf899` | committed Gemini's staged work before branch merge |
69
+ | `claude-sonnet` | merge dev-v0.0.18 → main | `d7bf899` | ff-only; branch deleted |
70
+ | `claude-sonnet` | v0.0.19 docstring + API clarity | `69d3197` | canonical API marked; CHANGELOG.md added |
71
+ | `claude-sonnet` | v0.0.19 docstring + API clarity + v0.0.20 prep | `69d3197` | canonical API marked; CHANGELOG added; premature 0.1.0 commit reverted |
72
+
73
+ ---
74
+
75
+ ## Handoff protocol
76
+
77
+ When finishing a scope:
78
+ 1. Update the **Active locks** table (clear your entry).
79
+ 2. Add a row to **Completed work log**.
80
+ 3. Include `AGENTS.md` in your final commit for that scope.
81
+
82
+ When starting a scope:
83
+ 1. Run the session start checklist above.
84
+ 2. Add a row to **Active locks before making any edits.
85
+ 3. If another agent has a lock on your target file/dir — read only, do not write.
86
+
87
+ ---
88
+
89
+ ## Conflict resolution
90
+
91
+ If two agents edited the same file independently (diverged state):
92
+ - The agent that pushed last wins on remote.
93
+ - The other agent must `git fetch`, inspect the diff, and rebase or cherry-pick.
94
+ - Do not force-push `main`.
95
+ - Escalate to user if rebase is non-trivial.
96
+
97
+ ---
98
+
99
+ ## Next planned work
100
+
101
+ | Item | Assigned | Branch | Notes |
102
+ |---|---|---|---|
103
+ | Create `~/.pypirc` with TestPyPI token | user | — | Obtain API token from https://test.pypi.org/manage/account/token/; mode 600 |
104
+ | TestPyPI upload | `claude-sonnet` | `dev` | `./scripts/upload_testpypi.sh` — blocked until ~/.pypirc exists |
105
+ | Colab smoke from TestPyPI | user / `claude-sonnet` | — | Follow `docs/COLAB_SMOKE_V010.md` Cell 1 + Cell 3 |
106
+ | Merge dev → main (ff-only) | `claude-sonnet` | `main` | After TestPyPI + Colab smokes pass |
107
+ | Tag v0.1.0 and PyPI upload | `claude-sonnet` | `main` | `JAXFNE_CONFIRM_REAL_PYPI=1 ./scripts/upload_pypi.sh` — blocked until above complete |
@@ -0,0 +1,183 @@
1
+ ## v0.1.1
2
+
3
+ - **Corrected VIP/IS Izhikevich preset:** `b` parameter corrected from `+0.20` to `-0.10` to match
4
+ intrinsic-spiking profile (Izhikevich 2003 Table 1).
5
+ - **Added per-neuron `layer_labels` support:** `IzhikevichParams` now accepts optional `layer_labels`
6
+ tuple for layer-selective analysis (e.g., L1, L2/3, L4, L5, L6).
7
+ - **Added `population_slices()` method:** `LaminarSourceGeometry` now provides programmatic mapping
8
+ from population names to neuron index ranges for layer-specific readouts.
9
+ - **Added preset registry:** Introduced `jaxfne.presets` with standardized `CELL_TYPE_PRESETS`,
10
+ `RECEPTOR_KINETICS`, and `DEFAULT_SPIKE_IMPULSE_GAIN` constants for reproducible configuration.
11
+ - **Preserved all truth gates:** `truth_safe_unverified`, `computational_scaffold`,
12
+ `laminar_proxy_no_pde`, `uncalibrated_izhikevich_native_current`, `physical_amplitude_claim_allowed=False`.
13
+ - **No biological calibration changes:** This is a computational-correctness and API-readiness pass,
14
+ not an empirical validation upgrade.
15
+
16
+ ## v0.1.0
17
+
18
+ - Declared practical OOP core freeze for the compact JAX-native TFNE scaffold.
19
+ - Preserved canonical workflow: `run_receipt`, `compute_readout`, `evaluate_report`.
20
+ - Includes all v0.0.23 fixes: `manifest(signals, readouts)` readout compatibility,
21
+ MIT LICENSE, normalized examples 00-06, full packaging validation.
22
+ - Validated wheel and sdist install smokes from `/tmp`; canonical workflow passes
23
+ from installed package (site-packages, not repo).
24
+ - Preserved truth status at `truth_safe_unverified`.
25
+ - Preserved field status as `laminar_proxy_no_pde`.
26
+ - Preserved source calibration as `uncalibrated_izhikevich_native_current`.
27
+ - Preserved `physical_amplitude_claim_allowed=False` across all outputs.
28
+
29
+ ## v0.0.23
30
+
31
+ - **Fixed `Model.manifest()` readout compatibility:** `manifest(signals, readouts)` now
32
+ accepts any of: `None`, `dict` (legacy), `list[ReadoutResult]` (canonical v0.1 output
33
+ of `compute_readout()`), `tuple[ReadoutResult]`, `list[dict]`, or a single
34
+ `ReadoutResult`. Previously raised `AttributeError: 'list' object has no attribute 'get'`
35
+ when passed the canonical `compute_readout()` return value.
36
+ - Added `_normalize_manifest_readout()` normaliser; surfaces readout results under
37
+ `readout_results` key in manifest with `n_results`, `requested_metrics`, and frozen
38
+ `physical_amplitude_claim_allowed=False` guard.
39
+ - Added 8 tests in `tests/test_manifest_readout_compat.py` covering all argument forms,
40
+ JSON strictness, and truth-gate non-escalation.
41
+ - Added MIT LICENSE file.
42
+ - Normalized examples directory to 00-06 naming convention.
43
+ - Validated wheel and sdist build via `python -m build`; `twine check dist/*` passes.
44
+ - Confirmed fresh venv wheel and sdist install smokes from `/tmp`; import path confirmed
45
+ as `site-packages` (not repo).
46
+ - Confirmed canonical workflow from installed wheel:
47
+ `compute_readout(...)` → `manifest(signals, readouts)` → `json.dumps(allow_nan=False)`.
48
+ - Preserved truth status at `truth_safe_unverified`.
49
+ - Preserved `physical_amplitude_claim_allowed=False` across all outputs.
50
+
51
+ ## v0.0.22
52
+ - Added packaging, release, and Colab installation documentation.
53
+ - Validated wheel and sdist builds with twine check.
54
+ - Validated fresh virtual-environment install smoke tests for wheel and sdist.
55
+ - Added a minimal Colab spectrolaminar proxy scaffold example.
56
+ - Preserved truth status at truth_safe_unverified.
57
+
58
+ # Changelog
59
+
60
+ All entries reflect `truth_mode: truth_safe_unverified`. No biological claims
61
+ are made at any version. Receipts, reports, and manifests are computational
62
+ validation artifacts, not empirical evidence.
63
+
64
+ ## v0.0.21
65
+
66
+ - **Config/runtime fidelity:** Added `_SUPPORTED_RUNTIME_SPEC_KEYS` and
67
+ `_runtime_from_spec()` to validate runtime declarations from `.jcfg.json`;
68
+ unknown keys now warn; invalid known values (e.g. bad `synaptic_kernel`) raise.
69
+ - **Truth escalation guard:** Implemented `_conservative_truth_transfer()` to
70
+ force user-declared truth claims back to conservative defaults
71
+ (`truth_safe_unverified`, `computational_scaffold`, `physical_amplitude_claim_allowed=False`);
72
+ escalations trigger warnings; non-scalar unknown keys skipped.
73
+ - **Unsupported config warnings:** Added `_config_section_warnings()` to detect
74
+ unsupported emitter families, field domains, conductivities, boundaries, and gauges;
75
+ warnings merged into `Configuration.metadata["unsupported_config_warnings"]`.
76
+ - **Runtime config warnings registry:** Added `_CONFIG_RUNTIME_WARNINGS` module-level
77
+ dict to surface `runtime_spec` warnings without mutating frozen `RuntimeConfig`.
78
+ - **Backend reporting fidelity:** Enhanced `RuntimeConfig.runtime_report()` to
79
+ distinguish `requested_backend` vs `actual_backend` and report enforced status
80
+ and mismatches (e.g. requested GPU on CPU-only JAX device).
81
+ - **vmap behavioral semantics:** Made `simulate_batch()` respect `runtime.vmap` flag:
82
+ `vmap=True` uses `jax.vmap` over seed batch; `vmap=False` uses Python loop with
83
+ `jnp.stack`; mode reported in metadata as `batch_execution_mode`.
84
+ - **Source proxy metadata:** Added `_SOURCE_PROXY_METADATA` constant documenting
85
+ source model: `izhikevich_native_current_plus_spike_impulse_proxy` with spike
86
+ impulse gain 20.0; injected into `simulate()`, `simulate_batch()`, and
87
+ `manifest()` under `source_model` and `backend_metadata.source_model`.
88
+ - **Receptor/tau source documentation:** Enhanced `manifest()` to document
89
+ `receptor_tau_source` distinction: exponential kernel uses default tau;
90
+ receptor_exponential kernel looks up tau by receptor_index; results equivalent
91
+ for current default flow.
92
+ - **Schema version bumps:** Updated `_RECEIPT_SCHEMA_VERSION` to
93
+ `"run_receipt_v0.0.21"`, `_MANIFEST_SCHEMA_VERSION` to `"manifest.v0.0.21"`.
94
+ - Preserved all truth gates at `truth_safe_unverified / computational_scaffold /
95
+ laminar_proxy_no_pde / proxy_readout_only / physical_amplitude_claim_allowed=False`.
96
+
97
+ ## v0.0.20
98
+
99
+ - Fixed `RunReceipt` completeness: `duration_ms`, `dt_ms`, `n_steps`, and
100
+ record flags now propagate into receipt simulation metadata.
101
+ - Strengthened `receipt_id` hashing to include run-level metadata
102
+ (recurrent backend, synaptic kernel, condition name, stimulus schedule).
103
+ - Fixed `Model.manifest()` to report executed backend separately from
104
+ available infrastructure.
105
+ - Honored probe `n_contacts` from `.jcfg.json` in field/readout construction.
106
+ - Applied readout `time_window_ms` slicing to field-backed CSD/LFP metrics.
107
+ - Added safe empty/negative-window handling to avoid NaN in readout output.
108
+ - Added `Simulation.__post_init__` validation (duration/dt must be positive finite).
109
+ - Clarified `record_sources` semantics in metadata.
110
+ - Centralized version/schema constants near `_JAXFNE_VERSION`.
111
+ - Preserved truth status at `truth_safe_unverified`.
112
+ - Preserved canonical v0.1 workflow: `run_receipt`, `compute_readout`,
113
+ `evaluate_report`. Compatibility aliases (`manifest`, `probe`) unchanged.
114
+
115
+ ## v0.0.19
116
+
117
+ - Clarified canonical v0.1 API wording: `run_receipt`, `compute_readout`,
118
+ and `evaluate_report` are the canonical workflow methods.
119
+ - Documented `manifest()` and `probe()` as compatibility aliases retained
120
+ from v0.0.4–v0.0.14; not removed.
121
+ - Added docstring notes to `config_truth_boundary()`: passthrough helper,
122
+ call `validate_config()` first.
123
+ - Added docstring notes to `JaxFNEConfig.config_hash`: unknown `.jcfg.json`
124
+ keys enter the hash; hash equality is structural identity, not biological
125
+ equivalence.
126
+ - Added docstring notes to `Model.run_receipt()`: `receipt_id` is tied to
127
+ `_JAXFNE_VERSION`; upgrading the package changes IDs for same cfg/seed.
128
+ - Added `CHANGELOG.md`.
129
+ - Version bump `0.0.18` → `0.0.19`.
130
+
131
+ ## v0.0.18
132
+
133
+ - Added `ObjectiveReport` (frozen dataclass) and `Model.evaluate_report()`.
134
+ - `ObjectiveReport` embeds `ReadoutResult` items when `readout_specs` are
135
+ provided; carries frozen truth gates.
136
+
137
+ ## v0.0.17
138
+
139
+ - Added `ReadoutSpec`, `ReadoutResult`, `readout_spec()` factory.
140
+ - Added `Model.compute_readout(signals, specs)`.
141
+ - Six supported metrics: `spike_rate_hz`, `spike_count`, `mean_V_m`,
142
+ `csd_abs_mean`, `lfp_abs_mean`, `source_abs_mean`.
143
+
144
+ ## v0.0.16
145
+
146
+ - Added `RunReceipt` (frozen dataclass) and `Model.run_receipt()`.
147
+ - Added module-level `run_receipt()` factory and `save_receipt()`.
148
+ - `receipt_id` is deterministic: `sha256(config_hash:seed:version)[:16]`.
149
+ - Fixed `truth_mode` absent from `_CONSERVATIVE_TRUTH_DEFAULTS` (blocking
150
+ defect: `validate_config` now checks all 8 required truth keys).
151
+
152
+ ## v0.0.15
153
+
154
+ - Added `JaxFNEConfig`, `ConfigValidationResult`, `load_config()`,
155
+ `validate_config()`, and `.jcfg.json` declarative config standard.
156
+ - Added `config_to_simulation`, `config_to_geometry`,
157
+ `config_to_configuration`, `config_to_trial_batch`, `config_truth_boundary`.
158
+ - Truth boundary fields are required in every config; any escalation is a
159
+ blocking validation error.
160
+
161
+ ## v0.0.14
162
+
163
+ - Added sequential trial runner: `TrialSpec`, `TrialBatch`, `TrialResult`,
164
+ `TrialBatchResult`, `trial_batch()`, `Model.run_trials()`.
165
+ - Deterministic seed policy; JSON-safe compact results via `Signals.summary()`.
166
+
167
+ ## v0.0.13
168
+
169
+ - Added `LaminarPopulation`, `LaminarSourceGeometry`, `laminar_source_geometry()`.
170
+ - Geometry depths are normalized proxy coordinates in `[0, 1]`; no physical
171
+ spatial units (mm, µm) introduced.
172
+
173
+ ## v0.0.12
174
+
175
+ - Added `StimulusSchedule`, `stimulus_schedule()`, and event-aligned native-
176
+ drive injection into all recurrent kernels.
177
+
178
+ ## v0.0.11
179
+
180
+ - Added receptor-indexed exponential synaptic kernel
181
+ (`synaptic_kernel="receptor_exponential"`).
182
+ - `syn_state.shape == (n_edges,)` with per-edge tau lookup by
183
+ `receptor_index` against standard `ReceptorSpec` table.
jaxfne-0.1.1/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024-2026 H N
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.