mini-ode
A minimalistic, multi-language library for solving Ordinary Differential Equations (ODEs). mini-ode is designed with a shared Rust core and a consistent interface for both Rust and Python users. It supports explicit, implicit, fixed step and adaptive step algorithms.
✨ Features
- Dual interface: call the same solvers from Rust or Python
- PyTorch-compatible: define the derivative function using PyTorch
- Multiple solver methods: includes explicit, implicit, and adaptive-step solvers
- Modular optimizers: implicit solvers allow flexible optimizer configuration
🧠 Supported Solvers
| Solver Class | Method | Suitable For | Implicit | Adaptive Step |
|---|---|---|---|---|
EulerMethodSolver |
Euler | Simple, fast, and educational use. | ❌ | ❌ |
RK4MethodSolver |
Runge-Kutta 4th Order (RK4) | General-purpose with fixed step size. | ❌ | ❌ |
ImplicitEulerMethodSolver |
Implicit Euler | Stiff or ill-conditioned problems. | ✅ | ❌ |
GLRK4MethodSolver |
Gauss-Legendre RK (Order 4) | High-accuracy, stiff problems. | ✅ | ❌ |
RKF45MethodSolver |
Runge-Kutta-Fehlberg 4(5) | Adaptive step size control. | ❌ | ✅ |
ROW1MethodSolver |
Rosenbrock-Wanner (Order 1) | Fast semi-implicit method for stiff systems. | semi | ❌ |
📦 Building the Library
Rust
To build the core Rust library:
Python
To build and install the Python package (in a virtual environment or Conda environment):
LIBTORCH_USE_PYTORCH=1
This builds the Python bindings using
maturinand installs the package locally.
🐍 Python Usage Overview
To use mini-ode from Python:
- Define the derivative function using
torch.Tensorinputs. - Trace the function using
torch.jit.trace. - Pass the traced function and initial conditions to a solver instance.
- For implicit solvers, pass an optimizer at construction.
Example usage flow (not full code):
# 1. Define derivative function using PyTorch
return - *
# 2. Trace the function to TorchScript
=
# 3. Create a solver instance
=
# 4. Solve the ODE
, =
🔧 Using Optimizers (Implicit Solvers Only)
Some solvers like GLRK4MethodSolver or ImplicitEulerMethodSolver require an optimizer for nonlinear system solving:
=
=
🦀 Rust Usage Overview
In Rust, solvers use the same logic as in Python - but you pass in a tch::CModule representing the TorchScripted derivative function.
Example 1: Load a TorchScript model from file
This approach uses a model traced in Python (e.g., with torch.jit.trace) and saved to disk.
use Solver;
use ;
Example 2: Trace the derivative function directly in Rust
You can also define and trace the derivative function in Rust using CModule::create_by_tracing.
use Solver;
use ;
📁 Project Structure
mini-ode/ # Core Rust implementation of solvers
mini-ode-python/ # Python bindings using PyO3 + maturin
example.ipynb # Jupyter notebook demonstrating usage
📄 License
This project is licensed under the GPL-2.0 License.
👤 Author
Antoni Przybylik
📧 antoni.przybylik@wp.pl
🔗 https://github.com/antoniprzybylik