Skip to content

Commit 7a51966

Browse files
author
Jack Dunham
committed
Add Problem as type parameter to SweepIterator
RegionPlan is ommited as this is just vector of kwargs whos type is unimportant
1 parent 5628922 commit 7a51966

File tree

1 file changed

+47
-43
lines changed

1 file changed

+47
-43
lines changed

src/solvers/iterators.jl

Lines changed: 47 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,3 @@
1-
#
2-
# SweepIterator
3-
#
4-
5-
mutable struct SweepIterator
6-
sweep_kws
7-
region_iter
8-
which_sweep::Int
9-
end
10-
11-
problem(S::SweepIterator) = problem(S.region_iter)
12-
13-
Base.length(S::SweepIterator) = length(S.sweep_kws)
14-
15-
function Base.iterate(S::SweepIterator, which=nothing)
16-
if isnothing(which)
17-
sweep_kws_state = iterate(S.sweep_kws)
18-
else
19-
sweep_kws_state = iterate(S.sweep_kws, which)
20-
end
21-
isnothing(sweep_kws_state) && return nothing
22-
current_sweep_kws, next = sweep_kws_state
23-
24-
if !isnothing(which)
25-
S.region_iter = region_iterator(
26-
problem(S.region_iter); sweep=S.which_sweep, current_sweep_kws...
27-
)
28-
end
29-
S.which_sweep += 1
30-
return S.region_iter, next
31-
end
32-
33-
function sweep_iterator(problem, sweep_kws)
34-
region_iter = region_iterator(problem; sweep=1, first(sweep_kws)...)
35-
return SweepIterator(sweep_kws, region_iter, 1)
36-
end
37-
38-
function sweep_iterator(problem, nsweeps::Integer; sweep_kws...)
39-
return sweep_iterator(problem, Iterators.repeated(sweep_kws, nsweeps))
40-
end
41-
421
#
432
# RegionIterator
443
#
@@ -54,10 +13,14 @@ current_region_plan(R::RegionIterator) = R.region_plan[R.which_region]
5413
current_region(R::RegionIterator) = current_region_plan(R)[1]
5514
region_kwargs(R::RegionIterator) = current_region_plan(R)[2]
5615
function previous_region(R::RegionIterator)
57-
R.which_region==1 ? nothing : R.region_plan[R.which_region - 1][1]
16+
return R.which_region == 1 ? nothing : R.region_plan[R.which_region - 1][1]
5817
end
5918
function next_region(R::RegionIterator)
60-
R.which_region==length(R.region_plan) ? nothing : R.region_plan[R.which_region + 1][1]
19+
return if R.which_region == length(R.region_plan)
20+
nothing
21+
else
22+
R.region_plan[R.which_region + 1][1]
23+
end
6124
end
6225
is_last_region(R::RegionIterator) = isnothing(next_region(R))
6326

@@ -98,3 +61,44 @@ end
9861
function region_plan(problem; kws...)
9962
return euler_sweep(state(problem); kws...)
10063
end
64+
65+
#
66+
# SweepIterator
67+
#
68+
69+
mutable struct SweepIterator{Problem}
70+
sweep_kws
71+
region_iter::RegionIterator{Problem}
72+
which_sweep::Int
73+
end
74+
75+
problem(S::SweepIterator) = problem(S.region_iter)
76+
77+
Base.length(S::SweepIterator) = length(S.sweep_kws)
78+
79+
function Base.iterate(S::SweepIterator, which=nothing)
80+
if isnothing(which)
81+
sweep_kws_state = iterate(S.sweep_kws)
82+
else
83+
sweep_kws_state = iterate(S.sweep_kws, which)
84+
end
85+
isnothing(sweep_kws_state) && return nothing
86+
current_sweep_kws, next = sweep_kws_state
87+
88+
if !isnothing(which)
89+
S.region_iter = region_iterator(
90+
problem(S.region_iter); sweep=S.which_sweep, current_sweep_kws...
91+
)
92+
end
93+
S.which_sweep += 1
94+
return S.region_iter, next
95+
end
96+
97+
function sweep_iterator(problem, sweep_kws)
98+
region_iter = region_iterator(problem; sweep=1, first(sweep_kws)...)
99+
return SweepIterator(sweep_kws, region_iter, 1)
100+
end
101+
102+
function sweep_iterator(problem, nsweeps::Integer; sweep_kws...)
103+
return sweep_iterator(problem, Iterators.repeated(sweep_kws, nsweeps))
104+
end

0 commit comments

Comments
 (0)