zodi 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,50 @@
1
+ name: Publish to PyPI
2
+
3
+ on: push
4
+
5
+ jobs:
6
+ build:
7
+ name: Build distribution
8
+ runs-on: ubuntu-latest
9
+
10
+ steps:
11
+ - uses: actions/checkout@v6
12
+ - name: Set up Python
13
+ uses: actions/setup-python@v6
14
+ with:
15
+ python-version: "3.x"
16
+ - name: Install pypa/build
17
+ run: >-
18
+ python3 -m
19
+ pip install
20
+ build
21
+ --user
22
+ - name: Build a binary wheel and a source tarball
23
+ run: python3 -m build
24
+ - name: Store the distribution packages
25
+ uses: actions/upload-artifact@v7
26
+ with:
27
+ name: python-package-distributions
28
+ path: dist/
29
+
30
+ publish-to-pypi:
31
+ name: >-
32
+ Publish Python distribution to PyPI
33
+ if: startsWith(github.ref, 'refs/tags/')
34
+ needs:
35
+ - build
36
+ runs-on: ubuntu-latest
37
+ environment:
38
+ name: pypi
39
+ url: https://pypi.org/p/zodi
40
+ permissions:
41
+ id-token: write
42
+
43
+ steps:
44
+ - name: Download all the dists
45
+ uses: actions/download-artifact@v8
46
+ with:
47
+ name: python-package-distributions
48
+ path: dist/
49
+ - name: Publish distribution to PyPI
50
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,22 @@
1
+ on:
2
+ push:
3
+ branches:
4
+ - main
5
+
6
+ permissions:
7
+ contents: write
8
+ pull-requests: write
9
+
10
+ name: release-please
11
+
12
+ jobs:
13
+ release-please:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: googleapis/release-please-action@v5
17
+ with:
18
+ # Personal access token stored as an action secret; the default
19
+ # GITHUB_TOKEN cannot be used because tags it pushes do not
20
+ # trigger the publish-to-pypi workflow.
21
+ token: ${{ secrets.MY_RELEASE_PLEASE_TOKEN }}
22
+ release-type: simple
@@ -0,0 +1,45 @@
1
+ name: Tests
2
+
3
+ on:
4
+ push:
5
+ branches: [ main ]
6
+ pull_request:
7
+ branches: [ main ]
8
+ workflow_dispatch:
9
+
10
+ jobs:
11
+ test:
12
+ name: Test [${{ matrix.extras }}] py${{ matrix.python-version }} on ${{ matrix.platform }}
13
+ runs-on: ${{ matrix.platform }}
14
+ strategy:
15
+ matrix:
16
+ python-version: ["3.12"]
17
+ platform: [ubuntu-latest, macos-latest]
18
+ extras: ["test", "test,jax"]
19
+ steps:
20
+ - uses: actions/checkout@v6
21
+
22
+ - name: Install uv
23
+ uses: astral-sh/setup-uv@v7
24
+ with:
25
+ enable-cache: true
26
+
27
+ - name: Create venv
28
+ run: uv venv .venv --python ${{ matrix.python-version }}
29
+
30
+ - name: Install package with test dependencies
31
+ run: uv pip install -e ".[${{ matrix.extras }}]"
32
+ env:
33
+ VIRTUAL_ENV: ${{ github.workspace }}/.venv
34
+
35
+ # The core leg is the product guarantee: numpy consumers never
36
+ # inherit jax through this package.
37
+ - name: Prove the core install carries no jax
38
+ if: matrix.extras == 'test'
39
+ run: .venv/bin/python -c "import importlib.util; assert importlib.util.find_spec('jax') is None"
40
+
41
+ - name: Diag imports
42
+ run: .venv/bin/python -c "import zodi; from zodi._interp import interp2d_bilinear_clamped; print('zodi import ok')"
43
+
44
+ - name: Run tests
45
+ run: .venv/bin/pytest tests/ -v --tb=short
zodi-0.1.0/.gitignore ADDED
@@ -0,0 +1,224 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[codz]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py.cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # pyenv
86
+ # For a library or package, you might want to ignore these files since the code is
87
+ # intended to run in multiple environments; otherwise, check them in:
88
+ # .python-version
89
+
90
+ # pipenv
91
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
+ # install all needed dependencies.
95
+ # Pipfile.lock
96
+
97
+ # UV
98
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
99
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
100
+ # commonly ignored for libraries.
101
+ # uv.lock
102
+
103
+ # poetry
104
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
105
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
106
+ # commonly ignored for libraries.
107
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
108
+ # poetry.lock
109
+ # poetry.toml
110
+
111
+ # pdm
112
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
113
+ # pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
114
+ # https://pdm-project.org/en/latest/usage/project/#working-with-version-control
115
+ # pdm.lock
116
+ # pdm.toml
117
+ .pdm-python
118
+ .pdm-build/
119
+
120
+ # pixi
121
+ # Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
122
+ # pixi.lock
123
+ # Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
124
+ # in the .venv directory. It is recommended not to include this directory in version control.
125
+ .pixi
126
+
127
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
128
+ __pypackages__/
129
+
130
+ # Celery stuff
131
+ celerybeat-schedule
132
+ celerybeat.pid
133
+
134
+ # Redis
135
+ *.rdb
136
+ *.aof
137
+ *.pid
138
+
139
+ # RabbitMQ
140
+ mnesia/
141
+ rabbitmq/
142
+ rabbitmq-data/
143
+
144
+ # ActiveMQ
145
+ activemq-data/
146
+
147
+ # SageMath parsed files
148
+ *.sage.py
149
+
150
+ # Environments
151
+ .env
152
+ .envrc
153
+ .venv
154
+ env/
155
+ venv/
156
+ ENV/
157
+ env.bak/
158
+ venv.bak/
159
+
160
+ # Spyder project settings
161
+ .spyderproject
162
+ .spyproject
163
+
164
+ # Rope project settings
165
+ .ropeproject
166
+
167
+ # mkdocs documentation
168
+ /site
169
+
170
+ # mypy
171
+ .mypy_cache/
172
+ .dmypy.json
173
+ dmypy.json
174
+
175
+ # Pyre type checker
176
+ .pyre/
177
+
178
+ # pytype static type analyzer
179
+ .pytype/
180
+
181
+ # Cython debug symbols
182
+ cython_debug/
183
+
184
+ # PyCharm
185
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
186
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
187
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
188
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
189
+ # .idea/
190
+
191
+ # Abstra
192
+ # Abstra is an AI-powered process automation framework.
193
+ # Ignore directories containing user credentials, local state, and settings.
194
+ # Learn more at https://abstra.io/docs
195
+ .abstra/
196
+
197
+ # Visual Studio Code
198
+ # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
199
+ # that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
200
+ # and can be added to the global gitignore or merged into this file. However, if you prefer,
201
+ # you could uncomment the following to ignore the entire vscode folder
202
+ # .vscode/
203
+ # Temporary file for partial code execution
204
+ tempCodeRunnerFile.py
205
+
206
+ # Ruff stuff:
207
+ .ruff_cache/
208
+
209
+ # PyPI configuration file
210
+ .pypirc
211
+
212
+ # Marimo
213
+ marimo/_static/
214
+ marimo/_lsp/
215
+ __marimo__/
216
+
217
+ # Streamlit
218
+ .streamlit/secrets.toml
219
+
220
+ # hatch-vcs generated version file
221
+ *_version.py
222
+
223
+ # uv lockfile (not committed for this library; see comment above)
224
+ uv.lock
@@ -0,0 +1,28 @@
1
+ repos:
2
+ - repo: local
3
+ hooks:
4
+ - id: no-internal-refs
5
+ name: no internal research references
6
+ entry: python3 tools/check_internal_refs.py
7
+ language: system
8
+ types: [text]
9
+ exclude: ^(CHANGELOG\.md|tools/check_internal_refs\.py)$
10
+ - repo: https://github.com/pre-commit/pre-commit-hooks
11
+ rev: "v6.0.0"
12
+ hooks:
13
+ - id: trailing-whitespace
14
+ - id: name-tests-test
15
+ args: [--pytest-test-first]
16
+ - id: end-of-file-fixer
17
+ - repo: https://github.com/astral-sh/ruff-pre-commit
18
+ rev: v0.15.2
19
+ hooks:
20
+ - id: ruff-check
21
+ args: [--fix]
22
+ - id: ruff-format
23
+ - repo: https://github.com/compilerla/conventional-pre-commit
24
+ rev: v4.3.0
25
+ hooks:
26
+ - id: conventional-pre-commit
27
+ stages: [commit-msg]
28
+ args: []
@@ -0,0 +1,17 @@
1
+ # Required
2
+ version: 2
3
+
4
+ build:
5
+ os: ubuntu-22.04
6
+ tools:
7
+ python: "3.12"
8
+
9
+ python:
10
+ install:
11
+ - method: pip
12
+ path: .
13
+ extra_requirements:
14
+ - docs
15
+
16
+ sphinx:
17
+ configuration: docs/conf.py
@@ -0,0 +1,10 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0 (2026-07-18)
4
+
5
+
6
+ ### Features
7
+
8
+ * scaffold the library with array API dispatch, clamped interpolation, and a backend-parity suite ([b2cd5e7](https://github.com/CoreySpohn/zodi/commit/b2cd5e76a46904d931177a02ab290adbf8254231))
9
+ * v0.1 core (Leinert zodi, exozodi chain + grey-scatterer flambda, units arbiter, cross-code validation, docs) ([31ffd72](https://github.com/CoreySpohn/zodi/commit/31ffd72039d12c04654f8f8c6dc0465faa421198))
10
+ * wire release automation -- release-please, PyPI trusted publishing, hatch-vcs tag-driven versioning ([1b39f2c](https://github.com/CoreySpohn/zodi/commit/1b39f2cf3f3a5cc1eb3f0842f328019ecb36acf3))
zodi-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Corey Spohn
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
zodi-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,123 @@
1
+ Metadata-Version: 2.4
2
+ Name: zodi
3
+ Version: 0.1.0
4
+ Summary: Zodiacal and exozodiacal light brightness conventions with a single-source numpy/JAX core
5
+ Project-URL: Repository, https://github.com/CoreySpohn/zodi
6
+ Author-email: Corey Spohn <corey.a.spohn@nasa.gov>
7
+ License: MIT License
8
+
9
+ Copyright (c) 2026 Corey Spohn
10
+
11
+ Permission is hereby granted, free of charge, to any person obtaining a copy
12
+ of this software and associated documentation files (the "Software"), to deal
13
+ in the Software without restriction, including without limitation the rights
14
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15
+ copies of the Software, and to permit persons to whom the Software is
16
+ furnished to do so, subject to the following conditions:
17
+
18
+ The above copyright notice and this permission notice shall be included in all
19
+ copies or substantial portions of the Software.
20
+
21
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27
+ SOFTWARE.
28
+ License-File: LICENSE
29
+ Classifier: Development Status :: 3 - Alpha
30
+ Classifier: Intended Audience :: Science/Research
31
+ Classifier: License :: OSI Approved :: MIT License
32
+ Classifier: Programming Language :: Python :: 3
33
+ Classifier: Topic :: Scientific/Engineering :: Astronomy
34
+ Requires-Python: >=3.11
35
+ Requires-Dist: array-api-compat>=1.9
36
+ Requires-Dist: numpy
37
+ Provides-Extra: dev
38
+ Requires-Dist: pre-commit; extra == 'dev'
39
+ Provides-Extra: docs
40
+ Requires-Dist: myst-nb; extra == 'docs'
41
+ Requires-Dist: sphinx-autoapi; extra == 'docs'
42
+ Requires-Dist: sphinx-book-theme; extra == 'docs'
43
+ Provides-Extra: jax
44
+ Requires-Dist: jax>=0.4.32; extra == 'jax'
45
+ Requires-Dist: jaxlib>=0.4.32; extra == 'jax'
46
+ Provides-Extra: test
47
+ Requires-Dist: hypothesis; extra == 'test'
48
+ Requires-Dist: pytest; extra == 'test'
49
+ Description-Content-Type: text/markdown
50
+
51
+ # zodi
52
+
53
+ Zodiacal and exozodiacal light brightness conventions for exoplanet imaging,
54
+ from a single source that runs on numpy and JAX.
55
+
56
+ Status: v0.1 core (pre-PyPI). The LBTI HOSTS population distributions land
57
+ next.
58
+
59
+ ## What it owns
60
+
61
+ - Local zodiacal light surface brightness: the Leinert et al. (1998)
62
+ Table 17 position dependence and Table 19 wavelength dependence, with the
63
+ interpolation, anchoring, and near-Sun conventions of the production
64
+ codes stated explicitly (`zodi.specific_intensity`, `zodi.zodi_flux_ratio`).
65
+ - The exozodi chain of Stark et al. (2014) as implemented by EXOSIMS
66
+ (`zodi.exozodi_flux_ratio_v`, `zodi.jez0`, `zodi.scale_jez`), the three
67
+ published latitudinal models (`zodi.latitudinal_factor`), and the
68
+ grey-scatterer band correction in both production flavors: the
69
+ stellar-color scaling used by pyEDITH (`zodi.exozodi_flux_ratio_band`)
70
+ and the scattered-plus-thermal spectrum model used by EXOSIMS, with its
71
+ calibration as a closed-form least-squares fit
72
+ (`zodi.fit_grey_scatter_constants`).
73
+ - Unit conversions between the dialects in common use: magnitudes per
74
+ square arcsecond, flux ratio per square arcsecond, spectral radiance,
75
+ photon rates, and MJy per steradian (`zodi.units`).
76
+
77
+ Coming next: the LBTI HOSTS survey n-zodi population distributions as
78
+ quantile functions (callers supply their own uniform draws).
79
+
80
+ ## Documentation and validation
81
+
82
+ `docs/conventions.md` states every model, constant, and known cross-code
83
+ difference with sources and measured deltas; `docs/validation.md` maps
84
+ each claim to an executable check. Cross-validation scripts against
85
+ EXOSIMS, skyscapes, and zodipy live in `scripts/` and are runnable by
86
+ anyone with those packages installed. Current results: exact agreement
87
+ with the EXOSIMS closed-form models and magnitude chain, float64
88
+ round-off agreement with skyscapes, and 0.95-1.23 brightness ratios
89
+ against the independent Kelsall model at 1.25 um.
90
+
91
+ ## Design
92
+
93
+ One implementation serves both backends through the array API standard.
94
+ Functions compute in the namespace of their array inputs (via
95
+ `array-api-compat`), so numpy callers get numpy in and numpy out with no JAX
96
+ anywhere in their dependency tree, while JAX callers get functions that jit,
97
+ vmap, and differentiate natively. Hard dependencies are `numpy` and
98
+ `array-api-compat` only; the `[jax]` extra exists so the test suite can run
99
+ the JAX side. JAX users should enable float64:
100
+
101
+ ```python
102
+ jax.config.update("jax_enable_x64", True)
103
+ ```
104
+
105
+ Random sampling is deliberately absent from the library: distributions ship
106
+ as quantile functions (inverse CDFs), and callers bring uniforms from their
107
+ own generator, whether that is `numpy.random` or `jax.random`.
108
+
109
+ ## Not this library
110
+
111
+ Structured circumstellar disks (rings, gaps, offsets) and scene rendering
112
+ belong to scene simulators; solar-system ephemerides belong to the caller.
113
+ For thermal-infrared zodiacal emission modeling, see
114
+ [zodipy](https://github.com/Cosmoglobe/zodipy); this library covers the
115
+ reflected-light brightness conventions used in exoplanet direct imaging.
116
+
117
+ ## Install
118
+
119
+ PyPI release pending; for now:
120
+
121
+ ```
122
+ pip install git+https://github.com/CoreySpohn/zodi.git
123
+ ```
zodi-0.1.0/README.md ADDED
@@ -0,0 +1,73 @@
1
+ # zodi
2
+
3
+ Zodiacal and exozodiacal light brightness conventions for exoplanet imaging,
4
+ from a single source that runs on numpy and JAX.
5
+
6
+ Status: v0.1 core (pre-PyPI). The LBTI HOSTS population distributions land
7
+ next.
8
+
9
+ ## What it owns
10
+
11
+ - Local zodiacal light surface brightness: the Leinert et al. (1998)
12
+ Table 17 position dependence and Table 19 wavelength dependence, with the
13
+ interpolation, anchoring, and near-Sun conventions of the production
14
+ codes stated explicitly (`zodi.specific_intensity`, `zodi.zodi_flux_ratio`).
15
+ - The exozodi chain of Stark et al. (2014) as implemented by EXOSIMS
16
+ (`zodi.exozodi_flux_ratio_v`, `zodi.jez0`, `zodi.scale_jez`), the three
17
+ published latitudinal models (`zodi.latitudinal_factor`), and the
18
+ grey-scatterer band correction in both production flavors: the
19
+ stellar-color scaling used by pyEDITH (`zodi.exozodi_flux_ratio_band`)
20
+ and the scattered-plus-thermal spectrum model used by EXOSIMS, with its
21
+ calibration as a closed-form least-squares fit
22
+ (`zodi.fit_grey_scatter_constants`).
23
+ - Unit conversions between the dialects in common use: magnitudes per
24
+ square arcsecond, flux ratio per square arcsecond, spectral radiance,
25
+ photon rates, and MJy per steradian (`zodi.units`).
26
+
27
+ Coming next: the LBTI HOSTS survey n-zodi population distributions as
28
+ quantile functions (callers supply their own uniform draws).
29
+
30
+ ## Documentation and validation
31
+
32
+ `docs/conventions.md` states every model, constant, and known cross-code
33
+ difference with sources and measured deltas; `docs/validation.md` maps
34
+ each claim to an executable check. Cross-validation scripts against
35
+ EXOSIMS, skyscapes, and zodipy live in `scripts/` and are runnable by
36
+ anyone with those packages installed. Current results: exact agreement
37
+ with the EXOSIMS closed-form models and magnitude chain, float64
38
+ round-off agreement with skyscapes, and 0.95-1.23 brightness ratios
39
+ against the independent Kelsall model at 1.25 um.
40
+
41
+ ## Design
42
+
43
+ One implementation serves both backends through the array API standard.
44
+ Functions compute in the namespace of their array inputs (via
45
+ `array-api-compat`), so numpy callers get numpy in and numpy out with no JAX
46
+ anywhere in their dependency tree, while JAX callers get functions that jit,
47
+ vmap, and differentiate natively. Hard dependencies are `numpy` and
48
+ `array-api-compat` only; the `[jax]` extra exists so the test suite can run
49
+ the JAX side. JAX users should enable float64:
50
+
51
+ ```python
52
+ jax.config.update("jax_enable_x64", True)
53
+ ```
54
+
55
+ Random sampling is deliberately absent from the library: distributions ship
56
+ as quantile functions (inverse CDFs), and callers bring uniforms from their
57
+ own generator, whether that is `numpy.random` or `jax.random`.
58
+
59
+ ## Not this library
60
+
61
+ Structured circumstellar disks (rings, gaps, offsets) and scene rendering
62
+ belong to scene simulators; solar-system ephemerides belong to the caller.
63
+ For thermal-infrared zodiacal emission modeling, see
64
+ [zodipy](https://github.com/Cosmoglobe/zodipy); this library covers the
65
+ reflected-light brightness conventions used in exoplanet direct imaging.
66
+
67
+ ## Install
68
+
69
+ PyPI release pending; for now:
70
+
71
+ ```
72
+ pip install git+https://github.com/CoreySpohn/zodi.git
73
+ ```
@@ -0,0 +1,28 @@
1
+ """Sphinx configuration."""
2
+
3
+ from importlib.metadata import version as get_version
4
+
5
+ project = "zodi"
6
+ release = get_version("zodi")
7
+ version = ".".join(release.split(".")[:2])
8
+
9
+ extensions = [
10
+ "myst_nb",
11
+ "autoapi.extension",
12
+ "sphinx.ext.autodoc",
13
+ "sphinx.ext.napoleon",
14
+ "sphinx.ext.viewcode",
15
+ "sphinx.ext.mathjax",
16
+ ]
17
+
18
+ autoapi_dirs = ["../src"]
19
+ autoapi_ignore = ["**/*version.py"]
20
+ myst_enable_extensions = ["amsmath", "dollarmath"]
21
+
22
+ html_theme = "sphinx_book_theme"
23
+ html_context = {"default_mode": "dark"}
24
+ source_suffix = {".rst": "restructuredtext", ".md": "myst-nb"}
25
+
26
+ nb_execution_mode = "auto"
27
+ nb_execution_timeout = 120
28
+ nb_execution_raise_on_error = True