Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions joss/paper.bib
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

@misc{caillau2023juliacon,
author = {Caillau, Jean-Baptiste and Cots, Olivier and Gergaud, Joseph and Martinon, Pierre and Sed, Sophia},
title = {On solving optimal control problems with Julia},
title = {On solving optimal control problems with {Julia}},
year = {2023},
howpublished = {JuliaCon 2023, Cambridge, MA. Talk and abstract: \url{https://pretalx.com/juliacon2023/talk/HDC8F7/}. Video recording: \url{https://www.youtube.com/watch?v=RYUtVnzLj5k}}
}
Expand All @@ -17,7 +17,7 @@ @software{joss_oc_example
}

@article{rackauckas2017differentialequations,
title={Differentialequations.jl--a performant and feature-rich ecosystem for solving differential equations in julia},
title={Differentialequations.jl--a performant and feature-rich ecosystem for solving differential equations in {Julia}},
author={Rackauckas, Christopher and Nie, Qing},
journal={Journal of Open Research Software},
volume={5},
Expand Down Expand Up @@ -454,14 +454,14 @@ @article{PlotsJL
doi = {10.5334/jors.431},
url = {https://openresearchsoftware.metajnl.com/articles/10.5334/jors.431/},
author = {Christ, Simon and Schwabeneder, Daniel and Rackauckas, Christopher and Borregaard, Michael Krabbe and Breloff, Thomas},
title = {Plots.jl -- a user extendable plotting API for the julia programming language},
title = {Plots.jl -- a user extendable plotting API for the {Julia} programming language},
publisher = {Journal of Open Research Software},
year = {2023}
}

@article{pal2024nonlinearsolve,
author = {Pal, Avik and Holtorf, Flemming and Larsson, Axel and Loman, Torkel and Utkarsh and Sch\"{a}fer, Frank and Qu, Qingyu and Edelman, Alan and Rackauckas, Chris},
title = {NonlinearSolve.jl: High-Performance and Robust Solvers for Systems of Nonlinear Equations in Julia},
title = {NonlinearSolve.jl: High-Performance and Robust Solvers for Systems of Nonlinear Equations in {Julia}},
year = {2025},
publisher = {Association for Computing Machinery},
address = {New York, NY, USA},
Expand Down
10 changes: 5 additions & 5 deletions joss/paper.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
title: "OptimalControl.jl: a Julia package to model and solve optimal control problems with ODE's"
title: "OptimalControl.jl: a Julia package to model and solve optimal control problems with ODEs"
tags:
- Julia
- optimal control
Expand Down Expand Up @@ -44,7 +44,7 @@ archive_doi: 10.5281/zenodo.13336563

[OptimalControl.jl](https://control-toolbox.org/OptimalControl.jl) [@OptimalControl_jl] is a Julia [@Bezanson2017] package for modeling and solving optimal control problems governed by ordinary differential equations (ODEs). As the core of the [control-toolbox ecosystem](https://control-toolbox.org), it provides a unified framework that supports both direct and indirect solution methods with applications spanning aerospace, medical imaging, epidemiology, and quantum control.

![Logo of OptimalControl.jl.](figures/logo-oc.svg){#fig:logo width=25%}
![OptimalControl.jl logo.](figures/logo-oc.svg){#fig:logo width=25%}

The package features an expressive domain-specific language (DSL) built around the `@def` macro, enabling users to define control problems using notation that closely resembles standard mathematical formulations. Problems are solved through direct transcription, converting the continuous problem into a nonlinear program (NLP) using discretization schemes including Euler, trapezoidal, midpoint, and high-order Gauss-Legendre collocation. Alternatively, indirect shooting methods based on Pontryagin's Maximum Principle can be employed. The architecture relies on a modeler-solver separation that provides a modular and extensible foundation, enabling GPU execution (currently limited to NVIDIA hardware) with minimal user intervention alongside standard CPU solvers.

Expand Down Expand Up @@ -74,13 +74,13 @@ OptimalControl.jl requires Julia version 1.10 or later and is registered in the

- **Legacy tools (COTCOT, HamPath, NutoPy)**: These Fortran packages excel at indirect methods and homotopy continuation but require multi-language setup (Fortran plus MATLAB / Python). OptimalControl.jl provides both direct and indirect methods in pure Julia with straightforward installation via package manager.

- **Direct-method tools (BOCOP, ACADO, GPOPS-II, acados, nosnoc)**: Strong direct-method implementations: [GPOPS-II](https://gpops2.com) delivers mature methods with MATLAB and C++ implementations but is proprietary; [acados](https://docs.acados.org) targets real-time MPC on embedded systems; [nosnoc](https://github.com/nosnoc/nosnoc) [@Nurkanovic2022] specializes in nonsmooth optimal control; [CasADi](https://web.casadi.org), used as symbolic backend by several of these tools, is a general NLP modeler rather than an optimal control solver. OptimalControl.jl offers an open-source alternative with expressive DSL, native Julia ecosystem integration, GPU support, and unified direct and indirect approaches.
- **Direct-method tools (BOCOP, ACADO, GPOPS-II, acados, nosnoc)**: Strong direct-method implementations: [GPOPS-II](https://gpops2.com) delivers mature methods with a MATLAB implementation but is proprietary (see also [CGPOPS](https://gpops2.com) for a C++ implementation); [acados](https://docs.acados.org) targets real-time MPC on embedded systems; [nosnoc](https://github.com/nosnoc/nosnoc) [@Nurkanovic2022] specializes in nonsmooth optimal control; [CasADi](https://web.casadi.org), used as symbolic backend by several of these tools, is a general NLP modeler rather than an optimal control solver. OptimalControl.jl offers an open-source alternative with expressive DSL, native Julia ecosystem integration, GPU support, and unified direct and indirect approaches.

- **Julia packages**: [RobustAndOptimalControl.jl](https://juliacontrol.github.io/RobustAndOptimalControl.jl) targets linear systems; [QuantumControl.jl](https://juliaquantumcontrol.github.io/QuantumControl.jl), [Piccolo.jl](https://github.com/harmoniqs/Piccolo.jl) and [DirectTrajectoryOptimization.jl](https://github.com/thowell/DirectTrajectoryOptimization.jl) serve specific domains; [LinearMPC.jl](https://darnstrom.github.io/LinearMPC.jl/stable/) and [ModelPredictiveControl.jl](https://juliacontrol.github.io/ModelPredictiveControl.jl/stable/) focus on model predictive control. [InfiniteOpt.jl](https://infiniteopt.github.io/InfiniteOpt.jl) addresses a very rich range of problems, including optimization on PDEs or with chance constraints, focusing on direct transcription methods. OptimalControl.jl supports both CPU and GPU execution (currently NVIDIA-only, via [ExaModels.jl](https://github.com/exanauts/ExaModels.jl) + [MadNLP.jl](https://github.com/MadNLP/MadNLP.jl)), and adds tools to do shooting in a unified framework plus systematic benchmarking through [OptimalControlProblems.jl](https://control-toolbox.org/OptimalControlProblems.jl) and [CTBenchmarks.jl](https://control-toolbox.org/CTBenchmarks.jl).

# Illustrative Example

A self-contained illustrative example is provided as a companion repository [@joss_oc_example], archived on Zenodo. It combines direct and indirect solution approaches for a constrained energy minimization problem: a direct method on a coarse grid identifies the three-arc structure (unconstrained鈥揷onstrained鈥搖nconstrained) and initializes a shooting method based on Pontryagin's Maximum Principle, which then converges to arbitrary precision.
A self-contained illustrative example is provided as a companion repository [@joss_oc_example], archived on Zenodo. It combines direct and indirect solution approaches for a constrained energy minimization problem: a direct method on a coarse grid identifies the three-arc structure (unconstrained鈥揷onstrained鈥搖nconstrained) and initializes a shooting method based on Pontryagin's Maximum Principle, which then converges to a prescribed numerical tolerance.

# Software Design

Expand All @@ -104,7 +104,7 @@ The package architecture balances expressiveness, performance, and extensibility

2. **GPU acceleration strategy**: The modeler-solver separation enables a straightforward CPU-to-GPU transition. Users select the [ExaModels](https://github.com/exanauts/ExaModels.jl) modeler with [MadNLP](https://github.com/MadNLP/MadNLP.jl) and the [CUDSS](https://github.com/exanauts/CUDSS.jl) linear solver for GPU execution, or simply append the `:gpu` token to the `solve` call. This modular approach minimizes maintenance burden while enabling GPU performance without reimplementing transcription logic. GPU support is currently limited to NVIDIA hardware and to the [ExaModels](https://github.com/exanauts/ExaModels.jl) + [MadNLP](https://github.com/MadNLP/MadNLP.jl) modeler-solver combination.

3. **Method coverage**: Supporting both direct and indirect approaches increases code complexity but serves distinct user needs: direct methods for constrained problems with many variables, indirect methods for theoretical analysis and smaller problems requiring high accuracy. Both approaches rely on iterative solvers and may or may not converge, *e.g.*, depending on the initial guess. In the case of optimization solvers, the full output status of the solver is returned allowing *a posteriori* analysis.
3. **Method coverage**: Supporting both direct and indirect approaches increases code complexity but serves distinct user needs: direct methods are typically preferred for constrained problems with many variables, while indirect methods are typically favored for theoretical analysis and smaller problems requiring high accuracy. Both approaches rely on iterative solvers and may or may not converge, *e.g.*, depending on the initial guess. In the case of optimization solvers, the full output status of the solver is returned allowing *a posteriori* analysis.

# Research Impact Statement

Expand Down