Polytope in constraint representation (HPolytope)
Convex polytopes are bounded polyhedra. The type HPolytope
represents polytopes. While identical to HPolyhedron
in its representation, HPolytope
instances are assumed to be bounded.
LazySets.HPolytopeModule.HPolytope
— TypeHPolytope{N, VN<:AbstractVector{N}} <: AbstractPolytope{N}
Type that represents a convex polytope in constraint representation, i.e., a bounded set characterized by a finite intersection of half-spaces,
\[P = ⋂_{i = 1}^m H_i,\]
where each $H_i = \{x ∈ ℝ^n : a_i^T x ≤ b_i \}$ is a half-space, $a_i ∈ ℝ^n$ is the normal vector of the $i$-th half-space and $b_i$ is the displacement. It is assumed that $P$ is bounded (see also LazySets.HPolyhedron
, which does not make such an assumption).
Fields
constraints
– vector of linear constraintscheck_boundedness
– (optional, default:false
) flag for checking if the constraints make the polytope bounded; (boundedness is a running assumption for this type)
Notes
A polytope is a bounded polyhedron.
Boundedness is a running assumption for this type. For performance reasons, boundedness is not checked in the constructor by default. We also exploit this assumption, so a boundedness check may not return the answer you would expect.
julia> P = HPolytope([HalfSpace([1.0], 1.0)]); # x <= 1
julia> isbounded(P) # uses the type assumption and does not actually check
true
julia> isbounded(P, false) # performs a real boundedness check
false
Conversion
convert(::Type{HPolytope}, ::LazySet)
Operations
LazySets.API.isbounded
— Functionisbounded(P::HPolytope, [use_type_assumption]::Bool=true)
Determine whether a polytope in constraint representation is bounded.
Input
P
– polytope in constraint representationuse_type_assumption
– (optional, default:true
) flag for ignoring the type assumption that polytopes are bounded
Output
true
if use_type_assumption
is activated. Otherwise, true
iff P
is bounded.
Base.rand
— Methodrand(T::Type{<:LazySet}; [N]::Type{<:Real}=Float64, [dim]::Int=2,
[rng]::AbstractRNG=GLOBAL_RNG, [seed]::Union{Int, Nothing}=nothing
)
Create a random set of the given set type.
Input
T
– set typeN
– (optional, default:Float64
) numeric typedim
– (optional, default: 2) dimensionrng
– (optional, default:GLOBAL_RNG
) random number generatorseed
– (optional, default:nothing
) seed for reseeding
Output
A random set of the given set type.
Base.rand
— MethodExtended help
rand(::Type{HPolytope}; [N]::Type{<:Real}=Float64, [dim]::Int=2,
[rng]::AbstractRNG=GLOBAL_RNG, [seed]::Union{Int, Nothing}=nothing)
Input
num_vertices
– (optional, default:-1
) upper bound on the number of vertices of the polytope (see comment below)
Algorithm
If num_vertices == 0
, we create a fixed infeasible polytope (corresponding to the EmptySet
).
If num_vertices == 1
, we create a random Singleton
and convert it.
If dim == 1
, we create a random Interval
and convert it.
If dim == 2
, we create a random VPolygon
and convert it.
Otherwise, we create a random VPolytope
and convert it (hence also the argument num_vertices
). See rand(::Type{VPolytope})
.
LazySets.API.vertices_list
— Methodvertices_list(P::HPolytope; [backend]=nothing, [prune]::Bool=true)
Return a list of the vertices of a polytope in constraint representation.
Input
P
– polytope in constraint representationbackend
– (optional, default:nothing
) the backend for polyhedral computationsprune
– (optional, default:true
) flag to remove redundant vertices
Output
A list of the vertices.
Algorithm
If the polytope is one-dimensional (resp. two-dimensional), it is converted to an interval (resp. polygon in constraint representation) and then the respective optimized vertices_list
implementation is used.
It is possible to use the Polyhedra
backend in the one- and two-dimensional case as well by passing a backend
.
If the polytope is not two-dimensional, the concrete polyhedra-manipulation library Polyhedra
is used. The actual computation is performed by a given backend; for the default backend used in LazySets
see default_polyhedra_backend(P)
. For further information on the supported backends see Polyhedra's documentation.
The following functionality is shared with HPolyhedron
.
LazySets.API.dim
— Methoddim(X::LazySet)
Compute the ambient dimension of a set.
Input
X
– set
Output
The ambient dimension of the set.
LazySets.API.dim
— MethodExtended help
dim(P::HPoly)
Output
If P
has no constraints, the result is $-1$.
LinearAlgebra.normalize
— Methodnormalize(P::HPoly{N}, p::Real=N(2)) where {N}
Normalize a polyhedron in constraint representation.
Input
P
– polyhedron in constraint representationp
– (optional, default:2
) norm
Output
A new polyhedron in constraint representation whose normal directions $a_i$ are normalized, i.e., such that $‖a_i‖_p = 1$ holds.
LazySets.remove_redundant_constraints
— Methodremove_redundant_constraints(P::HPoly{N}; [backend]=nothing) where {N}
Remove the redundant constraints in a polyhedron in constraint representation.
Input
P
– polyhedronbackend
– (optional, default:nothing
) the backend used to solve the linear program
Output
A polyhedron equivalent to P
but with no redundant constraints, or an empty set if P
is detected to be empty, which may happen if the constraints are infeasible.
Notes
If backend
is nothing
, it defaults to default_lp_solver(N)
.
Algorithm
See remove_redundant_constraints!(::AbstractVector{<:HalfSpace})
for details.
LazySets.remove_redundant_constraints!
— Methodremove_redundant_constraints!(P::HPoly{N}; [backend]=nothing) where {N}
Remove the redundant constraints of a polyhedron in constraint representation; the polyhedron is updated in-place.
Input
P
– polyhedronbackend
– (optional, default:nothing
) the backend used to solve the linear program
Output
true
if the method was successful and the polyhedron P
is modified by removing its redundant constraints, and false
if P
is detected to be empty, which may happen if the constraints are infeasible.
Notes
If backend
is nothing
, it defaults to default_lp_solver(N)
.
Algorithm
See remove_redundant_constraints!(::AbstractVector{<:HalfSpace})
for details.
LazySets.tohrep
— Methodtohrep(P::HPoly)
Return a constraint representation of the given polyhedron in constraint representation (no-op).
Input
P
– polyhedron in constraint representation
Output
The same polyhedron instance.
LazySets.tovrep
— Methodtovrep(P::HPoly; [backend]=default_polyhedra_backend(P))
Transform a polytope in constraint representation to a polytope in vertex representation.
Input
P
– polytope in constraint representationbackend
– (optional, default:default_polyhedra_backend(P)
) the backend for polyhedral computations
Output
A VPolytope
which is a vertex representation of the given polytope in constraint representation.
Notes
The conversion may not preserve the numeric type (e.g., with N == Float32
) depending on the backend. For further information on the supported backends see Polyhedra's documentation.
LazySets.addconstraint!
— Methodaddconstraint!(P::HPoly, constraint::HalfSpace)
Add a linear constraint to a polyhedron in constraint representation.
Input
P
– polyhedron in constraint representationconstraint
– linear constraint to add
Notes
It is left to the user to guarantee that the dimension of all linear constraints is the same.
LazySets.API.ρ
— Methodρ(d::AbstractVector, X::LazySet)
Evaluate the support function of a set in a given direction.
Input
d
– directionX
– set
Output
The evaluation of the support function of X
in direction d
.
Notes
A convenience alias support_function
is also available.
We have the following identity based on the support vector $σ$:
\[ ρ(d, X) = d ⋅ σ(d, X)\]
LazySets.API.ρ
— MethodExtended help
ρ(d::AbstractVector{M}, P::HPoly{N};
solver=default_lp_solver(M, N)) where {M, N}
Input
solver
– (optional, default:default_lp_solver(M, N)
) the backend used to solve the linear program
Output
If P
is unbounded in the given direction, there are two cases:
- If
P
is anHPolytope
, we throw an error. - If
P
is anHPolyedron
, the result isInf
.
LazySets.API.σ
— Methodσ(d::AbstractVector, X::LazySet)
Compute a support vector of a set in a given direction.
Input
d
– directionX
– set
Output
A support vector of X
in direction d
.
Notes
A convenience alias support_vector
is also available.
LazySets.API.σ
— MethodExtended help
σ(d::AbstractVector{M}, P::HPoly{N};
solver=default_lp_solver(M, N) where {M, N}
Input
solver
– (optional, default:default_lp_solver(M, N)
) the backend used to solve the linear program
Output
If P
is unbounded in the given direction, there are two cases:
- If
P
is anHPolytope
, we throw an error. - If
P
is anHPolyedron
, the result contains±Inf
entries.
LazySets.API.translate
— Methodtranslate(X::LazySet, v::AbstractVector)
Compute the translation of a set with a vector.
Input
X
– setv
– vector
Output
A set representing $X + \{v\}$.
LazySets.API.translate
— MethodExtended help
translate(P::HPoly, v::AbstractVector; [share]::Bool=false)
Input
share
– (optional, default:false
) flag for sharing unmodified parts of the original set representation
Notes
The normal vectors of the constraints (vector a
in a⋅x ≤ b
) are shared with the original constraints if share == true
.
LazySets.API.convex_hull
— Methodconvex_hull(P1::HPoly, P2::HPoly;
[backend]=default_polyhedra_backend(P1))
Compute the convex hull of the set union of two polyhedra in constraint representation.
Input
P1
– polyhedronP2
– polyhedronbackend
– (optional, default:default_polyhedra_backend(P1)
) the backend for polyhedral computations
Output
The HPolyhedron
(resp. HPolytope
) obtained by the concrete convex hull of P1
and P2
.
Notes
For performance reasons, it is suggested to use the CDDLib.Library()
backend for the convex_hull
.
For further information on the supported backends see Polyhedra's documentation.
Undocumented implementations:
Inherited from LazySet
:
area
complement
concretize
constraints
convex_hull
copy(::Type{LazySet})
diameter
eltype
eltype
isoperation
norm
radius
rectify
reflect
singleton_list
surface
vertices
affine_map
exponential_map
∈
is_interior_point
linear_map
sample
scale
cartesian_product
exact_sum
≈
==
isequivalent
⊂
minkowski_difference
Inherited from ConvexSet
:
Inherited from AbstractPolyhedron
:
Inherited from AbstractPolytope
: