From 22c6169af1b08439953d2bfcc63e66ddee5e249f Mon Sep 17 00:00:00 2001 From: cdaunt Date: Wed, 18 Feb 2026 20:20:42 +0100 Subject: [PATCH 1/5] changed MKdocs site description --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index e7f39a5..9113f2e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -23,7 +23,7 @@ theme: #custom_dir: "docs/_overrides" # Overriding part of the HTML site_name: Circulus -site_description: A Differentiable, Functional Circuit Analyzer for the AI Era. +site_description: A Differentiable, Functional Circuit Analyzer based on JAX. edit_uri: "" From ff5656df922534fe143f783d689e511e9bf00b31 Mon Sep 17 00:00:00 2001 From: cdaunt Date: Wed, 18 Feb 2026 20:51:04 +0100 Subject: [PATCH 2/5] rename_project --- .gitignore | 4 +-- ReadMe.md | 26 +++++++++---------- circulax/__init__.py | 5 ++++ {circulus => circulax}/compiler.py | 6 ++--- {circulus => circulax}/components/__init__.py | 0 .../components/base_component.py | 0 .../components/electronic.py | 2 +- {circulus => circulax}/components/photonic.py | 4 +-- {circulus => circulax}/netlist.py | 12 ++++----- {circulus => circulax}/s_transforms.py | 14 +++++----- {circulus => circulax}/solvers/__init__.py | 0 {circulus => circulax}/solvers/assembly.py | 2 +- {circulus => circulax}/solvers/linear.py | 2 +- {circulus => circulax}/solvers/transient.py | 4 +-- {circulus => circulax}/utils.py | 4 +-- circulus/__init__.py | 5 ---- docs/gen_doc_stubs.py | 4 +-- docs/index.md | 26 +++++++++---------- docs/writing_components.md | 16 ++++++------ examples/diode_clipper.ipynb | 6 ++--- examples/mos_diff_pair.ipynb | 6 ++--- examples/photonics_transient.ipynb | 12 ++++----- examples/resistor_ladder.ipynb | 6 ++--- mkdocs.yml | 4 +-- pixi.lock | 2 +- pyproject.toml | 26 +++++++++---------- tests/conftest.py | 8 +++--- tests/test_compiler.py | 2 +- tests/test_components.py | 4 +-- tests/test_dc.py | 6 ++--- tests/test_netlist.py | 2 +- tests/test_notebooks.py | 2 +- tests/test_transient.py | 8 +++--- 33 files changed, 115 insertions(+), 115 deletions(-) create mode 100644 circulax/__init__.py rename {circulus => circulax}/compiler.py (95%) rename {circulus => circulax}/components/__init__.py (100%) rename {circulus => circulax}/components/base_component.py (100%) rename {circulus => circulax}/components/electronic.py (96%) rename {circulus => circulax}/components/photonic.py (95%) rename {circulus => circulax}/netlist.py (94%) rename {circulus => circulax}/s_transforms.py (87%) rename {circulus => circulax}/solvers/__init__.py (100%) rename {circulus => circulax}/solvers/assembly.py (99%) rename {circulus => circulax}/solvers/linear.py (97%) rename {circulus => circulax}/solvers/transient.py (96%) rename {circulus => circulax}/utils.py (92%) delete mode 100644 circulus/__init__.py diff --git a/.gitignore b/.gitignore index f1fb56b..56d78c3 100644 --- a/.gitignore +++ b/.gitignore @@ -6,9 +6,9 @@ archive/* .vscode/* .env app/* -circulus_workspace.code-workspace +circulax_workspace.code-workspace docs/examples/ docs/references/ *code-workspace site/* -circulus/_version.py +circulax/_version.py diff --git a/ReadMe.md b/ReadMe.md index e95bdd3..041dfbd 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,11 +1,11 @@ -# **Circulus** +# **circulax** logo ## **A Differentiable, Functional Circuit Simulator based on JAX** -Circulus is a differentiable circuit simulation framework built on [JAX](https://docs.jax.dev/en/latest/notebooks/thinking_in_jax.html), [Optimistix](https://github.com/patrick-kidger/optimistix) and [Diffrax](https://docs.kidger.site/diffrax/). It treats circuit netlists as systems of Ordinary Differential Equations (ODEs), leveraging Diffrax's suite of numerical solvers for transient analysis. +circulax is a differentiable circuit simulation framework built on [JAX](https://docs.jax.dev/en/latest/notebooks/thinking_in_jax.html), [Optimistix](https://github.com/patrick-kidger/optimistix) and [Diffrax](https://docs.kidger.site/diffrax/). It treats circuit netlists as systems of Ordinary Differential Equations (ODEs), leveraging Diffrax's suite of numerical solvers for transient analysis. -By using JAX as its backend, Circulus provides: +By using JAX as its backend, circulax provides: **Native Differentiation**: Full support for forward and reverse-mode automatic differentiation through the solver, enabling gradient-based parameter optimization and inverse design. @@ -15,9 +15,9 @@ By using JAX as its backend, Circulus provides: **Modular Architecture**: A functional approach to simulation that integrates directly into machine learning and scientific computing workflows. -Standard tools (SPICE, Spectre, Ngspice) rely on established matrix stamping methods and CPU-bound sparse solvers. Circulus leverages the JAX ecosystem to offer specific advantages in optimization and hardware utilization: +Standard tools (SPICE, Spectre, Ngspice) rely on established matrix stamping methods and CPU-bound sparse solvers. circulax leverages the JAX ecosystem to offer specific advantages in optimization and hardware utilization: -| Feature | Legacy(SPICE) | Circulus | +| Feature | Legacy(SPICE) | circulax | | ----------- | ----------- | ----------- | | Model Definition | Hardcoded C++ / Verilog-A | Simple python functions | | Derivatives | Hardcoded (C) or Compiler-Generated (Verilog-A) | Automatic Differentiation (AD)| @@ -27,13 +27,13 @@ Standard tools (SPICE, Spectre, Ngspice) rely on established matrix stamping met ## **Simulator setup** -Circulus strictly separates Physics, Topology, and Analysis, enabling the interchange of solvers or models without netlist modification. +circulax strictly separates Physics, Topology, and Analysis, enabling the interchange of solvers or models without netlist modification. ### **Physics Layer** Components are defined as simple Python functions wrapped with the ```@component``` decorator. This functional interface abstracts away the boilerplate, allowing users to define physics using simple voltage/current/field/flux relationships. ```python -from circulus.base_component import component, Signals, States +from circulax.base_component import component, Signals, States import jax.numpy as jnp @component(ports=("p1", "p2")) @@ -84,7 +84,7 @@ The solver is a generic DAE engine linking Diffrax (Time-stepping) and Optimisti ## **Installation** ```sh -pip install circulus +pip install circulax ``` ## **Simulation Example** @@ -93,10 +93,10 @@ pip install circulus import jax import diffrax -from circulus.components import Resistor, Capacitor, Inductor, VoltageSource -from circulus.compiler import compile_netlist -from circulus.solvers.transient import VectorizedTransientSolver -from circulus.solvers.strategies import DenseSolver +from circulax.components import Resistor, Capacitor, Inductor, VoltageSource +from circulax.compiler import compile_netlist +from circulax.solvers.transient import VectorizedTransientSolver +from circulax.solvers.strategies import DenseSolver import jax.numpy as jnp import matplotlib.pyplot as plt @@ -195,4 +195,4 @@ plt.show() ## **License** -Copyright © 2026, Chris Daunt, [Apache-2.0 License](https://github.com/cdaunt/circulus/blob/master/LICENSE) +Copyright © 2026, Chris Daunt, [Apache-2.0 License](https://github.com/cdaunt/circulax/blob/master/LICENSE) diff --git a/circulax/__init__.py b/circulax/__init__.py new file mode 100644 index 0000000..a31dc18 --- /dev/null +++ b/circulax/__init__.py @@ -0,0 +1,5 @@ +"""circulax: A differentiable, JAX based circuit simulator.""" +from circulax.compiler import compile_netlist +from circulax.netlist import circulaxNetlist as Netlist +from circulax.netlist import build_net_map, netlist +from circulax.solvers import analyze_circuit, setup_transient diff --git a/circulus/compiler.py b/circulax/compiler.py similarity index 95% rename from circulus/compiler.py rename to circulax/compiler.py index 7436a1f..ff5c98b 100644 --- a/circulus/compiler.py +++ b/circulax/compiler.py @@ -9,8 +9,8 @@ import jax import jax.numpy as jnp -from circulus.components.base_component import PhysicsReturn, Signals -from circulus.netlist import build_net_map +from circulax.components.base_component import PhysicsReturn, Signals +from circulax.netlist import build_net_map def ensure_time_signature(model_func: callable) -> callable: @@ -194,7 +194,7 @@ def compile_netlist(netlist: dict, models_map: dict) -> tuple[dict, int, dict]: constructor). A ``"GND"`` instance with ``component="ground"`` is recognised and skipped. models_map: Mapping from model name strings to - :class:`~circulus.components.base_component.CircuitComponent` + :class:`~circulax.components.base_component.CircuitComponent` subclasses, e.g. ``{"Resistor": Resistor, "Capacitor": Capacitor}``. Returns: diff --git a/circulus/components/__init__.py b/circulax/components/__init__.py similarity index 100% rename from circulus/components/__init__.py rename to circulax/components/__init__.py diff --git a/circulus/components/base_component.py b/circulax/components/base_component.py similarity index 100% rename from circulus/components/base_component.py rename to circulax/components/base_component.py diff --git a/circulus/components/electronic.py b/circulax/components/electronic.py similarity index 96% rename from circulus/components/electronic.py rename to circulax/components/electronic.py index 16b8657..3e302f5 100644 --- a/circulus/components/electronic.py +++ b/circulax/components/electronic.py @@ -3,7 +3,7 @@ import jax.nn as jnn import jax.numpy as jnp -from circulus.components.base_component import ( +from circulax.components.base_component import ( PhysicsReturn, Signals, States, diff --git a/circulus/components/photonic.py b/circulax/components/photonic.py similarity index 95% rename from circulus/components/photonic.py rename to circulax/components/photonic.py index bc1ddfb..54418c8 100644 --- a/circulus/components/photonic.py +++ b/circulax/components/photonic.py @@ -6,8 +6,8 @@ import jax.nn as jnn import jax.numpy as jnp -from circulus.components.base_component import PhysicsReturn, Signals, States, component, source -from circulus.s_transforms import s_to_y +from circulax.components.base_component import PhysicsReturn, Signals, States, component, source +from circulax.s_transforms import s_to_y # =========================================================================== # Passive Optical Components (S-Matrix based) diff --git a/circulus/netlist.py b/circulax/netlist.py similarity index 94% rename from circulus/netlist.py rename to circulax/netlist.py index baf52b3..f7dffeb 100644 --- a/circulus/netlist.py +++ b/circulax/netlist.py @@ -1,6 +1,6 @@ -"""Circulus netlists. +"""circulax netlists. -SAX netlists will be used as much as possible in circulus; +SAX netlists will be used as much as possible in circulax; however, connections for node based simulators need to be handled slightly differently. """ @@ -26,7 +26,7 @@ InstancePort, InstancePort | tuple[InstancePort, ...] ] -CirculusNetlist = Annotated[ +circulaxNetlist = Annotated[ TypedDict( "Netlist", { @@ -52,11 +52,11 @@ settings: Global circuit settings. """ -Netlist = CirculusNetlist +Netlist = circulaxNetlist -# Monkeypatch sax.Netlist to be CirculusNetlist so that all functions using sax.Netlist +# Monkeypatch sax.Netlist to be circulaxNetlist so that all functions using sax.Netlist # May need to make this explicit in the future -sax_netlist.Netlist = CirculusNetlist # type: ignore[assignment] +sax_netlist.Netlist = circulaxNetlist # type: ignore[assignment] def build_net_map(netlist: dict) -> tuple[dict[str, int], int]: diff --git a/circulus/s_transforms.py b/circulax/s_transforms.py similarity index 87% rename from circulus/s_transforms.py rename to circulax/s_transforms.py index 0b112f6..4929463 100644 --- a/circulus/s_transforms.py +++ b/circulax/s_transforms.py @@ -1,7 +1,7 @@ """Utilities for converting between S-parameters. Utilities for converting between S-parameter and admittance representations, -and for wrapping SAX model functions as Circulus components. +and for wrapping SAX model functions as circulax components. """ import inspect @@ -10,7 +10,7 @@ import jax.numpy as jnp from sax import get_ports, sdense -from circulus.components.base_component import Signals, States, component +from circulax.components.base_component import Signals, States, component @jax.jit @@ -35,11 +35,11 @@ def s_to_y(S: jax.Array, z0: float = 1.0) -> jax.Array: def sax_component(fn: callable) -> callable: - """Decorator to convert a SAX model function into a Circulus component. + """Decorator to convert a SAX model function into a circulax component. Inspects ``fn`` at decoration time to discover its port interface via a dry run, then wraps its S-matrix output in an admittance-based physics - function compatible with the Circulus nodal solver. + function compatible with the circulax nodal solver. The conversion proceeds in three stages: @@ -51,8 +51,8 @@ def sax_component(fn: callable) -> callable: it to an admittance matrix via :func:`s_to_y`, and returns ``I = Y @ V`` as a port current dict. 3. **Component registration** — the wrapper is passed to - :func:`~circulus.components.base_component.component` with the - discovered ports, producing a :class:`~circulus.components.base_component.CircuitComponent` + :func:`~circulax.components.base_component.component` with the + discovered ports, producing a :class:`~circulax.components.base_component.CircuitComponent` subclass. Args: @@ -62,7 +62,7 @@ def sax_component(fn: callable) -> callable: ``1.0`` during the dry run. Returns: - A :class:`~circulus.components.base_component.CircuitComponent` + A :class:`~circulax.components.base_component.CircuitComponent` subclass named after ``fn``. Raises: diff --git a/circulus/solvers/__init__.py b/circulax/solvers/__init__.py similarity index 100% rename from circulus/solvers/__init__.py rename to circulax/solvers/__init__.py diff --git a/circulus/solvers/assembly.py b/circulax/solvers/assembly.py similarity index 99% rename from circulus/solvers/assembly.py rename to circulax/solvers/assembly.py index 6ddd873..c2086fe 100644 --- a/circulus/solvers/assembly.py +++ b/circulax/solvers/assembly.py @@ -7,7 +7,7 @@ - **Full assembly** (:func:`assemble_system_real`, :func:`assemble_system_complex`) — evaluates both the residual and the forward-mode Jacobian via ``jax.jacfwd``. Used once per timestep to assemble and factor the frozen - Jacobian in :class:`~circulus.solver.FactorizedTransientSolver`. + Jacobian in :class:`~circulax.solver.FactorizedTransientSolver`. - **Residual only** (:func:`assemble_residual_only_real`, :func:`assemble_residual_only_complex`) — evaluates only the primal diff --git a/circulus/solvers/linear.py b/circulax/solvers/linear.py similarity index 97% rename from circulus/solvers/linear.py rename to circulax/solvers/linear.py index ceefcad..d7ee403 100644 --- a/circulus/solvers/linear.py +++ b/circulax/solvers/linear.py @@ -27,7 +27,7 @@ import numpy as np import optimistix as optx -from circulus.solvers.assembly import assemble_system_complex, assemble_system_real +from circulax.solvers.assembly import assemble_system_complex, assemble_system_real # Check if split solver available — KLUHandleManager was added in a later version of klujax. split_solver_available = True diff --git a/circulus/solvers/transient.py b/circulax/solvers/transient.py similarity index 96% rename from circulus/solvers/transient.py rename to circulax/solvers/transient.py index 676c890..a2b685c 100644 --- a/circulus/solvers/transient.py +++ b/circulax/solvers/transient.py @@ -11,13 +11,13 @@ from jax.typing import ArrayLike #from klujax import free_numeric -from circulus.solvers.assembly import ( +from circulax.solvers.assembly import ( assemble_residual_only_complex, assemble_residual_only_real, assemble_system_complex, assemble_system_real, ) -from circulus.solvers.linear import CircuitLinearSolver +from circulax.solvers.linear import CircuitLinearSolver def _compute_history(component_groups, y_c, t, num_vars) -> ArrayLike: diff --git a/circulus/utils.py b/circulax/utils.py similarity index 92% rename from circulus/utils.py rename to circulax/utils.py index 977e91b..9931d16 100644 --- a/circulus/utils.py +++ b/circulax/utils.py @@ -1,4 +1,4 @@ -"""Circulus utilities.""" +"""circulax utilities.""" from typing import TYPE_CHECKING @@ -6,7 +6,7 @@ import jax.numpy as jnp if TYPE_CHECKING: - from circulus.compiler import ComponentGroup + from circulax.compiler import ComponentGroup def update_params_dict( diff --git a/circulus/__init__.py b/circulus/__init__.py deleted file mode 100644 index 5b0e319..0000000 --- a/circulus/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Circulus: A differentiable, JAX based circuit simulator.""" -from circulus.compiler import compile_netlist -from circulus.netlist import CirculusNetlist as Netlist -from circulus.netlist import build_net_map, netlist -from circulus.solvers import analyze_circuit, setup_transient diff --git a/docs/gen_doc_stubs.py b/docs/gen_doc_stubs.py index 2a8d5db..9f83e6e 100644 --- a/docs/gen_doc_stubs.py +++ b/docs/gen_doc_stubs.py @@ -5,7 +5,7 @@ this_dir = Path(__file__).parent -src_root = (this_dir / "../circulus").resolve() +src_root = (this_dir / "../circulax").resolve() for path in src_root.rglob("*.py"): rel_path = path.relative_to(src_root) @@ -20,7 +20,7 @@ else: doc_path = rel_path.with_suffix(".md") - full_parts = ("circulus",) + parts + full_parts = ("circulax",) + parts identifier = ".".join(full_parts) output_filename = Path("references") / doc_path diff --git a/docs/index.md b/docs/index.md index b56c0a1..3054ac2 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,11 +1,11 @@ -# **Circulus** +# **circulax** logo ## **A Differentiable, Functional Circuit Simulator based on JAX** -Circulus is a differentiable circuit simulation framework built on [JAX](https://docs.jax.dev/en/latest/notebooks/thinking_in_jax.html), [Optimistix](https://github.com/patrick-kidger/optimistix) and [Diffrax](https://docs.kidger.site/diffrax/). It treats circuit netlists as systems of Ordinary Differential Equations (ODEs), leveraging Diffrax's suite of numerical solvers for transient analysis. +circulax is a differentiable circuit simulation framework built on [JAX](https://docs.jax.dev/en/latest/notebooks/thinking_in_jax.html), [Optimistix](https://github.com/patrick-kidger/optimistix) and [Diffrax](https://docs.kidger.site/diffrax/). It treats circuit netlists as systems of Ordinary Differential Equations (ODEs), leveraging Diffrax's suite of numerical solvers for transient analysis. -By using JAX as its backend, Circulus provides: +By using JAX as its backend, circulax provides: **Native Differentiation**: Full support for forward and reverse-mode automatic differentiation through the solver, enabling gradient-based parameter optimization and inverse design. @@ -15,9 +15,9 @@ By using JAX as its backend, Circulus provides: **Modular Architecture**: A functional approach to simulation that integrates directly into machine learning and scientific computing workflows. -Standard tools (SPICE, Spectre, Ngspice) rely on established matrix stamping methods and CPU-bound sparse solvers. Circulus leverages the JAX ecosystem to offer specific advantages in optimization and hardware utilization: +Standard tools (SPICE, Spectre, Ngspice) rely on established matrix stamping methods and CPU-bound sparse solvers. circulax leverages the JAX ecosystem to offer specific advantages in optimization and hardware utilization: -| Feature | Legacy(SPICE) | Circulus | +| Feature | Legacy(SPICE) | circulax | | ----------- | ----------- | ----------- | | Model Definition | Hardcoded C++ / Verilog-A | Simple python functions | | Derivatives | Hardcoded (C) or Compiler-Generated (Verilog-A) | Automatic Differentiation (AD)| @@ -27,13 +27,13 @@ Standard tools (SPICE, Spectre, Ngspice) rely on established matrix stamping met ## **Simulator setup** -Circulus strictly separates Physics, Topology, and Analysis, enabling the interchange of solvers or models without netlist modification. +circulax strictly separates Physics, Topology, and Analysis, enabling the interchange of solvers or models without netlist modification. ### **Physics Layer** Components are defined as simple Python functions wrapped with the ```@component``` decorator. This functional interface abstracts away the boilerplate, allowing users to define physics using simple voltage/current/field/flux relationships. ```python -from circulus.base_component import component, Signals, States +from circulax.base_component import component, Signals, States import jax.numpy as jnp @component(ports=("p1", "p2")) @@ -84,7 +84,7 @@ The solver is a generic DAE engine linking Diffrax (Time-stepping) and Optimisti ## **Installation** ```sh -pip install circulus +pip install circulax ``` ## **Simulation Example** @@ -93,10 +93,10 @@ pip install circulus import jax import diffrax -from circulus.components import Resistor, Capacitor, Inductor, VoltageSource -from circulus.compiler import compile_netlist -from circulus.solvers.transient import VectorizedTransientSolver -from circulus.solvers.strategies import DenseSolver +from circulax.components import Resistor, Capacitor, Inductor, VoltageSource +from circulax.compiler import compile_netlist +from circulax.solvers.transient import VectorizedTransientSolver +from circulax.solvers.strategies import DenseSolver import jax.numpy as jnp import matplotlib.pyplot as plt @@ -195,4 +195,4 @@ plt.show() ## **License** -Copyright © 2026, Chris Daunt, [Apache-2.0 License](https://github.com/cdaunt/circulus/blob/master/LICENSE) +Copyright © 2026, Chris Daunt, [Apache-2.0 License](https://github.com/cdaunt/circulax/blob/master/LICENSE) diff --git a/docs/writing_components.md b/docs/writing_components.md index 4dc8a80..db87fa5 100644 --- a/docs/writing_components.md +++ b/docs/writing_components.md @@ -1,12 +1,12 @@ ## Writing Components -Circulus uses a functional, JAX-first approach to component definition. Instead of inheriting from complex base classes, you define components as pure Python functions decorated with specific handlers. +circulax uses a functional, JAX-first approach to component definition. Instead of inheriting from complex base classes, you define components as pure Python functions decorated with specific handlers. This architecture ensures your components are automatically compatible with JIT compilation (jax.jit), vectorization (jax.vmap), and back-propagation (jax.grad). ### The Core Concept -Every component in Circulus is a function that calculates the instantaneous balance equations for a specific node or state. The function signature generally looks like this: +Every component in circulax is a function that calculates the instantaneous balance equations for a specific node or state. The function signature generally looks like this: ```python def MyComponent(signals, s, [t], **params): @@ -49,7 +49,7 @@ Most passive components (Resistors, Transistors, Diodes) do not depend explicitl ```python import jax.numpy as jnp -from circulus.base_component import component, Signals, States +from circulax.base_component import component, Signals, States @component(ports=("p", "n")) def Resistor(signals: Signals, s: States, R: float = 1e3): @@ -104,7 +104,7 @@ Example: AC Voltage Source Voltage sources require an Internal State variable (i_src) to represent the current flowing through the source. This is because the voltage is fixed, so the current is the unknown variable the solver must find. -from circulus.base_component import source +from circulax.base_component import source ```python @source(ports=("p", "n"), states=("i_src",)) @@ -130,12 +130,12 @@ def ACSource(signals: Signals, s: States, t: float, V: float = 1.0, freq: float ## Photonic Components (Frequency Domain) -Circulus can simulate photonic circuits by treating them as complex-valued resistor networks. You typically start with an S-Matrix, convert it to an Admittance (Y) Matrix, and calculate currents via $I = Y \cdot V$. +circulax can simulate photonic circuits by treating them as complex-valued resistor networks. You typically start with an S-Matrix, convert it to an Admittance (Y) Matrix, and calculate currents via $I = Y \cdot V$. Example: Optical Waveguide ```python -from circulus.s_transforms import s_to_y +from circulax.s_transforms import s_to_y @component(ports=("in", "out")) def Waveguide(signals: Signals, s: States, length_um: float = 100.0, neff: float = 2.4, wl: float = 1.55): @@ -171,7 +171,7 @@ def Waveguide(signals: Signals, s: States, length_um: float = 100.0, neff: float If you have existing models written for SAX, you can reuse them directly without rewriting physics logic using the @sax_component decorator. ```python -from circulus.sax_integration import sax_component +from circulax.sax_integration import sax_component # 1. Define or Import a pure SAX model def sax_coupler(coupling=0.5): @@ -184,7 +184,7 @@ def sax_coupler(coupling=0.5): ("in1", "out1"): tau } -# 2. Convert to Circulus Component +# 2. Convert to circulax Component # This automatically detects ports ('in0', 'in1', 'out0', 'out1') Coupler = sax_component(sax_coupler) ``` diff --git a/examples/diode_clipper.ipynb b/examples/diode_clipper.ipynb index 46dd059..b2ffb98 100644 --- a/examples/diode_clipper.ipynb +++ b/examples/diode_clipper.ipynb @@ -26,9 +26,9 @@ "import jax.numpy as jnp\n", "import matplotlib.pyplot as plt\n", "\n", - "from circulus.compiler import compile_netlist\n", - "from circulus.components.electronic import Diode, Resistor, VoltageSourceAC\n", - "from circulus.solvers import analyze_circuit, setup_transient\n", + "from circulax.compiler import compile_netlist\n", + "from circulax.components.electronic import Diode, Resistor, VoltageSourceAC\n", + "from circulax.solvers import analyze_circuit, setup_transient\n", "\n", "jax.config.update(\"jax_enable_x64\", True)" ] diff --git a/examples/mos_diff_pair.ipynb b/examples/mos_diff_pair.ipynb index 9bbd1d3..91f1377 100644 --- a/examples/mos_diff_pair.ipynb +++ b/examples/mos_diff_pair.ipynb @@ -32,9 +32,9 @@ "import jax.numpy as jnp\n", "import matplotlib.pyplot as plt\n", "\n", - "from circulus.compiler import compile_netlist\n", - "from circulus.components.electronic import NMOS, CurrentSource, Resistor, VoltageSource\n", - "from circulus.solvers import analyze_circuit" + "from circulax.compiler import compile_netlist\n", + "from circulax.components.electronic import NMOS, CurrentSource, Resistor, VoltageSource\n", + "from circulax.solvers import analyze_circuit" ] }, { diff --git a/examples/photonics_transient.ipynb b/examples/photonics_transient.ipynb index e286cbd..67b0fdc 100644 --- a/examples/photonics_transient.ipynb +++ b/examples/photonics_transient.ipynb @@ -33,11 +33,11 @@ "import jax.numpy as jnp\n", "import matplotlib.pyplot as plt\n", "\n", - "from circulus.compiler import compile_netlist\n", - "from circulus.components.base_component import PhysicsReturn, Signals, States, component\n", - "from circulus.components.electronic import Resistor\n", - "from circulus.components.photonic import OpticalSourcePulse\n", - "from circulus.solvers import analyze_circuit, setup_transient\n" + "from circulax.compiler import compile_netlist\n", + "from circulax.components.base_component import PhysicsReturn, Signals, States, component\n", + "from circulax.components.electronic import Resistor\n", + "from circulax.components.photonic import OpticalSourcePulse\n", + "from circulax.solvers import analyze_circuit, setup_transient\n" ] }, { @@ -50,7 +50,7 @@ }, "outputs": [], "source": [ - "from circulus.s_transforms import s_to_y\n", + "from circulax.s_transforms import s_to_y\n", "\n", "\n", "@component(ports=(\"p1\", \"p2\"))\n", diff --git a/examples/resistor_ladder.ipynb b/examples/resistor_ladder.ipynb index 6aa5ffe..7f2a693 100644 --- a/examples/resistor_ladder.ipynb +++ b/examples/resistor_ladder.ipynb @@ -36,9 +36,9 @@ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", - "from circulus.compiler import compile_netlist\n", - "from circulus.components.electronic import Resistor, VoltageSource\n", - "from circulus.solvers import analyze_circuit" + "from circulax.compiler import compile_netlist\n", + "from circulax.components.electronic import Resistor, VoltageSource\n", + "from circulax.solvers import analyze_circuit" ] }, { diff --git a/mkdocs.yml b/mkdocs.yml index 9113f2e..b89a142 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -22,7 +22,7 @@ theme: #custom_dir: "docs/_overrides" # Overriding part of the HTML -site_name: Circulus +site_name: circulax site_description: A Differentiable, Functional Circuit Analyzer based on JAX. edit_uri: "" @@ -64,7 +64,7 @@ plugins: - mkdocstrings: handlers: python: - paths: [circulus] + paths: [circulax] inventories: - https://docs.jax.dev/en/latest/objects.inv - https://docs.kidger.site/jaxtyping/objects.inv diff --git a/pixi.lock b/pixi.lock index 7c7163a..8092d2f 100644 --- a/pixi.lock +++ b/pixi.lock @@ -1505,7 +1505,7 @@ packages: sha256: a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894 requires_python: '>=3.7' - pypi: ./ - name: circulus + name: circulax version: 0.1.dev130+gc656a6b82 sha256: b79a1c5240781a504bec75c856461ee5347a512d9b605852ec84068baca102f3 requires_dist: diff --git a/pyproject.toml b/pyproject.toml index 94cf1c0..d77e05e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [project] -name = "circulus" +name = "circulax" dynamic = ["version"] description = "Differentiable circuit simulator based on JAX" authors = [ @@ -58,7 +58,7 @@ docs = [ "mkdocstrings[python]>=0.27.0", ] dev = [ - "circulus[test,docs]", + "circulax[test,docs]", "black", "ruff", "mypy", @@ -66,10 +66,10 @@ dev = [ ] [project.urls] -Homepage = "https://github.com/cdaunt/circulus" -Repository = "https://github.com/cdaunt/circulus" -Documentation = "https://cdaunt.github.io/circulus" -Issues = "https://github.com/cdaunt/circulus/issues" +Homepage = "https://github.com/cdaunt/circulax" +Repository = "https://github.com/cdaunt/circulax" +Documentation = "https://cdaunt.github.io/circulax" +Issues = "https://github.com/cdaunt/circulax/issues" # --------------------------------------------------------------------------- # Build system (PyPI / hatch) @@ -83,10 +83,10 @@ build-backend = "hatchling.build" source = "vcs" [tool.hatch.build.hooks.vcs] -version-file = "circulus/_version.py" +version-file = "circulax/_version.py" [tool.hatch.build.targets.wheel] -packages = ["circulus"] +packages = ["circulax"] # --------------------------------------------------------------------------- # Pixi workspace @@ -100,7 +100,7 @@ preview = ["pixi-build"] # Shared editable install for all environments [tool.pixi.pypi-dependencies] -circulus = { path = ".", editable = true } +circulax = { path = ".", editable = true } # --------------------------------------------------------------------------- # Conda package build (pixi build) @@ -108,7 +108,7 @@ circulus = { path = ".", editable = true } # --------------------------------------------------------------------------- [tool.pixi.package] -name = "circulus" +name = "circulax" [tool.pixi.package.build] backend = { name = "pixi-build-python", version = "*" } @@ -129,7 +129,7 @@ tqdm = ">=4.67.1,<5" # Test feature — used by CI environments [tool.pixi.feature.test.pypi-dependencies] -circulus = { path = ".", editable = true, extras = ["test"] } +circulax = { path = ".", editable = true, extras = ["test"] } # Dev tooling feature [tool.pixi.feature.dev.dependencies] @@ -145,7 +145,7 @@ uv = ">=0.6" copy_readme = "cp ReadMe.md docs/index.md && sed -i 's|docs/images|images|g' docs/index.md" clean_old_docs = "rm -rf docs/examples/*.ipynb || true" copy-examples = { cmd = ["mkdir", "-p", "docs/examples", "&&", "cp", "-r", "examples/*", "docs/examples/"], depends-on = ["clean_old_docs"] } -install_ipkernel = "python -m ipykernel install --user --name circulus" +install_ipkernel = "python -m ipykernel install --user --name circulax" docs-serve = { cmd = ["mkdocs", "serve", "-w", "docs"], depends-on = ["copy_readme", "copy-examples", "install_ipkernel"] } pytest_run = { cmd = ["pytest", "tests",], depends-on = ["install_ipkernel"] } lint_format = "ruff format" @@ -256,7 +256,7 @@ select = ["ALL"] "S101", # assert "T201", # print ] -"circulus/components/*.py" = [ +"circulax/components/*.py" = [ "N802", "ARG001", ] diff --git a/tests/conftest.py b/tests/conftest.py index 91da9cc..6a98da1 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -16,7 +16,7 @@ @pytest.fixture def simple_lrc_netlist(): """Returns (net_dict, models_map) for a small LRC example.""" - from circulus.components.electronic import ( + from circulax.components.electronic import ( Capacitor, Inductor, Resistor, @@ -55,8 +55,8 @@ def simple_lrc_netlist(): @pytest.fixture def simple_optical_netlist(): - from circulus.components.electronic import Resistor - from circulus.components.photonic import OpticalSourcePulse, OpticalWaveguide + from circulax.components.electronic import Resistor + from circulax.components.photonic import OpticalSourcePulse, OpticalWaveguide models_map = { "waveguide": OpticalWaveguide, @@ -75,7 +75,7 @@ def simple_optical_netlist(): "R1": { "component": "resistor", "settings": {"R": 1.0}, - }, # circulus.components.Resistor defaults to 1k, we set 1.0 + }, # circulax.components.Resistor defaults to 1k, we set 1.0 }, "connections": { "GND,p1": ("I1,p2", "R1,p2"), diff --git a/tests/test_compiler.py b/tests/test_compiler.py index f19cef1..6c4b8bd 100644 --- a/tests/test_compiler.py +++ b/tests/test_compiler.py @@ -1,4 +1,4 @@ -from circulus.compiler import compile_netlist +from circulax.compiler import compile_netlist def test_compile_netlist_basic(simple_lrc_netlist): diff --git a/tests/test_components.py b/tests/test_components.py index d6f5fe1..eac0b7f 100644 --- a/tests/test_components.py +++ b/tests/test_components.py @@ -1,10 +1,10 @@ import jax import jax.numpy as jnp -from circulus.components.base_component import CircuitComponent, PhysicsReturn, Signals, States +from circulax.components.base_component import CircuitComponent, PhysicsReturn, Signals, States # Import components to be tested -from circulus.components.electronic import ( +from circulax.components.electronic import ( CCCS, CCVS, VCCS, diff --git a/tests/test_dc.py b/tests/test_dc.py index 652e21e..47f438a 100644 --- a/tests/test_dc.py +++ b/tests/test_dc.py @@ -4,9 +4,9 @@ import jax.numpy as jnp import pytest -from circulus.compiler import compile_netlist -from circulus.netlist import Netlist -from circulus.solvers.linear import backends +from circulax.compiler import compile_netlist +from circulax.netlist import Netlist +from circulax.solvers.linear import backends solvers = set(backends.values()) diff --git a/tests/test_netlist.py b/tests/test_netlist.py index 81e5a3f..bed211a 100644 --- a/tests/test_netlist.py +++ b/tests/test_netlist.py @@ -1,6 +1,6 @@ from matplotlib.figure import Figure -from circulus.netlist import draw_circuit_graph +from circulax.netlist import draw_circuit_graph def test_draw_circuit_graph_returns_figure(simple_lrc_netlist): diff --git a/tests/test_notebooks.py b/tests/test_notebooks.py index de25d95..8b2472f 100644 --- a/tests/test_notebooks.py +++ b/tests/test_notebooks.py @@ -32,7 +32,7 @@ def test_nbs(path: Path | str) -> None: nb = papermill_engines.execute_notebook_with_engine( engine_name=None, nb=nb, - kernel_name="circulus", + kernel_name="circulax", input_path=str(path), output_path=None, ) diff --git a/tests/test_transient.py b/tests/test_transient.py index 81ebc6f..2bc8319 100644 --- a/tests/test_transient.py +++ b/tests/test_transient.py @@ -2,10 +2,10 @@ import jax.numpy as jnp import pytest -from circulus.compiler import compile_netlist -from circulus.solvers import linear as st -from circulus.solvers.linear import backends -from circulus.solvers.transient import VectorizedTransientSolver +from circulax.compiler import compile_netlist +from circulax.solvers import linear as st +from circulax.solvers.linear import backends +from circulax.solvers.transient import VectorizedTransientSolver solvers = set(backends.values()) From d6e08652f45b7f5d4b365a38aceb9fe762abf59b Mon Sep 17 00:00:00 2001 From: cdaunt Date: Wed, 18 Feb 2026 21:25:37 +0100 Subject: [PATCH 3/5] edit logos --- docs/images/circulus_logo.svg | 110 ----------- docs/images/logo.svg | 333 +++++++++++++++++----------------- docs/images/logo_white.svg | 331 +++++++++++++++++---------------- 3 files changed, 327 insertions(+), 447 deletions(-) delete mode 100644 docs/images/circulus_logo.svg diff --git a/docs/images/circulus_logo.svg b/docs/images/circulus_logo.svg deleted file mode 100644 index 18be472..0000000 --- a/docs/images/circulus_logo.svg +++ /dev/null @@ -1,110 +0,0 @@ - - - - -Created by potrace 1.16, written by Peter Selinger 2001-2019 - - - - - diff --git a/docs/images/logo.svg b/docs/images/logo.svg index 868521e..1c03a01 100644 --- a/docs/images/logo.svg +++ b/docs/images/logo.svg @@ -2,178 +2,173 @@ Created by potrace 1.16, written by Peter Selinger 2001-2019 - - - - - - - - - - - + + + + + + + + + + + + diff --git a/docs/images/logo_white.svg b/docs/images/logo_white.svg index 957960a..9b7229f 100644 --- a/docs/images/logo_white.svg +++ b/docs/images/logo_white.svg @@ -2,178 +2,173 @@ Created by potrace 1.16, written by Peter Selinger 2001-2019 - - - - - - - - - - - + + + + + + + + + + + From c2cdf8cbbed2c70ba6566dd304b0cf1f14f79b71 Mon Sep 17 00:00:00 2001 From: cdaunt Date: Wed, 18 Feb 2026 21:26:32 +0100 Subject: [PATCH 4/5] edit imports --- examples/LCR.ipynb | 8 ++++---- examples/LC_ladder.ipynb | 6 +++--- examples/mzm.ipynb | 10 +++++----- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/examples/LCR.ipynb b/examples/LCR.ipynb index 30bc3f4..dc841c4 100644 --- a/examples/LCR.ipynb +++ b/examples/LCR.ipynb @@ -31,9 +31,9 @@ "import jax.numpy as jnp\n", "import matplotlib.pyplot as plt\n", "\n", - "from circulus.compiler import compile_netlist\n", - "from circulus.components.electronic import Capacitor, Inductor, Resistor, VoltageSource\n", - "from circulus.solvers import analyze_circuit, setup_transient" + "from circulax.compiler import compile_netlist\n", + "from circulax.components.electronic import Capacitor, Inductor, Resistor, VoltageSource\n", + "from circulax.solvers import analyze_circuit, setup_transient" ] }, { @@ -146,7 +146,7 @@ "metadata": {}, "outputs": [], "source": [ - "from circulus.netlist import draw_circuit_graph\n", + "from circulax.netlist import draw_circuit_graph\n", "\n", "draw_circuit_graph(netlist=net_dict);" ] diff --git a/examples/LC_ladder.ipynb b/examples/LC_ladder.ipynb index 646f2c2..db4d3c6 100644 --- a/examples/LC_ladder.ipynb +++ b/examples/LC_ladder.ipynb @@ -37,14 +37,14 @@ "import jax.numpy as jnp\n", "import matplotlib.pyplot as plt\n", "\n", - "from circulus.compiler import compile_netlist\n", - "from circulus.components.electronic import (\n", + "from circulax.compiler import compile_netlist\n", + "from circulax.components.electronic import (\n", " Capacitor,\n", " Inductor,\n", " Resistor,\n", " SmoothPulse,\n", ")\n", - "from circulus.solvers import analyze_circuit, setup_transient\n", + "from circulax.solvers import analyze_circuit, setup_transient\n", "\n", "jax.config.update(\"jax_enable_x64\", True)" ] diff --git a/examples/mzm.ipynb b/examples/mzm.ipynb index fde0c79..63235ad 100644 --- a/examples/mzm.ipynb +++ b/examples/mzm.ipynb @@ -33,9 +33,9 @@ "import jax.numpy as jnp\n", "import matplotlib.pyplot as plt\n", "\n", - "from circulus.compiler import compile_netlist\n", - "from circulus.solvers import analyze_circuit\n", - "from circulus.utils import update_group_params\n" + "from circulax.compiler import compile_netlist\n", + "from circulax.solvers import analyze_circuit\n", + "from circulax.utils import update_group_params\n" ] }, { @@ -302,8 +302,8 @@ "metadata": {}, "outputs": [], "source": [ - "from circulus.components.electronic import Resistor\n", - "from circulus.components.photonic import (\n", + "from circulax.components.electronic import Resistor\n", + "from circulax.components.photonic import (\n", " Grating,\n", " OpticalSource,\n", " OpticalWaveguide,\n", From 9f38cbc5c0b41514b5f7388203d177427ab603c0 Mon Sep 17 00:00:00 2001 From: cdaunt Date: Wed, 18 Feb 2026 21:26:39 +0100 Subject: [PATCH 5/5] update pixi lock --- pixi.lock | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/pixi.lock b/pixi.lock index 8092d2f..79420d7 100644 --- a/pixi.lock +++ b/pixi.lock @@ -196,7 +196,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/15/c0/0be24758891ef825f2065cd5db8741aaddabe3e248ee6acc5e8a80f04005/uvloop-0.22.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fa/6e/3e955517e22cbdd565f2f8b2e73d52528b14b8bcfdb04f62466b071de847/validators-0.35.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/42/4b/6cf85b485be7ec29db837ec2a1d8cd68bc1147b1abf23d8636c5bd65b3cc/virtualenv-20.37.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/2a/dc2228b2888f51192c7dc766106cd475f1b768c10caaf9727659726f7391/virtualenv-20.36.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl @@ -387,7 +387,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/89/8c/182a2a593195bfd39842ea68ebc084e20c850806117213f5a299dfc513d9/uvloop-0.22.1-cp313-cp313-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/fa/6e/3e955517e22cbdd565f2f8b2e73d52528b14b8bcfdb04f62466b071de847/validators-0.35.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/42/4b/6cf85b485be7ec29db837ec2a1d8cd68bc1147b1abf23d8636c5bd65b3cc/virtualenv-20.37.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/2a/dc2228b2888f51192c7dc766106cd475f1b768c10caaf9727659726f7391/virtualenv-20.36.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl @@ -537,7 +537,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/74/4f/256aca690709e9b008b7108bc85fba619a2bc37c6d80743d18abad16ee09/uvloop-0.22.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/42/4b/6cf85b485be7ec29db837ec2a1d8cd68bc1147b1abf23d8636c5bd65b3cc/virtualenv-20.37.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/2a/dc2228b2888f51192c7dc766106cd475f1b768c10caaf9727659726f7391/virtualenv-20.36.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/92/545eb2ca17fc0e05456728d7e4378bfee48d66433ae3b7e71948e46826fb/xarray-2026.2.0-py3-none-any.whl @@ -668,7 +668,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c7/d5/69900f7883235562f1f50d8184bb7dd84a2fb61e9ec63f3782546fdbd057/uvloop-0.22.1-cp311-cp311-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/42/4b/6cf85b485be7ec29db837ec2a1d8cd68bc1147b1abf23d8636c5bd65b3cc/virtualenv-20.37.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/2a/dc2228b2888f51192c7dc766106cd475f1b768c10caaf9727659726f7391/virtualenv-20.36.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/92/545eb2ca17fc0e05456728d7e4378bfee48d66433ae3b7e71948e46826fb/xarray-2026.2.0-py3-none-any.whl @@ -822,7 +822,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5f/6f/e62b4dfc7ad6518e7eff2516f680d02a0f6eb62c0c212e152ca708a0085e/uvloop-0.22.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/42/4b/6cf85b485be7ec29db837ec2a1d8cd68bc1147b1abf23d8636c5bd65b3cc/virtualenv-20.37.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/2a/dc2228b2888f51192c7dc766106cd475f1b768c10caaf9727659726f7391/virtualenv-20.36.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/92/545eb2ca17fc0e05456728d7e4378bfee48d66433ae3b7e71948e46826fb/xarray-2026.2.0-py3-none-any.whl @@ -960,7 +960,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3d/ff/7f72e8170be527b4977b033239a83a68d5c881cc4775fca255c677f7ac5d/uvloop-0.22.1-cp312-cp312-macosx_10_13_universal2.whl - - pypi: https://files.pythonhosted.org/packages/42/4b/6cf85b485be7ec29db837ec2a1d8cd68bc1147b1abf23d8636c5bd65b3cc/virtualenv-20.37.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/2a/dc2228b2888f51192c7dc766106cd475f1b768c10caaf9727659726f7391/virtualenv-20.36.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/92/545eb2ca17fc0e05456728d7e4378bfee48d66433ae3b7e71948e46826fb/xarray-2026.2.0-py3-none-any.whl @@ -1108,7 +1108,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/15/c0/0be24758891ef825f2065cd5db8741aaddabe3e248ee6acc5e8a80f04005/uvloop-0.22.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/42/4b/6cf85b485be7ec29db837ec2a1d8cd68bc1147b1abf23d8636c5bd65b3cc/virtualenv-20.37.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/2a/dc2228b2888f51192c7dc766106cd475f1b768c10caaf9727659726f7391/virtualenv-20.36.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/92/545eb2ca17fc0e05456728d7e4378bfee48d66433ae3b7e71948e46826fb/xarray-2026.2.0-py3-none-any.whl @@ -1241,7 +1241,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/89/8c/182a2a593195bfd39842ea68ebc084e20c850806117213f5a299dfc513d9/uvloop-0.22.1-cp313-cp313-macosx_10_13_universal2.whl - - pypi: https://files.pythonhosted.org/packages/42/4b/6cf85b485be7ec29db837ec2a1d8cd68bc1147b1abf23d8636c5bd65b3cc/virtualenv-20.37.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/2a/dc2228b2888f51192c7dc766106cd475f1b768c10caaf9727659726f7391/virtualenv-20.36.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/92/545eb2ca17fc0e05456728d7e4378bfee48d66433ae3b7e71948e46826fb/xarray-2026.2.0-py3-none-any.whl @@ -1506,8 +1506,8 @@ packages: requires_python: '>=3.7' - pypi: ./ name: circulax - version: 0.1.dev130+gc656a6b82 - sha256: b79a1c5240781a504bec75c856461ee5347a512d9b605852ec84068baca102f3 + version: 0.1.dev135+gff5656df9.d20260218 + sha256: f675d4ee27a0ab5d72aa57cb73d2d516613fb77c2ac50a577669f89273978a88 requires_dist: - diffrax>=0.7.0,<0.8 - jax>=0.7.1,<0.8 @@ -3118,6 +3118,7 @@ packages: - libgcc-ng ==15.2.0=*_18 - libgomp 15.2.0 he0feb66_18 license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL purls: [] size: 1041788 timestamp: 1771378212382 @@ -3127,6 +3128,7 @@ packages: depends: - libgcc 15.2.0 he0feb66_18 license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL purls: [] size: 27526 timestamp: 1771378224552 @@ -3136,6 +3138,7 @@ packages: depends: - __glibc >=2.17,<3.0.a0 license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL purls: [] size: 603262 timestamp: 1771378117851 @@ -3236,6 +3239,7 @@ packages: constrains: - libstdcxx-ng ==15.2.0=*_18 license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL purls: [] size: 5852330 timestamp: 1771378262446 @@ -6658,26 +6662,21 @@ packages: requires_dist: - eth-hash[pycryptodome]>=0.7.0 ; extra == 'crypto-eth-addresses' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/42/4b/6cf85b485be7ec29db837ec2a1d8cd68bc1147b1abf23d8636c5bd65b3cc/virtualenv-20.37.0-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/6a/2a/dc2228b2888f51192c7dc766106cd475f1b768c10caaf9727659726f7391/virtualenv-20.36.1-py3-none-any.whl name: virtualenv - version: 20.37.0 - sha256: 5d3951c32d57232ae3569d4de4cc256c439e045135ebf43518131175d9be435d + version: 20.36.1 + sha256: 575a8d6b124ef88f6f51d56d656132389f961062a9177016a50e4f507bbcc19f requires_dist: - distlib>=0.3.7,<1 - - filelock>=3.24.2,<4 ; python_full_version >= '3.10' - - filelock>=3.16.1,<=3.19.1 ; python_full_version < '3.10' + - filelock>=3.16.1,<4 ; python_full_version < '3.10' + - filelock>=3.20.1,<4 ; python_full_version >= '3.10' - importlib-metadata>=6.6 ; python_full_version < '3.8' - platformdirs>=3.9.1,<5 - typing-extensions>=4.13.2 ; python_full_version < '3.11' - furo>=2023.7.26 ; extra == 'docs' - - pre-commit-uv>=4.1.4 ; extra == 'docs' - proselint>=0.13 ; extra == 'docs' - sphinx>=7.1.2,!=7.3 ; extra == 'docs' - sphinx-argparse>=0.4 ; extra == 'docs' - - sphinx-autodoc-typehints>=3.6.2 ; extra == 'docs' - - sphinx-copybutton>=0.5.2 ; extra == 'docs' - - sphinx-inline-tabs>=2025.12.21.14 ; extra == 'docs' - - sphinxcontrib-mermaid>=2 ; extra == 'docs' - sphinxcontrib-towncrier>=0.2.1a0 ; extra == 'docs' - towncrier>=23.6 ; extra == 'docs' - covdefaults>=2.3 ; extra == 'test' @@ -6690,7 +6689,6 @@ packages: - pytest-mock>=3.11.1 ; extra == 'test' - pytest-randomly>=3.12 ; extra == 'test' - pytest-timeout>=2.1 ; extra == 'test' - - pytest-xdist>=3.5 ; extra == 'test' - pytest>=7.4 ; extra == 'test' - setuptools>=68 ; extra == 'test' - time-machine>=2.10 ; platform_python_implementation == 'CPython' and extra == 'test'