Skip to content

Commit 37f126e

Browse files
authored
Add methods for IntervalBox previously in IntervalRootFinding (#160)
* Add methods for IntervalBox previously in IntervalRootFinding * Remove a reference to IntervalRootFinding, and fix complex interval test * Implement suggestions of the review * Incorporate a missing suggestion of the review
1 parent 8f399c8 commit 37f126e

File tree

9 files changed

+95
-9
lines changed

9 files changed

+95
-9
lines changed

src/IntervalArithmetic.jl

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@ import Base:
1818
asin, acos, atan, atan2,
1919
sinh, cosh, tanh, asinh, acosh, atanh,
2020
union, intersect, isempty,
21-
convert, promote_rule, eltype,
21+
convert, promote_rule, eltype, size,
2222
BigFloat, float, widen, big,
2323
, , , eps,
2424
floor, ceil, trunc, sign, round,
2525
expm1, log1p,
2626
precision,
27-
isfinite, isnan,
27+
isfinite, isnan, isinf, iszero,
2828
show, showall,
2929
isinteger, setdiff,
3030
parse
@@ -40,9 +40,9 @@ export
4040
@interval, @biginterval, @floatinterval, @make_interval,
4141
diam, radius, mid, mag, mig, hull,
4242
emptyinterval, ∅, ∞, isempty, isinterior, isdisjoint, ,
43-
precedes, strictprecedes, , , , ,
43+
precedes, strictprecedes, , , , , contains_zero,
4444
entireinterval, isentire, nai, isnai, isthin, iscommon, isatomic,
45-
widen, inf, sup,
45+
widen, inf, sup, bisect,
4646
parameters, eps, dist,
4747
pi_interval,
4848
midpoint_radius, interval_from_midpoint_radius,
@@ -88,6 +88,7 @@ end
8888

8989
include("intervals/intervals.jl")
9090
include("multidim/multidim.jl")
91+
include("bisect.jl")
9192
include("decorations/decorations.jl")
9293

9394
include("parsing.jl")

src/bisect.jl

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
2+
const where_bisect = 0.49609375
3+
4+
doc"""
5+
bisect(X::Interval, α=0.49609375)
6+
7+
Split the interval `X` at position α; α=0.5 corresponds to the midpoint.
8+
Returns a tuple of the new intervals.
9+
"""
10+
function bisect(X::Interval, α=where_bisect)
11+
@assert 0 α 1
12+
13+
m = mid(X, α)
14+
15+
return (Interval(X.lo, m), Interval(m, X.hi))
16+
end
17+
18+
doc"""
19+
bisect(X::IntervalBox, α=0.49609375)
20+
21+
Bisect the `IntervalBox` `X` at position α ∈ [0,1] along its longest side.
22+
"""
23+
function bisect(X::IntervalBox, α=where_bisect)
24+
i = indmax(diam.(X)) # find longest side
25+
26+
return bisect(X, i, α)
27+
end
28+
29+
doc"""
30+
bisect(X::IntervalBox, i::Integer, α=0.49609375)
31+
32+
Bisect the `IntervalBox` in side number `i`.
33+
"""
34+
function bisect(X::IntervalBox, i::Integer, α=where_bisect)
35+
36+
x1, x2 = bisect(X[i], α)
37+
38+
X1 = setindex(X, x1, i)
39+
X2 = setindex(X, x2, i)
40+
41+
return (X1, X2)
42+
end

src/intervals/intervals.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ Interval{T}(x) where T = Interval(convert(T, x))
5858

5959
Interval{T}(x::Interval) where T = atomic(Interval{T}, x)
6060

61+
size(x::Interval) = (1,)
62+
63+
6164
"""
6265
is_valid_interval(a::Real, b::Real)
6366

src/intervals/special.jl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ entireinterval(x::Interval{T}) where T<:Real = entireinterval(T)
2222
entireinterval() = entireinterval(precision(Interval)[1])
2323

2424
isentire(x::Interval) = x.lo == -Inf && x.hi == Inf
25+
isinf(x::Interval) = isentire(x)
2526
isunbounded(x::Interval) = x.lo == -Inf || x.hi == Inf
2627

2728

@@ -75,7 +76,10 @@ This occurs when the interval is empty, or when the upper bound equals the lower
7576
"""
7677
isatomic(x::Interval) = isempty(x) || (x.hi == x.lo) || (x.hi == nextfloat(x.lo))
7778

78-
Base.iszero(x::Interval) = iszero(x.lo) && iszero(x.hi)
79+
iszero(x::Interval) = iszero(x.lo) && iszero(x.hi)
80+
81+
contains_zero(X::Interval{T}) where {T} = zero(T) X
82+
7983

8084
# """
8185
# widen(x)

src/multidim/intervalbox.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@ diam(X::IntervalBox) = maximum(diam.(X.v))
7373

7474
emptyinterval(X::IntervalBox{N,T}) where {N,T} = IntervalBox(emptyinterval.(X.v))
7575

76+
isinf(X::IntervalBox) = any(isinf(X))
77+
78+
isinterior(X::IntervalBox{N,T}, Y::IntervalBox{N,T}) where {N,T} = all(isinterior.(X, Y))
79+
80+
contains_zero(X::SVector) = all(contains_zero(X))
81+
contains_zero(X::IntervalBox) = all(contains_zero(X))
7682

7783
import Base
7884
×(a::Interval...) = IntervalBox(a...)

test/interval_tests/bisect.jl

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using IntervalArithmetic
2+
using Base.Test
3+
4+
5+
@testset "`bisect` function" begin
6+
X = 0..1
7+
@test bisect(X, 0.5) == (0..0.5, 0.5..1)
8+
@test bisect(X, 0.25) == (0..0.25, 0.25..1)
9+
10+
@test bisect(X) == (interval(0.0, 0.49609375), interval(0.49609375, 1.0))
11+
12+
X = -..
13+
@test bisect(X, 0.5) == (-..0, 0..∞)
14+
@test bisect(X, 0.75) == (-..0, 0..∞)
15+
16+
X = 1..
17+
@test bisect(X) == (Interval(1, prevfloat(∞)), Interval(prevfloat(∞), ∞))
18+
19+
X = (0..1) × (0..2)
20+
@test bisect(X, 0.5) == ( (0..1) × (0..1), (0..1) × (1..2) )
21+
@test bisect(X, 0.25) == ( (0..1) × (0..0.5), (0..1) × (0.5..2) )
22+
@test bisect(X, 1, 0.5) == ( (0..0.5) × (0..2), (0.5..1) × (0..2) )
23+
@test bisect(X, 1, 0.25) == ( (0..0.25) × (0..2), (0.25..1) × (0..2) )
24+
25+
@test bisect(X) == (IntervalBox(0..1, interval(0.0, 0.9921875)),
26+
IntervalBox(0..1, Interval(0.9921875, 2.0)))
27+
28+
X = (-..∞) × (-..∞)
29+
@test bisect(X) == ( (-..0) × (-..∞), (0..∞) × (-..∞))
30+
end

test/interval_tests/complex.jl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ end
1414

1515
@testset "Complex functions" begin
1616
Z = (3 ± 1e-7) + (4 ± 1e-7)*im
17-
@test sin(Z) == Interval(3.853734949309744, 3.8537411265295543) - Interval(27.016810169394066, 27.016816346613904)*im
18-
17+
@test sin(Z) == complex(sin(real(Z))*cosh(imag(Z)),sinh(imag(Z))*cos(real(Z)))
1918
@test exp(-im * Interval(π)) == Interval(-1.0, -0.9999999999999999) - Interval(1.224646799147353e-16, 1.2246467991473532e-16)*im
2019
end

test/interval_tests/construction.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ using Base.Test
2222

2323
# Naive constructors, with no conversion involved
2424
@test Interval(1) == Interval(1.0, 1.0)
25+
@test size(Interval(1)) == (1,)
2526
@test Interval(big(1)) == Interval(1.0, 1.0)
2627
@test Interval(eu) == Interval(1.0*eu)
2728
@test Interval(1//10) == Interval{Rational{Int}}(1//10, 1//10)

test/interval_tests/intervals.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@ include("loops.jl")
1111
include("parsing.jl")
1212
include("rounding_macros.jl")
1313
include("rounding.jl")
14-
15-
# include("complex.jl")
14+
include("bisect.jl")
15+
include("complex.jl")

0 commit comments

Comments
 (0)