Archimedes is an open-source Python framework designed for deployment of control systems to hardware. To make this possible, it provides a comprehensive toolkit for modeling, simulation, optimization, and C code generation.
For more details, see the documentation site
By combining the powerful symbolic capabilities of CasADi with the intuitive interface designs of NumPy, PyTorch, and JAX, Archimedes provides a number of key features:
- NumPy-compatible array API with automatic dispatch
- Efficient execution of computational graphs in compiled C++
- Automatic differentiation with forward- and reverse-mode sparse autodiff
- Interface to "plugin" solvers for ODE/DAEs, root-finding, and nonlinear programming
- Automated C code generation for embedded applications
- JAX-style function transformations
- PyTorch-style hierarchical data structures for parameters and dynamics modeling
import numpy as np
import archimedes as arc
def f(x):
return np.sin(x**2)
df = arc.grad(f)
np.allclose(df(1.0), 2.0 * np.cos(1.0))import numpy as np
import archimedes as arc
# Lotka-Volterra model
def f(t, x):
a, b, c, d = 1.5, 1.0, 1.0, 3.0
return np.hstack([
a * x[0] - b * x[0] * x[1],
c * x[0] * x[1] - d * x[1],
])
x0 = np.array([1.0, 1.0])
t_span = (0.0, 10.0)
t_eval = np.linspace(*t_span, 100)
xs = arc.odeint(f, t_span=t_span, x0=x0, t_eval=t_eval)The constrained Rosenbrock problem has a local minimum at (0, 0) and a global minimum at (1, 1)
import numpy as np
import archimedes as arc
def f(x):
return 100 * (x[1] - x[0] ** 2) ** 2 + (1 - x[0]) ** 2
def g(x):
g1 = (x[0] - 1) ** 3 - x[1] + 1
g2 = x[0] + x[1] - 2
return np.hstack([g1, g2])
x_opt = arc.minimize(f, constr=g, x0=[2.0, 0.0], constr_bounds=(-np.inf, 0))
print(np.allclose(x_opt, [1.0, 1.0], atol=1e-3))Archimedes can convert plain NumPy functions to standalone C code for use in embedded applications:
import numpy as np
import archimedes as arc
def f(x, y):
return x + np.sin(y)
# Create templates with appropriate shapes and dtypes
x_type = np.zeros((), dtype=float)
y_type = np.zeros((2,), dtype=float)
arc.codegen(f, (x_type, y_type), return_names=("z", ))For more details, see the tutorial on C code generation
- Hierarchical systems modeling
- C code generation
- Nonlinear system identification
- Hardware development workflow
The examples folder includes some examples that are not as well-documented as those on the website, but showcase some additional functionality in different application domains. These include:
- Multirotor vehicle dynamics
- CartPole system ID + control
- Subsonic F-16 benchmark
- Trajectory optimization
The easiest way to install is from PyPI:
pip install archimedesTest with any of the examples shown above.
For development (or just a more robust environment configuration), we recommend using UV for faster dependency resolution and virtual environment management:
# Create and activate a virtual environment
uv venv
source .venv/bin/activate
# Install with minimal dependencies
uv pip install archimedes
# OR install with extras (control, jupyter, matplotlib, etc.)
uv pip install archimedes[all]To install a Jupyter notebook kernel, if you have installed the additional dependencies with [all] you can run:
uv run ipython kernel install --user --env VIRTUAL_ENV $(pwd)/.venv --name=archimedesThis will create a kernel named archimedes - you can change the name to whatever you'd like.
To install from source locally (e.g. for development or building the docs), the recommended procedure is to create a UV virtual environment as described above and then run:
git clone https://github.com/pinetreelabs/archimedes.git
cd archimedes
# Install the package with development dependencies
uv pip install -e ".[all]"
uv sync --all-extrasDevelopment standards outlined in the testing guide include:
- 100% code coverage
- Ruff formatting
- MyPy static type checking
- Vulnerability scanning with
pip-audit - Static analysis for security issues using Bandit
- Licensing compliance with REUSE
Archimedes is available under a dual-licensing model:
The open-source code is licensed under the GNU General Public License v3.0. For organizations that would like more flexible licensing contact [email protected] for details.
Archimedes incorporates code from several open source projects, including JAX (Apache 2.0), Flax (Apache 2.0), SciPy (BSD-3), and NumPy (NumPy license). See NOTICE.md for a complete list of attributions, including licenses for key dependencies (CasADi and NumPy).
At this time Archimedes does not have a DOI-linked publication, though a draft is in progress. Feel free to link to the repository in the meantime.
If you use Archimedes in published work, please also consider citing CasADi, the symbolic-numeric backend for Archimedes:
@Article{Andersson2018,
Author = {Joel A E Andersson and Joris Gillis and Greg Horn
and James B Rawlings and Moritz Diehl},
Title = {{CasADi} -- {A} software framework for nonlinear optimization
and optimal control},
Journal = {Mathematical Programming Computation},
Year = {2018},
}
We're excited to build a community around Archimedes - here's how you can get involved at this stage:
- ⭐ Star the Repository: The simplest way to show support and help others discover the project
- 🐛 Report Issues: Detailed bug reports, documentation gaps, and feature requests are invaluable
- 💬 Join Discussions: Share your use cases, ask questions, or provide feedback in our GitHub Discussions
- 🗞️ Stay In the Loop: Subscribe to the newsletter for updates and announcements
- 📢 Spread the Word: Tell colleagues, mention us in relevant forums, or share on social media
- 📝 Document Use Cases: Share how you're using (or planning to use) Archimedes
At this early stage of development:
- 👍 We welcome issue reports with specific bugs, documentation improvements, and feature requests
- ⏳ We are not currently accepting pull requests as we establish the project's foundation and architecture
- ❓ We encourage discussions about potential applications, implementation questions, and project direction
If you've built something with Archimedes or are planning to, we definitely want to hear about it! Your real-world use cases directly inform our development priorities.
We appreciate your interest and support!