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.
- jaxfne-0.1.1/.github/workflows/ci.yml +81 -0
- jaxfne-0.1.1/.github/workflows/publish.yml +47 -0
- jaxfne-0.1.1/.gitignore +128 -0
- jaxfne-0.1.1/AGENTS.md +107 -0
- jaxfne-0.1.1/CHANGELOG.md +183 -0
- jaxfne-0.1.1/LICENSE +21 -0
- jaxfne-0.1.1/PKG-INFO +411 -0
- jaxfne-0.1.1/README.md +373 -0
- jaxfne-0.1.1/docs/AUDIT_v0.0.18_PREMERGE.md +69 -0
- jaxfne-0.1.1/docs/COLAB_SMOKE_V010.md +100 -0
- jaxfne-0.1.1/docs/DOCTRINE.md +138 -0
- jaxfne-0.1.1/docs/RELEASE_CHECKLIST.md +34 -0
- jaxfne-0.1.1/docs/roadmaps/gemini_cli_prompt_next_101.md +134 -0
- jaxfne-0.1.1/docs/roadmaps/v0.0.18_longterm/00_audit_summary.md +30 -0
- jaxfne-0.1.1/docs/roadmaps/v0.0.18_longterm/01_repo_api_runtime_audit.md +42 -0
- jaxfne-0.1.1/docs/roadmaps/v0.0.18_longterm/02_source_field_physics_plan_steps_001_100.md +907 -0
- jaxfne-0.1.1/docs/roadmaps/v0.0.18_longterm/03_emitters_cells_networks_plan_steps_101_200.md +907 -0
- jaxfne-0.1.1/docs/roadmaps/v0.0.18_longterm/04_fields_probes_modalities_plan_steps_201_300.md +907 -0
- jaxfne-0.1.1/docs/roadmaps/v0.0.18_longterm/05_objectives_spectrolaminar_omission_plan_steps_301_400.md +907 -0
- jaxfne-0.1.1/docs/roadmaps/v0.0.18_longterm/06_optimization_nulls_ablations_plan_steps_401_500.md +907 -0
- jaxfne-0.1.1/docs/roadmaps/v0.0.18_longterm/07_runtime_io_manifest_validation_plan_steps_501_600.md +907 -0
- jaxfne-0.1.1/docs/roadmaps/v0.0.18_longterm/08_examples_docs_colab_release_plan_steps_601_700.md +907 -0
- jaxfne-0.1.1/docs/roadmaps/v0.0.18_longterm/09_modalities_empirical_bridges_plan_steps_701_850.md +1357 -0
- jaxfne-0.1.1/docs/roadmaps/v0.0.18_longterm/10_governance_papers_release_plan_steps_851_1000.md +1357 -0
- jaxfne-0.1.1/docs/roadmaps/v0.1.x_next_101_actions.md +191 -0
- jaxfne-0.1.1/examples/00_minimal_column.py +41 -0
- jaxfne-0.1.1/examples/01_source_field_manifest.py +17 -0
- jaxfne-0.1.1/examples/02_omission_scaffold.py +87 -0
- jaxfne-0.1.1/examples/03_objective_and_tune_smoke.py +140 -0
- jaxfne-0.1.1/examples/04_blackbox_tuning_loop.py +47 -0
- jaxfne-0.1.1/examples/05_dataset_bridge_manifest.py +46 -0
- jaxfne-0.1.1/examples/06_edge_list_recurrent_backend.py +52 -0
- jaxfne-0.1.1/jaxfne/__init__.py +198 -0
- jaxfne-0.1.1/jaxfne/bridges.py +73 -0
- jaxfne-0.1.1/jaxfne/core.py +3320 -0
- jaxfne-0.1.1/jaxfne/emitters.py +610 -0
- jaxfne-0.1.1/jaxfne/fields.py +310 -0
- jaxfne-0.1.1/jaxfne/io.py +194 -0
- jaxfne-0.1.1/jaxfne/optim.py +303 -0
- jaxfne-0.1.1/jaxfne/presets.py +122 -0
- jaxfne-0.1.1/pyproject.toml +32 -0
- jaxfne-0.1.1/scripts/release_rehearsal.sh +117 -0
- jaxfne-0.1.1/scripts/upload_pypi.sh +42 -0
- jaxfne-0.1.1/scripts/upload_testpypi.sh +36 -0
- jaxfne-0.1.1/tests/test_api_smoke.py +159 -0
- jaxfne-0.1.1/tests/test_config_schema_v015.py +314 -0
- jaxfne-0.1.1/tests/test_edge_backend_v009.py +75 -0
- jaxfne-0.1.1/tests/test_laminar_geometry_v013.py +191 -0
- jaxfne-0.1.1/tests/test_manifest_readout_compat.py +128 -0
- jaxfne-0.1.1/tests/test_manifest_v005.py +192 -0
- jaxfne-0.1.1/tests/test_objective_report_v018.py +141 -0
- jaxfne-0.1.1/tests/test_objectives.py +229 -0
- jaxfne-0.1.1/tests/test_optim_tune.py +224 -0
- jaxfne-0.1.1/tests/test_package_version_alignment.py +30 -0
- jaxfne-0.1.1/tests/test_paradigm.py +225 -0
- jaxfne-0.1.1/tests/test_readout_spec_v017.py +206 -0
- jaxfne-0.1.1/tests/test_run_receipt_v016.py +197 -0
- jaxfne-0.1.1/tests/test_semantic_correctness_v020.py +357 -0
- jaxfne-0.1.1/tests/test_spectrolaminar_readiness_v011.py +301 -0
- jaxfne-0.1.1/tests/test_stimulus_injection_v012.py +191 -0
- jaxfne-0.1.1/tests/test_synapse_metadata_v010.py +149 -0
- jaxfne-0.1.1/tests/test_synaptic_kernel_v011.py +221 -0
- jaxfne-0.1.1/tests/test_trial_runner_v014.py +258 -0
- jaxfne-0.1.1/tests/test_v006_v008.py +167 -0
- 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
|
jaxfne-0.1.1/.gitignore
ADDED
|
@@ -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.
|