33
33
34
34
function update_ctrl! (alg:: autoGRAPE_Adam , obj, dynamics, δ)
35
35
(; epsilon, beta1, beta2) = alg
36
- for ci in 1 : length (δ)
36
+ for ci = 1 : length (δ)
37
37
mt, vt = 0.0 , 0.0
38
- for ti in 1 : length (δ[1 ])
39
- dynamics. data. ctrl[ci][ti], mt, vt = Adam (δ[ci][ti], ti,
40
- dynamics. data. ctrl[ci][ti], mt, vt, epsilon, beta1, beta2, obj. eps)
38
+ for ti = 1 : length (δ[1 ])
39
+ dynamics. data. ctrl[ci][ti], mt, vt = Adam (
40
+ δ[ci][ti],
41
+ ti,
42
+ dynamics. data. ctrl[ci][ti],
43
+ mt,
44
+ vt,
45
+ epsilon,
46
+ beta1,
47
+ beta2,
48
+ obj. eps,
49
+ )
41
50
end
42
51
end
43
52
end
44
53
45
54
function update_ctrl! (alg:: autoGRAPE , obj, dynamics, δ)
46
- dynamics. data. ctrl += alg. epsilon* δ
55
+ dynamics. data. ctrl += alg. epsilon * δ
47
56
end
48
57
49
58
# ### state optimization ####
@@ -58,10 +67,10 @@ function update!(opt::StateOpt, alg::AbstractAD, obj, dynamics, output)
58
67
set_buffer! (output, transpose (dynamics. data. ψ0))
59
68
set_io! (output, f_ini)
60
69
show (opt, output, obj)
61
- for ei in 1 : (max_episode- 1 )
70
+ for ei = 1 : (max_episode- 1 )
62
71
δ = gradient (() -> objective (obj, dynamics)[2 ], Flux. Params ([dynamics. data. ψ0]))
63
72
update_state! (alg, obj, dynamics, δ[dynamics. data. ψ0])
64
- dynamics. data. ψ0 = dynamics. data. ψ0/ norm (dynamics. data. ψ0)
73
+ dynamics. data. ψ0 = dynamics. data. ψ0 / norm (dynamics. data. ψ0)
65
74
f_out, f_now = objective (obj, dynamics)
66
75
set_f! (output, f_out)
67
76
set_buffer! (output, transpose (dynamics. data. ψ0))
74
83
function update_state! (alg:: AD_Adam , obj, dynamics, δ)
75
84
(; epsilon, beta1, beta2) = alg
76
85
mt, vt = 0.0 , 0.0
77
- for ti in 1 : length (δ)
78
- dynamics. data. ψ0[ti], mt, vt = Adam (δ[ti], ti, dynamics. data. ψ0[ti], mt, vt, epsilon, beta1, beta2, obj. eps)
86
+ for ti = 1 : length (δ)
87
+ dynamics. data. ψ0[ti], mt, vt =
88
+ Adam (δ[ti], ti, dynamics. data. ψ0[ti], mt, vt, epsilon, beta1, beta2, obj. eps)
79
89
end
80
90
end
81
91
82
92
function update_state! (alg:: AD , obj, dynamics, δ)
83
- dynamics. data. ψ0 += alg. epsilon* δ
93
+ dynamics. data. ψ0 += alg. epsilon * δ
84
94
end
85
95
86
96
# ### find the optimal linear combination of a given set of POVM ####
@@ -94,7 +104,7 @@ function update!(opt::Mopt_LinearComb, alg::AbstractAD, obj, dynamics, output)
94
104
basis_num = length (POVM_basis)
95
105
96
106
bound_LC_coeff! (opt. B)
97
- M = [sum ([opt. B[i][j]* POVM_basis[j] for j in 1 : basis_num]) for i in 1 : M_num]
107
+ M = [sum ([opt. B[i][j] * POVM_basis[j] for j = 1 : basis_num]) for i = 1 : M_num]
98
108
obj_QFIM = QFIM_obj (obj)
99
109
f_opt, f_comp = objective (obj_QFIM, dynamics)
100
110
obj_POVM = set_M (obj, POVM_basis)
@@ -105,11 +115,11 @@ function update!(opt::Mopt_LinearComb, alg::AbstractAD, obj, dynamics, output)
105
115
set_buffer! (output, M)
106
116
set_io! (output, f_ini, f_povm, f_opt)
107
117
show (opt, output, obj)
108
- for ei in 1 : (max_episode- 1 )
118
+ for ei = 1 : (max_episode- 1 )
109
119
δ = gradient (() -> objective (opt, obj, dynamics)[2 ], Flux. Params ([opt. B]))
110
120
update_M! (opt, alg, obj, δ[opt. B])
111
121
bound_LC_coeff! (opt. B)
112
- M = [sum ([opt. B[i][j]* POVM_basis[j] for j in 1 : basis_num]) for i in 1 : M_num]
122
+ M = [sum ([opt. B[i][j] * POVM_basis[j] for j = 1 : basis_num]) for i = 1 : M_num]
113
123
obj_copy = set_M (obj, M)
114
124
f_out, f_now = objective (obj_copy, dynamics)
115
125
set_f! (output, f_out)
@@ -122,16 +132,17 @@ end
122
132
123
133
function update_M! (opt:: Mopt_LinearComb , alg:: AD_Adam , obj, δ)
124
134
(; epsilon, beta1, beta2) = alg
125
- for ci in 1 : length (δ)
135
+ for ci = 1 : length (δ)
126
136
mt, vt = 0.0 , 0.0
127
- for ti in 1 : length (δ[1 ])
128
- opt. B[ci][ti], mt, vt = Adam (δ[ci][ti], ti, opt. B[ci][ti], mt, vt, epsilon, beta1, beta2, obj. eps)
137
+ for ti = 1 : length (δ[1 ])
138
+ opt. B[ci][ti], mt, vt =
139
+ Adam (δ[ci][ti], ti, opt. B[ci][ti], mt, vt, epsilon, beta1, beta2, obj. eps)
129
140
end
130
141
end
131
142
end
132
143
133
144
function update_M! (opt:: Mopt_LinearComb , alg:: AD , obj, δ)
134
- opt. B += alg. epsilon* δ
145
+ opt. B += alg. epsilon * δ
135
146
end
136
147
137
148
# ### find the optimal rotated measurement of a given set of POVM ####
@@ -146,17 +157,17 @@ function update!(opt::Mopt_Rotation, alg::AbstractAD, obj, dynamics, output)
146
157
M_num = length (POVM_basis)
147
158
suN = suN_generator (dim)
148
159
opt. Lambda = Matrix{ComplexF64}[]
149
- append! (opt. Lambda, [Matrix {ComplexF64} (I,dim,dim)])
150
- append! (opt. Lambda, [suN[i] for i in 1 : length (suN)])
160
+ append! (opt. Lambda, [Matrix {ComplexF64} (I, dim, dim)])
161
+ append! (opt. Lambda, [suN[i] for i = 1 : length (suN)])
151
162
152
163
# if ismissing(Lambda)
153
164
# opt.Lambda = Matrix{ComplexF64}[]
154
165
# append!(opt.Lambda, [Matrix{ComplexF64}(I,dim,dim)])
155
166
# append!(opt.Lambda, [suN[i] for i in 1:length(suN)])
156
167
# end
157
-
168
+
158
169
U = rotation_matrix (opt. s, opt. Lambda)
159
- M = [U* POVM_basis[i]* U' for i in 1 : M_num]
170
+ M = [U * POVM_basis[i] * U' for i = 1 : M_num]
160
171
obj_QFIM = QFIM_obj (obj)
161
172
f_opt, f_comp = objective (obj_QFIM, dynamics)
162
173
obj_POVM = set_M (obj, POVM_basis)
@@ -167,12 +178,12 @@ function update!(opt::Mopt_Rotation, alg::AbstractAD, obj, dynamics, output)
167
178
set_buffer! (output, M)
168
179
set_io! (output, f_ini, f_povm, f_opt)
169
180
show (opt, output, obj)
170
- for ei in 1 : (max_episode- 1 )
181
+ for ei = 1 : (max_episode- 1 )
171
182
δ = gradient (() -> objective (opt, obj, dynamics)[2 ], Flux. Params ([opt. s]))
172
183
update_M! (opt, alg, obj, δ[opt. s])
173
184
bound_rot_coeff! (opt. s)
174
185
U = rotation_matrix (opt. s, opt. Lambda)
175
- M = [U* POVM_basis[i]* U' for i in 1 : M_num]
186
+ M = [U * POVM_basis[i] * U' for i = 1 : M_num]
176
187
obj_copy = set_M (obj, M)
177
188
f_out, f_now = objective (obj_copy, dynamics)
178
189
set_f! (output, f_out)
@@ -186,13 +197,14 @@ end
186
197
function update_M! (opt:: Mopt_Rotation , alg:: AD_Adam , obj, δ)
187
198
(; epsilon, beta1, beta2) = alg
188
199
mt, vt = 0.0 , 0.0
189
- for ti in 1 : length (δ)
190
- opt. s[ti], mt, vt = Adam (δ[ti], ti, opt. s[ti], mt, vt, epsilon, beta1, beta2, obj. eps)
200
+ for ti = 1 : length (δ)
201
+ opt. s[ti], mt, vt =
202
+ Adam (δ[ti], ti, opt. s[ti], mt, vt, epsilon, beta1, beta2, obj. eps)
191
203
end
192
204
end
193
205
194
206
function update_M! (opt:: Mopt_Rotation , alg:: AD , obj, δ)
195
- opt. s += alg. epsilon* δ
207
+ opt. s += alg. epsilon * δ
196
208
end
197
209
198
210
# ### state abd control optimization ####
@@ -215,11 +227,14 @@ function update!(opt::StateControlOpt, alg::AbstractAD, obj, dynamics, output)
215
227
show (opt, output, obj)
216
228
217
229
for ei = 1 : (max_episode- 1 )
218
- δ = gradient (() -> objective (obj, dynamics)[2 ], Flux. Params ([dynamics. data. ψ0, dynamics. data. ctrl]))
230
+ δ = gradient (
231
+ () -> objective (obj, dynamics)[2 ],
232
+ Flux. Params ([dynamics. data. ψ0, dynamics. data. ctrl]),
233
+ )
219
234
update_state! (alg, obj, dynamics, δ[dynamics. data. ψ0])
220
235
update_ctrl! (alg, obj, dynamics, δ[dynamics. data. ctrl])
221
236
bound! (dynamics. data. ctrl, opt. ctrl_bound)
222
- dynamics. data. ψ0 = dynamics. data. ψ0/ norm (dynamics. data. ψ0)
237
+ dynamics. data. ψ0 = dynamics. data. ψ0 / norm (dynamics. data. ψ0)
223
238
f_out, f_now = objective (obj, dynamics)
224
239
225
240
set_f! (output, f_out)
@@ -232,15 +247,24 @@ end
232
247
233
248
function update_ctrl! (alg:: AD_Adam , obj, dynamics, δ)
234
249
(; epsilon, beta1, beta2) = alg
235
- for ci in 1 : length (δ)
250
+ for ci = 1 : length (δ)
236
251
mt, vt = 0.0 , 0.0
237
- for ti in 1 : length (δ[1 ])
238
- dynamics. data. ctrl[ci][ti], mt, vt = Adam (δ[ci][ti], ti,
239
- dynamics. data. ctrl[ci][ti], mt, vt, epsilon, beta1, beta2, obj. eps)
252
+ for ti = 1 : length (δ[1 ])
253
+ dynamics. data. ctrl[ci][ti], mt, vt = Adam (
254
+ δ[ci][ti],
255
+ ti,
256
+ dynamics. data. ctrl[ci][ti],
257
+ mt,
258
+ vt,
259
+ epsilon,
260
+ beta1,
261
+ beta2,
262
+ obj. eps,
263
+ )
240
264
end
241
265
end
242
266
end
243
267
244
268
function update_ctrl! (alg:: AD , obj, dynamics, δ)
245
- dynamics. data. ctrl += alg. epsilon* δ
269
+ dynamics. data. ctrl += alg. epsilon * δ
246
270
end
0 commit comments