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