diff --git a/.github/workflows/Breakage.yml b/.github/workflows/Breakage.yml index d3af6eff..d8066923 100644 --- a/.github/workflows/Breakage.yml +++ b/.github/workflows/Breakage.yml @@ -9,7 +9,7 @@ on: jobs: break-pkg: - if: ${{ ! contains(github.event.pull_request.labels.*.name, 'run breakage applications') }} + if: contains(github.event.pull_request.labels.*.name, 'run breakage') strategy: fail-fast: false matrix: diff --git a/.github/workflows/JOSS.yml b/.github/workflows/JOSS.yml new file mode 100644 index 00000000..23ca10d2 --- /dev/null +++ b/.github/workflows/JOSS.yml @@ -0,0 +1,35 @@ +name: Compile JOSS paper + +on: + push: + paths: + - 'joss/**' # Se déclenche uniquement pour les changements dans le dossier joss + +jobs: + paper: + runs-on: ubuntu-latest + name: Paper Draft + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Build draft PDF + uses: openjournals/openjournals-draft-action@master + with: + journal: joss + # This should be the path to the paper within your repo. + paper-path: joss/paper.md + - name: Upload PDF + uses: actions/upload-artifact@v4 + with: + name: paper + path: joss/paper.pdf + + - name: Commit PDF + uses: EndBug/add-and-commit@v9 + with: + add: 'joss/paper.pdf' + message: 'chore: update paper.pdf' + author_name: 'GitHub Actions' + author_email: 'actions@github.com' + committer_name: 'GitHub Actions' + committer_email: 'actions@github.com' \ No newline at end of file diff --git a/_typos.toml b/_typos.toml index 6263e4be..3db4841f 100644 --- a/_typos.toml +++ b/_typos.toml @@ -2,6 +2,7 @@ locale = "en" extend-ignore-re = [ "ded", + "ois", ] [files] diff --git a/joss/paper.bib b/joss/paper.bib new file mode 100644 index 00000000..9326c820 --- /dev/null +++ b/joss/paper.bib @@ -0,0 +1,592 @@ + +@software{joss_oc_example, + author = {Caillau, Jean-Baptiste and Cots, Olivier and Gergaud, Joseph and Martinon, Pierre and Sed, Sophia}, + title = {joss-oc-example: illustrative example companion to the {OptimalControl.jl} {JOSS} paper}, + version = {v1.0.0}, + year = {2026}, + publisher = {Zenodo}, + doi = {10.5281/zenodo.19663650}, + url = {https://doi.org/10.5281/zenodo.19663650} +} + +@article{rackauckas2017differentialequations, + 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}, + number={1}, + pages={15}, + year={2017}, + publisher={Ubiquity Press} +} + +@article{Lubin2023, + author = {Lubin, Miles and Dowson, Oscar and {Dias Garcia}, Joaquim and Huchette, Joey and Legat, Beno{\^i}t and Vielma, Juan Pablo}, + title = {{JuMP} 1.0: {R}ecent improvements to a modeling language for mathematical optimization}, + journal = {Mathematical Programming Computation}, + year = {2023}, + doi = {10.1007/s12532-023-00239-3} +} + +@software{ADNLPModels_jl, +author = {Migot, Tangi and Montoison, Alexis and Orban, Dominique and Soares Siqueira, Abel and contributors}, +license = {MPL-2.0}, +title = {{ADNLPModels.jl: Automatic Differentiation models implementing the NLPModels API}}, +url = {https://github.com/JuliaSmoothOptimizers/ADNLPModels.jl}, +year = {2023} +} + +@inproceedings{ferede2025icra, + title={One Net to Rule Them All: Domain Randomization in Quadcopter Racing Across Different Platforms}, + author={Ferede, Robin and Blaha, Till and Lucassen, Erin and De Wagter, Christophe and de Croon, Guido C. H. E.}, + booktitle={2025 IEEE International Conference on Robotics and Automation (ICRA)}, + pages={6357--6363}, + year={2025}, + doi={10.1109/ICRA55743.2025.11128790} +} + +@unpublished{bouali:hal-04928858, + TITLE = {{Regularization of optimal control problems on stratified domains using additional controls}}, + AUTHOR = {Bouali, Anas and Rapaport, Alain and Bayen, T{\'e}rence}, + URL = {https://hal.inrae.fr/hal-04928858}, + NOTE = {working paper or preprint}, + HAL_LOCAL_REFERENCE = {MISTEA - Axe syst{\`e}mes dynamiques}, + YEAR = {2025}, + MONTH = Feb, + KEYWORDS = {optimal control ; Filippov solutions ; discontinuous dynamics ; regularization ; penalty method ; direct method}, + PDF = {https://hal.inrae.fr/hal-04928858v2/file/BRB.pdf}, + HAL_ID = {hal-04928858}, + HAL_VERSION = {v2} +} + +@article{bliman:hal-05194927, + title = {{On the problem of minimizing the epidemic final size for SIR model by social distancing}}, + author = {Bliman, Pierre-Alexandre and Bouali, Anas and Loisel, Patrice and Rapaport, Alain and Virelizier, Arnaud}, + journal = {Mathematical Biosciences and Engineering}, + volume = {23}, + number = {3}, + pages = {567--593}, + year = {2026}, + doi = {10.3934/mbe.2026022}, +} + +@software{OptimalControl_jl, + author = {Caillau, Jean-Baptiste and Cots, Olivier and Gergaud, Joseph and Martinon, Pierre and Sed, Sophia}, + doi = {10.5281/zenodo.13336563}, + license = {MIT}, + title = {{OptimalControl.jl: a Julia package to model and solve optimal control problems with ODEs}}, + url = {https://control-toolbox.org/OptimalControl.jl}, + year = {2024} +} + +@software{OptimalControlProblems_jl, + author = {Caillau, Jean-Baptiste and Cots, Olivier and Gergaud, Joseph and Martinon, Pierre}, + doi = {10.5281/zenodo.17013180}, + license = {MIT}, + title = {{OptimalControlProblems.jl: a collection of optimal control problems with ODEs in Julia}}, + url = {https://control-toolbox.org/OptimalControlProblems.jl}, + year = {2024} +} + +@article{Bezanson2017, + title={Julia: A fresh approach to numerical computing}, + author={Bezanson, Jeff and Edelman, Alan and Karpinski, Stefan and Shah, Viral B}, + journal={SIAM Review}, + volume={59}, + number={1}, + pages={65--98}, + year={2017}, + publisher={SIAM}, + doi={10.1137/141000671} +} + +@article{SHIN2021693, +title = {Graph-Based Modeling and Decomposition of Energy Infrastructures}, +journal = {IFAC-PapersOnLine}, +volume = {54}, +number = {3}, +pages = {693-698}, +year = {2021}, +note = {16th IFAC Symposium on Advanced Control of Chemical Processes ADCHEM 2021}, +issn = {2405-8963}, +doi = {10.1016/j.ifacol.2021.08.322}, +url = {https://www.sciencedirect.com/science/article/pii/S240589632101096X}, +author = {Shin, Sungho and Coffrin, Carleton and Sundar, Kaarthik and Zavala, Victor M.}, +keywords = {Nonlinear Optimization, Decomposition, Graphs, Energy Systems}, +} + +@article{SHIN2024110651, +title = {Accelerating optimal power flow with GPUs: SIMD abstraction of nonlinear programs and condensed-space interior-point methods}, +journal = {Electric Power Systems Research}, +volume = {236}, +pages = {110651}, +year = {2024}, +issn = {0378-7796}, +doi = {10.1016/j.epsr.2024.110651}, +url = {https://www.sciencedirect.com/science/article/pii/S0378779624005376}, +author = {Shin, Sungho and Anitescu, Mihai and Pacaud, François}, +keywords = {Nonlinear programming, Automatic differentiation, GPU computing, Optimal power flow}, +} + +@article{Wachter2006, + title={On the implementation of an interior-point filter line-search algorithm for large-scale nonlinear programming}, + author={W{\"a}chter, Andreas and Biegler, Lorenz T}, + journal={Mathematical Programming}, + volume={106}, + number={1}, + pages={25--57}, + year={2006}, + publisher={Springer}, + doi={10.1007/s10107-004-0559-y} +} + +@article{Patterson2014, + title={GPOPS-II: A MATLAB software for solving multiple-phase optimal control problems using hp-adaptive Gaussian quadrature collocation methods and sparse nonlinear programming}, + author={Patterson, Michael A and Rao, Anil V}, + journal={ACM Transactions on Mathematical Software}, + volume={41}, + number={1}, + pages={1--37}, + year={2014}, + publisher={ACM}, + doi={10.1145/2558904} +} + +@article{Bonnans2017, + title={The Bocop and BocHop optimization toolboxes}, + author={Bonnans, J Fr{\'e}d{\'e}ric and Martinon, Pierre and Giorgi, Daphne and Gr{\'e}lard, Vincent and Maindrault, S{\'e}bastien and Tissot, Olivier}, + journal={IFAC-PapersOnLine}, + volume={50}, + number={1}, + pages={8849--8854}, + year={2017}, + publisher={Elsevier}, + doi={10.1016/j.ifacol.2017.08.1745} +} + +@article{Houska2011, + title={ACADO toolkit—An open-source framework for automatic control and dynamic optimization}, + author={Houska, Boris and Ferreau, Hans Joachim and Diehl, Moritz}, + journal={Optimal Control Applications and Methods}, + volume={32}, + number={3}, + pages={298--312}, + year={2011}, + publisher={Wiley Online Library}, + doi={10.1002/oca.939} +} + +@article{Andersson2019, + title={CasADi: a software framework for nonlinear optimization and optimal control}, + author={Andersson, Joel AE and Gillis, Joris and Horn, Greg and Rawlings, James B and Diehl, Moritz}, + journal={Mathematical Programming Computation}, + volume={11}, + number={1}, + pages={1--36}, + year={2019}, + publisher={Springer}, + doi={10.1007/s12532-018-0139-4} +} + +@article{bonnard2007second, + title={Second order optimality conditions in the smooth case and applications in optimal control}, + author={Bonnard, Bernard and Caillau, Jean-Baptiste and Tr{\'e}lat, Emmanuel}, + journal={ESAIM: Control, Optimisation and Calculus of Variations}, + volume={13}, + number={2}, + pages={207--236}, + year={2007}, + publisher={EDP Sciences}, + doi={10.1051/cocv:2007012} +} + +@article{pulsipher2022unifying, + title = {A unifying modeling abstraction for infinite-dimensional optimization}, + journal = {Computers & Chemical Engineering}, + volume = {156}, + year = {2022}, + issn = {0098-1354}, + doi = {10.1016/j.compchemeng.2021.107567}, + url = {https://www.sciencedirect.com/science/article/pii/S0098135421003458}, + author = {Pulsipher, Joshua L. and Zhang, Weiqi and Hongisto, Tyler J. and Zavala, Victor M.} +} + +@article{caillau2012differential, + title={Differential continuation for regular optimal control problems}, + author={Caillau, Jean-Baptiste and Cots, Olivier and Gergaud, Joseph}, + journal={Optimization Methods and Software}, + volume={27}, + number={2}, + pages={177--196}, + year={2012}, + publisher={Taylor \& Francis}, + doi={10.1080/10556788.2011.593625} +} + +@inproceedings{beschastnyi2025pulse, + title={Pulse control of affine systems with applications to quantum control}, + author={Beschastnyi, I. and Dell'Elce, L. and Pomet, J.-B. and Sacchelli, L. and Tinoco, D.}, + booktitle={2025 IEEE 64th Conference on Decision and Control (CDC)}, + pages={3769--3774}, + year={2025}, + doi={10.1109/CDC57313.2025.11312971} +} + +@unpublished{lutz:hal-05047678, + title={Minimal Time Control of Underdamped Parametric Oscillators}, + author={Lutz, Killian and Privat, Yannick}, + note={working paper or preprint}, + year={2025}, + month={Apr}, + url={https://hal.science/hal-05047678}, + hal_id={hal-05047678}, + hal_version={v3} +} + +@inproceedings{caio2025application, + title={Application of Indirect Methods to Optimal Control Problems in Epidemiology}, + author={Caio, Pedro and Silva, Cristiana J.}, + booktitle={CONTROLO 2024}, + pages={444--454}, + year={2025}, + publisher={Springer Nature Switzerland}, + address={Cham}, + doi={10.1007/978-3-031-81724-3_40} +} + +@article{opmeer2025optimal, + title={Optimal harvesting of a continuously age-structured population with density dependence}, + author={Opmeer, Mark}, + journal={PLOS ONE}, + volume={20}, + number={9}, + pages={1--12}, + year={2025}, + publisher={Public Library of Science}, + doi={10.1371/journal.pone.0333087} +} + +@inproceedings{herasimenka2026lowthrust, + title={Low-thrust trajectory optimization for the Moon-enabled Sun occultation mission concept}, + author={Herasimenka, Alesia and Baresi, Nicola and Green, Lucie and Morgan, Huw and Underwood, Craig Ian and Bridges, Chris and Jason, Susan and Lucca Fabris, Andrea and Ryden, Keith}, + booktitle={AIAA SCITECH 2026 Forum}, + year={2026}, + publisher={American Institute of Aeronautics and Astronautics (AIAA)} +} + +@article{bonnard2026zermelo, + title={The Zermelo navigation problem on the 2-sphere of revolution: an optimal control perspective with applications to micromagnetism}, + author={Bonnard, Bernard and Cots, Olivier and Privat, Yannick}, + journal={Nonlinearity}, + volume={39}, + number={1}, + pages={015006}, + year={2026}, + publisher={IOP Publishing}, + doi={10.1088/1361-6544/ae2cd9} +} + +@article{bayen2026minimum, + title={Minimum time problem for the double integrator with a loss-of-control region}, + author={Bayen, T{\'e}rence and Bouali, Anas and Bourdin, Lo{\"i}c}, + journal={Nonlinear Analysis: Hybrid Systems}, + volume={60}, + pages={101681}, + year={2026}, + doi={10.1016/j.nahs.2026.101681} +} + +@article{morsky2025vaccination, + title={Vaccination and Collective Action Under Social Norms}, + author={Morsky, Bryce}, + journal={Bulletin of Mathematical Biology}, + volume={87}, + number={5}, + pages={55}, + year={2025}, + doi={10.1007/s11538-025-01436-y} +} + +@article{evangelakos2025fast, + title={Fast protocols for charging a three-spin-chain quantum battery}, + author={Evangelakos, Vasileios and Paspalakis, Emmanuel and Stefanatos, Dionisis}, + journal={Scientific Reports}, + volume={15}, + number={1}, + pages={45626}, + year={2025}, + doi={10.1038/s41598-025-30354-1} +} + +@article{CAILLAU202213, + title = {ct: control toolbox -- Numerical tools and examples in optimal control}, + journal = {IFAC-PapersOnLine}, + volume = {55}, + number = {16}, + pages = {13--18}, + year = {2022}, + note = {18th IFAC Workshop on Control Applications of Optimization CAO 2022}, + issn = {2405-8963}, + doi = {10.1016/j.ifacol.2022.08.074}, + url = {https://www.sciencedirect.com/science/article/pii/S2405896322011648}, + author = {Caillau, Jean-Baptiste and Cots, Olivier and Martinon, Pierre}, +} + +@unpublished{innerarityimizcoz:hal-05369609, + title = {{Optimal allocation control in microbial growth under a heat-shock}}, + author = {Innerarity Imizcoz, Javier and Yabo, Agust{\'i}n G. and Djema, Walid and Francis, Francis and Gouz{\'e}, Jean-Luc}, + note = {submitted to ECC 2026}, + year = {2025}, + url = {https://inria.hal.science/hal-05369609}, + hal_id = {hal-05369609}, +} + +@article{Verschueren2021, + title = {acados -- a modular open-source framework for fast embedded optimal control}, + author = {Verschueren, Robin and Frison, Gianluca and Kouzoupis, Dimitris and Frey, Jonathan and van Duijkeren, Niels and Zanelli, Andrea and Novoselnik, Branimir and Albin, Thivaharan and Quirynen, Rien and Diehl, Moritz}, + journal = {Mathematical Programming Computation}, + year = {2021}, + doi = {10.1007/s12532-021-00208-8}, +} + +@article{arnstrom2022daqp, + author = {Arnstr{\"o}m, Daniel and Bemporad, Alberto and Axehill, Daniel}, + journal = {IEEE Transactions on Automatic Control}, + title = {A Dual Active-Set Solver for Embedded Quadratic Programming Using Recursive {LDL}$^{T}$ Updates}, + year = {2022}, + volume = {67}, + number = {8}, + pages = {4362--4369}, + doi = {10.1109/TAC.2022.3176430}, +} + +@misc{Gagnon_ModelPredictiveControl_jl_advanced_process_2024, + author = {Gagnon, Francis and Thivierge, Alex and Desbiens, Andr{\'e} and Bagge Carlson, Fredrik}, + title = {{ModelPredictiveControl.jl: advanced process control made easy in Julia}}, + year = {2024}, + doi = {10.48550/arXiv.2411.09764}, + url = {https://arxiv.org/abs/2411.09764}, +} + +@article{Falck2021, + author = {Falck, Robert D. and Gray, Justin S. and Ponnapalli, Kaushik and Wright, Ted}, + title = {dymos: A Python package for optimal control of multidisciplinary systems}, + journal = {Journal of Open Source Software}, + volume = {6}, + number = {59}, + pages = {2809}, + year = {2021}, + doi = {10.21105/joss.02809}, +} + +@article{Nicholson2018, + author = {Nicholson, Bethany and Siirola, John D. and Watson, Jean-Paul and Zavala, Victor M. and Biegler, Lorenz T.}, + title = {pyomo.dae: a modeling and automatic discretization framework for optimization with differential and algebraic equations}, + journal = {Mathematical Programming Computation}, + volume = {10}, + number = {2}, + pages = {187--223}, + year = {2018}, + doi = {10.1007/s12532-017-0127-0}, +} + +@article{Fiedler2023, + author = {Fiedler, Felix and Karg, Benjamin and L{\"u}ken, Lukas and Brandner, Dean and Heinlein, Moritz and Brabender, Felix and Lucia, Sergio}, + title = {do-mpc: Towards {FAIR} nonlinear and robust model predictive control}, + journal = {Control Engineering Practice}, + volume = {140}, + pages = {105676}, + year = {2023}, + doi = {10.1016/j.conengprac.2023.105676}, +} + +@article{Beal2018, + author = {Beal, Logan D. R. and Hill, Daniel C. and Martin, R. Abraham and Hedengren, John D.}, + title = {{GEKKO} Optimization Suite}, + journal = {Processes}, + volume = {6}, + number = {8}, + pages = {106}, + year = {2018}, + doi = {10.3390/pr6080106}, +} + +% Created references + +@software{MLStyle_jl, + author = {Thautwarm and contributors}, + title = {{MLStyle.jl: Functional programming and pattern matching for Julia}}, + url = {https://thautwarm.github.io/MLStyle.jl}, + year = {2023}, + note = {Julia package} +} + +@misc{RevelsLubinPapamarkou2016, + title = {Forward-Mode Automatic Differentiation in {J}ulia}, + author = {{Revels}, J. and {Lubin}, M. and {Papamarkou}, T.}, + year = {2016}, + eprint = {1607.07892}, + archivePrefix = {arXiv}, + primaryClass = {cs.MS}, + url = {https://arxiv.org/abs/1607.07892} +} + +@article{dalle2026commoninterfaceautomaticdifferentiation, + author = {Guillaume Dalle and Adrian Hill}, + title = {A Common Interface for Automatic Differentiation}, + journal = {Journal of Machine Learning Research}, + year = {2026}, + volume = {27}, + number = {25}, + pages = {1--13}, + url = {http://jmlr.org/papers/v27/25-1024.html} +} + +@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}, + 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}, + year = {2025}, + publisher = {Association for Computing Machinery}, + address = {New York, NY, USA}, + issn = {0098-3500}, + doi = {10.1145/3779117}, + abstract = {Efficiently solving nonlinear equations underpins numerous scientific and engineering disciplines, yet scaling these solutions for challenging system models remains a challenge. This paper presents NonlinearSolve.jl – a suite of high-performance open-source nonlinear equation solvers implemented natively in the Julia programming language. NonlinearSolve.jl distinguishes itself by offering a unified API that accommodates a diverse range of solver specifications alongside features such as automatic algorithm selection based on runtime analysis, support for static array kernels for improved GPU computation on smaller problems, and the utilization of sparse automatic differentiation and Jacobian-free Krylov methods for large-scale problem-solving. Through rigorous comparison with established tools such as PETSc SNES, Sundials KINSOL, and MINPACK, NonlinearSolve.jl demonstrates robustness and efficiency, achieving significant advancements in solving nonlinear equations while being implemented in a high-level programming language. The capabilities of NonlinearSolve.jl unlock new potentials in modeling and simulation across various domains, making it a valuable addition to the computational toolkit of researchers and practitioners alike.}, + note = {Just Accepted}, + journal = {ACM Trans. Math. Softw.}, + month = dec, + keywords = {Nonlinear Systems, Root Finding, Sparsity Detection, Automatic Differentiation, JuliaLang} +} + +@software{Orban_NLPModelsIpopt_jl, + author = {Orban, Dominique and Soares Siqueira, Abel and contributors}, + license = {MPL-2.0}, + month = mar, + title = {{NLPModelsIpopt.jl: A thin IPOPT wrapper for NLPModels}}, + url = {https://github.com/JuliaSmoothOptimizers/NLPModelsIpopt.jl}, + version = {0.10.1}, + year = {2023} +} + +@software{QuantumControl_jl, + author = {Machnes, Shai and Goerz, Michael H. and contributors}, + title = {{QuantumControl.jl: A framework for quantum optimal control}}, + url = {https://juliaquantumcontrol.github.io/QuantumControl.jl}, + year = {2025}, + note = {Julia package} +} + +@misc{lópezpedrares2026competitivetumorgrowthmodeling, + title={Competitive tumor growth modeling and optimal radiotherapy control via logistic equations}, + author={Javier López-Pedrares and Alba López-Rivas and Raquel Romero-Lorenzo and Jacobo Guiu-Souto and Alberto P. Muñuzuri}, + year={2026}, + eprint={2603.03901}, + archivePrefix={arXiv}, + primaryClass={math.DS}, + url={https://arxiv.org/abs/2603.03901}, + doi="10.2139/ssrn.6544705" +} + +@Inbook{Byrd2006, + author="Byrd, Richard H. and Nocedal, Jorge and Waltz, Richard A.", + editor="Di Pillo, G. and Roma, M.", + title="Knitro: An Integrated Package for Nonlinear Optimization", + bookTitle="Large-Scale Nonlinear Optimization", + year="2006", + publisher="Springer US", + address="Boston, MA", + pages="35--59", + isbn="978-0-387-30065-8", + doi="10.1007/0-387-30065-1_4" +} + +@misc{shin2023accelerating, + title={Accelerating Optimal Power Flow with {GPU}s: {SIMD} Abstraction of Nonlinear Programs and Condensed-Space Interior-Point Methods}, + author={Sungho Shin and Fran{\c{c}}ois Pacaud and Mihai Anitescu}, + year={2023}, + eprint={2307.16830}, + archivePrefix={arXiv}, + primaryClass={math.OC}, + doi="10.2139/ssrn.4601442" +} + +@software{Montoison_MUMPS_jl, + author = {Montoison, Alexis and Orban, Dominique and Sweeney, William R. and contributors}, + license = {MPL-2.0}, + month = feb, + title = {{MUMPS.jl: A Julia Interface to MUMPS}}, + url = {https://github.com/JuliaSmoothOptimizers/MUMPS.jl}, + version = {1.4.1}, + year = {2024} +} + +@article{MUMPS:1, + title = {A Fully Asynchronous Multifrontal Solver Using Distributed Dynamic Scheduling}, + author = {P.R. Amestoy and I. S. Duff and J. Koster and J.-Y. L'Excellent}, + journal = {SIAM Journal on Matrix Analysis and Applications}, + volume = {23}, + number = {1}, + year = {2001}, + pages = {15--41}, + doi = {10.1137/s0895479899358194} +} + +@article{MUMPS:2, + title = {{Performance and Scalability of the Block Low-Rank Multifrontal Factorization on Multicore Architectures}}, + author = {P.R. Amestoy and A. Buttari and J.-Y. L'Excellent and T. Mary}, + journal = {ACM Transactions on Mathematical Software}, + volume = {45}, + number = {1}, + pages = {2:1--2:26}, + year = {2019}, + doi = {10.1145/3242094} +} + +@misc{CUDSS_nvidia, + title = {{NVIDIA cuDSS (Preview): A high-performance CUDA Library for Direct Sparse Solvers}}, + author = {{NVIDIA Corporation}}, + howpublished = {\url{https://docs.nvidia.com/cuda/cudss/index.html}}, + note = {Documentation}, + year={2025} +} + +@misc{veltz:hal-02902346, + title = {{BifurcationKit.jl}}, + author = {Veltz, Romain}, + url = {https://hal.archives-ouvertes.fr/hal-02902346}, + institution = {{Inria Sophia-Antipolis}}, + year = {2020}, + month = Jul, + keywords = {pseudo-arclength-continuation ; periodic-orbits ; floquet ; gpu ; bifurcation-diagram ; deflation ; newton-krylov}, + pdf = {https://hal.archives-ouvertes.fr/hal-02902346/file/354c9fb0d148262405609eed2cb7927818706f1f.tar.gz}, + hal_id = {hal-02902346}, + hal_version = {v1}, + eprint = {hal-02902346}, + eprinttype = {hal}, +} + +@article{Nurkanovic2022, + title={nosnoc: A software package for numerical optimal control of nonsmooth systems}, + author={Nurkanovi{\'c}, Armin and Diehl, Moritz}, + journal={IEEE Control Systems Letters}, + volume={6}, + pages={3110--3115}, + year={2022}, + publisher={IEEE}, + doi={10.1109/lcsys.2022.3181800} +} + +@unpublished{VanaretLeyffer2026, + author = {Vanaret, Charlie and Leyffer, Sven}, + title = {Implementing a unified solver for nonlinearly constrained optimization}, + year = {2026}, + note = {Accepted to Mathematical Programming Computation on Feb 22, 2026} +} \ No newline at end of file diff --git a/joss/paper.md b/joss/paper.md new file mode 100644 index 00000000..60b719e3 --- /dev/null +++ b/joss/paper.md @@ -0,0 +1,117 @@ +--- +title: 'OptimalControl.jl: A Julia package for modeling and solving optimal control problems with ODEs' +tags: + - Julia + - optimal control + - ordinary differential equations + - direct methods + - indirect methods + - scientific computing + - mathematical optimization +authors: + - name: Jean-Baptiste Caillau + orcid: 0000-0002-1719-2016 + affiliation: "1" + - name: Olivier Cots + orcid: 0000-0002-4703-4369 + affiliation: "2" + corresponding: true + - name: Joseph Gergaud + orcid: 0009-0005-9825-8652 + affiliation: "2" + - name: Pierre Martinon + orcid: 0000-0003-0571-2376 + affiliation: "3" + - name: Sophia Sed + affiliation: "4" + +affiliations: + - name: "Université Côte d'Azur, CNRS, Inria, LJAD, France" + index: 1 + - name: "Université Toulouse, CNRS, ENSEEIHT-IRIT, France" + index: 2 + - name: "CAGE team, Inria Paris, France" + index: 3 + - name: "Inria Sophia Antipolis Méditerranée, France" + index: 4 + +date: 12 April 2026 +bibliography: paper.bib +archive_doi: 10.5281/zenodo.13336563 +--- + +# Summary + +[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. + +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 seamless execution on both CPU and GPU with minimal user intervention. + +The ecosystem includes extensive [tutorial resources](https://control-toolbox.org/Tutorials.jl), a benchmark problem collection ([OptimalControlProblems.jl](https://control-toolbox.org/OptimalControlProblems.jl) [@OptimalControlProblems_jl] with formulations in OptimalControl DSL and [JuMP](https://jump.dev/JuMP.jl) [@Lubin2023]), and performance comparison tools ([CTBenchmarks.jl](https://control-toolbox.org/CTBenchmarks.jl)). Integration with Julia's ecosystem enables access to state-of-the-art tools: NLP solvers [IPOPT](https://coin-or.github.io/Ipopt) [@Wachter2006] and [MadNLP.jl](https://github.com/MadNLP/MadNLP.jl) [@SHIN2024110651; @SHIN2021693], automatic differentiation and NLP modeling through JuliaSmoothOptimizers' [ADNLPModels](https://jso.dev/ADNLPModels.jl) [@ADNLPModels_jl], GPU acceleration via [ExaModels.jl](https://github.com/exanauts/ExaModels.jl) [@shin2023accelerating], numerical integration from SciML's [DifferentialEquations.jl](https://docs.sciml.ai/DiffEqDocs) [@rackauckas2017differentialequations], and visualization through [Plots.jl](https://docs.juliaplots.org) [@PlotsJL]. + +# Statement of Need + +OptimalControl.jl is, to our knowledge, the only Julia package that unifies both direct and indirect methods for optimal control within a single, coherent framework. + +This unified approach addresses a gap in the current optimal control software landscape. Existing tools are fragmented across programming languages and paradigms. Legacy packages such as [HamPath](https://gitlab.inria.fr/ct/hampath) [@caillau2012differential], [NutoPy](https://ct.gitlabpages.inria.fr/nutopy) [@CAILLAU202213], and [COTCOT](https://github.com/mctao-inria/cotcot) [@bonnard2007second] implement sophisticated indirect methods but rely on Fortran implementations with MATLAB or Python interfaces, leading to complex and less extensible workflows. Proprietary solvers like [GPOPS-II](https://gpops2.com) [@Patterson2014] limit transparency and reproducibility. Open-source tools such as [BOCOP](https://github.com/control-toolbox/bocop) [@Bonnans2017], [ACADO](https://acado.github.io) [@Houska2011], and [acados](https://docs.acados.org) [@Verschueren2021] provide valuable direct method implementations but are not natively integrated into a modern, high-level scientific computing ecosystem. Python-based tools such as [Dymos](https://openmdao.github.io/dymos) [@Falck2021], [Pyomo.DAE](https://pyomo.readthedocs.io/en/stable/modeling_extensions/dae.html) [@Nicholson2018], [do-mpc](https://www.do-mpc.com) [@Fiedler2023], and [GEKKO](https://gekko.readthedocs.io) [@Beal2018] offer complementary capabilities but are similarly limited to direct transcription approaches within the Python ecosystem. + +Within Julia, most existing packages target specific domains: [RobustAndOptimalControl.jl](https://juliacontrol.github.io/RobustAndOptimalControl.jl) for linear systems, [QuantumControl.jl](https://juliaquantumcontrol.github.io/QuantumControl.jl) and [Piccolo.jl](https://github.com/harmoniqs/Piccolo.jl) for quantum optimal control, [DirectTrajectoryOptimization.jl](https://github.com/thowell/DirectTrajectoryOptimization.jl) for trajectory problems, [LinearMPC.jl](https://darnstrom.github.io/LinearMPC.jl/stable/) [@arnstrom2022daqp] and [ModelPredictiveControl.jl](https://juliacontrol.github.io/ModelPredictiveControl.jl/stable/) [@Gagnon_ModelPredictiveControl_jl_advanced_process_2024] for model predictive control, and [InfiniteOpt.jl](https://infiniteopt.github.io/InfiniteOpt.jl) [@pulsipher2022unifying] for infinite-dimensional optimization. In contrast with InfiniteOpt.jl that is designed as an extension of [JuMP.jl](https://jump.dev/JuMP.jl), our plan is to provide a modeler agnostic approach, able to accept general Julia code and leverage various optimization solvers. Besides, contributing to general-purpose NLP modeling frameworks like JuMP or [CasADi](https://web.casadi.org) [@Andersson2019] would not address the specific needs of optimal control: these tools lack native support for shooting methods based on Pontryagin's Maximum Principle and that heavily rely on differential geometric primitives. + +OptimalControl.jl fills this gap by providing a DSL that matches mathematical notation, multiple discretization schemes and shooting methods, with planned support for homotopy continuation methods. The modeler-solver separation enables complementary use with InfiniteOpt.jl (JuMP-based) through alternative NLP modeling backends (currently ADNLPModels, ExaModels) and solvers. GPU acceleration and an ecosystem with domain-specific applications, tutorials, and benchmarking tools complete the offering. Target users include researchers and engineers working in optimal control, control theorists developing new algorithms, and students learning optimal control through interactive tutorials. + +# State of the Field + +OptimalControl.jl requires Julia version 1.10 or later and is registered in the Julia General registry, enabling straightforward installation via `Pkg.add("OptimalControl")`. We compare it below with existing software. + +- **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) [@Patterson2014] delivers mature methods with MATLAB and C++ implementations but is proprietary; [acados](https://docs.acados.org) [@Verschueren2021] targets real-time MPC on embedded systems; [nosnoc](https://github.com/nosnoc/nosnoc) [@Nurkanovic2022] specializes in nonsmooth optimal control; [CasADi](https://web.casadi.org) [@Andersson2019], 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 targets linear systems; QuantumControl.jl, Piccolo.jl and DirectTrajectoryOptimization.jl serve specific domains; [LinearMPC.jl](https://darnstrom.github.io/LinearMPC.jl/stable/) [@arnstrom2022daqp] and [ModelPredictiveControl.jl](https://juliacontrol.github.io/ModelPredictiveControl.jl/stable/) [@Gagnon_ModelPredictiveControl_jl_advanced_process_2024] focus on model predictive control. InfiniteOpt.jl addresses a very rich range of problems, including optimization on PDE's or with chance constraints, focusing on direct transcription methods. OptimalControl.jl works seamlessly on both CPU and GPU, and adds tools to do shooting in a unified framework plus systematic benchmarking through OptimalControlProblems.jl and 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–constrained–unconstrained) and initializes a shooting method based on Pontryagin's Maximum Principle, which then converges to arbitrary precision. + +# Software Design + +The package architecture balances expressiveness, performance, and extensibility through modular design. The core is organized across internal packages within the [control-toolbox organization](https://github.com/control-toolbox), each hosted as an independent Julia package and registered in the General registry: [CTBase.jl](https://github.com/control-toolbox/CTBase.jl) defines the core types (optimal control models, solutions, initial guesses) and their accessors; [CTParser.jl](https://github.com/control-toolbox/CTParser.jl) implements the `@def` DSL macro; [CTDirect.jl](https://github.com/control-toolbox/CTDirect.jl) handles direct transcription and NLP interfacing; and [CTFlows.jl](https://github.com/control-toolbox/CTFlows.jl) provides Hamiltonian flows and shooting for indirect methods. OptimalControl.jl re-exports these packages as a unified entry point. Contributors interested in a specific functionality can work directly on the relevant sub-package, each of which has its own documentation, tests, and continuous integration. The delegation of specific responsibilities is as follows: + +- **DSL parsing**: [MLStyle.jl](https://thautwarm.github.io/MLStyle.jl) [@MLStyle_jl] enables pattern matching on abstract syntax trees generated from `@def` macro invocations. This design choice separates problem specification from solution methods, and allows a syntax as close as possible to the mathematical description of the problem. + +- **Problem models and solutions**: Structured types represent optimal control models, solutions, and initial guesses. Each type provides textual visualization, accessor methods for introspection, and visual plotting capabilities for solutions. Extensible abstractions enable addition of new problem classes without modifying core code. + +- **Discretization**: Direct transcription converts continuous problems into NLPs. Supporting multiple discretization schemes (Euler, midpoint, trapezoidal, Gauss-Legendre) required careful abstraction to share transcription logic while allowing scheme-specific implementations. + +- **Modelers and solvers**: We chose a clear modeler-solver separation: discretization produces ADNLPModels (able to deal with arbitrary user defined functions) or ExaModels [@shin2023accelerating] instances compatible with multiple NLP solvers (IPOPT via NLPModelsIpopt.jl [@Orban_NLPModelsIpopt_jl], Knitro [@Byrd2006], MadNLP, and [Uno](https://github.com/cvanaret/Uno) [@VanaretLeyffer2026]). These NLP solvers rely on linear solvers such as [MUMPS.jl](https://github.com/JuliaSmoothOptimizers/MUMPS.jl) [@Montoison_MUMPS_jl; @MUMPS:1; @MUMPS:2] for CPU computations or [CUDSS.jl](https://github.com/exanauts/CUDSS.jl) [@CUDSS_nvidia] for GPU acceleration with MadNLP. Automatic differentiation via ForwardDiff.jl [@RevelsLubinPapamarkou2016] and DifferentiationInterface.jl [@dalle2026commoninterfaceautomaticdifferentiation] avoids manual derivative coding. + +- **Indirect methods**: Hamiltonian flows integrate with DifferentialEquations.jl to access adaptive stepping, event handling, and multiple ODE solvers without reimplementation. Shooting methods rely on NonlinearSolve.jl [@pal2024nonlinearsolve] or [MINPACK.jl](https://github.com/sglyon/MINPACK.jl) for root-finding. Future extensions will incorporate homotopy continuation methods leveraging bifurcation analysis tools like [BifurcationKit.jl](https://github.com/bifurcationkit/BifurcationKit.jl) [@veltz:hal-02902346]. + +**Key design trade-offs:** + +1. **DSL vs. programmatic API**: We prioritized a mathematical DSL to reduce cognitive load for domain experts, accepting increased parsing complexity handled internally. Currently we do not address optimization of PDE or stochastic systems. + +2. **GPU acceleration strategy**: The modeler-solver separation enables seamless CPU-to-GPU transition. Users simply select the appropriate modeler-solver pair: ExaModels with MadNLP and the CUDSS linear solver for GPU execution. This modular approach minimizes maintenance burden while enabling GPU performance without reimplementing transcription logic. As for now, GPU support is limited to the ExaModels + MadNLP 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 resort to iterative solvers and may converge or not, *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 + +OptimalControl.jl has been applied in published research across multiple domains. Independent external adoption demonstrates the package's broader impact: @ferede2025icra used it for drone racing trajectory optimization, @caio2025application for epidemiological models using indirect methods, @morsky2025vaccination for vaccination strategies under social norms, @opmeer2025optimal for optimal harvesting of age-structured populations, and @evangelakos2025fast for fast charging protocols for quantum batteries. + +Research by close collaborators further demonstrates the package's versatility across aerospace (@herasimenka2026lowthrust), epidemiology (@bliman:hal-05194927), quantum control (@beschastnyi2025pulse), microbial growth control (@innerarityimizcoz:hal-05369609), and theoretical optimal control (@bouali:hal-04928858; @lutz:hal-05047678; @bayen2026minimum; @bonnard2026zermelo). + +The [control-toolbox organization](https://control-toolbox.org) hosts domain-specific application packages built on OptimalControl.jl: medical imaging optimization ([MagneticResonanceImaging.jl](https://control-toolbox.org/MagneticResonanceImaging.jl)), gene regulatory networks ([PWLdynamics.jl](https://agustinyabo.github.io/PWLdynamics.jl)), spacecraft orbital transfers ([Kepler.jl](https://control-toolbox.org/Kepler.jl)), epidemiological modeling ([SIRcontrol.jl](https://anasxbouali.github.io/SIRcontrol.jl)), and variational calculus ([CalculusOfVariations.jl](https://control-toolbox.org/CalculusOfVariations.jl)). + +The package serves educational purposes through [Tutorials.jl](https://control-toolbox.org/Tutorials.jl) covering topics from linear-quadratic regulators to Model Predictive Control. These resources are used in academic courses and workshops. [OptimalControlProblems.jl](https://control-toolbox.org/OptimalControlProblems.jl) provides standardized test problems formulated in both OptimalControl DSL and JuMP, enabling systematic performance comparisons through [CTBenchmarks.jl](https://control-toolbox.org/CTBenchmarks.jl). + +Development involves international collaborations with CNES (French space agency), Thales Alenia Space, Inria, and CNRS. The package development began in September 2022, with the first public release in February 2023. As of March 2026, OptimalControl.jl has published more than 40 releases with contributions from multiple developers across the control-toolbox ecosystem packages, demonstrating sustained community engagement. + +# AI Usage Disclosure + +The core software implementation, algorithms, and architectural design of OptimalControl.jl were developed by the authors. Generative AI has been used to assist with code refactoring and generation of unit and integration tests. This paper was drafted by the authors and subsequently revised with AI assistance for restructuring according to JOSS format requirements and language editing. All technical content, examples, and claims reflect the authors' work and judgment. + +# Acknowledgements + +We thank the [control-toolbox community](https://control-toolbox.org/contributors) and the broader Julia ecosystem for contributions that shaped the package design and educational resources. Development has been supported by partnerships with CNES, Thales Alenia Space, Inria, and CNRS. The software is distributed under the MIT license (see [LICENSE](https://github.com/control-toolbox/OptimalControl.jl/blob/main/LICENSE)) and uses centralized GitHub Actions workflows for continuous integration, documentation, and testing across the ecosystem. We welcome community contributions following the guidelines in [CONTRIBUTING.md](https://github.com/control-toolbox/OptimalControl.jl/blob/main/CONTRIBUTING.md). + +# References \ No newline at end of file diff --git a/joss/paper.pdf b/joss/paper.pdf new file mode 100644 index 00000000..8fec5b13 Binary files /dev/null and b/joss/paper.pdf differ