|
1 | | -## Solving the rosenbrock problem |
2 | | -Random.seed!(1) |
| 1 | +using PSOGPU, StaticArrays, SciMLBase, Test, LinearAlgebra, Random |
3 | 2 |
|
4 | | -lb = @SArray ones(Float32, N) |
5 | | -lb = -1 * lb |
6 | | -ub = @SArray fill(Float32(10.0), N) |
| 3 | +@testset "Rosenbrock test dimension = $(N)" for N in 2:4 |
7 | 4 |
|
8 | | -function rosenbrock(x, p) |
9 | | - sum(p[2] * (x[i + 1] - x[i]^2)^2 + (p[1] - x[i])^2 for i in 1:(length(x) - 1)) |
10 | | -end |
| 5 | + ## Solving the rosenbrock problem |
| 6 | + Random.seed!(1234) |
| 7 | + lb = @SArray ones(Float32, N) |
| 8 | + lb = -1 * lb |
| 9 | + ub = @SArray fill(Float32(10.0), N) |
| 10 | + |
| 11 | + function rosenbrock(x, p) |
| 12 | + sum(p[2] * (x[i + 1] - x[i]^2)^2 + (p[1] - x[i])^2 for i in 1:(length(x) - 1)) |
| 13 | + end |
11 | 14 |
|
12 | | -x0 = @SArray zeros(Float32, N) |
13 | | -p = @SArray Float32[1.0, 100.0] |
| 15 | + x0 = @SArray zeros(Float32, N) |
| 16 | + p = @SArray Float32[1.0, 100.0] |
14 | 17 |
|
15 | | -array_prob = OptimizationProblem(rosenbrock, |
16 | | - zeros(Float32, N), |
17 | | - Float32[1.0, 100.0]; |
18 | | - lb = lb, |
19 | | - ub = ub) |
| 18 | + array_prob = OptimizationProblem(rosenbrock, |
| 19 | + zeros(Float32, N), |
| 20 | + Float32[1.0, 100.0]; |
| 21 | + lb = lb, |
| 22 | + ub = ub) |
20 | 23 |
|
21 | | -prob = OptimizationProblem(rosenbrock, x0, p; lb = lb, ub = ub) |
| 24 | + prob = OptimizationProblem(rosenbrock, x0, p; lb = lb, ub = ub) |
22 | 25 |
|
23 | | -n_particles = 1000 |
| 26 | + n_particles = 1000 |
24 | 27 |
|
25 | | -sol = solve(array_prob, |
26 | | - ParallelPSOArray(n_particles), |
27 | | - maxiters = 500) |
| 28 | + sol = solve(array_prob, |
| 29 | + ParallelPSOArray(n_particles), |
| 30 | + maxiters = 500) |
28 | 31 |
|
29 | | -@test sol.objective < 1e-4 |
| 32 | + @test sol.objective < 3e-4 |
30 | 33 |
|
31 | | -sol = solve(prob, |
32 | | - SerialPSO(n_particles), |
33 | | - maxiters = 500) |
| 34 | + sol = solve(prob, |
| 35 | + SerialPSO(n_particles), |
| 36 | + maxiters = 600) |
34 | 37 |
|
35 | | -@test sol.objective < 1e-4 |
| 38 | + @test sol.objective < 1e-4 |
36 | 39 |
|
37 | | -lb = @SVector fill(Float32(-Inf), N) |
38 | | -ub = @SVector fill(Float32(Inf), N) |
| 40 | + lb = @SVector fill(Float32(-Inf), N) |
| 41 | + ub = @SVector fill(Float32(Inf), N) |
39 | 42 |
|
40 | | -array_prob = remake(array_prob; lb = lb, ub = ub) |
41 | | -prob = remake(prob; lb = lb, ub = ub) |
| 43 | + array_prob = remake(array_prob; lb = lb, ub = ub) |
| 44 | + prob = remake(prob; lb = lb, ub = ub) |
42 | 45 |
|
43 | | -n_particles = 2000 |
| 46 | + n_particles = 2000 |
44 | 47 |
|
45 | | -sol = solve(array_prob, |
46 | | - ParallelPSOArray(n_particles), |
47 | | - maxiters = 500) |
| 48 | + sol = solve(array_prob, |
| 49 | + ParallelPSOArray(n_particles), |
| 50 | + maxiters = 500) |
48 | 51 |
|
49 | | -@test sol.objective < 1e-4 |
| 52 | + @test sol.objective < 1e-4 |
50 | 53 |
|
51 | | -sol = solve(prob, |
52 | | - SerialPSO(n_particles), |
53 | | - maxiters = 500) |
| 54 | + sol = solve(prob, |
| 55 | + SerialPSO(n_particles), |
| 56 | + maxiters = 500) |
54 | 57 |
|
55 | | -@test sol.objective < 1e-4 |
| 58 | + @test sol.objective < 1e-4 |
56 | 59 |
|
57 | | -array_prob = remake(array_prob; lb = nothing, ub = nothing) |
58 | | -prob = remake(prob; lb = nothing, ub = nothing) |
| 60 | + array_prob = remake(array_prob; lb = nothing, ub = nothing) |
| 61 | + prob = remake(prob; lb = nothing, ub = nothing) |
59 | 62 |
|
60 | | -n_particles = 2000 |
| 63 | + n_particles = 2000 |
61 | 64 |
|
62 | | -sol = solve(array_prob, |
63 | | - ParallelPSOArray(n_particles), |
64 | | - maxiters = 500) |
| 65 | + sol = solve(array_prob, |
| 66 | + ParallelPSOArray(n_particles), |
| 67 | + maxiters = 500) |
65 | 68 |
|
66 | | -@test sol.objective < 1e-4 |
| 69 | + @test sol.objective < 1e-4 |
67 | 70 |
|
68 | | -sol = solve(prob, |
69 | | - SerialPSO(n_particles), |
70 | | - maxiters = 500) |
| 71 | + sol = solve(prob, |
| 72 | + SerialPSO(n_particles), |
| 73 | + maxiters = 500) |
71 | 74 |
|
72 | | -@test sol.objective < 1e-4 |
| 75 | + @test sol.objective < 1e-4 |
| 76 | +end |
0 commit comments