1
- function ilqr_solve! (prob:: Solver ;
2
- max_iter= 10 ,
3
- obj_tol= 1.0e-3 ,
4
- grad_tol= 1.0e-3 ,
5
- α_min= 1.0e-5 ,
6
- linesearch= :armijo ,
7
- reset_cache= true ,
8
- verbose= false )
1
+ function ilqr_solve! (solver:: Solver )
9
2
10
3
# printstyled("Iterative LQR\n",
11
4
# color=:red, bold=true)
12
5
13
6
# data
14
- p_data = prob . p_data
15
- m_data = prob . m_data
7
+ p_data = solver . p_data
8
+ m_data = solver . m_data
16
9
reset! (m_data. model_deriv)
17
10
reset! (m_data. obj_deriv)
18
- s_data = prob . s_data
19
- reset_cache && reset! (s_data)
11
+ s_data = solver . s_data
12
+ solver . options . reset_cache && reset! (s_data)
20
13
21
14
objective! (s_data, m_data, mode= :nominal )
22
15
derivatives! (m_data, mode= :nominal )
23
16
backward_pass! (p_data, m_data, mode= :nominal )
24
17
25
18
obj_prev = s_data. obj[1 ]
26
- for i = 1 : max_iter
19
+ for i = 1 : solver . options . max_iter
27
20
forward_pass! (p_data, m_data, s_data,
28
- α_min= α_min,
29
- linesearch= linesearch,
30
- verbose= verbose)
31
- if linesearch != :none
21
+ α_min= solver . options . α_min,
22
+ linesearch= solver . options . linesearch,
23
+ verbose= solver . options . verbose)
24
+ if solver . options . linesearch != :none
32
25
derivatives! (m_data, mode= :nominal )
33
26
backward_pass! (p_data, m_data, mode= :nominal )
34
27
lagrangian_gradient! (s_data, p_data, m_data)
@@ -39,25 +32,25 @@ function ilqr_solve!(prob::Solver;
39
32
40
33
# info
41
34
s_data. iter[1 ] += 1
42
- verbose && println (" iter: $i
35
+ solver . options . verbose && println (" iter: $i
43
36
cost: $(s_data. obj[1 ])
44
37
grad_norm: $(grad_norm)
45
38
c_max: $(s_data. c_max[1 ])
46
39
α: $(s_data. α[1 ]) " )
47
40
48
41
# check convergence
49
- grad_norm < grad_tol && break
50
- abs (s_data. obj[1 ] - obj_prev) < obj_tol ? break : (obj_prev = s_data. obj[1 ])
42
+ grad_norm < solver . options . grad_tol && break
43
+ abs (s_data. obj[1 ] - obj_prev) < solver . options . obj_tol ? break : (obj_prev = s_data. obj[1 ])
51
44
! s_data. status[1 ] && break
52
45
end
53
46
54
47
return nothing
55
48
end
56
49
57
- function ilqr_solve! (prob :: Solver , x, u; kwargs... )
58
- initialize_controls! (prob , u)
59
- initialize_states! (prob , x)
60
- ilqr_solve! (prob ; kwargs... )
50
+ function ilqr_solve! (solver :: Solver , x, u; kwargs... )
51
+ initialize_controls! (solver , u)
52
+ initialize_states! (solver , x)
53
+ ilqr_solve! (solver ; kwargs... )
61
54
end
62
55
63
56
86
79
"""
87
80
augmented Lagrangian solve
88
81
"""
89
- function constrained_ilqr_solve! (prob:: Solver ;
90
- linesearch= :armijo ,
91
- max_iter= 10 ,
92
- max_al_iter= 10 ,
93
- α_min= 1.0e-5 ,
94
- obj_tol= 1.0e-3 ,
95
- grad_tol= 1.0e-3 ,
96
- con_tol= 1.0e-3 ,
97
- con_norm_type= Inf ,
98
- ρ_init= 1.0 ,
99
- ρ_scale= 10.0 ,
100
- ρ_max= 1.0e8 ,
101
- verbose= false )
82
+ function constrained_ilqr_solve! (solver:: Solver )
102
83
103
84
# verbose && printstyled("Iterative LQR\n",
104
85
# color=:red, bold=true)
105
86
106
87
# reset solver cache
107
- reset! (prob . s_data)
88
+ reset! (solver . s_data)
108
89
109
90
# reset duals
110
- for (t, λ) in enumerate (prob . m_data. obj. λ)
91
+ for (t, λ) in enumerate (solver . m_data. obj. λ)
111
92
fill! (λ, 0.0 )
112
93
end
113
94
114
95
# initialize penalty
115
- for (t, ρ) in enumerate (prob . m_data. obj. ρ)
116
- fill! (ρ, ρ_init)
96
+ for (t, ρ) in enumerate (solver . m_data. obj. ρ)
97
+ fill! (ρ, solver . options . ρ_init)
117
98
end
118
99
119
- for i = 1 : max_al_iter
120
- verbose && println (" al iter: $i " )
100
+ for i = 1 : solver . options . max_al_iter
101
+ solver . options . verbose && println (" al iter: $i " )
121
102
122
103
# primal minimization
123
- ilqr_solve! (prob,
124
- linesearch= linesearch,
125
- α_min= α_min,
126
- max_iter= max_iter,
127
- obj_tol= obj_tol,
128
- grad_tol= grad_tol,
129
- reset_cache= false ,
130
- verbose= verbose)
104
+ ilqr_solve! (solver)
131
105
132
106
# update trajectories
133
- objective! (prob . s_data, prob . m_data, mode= :nominal )
107
+ objective! (solver . s_data, solver . m_data, mode= :nominal )
134
108
135
109
# constraint violation
136
- prob . s_data. c_max[1 ] <= con_tol && break
110
+ solver . s_data. c_max[1 ] <= solver . options . con_tol && break
137
111
138
112
# dual ascent
139
- augmented_lagrangian_update! (prob . m_data. obj,
140
- s= ρ_scale, max_penalty= ρ_max)
113
+ augmented_lagrangian_update! (solver . m_data. obj,
114
+ s= solver . options . ρ_scale, max_penalty= solver . options . ρ_max)
141
115
end
142
116
143
117
return nothing
144
118
end
145
119
146
- function constrained_ilqr_solve! (prob :: Solver , x, u; kwargs... )
147
- initialize_controls! (prob , u)
148
- initialize_states! (prob , x)
149
- constrained_ilqr_solve! (prob ; kwargs... )
120
+ function constrained_ilqr_solve! (solver :: Solver , x, u; kwargs... )
121
+ initialize_controls! (solver , u)
122
+ initialize_states! (solver , x)
123
+ constrained_ilqr_solve! (solver ; kwargs... )
150
124
end
151
125
152
- function solve! (prob :: Solver{T,N,M,NN,MM,MN,NNN,MNN,X,U,D,O} , args... ; kwargs... ) where {T,N,M,NN,MM,MN,NNN,MNN,X,U,D,O<: Objective{T} }
153
- iterative_lqr! (prob , args... ; kwargs... )
126
+ function solve! (solver :: Solver{T,N,M,NN,MM,MN,NNN,MNN,X,U,D,O} , args... ; kwargs... ) where {T,N,M,NN,MM,MN,NNN,MNN,X,U,D,O<: Objective{T} }
127
+ iterative_lqr! (solver , args... ; kwargs... )
154
128
end
155
129
156
- function solve! (prob :: Solver{T,N,M,NN,MM,MN,NNN,MNN,X,U,D,O} , args... ; kwargs... ) where {T,N,M,NN,MM,MN,NNN,MNN,X,U,D,O<: AugmentedLagrangianCosts{T} }
157
- constrained_ilqr_solve! (prob , args... ; kwargs... )
130
+ function solve! (solver :: Solver{T,N,M,NN,MM,MN,NNN,MNN,X,U,D,O} , args... ; kwargs... ) where {T,N,M,NN,MM,MN,NNN,MNN,X,U,D,O<: AugmentedLagrangianCosts{T} }
131
+ constrained_ilqr_solve! (solver , args... ; kwargs... )
158
132
end
159
133
160
134
0 commit comments