Skip to content

Commit 4ed5009

Browse files
committed
try to be more bullet proof for parallelization
1 parent cf7d8ea commit 4ed5009

File tree

3 files changed

+69
-20
lines changed

3 files changed

+69
-20
lines changed

test/runtests.jl

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,38 +9,32 @@ addprocs(np - 1)
99

1010
@everywhere import ADNLPModels
1111

12-
@everywhere const list_problems = intersect(names(ADNLPProblems), names(PureJuMP))
13-
14-
# The problems included should be carefully argumented and issues
15-
# to create them added.
16-
# TODO: tests are limited for JuMP-only problems
17-
@everywhere const list_problems_not_ADNLPProblems = Symbol[]
18-
@everywhere const list_problems_not_PureJuMP = Symbol[]
19-
20-
@everywhere const list_problems_ADNLPProblems = setdiff(list_problems, list_problems_not_ADNLPProblems)
21-
@everywhere const list_problems_PureJuMP = setdiff(list_problems, list_problems_not_PureJuMP)
22-
23-
@test setdiff(union(names(ADNLPProblems), list_problems_not_ADNLPProblems), list_problems) ==
24-
[:ADNLPProblems]
25-
@test setdiff(union(names(PureJuMP), list_problems_not_PureJuMP), list_problems) ==
26-
[:PureJuMP]
27-
28-
@everywhere include("test_utils.jl")
12+
@everywhere include("test-defined-problems.jl")
13+
@everywhere include("test-utils.jl")
2914

3015
@test ndef == OptimizationProblems.PureJuMP.default_nvar
3116
@test ndef == OptimizationProblems.ADNLPProblems.default_nvar
3217

18+
@everywhere function make_ad_nlp(prob::Symbol; simp_backend="")
19+
mod = ADNLPProblems
20+
if !isdefined(mod, prob)
21+
error("Problem $(prob) is not defined in ADNLPProblems on pid $(myid()).")
22+
end
23+
ctor = getfield(mod, prob)
24+
return isempty(simp_backend) ? ctor() : ctor(eval(Meta.parse(simp_backend)))
25+
end
26+
3327
@everywhere function test_one_problem(prob::Symbol)
3428
pb = string(prob)
3529

3630
nvar = OptimizationProblems.eval(Symbol(:get_, prob, :_nvar))()
3731
ncon = OptimizationProblems.eval(Symbol(:get_, prob, :_ncon))()
3832

3933
nlp_ad = if (nvar + ncon < 10000)
40-
eval(Meta.parse("ADNLPProblems.$(prob)()"))
34+
make_ad_nlp(prob)
4135
else
4236
# Avoid SparseADJacobian for too large problem as it requires a lot of memory for CIs
43-
eval(Meta.parse("ADNLPProblems.$(prob)(" * simp_backend * ")"))
37+
make_ad_nlp(prob, simp_backend = simp_backend)
4438
end
4539

4640
@test nlp_ad.meta.name == pb
@@ -62,7 +56,14 @@ addprocs(np - 1)
6256
end
6357

6458
@testset "Test for nls_prob flag for $prob" begin
65-
nls_prob = eval(Meta.parse("ADNLPProblems.$(prob)(use_nls = true)"))
59+
nls_prob = begin
60+
mod = ADNLPProblems
61+
if isdefined(mod, prob)
62+
getfield(mod, prob)(; use_nls = true)
63+
else
64+
nothing
65+
end
66+
end
6667
if (typeof(nls_prob) <: ADNLPModels.ADNLSModel) # if the nls_flag is not supported we ignore the prob
6768
test_in_place_residual(prob, nls_prob)
6869
end

test/test-defined-problems.jl

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
@everywhere function defined_names(mod::Module)
2+
# Exported only (default) + actually defined. Adjust all=true if you prefer.
3+
[n for n in names(mod) if isdefined(mod, n)]
4+
end
5+
6+
@everywhere const list_problems =
7+
intersect(defined_names(ADNLPProblems), defined_names(PureJuMP))
8+
9+
# The problems included should be carefully argumented and issues
10+
# to create them added.
11+
# TODO: tests are limited for JuMP-only problems
12+
@everywhere const list_problems_not_ADNLPProblems = Symbol[]
13+
@everywhere const list_problems_not_PureJuMP = Symbol[]
14+
15+
@everywhere const list_problems_ADNLPProblems =
16+
setdiff(list_problems, list_problems_not_ADNLPProblems)
17+
18+
@everywhere const list_problems_PureJuMP =
19+
setdiff(list_problems, list_problems_not_PureJuMP)
20+
21+
@test setdiff(union(names(ADNLPProblems), list_problems_not_ADNLPProblems), list_problems) ==
22+
[:ADNLPProblems]
23+
@test setdiff(union(names(PureJuMP), list_problems_not_PureJuMP), list_problems) ==
24+
[:PureJuMP]
25+
26+
@everywhere function probe_missing(mod::Module, syms::Vector{Symbol})
27+
missing = Symbol[]
28+
for s in syms
29+
if !isdefined(mod, s)
30+
push!(missing, s)
31+
end
32+
end
33+
return (pid = myid(), missing = missing)
34+
end
35+
36+
probes = @sync begin
37+
for pid in workers()
38+
@async remotecall_fetch(probe_missing, pid, ADNLPProblems, list_problems_ADNLPProblems)
39+
end
40+
end
41+
@info "ADNLPProblems missing per worker" probes
42+
43+
probes = @sync begin
44+
for pid in workers()
45+
@async remotecall_fetch(probe_missing, pid, PureJuMP, list_problems_PureJuMP)
46+
end
47+
end
48+
@info "PureJuMP missing per worker" probes
File renamed without changes.

0 commit comments

Comments
 (0)