Example
To demonstrate how to define and solve optimal control problems with PyTrajOpt, consider the classical Low-Thrust Orbital Transfer problem.
The problem formulation is adapted from Ross et al. ("Low-thrust, high-accuracy trajectory optimization," Journal of Guidance, Control, and Dynamics, 2007). The minimum time reported when solved using the Legendre-Gauss-Lobatto (LGL) pseudospectral method is 47.706 for 300 nodes.
Problem Definition¶
The state and control vectors for the problem are defined as
System Dynamics:¶
Boundary Conditions & Constraints:¶
(Primal and dual solutions for this problem can be found in the accompanying low_thrust_sol.pdf and results of feasibility checks are provided in low_thrust_feas.pdf
Usage Example (examples/low_thrust.py)¶
Here is how you can set up, solve, and visualize this problem using PyTrajOpt's Pydantic-backed configuration and CasADi transcription engine:
import casadi as cs
from pytrajopt import casadi_integrator, plot_solution, Ocp, check_feasibility, generate_NLP
def low_thrust():
ocp_data = {}
ocp_data["nx"] = 4
ocp_data["nu"] = 2
# event and Mayer
t0s = cs.SX.sym("t0s")
tfs = cs.SX.sym("tfs")
x0s = cs.SX.sym("x0s", ocp_data["nx"], 1)
xfs = cs.SX.sym("xfs", ocp_data["nx"], 1)
# Lagrange dynamics and path
ts = cs.SX.sym("ts")
xs = cs.SX.sym("xs", ocp_data["nx"], 1)
us = cs.SX.sym("us", ocp_data["nu"], 1)
# initial and final time
ocp_data["t0"] = cs.DM(0)
ocp_data["tf"] = None
# lagrange and mayer objective
ocp_data["L"] = None
ocp_data["E"] = cs.Function("E", [t0s, tfs, x0s, xfs], [tfs])
# event constraints
e = cs.vertcat(
x0s - cs.DM([1, 0, 0, 1]), xfs[0] - 4, xfs[2:, :] - cs.DM([0, 0.5])
)
ocp_data["e"] = cs.Function("e", [t0s, tfs, x0s, xfs], [e])
ocp_data["e_lb"] = cs.vcat([0] * 7 )
ocp_data["e_ub"] = cs.vcat([0] * 7 )
# dynamics
f = cs.vcat(
[
xs[2, :],
xs[3, :] / xs[0, :],
xs[3, :] ** 2 / xs[0, :] - 1 / xs[0, :] ** 2 + us[0, :],
-xs[2, :] * xs[3, :] / xs[0, :] + us[1, :],
]
)
ocp_data["f"] = cs.Function("fss", [ts, xs, us], [f])
method = casadi_integrator(
plugin="collocation",
plugin_options={
"interpolation_order": 4,
"collocation_scheme": "legendre",
"rootfinder":'kinsol',
"number_of_finite_elements": 1,
"simplify":True
},
nx=ocp_data["nx"],
nu=ocp_data["nu"],
path=[ts, xs, us],
f=f,
)
ocp_data["method"] = method
ocp_data["u_lb"] = cs.DM([-0.01] * 2)
ocp_data["u_ub"] = cs.DM([0.01] * 2)
ocp_data['tf_lb'] = cs.DM([0])
ocp_data['tf_ub'] = cs.DM([50])
ocp_data["n"] = 100
ocp_data['J_s']=cs.DM([50])
ocp_data['t_s']=cs.DM([50])
ocp_data['x_s']=cs.DM([1,10,1e-2,1e-1])
ocp_data['u_s']=cs.DM([0.01,0.01])
ocp_data['e_s']=cs.DM([4,10,0.1,1]+[4,0.1,1])
ocp_data['h_s']=None
ocp = Ocp(**ocp_data)
nlp=cs.Opti()
dis_ocp = generate_NLP(ocp,nlp)
nlp.solver("ipopt")
Xg = cs.vcat(
[
cs.linspace(1, 4, ocp.n + 1).T,
cs.linspace(0, 0, ocp.n + 1).T,
cs.linspace(0, 0, ocp.n + 1).T,
cs.linspace(1, 0.5, ocp.n + 1).T,
]
)
nlp.set_initial(dis_ocp["X"], Xg)
nlp.set_initial(dis_ocp["U"], cs.DM.zeros(dis_ocp["U"].shape))
nlp.set_initial(dis_ocp["tf"], 46)
sol = nlp.solve()
plot_solution(sol, dis_ocp,'low_thrust_sol')
check_feasibility(ocp,dis_ocp,sol,'low_thrust_feas')
if __name__ == "__main__":
low_thrust()
Explore More Examples: For complete, ready-to-run scripts covering single-phase problems (like the Brachistochrone and rocket launches) as well as complex multiphase staging problems, check out the
examples/folder in the repository.
Output
******************************************************************************
This program contains Ipopt, a library for large-scale nonlinear optimization.
Ipopt is released as open source code under the Eclipse Public License (EPL).
For more information visit https://github.com/coin-or/Ipopt
******************************************************************************
This is Ipopt version 3.14.19, running with linear solver MUMPS 5.8.2.
Number of nonzeros in equality constraint Jacobian...: 2907
Number of nonzeros in inequality constraint Jacobian.: 605
Number of nonzeros in Lagrangian Hessian.............: 2595
Total number of variables............................: 605
variables with only lower bounds: 0
variables with lower and upper bounds: 0
variables with only upper bounds: 0
Total number of equality constraints.................: 407
Total number of inequality constraints...............: 605
inequality constraints with only lower bounds: 0
inequality constraints with lower and upper bounds: 201
inequality constraints with only upper bounds: 0
iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls
0 9.2000000e-01 5.25e+00 1.83e-03 -1.0 0.00e+00 - 0.00e+00 0.00e+00 0
1 9.1999901e-03 2.14e+00 7.81e+01 -1.0 2.88e+01 - 5.48e-02 6.21e-01h 1
2 1.0023819e-02 2.14e+00 9.08e+03 -1.0 8.66e+02 - 1.09e-03 8.27e-04h 1
3 1.0531395e-02 2.14e+00 1.39e+04 -1.0 1.06e+03 - 1.30e-03 4.90e-04h 1
4 1.0708156e-02 2.14e+00 2.03e+04 -1.0 4.13e+03 - 1.91e-04 1.60e-04h 1
5 1.0768356e-02 2.14e+00 2.60e+04 -1.0 1.15e+04 - 1.17e-04 5.49e-05h 1
6 1.0794242e-02 2.14e+00 3.36e+04 -1.0 3.23e+04 - 2.94e-05 2.38e-05h 1
7r 1.0794242e-02 2.14e+00 9.99e+02 0.3 0.00e+00 - 0.00e+00 2.96e-07R 5
8r 4.2969919e-02 1.38e+00 9.98e+02 0.3 4.60e+03 - 5.16e-04 1.37e-03f 1
9 4.2991715e-02 1.38e+00 3.01e+01 -1.0 2.38e+03 - 4.53e-04 1.51e-05h 1
iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls
10 4.3078514e-02 1.38e+00 5.21e+02 -1.0 1.04e+04 - 7.78e-05 5.06e-05h 1
11r 4.3078514e-02 1.38e+00 9.99e+02 0.1 0.00e+00 - 0.00e+00 3.79e-07R 5
12r 9.0446322e-02 6.82e-01 9.97e+02 0.1 2.27e+03 - 2.15e-03 2.24e-03f 1
13 9.0477082e-02 6.82e-01 6.26e-01 -1.0 1.64e+03 - 9.83e-06 1.60e-05h 1
14 9.3363170e-02 6.81e-01 1.25e+03 -1.0 1.08e+03 - 1.18e-06 1.83e-03f 1
15 9.6744598e-02 6.79e-01 1.23e+03 -1.0 6.08e+02 - 4.48e-04 2.21e-03f 1
16 1.0300510e-01 6.76e-01 1.09e+03 -1.0 3.65e+02 - 6.46e-04 4.10e-03f 1
17 1.0979368e-01 6.72e-01 9.67e+02 -1.0 2.85e+02 - 1.07e-03 4.40e-03f 1
18 1.1651106e-01 6.68e-01 8.56e+02 -1.0 1.81e+02 - 2.56e-03 4.19e-03f 1
19 1.2617612e-01 6.63e-01 6.86e+02 -1.0 1.07e+02 - 3.27e-03 5.79e-03f 1
iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls
20 1.4750800e-01 6.56e-01 1.31e+02 -1.0 8.92e+01 - 4.56e-03 1.36e-02f 1
21 1.5947749e-01 6.52e-01 9.97e+01 -1.0 8.89e+01 - 8.99e-04 8.17e-03h 1
22 1.6717085e-01 6.48e-01 1.03e+02 -1.0 6.16e+01 - 1.39e-02 5.60e-03f 1
23 1.7948200e-01 6.44e-01 1.12e+02 -1.0 6.33e+01 - 1.26e-04 9.16e-03h 1
24 1.9734135e-01 6.38e-01 1.33e+02 -1.0 5.38e+01 0.0 8.78e-03 1.22e-02f 1
25 2.0212085e-01 6.38e-01 1.33e+02 -1.0 8.29e+02 -0.5 2.65e-04 1.10e-03f 1
26 2.0229741e-01 6.38e-01 1.33e+02 -1.0 9.98e+01 -0.1 3.21e-03 9.17e-05h 1
27 2.1020231e-01 6.37e-01 1.50e+02 -1.0 1.21e+03 -0.5 2.30e-04 1.42e-03f 1
28 2.1051485e-01 6.37e-01 1.50e+02 -1.0 1.06e+02 -0.1 2.15e-03 1.63e-04h 1
29 2.1146862e-01 6.37e-01 1.51e+02 -1.0 2.64e+04 -0.6 1.98e-06 8.00e-06f 2
iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls
30 2.3179092e-01 6.33e-01 1.98e+02 -1.0 1.80e+02 -0.2 5.05e-03 9.57e-03f 1
31 2.3242283e-01 6.33e-01 1.98e+02 -1.0 4.95e+01 0.3 1.59e-03 3.47e-04h 1
32 2.4165975e-01 6.32e-01 2.05e+02 -1.0 3.20e+02 -0.2 1.04e-04 2.85e-03h 1
33 2.4326663e-01 6.31e-01 2.05e+02 -1.0 5.61e+01 0.2 6.35e-03 8.69e-04h 1
34 2.4720131e-01 6.31e-01 2.06e+02 -1.0 8.36e+02 -0.3 6.92e-04 5.36e-04h 1
35 2.5260904e-01 6.29e-01 2.05e+02 -1.0 5.97e+01 0.2 2.01e-03 2.72e-03f 1
36 2.6235195e-01 6.26e-01 2.00e+02 -1.0 1.56e+01 0.6 3.84e-03 5.79e-03f 1
37 2.6868276e-01 6.24e-01 1.98e+02 -1.0 5.66e+01 0.1 3.91e-03 3.18e-03f 1
38 2.8044110e-01 6.19e-01 1.95e+02 -1.0 1.33e+01 0.5 3.72e-03 7.15e-03f 1
39 2.8254165e-01 6.19e-01 1.94e+02 -1.0 5.34e+01 0.1 6.61e-03 1.07e-03f 1
iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls
40 2.9650621e-01 6.13e-01 1.92e+02 -1.0 1.75e+01 0.5 9.09e-03 8.75e-03f 1
41 3.0773229e-01 6.10e-01 1.91e+02 -1.0 8.55e+01 0.0 6.03e-03 5.96e-03f 1
42 3.2463350e-01 6.03e-01 1.91e+02 -1.0 1.73e+01 0.4 1.35e-02 1.07e-02f 1
43 3.3529502e-01 6.01e-01 1.92e+02 -1.0 1.22e+02 -0.0 2.30e-03 3.99e-03f 1
44 3.5976559e-01 5.92e-01 1.92e+02 -1.0 2.05e+01 0.4 1.62e-02 1.53e-02f 1
45 3.6043165e-01 5.91e-01 1.92e+02 -1.0 2.21e+02 -0.1 3.25e-03 2.00e-04h 1
46 3.9267828e-01 5.80e-01 1.91e+02 -1.0 3.06e+01 0.3 1.31e-02 2.07e-02f 1
47 4.0276953e-01 5.76e-01 1.91e+02 -1.0 9.78e+00 0.8 1.29e-02 6.97e-03h 1
48 4.2360672e-01 5.69e-01 1.89e+02 -1.0 2.89e+01 0.3 5.52e-03 1.28e-02f 1
49 4.3531039e-01 5.65e-01 1.88e+02 -1.0 9.46e+00 0.7 1.26e-02 8.30e-03h 1
iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls
50 4.4131063e-01 5.63e-01 1.87e+02 -1.0 2.89e+01 0.2 1.42e-02 3.62e-03h 1
51 4.5841280e-01 5.56e-01 1.87e+02 -1.0 1.39e+01 0.7 1.48e-02 1.25e-02f 1
52 4.8421922e-01 5.49e-01 1.84e+02 -1.0 3.73e+01 0.2 1.73e-03 1.56e-02f 1
53 5.0535806e-01 5.41e-01 1.83e+02 -1.0 1.06e+01 0.6 9.29e-03 1.59e-02f 1
54 5.2362382e-01 5.37e-01 1.80e+02 -1.0 3.58e+01 0.1 1.56e-03 9.55e-03f 1
55 5.4218535e-01 5.30e-01 1.77e+02 -1.0 1.04e+01 0.6 1.83e-02 1.46e-02h 1
56 5.5379926e-01 5.27e-01 1.74e+02 -1.0 4.15e+01 0.1 1.26e-03 6.01e-03f 1
57 5.7864073e-01 5.17e-01 1.69e+02 -1.0 1.13e+01 0.5 1.58e-02 2.07e-02f 1
58 5.9652439e-01 5.11e-01 1.63e+02 -1.0 3.82e+01 0.0 1.47e-03 1.11e-02f 1
59 5.9841709e-01 5.11e-01 1.63e+02 -1.0 1.19e+01 0.5 1.46e-02 1.73e-03h 1
iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls
60 6.1519966e-01 5.07e-01 1.60e+02 -1.0 6.22e+01 -0.0 1.29e-03 8.58e-03f 1
61 6.7326747e-01 4.84e-01 1.55e+02 -1.0 1.23e+01 0.4 4.07e-03 5.07e-02f 1
62 6.9479983e-01 4.80e-01 1.53e+02 -1.0 7.61e+01 -0.1 3.90e-03 8.53e-03h 1
63 7.1075656e-01 4.74e-01 1.51e+02 -1.0 1.21e+01 0.4 3.21e-02 1.41e-02f 1
64 7.2859889e-01 4.70e-01 1.49e+02 -1.0 3.39e+01 -0.1 1.85e-03 7.86e-03h 1
65 8.1918119e-01 4.34e-01 1.20e+02 -1.0 8.48e+00 0.3 2.24e-02 8.24e-02f 1
66 8.4437698e-01 4.28e-01 1.16e+02 -1.0 2.39e+01 -0.2 1.74e-02 1.47e-02h 1
67 9.2714653e-01 3.95e-01 8.89e+01 -1.0 7.22e+00 0.3 6.34e-02 9.11e-02f 1
68 9.6754052e-01 3.83e-01 7.98e+01 -1.0 1.27e+01 -0.2 2.04e-02 3.99e-02f 1
69 9.9968127e-01 3.68e-01 7.55e+01 -1.0 4.94e+00 0.2 1.80e-02 4.66e-02f 1
iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls
70 1.0000027e+00 3.67e-01 1.21e+02 -1.0 9.71e+00 -0.3 6.24e-02 2.79e-03h 1
71 9.9996106e-01 3.47e-01 1.85e+02 -1.0 5.09e+00 0.2 8.24e-02 6.76e-02f 1
72 9.9996100e-01 3.42e-01 1.14e+02 -1.0 1.16e+01 -0.3 6.19e-02 9.22e-02f 1
73 9.9996648e-01 3.30e-01 3.62e+02 -1.0 4.21e+00 0.1 1.09e-01 4.04e-02h 1
74 9.9996546e-01 3.24e-01 3.49e+02 -1.0 1.20e+01 -0.4 2.87e-02 3.09e-02h 1
75 9.9996631e-01 3.18e-01 8.60e+02 -1.0 4.20e+00 0.1 2.04e-01 1.92e-02h 1
76 9.9996437e-01 3.08e-01 7.91e+02 -1.0 1.07e+01 -0.4 8.71e-02 8.14e-02f 1
77 9.9996546e-01 2.89e-01 1.10e+03 -1.0 3.99e+00 -0.0 2.94e-01 7.23e-02h 1
78 9.9996318e-01 2.70e-01 9.75e+02 -1.0 6.92e+00 -0.5 1.25e-01 1.06e-01f 1
79 9.9996247e-01 2.70e-01 9.39e+02 -1.0 4.66e+01 -1.0 2.64e-02 1.52e-02h 1
iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls
80 9.9995980e-01 2.43e-01 7.30e+02 -1.0 4.65e+00 -0.5 2.97e-01 1.17e-01h 1
81 9.9995708e-01 2.25e-01 6.08e+02 -1.0 8.15e+00 -1.0 1.45e-01 7.61e-02h 1
82 9.9995652e-01 2.23e-01 6.17e+02 -1.0 1.94e+02 -1.5 8.31e-04 9.60e-03h 1
83 9.9995112e-01 1.95e-01 4.36e+02 -1.0 4.43e+00 -2.0 2.20e-01 1.24e-01f 1
84 9.9995113e-01 1.93e-01 4.31e+02 -1.0 1.62e+02 - 2.22e-03 6.00e-03h 1
85 9.9994502e-01 1.54e-01 3.69e+02 -1.0 2.48e+00 -0.6 1.26e-01 2.05e-01h 1
86 9.9993947e-01 1.34e-01 1.49e+02 -1.0 5.72e+00 -1.1 3.67e-01 1.30e-01f 1
87 9.9990737e-01 6.06e-02 1.46e+02 -1.0 4.45e+00 -1.6 4.27e-01 5.47e-01h 1
88 9.9988251e-01 4.05e-02 1.01e+02 -1.0 7.06e+00 -2.1 3.19e-01 3.23e-01f 1
89 9.9985996e-01 3.16e-02 7.56e+01 -1.0 5.88e+00 -2.5 2.42e-01 2.39e-01f 1
iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls
90 9.9983960e-01 2.58e-02 5.62e+01 -1.0 1.05e+01 -3.0 2.23e-01 2.12e-01f 1
91 9.9984049e-01 2.52e-02 5.26e+01 -1.0 1.13e+02 -3.5 5.91e-03 1.58e-02f 2
92 9.9979170e-01 1.49e-02 7.34e+01 -1.0 2.71e+00 -2.2 3.28e-01 5.95e-01h 1
93 9.9977234e-01 1.51e-02 6.25e+01 -1.0 4.22e+00 - 2.22e-01 2.90e-01f 1
94 9.9975477e-01 1.18e-02 4.42e+01 -1.0 3.04e+00 - 3.26e-01 3.94e-01f 1
95 9.9973427e-01 2.22e-03 1.36e+01 -1.0 1.30e+00 - 6.79e-01 9.86e-01h 1
96 9.9973861e-01 3.51e-05 6.35e-03 -1.0 7.54e-01 - 1.00e+00 1.00e+00f 1
97 9.9973800e-01 1.91e-07 8.91e-02 -2.5 1.18e-02 - 1.00e+00 1.00e+00h 1
98 9.9971519e-01 1.48e-04 1.60e-04 -2.5 3.75e-01 - 1.00e+00 1.00e+00f 1
99 9.9968820e-01 9.49e-08 4.15e-01 -3.8 3.69e-03 - 9.60e-01 1.00e+00h 1
iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls
100 9.7471349e-01 1.05e-02 1.94e-02 -3.8 1.04e+00 - 7.22e-01 8.49e-01f 1
101 9.7837233e-01 2.24e-03 3.61e-02 -3.8 1.07e+00 - 1.00e+00 7.96e-01h 1
102 9.8107389e-01 1.53e-03 1.70e-04 -3.8 9.91e-01 - 1.00e+00 1.00e+00f 1
103 9.8163061e-01 3.74e-04 3.71e-04 -3.8 4.30e-01 - 1.00e+00 1.00e+00h 1
104 9.7066033e-01 6.00e-03 2.72e-03 -5.7 2.50e+00 - 3.01e-01 4.41e-01h 1
105 9.6644363e-01 4.49e-03 2.05e-03 -5.7 1.84e+00 - 2.55e-01 2.93e-01h 1
106 9.6240545e-01 1.40e-03 6.56e-04 -5.7 1.32e-01 -2.6 7.49e-01 6.83e-01h 1
107 9.5849454e-01 6.06e-04 2.22e-04 -5.7 3.13e-01 -3.1 7.44e-01 5.92e-01h 1
108 9.5671398e-01 5.31e-04 2.06e-03 -5.7 5.16e-01 -3.6 1.00e+00 4.73e-01h 1
109 9.5607251e-01 4.36e-04 2.13e-03 -5.7 9.84e-01 -4.1 8.50e-01 4.46e-01f 1
iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls
110 9.5590288e-01 3.98e-04 1.12e-03 -5.7 1.82e+00 -4.6 7.80e-01 1.31e-01h 1
111 9.5551537e-01 8.35e-04 9.87e-04 -5.7 2.01e+00 -5.0 7.45e-01 3.14e-01f 1
112 9.5529262e-01 2.22e-03 1.84e-03 -5.7 4.91e+00 - 1.07e-01 3.01e-01f 1
113 9.5493466e-01 2.48e-03 6.87e-03 -5.7 4.47e+00 - 4.02e-01 2.36e-01f 1
114 9.5489775e-01 2.07e-03 5.83e-03 -5.7 1.19e+00 - 1.00e+00 1.66e-01h 1
115 9.5481998e-01 1.28e-04 5.82e-04 -5.7 7.40e-02 - 1.00e+00 9.43e-01h 1
116 9.5480891e-01 1.53e-06 5.94e-06 -5.7 2.81e-02 - 1.00e+00 1.00e+00f 1
117 9.5448782e-01 2.28e-05 1.66e-05 -8.6 1.60e-01 - 8.93e-01 8.77e-01h 1
118 9.5444346e-01 2.66e-07 2.52e-07 -8.6 1.18e-02 - 1.00e+00 1.00e+00h 1
119 9.5444346e-01 4.46e-10 1.52e-11 -8.6 1.43e-04 - 1.00e+00 1.00e+00h 1
Number of Iterations....: 119
(scaled) (unscaled)
Objective...............: 9.5444345906140005e-01 9.5444345906140005e-01
Dual infeasibility......: 1.5186740753847516e-11 1.5186740753847516e-11
Constraint violation....: 4.4618753136660416e-10 4.4618753136660416e-10
Variable bound violation: 0.0000000000000000e+00 0.0000000000000000e+00
Complementarity.........: 2.5059339191123623e-09 2.5059339191123623e-09
Overall NLP error.......: 2.5059339191123623e-09 2.5059339191123623e-09
Number of objective function evaluations = 134
Number of objective gradient evaluations = 120
Number of equality constraint evaluations = 134
Number of inequality constraint evaluations = 134
Number of equality constraint Jacobian evaluations = 122
Number of inequality constraint Jacobian evaluations = 122
Number of Lagrangian Hessian evaluations = 119
Total seconds in IPOPT = 5.307
EXIT: Optimal Solution Found.
solver : t_proc (avg) t_wall (avg) n_eval
nlp_f | 0 ( 0) 551.00us ( 4.11us) 134
nlp_g | 412.00ms ( 3.07ms) 324.21ms ( 2.42ms) 134
nlp_grad_f | 1.00ms ( 8.26us) 1.34ms ( 11.05us) 121
nlp_hess_l | 2.80 s ( 23.91ms) 3.11 s ( 26.59ms) 117
nlp_jac_g | 1.69 s ( 13.76ms) 1.45 s ( 11.81ms) 123
total | 5.32 s ( 5.32 s) 5.32 s ( 5.32 s) 1