# Cones

## Introduction

Let $\mathbb{F}$ be an ordered field; the default is that $\mathbb{F}=\mathbb{Q}$ is the field of rational numbers and other fields are not yet supported everywhere in the implementation.

A set $C \subseteq \mathbb{F}^n$ is called a *(polyhedral) cone* if it can be written as the set of nonnegative linear combinations of finitely many vectors in $\mathbb{F}^n$. Equivalently, cones can be written as the intersection of finitely many homogeneous linear inequalities.

Any cone is a special case of a polyhedron. Conversely, intersecting a cone with a suitable affine hyperplane yields a polyhedron whose faces are in bijection with the faces of the cone. Going back and forth between polyhedra and their homogenizations, the cones, is a frequent operation. This is one reason for keeping cones as a distinct type.

## Construction

`positive_hull`

— Method`positive_hull([::Type{T} = fmpq,] R::AbstractCollection[RayVector] [, L::AbstractCollection[RayVector]]; non_redundant::Bool = false) where T<:scalar_types`

A polyhedral cone, not necessarily pointed, defined by the positive hull of the rays `R`

, with lineality given by `L`

.

`R`

is given row-wise as representative vectors, with lineality generated by the rows of `L`

, i.e. the cone consists of all positive linear combinations of the rows of `R`

plus all linear combinations of the rows of `L`

.

This is an interior description, analogous to the $V$-representation of a polytope.

Redundant rays are allowed.

**Examples**

To construct the positive orthant as a `Cone`

, you can write:

```
julia> R = [1 0; 0 1];
julia> PO = positive_hull(R)
A polyhedral cone in ambient dimension 2
```

To obtain the upper half-space of the plane:

```
julia> R = [0 1];
julia> L = [1 0];
julia> HS = positive_hull(R, L)
A polyhedral cone in ambient dimension 2
```

`secondary_cone`

— Method`secondary_cone(SOP::SubdivisionOfPoints)`

Return the secondary cone of a subdivision of points, the closure of all the weight vectors inducing the given subdivision of points.

**Examples**

For a non-regular subdivision, the secondary cone can still contain non-trivial weights, but it will not be full-dimensional.

```
julia> moaepts = [4 0 0; 0 4 0; 0 0 4; 2 1 1; 1 2 1; 1 1 2];
julia> moaeimnonreg0 = IncidenceMatrix([[4,5,6],[1,4,2],[2,4,5],[2,3,5],[3,5,6],[1,3,6],[1,4,6]]);
julia> MOAE = SubdivisionOfPoints(moaepts, moaeimnonreg0)
A subdivision of points in ambient dimension 3
julia> C = secondary_cone(MOAE)
A polyhedral cone in ambient dimension 6
julia> dim(C)
4
```

## Auxiliary functions

```@docs ambient*dim(C::Cone) contains(C::Cone, v::AbstractVector) f*vector(C::Cone) hilbert*basis(C::Cone{fmpq}) codim(C::Cone) dim(C::Cone) polarize(C::Cone{T}) where T<:scalar*types intersect(C0::Cone{T}, C1::Cone{T}) where T<:scalar*types is*pointed(C::Cone) is*fulldimensional(C::Cone) lineality*dim(C::Cone) lineality*space(C::Cone{T}) where T<:scalar*types nfacets(C::Cone) nrays(C::Cone) rays(C::Cone{T}) where T<:scalar*types rays*modulo*lineality(C::Cone{T}) where T<:scalar*types