Skip to content

Commit 321a413

Browse files
authored
Merge pull request #36 from SciML/u/fix
Append solve time in solution interface
2 parents cd6c29a + 1bc8c53 commit 321a413

File tree

4 files changed

+32
-25
lines changed

4 files changed

+32
-25
lines changed

README.md

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,19 @@ Supports generic Julia's SciML interface
1111

1212
using PSOGPU, StaticArrays, CUDA
1313

14-
lb = @SArray [-1.0f0, -1.0f0]
15-
ub = @SArray [1.0f0, 1.0f0]
14+
lb = @SArray [-1.0f0, -1.0f0, -1.0f0]
15+
ub = @SArray [10.0f0, 10.0f0, 10.0f0]
1616

1717
function rosenbrock(x, p)
1818
sum(p[2] * (x[i + 1] - x[i]^2)^2 + (p[1] - x[i])^2 for i in 1:(length(x) - 1))
1919
end
2020

21-
x0 = @SArray zeros(Float32, 2)
22-
p = @SArray Float32[2.0, 100.0]
21+
x0 = @SArray zeros(Float32, 3)
22+
p = @SArray Float32[1.0, 100.0]
2323

2424
prob = OptimizationProblem(rosenbrock, x0, p; lb = lb, ub = ub)
2525

26-
## select the no. of particles
27-
n_particles = 100
28-
29-
## initialize particles on the grid and the best current position
30-
gbest, particles = PSOGPU.init_particles(prob, n_particles)
31-
32-
## Offload particles to GPU
33-
particles = cu(particles)
34-
35-
sol = PSOGPU.pso_solve_gpu!(prob, gbest, particles)
36-
37-
sol[].position
26+
sol = solve(prob,
27+
ParallelSyncPSOKernel(1000, backend = CUDA.CUDABackend()),
28+
maxiters = 500)
3829
```

src/ode_pso.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,9 @@ function parameter_estim_ode!(prob::ODEProblem,
5959
backend = get_backend(gpu_particles)
6060
update_states! = PSOGPU._update_particle_states!(backend)
6161

62-
losses = KernelAbstractions.ones(backend, 1, length(gpu_particles))
62+
losses = KernelAbstractions.allocate(backend,
63+
typeof(prob.u0),
64+
(1, length(gpu_particles)))
6365
update_costs! = PSOGPU._update_particle_costs!(backend)
6466

6567
improb = make_prob_compatible(prob)

src/solve.jl

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@ function SciMLBase.__solve(prob::OptimizationProblem,
1111
lb, ub = check_init_bounds(prob)
1212
prob = remake(prob; lb = lb, ub = ub)
1313

14-
gbest, particles = pso_solve(prob, opt, args...; maxiters, kwargs...)
14+
gbest, particles, solve_time = pso_solve(prob, opt, args...; maxiters, kwargs...)
1515
particles_positions = get_pos.(particles)
1616
SciMLBase.build_solution(SciMLBase.DefaultOptimizationCache(prob.f, prob.p), opt,
17-
gbest.position, prob.f(gbest.position, prob.p), original = particles_positions)
17+
gbest.position, prob.f(gbest.position, prob.p), original = particles_positions,
18+
stats = Optimization.OptimizationStats(; time = solve_time))
1819
end
1920

2021
function pso_solve(prob::OptimizationProblem,
@@ -33,34 +34,40 @@ function pso_solve(prob::OptimizationProblem,
3334
gpu_init_gbest = KernelAbstractions.allocate(backend, typeof(init_gbest), (1,))
3435
copyto!(gpu_init_gbest, [init_gbest])
3536

37+
t0 = time()
3638
gbest, particles = vectorized_solve!(prob,
3739
gpu_init_gbest,
3840
gpu_particles,
3941
opt,
4042
Val(opt.global_update),
4143
args...;
4244
kwargs...)
43-
gbest, particles
45+
t1 = time()
46+
gbest, particles, t1 - t0
4447
end
4548

4649
function pso_solve(prob::OptimizationProblem,
4750
opt::ParallelPSOArray,
4851
args...;
4952
kwargs...)
5053
init_gbest, particles = init_particles(prob, opt, typeof(prob.u0))
54+
t0 = time()
5155
gbest, particles = vectorized_solve!(prob,
5256
init_gbest,
5357
particles,
5458
opt,
5559
args...;
5660
kwargs...)
57-
gbest, particles
61+
t1 = time()
62+
gbest, particles, t1 - t0
5863
end
5964

6065
function pso_solve(prob::OptimizationProblem, opt::SerialPSO, args...; kwargs...)
6166
init_gbest, particles = init_particles(prob, opt, typeof(prob.u0))
67+
t0 = time()
6268
gbest, particles = vectorized_solve!(prob, init_gbest, particles, opt; kwargs...)
63-
gbest, particles
69+
t1 = time()
70+
gbest, particles, t1 - t0
6471
end
6572

6673
function pso_solve(prob::OptimizationProblem,
@@ -74,6 +81,13 @@ function pso_solve(prob::OptimizationProblem,
7481
copyto!(gpu_particles, particles)
7582
init_gbest = init_gbest
7683

77-
gbest = vectorized_solve!(prob, init_gbest, gpu_particles, opt, args...; kwargs...)
78-
gbest
84+
t0 = time()
85+
gbest, particles = vectorized_solve!(prob,
86+
init_gbest,
87+
gpu_particles,
88+
opt,
89+
args...;
90+
kwargs...)
91+
t1 = time()
92+
gbest, particles, t1 - t0
7993
end

test/lbfgs.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ l0 = rosenbrock(x0, p)
5757

5858
@time sol = Optimization.solve(prob,
5959
PSOGPU.HybridPSO(; backend = CUDABackend()),
60-
locaL_maxiters = 30)
60+
local_maxiters = 30)
6161
@show sol.objective
6262

6363
@time sol = Optimization.solve(prob,

0 commit comments

Comments
 (0)