# Working with cones

Every cone can be described via generating rays or via inequalities. The description via rays (or vertices for polyhedra) is often referred to as the V-representation. The description via inequalities is called the H-representation. To create a cone in 2-space which is the positive hull of a given set of rays use coneFromVData:

 i1 : R = matrix {{1,1,2},{2,1,1}} o1 = | 1 1 2 | | 2 1 1 | 2 3 o1 : Matrix ZZ <--- ZZ i2 : C = coneFromVData R o2 = C o2 : Cone i3 : ambDim C o3 = 2

After creating the cone, one can use rays to ask for its minimal rays.

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

We see that (1,1) is not an extremal ray of the cone.

 i5 : HS = facets C o5 = | -1 2 | | 2 -1 | 2 2 o5 : Matrix ZZ <--- ZZ i6 : hyperplanes C o6 = 0 2 o6 : Matrix 0 <--- ZZ i7 : isFullDimensional C o7 = true

The function facets gives the defining linear half-spaces, the H-representation, i.e. C is given by all p in the defining linear hyperplanes that satisfy HS*p >= 0. In this case there are no hyperplanes, so the cone is of full dimension. The rows of the matrix HS are the inner normals of the cone. Furthermore, we can construct the positive hull of a set of rays and a linear subspace.

 i8 : R1 = R || matrix {{0,0,0}} o8 = | 1 1 2 | | 2 1 1 | | 0 0 0 | 3 3 o8 : Matrix ZZ <--- ZZ i9 : LS = matrix {{1},{1},{1}} o9 = | 1 | | 1 | | 1 | 3 1 o9 : Matrix ZZ <--- ZZ i10 : C1 = coneFromVData(R1,LS) o10 = C1 o10 : Cone i11 : rays C1 o11 = | 0 0 | | -1 1 | | -2 -1 | 3 2 o11 : 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. The first argument of coneFromHData takes the inequalities defining the cone, while the second takes equations.

 i12 : HS = transpose R1 o12 = | 1 2 0 | | 1 1 0 | | 2 1 0 | 3 3 o12 : Matrix ZZ <--- ZZ i13 : equations = matrix {{1,1,1}} o13 = | 1 1 1 | 1 3 o13 : Matrix ZZ <--- ZZ i14 : C2 = coneFromHData(HS,equations) o14 = C2 o14 : Cone i15 : dim C2 o15 = 2 i16 : ambDim C2 o16 = 3

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

 i17 : rays C2 o17 = | 2 -1 | | -1 2 | | -1 -1 | 3 2 o17 : Matrix ZZ <--- ZZ

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

 i18 : C3 = coneFromHData HS o18 = C3 o18 : Cone i19 : rays C3 o19 = | 2 -1 | | -1 2 | | 0 0 | 3 2 o19 : Matrix ZZ <--- ZZ i20 : linealitySpace C3 o20 = | 0 | | 0 | | 1 | 3 1 o20 : Matrix ZZ <--- ZZ i21 : isFullDimensional C3 o21 = true

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

 i22 : C4 = posOrthant 3 o22 = C4 o22 : Cone i23 : rays C4 o23 = | 1 0 0 | | 0 1 0 | | 0 0 1 | 3 3 o23 : 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:

 i24 : C5 = intersection(C1,C2) o24 = C5 o24 : Cone i25 : rays C5 o25 = | 1 0 | | 0 1 | | -1 -1 | 3 2 o25 : Matrix ZZ <--- ZZ i26 : dim C5 o26 = 2

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

 i27 : C6 = coneFromVData(C1,C2) o27 = C6 o27 : Cone i28 : rays C6 o28 = | 0 0 | | 1 -1 | | 0 -1 | 3 2 o28 : Matrix ZZ <--- ZZ i29 : linealitySpace C6 o29 = | 1 | | 1 | | 1 | 3 1 o29 : Matrix ZZ <--- ZZ

Furthermore, both functions (coneFromHData and coneFromVData) 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:

 i30 : R2 = matrix {{2,-1},{-1,2},{-1,-1}} o30 = | 2 -1 | | -1 2 | | -1 -1 | 3 2 o30 : Matrix ZZ <--- ZZ i31 : C7 = coneFromVData {R2,C3,C4} o31 = C7 o31 : Cone i32 : rays C7 o32 = | 2 -1 | | -1 2 | | 0 0 | 3 2 o32 : Matrix ZZ <--- ZZ i33 : linealitySpace C7 o33 = | 0 | | 0 | | 1 | 3 1 o33 : Matrix ZZ <--- ZZ

Taking the positive hull of several cones is the same as taking their Minkowski sum, so in fact:

 i34 : C6 == C1 + C2 o34 = true

We can also 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:

 i35 : P = crossPolytope 3 o35 = P o35 : Polyhedron i36 : P1 = C6 + P o36 = P1 o36 : Polyhedron i37 : (vertices P1,rays P1) o37 = (| 0 |, | 0 0 |) | 0 | | 1 -1 | | 1 | | 0 -1 | o37 : Sequence

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

 i38 : C8 = C * C1 o38 = C8 o38 : Cone i39 : rays C8 o39 = | 2 1 0 0 | | 1 2 0 0 | | 0 0 0 0 | | 0 0 -1 1 | | 0 0 -2 -1 | 5 4 o39 : Matrix ZZ <--- ZZ i40 : linealitySpace C8 o40 = | 0 | | 0 | | 1 | | 1 | | 1 | 5 1 o40 : Matrix ZZ <--- ZZ i41 : ambDim C8 o41 = 5

The result is contained in ${\mathbb Q}^5$.

 i42 : ambDim C8 o42 = 5

 i43 : fVector C8 o43 = {0, 1, 4, 6, 4, 1} o43 : 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. The output of faces is a list of list of indices that indicate which rays form a face. The following shows how to get the corresponding rays of the faces.

 i44 : L = faces(1,C8) o44 = {{0, 2, 3}, {1, 2, 3}, {0, 1, 2}, {0, 1, 3}} o44 : List i45 : raysC8 = rays C8 o45 = | 2 1 0 0 | | 1 2 0 0 | | 0 0 0 0 | | 0 0 -1 1 | | 0 0 -2 -1 | 5 4 o45 : Matrix ZZ <--- ZZ i46 : apply(L, l -> raysC8_l) o46 = {| 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 0 0 | | 0 0 0 | | 0 0 0 | | 0 0 0 | | 0 -1 1 | | 0 -1 1 | | 0 0 -1 | | 0 0 1 | | 0 -2 -1 | | 0 -2 -1 | | 0 0 -2 | | 0 0 -1 | o46 : List

We can also check if the cone is smooth:

 i47 : isSmooth C8 o47 = false

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.

 i48 : C9 = dualCone C8 o48 = C9 o48 : Cone i49 : rays C9 o49 = | -1 2 0 0 | | 2 -1 0 0 | | 0 0 -1 2 | | 0 0 2 -1 | | 0 0 -1 -1 | 5 4 o49 : Matrix ZZ <--- ZZ