We start by constructing a fan, which consists of a single cone and all of its faces:
i1 : C = posHull matrix {{1,0,0},{0,1,0},{0,0,1}}
o1 = {ambient dimension => 3 }
dimension of lineality space => 0
dimension of the cone => 3
number of facets => 3
number of rays => 3
o1 : Cone
|
i2 : F = fan C
o2 = {ambient dimension => 3 }
number of generating cones => 1
number of rays => 3
top dimension of the cones => 3
o2 : Fan
|
By this, we have already constructed the fan consisting of the positive orthant and all of its faces. The package saves the generating cones of the fan, which can be accessed by:
i3 : maxCones F
o3 = {{ambient dimension => 3 }}
dimension of lineality space => 0
dimension of the cone => 3
number of facets => 3
number of rays => 3
o3 : List
|
Now we could expand the fan by adding more cones, for example the following:
i4 : C1 = posHull matrix {{1,0,0},{1,1,0},{0,0,-1}}
o4 = {ambient dimension => 3 }
dimension of lineality space => 0
dimension of the cone => 3
number of facets => 3
number of rays => 3
o4 : Cone
|
But in this case we can not, because the two cones are not compatible, i.e. their intersection is not a face of each. So, when one tries to add a cone to a fan that is not compatible with one of the generating cones of the fan, the function
addCone gives an error. For two cones one can check if their intersection is a common face by using
commonFace:
i5 : commonFace(C,C1)
o5 = false
|
Since the intersection of both is already computed in this function there is a different function, which also returns the intersection, to save computation time when one needs the intersection afterward anyway:
i6 : (b,C2) = areCompatible(C,C1)
o6 = (false, {ambient dimension => 3 })
dimension of lineality space => 0
dimension of the cone => 2
number of facets => 2
number of rays => 2
o6 : Sequence
|
i7 : rays C2
o7 = | 0 1 |
| 1 1 |
| 0 0 |
3 2
o7 : Matrix ZZ <-- ZZ
|
So we can make the cone compatible and add it to the fan.
i8 : C1 = posHull matrix {{1,0,0},{0,1,0},{0,0,-1}}
o8 = {ambient dimension => 3 }
dimension of lineality space => 0
dimension of the cone => 3
number of facets => 3
number of rays => 3
o8 : Cone
|
i9 : F = addCone(C1,F)
o9 = {ambient dimension => 3 }
number of generating cones => 2
number of rays => 4
top dimension of the cones => 3
o9 : Fan
|
Instead of creating a fan with one cone and then adding more cones, we can also make a fan out of a list of cones:
i10 : C2 = posHull matrix {{-1,0,0},{0,1,0},{0,0,1}};
|
i11 : C3 = posHull matrix {{-1,0,0},{0,1,0},{0,0,-1}};
|
i12 : C4 = posHull matrix {{-1,0,0},{0,-1,0},{0,0,1}};
|
i13 : C5 = posHull matrix {{-1,0,0},{0,-1,0},{0,0,-1}};
|
i14 : F1 = fan {C2,C3,C4,C5}
o14 = {ambient dimension => 3 }
number of generating cones => 4
number of rays => 5
top dimension of the cones => 3
o14 : Fan
|
Furthermore, we could add a list of cones to an existing fan:
i15 : C6 = posHull matrix {{1,0,0},{0,-1,0},{0,0,1}};
|
i16 : C7 = posHull matrix {{1,0,0},{0,-1,0},{0,0,-1}};
|
i17 : F1 = addCone( {C6,C7}, F1)
o17 = {ambient dimension => 3 }
number of generating cones => 6
number of rays => 6
top dimension of the cones => 3
o17 : Fan
|
Finally, we can add a whole fan to another fan:
i18 : F1 = addCone(F,F1)
o18 = {ambient dimension => 3 }
number of generating cones => 8
number of rays => 6
top dimension of the cones => 3
o18 : Fan
|
So,
fan and
addCone are the methods to construct fans ''from scratch'', but there are also methods to get fans directly, for example
normalFan, which constructs the inner normal fan of a polytope.
i19 : P = hypercube 4
o19 = {ambient dimension => 4 }
dimension of lineality space => 0
dimension of polyhedron => 4
number of facets => 8
number of rays => 0
number of vertices => 16
o19 : Polyhedron
|
i20 : F2 = normalFan P
o20 = {ambient dimension => 4 }
number of generating cones => 16
number of rays => 8
top dimension of the cones => 4
o20 : Fan
|
Now we have seen how to construct fans, so we turn to functions on fans, for example the direct product (
directProduct:
i21 : F3 = fan {posHull matrix {{1}},posHull matrix {{-1}}}
o21 = {ambient dimension => 1 }
number of generating cones => 2
number of rays => 2
top dimension of the cones => 1
o21 : Fan
|
i22 : F1 = F3 * F1
o22 = {ambient dimension => 4 }
number of generating cones => 16
number of rays => 8
top dimension of the cones => 4
o22 : Fan
|
The result is in the direct product of the ambient spaces.
Of course, we can check if two fans are the same:
i24 : F1 == F2
o24 = true
|
A bit more on fans can be found in part 2:
Working with fans - Part 2.