# Working with cones

We start with a cone in 2-space which is the positive hull (posHull) of a given set of rays.
 i1 : R = matrix {{1,1,2},{2,1,1}} o1 = | 1 1 2 | | 2 1 1 | 2 3 o1 : Matrix ZZ <--- ZZ i2 : C = posHull R o2 = {ambient dimension => 2 } dimension of lineality space => 0 dimension of the cone => 2 number of facets => 2 number of rays => 2 o2 : Cone i3 : ambDim C o3 = 2

This gives an overview of the characteristics of the cone. If we want to know more details, we can ask for them.

 i4 : rays C o4 = | 2 1 | | 1 2 | 2 2 o4 : Matrix ZZ <--- ZZ

Using rays we see that (1,1) is not an extremal ray of the cone.

 i5 : HS = halfspaces C o5 = | -1 2 | | 2 -1 | 2 2 o5 : Matrix ZZ <--- ZZ

The function halfspaces gives the defining linear half-spaces, i.e. C is given by all p in the defining linear hyperplanes that satisfy HS*p >= 0. But in this case there are none, so the polyhedron is of full dimension. Furthermore, we can construct the positive hull of a set of rays and a linear subspace.

 i6 : R1 = R || matrix {{0,0,0}} o6 = | 1 1 2 | | 2 1 1 | | 0 0 0 | 3 3 o6 : Matrix ZZ <--- ZZ i7 : LS = matrix {{1},{1},{1}} o7 = | 1 | | 1 | | 1 | 3 1 o7 : Matrix ZZ <--- ZZ i8 : C1 = posHull(R1,LS) o8 = {ambient dimension => 3 } dimension of lineality space => 1 dimension of the cone => 3 number of facets => 2 number of rays => 2 o8 : Cone i9 : rays C1 o9 = | 1 0 | | 0 1 | | -1 -1 | 3 2 o9 : Matrix ZZ <--- ZZ

Note that the rays are given modulo the lineality space. On the other hand we can construct cones as the intersection of linear half-spaces and hyperplanes.

 i10 : HS = transpose R1 o10 = | 1 2 0 | | 1 1 0 | | 2 1 0 | 3 3 o10 : Matrix ZZ <--- ZZ i11 : HP = matrix {{1,1,1}} o11 = | 1 1 1 | 1 3 o11 : Matrix ZZ <--- ZZ i12 : C2 = intersection(HS,HP) o12 = {ambient dimension => 3 } dimension of lineality space => 0 dimension of the cone => 2 number of facets => 2 number of rays => 2 o12 : Cone

This is a two dimensional cone in 3-space with the following rays:

 i13 : rays C2 o13 = | 2 -1 | | -1 2 | | -1 -1 | 3 2 o13 : Matrix ZZ <--- ZZ

If we don't intersect with the hyperplane we get a full dimensional cone.

 i14 : C3 = intersection HS o14 = {ambient dimension => 3 } dimension of lineality space => 1 dimension of the cone => 3 number of facets => 2 number of rays => 2 o14 : Cone i15 : rays C3 o15 = | 2 -1 | | -1 2 | | 0 0 | 3 2 o15 : Matrix ZZ <--- ZZ i16 : linSpace C3 o16 = | 0 | | 0 | | 1 | 3 1 o16 : Matrix ZZ <--- ZZ

Again, the rays are given modulo the lineality space. Also, one can use given cones, for example the positive orthant (posOrthant):

 i17 : C4 = posOrthant 3 o17 = {ambient dimension => 3 } dimension of lineality space => 0 dimension of the cone => 3 number of facets => 3 number of rays => 3 o17 : Cone i18 : rays C4 o18 = | 1 0 0 | | 0 1 0 | | 0 0 1 | 3 3 o18 : Matrix ZZ <--- ZZ

Now that we can construct cones, we can turn to the functions that can be applied to cones. First of all, we can apply the intersection function also to a pair of cones in the same ambient space:

 i19 : C5 = intersection(C1,C2) o19 = {ambient dimension => 3 } dimension of lineality space => 0 dimension of the cone => 2 number of facets => 2 number of rays => 2 o19 : Cone i20 : rays C5 o20 = | 1 0 | | 0 1 | | -1 -1 | 3 2 o20 : Matrix ZZ <--- ZZ

On the other hand, we can take their positive hull by using posHull:

 i21 : C6 = posHull(C1,C2) o21 = {ambient dimension => 3 } dimension of lineality space => 1 dimension of the cone => 3 number of facets => 2 number of rays => 2 o21 : Cone i22 : rays C6 o22 = | 2 -1 | | -1 2 | | -1 -1 | 3 2 o22 : Matrix ZZ <--- ZZ i23 : linSpace C6 o23 = | 1 | | 1 | | 1 | 3 1 o23 : Matrix ZZ <--- ZZ

Furthermore, both functions (intersection and posHull) can be applied to a list containing any number of cones and matrices defining rays and lineality space or linear half-spaces and hyperplanes. These must be in the same ambient space. For example:

 i24 : R2 = matrix {{2,-1},{-1,2},{-1,-1}} o24 = | 2 -1 | | -1 2 | | -1 -1 | 3 2 o24 : Matrix ZZ <--- ZZ i25 : C7 = posHull {R2,C3,C4} o25 = {ambient dimension => 3 } dimension of lineality space => 1 dimension of the cone => 3 number of facets => 2 number of rays => 2 o25 : Cone i26 : rays C7 o26 = | 2 -1 | | -1 2 | | 0 0 | 3 2 o26 : Matrix ZZ <--- ZZ i27 : linSpace C7 o27 = | 0 | | 0 | | 1 | 3 1 o27 : Matrix ZZ <--- ZZ

Since they are all cones their positive hull is the same as their Minkowski sum, so in fact:

 i28 : C6 == C1 + C2 o28 = true

But we can take the Minkowski sum of a cone and a polyhedron. For this, both objects must lie in the same ambient space and the resulting object is then a polyhedron:

 i29 : P = crossPolytope 3 o29 = {ambient dimension => 3 } dimension of lineality space => 0 dimension of polyhedron => 3 number of facets => 8 number of rays => 0 number of vertices => 6 o29 : Polyhedron i30 : P1 = C6 + P o30 = {ambient dimension => 3 } dimension of lineality space => 1 dimension of polyhedron => 3 number of facets => 2 number of rays => 2 number of vertices => 1 o30 : Polyhedron i31 : (vertices P1,rays P1) o31 = (| -1/3 |, | 2 -1 |) | -1/3 | | -1 2 | | 2/3 | | -1 -1 | o31 : Sequence

Furthermore, we can take the direct product (directProduct) of two cones.

 i32 : C8 = C * C1 o32 = {ambient dimension => 5 } dimension of lineality space => 1 dimension of the cone => 5 number of facets => 4 number of rays => 4 o32 : Cone i33 : rays C8 o33 = | 2 1 0 0 | | 1 2 0 0 | | 0 0 1 0 | | 0 0 0 1 | | 0 0 -1 -1 | 5 4 o33 : Matrix ZZ <--- ZZ i34 : linSpace C8 o34 = | 0 | | 0 | | 1 | | 1 | | 1 | 5 1 o34 : Matrix ZZ <--- ZZ

The result is in QQ^5.

 i35 : ambDim C8 o35 = 5

 i36 : fVector C8 o36 = {0, 1, 4, 6, 4, 1} o36 : List

This function gives the number of faces of each dimension, so it has 1 vertex, the origin, 1 line, 4 two dimensional faces and so on. We can access the faces of a certain codimension via faces:

 i37 : L = faces(1,C8) o37 = {{ambient dimension => 5 }, {ambient dimension => 5 dimension of lineality space => 1 dimension of lineality space => dimension of the cone => 4 dimension of the cone => 4 number of facets => 3 number of facets => 3 number of rays => 3 number of rays => 3 ----------------------------------------------------------------------- }, {ambient dimension => 5 }, {ambient dimension => 5 1 dimension of lineality space => 1 dimension of lineality space dimension of the cone => 4 dimension of the cone => 4 number of facets => 3 number of facets => 3 number of rays => 3 number of rays => 3 ----------------------------------------------------------------------- }} => 1 o37 : List i38 : apply(L,rays) o38 = {| 2 0 0 |, | 1 0 0 |, | 2 1 0 |, | 2 1 0 |} | 1 0 0 | | 2 0 0 | | 1 2 0 | | 1 2 0 | | 0 1 0 | | 0 1 0 | | 0 0 1 | | 0 0 0 | | 0 0 1 | | 0 0 1 | | 0 0 0 | | 0 0 1 | | 0 -1 -1 | | 0 -1 -1 | | 0 0 -1 | | 0 0 -1 | o38 : List

We can also check if the cone is smooth:

 i39 : isSmooth C8 o39 = false

Evenmore we can compute the Hilbert basis of the cone with hilbertBasis.

 i40 : L = hilbertBasis C8 o40 = {| 0 |, | 0 |, | 0 |, | -1 |, | 0 |, | -1 |} | 0 | | 0 | | 0 | | -1 | | -1 | | 0 | | 0 | | 0 | | 0 | | -2 | | -2 | | -2 | | 1 | | 2 | | 1 | | 0 | | 0 | | 0 | | 1 | | 1 | | 2 | | 0 | | 0 | | 0 | o40 : List i41 : #L o41 = 6

Finally, there is also a function to compute the dual cone, i.e. the set of all points in the dual space that are positive on the cone.

 i42 : C9 = dualCone C8 o42 = {ambient dimension => 5 } dimension of lineality space => 0 dimension of the cone => 4 number of facets => 4 number of rays => 4 o42 : Cone i43 : rays C9 o43 = | 2 -1 0 0 | | -1 2 0 0 | | 0 0 2 -1 | | 0 0 -1 2 | | 0 0 -1 -1 | 5 4 o43 : Matrix ZZ <--- ZZ