diff --git a/src/IntervalArithmetic.jl b/src/IntervalArithmetic.jl index e35faeea0..72a4234ed 100644 --- a/src/IntervalArithmetic.jl +++ b/src/IntervalArithmetic.jl @@ -98,6 +98,9 @@ export export Region +## Overlap function +export + overlap function __init__() @@ -124,6 +127,7 @@ include("plot_recipes/plot_recipes.jl") include("deprecated.jl") + """ Region{T} = Union{Interval{T}, IntervalBox{T}} """ diff --git a/src/decorations/functions.jl b/src/decorations/functions.jl index b45cbf15b..a10bd1dd2 100644 --- a/src/decorations/functions.jl +++ b/src/decorations/functions.jl @@ -365,3 +365,7 @@ for (f, domain) in restricted_functions2 DecoratedInterval(r, trv) end end + +function overlap(xx::DecoratedInterval, yy::DecoratedInterval) where T + return overlap(interval_part(xx) , interval_part(yy)) +end \ No newline at end of file diff --git a/src/intervals/functions.jl b/src/intervals/functions.jl index 5fdf6f0fa..2fa021580 100644 --- a/src/intervals/functions.jl +++ b/src/intervals/functions.jl @@ -327,3 +327,22 @@ end hypot(a::Interval{BigFloat}, b::Interval{BigFloat}) = sqrt(a^2 + b^2) hypot(a::Interval{T}, b::Interval{T}) where T= atomic(Interval{T}, hypot(big53(a), big53(b))) + +function overlap(a::Interval, b::Interval) + isempty(a) && isempty(b) && return "bothEmpty" + isempty(a) && !isempty(b) && return "firstEmpty" + !isempty(a) && isempty(b) && return "secondEmpty" + a.hi < b.lo && return "before" + a.lo < a.hi && a.hi == b.lo && b.lo < b.hi && return "meets" + a.lo < b.lo && b.lo < a.hi && a.hi < b.hi && return "overlaps" + a.lo == b.lo && a.hi < b.hi && return "starts" + b.lo < a.lo && a.hi < b.hi && return "containedBy" + b.lo < a.lo && a.hi == b.hi && return "finishes" + a.lo == b.lo && a.hi == b.hi && return "equals" + a.lo < b.lo && b.hi == a.hi && return "finishedBy" + a.lo < b.lo && b.hi < a.hi && return "contains" + b.lo == a.lo && b.hi < a.hi && return "startedBy" + b.lo < a.lo && a.lo < b.hi && b.hi < a.hi && return "overlappedBy" + b.lo < b.hi && b.hi == a.lo && a.lo < a.hi && return "metBy" + b.hi < a.lo && return "after" +end \ No newline at end of file diff --git a/test/ITF1788_tests/ITF1788_tests.jl b/test/ITF1788_tests/ITF1788_tests.jl index 9dc6c64d4..41b223a19 100644 --- a/test/ITF1788_tests/ITF1788_tests.jl +++ b/test/ITF1788_tests/ITF1788_tests.jl @@ -10,3 +10,4 @@ include("libieeep1788_tests_rev.jl") include("libieeep1788_tests_set.jl") include("mpfi.jl") include("fi_lib.jl") +include("libieeep1788_tests_overlap.jl") diff --git a/test/ITF1788_tests/libieeep1788_tests_overlap.jl b/test/ITF1788_tests/libieeep1788_tests_overlap.jl index e7f2faa4f..8ec8997bb 100644 --- a/test/ITF1788_tests/libieeep1788_tests_overlap.jl +++ b/test/ITF1788_tests/libieeep1788_tests_overlap.jl @@ -1,9 +1,11 @@ #= - Copyright 2013 - 2015 Marco Nehmeier (nehmeier@informatik.uni-wuerzburg.de) - Copyright 2015 Oliver Heimlich (oheim@posteo.de) - Original author: Marco Nehmeier (unit tests in libieeep1788) - Converted into portable ITL format by Oliver Heimlich with minor corrections. + Unit tests from libieeep1788 for the interval overlap operation + (Original author: Marco Nehmeier) + converted into portable ITL format by Oliver Heimlich. + + Copyright 2013-2015 Marco Nehmeier (nehmeier@informatik.uni-wuerzburg.de) + Copyright 2015-2017 Oliver Heimlich (oheim@posteo.de) Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -16,6 +18,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + =# #Language imports @@ -33,10 +36,85 @@ setrounding(Interval, :tight) @format full @testset "minimal_overlap_test" begin - + @test overlap(∅, ∅) == "bothEmpty" + @test overlap(∅, Interval(1.0, 2.0)) == "firstEmpty" + @test overlap(Interval(1.0, 2.0), ∅) == "secondEmpty" + @test overlap(Interval(-Inf, 2.0), Interval(3.0, Inf)) == "before" + @test overlap(Interval(-Inf, 2.0), Interval(3.0, 4.0)) == "before" + @test overlap(Interval(2.0, 2.0), Interval(3.0, 4.0)) == "before" + @test overlap(Interval(1.0, 2.0), Interval(3.0, 4.0)) == "before" + @test overlap(Interval(1.0, 2.0), Interval(3.0, 3.0)) == "before" + @test overlap(Interval(2.0, 2.0), Interval(3.0, 3.0)) == "before" + @test overlap(Interval(2.0, 2.0), Interval(3.0, Inf)) == "before" + @test overlap(Interval(-Inf, 2.0), Interval(2.0, 3.0)) == "meets" + @test overlap(Interval(1.0, 2.0), Interval(2.0, 3.0)) == "meets" + @test overlap(Interval(1.0, 2.0), Interval(2.0, Inf)) == "meets" + @test overlap(Interval(1.0, 2.0), Interval(1.5, 2.5)) == "overlaps" + @test overlap(Interval(1.0, 2.0), Interval(1.0, Inf)) == "starts" + @test overlap(Interval(1.0, 2.0), Interval(1.0, 3.0)) == "starts" + @test overlap(Interval(1.0, 1.0), Interval(1.0, 3.0)) == "starts" + @test overlap(Interval(1.0, 2.0), entireinterval(Float64)) == "containedBy" + @test overlap(Interval(1.0, 2.0), Interval(-Inf, 3.0)) == "containedBy" + @test overlap(Interval(1.0, 2.0), Interval(0.0, 3.0)) == "containedBy" + @test overlap(Interval(2.0, 2.0), Interval(0.0, 3.0)) == "containedBy" + @test overlap(Interval(2.0, 2.0), Interval(0.0, Inf)) == "containedBy" + @test overlap(Interval(1.0, 2.0), Interval(-Inf, 2.0)) == "finishes" + @test overlap(Interval(1.0, 2.0), Interval(0.0, 2.0)) == "finishes" + @test overlap(Interval(2.0, 2.0), Interval(0.0, 2.0)) == "finishes" + @test overlap(Interval(1.0, 2.0), Interval(1.0, 2.0)) == "equals" + @test overlap(Interval(1.0, 1.0), Interval(1.0, 1.0)) == "equals" + @test overlap(Interval(-Inf, 1.0), Interval(-Inf, 1.0)) == "equals" + @test overlap(entireinterval(Float64), entireinterval(Float64)) == "equals" + @test overlap(Interval(3.0, 4.0), Interval(2.0, 2.0)) == "after" + @test overlap(Interval(3.0, 4.0), Interval(1.0, 2.0)) == "after" + @test overlap(Interval(3.0, 3.0), Interval(1.0, 2.0)) == "after" + @test overlap(Interval(3.0, 3.0), Interval(2.0, 2.0)) == "after" + @test overlap(Interval(3.0, Inf), Interval(2.0, 2.0)) == "after" + @test overlap(Interval(2.0, 3.0), Interval(1.0, 2.0)) == "metBy" + @test overlap(Interval(2.0, 3.0), Interval(-Inf, 2.0)) == "metBy" + @test overlap(Interval(1.5, 2.5), Interval(1.0, 2.0)) == "overlappedBy" + @test overlap(Interval(1.5, 2.5), Interval(-Inf, 2.0)) == "overlappedBy" + @test overlap(Interval(1.0, Inf), Interval(1.0, 2.0)) == "startedBy" + @test overlap(Interval(1.0, 3.0), Interval(1.0, 2.0)) == "startedBy" + @test overlap(Interval(1.0, 3.0), Interval(1.0, 1.0)) == "startedBy" + @test overlap(Interval(-Inf, 3.0), Interval(1.0, 2.0)) == "contains" + @test overlap(entireinterval(Float64), Interval(1.0, 2.0)) == "contains" + @test overlap(Interval(0.0, 3.0), Interval(1.0, 2.0)) == "contains" + @test overlap(Interval(0.0, 3.0), Interval(2.0, 2.0)) == "contains" + @test overlap(Interval(-Inf, 2.0), Interval(1.0, 2.0)) == "finishedBy" + @test overlap(Interval(0.0, 2.0), Interval(1.0, 2.0)) == "finishedBy" + @test overlap(Interval(0.0, 2.0), Interval(2.0, 2.0)) == "finishedBy" end @testset "minimal_overlap_dec_test" begin - + @test overlap(DecoratedInterval(∅, trv), DecoratedInterval(∅, trv)) == "bothEmpty" + @test overlap(DecoratedInterval(∅, trv), DecoratedInterval(Interval(1.0, 2.0), com)) == "firstEmpty" + @test overlap(DecoratedInterval(Interval(1.0, 2.0), def), DecoratedInterval(∅, trv)) == "secondEmpty" + @test overlap(DecoratedInterval(Interval(2.0, 2.0), def), DecoratedInterval(Interval(3.0, 4.0), def)) == "before" + @test overlap(DecoratedInterval(Interval(1.0, 2.0), dac), DecoratedInterval(Interval(3.0, 4.0), com)) == "before" + @test overlap(DecoratedInterval(Interval(1.0, 2.0), com), DecoratedInterval(Interval(3.0, 3.0), trv)) == "before" + @test overlap(DecoratedInterval(Interval(2.0, 2.0), trv), DecoratedInterval(Interval(3.0, 3.0), def)) == "before" + @test overlap(DecoratedInterval(Interval(1.0, 2.0), def), DecoratedInterval(Interval(2.0, 3.0), def)) == "meets" + @test overlap(DecoratedInterval(Interval(1.0, 2.0), dac), DecoratedInterval(Interval(1.5, 2.5), def)) == "overlaps" + @test overlap(DecoratedInterval(Interval(1.0, 2.0), def), DecoratedInterval(Interval(1.0, 3.0), com)) == "starts" + @test overlap(DecoratedInterval(Interval(1.0, 1.0), trv), DecoratedInterval(Interval(1.0, 3.0), def)) == "starts" + @test overlap(DecoratedInterval(Interval(1.0, 2.0), def), DecoratedInterval(Interval(0.0, 3.0), dac)) == "containedBy" + @test overlap(DecoratedInterval(Interval(2.0, 2.0), trv), DecoratedInterval(Interval(0.0, 3.0), def)) == "containedBy" + @test overlap(DecoratedInterval(Interval(1.0, 2.0), trv), DecoratedInterval(Interval(0.0, 2.0), com)) == "finishes" + @test overlap(DecoratedInterval(Interval(2.0, 2.0), def), DecoratedInterval(Interval(0.0, 2.0), dac)) == "finishes" + @test overlap(DecoratedInterval(Interval(1.0, 2.0), def), DecoratedInterval(Interval(1.0, 2.0), def)) == "equals" + @test overlap(DecoratedInterval(Interval(1.0, 1.0), dac), DecoratedInterval(Interval(1.0, 1.0), dac)) == "equals" + @test overlap(DecoratedInterval(Interval(3.0, 4.0), trv), DecoratedInterval(Interval(2.0, 2.0), trv)) == "after" + @test overlap(DecoratedInterval(Interval(3.0, 4.0), def), DecoratedInterval(Interval(1.0, 2.0), def)) == "after" + @test overlap(DecoratedInterval(Interval(3.0, 3.0), com), DecoratedInterval(Interval(1.0, 2.0), dac)) == "after" + @test overlap(DecoratedInterval(Interval(3.0, 3.0), def), DecoratedInterval(Interval(2.0, 2.0), trv)) == "after" + @test overlap(DecoratedInterval(Interval(2.0, 3.0), def), DecoratedInterval(Interval(1.0, 2.0), trv)) == "metBy" + @test overlap(DecoratedInterval(Interval(1.5, 2.5), com), DecoratedInterval(Interval(1.0, 2.0), com)) == "overlappedBy" + @test overlap(DecoratedInterval(Interval(1.0, 3.0), dac), DecoratedInterval(Interval(1.0, 2.0), def)) == "startedBy" + @test overlap(DecoratedInterval(Interval(1.0, 3.0), com), DecoratedInterval(Interval(1.0, 1.0), dac)) == "startedBy" + @test overlap(DecoratedInterval(Interval(0.0, 3.0), com), DecoratedInterval(Interval(1.0, 2.0), dac)) == "contains" + @test overlap(DecoratedInterval(Interval(0.0, 3.0), com), DecoratedInterval(Interval(2.0, 2.0), def)) == "contains" + @test overlap(DecoratedInterval(Interval(0.0, 2.0), def), DecoratedInterval(Interval(1.0, 2.0), trv)) == "finishedBy" + @test overlap(DecoratedInterval(Interval(0.0, 2.0), dac), DecoratedInterval(Interval(2.0, 2.0), def)) == "finishedBy" end # FactCheck.exitstatus()