diff --git a/.gitattributes b/.gitattributes
index 3e89a880..950b37b1 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,3 +1,86 @@
+# Cross-platform line-ending policy (Linux / macOS / Windows).
+#
+# Everything text is stored as LF in the repository and checked out as LF on
+# every OS, so a file has identical bytes on Linux, macOS, and Windows. Git for
+# Windows handles LF transparently and modern editors (VS Code, PyCharm, etc.)
+# respect it, so there is no need for per-developer core.autocrlf settings.
+# The only exceptions are Windows-native shell scripts, which require CRLF.
+#
+# After changing this file, run `git add --renormalize .` once to rewrite any
+# files that were previously committed with mixed/CRLF endings.
+
+# Auto-detect text files and normalize them to LF in the repo and working tree.
* text=auto eol=lf
-*.bat text eol=crlf
-*.cmd text eol=crlf
\ No newline at end of file
+
+# ---------------------------------------------------------------------------
+# Source & text — force LF, enable language-aware diffs where useful
+# ---------------------------------------------------------------------------
+*.py text diff=python
+*.pyi text diff=python
+*.pyx text diff=python
+*.pxd text diff=python
+*.rst text
+*.md text diff=markdown
+*.txt text
+*.cfg text
+*.ini text
+*.toml text
+*.yml text
+*.yaml text
+*.json text
+*.ipynb text
+*.sh text eol=lf
+Makefile text eol=lf
+
+# ---------------------------------------------------------------------------
+# Windows-only scripts — must be CRLF to run on Windows
+# ---------------------------------------------------------------------------
+*.bat text eol=crlf
+*.cmd text eol=crlf
+*.ps1 text eol=crlf
+
+# ---------------------------------------------------------------------------
+# Binary — never normalize, never diff as text
+# ---------------------------------------------------------------------------
+*.png binary
+*.jpg binary
+*.jpeg binary
+*.gif binary
+*.ico binary
+*.svg binary
+*.pdf binary
+*.mat binary
+*.npy binary
+*.npz binary
+*.h5 binary
+*.hdf5 binary
+*.pkl binary
+*.pickle binary
+*.so binary
+*.pyd binary
+*.dylib binary
+*.dll binary
+*.gz binary
+*.bz2 binary
+*.xz binary
+*.zip binary
+
+# ---------------------------------------------------------------------------
+# GitHub Linguist — keep language stats focused on the library source
+# ---------------------------------------------------------------------------
+docs/** linguist-documentation
+examples/** linguist-documentation
+*.ipynb linguist-documentation
+changelog.md linguist-documentation
+
+# ---------------------------------------------------------------------------
+# git archive / source exports — drop dev-only paths
+# ---------------------------------------------------------------------------
+.github/ export-ignore
+.gitattributes export-ignore
+.gitignore export-ignore
+.claudeignore export-ignore
+.claude/ export-ignore
+.idea/ export-ignore
+dev/ export-ignore
+develop/ export-ignore
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index e0be9ef9..592e7ddd 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -1,70 +1,70 @@
----
-name: Bug Report
-about: Report a bug or unexpected behavior to help us improve brainpy.state
-title: '[BUG] '
-labels: bug
-assignees: ''
----
-
-## Bug Description
-
-**Describe the bug**
-A clear and concise description of what the bug is.
-
-## To Reproduce
-
-**Minimal code example to reproduce the issue:**
-
-```python
-import brainpy
-
-# Your code here that demonstrates the bug
-```
-
-**Steps to reproduce:**
-1.
-2.
-3.
-
-## Expected Behavior
-
-What you expected to happen.
-
-## Actual Behavior
-
-What actually happened. Include the full error message and traceback if applicable.
-
-```
-Paste error message/traceback here
-```
-
-## Environment
-
-Please provide the following information:
-
-- **brainpy.state Version:** [e.g., 0.0.1]
-- **Python Version:** [e.g., 3.10.5]
-- **JAX Version:** [e.g., 0.4.30]
-- **Operating System:** [e.g., Ubuntu 22.04, macOS 13.0, Windows 11]
-- **Hardware:** [e.g., CPU only, CUDA GPU, TPU]
-- **Installation method:** [e.g., pip, conda, from source]
-
-**Additional context:**
-
-```python
-import brainpy
-
-print(brainpy_state.__version__)
-# Add any other relevant version info
-```
-
-## Additional Context
-
-Add any other context about the problem here (e.g., related issues, potential causes, attempted solutions).
-
-## Checklist
-
-- [ ] I have checked for duplicate issues
-- [ ] I have provided a minimal code example to reproduce the bug
-- [ ] I have included the full error message/traceback
+---
+name: Bug Report
+about: Report a bug or unexpected behavior to help us improve brainpy.state
+title: '[BUG] '
+labels: bug
+assignees: ''
+---
+
+## Bug Description
+
+**Describe the bug**
+A clear and concise description of what the bug is.
+
+## To Reproduce
+
+**Minimal code example to reproduce the issue:**
+
+```python
+import brainpy
+
+# Your code here that demonstrates the bug
+```
+
+**Steps to reproduce:**
+1.
+2.
+3.
+
+## Expected Behavior
+
+What you expected to happen.
+
+## Actual Behavior
+
+What actually happened. Include the full error message and traceback if applicable.
+
+```
+Paste error message/traceback here
+```
+
+## Environment
+
+Please provide the following information:
+
+- **brainpy.state Version:** [e.g., 0.0.1]
+- **Python Version:** [e.g., 3.10.5]
+- **JAX Version:** [e.g., 0.4.30]
+- **Operating System:** [e.g., Ubuntu 22.04, macOS 13.0, Windows 11]
+- **Hardware:** [e.g., CPU only, CUDA GPU, TPU]
+- **Installation method:** [e.g., pip, conda, from source]
+
+**Additional context:**
+
+```python
+import brainpy
+
+print(brainpy_state.__version__)
+# Add any other relevant version info
+```
+
+## Additional Context
+
+Add any other context about the problem here (e.g., related issues, potential causes, attempted solutions).
+
+## Checklist
+
+- [ ] I have checked for duplicate issues
+- [ ] I have provided a minimal code example to reproduce the bug
+- [ ] I have included the full error message/traceback
- [ ] I have provided environment information
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
index 5c3bde8a..ce73a820 100644
--- a/.github/ISSUE_TEMPLATE/config.yml
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -1,11 +1,11 @@
-blank_issues_enabled: true
-contact_links:
- - name: 📚 Documentation
- url: https://brainx.chaobrain.com/brainpy-state/
- about: Check the documentation for guides, tutorials, and API reference
- - name: 💬 GitHub Discussions
- url: https://github.com/chaobrain/brainpy.state/discussions
- about: Ask questions and discuss ideas with the community
- - name: 🔒 Security Vulnerability
- url: https://github.com/chaobrain/brainpy.state/security/advisories/new
- about: Report security vulnerabilities privately (do not create public issues)
+blank_issues_enabled: true
+contact_links:
+ - name: 📚 Documentation
+ url: https://brainx.chaobrain.com/brainpy-state/
+ about: Check the documentation for guides, tutorials, and API reference
+ - name: 💬 GitHub Discussions
+ url: https://github.com/chaobrain/brainpy.state/discussions
+ about: Ask questions and discuss ideas with the community
+ - name: 🔒 Security Vulnerability
+ url: https://github.com/chaobrain/brainpy.state/security/advisories/new
+ about: Report security vulnerabilities privately (do not create public issues)
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
index 9d4cca4c..9b435838 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -1,58 +1,58 @@
----
-name: Feature Request
-about: Suggest a new idea or improvement for brainpy.state
-title: '[FEATURE] '
-labels: enhancement
-assignees: ''
----
-
-## Feature Description
-
-**Is your feature request related to a problem? Please describe.**
-A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
-
-**Describe the solution you'd like**
-A clear and concise description of what you want to happen.
-
-## Motivation and Use Case
-
-**Why is this feature important?**
-Explain the motivation for this feature and who would benefit from it.
-
-**Example use case:**
-
-```python
-import brainpy
-
-# Example code showing how you would like to use this feature
-# This helps us understand your vision
-```
-
-## Proposed Implementation (Optional)
-
-**How do you envision this working?**
-If you have ideas about how this could be implemented, share them here.
-
-**API design (if applicable):**
-```python
-# Proposed API or interface
-```
-
-## Alternatives Considered
-
-**What alternatives have you considered?**
-Describe alternative solutions or features you've considered and why they don't fully address your needs.
-
-## Additional Context
-
-Add any other context, screenshots, references to related work, or examples from other libraries.
-
-**Related issues/PRs:**
-- #issue_number
-
-## Checklist
-
-- [ ] I have checked for duplicate feature requests
-- [ ] I have provided a clear use case and motivation
-- [ ] I have described the desired behavior
-- [ ] I have considered and described alternatives
+---
+name: Feature Request
+about: Suggest a new idea or improvement for brainpy.state
+title: '[FEATURE] '
+labels: enhancement
+assignees: ''
+---
+
+## Feature Description
+
+**Is your feature request related to a problem? Please describe.**
+A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+
+**Describe the solution you'd like**
+A clear and concise description of what you want to happen.
+
+## Motivation and Use Case
+
+**Why is this feature important?**
+Explain the motivation for this feature and who would benefit from it.
+
+**Example use case:**
+
+```python
+import brainpy
+
+# Example code showing how you would like to use this feature
+# This helps us understand your vision
+```
+
+## Proposed Implementation (Optional)
+
+**How do you envision this working?**
+If you have ideas about how this could be implemented, share them here.
+
+**API design (if applicable):**
+```python
+# Proposed API or interface
+```
+
+## Alternatives Considered
+
+**What alternatives have you considered?**
+Describe alternative solutions or features you've considered and why they don't fully address your needs.
+
+## Additional Context
+
+Add any other context, screenshots, references to related work, or examples from other libraries.
+
+**Related issues/PRs:**
+- #issue_number
+
+## Checklist
+
+- [ ] I have checked for duplicate feature requests
+- [ ] I have provided a clear use case and motivation
+- [ ] I have described the desired behavior
+- [ ] I have considered and described alternatives
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index ac71e5f6..48c24396 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -1,123 +1,123 @@
-
-
-## Summary
-
-
-
-**Fixes #(issue number)**
-
-## Type of Change
-
-
-
-- [ ] Bug fix (non-breaking change which fixes an issue)
-- [ ] New feature (non-breaking change which adds functionality)
-- [ ] Breaking change (fix or feature that would cause existing functionality to change)
-- [ ] Documentation update
-- [ ] Code refactoring (no functional changes)
-- [ ] Performance improvement
-- [ ] Test coverage improvement
-- [ ] Other (please describe):
-
-## Description
-
-**What does this PR do?**
-
-
-**Why is this change needed?**
-
-
-**How does it work?**
-
-
-## Changes Made
-
-
-
--
--
--
-
-## Testing
-
-**How has this been tested?**
-
-
-```python
-# Example test code or commands used
-```
-
-**Test environment:**
-- Python version:
-- brainpy.state version:
-- JAX version:
-- OS:
-
-**Test coverage:**
-- [ ] Added new tests for this change
-- [ ] All existing tests pass
-- [ ] Manual testing performed
-
-## Performance Impact
-
-
-
-- [ ] No performance impact
-- [ ] Performance improved (provide benchmarks)
-- [ ] Performance may be affected (explain why and how much)
-
-## Documentation
-
-- [ ] Docstrings added/updated
-- [ ] Documentation updated (if needed)
-- [ ] Examples added/updated (if applicable)
-- [ ] CHANGELOG entry added (for notable changes)
-
-## Screenshots (if applicable)
-
-
-
-## Breaking Changes
-
-
-
-**Breaking change details:**
-
-
-**Migration guide:**
-```python
-# Before (old way)
-
-# After (new way)
-```
-
-## Checklist
-
-
-
-- [ ] My code follows the project's style guidelines
-- [ ] I have performed a self-review of my code
-- [ ] I have commented my code, particularly in hard-to-understand areas
-- [ ] I have made corresponding changes to the documentation
-- [ ] My changes generate no new warnings
-- [ ] I have added tests that prove my fix is effective or that my feature works
-- [ ] New and existing unit tests pass locally with my changes
-- [ ] Any dependent changes have been merged and published
-- [ ] I have checked for duplicate PRs/issues
-- [ ] I have read and followed the [CONTRIBUTING](../CONTRIBUTING.md) guidelines
-
-## Additional Notes
-
-
-
-## Related Issues/PRs
-
-
-
-- Related to #
-- Depends on #
+
+
+## Summary
+
+
+
+**Fixes #(issue number)**
+
+## Type of Change
+
+
+
+- [ ] Bug fix (non-breaking change which fixes an issue)
+- [ ] New feature (non-breaking change which adds functionality)
+- [ ] Breaking change (fix or feature that would cause existing functionality to change)
+- [ ] Documentation update
+- [ ] Code refactoring (no functional changes)
+- [ ] Performance improvement
+- [ ] Test coverage improvement
+- [ ] Other (please describe):
+
+## Description
+
+**What does this PR do?**
+
+
+**Why is this change needed?**
+
+
+**How does it work?**
+
+
+## Changes Made
+
+
+
+-
+-
+-
+
+## Testing
+
+**How has this been tested?**
+
+
+```python
+# Example test code or commands used
+```
+
+**Test environment:**
+- Python version:
+- brainpy.state version:
+- JAX version:
+- OS:
+
+**Test coverage:**
+- [ ] Added new tests for this change
+- [ ] All existing tests pass
+- [ ] Manual testing performed
+
+## Performance Impact
+
+
+
+- [ ] No performance impact
+- [ ] Performance improved (provide benchmarks)
+- [ ] Performance may be affected (explain why and how much)
+
+## Documentation
+
+- [ ] Docstrings added/updated
+- [ ] Documentation updated (if needed)
+- [ ] Examples added/updated (if applicable)
+- [ ] CHANGELOG entry added (for notable changes)
+
+## Screenshots (if applicable)
+
+
+
+## Breaking Changes
+
+
+
+**Breaking change details:**
+
+
+**Migration guide:**
+```python
+# Before (old way)
+
+# After (new way)
+```
+
+## Checklist
+
+
+
+- [ ] My code follows the project's style guidelines
+- [ ] I have performed a self-review of my code
+- [ ] I have commented my code, particularly in hard-to-understand areas
+- [ ] I have made corresponding changes to the documentation
+- [ ] My changes generate no new warnings
+- [ ] I have added tests that prove my fix is effective or that my feature works
+- [ ] New and existing unit tests pass locally with my changes
+- [ ] Any dependent changes have been merged and published
+- [ ] I have checked for duplicate PRs/issues
+- [ ] I have read and followed the [CONTRIBUTING](../CONTRIBUTING.md) guidelines
+
+## Additional Notes
+
+
+
+## Related Issues/PRs
+
+
+
+- Related to #
+- Depends on #
- Blocks #
\ No newline at end of file
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index abfa89b4..e1d84d9d 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -1,62 +1,62 @@
-# Dependabot configuration for automated dependency updates
-# Documentation: https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
-
-version: 2
-
-updates:
- # Python dependencies
- - package-ecosystem: "pip"
- directory: "/"
- schedule:
- interval: "weekly"
- day: "monday"
- time: "09:00"
- timezone: "UTC"
- allow:
- - dependency-type: "all"
- commit-message:
- prefix: "chore(deps)"
- prefix-development: "chore(deps-dev)"
- include: "scope"
- open-pull-requests-limit: 10
- reviewers:
- - "brainpy_state/maintainers"
- labels:
- - "dependencies"
- - "python"
- # Group minor and patch updates together
- groups:
- development-dependencies:
- dependency-type: "development"
- update-types:
- - "minor"
- - "patch"
- production-dependencies:
- dependency-type: "production"
- update-types:
- - "patch"
-
- # GitHub Actions
- - package-ecosystem: "github-actions"
- directory: "/"
- schedule:
- interval: "weekly"
- day: "monday"
- time: "09:00"
- timezone: "UTC"
- commit-message:
- prefix: "chore(ci)"
- include: "scope"
- open-pull-requests-limit: 5
- reviewers:
- - "brainpy_state/maintainers"
- labels:
- - "dependencies"
- - "github-actions"
- groups:
- github-actions:
- patterns:
- - "*"
- update-types:
- - "minor"
- - "patch"
+# Dependabot configuration for automated dependency updates
+# Documentation: https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
+
+version: 2
+
+updates:
+ # Python dependencies
+ - package-ecosystem: "pip"
+ directory: "/"
+ schedule:
+ interval: "weekly"
+ day: "monday"
+ time: "09:00"
+ timezone: "UTC"
+ allow:
+ - dependency-type: "all"
+ commit-message:
+ prefix: "chore(deps)"
+ prefix-development: "chore(deps-dev)"
+ include: "scope"
+ open-pull-requests-limit: 10
+ reviewers:
+ - "brainpy_state/maintainers"
+ labels:
+ - "dependencies"
+ - "python"
+ # Group minor and patch updates together
+ groups:
+ development-dependencies:
+ dependency-type: "development"
+ update-types:
+ - "minor"
+ - "patch"
+ production-dependencies:
+ dependency-type: "production"
+ update-types:
+ - "patch"
+
+ # GitHub Actions
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "weekly"
+ day: "monday"
+ time: "09:00"
+ timezone: "UTC"
+ commit-message:
+ prefix: "chore(ci)"
+ include: "scope"
+ open-pull-requests-limit: 5
+ reviewers:
+ - "brainpy_state/maintainers"
+ labels:
+ - "dependencies"
+ - "github-actions"
+ groups:
+ github-actions:
+ patterns:
+ - "*"
+ update-types:
+ - "minor"
+ - "patch"
diff --git a/.github/labeler.yml b/.github/labeler.yml
index 5b4134c5..f0044deb 100644
--- a/.github/labeler.yml
+++ b/.github/labeler.yml
@@ -1,37 +1,37 @@
-# Automatically label pull requests based on file paths
-# Learn more: https://github.com/actions/labeler
-
-# Documentation
-documentation:
- - changed-files:
- - any-glob-to-any-file: ['docs_version2_version2/**/*', 'docs_classic/**/*', '**/*.md', '**/*.rst']
-
-# CI/CD
-ci-cd:
- - changed-files:
- - any-glob-to-any-file: ['.github/**/*']
-
-# Dependencies
-dependencies:
- - changed-files:
- - any-glob-to-any-file: ['pyproject.toml', 'requirements*.txt']
-
-# Tests
-tests:
- - changed-files:
- - any-glob-to-any-file: ['tests/**/*', '**/*test*.py']
-
-# Examples
-examples:
- - changed-files:
- - any-glob-to-any-file: ['examples/**/*']
-
-# Core library
-core:
- - changed-files:
- - any-glob-to-any-file: ['brainpy_state/_src/**/*']
-
-# Build/Package
-build:
- - changed-files:
- - any-glob-to-any-file: ['pyproject.toml', 'setup.py', 'MANIFEST.in']
+# Automatically label pull requests based on file paths
+# Learn more: https://github.com/actions/labeler
+
+# Documentation
+documentation:
+ - changed-files:
+ - any-glob-to-any-file: ['docs_version2_version2/**/*', 'docs_classic/**/*', '**/*.md', '**/*.rst']
+
+# CI/CD
+ci-cd:
+ - changed-files:
+ - any-glob-to-any-file: ['.github/**/*']
+
+# Dependencies
+dependencies:
+ - changed-files:
+ - any-glob-to-any-file: ['pyproject.toml', 'requirements*.txt']
+
+# Tests
+tests:
+ - changed-files:
+ - any-glob-to-any-file: ['tests/**/*', '**/*test*.py']
+
+# Examples
+examples:
+ - changed-files:
+ - any-glob-to-any-file: ['examples/**/*']
+
+# Core library
+core:
+ - changed-files:
+ - any-glob-to-any-file: ['brainpy_state/_src/**/*']
+
+# Build/Package
+build:
+ - changed-files:
+ - any-glob-to-any-file: ['pyproject.toml', 'setup.py', 'MANIFEST.in']
diff --git a/.github/workflows/Publish.yml b/.github/workflows/Publish.yml
index d3c36b87..fb7b422d 100644
--- a/.github/workflows/Publish.yml
+++ b/.github/workflows/Publish.yml
@@ -1,59 +1,59 @@
-name: Publish to PyPI
-
-on:
- release:
- types: [published]
- workflow_dispatch: # Allow manual triggers
-
-permissions:
- contents: read
- id-token: write # Required for trusted publishing
-
-jobs:
- build:
- name: Build distribution
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@v5
- with:
- fetch-depth: 0
-
- - name: Set up Python
- uses: actions/setup-python@v6
- with:
- python-version: "3.12"
-
- - name: Install build
- run: |
- python -m pip install --upgrade pip
- python -m pip install build
-
- - name: Build package
- run: python -m build
-
- - name: Store distribution packages
- uses: actions/upload-artifact@v7
- with:
- name: python-package-distributions
- path: dist/
-
- publish-to-pypi:
- name: Publish to PyPI
- needs: [build]
- runs-on: ubuntu-latest
- environment:
- name: pypi
- url: https://pypi.org/p/brainpy-state
-
- steps:
- - name: Download distribution packages
- uses: actions/download-artifact@v8
- with:
- name: python-package-distributions
- path: dist/
-
- - name: Publish to PyPI
- uses: pypa/gh-action-pypi-publish@release/v1
- with:
+name: Publish to PyPI
+
+on:
+ release:
+ types: [published]
+ workflow_dispatch: # Allow manual triggers
+
+permissions:
+ contents: read
+ id-token: write # Required for trusted publishing
+
+jobs:
+ build:
+ name: Build distribution
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v5
+ with:
+ fetch-depth: 0
+
+ - name: Set up Python
+ uses: actions/setup-python@v6
+ with:
+ python-version: "3.12"
+
+ - name: Install build
+ run: |
+ python -m pip install --upgrade pip
+ python -m pip install build
+
+ - name: Build package
+ run: python -m build
+
+ - name: Store distribution packages
+ uses: actions/upload-artifact@v7
+ with:
+ name: python-package-distributions
+ path: dist/
+
+ publish-to-pypi:
+ name: Publish to PyPI
+ needs: [build]
+ runs-on: ubuntu-latest
+ environment:
+ name: pypi
+ url: https://pypi.org/p/brainpy-state
+
+ steps:
+ - name: Download distribution packages
+ uses: actions/download-artifact@v8
+ with:
+ name: python-package-distributions
+ path: dist/
+
+ - name: Publish to PyPI
+ uses: pypa/gh-action-pypi-publish@release/v1
+ with:
password: ${{ secrets.PYPI_API_TOKEN }}
\ No newline at end of file
diff --git a/.github/workflows/greetings.yml b/.github/workflows/greetings.yml
index 350a9c1b..964e4bf0 100644
--- a/.github/workflows/greetings.yml
+++ b/.github/workflows/greetings.yml
@@ -1,59 +1,59 @@
-name: Greetings
-
-on:
- issues:
- types: [opened]
- pull_request_target:
- types: [opened]
-
-permissions:
- issues: write
- pull-requests: write
-
-jobs:
- greeting:
- runs-on: ubuntu-latest
- steps:
- - name: Greet First Time Contributors
- uses: actions/first-interaction@v3
- with:
- repo-token: ${{ secrets.GITHUB_TOKEN }}
- issue_message: >
- 👋 Welcome to brainpy.state! Thank you for opening your first issue.
-
-
- We appreciate you taking the time to contribute to the project. A maintainer
- will review your issue and respond as soon as possible.
-
-
- In the meantime, please make sure you've provided all the necessary information
- to help us understand and address your issue effectively.
-
-
- If you're interested in contributing code, check out our
- [Contributing Guide](https://github.com/chaobrain/brainpy.state/blob/main/CONTRIBUTING.md)
- for more information on how to get started.
-
-
- Happy coding! 🧠✨
- pr_message: >
- 🎉 Congratulations on opening your first pull request in brainpy.state! Thank you for
- your contribution!
-
-
- A maintainer will review your changes soon. Please make sure:
-
- - ✅ Your code follows our style guidelines
-
- - ✅ All tests pass
-
- - ✅ Documentation is updated (if applicable)
-
- - ✅ You've filled out the PR template completely
-
-
- We appreciate your effort in making brainpy.state better. If you have any questions,
- feel free to ask in the comments.
-
-
- Welcome to the brainpy.state community! 🌟
+name: Greetings
+
+on:
+ issues:
+ types: [opened]
+ pull_request_target:
+ types: [opened]
+
+permissions:
+ issues: write
+ pull-requests: write
+
+jobs:
+ greeting:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Greet First Time Contributors
+ uses: actions/first-interaction@v3
+ with:
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
+ issue_message: >
+ 👋 Welcome to brainpy.state! Thank you for opening your first issue.
+
+
+ We appreciate you taking the time to contribute to the project. A maintainer
+ will review your issue and respond as soon as possible.
+
+
+ In the meantime, please make sure you've provided all the necessary information
+ to help us understand and address your issue effectively.
+
+
+ If you're interested in contributing code, check out our
+ [Contributing Guide](https://github.com/chaobrain/brainpy.state/blob/main/CONTRIBUTING.md)
+ for more information on how to get started.
+
+
+ Happy coding! 🧠✨
+ pr_message: >
+ 🎉 Congratulations on opening your first pull request in brainpy.state! Thank you for
+ your contribution!
+
+
+ A maintainer will review your changes soon. Please make sure:
+
+ - ✅ Your code follows our style guidelines
+
+ - ✅ All tests pass
+
+ - ✅ Documentation is updated (if applicable)
+
+ - ✅ You've filled out the PR template completely
+
+
+ We appreciate your effort in making brainpy.state better. If you have any questions,
+ feel free to ask in the comments.
+
+
+ Welcome to the brainpy.state community! 🌟
diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml
index ea02ac7d..57bb4c4a 100644
--- a/.github/workflows/labeler.yml
+++ b/.github/workflows/labeler.yml
@@ -1,20 +1,20 @@
-name: Auto Label PRs
-
-on:
- pull_request:
- types: [opened, synchronize, reopened]
-
-permissions:
- contents: read
- pull-requests: write
-
-jobs:
- label:
- runs-on: ubuntu-latest
- steps:
- - name: Apply labels
- uses: actions/labeler@v6
- with:
- repo-token: ${{ secrets.GITHUB_TOKEN }}
- configuration-path: .github/labeler.yml
- sync-labels: true
+name: Auto Label PRs
+
+on:
+ pull_request:
+ types: [opened, synchronize, reopened]
+
+permissions:
+ contents: read
+ pull-requests: write
+
+jobs:
+ label:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Apply labels
+ uses: actions/labeler@v6
+ with:
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
+ configuration-path: .github/labeler.yml
+ sync-labels: true
diff --git a/.gitignore b/.gitignore
index 5e4c936a..eac82266 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,240 +1,240 @@
-publishment.md
-#experimental/
-.vscode
-io_test_tmp*
-
-brainpy_state/math/brainpy_object/tests/io_test_tmp*
-
-lib/
-
-development
-
-brainpy_state/dyn/tests/data
-examples/dynamics_simulation/data
-examples/dynamics_simulation/results
-examples/training_ann_models/data
-examples/dynamics_analysis/data
-examples/nest/*.png
-extensions/.idea
-extensions/wheelhouse
-extensions/dist
-extensions/win_dll
-extensions/fixed_wheels
-extensions/build
-extensions/cmake-build-debug
-BrainPyExamples/
-BrainModels/
-book/
-examples/recurrent_neural_network/neurogym
-develop/iconip_paper
-develop/benchmark/COBA/results
-develop/test
-develop/outputdir
-
-*/_autosummary
-*/generated
-
-
-develop/benchmark/COBA/brian2*
-develop/benchmark/COBA/annarchy*
-develop/benchmark/COBAHH/brian2*
-develop/benchmark/COBAHH/annarchy*
-develop/benchmark/CUBA/annarchy*
-develop/benchmark/CUBA/brian2*
-
-
-*~
-\#*\#
-*.pyc
-.DS_Store
-dist/
-build/
-*.egg-info
-.idea
-
-*/__pycache__
-
-
-__pycache__/
-*.py[cod]
-*$py.class
-
-# C extensions
-*.so
-
-# Distribution / packaging
-.Python
-develop-eggs/
-downloads/
-eggs/
-.eggs/
-lib64/
-parts/
-sdist/
-var/
-wheels/
-share/python-wheels/
-*.egg-info/
-.installed.cfg
-*.egg
-MANIFEST
-
-# PyInstaller
-# Usually these files are written by a python script from a template
-# before PyInstaller builds the exe, so as to inject date/other infos into it.
-*.manifest
-*.spec
-
-# Installer logs
-pip-log.txt
-pip-delete-this-directory.txt
-
-# Unit test / coverage reports
-htmlcov/
-.tox/
-.nox/
-.coverage
-.coverage.*
-.cache
-nosetests.xml
-coverage.xml
-*.cover
-*.py,cover
-.hypothesis/
-.pytest_cache/
-cover/
-
-# Translations
-*.mo
-*.pot
-
-# Django stuff:
-*.log
-local_settings.py
-db.sqlite3
-db.sqlite3-journal
-
-# Flask stuff:
-instance/
-.webassets-cache
-
-# Scrapy stuff:
-.scrapy
-
-# PyBuilder
-.pybuilder/
-target/
-
-# Jupyter Notebook
-.ipynb_checkpoints
-
-# IPython
-profile_default/
-ipython_config.py
-
-# pyenv
-# For a library or package, you might want to ignore these files since the code is
-# intended to run in multiple environments; otherwise, check them in:
-# .python-version
-
-# pipenv
-# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
-# However, in case of collaboration, if having platform-specific dependencies or dependencies
-# having no cross-platform support, pipenv may install dependencies that don't work, or not
-# install all needed dependencies.
-#Pipfile.lock
-
-# PEP 582; used by e.g. github.com/David-OConnor/pyflow
-__pypackages__/
-
-# Celery stuff
-celerybeat-schedule
-celerybeat.pid
-
-# SageMath parsed files
-*.sage.py
-
-# Environments
-.env
-.venv
-env/
-venv/
-ENV/
-env.bak/
-venv.bak/
-
-# Spyder project settings
-.spyderproject
-.spyproject
-
-# Rope project settings
-.ropeproject
-
-# mkdocs documentation
-/site
-
-# mypy
-.mypy_cache/
-.dmypy.json
-dmypy.json
-
-# Pyre type checker
-.pyre/
-
-# pytype static type analyzer
-.pytype/
-
-# Cython debug symbols
-cython_debug/
-
-!/brainpy_state/dyn/tests/data/
-/examples/dynamics_simulation/data/
-/examples/training_snn_models/logs/T100_b64_lr0.001/
-/examples/training_snn_models/logs/
-/examples/training_snn_models/data/
-/my_tests/
-/examples/dynamics_simulation/Joglekar_2018_data/
-/bugs/
-/dev/
-/.claude/
-/docs/_static/logos/
-/docs/_build/
-/docs/changelog.md
-/docs_state/_build/
-/docs_state/_static/logos/
-/docs_state/changelog.md
-/examples_classic/dynamics_training/data/
-/docs/api/generated/
-/claude_implement_nest_models.sh
-/claude_logs/
-/codex_logs/
-/codex-synapse-model.sh
-/codex-bash.sh
-/codex_logs/
-/ai-coding/claude_implement_neuron_models.sh
-/claude_logs/
-/ai-coding/codex-bash.sh
-/ai-coding/codex-bash.ps1
-/codex_logs/
-/ai-coding/claude_implement_neuron_models.sh
-/ai-coding/
-/scripts/
-/codex_logs_numpy_doc/
-/claude_logs_numpy_doc/
-/docs/jupyter_execute/
-
-# brainx-sphinx-header build artifacts
-docs/_brand/
-docs/_static/css/brainx-header.css
-docs/_static/js/brainx-header.js
-/docs/_static/css/brainx-footer.css
-/docs/_static/js/brainx-footer.js
-/docs/_static/css/
-/docs/_static/js/
-/.specify/
-/CLAUDE.md
-/.claudeignore
-/docs/superpowers/
-
-# NEST demo plots are reproducible artifacts (regenerated by running the example)
-examples/nest/*.png
+publishment.md
+#experimental/
+.vscode
+io_test_tmp*
+
+brainpy_state/math/brainpy_object/tests/io_test_tmp*
+
+lib/
+
+development
+
+brainpy_state/dyn/tests/data
+examples/dynamics_simulation/data
+examples/dynamics_simulation/results
+examples/training_ann_models/data
+examples/dynamics_analysis/data
+examples/nest/*.png
+extensions/.idea
+extensions/wheelhouse
+extensions/dist
+extensions/win_dll
+extensions/fixed_wheels
+extensions/build
+extensions/cmake-build-debug
+BrainPyExamples/
+BrainModels/
+book/
+examples/recurrent_neural_network/neurogym
+develop/iconip_paper
+develop/benchmark/COBA/results
+develop/test
+develop/outputdir
+
+*/_autosummary
+*/generated
+
+
+develop/benchmark/COBA/brian2*
+develop/benchmark/COBA/annarchy*
+develop/benchmark/COBAHH/brian2*
+develop/benchmark/COBAHH/annarchy*
+develop/benchmark/CUBA/annarchy*
+develop/benchmark/CUBA/brian2*
+
+
+*~
+\#*\#
+*.pyc
+.DS_Store
+dist/
+build/
+*.egg-info
+.idea
+
+*/__pycache__
+
+
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+develop-eggs/
+downloads/
+eggs/
+.eggs/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# PyBuilder
+.pybuilder/
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+# For a library or package, you might want to ignore these files since the code is
+# intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+# However, in case of collaboration, if having platform-specific dependencies or dependencies
+# having no cross-platform support, pipenv may install dependencies that don't work, or not
+# install all needed dependencies.
+#Pipfile.lock
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
+
+!/brainpy_state/dyn/tests/data/
+/examples/dynamics_simulation/data/
+/examples/training_snn_models/logs/T100_b64_lr0.001/
+/examples/training_snn_models/logs/
+/examples/training_snn_models/data/
+/my_tests/
+/examples/dynamics_simulation/Joglekar_2018_data/
+/bugs/
+/dev/
+/.claude/
+/docs/_static/logos/
+/docs/_build/
+/docs/changelog.md
+/docs_state/_build/
+/docs_state/_static/logos/
+/docs_state/changelog.md
+/examples_classic/dynamics_training/data/
+/docs/api/generated/
+/claude_implement_nest_models.sh
+/claude_logs/
+/codex_logs/
+/codex-synapse-model.sh
+/codex-bash.sh
+/codex_logs/
+/ai-coding/claude_implement_neuron_models.sh
+/claude_logs/
+/ai-coding/codex-bash.sh
+/ai-coding/codex-bash.ps1
+/codex_logs/
+/ai-coding/claude_implement_neuron_models.sh
+/ai-coding/
+/scripts/
+/codex_logs_numpy_doc/
+/claude_logs_numpy_doc/
+/docs/jupyter_execute/
+
+# brainx-sphinx-header build artifacts
+docs/_brand/
+docs/_static/css/brainx-header.css
+docs/_static/js/brainx-header.js
+/docs/_static/css/brainx-footer.css
+/docs/_static/js/brainx-footer.js
+/docs/_static/css/
+/docs/_static/js/
+/.specify/
+/CLAUDE.md
+/.claudeignore
+/docs/superpowers/
+
+# NEST demo plots are reproducible artifacts (regenerated by running the example)
+examples/nest/*.png
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 30934c76..fd5afcec 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,27 +1,27 @@
-# Install the pre-commit hooks below with
-# 'pre-commit install'
-
-# Auto-update the version of the hooks with
-# 'pre-commit autoupdate'
-
-# Run the hooks on all files with
-# 'pre-commit run --all'
-
-repos:
- - repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v4.4.0
- hooks:
- - id: end-of-file-fixer
- # only include python files
- files: \.py$
- - id: debug-statements
- # only include python files
- files: \.py$
- - id: trailing-whitespace
- # only include python files
- files: \.py$
-
- - repo: https://github.com/pycqa/flake8
- rev: '6.1.0'
- hooks:
- - id: flake8
+# Install the pre-commit hooks below with
+# 'pre-commit install'
+
+# Auto-update the version of the hooks with
+# 'pre-commit autoupdate'
+
+# Run the hooks on all files with
+# 'pre-commit run --all'
+
+repos:
+ - repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v4.4.0
+ hooks:
+ - id: end-of-file-fixer
+ # only include python files
+ files: \.py$
+ - id: debug-statements
+ # only include python files
+ files: \.py$
+ - id: trailing-whitespace
+ # only include python files
+ files: \.py$
+
+ - repo: https://github.com/pycqa/flake8
+ rev: '6.1.0'
+ hooks:
+ - id: flake8
diff --git a/.readthedocs.yml b/.readthedocs.yml
index fe88325a..90f394df 100644
--- a/.readthedocs.yml
+++ b/.readthedocs.yml
@@ -1,21 +1,21 @@
-# .readthedocs.yml
-# Read the Docs configuration file
-# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
-
-# Required
-version: 2
-
-build:
- os: "ubuntu-24.04"
- tools:
- python: "3.13"
-
-# Build documentation using the copied conf.py
-sphinx:
- configuration: docs/conf.py
-
-# Optionally set the version of Python and requirements required to build your docs
-python:
- install:
- - requirements: requirements-doc.txt
-
+# .readthedocs.yml
+# Read the Docs configuration file
+# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
+
+# Required
+version: 2
+
+build:
+ os: "ubuntu-24.04"
+ tools:
+ python: "3.13"
+
+# Build documentation using the copied conf.py
+sphinx:
+ configuration: docs/conf.py
+
+# Optionally set the version of Python and requirements required to build your docs
+python:
+ install:
+ - requirements: requirements-doc.txt
+
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
index 1976677d..0890db83 100644
--- a/CODE_OF_CONDUCT.md
+++ b/CODE_OF_CONDUCT.md
@@ -1,132 +1,132 @@
-
-# Contributor Covenant Code of Conduct
-
-## Our Pledge
-
-We as members, contributors, and leaders pledge to make participation in our
-community a harassment-free experience for everyone, regardless of age, body
-size, visible or invisible disability, ethnicity, sex characteristics, gender
-identity and expression, level of experience, education, socio-economic status,
-nationality, personal appearance, race, caste, color, religion, or sexual
-identity and orientation.
-
-We pledge to act and interact in ways that contribute to an open, welcoming,
-diverse, inclusive, and healthy community.
-
-## Our Standards
-
-Examples of behavior that contributes to a positive environment for our
-community include:
-
-* Demonstrating empathy and kindness toward other people
-* Being respectful of differing opinions, viewpoints, and experiences
-* Giving and gracefully accepting constructive feedback
-* Accepting responsibility and apologizing to those affected by our mistakes,
- and learning from the experience
-* Focusing on what is best not just for us as individuals, but for the overall
- community
-
-Examples of unacceptable behavior include:
-
-* The use of sexualized language or imagery, and sexual attention or advances of
- any kind
-* Trolling, insulting or derogatory comments, and personal or political attacks
-* Public or private harassment
-* Publishing others' private information, such as a physical or email address,
- without their explicit permission
-* Other conduct which could reasonably be considered inappropriate in a
- professional setting
-
-## Enforcement Responsibilities
-
-Community leaders are responsible for clarifying and enforcing our standards of
-acceptable behavior and will take appropriate and fair corrective action in
-response to any behavior that they deem inappropriate, threatening, offensive,
-or harmful.
-
-Community leaders have the right and responsibility to remove, edit, or reject
-comments, commits, code, wiki edits, issues, and other contributions that are
-not aligned to this Code of Conduct, and will communicate reasons for moderation
-decisions when appropriate.
-
-## Scope
-
-This Code of Conduct applies within all community spaces, and also applies when
-an individual is officially representing the community in public spaces.
-Examples of representing our community include using an official e-mail address,
-posting via an official social media account, or acting as an appointed
-representative at an online or offline event.
-
-## Enforcement
-
-Instances of abusive, harassing, or otherwise unacceptable behavior may be
-reported to the community leaders responsible for enforcement at brainpy@foxmail.com.
-All complaints will be reviewed and investigated promptly and fairly.
-
-All community leaders are obligated to respect the privacy and security of the
-reporter of any incident.
-
-## Enforcement Guidelines
-
-Community leaders will follow these Community Impact Guidelines in determining
-the consequences for any action they deem in violation of this Code of Conduct:
-
-### 1. Correction
-
-**Community Impact**: Use of inappropriate language or other behavior deemed
-unprofessional or unwelcome in the community.
-
-**Consequence**: A private, written warning from community leaders, providing
-clarity around the nature of the violation and an explanation of why the
-behavior was inappropriate. A public apology may be requested.
-
-### 2. Warning
-
-**Community Impact**: A violation through a single incident or series of
-actions.
-
-**Consequence**: A warning with consequences for continued behavior. No
-interaction with the people involved, including unsolicited interaction with
-those enforcing the Code of Conduct, for a specified period of time. This
-includes avoiding interactions in community spaces as well as external channels
-like social media. Violating these terms may lead to a temporary or permanent
-ban.
-
-### 3. Temporary Ban
-
-**Community Impact**: A serious violation of community standards, including
-sustained inappropriate behavior.
-
-**Consequence**: A temporary ban from any sort of interaction or public
-communication with the community for a specified period of time. No public or
-private interaction with the people involved, including unsolicited interaction
-with those enforcing the Code of Conduct, is allowed during this period.
-Violating these terms may lead to a permanent ban.
-
-### 4. Permanent Ban
-
-**Community Impact**: Demonstrating a pattern of violation of community
-standards, including sustained inappropriate behavior, harassment of an
-individual, or aggression toward or disparagement of classes of individuals.
-
-**Consequence**: A permanent ban from any sort of public interaction within the
-community.
-
-## Attribution
-
-This Code of Conduct is adapted from the [Contributor Covenant][homepage],
-version 2.1, available at
-[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
-
-Community Impact Guidelines were inspired by
-[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
-
-For answers to common questions about this code of conduct, see the FAQ at
-[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
-[https://www.contributor-covenant.org/translations][translations].
-
-[homepage]: https://www.contributor-covenant.org
-[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
-[Mozilla CoC]: https://github.com/mozilla/diversity
-[FAQ]: https://www.contributor-covenant.org/faq
-[translations]: https://www.contributor-covenant.org/translations
+
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+We as members, contributors, and leaders pledge to make participation in our
+community a harassment-free experience for everyone, regardless of age, body
+size, visible or invisible disability, ethnicity, sex characteristics, gender
+identity and expression, level of experience, education, socio-economic status,
+nationality, personal appearance, race, caste, color, religion, or sexual
+identity and orientation.
+
+We pledge to act and interact in ways that contribute to an open, welcoming,
+diverse, inclusive, and healthy community.
+
+## Our Standards
+
+Examples of behavior that contributes to a positive environment for our
+community include:
+
+* Demonstrating empathy and kindness toward other people
+* Being respectful of differing opinions, viewpoints, and experiences
+* Giving and gracefully accepting constructive feedback
+* Accepting responsibility and apologizing to those affected by our mistakes,
+ and learning from the experience
+* Focusing on what is best not just for us as individuals, but for the overall
+ community
+
+Examples of unacceptable behavior include:
+
+* The use of sexualized language or imagery, and sexual attention or advances of
+ any kind
+* Trolling, insulting or derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or email address,
+ without their explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Enforcement Responsibilities
+
+Community leaders are responsible for clarifying and enforcing our standards of
+acceptable behavior and will take appropriate and fair corrective action in
+response to any behavior that they deem inappropriate, threatening, offensive,
+or harmful.
+
+Community leaders have the right and responsibility to remove, edit, or reject
+comments, commits, code, wiki edits, issues, and other contributions that are
+not aligned to this Code of Conduct, and will communicate reasons for moderation
+decisions when appropriate.
+
+## Scope
+
+This Code of Conduct applies within all community spaces, and also applies when
+an individual is officially representing the community in public spaces.
+Examples of representing our community include using an official e-mail address,
+posting via an official social media account, or acting as an appointed
+representative at an online or offline event.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported to the community leaders responsible for enforcement at brainpy@foxmail.com.
+All complaints will be reviewed and investigated promptly and fairly.
+
+All community leaders are obligated to respect the privacy and security of the
+reporter of any incident.
+
+## Enforcement Guidelines
+
+Community leaders will follow these Community Impact Guidelines in determining
+the consequences for any action they deem in violation of this Code of Conduct:
+
+### 1. Correction
+
+**Community Impact**: Use of inappropriate language or other behavior deemed
+unprofessional or unwelcome in the community.
+
+**Consequence**: A private, written warning from community leaders, providing
+clarity around the nature of the violation and an explanation of why the
+behavior was inappropriate. A public apology may be requested.
+
+### 2. Warning
+
+**Community Impact**: A violation through a single incident or series of
+actions.
+
+**Consequence**: A warning with consequences for continued behavior. No
+interaction with the people involved, including unsolicited interaction with
+those enforcing the Code of Conduct, for a specified period of time. This
+includes avoiding interactions in community spaces as well as external channels
+like social media. Violating these terms may lead to a temporary or permanent
+ban.
+
+### 3. Temporary Ban
+
+**Community Impact**: A serious violation of community standards, including
+sustained inappropriate behavior.
+
+**Consequence**: A temporary ban from any sort of interaction or public
+communication with the community for a specified period of time. No public or
+private interaction with the people involved, including unsolicited interaction
+with those enforcing the Code of Conduct, is allowed during this period.
+Violating these terms may lead to a permanent ban.
+
+### 4. Permanent Ban
+
+**Community Impact**: Demonstrating a pattern of violation of community
+standards, including sustained inappropriate behavior, harassment of an
+individual, or aggression toward or disparagement of classes of individuals.
+
+**Consequence**: A permanent ban from any sort of public interaction within the
+community.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage],
+version 2.1, available at
+[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
+
+Community Impact Guidelines were inspired by
+[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
+
+For answers to common questions about this code of conduct, see the FAQ at
+[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
+[https://www.contributor-covenant.org/translations][translations].
+
+[homepage]: https://www.contributor-covenant.org
+[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
+[Mozilla CoC]: https://github.com/mozilla/diversity
+[FAQ]: https://www.contributor-covenant.org/faq
+[translations]: https://www.contributor-covenant.org/translations
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 377397a4..d89cf1a9 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,290 +1,290 @@
-# Contributing to brainpy.state
-
-Thank you for your interest in contributing to brainpy.state! We welcome contributions from the community and are grateful for your support in making brainpy.state better.
-
-## Table of Contents
-
-- [Code of Conduct](#code-of-conduct)
-- [How Can I Contribute?](#how-can-i-contribute)
-- [Development Setup](#development-setup)
-- [Contribution Workflow](#contribution-workflow)
-- [Coding Guidelines](#coding-guidelines)
-- [Testing](#testing)
-- [Documentation](#documentation)
-- [Community](#community)
-
-## Code of Conduct
-
-This project and everyone participating in it is governed by our [Code of Conduct](CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. Please report unacceptable behavior to chao.brain@qq.com.
-
-## How Can I Contribute?
-
-### Reporting Bugs
-
-Before creating bug reports, please check existing issues to avoid duplicates. When creating a bug report, include:
-
-- **Clear title and description**
-- **Steps to reproduce** the problem
-- **Expected vs actual behavior**
-- **brainpy.state version** and environment details (Python version, OS, JAX version)
-- **Code samples** or test cases that demonstrate the issue
-- **Error messages** and stack traces
-
-Submit bug reports via [GitHub Issues](https://github.com/chaobrain/brainpy.state/issues/new).
-
-### Suggesting Enhancements
-
-Enhancement suggestions are tracked as GitHub issues. When creating an enhancement suggestion, include:
-
-- **Clear use case** - explain the problem you're trying to solve
-- **Proposed solution** - describe how you envision the feature working
-- **Alternative approaches** you've considered
-- **Impact** - who would benefit and how
-
-### Contributing Code
-
-We welcome code contributions! This includes:
-
-- Bug fixes
-- New features
-- Performance improvements
-- Documentation improvements
-- Test coverage improvements
-
-## Development Setup
-
-### Prerequisites
-
-- Python 3.10 or higher
-- Git
-- pip or conda
-
-### Setting Up Your Environment
-
-1. **Fork the repository** on GitHub
-2. **Clone your fork** locally:
- ```bash
- git clone https://github.com/YOUR_USERNAME/brainpy.state.git
- cd brainpy.state
- ```
-
-3. **Create a virtual environment**:
- ```bash
- python -m venv venv
- source venv/bin/activate # On Windows: venv\Scripts\activate
- ```
-
-4. **Install development dependencies**:
- ```bash
- pip install -e ".[dev,cpu]" # Use [dev,cuda12] for CUDA support
- ```
-
-5. **Set up pre-commit hooks** (if available):
- ```bash
- pre-commit install
- ```
-
-## Contribution Workflow
-
-### 1. Create a Branch
-
-Create a new branch for your work:
-```bash
-git checkout -b feature/your-feature-name
-# or
-git checkout -b fix/issue-number-description
-```
-
-Branch naming conventions:
-- `feature/` - new features
-- `fix/` - bug fixes
-- `docs/` - documentation changes
-- `refactor/` - code refactoring
-- `test/` - test improvements
-
-### 2. Make Your Changes
-
-- Write clean, readable code
-- Follow the coding guidelines below
-- Add tests for new functionality
-- Update documentation as needed
-- Keep commits focused and atomic
-
-### 3. Test Your Changes
-
-Run the test suite:
-```bash
-pytest tests/
-```
-
-Run specific tests:
-```bash
-pytest tests/test_specific.py -v
-```
-
-### 4. Commit Your Changes
-
-Write clear, descriptive commit messages:
-```bash
-git commit -m "Fix issue with delayed connection handling (#123)
-
-- Add validation for delay parameters
-- Update tests to cover edge cases
-- Fix documentation example
-"
-```
-
-### 5. Push and Create a Pull Request
-
-```bash
-git push origin feature/your-feature-name
-```
-
-Then create a pull request on GitHub with:
-- **Clear title** describing the change
-- **Description** explaining what and why
-- **Reference to related issues** (e.g., "Fixes #123")
-- **Test results** or screenshots if applicable
-
-## Coding Guidelines
-
-### Python Style
-
-- Follow [PEP 8](https://pep8.org/) style guide
-- Use 2 or 4 spaces for indentation (be consistent with surrounding code)
-- Maximum line length: 100-120 characters
-- Use descriptive variable and function names
-
-### Code Structure
-
-- Keep functions focused and single-purpose
-- Use type hints where appropriate
-- Add docstrings for public APIs (follow NumPy docstring format)
-- Avoid unnecessary complexity
-
-### Example Docstring
-
-```python
-def simulate_network(network, duration, dt=0.1):
- """Simulate a neural network for a specified duration.
-
- Parameters
- ----------
- network : Network
- The neural network to simulate
- duration : float
- Total simulation time in milliseconds
- dt : float, optional
- Time step in milliseconds (default: 0.1)
-
- Returns
- -------
- results : dict
- Simulation results containing spike times and state variables
-
- Examples
- --------
- >>> net = Network()
- >>> results = simulate_network(net, duration=1000.0)
- """
- pass
-```
-
-## Testing
-
-### Writing Tests
-
-- Place tests in the `tests/` directory
-- Use descriptive test function names: `test_feature_does_what_expected`
-- Test edge cases and error conditions
-- Use fixtures for common setups
-
-### Test Coverage
-
-Aim for high test coverage on new code:
-```bash
-pytest --cov=brainpy_state brainpy_state/
-```
-
-## Documentation
-
-### Updating Documentation
-
-- Update relevant documentation when changing features
-- Add examples for new functionality
-- Keep the API reference up to date
-- Fix typos and improve clarity
-
-### Documenting new APIs
-
-Every new public class or function must ship with documentation:
-
-- Use **NumPy-style docstrings** with `Parameters`, `Returns` (or `Yields`),
- and at least one `Examples` block. The project's Sphinx config sets
- `napoleon_numpy_docstring = True` and registers many custom sections
- (e.g. `State Variables`, `Mathematical Model`, `Parameter Mapping`,
- `Implementation Notes`) — use them where they help readers.
-- **BrainPy-style models** — add an `autosummary` entry to the appropriate
- page under `docs/api/brainpy-*.rst`.
-- **NEST-compatible models** — add an `autosummary` entry to the appropriate
- page under `docs/api/nest-*.rst`. Parameter names should match the upstream
- NEST documentation. Document any deliberate deviation in the docstring
- under a `Parameter Mapping` or `Implementation Notes` section.
-- For any new model file, also add a colocated `*_test.py` that exercises
- default parameters and at least one parameter sweep.
-- Export the new symbol in `brainpy_state/__init__.py` (`__all__` plus the
- import) so it appears in the public API surface.
-
-### Marking experimental features
-
-`brainpy.state` ships two model families with different maturity levels — see
-the README's "API status and maturity" section.
-
-- **NEST-compatible models** (anything under `brainpy_state/_nest/`) are
- collectively considered **Experimental — In Development**. Individual
- models do not need their own banner; the family-level banner on
- `docs/api/nest-*.rst` and the [NEST status page](docs/nest-status/index.rst)
- cover the whole set.
-- **BrainPy-style features** that are not yet stable must include a Sphinx
- `.. warning::` admonition at the top of the docstring labelled
- **Experimental — In Development**, and must be omitted from the README
- maturity table until promoted to Stable.
-- **Promoting a feature from Experimental to Stable** requires:
- 1. Full test coverage including parameter validation.
- 2. Removal of the warning admonition from the docstring.
- 3. Addition to the README maturity table.
- 4. A CHANGELOG entry under "API stability".
-- When in doubt, ship as Experimental. Promotion is cheap; demoting silently
- breaks users.
-
-### Documentation review checklist for PRs
-
-Before requesting review, confirm:
-
-- [ ] Docstrings present on all new public APIs (NumPy style).
-- [ ] New module exported via `__all__` in `brainpy_state/__init__.py`.
-- [ ] Added to the corresponding `docs/api/*.rst` page.
-- [ ] If NEST-compatible: parameter names match the upstream NEST documentation.
-- [ ] If experimental: no claims of stability in docstrings or README.
-- [ ] `pytest brainpy_state/` passes locally.
-- [ ] Any executable code block in updated docs or notebooks runs
- end-to-end without errors.
-
-For the full rendered documentation, see .
-
-## Community
-
-### Getting Help
-
-- **Documentation**: https://brainx.chaobrain.com/brainpy-state/
-- **GitHub Discussions**: https://github.com/chaobrain/brainpy.state/discussions
-- **Issues**: https://github.com/chaobrain/brainpy.state/issues
-
-### Recognition
-
-Contributors are recognized in:
-- Release notes
-- Contributors file
-- Project documentation
-
-Thank you for contributing to brainpy.state! Your efforts help make computational neuroscience more accessible and powerful for everyone.
+# Contributing to brainpy.state
+
+Thank you for your interest in contributing to brainpy.state! We welcome contributions from the community and are grateful for your support in making brainpy.state better.
+
+## Table of Contents
+
+- [Code of Conduct](#code-of-conduct)
+- [How Can I Contribute?](#how-can-i-contribute)
+- [Development Setup](#development-setup)
+- [Contribution Workflow](#contribution-workflow)
+- [Coding Guidelines](#coding-guidelines)
+- [Testing](#testing)
+- [Documentation](#documentation)
+- [Community](#community)
+
+## Code of Conduct
+
+This project and everyone participating in it is governed by our [Code of Conduct](CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. Please report unacceptable behavior to chao.brain@qq.com.
+
+## How Can I Contribute?
+
+### Reporting Bugs
+
+Before creating bug reports, please check existing issues to avoid duplicates. When creating a bug report, include:
+
+- **Clear title and description**
+- **Steps to reproduce** the problem
+- **Expected vs actual behavior**
+- **brainpy.state version** and environment details (Python version, OS, JAX version)
+- **Code samples** or test cases that demonstrate the issue
+- **Error messages** and stack traces
+
+Submit bug reports via [GitHub Issues](https://github.com/chaobrain/brainpy.state/issues/new).
+
+### Suggesting Enhancements
+
+Enhancement suggestions are tracked as GitHub issues. When creating an enhancement suggestion, include:
+
+- **Clear use case** - explain the problem you're trying to solve
+- **Proposed solution** - describe how you envision the feature working
+- **Alternative approaches** you've considered
+- **Impact** - who would benefit and how
+
+### Contributing Code
+
+We welcome code contributions! This includes:
+
+- Bug fixes
+- New features
+- Performance improvements
+- Documentation improvements
+- Test coverage improvements
+
+## Development Setup
+
+### Prerequisites
+
+- Python 3.10 or higher
+- Git
+- pip or conda
+
+### Setting Up Your Environment
+
+1. **Fork the repository** on GitHub
+2. **Clone your fork** locally:
+ ```bash
+ git clone https://github.com/YOUR_USERNAME/brainpy.state.git
+ cd brainpy.state
+ ```
+
+3. **Create a virtual environment**:
+ ```bash
+ python -m venv venv
+ source venv/bin/activate # On Windows: venv\Scripts\activate
+ ```
+
+4. **Install development dependencies**:
+ ```bash
+ pip install -e ".[dev,cpu]" # Use [dev,cuda12] for CUDA support
+ ```
+
+5. **Set up pre-commit hooks** (if available):
+ ```bash
+ pre-commit install
+ ```
+
+## Contribution Workflow
+
+### 1. Create a Branch
+
+Create a new branch for your work:
+```bash
+git checkout -b feature/your-feature-name
+# or
+git checkout -b fix/issue-number-description
+```
+
+Branch naming conventions:
+- `feature/` - new features
+- `fix/` - bug fixes
+- `docs/` - documentation changes
+- `refactor/` - code refactoring
+- `test/` - test improvements
+
+### 2. Make Your Changes
+
+- Write clean, readable code
+- Follow the coding guidelines below
+- Add tests for new functionality
+- Update documentation as needed
+- Keep commits focused and atomic
+
+### 3. Test Your Changes
+
+Run the test suite:
+```bash
+pytest tests/
+```
+
+Run specific tests:
+```bash
+pytest tests/test_specific.py -v
+```
+
+### 4. Commit Your Changes
+
+Write clear, descriptive commit messages:
+```bash
+git commit -m "Fix issue with delayed connection handling (#123)
+
+- Add validation for delay parameters
+- Update tests to cover edge cases
+- Fix documentation example
+"
+```
+
+### 5. Push and Create a Pull Request
+
+```bash
+git push origin feature/your-feature-name
+```
+
+Then create a pull request on GitHub with:
+- **Clear title** describing the change
+- **Description** explaining what and why
+- **Reference to related issues** (e.g., "Fixes #123")
+- **Test results** or screenshots if applicable
+
+## Coding Guidelines
+
+### Python Style
+
+- Follow [PEP 8](https://pep8.org/) style guide
+- Use 2 or 4 spaces for indentation (be consistent with surrounding code)
+- Maximum line length: 100-120 characters
+- Use descriptive variable and function names
+
+### Code Structure
+
+- Keep functions focused and single-purpose
+- Use type hints where appropriate
+- Add docstrings for public APIs (follow NumPy docstring format)
+- Avoid unnecessary complexity
+
+### Example Docstring
+
+```python
+def simulate_network(network, duration, dt=0.1):
+ """Simulate a neural network for a specified duration.
+
+ Parameters
+ ----------
+ network : Network
+ The neural network to simulate
+ duration : float
+ Total simulation time in milliseconds
+ dt : float, optional
+ Time step in milliseconds (default: 0.1)
+
+ Returns
+ -------
+ results : dict
+ Simulation results containing spike times and state variables
+
+ Examples
+ --------
+ >>> net = Network()
+ >>> results = simulate_network(net, duration=1000.0)
+ """
+ pass
+```
+
+## Testing
+
+### Writing Tests
+
+- Place tests in the `tests/` directory
+- Use descriptive test function names: `test_feature_does_what_expected`
+- Test edge cases and error conditions
+- Use fixtures for common setups
+
+### Test Coverage
+
+Aim for high test coverage on new code:
+```bash
+pytest --cov=brainpy_state brainpy_state/
+```
+
+## Documentation
+
+### Updating Documentation
+
+- Update relevant documentation when changing features
+- Add examples for new functionality
+- Keep the API reference up to date
+- Fix typos and improve clarity
+
+### Documenting new APIs
+
+Every new public class or function must ship with documentation:
+
+- Use **NumPy-style docstrings** with `Parameters`, `Returns` (or `Yields`),
+ and at least one `Examples` block. The project's Sphinx config sets
+ `napoleon_numpy_docstring = True` and registers many custom sections
+ (e.g. `State Variables`, `Mathematical Model`, `Parameter Mapping`,
+ `Implementation Notes`) — use them where they help readers.
+- **BrainPy-style models** — add an `autosummary` entry to the appropriate
+ page under `docs/api/brainpy-*.rst`.
+- **NEST-compatible models** — add an `autosummary` entry to the appropriate
+ page under `docs/api/nest-*.rst`. Parameter names should match the upstream
+ NEST documentation. Document any deliberate deviation in the docstring
+ under a `Parameter Mapping` or `Implementation Notes` section.
+- For any new model file, also add a colocated `*_test.py` that exercises
+ default parameters and at least one parameter sweep.
+- Export the new symbol in `brainpy_state/__init__.py` (`__all__` plus the
+ import) so it appears in the public API surface.
+
+### Marking experimental features
+
+`brainpy.state` ships two model families with different maturity levels — see
+the README's "API status and maturity" section.
+
+- **NEST-compatible models** (anything under `brainpy_state/_nest/`) are
+ collectively considered **Experimental — In Development**. Individual
+ models do not need their own banner; the family-level banner on
+ `docs/api/nest-*.rst` and the [NEST status page](docs/nest-status/index.rst)
+ cover the whole set.
+- **BrainPy-style features** that are not yet stable must include a Sphinx
+ `.. warning::` admonition at the top of the docstring labelled
+ **Experimental — In Development**, and must be omitted from the README
+ maturity table until promoted to Stable.
+- **Promoting a feature from Experimental to Stable** requires:
+ 1. Full test coverage including parameter validation.
+ 2. Removal of the warning admonition from the docstring.
+ 3. Addition to the README maturity table.
+ 4. A CHANGELOG entry under "API stability".
+- When in doubt, ship as Experimental. Promotion is cheap; demoting silently
+ breaks users.
+
+### Documentation review checklist for PRs
+
+Before requesting review, confirm:
+
+- [ ] Docstrings present on all new public APIs (NumPy style).
+- [ ] New module exported via `__all__` in `brainpy_state/__init__.py`.
+- [ ] Added to the corresponding `docs/api/*.rst` page.
+- [ ] If NEST-compatible: parameter names match the upstream NEST documentation.
+- [ ] If experimental: no claims of stability in docstrings or README.
+- [ ] `pytest brainpy_state/` passes locally.
+- [ ] Any executable code block in updated docs or notebooks runs
+ end-to-end without errors.
+
+For the full rendered documentation, see .
+
+## Community
+
+### Getting Help
+
+- **Documentation**: https://brainx.chaobrain.com/brainpy-state/
+- **GitHub Discussions**: https://github.com/chaobrain/brainpy.state/discussions
+- **Issues**: https://github.com/chaobrain/brainpy.state/issues
+
+### Recognition
+
+Contributors are recognized in:
+- Release notes
+- Contributors file
+- Project documentation
+
+Thank you for contributing to brainpy.state! Your efforts help make computational neuroscience more accessible and powerful for everyone.
diff --git a/LICENSE b/LICENSE
index 653e2ff0..8a52a04a 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,191 +1,191 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship made available under
- the License, as indicated by a copyright notice that is included in
- or attached to the work (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean, as submitted to the Licensor for inclusion
- in the Work by the copyright owner or by an individual or Legal Entity
- authorized to submit on behalf of the copyright owner. For the purposes
- of this definition, "submitted" means any form of electronic, verbal,
- or written communication sent to the Licensor or its representatives,
- including but not limited to communication on electronic mailing lists,
- source code control systems, and issue tracking systems that are managed
- by, or on behalf of, the Licensor for the purpose of discussing and
- improving the Work, but excluding communication that is conspicuously
- marked or otherwise designated in writing by the copyright owner as
- "Not a Contribution."
-
- "Contributor" shall mean Licensor and any Legal Entity on behalf of
- whom a Contribution has been received by the Licensor and subsequently
- incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contributions(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a cross-claim
- or counterclaim in a lawsuit) alleging that the Work or a Contribution
- incorporated within the Work constitutes direct or contributory patent
- infringement, then any patent licenses granted to You under this License
- for that Work shall terminate as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or Derivative Works
- a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works that
- You distribute, all copyright, patent, trademark, and attribution
- notices from the Source form of the Work, excluding those notices
- that do not pertain to any part of the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, You must include a readable copy of the attribution
- notices contained within such NOTICE file, in at least one of the
- following places: within a NOTICE text file distributed as part of
- the Derivative Works; within the Source form or documentation, if
- provided along with the Derivative Works; or, within a display
- generated by the Derivative Works, if and wherever such third-party
- notices normally appear. The contents of the NOTICE file are for
- informational purposes only and do not modify the License. You may
- add Your own attribution notices within Derivative Works that You
- distribute, alongside or as an addendum to the NOTICE text from the
- Work, provided that such additional attribution notices cannot be
- construed as modifying the License.
-
- You may add Your own license statement for Your modifications and
- may provide additional grant of rights to use, copy, modify, merge,
- publish, distribute, sublicense, and/or sell copies of the Work, and
- to permit persons to whom the Work is furnished to do so.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or exemplary damages of any character arising as a result
- of this License or out of the use or inability to use the Work
- (including but not limited to damages for loss of goodwill, work
- stoppage, computer failure or malfunction, or all other commercial
- damages or losses), even if such Contributor has been advised of the
- possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer, and
- charge a fee for, acceptance of support, warranty, indemnity, or
- other liability obligations and/or rights consistent with this License.
- However, in accepting such obligations, You may act only on Your own
- behalf and on Your sole responsibility, not on behalf of any other
- Contributor, and only if You agree to indemnify, defend, and hold each
- Contributor harmless for any liability incurred by, or claims asserted
- against, such Contributor by reason of your accepting any such warranty
- or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format in use. We also recommend that
- a file and/or class name and description be included on the same
- "printed page" as the copyright notice for easier identification within
- third-party archives.
-
- Copyright 2026 BrainX Ecosystem Limited
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship made available under
+ the License, as indicated by a copyright notice that is included in
+ or attached to the work (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean, as submitted to the Licensor for inclusion
+ in the Work by the copyright owner or by an individual or Legal Entity
+ authorized to submit on behalf of the copyright owner. For the purposes
+ of this definition, "submitted" means any form of electronic, verbal,
+ or written communication sent to the Licensor or its representatives,
+ including but not limited to communication on electronic mailing lists,
+ source code control systems, and issue tracking systems that are managed
+ by, or on behalf of, the Licensor for the purpose of discussing and
+ improving the Work, but excluding communication that is conspicuously
+ marked or otherwise designated in writing by the copyright owner as
+ "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any Legal Entity on behalf of
+ whom a Contribution has been received by the Licensor and subsequently
+ incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contributions(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a cross-claim
+ or counterclaim in a lawsuit) alleging that the Work or a Contribution
+ incorporated within the Work constitutes direct or contributory patent
+ infringement, then any patent licenses granted to You under this License
+ for that Work shall terminate as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or Derivative Works
+ a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works that
+ You distribute, all copyright, patent, trademark, and attribution
+ notices from the Source form of the Work, excluding those notices
+ that do not pertain to any part of the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, You must include a readable copy of the attribution
+ notices contained within such NOTICE file, in at least one of the
+ following places: within a NOTICE text file distributed as part of
+ the Derivative Works; within the Source form or documentation, if
+ provided along with the Derivative Works; or, within a display
+ generated by the Derivative Works, if and wherever such third-party
+ notices normally appear. The contents of the NOTICE file are for
+ informational purposes only and do not modify the License. You may
+ add Your own attribution notices within Derivative Works that You
+ distribute, alongside or as an addendum to the NOTICE text from the
+ Work, provided that such additional attribution notices cannot be
+ construed as modifying the License.
+
+ You may add Your own license statement for Your modifications and
+ may provide additional grant of rights to use, copy, modify, merge,
+ publish, distribute, sublicense, and/or sell copies of the Work, and
+ to permit persons to whom the Work is furnished to do so.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or exemplary damages of any character arising as a result
+ of this License or out of the use or inability to use the Work
+ (including but not limited to damages for loss of goodwill, work
+ stoppage, computer failure or malfunction, or all other commercial
+ damages or losses), even if such Contributor has been advised of the
+ possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer, and
+ charge a fee for, acceptance of support, warranty, indemnity, or
+ other liability obligations and/or rights consistent with this License.
+ However, in accepting such obligations, You may act only on Your own
+ behalf and on Your sole responsibility, not on behalf of any other
+ Contributor, and only if You agree to indemnify, defend, and hold each
+ Contributor harmless for any liability incurred by, or claims asserted
+ against, such Contributor by reason of your accepting any such warranty
+ or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format in use. We also recommend that
+ a file and/or class name and description be included on the same
+ "printed page" as the copyright notice for easier identification within
+ third-party archives.
+
+ Copyright 2026 BrainX Ecosystem Limited
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/SECURITY.md b/SECURITY.md
index 3edf1e03..2206b4fc 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -1,80 +1,80 @@
-# Security Policy
-
-## Supported Versions
-
-We release patches for security vulnerabilities for the following versions:
-
-| Version | Supported |
-| ------- | ------------------ |
-| 0.x.x | :white_check_mark: |
-
-## Reporting a Vulnerability
-
-**Please do not report security vulnerabilities through public GitHub issues.**
-
-If you discover a security vulnerability in brainpy.state, please report it to us responsibly:
-
-### Preferred Method: Security Advisories
-
-Use GitHub's Security Advisory feature:
-1. Navigate to the [Security tab](https://github.com/chaobrain/brainpy.state/security/advisories)
-2. Click "Report a vulnerability"
-3. Fill out the form with details about the vulnerability
-
-### Alternative Method: Email
-
-Send an email to: **chao.brain@qq.com**
-
-Please include the following information:
-- Type of vulnerability
-- Full paths of source file(s) related to the vulnerability
-- Location of the affected source code (tag/branch/commit or direct URL)
-- Any special configuration required to reproduce the issue
-- Step-by-step instructions to reproduce the issue
-- Proof-of-concept or exploit code (if possible)
-- Impact of the issue, including how an attacker might exploit it
-
-### Response Timeline
-
-- **Acknowledgment**: We will acknowledge your report within **3 business days**
-- **Initial Response**: You'll receive a detailed response within **7 days** indicating the next steps
-- **Updates**: We will keep you informed of our progress throughout the resolution process
-- **Disclosure**: We aim to address critical vulnerabilities within **30 days**
-
-These timelines may extend during holiday periods or when triage volunteers are unavailable.
-
-### What to Expect
-
-After you submit a report:
-1. We will confirm the vulnerability and determine its impact
-2. We will develop and test a fix
-3. We will release a security advisory and patched versions
-4. We will publicly acknowledge your responsible disclosure (unless you prefer to remain anonymous)
-
-## Security Update Policy
-
-- Security updates will be released as patch versions (e.g., 2.4.1)
-- Critical vulnerabilities may warrant immediate releases
-- All security updates will be announced via:
- - GitHub Security Advisories
- - Release notes
- - Project documentation
-
-## Reporting Bugs in Third-Party Dependencies
-
-Security bugs in third-party modules (jax, numpy, etc.) should be reported directly to their respective maintainers. We will update dependencies promptly when security patches become available.
-
-## Bug Bounty Program
-
-We currently do not offer a paid bug bounty program, but we deeply appreciate and acknowledge all security researchers who help keep brainpy.state secure.
-
-## Security Best Practices for Users
-
-When using brainpy.state:
-- Always use the latest stable version
-- Keep dependencies updated
-- Review and understand code before executing untrusted models
-- Be cautious when loading pre-trained models from untrusted sources
-- Follow security best practices when deploying brainpy.state in production environments
-
-Thank you for helping keep brainpy.state and its users safe!
+# Security Policy
+
+## Supported Versions
+
+We release patches for security vulnerabilities for the following versions:
+
+| Version | Supported |
+| ------- | ------------------ |
+| 0.x.x | :white_check_mark: |
+
+## Reporting a Vulnerability
+
+**Please do not report security vulnerabilities through public GitHub issues.**
+
+If you discover a security vulnerability in brainpy.state, please report it to us responsibly:
+
+### Preferred Method: Security Advisories
+
+Use GitHub's Security Advisory feature:
+1. Navigate to the [Security tab](https://github.com/chaobrain/brainpy.state/security/advisories)
+2. Click "Report a vulnerability"
+3. Fill out the form with details about the vulnerability
+
+### Alternative Method: Email
+
+Send an email to: **chao.brain@qq.com**
+
+Please include the following information:
+- Type of vulnerability
+- Full paths of source file(s) related to the vulnerability
+- Location of the affected source code (tag/branch/commit or direct URL)
+- Any special configuration required to reproduce the issue
+- Step-by-step instructions to reproduce the issue
+- Proof-of-concept or exploit code (if possible)
+- Impact of the issue, including how an attacker might exploit it
+
+### Response Timeline
+
+- **Acknowledgment**: We will acknowledge your report within **3 business days**
+- **Initial Response**: You'll receive a detailed response within **7 days** indicating the next steps
+- **Updates**: We will keep you informed of our progress throughout the resolution process
+- **Disclosure**: We aim to address critical vulnerabilities within **30 days**
+
+These timelines may extend during holiday periods or when triage volunteers are unavailable.
+
+### What to Expect
+
+After you submit a report:
+1. We will confirm the vulnerability and determine its impact
+2. We will develop and test a fix
+3. We will release a security advisory and patched versions
+4. We will publicly acknowledge your responsible disclosure (unless you prefer to remain anonymous)
+
+## Security Update Policy
+
+- Security updates will be released as patch versions (e.g., 2.4.1)
+- Critical vulnerabilities may warrant immediate releases
+- All security updates will be announced via:
+ - GitHub Security Advisories
+ - Release notes
+ - Project documentation
+
+## Reporting Bugs in Third-Party Dependencies
+
+Security bugs in third-party modules (jax, numpy, etc.) should be reported directly to their respective maintainers. We will update dependencies promptly when security patches become available.
+
+## Bug Bounty Program
+
+We currently do not offer a paid bug bounty program, but we deeply appreciate and acknowledge all security researchers who help keep brainpy.state secure.
+
+## Security Best Practices for Users
+
+When using brainpy.state:
+- Always use the latest stable version
+- Keep dependencies updated
+- Review and understand code before executing untrusted models
+- Be cautious when loading pre-trained models from untrusted sources
+- Follow security best practices when deploying brainpy.state in production environments
+
+Thank you for helping keep brainpy.state and its users safe!
diff --git a/brainpy_state/_nest_base/__init__.py b/brainpy_state/_nest_base/__init__.py
index bfaf9450..0ef31f3b 100644
--- a/brainpy_state/_nest_base/__init__.py
+++ b/brainpy_state/_nest_base/__init__.py
@@ -1,7 +1,7 @@
# Copyright 2026 BrainX Ecosystem Limited. Apache 2.0.
-from ._base import NESTDevice, NESTNeuron, NESTSynapse, NESTPlasticity
+from .base import NESTDevice, NESTNeuron, NESTSynapse, NESTPlasticity
__all__ = [
'NESTDevice',
diff --git a/brainpy_state/_nest_base/_base.py b/brainpy_state/_nest_base/base.py
similarity index 100%
rename from brainpy_state/_nest_base/_base.py
rename to brainpy_state/_nest_base/base.py
diff --git a/brainpy_state/_nest_base/jit_compat_test.py b/brainpy_state/_nest_base/jit_compat_test.py
index 9f96993d..fec2fd8c 100644
--- a/brainpy_state/_nest_base/jit_compat_test.py
+++ b/brainpy_state/_nest_base/jit_compat_test.py
@@ -22,7 +22,7 @@
the same machinery as ``jax.jit`` / ``brainstate.transform.for_loop`` (scan),
so a model that traces cleanly here is safe to embed in a jitted simulation.
-Parameter-validation guards are routed through :func:`brainpy_state._nest_base._utils.cond_any`,
+Parameter-validation guards are routed through :func:`brainpy_state._nest_base.utils.cond_any`,
which returns ``False`` for JAX tracers so that ``if`` checks are skipped during
tracing instead of raising ``TracerBoolConversionError``.
@@ -41,10 +41,10 @@
import brainunit as u
import brainpy_state as B
-from brainpy_state._nest_base._base import NESTNeuron
+from brainpy_state._nest_base.base import NESTNeuron
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
# Models whose ``update`` cannot currently be JIT-compiled, with the reason.
diff --git a/brainpy_state/_nest_base/_plastic_base.py b/brainpy_state/_nest_base/plastic_base.py
similarity index 97%
rename from brainpy_state/_nest_base/_plastic_base.py
rename to brainpy_state/_nest_base/plastic_base.py
index 96e5f469..3cd4458e 100644
--- a/brainpy_state/_nest_base/_plastic_base.py
+++ b/brainpy_state/_nest_base/plastic_base.py
@@ -3,7 +3,7 @@
The rebuilt ``_nest/_synapse.py`` models are NEST-faithful parameter
specs plus a pure ``update(state, ctx)`` rule kernel that runs on the
-:class:`~brainpy_state._nest_network._event_plastic.EventPlasticProj` substrate.
+:class:`~brainpy_state._nest_network.event_plastic.EventPlasticProj` substrate.
This module factors out the construction-time scalar coercion / validation
(NEST error strings preserved) and the per-edge freeze used by every kernel, so
each model file stays focused on its parameters and equations.
diff --git a/brainpy_state/_nest_base/_utils.py b/brainpy_state/_nest_base/utils.py
similarity index 100%
rename from brainpy_state/_nest_base/_utils.py
rename to brainpy_state/_nest_base/utils.py
diff --git a/brainpy_state/_nest_base/_utils_test.py b/brainpy_state/_nest_base/utils_test.py
similarity index 98%
rename from brainpy_state/_nest_base/_utils_test.py
rename to brainpy_state/_nest_base/utils_test.py
index f2e72757..1f00104c 100644
--- a/brainpy_state/_nest_base/_utils_test.py
+++ b/brainpy_state/_nest_base/utils_test.py
@@ -21,7 +21,7 @@
import numpy as np
import numpy.testing as npt
-from brainpy_state._nest_base._utils import (
+from brainpy_state._nest_base.utils import (
propagator_exp,
alpha_propagator_p31_p32,
)
diff --git a/brainpy_state/_nest_device/ac_generator.py b/brainpy_state/_nest_device/ac_generator.py
index da4cbc8f..3b5b416a 100644
--- a/brainpy_state/_nest_device/ac_generator.py
+++ b/brainpy_state/_nest_device/ac_generator.py
@@ -21,7 +21,7 @@
import jax.numpy as jnp
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTDevice
+from brainpy_state._nest_base.base import NESTDevice
__all__ = [
'ac_generator',
diff --git a/brainpy_state/_nest_device/correlation_detector.py b/brainpy_state/_nest_device/correlation_detector.py
index a4e22f3e..377ddec0 100644
--- a/brainpy_state/_nest_device/correlation_detector.py
+++ b/brainpy_state/_nest_device/correlation_detector.py
@@ -24,7 +24,7 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTDevice
+from brainpy_state._nest_base.base import NESTDevice
__all__ = [
'correlation_detector',
diff --git a/brainpy_state/_nest_device/correlation_detector_test.py b/brainpy_state/_nest_device/correlation_detector_test.py
index ecb063ff..6a7c9084 100644
--- a/brainpy_state/_nest_device/correlation_detector_test.py
+++ b/brainpy_state/_nest_device/correlation_detector_test.py
@@ -25,7 +25,7 @@
import numpy.testing as npt
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import correlation_detector
diff --git a/brainpy_state/_nest_device/correlomatrix_detector.py b/brainpy_state/_nest_device/correlomatrix_detector.py
index fce1d5b5..fc39672a 100644
--- a/brainpy_state/_nest_device/correlomatrix_detector.py
+++ b/brainpy_state/_nest_device/correlomatrix_detector.py
@@ -24,7 +24,7 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTDevice
+from brainpy_state._nest_base.base import NESTDevice
__all__ = [
'correlomatrix_detector',
diff --git a/brainpy_state/_nest_device/correlomatrix_detector_test.py b/brainpy_state/_nest_device/correlomatrix_detector_test.py
index 2061ce28..bdfe9c5b 100644
--- a/brainpy_state/_nest_device/correlomatrix_detector_test.py
+++ b/brainpy_state/_nest_device/correlomatrix_detector_test.py
@@ -25,7 +25,7 @@
import numpy.testing as npt
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import correlomatrix_detector
diff --git a/brainpy_state/_nest_device/correlospinmatrix_detector.py b/brainpy_state/_nest_device/correlospinmatrix_detector.py
index d56be68a..5ce76254 100644
--- a/brainpy_state/_nest_device/correlospinmatrix_detector.py
+++ b/brainpy_state/_nest_device/correlospinmatrix_detector.py
@@ -24,7 +24,7 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTDevice
+from brainpy_state._nest_base.base import NESTDevice
__all__ = [
'correlospinmatrix_detector',
diff --git a/brainpy_state/_nest_device/correlospinmatrix_detector_test.py b/brainpy_state/_nest_device/correlospinmatrix_detector_test.py
index dd05ebae..7e5b2d37 100644
--- a/brainpy_state/_nest_device/correlospinmatrix_detector_test.py
+++ b/brainpy_state/_nest_device/correlospinmatrix_detector_test.py
@@ -25,7 +25,7 @@
import numpy.testing as npt
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import correlospinmatrix_detector
diff --git a/brainpy_state/_nest_device/dc_generator.py b/brainpy_state/_nest_device/dc_generator.py
index f02a866e..e5444d59 100644
--- a/brainpy_state/_nest_device/dc_generator.py
+++ b/brainpy_state/_nest_device/dc_generator.py
@@ -21,7 +21,7 @@
import jax.numpy as jnp
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTDevice
+from brainpy_state._nest_base.base import NESTDevice
__all__ = [
'dc_generator',
diff --git a/brainpy_state/_nest_device/dc_generator_test.py b/brainpy_state/_nest_device/dc_generator_test.py
index c3d584af..91e922bd 100644
--- a/brainpy_state/_nest_device/dc_generator_test.py
+++ b/brainpy_state/_nest_device/dc_generator_test.py
@@ -35,7 +35,7 @@
import numpy as np
import numpy.testing as npt
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import dc_generator, iaf_psc_delta
diff --git a/brainpy_state/_nest_device/gamma_sup_generator.py b/brainpy_state/_nest_device/gamma_sup_generator.py
index 470cb0e5..6c93085d 100644
--- a/brainpy_state/_nest_device/gamma_sup_generator.py
+++ b/brainpy_state/_nest_device/gamma_sup_generator.py
@@ -24,7 +24,7 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTDevice
+from brainpy_state._nest_base.base import NESTDevice
__all__ = [
'gamma_sup_generator',
diff --git a/brainpy_state/_nest_device/gamma_sup_generator_test.py b/brainpy_state/_nest_device/gamma_sup_generator_test.py
index 30fe5f52..ccada93e 100644
--- a/brainpy_state/_nest_device/gamma_sup_generator_test.py
+++ b/brainpy_state/_nest_device/gamma_sup_generator_test.py
@@ -31,7 +31,7 @@
from brainpy_state._nest_device.gamma_sup_generator import gamma_sup_generator
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _run_bp_counts_and_spikes(
diff --git a/brainpy_state/_nest_device/host_drive.py b/brainpy_state/_nest_device/host_drive.py
index 6530bb6c..c54efd96 100644
--- a/brainpy_state/_nest_device/host_drive.py
+++ b/brainpy_state/_nest_device/host_drive.py
@@ -31,7 +31,7 @@
import jax.numpy as jnp
from brainstate.typing import Size
-from brainpy_state._nest_base._base import NESTDevice
+from brainpy_state._nest_base.base import NESTDevice
__all__ = [
'host_spike_drive',
diff --git a/brainpy_state/_nest_device/host_drive_test.py b/brainpy_state/_nest_device/host_drive_test.py
index ccd16ca1..a7624c05 100644
--- a/brainpy_state/_nest_device/host_drive_test.py
+++ b/brainpy_state/_nest_device/host_drive_test.py
@@ -24,7 +24,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import (host_spike_drive, host_current_drive, spike_generator,
dc_generator, parrot_neuron, iaf_psc_exp,
diff --git a/brainpy_state/_nest_device/inhomogeneous_poisson_generator.py b/brainpy_state/_nest_device/inhomogeneous_poisson_generator.py
index 06b4990a..ec1ae699 100644
--- a/brainpy_state/_nest_device/inhomogeneous_poisson_generator.py
+++ b/brainpy_state/_nest_device/inhomogeneous_poisson_generator.py
@@ -26,7 +26,7 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTDevice
+from brainpy_state._nest_base.base import NESTDevice
__all__ = [
'inhomogeneous_poisson_generator',
diff --git a/brainpy_state/_nest_device/inhomogeneous_poisson_generator_test.py b/brainpy_state/_nest_device/inhomogeneous_poisson_generator_test.py
index 0278b97c..9e5acaa5 100644
--- a/brainpy_state/_nest_device/inhomogeneous_poisson_generator_test.py
+++ b/brainpy_state/_nest_device/inhomogeneous_poisson_generator_test.py
@@ -36,7 +36,7 @@
inhomogeneous_poisson_generator,
)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _run_bp_counts(
diff --git a/brainpy_state/_nest_device/mip_generator.py b/brainpy_state/_nest_device/mip_generator.py
index a6b88cd6..b0e065a5 100644
--- a/brainpy_state/_nest_device/mip_generator.py
+++ b/brainpy_state/_nest_device/mip_generator.py
@@ -24,7 +24,7 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTDevice
+from brainpy_state._nest_base.base import NESTDevice
__all__ = [
'mip_generator',
diff --git a/brainpy_state/_nest_device/mip_generator_test.py b/brainpy_state/_nest_device/mip_generator_test.py
index 3286b3e6..4db6b191 100644
--- a/brainpy_state/_nest_device/mip_generator_test.py
+++ b/brainpy_state/_nest_device/mip_generator_test.py
@@ -31,7 +31,7 @@
from brainpy_state._nest_device.mip_generator import mip_generator
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _run_bp_matrix(
diff --git a/brainpy_state/_nest_device/multimeter.py b/brainpy_state/_nest_device/multimeter.py
index 3203b047..1ac4c2d5 100644
--- a/brainpy_state/_nest_device/multimeter.py
+++ b/brainpy_state/_nest_device/multimeter.py
@@ -24,7 +24,7 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTDevice
+from brainpy_state._nest_base.base import NESTDevice
__all__ = [
'multimeter',
diff --git a/brainpy_state/_nest_device/multimeter_test.py b/brainpy_state/_nest_device/multimeter_test.py
index e1021e35..4677c3d1 100644
--- a/brainpy_state/_nest_device/multimeter_test.py
+++ b/brainpy_state/_nest_device/multimeter_test.py
@@ -25,7 +25,7 @@
import numpy.testing as npt
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import iaf_psc_delta, multimeter
diff --git a/brainpy_state/_nest_device/noise_generator.py b/brainpy_state/_nest_device/noise_generator.py
index a3a8a5ea..22b3a231 100644
--- a/brainpy_state/_nest_device/noise_generator.py
+++ b/brainpy_state/_nest_device/noise_generator.py
@@ -25,7 +25,7 @@
import jax.numpy as jnp
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTDevice
+from brainpy_state._nest_base.base import NESTDevice
__all__ = [
'noise_generator',
diff --git a/brainpy_state/_nest_device/noise_generator_test.py b/brainpy_state/_nest_device/noise_generator_test.py
index 93b7a540..be3a44ea 100644
--- a/brainpy_state/_nest_device/noise_generator_test.py
+++ b/brainpy_state/_nest_device/noise_generator_test.py
@@ -35,7 +35,7 @@
import numpy as np
import numpy.testing as npt
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import noise_generator
diff --git a/brainpy_state/_nest_device/poisson_generator.py b/brainpy_state/_nest_device/poisson_generator.py
index 1bae3a48..71932090 100644
--- a/brainpy_state/_nest_device/poisson_generator.py
+++ b/brainpy_state/_nest_device/poisson_generator.py
@@ -24,7 +24,7 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTDevice
+from brainpy_state._nest_base.base import NESTDevice
__all__ = [
'poisson_generator',
diff --git a/brainpy_state/_nest_device/poisson_generator_ps.py b/brainpy_state/_nest_device/poisson_generator_ps.py
index 496e7b91..410a656c 100644
--- a/brainpy_state/_nest_device/poisson_generator_ps.py
+++ b/brainpy_state/_nest_device/poisson_generator_ps.py
@@ -21,7 +21,7 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTDevice
+from brainpy_state._nest_base.base import NESTDevice
__all__ = [
'poisson_generator_ps',
diff --git a/brainpy_state/_nest_device/poisson_generator_ps_test.py b/brainpy_state/_nest_device/poisson_generator_ps_test.py
index e67ba9f6..994ee6e1 100644
--- a/brainpy_state/_nest_device/poisson_generator_ps_test.py
+++ b/brainpy_state/_nest_device/poisson_generator_ps_test.py
@@ -31,7 +31,7 @@
from brainpy_state._nest_device.poisson_generator_ps import poisson_generator_ps
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _run_bp_counts_and_times(
diff --git a/brainpy_state/_nest_device/poisson_generator_test.py b/brainpy_state/_nest_device/poisson_generator_test.py
index 1886c936..290ba5da 100644
--- a/brainpy_state/_nest_device/poisson_generator_test.py
+++ b/brainpy_state/_nest_device/poisson_generator_test.py
@@ -32,7 +32,7 @@
from brainpy_state._nest_device.poisson_generator import poisson_generator
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _run_bp_counts(
diff --git a/brainpy_state/_nest_device/ppd_sup_generator.py b/brainpy_state/_nest_device/ppd_sup_generator.py
index dba50b40..ff3fd306 100644
--- a/brainpy_state/_nest_device/ppd_sup_generator.py
+++ b/brainpy_state/_nest_device/ppd_sup_generator.py
@@ -23,7 +23,7 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTDevice
+from brainpy_state._nest_base.base import NESTDevice
__all__ = [
'ppd_sup_generator',
diff --git a/brainpy_state/_nest_device/ppd_sup_generator_test.py b/brainpy_state/_nest_device/ppd_sup_generator_test.py
index ef367784..2b3f4934 100644
--- a/brainpy_state/_nest_device/ppd_sup_generator_test.py
+++ b/brainpy_state/_nest_device/ppd_sup_generator_test.py
@@ -31,7 +31,7 @@
from brainpy_state._nest_device.ppd_sup_generator import ppd_sup_generator
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _run_bp_counts_and_spikes(
diff --git a/brainpy_state/_nest_device/pulsepacket_generator.py b/brainpy_state/_nest_device/pulsepacket_generator.py
index eed51ad1..78e53389 100644
--- a/brainpy_state/_nest_device/pulsepacket_generator.py
+++ b/brainpy_state/_nest_device/pulsepacket_generator.py
@@ -26,7 +26,7 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTDevice
+from brainpy_state._nest_base.base import NESTDevice
__all__ = [
'pulsepacket_generator',
diff --git a/brainpy_state/_nest_device/pulsepacket_generator_test.py b/brainpy_state/_nest_device/pulsepacket_generator_test.py
index fa89cbc4..be0339d8 100644
--- a/brainpy_state/_nest_device/pulsepacket_generator_test.py
+++ b/brainpy_state/_nest_device/pulsepacket_generator_test.py
@@ -31,7 +31,7 @@
from brainpy_state._nest_device.pulsepacket_generator import pulsepacket_generator
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _run_bp_counts(
diff --git a/brainpy_state/_nest_device/sinusoidal_gamma_generator.py b/brainpy_state/_nest_device/sinusoidal_gamma_generator.py
index de8d2773..60447f30 100644
--- a/brainpy_state/_nest_device/sinusoidal_gamma_generator.py
+++ b/brainpy_state/_nest_device/sinusoidal_gamma_generator.py
@@ -25,7 +25,7 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTDevice
+from brainpy_state._nest_base.base import NESTDevice
__all__ = [
'sinusoidal_gamma_generator',
diff --git a/brainpy_state/_nest_device/sinusoidal_gamma_generator_test.py b/brainpy_state/_nest_device/sinusoidal_gamma_generator_test.py
index 4263b2c6..612f5d26 100644
--- a/brainpy_state/_nest_device/sinusoidal_gamma_generator_test.py
+++ b/brainpy_state/_nest_device/sinusoidal_gamma_generator_test.py
@@ -35,7 +35,7 @@
sinusoidal_gamma_generator,
)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _run_bp_counts(
diff --git a/brainpy_state/_nest_device/sinusoidal_poisson_generator.py b/brainpy_state/_nest_device/sinusoidal_poisson_generator.py
index 9567229b..2b7571e9 100644
--- a/brainpy_state/_nest_device/sinusoidal_poisson_generator.py
+++ b/brainpy_state/_nest_device/sinusoidal_poisson_generator.py
@@ -25,7 +25,7 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTDevice
+from brainpy_state._nest_base.base import NESTDevice
__all__ = [
'sinusoidal_poisson_generator',
diff --git a/brainpy_state/_nest_device/sinusoidal_poisson_generator_test.py b/brainpy_state/_nest_device/sinusoidal_poisson_generator_test.py
index 49695b45..b263bbb6 100644
--- a/brainpy_state/_nest_device/sinusoidal_poisson_generator_test.py
+++ b/brainpy_state/_nest_device/sinusoidal_poisson_generator_test.py
@@ -35,7 +35,7 @@
sinusoidal_poisson_generator,
)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _run_bp_counts(
diff --git a/brainpy_state/_nest_device/spike_dilutor.py b/brainpy_state/_nest_device/spike_dilutor.py
index 9765d09e..2eecfeb4 100644
--- a/brainpy_state/_nest_device/spike_dilutor.py
+++ b/brainpy_state/_nest_device/spike_dilutor.py
@@ -25,7 +25,7 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTDevice
+from brainpy_state._nest_base.base import NESTDevice
__all__ = [
'spike_dilutor',
diff --git a/brainpy_state/_nest_device/spike_dilutor_test.py b/brainpy_state/_nest_device/spike_dilutor_test.py
index 1b58f705..1aebfcb7 100644
--- a/brainpy_state/_nest_device/spike_dilutor_test.py
+++ b/brainpy_state/_nest_device/spike_dilutor_test.py
@@ -32,7 +32,7 @@
from brainpy_state._nest_device.spike_dilutor import spike_dilutor
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
class TestSpikeDilutorParameters(unittest.TestCase):
diff --git a/brainpy_state/_nest_device/spike_generator.py b/brainpy_state/_nest_device/spike_generator.py
index 3f4d9d6c..33250b19 100644
--- a/brainpy_state/_nest_device/spike_generator.py
+++ b/brainpy_state/_nest_device/spike_generator.py
@@ -23,7 +23,7 @@
import brainunit as u
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTDevice
+from brainpy_state._nest_base.base import NESTDevice
__all__ = [
'spike_generator',
diff --git a/brainpy_state/_nest_device/spike_generator_test.py b/brainpy_state/_nest_device/spike_generator_test.py
index ca292fb6..6b9945b5 100644
--- a/brainpy_state/_nest_device/spike_generator_test.py
+++ b/brainpy_state/_nest_device/spike_generator_test.py
@@ -35,7 +35,7 @@
import numpy.testing as npt
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import spike_generator
diff --git a/brainpy_state/_nest_device/spike_recorder.py b/brainpy_state/_nest_device/spike_recorder.py
index 2ae32d25..6f56c384 100644
--- a/brainpy_state/_nest_device/spike_recorder.py
+++ b/brainpy_state/_nest_device/spike_recorder.py
@@ -23,7 +23,7 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTDevice
+from brainpy_state._nest_base.base import NESTDevice
__all__ = [
'spike_recorder',
diff --git a/brainpy_state/_nest_device/spike_recorder_test.py b/brainpy_state/_nest_device/spike_recorder_test.py
index ca7a2a85..733bf25f 100644
--- a/brainpy_state/_nest_device/spike_recorder_test.py
+++ b/brainpy_state/_nest_device/spike_recorder_test.py
@@ -26,7 +26,7 @@
import numpy.testing as npt
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import iaf_psc_delta, spike_recorder
diff --git a/brainpy_state/_nest_device/spike_train_injector.py b/brainpy_state/_nest_device/spike_train_injector.py
index b118636a..623717d0 100644
--- a/brainpy_state/_nest_device/spike_train_injector.py
+++ b/brainpy_state/_nest_device/spike_train_injector.py
@@ -22,7 +22,7 @@
import brainunit as u
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTDevice
+from brainpy_state._nest_base.base import NESTDevice
__all__ = [
'spike_train_injector',
diff --git a/brainpy_state/_nest_device/spike_train_injector_test.py b/brainpy_state/_nest_device/spike_train_injector_test.py
index 7ccb2139..8d20a49f 100644
--- a/brainpy_state/_nest_device/spike_train_injector_test.py
+++ b/brainpy_state/_nest_device/spike_train_injector_test.py
@@ -36,7 +36,7 @@
import brainunit as u
import numpy.testing as npt
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import spike_train_injector
diff --git a/brainpy_state/_nest_device/spin_detector.py b/brainpy_state/_nest_device/spin_detector.py
index a2406730..2858174c 100644
--- a/brainpy_state/_nest_device/spin_detector.py
+++ b/brainpy_state/_nest_device/spin_detector.py
@@ -23,7 +23,7 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTDevice
+from brainpy_state._nest_base.base import NESTDevice
__all__ = [
'spin_detector',
diff --git a/brainpy_state/_nest_device/spin_detector_test.py b/brainpy_state/_nest_device/spin_detector_test.py
index f493145b..2dbad694 100644
--- a/brainpy_state/_nest_device/spin_detector_test.py
+++ b/brainpy_state/_nest_device/spin_detector_test.py
@@ -25,7 +25,7 @@
import numpy.testing as npt
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import spin_detector
diff --git a/brainpy_state/_nest_device/step_current_generator.py b/brainpy_state/_nest_device/step_current_generator.py
index 5742d194..a5caa626 100644
--- a/brainpy_state/_nest_device/step_current_generator.py
+++ b/brainpy_state/_nest_device/step_current_generator.py
@@ -22,8 +22,8 @@
import brainunit as u
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTDevice
-from brainpy_state._nest_base._utils import stack_schedule_values
+from brainpy_state._nest_base.base import NESTDevice
+from brainpy_state._nest_base.utils import stack_schedule_values
__all__ = [
'step_current_generator',
diff --git a/brainpy_state/_nest_device/step_current_generator_test.py b/brainpy_state/_nest_device/step_current_generator_test.py
index eb4f0185..2d0ab359 100644
--- a/brainpy_state/_nest_device/step_current_generator_test.py
+++ b/brainpy_state/_nest_device/step_current_generator_test.py
@@ -35,7 +35,7 @@
import numpy as np
import numpy.testing as npt
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import step_current_generator, iaf_psc_delta
diff --git a/brainpy_state/_nest_device/step_rate_generator.py b/brainpy_state/_nest_device/step_rate_generator.py
index 03c15d47..d0e0ee48 100644
--- a/brainpy_state/_nest_device/step_rate_generator.py
+++ b/brainpy_state/_nest_device/step_rate_generator.py
@@ -22,8 +22,8 @@
import brainunit as u
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTDevice
-from brainpy_state._nest_base._utils import stack_schedule_values
+from brainpy_state._nest_base.base import NESTDevice
+from brainpy_state._nest_base.utils import stack_schedule_values
__all__ = [
'step_rate_generator',
diff --git a/brainpy_state/_nest_device/step_rate_generator_test.py b/brainpy_state/_nest_device/step_rate_generator_test.py
index b641a38d..d205424b 100644
--- a/brainpy_state/_nest_device/step_rate_generator_test.py
+++ b/brainpy_state/_nest_device/step_rate_generator_test.py
@@ -33,7 +33,7 @@
import numpy.testing as npt
import pytest
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import step_rate_generator
diff --git a/brainpy_state/_nest_device/voltmeter_test.py b/brainpy_state/_nest_device/voltmeter_test.py
index 0a1c709f..85edcd43 100644
--- a/brainpy_state/_nest_device/voltmeter_test.py
+++ b/brainpy_state/_nest_device/voltmeter_test.py
@@ -5,7 +5,7 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
class TestVoltmeter(unittest.TestCase):
@@ -21,7 +21,7 @@ def test_records_only_v_m_by_default(self):
def test_is_a_multimeter(self):
from brainpy_state import voltmeter, multimeter
- from brainpy_state._nest_base._base import NESTDevice
+ from brainpy_state._nest_base.base import NESTDevice
vm = voltmeter()
self.assertIsInstance(vm, multimeter)
self.assertIsInstance(vm, NESTDevice)
diff --git a/brainpy_state/_nest_device/volume_transmitter.py b/brainpy_state/_nest_device/volume_transmitter.py
index 6b7c15ce..6740d53b 100644
--- a/brainpy_state/_nest_device/volume_transmitter.py
+++ b/brainpy_state/_nest_device/volume_transmitter.py
@@ -5,7 +5,7 @@
concentration ``n(t)`` as a broadcast :class:`brainstate.HiddenState`, computed
once per step and read identically by every edge of a dopamine-modulated
projection (the cluster-08 ``signal_reads`` seam of
-:class:`~brainpy_state._nest_network._event_plastic.VoltageCoupledPlasticProj`).
+:class:`~brainpy_state._nest_network.event_plastic.VoltageCoupledPlasticProj`).
The previous imperative ring-buffer port (NEST delivery stamps, spike-history
lists, host scalars) is retired: with the online per-step weight integral, the
@@ -28,8 +28,8 @@
import brainunit as u
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTDevice
-from brainpy_state._nest_base._plastic_base import to_ms, to_scalar_int
+from brainpy_state._nest_base.base import NESTDevice
+from brainpy_state._nest_base.plastic_base import to_ms, to_scalar_int
__all__ = [
'volume_transmitter',
diff --git a/brainpy_state/_nest_device/volume_transmitter_rule_test.py b/brainpy_state/_nest_device/volume_transmitter_rule_test.py
index 91868ab3..018b28e6 100644
--- a/brainpy_state/_nest_device/volume_transmitter_rule_test.py
+++ b/brainpy_state/_nest_device/volume_transmitter_rule_test.py
@@ -21,7 +21,7 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_device.volume_transmitter import volume_transmitter # noqa: E402
diff --git a/brainpy_state/_nest_device/weight_recorder.py b/brainpy_state/_nest_device/weight_recorder.py
index 2381286e..c4761e6a 100644
--- a/brainpy_state/_nest_device/weight_recorder.py
+++ b/brainpy_state/_nest_device/weight_recorder.py
@@ -23,7 +23,7 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTDevice
+from brainpy_state._nest_base.base import NESTDevice
__all__ = [
'weight_recorder',
diff --git a/brainpy_state/_nest_device/weight_recorder_test.py b/brainpy_state/_nest_device/weight_recorder_test.py
index caf6965c..8503115b 100644
--- a/brainpy_state/_nest_device/weight_recorder_test.py
+++ b/brainpy_state/_nest_device/weight_recorder_test.py
@@ -25,7 +25,7 @@
import numpy.testing as npt
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import weight_recorder
diff --git a/brainpy_state/_nest_network/__init__.py b/brainpy_state/_nest_network/__init__.py
index fbff491d..913c756a 100644
--- a/brainpy_state/_nest_network/__init__.py
+++ b/brainpy_state/_nest_network/__init__.py
@@ -1,8 +1,8 @@
# Copyright 2026 BrainX Ecosystem Limited. Apache 2.0.
-from ._base import Network
-from ._builder import Builder
-from ._recorders import Recorder
-from ._projections import (
+from .base import Network
+from .builder import Builder
+from .recorders import Recorder
+from .projections import (
OneToOneProj,
AllToAllProj,
PairwiseBernoulliProj,
@@ -14,16 +14,16 @@
)
# NEST-flavored explicit Simulator API.
-from ._nodeview import NodeView
-from ._rules import (
+from .nodeview import NodeView
+from .rules import (
ConnRule, all_to_all, one_to_one, fixed_indegree, pairwise_bernoulli,
fixed_total_number, third_factor_bernoulli_with_pool, explicit_edges,
)
-from ._event_proj import EventProjection
-from ._event_plastic import EventPlasticProj, VoltageCoupledPlasticProj
-from ._connection_introspection import SynapseCollection
-from ._simulator import Simulator, SimulationResult
-from ._weight_recorder_view import send_steps_from_pre, weight_recorder_events
+from .event_proj import EventProjection
+from .event_plastic import EventPlasticProj, VoltageCoupledPlasticProj
+from .connection_introspection import SynapseCollection
+from .simulator import Simulator, SimulationResult
+from .weight_recorder_view import send_steps_from_pre, weight_recorder_events
__all__ = [
'Network',
diff --git a/brainpy_state/_nest_network/_base.py b/brainpy_state/_nest_network/base.py
similarity index 98%
rename from brainpy_state/_nest_network/_base.py
rename to brainpy_state/_nest_network/base.py
index b8c86e08..ee46aeb9 100644
--- a/brainpy_state/_nest_network/_base.py
+++ b/brainpy_state/_nest_network/base.py
@@ -6,7 +6,7 @@
from brainpy_state._base import Neuron
from brainpy_state._brainpy.projection import Projection
-from brainpy_state._nest_base._base import NESTDevice
+from brainpy_state._nest_base.base import NESTDevice
__all__ = ['Network']
diff --git a/brainpy_state/_nest_network/_base_test.py b/brainpy_state/_nest_network/base_test.py
similarity index 98%
rename from brainpy_state/_nest_network/_base_test.py
rename to brainpy_state/_nest_network/base_test.py
index 5d953d62..f0a5e936 100644
--- a/brainpy_state/_nest_network/_base_test.py
+++ b/brainpy_state/_nest_network/base_test.py
@@ -3,7 +3,7 @@
import brainstate
import brainunit as u
-from brainpy_state._nest_network._base import Network
+from brainpy_state._nest_network.base import Network
from brainpy_state import LIF
diff --git a/brainpy_state/_nest_network/_brunel_test.py b/brainpy_state/_nest_network/brunel_test.py
similarity index 100%
rename from brainpy_state/_nest_network/_brunel_test.py
rename to brainpy_state/_nest_network/brunel_test.py
diff --git a/brainpy_state/_nest_network/_builder.py b/brainpy_state/_nest_network/builder.py
similarity index 96%
rename from brainpy_state/_nest_network/_builder.py
rename to brainpy_state/_nest_network/builder.py
index 520c051a..448bc0d2 100644
--- a/brainpy_state/_nest_network/_builder.py
+++ b/brainpy_state/_nest_network/builder.py
@@ -9,7 +9,7 @@
from brainpy_state._base import Dynamics
from brainpy_state._brainpy.projection import Projection
-from brainpy_state._nest_network._base import Network
+from brainpy_state._nest_network.base import Network
__all__ = ['Builder']
diff --git a/brainpy_state/_nest_network/_builder_test.py b/brainpy_state/_nest_network/builder_test.py
similarity index 90%
rename from brainpy_state/_nest_network/_builder_test.py
rename to brainpy_state/_nest_network/builder_test.py
index 7dec4973..e3009230 100644
--- a/brainpy_state/_nest_network/_builder_test.py
+++ b/brainpy_state/_nest_network/builder_test.py
@@ -5,9 +5,9 @@
import brainunit as u
from brainpy_state import LIF, Expon, COBA
-from brainpy_state._nest_network._builder import Builder
-from brainpy_state._nest_network._base import Network
-from brainpy_state._nest_network._projections import OneToOneProj
+from brainpy_state._nest_network.builder import Builder
+from brainpy_state._nest_network.base import Network
+from brainpy_state._nest_network.projections import OneToOneProj
class TestBuilder(unittest.TestCase):
diff --git a/brainpy_state/_nest_network/_connection_introspection.py b/brainpy_state/_nest_network/connection_introspection.py
similarity index 98%
rename from brainpy_state/_nest_network/_connection_introspection.py
rename to brainpy_state/_nest_network/connection_introspection.py
index e0dd626e..5ed5234e 100644
--- a/brainpy_state/_nest_network/_connection_introspection.py
+++ b/brainpy_state/_nest_network/connection_introspection.py
@@ -2,7 +2,7 @@
"""Connection enumeration + introspection (NEST ``GetConnections`` analogue).
This module is a thin, **additive** convenience layer over the projections the
-:class:`~brainpy_state._nest_network._simulator.Simulator` already builds — it does not
+:class:`~brainpy_state._nest_network.simulator.Simulator` already builds — it does not
change how any projection stores its edges. Each projection family exposes a
``realized_edges()`` accessor (in ``_event_proj.py`` / ``_event_plastic.py``)
returning a :class:`ProjEdges` view of its realized synapses; this module wraps a
@@ -230,7 +230,7 @@ def event_proj_edges(proj) -> 'ProjEdges':
element-wise ``one_to_one``); maps segment-local storage indices to
population-local ``source`` / ``target`` and sorts to the canonical edge order.
"""
- from brainpy_state._nest_network._projections import _DenseMatMul
+ from brainpy_state._nest_network.projections import _DenseMatMul
pre_map = np.asarray(proj.pre_local_idx)
post_map = np.asarray(proj.post_local_idx)
@@ -352,7 +352,7 @@ def _membership(view):
if hasattr(view, 'segments'):
segments = view.segments
else: # a bare population module
- from brainpy_state._nest_network._nodeview import NodeView
+ from brainpy_state._nest_network.nodeview import NodeView
segments = NodeView.of(view).segments
members = {}
for seg in segments:
@@ -415,11 +415,11 @@ def _to_unit_mantissa(value, unit):
class SynapseCollection:
"""A filtered, lazy view over realized synapses (NEST ``SynapseCollection``).
- Returned by :meth:`~brainpy_state._nest_network._simulator.Simulator.get_connections`.
+ Returned by :meth:`~brainpy_state._nest_network.simulator.Simulator.get_connections`.
It stores, per spanned projection, only the kept edge indices and their
population-local ``source`` / ``target`` — **no copy** of weight or delay. Each
:meth:`get` re-reads weight / delay from the live projection, so a query made
- before :meth:`~brainpy_state._nest_network._simulator.Simulator.simulate` still
+ before :meth:`~brainpy_state._nest_network.simulator.Simulator.simulate` still
reflects post-simulation evolved plastic weights.
Methods mirror the NEST object: :meth:`get` (one key -> array, a list of keys
diff --git a/brainpy_state/_nest_network/_connection_introspection_test.py b/brainpy_state/_nest_network/connection_introspection_test.py
similarity index 99%
rename from brainpy_state/_nest_network/_connection_introspection_test.py
rename to brainpy_state/_nest_network/connection_introspection_test.py
index 430b9436..b1c533f6 100644
--- a/brainpy_state/_nest_network/_connection_introspection_test.py
+++ b/brainpy_state/_nest_network/connection_introspection_test.py
@@ -15,13 +15,13 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import (
Simulator, iaf_psc_exp, iaf_cond_exp, all_to_all, one_to_one, fixed_indegree,
static_synapse, static_synapse_hom_w,
)
-from brainpy_state._nest_network._event_plastic import _StaticTestRule
+from brainpy_state._nest_network.event_plastic import _StaticTestRule
def _no_autapse_pairs(n):
diff --git a/brainpy_state/_nest_network/_connectivity.py b/brainpy_state/_nest_network/connectivity.py
similarity index 100%
rename from brainpy_state/_nest_network/_connectivity.py
rename to brainpy_state/_nest_network/connectivity.py
diff --git a/brainpy_state/_nest_network/_connectivity_test.py b/brainpy_state/_nest_network/connectivity_test.py
similarity index 99%
rename from brainpy_state/_nest_network/_connectivity_test.py
rename to brainpy_state/_nest_network/connectivity_test.py
index ee3c9659..70ff214a 100644
--- a/brainpy_state/_nest_network/_connectivity_test.py
+++ b/brainpy_state/_nest_network/connectivity_test.py
@@ -7,7 +7,7 @@
import brainunit as u
from brainpy_state._dist import Normal
-from brainpy_state._nest_network._connectivity import (
+from brainpy_state._nest_network.connectivity import (
ConnSpec,
sample_one_to_one,
sample_all_to_all,
diff --git a/brainpy_state/_nest_network/_event_plastic.py b/brainpy_state/_nest_network/event_plastic.py
similarity index 98%
rename from brainpy_state/_nest_network/_event_plastic.py
rename to brainpy_state/_nest_network/event_plastic.py
index 2f39f546..66c5ce08 100644
--- a/brainpy_state/_nest_network/_event_plastic.py
+++ b/brainpy_state/_nest_network/event_plastic.py
@@ -3,7 +3,7 @@
This is the first of the three typed plasticity primitives described in
``develop/NEST_PARITY_LEDGER.md`` Part 2.5. It owns the *compute*: a CSR edge layout (reusing the
-:class:`~brainpy_state._nest_network._projections._SparseEventMatMul` convention),
+:class:`~brainpy_state._nest_network.projections._SparseEventMatMul` convention),
an :class:`~brainpy_state._brainpy._delay.InputDelay` axonal delay seam,
rule-declared per-edge / per-neuron :class:`brainstate.State` allocation, and
the ``brainevent.CSR`` event matmul that delivers weighted spikes into
@@ -31,7 +31,7 @@
import brainunit as u
from brainpy_state._brainpy._delay import InputDelay
-from brainpy_state._nest_network._event_proj import EventProjection
+from brainpy_state._nest_network.event_proj import EventProjection
__all__ = ['EventPlasticProj', 'VoltageCoupledPlasticProj', 'KernelContext', 'PlasticSynapse']
@@ -220,7 +220,7 @@ class EventPlasticProj(brainstate.nn.Module):
.. code-block:: python
>>> import jax.numpy as jnp, brainstate, brainunit as u
- >>> from brainpy_state._nest_network._event_plastic import EventPlasticProj, _StaticTestRule
+ >>> from brainpy_state._nest_network.event_plastic import EventPlasticProj, _StaticTestRule
>>> class _Sink:
... def add_delta_input(self, key, val): self.last = val
>>> sink = _Sink()
@@ -525,7 +525,7 @@ def realized_edges(self):
Reads the live (post-simulation evolved) ``weight`` State when allocated,
else the pre-simulation init. A weight-evolving rule exposes no weight
write-back. See
- :func:`~brainpy_state._nest_network._connection_introspection.plastic_proj_edges`.
+ :func:`~brainpy_state._nest_network.connection_introspection.plastic_proj_edges`.
Returns
-------
@@ -533,7 +533,7 @@ def realized_edges(self):
Population-local ``source`` / ``target`` plus live ``weight`` / ``delay``
in the canonical edge order.
"""
- from brainpy_state._nest_network._connection_introspection import plastic_proj_edges
+ from brainpy_state._nest_network.connection_introspection import plastic_proj_edges
return plastic_proj_edges(self)
@@ -562,7 +562,7 @@ class VoltageCoupledPlasticProj(EventPlasticProj):
.. code-block:: python
>>> import jax.numpy as jnp, brainstate, brainunit as u
- >>> from brainpy_state._nest_network._event_plastic import (
+ >>> from brainpy_state._nest_network.event_plastic import (
... VoltageCoupledPlasticProj, _StaticTestRule)
>>> class _Post:
... def __init__(self): self.V = type('S', (), {'value': jnp.array([3.]) * u.mV})()
diff --git a/brainpy_state/_nest_network/_event_plastic_mc_channel_test.py b/brainpy_state/_nest_network/event_plastic_mc_channel_test.py
similarity index 98%
rename from brainpy_state/_nest_network/_event_plastic_mc_channel_test.py
rename to brainpy_state/_nest_network/event_plastic_mc_channel_test.py
index fd652b16..c448783c 100644
--- a/brainpy_state/_nest_network/_event_plastic_mc_channel_test.py
+++ b/brainpy_state/_nest_network/event_plastic_mc_channel_test.py
@@ -23,9 +23,9 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
-from brainpy_state._nest_network._event_plastic import (
+from brainpy_state._nest_network.event_plastic import (
EventPlasticProj, VoltageCoupledPlasticProj, _StaticTestRule)
diff --git a/brainpy_state/_nest_network/_event_plastic_test.py b/brainpy_state/_nest_network/event_plastic_test.py
similarity index 99%
rename from brainpy_state/_nest_network/_event_plastic_test.py
rename to brainpy_state/_nest_network/event_plastic_test.py
index b643f63a..490a6d1c 100644
--- a/brainpy_state/_nest_network/_event_plastic_test.py
+++ b/brainpy_state/_nest_network/event_plastic_test.py
@@ -16,17 +16,17 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainstate import transform # noqa: E402
-from brainpy_state._nest_network._event_plastic import ( # noqa: E402
+from brainpy_state._nest_network.event_plastic import ( # noqa: E402
EventPlasticProj,
VoltageCoupledPlasticProj,
KernelContext,
_StaticTestRule,
)
-from brainpy_state._nest_network._rules import all_to_all # noqa: E402
+from brainpy_state._nest_network.rules import all_to_all # noqa: E402
def _ctx(E, t=1.0, dt=0.1):
diff --git a/brainpy_state/_nest_network/_event_proj.py b/brainpy_state/_nest_network/event_proj.py
similarity index 97%
rename from brainpy_state/_nest_network/_event_proj.py
rename to brainpy_state/_nest_network/event_proj.py
index ab79d621..6e7d77b3 100644
--- a/brainpy_state/_nest_network/_event_proj.py
+++ b/brainpy_state/_nest_network/event_proj.py
@@ -18,10 +18,10 @@
import brainunit as u
from brainpy_state._brainpy._delay import InputDelay
-from brainpy_state._nest_network._connectivity import resolve_param
-from brainpy_state._nest_network._nodeview import _flat_size
-from brainpy_state._nest_network._projections import _DenseMatMul, _ReceptorScatter, _SparseEventMatMul
-from brainpy_state._nest_network._rules import ConnRule, _OneToOne
+from brainpy_state._nest_network.connectivity import resolve_param
+from brainpy_state._nest_network.nodeview import _flat_size
+from brainpy_state._nest_network.projections import _DenseMatMul, _ReceptorScatter, _SparseEventMatMul
+from brainpy_state._nest_network.rules import ConnRule, _OneToOne
__all__ = ['EventProjection']
@@ -345,7 +345,7 @@ def realized_edges(self):
ProjEdges
Population-local ``source`` / ``target`` plus live ``weight`` / ``delay``
in the canonical edge order, with guarded write-back hooks. See
- :func:`~brainpy_state._nest_network._connection_introspection.event_proj_edges`.
+ :func:`~brainpy_state._nest_network.connection_introspection.event_proj_edges`.
"""
- from brainpy_state._nest_network._connection_introspection import event_proj_edges
+ from brainpy_state._nest_network.connection_introspection import event_proj_edges
return event_proj_edges(self)
diff --git a/brainpy_state/_nest_network/_event_proj_current_test.py b/brainpy_state/_nest_network/event_proj_current_test.py
similarity index 98%
rename from brainpy_state/_nest_network/_event_proj_current_test.py
rename to brainpy_state/_nest_network/event_proj_current_test.py
index eaa45d27..f2edcbbf 100644
--- a/brainpy_state/_nest_network/_event_proj_current_test.py
+++ b/brainpy_state/_nest_network/event_proj_current_test.py
@@ -30,11 +30,11 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._base import Dynamics
from brainpy_state._nest_network import all_to_all, one_to_one
-from brainpy_state._nest_network._event_proj import EventProjection
+from brainpy_state._nest_network.event_proj import EventProjection
class _Box:
diff --git a/brainpy_state/_nest_network/_event_proj_mc_channel_test.py b/brainpy_state/_nest_network/event_proj_mc_channel_test.py
similarity index 98%
rename from brainpy_state/_nest_network/_event_proj_mc_channel_test.py
rename to brainpy_state/_nest_network/event_proj_mc_channel_test.py
index bea4cc90..a93ae96e 100644
--- a/brainpy_state/_nest_network/_event_proj_mc_channel_test.py
+++ b/brainpy_state/_nest_network/event_proj_mc_channel_test.py
@@ -21,10 +21,10 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_network import all_to_all, one_to_one
-from brainpy_state._nest_network._event_proj import EventProjection
+from brainpy_state._nest_network.event_proj import EventProjection
class _Box:
diff --git a/brainpy_state/_nest_network/_event_proj_receptor_test.py b/brainpy_state/_nest_network/event_proj_receptor_test.py
similarity index 99%
rename from brainpy_state/_nest_network/_event_proj_receptor_test.py
rename to brainpy_state/_nest_network/event_proj_receptor_test.py
index 07d61c00..240c17a2 100644
--- a/brainpy_state/_nest_network/_event_proj_receptor_test.py
+++ b/brainpy_state/_nest_network/event_proj_receptor_test.py
@@ -24,10 +24,10 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_network import all_to_all, one_to_one
-from brainpy_state._nest_network._event_proj import EventProjection
+from brainpy_state._nest_network.event_proj import EventProjection
class _Box:
diff --git a/brainpy_state/_nest_network/_event_proj_test.py b/brainpy_state/_nest_network/event_proj_test.py
similarity index 96%
rename from brainpy_state/_nest_network/_event_proj_test.py
rename to brainpy_state/_nest_network/event_proj_test.py
index 892b150c..41908f66 100644
--- a/brainpy_state/_nest_network/_event_proj_test.py
+++ b/brainpy_state/_nest_network/event_proj_test.py
@@ -8,11 +8,11 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import iaf_psc_alpha
from brainpy_state._nest_network import one_to_one, fixed_indegree
-from brainpy_state._nest_network._event_proj import EventProjection
+from brainpy_state._nest_network.event_proj import EventProjection
class _Box:
diff --git a/brainpy_state/_nest_network/_nodeview.py b/brainpy_state/_nest_network/nodeview.py
similarity index 96%
rename from brainpy_state/_nest_network/_nodeview.py
rename to brainpy_state/_nest_network/nodeview.py
index 7ddc4e22..7d206c8f 100644
--- a/brainpy_state/_nest_network/_nodeview.py
+++ b/brainpy_state/_nest_network/nodeview.py
@@ -13,7 +13,7 @@
def _flat_size(module) -> int:
"""Total number of elements along a population/device neuron dimension.
- Mirrors ``brainpy_state._nest_network._projections._size`` (``in_size`` first,
+ Mirrors ``brainpy_state._nest_network.projections._size`` (``in_size`` first,
falling back to ``varshape``) so the network layer agrees on one notion of
population size.
"""
diff --git a/brainpy_state/_nest_network/_nodeview_test.py b/brainpy_state/_nest_network/nodeview_test.py
similarity index 100%
rename from brainpy_state/_nest_network/_nodeview_test.py
rename to brainpy_state/_nest_network/nodeview_test.py
diff --git a/brainpy_state/_nest_network/_projections.py b/brainpy_state/_nest_network/projections.py
similarity index 99%
rename from brainpy_state/_nest_network/_projections.py
rename to brainpy_state/_nest_network/projections.py
index 9b390bdb..acb48491 100644
--- a/brainpy_state/_nest_network/_projections.py
+++ b/brainpy_state/_nest_network/projections.py
@@ -13,7 +13,7 @@
from brainpy_state._base import Dynamics
from brainpy_state._brainpy.projection import AlignPostProj
-from brainpy_state._nest_network._connectivity import (
+from brainpy_state._nest_network.connectivity import (
ConnSpec,
sample_one_to_one,
sample_all_to_all,
diff --git a/brainpy_state/_nest_network/_projections_test.py b/brainpy_state/_nest_network/projections_test.py
similarity index 98%
rename from brainpy_state/_nest_network/_projections_test.py
rename to brainpy_state/_nest_network/projections_test.py
index 46037022..dac5e5db 100644
--- a/brainpy_state/_nest_network/_projections_test.py
+++ b/brainpy_state/_nest_network/projections_test.py
@@ -6,7 +6,7 @@
import brainunit as u
from brainpy_state import LIF, Expon, COBA
-from brainpy_state._nest_network._projections import _RuleProj, OneToOneProj
+from brainpy_state._nest_network.projections import _RuleProj, OneToOneProj
class TestRuleProjBase(unittest.TestCase):
@@ -69,7 +69,7 @@ def test_delay_raises_until_implemented(self):
)
-from brainpy_state._nest_network._projections import (
+from brainpy_state._nest_network.projections import (
AllToAllProj,
PairwiseBernoulliProj, SymmetricPairwiseBernoulliProj,
FixedIndegreeProj, FixedOutdegreeProj,
diff --git a/brainpy_state/_nest_network/_recordable_alias_test.py b/brainpy_state/_nest_network/recordable_alias_test.py
similarity index 99%
rename from brainpy_state/_nest_network/_recordable_alias_test.py
rename to brainpy_state/_nest_network/recordable_alias_test.py
index 043f1f8d..2716c4a5 100644
--- a/brainpy_state/_nest_network/_recordable_alias_test.py
+++ b/brainpy_state/_nest_network/recordable_alias_test.py
@@ -17,7 +17,7 @@
import numpy as np
import numpy.testing as npt
-from brainpy_state._nest_network._simulator import _read_recordable
+from brainpy_state._nest_network.simulator import _read_recordable
class _FakeState:
diff --git a/brainpy_state/_nest_network/_recorders.py b/brainpy_state/_nest_network/recorders.py
similarity index 100%
rename from brainpy_state/_nest_network/_recorders.py
rename to brainpy_state/_nest_network/recorders.py
diff --git a/brainpy_state/_nest_network/_recorders_test.py b/brainpy_state/_nest_network/recorders_test.py
similarity index 94%
rename from brainpy_state/_nest_network/_recorders_test.py
rename to brainpy_state/_nest_network/recorders_test.py
index ed30e7a7..06f7b3f3 100644
--- a/brainpy_state/_nest_network/_recorders_test.py
+++ b/brainpy_state/_nest_network/recorders_test.py
@@ -6,8 +6,8 @@
import brainunit as u
from brainpy_state import LIF
-from brainpy_state._nest_network._base import Network
-from brainpy_state._nest_network._recorders import Recorder
+from brainpy_state._nest_network.base import Network
+from brainpy_state._nest_network.recorders import Recorder
class TestRecorder(unittest.TestCase):
diff --git a/brainpy_state/_nest_network/_rules.py b/brainpy_state/_nest_network/rules.py
similarity index 96%
rename from brainpy_state/_nest_network/_rules.py
rename to brainpy_state/_nest_network/rules.py
index f753c6e5..083062b1 100644
--- a/brainpy_state/_nest_network/_rules.py
+++ b/brainpy_state/_nest_network/rules.py
@@ -5,7 +5,7 @@
import jax
import jax.numpy as jnp
-from brainpy_state._nest_network._connectivity import (
+from brainpy_state._nest_network.connectivity import (
ConnSpec,
sample_all_to_all,
sample_one_to_one,
@@ -25,7 +25,7 @@ class ConnRule:
"""Base class for connection rules.
A rule maps ``(n_pre, n_post)`` plus sampling flags to a
- :class:`~brainpy_state._nest_network._connectivity.ConnSpec` of edge indices.
+ :class:`~brainpy_state._nest_network.connectivity.ConnSpec` of edge indices.
"""
__module__ = 'brainpy.state'
@@ -119,9 +119,9 @@ def fixed_total_number(N: int) -> _FixedTotalNumber:
class _ExplicitEdges(ConnRule):
"""A rule that returns a *precomputed* :class:`ConnSpec`, ignoring sampling args.
- Lets :meth:`~brainpy_state._nest_network._simulator.Simulator.tripartite_connect`
+ Lets :meth:`~brainpy_state._nest_network.simulator.Simulator.tripartite_connect`
feed a single shared edge sample into the existing
- :class:`~brainpy_state._nest_network._event_proj.EventProjection` /
+ :class:`~brainpy_state._nest_network.event_proj.EventProjection` /
``_connect_pair`` / ``_connect_sic`` paths -- which would otherwise re-sample
their own connectivity from ``(rule, seed)``. ``sample`` returns the wrapped
spec verbatim, so the key / autapse / multapse flags (already applied when the
@@ -212,7 +212,7 @@ class _ThirdFactorBernoulliWithPool:
(astro->post) edge sets via :func:`build_pool_map` +
:func:`sample_third_factor_pairing`. Built by
:func:`third_factor_bernoulli_with_pool` and consumed by
- :meth:`~brainpy_state._nest_network._simulator.Simulator.tripartite_connect`.
+ :meth:`~brainpy_state._nest_network.simulator.Simulator.tripartite_connect`.
"""
__module__ = 'brainpy.state'
@@ -255,7 +255,7 @@ def third_factor_bernoulli_with_pool(*, p: float, pool_size: int, pool_type: str
"""Return a ``third_factor_bernoulli_with_pool`` spec (NEST tripartite astro-pool rule).
Used as the ``third_factor_conn_spec`` of
- :meth:`~brainpy_state._nest_network._simulator.Simulator.tripartite_connect`: for
+ :meth:`~brainpy_state._nest_network.simulator.Simulator.tripartite_connect`: for
each realized primary ``pre->post`` edge, an independent Bernoulli(``p``) trial
decides whether it is paired with one astrocyte drawn from the target neuron's
pool of ``pool_size`` astrocytes.
diff --git a/brainpy_state/_nest_network/_rules_test.py b/brainpy_state/_nest_network/rules_test.py
similarity index 98%
rename from brainpy_state/_nest_network/_rules_test.py
rename to brainpy_state/_nest_network/rules_test.py
index 77d1d9f9..235de357 100644
--- a/brainpy_state/_nest_network/_rules_test.py
+++ b/brainpy_state/_nest_network/rules_test.py
@@ -8,15 +8,15 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import Simulator, iaf_psc_exp
from brainpy_state._nest_network import (
all_to_all, one_to_one, fixed_indegree, pairwise_bernoulli,
fixed_total_number, third_factor_bernoulli_with_pool, explicit_edges,
)
-from brainpy_state._nest_network._connectivity import ConnSpec
-from brainpy_state._nest_network._rules import _ExplicitEdges
+from brainpy_state._nest_network.connectivity import ConnSpec
+from brainpy_state._nest_network.rules import _ExplicitEdges
class TestRules(unittest.TestCase):
diff --git a/brainpy_state/_nest_network/_simulator.py b/brainpy_state/_nest_network/simulator.py
similarity index 99%
rename from brainpy_state/_nest_network/_simulator.py
rename to brainpy_state/_nest_network/simulator.py
index ab86f065..c06d1a92 100644
--- a/brainpy_state/_nest_network/_simulator.py
+++ b/brainpy_state/_nest_network/simulator.py
@@ -31,10 +31,10 @@
from brainpy_state._nest_device.spike_recorder import spike_recorder as _spike_recorder
from brainpy_state._nest_device.step_current_generator import step_current_generator as _step_current_generator
from brainpy_state._nest_device.volume_transmitter import volume_transmitter as _volume_transmitter
-from brainpy_state._nest_network._event_plastic import EventPlasticProj, VoltageCoupledPlasticProj
-from brainpy_state._nest_network._event_proj import EventProjection
-from brainpy_state._nest_network._nodeview import NodeView, _Segment, _flat_size
-from brainpy_state._nest_network._rules import all_to_all, one_to_one, _ExplicitEdges
+from brainpy_state._nest_network.event_plastic import EventPlasticProj, VoltageCoupledPlasticProj
+from brainpy_state._nest_network.event_proj import EventProjection
+from brainpy_state._nest_network.nodeview import NodeView, _Segment, _flat_size
+from brainpy_state._nest_network.rules import all_to_all, one_to_one, _ExplicitEdges
__all__ = ['Simulator', 'SimulationResult']
@@ -710,14 +710,14 @@ def tripartite_connect(self, pre: NodeView, post: NodeView, third: NodeView, *,
1. **primary** ``pre -> post`` (the direct synapse, ``syn_specs['primary']``).
2. For each realized primary edge ``(pre_i -> post_j)``, the
- ``third_factor_conn_spec`` (:func:`~brainpy_state._nest_network._rules.third_factor_bernoulli_with_pool`)
+ ``third_factor_conn_spec`` (:func:`~brainpy_state._nest_network.rules.third_factor_bernoulli_with_pool`)
runs a Bernoulli(``p``) trial; if it succeeds the edge is paired with one
astrocyte drawn from ``post_j``'s pool, creating
**third_in** ``pre_i -> astro`` (``syn_specs['third_in']``, delta IP3) and
**third_out** ``astro -> post_j`` (``syn_specs['third_out']``, a
:class:`~brainpy_state.sic_connection`).
- Reuses the existing static :class:`~brainpy_state._nest_network._event_proj.EventProjection`
+ Reuses the existing static :class:`~brainpy_state._nest_network.event_proj.EventProjection`
path for primary + third_in and the merged ``sic_connection`` (``as_current``)
path for third_out; no new deposit primitive. Each arm is registered for
:meth:`get_connections`.
@@ -815,7 +815,7 @@ def _connect_tripartite_arm(self, pre_seg, post_seg, spec, syn_spec, seed, comm)
"""Wire one tripartite arm from an explicit (shared) edge ``spec``.
Delegates to :meth:`_connect_pair` with an
- :class:`~brainpy_state._nest_network._rules._ExplicitEdges` rule so the projection
+ :class:`~brainpy_state._nest_network.rules._ExplicitEdges` rule so the projection
uses the *precomputed* edges instead of re-sampling, threading the arm's
``syn_spec`` (``weight`` / ``delay`` / ``receptor_type`` / ``synapse``).
"""
@@ -828,11 +828,11 @@ def _connect_tripartite_arm(self, pre_seg, post_seg, spec, syn_spec, seed, comm)
def get_connections(self, source=None, target=None, synapse=None):
"""Enumerate realized synapses across projections (NEST ``GetConnections``).
- Returns a :class:`~brainpy_state._nest_network._connection_introspection.SynapseCollection`
+ Returns a :class:`~brainpy_state._nest_network.connection_introspection.SynapseCollection`
over the edges matching the filters, letting you read and write weights /
delays **without holding each projection handle**. The collection is a lazy
view: weights and delays are re-read from the live projections on each
- :meth:`~brainpy_state._nest_network._connection_introspection.SynapseCollection.get`,
+ :meth:`~brainpy_state._nest_network.connection_introspection.SynapseCollection.get`,
so a query made before :meth:`simulate` still reflects post-simulation
evolved plastic weights.
@@ -874,7 +874,7 @@ def get_connections(self, source=None, target=None, synapse=None):
>>> bool(u.math.allclose(conns.get('weight'), 20. * u.pA))
True
"""
- from brainpy_state._nest_network._connection_introspection import collect_connections
+ from brainpy_state._nest_network.connection_introspection import collect_connections
return collect_connections(self._connections, source, target, synapse)
def record_weight(self, proj):
diff --git a/brainpy_state/_nest_network/_simulator_analog_test.py b/brainpy_state/_nest_network/simulator_analog_test.py
similarity index 99%
rename from brainpy_state/_nest_network/_simulator_analog_test.py
rename to brainpy_state/_nest_network/simulator_analog_test.py
index d88d1bd9..fbe79480 100644
--- a/brainpy_state/_nest_network/_simulator_analog_test.py
+++ b/brainpy_state/_nest_network/simulator_analog_test.py
@@ -10,7 +10,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import iaf_psc_alpha, voltmeter, multimeter
from brainpy_state._nest_network import Simulator
diff --git a/brainpy_state/_nest_network/_simulator_bw_receptor_test.py b/brainpy_state/_nest_network/simulator_bw_receptor_test.py
similarity index 99%
rename from brainpy_state/_nest_network/_simulator_bw_receptor_test.py
rename to brainpy_state/_nest_network/simulator_bw_receptor_test.py
index 67a2df41..d5785a57 100644
--- a/brainpy_state/_nest_network/_simulator_bw_receptor_test.py
+++ b/brainpy_state/_nest_network/simulator_bw_receptor_test.py
@@ -16,7 +16,7 @@
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
import braintools
diff --git a/brainpy_state/_nest_network/_simulator_cont_test.py b/brainpy_state/_nest_network/simulator_cont_test.py
similarity index 99%
rename from brainpy_state/_nest_network/_simulator_cont_test.py
rename to brainpy_state/_nest_network/simulator_cont_test.py
index 0e4891a6..32fad73d 100644
--- a/brainpy_state/_nest_network/_simulator_cont_test.py
+++ b/brainpy_state/_nest_network/simulator_cont_test.py
@@ -25,7 +25,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import iaf_psc_alpha, voltmeter, spike_recorder
from brainpy_state._nest_network import Simulator
diff --git a/brainpy_state/_nest_network/_simulator_current_test.py b/brainpy_state/_nest_network/simulator_current_test.py
similarity index 99%
rename from brainpy_state/_nest_network/_simulator_current_test.py
rename to brainpy_state/_nest_network/simulator_current_test.py
index 94c18f52..88cf2536 100644
--- a/brainpy_state/_nest_network/_simulator_current_test.py
+++ b/brainpy_state/_nest_network/simulator_current_test.py
@@ -9,7 +9,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import (iaf_psc_alpha, voltmeter, dc_generator,
step_current_generator, noise_generator)
diff --git a/brainpy_state/_nest_network/_simulator_dopamine_test.py b/brainpy_state/_nest_network/simulator_dopamine_test.py
similarity index 97%
rename from brainpy_state/_nest_network/_simulator_dopamine_test.py
rename to brainpy_state/_nest_network/simulator_dopamine_test.py
index da3ce6a9..226cfd84 100644
--- a/brainpy_state/_nest_network/_simulator_dopamine_test.py
+++ b/brainpy_state/_nest_network/simulator_dopamine_test.py
@@ -17,7 +17,7 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import pytest
@@ -26,7 +26,7 @@
stdp_dopamine_synapse, tsodyks2_synapse, volume_transmitter,
)
from brainpy_state._nest_device.volume_transmitter import volume_transmitter as _vt_cls
-from brainpy_state._nest_network._event_plastic import EventPlasticProj, VoltageCoupledPlasticProj
+from brainpy_state._nest_network.event_plastic import EventPlasticProj, VoltageCoupledPlasticProj
def _children(sim):
diff --git a/brainpy_state/_nest_network/_simulator_gap_test.py b/brainpy_state/_nest_network/simulator_gap_test.py
similarity index 98%
rename from brainpy_state/_nest_network/_simulator_gap_test.py
rename to brainpy_state/_nest_network/simulator_gap_test.py
index 0746b13f..5627a002 100644
--- a/brainpy_state/_nest_network/_simulator_gap_test.py
+++ b/brainpy_state/_nest_network/simulator_gap_test.py
@@ -26,13 +26,13 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import (hh_psc_alpha_gap, hh_cond_beta_gap_traub, iaf_psc_alpha,
voltmeter, Simulator, all_to_all, one_to_one)
from brainpy_state._nest_synapse.gap_junction import gap_junction
from brainpy_state._nest_neuron.hh_psc_alpha_gap import _hh_psc_alpha_gap_equilibrium
-from brainpy_state._nest_network._simulator import Simulator as _Sim
+from brainpy_state._nest_network.simulator import Simulator as _Sim
def _resting_gating():
@@ -255,7 +255,7 @@ class TestGapBehavior(unittest.TestCase):
def setUp(self):
import jax as _jax
_jax.clear_caches()
- brainstate.environ.set(precision=64, platform='cpu')
+ brainstate.environ.set(precision=64)
def _two_neuron_sim(self, v0=-10.0, v1=None, g=0.5, t=150.0, resting_gating=False):
v1 = hh_psc_alpha_gap._NEST_V_INIT if v1 is None else v1
diff --git a/brainpy_state/_nest_network/_simulator_mc_routing_test.py b/brainpy_state/_nest_network/simulator_mc_routing_test.py
similarity index 99%
rename from brainpy_state/_nest_network/_simulator_mc_routing_test.py
rename to brainpy_state/_nest_network/simulator_mc_routing_test.py
index b6070cb6..a7e0594b 100644
--- a/brainpy_state/_nest_network/_simulator_mc_routing_test.py
+++ b/brainpy_state/_nest_network/simulator_mc_routing_test.py
@@ -20,7 +20,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import (Simulator, iaf_cond_alpha_mc, spike_generator,
dc_generator, multimeter)
diff --git a/brainpy_state/_nest_network/_simulator_plastic_test.py b/brainpy_state/_nest_network/simulator_plastic_test.py
similarity index 98%
rename from brainpy_state/_nest_network/_simulator_plastic_test.py
rename to brainpy_state/_nest_network/simulator_plastic_test.py
index 787abbcd..ad32ee70 100644
--- a/brainpy_state/_nest_network/_simulator_plastic_test.py
+++ b/brainpy_state/_nest_network/simulator_plastic_test.py
@@ -8,7 +8,7 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import pytest
@@ -17,8 +17,8 @@
iaf_psc_exp, multimeter, quantal_stp_synapse, spike_generator, spike_recorder,
static_synapse, tsodyks2_synapse, vogels_sprekeler_synapse,
)
-from brainpy_state._nest_network._event_plastic import EventPlasticProj, VoltageCoupledPlasticProj
-from brainpy_state._nest_network._event_proj import EventProjection
+from brainpy_state._nest_network.event_plastic import EventPlasticProj, VoltageCoupledPlasticProj
+from brainpy_state._nest_network.event_proj import EventProjection
def _children(sim):
diff --git a/brainpy_state/_nest_network/_simulator_sic_test.py b/brainpy_state/_nest_network/simulator_sic_test.py
similarity index 97%
rename from brainpy_state/_nest_network/_simulator_sic_test.py
rename to brainpy_state/_nest_network/simulator_sic_test.py
index e521d672..600533d4 100644
--- a/brainpy_state/_nest_network/_simulator_sic_test.py
+++ b/brainpy_state/_nest_network/simulator_sic_test.py
@@ -20,12 +20,12 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import (aeif_cond_alpha_astro, astrocyte_lr_1994,
sic_connection, multimeter, iaf_psc_alpha)
from brainpy_state._nest_network import Simulator
-from brainpy_state._nest_network._event_proj import EventProjection
+from brainpy_state._nest_network.event_proj import EventProjection
def _trace(res, rec, name):
diff --git a/brainpy_state/_nest_network/_simulator_spatial_test.py b/brainpy_state/_nest_network/simulator_spatial_test.py
similarity index 100%
rename from brainpy_state/_nest_network/_simulator_spatial_test.py
rename to brainpy_state/_nest_network/simulator_spatial_test.py
diff --git a/brainpy_state/_nest_network/_simulator_stp_emission_test.py b/brainpy_state/_nest_network/simulator_stp_emission_test.py
similarity index 99%
rename from brainpy_state/_nest_network/_simulator_stp_emission_test.py
rename to brainpy_state/_nest_network/simulator_stp_emission_test.py
index aacf6be7..bc590347 100644
--- a/brainpy_state/_nest_network/_simulator_stp_emission_test.py
+++ b/brainpy_state/_nest_network/simulator_stp_emission_test.py
@@ -126,7 +126,7 @@ def _best_aligned_residual(ref, cand, max_shift=2):
class TestStpEmissionSeam(unittest.TestCase):
def setUp(self):
jax.config.update('jax_enable_x64', True)
- brainstate.environ.set(precision=64, platform='cpu')
+ brainstate.environ.set(precision=64)
def test_stp_emission_matches_three_phase_reference(self):
# The Simulator's receptor_type=1 delivery reproduces the validated manual
diff --git a/brainpy_state/_nest_network/_simulator_sweep_test.py b/brainpy_state/_nest_network/simulator_sweep_test.py
similarity index 98%
rename from brainpy_state/_nest_network/_simulator_sweep_test.py
rename to brainpy_state/_nest_network/simulator_sweep_test.py
index 307f39ab..83fee888 100644
--- a/brainpy_state/_nest_network/_simulator_sweep_test.py
+++ b/brainpy_state/_nest_network/simulator_sweep_test.py
@@ -20,7 +20,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import (iaf_psc_alpha, voltmeter, spike_recorder, dc_generator)
from brainpy_state._nest_network import Simulator
diff --git a/brainpy_state/_nest_network/_simulator_test.py b/brainpy_state/_nest_network/simulator_test.py
similarity index 99%
rename from brainpy_state/_nest_network/_simulator_test.py
rename to brainpy_state/_nest_network/simulator_test.py
index f6e7dc1f..2584429b 100644
--- a/brainpy_state/_nest_network/_simulator_test.py
+++ b/brainpy_state/_nest_network/simulator_test.py
@@ -8,7 +8,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import iaf_psc_alpha, poisson_generator, spike_recorder
from brainpy_state._nest_network import Simulator, fixed_indegree, all_to_all
diff --git a/brainpy_state/_nest_network/_simulator_tripartite_test.py b/brainpy_state/_nest_network/simulator_tripartite_test.py
similarity index 98%
rename from brainpy_state/_nest_network/_simulator_tripartite_test.py
rename to brainpy_state/_nest_network/simulator_tripartite_test.py
index 4b6c4892..31bbc4e0 100644
--- a/brainpy_state/_nest_network/_simulator_tripartite_test.py
+++ b/brainpy_state/_nest_network/simulator_tripartite_test.py
@@ -18,14 +18,14 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import (aeif_cond_alpha_astro, astrocyte_lr_1994,
sic_connection, multimeter, pairwise_bernoulli,
all_to_all, third_factor_bernoulli_with_pool,
poisson_generator)
from brainpy_state._nest_network import Simulator
-from brainpy_state._nest_network._event_proj import EventProjection
+from brainpy_state._nest_network.event_proj import EventProjection
def _syn_specs(w_primary=1.0, w_third_in=1.0, w_a2n=1.0, delay=0.1, sic_delay_steps=10):
diff --git a/brainpy_state/_nest_network/_simulator_urbanczik_routing_test.py b/brainpy_state/_nest_network/simulator_urbanczik_routing_test.py
similarity index 97%
rename from brainpy_state/_nest_network/_simulator_urbanczik_routing_test.py
rename to brainpy_state/_nest_network/simulator_urbanczik_routing_test.py
index ceb1eeae..9acf1573 100644
--- a/brainpy_state/_nest_network/_simulator_urbanczik_routing_test.py
+++ b/brainpy_state/_nest_network/simulator_urbanczik_routing_test.py
@@ -21,12 +21,12 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import (Simulator, pp_cond_exp_mc_urbanczik, spike_generator,
parrot_neuron, static_synapse)
from brainpy_state._nest_neuron.pp_cond_exp_mc_urbanczik import SOMA_EXC, DEND_EXC
-from brainpy_state._nest_network._event_plastic import (
+from brainpy_state._nest_network.event_plastic import (
EventPlasticProj, VoltageCoupledPlasticProj)
DT = 0.1
diff --git a/brainpy_state/_nest_network/_simulator_weightvec_test.py b/brainpy_state/_nest_network/simulator_weightvec_test.py
similarity index 97%
rename from brainpy_state/_nest_network/_simulator_weightvec_test.py
rename to brainpy_state/_nest_network/simulator_weightvec_test.py
index 35944340..02b80ccc 100644
--- a/brainpy_state/_nest_network/_simulator_weightvec_test.py
+++ b/brainpy_state/_nest_network/simulator_weightvec_test.py
@@ -15,11 +15,11 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import iaf_psc_alpha, poisson_generator, voltmeter
from brainpy_state._nest_network import Simulator
-from brainpy_state._nest_network._simulator import (
+from brainpy_state._nest_network.simulator import (
_n_channels, _is_len_vector, _index_channel)
# A neuron that never spikes (V_th unreachable): pure subthreshold integration so
diff --git a/brainpy_state/_nest_network/_voltage_coupled_plastic_test.py b/brainpy_state/_nest_network/voltage_coupled_plastic_test.py
similarity index 98%
rename from brainpy_state/_nest_network/_voltage_coupled_plastic_test.py
rename to brainpy_state/_nest_network/voltage_coupled_plastic_test.py
index 10017743..c664bd79 100644
--- a/brainpy_state/_nest_network/_voltage_coupled_plastic_test.py
+++ b/brainpy_state/_nest_network/voltage_coupled_plastic_test.py
@@ -20,9 +20,9 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
-from brainpy_state._nest_network._event_plastic import ( # noqa: E402
+from brainpy_state._nest_network.event_plastic import ( # noqa: E402
EventPlasticProj,
VoltageCoupledPlasticProj,
_StaticTestRule,
@@ -236,7 +236,7 @@ def test_grad_flows_through_post_state_reads():
def loss(vscale):
# probe gradient of the read path w.r.t. a scaling of the post voltage read
- from brainpy_state._nest_network._event_plastic import KernelContext
+ from brainpy_state._nest_network.event_plastic import KernelContext
ctx = KernelContext(
pre_spike=jnp.ones(1), post_spike=jnp.zeros(1), pre_trace=jnp.zeros(1),
post_trace=jnp.zeros(1), t_now=jnp.asarray(0.0), dt=jnp.asarray(0.1),
diff --git a/brainpy_state/_nest_network/_weight_recorder_view.py b/brainpy_state/_nest_network/weight_recorder_view.py
similarity index 100%
rename from brainpy_state/_nest_network/_weight_recorder_view.py
rename to brainpy_state/_nest_network/weight_recorder_view.py
diff --git a/brainpy_state/_nest_network/_weight_recorder_view_test.py b/brainpy_state/_nest_network/weight_recorder_view_test.py
similarity index 98%
rename from brainpy_state/_nest_network/_weight_recorder_view_test.py
rename to brainpy_state/_nest_network/weight_recorder_view_test.py
index ff840424..527361da 100644
--- a/brainpy_state/_nest_network/_weight_recorder_view_test.py
+++ b/brainpy_state/_nest_network/weight_recorder_view_test.py
@@ -3,7 +3,7 @@
import numpy as np
import pytest
-from brainpy_state._nest_network._weight_recorder_view import (
+from brainpy_state._nest_network.weight_recorder_view import (
send_steps_from_pre,
weight_recorder_events,
)
diff --git a/brainpy_state/_nest_neuron/aeif_cond_alpha.py b/brainpy_state/_nest_neuron/aeif_cond_alpha.py
index d9c0e26b..35dc648a 100644
--- a/brainpy_state/_nest_neuron/aeif_cond_alpha.py
+++ b/brainpy_state/_nest_neuron/aeif_cond_alpha.py
@@ -26,8 +26,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, validate_aeif_overflow, AdaptiveRungeKuttaStep, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, validate_aeif_overflow, AdaptiveRungeKuttaStep, cond_any
__all__ = [
'aeif_cond_alpha',
diff --git a/brainpy_state/_nest_neuron/aeif_cond_alpha_astro.py b/brainpy_state/_nest_neuron/aeif_cond_alpha_astro.py
index 1ef0d2df..64e1aa52 100644
--- a/brainpy_state/_nest_neuron/aeif_cond_alpha_astro.py
+++ b/brainpy_state/_nest_neuron/aeif_cond_alpha_astro.py
@@ -26,8 +26,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, validate_aeif_overflow, AdaptiveRungeKuttaStep, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, validate_aeif_overflow, AdaptiveRungeKuttaStep, cond_any
__all__ = [
'aeif_cond_alpha_astro',
@@ -122,7 +122,7 @@ class aeif_cond_alpha_astro(NESTNeuron):
**4. SIC delivery semantics**
The astrocyte slow-inward current (SIC) is delivered on the JAX substrate by
- a :class:`~brainpy_state._nest_network._event_proj.EventProjection` — the
+ a :class:`~brainpy_state._nest_network.event_proj.EventProjection` — the
``sic_connection`` — that deposits ``weight·SIC`` into this neuron's labelled
``'I_SIC'`` *current* channel each step (``add_current_input``). Each
:meth:`update` reads (and pops) that channel **before** the unlabelled
@@ -672,7 +672,7 @@ def update(self, x=0.0 * u.pA, w_by_rec=None):
r"""Advance the neuron by one simulation step.
The astrocyte slow-inward current (SIC) is delivered by a
- :class:`~brainpy_state._nest_network._event_proj.EventProjection` (the
+ :class:`~brainpy_state._nest_network.event_proj.EventProjection` (the
``sic_connection``) that deposits ``weight·SIC`` into this neuron's labelled
``'I_SIC'`` *current* channel each step. ``update`` reads (and pops) that
channel, stores it into ``I_sic`` (pA) for the next step — a one-step delay,
diff --git a/brainpy_state/_nest_neuron/aeif_cond_alpha_astro_test.py b/brainpy_state/_nest_neuron/aeif_cond_alpha_astro_test.py
index d6591d13..efc384ca 100644
--- a/brainpy_state/_nest_neuron/aeif_cond_alpha_astro_test.py
+++ b/brainpy_state/_nest_neuron/aeif_cond_alpha_astro_test.py
@@ -31,7 +31,7 @@
from brainpy_state import aeif_cond_alpha_astro
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _rhs(y, is_refractory, i_stim, i_sic, p):
diff --git a/brainpy_state/_nest_neuron/aeif_cond_alpha_multisynapse.py b/brainpy_state/_nest_neuron/aeif_cond_alpha_multisynapse.py
index 11e289be..c081f05c 100644
--- a/brainpy_state/_nest_neuron/aeif_cond_alpha_multisynapse.py
+++ b/brainpy_state/_nest_neuron/aeif_cond_alpha_multisynapse.py
@@ -26,8 +26,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, validate_aeif_overflow, AdaptiveRungeKuttaStep, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, validate_aeif_overflow, AdaptiveRungeKuttaStep, cond_any
__all__ = [
'aeif_cond_alpha_multisynapse',
diff --git a/brainpy_state/_nest_neuron/aeif_cond_alpha_multisynapse_test.py b/brainpy_state/_nest_neuron/aeif_cond_alpha_multisynapse_test.py
index f5addfd9..6eb8a7dd 100644
--- a/brainpy_state/_nest_neuron/aeif_cond_alpha_multisynapse_test.py
+++ b/brainpy_state/_nest_neuron/aeif_cond_alpha_multisynapse_test.py
@@ -28,7 +28,7 @@
import numpy.testing as npt
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import aeif_cond_alpha_multisynapse
diff --git a/brainpy_state/_nest_neuron/aeif_cond_alpha_test.py b/brainpy_state/_nest_neuron/aeif_cond_alpha_test.py
index d3875f88..3d67c1a0 100644
--- a/brainpy_state/_nest_neuron/aeif_cond_alpha_test.py
+++ b/brainpy_state/_nest_neuron/aeif_cond_alpha_test.py
@@ -28,7 +28,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import aeif_cond_alpha
diff --git a/brainpy_state/_nest_neuron/aeif_cond_beta_multisynapse.py b/brainpy_state/_nest_neuron/aeif_cond_beta_multisynapse.py
index 6ccb0ba4..f3150644 100644
--- a/brainpy_state/_nest_neuron/aeif_cond_beta_multisynapse.py
+++ b/brainpy_state/_nest_neuron/aeif_cond_beta_multisynapse.py
@@ -26,8 +26,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, validate_aeif_overflow, AdaptiveRungeKuttaStep, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, validate_aeif_overflow, AdaptiveRungeKuttaStep, cond_any
__all__ = [
'aeif_cond_beta_multisynapse',
diff --git a/brainpy_state/_nest_neuron/aeif_cond_beta_multisynapse_test.py b/brainpy_state/_nest_neuron/aeif_cond_beta_multisynapse_test.py
index f4e3a448..dce9510d 100644
--- a/brainpy_state/_nest_neuron/aeif_cond_beta_multisynapse_test.py
+++ b/brainpy_state/_nest_neuron/aeif_cond_beta_multisynapse_test.py
@@ -28,7 +28,7 @@
import numpy.testing as npt
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import aeif_cond_beta_multisynapse
diff --git a/brainpy_state/_nest_neuron/aeif_cond_beta_multisynapse_wbyrec_test.py b/brainpy_state/_nest_neuron/aeif_cond_beta_multisynapse_wbyrec_test.py
index 43593a9e..8215d720 100644
--- a/brainpy_state/_nest_neuron/aeif_cond_beta_multisynapse_wbyrec_test.py
+++ b/brainpy_state/_nest_neuron/aeif_cond_beta_multisynapse_wbyrec_test.py
@@ -22,7 +22,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import aeif_cond_beta_multisynapse, iaf_psc_exp_multisynapse
diff --git a/brainpy_state/_nest_neuron/aeif_cond_exp.py b/brainpy_state/_nest_neuron/aeif_cond_exp.py
index 84bd1d82..833a3b55 100644
--- a/brainpy_state/_nest_neuron/aeif_cond_exp.py
+++ b/brainpy_state/_nest_neuron/aeif_cond_exp.py
@@ -26,8 +26,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._utils import is_tracer, validate_aeif_overflow, AdaptiveRungeKuttaStep, cond_any
-from brainpy_state._nest_base._base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, validate_aeif_overflow, AdaptiveRungeKuttaStep, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
__all__ = [
'aeif_cond_exp',
diff --git a/brainpy_state/_nest_neuron/aeif_cond_exp_test.py b/brainpy_state/_nest_neuron/aeif_cond_exp_test.py
index bddc971f..7d5a0faf 100644
--- a/brainpy_state/_nest_neuron/aeif_cond_exp_test.py
+++ b/brainpy_state/_nest_neuron/aeif_cond_exp_test.py
@@ -28,7 +28,7 @@
import numpy.testing as npt
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import aeif_cond_exp
diff --git a/brainpy_state/_nest_neuron/aeif_psc_alpha.py b/brainpy_state/_nest_neuron/aeif_psc_alpha.py
index 6dc298b7..1b7aebe7 100644
--- a/brainpy_state/_nest_neuron/aeif_psc_alpha.py
+++ b/brainpy_state/_nest_neuron/aeif_psc_alpha.py
@@ -26,8 +26,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, validate_aeif_overflow, AdaptiveRungeKuttaStep, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, validate_aeif_overflow, AdaptiveRungeKuttaStep, cond_any
__all__ = [
'aeif_psc_alpha',
diff --git a/brainpy_state/_nest_neuron/aeif_psc_alpha_test.py b/brainpy_state/_nest_neuron/aeif_psc_alpha_test.py
index e95b8755..715990f8 100644
--- a/brainpy_state/_nest_neuron/aeif_psc_alpha_test.py
+++ b/brainpy_state/_nest_neuron/aeif_psc_alpha_test.py
@@ -28,7 +28,7 @@
import numpy.testing as npt
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import aeif_psc_alpha
diff --git a/brainpy_state/_nest_neuron/aeif_psc_delta.py b/brainpy_state/_nest_neuron/aeif_psc_delta.py
index e9e4ee46..bbe33b6a 100644
--- a/brainpy_state/_nest_neuron/aeif_psc_delta.py
+++ b/brainpy_state/_nest_neuron/aeif_psc_delta.py
@@ -26,8 +26,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, validate_aeif_overflow, AdaptiveRungeKuttaStep, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, validate_aeif_overflow, AdaptiveRungeKuttaStep, cond_any
__all__ = [
'aeif_psc_delta',
diff --git a/brainpy_state/_nest_neuron/aeif_psc_delta_clopath.py b/brainpy_state/_nest_neuron/aeif_psc_delta_clopath.py
index a40a8b0f..c97ceaae 100644
--- a/brainpy_state/_nest_neuron/aeif_psc_delta_clopath.py
+++ b/brainpy_state/_nest_neuron/aeif_psc_delta_clopath.py
@@ -26,8 +26,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, validate_aeif_overflow, AdaptiveRungeKuttaStep, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, validate_aeif_overflow, AdaptiveRungeKuttaStep, cond_any
__all__ = [
'aeif_psc_delta_clopath',
diff --git a/brainpy_state/_nest_neuron/aeif_psc_delta_clopath_test.py b/brainpy_state/_nest_neuron/aeif_psc_delta_clopath_test.py
index 32c3e370..e4b817c4 100644
--- a/brainpy_state/_nest_neuron/aeif_psc_delta_clopath_test.py
+++ b/brainpy_state/_nest_neuron/aeif_psc_delta_clopath_test.py
@@ -28,7 +28,7 @@
import numpy.testing as npt
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import aeif_psc_delta_clopath
diff --git a/brainpy_state/_nest_neuron/aeif_psc_delta_test.py b/brainpy_state/_nest_neuron/aeif_psc_delta_test.py
index 34d07650..c11f77c9 100644
--- a/brainpy_state/_nest_neuron/aeif_psc_delta_test.py
+++ b/brainpy_state/_nest_neuron/aeif_psc_delta_test.py
@@ -28,7 +28,7 @@
import numpy.testing as npt
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import aeif_psc_delta
diff --git a/brainpy_state/_nest_neuron/aeif_psc_exp.py b/brainpy_state/_nest_neuron/aeif_psc_exp.py
index dabaf76b..2ae4f065 100644
--- a/brainpy_state/_nest_neuron/aeif_psc_exp.py
+++ b/brainpy_state/_nest_neuron/aeif_psc_exp.py
@@ -26,8 +26,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, validate_aeif_overflow, AdaptiveRungeKuttaStep, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, validate_aeif_overflow, AdaptiveRungeKuttaStep, cond_any
__all__ = [
'aeif_psc_exp',
diff --git a/brainpy_state/_nest_neuron/aeif_psc_exp_test.py b/brainpy_state/_nest_neuron/aeif_psc_exp_test.py
index adb3c299..f19f54a1 100644
--- a/brainpy_state/_nest_neuron/aeif_psc_exp_test.py
+++ b/brainpy_state/_nest_neuron/aeif_psc_exp_test.py
@@ -28,7 +28,7 @@
import numpy.testing as npt
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import aeif_psc_exp
diff --git a/brainpy_state/_nest_neuron/amat2_psc_exp.py b/brainpy_state/_nest_neuron/amat2_psc_exp.py
index aaf9ee28..0baa5f75 100644
--- a/brainpy_state/_nest_neuron/amat2_psc_exp.py
+++ b/brainpy_state/_nest_neuron/amat2_psc_exp.py
@@ -25,8 +25,8 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, cond_any
__all__ = [
'amat2_psc_exp',
diff --git a/brainpy_state/_nest_neuron/amat2_psc_exp_test.py b/brainpy_state/_nest_neuron/amat2_psc_exp_test.py
index cedb2cf5..96001d04 100644
--- a/brainpy_state/_nest_neuron/amat2_psc_exp_test.py
+++ b/brainpy_state/_nest_neuron/amat2_psc_exp_test.py
@@ -44,7 +44,7 @@
from brainpy_state._nest_neuron.amat2_psc_exp import amat2_psc_exp
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _compute_propagators(h, taum, tauE, tauI, tauV, c, beta, tau_1, tau_2):
diff --git a/brainpy_state/_nest_neuron/astrocyte_lr_1994.py b/brainpy_state/_nest_neuron/astrocyte_lr_1994.py
index dd25876a..d489ed5e 100644
--- a/brainpy_state/_nest_neuron/astrocyte_lr_1994.py
+++ b/brainpy_state/_nest_neuron/astrocyte_lr_1994.py
@@ -22,8 +22,8 @@
from brainstate.typing import Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, AdaptiveRungeKuttaStep
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, AdaptiveRungeKuttaStep
__all__ = [
'astrocyte_lr_1994',
diff --git a/brainpy_state/_nest_neuron/astrocyte_lr_1994_test.py b/brainpy_state/_nest_neuron/astrocyte_lr_1994_test.py
index a87cb840..12c1b4cb 100644
--- a/brainpy_state/_nest_neuron/astrocyte_lr_1994_test.py
+++ b/brainpy_state/_nest_neuron/astrocyte_lr_1994_test.py
@@ -35,7 +35,7 @@
import numpy as np
from scipy.integrate import odeint
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_neuron.astrocyte_lr_1994 import astrocyte_lr_1994
diff --git a/brainpy_state/_nest_neuron/cm_default.py b/brainpy_state/_nest_neuron/cm_default.py
index e0c0f965..83eb6215 100644
--- a/brainpy_state/_nest_neuron/cm_default.py
+++ b/brainpy_state/_nest_neuron/cm_default.py
@@ -1,4 +1,4 @@
-from brainpy_state._nest_base._base import NESTNeuron
+from brainpy_state._nest_base.base import NESTNeuron
# Copyright 2026 BrainX Ecosystem Limited. All Rights Reserved.
#
diff --git a/brainpy_state/_nest_neuron/cm_default_state_test.py b/brainpy_state/_nest_neuron/cm_default_state_test.py
index ce6f5195..225526e6 100644
--- a/brainpy_state/_nest_neuron/cm_default_state_test.py
+++ b/brainpy_state/_nest_neuron/cm_default_state_test.py
@@ -15,7 +15,7 @@
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import unittest
diff --git a/brainpy_state/_nest_neuron/erfc_neuron.py b/brainpy_state/_nest_neuron/erfc_neuron.py
index 9abdfc05..9d9b9993 100644
--- a/brainpy_state/_nest_neuron/erfc_neuron.py
+++ b/brainpy_state/_nest_neuron/erfc_neuron.py
@@ -25,8 +25,8 @@
import jax.scipy.special as jspecial
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import cond_any
__all__ = [
'erfc_neuron',
diff --git a/brainpy_state/_nest_neuron/gauss_rate.py b/brainpy_state/_nest_neuron/gauss_rate.py
index ce491e5b..9aca11e2 100644
--- a/brainpy_state/_nest_neuron/gauss_rate.py
+++ b/brainpy_state/_nest_neuron/gauss_rate.py
@@ -26,7 +26,7 @@
from brainstate.typing import ArrayLike, Size
from brainpy_state._nest_neuron.lin_rate import _lin_rate_base
-from brainpy_state._nest_base._utils import is_tracer
+from brainpy_state._nest_base.utils import is_tracer
__all__ = [
'gauss_rate_ipn',
diff --git a/brainpy_state/_nest_neuron/gauss_rate_test.py b/brainpy_state/_nest_neuron/gauss_rate_test.py
index c3dd8d93..12123cfa 100644
--- a/brainpy_state/_nest_neuron/gauss_rate_test.py
+++ b/brainpy_state/_nest_neuron/gauss_rate_test.py
@@ -29,7 +29,7 @@
from brainpy.state import gauss_rate_ipn
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _is_nest_available():
diff --git a/brainpy_state/_nest_neuron/gif_cond_exp.py b/brainpy_state/_nest_neuron/gif_cond_exp.py
index eaaff130..a46871a8 100644
--- a/brainpy_state/_nest_neuron/gif_cond_exp.py
+++ b/brainpy_state/_nest_neuron/gif_cond_exp.py
@@ -26,8 +26,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
__all__ = [
'gif_cond_exp',
diff --git a/brainpy_state/_nest_neuron/gif_cond_exp_multisynapse.py b/brainpy_state/_nest_neuron/gif_cond_exp_multisynapse.py
index 959dc5c1..c14238a6 100644
--- a/brainpy_state/_nest_neuron/gif_cond_exp_multisynapse.py
+++ b/brainpy_state/_nest_neuron/gif_cond_exp_multisynapse.py
@@ -26,8 +26,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
__all__ = [
'gif_cond_exp_multisynapse',
diff --git a/brainpy_state/_nest_neuron/gif_cond_exp_multisynapse_wbyrec_test.py b/brainpy_state/_nest_neuron/gif_cond_exp_multisynapse_wbyrec_test.py
index 0c2efd85..e03db0ef 100644
--- a/brainpy_state/_nest_neuron/gif_cond_exp_multisynapse_wbyrec_test.py
+++ b/brainpy_state/_nest_neuron/gif_cond_exp_multisynapse_wbyrec_test.py
@@ -32,7 +32,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import gif_cond_exp_multisynapse
diff --git a/brainpy_state/_nest_neuron/gif_pop_psc_exp.py b/brainpy_state/_nest_neuron/gif_pop_psc_exp.py
index 10b0ce3b..754e9a64 100644
--- a/brainpy_state/_nest_neuron/gif_pop_psc_exp.py
+++ b/brainpy_state/_nest_neuron/gif_pop_psc_exp.py
@@ -22,8 +22,8 @@
import numpy as np
from brainstate.typing import Size
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer
__all__ = [
'gif_pop_psc_exp',
diff --git a/brainpy_state/_nest_neuron/gif_psc_exp.py b/brainpy_state/_nest_neuron/gif_psc_exp.py
index 7636fd09..f8e803ce 100644
--- a/brainpy_state/_nest_neuron/gif_psc_exp.py
+++ b/brainpy_state/_nest_neuron/gif_psc_exp.py
@@ -25,8 +25,8 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, cond_any
__all__ = [
'gif_psc_exp',
diff --git a/brainpy_state/_nest_neuron/gif_psc_exp_multisynapse.py b/brainpy_state/_nest_neuron/gif_psc_exp_multisynapse.py
index db535b9e..03069015 100644
--- a/brainpy_state/_nest_neuron/gif_psc_exp_multisynapse.py
+++ b/brainpy_state/_nest_neuron/gif_psc_exp_multisynapse.py
@@ -94,8 +94,8 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, propagator_exp, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, propagator_exp, cond_any
__all__ = [
'gif_psc_exp_multisynapse',
diff --git a/brainpy_state/_nest_neuron/ginzburg_neuron.py b/brainpy_state/_nest_neuron/ginzburg_neuron.py
index e35c8530..1e10da99 100644
--- a/brainpy_state/_nest_neuron/ginzburg_neuron.py
+++ b/brainpy_state/_nest_neuron/ginzburg_neuron.py
@@ -24,8 +24,8 @@
import jax.numpy as jnp
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import cond_any
__all__ = [
'ginzburg_neuron',
diff --git a/brainpy_state/_nest_neuron/glif_cond.py b/brainpy_state/_nest_neuron/glif_cond.py
index 36cb666d..a808c972 100644
--- a/brainpy_state/_nest_neuron/glif_cond.py
+++ b/brainpy_state/_nest_neuron/glif_cond.py
@@ -26,8 +26,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
__all__ = [
'glif_cond',
diff --git a/brainpy_state/_nest_neuron/glif_cond_test.py b/brainpy_state/_nest_neuron/glif_cond_test.py
index 44a95496..b28683fe 100644
--- a/brainpy_state/_nest_neuron/glif_cond_test.py
+++ b/brainpy_state/_nest_neuron/glif_cond_test.py
@@ -45,7 +45,7 @@
import brainunit as u
import jax.numpy as jnp
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_neuron.glif_cond import glif_cond
diff --git a/brainpy_state/_nest_neuron/glif_psc.py b/brainpy_state/_nest_neuron/glif_psc.py
index 6a8cbfa1..be41d85d 100644
--- a/brainpy_state/_nest_neuron/glif_psc.py
+++ b/brainpy_state/_nest_neuron/glif_psc.py
@@ -25,8 +25,8 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, alpha_propagator_p31_p32, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, alpha_propagator_p31_p32, cond_any
__all__ = [
'glif_psc',
diff --git a/brainpy_state/_nest_neuron/glif_psc_double_alpha.py b/brainpy_state/_nest_neuron/glif_psc_double_alpha.py
index 8f0798d7..cb8b0c39 100644
--- a/brainpy_state/_nest_neuron/glif_psc_double_alpha.py
+++ b/brainpy_state/_nest_neuron/glif_psc_double_alpha.py
@@ -50,8 +50,8 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, alpha_propagator_p31_p32, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, alpha_propagator_p31_p32, cond_any
__all__ = [
'glif_psc_double_alpha',
diff --git a/brainpy_state/_nest_neuron/glif_psc_double_alpha_test.py b/brainpy_state/_nest_neuron/glif_psc_double_alpha_test.py
index 519e6a69..24b351da 100644
--- a/brainpy_state/_nest_neuron/glif_psc_double_alpha_test.py
+++ b/brainpy_state/_nest_neuron/glif_psc_double_alpha_test.py
@@ -52,10 +52,10 @@
import braintools
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_neuron.glif_psc_double_alpha import glif_psc_double_alpha
-from brainpy_state._nest_base._utils import alpha_propagator_p31_p32
+from brainpy_state._nest_base.utils import alpha_propagator_p31_p32
# ---------------------------------------------------------------------------
diff --git a/brainpy_state/_nest_neuron/glif_psc_test.py b/brainpy_state/_nest_neuron/glif_psc_test.py
index a23806a9..ff5f2008 100644
--- a/brainpy_state/_nest_neuron/glif_psc_test.py
+++ b/brainpy_state/_nest_neuron/glif_psc_test.py
@@ -48,10 +48,10 @@
import braintools
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_neuron.glif_psc import glif_psc
-from brainpy_state._nest_base._utils import alpha_propagator_p31_p32
+from brainpy_state._nest_base.utils import alpha_propagator_p31_p32
# ---------------------------------------------------------------------------
diff --git a/brainpy_state/_nest_neuron/hh_cond_beta_gap_traub.py b/brainpy_state/_nest_neuron/hh_cond_beta_gap_traub.py
index 1d51891a..ceac23dd 100644
--- a/brainpy_state/_nest_neuron/hh_cond_beta_gap_traub.py
+++ b/brainpy_state/_nest_neuron/hh_cond_beta_gap_traub.py
@@ -26,8 +26,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
__all__ = [
'hh_cond_beta_gap_traub',
diff --git a/brainpy_state/_nest_neuron/hh_cond_beta_gap_traub_test.py b/brainpy_state/_nest_neuron/hh_cond_beta_gap_traub_test.py
index 87a3d66a..c39f3b16 100644
--- a/brainpy_state/_nest_neuron/hh_cond_beta_gap_traub_test.py
+++ b/brainpy_state/_nest_neuron/hh_cond_beta_gap_traub_test.py
@@ -45,7 +45,7 @@
from brainpy_state import hh_cond_beta_gap_traub
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _nest_hh_cond_beta_gap_traub_dynamics(t, y, g_Na, g_K, g_L, E_Na, E_K, E_L,
diff --git a/brainpy_state/_nest_neuron/hh_cond_exp_traub.py b/brainpy_state/_nest_neuron/hh_cond_exp_traub.py
index f52da006..373a7b96 100644
--- a/brainpy_state/_nest_neuron/hh_cond_exp_traub.py
+++ b/brainpy_state/_nest_neuron/hh_cond_exp_traub.py
@@ -26,8 +26,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
__all__ = [
'hh_cond_exp_traub',
diff --git a/brainpy_state/_nest_neuron/hh_cond_exp_traub_test.py b/brainpy_state/_nest_neuron/hh_cond_exp_traub_test.py
index 6df030d4..3bef8ccd 100644
--- a/brainpy_state/_nest_neuron/hh_cond_exp_traub_test.py
+++ b/brainpy_state/_nest_neuron/hh_cond_exp_traub_test.py
@@ -44,7 +44,7 @@
from brainpy_state import hh_cond_exp_traub
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _nest_hh_cond_exp_traub_dynamics(t, y, g_Na, g_K, g_L, E_Na, E_K, E_L,
diff --git a/brainpy_state/_nest_neuron/hh_psc_alpha.py b/brainpy_state/_nest_neuron/hh_psc_alpha.py
index 517dd080..510917d3 100644
--- a/brainpy_state/_nest_neuron/hh_psc_alpha.py
+++ b/brainpy_state/_nest_neuron/hh_psc_alpha.py
@@ -26,8 +26,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
__all__ = [
'hh_psc_alpha',
diff --git a/brainpy_state/_nest_neuron/hh_psc_alpha_clopath.py b/brainpy_state/_nest_neuron/hh_psc_alpha_clopath.py
index e701ca37..d3ef895b 100644
--- a/brainpy_state/_nest_neuron/hh_psc_alpha_clopath.py
+++ b/brainpy_state/_nest_neuron/hh_psc_alpha_clopath.py
@@ -26,8 +26,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
__all__ = [
'hh_psc_alpha_clopath',
@@ -207,7 +207,7 @@ class hh_psc_alpha_clopath(NESTNeuron):
**4. Numerical Integration**
Uses a JAX-based adaptive RKF45 integrator via
- :class:`~brainpy_state._nest_base._utils.AdaptiveRungeKuttaStep` to match
+ :class:`~brainpy_state._nest_base.utils.AdaptiveRungeKuttaStep` to match
NEST's GSL RKF45 adaptive integrator. Default tolerance is
``gsl_error_tol=1e-6``. All neurons are integrated simultaneously in a
vectorized fashion.
@@ -977,7 +977,7 @@ def update(self, x=0. * u.pA, w_by_rec=None):
**Integration details:**
- - Uses :class:`~brainpy_state._nest_base._utils.AdaptiveRungeKuttaStep` with
+ - Uses :class:`~brainpy_state._nest_base.utils.AdaptiveRungeKuttaStep` with
method ``'RKF45'`` for vectorized integration of all neurons simultaneously.
- The ODE right-hand side includes all 11 state equations with full coupling.
- Alpha-kernel normalization ensures a weight of 1 pA produces a peak PSC of 1 pA.
diff --git a/brainpy_state/_nest_neuron/hh_psc_alpha_clopath_test.py b/brainpy_state/_nest_neuron/hh_psc_alpha_clopath_test.py
index e2de8607..7a9098e6 100644
--- a/brainpy_state/_nest_neuron/hh_psc_alpha_clopath_test.py
+++ b/brainpy_state/_nest_neuron/hh_psc_alpha_clopath_test.py
@@ -42,7 +42,7 @@
from scipy.integrate import solve_ivp
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _nest_hh_clopath_dynamics(t, y, g_Na, g_K, g_L, E_Na, E_K, E_L, C_m, I_e, I_stim,
diff --git a/brainpy_state/_nest_neuron/hh_psc_alpha_gap.py b/brainpy_state/_nest_neuron/hh_psc_alpha_gap.py
index 94579397..a3f53162 100644
--- a/brainpy_state/_nest_neuron/hh_psc_alpha_gap.py
+++ b/brainpy_state/_nest_neuron/hh_psc_alpha_gap.py
@@ -26,8 +26,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
__all__ = [
'hh_psc_alpha_gap',
diff --git a/brainpy_state/_nest_neuron/hh_psc_alpha_gap_test.py b/brainpy_state/_nest_neuron/hh_psc_alpha_gap_test.py
index 6f7d083a..e0f967d4 100644
--- a/brainpy_state/_nest_neuron/hh_psc_alpha_gap_test.py
+++ b/brainpy_state/_nest_neuron/hh_psc_alpha_gap_test.py
@@ -43,7 +43,7 @@
from scipy.integrate import solve_ivp
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _nest_hh_gap_dynamics(t, y, g_Na, g_Kv1, g_Kv3, g_L, E_Na, E_K, E_L,
diff --git a/brainpy_state/_nest_neuron/hh_psc_alpha_test.py b/brainpy_state/_nest_neuron/hh_psc_alpha_test.py
index 01310722..cd47b266 100644
--- a/brainpy_state/_nest_neuron/hh_psc_alpha_test.py
+++ b/brainpy_state/_nest_neuron/hh_psc_alpha_test.py
@@ -41,7 +41,7 @@
from scipy.integrate import solve_ivp
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _nest_hh_dynamics(t, y, g_Na, g_K, g_L, E_Na, E_K, E_L, C_m, I_e, I_stim, tau_ex, tau_in):
diff --git a/brainpy_state/_nest_neuron/ht_neuron.py b/brainpy_state/_nest_neuron/ht_neuron.py
index 25e09d3e..096263bc 100644
--- a/brainpy_state/_nest_neuron/ht_neuron.py
+++ b/brainpy_state/_nest_neuron/ht_neuron.py
@@ -46,8 +46,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, AdaptiveRungeKuttaStep
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, AdaptiveRungeKuttaStep
__all__ = [
'ht_neuron',
diff --git a/brainpy_state/_nest_neuron/ht_neuron_test.py b/brainpy_state/_nest_neuron/ht_neuron_test.py
index bb78f2c7..4a5a8fe6 100644
--- a/brainpy_state/_nest_neuron/ht_neuron_test.py
+++ b/brainpy_state/_nest_neuron/ht_neuron_test.py
@@ -111,7 +111,7 @@ def _m_NMDA(V, m_eq, m_fast, m_slow, instant_unblock_NMDA=False):
return A1 * m_fast + A2 * m_slow
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
# ---------------------------------------------------------------------------
diff --git a/brainpy_state/_nest_neuron/iaf_bw_2001.py b/brainpy_state/_nest_neuron/iaf_bw_2001.py
index cf476a89..7701cd84 100644
--- a/brainpy_state/_nest_neuron/iaf_bw_2001.py
+++ b/brainpy_state/_nest_neuron/iaf_bw_2001.py
@@ -27,8 +27,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
__all__ = [
'iaf_bw_2001',
@@ -535,7 +535,7 @@ def delta_label_for_receptor(self, receptor_type):
r"""Map a NEST receptor type to this model's delta-input channel label.
Routes ``Simulator.connect(..., receptor_type=k)`` through the named-channel
- deposit path: :class:`~brainpy_state._nest_network._event_proj.EventProjection` tags
+ deposit path: :class:`~brainpy_state._nest_network.event_proj.EventProjection` tags
the deposit with the returned label, which the model reads back via
``sum_delta_inputs(label=...)``. Exposing this resolver (instead of a stacked
``n_receptors`` port) is what lets a Simulator connection reach the AMPA, GABA
diff --git a/brainpy_state/_nest_neuron/iaf_bw_2001_exact.py b/brainpy_state/_nest_neuron/iaf_bw_2001_exact.py
index 885a9066..15b01d32 100644
--- a/brainpy_state/_nest_neuron/iaf_bw_2001_exact.py
+++ b/brainpy_state/_nest_neuron/iaf_bw_2001_exact.py
@@ -26,8 +26,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
__all__ = [
'iaf_bw_2001_exact',
diff --git a/brainpy_state/_nest_neuron/iaf_bw_2001_exact_test.py b/brainpy_state/_nest_neuron/iaf_bw_2001_exact_test.py
index 3d897bf0..2978a7ed 100644
--- a/brainpy_state/_nest_neuron/iaf_bw_2001_exact_test.py
+++ b/brainpy_state/_nest_neuron/iaf_bw_2001_exact_test.py
@@ -26,7 +26,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import iaf_bw_2001_exact, iaf_cond_exp
diff --git a/brainpy_state/_nest_neuron/iaf_bw_2001_test.py b/brainpy_state/_nest_neuron/iaf_bw_2001_test.py
index db21d35f..5a1d8496 100644
--- a/brainpy_state/_nest_neuron/iaf_bw_2001_test.py
+++ b/brainpy_state/_nest_neuron/iaf_bw_2001_test.py
@@ -27,7 +27,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import iaf_bw_2001, iaf_cond_exp
diff --git a/brainpy_state/_nest_neuron/iaf_chs_2007.py b/brainpy_state/_nest_neuron/iaf_chs_2007.py
index 956b0aff..82be251c 100644
--- a/brainpy_state/_nest_neuron/iaf_chs_2007.py
+++ b/brainpy_state/_nest_neuron/iaf_chs_2007.py
@@ -25,8 +25,8 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, cond_any
__all__ = [
'iaf_chs_2007',
diff --git a/brainpy_state/_nest_neuron/iaf_chs_2007_test.py b/brainpy_state/_nest_neuron/iaf_chs_2007_test.py
index 509367c4..ac4e5ae0 100644
--- a/brainpy_state/_nest_neuron/iaf_chs_2007_test.py
+++ b/brainpy_state/_nest_neuron/iaf_chs_2007_test.py
@@ -26,7 +26,7 @@
from brainpy.state import iaf_chs_2007
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _reference_step(state, params, w_step):
diff --git a/brainpy_state/_nest_neuron/iaf_chxk_2008.py b/brainpy_state/_nest_neuron/iaf_chxk_2008.py
index 61e3e22e..53149263 100644
--- a/brainpy_state/_nest_neuron/iaf_chxk_2008.py
+++ b/brainpy_state/_nest_neuron/iaf_chxk_2008.py
@@ -26,8 +26,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
__all__ = [
'iaf_chxk_2008',
diff --git a/brainpy_state/_nest_neuron/iaf_chxk_2008_test.py b/brainpy_state/_nest_neuron/iaf_chxk_2008_test.py
index 44bdccef..cee4fedf 100644
--- a/brainpy_state/_nest_neuron/iaf_chxk_2008_test.py
+++ b/brainpy_state/_nest_neuron/iaf_chxk_2008_test.py
@@ -25,7 +25,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import iaf_chxk_2008
diff --git a/brainpy_state/_nest_neuron/iaf_cond_alpha.py b/brainpy_state/_nest_neuron/iaf_cond_alpha.py
index 09ec5e57..abe864b0 100644
--- a/brainpy_state/_nest_neuron/iaf_cond_alpha.py
+++ b/brainpy_state/_nest_neuron/iaf_cond_alpha.py
@@ -26,8 +26,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
__all__ = [
'iaf_cond_alpha',
diff --git a/brainpy_state/_nest_neuron/iaf_cond_alpha_mc.py b/brainpy_state/_nest_neuron/iaf_cond_alpha_mc.py
index 7171e9c5..c6f06f32 100644
--- a/brainpy_state/_nest_neuron/iaf_cond_alpha_mc.py
+++ b/brainpy_state/_nest_neuron/iaf_cond_alpha_mc.py
@@ -26,8 +26,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
__all__ = [
'iaf_cond_alpha_mc',
diff --git a/brainpy_state/_nest_neuron/iaf_cond_alpha_mc_test.py b/brainpy_state/_nest_neuron/iaf_cond_alpha_mc_test.py
index 8026ad73..2da6a5e5 100644
--- a/brainpy_state/_nest_neuron/iaf_cond_alpha_mc_test.py
+++ b/brainpy_state/_nest_neuron/iaf_cond_alpha_mc_test.py
@@ -24,7 +24,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import iaf_cond_alpha_mc
diff --git a/brainpy_state/_nest_neuron/iaf_cond_alpha_test.py b/brainpy_state/_nest_neuron/iaf_cond_alpha_test.py
index 039ee802..1973b839 100644
--- a/brainpy_state/_nest_neuron/iaf_cond_alpha_test.py
+++ b/brainpy_state/_nest_neuron/iaf_cond_alpha_test.py
@@ -26,7 +26,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import iaf_cond_alpha
diff --git a/brainpy_state/_nest_neuron/iaf_cond_beta.py b/brainpy_state/_nest_neuron/iaf_cond_beta.py
index 8d69c2f6..0df71ee7 100644
--- a/brainpy_state/_nest_neuron/iaf_cond_beta.py
+++ b/brainpy_state/_nest_neuron/iaf_cond_beta.py
@@ -26,8 +26,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
__all__ = [
'iaf_cond_beta',
diff --git a/brainpy_state/_nest_neuron/iaf_cond_beta_test.py b/brainpy_state/_nest_neuron/iaf_cond_beta_test.py
index a1b79481..a4a5e9b1 100644
--- a/brainpy_state/_nest_neuron/iaf_cond_beta_test.py
+++ b/brainpy_state/_nest_neuron/iaf_cond_beta_test.py
@@ -26,7 +26,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy.state import iaf_cond_beta
diff --git a/brainpy_state/_nest_neuron/iaf_cond_exp.py b/brainpy_state/_nest_neuron/iaf_cond_exp.py
index b5b45f1f..79f298c3 100644
--- a/brainpy_state/_nest_neuron/iaf_cond_exp.py
+++ b/brainpy_state/_nest_neuron/iaf_cond_exp.py
@@ -26,8 +26,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
__all__ = [
'iaf_cond_exp',
diff --git a/brainpy_state/_nest_neuron/iaf_cond_exp_sfa_rr.py b/brainpy_state/_nest_neuron/iaf_cond_exp_sfa_rr.py
index f4a70c5b..fa287a00 100644
--- a/brainpy_state/_nest_neuron/iaf_cond_exp_sfa_rr.py
+++ b/brainpy_state/_nest_neuron/iaf_cond_exp_sfa_rr.py
@@ -26,8 +26,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
__all__ = [
'iaf_cond_exp_sfa_rr',
diff --git a/brainpy_state/_nest_neuron/iaf_cond_exp_sfa_rr_test.py b/brainpy_state/_nest_neuron/iaf_cond_exp_sfa_rr_test.py
index 2d4a7821..a3d491e4 100644
--- a/brainpy_state/_nest_neuron/iaf_cond_exp_sfa_rr_test.py
+++ b/brainpy_state/_nest_neuron/iaf_cond_exp_sfa_rr_test.py
@@ -27,7 +27,7 @@
from brainpy.state import iaf_cond_exp, iaf_cond_exp_sfa_rr
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _rkf45_ref_step(v, g_ex, g_in, g_sfa, g_rr, is_refractory, i_stim, dt, h0, p, atol=1e-3):
diff --git a/brainpy_state/_nest_neuron/iaf_cond_exp_test.py b/brainpy_state/_nest_neuron/iaf_cond_exp_test.py
index 8a1c0b7c..154a4914 100644
--- a/brainpy_state/_nest_neuron/iaf_cond_exp_test.py
+++ b/brainpy_state/_nest_neuron/iaf_cond_exp_test.py
@@ -27,7 +27,7 @@
from brainpy.state import iaf_cond_exp
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _rkf45_ref_step(v, g_ex, g_in, is_refractory, i_stim, dt, h0, p, atol=1e-3):
diff --git a/brainpy_state/_nest_neuron/iaf_psc_alpha.py b/brainpy_state/_nest_neuron/iaf_psc_alpha.py
index b74ea775..9c33419a 100644
--- a/brainpy_state/_nest_neuron/iaf_psc_alpha.py
+++ b/brainpy_state/_nest_neuron/iaf_psc_alpha.py
@@ -25,8 +25,8 @@
import brainunit as u
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, cond_any
__all__ = [
'iaf_psc_alpha',
diff --git a/brainpy_state/_nest_neuron/iaf_psc_alpha_multisynapse.py b/brainpy_state/_nest_neuron/iaf_psc_alpha_multisynapse.py
index 26e7170e..1a720430 100644
--- a/brainpy_state/_nest_neuron/iaf_psc_alpha_multisynapse.py
+++ b/brainpy_state/_nest_neuron/iaf_psc_alpha_multisynapse.py
@@ -25,8 +25,8 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, cond_any
from .iaf_psc_alpha import iaf_psc_alpha
__all__ = [
diff --git a/brainpy_state/_nest_neuron/iaf_psc_alpha_multisynapse_test.py b/brainpy_state/_nest_neuron/iaf_psc_alpha_multisynapse_test.py
index 1ac794d4..7cb65cf7 100644
--- a/brainpy_state/_nest_neuron/iaf_psc_alpha_multisynapse_test.py
+++ b/brainpy_state/_nest_neuron/iaf_psc_alpha_multisynapse_test.py
@@ -27,7 +27,7 @@
from brainpy.state import iaf_psc_alpha_multisynapse
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def alpha_fn(t, tau_syn):
diff --git a/brainpy_state/_nest_neuron/iaf_psc_alpha_ps.py b/brainpy_state/_nest_neuron/iaf_psc_alpha_ps.py
index 314d3290..17f2152b 100644
--- a/brainpy_state/_nest_neuron/iaf_psc_alpha_ps.py
+++ b/brainpy_state/_nest_neuron/iaf_psc_alpha_ps.py
@@ -25,8 +25,8 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, cond_any
from .iaf_psc_alpha import iaf_psc_alpha
__all__ = [
diff --git a/brainpy_state/_nest_neuron/iaf_psc_alpha_ps_test.py b/brainpy_state/_nest_neuron/iaf_psc_alpha_ps_test.py
index f90a62c7..130de397 100644
--- a/brainpy_state/_nest_neuron/iaf_psc_alpha_ps_test.py
+++ b/brainpy_state/_nest_neuron/iaf_psc_alpha_ps_test.py
@@ -25,7 +25,7 @@
from brainpy.state import iaf_psc_alpha_ps
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
class TestIAFPscAlphaPS(unittest.TestCase):
diff --git a/brainpy_state/_nest_neuron/iaf_psc_alpha_test.py b/brainpy_state/_nest_neuron/iaf_psc_alpha_test.py
index 364524ab..db6891ad 100644
--- a/brainpy_state/_nest_neuron/iaf_psc_alpha_test.py
+++ b/brainpy_state/_nest_neuron/iaf_psc_alpha_test.py
@@ -132,7 +132,7 @@ class TestIAFPscAlpha(unittest.TestCase):
def setUpClass(cls):
# Match NEST's double-precision CPU behavior as closely as possible.
jax.config.update('jax_enable_x64', True)
- brainstate.environ.set(precision=64, platform='cpu')
+ brainstate.environ.set(precision=64)
def setUp(self):
brainstate.environ.set(dt=0.1 * u.ms)
diff --git a/brainpy_state/_nest_neuron/iaf_psc_delta.py b/brainpy_state/_nest_neuron/iaf_psc_delta.py
index 60386720..0bf72121 100644
--- a/brainpy_state/_nest_neuron/iaf_psc_delta.py
+++ b/brainpy_state/_nest_neuron/iaf_psc_delta.py
@@ -25,7 +25,7 @@
import brainunit as u
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTNeuron
+from brainpy_state._nest_base.base import NESTNeuron
__all__ = [
'iaf_psc_delta',
diff --git a/brainpy_state/_nest_neuron/iaf_psc_delta_ps.py b/brainpy_state/_nest_neuron/iaf_psc_delta_ps.py
index f8ca08ab..5d42ac00 100644
--- a/brainpy_state/_nest_neuron/iaf_psc_delta_ps.py
+++ b/brainpy_state/_nest_neuron/iaf_psc_delta_ps.py
@@ -26,8 +26,8 @@
import brainunit as u
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, cond_any
__all__ = [
'iaf_psc_delta_ps',
diff --git a/brainpy_state/_nest_neuron/iaf_psc_exp.py b/brainpy_state/_nest_neuron/iaf_psc_exp.py
index 0737687f..b6e79113 100644
--- a/brainpy_state/_nest_neuron/iaf_psc_exp.py
+++ b/brainpy_state/_nest_neuron/iaf_psc_exp.py
@@ -25,8 +25,8 @@
import brainunit as u
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, propagator_exp, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, propagator_exp, cond_any
__all__ = [
'iaf_psc_exp',
@@ -91,7 +91,7 @@ class iaf_psc_exp(NESTNeuron):
\left(e^{-h/\tau_m} - e^{-h/\tau_{\mathrm{syn}}}\right),
where :math:`P_{21}` is evaluated numerically stably by
- :func:`~brainpy_state._nest_base._utils.propagator_exp`. Let :math:`V_\mathrm{rel} = V_m - E_L`.
+ :func:`~brainpy_state._nest_base.utils.propagator_exp`. Let :math:`V_\mathrm{rel} = V_m - E_L`.
The candidate membrane update is
.. math::
@@ -134,7 +134,7 @@ class iaf_psc_exp(NESTNeuron):
- Construction enforces ``V_reset < V_th``, ``C_m > 0``, ``tau_m > 0``,
``tau_syn_ex > 0``, ``tau_syn_in > 0``, ``t_ref >= 0``, ``rho >= 0``,
and ``delta >= 0``.
- - :func:`~brainpy_state._nest_base._utils.propagator_exp` uses a singular fallback
+ - :func:`~brainpy_state._nest_base.utils.propagator_exp` uses a singular fallback
:math:`(h/C_m)\exp(-h/\tau_m)` when ``tau_syn`` is numerically close
to ``tau_m``, avoiding cancellation in
:math:`(e^{-h/\tau_m} - e^{-h/\tau_{\mathrm{syn}}})/(\tau_m - \tau_{\mathrm{syn}})`.
diff --git a/brainpy_state/_nest_neuron/iaf_psc_exp_htum.py b/brainpy_state/_nest_neuron/iaf_psc_exp_htum.py
index 69de7d4c..429842cd 100644
--- a/brainpy_state/_nest_neuron/iaf_psc_exp_htum.py
+++ b/brainpy_state/_nest_neuron/iaf_psc_exp_htum.py
@@ -25,8 +25,8 @@
import brainunit as u
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, cond_any
__all__ = [
'iaf_psc_exp_htum',
diff --git a/brainpy_state/_nest_neuron/iaf_psc_exp_htum_test.py b/brainpy_state/_nest_neuron/iaf_psc_exp_htum_test.py
index c12f2936..54e1dbae 100644
--- a/brainpy_state/_nest_neuron/iaf_psc_exp_htum_test.py
+++ b/brainpy_state/_nest_neuron/iaf_psc_exp_htum_test.py
@@ -26,10 +26,10 @@
import numpy as np
from brainpy.state import iaf_psc_exp_htum
-from brainpy_state._nest_base._utils import propagator_exp as _propagator_exp
+from brainpy_state._nest_base.utils import propagator_exp as _propagator_exp
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
class TestIAFPscExpHtum(unittest.TestCase):
diff --git a/brainpy_state/_nest_neuron/iaf_psc_exp_multisynapse.py b/brainpy_state/_nest_neuron/iaf_psc_exp_multisynapse.py
index 75d6d90a..dbad6bfa 100644
--- a/brainpy_state/_nest_neuron/iaf_psc_exp_multisynapse.py
+++ b/brainpy_state/_nest_neuron/iaf_psc_exp_multisynapse.py
@@ -25,8 +25,8 @@
import brainunit as u
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, propagator_exp, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, propagator_exp, cond_any
__all__ = [
'iaf_psc_exp_multisynapse',
diff --git a/brainpy_state/_nest_neuron/iaf_psc_exp_multisynapse_test.py b/brainpy_state/_nest_neuron/iaf_psc_exp_multisynapse_test.py
index 4b382877..8ca14309 100644
--- a/brainpy_state/_nest_neuron/iaf_psc_exp_multisynapse_test.py
+++ b/brainpy_state/_nest_neuron/iaf_psc_exp_multisynapse_test.py
@@ -26,7 +26,7 @@
from brainpy.state import iaf_psc_exp_multisynapse
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def exp_psc_fn(t, tau_syn):
diff --git a/brainpy_state/_nest_neuron/iaf_psc_exp_ps.py b/brainpy_state/_nest_neuron/iaf_psc_exp_ps.py
index 901046b7..5b84a888 100644
--- a/brainpy_state/_nest_neuron/iaf_psc_exp_ps.py
+++ b/brainpy_state/_nest_neuron/iaf_psc_exp_ps.py
@@ -25,8 +25,8 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, propagator_exp, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, propagator_exp, cond_any
__all__ = [
'iaf_psc_exp_ps',
diff --git a/brainpy_state/_nest_neuron/iaf_psc_exp_ps_lossless.py b/brainpy_state/_nest_neuron/iaf_psc_exp_ps_lossless.py
index b544ce1a..bd172cbd 100644
--- a/brainpy_state/_nest_neuron/iaf_psc_exp_ps_lossless.py
+++ b/brainpy_state/_nest_neuron/iaf_psc_exp_ps_lossless.py
@@ -25,8 +25,8 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, propagator_exp, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, propagator_exp, cond_any
__all__ = [
'iaf_psc_exp_ps_lossless',
diff --git a/brainpy_state/_nest_neuron/iaf_psc_exp_ps_lossless_test.py b/brainpy_state/_nest_neuron/iaf_psc_exp_ps_lossless_test.py
index 255bab0f..25df0640 100644
--- a/brainpy_state/_nest_neuron/iaf_psc_exp_ps_lossless_test.py
+++ b/brainpy_state/_nest_neuron/iaf_psc_exp_ps_lossless_test.py
@@ -25,7 +25,7 @@
from brainpy.state import iaf_psc_exp_ps, iaf_psc_exp_ps_lossless
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
class TestIAFPscExpPSLossless(unittest.TestCase):
diff --git a/brainpy_state/_nest_neuron/iaf_psc_exp_ps_test.py b/brainpy_state/_nest_neuron/iaf_psc_exp_ps_test.py
index 57ae13a6..6c5b4180 100644
--- a/brainpy_state/_nest_neuron/iaf_psc_exp_ps_test.py
+++ b/brainpy_state/_nest_neuron/iaf_psc_exp_ps_test.py
@@ -25,7 +25,7 @@
from brainpy.state import iaf_psc_exp_ps
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
class TestIAFPscExpPS(unittest.TestCase):
diff --git a/brainpy_state/_nest_neuron/iaf_psc_exp_test.py b/brainpy_state/_nest_neuron/iaf_psc_exp_test.py
index 9415e5cd..1d65bb56 100644
--- a/brainpy_state/_nest_neuron/iaf_psc_exp_test.py
+++ b/brainpy_state/_nest_neuron/iaf_psc_exp_test.py
@@ -27,7 +27,7 @@
from brainpy.state import iaf_psc_exp
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _propagator_exp(tau_syn, tau_m, c_m, h):
diff --git a/brainpy_state/_nest_neuron/iaf_tum_2000.py b/brainpy_state/_nest_neuron/iaf_tum_2000.py
index a294dd66..99f81862 100644
--- a/brainpy_state/_nest_neuron/iaf_tum_2000.py
+++ b/brainpy_state/_nest_neuron/iaf_tum_2000.py
@@ -25,8 +25,8 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, propagator_exp, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, propagator_exp, cond_any
__all__ = [
'iaf_tum_2000',
diff --git a/brainpy_state/_nest_neuron/iaf_tum_2000_test.py b/brainpy_state/_nest_neuron/iaf_tum_2000_test.py
index a7b19c31..9b7afbaf 100644
--- a/brainpy_state/_nest_neuron/iaf_tum_2000_test.py
+++ b/brainpy_state/_nest_neuron/iaf_tum_2000_test.py
@@ -24,10 +24,10 @@
import jax
import numpy as np
from brainpy.state import iaf_psc_exp, iaf_tum_2000
-from brainpy_state._nest_base._utils import propagator_exp
+from brainpy_state._nest_base.utils import propagator_exp
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _is_spike(spk):
diff --git a/brainpy_state/_nest_neuron/ignore_and_fire.py b/brainpy_state/_nest_neuron/ignore_and_fire.py
index 8d2d6043..398f6c97 100644
--- a/brainpy_state/_nest_neuron/ignore_and_fire.py
+++ b/brainpy_state/_nest_neuron/ignore_and_fire.py
@@ -22,8 +22,8 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, cond_any
__all__ = [
'ignore_and_fire',
diff --git a/brainpy_state/_nest_neuron/izhikevich.py b/brainpy_state/_nest_neuron/izhikevich.py
index 2085a5d1..9ce6f815 100644
--- a/brainpy_state/_nest_neuron/izhikevich.py
+++ b/brainpy_state/_nest_neuron/izhikevich.py
@@ -24,7 +24,7 @@
import jax.numpy as jnp
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTNeuron
+from brainpy_state._nest_base.base import NESTNeuron
__all__ = [
'izhikevich',
diff --git a/brainpy_state/_nest_neuron/izhikevich_test.py b/brainpy_state/_nest_neuron/izhikevich_test.py
index 5958738b..d537c947 100644
--- a/brainpy_state/_nest_neuron/izhikevich_test.py
+++ b/brainpy_state/_nest_neuron/izhikevich_test.py
@@ -96,7 +96,7 @@ class TestIzhikevich(unittest.TestCase):
@classmethod
def setUpClass(cls):
jax.config.update('jax_enable_x64', True)
- brainstate.environ.set(precision=64, platform='cpu')
+ brainstate.environ.set(precision=64)
def setUp(self):
brainstate.environ.set(dt=0.1 * u.ms)
diff --git a/brainpy_state/_nest_neuron/lin_rate.py b/brainpy_state/_nest_neuron/lin_rate.py
index 6444e9e4..0e672212 100644
--- a/brainpy_state/_nest_neuron/lin_rate.py
+++ b/brainpy_state/_nest_neuron/lin_rate.py
@@ -25,8 +25,8 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, cond_any
__all__ = [
'lin_rate_ipn',
diff --git a/brainpy_state/_nest_neuron/lin_rate_test.py b/brainpy_state/_nest_neuron/lin_rate_test.py
index 6ede433d..ef7309a5 100644
--- a/brainpy_state/_nest_neuron/lin_rate_test.py
+++ b/brainpy_state/_nest_neuron/lin_rate_test.py
@@ -29,7 +29,7 @@
from brainpy.state import lin_rate_ipn, lin_rate_opn
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _is_nest_available():
diff --git a/brainpy_state/_nest_neuron/mat2_psc_exp.py b/brainpy_state/_nest_neuron/mat2_psc_exp.py
index c1db9b3b..7463c146 100644
--- a/brainpy_state/_nest_neuron/mat2_psc_exp.py
+++ b/brainpy_state/_nest_neuron/mat2_psc_exp.py
@@ -25,8 +25,8 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, cond_any
__all__ = [
'mat2_psc_exp',
diff --git a/brainpy_state/_nest_neuron/mat2_psc_exp_test.py b/brainpy_state/_nest_neuron/mat2_psc_exp_test.py
index 1fd5011d..eaab1796 100644
--- a/brainpy_state/_nest_neuron/mat2_psc_exp_test.py
+++ b/brainpy_state/_nest_neuron/mat2_psc_exp_test.py
@@ -42,7 +42,7 @@
from brainpy_state._nest_neuron.mat2_psc_exp import mat2_psc_exp
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
class TestMat2PscExp(unittest.TestCase):
diff --git a/brainpy_state/_nest_neuron/mcculloch_pitts_neuron.py b/brainpy_state/_nest_neuron/mcculloch_pitts_neuron.py
index e5c11e1a..2d4b5db6 100644
--- a/brainpy_state/_nest_neuron/mcculloch_pitts_neuron.py
+++ b/brainpy_state/_nest_neuron/mcculloch_pitts_neuron.py
@@ -24,7 +24,7 @@
import jax.numpy as jnp
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTNeuron
+from brainpy_state._nest_base.base import NESTNeuron
__all__ = [
'mcculloch_pitts_neuron',
diff --git a/brainpy_state/_nest_neuron/parrot_neuron.py b/brainpy_state/_nest_neuron/parrot_neuron.py
index bec850f4..f9e85401 100644
--- a/brainpy_state/_nest_neuron/parrot_neuron.py
+++ b/brainpy_state/_nest_neuron/parrot_neuron.py
@@ -22,7 +22,7 @@
import brainunit as u
from brainstate.typing import Size
-from brainpy_state._nest_base._base import NESTNeuron
+from brainpy_state._nest_base.base import NESTNeuron
__all__ = [
'parrot_neuron',
@@ -80,7 +80,7 @@ class parrot_neuron(NESTNeuron):
no-ops.
- Incoming events are read through the standard delta-input seam
(:meth:`~brainpy_state._base.Dynamics.sum_delta_inputs`), the same channel
- an :class:`~brainpy_state._nest_network._event_proj.EventProjection` deposits
+ an :class:`~brainpy_state._nest_network.event_proj.EventProjection` deposits
into. The summed arriving input (with the canonical unit gate weight) is the
spike count for the step and is relayed as the output multiplicity. The
:class:`~brainpy_state.network.Simulator` captures this model's output
diff --git a/brainpy_state/_nest_neuron/parrot_neuron_test.py b/brainpy_state/_nest_neuron/parrot_neuron_test.py
index 934089e2..d989d1e2 100644
--- a/brainpy_state/_nest_neuron/parrot_neuron_test.py
+++ b/brainpy_state/_nest_neuron/parrot_neuron_test.py
@@ -19,7 +19,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
diff --git a/brainpy_state/_nest_neuron/pp_cond_exp_mc_urbanczik.py b/brainpy_state/_nest_neuron/pp_cond_exp_mc_urbanczik.py
index 4bc95f85..77e41309 100644
--- a/brainpy_state/_nest_neuron/pp_cond_exp_mc_urbanczik.py
+++ b/brainpy_state/_nest_neuron/pp_cond_exp_mc_urbanczik.py
@@ -26,8 +26,8 @@
from brainstate.typing import ArrayLike, Size
from brainstate.util import DotDict
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, AdaptiveRungeKuttaStep, cond_any
__all__ = [
'pp_cond_exp_mc_urbanczik',
diff --git a/brainpy_state/_nest_neuron/pp_cond_exp_mc_urbanczik_test.py b/brainpy_state/_nest_neuron/pp_cond_exp_mc_urbanczik_test.py
index 031cda1c..e0fea194 100644
--- a/brainpy_state/_nest_neuron/pp_cond_exp_mc_urbanczik_test.py
+++ b/brainpy_state/_nest_neuron/pp_cond_exp_mc_urbanczik_test.py
@@ -194,7 +194,7 @@ class TestDefaultParameters(unittest.TestCase):
def setUp(self):
brainstate.environ.set(dt=0.1 * u.ms)
self.dt = 0.1 * u.ms
- brainstate.environ.set(precision=64, platform='cpu')
+ brainstate.environ.set(precision=64)
with brainstate.environ.context(dt=self.dt, t=0.0 * u.ms):
self.neuron = pp_cond_exp_mc_urbanczik(1)
self.neuron.init_state()
@@ -335,7 +335,7 @@ class TestStateInitialization(unittest.TestCase):
def setUp(self):
brainstate.environ.set(dt=0.1 * u.ms)
self.dt = 0.1 * u.ms
- brainstate.environ.set(precision=64, platform='cpu')
+ brainstate.environ.set(precision=64)
def test_default_init(self):
with brainstate.environ.context(dt=self.dt, t=0.0 * u.ms):
@@ -406,7 +406,7 @@ class TestSubthresholdDynamics(unittest.TestCase):
def setUp(self):
brainstate.environ.set(dt=0.1 * u.ms)
self.dt = 0.1 * u.ms
- brainstate.environ.set(precision=64, platform='cpu')
+ brainstate.environ.set(precision=64)
def _step(self, neuron, step_idx, x=0.0 * u.pA,
soma_exc=None, soma_inh=None, dend_exc=None, dend_inh=None):
@@ -652,7 +652,7 @@ class TestSpikeGeneration(unittest.TestCase):
def setUp(self):
brainstate.environ.set(dt=0.1 * u.ms)
self.dt = 0.1 * u.ms
- brainstate.environ.set(precision=64, platform='cpu')
+ brainstate.environ.set(precision=64)
def test_low_rate_at_rest(self):
r"""At rest (V_m = E_L = -70 mV), rate should be low but nonzero."""
@@ -701,7 +701,7 @@ class TestRefractoryPeriod(unittest.TestCase):
def setUp(self):
brainstate.environ.set(dt=0.1 * u.ms)
self.dt = 0.1 * u.ms
- brainstate.environ.set(precision=64, platform='cpu')
+ brainstate.environ.set(precision=64)
def test_refractory_counter_decrement(self):
r"""Refractory counter should decrement each step."""
@@ -752,7 +752,7 @@ class TestUrbanczikHistory(unittest.TestCase):
def setUp(self):
brainstate.environ.set(dt=0.1 * u.ms)
self.dt = 0.1 * u.ms
- brainstate.environ.set(precision=64, platform='cpu')
+ brainstate.environ.set(precision=64)
def test_history_populated(self):
r"""History should be populated after each step."""
@@ -818,7 +818,7 @@ class TestCurrentInput(unittest.TestCase):
def setUp(self):
brainstate.environ.set(dt=0.1 * u.ms)
self.dt = 0.1 * u.ms
- brainstate.environ.set(precision=64, platform='cpu')
+ brainstate.environ.set(precision=64)
def test_soma_current_input_delayed(self):
r"""External current should be delayed by one step (NEST ring buffer)."""
@@ -850,7 +850,7 @@ class TestPopulation(unittest.TestCase):
def setUp(self):
brainstate.environ.set(dt=0.1 * u.ms)
self.dt = 0.1 * u.ms
- brainstate.environ.set(precision=64, platform='cpu')
+ brainstate.environ.set(precision=64)
def test_identical_neurons_match(self):
r"""Two identical neurons with same RNG should produce same output."""
@@ -897,7 +897,7 @@ class TestFullReferenceTrace(unittest.TestCase):
def setUp(self):
brainstate.environ.set(dt=0.1 * u.ms)
self.dt = 0.1 * u.ms
- brainstate.environ.set(precision=64, platform='cpu')
+ brainstate.environ.set(precision=64)
def test_subthreshold_with_somatic_excitation(self):
r"""Compare trace with somatic excitatory conductance input."""
@@ -1032,7 +1032,7 @@ class TestUrbanczikLearningSignal(unittest.TestCase):
def setUp(self):
brainstate.environ.set(dt=0.1 * u.ms)
self.dt = 0.1 * u.ms
- brainstate.environ.set(precision=64, platform='cpu')
+ brainstate.environ.set(precision=64)
def test_V_W_star_computation(self):
r"""Verify V_W_star dendritic prediction formula."""
diff --git a/brainpy_state/_nest_neuron/pp_psc_delta.py b/brainpy_state/_nest_neuron/pp_psc_delta.py
index ffef1905..9c8d8d57 100644
--- a/brainpy_state/_nest_neuron/pp_psc_delta.py
+++ b/brainpy_state/_nest_neuron/pp_psc_delta.py
@@ -25,8 +25,8 @@
import numpy as np
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, cond_any
__all__ = [
'pp_psc_delta',
diff --git a/brainpy_state/_nest_neuron/rate_neuron_ipn.py b/brainpy_state/_nest_neuron/rate_neuron_ipn.py
index f6f0f8d0..79e06a2f 100644
--- a/brainpy_state/_nest_neuron/rate_neuron_ipn.py
+++ b/brainpy_state/_nest_neuron/rate_neuron_ipn.py
@@ -26,7 +26,7 @@
from brainstate.typing import ArrayLike, Size
from brainpy_state._nest_neuron.lin_rate import _lin_rate_base
-from brainpy_state._nest_base._utils import is_tracer
+from brainpy_state._nest_base.utils import is_tracer
__all__ = [
'rate_neuron_ipn',
diff --git a/brainpy_state/_nest_neuron/rate_neuron_ipn_test.py b/brainpy_state/_nest_neuron/rate_neuron_ipn_test.py
index 41f4e2fe..6fd72f29 100644
--- a/brainpy_state/_nest_neuron/rate_neuron_ipn_test.py
+++ b/brainpy_state/_nest_neuron/rate_neuron_ipn_test.py
@@ -28,7 +28,7 @@
from brainpy.state import rate_neuron_ipn
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _is_nest_available():
diff --git a/brainpy_state/_nest_neuron/rate_neuron_opn.py b/brainpy_state/_nest_neuron/rate_neuron_opn.py
index 5184fa98..14ed136a 100644
--- a/brainpy_state/_nest_neuron/rate_neuron_opn.py
+++ b/brainpy_state/_nest_neuron/rate_neuron_opn.py
@@ -26,7 +26,7 @@
from brainstate.typing import ArrayLike, Size
from brainpy_state._nest_neuron.lin_rate import _lin_rate_base
-from brainpy_state._nest_base._utils import is_tracer
+from brainpy_state._nest_base.utils import is_tracer
__all__ = [
'rate_neuron_opn',
diff --git a/brainpy_state/_nest_neuron/rate_neuron_opn_test.py b/brainpy_state/_nest_neuron/rate_neuron_opn_test.py
index 4ee28ca0..a8a951a9 100644
--- a/brainpy_state/_nest_neuron/rate_neuron_opn_test.py
+++ b/brainpy_state/_nest_neuron/rate_neuron_opn_test.py
@@ -29,7 +29,7 @@
from brainpy.state import lin_rate_opn, rate_neuron_opn
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
class TestRateNeuronOPN(unittest.TestCase):
diff --git a/brainpy_state/_nest_neuron/rate_transformer_node.py b/brainpy_state/_nest_neuron/rate_transformer_node.py
index 5aee0f6d..d1c53b8e 100644
--- a/brainpy_state/_nest_neuron/rate_transformer_node.py
+++ b/brainpy_state/_nest_neuron/rate_transformer_node.py
@@ -25,7 +25,7 @@
import numpy as np
from brainstate.typing import Size
-from brainpy_state._nest_base._base import NESTNeuron
+from brainpy_state._nest_base.base import NESTNeuron
__all__ = [
'rate_transformer_node',
diff --git a/brainpy_state/_nest_neuron/rate_transformer_node_test.py b/brainpy_state/_nest_neuron/rate_transformer_node_test.py
index f6c97561..746750b3 100644
--- a/brainpy_state/_nest_neuron/rate_transformer_node_test.py
+++ b/brainpy_state/_nest_neuron/rate_transformer_node_test.py
@@ -28,7 +28,7 @@
from brainpy.state import rate_transformer_node
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
class TestRateTransformerNode(unittest.TestCase):
diff --git a/brainpy_state/_nest_neuron/siegert_neuron.py b/brainpy_state/_nest_neuron/siegert_neuron.py
index 09dc7e17..a736d4ad 100644
--- a/brainpy_state/_nest_neuron/siegert_neuron.py
+++ b/brainpy_state/_nest_neuron/siegert_neuron.py
@@ -27,8 +27,8 @@
import jax.scipy.special as jax_special
from brainstate.typing import ArrayLike, Size
-from brainpy_state._nest_base._base import NESTNeuron
-from brainpy_state._nest_base._utils import is_tracer, cond_any
+from brainpy_state._nest_base.base import NESTNeuron
+from brainpy_state._nest_base.utils import is_tracer, cond_any
__all__ = [
'siegert_neuron',
diff --git a/brainpy_state/_nest_neuron/siegert_neuron_test.py b/brainpy_state/_nest_neuron/siegert_neuron_test.py
index e573eee4..42b62eb3 100644
--- a/brainpy_state/_nest_neuron/siegert_neuron_test.py
+++ b/brainpy_state/_nest_neuron/siegert_neuron_test.py
@@ -29,7 +29,7 @@
from brainpy.state import siegert_neuron
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
class TestSiegertNeuron(unittest.TestCase):
diff --git a/brainpy_state/_nest_neuron/sigmoid_rate.py b/brainpy_state/_nest_neuron/sigmoid_rate.py
index 29b4c4a6..40f25eef 100644
--- a/brainpy_state/_nest_neuron/sigmoid_rate.py
+++ b/brainpy_state/_nest_neuron/sigmoid_rate.py
@@ -26,7 +26,7 @@
from brainstate.typing import ArrayLike, Size
from brainpy_state._nest_neuron.lin_rate import _lin_rate_base
-from brainpy_state._nest_base._utils import is_tracer
+from brainpy_state._nest_base.utils import is_tracer
__all__ = [
'sigmoid_rate_ipn',
diff --git a/brainpy_state/_nest_neuron/sigmoid_rate_gg_1998.py b/brainpy_state/_nest_neuron/sigmoid_rate_gg_1998.py
index 852efebd..c9aa39b6 100644
--- a/brainpy_state/_nest_neuron/sigmoid_rate_gg_1998.py
+++ b/brainpy_state/_nest_neuron/sigmoid_rate_gg_1998.py
@@ -26,7 +26,7 @@
from brainstate.typing import ArrayLike, Size
from brainpy_state._nest_neuron.lin_rate import _lin_rate_base
-from brainpy_state._nest_base._utils import is_tracer
+from brainpy_state._nest_base.utils import is_tracer
__all__ = [
'sigmoid_rate_gg_1998_ipn',
diff --git a/brainpy_state/_nest_neuron/sigmoid_rate_gg_1998_test.py b/brainpy_state/_nest_neuron/sigmoid_rate_gg_1998_test.py
index 5ecca7aa..0c44a91b 100644
--- a/brainpy_state/_nest_neuron/sigmoid_rate_gg_1998_test.py
+++ b/brainpy_state/_nest_neuron/sigmoid_rate_gg_1998_test.py
@@ -29,7 +29,7 @@
from brainpy.state import sigmoid_rate_gg_1998_ipn
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _is_nest_available():
diff --git a/brainpy_state/_nest_neuron/sigmoid_rate_test.py b/brainpy_state/_nest_neuron/sigmoid_rate_test.py
index 21d84fb5..00b4bfa8 100644
--- a/brainpy_state/_nest_neuron/sigmoid_rate_test.py
+++ b/brainpy_state/_nest_neuron/sigmoid_rate_test.py
@@ -28,7 +28,7 @@
from brainpy.state import sigmoid_rate_ipn
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _is_nest_available():
diff --git a/brainpy_state/_nest_neuron/tanh_rate.py b/brainpy_state/_nest_neuron/tanh_rate.py
index 67594f1a..28d20bf4 100644
--- a/brainpy_state/_nest_neuron/tanh_rate.py
+++ b/brainpy_state/_nest_neuron/tanh_rate.py
@@ -26,7 +26,7 @@
from brainstate.typing import ArrayLike, Size
from brainpy_state._nest_neuron.lin_rate import _lin_rate_base
-from brainpy_state._nest_base._utils import is_tracer
+from brainpy_state._nest_base.utils import is_tracer
__all__ = [
'tanh_rate_ipn',
diff --git a/brainpy_state/_nest_neuron/tanh_rate_test.py b/brainpy_state/_nest_neuron/tanh_rate_test.py
index a25fd1f3..98ab43b4 100644
--- a/brainpy_state/_nest_neuron/tanh_rate_test.py
+++ b/brainpy_state/_nest_neuron/tanh_rate_test.py
@@ -29,7 +29,7 @@
from brainpy.state import tanh_rate_ipn, tanh_rate_opn
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _is_nest_available():
diff --git a/brainpy_state/_nest_neuron/threshold_lin_rate.py b/brainpy_state/_nest_neuron/threshold_lin_rate.py
index 2ff294e0..e99a9a7d 100644
--- a/brainpy_state/_nest_neuron/threshold_lin_rate.py
+++ b/brainpy_state/_nest_neuron/threshold_lin_rate.py
@@ -26,7 +26,7 @@
from brainstate.typing import ArrayLike, Size
from brainpy_state._nest_neuron.lin_rate import _lin_rate_base
-from brainpy_state._nest_base._utils import is_tracer
+from brainpy_state._nest_base.utils import is_tracer
__all__ = [
'threshold_lin_rate_ipn',
diff --git a/brainpy_state/_nest_neuron/threshold_lin_rate_test.py b/brainpy_state/_nest_neuron/threshold_lin_rate_test.py
index a0ff90b2..5e5488ca 100644
--- a/brainpy_state/_nest_neuron/threshold_lin_rate_test.py
+++ b/brainpy_state/_nest_neuron/threshold_lin_rate_test.py
@@ -28,7 +28,7 @@
from brainpy.state import threshold_lin_rate_ipn, threshold_lin_rate_opn
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _is_nest_available():
diff --git a/brainpy_state/_nest_plasticity/clopath_synapse.py b/brainpy_state/_nest_plasticity/clopath_synapse.py
index b61e72e1..c64212bb 100644
--- a/brainpy_state/_nest_plasticity/clopath_synapse.py
+++ b/brainpy_state/_nest_plasticity/clopath_synapse.py
@@ -3,7 +3,7 @@
Rebuilt as a frozen parameter spec plus a pure, vectorized
``update(state, ctx) -> (new_state, w_eff)`` rule kernel on the
-:class:`~brainpy_state._nest_network._event_plastic.VoltageCoupledPlasticProj`
+:class:`~brainpy_state._nest_network.event_plastic.VoltageCoupledPlasticProj`
substrate (primitive #2). The substrate maintains the per-pre-neuron presynaptic
trace ``x_bar`` (``pre_trace_tau=tau_x``) and, via the **post-state reader**,
samples the post neuron's membrane and low-pass filtered voltages per edge each
@@ -13,14 +13,14 @@
the voltage-based rule of Clopath et al. (2010).
"""
from __future__ import annotations
-from brainpy_state._nest_base._base import NESTPlasticity
+from brainpy_state._nest_base.base import NESTPlasticity
import jax.numpy as jnp
import numpy as np
import brainunit as u
from brainstate.typing import ArrayLike
-from brainpy_state._nest_base._plastic_base import (
+from brainpy_state._nest_base.plastic_base import (
frozen, to_ms, to_scalar_float, unit_of,
validate_delay, validate_receptor_type,
)
diff --git a/brainpy_state/_nest_plasticity/clopath_synapse_rule_test.py b/brainpy_state/_nest_plasticity/clopath_synapse_rule_test.py
index 0cf11fb3..2fe3690e 100644
--- a/brainpy_state/_nest_plasticity/clopath_synapse_rule_test.py
+++ b/brainpy_state/_nest_plasticity/clopath_synapse_rule_test.py
@@ -15,9 +15,9 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
-from brainpy_state._nest_network._event_plastic import KernelContext # noqa: E402
+from brainpy_state._nest_network.event_plastic import KernelContext # noqa: E402
from brainpy_state._nest_plasticity.clopath_synapse import clopath_synapse # noqa: E402
# NEST defaults
diff --git a/brainpy_state/_nest_plasticity/ht_synapse.py b/brainpy_state/_nest_plasticity/ht_synapse.py
index 4749cd3a..75dccec8 100644
--- a/brainpy_state/_nest_plasticity/ht_synapse.py
+++ b/brainpy_state/_nest_plasticity/ht_synapse.py
@@ -3,7 +3,7 @@
Rebuilt as a frozen parameter spec plus a pure, vectorized
``update(state, ctx) -> (new_state, w_eff)`` rule kernel on
-:class:`~brainpy_state._nest_network._event_plastic.EventPlasticProj`. The Hill-Tononi
+:class:`~brainpy_state._nest_network.event_plastic.EventPlasticProj`. The Hill-Tononi
(2005) model is **depression-only and presynaptic**: a normalized vesicle pool
:math:`P \in [0, 1]` recovers exponentially toward ``1`` between spikes and
depletes multiplicatively on each presynaptic spike; the delivered amplitude is
@@ -13,13 +13,13 @@
imperative implementation lived in this same module (legacy ``NESTSynapse`` base).
"""
from __future__ import annotations
-from brainpy_state._nest_base._base import NESTPlasticity
+from brainpy_state._nest_base.base import NESTPlasticity
import jax.numpy as jnp
import brainunit as u
from brainstate.typing import ArrayLike
-from brainpy_state._nest_base._plastic_base import (
+from brainpy_state._nest_base.plastic_base import (
frozen, to_ms, to_scalar_float, to_unit_interval, unit_of,
validate_delay, validate_receptor_type, weight_to_pa,
)
diff --git a/brainpy_state/_nest_plasticity/ht_synapse_rule_test.py b/brainpy_state/_nest_plasticity/ht_synapse_rule_test.py
index e007daa1..2293b436 100644
--- a/brainpy_state/_nest_plasticity/ht_synapse_rule_test.py
+++ b/brainpy_state/_nest_plasticity/ht_synapse_rule_test.py
@@ -20,10 +20,10 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import ht_synapse
-from brainpy_state._nest_network._event_plastic import KernelContext
+from brainpy_state._nest_network.event_plastic import KernelContext
def _ctx(pre_spike, t, E=1, dt=0.1):
diff --git a/brainpy_state/_nest_plasticity/jonke_synapse.py b/brainpy_state/_nest_plasticity/jonke_synapse.py
index 36c09635..7fbb80a8 100644
--- a/brainpy_state/_nest_plasticity/jonke_synapse.py
+++ b/brainpy_state/_nest_plasticity/jonke_synapse.py
@@ -3,19 +3,19 @@
Rebuilt as a frozen parameter spec plus a pure, vectorized
``update(state, ctx) -> (new_state, w_eff)`` rule kernel on
-:class:`~brainpy_state._nest_network._event_plastic.EventPlasticProj`. The Jonke et al.
+:class:`~brainpy_state._nest_network.event_plastic.EventPlasticProj`. The Jonke et al.
(2015) rule generalises pair STDP with an **exponential weight factor**
:math:`\Phi_\pm(w) = \exp(\mu_\pm w)` on each side plus a constant **offset**
:math:`\beta` (a heterosynaptic / activity-independent bias).
"""
from __future__ import annotations
-from brainpy_state._nest_base._base import NESTPlasticity
+from brainpy_state._nest_base.base import NESTPlasticity
import jax.numpy as jnp
import brainunit as u
from brainstate.typing import ArrayLike
-from brainpy_state._nest_base._plastic_base import (
+from brainpy_state._nest_base.plastic_base import (
frozen, to_ms, to_scalar_float, unit_of,
validate_delay, validate_receptor_type, weight_to_pa,
)
diff --git a/brainpy_state/_nest_plasticity/jonke_synapse_rule_test.py b/brainpy_state/_nest_plasticity/jonke_synapse_rule_test.py
index b785a66a..4b7ca853 100644
--- a/brainpy_state/_nest_plasticity/jonke_synapse_rule_test.py
+++ b/brainpy_state/_nest_plasticity/jonke_synapse_rule_test.py
@@ -21,10 +21,10 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import jonke_synapse
-from brainpy_state._nest_network._event_plastic import KernelContext
+from brainpy_state._nest_network.event_plastic import KernelContext
def _ctx(pre_spike, post_spike, pre_trace, post_trace, E=1, t=10.0, dt=1.0):
diff --git a/brainpy_state/_nest_plasticity/stdp_dopamine_synapse.py b/brainpy_state/_nest_plasticity/stdp_dopamine_synapse.py
index 9645d244..30f715b4 100644
--- a/brainpy_state/_nest_plasticity/stdp_dopamine_synapse.py
+++ b/brainpy_state/_nest_plasticity/stdp_dopamine_synapse.py
@@ -3,7 +3,7 @@
Rebuilt as a frozen parameter spec plus a pure, vectorized
``update(state, ctx) -> (new_state, w_eff)`` rule kernel on the
-:class:`~brainpy_state._nest_network._event_plastic.VoltageCoupledPlasticProj`
+:class:`~brainpy_state._nest_network.event_plastic.VoltageCoupledPlasticProj`
substrate (primitive #2). Two ingredients drive the weight:
* a **per-edge eligibility trace** ``c`` (cluster-05 ``edge_state_init`` machinery)
@@ -22,14 +22,14 @@
send/trigger sampling times (the cluster-04 "online <-> deferred equality").
"""
from __future__ import annotations
-from brainpy_state._nest_base._base import NESTPlasticity
+from brainpy_state._nest_base.base import NESTPlasticity
import jax.numpy as jnp
import numpy as np
import brainunit as u
from brainstate.typing import ArrayLike
-from brainpy_state._nest_base._plastic_base import (
+from brainpy_state._nest_base.plastic_base import (
to_ms, to_scalar_float, unit_of, validate_delay, validate_receptor_type, weight_to_pa,
)
diff --git a/brainpy_state/_nest_plasticity/stdp_dopamine_synapse_rule_test.py b/brainpy_state/_nest_plasticity/stdp_dopamine_synapse_rule_test.py
index 51fecba8..5d16d3ad 100644
--- a/brainpy_state/_nest_plasticity/stdp_dopamine_synapse_rule_test.py
+++ b/brainpy_state/_nest_plasticity/stdp_dopamine_synapse_rule_test.py
@@ -19,9 +19,9 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
-from brainpy_state._nest_network._event_plastic import KernelContext # noqa: E402
+from brainpy_state._nest_network.event_plastic import KernelContext # noqa: E402
from brainpy_state._nest_plasticity.stdp_dopamine_synapse import stdp_dopamine_synapse # noqa: E402
# NEST defaults (stdp_dopamine_synapse.cpp:45-56)
diff --git a/brainpy_state/_nest_plasticity/stdp_facetshw_synapse_hom.py b/brainpy_state/_nest_plasticity/stdp_facetshw_synapse_hom.py
index 28210455..ff3b2799 100644
--- a/brainpy_state/_nest_plasticity/stdp_facetshw_synapse_hom.py
+++ b/brainpy_state/_nest_plasticity/stdp_facetshw_synapse_hom.py
@@ -3,7 +3,7 @@
Rebuilt as a frozen parameter spec plus a pure, vectorized
``update(state, ctx) -> (new_state, w_eff)`` rule kernel on
-:class:`~brainpy_state._nest_network._event_plastic.EventPlasticProj`. Unlike the pair-based
+:class:`~brainpy_state._nest_network.event_plastic.EventPlasticProj`. Unlike the pair-based
``stdp_*`` models this is a *hardware* model (Schemmel et al. 2006; Pfeil et al. 2012):
the synapse holds a 4-bit discrete weight and two analogue charges, and a periodic
controller (the "readout cycle") quantises the weight, compares the charges to
@@ -23,14 +23,14 @@
readout.
"""
from __future__ import annotations
-from brainpy_state._nest_base._base import NESTPlasticity
+from brainpy_state._nest_base.base import NESTPlasticity
import jax.numpy as jnp
import numpy as np
import brainunit as u
from brainstate.typing import ArrayLike
-from brainpy_state._nest_base._plastic_base import (
+from brainpy_state._nest_base.plastic_base import (
to_ms, to_scalar_float, to_scalar_int, unit_of,
validate_delay, validate_receptor_type, weight_to_pa,
)
diff --git a/brainpy_state/_nest_plasticity/stdp_facetshw_synapse_hom_rule_test.py b/brainpy_state/_nest_plasticity/stdp_facetshw_synapse_hom_rule_test.py
index bce61ffd..d4271f7b 100644
--- a/brainpy_state/_nest_plasticity/stdp_facetshw_synapse_hom_rule_test.py
+++ b/brainpy_state/_nest_plasticity/stdp_facetshw_synapse_hom_rule_test.py
@@ -22,10 +22,10 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import stdp_facetshw_synapse_hom
-from brainpy_state._nest_network._event_plastic import EventPlasticProj, KernelContext
+from brainpy_state._nest_network.event_plastic import EventPlasticProj, KernelContext
WPLE = 100.0 / 15.0 # weight_per_lut_entry for default Wmax=100, 16-entry LUT
LUT0 = [2, 3, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, 15]
diff --git a/brainpy_state/_nest_plasticity/stdp_nn_pre_centered_synapse.py b/brainpy_state/_nest_plasticity/stdp_nn_pre_centered_synapse.py
index 8416f3d5..6088d1dc 100644
--- a/brainpy_state/_nest_plasticity/stdp_nn_pre_centered_synapse.py
+++ b/brainpy_state/_nest_plasticity/stdp_nn_pre_centered_synapse.py
@@ -3,7 +3,7 @@
Rebuilt as a frozen parameter spec plus a pure, vectorized
``update(state, ctx) -> (new_state, w_eff)`` rule kernel on
-:class:`~brainpy_state._nest_network._event_plastic.EventPlasticProj`. In the
+:class:`~brainpy_state._nest_network.event_plastic.EventPlasticProj`. In the
presynaptic-centered scheme (Morrison, Diesmann & Gerstner 2008, fig. 7B) the
presynaptic trace ``Kplus`` **accumulates** (``+1`` per pre, decays at ``tau_plus``)
but is **reset to 0 on every post spike** (``stdp_nn_pre_centered_synapse.h:69-74``):
@@ -16,13 +16,13 @@
(``post_trace_mode = 'nearest'``).
"""
from __future__ import annotations
-from brainpy_state._nest_base._base import NESTPlasticity
+from brainpy_state._nest_base.base import NESTPlasticity
import jax.numpy as jnp
import brainunit as u
from brainstate.typing import ArrayLike
-from brainpy_state._nest_base._plastic_base import (
+from brainpy_state._nest_base.plastic_base import (
frozen, to_ms, to_scalar_float, unit_of,
validate_delay, validate_receptor_type, weight_to_pa,
)
diff --git a/brainpy_state/_nest_plasticity/stdp_nn_pre_centered_synapse_rule_test.py b/brainpy_state/_nest_plasticity/stdp_nn_pre_centered_synapse_rule_test.py
index 50461deb..b5104c68 100644
--- a/brainpy_state/_nest_plasticity/stdp_nn_pre_centered_synapse_rule_test.py
+++ b/brainpy_state/_nest_plasticity/stdp_nn_pre_centered_synapse_rule_test.py
@@ -23,11 +23,11 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import (stdp_nn_pre_centered_synapse, stdp_nn_symm_synapse,
stdp_synapse)
-from brainpy_state._nest_network._event_plastic import EventPlasticProj, KernelContext
+from brainpy_state._nest_network.event_plastic import EventPlasticProj, KernelContext
TAU = 20.0
diff --git a/brainpy_state/_nest_plasticity/stdp_nn_restr_synapse.py b/brainpy_state/_nest_plasticity/stdp_nn_restr_synapse.py
index 619a09eb..e6de499f 100644
--- a/brainpy_state/_nest_plasticity/stdp_nn_restr_synapse.py
+++ b/brainpy_state/_nest_plasticity/stdp_nn_restr_synapse.py
@@ -3,7 +3,7 @@
Rebuilt as a frozen parameter spec plus a pure, vectorized
``update(state, ctx) -> (new_state, w_eff)`` rule kernel on
-:class:`~brainpy_state._nest_network._event_plastic.EventPlasticProj`. The *restricted*
+:class:`~brainpy_state._nest_network.event_plastic.EventPlasticProj`. The *restricted*
symmetric nearest-neighbour scheme (Morrison, Diesmann & Gerstner 2008, fig. 7C) is
the symmetric scheme plus a one-pairing-per-spike restriction: a post spike
facilitates with the nearest preceding pre **only if a pre has occurred since the
@@ -17,13 +17,13 @@
pairs at most once.
"""
from __future__ import annotations
-from brainpy_state._nest_base._base import NESTPlasticity
+from brainpy_state._nest_base.base import NESTPlasticity
import jax.numpy as jnp
import brainunit as u
from brainstate.typing import ArrayLike
-from brainpy_state._nest_base._plastic_base import (
+from brainpy_state._nest_base.plastic_base import (
frozen, to_ms, to_scalar_float, unit_of,
validate_delay, validate_receptor_type, weight_to_pa,
)
diff --git a/brainpy_state/_nest_plasticity/stdp_nn_restr_synapse_rule_test.py b/brainpy_state/_nest_plasticity/stdp_nn_restr_synapse_rule_test.py
index af10059d..1a32a921 100644
--- a/brainpy_state/_nest_plasticity/stdp_nn_restr_synapse_rule_test.py
+++ b/brainpy_state/_nest_plasticity/stdp_nn_restr_synapse_rule_test.py
@@ -24,10 +24,10 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import stdp_nn_restr_synapse, stdp_nn_symm_synapse
-from brainpy_state._nest_network._event_plastic import EventPlasticProj, KernelContext
+from brainpy_state._nest_network.event_plastic import EventPlasticProj, KernelContext
def _ctx(pre_spike, post_spike, pre_trace, post_trace, E=1, t=10.0, dt=1.0):
diff --git a/brainpy_state/_nest_plasticity/stdp_nn_symm_synapse.py b/brainpy_state/_nest_plasticity/stdp_nn_symm_synapse.py
index 84072b6b..06ded7da 100644
--- a/brainpy_state/_nest_plasticity/stdp_nn_symm_synapse.py
+++ b/brainpy_state/_nest_plasticity/stdp_nn_symm_synapse.py
@@ -3,7 +3,7 @@
Rebuilt as a frozen parameter spec plus a pure, vectorized
``update(state, ctx) -> (new_state, w_eff)`` rule kernel on
-:class:`~brainpy_state._nest_network._event_plastic.EventPlasticProj`. The *symmetric*
+:class:`~brainpy_state._nest_network.event_plastic.EventPlasticProj`. The *symmetric*
nearest-neighbour pairing scheme (Morrison, Diesmann & Gerstner 2008, fig. 7A) pairs
each spike only with its nearest partner on the other side: a post spike facilitates
with the nearest preceding pre spike, a pre spike depresses with the nearest preceding
@@ -14,13 +14,13 @@
lives entirely in what the substrate *stores*.
"""
from __future__ import annotations
-from brainpy_state._nest_base._base import NESTPlasticity
+from brainpy_state._nest_base.base import NESTPlasticity
import jax.numpy as jnp
import brainunit as u
from brainstate.typing import ArrayLike
-from brainpy_state._nest_base._plastic_base import (
+from brainpy_state._nest_base.plastic_base import (
frozen, to_ms, to_scalar_float, unit_of,
validate_delay, validate_receptor_type, weight_to_pa,
)
diff --git a/brainpy_state/_nest_plasticity/stdp_nn_symm_synapse_rule_test.py b/brainpy_state/_nest_plasticity/stdp_nn_symm_synapse_rule_test.py
index af73bfa3..6d0d2dc0 100644
--- a/brainpy_state/_nest_plasticity/stdp_nn_symm_synapse_rule_test.py
+++ b/brainpy_state/_nest_plasticity/stdp_nn_symm_synapse_rule_test.py
@@ -19,10 +19,10 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import stdp_nn_symm_synapse, stdp_synapse
-from brainpy_state._nest_network._event_plastic import EventPlasticProj, KernelContext
+from brainpy_state._nest_network.event_plastic import EventPlasticProj, KernelContext
def _ctx(pre_spike, post_spike, pre_trace, post_trace, E=1, t=10.0, dt=1.0):
diff --git a/brainpy_state/_nest_plasticity/stdp_pl_synapse_hom.py b/brainpy_state/_nest_plasticity/stdp_pl_synapse_hom.py
index 322b5c3e..cae5ef1c 100644
--- a/brainpy_state/_nest_plasticity/stdp_pl_synapse_hom.py
+++ b/brainpy_state/_nest_plasticity/stdp_pl_synapse_hom.py
@@ -3,7 +3,7 @@
Rebuilt as a frozen parameter spec plus a pure, vectorized
``update(state, ctx) -> (new_state, w_eff)`` rule kernel on
-:class:`~brainpy_state._nest_network._event_plastic.EventPlasticProj`. Power-law STDP
+:class:`~brainpy_state._nest_network.event_plastic.EventPlasticProj`. Power-law STDP
(Morrison et al. 2007): potentiation is **multiplicative and sub-linear** in the
weight (:math:`w^\mu`, :math:`\mu < 1`), depression is **linear** in the weight,
and there is **no upper bound** ``Wmax`` — the sub-linear potentiation provides
@@ -12,13 +12,13 @@
rule-level.
"""
from __future__ import annotations
-from brainpy_state._nest_base._base import NESTPlasticity
+from brainpy_state._nest_base.base import NESTPlasticity
import jax.numpy as jnp
import brainunit as u
from brainstate.typing import ArrayLike
-from brainpy_state._nest_base._plastic_base import (
+from brainpy_state._nest_base.plastic_base import (
frozen, to_ms, to_scalar_float, unit_of,
validate_delay, validate_receptor_type, weight_to_pa,
)
diff --git a/brainpy_state/_nest_plasticity/stdp_pl_synapse_hom_rule_test.py b/brainpy_state/_nest_plasticity/stdp_pl_synapse_hom_rule_test.py
index 4cf4c838..d62e6c17 100644
--- a/brainpy_state/_nest_plasticity/stdp_pl_synapse_hom_rule_test.py
+++ b/brainpy_state/_nest_plasticity/stdp_pl_synapse_hom_rule_test.py
@@ -17,10 +17,10 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import stdp_pl_synapse_hom
-from brainpy_state._nest_network._event_plastic import KernelContext
+from brainpy_state._nest_network.event_plastic import KernelContext
def _ctx(pre_spike, post_spike, pre_trace, post_trace, E=1, t=10.0, dt=1.0):
diff --git a/brainpy_state/_nest_plasticity/stdp_synapse.py b/brainpy_state/_nest_plasticity/stdp_synapse.py
index 54bf594c..f65d8d12 100644
--- a/brainpy_state/_nest_plasticity/stdp_synapse.py
+++ b/brainpy_state/_nest_plasticity/stdp_synapse.py
@@ -3,7 +3,7 @@
Rebuilt as a frozen parameter spec plus a pure, vectorized
``update(state, ctx) -> (new_state, w_eff)`` rule kernel on
-:class:`~brainpy_state._nest_network._event_plastic.EventPlasticProj`. The substrate
+:class:`~brainpy_state._nest_network.event_plastic.EventPlasticProj`. The substrate
maintains the per-pre-neuron ``K+`` trace (``pre_trace_tau=tau_plus``) and the
per-post-neuron ``K-`` trace (``post_trace_tau=tau_minus``); the kernel applies
**potentiation on the post spike** (using ``K+``) and **depression on the pre
@@ -12,13 +12,13 @@
time — where NEST's ``weight_recorder`` samples.
"""
from __future__ import annotations
-from brainpy_state._nest_base._base import NESTPlasticity
+from brainpy_state._nest_base.base import NESTPlasticity
import jax.numpy as jnp
import brainunit as u
from brainstate.typing import ArrayLike
-from brainpy_state._nest_base._plastic_base import (
+from brainpy_state._nest_base.plastic_base import (
frozen, to_ms, to_scalar_float, unit_of,
validate_delay, validate_receptor_type, weight_to_pa,
)
diff --git a/brainpy_state/_nest_plasticity/stdp_synapse_hom.py b/brainpy_state/_nest_plasticity/stdp_synapse_hom.py
index fe9f16f7..7e6dfba8 100644
--- a/brainpy_state/_nest_plasticity/stdp_synapse_hom.py
+++ b/brainpy_state/_nest_plasticity/stdp_synapse_hom.py
@@ -2,7 +2,7 @@
"""NEST-faithful ``stdp_synapse_hom`` — homogeneous-parameter pair STDP spec.
Rebuilt as a thin reuse of :class:`~brainpy_state._nest_plasticity.stdp_synapse.stdp_synapse`
-on the frozen :class:`~brainpy_state._nest_network._event_plastic.EventPlasticProj`
+on the frozen :class:`~brainpy_state._nest_network.event_plastic.EventPlasticProj`
substrate. In NEST ``stdp_synapse_hom`` stores the plasticity parameters
(``lambda``, ``alpha``, ``mu_plus``, ``mu_minus``, ``tau_plus``, ``Wmax``) as
*common* properties shared by every synapse of the model (a memory optimisation,
diff --git a/brainpy_state/_nest_plasticity/stdp_synapse_hom_rule_test.py b/brainpy_state/_nest_plasticity/stdp_synapse_hom_rule_test.py
index 8c8922b7..46e93c0d 100644
--- a/brainpy_state/_nest_plasticity/stdp_synapse_hom_rule_test.py
+++ b/brainpy_state/_nest_plasticity/stdp_synapse_hom_rule_test.py
@@ -18,10 +18,10 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import stdp_synapse, stdp_synapse_hom
-from brainpy_state._nest_network._event_plastic import KernelContext
+from brainpy_state._nest_network.event_plastic import KernelContext
def _ctx(pre_spike, post_spike, pre_trace, post_trace, E=1, t=10.0, dt=1.0):
diff --git a/brainpy_state/_nest_plasticity/stdp_synapse_rule_test.py b/brainpy_state/_nest_plasticity/stdp_synapse_rule_test.py
index 1ad57d55..a07f628e 100644
--- a/brainpy_state/_nest_plasticity/stdp_synapse_rule_test.py
+++ b/brainpy_state/_nest_plasticity/stdp_synapse_rule_test.py
@@ -18,10 +18,10 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import stdp_synapse
-from brainpy_state._nest_network._event_plastic import KernelContext
+from brainpy_state._nest_network.event_plastic import KernelContext
def _ctx(pre_spike, post_spike, pre_trace, post_trace, E=1, t=10.0, dt=1.0):
diff --git a/brainpy_state/_nest_plasticity/stdp_triplet_synapse.py b/brainpy_state/_nest_plasticity/stdp_triplet_synapse.py
index 3a74ca8b..f3a6a7f5 100644
--- a/brainpy_state/_nest_plasticity/stdp_triplet_synapse.py
+++ b/brainpy_state/_nest_plasticity/stdp_triplet_synapse.py
@@ -3,7 +3,7 @@
Rebuilt as a frozen parameter spec plus a pure, vectorized
``update(state, ctx) -> (new_state, w_eff)`` rule kernel on
-:class:`~brainpy_state._nest_network._event_plastic.EventPlasticProj`. The triplet rule
+:class:`~brainpy_state._nest_network.event_plastic.EventPlasticProj`. The triplet rule
(Pfister & Gerstner, 2006) augments pair STDP with a **second, slower trace on each
side**: potentiation at a post spike is scaled by the slow *post* trace and
depression at a pre spike by the slow *pre* trace, capturing frequency-dependent
@@ -12,13 +12,13 @@
``(fast, slow)`` so the substrate allocates two per-neuron trace columns per side.
"""
from __future__ import annotations
-from brainpy_state._nest_base._base import NESTPlasticity
+from brainpy_state._nest_base.base import NESTPlasticity
import jax.numpy as jnp
import brainunit as u
from brainstate.typing import ArrayLike
-from brainpy_state._nest_base._plastic_base import (
+from brainpy_state._nest_base.plastic_base import (
frozen, to_ms, to_scalar_float, unit_of,
validate_delay, validate_receptor_type, weight_to_pa,
)
diff --git a/brainpy_state/_nest_plasticity/stdp_triplet_synapse_rule_test.py b/brainpy_state/_nest_plasticity/stdp_triplet_synapse_rule_test.py
index f361b304..69421f2b 100644
--- a/brainpy_state/_nest_plasticity/stdp_triplet_synapse_rule_test.py
+++ b/brainpy_state/_nest_plasticity/stdp_triplet_synapse_rule_test.py
@@ -23,10 +23,10 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import stdp_triplet_synapse
-from brainpy_state._nest_network._event_plastic import KernelContext
+from brainpy_state._nest_network.event_plastic import KernelContext
def _ctx(pre_spike, post_spike, r, o, E=1, t=10.0, dt=0.1):
diff --git a/brainpy_state/_nest_plasticity/urbanczik_synapse.py b/brainpy_state/_nest_plasticity/urbanczik_synapse.py
index d86c30c4..150d4aa3 100644
--- a/brainpy_state/_nest_plasticity/urbanczik_synapse.py
+++ b/brainpy_state/_nest_plasticity/urbanczik_synapse.py
@@ -3,7 +3,7 @@
Rebuilt as a frozen parameter spec plus a pure, vectorized
``update(state, ctx) -> (new_state, w_eff)`` rule kernel on the
-:class:`~brainpy_state._nest_network._event_plastic.VoltageCoupledPlasticProj`
+:class:`~brainpy_state._nest_network.event_plastic.VoltageCoupledPlasticProj`
substrate (primitive #2). The Urbanczik-Senn rule (Urbanczik & Senn, 2014) makes
dendritic synapses learn so the dendritic potential predicts the somatically
imposed firing rate: each synapse integrates the product of its presynaptic trace
@@ -53,14 +53,14 @@
``nestkernel/urbanczik_archiving_node_impl.h``.
"""
from __future__ import annotations
-from brainpy_state._nest_base._base import NESTPlasticity
+from brainpy_state._nest_base.base import NESTPlasticity
import jax.numpy as jnp
import numpy as np
import brainunit as u
from brainstate.typing import ArrayLike
-from brainpy_state._nest_base._plastic_base import (
+from brainpy_state._nest_base.plastic_base import (
to_ms, to_scalar_float, unit_of, validate_delay, validate_receptor_type,
weight_to_pa,
)
diff --git a/brainpy_state/_nest_plasticity/urbanczik_synapse_test.py b/brainpy_state/_nest_plasticity/urbanczik_synapse_test.py
index 33f04ae9..2547e41d 100644
--- a/brainpy_state/_nest_plasticity/urbanczik_synapse_test.py
+++ b/brainpy_state/_nest_plasticity/urbanczik_synapse_test.py
@@ -3,7 +3,7 @@
The rebuild is a frozen parameter spec plus a pure
``update(state, ctx) -> (new_state, w_eff)`` kernel on the
-:class:`~brainpy_state._nest_network._event_plastic.VoltageCoupledPlasticProj`
+:class:`~brainpy_state._nest_network.event_plastic.VoltageCoupledPlasticProj`
substrate. These NEST-free tests pin:
* the spec declarations the substrate dispatches on (two pre-traces ``(tau_L,
@@ -27,10 +27,10 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_plasticity.urbanczik_synapse import urbanczik_synapse
-from brainpy_state._nest_network._event_plastic import KernelContext
+from brainpy_state._nest_network.event_plastic import KernelContext
# --------------------------------------------------------------------------
diff --git a/brainpy_state/_nest_plasticity/vogels_sprekeler_synapse.py b/brainpy_state/_nest_plasticity/vogels_sprekeler_synapse.py
index c2f3a4fc..1b7c9ae5 100644
--- a/brainpy_state/_nest_plasticity/vogels_sprekeler_synapse.py
+++ b/brainpy_state/_nest_plasticity/vogels_sprekeler_synapse.py
@@ -3,7 +3,7 @@
Rebuilt as a frozen parameter spec plus a pure, vectorized
``update(state, ctx) -> (new_state, w_eff)`` rule kernel on
-:class:`~brainpy_state._nest_network._event_plastic.EventPlasticProj`. The
+:class:`~brainpy_state._nest_network.event_plastic.EventPlasticProj`. The
Vogels-Sprekeler (2011) rule is a **symmetric** STDP with a **constant**
presynaptic depression, designed to homeostatically balance excitation and
inhibition: every pre↔post pairing potentiates by :math:`\eta K`, and every pre
@@ -11,13 +11,13 @@
postsynaptic firing rate toward a target set by :math:`\alpha`.
"""
from __future__ import annotations
-from brainpy_state._nest_base._base import NESTPlasticity
+from brainpy_state._nest_base.base import NESTPlasticity
import jax.numpy as jnp
import brainunit as u
from brainstate.typing import ArrayLike
-from brainpy_state._nest_base._plastic_base import (
+from brainpy_state._nest_base.plastic_base import (
frozen, to_ms, to_scalar_float, unit_of,
validate_delay, validate_receptor_type, weight_to_pa,
)
diff --git a/brainpy_state/_nest_plasticity/vogels_sprekeler_synapse_rule_test.py b/brainpy_state/_nest_plasticity/vogels_sprekeler_synapse_rule_test.py
index 982cb31d..2220f3db 100644
--- a/brainpy_state/_nest_plasticity/vogels_sprekeler_synapse_rule_test.py
+++ b/brainpy_state/_nest_plasticity/vogels_sprekeler_synapse_rule_test.py
@@ -20,10 +20,10 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import vogels_sprekeler_synapse
-from brainpy_state._nest_network._event_plastic import KernelContext
+from brainpy_state._nest_network.event_plastic import KernelContext
def _ctx(pre_spike, post_spike, pre_trace, post_trace, E=1, t=10.0, dt=1.0):
diff --git a/brainpy_state/_nest_spatial/__init__.py b/brainpy_state/_nest_spatial/__init__.py
index d28a224e..4219e527 100644
--- a/brainpy_state/_nest_spatial/__init__.py
+++ b/brainpy_state/_nest_spatial/__init__.py
@@ -22,34 +22,34 @@
# ---------------------------------------------------------------------------
# Position layers
# ---------------------------------------------------------------------------
-from ._layers import Layer, grid, free
+from .layers import Layer, grid, free
# ---------------------------------------------------------------------------
# Distance / displacement
# ---------------------------------------------------------------------------
-from ._distance import displacement, pairwise_distance
+from .distance import displacement, pairwise_distance
# ---------------------------------------------------------------------------
# Distance kernels + the distance sentinel / position expressions
# ---------------------------------------------------------------------------
-from ._kernels import (distance, pos, source_pos, target_pos,
+from .kernels import (distance, pos, source_pos, target_pos,
gaussian, exponential, gamma, gabor, gaussian2D)
# ---------------------------------------------------------------------------
# Spatial masks
# ---------------------------------------------------------------------------
-from ._masks import (circular, spherical, box,
+from .masks import (circular, spherical, box,
rectangular, doughnut, elliptical, ellipsoidal)
# ---------------------------------------------------------------------------
# Connection rule
# ---------------------------------------------------------------------------
-from ._rule import SpatialConnRule, spatial_pairwise_bernoulli
+from .rule import SpatialConnRule, spatial_pairwise_bernoulli
# ---------------------------------------------------------------------------
# Query / dump helpers
# ---------------------------------------------------------------------------
-from ._helpers import (center_element, Distance, nearest_element, select_nodes_by_mask,
+from .helpers import (center_element, Distance, nearest_element, select_nodes_by_mask,
dump_layer_nodes, dump_layer_connections, target_nodes, target_positions)
# ---------------------------------------------------------------------------
# Plot helpers (matplotlib lazily imported inside each function)
# ---------------------------------------------------------------------------
-from ._plot import plot_layer, plot_targets, plot_sources, plot_probability_parameter
+from .plot import plot_layer, plot_targets, plot_sources, plot_probability_parameter
__all__ = [
'Layer',
diff --git a/brainpy_state/_nest_spatial/_distance.py b/brainpy_state/_nest_spatial/distance.py
similarity index 100%
rename from brainpy_state/_nest_spatial/_distance.py
rename to brainpy_state/_nest_spatial/distance.py
diff --git a/brainpy_state/_nest_spatial/_distance_test.py b/brainpy_state/_nest_spatial/distance_test.py
similarity index 94%
rename from brainpy_state/_nest_spatial/_distance_test.py
rename to brainpy_state/_nest_spatial/distance_test.py
index fa91ef00..3cd89622 100644
--- a/brainpy_state/_nest_spatial/_distance_test.py
+++ b/brainpy_state/_nest_spatial/distance_test.py
@@ -6,7 +6,7 @@
import numpy as np
import brainunit as u
-from brainpy_state._nest_spatial._distance import displacement, pairwise_distance
+from brainpy_state._nest_spatial.distance import displacement, pairwise_distance
class TestDistance(unittest.TestCase):
diff --git a/brainpy_state/_nest_spatial/_helpers.py b/brainpy_state/_nest_spatial/helpers.py
similarity index 97%
rename from brainpy_state/_nest_spatial/_helpers.py
rename to brainpy_state/_nest_spatial/helpers.py
index 380c29fc..4acb021a 100644
--- a/brainpy_state/_nest_spatial/_helpers.py
+++ b/brainpy_state/_nest_spatial/helpers.py
@@ -3,7 +3,7 @@
:func:`center_element` and :func:`Distance` are pure layer-level queries. :func:`target_nodes`
and :func:`target_positions` read the *realized* adjacency back out of a built network
-(via :meth:`brainpy_state._nest_network._simulator.Simulator.get_connections`), mirroring NEST's
+(via :meth:`brainpy_state._nest_network.simulator.Simulator.get_connections`), mirroring NEST's
``GetTargetNodes`` / ``GetTargetPositions``.
"""
from __future__ import annotations
@@ -12,8 +12,8 @@
import numpy as np
import brainunit as u
-from brainpy_state._nest_spatial._distance import pairwise_distance
-from brainpy_state._nest_spatial._layers import _LEN, _as_len
+from brainpy_state._nest_spatial.distance import pairwise_distance
+from brainpy_state._nest_spatial.layers import _LEN, _as_len
__all__ = ['center_element', 'Distance', 'nearest_element', 'select_nodes_by_mask',
'dump_layer_nodes', 'dump_layer_connections', 'target_nodes', 'target_positions']
@@ -218,7 +218,7 @@ def target_nodes(sim, source, target):
r"""Realized target indices of each source node (NEST ``GetTargetNodes``).
Reads the built network's adjacency back out (via
- :meth:`~brainpy_state._nest_network._simulator.Simulator.get_connections`) and groups
+ :meth:`~brainpy_state._nest_network.simulator.Simulator.get_connections`) and groups
the realized target indices by source node.
Parameters
diff --git a/brainpy_state/_nest_spatial/_helpers_test.py b/brainpy_state/_nest_spatial/helpers_test.py
similarity index 85%
rename from brainpy_state/_nest_spatial/_helpers_test.py
rename to brainpy_state/_nest_spatial/helpers_test.py
index a5e619d2..433f1cd0 100644
--- a/brainpy_state/_nest_spatial/_helpers_test.py
+++ b/brainpy_state/_nest_spatial/helpers_test.py
@@ -7,12 +7,12 @@
import brainstate
from brainpy_state import Simulator, iaf_psc_alpha
-from brainpy_state._nest_spatial._layers import grid
-from brainpy_state._nest_spatial._distance import pairwise_distance
-from brainpy_state._nest_spatial._masks import circular
-from brainpy_state._nest_spatial._rule import spatial_pairwise_bernoulli
-from brainpy_state._nest_spatial._masks import box
-from brainpy_state._nest_spatial._helpers import (
+from brainpy_state._nest_spatial.layers import grid
+from brainpy_state._nest_spatial.distance import pairwise_distance
+from brainpy_state._nest_spatial.masks import circular
+from brainpy_state._nest_spatial.rule import spatial_pairwise_bernoulli
+from brainpy_state._nest_spatial.masks import box
+from brainpy_state._nest_spatial.helpers import (
center_element, Distance, target_nodes, target_positions,
)
@@ -92,7 +92,7 @@ def _sim(self):
def test_dump_layer_nodes_index_and_coords(self):
import os, tempfile
- from brainpy_state._nest_spatial._helpers import dump_layer_nodes
+ from brainpy_state._nest_spatial.helpers import dump_layer_nodes
sim, pop = self._sim()
path = tempfile.mktemp(suffix='.txt')
text = dump_layer_nodes(sim, pop, path)
@@ -107,7 +107,7 @@ def test_dump_layer_nodes_index_and_coords(self):
def test_dump_layer_connections_displacement_weight_delay(self):
import os, tempfile
- from brainpy_state._nest_spatial._helpers import dump_layer_connections
+ from brainpy_state._nest_spatial.helpers import dump_layer_connections
sim, pop = self._sim()
path = tempfile.mktemp(suffix='.txt')
text = dump_layer_connections(sim, pop, pop, path)
@@ -130,27 +130,27 @@ def setUp(self):
self.layer = grid([3, 1], extent=[3.0, 1.0])
def test_single_location_returns_int(self):
- from brainpy_state._nest_spatial._helpers import nearest_element
+ from brainpy_state._nest_spatial.helpers import nearest_element
out = nearest_element(self.layer, [0.9, 0.0])
self.assertIsInstance(out, int)
self.assertEqual(out, 2)
def test_list_of_locations_returns_list(self):
- from brainpy_state._nest_spatial._helpers import nearest_element
+ from brainpy_state._nest_spatial.helpers import nearest_element
out = nearest_element(self.layer, [[0.9, 0.0], [-0.9, 0.0]])
self.assertEqual(out, [2, 0])
def test_quantity_location(self):
- from brainpy_state._nest_spatial._helpers import nearest_element
+ from brainpy_state._nest_spatial.helpers import nearest_element
self.assertEqual(nearest_element(self.layer, [0.9, 0.0] * u.um), 2)
def test_tie_returns_lowest_index(self):
- from brainpy_state._nest_spatial._helpers import nearest_element
+ from brainpy_state._nest_spatial.helpers import nearest_element
# x = -0.5 is equidistant to node 0 (-1) and node 1 (0); lowest wins.
self.assertEqual(nearest_element(self.layer, [-0.5, 0.0]), 0)
def test_find_all_returns_every_tie(self):
- from brainpy_state._nest_spatial._helpers import nearest_element
+ from brainpy_state._nest_spatial.helpers import nearest_element
out = nearest_element(self.layer, [-0.5, 0.0], find_all=True)
self.assertEqual(out, [0, 1])
@@ -161,20 +161,20 @@ def setUp(self):
self.layer = grid([3, 3], extent=[2.0, 2.0])
def test_circular_at_origin_selects_plus_shape(self):
- from brainpy_state._nest_spatial._helpers import select_nodes_by_mask
- from brainpy_state._nest_spatial._masks import circular
+ from brainpy_state._nest_spatial.helpers import select_nodes_by_mask
+ from brainpy_state._nest_spatial.masks import circular
out = select_nodes_by_mask(self.layer, [0.0, 0.0], circular(0.7))
self.assertEqual(sorted(out), [1, 3, 4, 5, 7])
def test_box_is_directional(self):
- from brainpy_state._nest_spatial._helpers import select_nodes_by_mask
+ from brainpy_state._nest_spatial.helpers import select_nodes_by_mask
# displacement x in [0, 10]: only nodes with x >= 0 (columns 1 and 2).
out = select_nodes_by_mask(self.layer, [0.0, 0.0], box([0.0, -10.0], [10.0, 10.0]))
self.assertEqual(sorted(out), [3, 4, 5, 6, 7, 8])
def test_anchor_offset(self):
- from brainpy_state._nest_spatial._helpers import select_nodes_by_mask
- from brainpy_state._nest_spatial._masks import circular
+ from brainpy_state._nest_spatial.helpers import select_nodes_by_mask
+ from brainpy_state._nest_spatial.masks import circular
# anchored on node 7's coord (0.667, 0); radius 0.3 isolates node 7 alone.
out = select_nodes_by_mask(self.layer, [2.0 / 3.0, 0.0], circular(0.3))
self.assertEqual(sorted(out), [7])
diff --git a/brainpy_state/_nest_spatial/_kernels.py b/brainpy_state/_nest_spatial/kernels.py
similarity index 98%
rename from brainpy_state/_nest_spatial/_kernels.py
rename to brainpy_state/_nest_spatial/kernels.py
index 3607b009..6fe9a1f6 100644
--- a/brainpy_state/_nest_spatial/_kernels.py
+++ b/brainpy_state/_nest_spatial/kernels.py
@@ -10,7 +10,7 @@
expression evaluates, given the rule's bound sliced positions ``pre_pos (n_pre, d)`` /
``post_pos (n_post, d)``, to an ``(n_pre, n_post)`` grid; every kernel exposes
``_eval_pair(pre_pos, post_pos)`` returning the probability grid, which
-:class:`~brainpy_state._nest_spatial._rule.SpatialConnRule` samples (zero seam change).
+:class:`~brainpy_state._nest_spatial.rule.SpatialConnRule` samples (zero seam change).
"""
from __future__ import annotations
@@ -20,8 +20,8 @@
from jax.scipy.special import gammaln
import brainunit as u
-from brainpy_state._nest_spatial._distance import displacement, pairwise_distance
-from brainpy_state._nest_spatial._layers import _LEN, _as_len
+from brainpy_state._nest_spatial.distance import displacement, pairwise_distance
+from brainpy_state._nest_spatial.layers import _LEN, _as_len
__all__ = ['distance', 'pos', 'source_pos', 'target_pos',
'gaussian', 'exponential', 'gamma', 'gabor', 'gaussian2D']
diff --git a/brainpy_state/_nest_spatial/_kernels_test.py b/brainpy_state/_nest_spatial/kernels_test.py
similarity index 88%
rename from brainpy_state/_nest_spatial/_kernels_test.py
rename to brainpy_state/_nest_spatial/kernels_test.py
index 5c6ca6f8..1e31bc90 100644
--- a/brainpy_state/_nest_spatial/_kernels_test.py
+++ b/brainpy_state/_nest_spatial/kernels_test.py
@@ -7,7 +7,7 @@
import numpy as np
import brainunit as u
-from brainpy_state._nest_spatial._kernels import distance, gaussian
+from brainpy_state._nest_spatial.kernels import distance, gaussian
class TestGaussianKernel(unittest.TestCase):
@@ -79,22 +79,22 @@ def test_gaussian_consumes_axis_distance(self):
np.testing.assert_allclose(g, np.exp(-(dx ** 2) / 2.0), atol=1e-6)
def test_source_pos_broadcasts_source_coord(self):
- from brainpy_state._nest_spatial._kernels import source_pos
+ from brainpy_state._nest_spatial.kernels import source_pos
g = np.asarray(u.get_magnitude(source_pos.x._eval_pair(self.pre, self.post).to(u.um)))
np.testing.assert_allclose(g, [[0.0, 0.0], [1.0, 1.0]], atol=1e-6) # rows = pre_x
def test_target_pos_broadcasts_target_coord(self):
- from brainpy_state._nest_spatial._kernels import target_pos
+ from brainpy_state._nest_spatial.kernels import target_pos
g = np.asarray(u.get_magnitude(target_pos.y._eval_pair(self.pre, self.post).to(u.um)))
np.testing.assert_allclose(g, [[0.0, 5.0], [0.0, 5.0]], atol=1e-6) # cols = post_y
def test_pos_in_connect_path_raises(self):
- from brainpy_state._nest_spatial._kernels import pos
+ from brainpy_state._nest_spatial.kernels import pos
with self.assertRaises(ValueError):
pos.x._eval_pair(self.pre, self.post)
def test_pos_eval_nodes_returns_axis_column(self):
- from brainpy_state._nest_spatial._kernels import pos
+ from brainpy_state._nest_spatial.kernels import pos
coords = jnp.array([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]]) * u.um
gx = np.asarray(u.get_magnitude(pos.x._eval_nodes(coords).to(u.um)))
gy = np.asarray(u.get_magnitude(pos.y._eval_nodes(coords).to(u.um)))
@@ -111,22 +111,22 @@ def setUp(self):
self.coords2d = jnp.array([[1.0, 2.0], [3.0, 4.0]]) * u.um
def test_source_pos_z_on_2d_raises(self):
- from brainpy_state._nest_spatial._kernels import source_pos
+ from brainpy_state._nest_spatial.kernels import source_pos
with self.assertRaises(ValueError):
source_pos.z._eval_pair(self.pre, self.post)
def test_target_pos_z_on_2d_raises(self):
- from brainpy_state._nest_spatial._kernels import target_pos
+ from brainpy_state._nest_spatial.kernels import target_pos
with self.assertRaises(ValueError):
target_pos.z._eval_pair(self.pre, self.post)
def test_pos_z_eval_nodes_on_2d_raises(self):
- from brainpy_state._nest_spatial._kernels import pos
+ from brainpy_state._nest_spatial.kernels import pos
with self.assertRaises(ValueError):
pos.z._eval_nodes(self.coords2d)
def test_reprs_name_the_axis(self):
- from brainpy_state._nest_spatial._kernels import pos, source_pos, target_pos
+ from brainpy_state._nest_spatial.kernels import pos, source_pos, target_pos
self.assertEqual(repr(distance.x), 'spatial.distance.x')
self.assertEqual(repr(source_pos.y), 'spatial.source_pos.y')
self.assertEqual(repr(target_pos.z), 'spatial.target_pos.z')
@@ -134,7 +134,7 @@ def test_reprs_name_the_axis(self):
self.assertEqual(repr(pos), 'spatial.pos')
def test_gamma_eval_pair_consumes_axis_expression(self):
- from brainpy_state._nest_spatial._kernels import gamma
+ from brainpy_state._nest_spatial.kernels import gamma
pre = jnp.array([[0.0, 0.0]]) * u.um
post = jnp.array([[3.0, 4.0]]) * u.um
# gamma(distance.x, kappa=1, theta=2) on |dx|=3 == e^{-3/2}/2
@@ -146,19 +146,19 @@ class TestDistributions(unittest.TestCase):
"""exponential / gamma scalar-distance kernels vs the exact NEST formulas."""
def test_exponential_value(self):
- from brainpy_state._nest_spatial._kernels import exponential
+ from brainpy_state._nest_spatial.kernels import exponential
k = exponential(distance, beta=2.0)
d = jnp.array([0.0, 2.0, 4.0]) * u.um
got = np.asarray(u.get_magnitude(k(d)))
np.testing.assert_allclose(got, np.exp(-np.array([0.0, 1.0, 2.0])), atol=1e-6)
def test_exponential_peak_one_at_zero(self):
- from brainpy_state._nest_spatial._kernels import exponential
+ from brainpy_state._nest_spatial.kernels import exponential
self.assertAlmostEqual(float(u.get_magnitude(exponential(distance, beta=0.7)(0.0 * u.um))),
1.0, places=10)
def test_gamma_matches_pdf(self):
- from brainpy_state._nest_spatial._kernels import gamma
+ from brainpy_state._nest_spatial.kernels import gamma
kappa, theta = 2.0, 1.5
k = gamma(distance, kappa=kappa, theta=theta)
d = jnp.array([0.5, 1.0, 3.0]) * u.um
@@ -169,14 +169,14 @@ def test_gamma_matches_pdf(self):
def test_gamma_shape1_is_exponential(self):
# kappa=1 -> gamma reduces to exponential/theta: x^0 e^{-x/θ}/(θ Γ(1)) = e^{-x/θ}/θ
- from brainpy_state._nest_spatial._kernels import gamma
+ from brainpy_state._nest_spatial.kernels import gamma
k = gamma(distance, kappa=1.0, theta=2.0)
got = float(u.get_magnitude(k(2.0 * u.um)))
self.assertAlmostEqual(got, math.exp(-1.0) / 2.0, places=6)
def test_kernels_take_per_axis_input(self):
# the distributions accept a per-axis expression, not just scalar distance
- from brainpy_state._nest_spatial._kernels import exponential
+ from brainpy_state._nest_spatial.kernels import exponential
pre = jnp.array([[0.0, 0.0]]) * u.um
post = jnp.array([[3.0, 4.0]]) * u.um
# exponential(distance.x, beta=1) -> exp(-|dx|) = exp(-3)
@@ -188,7 +188,7 @@ class TestAnisotropicKernels(unittest.TestCase):
"""gabor / gaussian2D two-axis kernels vs the exact NEST formulas (X=|dx|, Y=|dy|)."""
def test_gabor_matches_formula(self):
- from brainpy_state._nest_spatial._kernels import gabor
+ from brainpy_state._nest_spatial.kernels import gabor
pre = jnp.array([[0.0, 0.0]]) * u.um
post = jnp.array([[3.0, 0.0]]) * u.um
k = gabor(distance.x, distance.y, theta=0.0, gamma=1.0, std=1.0, lam=2.0, psi=0.0)
@@ -198,14 +198,14 @@ def test_gabor_matches_formula(self):
self.assertAlmostEqual(got, ref, places=6)
def test_gabor_rectifies_to_zero(self):
- from brainpy_state._nest_spatial._kernels import gabor
+ from brainpy_state._nest_spatial.kernels import gabor
pre = jnp.array([[0.0, 0.0]]) * u.um
post = jnp.array([[0.0, 1.0]]) * u.um # Y=1 -> cos(pi) = -1 -> rectified to 0
k = gabor(distance.x, distance.y, lam=2.0)
self.assertAlmostEqual(float(u.get_magnitude(k._eval_pair(pre, post)[0, 0])), 0.0, places=7)
def test_gabor_rotated_and_phased(self):
- from brainpy_state._nest_spatial._kernels import gabor
+ from brainpy_state._nest_spatial.kernels import gabor
pre = jnp.array([[0.0, 0.0]]) * u.um
post = jnp.array([[1.0, 2.0]]) * u.um
k = gabor(distance.x, distance.y, theta=90.0, gamma=2.0, std=1.5, lam=3.0, psi=30.0)
@@ -218,7 +218,7 @@ def test_gabor_rotated_and_phased(self):
self.assertAlmostEqual(got, ref, places=6)
def test_gaussian2D_reduces_to_product_when_rho0(self):
- from brainpy_state._nest_spatial._kernels import gaussian2D
+ from brainpy_state._nest_spatial.kernels import gaussian2D
pre = jnp.array([[0.0, 0.0]]) * u.um
post = jnp.array([[2.0, 4.0]]) * u.um
k = gaussian2D(distance.x, distance.y, std_x=1.0, std_y=2.0, rho=0.0)
@@ -227,7 +227,7 @@ def test_gaussian2D_reduces_to_product_when_rho0(self):
self.assertAlmostEqual(got, ref, places=6)
def test_gaussian2D_with_correlation(self):
- from brainpy_state._nest_spatial._kernels import gaussian2D
+ from brainpy_state._nest_spatial.kernels import gaussian2D
pre = jnp.array([[0.0, 0.0]]) * u.um
post = jnp.array([[1.0, 1.0]]) * u.um
k = gaussian2D(distance.x, distance.y, std_x=1.0, std_y=1.0, rho=0.5)
diff --git a/brainpy_state/_nest_spatial/_layers.py b/brainpy_state/_nest_spatial/layers.py
similarity index 100%
rename from brainpy_state/_nest_spatial/_layers.py
rename to brainpy_state/_nest_spatial/layers.py
diff --git a/brainpy_state/_nest_spatial/_layers_test.py b/brainpy_state/_nest_spatial/layers_test.py
similarity index 98%
rename from brainpy_state/_nest_spatial/_layers_test.py
rename to brainpy_state/_nest_spatial/layers_test.py
index 1dcfdd30..da91d820 100644
--- a/brainpy_state/_nest_spatial/_layers_test.py
+++ b/brainpy_state/_nest_spatial/layers_test.py
@@ -8,7 +8,7 @@
import brainunit as u
from brainpy_state._dist import Uniform
-from brainpy_state._nest_spatial._layers import Layer, grid, free
+from brainpy_state._nest_spatial.layers import Layer, grid, free
class TestGrid(unittest.TestCase):
diff --git a/brainpy_state/_nest_spatial/_masks.py b/brainpy_state/_nest_spatial/masks.py
similarity index 98%
rename from brainpy_state/_nest_spatial/_masks.py
rename to brainpy_state/_nest_spatial/masks.py
index 42f24759..18bcb6d2 100644
--- a/brainpy_state/_nest_spatial/_masks.py
+++ b/brainpy_state/_nest_spatial/masks.py
@@ -13,8 +13,8 @@
import brainunit as u
-from brainpy_state._nest_spatial._distance import displacement, pairwise_distance
-from brainpy_state._nest_spatial._layers import _LEN, _as_len
+from brainpy_state._nest_spatial.distance import displacement, pairwise_distance
+from brainpy_state._nest_spatial.layers import _LEN, _as_len
__all__ = ['circular', 'spherical', 'box', 'rectangular', 'doughnut',
'elliptical', 'ellipsoidal']
diff --git a/brainpy_state/_nest_spatial/_masks_test.py b/brainpy_state/_nest_spatial/masks_test.py
similarity index 88%
rename from brainpy_state/_nest_spatial/_masks_test.py
rename to brainpy_state/_nest_spatial/masks_test.py
index aacac163..4e9444f5 100644
--- a/brainpy_state/_nest_spatial/_masks_test.py
+++ b/brainpy_state/_nest_spatial/masks_test.py
@@ -6,7 +6,7 @@
import numpy as np
import brainunit as u
-from brainpy_state._nest_spatial._masks import circular, spherical, box
+from brainpy_state._nest_spatial.masks import circular, spherical, box
class TestMasks(unittest.TestCase):
@@ -44,7 +44,7 @@ def test_spherical_is_distance_cutoff_3d(self):
class TestDoughnut(unittest.TestCase):
def test_annulus_boundary_inner_exclusive_outer_inclusive(self):
- from brainpy_state._nest_spatial._masks import doughnut
+ from brainpy_state._nest_spatial.masks import doughnut
pre = jnp.array([[0.0, 0.0]]) * u.um
post = jnp.array([[0.2, 0.0], [0.3, 0.0], [0.5, 0.0], [0.7, 0.0], [0.8, 0.0]]) * u.um
m = np.asarray(doughnut(0.3, 0.7).contains(pre, post))
@@ -52,7 +52,7 @@ def test_annulus_boundary_inner_exclusive_outer_inclusive(self):
np.testing.assert_array_equal(m[0], [False, False, True, True, False])
def test_inner_zero_excludes_only_center(self):
- from brainpy_state._nest_spatial._masks import doughnut, circular
+ from brainpy_state._nest_spatial.masks import doughnut, circular
pre = jnp.array([[0.0, 0.0]]) * u.um
post = jnp.array([[0.0, 0.0], [0.5, 0.0]]) * u.um
d = np.asarray(doughnut(0.0, 1.0).contains(pre, post))
@@ -61,7 +61,7 @@ def test_inner_zero_excludes_only_center(self):
np.testing.assert_array_equal(c[0], [True, True]) # circular includes center
def test_inner_equals_outer_is_empty(self):
- from brainpy_state._nest_spatial._masks import doughnut
+ from brainpy_state._nest_spatial.masks import doughnut
pre = jnp.array([[0.0, 0.0]]) * u.um
post = jnp.array([[0.0, 0.0], [0.5, 0.0], [0.5, 0.0]]) * u.um
m = np.asarray(doughnut(0.5, 0.5).contains(pre, post))
@@ -70,14 +70,14 @@ def test_inner_equals_outer_is_empty(self):
class TestRectangular(unittest.TestCase):
def test_unrotated_box_on_displacement(self):
- from brainpy_state._nest_spatial._masks import rectangular
+ from brainpy_state._nest_spatial.masks import rectangular
pre = jnp.array([[0.0, 0.0]]) * u.um
post = jnp.array([[0.2, 0.2], [0.6, 0.0]]) * u.um
m = np.asarray(rectangular([-0.5, -0.5], [0.5, 0.5]).contains(pre, post))
np.testing.assert_array_equal(m[0], [True, False])
def test_azimuth_90_rotates_acceptance(self):
- from brainpy_state._nest_spatial._masks import rectangular
+ from brainpy_state._nest_spatial.masks import rectangular
pre = jnp.array([[0.0, 0.0]]) * u.um
post = jnp.array([[0.8, 0.0]]) * u.um # disp (0.8, 0)
tall = rectangular([-0.2, -1.0], [0.2, 1.0]) # x:+-0.2 -> excludes (0.8,0)
@@ -88,7 +88,7 @@ def test_azimuth_90_rotates_acceptance(self):
class TestElliptical(unittest.TestCase):
def test_axis_aligned(self):
- from brainpy_state._nest_spatial._masks import elliptical
+ from brainpy_state._nest_spatial.masks import elliptical
pre = jnp.array([[0.0, 0.0]]) * u.um
# semi-major 1 (x), semi-minor 0.5 (y): in iff dx^2 + 4 dy^2 <= 1
post = jnp.array([[0.9, 0.0], [1.1, 0.0], [0.0, 0.4], [0.0, 0.6]]) * u.um
@@ -96,7 +96,7 @@ def test_axis_aligned(self):
np.testing.assert_array_equal(m[0], [True, False, True, False])
def test_major_equals_minor_is_circular(self):
- from brainpy_state._nest_spatial._masks import elliptical, circular
+ from brainpy_state._nest_spatial.masks import elliptical, circular
pre = jnp.array([[0.0, 0.0]]) * u.um
post = jnp.array([[0.9, 0.0], [0.0, 0.9], [0.8, 0.8]]) * u.um
e = np.asarray(elliptical(2.0, 2.0).contains(pre, post)) # semi 1 == circular(1)
@@ -104,7 +104,7 @@ def test_major_equals_minor_is_circular(self):
np.testing.assert_array_equal(e[0], c[0])
def test_rotated_90_swaps_axes(self):
- from brainpy_state._nest_spatial._masks import elliptical
+ from brainpy_state._nest_spatial.masks import elliptical
pre = jnp.array([[0.0, 0.0]]) * u.um
post = jnp.array([[0.9, 0.0], [0.0, 0.9]]) * u.um
aligned = np.asarray(elliptical(2.0, 1.0).contains(pre, post))
@@ -115,7 +115,7 @@ def test_rotated_90_swaps_axes(self):
class TestEllipsoidal(unittest.TestCase):
def test_axis_aligned_3d(self):
- from brainpy_state._nest_spatial._masks import ellipsoidal
+ from brainpy_state._nest_spatial.masks import ellipsoidal
pre = jnp.array([[0.0, 0.0, 0.0]]) * u.um
# semi 1,1,0.5: in iff dx^2 + dy^2 + 4 dz^2 <= 1
post = jnp.array([[0.9, 0, 0], [0, 0.9, 0], [0, 0, 0.4], [0, 0, 0.6]]) * u.um
@@ -123,7 +123,7 @@ def test_axis_aligned_3d(self):
np.testing.assert_array_equal(m[0], [True, True, True, False])
def test_equal_axes_is_spherical(self):
- from brainpy_state._nest_spatial._masks import ellipsoidal, spherical
+ from brainpy_state._nest_spatial.masks import ellipsoidal, spherical
pre = jnp.array([[0.0, 0.0, 0.0]]) * u.um
post = jnp.array([[0.9, 0, 0], [0, 0, 0.9], [0.7, 0.7, 0.0], [0.8, 0.8, 0.0]]) * u.um
e = np.asarray(ellipsoidal(2.0, 2.0, 2.0).contains(pre, post)) # sphere radius 1
diff --git a/brainpy_state/_nest_spatial/_namespace_test.py b/brainpy_state/_nest_spatial/namespace_test.py
similarity index 100%
rename from brainpy_state/_nest_spatial/_namespace_test.py
rename to brainpy_state/_nest_spatial/namespace_test.py
diff --git a/brainpy_state/_nest_spatial/_plot.py b/brainpy_state/_nest_spatial/plot.py
similarity index 97%
rename from brainpy_state/_nest_spatial/_plot.py
rename to brainpy_state/_nest_spatial/plot.py
index c5beaa28..785a47d0 100644
--- a/brainpy_state/_nest_spatial/_plot.py
+++ b/brainpy_state/_nest_spatial/plot.py
@@ -11,9 +11,9 @@
import numpy as np
import brainunit as u
-from brainpy_state._nest_spatial._distance import pairwise_distance
-from brainpy_state._nest_spatial._helpers import target_positions
-from brainpy_state._nest_spatial._layers import _LEN, _as_len
+from brainpy_state._nest_spatial.distance import pairwise_distance
+from brainpy_state._nest_spatial.helpers import target_positions
+from brainpy_state._nest_spatial.layers import _LEN, _as_len
__all__ = ['plot_layer', 'plot_targets', 'plot_sources', 'plot_probability_parameter']
diff --git a/brainpy_state/_nest_spatial/_plot_test.py b/brainpy_state/_nest_spatial/plot_test.py
similarity index 84%
rename from brainpy_state/_nest_spatial/_plot_test.py
rename to brainpy_state/_nest_spatial/plot_test.py
index a6123d48..0bc3e17d 100644
--- a/brainpy_state/_nest_spatial/_plot_test.py
+++ b/brainpy_state/_nest_spatial/plot_test.py
@@ -15,10 +15,10 @@
matplotlib = None
from brainpy_state import Simulator, iaf_psc_alpha
-from brainpy_state._nest_spatial._layers import grid
-from brainpy_state._nest_spatial._kernels import distance, gaussian
-from brainpy_state._nest_spatial._masks import circular
-from brainpy_state._nest_spatial._rule import spatial_pairwise_bernoulli
+from brainpy_state._nest_spatial.layers import grid
+from brainpy_state._nest_spatial.kernels import distance, gaussian
+from brainpy_state._nest_spatial.masks import circular
+from brainpy_state._nest_spatial.rule import spatial_pairwise_bernoulli
@unittest.skipIf(matplotlib is None, 'matplotlib not installed')
@@ -37,33 +37,33 @@ def _sim(self):
return sim, pop
def test_plot_layer_2d_returns_figure_with_points(self):
- from brainpy_state._nest_spatial._plot import plot_layer
+ from brainpy_state._nest_spatial.plot import plot_layer
fig = plot_layer(grid([3, 3], extent=[2.0, 2.0]))
self.assertIsInstance(fig, Figure)
self.assertTrue(fig.axes[0].collections) # something was scattered
def test_plot_layer_3d(self):
- from brainpy_state._nest_spatial._plot import plot_layer
+ from brainpy_state._nest_spatial.plot import plot_layer
fig = plot_layer(grid([2, 2, 2], extent=[1.0, 1.0, 1.0]))
self.assertIsInstance(fig, Figure)
self.assertEqual(fig.axes[0].name, '3d')
def test_plot_targets(self):
- from brainpy_state._nest_spatial._plot import plot_targets
+ from brainpy_state._nest_spatial.plot import plot_targets
sim, pop = self._sim()
fig = plot_targets(sim, pop, pop)
self.assertIsInstance(fig, Figure)
self.assertGreaterEqual(len(fig.axes[0].collections), 2) # targets + source
def test_plot_sources(self):
- from brainpy_state._nest_spatial._plot import plot_sources
+ from brainpy_state._nest_spatial.plot import plot_sources
sim, pop = self._sim()
fig = plot_sources(sim, pop, pop)
self.assertIsInstance(fig, Figure)
self.assertGreaterEqual(len(fig.axes[0].collections), 2)
def test_plot_probability_parameter_heatmap(self):
- from brainpy_state._nest_spatial._plot import plot_probability_parameter
+ from brainpy_state._nest_spatial.plot import plot_probability_parameter
fig = plot_probability_parameter(gaussian(distance, std=0.3),
mask=circular(0.4), extent=(-0.5, 0.5, -0.5, 0.5))
self.assertIsInstance(fig, Figure)
diff --git a/brainpy_state/_nest_spatial/_rule.py b/brainpy_state/_nest_spatial/rule.py
similarity index 95%
rename from brainpy_state/_nest_spatial/_rule.py
rename to brainpy_state/_nest_spatial/rule.py
index 0fa0baa7..5c567f1b 100644
--- a/brainpy_state/_nest_spatial/_rule.py
+++ b/brainpy_state/_nest_spatial/rule.py
@@ -1,7 +1,7 @@
# Copyright 2026 BrainX Ecosystem Limited. Apache 2.0.
"""Distance-dependent pairwise-Bernoulli connection rule.
-``spatial_pairwise_bernoulli`` is an ordinary :class:`~brainpy_state._nest_network._rules.ConnRule`
+``spatial_pairwise_bernoulli`` is an ordinary :class:`~brainpy_state._nest_network.rules.ConnRule`
that additionally needs the pre/post node coordinates. It is constructed *unbound*; the
:class:`~brainpy_state.Simulator` binds sliced positions via :meth:`SpatialConnRule.with_coords`
at ``connect`` time, then the existing static / plastic projection paths sample it unchanged.
@@ -13,9 +13,9 @@
import jax
import jax.numpy as jnp
-from brainpy_state._nest_network._rules import ConnRule
-from brainpy_state._nest_network._connectivity import ConnSpec
-from brainpy_state._nest_spatial._distance import pairwise_distance
+from brainpy_state._nest_network.rules import ConnRule
+from brainpy_state._nest_network.connectivity import ConnSpec
+from brainpy_state._nest_spatial.distance import pairwise_distance
__all__ = ['SpatialConnRule', 'spatial_pairwise_bernoulli']
@@ -30,7 +30,7 @@ class SpatialConnRule(ConnRule):
Parameters
----------
p : callable or float
- A distance kernel ``p(d)`` (e.g. :func:`~brainpy_state._nest_spatial._kernels.gaussian`)
+ A distance kernel ``p(d)`` (e.g. :func:`~brainpy_state._nest_spatial.kernels.gaussian`)
or a constant probability.
mask : object, optional
A mask with ``contains(pre_pos, post_pos) -> bool (n_pre, n_post)`` (hard cutoff).
diff --git a/brainpy_state/_nest_spatial/_rule_test.py b/brainpy_state/_nest_spatial/rule_test.py
similarity index 93%
rename from brainpy_state/_nest_spatial/_rule_test.py
rename to brainpy_state/_nest_spatial/rule_test.py
index 891117c5..45cd744a 100644
--- a/brainpy_state/_nest_spatial/_rule_test.py
+++ b/brainpy_state/_nest_spatial/rule_test.py
@@ -7,12 +7,12 @@
import numpy as np
import brainunit as u
-from brainpy_state._nest_network._rules import ConnRule
-from brainpy_state._nest_spatial._layers import grid
-from brainpy_state._nest_spatial._distance import pairwise_distance
-from brainpy_state._nest_spatial._kernels import distance, gaussian
-from brainpy_state._nest_spatial._masks import circular
-from brainpy_state._nest_spatial._rule import SpatialConnRule, spatial_pairwise_bernoulli
+from brainpy_state._nest_network.rules import ConnRule
+from brainpy_state._nest_spatial.layers import grid
+from brainpy_state._nest_spatial.distance import pairwise_distance
+from brainpy_state._nest_spatial.kernels import distance, gaussian
+from brainpy_state._nest_spatial.masks import circular
+from brainpy_state._nest_spatial.rule import SpatialConnRule, spatial_pairwise_bernoulli
def _bind(rule, lay_a, lay_b):
diff --git a/brainpy_state/_nest_synapse/bernoulli_synapse.py b/brainpy_state/_nest_synapse/bernoulli_synapse.py
index 95223dba..21bbd2f4 100644
--- a/brainpy_state/_nest_synapse/bernoulli_synapse.py
+++ b/brainpy_state/_nest_synapse/bernoulli_synapse.py
@@ -3,20 +3,20 @@
Rebuilt as a frozen parameter spec plus a pure, *stochastic*
``update(state, ctx)`` rule kernel on
-:class:`~brainpy_state._nest_network._event_plastic.EventPlasticProj`. The synapse is
+:class:`~brainpy_state._nest_network.event_plastic.EventPlasticProj`. The synapse is
non-plastic: on each presynaptic spike it delivers the full (per-edge) ``weight``
with probability ``p_transmit`` and drops it otherwise — a per-edge Bernoulli gate
on the delivered amplitude, with **no weight state evolving**.
"""
from __future__ import annotations
-from brainpy_state._nest_base._base import NESTSynapse
+from brainpy_state._nest_base.base import NESTSynapse
import jax
import jax.numpy as jnp
import brainunit as u
from brainstate.typing import ArrayLike
-from brainpy_state._nest_base._plastic_base import (
+from brainpy_state._nest_base.plastic_base import (
to_unit_interval, unit_of, validate_delay, validate_receptor_type, weight_to_pa,
)
diff --git a/brainpy_state/_nest_synapse/bernoulli_synapse_rule_test.py b/brainpy_state/_nest_synapse/bernoulli_synapse_rule_test.py
index 5e7fa5f0..70d4f0c5 100644
--- a/brainpy_state/_nest_synapse/bernoulli_synapse_rule_test.py
+++ b/brainpy_state/_nest_synapse/bernoulli_synapse_rule_test.py
@@ -17,10 +17,10 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import bernoulli_synapse
-from brainpy_state._nest_network._event_plastic import KernelContext
+from brainpy_state._nest_network.event_plastic import KernelContext
def _ctx(E, key=None, pre=None):
diff --git a/brainpy_state/_nest_synapse/cont_delay_synapse.py b/brainpy_state/_nest_synapse/cont_delay_synapse.py
index 9173296d..a031db55 100644
--- a/brainpy_state/_nest_synapse/cont_delay_synapse.py
+++ b/brainpy_state/_nest_synapse/cont_delay_synapse.py
@@ -3,7 +3,7 @@
Rebuilt as a frozen parameter spec plus the plain static ``update(state, ctx)``
rule kernel on
-:class:`~brainpy_state._nest_network._event_plastic.EventPlasticProj`. The synapse is
+:class:`~brainpy_state._nest_network.event_plastic.EventPlasticProj`. The synapse is
non-plastic: no per-edge state evolves and the effective weight is just the
constant (per-edge) ``weight`` — identical to :class:`static_synapse`. Its one
distinguishing feature, a delay that need *not* be an integer multiple of the
@@ -11,13 +11,13 @@
seam, opted into here via the class attribute ``fractional_delay = True``.
"""
from __future__ import annotations
-from brainpy_state._nest_base._base import NESTSynapse
+from brainpy_state._nest_base.base import NESTSynapse
import brainstate
import brainunit as u
from brainstate.typing import ArrayLike
-from brainpy_state._nest_base._plastic_base import unit_of, validate_delay, validate_receptor_type, weight_to_pa
+from brainpy_state._nest_base.plastic_base import unit_of, validate_delay, validate_receptor_type, weight_to_pa
__all__ = ['cont_delay_synapse']
diff --git a/brainpy_state/_nest_synapse/cont_delay_synapse_rule_test.py b/brainpy_state/_nest_synapse/cont_delay_synapse_rule_test.py
index 14062e05..abc0086e 100644
--- a/brainpy_state/_nest_synapse/cont_delay_synapse_rule_test.py
+++ b/brainpy_state/_nest_synapse/cont_delay_synapse_rule_test.py
@@ -20,11 +20,11 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
brainstate.environ.set(dt=0.1 * u.ms) # resolution floor reference
from brainpy_state import cont_delay_synapse
-from brainpy_state._nest_network._event_plastic import KernelContext
+from brainpy_state._nest_network.event_plastic import KernelContext
def _ctx(E, pre=None):
diff --git a/brainpy_state/_nest_synapse/diffusion_connection.py b/brainpy_state/_nest_synapse/diffusion_connection.py
index 6f255317..16ad79f6 100644
--- a/brainpy_state/_nest_synapse/diffusion_connection.py
+++ b/brainpy_state/_nest_synapse/diffusion_connection.py
@@ -5,7 +5,7 @@
import numpy as np
from brainstate.typing import ArrayLike
-from brainpy_state._nest_base._base import NESTSynapse
+from brainpy_state._nest_base.base import NESTSynapse
# Copyright 2026 BrainX Ecosystem Limited. All Rights Reserved.
#
diff --git a/brainpy_state/_nest_synapse/diffusion_connection_test.py b/brainpy_state/_nest_synapse/diffusion_connection_test.py
index 61c6f79c..c2bc494d 100644
--- a/brainpy_state/_nest_synapse/diffusion_connection_test.py
+++ b/brainpy_state/_nest_synapse/diffusion_connection_test.py
@@ -25,7 +25,7 @@
from brainpy.state import diffusion_connection
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _is_nest_available():
diff --git a/brainpy_state/_nest_synapse/gap_junction.py b/brainpy_state/_nest_synapse/gap_junction.py
index dd0e3974..4af1e471 100644
--- a/brainpy_state/_nest_synapse/gap_junction.py
+++ b/brainpy_state/_nest_synapse/gap_junction.py
@@ -5,7 +5,7 @@
import numpy as np
from brainstate.typing import ArrayLike
-from brainpy_state._nest_base._base import NESTSynapse
+from brainpy_state._nest_base.base import NESTSynapse
# Copyright 2026 BrainX Ecosystem Limited. All Rights Reserved.
#
diff --git a/brainpy_state/_nest_synapse/gap_junction_test.py b/brainpy_state/_nest_synapse/gap_junction_test.py
index 54c58987..8763792e 100644
--- a/brainpy_state/_nest_synapse/gap_junction_test.py
+++ b/brainpy_state/_nest_synapse/gap_junction_test.py
@@ -26,7 +26,7 @@
from brainpy.state import gap_junction
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _is_nest_available():
diff --git a/brainpy_state/_nest_synapse/quantal_stp_synapse.py b/brainpy_state/_nest_synapse/quantal_stp_synapse.py
index b9a89883..d3e88e5a 100644
--- a/brainpy_state/_nest_synapse/quantal_stp_synapse.py
+++ b/brainpy_state/_nest_synapse/quantal_stp_synapse.py
@@ -2,7 +2,7 @@
"""NEST-faithful ``quantal_stp_synapse`` — probabilistic-release STP spec + rule.
Rebuilt as a frozen spec + a pure, *stochastic* ``update(state, ctx)`` rule
-kernel on :class:`~brainpy_state._nest_network._event_plastic.EventPlasticProj`.
+kernel on :class:`~brainpy_state._nest_network.event_plastic.EventPlasticProj`.
Each connection has ``n`` (static) release sites; ``a`` are currently available.
On a spike: facilitate ``u``, stochastically recover depleted sites, then
release ``n_rel ~ Binomial(a, u)`` sites, delivering ``w_eff = n_rel * weight``
@@ -10,14 +10,14 @@
(mean release converges to the ``tsodyks2`` limit).
"""
from __future__ import annotations
-from brainpy_state._nest_base._base import NESTSynapse
+from brainpy_state._nest_base.base import NESTSynapse
import jax
import jax.numpy as jnp
import brainunit as u
from brainstate.typing import ArrayLike
-from brainpy_state._nest_base._plastic_base import (
+from brainpy_state._nest_base.plastic_base import (
frozen, to_ms, to_scalar_int, to_unit_interval, unit_of,
validate_delay, validate_receptor_type, weight_to_pa,
)
diff --git a/brainpy_state/_nest_synapse/quantal_stp_synapse_rule_test.py b/brainpy_state/_nest_synapse/quantal_stp_synapse_rule_test.py
index d4200d9c..7ffeb821 100644
--- a/brainpy_state/_nest_synapse/quantal_stp_synapse_rule_test.py
+++ b/brainpy_state/_nest_synapse/quantal_stp_synapse_rule_test.py
@@ -14,10 +14,10 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import quantal_stp_synapse, tsodyks2_synapse
-from brainpy_state._nest_network._event_plastic import KernelContext
+from brainpy_state._nest_network.event_plastic import KernelContext
def _ctx(key, t, E):
diff --git a/brainpy_state/_nest_synapse/rate_connection_delayed.py b/brainpy_state/_nest_synapse/rate_connection_delayed.py
index b525f72a..cb11b8ec 100644
--- a/brainpy_state/_nest_synapse/rate_connection_delayed.py
+++ b/brainpy_state/_nest_synapse/rate_connection_delayed.py
@@ -5,7 +5,7 @@
import numpy as np
from brainstate.typing import ArrayLike
-from brainpy_state._nest_base._base import NESTSynapse
+from brainpy_state._nest_base.base import NESTSynapse
# Copyright 2026 BrainX Ecosystem Limited. All Rights Reserved.
#
diff --git a/brainpy_state/_nest_synapse/rate_connection_delayed_test.py b/brainpy_state/_nest_synapse/rate_connection_delayed_test.py
index f595d39c..986c3ac8 100644
--- a/brainpy_state/_nest_synapse/rate_connection_delayed_test.py
+++ b/brainpy_state/_nest_synapse/rate_connection_delayed_test.py
@@ -26,7 +26,7 @@
from brainpy.state import lin_rate_ipn, rate_connection_delayed
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _is_nest_available():
diff --git a/brainpy_state/_nest_synapse/rate_connection_instantaneous.py b/brainpy_state/_nest_synapse/rate_connection_instantaneous.py
index a287738b..d2045823 100644
--- a/brainpy_state/_nest_synapse/rate_connection_instantaneous.py
+++ b/brainpy_state/_nest_synapse/rate_connection_instantaneous.py
@@ -5,7 +5,7 @@
import numpy as np
from brainstate.typing import ArrayLike
-from brainpy_state._nest_base._base import NESTSynapse
+from brainpy_state._nest_base.base import NESTSynapse
# Copyright 2026 BrainX Ecosystem Limited. All Rights Reserved.
#
diff --git a/brainpy_state/_nest_synapse/rate_connection_instantaneous_test.py b/brainpy_state/_nest_synapse/rate_connection_instantaneous_test.py
index d29aceda..7898ca01 100644
--- a/brainpy_state/_nest_synapse/rate_connection_instantaneous_test.py
+++ b/brainpy_state/_nest_synapse/rate_connection_instantaneous_test.py
@@ -27,7 +27,7 @@
from brainpy.state import lin_rate_ipn, rate_connection_instantaneous
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _is_nest_available():
diff --git a/brainpy_state/_nest_synapse/sic_connection.py b/brainpy_state/_nest_synapse/sic_connection.py
index 6004cb2e..9853cdfb 100644
--- a/brainpy_state/_nest_synapse/sic_connection.py
+++ b/brainpy_state/_nest_synapse/sic_connection.py
@@ -5,7 +5,7 @@
import numpy as np
from brainstate.typing import ArrayLike
-from brainpy_state._nest_base._base import NESTSynapse
+from brainpy_state._nest_base.base import NESTSynapse
# Copyright 2026 BrainX Ecosystem Limited. All Rights Reserved.
#
@@ -37,7 +37,7 @@ class sic_connection(NESTSynapse):
astrocyte's per-step ``SIC``) and the integer ``delay_steps``, validates the
sender/receiver model pair, and is consumed by :class:`~brainpy_state.Simulator`,
which builds the routing — an ``as_current``
- :class:`~brainpy_state._nest_network._event_proj.EventProjection` that reads the
+ :class:`~brainpy_state._nest_network.event_proj.EventProjection` that reads the
astrocyte's emission holder and deposits ``weight·SIC`` into the neuron's labelled
``'I_SIC'`` current channel each step.
diff --git a/brainpy_state/_nest_synapse/sic_connection_test.py b/brainpy_state/_nest_synapse/sic_connection_test.py
index d525a6c7..39a7ad1d 100644
--- a/brainpy_state/_nest_synapse/sic_connection_test.py
+++ b/brainpy_state/_nest_synapse/sic_connection_test.py
@@ -26,7 +26,7 @@
from brainpy_state import sic_connection, aeif_cond_alpha_astro, astrocyte_lr_1994
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
def _is_nest_available():
diff --git a/brainpy_state/_nest_synapse/static_synapse.py b/brainpy_state/_nest_synapse/static_synapse.py
index 6c76e0d2..b2105e17 100644
--- a/brainpy_state/_nest_synapse/static_synapse.py
+++ b/brainpy_state/_nest_synapse/static_synapse.py
@@ -2,17 +2,17 @@
"""NEST-faithful ``static_synapse`` — fixed-weight synapse spec + trivial rule.
Rebuilt as a frozen parameter spec plus the simplest possible pure rule kernel
-on :class:`~brainpy_state._nest_network._event_plastic.EventPlasticProj`: the
+on :class:`~brainpy_state._nest_network.event_plastic.EventPlasticProj`: the
effective weight is just the (per-edge) constant ``weight``, and no state
evolves.
"""
from __future__ import annotations
-from brainpy_state._nest_base._base import NESTSynapse
+from brainpy_state._nest_base.base import NESTSynapse
import brainunit as u
from brainstate.typing import ArrayLike
-from brainpy_state._nest_base._plastic_base import unit_of, validate_delay, validate_receptor_type, weight_to_pa
+from brainpy_state._nest_base.plastic_base import unit_of, validate_delay, validate_receptor_type, weight_to_pa
__all__ = ['static_synapse']
diff --git a/brainpy_state/_nest_synapse/static_synapse_hom_w.py b/brainpy_state/_nest_synapse/static_synapse_hom_w.py
index 60cc6588..aff4d64b 100644
--- a/brainpy_state/_nest_synapse/static_synapse_hom_w.py
+++ b/brainpy_state/_nest_synapse/static_synapse_hom_w.py
@@ -2,21 +2,21 @@
"""NEST-faithful ``static_synapse_hom_w`` — homogeneous-weight static synapse.
Rebuilt as a frozen spec + trivial pure rule on
-:class:`~brainpy_state._nest_network._event_plastic.EventPlasticProj`. Identical to
+:class:`~brainpy_state._nest_network.event_plastic.EventPlasticProj`. Identical to
:class:`~brainpy_state._nest_synapse.static_synapse.static_synapse` except the weight is
a single value shared by every connection (NEST common property): the substrate
stores ``'weight'`` as a 0-d :class:`brainstate.ParamState`. Per-connection
``delay`` and ``receptor_type`` remain settable.
"""
from __future__ import annotations
-from brainpy_state._nest_base._base import NESTSynapse
+from brainpy_state._nest_base.base import NESTSynapse
from typing import Mapping
import brainunit as u
from brainstate.typing import ArrayLike
-from brainpy_state._nest_base._plastic_base import unit_of, validate_delay, validate_receptor_type, weight_to_pa
+from brainpy_state._nest_base.plastic_base import unit_of, validate_delay, validate_receptor_type, weight_to_pa
__all__ = ['static_synapse_hom_w']
diff --git a/brainpy_state/_nest_synapse/static_synapse_hom_w_rule_test.py b/brainpy_state/_nest_synapse/static_synapse_hom_w_rule_test.py
index b637e40d..427f53f0 100644
--- a/brainpy_state/_nest_synapse/static_synapse_hom_w_rule_test.py
+++ b/brainpy_state/_nest_synapse/static_synapse_hom_w_rule_test.py
@@ -10,10 +10,10 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import static_synapse_hom_w
-from brainpy_state._nest_network._event_plastic import KernelContext
+from brainpy_state._nest_network.event_plastic import KernelContext
def _ctx(E):
diff --git a/brainpy_state/_nest_synapse/static_synapse_rule_test.py b/brainpy_state/_nest_synapse/static_synapse_rule_test.py
index 835ec4bf..4098dfdb 100644
--- a/brainpy_state/_nest_synapse/static_synapse_rule_test.py
+++ b/brainpy_state/_nest_synapse/static_synapse_rule_test.py
@@ -10,10 +10,10 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import static_synapse
-from brainpy_state._nest_network._event_plastic import KernelContext
+from brainpy_state._nest_network.event_plastic import KernelContext
def _ctx(E):
diff --git a/brainpy_state/_nest_synapse/tsodyks2_synapse.py b/brainpy_state/_nest_synapse/tsodyks2_synapse.py
index 1c54c274..3f3c2efb 100644
--- a/brainpy_state/_nest_synapse/tsodyks2_synapse.py
+++ b/brainpy_state/_nest_synapse/tsodyks2_synapse.py
@@ -2,20 +2,20 @@
"""NEST-faithful ``tsodyks2_synapse`` — multiplicative STP spec + pure rule.
Rebuilt as a frozen spec + pure ``update(state, ctx)`` rule kernel on
-:class:`~brainpy_state._nest_network._event_plastic.EventPlasticProj`. Per-edge
+:class:`~brainpy_state._nest_network.event_plastic.EventPlasticProj`. Per-edge
``weight`` and per-edge state ``u`` (utilization), ``x`` (available resources),
``t_lastspike``; shared ``U``, ``tau_rec``, ``tau_fac``. The delivered amplitude
is ``w_eff = x*u * weight`` with ``x`` updated **before** ``u`` (using the old
``u``), exactly as in NEST ``models/tsodyks2_synapse.h``.
"""
from __future__ import annotations
-from brainpy_state._nest_base._base import NESTSynapse
+from brainpy_state._nest_base.base import NESTSynapse
import jax.numpy as jnp
import brainunit as u
from brainstate.typing import ArrayLike
-from brainpy_state._nest_base._plastic_base import (
+from brainpy_state._nest_base.plastic_base import (
frozen, to_ms, to_scalar_float, to_unit_interval, unit_of,
validate_delay, validate_receptor_type, weight_to_pa,
)
diff --git a/brainpy_state/_nest_synapse/tsodyks2_synapse_rule_test.py b/brainpy_state/_nest_synapse/tsodyks2_synapse_rule_test.py
index 2fe3ef68..6a1580f9 100644
--- a/brainpy_state/_nest_synapse/tsodyks2_synapse_rule_test.py
+++ b/brainpy_state/_nest_synapse/tsodyks2_synapse_rule_test.py
@@ -10,10 +10,10 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import tsodyks2_synapse
-from brainpy_state._nest_network._event_plastic import KernelContext
+from brainpy_state._nest_network.event_plastic import KernelContext
def _spike_ctx(t, E=1):
diff --git a/brainpy_state/_nest_synapse/tsodyks_synapse.py b/brainpy_state/_nest_synapse/tsodyks_synapse.py
index 3a8758fe..d246d281 100644
--- a/brainpy_state/_nest_synapse/tsodyks_synapse.py
+++ b/brainpy_state/_nest_synapse/tsodyks_synapse.py
@@ -2,7 +2,7 @@
"""NEST-faithful ``tsodyks_synapse`` — Tsodyks (2000) STP spec + pure rule.
Rebuilt as a frozen parameter spec plus a pure ``update(state, ctx)`` rule
-kernel on :class:`~brainpy_state._nest_network._event_plastic.EventPlasticProj`.
+kernel on :class:`~brainpy_state._nest_network.event_plastic.EventPlasticProj`.
Per-edge ``weight`` and per-edge state ``x`` (recovered), ``y`` (active),
``u`` (utilization), ``t_lastspike``; shared ``U`` and time constants. Uses
NEST's ``expm1`` propagator form (``Pzz = expm1(-h/tau_rec)``, ``x -= Pzz*z``);
@@ -11,13 +11,13 @@
(they are floating-point distinct).
"""
from __future__ import annotations
-from brainpy_state._nest_base._base import NESTSynapse
+from brainpy_state._nest_base.base import NESTSynapse
import jax.numpy as jnp
import brainunit as u
from brainstate.typing import ArrayLike
-from brainpy_state._nest_base._plastic_base import (
+from brainpy_state._nest_base.plastic_base import (
frozen, to_ms, to_scalar_float, to_unit_interval, unit_of,
validate_delay, validate_receptor_type, weight_to_pa,
)
diff --git a/brainpy_state/_nest_synapse/tsodyks_synapse_hom.py b/brainpy_state/_nest_synapse/tsodyks_synapse_hom.py
index fbb54f00..89496a50 100644
--- a/brainpy_state/_nest_synapse/tsodyks_synapse_hom.py
+++ b/brainpy_state/_nest_synapse/tsodyks_synapse_hom.py
@@ -2,7 +2,7 @@
"""NEST-faithful ``tsodyks_synapse_hom`` — homogeneous Tsodyks STP spec + rule.
Rebuilt as a frozen parameter spec plus a pure ``update(state, ctx)`` rule
-kernel that runs on :class:`~brainpy_state._nest_network._event_plastic.EventPlasticProj`.
+kernel that runs on :class:`~brainpy_state._nest_network.event_plastic.EventPlasticProj`.
The ``_hom`` variant shares ``weight``, ``U`` and the time constants across all
connections (NEST common properties) and keeps ``x, y, u, t_lastspike``
per-edge. It uses NEST's *plain-exp* propagator form (``Pzz = exp(-h/tau_rec)``,
@@ -11,13 +11,13 @@
distinct, so each is kept exactly as NEST has it.
"""
from __future__ import annotations
-from brainpy_state._nest_base._base import NESTSynapse
+from brainpy_state._nest_base.base import NESTSynapse
import jax.numpy as jnp
import brainunit as u
from brainstate.typing import ArrayLike
-from brainpy_state._nest_base._plastic_base import (
+from brainpy_state._nest_base.plastic_base import (
frozen, to_ms, to_scalar_float, unit_of, validate_delay,
validate_receptor_type, weight_to_pa,
)
diff --git a/brainpy_state/_nest_synapse/tsodyks_synapse_hom_rule_test.py b/brainpy_state/_nest_synapse/tsodyks_synapse_hom_rule_test.py
index 7b4090e8..2d32d26e 100644
--- a/brainpy_state/_nest_synapse/tsodyks_synapse_hom_rule_test.py
+++ b/brainpy_state/_nest_synapse/tsodyks_synapse_hom_rule_test.py
@@ -12,10 +12,10 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import tsodyks_synapse_hom
-from brainpy_state._nest_network._event_plastic import KernelContext
+from brainpy_state._nest_network.event_plastic import KernelContext
def _ref_hom(seq_h, U=0.5, tpsc=3., tfac=0., trec=800., w=1.0):
diff --git a/brainpy_state/_nest_synapse/tsodyks_synapse_rule_test.py b/brainpy_state/_nest_synapse/tsodyks_synapse_rule_test.py
index defed979..f0fdc9ad 100644
--- a/brainpy_state/_nest_synapse/tsodyks_synapse_rule_test.py
+++ b/brainpy_state/_nest_synapse/tsodyks_synapse_rule_test.py
@@ -12,10 +12,10 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import tsodyks_synapse
-from brainpy_state._nest_network._event_plastic import KernelContext
+from brainpy_state._nest_network.event_plastic import KernelContext
def _ref_tsodyks(seq_h, U=0.5, tpsc=3., tfac=0., trec=800., w=1.0):
diff --git a/brainpy_state/_nest_validation/BrodyHopfield_test.py b/brainpy_state/_nest_validation/BrodyHopfield_test.py
index 18398e47..87856b80 100644
--- a/brainpy_state/_nest_validation/BrodyHopfield_test.py
+++ b/brainpy_state/_nest_validation/BrodyHopfield_test.py
@@ -40,7 +40,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_validation.nest_compare import compare_distributional, requires_nest
from brainpy_state._nest_validation import tolerance_conventions as tc
diff --git a/brainpy_state/_nest_validation/CampbellSiegert_test.py b/brainpy_state/_nest_validation/CampbellSiegert_test.py
index e1666f84..5b030cef 100644
--- a/brainpy_state/_nest_validation/CampbellSiegert_test.py
+++ b/brainpy_state/_nest_validation/CampbellSiegert_test.py
@@ -31,7 +31,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import examples.nest_like.CampbellSiegert as demo
diff --git a/brainpy_state/_nest_validation/_stdp_dopamine_drive.py b/brainpy_state/_nest_validation/_stdp_dopamine_drive.py
index 7efcceb7..fa7da89c 100644
--- a/brainpy_state/_nest_validation/_stdp_dopamine_drive.py
+++ b/brainpy_state/_nest_validation/_stdp_dopamine_drive.py
@@ -385,7 +385,7 @@ def bp_dopamine_weight_trace(rule, pre_fire, post_fire, dopa_arrival, n_steps, *
import jax.numpy as jnp
import brainunit as u
from brainstate import transform
- from brainpy_state._nest_network._event_plastic import VoltageCoupledPlasticProj
+ from brainpy_state._nest_network.event_plastic import VoltageCoupledPlasticProj
from brainpy_state._nest_device.volume_transmitter import volume_transmitter
class _Sink: # delivery target (ignored); not None
diff --git a/brainpy_state/_nest_validation/aeif_cond_alpha_astro_test.py b/brainpy_state/_nest_validation/aeif_cond_alpha_astro_test.py
index 1dee45a9..7708795c 100644
--- a/brainpy_state/_nest_validation/aeif_cond_alpha_astro_test.py
+++ b/brainpy_state/_nest_validation/aeif_cond_alpha_astro_test.py
@@ -35,7 +35,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/aeif_cond_alpha_conductance_test.py b/brainpy_state/_nest_validation/aeif_cond_alpha_conductance_test.py
index 540e441d..5cf573d9 100644
--- a/brainpy_state/_nest_validation/aeif_cond_alpha_conductance_test.py
+++ b/brainpy_state/_nest_validation/aeif_cond_alpha_conductance_test.py
@@ -23,7 +23,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/aeif_cond_beta_multisynapse_test.py b/brainpy_state/_nest_validation/aeif_cond_beta_multisynapse_test.py
index 426f75c9..fa7dfd2c 100644
--- a/brainpy_state/_nest_validation/aeif_cond_beta_multisynapse_test.py
+++ b/brainpy_state/_nest_validation/aeif_cond_beta_multisynapse_test.py
@@ -24,7 +24,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/aeif_cond_exp_conductance_test.py b/brainpy_state/_nest_validation/aeif_cond_exp_conductance_test.py
index b757f0c6..ee5f27fe 100644
--- a/brainpy_state/_nest_validation/aeif_cond_exp_conductance_test.py
+++ b/brainpy_state/_nest_validation/aeif_cond_exp_conductance_test.py
@@ -33,7 +33,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/aeif_psc_alpha_psc_current_test.py b/brainpy_state/_nest_validation/aeif_psc_alpha_psc_current_test.py
index 76588999..377700c8 100644
--- a/brainpy_state/_nest_validation/aeif_psc_alpha_psc_current_test.py
+++ b/brainpy_state/_nest_validation/aeif_psc_alpha_psc_current_test.py
@@ -37,7 +37,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/aeif_psc_exp_psc_current_test.py b/brainpy_state/_nest_validation/aeif_psc_exp_psc_current_test.py
index 7d339871..edf677e3 100644
--- a/brainpy_state/_nest_validation/aeif_psc_exp_psc_current_test.py
+++ b/brainpy_state/_nest_validation/aeif_psc_exp_psc_current_test.py
@@ -26,7 +26,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/artificial_synchrony_test.py b/brainpy_state/_nest_validation/artificial_synchrony_test.py
index bfc33218..a0207ead 100644
--- a/brainpy_state/_nest_validation/artificial_synchrony_test.py
+++ b/brainpy_state/_nest_validation/artificial_synchrony_test.py
@@ -26,7 +26,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
diff --git a/brainpy_state/_nest_validation/astrocyte_brunel_test.py b/brainpy_state/_nest_validation/astrocyte_brunel_test.py
index 0088469a..77051f4f 100644
--- a/brainpy_state/_nest_validation/astrocyte_brunel_test.py
+++ b/brainpy_state/_nest_validation/astrocyte_brunel_test.py
@@ -39,7 +39,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/astrocyte_interaction_test.py b/brainpy_state/_nest_validation/astrocyte_interaction_test.py
index 54aab493..b189dabb 100644
--- a/brainpy_state/_nest_validation/astrocyte_interaction_test.py
+++ b/brainpy_state/_nest_validation/astrocyte_interaction_test.py
@@ -26,7 +26,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/astrocyte_sic_test.py b/brainpy_state/_nest_validation/astrocyte_sic_test.py
index 948605e3..eb3622f7 100644
--- a/brainpy_state/_nest_validation/astrocyte_sic_test.py
+++ b/brainpy_state/_nest_validation/astrocyte_sic_test.py
@@ -38,7 +38,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/astrocyte_single_test.py b/brainpy_state/_nest_validation/astrocyte_single_test.py
index 64f21ab0..b822c335 100644
--- a/brainpy_state/_nest_validation/astrocyte_single_test.py
+++ b/brainpy_state/_nest_validation/astrocyte_single_test.py
@@ -26,7 +26,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/astrocyte_small_network_test.py b/brainpy_state/_nest_validation/astrocyte_small_network_test.py
index 60bf78a2..7d643af0 100644
--- a/brainpy_state/_nest_validation/astrocyte_small_network_test.py
+++ b/brainpy_state/_nest_validation/astrocyte_small_network_test.py
@@ -47,7 +47,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/balancedneuron_test.py b/brainpy_state/_nest_validation/balancedneuron_test.py
index 0d4542aa..224cbabc 100644
--- a/brainpy_state/_nest_validation/balancedneuron_test.py
+++ b/brainpy_state/_nest_validation/balancedneuron_test.py
@@ -17,7 +17,7 @@
from scipy.optimize import bisect
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
diff --git a/brainpy_state/_nest_validation/bernoulli_synapse_parity_test.py b/brainpy_state/_nest_validation/bernoulli_synapse_parity_test.py
index bd02d1d0..b52284ba 100644
--- a/brainpy_state/_nest_validation/bernoulli_synapse_parity_test.py
+++ b/brainpy_state/_nest_validation/bernoulli_synapse_parity_test.py
@@ -35,7 +35,7 @@
from brainstate import transform
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainpy_state
from brainpy_state import bernoulli_synapse
diff --git a/brainpy_state/_nest_validation/brette_et_al_2007_test.py b/brainpy_state/_nest_validation/brette_et_al_2007_test.py
index 2580a9ba..8cd9b957 100644
--- a/brainpy_state/_nest_validation/brette_et_al_2007_test.py
+++ b/brainpy_state/_nest_validation/brette_et_al_2007_test.py
@@ -26,7 +26,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/brainpy_state/_nest_validation/brette_gerstner_fig_2c_test.py b/brainpy_state/_nest_validation/brette_gerstner_fig_2c_test.py
index 55c474de..065dd8c0 100644
--- a/brainpy_state/_nest_validation/brette_gerstner_fig_2c_test.py
+++ b/brainpy_state/_nest_validation/brette_gerstner_fig_2c_test.py
@@ -34,7 +34,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_validation.nest_compare import compare_trace, requires_nest
from brainpy_state._nest_validation.tolerance_conventions import TraceTolerance
diff --git a/brainpy_state/_nest_validation/brette_gerstner_fig_3d_test.py b/brainpy_state/_nest_validation/brette_gerstner_fig_3d_test.py
index 2b1ad2cd..7356cd23 100644
--- a/brainpy_state/_nest_validation/brette_gerstner_fig_3d_test.py
+++ b/brainpy_state/_nest_validation/brette_gerstner_fig_3d_test.py
@@ -30,7 +30,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_validation.nest_compare import compare_trace, requires_nest
from brainpy_state._nest_validation.tolerance_conventions import TraceTolerance
diff --git a/brainpy_state/_nest_validation/brunel_alpha_evolution_strategies_test.py b/brainpy_state/_nest_validation/brunel_alpha_evolution_strategies_test.py
index 59aee485..6e0baadf 100644
--- a/brainpy_state/_nest_validation/brunel_alpha_evolution_strategies_test.py
+++ b/brainpy_state/_nest_validation/brunel_alpha_evolution_strategies_test.py
@@ -21,7 +21,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
diff --git a/brainpy_state/_nest_validation/brunel_alpha_test.py b/brainpy_state/_nest_validation/brunel_alpha_test.py
index bcbf72cb..11b11c81 100644
--- a/brainpy_state/_nest_validation/brunel_alpha_test.py
+++ b/brainpy_state/_nest_validation/brunel_alpha_test.py
@@ -10,7 +10,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/brainpy_state/_nest_validation/brunel_delta_test.py b/brainpy_state/_nest_validation/brunel_delta_test.py
index f3952415..6b6e7330 100644
--- a/brainpy_state/_nest_validation/brunel_delta_test.py
+++ b/brainpy_state/_nest_validation/brunel_delta_test.py
@@ -10,7 +10,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
diff --git a/brainpy_state/_nest_validation/brunel_exp_multisynapse_test.py b/brainpy_state/_nest_validation/brunel_exp_multisynapse_test.py
index 12877612..b1a0caf8 100644
--- a/brainpy_state/_nest_validation/brunel_exp_multisynapse_test.py
+++ b/brainpy_state/_nest_validation/brunel_exp_multisynapse_test.py
@@ -18,7 +18,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
diff --git a/brainpy_state/_nest_validation/brunel_siegert_test.py b/brainpy_state/_nest_validation/brunel_siegert_test.py
index 6dc112c2..c5178418 100644
--- a/brainpy_state/_nest_validation/brunel_siegert_test.py
+++ b/brainpy_state/_nest_validation/brunel_siegert_test.py
@@ -29,7 +29,7 @@
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import numpy.testing as npt
diff --git a/brainpy_state/_nest_validation/clopath_synapse_parity_test.py b/brainpy_state/_nest_validation/clopath_synapse_parity_test.py
index 1c14e566..88039327 100644
--- a/brainpy_state/_nest_validation/clopath_synapse_parity_test.py
+++ b/brainpy_state/_nest_validation/clopath_synapse_parity_test.py
@@ -35,7 +35,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_validation.nest_compare import compare_trace, requires_nest
from brainpy_state._nest_validation import tolerance_conventions as tc
diff --git a/brainpy_state/_nest_validation/clopath_synapse_small_network_test.py b/brainpy_state/_nest_validation/clopath_synapse_small_network_test.py
index 9e1c6256..8d56b944 100644
--- a/brainpy_state/_nest_validation/clopath_synapse_small_network_test.py
+++ b/brainpy_state/_nest_validation/clopath_synapse_small_network_test.py
@@ -37,7 +37,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_validation.nest_compare import compare_trace, requires_nest
from brainpy_state._nest_validation import tolerance_conventions as tc
diff --git a/brainpy_state/_nest_validation/clopath_synapse_spike_pairing_test.py b/brainpy_state/_nest_validation/clopath_synapse_spike_pairing_test.py
index b0c526d6..1f9df276 100644
--- a/brainpy_state/_nest_validation/clopath_synapse_spike_pairing_test.py
+++ b/brainpy_state/_nest_validation/clopath_synapse_spike_pairing_test.py
@@ -26,7 +26,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_validation.nest_compare import compare_trace, requires_nest
from brainpy_state._nest_validation import tolerance_conventions as tc
diff --git a/brainpy_state/_nest_validation/cont_delay_synapse_parity_test.py b/brainpy_state/_nest_validation/cont_delay_synapse_parity_test.py
index f5e40ef1..538f27ad 100644
--- a/brainpy_state/_nest_validation/cont_delay_synapse_parity_test.py
+++ b/brainpy_state/_nest_validation/cont_delay_synapse_parity_test.py
@@ -37,7 +37,7 @@
from brainstate import transform
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainpy_state
from brainpy_state import cont_delay_synapse
diff --git a/brainpy_state/_nest_validation/correlospinmatrix_detector_two_neuron_test.py b/brainpy_state/_nest_validation/correlospinmatrix_detector_two_neuron_test.py
index eaae6d6b..54e76219 100644
--- a/brainpy_state/_nest_validation/correlospinmatrix_detector_two_neuron_test.py
+++ b/brainpy_state/_nest_validation/correlospinmatrix_detector_two_neuron_test.py
@@ -32,7 +32,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/cross_check_mip_corrdet_test.py b/brainpy_state/_nest_validation/cross_check_mip_corrdet_test.py
index 525a955a..5fa87ca8 100644
--- a/brainpy_state/_nest_validation/cross_check_mip_corrdet_test.py
+++ b/brainpy_state/_nest_validation/cross_check_mip_corrdet_test.py
@@ -20,7 +20,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/device_parity_test.py b/brainpy_state/_nest_validation/device_parity_test.py
index 6a6b9f8d..165722f8 100644
--- a/brainpy_state/_nest_validation/device_parity_test.py
+++ b/brainpy_state/_nest_validation/device_parity_test.py
@@ -9,7 +9,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainpy_state
diff --git a/brainpy_state/_nest_validation/ei_clustered_network_test.py b/brainpy_state/_nest_validation/ei_clustered_network_test.py
index 11ba93e8..58bc9076 100644
--- a/brainpy_state/_nest_validation/ei_clustered_network_test.py
+++ b/brainpy_state/_nest_validation/ei_clustered_network_test.py
@@ -39,7 +39,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
diff --git a/brainpy_state/_nest_validation/evaluate_quantal_stp_synapse_test.py b/brainpy_state/_nest_validation/evaluate_quantal_stp_synapse_test.py
index 29d5b6c8..9feb192c 100644
--- a/brainpy_state/_nest_validation/evaluate_quantal_stp_synapse_test.py
+++ b/brainpy_state/_nest_validation/evaluate_quantal_stp_synapse_test.py
@@ -37,7 +37,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_validation.nest_compare import compare_distributional, requires_nest
from brainpy_state._nest_validation import tolerance_conventions as tc
diff --git a/brainpy_state/_nest_validation/evaluate_tsodyks2_synapse_test.py b/brainpy_state/_nest_validation/evaluate_tsodyks2_synapse_test.py
index 75f6ebd9..97cec0fb 100644
--- a/brainpy_state/_nest_validation/evaluate_tsodyks2_synapse_test.py
+++ b/brainpy_state/_nest_validation/evaluate_tsodyks2_synapse_test.py
@@ -26,7 +26,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_validation.nest_compare import compare_trace, requires_nest
from brainpy_state._nest_validation import tolerance_conventions as tc
diff --git a/brainpy_state/_nest_validation/gap_junction_inhibitory_network_parity_test.py b/brainpy_state/_nest_validation/gap_junction_inhibitory_network_parity_test.py
index 9058efd4..35284699 100644
--- a/brainpy_state/_nest_validation/gap_junction_inhibitory_network_parity_test.py
+++ b/brainpy_state/_nest_validation/gap_junction_inhibitory_network_parity_test.py
@@ -40,7 +40,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
@@ -156,7 +156,7 @@ class TestGapInhibitoryNetworkParity(unittest.TestCase):
@classmethod
def setUpClass(cls):
jax.clear_caches() # stiff-HH x64 hygiene (21)
- brainstate.environ.set(precision=64, platform='cpu')
+ brainstate.environ.set(precision=64)
skip_n = int(SKIP_MS / 0.5) # NEST multimeter at 0.5 ms
skip_b = int(SKIP_MS / DT) # brainpy voltmeter at dt
cls.chi_nest = {GAP_ASYNC: [], GAP_SYNC: []}
diff --git a/brainpy_state/_nest_validation/gap_junction_no_nest_test.py b/brainpy_state/_nest_validation/gap_junction_no_nest_test.py
index 321c4515..3e444228 100644
--- a/brainpy_state/_nest_validation/gap_junction_no_nest_test.py
+++ b/brainpy_state/_nest_validation/gap_junction_no_nest_test.py
@@ -14,7 +14,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from examples.nest_like.gap_junctions_two_neurons import run_two_neuron, synchrony_gap
from examples.nest_like.gap_junctions_inhibitory_network import run_network, golomb_chi
diff --git a/brainpy_state/_nest_validation/gap_junction_parity_test.py b/brainpy_state/_nest_validation/gap_junction_parity_test.py
index f540d907..5c803eca 100644
--- a/brainpy_state/_nest_validation/gap_junction_parity_test.py
+++ b/brainpy_state/_nest_validation/gap_junction_parity_test.py
@@ -46,7 +46,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
@@ -144,7 +144,7 @@ class TestGapJunctionTwoNeuronParity(unittest.TestCase):
@classmethod
def setUpClass(cls):
jax.clear_caches() # stiff-HH x64 hygiene (cluster 21)
- brainstate.environ.set(precision=64, platform='cpu')
+ brainstate.environ.set(precision=64)
cls.ns = _nest_two_neuron() # (samples, 2)
cls.bp = _bp_two_neuron() # (samples, 2)
diff --git a/brainpy_state/_nest_validation/gif_cond_exp_conductance_test.py b/brainpy_state/_nest_validation/gif_cond_exp_conductance_test.py
index e3d9bfb5..bf42fccf 100644
--- a/brainpy_state/_nest_validation/gif_cond_exp_conductance_test.py
+++ b/brainpy_state/_nest_validation/gif_cond_exp_conductance_test.py
@@ -28,7 +28,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/gif_cond_exp_multisynapse_test.py b/brainpy_state/_nest_validation/gif_cond_exp_multisynapse_test.py
index 99be0955..b5860e0f 100644
--- a/brainpy_state/_nest_validation/gif_cond_exp_multisynapse_test.py
+++ b/brainpy_state/_nest_validation/gif_cond_exp_multisynapse_test.py
@@ -28,7 +28,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/gif_pop_psc_exp_demo_test.py b/brainpy_state/_nest_validation/gif_pop_psc_exp_demo_test.py
index 0ba56092..94d93105 100644
--- a/brainpy_state/_nest_validation/gif_pop_psc_exp_demo_test.py
+++ b/brainpy_state/_nest_validation/gif_pop_psc_exp_demo_test.py
@@ -35,7 +35,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_validation.nest_compare import compare_distributional, requires_nest
from brainpy_state._nest_validation import tolerance_conventions as tc
diff --git a/brainpy_state/_nest_validation/gif_population_test.py b/brainpy_state/_nest_validation/gif_population_test.py
index bd87d194..e85c1ca6 100644
--- a/brainpy_state/_nest_validation/gif_population_test.py
+++ b/brainpy_state/_nest_validation/gif_population_test.py
@@ -34,7 +34,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_validation.nest_compare import compare_distributional, requires_nest
from brainpy_state._nest_validation import tolerance_conventions as tc
diff --git a/brainpy_state/_nest_validation/glif_cond_neuron_test.py b/brainpy_state/_nest_validation/glif_cond_neuron_test.py
index 0b48e533..f437546a 100644
--- a/brainpy_state/_nest_validation/glif_cond_neuron_test.py
+++ b/brainpy_state/_nest_validation/glif_cond_neuron_test.py
@@ -40,7 +40,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/glif_psc_double_alpha_neuron_test.py b/brainpy_state/_nest_validation/glif_psc_double_alpha_neuron_test.py
index 14851d5e..d2f33815 100644
--- a/brainpy_state/_nest_validation/glif_psc_double_alpha_neuron_test.py
+++ b/brainpy_state/_nest_validation/glif_psc_double_alpha_neuron_test.py
@@ -26,7 +26,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/glif_psc_neuron_test.py b/brainpy_state/_nest_validation/glif_psc_neuron_test.py
index ef546e4c..239da02b 100644
--- a/brainpy_state/_nest_validation/glif_psc_neuron_test.py
+++ b/brainpy_state/_nest_validation/glif_psc_neuron_test.py
@@ -48,7 +48,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/hh_cond_exp_traub_conductance_test.py b/brainpy_state/_nest_validation/hh_cond_exp_traub_conductance_test.py
index d453b948..62d5d85a 100644
--- a/brainpy_state/_nest_validation/hh_cond_exp_traub_conductance_test.py
+++ b/brainpy_state/_nest_validation/hh_cond_exp_traub_conductance_test.py
@@ -35,7 +35,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/hh_phaseplane_test.py b/brainpy_state/_nest_validation/hh_phaseplane_test.py
index 080fef8c..f179351b 100644
--- a/brainpy_state/_nest_validation/hh_phaseplane_test.py
+++ b/brainpy_state/_nest_validation/hh_phaseplane_test.py
@@ -27,7 +27,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/hh_psc_alpha_clopath_psc_current_test.py b/brainpy_state/_nest_validation/hh_psc_alpha_clopath_psc_current_test.py
index 43d94e43..e35e4dc8 100644
--- a/brainpy_state/_nest_validation/hh_psc_alpha_clopath_psc_current_test.py
+++ b/brainpy_state/_nest_validation/hh_psc_alpha_clopath_psc_current_test.py
@@ -30,7 +30,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/hh_psc_alpha_test.py b/brainpy_state/_nest_validation/hh_psc_alpha_test.py
index db9bd755..e2f28276 100644
--- a/brainpy_state/_nest_validation/hh_psc_alpha_test.py
+++ b/brainpy_state/_nest_validation/hh_psc_alpha_test.py
@@ -20,7 +20,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/ht_synapse_parity_test.py b/brainpy_state/_nest_validation/ht_synapse_parity_test.py
index cabe77af..919727c2 100644
--- a/brainpy_state/_nest_validation/ht_synapse_parity_test.py
+++ b/brainpy_state/_nest_validation/ht_synapse_parity_test.py
@@ -18,7 +18,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import ht_synapse
from brainpy_state._nest_validation.nest_compare import compare_trace, requires_nest
diff --git a/brainpy_state/_nest_validation/iaf_bw_2001_nest_parity_test.py b/brainpy_state/_nest_validation/iaf_bw_2001_nest_parity_test.py
index 70ee7010..2a3ae035 100644
--- a/brainpy_state/_nest_validation/iaf_bw_2001_nest_parity_test.py
+++ b/brainpy_state/_nest_validation/iaf_bw_2001_nest_parity_test.py
@@ -33,7 +33,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
import braintools
diff --git a/brainpy_state/_nest_validation/iaf_bw_2001_recurrent_nmda_parity_test.py b/brainpy_state/_nest_validation/iaf_bw_2001_recurrent_nmda_parity_test.py
index ab29d9f4..f092da64 100644
--- a/brainpy_state/_nest_validation/iaf_bw_2001_recurrent_nmda_parity_test.py
+++ b/brainpy_state/_nest_validation/iaf_bw_2001_recurrent_nmda_parity_test.py
@@ -46,7 +46,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
import braintools
diff --git a/brainpy_state/_nest_validation/iaf_chxk_2008_conductance_test.py b/brainpy_state/_nest_validation/iaf_chxk_2008_conductance_test.py
index 0828fb6a..6abe3880 100644
--- a/brainpy_state/_nest_validation/iaf_chxk_2008_conductance_test.py
+++ b/brainpy_state/_nest_validation/iaf_chxk_2008_conductance_test.py
@@ -26,7 +26,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/iaf_cond_alpha_conductance_test.py b/brainpy_state/_nest_validation/iaf_cond_alpha_conductance_test.py
index 1113a913..0b7bdf77 100644
--- a/brainpy_state/_nest_validation/iaf_cond_alpha_conductance_test.py
+++ b/brainpy_state/_nest_validation/iaf_cond_alpha_conductance_test.py
@@ -21,7 +21,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/iaf_cond_beta_conductance_test.py b/brainpy_state/_nest_validation/iaf_cond_beta_conductance_test.py
index eb6ab938..9e35e7fc 100644
--- a/brainpy_state/_nest_validation/iaf_cond_beta_conductance_test.py
+++ b/brainpy_state/_nest_validation/iaf_cond_beta_conductance_test.py
@@ -24,7 +24,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/iaf_cond_exp_sfa_rr_conductance_test.py b/brainpy_state/_nest_validation/iaf_cond_exp_sfa_rr_conductance_test.py
index bbb3b782..03a66a34 100644
--- a/brainpy_state/_nest_validation/iaf_cond_exp_sfa_rr_conductance_test.py
+++ b/brainpy_state/_nest_validation/iaf_cond_exp_sfa_rr_conductance_test.py
@@ -23,7 +23,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/iaf_psc_alpha_parity_test.py b/brainpy_state/_nest_validation/iaf_psc_alpha_parity_test.py
index cd11cde0..42d138ee 100644
--- a/brainpy_state/_nest_validation/iaf_psc_alpha_parity_test.py
+++ b/brainpy_state/_nest_validation/iaf_psc_alpha_parity_test.py
@@ -10,7 +10,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainpy_state
from brainpy_state._nest_network import one_to_one, EventProjection
diff --git a/brainpy_state/_nest_validation/iaf_tum_2000_stp_test.py b/brainpy_state/_nest_validation/iaf_tum_2000_stp_test.py
index dbb4f57e..112502db 100644
--- a/brainpy_state/_nest_validation/iaf_tum_2000_stp_test.py
+++ b/brainpy_state/_nest_validation/iaf_tum_2000_stp_test.py
@@ -49,7 +49,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_validation.nest_compare import compare_trace, requires_nest
from brainpy_state._nest_validation import tolerance_conventions as tc
diff --git a/brainpy_state/_nest_validation/if_curve_test.py b/brainpy_state/_nest_validation/if_curve_test.py
index 9a45c4ca..d72ef85a 100644
--- a/brainpy_state/_nest_validation/if_curve_test.py
+++ b/brainpy_state/_nest_validation/if_curve_test.py
@@ -17,7 +17,7 @@
import jax
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/izhikevich_test.py b/brainpy_state/_nest_validation/izhikevich_test.py
index 4d46dc80..e3f4510e 100644
--- a/brainpy_state/_nest_validation/izhikevich_test.py
+++ b/brainpy_state/_nest_validation/izhikevich_test.py
@@ -25,7 +25,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_validation.nest_compare import compare_trace, requires_nest
from brainpy_state._nest_validation import tolerance_conventions as tc
diff --git a/brainpy_state/_nest_validation/jonke_synapse_parity_test.py b/brainpy_state/_nest_validation/jonke_synapse_parity_test.py
index 4d996494..62ec52cb 100644
--- a/brainpy_state/_nest_validation/jonke_synapse_parity_test.py
+++ b/brainpy_state/_nest_validation/jonke_synapse_parity_test.py
@@ -16,7 +16,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import jonke_synapse
from brainpy_state._nest_validation.nest_compare import compare_trace, requires_nest
diff --git a/brainpy_state/_nest_validation/lin_rate_ipn_network_test.py b/brainpy_state/_nest_validation/lin_rate_ipn_network_test.py
index d8f08e92..ad2225f3 100644
--- a/brainpy_state/_nest_validation/lin_rate_ipn_network_test.py
+++ b/brainpy_state/_nest_validation/lin_rate_ipn_network_test.py
@@ -35,7 +35,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
diff --git a/brainpy_state/_nest_validation/mat_psc_exp_test.py b/brainpy_state/_nest_validation/mat_psc_exp_test.py
index 8bfe9693..8f1eb49f 100644
--- a/brainpy_state/_nest_validation/mat_psc_exp_test.py
+++ b/brainpy_state/_nest_validation/mat_psc_exp_test.py
@@ -28,7 +28,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_validation.nest_compare import compare_trace, requires_nest
from brainpy_state._nest_validation import tolerance_conventions as tc
diff --git a/brainpy_state/_nest_validation/mc_neuron_test.py b/brainpy_state/_nest_validation/mc_neuron_test.py
index d4b9eb94..d4ceecf9 100644
--- a/brainpy_state/_nest_validation/mc_neuron_test.py
+++ b/brainpy_state/_nest_validation/mc_neuron_test.py
@@ -32,7 +32,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_validation.nest_compare import compare_trace, requires_nest
from brainpy_state._nest_validation import tolerance_conventions as tc
diff --git a/brainpy_state/_nest_validation/multimeter_file_test.py b/brainpy_state/_nest_validation/multimeter_file_test.py
index 374bc3b6..52fa02d7 100644
--- a/brainpy_state/_nest_validation/multimeter_file_test.py
+++ b/brainpy_state/_nest_validation/multimeter_file_test.py
@@ -16,7 +16,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/one_neuron_test.py b/brainpy_state/_nest_validation/one_neuron_test.py
index 7a3a4461..ca0336f8 100644
--- a/brainpy_state/_nest_validation/one_neuron_test.py
+++ b/brainpy_state/_nest_validation/one_neuron_test.py
@@ -15,7 +15,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/one_neuron_with_noise_test.py b/brainpy_state/_nest_validation/one_neuron_with_noise_test.py
index 078df256..a2bc3b4f 100644
--- a/brainpy_state/_nest_validation/one_neuron_with_noise_test.py
+++ b/brainpy_state/_nest_validation/one_neuron_with_noise_test.py
@@ -14,7 +14,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/plot_weight_matrices_test.py b/brainpy_state/_nest_validation/plot_weight_matrices_test.py
index ebf57557..f58b4411 100644
--- a/brainpy_state/_nest_validation/plot_weight_matrices_test.py
+++ b/brainpy_state/_nest_validation/plot_weight_matrices_test.py
@@ -26,7 +26,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_validation.nest_compare import compare_distributional, requires_nest
from brainpy_state._nest_validation import tolerance_conventions as tc
diff --git a/brainpy_state/_nest_validation/pong_dopa_test.py b/brainpy_state/_nest_validation/pong_dopa_test.py
index 1e19db16..cc5ff82c 100644
--- a/brainpy_state/_nest_validation/pong_dopa_test.py
+++ b/brainpy_state/_nest_validation/pong_dopa_test.py
@@ -31,10 +31,10 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import spike_recorder
-from brainpy_state._nest_network._event_plastic import VoltageCoupledPlasticProj
+from brainpy_state._nest_network.event_plastic import VoltageCoupledPlasticProj
import examples.nest_like.pong_networks as pn
DT = pn.DT
diff --git a/brainpy_state/_nest_validation/pong_game_test.py b/brainpy_state/_nest_validation/pong_game_test.py
index 29bb3175..2914e55b 100644
--- a/brainpy_state/_nest_validation/pong_game_test.py
+++ b/brainpy_state/_nest_validation/pong_game_test.py
@@ -13,7 +13,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import examples.nest_like.pong as pong
diff --git a/brainpy_state/_nest_validation/pong_rstdp_test.py b/brainpy_state/_nest_validation/pong_rstdp_test.py
index 33243b61..42884428 100644
--- a/brainpy_state/_nest_validation/pong_rstdp_test.py
+++ b/brainpy_state/_nest_validation/pong_rstdp_test.py
@@ -34,7 +34,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import examples.nest_like.pong_networks as pn
from examples.nest_like.pong_networks import calculate_stdp, DT
diff --git a/brainpy_state/_nest_validation/pong_run_test.py b/brainpy_state/_nest_validation/pong_run_test.py
index c43291a5..8ab0596b 100644
--- a/brainpy_state/_nest_validation/pong_run_test.py
+++ b/brainpy_state/_nest_validation/pong_run_test.py
@@ -27,7 +27,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import examples.nest_like.pong as pong
import examples.nest_like.pong_run as pr
diff --git a/brainpy_state/_nest_validation/precise_spiking_test.py b/brainpy_state/_nest_validation/precise_spiking_test.py
index d3f76ce1..ca13448c 100644
--- a/brainpy_state/_nest_validation/precise_spiking_test.py
+++ b/brainpy_state/_nest_validation/precise_spiking_test.py
@@ -25,7 +25,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/pulsepacket_test.py b/brainpy_state/_nest_validation/pulsepacket_test.py
index f10515ad..b9af8274 100644
--- a/brainpy_state/_nest_validation/pulsepacket_test.py
+++ b/brainpy_state/_nest_validation/pulsepacket_test.py
@@ -22,7 +22,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/quantal_stp_parity_test.py b/brainpy_state/_nest_validation/quantal_stp_parity_test.py
index 986f937b..6ec85a05 100644
--- a/brainpy_state/_nest_validation/quantal_stp_parity_test.py
+++ b/brainpy_state/_nest_validation/quantal_stp_parity_test.py
@@ -25,7 +25,7 @@
from brainstate import transform
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainpy_state
from brainpy_state import quantal_stp_synapse
diff --git a/brainpy_state/_nest_validation/rate_core_edge_cases_test.py b/brainpy_state/_nest_validation/rate_core_edge_cases_test.py
index ffcf3ce2..dead01e8 100644
--- a/brainpy_state/_nest_validation/rate_core_edge_cases_test.py
+++ b/brainpy_state/_nest_validation/rate_core_edge_cases_test.py
@@ -25,7 +25,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
import braintools
diff --git a/brainpy_state/_nest_validation/rate_core_forloop_test.py b/brainpy_state/_nest_validation/rate_core_forloop_test.py
index 84db0eed..d21579ac 100644
--- a/brainpy_state/_nest_validation/rate_core_forloop_test.py
+++ b/brainpy_state/_nest_validation/rate_core_forloop_test.py
@@ -21,7 +21,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
import braintools
diff --git a/brainpy_state/_nest_validation/rate_core_no_nest_test.py b/brainpy_state/_nest_validation/rate_core_no_nest_test.py
index 69d2c96a..5ee17b46 100644
--- a/brainpy_state/_nest_validation/rate_core_no_nest_test.py
+++ b/brainpy_state/_nest_validation/rate_core_no_nest_test.py
@@ -34,7 +34,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
import braintools
diff --git a/brainpy_state/_nest_validation/rate_coupling_micro_parity_test.py b/brainpy_state/_nest_validation/rate_coupling_micro_parity_test.py
index 5e4620df..eab35478 100644
--- a/brainpy_state/_nest_validation/rate_coupling_micro_parity_test.py
+++ b/brainpy_state/_nest_validation/rate_coupling_micro_parity_test.py
@@ -31,7 +31,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
import braintools
diff --git a/brainpy_state/_nest_validation/rate_delayed_connection_parity_test.py b/brainpy_state/_nest_validation/rate_delayed_connection_parity_test.py
index 029eaf3c..a3f44b68 100644
--- a/brainpy_state/_nest_validation/rate_delayed_connection_parity_test.py
+++ b/brainpy_state/_nest_validation/rate_delayed_connection_parity_test.py
@@ -26,7 +26,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
import braintools
diff --git a/brainpy_state/_nest_validation/rate_generator_source_test.py b/brainpy_state/_nest_validation/rate_generator_source_test.py
index 5807bc47..028be54f 100644
--- a/brainpy_state/_nest_validation/rate_generator_source_test.py
+++ b/brainpy_state/_nest_validation/rate_generator_source_test.py
@@ -22,7 +22,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
import braintools
diff --git a/brainpy_state/_nest_validation/rate_mult_coupling_parity_test.py b/brainpy_state/_nest_validation/rate_mult_coupling_parity_test.py
index 5cf164a4..aa07629c 100644
--- a/brainpy_state/_nest_validation/rate_mult_coupling_parity_test.py
+++ b/brainpy_state/_nest_validation/rate_mult_coupling_parity_test.py
@@ -43,7 +43,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
import braintools
diff --git a/brainpy_state/_nest_validation/rate_network_parity_test.py b/brainpy_state/_nest_validation/rate_network_parity_test.py
index 2d6e916f..fa785509 100644
--- a/brainpy_state/_nest_validation/rate_network_parity_test.py
+++ b/brainpy_state/_nest_validation/rate_network_parity_test.py
@@ -42,7 +42,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
import braintools
diff --git a/brainpy_state/_nest_validation/rate_neuron_dm_test.py b/brainpy_state/_nest_validation/rate_neuron_dm_test.py
index 5d7264f2..cc5f8b56 100644
--- a/brainpy_state/_nest_validation/rate_neuron_dm_test.py
+++ b/brainpy_state/_nest_validation/rate_neuron_dm_test.py
@@ -30,7 +30,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u # noqa: F401 (kept for parity with sibling test modules / x64 env)
diff --git a/brainpy_state/_nest_validation/rate_nonlinearity_test.py b/brainpy_state/_nest_validation/rate_nonlinearity_test.py
index 3cf0b6b1..d0be2120 100644
--- a/brainpy_state/_nest_validation/rate_nonlinearity_test.py
+++ b/brainpy_state/_nest_validation/rate_nonlinearity_test.py
@@ -38,7 +38,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
import braintools
diff --git a/brainpy_state/_nest_validation/rate_transformer_node_substrate_test.py b/brainpy_state/_nest_validation/rate_transformer_node_substrate_test.py
index 05413e2f..abd457c5 100644
--- a/brainpy_state/_nest_validation/rate_transformer_node_substrate_test.py
+++ b/brainpy_state/_nest_validation/rate_transformer_node_substrate_test.py
@@ -22,7 +22,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
import braintools
diff --git a/brainpy_state/_nest_validation/receptors_and_current_test.py b/brainpy_state/_nest_validation/receptors_and_current_test.py
index a11ec3b1..62984b2d 100644
--- a/brainpy_state/_nest_validation/receptors_and_current_test.py
+++ b/brainpy_state/_nest_validation/receptors_and_current_test.py
@@ -37,7 +37,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_validation.nest_compare import compare_trace, requires_nest
from brainpy_state._nest_validation import tolerance_conventions as tc
diff --git a/brainpy_state/_nest_validation/recording_demo_test.py b/brainpy_state/_nest_validation/recording_demo_test.py
index b42fb595..38c88cb4 100644
--- a/brainpy_state/_nest_validation/recording_demo_test.py
+++ b/brainpy_state/_nest_validation/recording_demo_test.py
@@ -19,7 +19,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/repeated_stimulation_test.py b/brainpy_state/_nest_validation/repeated_stimulation_test.py
index af3d649c..6c1b05c4 100644
--- a/brainpy_state/_nest_validation/repeated_stimulation_test.py
+++ b/brainpy_state/_nest_validation/repeated_stimulation_test.py
@@ -13,7 +13,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/brainpy_state/_nest_validation/sensitivity_to_perturbation_test.py b/brainpy_state/_nest_validation/sensitivity_to_perturbation_test.py
index dd325c2c..3026add0 100644
--- a/brainpy_state/_nest_validation/sensitivity_to_perturbation_test.py
+++ b/brainpy_state/_nest_validation/sensitivity_to_perturbation_test.py
@@ -28,7 +28,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
diff --git a/brainpy_state/_nest_validation/siegert_diffusion_test.py b/brainpy_state/_nest_validation/siegert_diffusion_test.py
index c8dd32d2..c8067e9f 100644
--- a/brainpy_state/_nest_validation/siegert_diffusion_test.py
+++ b/brainpy_state/_nest_validation/siegert_diffusion_test.py
@@ -22,7 +22,7 @@
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/brainpy_state/_nest_validation/siegert_substrate_test.py b/brainpy_state/_nest_validation/siegert_substrate_test.py
index e58e2951..f9013082 100644
--- a/brainpy_state/_nest_validation/siegert_substrate_test.py
+++ b/brainpy_state/_nest_validation/siegert_substrate_test.py
@@ -28,7 +28,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
diff --git a/brainpy_state/_nest_validation/sinusoidal_gamma_generator_test.py b/brainpy_state/_nest_validation/sinusoidal_gamma_generator_test.py
index 3ab70a2c..af449aae 100644
--- a/brainpy_state/_nest_validation/sinusoidal_gamma_generator_test.py
+++ b/brainpy_state/_nest_validation/sinusoidal_gamma_generator_test.py
@@ -20,7 +20,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/sinusoidal_poisson_generator_test.py b/brainpy_state/_nest_validation/sinusoidal_poisson_generator_test.py
index a4ee38b0..84b9b963 100644
--- a/brainpy_state/_nest_validation/sinusoidal_poisson_generator_test.py
+++ b/brainpy_state/_nest_validation/sinusoidal_poisson_generator_test.py
@@ -19,7 +19,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/spatial_3d_test.py b/brainpy_state/_nest_validation/spatial_3d_test.py
index 783ad092..48c9ecb2 100644
--- a/brainpy_state/_nest_validation/spatial_3d_test.py
+++ b/brainpy_state/_nest_validation/spatial_3d_test.py
@@ -23,7 +23,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
diff --git a/brainpy_state/_nest_validation/spatial_exponential_test.py b/brainpy_state/_nest_validation/spatial_exponential_test.py
index d88c835d..c044ab4e 100644
--- a/brainpy_state/_nest_validation/spatial_exponential_test.py
+++ b/brainpy_state/_nest_validation/spatial_exponential_test.py
@@ -14,7 +14,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
diff --git a/brainpy_state/_nest_validation/spatial_gabor_test.py b/brainpy_state/_nest_validation/spatial_gabor_test.py
index c1532328..7247debd 100644
--- a/brainpy_state/_nest_validation/spatial_gabor_test.py
+++ b/brainpy_state/_nest_validation/spatial_gabor_test.py
@@ -16,7 +16,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
diff --git a/brainpy_state/_nest_validation/spatial_gamma_test.py b/brainpy_state/_nest_validation/spatial_gamma_test.py
index 65ac1678..c6271c4f 100644
--- a/brainpy_state/_nest_validation/spatial_gamma_test.py
+++ b/brainpy_state/_nest_validation/spatial_gamma_test.py
@@ -15,7 +15,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
diff --git a/brainpy_state/_nest_validation/spatial_gaussian_kernel_test.py b/brainpy_state/_nest_validation/spatial_gaussian_kernel_test.py
index 6781fc4a..aee3c45b 100644
--- a/brainpy_state/_nest_validation/spatial_gaussian_kernel_test.py
+++ b/brainpy_state/_nest_validation/spatial_gaussian_kernel_test.py
@@ -24,7 +24,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
diff --git a/brainpy_state/_nest_validation/spatial_grid_test.py b/brainpy_state/_nest_validation/spatial_grid_test.py
index 5c98941f..80279913 100644
--- a/brainpy_state/_nest_validation/spatial_grid_test.py
+++ b/brainpy_state/_nest_validation/spatial_grid_test.py
@@ -25,7 +25,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
diff --git a/brainpy_state/_nest_validation/spatial_masks_test.py b/brainpy_state/_nest_validation/spatial_masks_test.py
index ffeb8734..9af48de4 100644
--- a/brainpy_state/_nest_validation/spatial_masks_test.py
+++ b/brainpy_state/_nest_validation/spatial_masks_test.py
@@ -14,7 +14,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
@@ -25,7 +25,7 @@
from brainpy_state import Simulator, iaf_psc_alpha
from brainpy_state._nest_spatial import grid, spatial_pairwise_bernoulli
-from brainpy_state._nest_spatial._masks import rectangular, doughnut, elliptical, ellipsoidal
+from brainpy_state._nest_spatial.masks import rectangular, doughnut, elliptical, ellipsoidal
from brainpy_state._nest_validation.nest_compare import requires_nest
S2, E2 = [5, 5], [4.0, 4.0]
@@ -76,7 +76,7 @@ class TestMaskGeometry(unittest.TestCase):
def test_doughnut_is_circular_difference(self):
# doughnut(in, out) == circular(out) minus circular(in) (inner exclusive).
- from brainpy_state._nest_spatial._masks import circular
+ from brainpy_state._nest_spatial.masks import circular
inner, outer = 0.9, 1.8
outer_adj = _bp_adj(S2, E2, circular(outer))
inner_adj = _bp_adj(S2, E2, circular(inner))
@@ -86,7 +86,7 @@ def test_doughnut_is_circular_difference(self):
self.assertEqual(len(doughnut_adj & inner_adj), 0) # nothing strictly inside inner
def test_elliptical_major_equals_minor_is_circular(self):
- from brainpy_state._nest_spatial._masks import circular
+ from brainpy_state._nest_spatial.masks import circular
self.assertEqual(_bp_adj(S2, E2, elliptical(2.4, 2.4)),
_bp_adj(S2, E2, circular(1.2))) # semi == radius
diff --git a/brainpy_state/_nest_validation/spatial_queries_test.py b/brainpy_state/_nest_validation/spatial_queries_test.py
index 49c774ff..8323e85e 100644
--- a/brainpy_state/_nest_validation/spatial_queries_test.py
+++ b/brainpy_state/_nest_validation/spatial_queries_test.py
@@ -19,7 +19,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
@@ -30,8 +30,8 @@
from brainpy_state import Simulator, iaf_psc_alpha
from brainpy_state._nest_spatial import grid, spatial_pairwise_bernoulli
-from brainpy_state._nest_spatial._masks import circular, elliptical
-from brainpy_state._nest_spatial._helpers import (
+from brainpy_state._nest_spatial.masks import circular, elliptical
+from brainpy_state._nest_spatial.helpers import (
nearest_element, select_nodes_by_mask, dump_layer_nodes, dump_layer_connections,
)
from brainpy_state._nest_validation.nest_compare import requires_nest
diff --git a/brainpy_state/_nest_validation/static_synapse_parity_test.py b/brainpy_state/_nest_validation/static_synapse_parity_test.py
index dbdbd806..48dcdfec 100644
--- a/brainpy_state/_nest_validation/static_synapse_parity_test.py
+++ b/brainpy_state/_nest_validation/static_synapse_parity_test.py
@@ -18,7 +18,7 @@
from brainstate import transform
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainpy_state
from brainpy_state import static_synapse
diff --git a/brainpy_state/_nest_validation/stdp_dopamine_synapse_parity_test.py b/brainpy_state/_nest_validation/stdp_dopamine_synapse_parity_test.py
index 77cb801d..ac7f6031 100644
--- a/brainpy_state/_nest_validation/stdp_dopamine_synapse_parity_test.py
+++ b/brainpy_state/_nest_validation/stdp_dopamine_synapse_parity_test.py
@@ -35,7 +35,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_validation.nest_compare import compare_trace, requires_nest
from brainpy_state._nest_validation import tolerance_conventions as tc
diff --git a/brainpy_state/_nest_validation/stdp_facetshw_synapse_hom_parity_test.py b/brainpy_state/_nest_validation/stdp_facetshw_synapse_hom_parity_test.py
index 351777ab..812145a7 100644
--- a/brainpy_state/_nest_validation/stdp_facetshw_synapse_hom_parity_test.py
+++ b/brainpy_state/_nest_validation/stdp_facetshw_synapse_hom_parity_test.py
@@ -36,7 +36,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import stdp_facetshw_synapse_hom
from brainpy_state._nest_validation.nest_compare import compare_trace, requires_nest
diff --git a/brainpy_state/_nest_validation/stdp_nn_pre_centered_synapse_parity_test.py b/brainpy_state/_nest_validation/stdp_nn_pre_centered_synapse_parity_test.py
index a627a7d5..fa8a2bbb 100644
--- a/brainpy_state/_nest_validation/stdp_nn_pre_centered_synapse_parity_test.py
+++ b/brainpy_state/_nest_validation/stdp_nn_pre_centered_synapse_parity_test.py
@@ -26,7 +26,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import stdp_nn_pre_centered_synapse
from brainpy_state._nest_validation.nest_compare import compare_trace, requires_nest
diff --git a/brainpy_state/_nest_validation/stdp_nn_restr_synapse_parity_test.py b/brainpy_state/_nest_validation/stdp_nn_restr_synapse_parity_test.py
index b2a3c4e2..b8344746 100644
--- a/brainpy_state/_nest_validation/stdp_nn_restr_synapse_parity_test.py
+++ b/brainpy_state/_nest_validation/stdp_nn_restr_synapse_parity_test.py
@@ -26,7 +26,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import stdp_nn_restr_synapse
from brainpy_state._nest_validation.nest_compare import compare_trace, requires_nest
diff --git a/brainpy_state/_nest_validation/stdp_nn_symm_synapse_parity_test.py b/brainpy_state/_nest_validation/stdp_nn_symm_synapse_parity_test.py
index b6e370e9..b40a0266 100644
--- a/brainpy_state/_nest_validation/stdp_nn_symm_synapse_parity_test.py
+++ b/brainpy_state/_nest_validation/stdp_nn_symm_synapse_parity_test.py
@@ -29,7 +29,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import stdp_nn_symm_synapse
from brainpy_state._nest_validation.nest_compare import compare_trace, requires_nest
diff --git a/brainpy_state/_nest_validation/stdp_pl_synapse_hom_parity_test.py b/brainpy_state/_nest_validation/stdp_pl_synapse_hom_parity_test.py
index 921a9d53..db4dc182 100644
--- a/brainpy_state/_nest_validation/stdp_pl_synapse_hom_parity_test.py
+++ b/brainpy_state/_nest_validation/stdp_pl_synapse_hom_parity_test.py
@@ -16,7 +16,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import stdp_pl_synapse_hom
from brainpy_state._nest_validation.nest_compare import compare_trace, requires_nest
diff --git a/brainpy_state/_nest_validation/stdp_synapse_hom_parity_test.py b/brainpy_state/_nest_validation/stdp_synapse_hom_parity_test.py
index 41daae23..ade0f658 100644
--- a/brainpy_state/_nest_validation/stdp_synapse_hom_parity_test.py
+++ b/brainpy_state/_nest_validation/stdp_synapse_hom_parity_test.py
@@ -16,7 +16,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import stdp_synapse_hom
from brainpy_state._nest_validation.nest_compare import compare_trace, requires_nest
diff --git a/brainpy_state/_nest_validation/stdp_synapse_parity_test.py b/brainpy_state/_nest_validation/stdp_synapse_parity_test.py
index 983c51fa..d96cea90 100644
--- a/brainpy_state/_nest_validation/stdp_synapse_parity_test.py
+++ b/brainpy_state/_nest_validation/stdp_synapse_parity_test.py
@@ -16,7 +16,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import stdp_synapse
from brainpy_state._nest_validation.nest_compare import compare_trace, requires_nest
diff --git a/brainpy_state/_nest_validation/stdp_triplet_synapse_parity_test.py b/brainpy_state/_nest_validation/stdp_triplet_synapse_parity_test.py
index 99f56833..3b7cdfee 100644
--- a/brainpy_state/_nest_validation/stdp_triplet_synapse_parity_test.py
+++ b/brainpy_state/_nest_validation/stdp_triplet_synapse_parity_test.py
@@ -19,7 +19,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import stdp_triplet_synapse
from brainpy_state._nest_validation.nest_compare import compare_trace, requires_nest
diff --git a/brainpy_state/_nest_validation/stp_parity_test.py b/brainpy_state/_nest_validation/stp_parity_test.py
index e5eb6558..808b366d 100644
--- a/brainpy_state/_nest_validation/stp_parity_test.py
+++ b/brainpy_state/_nest_validation/stp_parity_test.py
@@ -34,7 +34,7 @@
from brainstate import transform
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainpy_state
from brainpy_state import tsodyks_synapse, tsodyks_synapse_hom, tsodyks2_synapse
diff --git a/brainpy_state/_nest_validation/sudoku_clue_clamp_test.py b/brainpy_state/_nest_validation/sudoku_clue_clamp_test.py
index a4e94f69..2cedc473 100644
--- a/brainpy_state/_nest_validation/sudoku_clue_clamp_test.py
+++ b/brainpy_state/_nest_validation/sudoku_clue_clamp_test.py
@@ -17,7 +17,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from examples.nest_like.sudoku_net import SudokuNet
diff --git a/brainpy_state/_nest_validation/sudoku_example_test.py b/brainpy_state/_nest_validation/sudoku_example_test.py
index 76fe196d..7518770e 100644
--- a/brainpy_state/_nest_validation/sudoku_example_test.py
+++ b/brainpy_state/_nest_validation/sudoku_example_test.py
@@ -17,7 +17,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from examples.nest_like import sudoku as harness
from examples.nest_like.sudoku_puzzles import get_puzzle, make_easy_puzzle
diff --git a/brainpy_state/_nest_validation/sudoku_solve_test.py b/brainpy_state/_nest_validation/sudoku_solve_test.py
index 4b0078d2..69690635 100644
--- a/brainpy_state/_nest_validation/sudoku_solve_test.py
+++ b/brainpy_state/_nest_validation/sudoku_solve_test.py
@@ -29,7 +29,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_validation.nest_compare import requires_nest
from examples.nest_like.sudoku_net import SudokuNet, SudokuSolver
diff --git a/brainpy_state/_nest_validation/sudoku_topology_test.py b/brainpy_state/_nest_validation/sudoku_topology_test.py
index 6a6adb88..7236c540 100644
--- a/brainpy_state/_nest_validation/sudoku_topology_test.py
+++ b/brainpy_state/_nest_validation/sudoku_topology_test.py
@@ -15,7 +15,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import Simulator, poisson_generator, parrot_neuron, spike_recorder
diff --git a/brainpy_state/_nest_validation/synapsecollection_test.py b/brainpy_state/_nest_validation/synapsecollection_test.py
index ff40c9d8..bd157e45 100644
--- a/brainpy_state/_nest_validation/synapsecollection_test.py
+++ b/brainpy_state/_nest_validation/synapsecollection_test.py
@@ -28,7 +28,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_validation.nest_compare import compare_distributional, requires_nest
from brainpy_state._nest_validation import tolerance_conventions as tc
diff --git a/brainpy_state/_nest_validation/testiaf_test.py b/brainpy_state/_nest_validation/testiaf_test.py
index 25952df2..73895879 100644
--- a/brainpy_state/_nest_validation/testiaf_test.py
+++ b/brainpy_state/_nest_validation/testiaf_test.py
@@ -15,7 +15,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/tripartite_connect_test.py b/brainpy_state/_nest_validation/tripartite_connect_test.py
index 858f2b32..e3dbcb5e 100644
--- a/brainpy_state/_nest_validation/tripartite_connect_test.py
+++ b/brainpy_state/_nest_validation/tripartite_connect_test.py
@@ -37,7 +37,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/two_comps_test.py b/brainpy_state/_nest_validation/two_comps_test.py
index 348b5087..cd85d5e0 100644
--- a/brainpy_state/_nest_validation/two_comps_test.py
+++ b/brainpy_state/_nest_validation/two_comps_test.py
@@ -37,7 +37,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_validation.nest_compare import compare_trace, requires_nest
from brainpy_state._nest_validation import tolerance_conventions as tc
diff --git a/brainpy_state/_nest_validation/twoneurons_test.py b/brainpy_state/_nest_validation/twoneurons_test.py
index cf36a3ea..2da25644 100644
--- a/brainpy_state/_nest_validation/twoneurons_test.py
+++ b/brainpy_state/_nest_validation/twoneurons_test.py
@@ -15,7 +15,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/vinit_example_test.py b/brainpy_state/_nest_validation/vinit_example_test.py
index 8bd01e73..727a8ea4 100644
--- a/brainpy_state/_nest_validation/vinit_example_test.py
+++ b/brainpy_state/_nest_validation/vinit_example_test.py
@@ -16,7 +16,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/vogels_sprekeler_synapse_parity_test.py b/brainpy_state/_nest_validation/vogels_sprekeler_synapse_parity_test.py
index 6bd8d630..028f0baf 100644
--- a/brainpy_state/_nest_validation/vogels_sprekeler_synapse_parity_test.py
+++ b/brainpy_state/_nest_validation/vogels_sprekeler_synapse_parity_test.py
@@ -15,7 +15,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import vogels_sprekeler_synapse
from brainpy_state._nest_validation.nest_compare import compare_trace, requires_nest
diff --git a/brainpy_state/_nest_validation/volume_transmitter_parity_test.py b/brainpy_state/_nest_validation/volume_transmitter_parity_test.py
index ce5af8ec..8cf9ef02 100644
--- a/brainpy_state/_nest_validation/volume_transmitter_parity_test.py
+++ b/brainpy_state/_nest_validation/volume_transmitter_parity_test.py
@@ -25,7 +25,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state._nest_validation.nest_compare import compare_trace, requires_nest
from brainpy_state._nest_validation import tolerance_conventions as tc
diff --git a/brainpy_state/_nest_validation/wang_decision_making_no_nest_test.py b/brainpy_state/_nest_validation/wang_decision_making_no_nest_test.py
index 00e506f1..2bfb0579 100644
--- a/brainpy_state/_nest_validation/wang_decision_making_no_nest_test.py
+++ b/brainpy_state/_nest_validation/wang_decision_making_no_nest_test.py
@@ -14,7 +14,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from examples.nest_like.wang_decision_making import (build, run_decision,
decision_from_rates)
diff --git a/brainpy_state/_nest_validation/wang_decision_making_test.py b/brainpy_state/_nest_validation/wang_decision_making_test.py
index 379a3bed..5c276db0 100644
--- a/brainpy_state/_nest_validation/wang_decision_making_test.py
+++ b/brainpy_state/_nest_validation/wang_decision_making_test.py
@@ -40,7 +40,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
try:
import nest
diff --git a/brainpy_state/_nest_validation/weight_recorder_audit_test.py b/brainpy_state/_nest_validation/weight_recorder_audit_test.py
index e3be4dae..3db63dda 100644
--- a/brainpy_state/_nest_validation/weight_recorder_audit_test.py
+++ b/brainpy_state/_nest_validation/weight_recorder_audit_test.py
@@ -33,7 +33,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import (
stdp_synapse, stdp_synapse_hom, stdp_pl_synapse_hom, jonke_synapse,
diff --git a/docs/Makefile b/docs/Makefile
index e8605adb..d386987c 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -1,21 +1,21 @@
-# Minimal makefile for Sphinx documentation
-#
-
-# You can set these variables from the command line, and also
-# from the environment for the first two.
-SPHINXOPTS ?=
-SPHINXBUILD ?= sphinx-build
-SPHINXPROJ = brainpy_state
-SOURCEDIR = .
-BUILDDIR = _build
-
-# Put it first so that "make" without argument is like "make help".
-help:
- @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
-
-.PHONY: help Makefile
-
-# Catch-all target: route all unknown targets to Sphinx using the new
-# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
-%: Makefile
- @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line, and also
+# from the environment for the first two.
+SPHINXOPTS ?=
+SPHINXBUILD ?= sphinx-build
+SPHINXPROJ = brainpy_state
+SOURCEDIR = .
+BUILDDIR = _build
+
+# Put it first so that "make" without argument is like "make help".
+help:
+ @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/docs/_templates/classtemplate.rst b/docs/_templates/classtemplate.rst
index 956b044f..eeb823a9 100644
--- a/docs/_templates/classtemplate.rst
+++ b/docs/_templates/classtemplate.rst
@@ -1,9 +1,9 @@
-.. role:: hidden
- :class: hidden-section
-.. currentmodule:: {{ module }}
-
-
-{{ name | underline}}
-
-.. autoclass:: {{ name }}
- :members:
+.. role:: hidden
+ :class: hidden-section
+.. currentmodule:: {{ module }}
+
+
+{{ name | underline}}
+
+.. autoclass:: {{ name }}
+ :members:
diff --git a/docs/api/base.rst b/docs/api/base.rst
index d79cf42f..132e753a 100644
--- a/docs/api/base.rst
+++ b/docs/api/base.rst
@@ -1,15 +1,15 @@
-Base Classes
-============
-
-Abstract base classes that all neuron and synapse models inherit from.
-
-.. currentmodule:: brainpy.state
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- Dynamics
- Neuron
- Synapse
+Base Classes
+============
+
+Abstract base classes that all neuron and synapse models inherit from.
+
+.. currentmodule:: brainpy.state
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ Dynamics
+ Neuron
+ Synapse
diff --git a/docs/api/brainpy-inputs.rst b/docs/api/brainpy-inputs.rst
index 4268728e..c3f1d552 100644
--- a/docs/api/brainpy-inputs.rst
+++ b/docs/api/brainpy-inputs.rst
@@ -1,29 +1,29 @@
-BrainPy-style Input Generators
-==============================
-
-Input spike and current generation models.
-
-.. currentmodule:: brainpy.state
-
-Spike Generators
-----------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- SpikeTime
- PoissonSpike
- PoissonEncoder
-
-Input Functions
----------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- PoissonInput
- poisson_input
+BrainPy-style Input Generators
+==============================
+
+Input spike and current generation models.
+
+.. currentmodule:: brainpy.state
+
+Spike Generators
+----------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ SpikeTime
+ PoissonSpike
+ PoissonEncoder
+
+Input Functions
+---------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ PoissonInput
+ poisson_input
diff --git a/docs/api/brainpy-neurons.rst b/docs/api/brainpy-neurons.rst
index 8eed4d8e..010f632a 100644
--- a/docs/api/brainpy-neurons.rst
+++ b/docs/api/brainpy-neurons.rst
@@ -1,51 +1,51 @@
-BrainPy-style Neurons
-=====================
-
-BrainPy-style spiking neuron models.
-
-.. currentmodule:: brainpy.state
-
-Leaky Integrate-and-Fire Models
--------------------------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- IF
- LIF
- LIFRef
- ALIF
- ExpIF
- ExpIFRef
- AdExIF
- AdExIFRef
- QuaIF
- AdQuaIF
- AdQuaIFRef
- Gif
- GifRef
-
-Izhikevich Models
------------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- Izhikevich
- IzhikevichRef
-
-Hodgkin-Huxley Models
----------------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- HH
- MorrisLecar
- WangBuzsakiHH
+BrainPy-style Neurons
+=====================
+
+BrainPy-style spiking neuron models.
+
+.. currentmodule:: brainpy.state
+
+Leaky Integrate-and-Fire Models
+-------------------------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ IF
+ LIF
+ LIFRef
+ ALIF
+ ExpIF
+ ExpIFRef
+ AdExIF
+ AdExIFRef
+ QuaIF
+ AdQuaIF
+ AdQuaIFRef
+ Gif
+ GifRef
+
+Izhikevich Models
+-----------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ Izhikevich
+ IzhikevichRef
+
+Hodgkin-Huxley Models
+---------------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ HH
+ MorrisLecar
+ WangBuzsakiHH
diff --git a/docs/api/brainpy-plasticity.rst b/docs/api/brainpy-plasticity.rst
index ee718ded..6d43010f 100644
--- a/docs/api/brainpy-plasticity.rst
+++ b/docs/api/brainpy-plasticity.rst
@@ -1,14 +1,14 @@
-BrainPy-style Plasticity
-========================
-
-Short-term synaptic plasticity models.
-
-.. currentmodule:: brainpy.state
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- STP
- STD
+BrainPy-style Plasticity
+========================
+
+Short-term synaptic plasticity models.
+
+.. currentmodule:: brainpy.state
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ STP
+ STD
diff --git a/docs/api/brainpy-projections.rst b/docs/api/brainpy-projections.rst
index 8cdc8268..af72366f 100644
--- a/docs/api/brainpy-projections.rst
+++ b/docs/api/brainpy-projections.rst
@@ -1,41 +1,41 @@
-BrainPy-style Projections
-=========================
-
-Connect neural populations with the Comm-Syn-Out architecture.
-
-.. currentmodule:: brainpy.state
-
-Projection Classes
-------------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- Projection
- AlignPostProj
- DeltaProj
- CurrentProj
-
-Projection Helper Functions
-----------------------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- align_pre_projection
- align_post_projection
-
-Gap Junction Projections
-------------------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- SymmetryGapJunction
- AsymmetryGapJunction
+BrainPy-style Projections
+=========================
+
+Connect neural populations with the Comm-Syn-Out architecture.
+
+.. currentmodule:: brainpy.state
+
+Projection Classes
+------------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ Projection
+ AlignPostProj
+ DeltaProj
+ CurrentProj
+
+Projection Helper Functions
+----------------------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ align_pre_projection
+ align_post_projection
+
+Gap Junction Projections
+------------------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ SymmetryGapJunction
+ AsymmetryGapJunction
diff --git a/docs/api/brainpy-readouts.rst b/docs/api/brainpy-readouts.rst
index c6a356c4..b46519f4 100644
--- a/docs/api/brainpy-readouts.rst
+++ b/docs/api/brainpy-readouts.rst
@@ -1,13 +1,13 @@
-BrainPy-style Readouts
-======================
-
-Readout modules for converting spiking or rate-coded outputs.
-
-.. currentmodule:: brainpy.state
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- LeakyRateReadout
+BrainPy-style Readouts
+======================
+
+Readout modules for converting spiking or rate-coded outputs.
+
+.. currentmodule:: brainpy.state
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ LeakyRateReadout
diff --git a/docs/api/brainpy-synapses.rst b/docs/api/brainpy-synapses.rst
index d4c1004c..24c6a078 100644
--- a/docs/api/brainpy-synapses.rst
+++ b/docs/api/brainpy-synapses.rst
@@ -1,30 +1,30 @@
-BrainPy-style Synapses
-======================
-
-BrainPy-style synaptic dynamics models.
-
-.. currentmodule:: brainpy.state
-
-Simple Synapse Models
----------------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- Expon
- DualExpon
- Alpha
-
-Biological Receptor Models
---------------------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- AMPA
- GABAa
- BioNMDA
+BrainPy-style Synapses
+======================
+
+BrainPy-style synaptic dynamics models.
+
+.. currentmodule:: brainpy.state
+
+Simple Synapse Models
+---------------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ Expon
+ DualExpon
+ Alpha
+
+Biological Receptor Models
+--------------------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ AMPA
+ GABAa
+ BioNMDA
diff --git a/docs/api/brainpy-synouts.rst b/docs/api/brainpy-synouts.rst
index 2164d412..15f367b4 100644
--- a/docs/api/brainpy-synouts.rst
+++ b/docs/api/brainpy-synouts.rst
@@ -1,16 +1,16 @@
-BrainPy-style Synaptic Outputs
-==============================
-
-Synaptic output models for converting conductances to currents.
-
-.. currentmodule:: brainpy.state
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- SynOut
- COBA
- CUBA
- MgBlock
+BrainPy-style Synaptic Outputs
+==============================
+
+Synaptic output models for converting conductances to currents.
+
+.. currentmodule:: brainpy.state
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ SynOut
+ COBA
+ CUBA
+ MgBlock
diff --git a/docs/api/nest-base.rst b/docs/api/nest-base.rst
index ebd59059..2f378baf 100644
--- a/docs/api/nest-base.rst
+++ b/docs/api/nest-base.rst
@@ -1,42 +1,42 @@
-.. warning::
-
- **Experimental — In Development.** The NEST-compatible model family is
- under active development. Parameter names, defaults, numerical behavior,
- and the set of available models may change without notice across 0.0.x
- releases. See the :doc:`NEST-style status page ` for
- current scope and limitations.
-
-
-NEST Base Classes
-=================
-
-Abstract marker base classes for all NEST-compatible models in
-``brainpy.state``. Every NEST-compatible class inherits from exactly one
-of these four bases, which makes it easy to introspect model type at
-runtime (e.g. ``isinstance(model, NESTPlasticity)``).
-
-.. currentmodule:: brainpy.state
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- NESTNeuron
- NESTSynapse
- NESTPlasticity
- NESTDevice
-
-
-Class Hierarchy
----------------
-
-.. code-block:: text
-
- brainstate.nn.Dynamics
- └─ Dynamics (_base.py)
- ├─ Neuron (_base.py)
- │ └─ NESTNeuron (_nest_base/_base.py)
- ├─ NESTSynapse (_nest_base/_base.py)
- │ └─ NESTPlasticity (_nest_base/_base.py)
- └─ NESTDevice (_nest_base/_base.py)
+.. warning::
+
+ **Experimental — In Development.** The NEST-compatible model family is
+ under active development. Parameter names, defaults, numerical behavior,
+ and the set of available models may change without notice across 0.0.x
+ releases. See the :doc:`NEST-style status page ` for
+ current scope and limitations.
+
+
+NEST Base Classes
+=================
+
+Abstract marker base classes for all NEST-compatible models in
+``brainpy.state``. Every NEST-compatible class inherits from exactly one
+of these four bases, which makes it easy to introspect model type at
+runtime (e.g. ``isinstance(model, NESTPlasticity)``).
+
+.. currentmodule:: brainpy.state
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ NESTNeuron
+ NESTSynapse
+ NESTPlasticity
+ NESTDevice
+
+
+Class Hierarchy
+---------------
+
+.. code-block:: text
+
+ brainstate.nn.Dynamics
+ └─ Dynamics (_base.py)
+ ├─ Neuron (_base.py)
+ │ └─ NESTNeuron (_nest_base/_base.py)
+ ├─ NESTSynapse (_nest_base/_base.py)
+ │ └─ NESTPlasticity (_nest_base/_base.py)
+ └─ NESTDevice (_nest_base/_base.py)
diff --git a/docs/api/nest-devices.rst b/docs/api/nest-devices.rst
index 45a36acf..18b676fc 100644
--- a/docs/api/nest-devices.rst
+++ b/docs/api/nest-devices.rst
@@ -1,110 +1,110 @@
-.. warning::
-
- **Experimental — In Development.** The NEST-compatible model family is
- under active development. Parameter names, defaults, numerical behavior,
- and the set of available models may change without notice across 0.0.x
- releases. See the :doc:`NEST-style status page ` for
- current scope and limitations.
-
-
-NEST-Compatible Devices
-=======================
-
-Stimulation and recording devices compatible with the `NEST simulator `_.
-
-.. currentmodule:: brainpy.state
-
-
-Current Generators
-------------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- dc_generator
- ac_generator
- noise_generator
- step_current_generator
- step_rate_generator
-
-
-Spike Generators
-----------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- spike_generator
- spike_train_injector
- spike_dilutor
-
-
-Poisson Generators
-------------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- poisson_generator
- poisson_generator_ps
- inhomogeneous_poisson_generator
- sinusoidal_poisson_generator
-
-
-Other Generators
-----------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- gamma_sup_generator
- sinusoidal_gamma_generator
- mip_generator
- ppd_sup_generator
- pulsepacket_generator
-
-
-Recording Devices
------------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- multimeter
- spike_recorder
- weight_recorder
-
-
-Detectors
----------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- correlation_detector
- correlomatrix_detector
- correlospinmatrix_detector
- spin_detector
-
-
-Other Devices
--------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- volume_transmitter
+.. warning::
+
+ **Experimental — In Development.** The NEST-compatible model family is
+ under active development. Parameter names, defaults, numerical behavior,
+ and the set of available models may change without notice across 0.0.x
+ releases. See the :doc:`NEST-style status page ` for
+ current scope and limitations.
+
+
+NEST-Compatible Devices
+=======================
+
+Stimulation and recording devices compatible with the `NEST simulator `_.
+
+.. currentmodule:: brainpy.state
+
+
+Current Generators
+------------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ dc_generator
+ ac_generator
+ noise_generator
+ step_current_generator
+ step_rate_generator
+
+
+Spike Generators
+----------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ spike_generator
+ spike_train_injector
+ spike_dilutor
+
+
+Poisson Generators
+------------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ poisson_generator
+ poisson_generator_ps
+ inhomogeneous_poisson_generator
+ sinusoidal_poisson_generator
+
+
+Other Generators
+----------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ gamma_sup_generator
+ sinusoidal_gamma_generator
+ mip_generator
+ ppd_sup_generator
+ pulsepacket_generator
+
+
+Recording Devices
+-----------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ multimeter
+ spike_recorder
+ weight_recorder
+
+
+Detectors
+---------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ correlation_detector
+ correlomatrix_detector
+ correlospinmatrix_detector
+ spin_detector
+
+
+Other Devices
+-------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ volume_transmitter
diff --git a/docs/api/nest-neurons.rst b/docs/api/nest-neurons.rst
index eab62cb3..e57573bc 100644
--- a/docs/api/nest-neurons.rst
+++ b/docs/api/nest-neurons.rst
@@ -1,210 +1,210 @@
-.. warning::
-
- **Experimental — In Development.** The NEST-compatible model family is
- under active development. Parameter names, defaults, numerical behavior,
- and the set of available models may change without notice across 0.0.x
- releases. See the :doc:`NEST-style status page ` for
- current scope and limitations.
-
-
-NEST-Compatible Neuron Models
-=============================
-
-Neuron models compatible with the `NEST simulator `_.
-
-.. currentmodule:: brainpy.state
-
-
-IAF Neurons — Current-Based (psc)
-----------------------------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- iaf_psc_delta
- iaf_psc_delta_ps
- iaf_psc_alpha
- iaf_psc_alpha_multisynapse
- iaf_psc_alpha_ps
- iaf_psc_exp
- iaf_psc_exp_multisynapse
- iaf_psc_exp_htum
- iaf_psc_exp_ps
- iaf_psc_exp_ps_lossless
-
-
-IAF Neurons — Conductance-Based (cond)
----------------------------------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- iaf_cond_alpha
- iaf_cond_alpha_mc
- iaf_cond_beta
- iaf_cond_exp
- iaf_cond_exp_sfa_rr
-
-
-IAF Neurons — Specialized Variants
-------------------------------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- iaf_bw_2001
- iaf_bw_2001_exact
- iaf_chs_2007
- iaf_chxk_2008
- iaf_tum_2000
-
-
-Adaptive Exponential IF (AdEx) Neurons
---------------------------------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- aeif_cond_alpha
- aeif_cond_alpha_astro
- aeif_cond_alpha_multisynapse
- aeif_cond_beta_multisynapse
- aeif_cond_exp
- aeif_psc_alpha
- aeif_psc_delta
- aeif_psc_delta_clopath
- aeif_psc_exp
-
-
-Generalized IF (GIF) Neurons
------------------------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- gif_cond_exp
- gif_cond_exp_multisynapse
- gif_pop_psc_exp
- gif_psc_exp
- gif_psc_exp_multisynapse
-
-
-Multi-Timescale Adaptive Threshold (MAT) Neurons
--------------------------------------------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- mat2_psc_exp
- amat2_psc_exp
-
-
-Generalized LIF (GLIF) Neurons — Allen Institute
--------------------------------------------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- glif_cond
- glif_psc
- glif_psc_double_alpha
-
-
-Hodgkin-Huxley Family
----------------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- hh_psc_alpha
- hh_psc_alpha_clopath
- hh_psc_alpha_gap
- hh_cond_exp_traub
- hh_cond_beta_gap_traub
- ht_neuron
-
-
-Izhikevich Neuron
------------------
-
-.. autosummary::
- :toctree: generated/nest/
- :nosignatures:
- :template: classtemplate.rst
-
- izhikevich
-
-
-Point Process Neurons
----------------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- pp_psc_delta
- pp_cond_exp_mc_urbanczik
-
-
-Binary Neurons
---------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- mcculloch_pitts_neuron
- ginzburg_neuron
- erfc_neuron
-
-
-Rate Neurons
-------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- lin_rate_ipn
- lin_rate_opn
- tanh_rate_ipn
- tanh_rate_opn
- sigmoid_rate_ipn
- sigmoid_rate_gg_1998_ipn
- gauss_rate_ipn
- threshold_lin_rate_ipn
- threshold_lin_rate_opn
- rate_neuron_ipn
- rate_neuron_opn
- rate_transformer_node
- siegert_neuron
-
-
-Other Spiking Neurons
----------------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- ignore_and_fire
+.. warning::
+
+ **Experimental — In Development.** The NEST-compatible model family is
+ under active development. Parameter names, defaults, numerical behavior,
+ and the set of available models may change without notice across 0.0.x
+ releases. See the :doc:`NEST-style status page ` for
+ current scope and limitations.
+
+
+NEST-Compatible Neuron Models
+=============================
+
+Neuron models compatible with the `NEST simulator `_.
+
+.. currentmodule:: brainpy.state
+
+
+IAF Neurons — Current-Based (psc)
+----------------------------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ iaf_psc_delta
+ iaf_psc_delta_ps
+ iaf_psc_alpha
+ iaf_psc_alpha_multisynapse
+ iaf_psc_alpha_ps
+ iaf_psc_exp
+ iaf_psc_exp_multisynapse
+ iaf_psc_exp_htum
+ iaf_psc_exp_ps
+ iaf_psc_exp_ps_lossless
+
+
+IAF Neurons — Conductance-Based (cond)
+---------------------------------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ iaf_cond_alpha
+ iaf_cond_alpha_mc
+ iaf_cond_beta
+ iaf_cond_exp
+ iaf_cond_exp_sfa_rr
+
+
+IAF Neurons — Specialized Variants
+------------------------------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ iaf_bw_2001
+ iaf_bw_2001_exact
+ iaf_chs_2007
+ iaf_chxk_2008
+ iaf_tum_2000
+
+
+Adaptive Exponential IF (AdEx) Neurons
+--------------------------------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ aeif_cond_alpha
+ aeif_cond_alpha_astro
+ aeif_cond_alpha_multisynapse
+ aeif_cond_beta_multisynapse
+ aeif_cond_exp
+ aeif_psc_alpha
+ aeif_psc_delta
+ aeif_psc_delta_clopath
+ aeif_psc_exp
+
+
+Generalized IF (GIF) Neurons
+-----------------------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ gif_cond_exp
+ gif_cond_exp_multisynapse
+ gif_pop_psc_exp
+ gif_psc_exp
+ gif_psc_exp_multisynapse
+
+
+Multi-Timescale Adaptive Threshold (MAT) Neurons
+-------------------------------------------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ mat2_psc_exp
+ amat2_psc_exp
+
+
+Generalized LIF (GLIF) Neurons — Allen Institute
+-------------------------------------------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ glif_cond
+ glif_psc
+ glif_psc_double_alpha
+
+
+Hodgkin-Huxley Family
+---------------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ hh_psc_alpha
+ hh_psc_alpha_clopath
+ hh_psc_alpha_gap
+ hh_cond_exp_traub
+ hh_cond_beta_gap_traub
+ ht_neuron
+
+
+Izhikevich Neuron
+-----------------
+
+.. autosummary::
+ :toctree: generated/nest/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ izhikevich
+
+
+Point Process Neurons
+---------------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ pp_psc_delta
+ pp_cond_exp_mc_urbanczik
+
+
+Binary Neurons
+--------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ mcculloch_pitts_neuron
+ ginzburg_neuron
+ erfc_neuron
+
+
+Rate Neurons
+------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ lin_rate_ipn
+ lin_rate_opn
+ tanh_rate_ipn
+ tanh_rate_opn
+ sigmoid_rate_ipn
+ sigmoid_rate_gg_1998_ipn
+ gauss_rate_ipn
+ threshold_lin_rate_ipn
+ threshold_lin_rate_opn
+ rate_neuron_ipn
+ rate_neuron_opn
+ rate_transformer_node
+ siegert_neuron
+
+
+Other Spiking Neurons
+---------------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ ignore_and_fire
diff --git a/docs/api/nest-plasticity.rst b/docs/api/nest-plasticity.rst
index d5483db5..9ab30a20 100644
--- a/docs/api/nest-plasticity.rst
+++ b/docs/api/nest-plasticity.rst
@@ -1,75 +1,75 @@
-.. warning::
-
- **Experimental — In Development.** The NEST-compatible model family is
- under active development. Parameter names, defaults, numerical behavior,
- and the set of available models may change without notice across 0.0.x
- releases. See the :doc:`NEST-style status page ` for
- current scope and limitations.
-
-
-NEST-Compatible Plasticity Models
-==================================
-
-Activity-dependent plasticity synapse models compatible with the
-`NEST simulator `_.
-All classes inherit from :class:`NESTPlasticity`.
-For static and structural synapse models see :doc:`nest-synapses`.
-
-.. currentmodule:: brainpy.state
-
-
-Short-Term Plasticity (STP)
-----------------------------
-
-Transient, reversible weight changes on the timescale of individual spikes,
-following the Tsodyks-Markram formalism.
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- tsodyks_synapse
- tsodyks_synapse_hom
- tsodyks2_synapse
- quantal_stp_synapse
-
-
-Spike-Timing Dependent Plasticity (STDP)
------------------------------------------
-
-Long-term weight changes driven by the relative timing of pre- and
-post-synaptic spikes.
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- stdp_synapse
- stdp_synapse_hom
- stdp_pl_synapse_hom
- stdp_facetshw_synapse_hom
- stdp_nn_pre_centered_synapse
- stdp_nn_restr_synapse
- stdp_nn_symm_synapse
- stdp_triplet_synapse
- stdp_dopamine_synapse
-
-
-Voltage-Based / Specialised Learning Rules
--------------------------------------------
-
-Weight updates that depend on membrane voltage trajectories or
-supervised teaching signals.
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- clopath_synapse
- jonke_synapse
- urbanczik_synapse
- vogels_sprekeler_synapse
- ht_synapse
+.. warning::
+
+ **Experimental — In Development.** The NEST-compatible model family is
+ under active development. Parameter names, defaults, numerical behavior,
+ and the set of available models may change without notice across 0.0.x
+ releases. See the :doc:`NEST-style status page ` for
+ current scope and limitations.
+
+
+NEST-Compatible Plasticity Models
+==================================
+
+Activity-dependent plasticity synapse models compatible with the
+`NEST simulator `_.
+All classes inherit from :class:`NESTPlasticity`.
+For static and structural synapse models see :doc:`nest-synapses`.
+
+.. currentmodule:: brainpy.state
+
+
+Short-Term Plasticity (STP)
+----------------------------
+
+Transient, reversible weight changes on the timescale of individual spikes,
+following the Tsodyks-Markram formalism.
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ tsodyks_synapse
+ tsodyks_synapse_hom
+ tsodyks2_synapse
+ quantal_stp_synapse
+
+
+Spike-Timing Dependent Plasticity (STDP)
+-----------------------------------------
+
+Long-term weight changes driven by the relative timing of pre- and
+post-synaptic spikes.
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ stdp_synapse
+ stdp_synapse_hom
+ stdp_pl_synapse_hom
+ stdp_facetshw_synapse_hom
+ stdp_nn_pre_centered_synapse
+ stdp_nn_restr_synapse
+ stdp_nn_symm_synapse
+ stdp_triplet_synapse
+ stdp_dopamine_synapse
+
+
+Voltage-Based / Specialised Learning Rules
+-------------------------------------------
+
+Weight updates that depend on membrane voltage trajectories or
+supervised teaching signals.
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ clopath_synapse
+ jonke_synapse
+ urbanczik_synapse
+ vogels_sprekeler_synapse
+ ht_synapse
diff --git a/docs/api/nest-synapses.rst b/docs/api/nest-synapses.rst
index 4b526893..99ac8b13 100644
--- a/docs/api/nest-synapses.rst
+++ b/docs/api/nest-synapses.rst
@@ -1,46 +1,46 @@
-.. warning::
-
- **Experimental — In Development.** The NEST-compatible model family is
- under active development. Parameter names, defaults, numerical behavior,
- and the set of available models may change without notice across 0.0.x
- releases. See the :doc:`NEST-style status page ` for
- current scope and limitations.
-
-
-NEST-Compatible Synapse Models
-==============================
-
-Static and structural synapse models compatible with the
-`NEST simulator `_.
-For activity-dependent plasticity models see :doc:`nest-plasticity`.
-
-.. currentmodule:: brainpy.state
-
-
-Static Synapses
----------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- static_synapse
- static_synapse_hom_w
- bernoulli_synapse
- cont_delay_synapse
-
-
-Gap Junctions & Special Connections
-------------------------------------
-
-.. autosummary::
- :toctree: generated/
- :nosignatures:
- :template: classtemplate.rst
-
- gap_junction
- diffusion_connection
- rate_connection_instantaneous
- rate_connection_delayed
- sic_connection
+.. warning::
+
+ **Experimental — In Development.** The NEST-compatible model family is
+ under active development. Parameter names, defaults, numerical behavior,
+ and the set of available models may change without notice across 0.0.x
+ releases. See the :doc:`NEST-style status page ` for
+ current scope and limitations.
+
+
+NEST-Compatible Synapse Models
+==============================
+
+Static and structural synapse models compatible with the
+`NEST simulator `_.
+For activity-dependent plasticity models see :doc:`nest-plasticity`.
+
+.. currentmodule:: brainpy.state
+
+
+Static Synapses
+---------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ static_synapse
+ static_synapse_hom_w
+ bernoulli_synapse
+ cont_delay_synapse
+
+
+Gap Junctions & Special Connections
+------------------------------------
+
+.. autosummary::
+ :toctree: generated/
+ :nosignatures:
+ :template: classtemplate.rst
+
+ gap_junction
+ diffusion_connection
+ rate_connection_instantaneous
+ rate_connection_delayed
+ sic_connection
diff --git a/docs/conf.py b/docs/conf.py
index 0587e78c..53b45f26 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -1,165 +1,165 @@
-# Configuration file for the Sphinx documentation builder.
-#
-# This file only contains a selection of the most common options. For a full
-# a_list see the documentation:
-# https://www.sphinx-doc.org/en/master/usage/configuration.html
-
-# -- Path setup --------------------------------------------------------------
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-#
-
-import os
-import shutil
-import sys
-
-sys.path.insert(0, os.path.abspath('../docs/'))
-sys.path.insert(0, os.path.abspath('../'))
-shutil.copyfile('../changelog.md', './changelog.md')
-shutil.rmtree('./_build', ignore_errors=True)
-shutil.rmtree('./__pycache__', ignore_errors=True)
-shutil.rmtree('./api/generated', ignore_errors=True)
-
-# -- Project information -----------------------------------------------------
-
-project = 'brainpy.state'
-copyright = '2020-, brainpy.state'
-author = 'BrainX Team'
-
-from highlight_lexer import fix_ipython2_lexer_in_notebooks
-
-fix_ipython2_lexer_in_notebooks(os.path.dirname(os.path.abspath(__file__)))
-
-import brainpy_state
-
-release = brainpy_state.__version__
-
-# -- General configuration ---------------------------------------------------
-
-# Add any Sphinx extension module names here, as strings. They can be
-# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
-# ones.
-extensions = [
- 'sphinx.ext.autodoc',
- 'sphinx.ext.autosummary',
- 'sphinx.ext.intersphinx',
- 'sphinx.ext.mathjax',
- 'sphinx.ext.napoleon',
- 'sphinx.ext.viewcode',
- 'sphinx_autodoc_typehints',
- 'myst_nb',
- 'matplotlib.sphinxext.plot_directive',
- 'sphinx_thebe',
- 'sphinx_design',
- 'sphinx_math_dollar',
- 'brainx_sphinx_header',
- # 'sphinx-mathjax-offline',
-]
-
-
-
-html_baseurl = 'https://brainx.chaobrain.com/brainpy-state/'
-
-# Prefer NumPy-style docstrings across the API docs.
-napoleon_google_docstring = False
-napoleon_numpy_docstring = True
-napoleon_include_init_with_doc = True
-napoleon_include_private_with_doc = False
-napoleon_include_special_with_doc = False
-napoleon_use_admonition_for_examples = False
-napoleon_use_admonition_for_notes = False
-napoleon_use_admonition_for_references = False
-napoleon_use_ivar = False
-napoleon_use_param = True
-napoleon_use_rtype = True
-napoleon_preprocess_types = True
-napoleon_attr_annotations = True
-napoleon_custom_sections = [
- 'Additional State Variables',
- 'Attributes (State Variables)',
- 'Attributes Set',
- 'Comparison with tsodyks_synapse',
- 'Computational Complexity',
- 'Computational Complexity and Performance',
- 'Computational Properties',
- 'Computational considerations',
- 'Description',
- 'Event timing semantics',
- 'Failure Modes',
- 'Implementation Notes',
- 'Mathematical Description',
- 'Mathematical Formulation',
- 'Mathematical Interpretation',
- 'Mathematical Model',
- 'Mathematical formulation',
- 'Mathematical model',
- 'Numerical Considerations',
- 'Parameter Mapping',
- 'Receptor Types',
- 'Recordables',
- 'Short description',
- 'Short Description',
- 'Side Effects',
- 'State variables',
- 'State Variables',
- 'Summary',
- 'Update Procedure',
- 'Warnings',
-]
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
-source_suffix = ['.rst', '.ipynb', '.md']
-
-# source_suffix = '.rst'
-autosummary_generate = True
-
-# The master toctree document.
-master_doc = 'index'
-intersphinx_mapping = {
- "python": ("https://docs.python.org/3.8", None),
- "sphinx": ("https://www.sphinx-doc.org/en/master", None),
-}
-nitpick_ignore = [
- ("py:class", "docutils.nodes.document"),
- ("py:class", "docutils.parsers.rst.directives.body.Sidebar"),
-]
-suppress_warnings = ["myst.domains", "ref.ref", "ref.footnote"]
-numfig = True
-myst_enable_extensions = ["dollarmath", "amsmath", "deflist", "colon_fence"]
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-# This pattern also affects html_static_path and html_extra_path.
-exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store', 'nest-status/internal/**', 'superpowers/**']
-
-
-html_theme = "sphinx_book_theme"
-html_logo = "_static/brainpystate_vertical.png"
-html_title = "brainpy.state documentation"
-html_copy_source = True
-html_sourcelink_suffix = ""
-html_favicon = "_static/brainpystate_vertical.png"
-html_last_updated_fmt = ""
-html_css_files = ['css/theme.css']
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ["_static"]
-jupyter_execute_notebooks = "off"
-thebe_config = {
- "repository_url": "https://github.com/binder-examples/jupyter-stacks-datascience",
- "repository_branch": "master",
-}
-
-# -- Options for myst ----------------------------------------------
-# Notebook cell execution timeout; defaults to 30.
-execution_timeout = 200
-
-autodoc_default_options = {
- 'exclude-members': '....,default_rng',
-}
+# Configuration file for the Sphinx documentation builder.
+#
+# This file only contains a selection of the most common options. For a full
+# a_list see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+# -- Path setup --------------------------------------------------------------
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#
+
+import os
+import shutil
+import sys
+
+sys.path.insert(0, os.path.abspath('../docs/'))
+sys.path.insert(0, os.path.abspath('../'))
+shutil.copyfile('../changelog.md', './changelog.md')
+shutil.rmtree('./_build', ignore_errors=True)
+shutil.rmtree('./__pycache__', ignore_errors=True)
+shutil.rmtree('./api/generated', ignore_errors=True)
+
+# -- Project information -----------------------------------------------------
+
+project = 'brainpy.state'
+copyright = '2020-, brainpy.state'
+author = 'BrainX Team'
+
+from highlight_lexer import fix_ipython2_lexer_in_notebooks
+
+fix_ipython2_lexer_in_notebooks(os.path.dirname(os.path.abspath(__file__)))
+
+import brainpy_state
+
+release = brainpy_state.__version__
+
+# -- General configuration ---------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+ 'sphinx.ext.autodoc',
+ 'sphinx.ext.autosummary',
+ 'sphinx.ext.intersphinx',
+ 'sphinx.ext.mathjax',
+ 'sphinx.ext.napoleon',
+ 'sphinx.ext.viewcode',
+ 'sphinx_autodoc_typehints',
+ 'myst_nb',
+ 'matplotlib.sphinxext.plot_directive',
+ 'sphinx_thebe',
+ 'sphinx_design',
+ 'sphinx_math_dollar',
+ 'brainx_sphinx_header',
+ # 'sphinx-mathjax-offline',
+]
+
+
+
+html_baseurl = 'https://brainx.chaobrain.com/brainpy-state/'
+
+# Prefer NumPy-style docstrings across the API docs.
+napoleon_google_docstring = False
+napoleon_numpy_docstring = True
+napoleon_include_init_with_doc = True
+napoleon_include_private_with_doc = False
+napoleon_include_special_with_doc = False
+napoleon_use_admonition_for_examples = False
+napoleon_use_admonition_for_notes = False
+napoleon_use_admonition_for_references = False
+napoleon_use_ivar = False
+napoleon_use_param = True
+napoleon_use_rtype = True
+napoleon_preprocess_types = True
+napoleon_attr_annotations = True
+napoleon_custom_sections = [
+ 'Additional State Variables',
+ 'Attributes (State Variables)',
+ 'Attributes Set',
+ 'Comparison with tsodyks_synapse',
+ 'Computational Complexity',
+ 'Computational Complexity and Performance',
+ 'Computational Properties',
+ 'Computational considerations',
+ 'Description',
+ 'Event timing semantics',
+ 'Failure Modes',
+ 'Implementation Notes',
+ 'Mathematical Description',
+ 'Mathematical Formulation',
+ 'Mathematical Interpretation',
+ 'Mathematical Model',
+ 'Mathematical formulation',
+ 'Mathematical model',
+ 'Numerical Considerations',
+ 'Parameter Mapping',
+ 'Receptor Types',
+ 'Recordables',
+ 'Short description',
+ 'Short Description',
+ 'Side Effects',
+ 'State variables',
+ 'State Variables',
+ 'Summary',
+ 'Update Procedure',
+ 'Warnings',
+]
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+source_suffix = ['.rst', '.ipynb', '.md']
+
+# source_suffix = '.rst'
+autosummary_generate = True
+
+# The master toctree document.
+master_doc = 'index'
+intersphinx_mapping = {
+ "python": ("https://docs.python.org/3.8", None),
+ "sphinx": ("https://www.sphinx-doc.org/en/master", None),
+}
+nitpick_ignore = [
+ ("py:class", "docutils.nodes.document"),
+ ("py:class", "docutils.parsers.rst.directives.body.Sidebar"),
+]
+suppress_warnings = ["myst.domains", "ref.ref", "ref.footnote"]
+numfig = True
+myst_enable_extensions = ["dollarmath", "amsmath", "deflist", "colon_fence"]
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This pattern also affects html_static_path and html_extra_path.
+exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store', 'nest-status/internal/**', 'superpowers/**']
+
+
+html_theme = "sphinx_book_theme"
+html_logo = "_static/brainpystate_vertical.png"
+html_title = "brainpy.state documentation"
+html_copy_source = True
+html_sourcelink_suffix = ""
+html_favicon = "_static/brainpystate_vertical.png"
+html_last_updated_fmt = ""
+html_css_files = ['css/theme.css']
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ["_static"]
+jupyter_execute_notebooks = "off"
+thebe_config = {
+ "repository_url": "https://github.com/binder-examples/jupyter-stacks-datascience",
+ "repository_branch": "master",
+}
+
+# -- Options for myst ----------------------------------------------
+# Notebook cell execution timeout; defaults to 30.
+execution_timeout = 200
+
+autodoc_default_options = {
+ 'exclude-members': '....,default_rng',
+}
diff --git a/docs/examples/gallery.rst b/docs/examples/gallery.rst
index 7deef781..4707c091 100644
--- a/docs/examples/gallery.rst
+++ b/docs/examples/gallery.rst
@@ -1,182 +1,182 @@
-Examples Gallery
-================
-
-Welcome to the ``brainpy.state`` examples gallery! Here you'll find complete, runnable examples demonstrating various aspects of computational neuroscience modeling.
-
-All examples are available in the `examples/ `_ directory of the brainpy.state repository.
-
-Classical Network Models
--------------------------
-
-These examples reproduce influential models from the computational neuroscience literature.
-
-.. grid:: 2
- :gutter: 3
-
- .. grid-item-card:: E-I Balanced Networks
- :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/102_EI_net_1996.py
-
- Implements the classic excitatory-inhibitory balanced network showing chaotic dynamics.
-
- - 80% excitatory, 20% inhibitory neurons
- - Random sparse connectivity
- - Balanced excitation and inhibition
- - Asynchronous irregular firing
-
-
- .. grid-item-card:: COBA Network (2005)
- :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/103_COBA_2005.py
-
- Conductance-based synaptic integration in balanced networks.
-
- - Conductance-based synapses (COBA)
- - Reversal potentials
- - More biologically realistic
- - Stable asynchronous activity
-
-
- .. grid-item-card:: CUBA Network (2005)
- :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/104_CUBA_2005.py
-
- Current-based synaptic integration (simpler, faster variant).
-
- - Current-based synapses (CUBA)
- - Faster computation
- - Widely used for large-scale simulations
-
-
-
- .. grid-item-card:: COBA with Hodgkin-Huxley Neurons (2007)
- :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/106_COBA_HH_2007.py
-
- More detailed neuron model with sodium and potassium channels.
-
- - Hodgkin-Huxley neuron dynamics
- - Action potential generation
- - Biophysically detailed
- - Computationally intensive
-
-
-Oscillations and Rhythms
--------------------------
-
-.. grid:: 2
- :gutter: 3
-
- .. grid-item-card:: Gamma Oscillation (1996)
- :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/107_gamma_oscillation_1996.py
-
- Interneuron network generating gamma oscillations (30-80 Hz).
-
- - Interneuron-based gamma
- - Inhibition-based synchrony
- - Physiologically relevant frequency
- - Network oscillations
-
- .. grid-item-card:: Synfire Chains (199x)
- :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/108_synfire_chains_199.py
-
- Demonstrates reliable spike sequence propagation.
-
- - Feedforward architecture
- - Reliable spike timing
- - Wave propagation
- - Temporal coding
-
- .. grid-item-card:: Fast Global Oscillation
- :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/109_fast_global_oscillation.py
-
- High-frequency oscillations (>100 Hz) in inhibitory networks.
-
- - Very fast oscillations
- - Gap junction coupling
- - Inhibitory synchrony
- - Pathological rhythms
-
-
-Gamma Oscillation Mechanisms (Susin & Destexhe 2021)
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Series of models exploring different gamma generation mechanisms:
-
-.. grid:: 2
- :gutter: 3
-
- .. grid-item-card:: Asynchronous Irregular (AI)
- :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/110_Susin_Destexhe_2021_gamma_oscillation_AI.py
-
- AI state: No oscillations, irregular firing
-
- - Background activity state
- - Asynchronous firing
- - No clear rhythm
-
-
- .. grid-item-card:: CHING Mechanism
- :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/111_Susin_Destexhe_2021_gamma_oscillation_CHING.py
-
- Coherent High-frequency INhibition-based Gamma
-
- - Coherent inhibition
- - High-frequency gamma
- - Interneuron synchrony
-
-
- .. grid-item-card:: ING Mechanism
- :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/112_Susin_Destexhe_2021_gamma_oscillation_ING.py
-
- Inhibition-based Gamma
-
- - Pure inhibitory network
- - Gamma through inhibition
- - Fast synaptic kinetics
-
-
- .. grid-item-card:: PING Mechanism
- :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/113_Susin_Destexhe_2021_gamma_oscillation_PING.py
-
- Pyramidal-Interneuron Gamma
-
- - E-I loop generates gamma
- - Most common mechanism
- - Excitatory-inhibitory interaction
-
-
-
-Spiking Neural Network Training
---------------------------------
-
-.. grid:: 2
- :gutter: 3
-
- .. grid-item-card:: Supervised Learning with Surrogate Gradients
- :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/200_surrogate_grad_lif.py
-
- Trains a simple spiking network using surrogate gradients.
-
- - Surrogate gradient method
- - LIF neuron training
- - Simple classification task
- - Gradient-based learning
-
-
- .. grid-item-card:: Fashion-MNIST Classification
- :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/201_surrogate_grad_lif_fashion_mnist.py
-
- Trains a spiking network on Fashion-MNIST dataset.
-
- - Fashion-MNIST dataset
- - Multi-layer SNN
- - Spike-based processing
- - Real-world classification
-
-
- .. grid-item-card:: MNIST with Readout Layer
- :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/202_mnist_lif_readout.py
-
- Uses readout layer for classification.
-
- - MNIST handwritten digits
- - Specialized readout layer
- - Spike counting
- - Classification from spike rates
+Examples Gallery
+================
+
+Welcome to the ``brainpy.state`` examples gallery! Here you'll find complete, runnable examples demonstrating various aspects of computational neuroscience modeling.
+
+All examples are available in the `examples/ `_ directory of the brainpy.state repository.
+
+Classical Network Models
+-------------------------
+
+These examples reproduce influential models from the computational neuroscience literature.
+
+.. grid:: 2
+ :gutter: 3
+
+ .. grid-item-card:: E-I Balanced Networks
+ :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/102_EI_net_1996.py
+
+ Implements the classic excitatory-inhibitory balanced network showing chaotic dynamics.
+
+ - 80% excitatory, 20% inhibitory neurons
+ - Random sparse connectivity
+ - Balanced excitation and inhibition
+ - Asynchronous irregular firing
+
+
+ .. grid-item-card:: COBA Network (2005)
+ :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/103_COBA_2005.py
+
+ Conductance-based synaptic integration in balanced networks.
+
+ - Conductance-based synapses (COBA)
+ - Reversal potentials
+ - More biologically realistic
+ - Stable asynchronous activity
+
+
+ .. grid-item-card:: CUBA Network (2005)
+ :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/104_CUBA_2005.py
+
+ Current-based synaptic integration (simpler, faster variant).
+
+ - Current-based synapses (CUBA)
+ - Faster computation
+ - Widely used for large-scale simulations
+
+
+
+ .. grid-item-card:: COBA with Hodgkin-Huxley Neurons (2007)
+ :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/106_COBA_HH_2007.py
+
+ More detailed neuron model with sodium and potassium channels.
+
+ - Hodgkin-Huxley neuron dynamics
+ - Action potential generation
+ - Biophysically detailed
+ - Computationally intensive
+
+
+Oscillations and Rhythms
+-------------------------
+
+.. grid:: 2
+ :gutter: 3
+
+ .. grid-item-card:: Gamma Oscillation (1996)
+ :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/107_gamma_oscillation_1996.py
+
+ Interneuron network generating gamma oscillations (30-80 Hz).
+
+ - Interneuron-based gamma
+ - Inhibition-based synchrony
+ - Physiologically relevant frequency
+ - Network oscillations
+
+ .. grid-item-card:: Synfire Chains (199x)
+ :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/108_synfire_chains_199.py
+
+ Demonstrates reliable spike sequence propagation.
+
+ - Feedforward architecture
+ - Reliable spike timing
+ - Wave propagation
+ - Temporal coding
+
+ .. grid-item-card:: Fast Global Oscillation
+ :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/109_fast_global_oscillation.py
+
+ High-frequency oscillations (>100 Hz) in inhibitory networks.
+
+ - Very fast oscillations
+ - Gap junction coupling
+ - Inhibitory synchrony
+ - Pathological rhythms
+
+
+Gamma Oscillation Mechanisms (Susin & Destexhe 2021)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Series of models exploring different gamma generation mechanisms:
+
+.. grid:: 2
+ :gutter: 3
+
+ .. grid-item-card:: Asynchronous Irregular (AI)
+ :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/110_Susin_Destexhe_2021_gamma_oscillation_AI.py
+
+ AI state: No oscillations, irregular firing
+
+ - Background activity state
+ - Asynchronous firing
+ - No clear rhythm
+
+
+ .. grid-item-card:: CHING Mechanism
+ :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/111_Susin_Destexhe_2021_gamma_oscillation_CHING.py
+
+ Coherent High-frequency INhibition-based Gamma
+
+ - Coherent inhibition
+ - High-frequency gamma
+ - Interneuron synchrony
+
+
+ .. grid-item-card:: ING Mechanism
+ :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/112_Susin_Destexhe_2021_gamma_oscillation_ING.py
+
+ Inhibition-based Gamma
+
+ - Pure inhibitory network
+ - Gamma through inhibition
+ - Fast synaptic kinetics
+
+
+ .. grid-item-card:: PING Mechanism
+ :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/113_Susin_Destexhe_2021_gamma_oscillation_PING.py
+
+ Pyramidal-Interneuron Gamma
+
+ - E-I loop generates gamma
+ - Most common mechanism
+ - Excitatory-inhibitory interaction
+
+
+
+Spiking Neural Network Training
+--------------------------------
+
+.. grid:: 2
+ :gutter: 3
+
+ .. grid-item-card:: Supervised Learning with Surrogate Gradients
+ :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/200_surrogate_grad_lif.py
+
+ Trains a simple spiking network using surrogate gradients.
+
+ - Surrogate gradient method
+ - LIF neuron training
+ - Simple classification task
+ - Gradient-based learning
+
+
+ .. grid-item-card:: Fashion-MNIST Classification
+ :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/201_surrogate_grad_lif_fashion_mnist.py
+
+ Trains a spiking network on Fashion-MNIST dataset.
+
+ - Fashion-MNIST dataset
+ - Multi-layer SNN
+ - Spike-based processing
+ - Real-world classification
+
+
+ .. grid-item-card:: MNIST with Readout Layer
+ :link: https://github.com/chaobrain/brainpy.state/tree/main/examples/202_mnist_lif_readout.py
+
+ Uses readout layer for classification.
+
+ - MNIST handwritten digits
+ - Specialized readout layer
+ - Spike counting
+ - Classification from spike rates
diff --git a/docs/highlight_lexer.py b/docs/highlight_lexer.py
index 95544807..a8031b75 100644
--- a/docs/highlight_lexer.py
+++ b/docs/highlight_lexer.py
@@ -1,123 +1,123 @@
-# Copyright 2024 Brain Simulation Ecosystem Limited. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ==============================================================================
-
-
-import glob
-import json
-import sys
-import os
-
-
-def fix_ipython2_lexer_in_notebooks(directory_path):
- """
- 批量修复指定目录中所有 Jupyter Notebook 文件的 ipython2 lexer 问题
- """
- # 查找所有.ipynb文件
- notebook_files = glob.glob(os.path.join(directory_path, "*.ipynb"))
-
- if not notebook_files:
- print(f"在目录 {directory_path} 中未找到任何 .ipynb 文件")
- return
-
- fixed_count = 0
-
- for file_path in notebook_files:
- try:
- with open(file_path, 'r', encoding='utf-8') as f:
- data = json.load(f)
-
- needs_fix = False
-
- # 检查并修复顶层元数据
- if 'metadata' in data:
- # 修复 language_info
- if 'language_info' in data['metadata']:
- lang_info = data['metadata']['language_info']
- if lang_info.get('name') == 'ipython2':
- lang_info['name'] = 'ipython3'
- needs_fix = True
- print(f"修复 {os.path.basename(file_path)}: 顶层 language_info.name")
-
- if lang_info.get('pygments_lexer') == 'ipython2':
- lang_info['pygments_lexer'] = 'ipython3'
- needs_fix = True
- print(f"修复 {os.path.basename(file_path)}: 顶层 language_info.pygments_lexer")
-
- # 修复 kernelspec
- if 'kernelspec' in data['metadata']:
- kernelspec = data['metadata']['kernelspec']
- if kernelspec.get('language') == 'ipython2':
- kernelspec['language'] = 'python'
- needs_fix = True
- print(f"修复 {os.path.basename(file_path)}: 顶层 kernelspec.language")
-
- if kernelspec.get('name') == 'ipython2':
- kernelspec['name'] = 'python3'
- needs_fix = True
- print(f"修复 {os.path.basename(file_path)}: 顶层 kernelspec.name")
-
- # 检查并修复单元格元数据
- for i, cell in enumerate(data.get('cells', [])):
- if 'metadata' in cell:
- # 修复单元格级别的语言设置
- if 'language' in cell['metadata'] and cell['metadata']['language'] == 'ipython2':
- cell['metadata']['language'] = 'ipython3'
- needs_fix = True
- print(f"修复 {os.path.basename(file_path)}: 单元格 {i} 的语言设置")
-
- # 修复其他可能的 lexer 设置
- if 'pygments_lexer' in cell['metadata'] and cell['metadata']['pygments_lexer'] == 'ipython2':
- cell['metadata']['pygments_lexer'] = 'ipython3'
- needs_fix = True
- print(f"修复 {os.path.basename(file_path)}: 单元格 {i} 的 pygments_lexer 设置")
-
- # 如果需要修复,保存文件
- if needs_fix:
- # 创建备份
- backup_path = file_path + '.backup'
- with open(backup_path, 'w', encoding='utf-8') as f:
- json.dump(data, f, indent=2, ensure_ascii=False)
-
- # 保存修复后的文件
- with open(file_path, 'w', encoding='utf-8') as f:
- json.dump(data, f, indent=2, ensure_ascii=False)
-
- fixed_count += 1
- print(f"已修复并备份: {os.path.basename(file_path)}")
- else:
- print(f"无需修复: {os.path.basename(file_path)}")
-
- except Exception as e:
- print(f"处理文件 {file_path} 时出错: {str(e)}")
-
- print(f"\n处理完成! 共修复了 {fixed_count} 个文件")
- return fixed_count
-
-
-if __name__ == "__main__":
- print(os.path.dirname(os.path.abspath(__file__)))
-
- # 使用当前目录,或者指定您的文档目录路径
- target_directory = input("请输入包含.ipynb文件的目录路径(直接回车使用当前目录): ").strip()
-
- if not target_directory:
- target_directory = "."
-
- if not os.path.isdir(target_directory):
- print(f"错误: 目录 '{target_directory}' 不存在")
- sys.exit(1)
-
- print(f"开始处理目录: {os.path.abspath(target_directory)}")
- fix_ipython2_lexer_in_notebooks(target_directory)
+# Copyright 2024 Brain Simulation Ecosystem Limited. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+
+import glob
+import json
+import sys
+import os
+
+
+def fix_ipython2_lexer_in_notebooks(directory_path):
+ """
+ 批量修复指定目录中所有 Jupyter Notebook 文件的 ipython2 lexer 问题
+ """
+ # 查找所有.ipynb文件
+ notebook_files = glob.glob(os.path.join(directory_path, "*.ipynb"))
+
+ if not notebook_files:
+ print(f"在目录 {directory_path} 中未找到任何 .ipynb 文件")
+ return
+
+ fixed_count = 0
+
+ for file_path in notebook_files:
+ try:
+ with open(file_path, 'r', encoding='utf-8') as f:
+ data = json.load(f)
+
+ needs_fix = False
+
+ # 检查并修复顶层元数据
+ if 'metadata' in data:
+ # 修复 language_info
+ if 'language_info' in data['metadata']:
+ lang_info = data['metadata']['language_info']
+ if lang_info.get('name') == 'ipython2':
+ lang_info['name'] = 'ipython3'
+ needs_fix = True
+ print(f"修复 {os.path.basename(file_path)}: 顶层 language_info.name")
+
+ if lang_info.get('pygments_lexer') == 'ipython2':
+ lang_info['pygments_lexer'] = 'ipython3'
+ needs_fix = True
+ print(f"修复 {os.path.basename(file_path)}: 顶层 language_info.pygments_lexer")
+
+ # 修复 kernelspec
+ if 'kernelspec' in data['metadata']:
+ kernelspec = data['metadata']['kernelspec']
+ if kernelspec.get('language') == 'ipython2':
+ kernelspec['language'] = 'python'
+ needs_fix = True
+ print(f"修复 {os.path.basename(file_path)}: 顶层 kernelspec.language")
+
+ if kernelspec.get('name') == 'ipython2':
+ kernelspec['name'] = 'python3'
+ needs_fix = True
+ print(f"修复 {os.path.basename(file_path)}: 顶层 kernelspec.name")
+
+ # 检查并修复单元格元数据
+ for i, cell in enumerate(data.get('cells', [])):
+ if 'metadata' in cell:
+ # 修复单元格级别的语言设置
+ if 'language' in cell['metadata'] and cell['metadata']['language'] == 'ipython2':
+ cell['metadata']['language'] = 'ipython3'
+ needs_fix = True
+ print(f"修复 {os.path.basename(file_path)}: 单元格 {i} 的语言设置")
+
+ # 修复其他可能的 lexer 设置
+ if 'pygments_lexer' in cell['metadata'] and cell['metadata']['pygments_lexer'] == 'ipython2':
+ cell['metadata']['pygments_lexer'] = 'ipython3'
+ needs_fix = True
+ print(f"修复 {os.path.basename(file_path)}: 单元格 {i} 的 pygments_lexer 设置")
+
+ # 如果需要修复,保存文件
+ if needs_fix:
+ # 创建备份
+ backup_path = file_path + '.backup'
+ with open(backup_path, 'w', encoding='utf-8') as f:
+ json.dump(data, f, indent=2, ensure_ascii=False)
+
+ # 保存修复后的文件
+ with open(file_path, 'w', encoding='utf-8') as f:
+ json.dump(data, f, indent=2, ensure_ascii=False)
+
+ fixed_count += 1
+ print(f"已修复并备份: {os.path.basename(file_path)}")
+ else:
+ print(f"无需修复: {os.path.basename(file_path)}")
+
+ except Exception as e:
+ print(f"处理文件 {file_path} 时出错: {str(e)}")
+
+ print(f"\n处理完成! 共修复了 {fixed_count} 个文件")
+ return fixed_count
+
+
+if __name__ == "__main__":
+ print(os.path.dirname(os.path.abspath(__file__)))
+
+ # 使用当前目录,或者指定您的文档目录路径
+ target_directory = input("请输入包含.ipynb文件的目录路径(直接回车使用当前目录): ").strip()
+
+ if not target_directory:
+ target_directory = "."
+
+ if not os.path.isdir(target_directory):
+ print(f"错误: 目录 '{target_directory}' 不存在")
+ sys.exit(1)
+
+ print(f"开始处理目录: {os.path.abspath(target_directory)}")
+ fix_ipython2_lexer_in_notebooks(target_directory)
diff --git a/docs/quickstart/index.rst b/docs/quickstart/index.rst
index a70009a6..61a67361 100644
--- a/docs/quickstart/index.rst
+++ b/docs/quickstart/index.rst
@@ -1,40 +1,40 @@
-Quickstart
-==========
-
-Welcome to the quickstart guide for ``brainpy.state``! This section will help you get up and running
-with the State-based programming paradigm for building and simulating spiking neural networks.
-
-Whether you're new to BrainPy or transitioning from ``brainpy.dyn``, this guide provides everything
-you need to start building neural models with the improved State-based approach.
-
-
-What you'll learn
------------------
-
-This quickstart guide covers:
-
-- **Installation**: How to install BrainPy with the appropriate backend (CPU, GPU, TPU) for your needs
-- **5-Minute Tutorial**: A hands-on introduction to building your first neural network with ``brainpy.state``
-- **BrainPy-style Modeling Guide**: Understanding the fundamental concepts of building neural models with the BrainPy-style API
-
-
-Getting started
----------------
-
-If you're new to ``brainpy.state``, we recommend following these steps:
-
-1. Start with :doc:`installation` to set up your environment
-2. Follow the :doc:`5min-tutorial` to build your first model
-3. Review the :doc:`../brainpy-guide/index` to understand the underlying principles
-
-For experienced users, you can jump directly to the concepts overview or explore the tutorials and examples sections.
-
-
-.. toctree::
- :hidden:
- :maxdepth: 2
-
- installation.rst
- overview.ipynb
- 5min-tutorial.ipynb
-
+Quickstart
+==========
+
+Welcome to the quickstart guide for ``brainpy.state``! This section will help you get up and running
+with the State-based programming paradigm for building and simulating spiking neural networks.
+
+Whether you're new to BrainPy or transitioning from ``brainpy.dyn``, this guide provides everything
+you need to start building neural models with the improved State-based approach.
+
+
+What you'll learn
+-----------------
+
+This quickstart guide covers:
+
+- **Installation**: How to install BrainPy with the appropriate backend (CPU, GPU, TPU) for your needs
+- **5-Minute Tutorial**: A hands-on introduction to building your first neural network with ``brainpy.state``
+- **BrainPy-style Modeling Guide**: Understanding the fundamental concepts of building neural models with the BrainPy-style API
+
+
+Getting started
+---------------
+
+If you're new to ``brainpy.state``, we recommend following these steps:
+
+1. Start with :doc:`installation` to set up your environment
+2. Follow the :doc:`5min-tutorial` to build your first model
+3. Review the :doc:`../brainpy-guide/index` to understand the underlying principles
+
+For experienced users, you can jump directly to the concepts overview or explore the tutorials and examples sections.
+
+
+.. toctree::
+ :hidden:
+ :maxdepth: 2
+
+ installation.rst
+ overview.ipynb
+ 5min-tutorial.ipynb
+
diff --git a/docs/quickstart/installation.rst b/docs/quickstart/installation.rst
index ca0ff5c2..b1ef1b67 100644
--- a/docs/quickstart/installation.rst
+++ b/docs/quickstart/installation.rst
@@ -1,164 +1,164 @@
-Installation Guide
-==================
-
-``brainpy.state`` is a flexible, efficient, and extensible framework for computational neuroscience and
-brain-inspired computation. This guide will help you install ``brainpy.state`` on your system.
-
-Requirements
-------------
-
-- Python 3.10 or later
-- pip package manager
-- Supported platforms: Linux (Ubuntu 16.04+), macOS (10.12+), Windows
-
-Basic Installation
-------------------
-
-Install the latest version of ``brainpy.state``:
-
-.. code-block:: bash
-
- pip install brainpy.state -U
-
-This will install brainpy.state with CPU support by default.
-
-Hardware-Specific Installation
--------------------------------
-
-Depending on your hardware, you can install ``brainpy.state`` with optimized support:
-
-CPU Only
-~~~~~~~~
-
-For CPU-only installations:
-
-.. code-block:: bash
-
- pip install brainpy.state[cpu] -U
-
-This is suitable for development, testing, and small-scale simulations.
-
-GPU Support (CUDA)
-~~~~~~~~~~~~~~~~~~
-
-For NVIDIA GPU acceleration:
-
-**CUDA 12.x:**
-
-.. code-block:: bash
-
- pip install brainpy.state[cuda12] -U
-
-**CUDA 13.x:**
-
-.. code-block:: bash
-
- pip install brainpy.state[cuda13] -U
-
-.. note::
- Make sure you have the appropriate CUDA toolkit installed on your system before installing the GPU version.
-
-TPU Support
-~~~~~~~~~~~
-
-For Google Cloud TPU support:
-
-.. code-block:: bash
-
- pip install brainpy.state[tpu] -U
-
-This is typically used when running on Google Cloud Platform or Colab with TPU runtime.
-
-Ecosystem Installation
-----------------------
-
-To install ``brainpy.state`` along with the entire ecosystem of tools:
-
-.. code-block:: bash
-
- pip install BrainX -U
-
-This includes:
-
-- ``brainpy.state``: Main framework
-- ``brainstate``: State management and compilation backend
-- ``brainunit``: Physical units system
-- ``braintools``: Utilities and tools
-- Additional ecosystem packages
-
-Verifying Installation
-----------------------
-
-To verify that ``brainpy.state`` is installed correctly:
-
-.. code-block:: python
-
- import brainpy_state
- import brainpy
- import brainstate
- import brainunit as u
-
- print(f"brainpy.state version: {brainpy_state.__version__}")
- print(f"brainstate version: {brainstate.__version__}")
-
- # Test basic functionality
- neuron = brainpy.state.LIF(10)
- print("Installation successful!")
-
-Development Installation
-------------------------
-
-If you want to install brainpy.state from source for development:
-
-.. code-block:: bash
-
- git clone https://github.com/chaobrain/brainpy.state.git
- cd brainpy.state
- pip install -e .
-
-This creates an editable installation that reflects your local changes.
-
-Troubleshooting
----------------
-
-Common Issues
-~~~~~~~~~~~~~
-
-**ImportError: No module named 'brainpy.state'**
-
-Make sure you've activated the correct Python environment and that the installation completed successfully.
-
-**CUDA not found**
-
-If you installed the GPU version but get CUDA errors, ensure that:
-
-1. Your NVIDIA drivers are up to date
-2. CUDA toolkit is installed and matches the version (12.x or 13.x)
-3. Your GPU is CUDA-capable
-
-**Version Conflicts**
-
-If you're upgrading from a previous version, you might need to uninstall the old version first:
-
-.. code-block:: bash
-
- pip uninstall brainpy.state
- pip install brainpy.state -U
-
-Getting Help
-~~~~~~~~~~~~
-
-If you encounter issues:
-
-- Check the `GitHub Issues `_
-- Read the documentation at `https://brainx.chaobrain.com/brainpy-state/ `_
-- Join our community discussions
-
-Next Steps
-----------
-
-Now that you have brainpy.state installed, you can:
-
-- Follow the :doc:`5-minute tutorial <5min-tutorial>` for a quick introduction
-- Read the :doc:`BrainPy-style modeling guide <../brainpy-guide/index>` to understand brainpy.state's architecture
-- Explore the `examples `_ for detailed guides
+Installation Guide
+==================
+
+``brainpy.state`` is a flexible, efficient, and extensible framework for computational neuroscience and
+brain-inspired computation. This guide will help you install ``brainpy.state`` on your system.
+
+Requirements
+------------
+
+- Python 3.10 or later
+- pip package manager
+- Supported platforms: Linux (Ubuntu 16.04+), macOS (10.12+), Windows
+
+Basic Installation
+------------------
+
+Install the latest version of ``brainpy.state``:
+
+.. code-block:: bash
+
+ pip install brainpy.state -U
+
+This will install brainpy.state with CPU support by default.
+
+Hardware-Specific Installation
+-------------------------------
+
+Depending on your hardware, you can install ``brainpy.state`` with optimized support:
+
+CPU Only
+~~~~~~~~
+
+For CPU-only installations:
+
+.. code-block:: bash
+
+ pip install brainpy.state[cpu] -U
+
+This is suitable for development, testing, and small-scale simulations.
+
+GPU Support (CUDA)
+~~~~~~~~~~~~~~~~~~
+
+For NVIDIA GPU acceleration:
+
+**CUDA 12.x:**
+
+.. code-block:: bash
+
+ pip install brainpy.state[cuda12] -U
+
+**CUDA 13.x:**
+
+.. code-block:: bash
+
+ pip install brainpy.state[cuda13] -U
+
+.. note::
+ Make sure you have the appropriate CUDA toolkit installed on your system before installing the GPU version.
+
+TPU Support
+~~~~~~~~~~~
+
+For Google Cloud TPU support:
+
+.. code-block:: bash
+
+ pip install brainpy.state[tpu] -U
+
+This is typically used when running on Google Cloud Platform or Colab with TPU runtime.
+
+Ecosystem Installation
+----------------------
+
+To install ``brainpy.state`` along with the entire ecosystem of tools:
+
+.. code-block:: bash
+
+ pip install BrainX -U
+
+This includes:
+
+- ``brainpy.state``: Main framework
+- ``brainstate``: State management and compilation backend
+- ``brainunit``: Physical units system
+- ``braintools``: Utilities and tools
+- Additional ecosystem packages
+
+Verifying Installation
+----------------------
+
+To verify that ``brainpy.state`` is installed correctly:
+
+.. code-block:: python
+
+ import brainpy_state
+ import brainpy
+ import brainstate
+ import brainunit as u
+
+ print(f"brainpy.state version: {brainpy_state.__version__}")
+ print(f"brainstate version: {brainstate.__version__}")
+
+ # Test basic functionality
+ neuron = brainpy.state.LIF(10)
+ print("Installation successful!")
+
+Development Installation
+------------------------
+
+If you want to install brainpy.state from source for development:
+
+.. code-block:: bash
+
+ git clone https://github.com/chaobrain/brainpy.state.git
+ cd brainpy.state
+ pip install -e .
+
+This creates an editable installation that reflects your local changes.
+
+Troubleshooting
+---------------
+
+Common Issues
+~~~~~~~~~~~~~
+
+**ImportError: No module named 'brainpy.state'**
+
+Make sure you've activated the correct Python environment and that the installation completed successfully.
+
+**CUDA not found**
+
+If you installed the GPU version but get CUDA errors, ensure that:
+
+1. Your NVIDIA drivers are up to date
+2. CUDA toolkit is installed and matches the version (12.x or 13.x)
+3. Your GPU is CUDA-capable
+
+**Version Conflicts**
+
+If you're upgrading from a previous version, you might need to uninstall the old version first:
+
+.. code-block:: bash
+
+ pip uninstall brainpy.state
+ pip install brainpy.state -U
+
+Getting Help
+~~~~~~~~~~~~
+
+If you encounter issues:
+
+- Check the `GitHub Issues `_
+- Read the documentation at `https://brainx.chaobrain.com/brainpy-state/ `_
+- Join our community discussions
+
+Next Steps
+----------
+
+Now that you have brainpy.state installed, you can:
+
+- Follow the :doc:`5-minute tutorial <5min-tutorial>` for a quick introduction
+- Read the :doc:`BrainPy-style modeling guide <../brainpy-guide/index>` to understand brainpy.state's architecture
+- Explore the `examples `_ for detailed guides
diff --git a/examples/nest_like/BrodyHopfield.py b/examples/nest_like/BrodyHopfield.py
index 1fd363b0..664c280b 100644
--- a/examples/nest_like/BrodyHopfield.py
+++ b/examples/nest_like/BrodyHopfield.py
@@ -48,7 +48,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import braintools
diff --git a/examples/nest_like/CampbellSiegert.py b/examples/nest_like/CampbellSiegert.py
index 7985699b..98bee895 100644
--- a/examples/nest_like/CampbellSiegert.py
+++ b/examples/nest_like/CampbellSiegert.py
@@ -32,7 +32,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import braintools
diff --git a/examples/nest_like/aeif_cond_beta_multisynapse.py b/examples/nest_like/aeif_cond_beta_multisynapse.py
index a040a29e..5ccad2a7 100644
--- a/examples/nest_like/aeif_cond_beta_multisynapse.py
+++ b/examples/nest_like/aeif_cond_beta_multisynapse.py
@@ -29,7 +29,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/artificial_synchrony.py b/examples/nest_like/artificial_synchrony.py
index 2b76aa97..2fcdd08b 100644
--- a/examples/nest_like/artificial_synchrony.py
+++ b/examples/nest_like/artificial_synchrony.py
@@ -23,7 +23,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/astrocyte_brunel_bernoulli.py b/examples/nest_like/astrocyte_brunel_bernoulli.py
index bdce258a..23419a56 100644
--- a/examples/nest_like/astrocyte_brunel_bernoulli.py
+++ b/examples/nest_like/astrocyte_brunel_bernoulli.py
@@ -38,7 +38,7 @@
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/astrocyte_brunel_fixed_indegree.py b/examples/nest_like/astrocyte_brunel_fixed_indegree.py
index dfd684ec..bb5e556d 100644
--- a/examples/nest_like/astrocyte_brunel_fixed_indegree.py
+++ b/examples/nest_like/astrocyte_brunel_fixed_indegree.py
@@ -28,7 +28,7 @@
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/astrocyte_interaction.py b/examples/nest_like/astrocyte_interaction.py
index c0c74a4f..5a2e8a84 100644
--- a/examples/nest_like/astrocyte_interaction.py
+++ b/examples/nest_like/astrocyte_interaction.py
@@ -22,7 +22,7 @@
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/astrocyte_single.py b/examples/nest_like/astrocyte_single.py
index 945c39b3..c8a549b1 100644
--- a/examples/nest_like/astrocyte_single.py
+++ b/examples/nest_like/astrocyte_single.py
@@ -23,7 +23,7 @@
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/astrocyte_small_network.py b/examples/nest_like/astrocyte_small_network.py
index 6753d6b4..1b9330fb 100644
--- a/examples/nest_like/astrocyte_small_network.py
+++ b/examples/nest_like/astrocyte_small_network.py
@@ -32,7 +32,7 @@
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/balancedneuron.py b/examples/nest_like/balancedneuron.py
index 1cde31a1..ddea7305 100644
--- a/examples/nest_like/balancedneuron.py
+++ b/examples/nest_like/balancedneuron.py
@@ -15,7 +15,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/brette_et_al_2007.py b/examples/nest_like/brette_et_al_2007.py
index 2de6fd31..92691cc0 100644
--- a/examples/nest_like/brette_et_al_2007.py
+++ b/examples/nest_like/brette_et_al_2007.py
@@ -38,7 +38,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/brette_gerstner_fig_2c.py b/examples/nest_like/brette_gerstner_fig_2c.py
index a8241473..4235117e 100644
--- a/examples/nest_like/brette_gerstner_fig_2c.py
+++ b/examples/nest_like/brette_gerstner_fig_2c.py
@@ -36,7 +36,7 @@
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/brette_gerstner_fig_3d.py b/examples/nest_like/brette_gerstner_fig_3d.py
index 43598fcc..5f63ca4c 100644
--- a/examples/nest_like/brette_gerstner_fig_3d.py
+++ b/examples/nest_like/brette_gerstner_fig_3d.py
@@ -37,7 +37,7 @@
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/brunel_alpha.py b/examples/nest_like/brunel_alpha.py
index cc95a13b..84c98648 100644
--- a/examples/nest_like/brunel_alpha.py
+++ b/examples/nest_like/brunel_alpha.py
@@ -12,7 +12,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import scipy.special as sp
diff --git a/examples/nest_like/brunel_alpha_evolution_strategies.py b/examples/nest_like/brunel_alpha_evolution_strategies.py
index 3b7f15f1..41d130f3 100644
--- a/examples/nest_like/brunel_alpha_evolution_strategies.py
+++ b/examples/nest_like/brunel_alpha_evolution_strategies.py
@@ -19,7 +19,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import scipy.special as sp
diff --git a/examples/nest_like/brunel_delta.py b/examples/nest_like/brunel_delta.py
index cbf22f7c..36c03518 100644
--- a/examples/nest_like/brunel_delta.py
+++ b/examples/nest_like/brunel_delta.py
@@ -13,7 +13,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/brunel_exp_multisynapse.py b/examples/nest_like/brunel_exp_multisynapse.py
index 311d890d..2ce67043 100644
--- a/examples/nest_like/brunel_exp_multisynapse.py
+++ b/examples/nest_like/brunel_exp_multisynapse.py
@@ -13,7 +13,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/brunel_siegert.py b/examples/nest_like/brunel_siegert.py
index 6d6bf96f..48f83cdc 100644
--- a/examples/nest_like/brunel_siegert.py
+++ b/examples/nest_like/brunel_siegert.py
@@ -25,7 +25,7 @@
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/clopath_synapse_small_network.py b/examples/nest_like/clopath_synapse_small_network.py
index 6ac443c3..1242b5cb 100644
--- a/examples/nest_like/clopath_synapse_small_network.py
+++ b/examples/nest_like/clopath_synapse_small_network.py
@@ -30,7 +30,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/clopath_synapse_spike_pairing.py b/examples/nest_like/clopath_synapse_spike_pairing.py
index 14fd4c96..9fa4eb9b 100644
--- a/examples/nest_like/clopath_synapse_spike_pairing.py
+++ b/examples/nest_like/clopath_synapse_spike_pairing.py
@@ -23,7 +23,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/correlospinmatrix_detector_two_neuron.py b/examples/nest_like/correlospinmatrix_detector_two_neuron.py
index 5e82417b..85ae9de8 100644
--- a/examples/nest_like/correlospinmatrix_detector_two_neuron.py
+++ b/examples/nest_like/correlospinmatrix_detector_two_neuron.py
@@ -36,7 +36,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/cross_check_mip_corrdet.py b/examples/nest_like/cross_check_mip_corrdet.py
index 26c2d56c..52f21dea 100644
--- a/examples/nest_like/cross_check_mip_corrdet.py
+++ b/examples/nest_like/cross_check_mip_corrdet.py
@@ -27,7 +27,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/csa_example.py b/examples/nest_like/csa_example.py
index 5f3eb08a..e515a241 100644
--- a/examples/nest_like/csa_example.py
+++ b/examples/nest_like/csa_example.py
@@ -35,7 +35,7 @@
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/ei_clustered_network.py b/examples/nest_like/ei_clustered_network.py
index ec6a4ddc..72acd0c2 100644
--- a/examples/nest_like/ei_clustered_network.py
+++ b/examples/nest_like/ei_clustered_network.py
@@ -47,7 +47,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/evaluate_quantal_stp_synapse.py b/examples/nest_like/evaluate_quantal_stp_synapse.py
index 5385f205..567f1a23 100644
--- a/examples/nest_like/evaluate_quantal_stp_synapse.py
+++ b/examples/nest_like/evaluate_quantal_stp_synapse.py
@@ -29,7 +29,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import braintools
import numpy as np
diff --git a/examples/nest_like/evaluate_tsodyks2_synapse.py b/examples/nest_like/evaluate_tsodyks2_synapse.py
index 87239f7f..6e12ae5d 100644
--- a/examples/nest_like/evaluate_tsodyks2_synapse.py
+++ b/examples/nest_like/evaluate_tsodyks2_synapse.py
@@ -21,7 +21,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import braintools
import numpy as np
diff --git a/examples/nest_like/gap_junctions_inhibitory_network.py b/examples/nest_like/gap_junctions_inhibitory_network.py
index 76f027a2..5447649b 100644
--- a/examples/nest_like/gap_junctions_inhibitory_network.py
+++ b/examples/nest_like/gap_junctions_inhibitory_network.py
@@ -22,7 +22,7 @@
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/gap_junctions_two_neurons.py b/examples/nest_like/gap_junctions_two_neurons.py
index 3390eee2..c4a21d11 100644
--- a/examples/nest_like/gap_junctions_two_neurons.py
+++ b/examples/nest_like/gap_junctions_two_neurons.py
@@ -24,7 +24,7 @@
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import jax.numpy as jnp
import numpy as np
diff --git a/examples/nest_like/gif_cond_exp_multisynapse.py b/examples/nest_like/gif_cond_exp_multisynapse.py
index 3c419b69..c8249093 100644
--- a/examples/nest_like/gif_cond_exp_multisynapse.py
+++ b/examples/nest_like/gif_cond_exp_multisynapse.py
@@ -30,7 +30,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/gif_pop_psc_exp.py b/examples/nest_like/gif_pop_psc_exp.py
index 2ccae8c6..63a47cb4 100644
--- a/examples/nest_like/gif_pop_psc_exp.py
+++ b/examples/nest_like/gif_pop_psc_exp.py
@@ -51,7 +51,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/gif_population.py b/examples/nest_like/gif_population.py
index dcba2261..6b2ab778 100644
--- a/examples/nest_like/gif_population.py
+++ b/examples/nest_like/gif_population.py
@@ -36,7 +36,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/glif_cond_neuron.py b/examples/nest_like/glif_cond_neuron.py
index c3f2ee3e..a43bb3ac 100644
--- a/examples/nest_like/glif_cond_neuron.py
+++ b/examples/nest_like/glif_cond_neuron.py
@@ -37,7 +37,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/glif_psc_double_alpha_neuron.py b/examples/nest_like/glif_psc_double_alpha_neuron.py
index 15276df1..7c89a292 100644
--- a/examples/nest_like/glif_psc_double_alpha_neuron.py
+++ b/examples/nest_like/glif_psc_double_alpha_neuron.py
@@ -34,7 +34,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/glif_psc_neuron.py b/examples/nest_like/glif_psc_neuron.py
index ee20ef31..fcfecf5e 100644
--- a/examples/nest_like/glif_psc_neuron.py
+++ b/examples/nest_like/glif_psc_neuron.py
@@ -42,7 +42,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/hh_phaseplane.py b/examples/nest_like/hh_phaseplane.py
index 67ab02c0..21b5a611 100644
--- a/examples/nest_like/hh_phaseplane.py
+++ b/examples/nest_like/hh_phaseplane.py
@@ -35,7 +35,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import functools
diff --git a/examples/nest_like/hh_psc_alpha.py b/examples/nest_like/hh_psc_alpha.py
index 8ee5c815..308f4a87 100644
--- a/examples/nest_like/hh_psc_alpha.py
+++ b/examples/nest_like/hh_psc_alpha.py
@@ -19,7 +19,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import braintools
diff --git a/examples/nest_like/iaf_tum_2000_short_term_depression.py b/examples/nest_like/iaf_tum_2000_short_term_depression.py
index 5298ba16..8815b7c6 100644
--- a/examples/nest_like/iaf_tum_2000_short_term_depression.py
+++ b/examples/nest_like/iaf_tum_2000_short_term_depression.py
@@ -27,7 +27,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import braintools
diff --git a/examples/nest_like/iaf_tum_2000_short_term_facilitation.py b/examples/nest_like/iaf_tum_2000_short_term_facilitation.py
index a4c620c2..2a3dd231 100644
--- a/examples/nest_like/iaf_tum_2000_short_term_facilitation.py
+++ b/examples/nest_like/iaf_tum_2000_short_term_facilitation.py
@@ -28,7 +28,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import braintools
diff --git a/examples/nest_like/if_curve.py b/examples/nest_like/if_curve.py
index 284d3dc9..4d77c798 100644
--- a/examples/nest_like/if_curve.py
+++ b/examples/nest_like/if_curve.py
@@ -14,7 +14,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import braintools
diff --git a/examples/nest_like/izhikevich.py b/examples/nest_like/izhikevich.py
index 5399e686..7fb6b69a 100644
--- a/examples/nest_like/izhikevich.py
+++ b/examples/nest_like/izhikevich.py
@@ -31,7 +31,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import braintools
diff --git a/examples/nest_like/lin_rate_ipn_network.py b/examples/nest_like/lin_rate_ipn_network.py
index 8b332104..a4189fba 100644
--- a/examples/nest_like/lin_rate_ipn_network.py
+++ b/examples/nest_like/lin_rate_ipn_network.py
@@ -29,7 +29,7 @@
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/mat_psc_exp.py b/examples/nest_like/mat_psc_exp.py
index d439faa4..f0f504be 100644
--- a/examples/nest_like/mat_psc_exp.py
+++ b/examples/nest_like/mat_psc_exp.py
@@ -29,7 +29,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import braintools
diff --git a/examples/nest_like/mc_neuron.py b/examples/nest_like/mc_neuron.py
index 891024b8..03461d4b 100644
--- a/examples/nest_like/mc_neuron.py
+++ b/examples/nest_like/mc_neuron.py
@@ -36,7 +36,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/multimeter_file.py b/examples/nest_like/multimeter_file.py
index e55d90aa..689d1765 100644
--- a/examples/nest_like/multimeter_file.py
+++ b/examples/nest_like/multimeter_file.py
@@ -28,7 +28,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/one_neuron.py b/examples/nest_like/one_neuron.py
index 658832d0..f85e8cc8 100644
--- a/examples/nest_like/one_neuron.py
+++ b/examples/nest_like/one_neuron.py
@@ -17,7 +17,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/one_neuron_with_noise.py b/examples/nest_like/one_neuron_with_noise.py
index 1a711ea2..9befc5f1 100644
--- a/examples/nest_like/one_neuron_with_noise.py
+++ b/examples/nest_like/one_neuron_with_noise.py
@@ -18,7 +18,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/plot_weight_matrices.py b/examples/nest_like/plot_weight_matrices.py
index f34833c2..b7e73767 100644
--- a/examples/nest_like/plot_weight_matrices.py
+++ b/examples/nest_like/plot_weight_matrices.py
@@ -32,7 +32,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/pong.py b/examples/nest_like/pong.py
index 960e9cfc..6210bfb6 100644
--- a/examples/nest_like/pong.py
+++ b/examples/nest_like/pong.py
@@ -22,7 +22,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
LEFT_SCORE = -1
RIGHT_SCORE = +1
diff --git a/examples/nest_like/pong_networks.py b/examples/nest_like/pong_networks.py
index d88a9896..b4aa0010 100644
--- a/examples/nest_like/pong_networks.py
+++ b/examples/nest_like/pong_networks.py
@@ -35,7 +35,7 @@
import brainunit as u
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
from brainpy_state import (Simulator, host_spike_drive, host_current_drive,
parrot_neuron, iaf_psc_exp, spike_recorder, noise_generator,
diff --git a/examples/nest_like/pong_run.py b/examples/nest_like/pong_run.py
index a06ee225..41dfad94 100644
--- a/examples/nest_like/pong_run.py
+++ b/examples/nest_like/pong_run.py
@@ -35,7 +35,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import examples.nest_like.pong as pong
from examples.nest_like.pong_networks import PongNetRSTDP, PongNetDopa
diff --git a/examples/nest_like/precise_spiking.py b/examples/nest_like/precise_spiking.py
index 520aa28b..4a0961f1 100644
--- a/examples/nest_like/precise_spiking.py
+++ b/examples/nest_like/precise_spiking.py
@@ -31,7 +31,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/pulsepacket.py b/examples/nest_like/pulsepacket.py
index 3be16246..87fc4b21 100644
--- a/examples/nest_like/pulsepacket.py
+++ b/examples/nest_like/pulsepacket.py
@@ -36,7 +36,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/rate_neuron_dm.py b/examples/nest_like/rate_neuron_dm.py
index 9763890e..6a4cb044 100644
--- a/examples/nest_like/rate_neuron_dm.py
+++ b/examples/nest_like/rate_neuron_dm.py
@@ -23,7 +23,7 @@
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/receptors_and_current.py b/examples/nest_like/receptors_and_current.py
index f35a0dfe..10fdbff9 100644
--- a/examples/nest_like/receptors_and_current.py
+++ b/examples/nest_like/receptors_and_current.py
@@ -30,7 +30,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/recording_demo.py b/examples/nest_like/recording_demo.py
index b6630a7c..0bdfd8c8 100644
--- a/examples/nest_like/recording_demo.py
+++ b/examples/nest_like/recording_demo.py
@@ -29,7 +29,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/repeated_stimulation.py b/examples/nest_like/repeated_stimulation.py
index 597aef88..019e8697 100644
--- a/examples/nest_like/repeated_stimulation.py
+++ b/examples/nest_like/repeated_stimulation.py
@@ -21,7 +21,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/sensitivity_to_perturbation.py b/examples/nest_like/sensitivity_to_perturbation.py
index c427b925..1afcc6f0 100644
--- a/examples/nest_like/sensitivity_to_perturbation.py
+++ b/examples/nest_like/sensitivity_to_perturbation.py
@@ -32,7 +32,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/sinusoidal_gamma_generator.py b/examples/nest_like/sinusoidal_gamma_generator.py
index 7a6a3dd8..b910cb0e 100644
--- a/examples/nest_like/sinusoidal_gamma_generator.py
+++ b/examples/nest_like/sinusoidal_gamma_generator.py
@@ -40,7 +40,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/sinusoidal_poisson_generator.py b/examples/nest_like/sinusoidal_poisson_generator.py
index 396bb86f..d704e24f 100644
--- a/examples/nest_like/sinusoidal_poisson_generator.py
+++ b/examples/nest_like/sinusoidal_poisson_generator.py
@@ -38,7 +38,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/spatial_3d_gauss.py b/examples/nest_like/spatial_3d_gauss.py
index 338bddcd..0844b21e 100644
--- a/examples/nest_like/spatial_3d_gauss.py
+++ b/examples/nest_like/spatial_3d_gauss.py
@@ -20,7 +20,7 @@
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/spatial_csa.py b/examples/nest_like/spatial_csa.py
index 1e254d9b..0336ae53 100644
--- a/examples/nest_like/spatial_csa.py
+++ b/examples/nest_like/spatial_csa.py
@@ -24,7 +24,7 @@
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/spatial_gabor.py b/examples/nest_like/spatial_gabor.py
index b69f68ec..35948cca 100644
--- a/examples/nest_like/spatial_gabor.py
+++ b/examples/nest_like/spatial_gabor.py
@@ -31,7 +31,7 @@
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/spatial_gaussex.py b/examples/nest_like/spatial_gaussex.py
index 6757008f..0ede0432 100644
--- a/examples/nest_like/spatial_gaussex.py
+++ b/examples/nest_like/spatial_gaussex.py
@@ -25,7 +25,7 @@
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/spatial_grid_iaf.py b/examples/nest_like/spatial_grid_iaf.py
index 51b9194f..61875d58 100644
--- a/examples/nest_like/spatial_grid_iaf.py
+++ b/examples/nest_like/spatial_grid_iaf.py
@@ -25,7 +25,7 @@
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/sudoku.py b/examples/nest_like/sudoku.py
index 11541fdc..c4cd6736 100644
--- a/examples/nest_like/sudoku.py
+++ b/examples/nest_like/sudoku.py
@@ -34,7 +34,7 @@
import numpy as np
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import brainunit as u
diff --git a/examples/nest_like/sudoku_net.py b/examples/nest_like/sudoku_net.py
index 9639fa83..1d1646b5 100644
--- a/examples/nest_like/sudoku_net.py
+++ b/examples/nest_like/sudoku_net.py
@@ -36,7 +36,7 @@
import brainstate
import brainunit as u
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import braintools
from brainpy import state as bps
diff --git a/examples/nest_like/synapsecollection.py b/examples/nest_like/synapsecollection.py
index 96e3f4f6..3edf7bfa 100644
--- a/examples/nest_like/synapsecollection.py
+++ b/examples/nest_like/synapsecollection.py
@@ -37,7 +37,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/testiaf.py b/examples/nest_like/testiaf.py
index 1570cf88..540bf3fd 100644
--- a/examples/nest_like/testiaf.py
+++ b/examples/nest_like/testiaf.py
@@ -13,7 +13,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/two_comps.py b/examples/nest_like/two_comps.py
index 74b90777..d8b5c174 100644
--- a/examples/nest_like/two_comps.py
+++ b/examples/nest_like/two_comps.py
@@ -35,7 +35,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/twoneurons.py b/examples/nest_like/twoneurons.py
index 4be8183e..8a35d70f 100644
--- a/examples/nest_like/twoneurons.py
+++ b/examples/nest_like/twoneurons.py
@@ -15,7 +15,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/examples/nest_like/urbanczik_synapse_example.py b/examples/nest_like/urbanczik_synapse_example.py
index d72d55e7..6fa4720b 100644
--- a/examples/nest_like/urbanczik_synapse_example.py
+++ b/examples/nest_like/urbanczik_synapse_example.py
@@ -40,7 +40,7 @@
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import jax.numpy as jnp
import numpy as np
diff --git a/examples/nest_like/vinit_example.py b/examples/nest_like/vinit_example.py
index 00a18a56..77b829e5 100644
--- a/examples/nest_like/vinit_example.py
+++ b/examples/nest_like/vinit_example.py
@@ -12,7 +12,7 @@
import jax
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import braintools
diff --git a/examples/nest_like/wang_decision_making.py b/examples/nest_like/wang_decision_making.py
index 7b33b132..eff3bf57 100644
--- a/examples/nest_like/wang_decision_making.py
+++ b/examples/nest_like/wang_decision_making.py
@@ -56,7 +56,7 @@
import brainstate
jax.config.update('jax_enable_x64', True)
-brainstate.environ.set(precision=64, platform='cpu')
+brainstate.environ.set(precision=64)
import numpy as np
import brainunit as u
diff --git a/pyproject.toml b/pyproject.toml
index 789e1805..1695d191 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,80 +1,80 @@
-[build-system]
-requires = ["setuptools>=64"]
-build-backend = "setuptools.build_meta"
-
-
-[project]
-name = "brainpy_state"
-description = "brainpy.state: stateful spiking neural network models in BrainPy"
-readme = "README.md"
-requires-python = ">=3.11"
-authors = [
- { name = "BrainX Team", email = "chao.brain@qq.com" }
-]
-license = {text = "Apache-2.0"}
-classifiers = [
- "License :: OSI Approved :: Apache Software License",
- "Natural Language :: English",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: 3.12",
- "Programming Language :: Python :: 3.13",
- "Programming Language :: Python :: 3.14",
- "Intended Audience :: Science/Research",
- "Topic :: Scientific/Engineering :: Bio-Informatics",
- "Topic :: Scientific/Engineering :: Mathematics",
- "Topic :: Scientific/Engineering :: Artificial Intelligence",
- "Topic :: Software Development :: Libraries",
-]
-keywords = [
- "computational neuroscience",
- "brain-inspired computation",
- "brain modeling",
- "brain dynamics modeling",
- "brain dynamics programming"
-]
-dependencies = [
- "numpy>=1.15",
- "jax",
- "brainpy>=2.7.6",
- "brainstate>=0.5.0",
- "brainunit",
- "brainevent>=0.0.4",
- "braintools>=0.0.9",
-]
-dynamic = ['version']
-
-
-[tool.setuptools.dynamic]
-version = {attr = "brainpy_state._version.__version__"}
-
-
-[tool.setuptools.packages.find]
-include = ["brainpy_state*"]
-
-
-[project.urls]
-"Bug Tracker" = "https://github.com/chaobrain/brainpy.state/issues"
-"Documentation" = "https://brainx.chaobrain.com/brainpy-state/"
-"Source Code" = "https://github.com/chaobrain/brainpy.state"
-
-
-[project.optional-dependencies]
-cpu = ["jax[cpu]"]
-cuda12 = ["jax[cuda12]"]
-cuda13 = ["jax[cuda13]"]
-tpu = ["jax[tpu]"]
-
-
-[tool.pytest.ini_options]
-# Registered so `-m requires_nest` / `-m "not requires_nest"` don't emit an
-# "unknown mark" warning on every run. The marker is attached by the
-# `@requires_nest` decorator in `_nest/_validation/nest_compare.py`; the live-NEST
-# parity classes carry it (run by `nest-comparison.yml`, deselected by the fast CI
-# gate). Parallelism (`-n auto`) is set per-workflow in the CI command, not here, so
-# local and ad-hoc runs stay serial/explicit by default.
-markers = [
- "requires_nest: live-NEST comparison test; needs the NEST simulator installed",
-]
+[build-system]
+requires = ["setuptools>=64"]
+build-backend = "setuptools.build_meta"
+
+
+[project]
+name = "brainpy_state"
+description = "brainpy.state: stateful spiking neural network models in BrainPy"
+readme = "README.md"
+requires-python = ">=3.11"
+authors = [
+ { name = "BrainX Team", email = "chao.brain@qq.com" }
+]
+license = {text = "Apache-2.0"}
+classifiers = [
+ "License :: OSI Approved :: Apache Software License",
+ "Natural Language :: English",
+ "Operating System :: OS Independent",
+ "Programming Language :: Python",
+ "Programming Language :: Python :: 3",
+ "Programming Language :: Python :: 3.11",
+ "Programming Language :: Python :: 3.12",
+ "Programming Language :: Python :: 3.13",
+ "Programming Language :: Python :: 3.14",
+ "Intended Audience :: Science/Research",
+ "Topic :: Scientific/Engineering :: Bio-Informatics",
+ "Topic :: Scientific/Engineering :: Mathematics",
+ "Topic :: Scientific/Engineering :: Artificial Intelligence",
+ "Topic :: Software Development :: Libraries",
+]
+keywords = [
+ "computational neuroscience",
+ "brain-inspired computation",
+ "brain modeling",
+ "brain dynamics modeling",
+ "brain dynamics programming"
+]
+dependencies = [
+ "numpy>=1.15",
+ "jax",
+ "brainpy>=2.7.6",
+ "brainstate>=0.5.0",
+ "brainunit",
+ "brainevent>=0.0.4",
+ "braintools>=0.0.9",
+]
+dynamic = ['version']
+
+
+[tool.setuptools.dynamic]
+version = {attr = "brainpy_state._version.__version__"}
+
+
+[tool.setuptools.packages.find]
+include = ["brainpy_state*"]
+
+
+[project.urls]
+"Bug Tracker" = "https://github.com/chaobrain/brainpy.state/issues"
+"Documentation" = "https://brainx.chaobrain.com/brainpy-state/"
+"Source Code" = "https://github.com/chaobrain/brainpy.state"
+
+
+[project.optional-dependencies]
+cpu = ["jax[cpu]"]
+cuda12 = ["jax[cuda12]"]
+cuda13 = ["jax[cuda13]"]
+tpu = ["jax[tpu]"]
+
+
+[tool.pytest.ini_options]
+# Registered so `-m requires_nest` / `-m "not requires_nest"` don't emit an
+# "unknown mark" warning on every run. The marker is attached by the
+# `@requires_nest` decorator in `_nest/_validation/nest_compare.py`; the live-NEST
+# parity classes carry it (run by `nest-comparison.yml`, deselected by the fast CI
+# gate). Parallelism (`-n auto`) is set per-workflow in the CI command, not here, so
+# local and ad-hoc runs stay serial/explicit by default.
+markers = [
+ "requires_nest: live-NEST comparison test; needs the NEST simulator installed",
+]
diff --git a/requirements-dev.txt b/requirements-dev.txt
index b78ef562..5bd4a308 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -1,17 +1,17 @@
--r requirements.txt
-
-matplotlib
-msgpack
-tqdm
-numba
-setuptools
-
-
-# test requirements
-pytest
-pytest-xdist # for parallel test execution
-absl-py
-
-# NEST simulator for comparison tests (not available on PyPI)
-# Install via conda: conda install -c conda-forge nest-simulator
+-r requirements.txt
+
+matplotlib
+msgpack
+tqdm
+numba
+setuptools
+
+
+# test requirements
+pytest
+pytest-xdist # for parallel test execution
+absl-py
+
+# NEST simulator for comparison tests (not available on PyPI)
+# Install via conda: conda install -c conda-forge nest-simulator
# NEST is only available on Linux and macOS; tests skip automatically on Windows.
\ No newline at end of file
diff --git a/requirements-doc.txt b/requirements-doc.txt
index 0bff3c21..eed29e96 100644
--- a/requirements-doc.txt
+++ b/requirements-doc.txt
@@ -1,19 +1,19 @@
--r requirements.txt
-
-matplotlib
-numba
-
-# document requirements
-pandoc
-Jinja2
-sphinx
-myst-nb
-sphinx_thebe
-sphinx-autodoc-typehints
-sphinx-book-theme>=1.2.0
-sphinx-copybutton>=0.5.2
-sphinx-remove-toctrees
-jupyter-sphinx>=0.5.3
-sphinx-design
-sphinx_math_dollar
-brainx-sphinx-header>=0.5.0
+-r requirements.txt
+
+matplotlib
+numba
+
+# document requirements
+pandoc
+Jinja2
+sphinx
+myst-nb
+sphinx_thebe
+sphinx-autodoc-typehints
+sphinx-book-theme>=1.2.0
+sphinx-copybutton>=0.5.2
+sphinx-remove-toctrees
+jupyter-sphinx>=0.5.3
+sphinx-design
+sphinx_math_dollar
+brainx-sphinx-header>=0.5.0
diff --git a/requirements.txt b/requirements.txt
index 482bf1f0..5d6a9766 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,8 +1,8 @@
-numpy
-brainstate>=0.2.0
-brainunit
-brainevent>=0.0.4
-braintools>=0.1.0
-brainpy>=2.7.6
-jax
-tqdm
+numpy
+brainstate>=0.2.0
+brainunit
+brainevent>=0.0.4
+braintools>=0.1.0
+brainpy>=2.7.6
+jax
+tqdm