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 |
To find out more about this cone use for example fVector:
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
|