11using SimpleChains,
22 StaticArrays, OrdinaryDiffEq, SciMLSensitivity, Optimization, OptimizationFlux, Plots
33
4+ # device!(2)
5+ # Get Tesla V100S
46u0 = @SArray Float32[2.0 , 0.0 ]
57datasize = 30
68tspan = (0.0f0 , 1.5f0 )
@@ -23,10 +25,10 @@ p_nn = SimpleChains.init_params(sc)
2325
2426f (u, p, t) = sc (u, p)
2527
26- prob_nn = ODEProblem (f, u0, tspan)
28+ sprob_nn = ODEProblem (f, u0, tspan)
2729
2830function predict_neuralode (p)
29- Array (solve (prob_nn ,
31+ Array (solve (sprob_nn ,
3032 Tsit5 ();
3133 p = p,
3234 saveat = tsteps,
@@ -56,6 +58,8 @@ optprob = Optimization.OptimizationProblem(optf, p_nn)
5658@time res = Optimization. solve (optprob, ADAM (0.05 ), maxiters = 100 )
5759@show res. objective
5860
61+ @benchmark Optimization. solve (optprob, ADAM (0.05 ), maxiters = 100 )
62+
5963# # PSOGPU stuff
6064
6165function nn_fn (u:: T , p, t):: T where {T}
@@ -78,12 +82,15 @@ function loss(u, p)
7882 sum (abs2, data .- pred)
7983end
8084
81- lb = SVector {length(p_static), eltype(p_static)} (fill (eltype (p_static)(- 10 ),
82- length (p_static))... )
83- ub = SVector {length(p_static), eltype(p_static)} (fill (eltype (p_static)(10 ),
84- length (p_static))... )
85+ # lb = SVector{length(p_static), eltype(p_static)}(fill(eltype(p_static)(-10),
86+ # length(p_static))...)
87+ # ub = SVector{length(p_static), eltype(p_static)}(fill(eltype(p_static)(10),
88+ # length(p_static))...)
89+
90+ lb = @SArray fill (Float32 (- Inf ), length (p_static))
91+ ub = @SArray fill (Float32 (Inf ), length (p_static))
8592
86- optprob = OptimizationProblem (loss, prob_nn. p[2 ], (prob_nn, tsteps); lb = lb, ub = ub)
93+ soptprob = OptimizationProblem (loss, prob_nn. p[2 ], (prob_nn, tsteps); lb = lb, ub = ub)
8794
8895using PSOGPU
8996using CUDA
@@ -93,27 +100,58 @@ using Adapt
93100backend = CUDABackend ()
94101
95102# # Initialize Particles
96- gbest, particles = PSOGPU. init_particles (optprob ,
103+ gbest, particles = PSOGPU. init_particles (soptprob ,
97104 ParallelSyncPSOKernel (n_particles; backend = CUDABackend ()),
98105 typeof (prob. u0))
99106
100107gpu_data = adapt (backend,
101108 [SVector {length(prob_nn.u0), eltype(prob_nn.u0)} (@view data[:, i])
102109 for i in 1 : length (tsteps)])
103110
104- gpu_particles = adapt (backend, particles)
105-
106111CUDA. allowscalar (false )
107112
108113function prob_func (prob, gpu_particle)
109114 return remake (prob, p = (prob. p[1 ], gpu_particle. position))
110115end
111116
117+ gpu_particles = adapt (backend, particles)
118+
119+ losses = adapt (backend, ones (eltype (prob. u0), (1 , n_particles)))
120+
121+ solver_cache = (; losses, gpu_particles, gpu_data, gbest)
122+
112123@time gsol = PSOGPU. parameter_estim_ode! (prob_nn,
113- gpu_particles,
114- gbest,
115- gpu_data,
124+ solver_cache,
116125 lb,
117- ub; saveat = tsteps, dt = 0.1f0 , prob_func = prob_func, maxiters = 100 )
126+ ub;
127+ saveat = tsteps,
128+ dt = 0.1f0 ,
129+ prob_func = prob_func,
130+ maxiters = 100 )
131+
132+ @benchmark PSOGPU. parameter_estim_ode! ($ prob_nn,
133+ $ (deepcopy (solver_cache)),
134+ $ lb,
135+ $ ub;
136+ saveat = tsteps,
137+ dt = 0.1f0 ,
138+ prob_func = prob_func,
139+ maxiters = 100 )
140+
141+ @show gsol. best
142+
143+ using Plots
144+
145+ function predict_neuralode (p)
146+ Array (solve (prob_nn, Tsit5 (); p = p, saveat = tsteps))
147+ end
148+
149+ using Plots
150+
151+ plt = scatter (tsteps, data[1 , :], label = " data" )
152+
153+ pred_pso = predict_neuralode ((sc, gsol. position))
154+ scatter! (plt, tsteps, pred[1 , :], label = " PSO prediction" )
118155
119- @show gsol. cost
156+ pred_adam = predict_neuralode ((sc, res. u))
157+ scatter! (plt, tsteps, pred_adam[1 , :], label = " Adam prediction" )
0 commit comments