JuDO

JuDO Packages

The JuDO ecosystem consists of two main packages arranged in a layered architecture.


Design philosophy

JuDO has a layered architecture:

User Code @phase @variable @constraint @objective JuDO.jl Modelling layer DynOptInterface.jl (DOI) Abstraction layer Interesso.jl Integrated Residuals solver CTDirect.jl Direct collocation solver Other DOI-compatible solvers... NLP Solver via Ipopt

JuDO.jl

The user-facing modelling layer.

JuDO.jl extends JuMP with features for dynamic optimization. Problems are formulated in a solver-agnostic syntax and translated automatically into the DynOptInterface (DOI) standard representation.

Key modelling features:

Macro / FunctionPurpose
DynModel(optimizer)Create a dynamic optimization model
@phase(model, t)Declare the independent variable (time)
@variable(model, bounds, DefinedOn(t))Declare a trajectory variable
initial(x), final(x)Access trajectory endpoints in constraints
derivative(x)Declare the time derivative x˙(t)\dot{x}(t)
@objective(model, sense, integral(expr))Lagrange (running) objective
@objective(model, sense, final(expr))Mayer (terminal) objective
JuDO.warmstart!(model, interpolant, x)Provide an initial guess trajectory
JuDO.optimize!(model)Solve the problem
dyn_value(model, x)Extract solution as a callable t -> value

Source Code Documentation


DynOptInterface.jl

The mathematical abstraction layer (DOI).

DynOptInterface.jl (DOI) is to dynamic optimization what MathOptInterface (MOI) is to static mathematical programming. It defines a standard intermediate representation for Dynamic optimization Problems (DOPs) that solvers can attach to.

The general problem form DOI represents:

minx, y()fo(x)+bo ⁣(y(t0),y(tf),t0,tf,x)+it0(i)tf(i)do ⁣(y˙(t),y(t),t,x)dt \min_{x,\,y(\cdot)} \quad f_o(x) + b_o\!\left(y(t_0), y(t_f), t_0, t_f, x\right) + \sum_i \int_{t_0^{(i)}}^{t_f^{(i)}} d_o\!\left(\dot y(t), y(t), t, x\right) \mathrm{d}t

subject to finite-dimensional constraints fc(x)Sf_c(x) \in S, boundary constraints bc()Bb_c(\cdot) \in B, and dynamic/path constraints dc(y˙,y,t,x)Dd_c(\dot y, y, t, x) \in D on each phase [t0(i),tf(i)][t_0^{(i)}, t_f^{(i)}].

Key abstractions:

TypePurpose
PhaseA time interval [t0,tf][t_0, t_f] with variable boundaries
DynamicVariableAn optimizable trajectory y(t)y(t)
DerivativeTime derivative y˙(t)\dot y(t)
Initial, FinalBoundary-value operators
Integral, MultiPhaseIntegralLagrange cost terms
BolzaCombined Mayer + Lagrange objective

Source Code Documentation

Current version: v0.3.0


Interesso.jl

The dynamic optimization solver.

Interesso.jl is a solver we develop that could attach to the DynOptInterface. It transcribes continuous-time DOPs into large-scale Nonlinear Programs (NLPs) using an Integrated Residuals Method (IRM) and dispatches them to Ipopt.

Apart from Interesso, we have also interfaced CTDirect.jl in OptimalControl toolbox under DOI, which demonstrates the capability of attaching existing solvers under DOI.

Features:

Example problems included:

ExampleDescription
Cart-pole swing-upClassic pendulum-on-cart control
Space shuttle reentry6-state aerospace trajectory (benchmark: 34.14° crossrange)
Van der Pol oscillatorNonlinear oscillator
Double integratorLQR-type minimum-effort control
Bang-bang controlSwitching control
Orbit raisingOrbital mechanics
Fuller's problemSingular arc
Hyper-sensitiveStiff boundary layer
Two-link robot armRobotics trajectory
Linear bicycle modelVehicle dynamics

Source Code

Julia 1.12 or later is required.

CC BY-SA 4.0 Septimia Zenobia. Last modified: May 21, 2026. Website built with Franklin.jl and the Julia programming language.