@@ -6,11 +6,13 @@ Pkg.activate(".")
6
6
7
7
using BAC
8
8
9
+ using Random
9
10
Random. seed! (1 );
10
11
using Pipe: @pipe
11
12
using LaTeXStrings
12
13
using Statistics
13
14
using DiffEqFlux
15
+ using Plots
14
16
15
17
# #
16
18
const t_steps = 0. :0.1 : 4pi
@@ -26,47 +28,41 @@ p_spec_init = rand(dim_p_spec) .+ 1.
26
28
27
29
p_initial = vcat (p_sys_init, repeat (p_spec_init, N_samples))
28
30
29
- i = BAC. rand_fourier_input_generator (1 )
31
+ @views begin
32
+ p_syss = p_initial[1 : dim_p]
33
+ p_specs = [p_initial[(dim_p + 1 + (n - 1 ) * dim_p_spec): (dim_p + n * dim_p_spec)] for n in 1 : N_samples]
34
+ end
35
+
36
+
30
37
K_av = 1.
31
38
32
39
# #
40
+
41
+ i = BAC. rand_fourier_input_generator (1 )
33
42
plot (i, 0. , 4pi )
34
43
35
- # #
44
+ # # Start with a small frequency spread
36
45
37
46
omega = 1. * randn (N_osc);
38
47
omega .- = mean (omega)
39
48
40
49
# #
41
50
42
- @views begin
43
- p_syss = p_initial[1 : dim_p]
44
- p_specs = [p_initial[(dim_p + 1 + (n - 1 ) * dim_p_spec): (dim_p + n * dim_p_spec)] for n in 1 : N_samples]
45
- end
46
-
47
51
kur = BAC. create_kuramoto_example (omega, N_osc, dim_p_spec, K_av, t_steps, N_samples) # specify modes = 0 for no input
48
52
49
- solve_sys_spec (kur, i, p_syss, p_specs[1 ])
50
-
51
53
scen = 1 : 5
52
- sol1, sol2 = BAC. solve_bl_n (kur, 3 , p_initial, scenario_nums = scen) # n and scen_nums???
53
- kur. output_metric (sol1, sol2)
54
54
55
55
# # Plot where we start
56
56
p_initial = BAC. bac_spec_only (kur, p_initial; optimizer_options= (:maxiters => 1000 ,), solver_options = (abstol = 1e-4 , reltol= 1e-4 ))
57
57
58
58
l = kur (p_initial, abstol= 1e-4 , reltol= 1e-4 )
59
59
plot_callback (kur, p_initial, l, scenario_nums = scen, xlims = (kur. t_span[2 ]/ 2 , kur. t_span[2 ]))
60
- # #
61
60
62
- # # For some reason using kur(p) inside an optimization loop results in an error. I have not been able to find the reason yet
63
- # The error occurs in the differential equation system (line 36), as if p is a 4-element vector instead of 2x2 matrix.
64
- # All the functions run normally without DiffEqFlux
61
+ # #
65
62
res_1 = DiffEqFlux. sciml_train (
66
63
p -> kur (p, abstol= 1e-4 , reltol= 1e-4 ),
67
64
p_initial,
68
65
DiffEqFlux. ADAM (0.1 ),
69
- # DiffEqFlux.BFGS(),
70
66
maxiters= 25 ,
71
67
cb= basic_bac_callback
72
68
# cb = (p, l) -> plot_callback(kur, p, l, scenario_nums=scenarios)
@@ -81,7 +77,6 @@ plot_callback(kur, res_1.u, res_1.minimum, scenario_nums = scen, xlims = (kur.t_
81
77
res_2 = DiffEqFlux. sciml_train (
82
78
p -> kur (p, abstol= 1e-4 , reltol= 1e-4 ),
83
79
res_1. u,
84
- # DiffEqFlux.ADAM(0.1),
85
80
DiffEqFlux. BFGS (),
86
81
maxiters= 25 ,
87
82
cb= basic_bac_callback
@@ -97,8 +92,6 @@ plot_callback(kur, res_2.u, res_2.minimum, scenario_nums = scen, xlims = (kur.t_
97
92
res_3 = DiffEqFlux. sciml_train (
98
93
p -> kur (p, abstol= 1e-4 , reltol= 1e-4 ),
99
94
res_2. u,
100
- # DiffEqFlux.BFGS(),
101
- # DiffEqFlux.ADAM(0.1),
102
95
DiffEqFlux. AMSGrad (0.01 ),
103
96
maxiters= 100 ,
104
97
cb= basic_bac_callback
@@ -114,7 +107,6 @@ plot_callback(kur, res_3.u, res_3.minimum, scenario_nums = scen, xlims = (kur.t_
114
107
res_4 = DiffEqFlux. sciml_train (
115
108
p -> kur (p, abstol= 1e-4 , reltol= 1e-4 ),
116
109
res_3. u,
117
- # DiffEqFlux.ADAM(0.1),
118
110
DiffEqFlux. BFGS (),
119
111
maxiters= 25 ,
120
112
cb= basic_bac_callback
@@ -127,26 +119,21 @@ plot_callback(kur, res_4.u, res_4.minimum, scenario_nums = scen, xlims = (kur.t_
127
119
128
120
# #
129
121
130
- plot_callback (kur, res_1. u, res_1. minimum, scenario_nums = scen, xlims = (kur. t_span[2 ]/ 2 , kur. t_span[2 ]))
131
- plot_callback (kur, res_2. u, res_2. minimum, scenario_nums = scen, xlims = (kur. t_span[2 ]/ 2 , kur. t_span[2 ]))
132
- plot_callback (kur, res_3. u, res_3. minimum, scenario_nums = scen, xlims = (kur. t_span[2 ]/ 2 , kur. t_span[2 ]))
133
- plot_callback (kur, res_4. u, res_4. minimum, scenario_nums = scen, xlims = (kur. t_span[2 ]/ 2 , kur. t_span[2 ]))
134
-
135
- # #
136
-
137
122
res_5 = DiffEqFlux. sciml_train (
138
- p -> kur (p, abstol= 1e-4 , reltol= 1e-4 ),
123
+ p -> kur (p, abstol= 1e-5 , reltol= 1e-5 ),
139
124
res_4. u,
140
- # DiffEqFlux.ADAM(0.1),
141
125
DiffEqFlux. AMSGrad (0.01 ),
142
- # DiffEqFlux.BFGS(),
143
- maxiters= 225 ,
126
+ maxiters= 100 ,
144
127
cb= basic_bac_callback
145
128
# cb = (p, l) -> plot_callback(kur, p, l, scenario_nums=scenarios)
146
129
)
147
130
148
131
# #
149
-
132
+ plot_callback (kur, p_initial, l, scenario_nums = scen, xlims = (kur. t_span[2 ]/ 2 , kur. t_span[2 ]))
133
+ plot_callback (kur, res_1. u, res_1. minimum, scenario_nums = scen, xlims = (kur. t_span[2 ]/ 2 , kur. t_span[2 ]))
134
+ plot_callback (kur, res_2. u, res_2. minimum, scenario_nums = scen, xlims = (kur. t_span[2 ]/ 2 , kur. t_span[2 ]))
135
+ plot_callback (kur, res_3. u, res_3. minimum, scenario_nums = scen, xlims = (kur. t_span[2 ]/ 2 , kur. t_span[2 ]))
136
+ plot_callback (kur, res_4. u, res_4. minimum, scenario_nums = scen, xlims = (kur. t_span[2 ]/ 2 , kur. t_span[2 ]))
150
137
plot_callback (kur, res_5. u, res_5. minimum, scenario_nums = scen, xlims = (kur. t_span[2 ]/ 2 , kur. t_span[2 ]))
151
138
152
139
# #
@@ -156,8 +143,37 @@ plot_callback(kur, res_5.u, res_5.minimum, scenario_nums = scen, xlims = (kur.t_
156
143
p_final_specs = [res_5. u[(dim_p + 1 + (n - 1 ) * dim_p_spec): (dim_p + n * dim_p_spec)] for n in 1 : N_samples]
157
144
end
158
145
146
+ # # Try with a larger spread
147
+
148
+ omega = 20. * randn (N_osc);
149
+ omega .- = mean (omega)
150
+
151
+ # #
152
+
153
+ kur2 = BAC. create_kuramoto_example (omega, N_osc, dim_p_spec, K_av, t_steps, N_samples) # specify modes = 0 for no input
154
+
155
+ # #
156
+ p_initial2 = BAC. bac_spec_only (kur2, p_initial; optimizer_options= (:maxiters => 1000 ,), solver_options = (abstol = 1e-4 , reltol= 1e-4 ))
157
+
158
+ l2 = kur2 (p_initial2, abstol= 1e-4 , reltol= 1e-4 )
159
+ plot_callback (kur2, p_initial2, l, scenario_nums = scen, xlims = (kur. t_span[2 ]/ 2 , kur. t_span[2 ]))
160
+
161
+ # #
162
+ res2_1 = DiffEqFlux. sciml_train (
163
+ p -> kur2 (p, abstol= 1e-4 , reltol= 1e-4 ),
164
+ p_initial2,
165
+ DiffEqFlux. ADAM (0.1 ),
166
+ maxiters= 50 ,
167
+ cb= basic_bac_callback
168
+ # cb = (p, l) -> plot_callback(kur, p, l, scenario_nums=scenarios)
169
+ )
170
+
159
171
# #
160
172
173
+ plot_callback (kur2, res2_1. u, res2_1. minimum, scenario_nums = scen, xlims = (kur. t_span[2 ]/ 2 , kur. t_span[2 ]))
174
+
175
+ # # Increase number of nodes to 100
176
+
161
177
kur_100 = resample (BAC. rand_fourier_input_generator, kur; n = 100 );
162
178
163
179
p_sys_init_100 = 6. * rand (dim_p) .+ 1.
@@ -168,4 +184,35 @@ p_100 = vcat(p_sys_init, repeat(p_spec_init, 100))
168
184
p_100[1 : dim_p] .= relu .(p_final)
169
185
p_100[dim_p+ 1 : end ] .= repeat (relu .(p_final_specs[1 ]), 100 )
170
186
171
- p_initial_100 = BAC. bac_spec_only (kur_100, p_100)
187
+ # #
188
+ p_initial_100 = BAC. bac_spec_only (kur_100, p_100)
189
+
190
+ # #
191
+ res_100 = DiffEqFlux. sciml_train (
192
+ p -> kur_100 (p, abstol= 1e-4 , reltol= 1e-4 ),
193
+ p_initial_100,
194
+ DiffEqFlux. ADAM (0.1 ),
195
+ maxiters= 50 ,
196
+ cb= basic_bac_callback
197
+ # cb = (p, l) -> plot_callback(kur, p, l, scenario_nums=scenarios)
198
+ )
199
+
200
+ # #
201
+
202
+ plot_callback (kur_100, res_100. u, res_100. minimum, scenario_nums = scen, xlims = (kur. t_span[2 ]/ 2 , kur. t_span[2 ]))
203
+
204
+ # #
205
+ res_100 = DiffEqFlux. sciml_train (
206
+ p -> kur_100 (p, abstol= 1e-4 , reltol= 1e-4 ),
207
+ res_100. u,
208
+ DiffEqFlux. AMSGrad (0.01 ),
209
+ maxiters= 50 ,
210
+ cb= basic_bac_callback
211
+ # cb = (p, l) -> plot_callback(kur, p, l, scenario_nums=scenarios)
212
+ )
213
+
214
+ # #
215
+
216
+ plot_callback (kur_100, res_100. u, res_100. minimum, scenario_nums = scen, xlims = (kur. t_span[2 ]/ 2 , kur. t_span[2 ]))
217
+
218
+ # #
0 commit comments