From ce20b4a70eb7463ae10aa305d1e2786e67448c78 Mon Sep 17 00:00:00 2001 From: schillic Date: Sun, 15 Dec 2024 22:11:55 +0100 Subject: [PATCH] revise 'difference' of AbstractHyperrectangle --- src/ConcreteOperations/difference.jl | 10 +++++++++- test/Sets/Hyperrectangle.jl | 11 +++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/ConcreteOperations/difference.jl b/src/ConcreteOperations/difference.jl index 7493b648f7..f987f0a3dd 100644 --- a/src/ConcreteOperations/difference.jl +++ b/src/ConcreteOperations/difference.jl @@ -26,7 +26,15 @@ This implementation uses `IntervalArithmetic.setdiff`. function difference(X::AbstractHyperrectangle, Y::AbstractHyperrectangle) Xib = convert(IA.IntervalBox, X) Yib = convert(IA.IntervalBox, Y) - return UnionSetArray(convert.(Hyperrectangle, IA.setdiff(Xib, Yib))) + list = IA.setdiff(Xib, Yib) + if isempty(list) + N = promote_type(eltype(X), eltype(Y)) + return EmptySet{N}(dim(X)) + elseif length(list) == 1 + return convert(Hyperrectangle, first(list)) + else + return UnionSetArray(convert.(Hyperrectangle, list)) + end end function difference(X::Interval{N}, H::HalfSpace) where {N} diff --git a/test/Sets/Hyperrectangle.jl b/test/Sets/Hyperrectangle.jl index d7182df16d..bd7e610919 100644 --- a/test/Sets/Hyperrectangle.jl +++ b/test/Sets/Hyperrectangle.jl @@ -331,8 +331,15 @@ for N in [Float64, Rational{Int}, Float32] # set difference h = Hyperrectangle(; low=N[0], high=N[1]) - q = Hyperrectangle(; low=N[0], high=N[0.5]) - @test convert(Interval, difference(h, q).array[1]) == Interval(N(0.5), N(1)) + q = Hyperrectangle(; low=N[0], high=N[2]) + @test difference(h, q) == EmptySet{N}(1) + q = Hyperrectangle(; low=N[0], high=N[1//2]) + d = difference(h, q) + @test d isa Hyperrectangle{N} && convert(Interval, d) == Interval(N(1//2), N(1)) + q = Hyperrectangle(N[1//2], N[1//4]) + d = difference(h, q) + @test d isa UnionSetArray{N} + @test ispermutation(convert.(Interval, d.array), [Interval(N(0), N(1//4)), Interval(N(3//4), N(1))]) # concrete projection @test project(Hyperrectangle(N[4, 3, 2, 1], N[8, 7, 6, 5]), [2, 4]) ==