From 8b2a7b0efe35d21d81195d331f0a17b1a6330ee7 Mon Sep 17 00:00:00 2001 From: schillic Date: Sun, 29 Dec 2024 22:45:11 +0100 Subject: [PATCH] merge API's 'distance' with existing methods --- .../lib/interfaces/AbstractHyperrectangle.md | 2 +- docs/src/lib/sets/BallInf.md | 1 + docs/src/lib/sets/HalfSpace.md | 2 +- docs/src/lib/sets/Hyperplane.md | 2 +- docs/src/lib/sets/Hyperrectangle.md | 2 +- docs/src/lib/sets/Line.md | 2 +- src/Interfaces/AbstractHyperrectangle.jl | 20 ++----------------- src/Sets/HalfSpace/distance.jl | 19 ++++-------------- src/Sets/Hyperplane/distance.jl | 19 ++++-------------- src/Sets/Line/distance.jl | 19 +----------------- 10 files changed, 17 insertions(+), 71 deletions(-) diff --git a/docs/src/lib/interfaces/AbstractHyperrectangle.md b/docs/src/lib/interfaces/AbstractHyperrectangle.md index 5e134983e1..74fb856475 100644 --- a/docs/src/lib/interfaces/AbstractHyperrectangle.md +++ b/docs/src/lib/interfaces/AbstractHyperrectangle.md @@ -118,7 +118,6 @@ CurrentModule = LazySets ``` ```@docs volume(::AbstractHyperrectangle) -distance(::AbstractVector, ::AbstractHyperrectangle{N}; ::Real=N(2)) where {N} ``` ```@meta CurrentModule = LazySets.API @@ -239,6 +238,7 @@ CurrentModule = LazySets.API * [`high`](@ref high(::LazySet, ::Int)) * [`low`](@ref low(::LazySet)) * [`low`](@ref low(::LazySet, ::Int)) +* [`distance`](@ref distance(::AbstractVector, ::LazySet)) * [`project`](@ref project(::LazySet, ::AbstractVector{Int})) * [`ρ`](@ref ρ(::AbstractVector, ::LazySet)) * [`cartesian_product`](@ref cartesian_product(::LazySet, ::LazySet)) diff --git a/docs/src/lib/sets/BallInf.md b/docs/src/lib/sets/BallInf.md index 83135396d4..0dd5c56cec 100644 --- a/docs/src/lib/sets/BallInf.md +++ b/docs/src/lib/sets/BallInf.md @@ -166,6 +166,7 @@ Inherited from [`AbstractZonotope`](@ref): Inherited from [`AbstractHyperrectangle`](@ref): * [`constraints_list`](@ref constraints_list(::AbstractHyperrectangle)) +* [`distance`](@ref distance(::AbstractVector, ::AbstractHyperrectangle)) * [`extrema`](@ref extrema(::AbstractHyperrectangle)) * [`extrema`](@ref extrema(::AbstractHyperrectangle, ::Int)) * [`generators`](@ref generators(::AbstractHyperrectangle)) diff --git a/docs/src/lib/sets/HalfSpace.md b/docs/src/lib/sets/HalfSpace.md index b10ea7596c..102d8d79c2 100644 --- a/docs/src/lib/sets/HalfSpace.md +++ b/docs/src/lib/sets/HalfSpace.md @@ -77,7 +77,6 @@ rand(::Type{HalfSpace}) remove_redundant_constraints(::AbstractVector{<:HalfSpace}) remove_redundant_constraints!(::AbstractVector{<:HalfSpace}) tosimplehrep(::AbstractVector{<:HalfSpace}) -distance(::AbstractVector, ::HalfSpace) ``` ```@meta CurrentModule = LazySets.API @@ -170,6 +169,7 @@ Undocumented implementations: * [`isbounded`](@ref isbounded(::LazySet)) * [`isempty`](@ref isempty(::LazySet)) * [`isoperationtype`](@ref isoperationtype(::Type{LazySet})) +* [`distance`](@ref distance(::AbstractVector, ::LazySet)) * [`permute`](@ref permute(::LazySet, ::AbstractVector{Int})) ```@meta diff --git a/docs/src/lib/sets/Hyperplane.md b/docs/src/lib/sets/Hyperplane.md index 547e8233e7..5cc91b516b 100644 --- a/docs/src/lib/sets/Hyperplane.md +++ b/docs/src/lib/sets/Hyperplane.md @@ -67,7 +67,6 @@ CurrentModule = LazySets.HyperplaneModule ``` ```@docs rand(::Type{Hyperplane}) -distance(::AbstractVector, ::Hyperplane) ``` ```@meta CurrentModule = LazySets.API @@ -134,6 +133,7 @@ Undocumented implementations: * [`dim`](@ref dim(::LazySet)) * [`isempty`](@ref isempty(::LazySet)) * [`isoperationtype`](@ref isoperationtype(::Type{LazySet})) +* [`distance`](@ref distance(::AbstractVector, ::LazySet)) * [`project`](@ref project(::LazySet, ::AbstractVector{Int})) * [`isdisjoint`](@ref isdisjoint(::LazySet, ::LazySet)) diff --git a/docs/src/lib/sets/Hyperrectangle.md b/docs/src/lib/sets/Hyperrectangle.md index dfde02cb82..9fe483895a 100644 --- a/docs/src/lib/sets/Hyperrectangle.md +++ b/docs/src/lib/sets/Hyperrectangle.md @@ -146,7 +146,7 @@ Inherited from [`AbstractHyperrectangle`](@ref): * [`reflect`](@ref reflect(::AbstractHyperrectangle)) * [`vertices_list`](@ref vertices_list(::AbstractHyperrectangle)) * [`volume`](@ref volume(::AbstractHyperrectangle)) -* [`distance`](@ref distance(::AbstractVector, ::AbstractHyperrectangle{N}; ::Real=N(2)) where {N}) +* [`distance`](@ref distance(::AbstractVector, ::AbstractHyperrectangle)) * [`∈`](@ref ∈(::AbstractVector, ::AbstractHyperrectangle)) * [`project`](@ref project(::AbstractHyperrectangle, ::AbstractVector{Int})) * [`split`](@ref split(::AbstractHyperrectangle, ::AbstractVector{Int})) diff --git a/docs/src/lib/sets/Line.md b/docs/src/lib/sets/Line.md index 26595decf9..c146b3ca06 100644 --- a/docs/src/lib/sets/Line.md +++ b/docs/src/lib/sets/Line.md @@ -48,7 +48,6 @@ CurrentModule = LazySets.LineModule ``` ```@docs rand(::Type{Line}) -distance(::AbstractVector, ::Line; ::Real=2.0) ``` ```@meta CurrentModule = LazySets.API @@ -86,6 +85,7 @@ Undocumented implementations: * [`isbounded`](@ref isbounded(::LazySet)) * [`isempty`](@ref isempty(::LazySet)) * [`isoperationtype`](@ref isoperationtype(::Type{LazySet})) +* [`distance`](@ref distance(::AbstractVector, ::LazySet)) * [`project`](@ref project(::LazySet, ::AbstractVector{Int})) * [`ρ`](@ref ρ(::AbstractVector, ::LazySet)) * [`σ`](@ref σ(::AbstractVector, ::LazySet)) diff --git a/src/Interfaces/AbstractHyperrectangle.jl b/src/Interfaces/AbstractHyperrectangle.jl index fcdc910c3e..d14cab8a5f 100644 --- a/src/Interfaces/AbstractHyperrectangle.jl +++ b/src/Interfaces/AbstractHyperrectangle.jl @@ -591,24 +591,7 @@ function project(H::AbstractHyperrectangle, block::AbstractVector{Int}; return Hyperrectangle(πc, πr; check_bounds=false) end -""" - distance(x::AbstractVector, H::AbstractHyperrectangle{N}; - [p]::Real=N(2)) where {N} - -Compute the distance between a point `x` and a hyperrectangular set `H` with -respect to the given `p`-norm. - -### Input - -- `x` -- point/vector -- `H` -- hyperrectangular set - -### Output - -A scalar representing the distance between point `x` and hyperrectangle `H`. -""" -@commutative function distance(x::AbstractVector, H::AbstractHyperrectangle{N}; - p::Real=N(2)) where {N} +@commutative function distance(x::AbstractVector, H::AbstractHyperrectangle; p::Real=2) @assert length(x) == dim(H) "a vector of length $(length(x)) is " * "incompatible with a set of dimension $(dim(H))" @@ -631,6 +614,7 @@ A scalar representing the distance between point `x` and hyperrectangle `H`. if !outside # point is inside + N = promote_type(eltype(x), eltype(H)) return zero(N) end diff --git a/src/Sets/HalfSpace/distance.jl b/src/Sets/HalfSpace/distance.jl index 6bce85fe98..642d6e1726 100644 --- a/src/Sets/HalfSpace/distance.jl +++ b/src/Sets/HalfSpace/distance.jl @@ -1,19 +1,8 @@ -""" - distance(x::AbstractVector, H::HalfSpace) +@commutative function distance(x::AbstractVector, H::HalfSpace; p::Real=2) + if p != 2 + throw(ArgumentError("`distance` is only implemented for Euclidean norm")) + end -Compute the distance between point `x` and half-space `H` with respect to the -Euclidean norm. - -### Input - -- `x` -- vector -- `H` -- half-space - -### Output - -A scalar representing the distance between point `x` and half-space `H`. -""" -@commutative function distance(x::AbstractVector, H::HalfSpace) N = promote_type(eltype(x), eltype(H)) a, b = _normalize_halfspace(H, N(2)) return max(dot(x, a) - b, zero(N)) diff --git a/src/Sets/Hyperplane/distance.jl b/src/Sets/Hyperplane/distance.jl index 12682571b0..72c6bb1b1e 100644 --- a/src/Sets/Hyperplane/distance.jl +++ b/src/Sets/Hyperplane/distance.jl @@ -1,19 +1,8 @@ -""" - distance(x::AbstractVector, H::Hyperplane) +@commutative function distance(x::AbstractVector, H::Hyperplane; p::Real=2) + if p != 2 + throw(ArgumentError("`distance` is only implemented for Euclidean norm")) + end -Compute the distance between point `x` and hyperplane `H` with respect to the -Euclidean norm. - -### Input - -- `x` -- vector -- `H` -- hyperplane - -### Output - -A scalar representing the distance between point `x` and hyperplane `H`. -""" -@commutative function distance(x::AbstractVector, H::Hyperplane) N = promote_type(eltype(x), eltype(H)) a, b = _normalize_halfspace(H, N(2)) return abs(dot(x, a) - b) diff --git a/src/Sets/Line/distance.jl b/src/Sets/Line/distance.jl index 480a5e8384..a513e46e66 100644 --- a/src/Sets/Line/distance.jl +++ b/src/Sets/Line/distance.jl @@ -1,21 +1,4 @@ -""" - distance(x::AbstractVector, L::Line; [p]::Real=2.0) - -Compute the distance between point `x` and the line with respect to the given -`p`-norm. - -### Input - -- `x` -- point/vector -- `L` -- line -- `p` -- (optional, default: `2.0`) the `p`-norm used; `p = 2.0` corresponds to - the usual Euclidean norm - -### Output - -A scalar representing the distance between `x` and the line `L`. -""" -@commutative function distance(x::AbstractVector, L::Line; p::Real=2.0) +@commutative function distance(x::AbstractVector, L::Line; p::Real=2) d = L.d # direction of the line t = dot(x - L.p, d) / dot(d, d) return distance(x, L.p + t * d; p=p)