Skip to content

Releases: control-toolbox/OptimalControl.jl

v2.0.0

07 Apr 08:58
2ba73c6

Choose a tag to compare

Release Notes - OptimalControl.jl v2.0.0

Major version release with complete solve architecture redesign. This release introduces breaking changes from v1.1.6 (last stable release).

Breaking Changes

  • Removed functions: direct_transcriptiondiscretize, set_initial_guess@init macro, build_OCP_solutionocp_solution
  • New solve architecture: methods() now returns 4-tuples (discretizer, modeler, solver, parameter) with required GPU/CPU parameter
  • Changed exports: CTBase exceptions and CTFlows types reorganized (see BREAKING.md)

Major Features

Complete Solve Architecture Redesign

Two complementary solving modes:

  • Descriptive mode: solve(ocp, :collocation, :adnlp, :ipopt, :cpu) with symbolic strategy specification
  • Explicit mode: solve(ocp; discretizer=Collocation(), modeler=ADNLP(), solver=Ipopt()) with typed components
  • Partial specification: Auto-completion of missing strategies using first matching method
  • Method introspection: methods() lists all 12 available solving methods (10 CPU + 2 GPU)

GPU/CPU Parameter System

  • 4th parameter in method tuples for execution backend (:cpu or :gpu)
  • Explicit GPU support via :gpu parameter with ExaModels + MadNLP/MadNCL
  • 5 solvers available: Ipopt, MadNLP, Uno, MadNCL, Knitro

Advanced Option Routing System

  • describe(strategy): Display available options for any strategy
  • route_to(strategy=option=>value): Disambiguate shared options between strategies
  • bypass(strategy=option=>value): Pass undeclared options to strategies
  • Automatic option routing to appropriate components
  • Option introspection: options(), option_names(), option_type(), option_description(), option_default()

Initial Guess with @init Macro

  • New @init macro for constructing initial guesses
  • Alias init for initial_guess keyword argument in solve
  • Replaces functional initial guess construction from v1.1.6

Control-Free Problems Support

  • Optimal control problems without control variables
  • Optimization of constant parameters in dynamical systems
  • Augmented Hamiltonian approach: augment=true feature in CTFlows for automatic costate computation
  • Simplified flow creation: Flow(ocp) directly creates Hamiltonian flow from control-free problems
  • Complete transversality conditions for variable parameters

Additional Discretization Schemes

  • Basic schemes: :trapeze, :midpoint, :euler, :euler_implicit
  • ADNLP-specific schemes: :gauss_legendre_2, :gauss_legendre_3 (high-order collocation)

Documentation

  • Complete rewrite with new solve manual (descriptive/explicit modes)
  • Advanced options guide with routing and disambiguation
  • GPU solving guide
  • Initial guess guide with @init macro
  • Differential geometry tools manual
  • Control-free problems examples

Dependencies

  • CTBase: 0.18.x (was 0.16-0.17)
  • CTModels: 0.9.x (was 0.6.x)
  • CTDirect: 1.x (was 0.x)
  • CTSolvers: 0.4.x (new dependency)
  • CTParser: 0.8.x
  • CTFlows: 0.8.x

New dependency: CTSolvers.jl handles NLP modeling, solving, and strategy orchestration.

Migration Guide

For users migrating from v1.1.6, please consult BREAKING.md for detailed migration instructions and examples.

Notes

This release consolidates all beta versions (1.2.0-beta through 1.3.1-beta) into a stable 2.0.0 release. The comparison is made against v1.1.6, the last stable release before the architectural redesign.

PRs

  • [AUTO] JuliaFormatter.jl run by @github-actions[bot] in #674
  • Adapt to CTModels v0.7.x and integrate CTSolvers by @ocots in #693
  • Release/v1.1.9 beta by @ocots in #698
  • added reexport ExaLinAlg by @jbcaillau in #703
  • Release v1.2.2-beta by @jbcaillau in #708
  • Gpu cpu parameter by @ocots in #714
  • added explicit import of LinearAlgebra by @jbcaillau in #716
  • Documentation by @ocots in #719
  • Develop by @jbcaillau in #707
  • [AUTO] JuliaFormatter.jl run by @github-actions[bot] in #724
  • [AUTO] JuliaFormatter.jl run by @github-actions[bot] in #725
  • Documentation by @ocots in #726
  • feat: add Level 3 signature freezing tests for reexport API by @ocots in #728
  • Develop by @ocots in #727
  • Integrate Uno solver and add solver requirements documentation by @ocots in #730
  • [AUTO] JuliaFormatter.jl run by @github-actions[bot] in #731
  • Modify timing to use CUDA and track GPU memory by @ocots in #732
  • [AUTO] JuliaFormatter.jl run by @github-actions[bot] in #733
  • Add indirect method tests by @ocots in #736
  • Add comprehensive CTFlows signature freezing tests by @ocots in #735
  • Refactor canonical tests with separated modelers/solvers by @ocots in #737
  • [AUTO] JuliaFormatter.jl run by @github-actions[bot] in #738
  • Review of the documentation by @ocots in #739
  • Update documentation and test files for control-free example by @ocots in #740
  • ci: disable CT registry for release v2 by @ocots in #741
  • [AUTO] JuliaFormatter.jl run by @github-actions[bot] in #742
  • Update documentation for control-free problems by @ocots in #743
  • [AUTO] JuliaFormatter.jl run by @github-actions[bot] in #744

Full Changelog: v1.1.6...v2.0.0

v1.3.3-beta

24 Mar 12:45

Choose a tag to compare

What's Changed

  • Develop by @ocots in #727
  • Integrate Uno solver and add solver requirements documentation by @ocots in #730
  • [AUTO] JuliaFormatter.jl run by @github-actions[bot] in #731
  • Modify timing to use CUDA and track GPU memory by @ocots in #732
  • [AUTO] JuliaFormatter.jl run by @github-actions[bot] in #733

Full Changelog: v1.3.2-beta...v1.3.3-beta

v1.3.2-beta

17 Mar 12:57

Choose a tag to compare

v1.3.1-beta

17 Mar 12:55

Choose a tag to compare

v1.3.0-beta

16 Mar 14:46

Choose a tag to compare

What's Changed

  • added explicit import of LinearAlgebra by @jbcaillau in #716
  • Documentation by @ocots in #719
  • Develop by @jbcaillau in #707
  • [AUTO] JuliaFormatter.jl run by @github-actions[bot] in #724
  • [AUTO] JuliaFormatter.jl run by @github-actions[bot] in #725
  • Documentation by @ocots in #726
  • feat: add Level 3 signature freezing tests for reexport API by @ocots in #728

Full Changelog: v1.2.3-beta...v1.3.0-beta

v1.2.3-beta

07 Mar 21:36

Choose a tag to compare

What's Changed

Full Changelog: v1.2.2-beta...v1.2.3-beta

v1.2.2-beta

06 Mar 14:07

Choose a tag to compare

What's Changed

Full Changelog: v1.1.6...v1.2.2-beta

v1.1.6

31 Oct 09:40
587a06d

Choose a tag to compare

OptimalControl v1.1.6

Diff since v1.1.5

Merged pull requests:

  • CompatHelper: bump compat for NLPModelsIpopt to 0.11 for package docs, (drop existing compat) (#662) (@github-actions[bot])
  • [Bug] Max objective for exa (#665) (@ocots)
  • Update CI.yml (#668) (@ocots)
  • 670 doc rdnopa talk (#671) (@jbcaillau)
  • Minor doc updates (#673) (@jbcaillau)

Closed issues:

  • [Bug] Max objective for exa (#663)
  • [Doc] RDNOPA talk + minor fixes (#670)

v1.1.5

23 Oct 12:30
268b75c

Choose a tag to compare

OptimalControl v1.1.5

Diff since v1.1.4

Merged pull requests:

  • Update README (2025-10-06) with latest ABOUT.md, INSTALL.md, CONTRIBUTING.md and badges (#661) (@github-actions[bot])
  • add buttons to try AI (#667) (@ocots)

Closed issues:

  • [General] Add AI button in the documentation (#666)

v1.1.4

05 Oct 16:42
1ffcd35

Choose a tag to compare

OptimalControl v1.1.4

Diff since v1.1.3

Merged pull requests:

  • Update README (2025-09-28) with latest ABOUT.md, INSTALL.md, CONTRIBUTING.md and badges (#650) (@github-actions[bot])
  • doc-juliacon-paris-2025 (#652) (@jbcaillau)
  • Add columns math vs code (#657) (@ocots)
  • feat: improve error handling for Plots.jl integration (#659) (@ocots)

Closed issues:

  • Test BifurcationKit.jl for orbit transfer (#224)
  • JuMP.jl vs OptimalControl.jl (#306)
  • [Bug] Flow example (#384)
  • [General] Visite ANL (#513)
  • [Dev] Testing with examodels (#514)
  • [Doc] juliacon paris 2025 (#651)
  • [General] Extension error does not pop up (#653)