Skip to content

Commit 430ed81

Browse files
lbenetKolaru
andcommitted
Avoid generating functions in mince (IntervalBox)
Co-authored-by: Benoît Richard <[email protected]>
1 parent 328b8eb commit 430ed81

File tree

2 files changed

+18
-33
lines changed

2 files changed

+18
-33
lines changed

src/intervals/arithmetic.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -575,7 +575,7 @@ convert(::Type{Integer}, a::Interval) = isinteger(a) ?
575575
Splits `x` in `n` intervals of the same diameter, which are returned
576576
as a vector.
577577
"""
578-
function mince(x::Interval, n)
578+
@inline function mince(x::Interval, n)
579579
nodes = range(x.lo, x.hi, length = n+1)
580580
return Interval.(nodes[1:n], nodes[2:n+1])
581581
end

src/multidim/intervalbox.jl

Lines changed: 17 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -115,45 +115,30 @@ Base.:(==)(x::IntervalBox, y::IntervalBox) = x.v == y.v
115115

116116

117117
"""
118-
mince(x::IntervalBox, n)
118+
mince(x::IntervalBox, n::Int)
119119
120120
Splits `x` in `n` intervals in each dimension of the same diameter. These
121121
intervals are combined in all possible `IntervalBox`-es, which are returned
122122
as a vector.
123123
"""
124-
@generated function mince(x::IntervalBox{N,T}, n) where {N,T}
125-
quote
126-
nodes_matrix = Array{Interval{T},2}(undef, n, N)
127-
for i in 1:N
128-
nodes_matrix[1:n,i] .= mince(x[i], n)
129-
end
130-
131-
nodes = IntervalBox{$N,T}[]
132-
Base.Cartesian.@nloops $N i _->(1:n) begin
133-
Base.Cartesian.@nextract $N ival d->nodes_matrix[i_d, d]
134-
ibox = Base.Cartesian.@ncall $N IntervalBox ival
135-
push!(nodes, ibox)
136-
end
137-
nodes
138-
end
139-
end
124+
@inline mince(x::IntervalBox{N,T}, n::Int) where {N,T} =
125+
mince(x, ntuple(_ -> n, N))
126+
127+
"""
128+
mince(x::IntervalBox, ncuts::::NTuple{N,Int})
129+
130+
Splits `x[i]` in `ncuts[i]` intervals . These intervals are
131+
combined in all possible `IntervalBox`-es, which are returned
132+
as a vector.
133+
"""
134+
@inline function mince(x::IntervalBox{N,T}, ncuts::NTuple{N,Int}) where {N,T}
135+
minced_intervals = [mince(x[i], ncuts[i]) for i in 1:N]
136+
minced_boxes = Vector{IntervalBox{N,T}}(undef, prod(ncuts))
140137

141-
@generated function mince(x::IntervalBox{N,T}, tup::NTuple{N,Int}) where {N,T}
142-
quote
143-
n = maximum(tup)
144-
nodes_matrix = fill(emptyinterval(T), n, N)
145-
for i in 1:N
146-
nodes_matrix[1:tup[i],i] .= mince(x[i], tup[i])
147-
end
148-
149-
nodes = IntervalBox{$N,T}[]
150-
Base.Cartesian.@nloops $N i _->(1:n) begin
151-
Base.Cartesian.@nextract $N ival d->nodes_matrix[i_d, d]
152-
ibox = Base.Cartesian.@ncall $N IntervalBox ival
153-
isempty(ibox) || push!(nodes, ibox)
154-
end
155-
nodes
138+
for (k, cut_indices) in enumerate(CartesianIndices(ncuts))
139+
minced_boxes[k] = IntervalBox([minced_intervals[i][cut_indices[i]] for i in 1:N])
156140
end
141+
return minced_boxes
157142
end
158143

159144

0 commit comments

Comments
 (0)