Skip to main content

jnkepler

A differentiable N-body model for multi-planet systems.

jnkepler is a Python package for modeling photometric and radial velocity data of multi-planet systems via N-body integration. Built with JAX, it leverages automatic differentiation for efficient computation of model gradients. This enables seamless integration with gradient-based optimizers and Hamiltonian Monte Carlo methods, including the No-U-Turn Sampler (NUTS) in NumPyro. The package is particularly suited for efficiently sampling from multi-planet posteriors involving a large number of parameters and strong degeneracy.

Subpackages

  • jnkepler.jaxttv: A differentialble N-body model for analyzing transit timing variations (TTVs) and radial velocities (RVs) of multi-planet systems.
  • jnkepler.nbodytransit: A differentialble photodynamical model. jaxoplanet needs to be installed for using this package.
  • jnkepler.nbodyrv: A differentiable RV model taking into account mutual interactions between planets.

See readthedocs for more details.

Installation

pip install jnkepler

CPU performance note

jnkepler is primarily intended for CPU execution, and supports recent JAX releases (tested through 0.11.2). For JAX >=0.4.32, the version-specific settings below substantially improve jnkepler's performance compared with the default runtime settings.

Set XLA_FLAGS before importing JAX, jnkepler, NumPyro, or any other library that imports JAX. In notebooks, restart the kernel first if these libraries have already been imported.

JAX >=0.7: increase the small-while-loop threshold

export XLA_FLAGS="--xla_backend_extra_options=xla_cpu_small_while_loop_byte_threshold=65536"

Or in Python:

import os
os.environ["XLA_FLAGS"] = (
    "--xla_backend_extra_options="
    "xla_cpu_small_while_loop_byte_threshold=65536"
)

import jax
import jnkepler

JAX 0.4.32–0.6.x: use the legacy CPU runtime

export XLA_FLAGS="--xla_cpu_use_thunk_runtime=false"

Or in Python:

import os
os.environ["XLA_FLAGS"] = "--xla_cpu_use_thunk_runtime=false"

import jax
import jnkepler

Use only the configuration for your JAX version. When upgrading to JAX >=0.7, replace --xla_cpu_use_thunk_runtime=false with the threshold setting above.

Performance varies with the JAX version, planetary system, CPU, and workload. JAX/jaxlib 0.6.2 with the legacy runtime provides a well-tested and stable CPU performance reference. If execution is unexpectedly slow after applying the settings above, comparing against this configuration can help identify performance regressions. It can be faster for some workloads, but is not required or universally faster.

See also issue #30 for benchmarks, version comparisons, and technical details.

Note on the transit-finding algorithm (since v0.2.5)

In JaxTTV.get_transit_times_obs, the default transit-time solver is now "fast". This method is optimized for efficient evaluation near the observed transit times, which is typically sufficient for inference because models far from the data have very low likelihood. For models that are substantially offset from the observed transit times, however, the fast method can be less accurate than the Newton-based method. Use transit_time_method="newton" when robust accuracy is needed in that regime.

For this reason, when using the fast method in NUTS, initialize the sampler from a good solution, such as a least-squares optimum as in the example notebooks, rather than from a diffuse or poor initial guess. If multimodality is a major concern, consider a preliminary grid/global search before running NUTS, rather than relying on NUTS alone to discover all modes.

Examples

Start with the step-by-step tutorials: fit transit times, write a NumPyro model, and initialize, tune, and diagnose NUTS. For non-transiting planets, RVs, photodynamics, and pure Keplerian calculations, see Models and extensions.

The examples/ directory contains the notebooks listed below. See the example notebook guide for their scope and requirements.

  • minimal example: examples/minimal_example.ipynb

    • computing transit times and RVs
    • plotting TTVs
    • adding a non-transiting planet
  • TTV modeling (normal likelihood): examples/kep51_ttv_normal.ipynb

  • TTV modeling (Student's t likelihood):

  • Photodynamical modeling: examples/kep51_photodynamics_gp.ipynb

    • SVI optimization & posterior sampling with NUTS
    • noise modeling using Gaussian Process with tinygp

Applications

  • TOI-1136: TTV modeling of 6-planets in a resonance chain [paper]
  • TOI-2015: Joint TTV & RV modeling of a two-planet system [paper]
  • Kepler-51: Four-planet modeling including JWST data [paper] [repository]
  • K2-19: TTVs confirm 3:2 resonance [paper]
  • TOI-4495: Photodynamical modeling of a pair of near-resonant sub-Neptunes [paper] [repository]
  • V1298 Tau: Four low-density planets transiting a young star [paper] [repository]; see also examples/v1298tau_ttv_student.ipynb in this repo
  • TOI-2076: TTV modeling of a young, near-resonant planetary system [paper]
  • TOI-791: TTV masses of two extremely low-density, Jupiter-sized planets [paper]

References

If you use jnkepler in your research, please consider citing the references below.

Metadata

Release files for jnkepler 0.2.9

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for jnkepler 0.2.9
File Size Uploaded Provenance Actions
jnkepler-0.2.9.tar.gz 45.4 MB With provenance Details for jnkepler-0.2.9.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for jnkepler 0.2.9
File Interpreter ABI Platform Actions
jnkepler-0.2.9-py3-none-any.whl Python 3 none any Details for jnkepler-0.2.9-py3-none-any.whl

Total release size: 45.6 MB

Release files / jnkepler-0.2.9.tar.gz

Download URL jnkepler-0.2.9.tar.gz
Size 45.4 MB
Tags Source
SHA-256 checksum
How to use checksums
ba92f31bf70899437d3eb7894e7a8c53ca8a44e48f1cd038bcf3234114b004ea
BLAKE2b-256 checksum
How to use checksums
b01ca53359b060ca8219d6923845b081a9de5779ac678b36fbbc659da25e5d4e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / jnkepler-0.2.9-py3-none-any.whl

Download URL jnkepler-0.2.9-py3-none-any.whl
Size 247.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c272d837c057de4f037b3d259bec2fa599bba3a7ba73f49d83a050cb4232778c
BLAKE2b-256 checksum
How to use checksums
307f32e22e583cd6616610291f3f4329ed679bfc88c3d45c509cc7a5ce992f97
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Security for jnkepler 0.2.9

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for jnkepler-0.2.9.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page