2
* gfanlib_polyhedralfan.cpp
4
* Created on: Nov 16, 2010
9
#include "gfanlib_polyhedralfan.h"
10
#include "gfanlib_polymakefile.h"
15
PolyhedralFan::PolyhedralFan(int ambientDimension):
21
PolyhedralFan::PolyhedralFan(SymmetryGroup const &sym):
22
n(sym.sizeOfBaseSet()),
28
PolyhedralFan PolyhedralFan::fullSpace(int n)
34
ret.cones.insert(temp);
40
PolyhedralFan PolyhedralFan::facetsOfCone(ZCone const &c)
44
PolyhedralFan ret(C.ambientDimension());
46
ZMatrix halfSpaces=C.getFacets();
48
for(int i=0;i<halfSpaces.getHeight();i++)
50
ZMatrix a(0,C.ambientDimension());
51
ZMatrix b(0,C.ambientDimension());
52
b.appendRow(halfSpaces[i]);
53
ZCone N=intersection(ZCone(a,b),c);
61
int PolyhedralFan::getAmbientDimension()const
66
bool PolyhedralFan::isEmpty()const
71
int PolyhedralFan::getMaxDimension()const
73
assert(!cones.empty());
75
return cones.begin()->dimension();
78
int PolyhedralFan::getMinDimension()const
80
assert(!cones.empty());
82
return cones.rbegin()->dimension();
86
PolyhedralFan refinement(const PolyhedralFan &a, const PolyhedralFan &b, int cutOffDimension, bool allowASingleConeOfCutOffDimension)
88
// fprintf(Stderr,"PolyhedralFan refinement: #A=%i #B=%i\n",a.cones.size(),b.cones.size());
90
int numberOfComputedCones=0;
91
bool linealityConeFound=!allowASingleConeOfCutOffDimension;
92
assert(a.getAmbientDimension()==b.getAmbientDimension());
94
PolyhedralFan ret(a.getAmbientDimension());
96
for(PolyhedralConeList::const_iterator A=a.cones.begin();A!=a.cones.end();A++)
97
for(PolyhedralConeList::const_iterator B=b.cones.begin();B!=b.cones.end();B++)
99
PolyhedralCone c=intersection(*A,*B);
100
int cdim=c.dimension();
101
// assert(cdim>=linealitySpaceDimension);
102
bool thisIsLinealityCone=(cutOffDimension>=cdim);
103
if((!thisIsLinealityCone)||(!linealityConeFound))
105
numberOfComputedCones++;
108
linealityConeFound=linealityConeFound || thisIsLinealityCone;
115
// fprintf(Stderr,"Number of skipped cones: %i, lineality cone found: %i\n",conesSkipped,linealityConeFound);
116
// fprintf(Stderr,"Number of computed cones: %i, number of unique cones: %i\n",numberOfComputedCones,ret.cones.size());
123
PolyhedralFan product(const PolyhedralFan &a, const PolyhedralFan &b)
125
PolyhedralFan ret(a.getAmbientDimension()+b.getAmbientDimension());
127
for(PolyhedralConeList::const_iterator A=a.cones.begin();A!=a.cones.end();A++)
128
for(PolyhedralConeList::const_iterator B=b.cones.begin();B!=b.cones.end();B++)
129
ret.insert(product(*A,*B));
135
/*IntegerVectorList PolyhedralFan::getRays(int dim)
137
IntegerVectorList ret;
138
for(PolyhedralConeList::iterator i=cones.begin();i!=cones.end();i++)
140
if(i->dimension()==dim)
141
ret.push_back(i->getRelativeInteriorPoint());
147
/*IntegerVectorList PolyhedralFan::getRelativeInteriorPoints()
149
IntegerVectorList ret;
150
for(PolyhedralConeList::iterator i=cones.begin();i!=cones.end();i++)
152
ret.push_back(i->getRelativeInteriorPoint());
158
/*PolyhedralCone const& PolyhedralFan::highestDimensionalCone()const
160
return *cones.rbegin();
163
void PolyhedralFan::insert(ZCone const &c)
170
void PolyhedralFan::remove(ZCone const &c)
176
void PolyhedralFan::removeAllExcept(int a)
178
PolyhedralConeList::iterator i=cones.begin();
181
if(i==cones.end())return;
185
cones.erase(i,cones.end());
189
void PolyhedralFan::removeAllLowerDimensional()
193
int d=getMaxDimension();
194
PolyhedralConeList::iterator i=cones.begin();
195
while(i!=cones.end() && i->dimension()==d)i++;
196
cones.erase(i,cones.end());
201
PolyhedralFan PolyhedralFan::facetComplex()const
203
// fprintf(Stderr,"Computing facet complex...\n");
204
PolyhedralFan ret(n);
206
for(PolyhedralConeList::iterator i=cones.begin();i!=cones.end();i++)
208
PolyhedralFan a=facetsOfCone(*i);
209
for(PolyhedralConeList::const_iterator j=a.cones.begin();j!=a.cones.end();j++)
212
// fprintf(Stderr,"Done computing facet complex.\n");
218
PolyhedralFan PolyhedralFan::fullComplex()const
220
PolyhedralFan ret=*this;
224
log2 debug<<"looping";
226
PolyhedralFan facets=ret.facetComplex();
227
log2 debug<<"number of facets"<<facets.size()<<"\n";
228
for(PolyhedralConeList::const_iterator i=facets.cones.begin();i!=facets.cones.end();i++)
229
if(!ret.contains(*i))
242
PolyhedralFan PolyhedralFan::facetComplexSymmetry(SymmetryGroup const &sym, bool keepRays, bool dropLinealitySpace)const
244
log1 fprintf(Stderr,"Computing facet complex...\n");
245
PolyhedralFan ret(n);
247
vector<IntegerVector> relIntTable;
248
vector<int> dimensionTable;
251
for(PolyhedralConeList::iterator i=cones.begin();i!=cones.end();i++)
252
if(i->dimension()==i->dimensionOfLinealitySpace()+1)
254
relIntTable.push_back(i->getRelativeInteriorPoint());
255
dimensionTable.push_back(i->dimension());
259
for(PolyhedralConeList::iterator i=cones.begin();i!=cones.end();i++)
261
int iDim=i->dimension();
262
if(dropLinealitySpace && (i->dimension()==i->dimensionOfLinealitySpace()+1))continue;
265
IntegerVectorList normals=i->getHalfSpaces();
266
for(IntegerVectorList::const_iterator j=normals.begin();j!=normals.end();j++)
268
bool alreadyInRet=false;
269
for(int l=0;l<relIntTable.size();l++)
271
if(dimensionTable[l]==iDim-1)
272
for(SymmetryGroup::ElementContainer::const_iterator k=sym.elements.begin();k!=sym.elements.end();k++)
274
IntegerVector u=SymmetryGroup::compose(*k,relIntTable[l]);
275
if((dotLong(*j,u)==0) && (i->contains(u)))
285
IntegerVectorList equations=i->getEquations();
286
IntegerVectorList inequalities=i->getHalfSpaces();
287
equations.push_back(*j);
288
PolyhedralCone c(inequalities,equations,n);
291
relIntTable.push_back(c.getRelativeInteriorPoint());
292
dimensionTable.push_back(c.dimension());
296
log1 fprintf(Stderr,"Done computing facet complex.\n");
303
ZMatrix PolyhedralFan::getRaysInPrintingOrder(bool upToSymmetry)const
306
* The ordering changed in this version. Previously the orbit representatives stored in "rays" were
307
* just the first extreme ray from the orbit that appeared. Now it is gotten using "orbitRepresentative"
308
* which causes the ordering in which the different orbits appear to change.
311
if(cones.empty())return ZMatrix(0,n);
312
ZMatrix generatorsOfLinealitySpace=cones.begin()->generatorsOfLinealitySpace();//all cones have the same lineality space
314
std::set<ZVector> rays;//(this->getAmbientDimension());
315
// log1 fprintf(Stderr,"Computing rays of %i cones\n",cones.size());
316
for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++)
318
ZMatrix temp=i->extremeRays(&generatorsOfLinealitySpace);
320
for(int j=0;j<temp.getHeight();j++)
321
rays.insert(symmetries.orbitRepresentative(temp[j]));
323
ZMatrix ret(0,getAmbientDimension());
325
for(set<ZVector>::const_iterator i=rays.begin();i!=rays.end();i++)ret.appendRow(*i);
327
for(set<ZVector>::const_iterator i=rays.begin();i!=rays.end();i++)
329
set<ZVector> thisOrbitsRays;
330
for(SymmetryGroup::ElementContainer::const_iterator k=symmetries.elements.begin();k!=symmetries.elements.end();k++)
332
ZVector temp=k->apply(*i);
333
thisOrbitsRays.insert(temp);
336
for(set<ZVector>::const_iterator i=thisOrbitsRays.begin();i!=thisOrbitsRays.end();i++)ret.appendRow(*i);
343
/*MARKS CONES AS NONMAXIMAL IN THE SYMMETRIC COMPLEX IN WHICH THEY WILL BE INSERTED -not to be confused with the facet testing in the code
345
static list<SymmetricComplex::Cone> computeFacets(SymmetricComplex::Cone const &theCone, ZMatrix const &rays, ZMatrix const &facetCandidates, SymmetricComplex const &theComplex/*, int linealityDim*/)
347
set<SymmetricComplex::Cone> ret;
349
for(int i=0;i<facetCandidates.getHeight();i++)
354
for(int j=0;j<theCone.indices.size();j++)
355
if(dot(rays[theCone.indices[j]],facetCandidates[i]).sign()==0)
356
indices.insert(theCone.indices[j]);
360
SymmetricComplex::Cone temp(indices,theCone.dimension-1,Integer(),false,theComplex);
361
/* temp.multiplicity=0;
362
temp.dimension=theCone.dimension-1;
363
temp.setIgnoreSymmetry(true);
365
if(notAll)ret.insert(temp);
368
// fprintf(Stderr,"HEJ!!!!\n");
370
list<SymmetricComplex::Cone> ret2;
371
for(set<SymmetricComplex::Cone>::const_iterator i=ret.begin();i!=ret.end();i++)
375
/* if(i->indices.size()+linealityDim<i->dimension)//#3
378
for(set<SymmetricComplex::Cone>::const_iterator j=ret.begin();j!=ret.end();j++)
379
if(i!=j && i->isSubsetOf(*j))
386
SymmetricComplex::Cone temp(i->indexSet(),i->dimension,i->multiplicity,true,theComplex);
387
temp.setKnownToBeNonMaximal(); // THIS IS WHERE WE SET THE CONES NON-MAXIMAL FLAG
388
// temp.setIgnoreSymmetry(false);
389
ret2.push_back(temp);
395
void addFacesToSymmetricComplex(SymmetricComplex &c, ZCone const &cone, ZMatrix const &facetCandidates, ZMatrix const &generatorsOfLinealitySpace)
397
ZMatrix const &rays=c.getVertices();
398
std::set<int> indices;
400
// for(int j=0;j<rays.getHeight();j++)if(cone.contains(rays[j]))indices.insert(j);
402
ZMatrix l=cone.extremeRays(&generatorsOfLinealitySpace);
403
for(int i=0;i<l.getHeight();i++)indices.insert(c.indexOfVertex(l[i]));
405
addFacesToSymmetricComplex(c,indices,facetCandidates,cone.dimension(),cone.getMultiplicity());
408
void addFacesToSymmetricComplex(SymmetricComplex &c, std::set<int> const &indices, ZMatrix const &facetCandidates, int dimension, Integer multiplicity)
410
ZMatrix const &rays=c.getVertices();
411
list<SymmetricComplex::Cone> clist;
413
SymmetricComplex::Cone temp(indices,dimension,multiplicity,true,c);
414
// temp.dimension=cone.dimension();
415
// temp.multiplicity=cone.getMultiplicity();
416
clist.push_back(temp);
419
// int linealityDim=cone.dimensionOfLinealitySpace();
421
while(!clist.empty())
423
SymmetricComplex::Cone &theCone=clist.front();
425
if(!c.contains(theCone))
429
// log0 fprintf(Stderr,"ADDING\n");
430
list<SymmetricComplex::Cone> facets=computeFacets(theCone,rays,facetCandidates,c/*,linealityDim*/);
431
clist.splice(clist.end(),facets);
440
Produce strings that express the vectors in terms of rays of the fan modulo the lineality space. Symmetry is ignored??
442
vector<string> PolyhedralFan::renamingStrings(IntegerVectorList const &theVectors, IntegerVectorList const &originalRays, IntegerVectorList const &linealitySpace, SymmetryGroup *sym)const
445
for(IntegerVectorList::const_iterator i=theVectors.begin();i!=theVectors.end();i++)
447
for(PolyhedralConeList::const_iterator j=cones.begin();j!=cones.end();j++)
451
vector<int> relevantIndices;
452
IntegerVectorList relevantRays=linealitySpace;
454
for(IntegerVectorList::const_iterator k=originalRays.begin();k!=originalRays.end();k++,K++)
457
relevantIndices.push_back(K);
458
relevantRays.push_back(*k);
461
FieldMatrix LFA(Q,relevantRays.size(),n);
463
for(IntegerVectorList::const_iterator j=relevantRays.begin();j!=relevantRays.end();j++,J++)
464
LFA[J]=integerVectorToFieldVector(*j,Q);
465
FieldVector LFB=concatenation(integerVectorToFieldVector(*i,Q),FieldVector(Q,relevantRays.size()));
466
LFA=LFA.transposed();
467
FieldVector LFX=LFA.solver().canonicalize(LFB);
469
if(LFX.subvector(0,n).isZero())
472
FieldVector S=LFX.subvector(n+linealitySpace.size(),LFX.size());
473
for(int k=0;k<S.size();k++)
475
s<<"+"<<S[k].toString()<<"*["<<relevantIndices[k]<<"] ";
477
ret.push_back(s.str());
486
SymmetricComplex PolyhedralFan::toSymmetricComplex()const
489
ZMatrix rays=getRaysInPrintingOrder();
491
ZMatrix generatorsOfLinealitySpace=cones.empty()?ZMatrix::identity(getAmbientDimension()):cones.begin()->generatorsOfLinealitySpace();
492
std::cerr<<generatorsOfLinealitySpace;
493
SymmetricComplex symCom(rays,generatorsOfLinealitySpace,symmetries);
496
for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++)
500
// log1 fprintf(Stderr,"Adding faces of cone %i\n",t++);
502
// log2 fprintf(Stderr,"Dim: %i\n",i->dimension());
504
addFacesToSymmetricComplex(symCom,*i,i->getFacets(),generatorsOfLinealitySpace);
507
// log1 cerr<<"Remapping";
509
// log1 cerr<<"Done remapping";
513
std::string PolyhedralFan::toString(int flags)const
514
//void PolyhedralFan::printWithIndices(class Printer *p, bool printMultiplicities, SymmetryGroup *sym, bool group, bool ignoreCones, bool xml, bool tPlaneSort, vector<string> const *comments)const
518
for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++)
524
PolymakeFile polymakeFile;
525
polymakeFile.create("NONAME","PolyhedralFan","PolyhedralFan",flags&FPF_xml);
527
// if(!sym)sym=&symm;
531
// p->printString("Polyhedral fan is empty. Printing not supported.\n");
532
ret<<"Polyhedral fan is empty. Printing not supported.\n";
536
int h=cones.begin()->dimensionOfLinealitySpace();
538
// log1 fprintf(Stderr,"Computing rays.\n");
539
ZMatrix rays=getRaysInPrintingOrder();
541
SymmetricComplex symCom(rays,cones.begin()->generatorsOfLinealitySpace(),symmetries);
543
polymakeFile.writeCardinalProperty("AMBIENT_DIM",n);
544
polymakeFile.writeCardinalProperty("DIM",getMaxDimension());
545
polymakeFile.writeCardinalProperty("LINEALITY_DIM",h);
546
polymakeFile.writeMatrixProperty("RAYS",rays,true,comments);
547
polymakeFile.writeCardinalProperty("N_RAYS",rays.size());
548
IntegerVectorList linealitySpaceGenerators=highestDimensionalCone().linealitySpace().dualCone().getEquations();
549
polymakeFile.writeMatrixProperty("LINEALITY_SPACE",rowsToIntegerMatrix(linealitySpaceGenerators,n));
550
polymakeFile.writeMatrixProperty("ORTH_LINEALITY_SPACE",rowsToIntegerMatrix(highestDimensionalCone().linealitySpace().getEquations(),n));
552
if(flags & FPF_primitiveRays)
554
ZMatrix primitiveRays;
555
for(IntegerVectorList::const_iterator i=rays.begin();i!=rays.end();i++)
556
for(PolyhedralConeList::const_iterator j=cones.begin();j!=cones.end();j++)
557
if(j->contains(*i)&&(j->dimensionOfLinealitySpace()+1==j->dimension()))
558
primitiveRays.push_back(j->semiGroupGeneratorOfRay());
560
polymakeFile.writeMatrixProperty("PRIMITIVE_RAYS",rowsToIntegerMatrix(primitiveRays,n));
564
ZMatrix generatorsOfLinealitySpace=cones.begin()->generatorsOfLinealitySpace();
566
log1 fprintf(Stderr,"Building symmetric complex.\n");
567
for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++)
571
// log1 fprintf(Stderr,"Adding faces of cone %i\n",t++);
573
// log2 fprintf(Stderr,"Dim: %i\n",i->dimension());
575
addFacesToSymmetricComplex(symCom,*i,i->getHalfSpaces(),generatorsOfLinealitySpace);
578
// log1 cerr<<"Remapping";
580
// log1 cerr<<"Done remapping";
583
PolyhedralFan f=*this;
585
// log1 fprintf(Stderr,"Computing f-vector.\n");
586
ZVector fvector=symCom.fvector();
587
polymakeFile.writeCardinalVectorProperty("F_VECTOR",fvector);
588
// log1 fprintf(Stderr,"Done computing f-vector.\n");
590
if(flags&FPF_boundedInfo)
592
// log1 fprintf(Stderr,"Computing bounded f-vector.\n");
593
ZVector fvectorBounded=symCom.fvector(true);
594
polymakeFile.writeCardinalVectorProperty("F_VECTOR_BOUNDED",fvectorBounded);
595
// log1 fprintf(Stderr,"Done computing bounded f-vector.\n");
600
for(int i=0;i<fvector.size();i++,mul*=-1)euler+=Integer(mul)*fvector[i];
601
polymakeFile.writeCardinalProperty("MY_EULER",euler);
604
// log1 fprintf(Stderr,"Checking if complex is simplicial and pure.\n");
605
polymakeFile.writeCardinalProperty("SIMPLICIAL",symCom.isSimplicial());
606
polymakeFile.writeCardinalProperty("PURE",symCom.isPure());
607
// log1 fprintf(Stderr,"Done checking.\n");
610
if(flags&FPF_conesCompressed)
612
// log1 fprintf(Stderr,"Producing list of cones up to symmetry.\n");
613
polymakeFile.writeStringProperty("CONES_ORBITS",symCom.toString(symCom.getMinDim(),symCom.getMaxDim(),false,flags&FPF_group,0,true,flags&FPF_tPlaneSort));
614
// log1 fprintf(Stderr,"Done producing list of cones up to symmetry.\n");
615
// log1 fprintf(Stderr,"Producing list of maximal cones up to symmetry.\n");
616
stringstream multiplicities;
617
polymakeFile.writeStringProperty("MAXIMAL_CONES_ORBITS",symCom.toString(symCom.getMinDim(),symCom.getMaxDim(),true,flags&FPF_group, &multiplicities,true,flags&FPF_tPlaneSort));
618
if(flags&FPF_multiplicities)polymakeFile.writeStringProperty("MULTIPLICITIES_ORBITS",multiplicities.str());
619
// log1 fprintf(Stderr,"Done producing list of maximal cones up to symmetry.\n");
622
if(flags&FPF_conesExpanded)
626
// log1 fprintf(Stderr,"Producing list of cones.\n");
627
polymakeFile.writeStringProperty("CONES",symCom.toString(symCom.getMinDim(),symCom.getMaxDim(),false,flags&FPF_group,0,false,flags&FPF_tPlaneSort));
628
// log1 fprintf(Stderr,"Done producing list of cones.\n");
630
if(flags&FPF_maximalCones)
632
// log1 fprintf(Stderr,"Producing list of maximal cones.\n");
633
stringstream multiplicities;
634
polymakeFile.writeStringProperty("MAXIMAL_CONES",symCom.toString(symCom.getMinDim(),symCom.getMaxDim(),true,flags&FPF_group, &multiplicities,false,flags&FPF_tPlaneSort));
635
if(flags&FPF_multiplicities)polymakeFile.writeStringProperty("MULTIPLICITIES",multiplicities.str());
636
// log1 fprintf(Stderr,"Done producing list of maximal cones.\n");
645
for(int i=0;i<linealitySpaceGenerators.getHeight();i++)
648
v[0]=evaluatePiecewiseLinearFunction(linealitySpaceGenerators[i]);
651
polymakeFile.writeMatrixProperty("LINEALITY_VALUES",rowsToIntegerMatrix(values,1));
655
for(IntegerVectorList::const_iterator i=rays.begin();i!=rays.end();i++)
658
v[0]=evaluatePiecewiseLinearFunction(*i);
661
polymakeFile.writeMatrixProperty("RAY_VALUES",rowsToIntegerMatrix(values,1));
667
// log1 fprintf(Stderr,"Producing final string for output.\n");
669
polymakeFile.writeStream(s);
671
// log1 fprintf(Stderr,"Printing string.\n");
672
p->printString(S.c_str());
673
*/// log1 fprintf(Stderr,"Done printing string.\n");
677
PolyhedralFan PolyhedralFan::readFan(string const &filename, bool onlyMaximal, IntegerVector *w, set<int> const *coneIndices, SymmetryGroup const *sym, bool readCompressedIfNotSym)
680
inFile.open(filename.c_str());
682
int n=inFile.readCardinalProperty("AMBIENT_DIM");
683
int nRays=inFile.readCardinalProperty("N_RAYS");
684
IntegerMatrix rays=inFile.readMatrixProperty("RAYS",nRays,n);
685
int linealityDim=inFile.readCardinalProperty("LINEALITY_DIM");
686
IntegerMatrix linealitySpace=inFile.readMatrixProperty("LINEALITY_SPACE",linealityDim,n);
689
const char *sectionName=0;
690
const char *sectionNameMultiplicities=0;
691
if(sym || readCompressedIfNotSym)
693
sectionName=(onlyMaximal)?"MAXIMAL_CONES_ORBITS":"CONES_ORBITS";
694
sectionNameMultiplicities=(onlyMaximal)?"MULTIPLICITIES_ORBITS":"DUMMY123";
697
{ sectionName=(onlyMaximal)?"MAXIMAL_CONES":"CONES";
698
sectionNameMultiplicities=(onlyMaximal)?"MULTIPLICITIES":"DUMMY123";
705
SymmetryGroup sym2(n);
708
vector<list<int> > cones=inFile.readMatrixIncidenceProperty(sectionName);
711
bool hasMultiplicities=inFile.hasProperty(sectionNameMultiplicities);
712
IntegerMatrix multiplicities(0,0);
713
if(hasMultiplicities)multiplicities=inFile.readMatrixProperty(sectionNameMultiplicities,cones.size(),1);
716
PolyhedralFan ret(n);
718
log2 cerr<< "Number of orbits to expand "<<cones.size()<<endl;
719
for(int i=0;i<cones.size();i++)
720
if(coneIndices==0 || coneIndices->count(i))
722
log2 cerr<<"Expanding symmetries of cone"<<endl;
724
IntegerVectorList coneRays;
725
for(list<int>::const_iterator j=cones[i].begin();j!=cones[i].end();j++)
726
coneRays.push_back((rays[*j]));
727
PolyhedralCone C=PolyhedralCone::givenByRays(coneRays,linealitySpace.getRows(),n);
728
if(hasMultiplicities)C.setMultiplicity(multiplicities[i][0]);
729
for(SymmetryGroup::ElementContainer::const_iterator perm=sym->elements.begin();perm!=sym->elements.end();perm++)
731
if(C.contains(SymmetryGroup::composeInverse(*perm,*w)))
733
PolyhedralCone C2=C.permuted(*perm);
745
IncidenceList PolyhedralFan::getIncidenceList(SymmetryGroup *sym)const //fan must be pure
748
SymmetryGroup symm(n);
750
assert(!cones.empty());
751
int h=cones.begin()->dimensionOfLinealitySpace();
752
IntegerVectorList rays=getRaysInPrintingOrder(sym);
753
PolyhedralFan f=*this;
755
while(f.getMaxDimension()!=h)
758
PolyhedralFan done(n);
759
IntegerVector rayIncidenceCounter(rays.size());
761
for(PolyhedralConeList::const_iterator i=f.cones.begin();i!=f.cones.end();i++)
763
if(!done.contains(*i))
765
for(SymmetryGroup::ElementContainer::const_iterator k=sym->elements.begin();k!=sym->elements.end();k++)
767
PolyhedralCone cone=i->permuted(*k);
768
if(!done.contains(cone))
771
IntegerVector indices(0);
772
for(IntegerVectorList::const_iterator j=rays.begin();j!=rays.end();j++)
774
if(cone.contains(*j))
776
indices.grow(indices.size()+1);
777
indices[indices.size()-1]=rayIndex;
778
rayIncidenceCounter[rayIndex]++;
782
l.push_back(indices);
789
ret[f.getMaxDimension()]=l;
796
void PolyhedralFan::makePure()
798
if(getMaxDimension()!=getMinDimension())removeAllLowerDimensional();
801
bool PolyhedralFan::contains(ZCone const &c)const
803
return cones.count(c);
808
PolyhedralCone PolyhedralFan::coneContaining(ZVector const &v)const
810
for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++)
811
if(i->contains(v))return i->faceContaining(v);
812
debug<<"Vector "<<v<<" not contained in support of fan\n";
817
PolyhedralFan::coneIterator PolyhedralFan::conesBegin()const
819
return cones.begin();
823
PolyhedralFan::coneIterator PolyhedralFan::conesEnd()const
830
PolyhedralFan PolyhedralFan::link(ZVector const &w, SymmetryGroup *sym)const
832
SymmetryGroup symL(n);
835
PolyhedralFan ret(n);
837
for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++)
839
for(SymmetryGroup::ElementContainer::const_iterator perm=sym->elements.begin();perm!=sym->elements.end();perm++)
841
ZVector w2=perm->applyInverse(w);
844
ret.insert(i->link(w2));
851
PolyhedralFan PolyhedralFan::link(ZVector const &w)const
853
PolyhedralFan ret(n);
855
for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++)
859
ret.insert(i->link(w));
866
int PolyhedralFan::size()const
871
int PolyhedralFan::dimensionOfLinealitySpace()const
873
assert(cones.size());//slow!
874
return cones.begin()->dimensionOfLinealitySpace();
880
void PolyhedralFan::removeNonMaximal()
882
for(PolyhedralConeList::iterator i=cones.begin();i!=cones.end();)
884
ZVector w=i->getRelativeInteriorPoint();
885
bool containedInOther=false;
886
for(PolyhedralConeList::iterator j=cones.begin();j!=cones.end();j++)
889
if(j->contains(w)){containedInOther=true;break;}
893
PolyhedralConeList::iterator k=i;