1 /* 2 * gfanlib_polyhedralfan.h 3 * 4 * Created on: Nov 16, 2010 5 * Author: anders 6 */ 7 8 #ifndef GFANLIB_POLYHEDRALFAN_H_INCLUDED 9 #define GFANLIB_POLYHEDRALFAN_H_INCLUDED 10 11 #include <set> 12 #include <list> 13 #include <map> 14 #include "gfanlib_symmetry.h" 15 #include "gfanlib_matrix.h" 16 #include "gfanlib_zcone.h" 17 #include "gfanlib_symmetriccomplex.h" 18 19 namespace gfan{ 20 21 22 typedef std::set<ZCone> PolyhedralConeList; 23 typedef std::list<IntVector> IntVectorList; 24 typedef std::map<int,IntVectorList> IncidenceList; 25 26 class PolyhedralFan; 27 PolyhedralFan refinement(const PolyhedralFan &a, const PolyhedralFan &b, int cutOffDimension=-1, bool allowASingleConeOfCutOffDimension=false); 28 29 /** A PolyhedralFan is simply a collection of canonicalized PolyhedralCones. 30 * It contains no combinatorial information in the sense of a polyhedral complex. 31 * A cone being present in the PolyhedralFan corresponds to the cone and all its facets being present 32 * in the mathematical object. 33 * The intersection of cones in the fan must be a face of both. 34 * In particular all cones in a PolyhedralFan have the same lineality space.*/ 35 class PolyhedralFan 36 { 37 int n; 38 SymmetryGroup symmetries; 39 PolyhedralConeList cones; 40 public: 41 static class PolyhedralFan fullSpace(int n); 42 static class PolyhedralFan facetsOfCone(ZCone const &c); 43 PolyhedralFan(int ambientDimension); 44 PolyhedralFan(SymmetryGroup const &sym); 45 std::string toString(int flags=FPF_default)const; 46 /* Read in a polyhedral fan, but with the cones containing w. If 47 present, only read in cones among coneIndices. If sym is 48 present, read COMPRESSED section and make w containment up to 49 symmetry, taking all elements in the orbit that contains w into 50 the fan. If onlyMaximal is set then only maximal cones are read 51 in. 52 */ 53 int getAmbientDimension()const; 54 int getMaxDimension()const; 55 int getMinDimension()const; 56 // friend PolyhedralFan refinement(const PolyhedralFan &a, const PolyhedralFan &b, int cutOffDimension=-1, bool allowASingleConeOfCutOffDimension=false); 57 ZMatrix getRays(int dim=1);//This can be called for other dimensions than 1. The term "Rays" still makes sense modulo the common linearity space 58 ZMatrix getRelativeInteriorPoints(); 59 void insert(ZCone const &c); 60 void remove(ZCone const &c); 61 void removeAllLowerDimensional(); 62 /** 63 Since the cones stored in a PolyhedralFan are cones of a 64 polyhedral fan, it is possible to identify non maximal cones by 65 just checking containment of relative interior points in other 66 cones. This routine removes all non-maximal cones. 67 */ 68 void removeNonMaximal(); 69 /** 70 Returns the number of cones stored in the fan. This is not the number of cones in the fan in a mathematical sense. 71 */ 72 int size()const; 73 int dimensionOfLinealitySpace()const; 74 void makePure(); 75 bool contains(ZCone const &c)const; 76 /** 77 * For a vector contained in the support of the fan represented by the fan object, this function 78 * computes the cone that contains the vector in its relative interior. 79 */ 80 ZCone coneContaining(ZVector const &v)const; 81 PolyhedralFan facetComplex()const; 82 83 ZMatrix getRaysInPrintingOrder(bool upToSymmetry=false)const; 84 IncidenceList getIncidenceList(SymmetryGroup *sym=0)const; 85 bool isEmpty()const; 86 87 88 /** 89 Computes the link of the face containing w in its relative interior. 90 */ 91 PolyhedralFan link(ZVector const &w)const; 92 PolyhedralFan link(ZVector const &w, SymmetryGroup *sym)const; 93 94 95 96 typedef PolyhedralConeList::const_iterator coneIterator; 97 PolyhedralFan::coneIterator conesBegin()const; 98 PolyhedralFan::coneIterator conesEnd()const; 99 100 101 /** 102 * Converts a PolyhedralFan into a SymmetricComplex. This is used for homology computations, but not for printing yet. 103 */ 104 SymmetricComplex toSymmetricComplex()const; 105 // static PolyhedralFan readFan(string const &filename, bool onlyMaximal=true, IntegerVector *w=0, set<int> const *conesIndice=0, SymmetryGroup const *sym=0, bool readCompressedIfNotSym=false); 106 }; 107 108 109 void addFacesToSymmetricComplex(SymmetricComplex &c, ZCone const &cone, ZMatrix const &facetCandidates, ZMatrix const &generatorsOfLinealitySpace); 110 void addFacesToSymmetricComplex(SymmetricComplex &c, std::set<int> const &indices, ZMatrix const &facetCandidates, int dimension, Integer multiplicity); 111 112 } 113 114 #endif 115