332
426
log1 fprintf(Stderr,"Done computing facet complex.\n");
431
PolyhedralFan PolyhedralFan::facetComplexSymmetry(SymmetryGroup const &sym, bool keepRays, bool dropLinealitySpace)const
433
log1 fprintf(Stderr,"Computing facet complex...\n");
434
PolyhedralFan ret(n);
436
vector<IntegerVector> relIntTable;
437
vector<int> dimensionTable;
440
for(PolyhedralConeList::iterator i=cones.begin();i!=cones.end();i++)
441
if(i->dimension()==i->dimensionOfLinealitySpace()+1)
443
relIntTable.push_back(i->getRelativeInteriorPoint());
444
dimensionTable.push_back(i->dimension());
448
for(PolyhedralConeList::iterator i=cones.begin();i!=cones.end();i++)
450
int iDim=i->dimension();
451
if(dropLinealitySpace && (i->dimension()==i->dimensionOfLinealitySpace()+1))continue;
454
IntegerVectorList normals=i->getHalfSpaces();
455
for(IntegerVectorList::const_iterator j=normals.begin();j!=normals.end();j++)
457
bool alreadyInRet=false;
458
for(int l=0;l<relIntTable.size();l++)
460
if(dimensionTable[l]==iDim-1)
461
for(SymmetryGroup::ElementContainer::const_iterator k=sym.elements.begin();k!=sym.elements.end();k++)
463
IntegerVector u=SymmetryGroup::compose(*k,relIntTable[l]);
464
if((dotLong(*j,u)==0) && (i->contains(u)))
474
IntegerVectorList equations=i->getEquations();
475
IntegerVectorList inequalities=i->getHalfSpaces();
476
equations.push_back(*j);
477
PolyhedralCone c(inequalities,equations,n);
480
relIntTable.push_back(c.getRelativeInteriorPoint());
481
dimensionTable.push_back(c.dimension());
485
log1 fprintf(Stderr,"Done computing facet complex.\n");
337
490
IntegerVectorList PolyhedralFan::getRaysInPrintingOrder(SymmetryGroup *sym)const
603
PolyhedralFan PolyhedralFan::rayComplexSymmetry(SymmetryGroup const &sym)const
605
// log0 fprintf(Stderr,"rayComplexSymmetry - begin\n");
606
PolyhedralFan ret(n);
607
log1 fprintf(Stderr,"Computing rays of %i cones\n",cones.size());
608
for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++)
612
if(!((t++)%10))log1 fprintf(Stderr,"%i\n",t);
614
// log0 fprintf(Stderr,"calling\n");
615
IntegerVectorList rays=i->extremeRays();
616
//log0 fprintf(Stderr,"returning\n");
617
for(IntegerVectorList::const_iterator j=rays.begin();j!=rays.end();j++)
619
bool alreadyInRet=false;
620
for(PolyhedralConeList::const_iterator I=ret.cones.begin();I!=ret.cones.end();I++)
621
for(SymmetryGroup::ElementContainer::const_iterator k=sym.elements.begin();k!=sym.elements.end();k++)
623
IntegerVector u=SymmetryGroup::compose(*k,*j);
631
IntegerVectorList equations=i->getEquations();
632
IntegerVectorList inequalities1=i->getHalfSpaces();
633
IntegerVectorList inequalities2;
634
for(IntegerVectorList::const_iterator k=inequalities1.begin();k!=inequalities1.end();k++)
637
inequalities2.push_back(*k);
639
equations.push_back(*k);
641
PolyhedralCone C(inequalities2,equations,n);
646
// log0 fprintf(Stderr,"rayComplexSymmetry - end\n");
652
IntegerVectorList PolyhedralFan::getRaysInPrintingOrder(SymmetryGroup const *sym)const
654
assert(!cones.empty());
655
int h=cones.begin()->dimensionOfLinealitySpace();
658
PolyhedralFan f=*this;
659
if(f.getMaxDimension()==h)return IntegerVectorList();
660
while(f.getMaxDimension()>h+1)
662
f=f.facetComplexSymmetry(*sym,true,true);
665
PolyhedralFan f=rayComplexSymmetry(*sym);
666
IntegerVectorList rays;
668
log1 fprintf(Stderr,"Number of cones in RayComplex: %i\n",f.cones.size());
670
for(PolyhedralConeList::const_iterator i=f.cones.begin();i!=f.cones.end();i++)
673
log1 fprintf(Stderr,"%i\n",t++);
674
if(i->dimension()!=i->dimensionOfLinealitySpace())//This check is needed since the above while loop may not be run and therefore the lineality space may not have been removed.
677
for(IntegerVectorList::const_iterator j=rays.begin();j!=rays.end();j++)
685
//IntegerVector interiorPointForOrbit=i->getRelativeInteriorPoint();
686
IntegerVector interiorPointForOrbit=stableRay(*i,sym);
687
// PolyhedralFan done(n);
689
//Check that this works:
690
set<IntegerVector> thisOrbitsRays;
692
for(SymmetryGroup::ElementContainer::const_iterator k=sym->elements.begin();k!=sym->elements.end();k++)
694
IntegerVector temp=SymmetryGroup::compose(*k,interiorPointForOrbit);
695
thisOrbitsRays.insert(temp);
697
for(set<IntegerVector>::const_iterator i=thisOrbitsRays.begin();i!=thisOrbitsRays.end();i++)rays.push_back(*i);
699
/* for(SymmetryGroup::ElementContainer::const_iterator k=sym->elements.begin();k!=sym->elements.end();k++)
702
IntegerVector temp=SymmetryGroup::compose(*k,interiorPointForOrbit);
703
for(IntegerVectorList::const_iterator j=rays.begin();j!=rays.end();j++)//REWRITE WITH LOGARITHMIC SEARCH
711
PolyhedralCone cone=i->permuted(*k);
712
rays.push_back(SymmetryGroup::compose(*k,interiorPointForOrbit));
713
// done.insert(cone);
724
//version used until Sep 2010
725
IntegerVectorList PolyhedralFan::getRaysInPrintingOrder(SymmetryGroup const *sym, bool upToSymmetry)const
727
SymmetryGroup localsym(n);
728
if(!sym)sym=&localsym;
729
IntegerVectorList rays;
730
log1 fprintf(Stderr,"Computing rays of %i cones\n",cones.size());
731
for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++)
735
if(!((t++)%10))log1 fprintf(Stderr,"%i\n",t);
737
IntegerVectorList temp=i->extremeRays();
738
// AsciiPrinter(Stderr).printVectorList(temp);
740
for(IntegerVectorList::const_iterator j=temp.begin();j!=temp.end();j++)
742
IntegerVectorList equations=i->getEquations();
743
IntegerVectorList inequalities1=i->getHalfSpaces();
744
IntegerVectorList inequalities2;
745
for(IntegerVectorList::const_iterator k=inequalities1.begin();k!=inequalities1.end();k++)
748
inequalities2.push_back(*k);
750
equations.push_back(*k);
753
for(IntegerVectorList::const_iterator j2=rays.begin();j2!=rays.end();j2++)
754
for(SymmetryGroup::ElementContainer::const_iterator k=sym->elements.begin();k!=sym->elements.end();k++)
757
IntegerVector v=SymmetryGroup::compose(*k,*j2);
758
for(IntegerVectorList::const_iterator l=equations.begin();l!=equations.end();l++)
764
for(IntegerVectorList::const_iterator l=inequalities2.begin();l!=inequalities2.end();l++)
780
IntegerVector ray=stableRay(*j,equations,inequalities2,sym);
786
if(upToSymmetry)return rays;
787
IntegerVectorList ret;
788
for(IntegerVectorList::const_iterator i=rays.begin();i!=rays.end();i++)
790
set<IntegerVector> thisOrbitsRays;
791
for(SymmetryGroup::ElementContainer::const_iterator k=sym->elements.begin();k!=sym->elements.end();k++)
793
IntegerVector temp=SymmetryGroup::compose(*k,*i);
794
thisOrbitsRays.insert(temp);
796
for(set<IntegerVector>::const_iterator i=thisOrbitsRays.begin();i!=thisOrbitsRays.end();i++)ret.push_back(*i);
801
IntegerVectorList PolyhedralFan::getRaysInPrintingOrder(SymmetryGroup const *sym, bool upToSymmetry)const
804
* The ordering changed in this version. Previously the orbit representatives stored in "rays" were
805
* just the first extreme ray from the orbit that appeared. Now it is gotten using "orbitRepresentative"
806
* which causes the ordering in which the different orbits appear to change.
809
if(cones.empty())return IntegerVectorList();
810
IntegerVectorList generatorsOfLinealitySpace=cones.begin()->generatorsOfLinealitySpace();//all cones have the same lineality space
812
SymmetryGroup localsym(n);
813
if(!sym)sym=&localsym;
814
set<IntegerVector> rays;
815
log1 fprintf(Stderr,"Computing rays of %i cones\n",cones.size());
816
for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++)
820
if(!((t++)%10))log1 fprintf(Stderr,"%i\n",t);
822
IntegerVectorList temp=i->extremeRays(&generatorsOfLinealitySpace);
823
for(IntegerVectorList::const_iterator j=temp.begin();j!=temp.end();j++)
824
rays.insert(sym->orbitRepresentative(*j));
826
IntegerVectorList ret;
828
for(set<IntegerVector>::const_iterator i=rays.begin();i!=rays.end();i++)ret.push_back(*i);
830
for(set<IntegerVector>::const_iterator i=rays.begin();i!=rays.end();i++)
832
set<IntegerVector> thisOrbitsRays;
833
for(SymmetryGroup::ElementContainer::const_iterator k=sym->elements.begin();k!=sym->elements.end();k++)
835
IntegerVector temp=SymmetryGroup::compose(*k,*i);
836
thisOrbitsRays.insert(temp);
838
for(set<IntegerVector>::const_iterator i=thisOrbitsRays.begin();i!=thisOrbitsRays.end();i++)ret.push_back(*i);
421
847
/*void PolyhedralFan::printWithIndices(class Printer *p, SymmetryGroup *sym)const //fan must be pure
697
void PolyhedralFan::printWithIndices(class Printer *p, bool printMultiplicities, SymmetryGroup *sym, bool group)const
1124
/*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
1126
static list<SymmetricComplex::Cone> computeFacets(SymmetricComplex::Cone const &theCone, IntegerMatrix const &rays, IntegerVectorList const &facetCandidates, SymmetricComplex const &theComplex/*, int linealityDim*/)
1128
set<SymmetricComplex::Cone> ret;
1130
for(IntegerVectorList::const_iterator i=facetCandidates.begin();i!=facetCandidates.end();i++)
1135
for(vector<int>::const_iterator j=theCone.indices.begin();j!=theCone.indices.end();j++)
1136
if(dotLong(rays[*j],*i)==0)
1141
SymmetricComplex::Cone temp(indices,theCone.dimension-1,0,false,theComplex);
1142
/* temp.multiplicity=0;
1143
temp.dimension=theCone.dimension-1;
1144
temp.setIgnoreSymmetry(true);
1146
if(notAll)ret.insert(temp);
1149
// fprintf(Stderr,"HEJ!!!!\n");
1151
list<SymmetricComplex::Cone> ret2;
1152
for(set<SymmetricComplex::Cone>::const_iterator i=ret.begin();i!=ret.end();i++)
1154
bool isMaximal=true;
1156
/* if(i->indices.size()+linealityDim<i->dimension)//#3
1159
for(set<SymmetricComplex::Cone>::const_iterator j=ret.begin();j!=ret.end();j++)
1160
if(i!=j && i->isSubsetOf(*j))
1167
SymmetricComplex::Cone temp(i->indexSet(),i->dimension,i->multiplicity,true,theComplex);
1168
temp.setKnownToBeNonMaximal(); // THIS IS WHERE WE SET THE CONES NON-MAXIMAL FLAG
1169
// temp.setIgnoreSymmetry(false);
1170
ret2.push_back(temp);
1177
void addFacesToSymmetricComplex(SymmetricComplex &c, PolyhedralCone const &cone, IntegerVectorList const &facetCandidates, IntegerVectorList const &generatorsOfLinealitySpace)
1179
IntegerMatrix const &rays=c.getVertices();
1182
// for(int j=0;j<rays.getHeight();j++)if(cone.contains(rays[j]))indices.insert(j);
1184
IntegerVectorList l=cone.extremeRays(&generatorsOfLinealitySpace);
1185
for(IntegerVectorList::const_iterator i=l.begin();i!=l.end();i++)indices.insert(c.indexOfVertex(*i));
1187
addFacesToSymmetricComplex(c,indices,facetCandidates,cone.dimension(),cone.getMultiplicity());
1190
void addFacesToSymmetricComplex(SymmetricComplex &c, set<int> const &indices, IntegerVectorList const &facetCandidates, int dimension, int multiplicity)
1192
IntegerMatrix const &rays=c.getVertices();
1193
list<SymmetricComplex::Cone> clist;
1196
SymmetricComplex::Cone temp(indices,dimension,multiplicity,true,c);
1197
// temp.dimension=cone.dimension();
1198
// temp.multiplicity=cone.getMultiplicity();
1199
clist.push_back(temp);
1202
// int linealityDim=cone.dimensionOfLinealitySpace();
1204
while(!clist.empty())
1206
SymmetricComplex::Cone &theCone=clist.front();
1208
if(!c.contains(theCone))
1215
fprintf(Stderr,"clist size:%i\n",clist.size());
1221
// log0 fprintf(Stderr,"ADDING\n");
1222
list<SymmetricComplex::Cone> facets=computeFacets(theCone,rays,facetCandidates,c/*,linealityDim*/);
1223
clist.splice(clist.end(),facets);
1232
Produce strings that express the vectors in terms of rays of the fan modulo the lineality space. Symmetry is ignored??
1234
vector<string> PolyhedralFan::renamingStrings(IntegerVectorList const &theVectors, IntegerVectorList const &originalRays, IntegerVectorList const &linealitySpace, SymmetryGroup *sym)const
1237
for(IntegerVectorList::const_iterator i=theVectors.begin();i!=theVectors.end();i++)
1239
for(PolyhedralConeList::const_iterator j=cones.begin();j!=cones.end();j++)
1243
vector<int> relevantIndices;
1244
IntegerVectorList relevantRays=linealitySpace;
1246
for(IntegerVectorList::const_iterator k=originalRays.begin();k!=originalRays.end();k++,K++)
1249
relevantIndices.push_back(K);
1250
relevantRays.push_back(*k);
1253
FieldMatrix LFA(Q,relevantRays.size(),n);
1255
for(IntegerVectorList::const_iterator j=relevantRays.begin();j!=relevantRays.end();j++,J++)
1256
LFA[J]=integerVectorToFieldVector(*j,Q);
1257
FieldVector LFB=concatenation(integerVectorToFieldVector(*i,Q),FieldVector(Q,relevantRays.size()));
1258
LFA=LFA.transposed();
1259
FieldVector LFX=LFA.solver().canonicalize(LFB);
1261
if(LFX.subvector(0,n).isZero())
1264
FieldVector S=LFX.subvector(n+linealitySpace.size(),LFX.size());
1265
for(int k=0;k<S.size();k++)
1267
s<<"+"<<S[k].toString()<<"*["<<relevantIndices[k]<<"] ";
1269
ret.push_back(s.str());
1277
SymmetricComplex PolyhedralFan::toSymmetricComplex(SymmetryGroup *sym)
1279
SymmetryGroup symm(n);
1282
IntegerVectorList rays=getRaysInPrintingOrder(sym);
1284
SymmetricComplex symCom(n,rays,*sym);
1286
if(cones.empty())return symCom;
1287
IntegerVectorList generatorsOfLinealitySpace=cones.begin()->generatorsOfLinealitySpace();
1289
for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++)
1293
log1 fprintf(Stderr,"Adding faces of cone %i\n",t++);
1295
log2 fprintf(Stderr,"Dim: %i\n",i->dimension());
1297
addFacesToSymmetricComplex(symCom,*i,i->getHalfSpaces(),generatorsOfLinealitySpace);
1300
log1 cerr<<"Remapping";
1302
log1 cerr<<"Done remapping";
1306
void PolyhedralFan::printWithIndices(class Printer *p, int flags, SymmetryGroup *sym, vector<string> const *comments)const
1307
//void PolyhedralFan::printWithIndices(class Printer *p, bool printMultiplicities, SymmetryGroup *sym, bool group, bool ignoreCones, bool xml, bool tPlaneSort, vector<string> const *comments)const
700
1310
// IntegerVector multiplicities;
701
1311
SymmetryGroup symm(n);
703
1313
PolymakeFile polymakeFile;
704
polymakeFile.create("NONAME","PolyhedralFan","PolyhedralFan");
1314
// polymakeFile.create("NONAME","fan","PolyhedralFan",flags&FPF_xml);
1315
polymakeFile.create("NONAME","fan","SymmetricFan",flags&FPF_xml);
1317
bool produceXml=polymakeFile.isXmlFormat();
706
1320
if(!sym)sym=&symm;
719
1335
polymakeFile.writeCardinalProperty("AMBIENT_DIM",n);
720
1336
polymakeFile.writeCardinalProperty("DIM",getMaxDimension());
721
1337
polymakeFile.writeCardinalProperty("LINEALITY_DIM",h);
722
polymakeFile.writeMatrixProperty("RAYS",rowsToIntegerMatrix(rays,n),true);
1338
polymakeFile.writeMatrixProperty("RAYS",rowsToIntegerMatrix(rays,n),true,comments);
723
1339
polymakeFile.writeCardinalProperty("N_RAYS",rays.size());
724
polymakeFile.writeMatrixProperty("LINEALITY_SPACE",rowsToIntegerMatrix(highestDimensionalCone().linealitySpace().dualCone().getEquations(),n));
1340
IntegerVectorList linealitySpaceGenerators=highestDimensionalCone().linealitySpace().dualCone().getEquations();
1341
polymakeFile.writeMatrixProperty("LINEALITY_SPACE",rowsToIntegerMatrix(linealitySpaceGenerators,n));
725
1342
polymakeFile.writeMatrixProperty("ORTH_LINEALITY_SPACE",rowsToIntegerMatrix(highestDimensionalCone().linealitySpace().getEquations(),n));
1344
if(flags & FPF_primitiveRays)
1346
IntegerVectorList primitiveRays;
1347
for(IntegerVectorList::const_iterator i=rays.begin();i!=rays.end();i++)
1348
for(PolyhedralConeList::const_iterator j=cones.begin();j!=cones.end();j++)
1349
if(j->contains(*i)&&(j->dimensionOfLinealitySpace()+1==j->dimension()))
1350
primitiveRays.push_back(j->semiGroupGeneratorOfRay());
1352
polymakeFile.writeMatrixProperty("PRIMITIVE_RAYS",rowsToIntegerMatrix(primitiveRays,n));
1356
IntegerVectorList generatorsOfLinealitySpace=cones.begin()->generatorsOfLinealitySpace();
1358
log1 fprintf(Stderr,"Building symmetric complex.\n");
1359
for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++)
1363
log1 fprintf(Stderr,"Adding faces of cone %i\n",t++);
1365
log2 fprintf(Stderr,"Dim: %i\n",i->dimension());
1367
addFacesToSymmetricComplex(symCom,*i,i->getHalfSpaces(),generatorsOfLinealitySpace);
1370
log1 cerr<<"Remapping";
1372
log1 cerr<<"Done remapping";
728
1375
PolyhedralFan f=*this;
730
1377
// IntegerVector fvector(f.getMaxDimension()-h);
732
1381
//fprintf(Stderr,"maxdim %i h %i\n",f.getMaxDimension(),h);
733
while(!f.cones.empty())
1382
/* while(!f.cones.empty())
735
1384
int currentDimension=f.getMaxDimension()-h;
736
1385
IntegerVector rayIncidenceCounter(rays.size());
756
1405
// fvector[f.getMaxDimension()-h-1]=faceIndex;
757
1406
f=f.facetComplexSymmetry(*sym);
760
polymakeFile.writeCardinalVectorProperty("F_VECTOR",symCom.fvector());
762
polymakeFile.writeStringProperty("CONES",symCom.toString(symCom.getMinDim(),symCom.getMaxDim(),false,group));
763
stringstream multiplicities;
764
polymakeFile.writeStringProperty("MAXIMAL_CONES",symCom.toString(symCom.getMinDim(),symCom.getMaxDim(),true,group, &multiplicities));
766
polymakeFile.writeCardinalProperty("PURE",symCom.isPure());
768
// IntegerVectorList m;
769
// m.push_back(multiplicities);
770
// polymakeFile.writeMatrixProperty("MULTIPLICITIES",rowsToIntegerMatrix(m).transposed());
771
if(printMultiplicities)polymakeFile.writeStringProperty("MULTIPLICITIES",multiplicities.str());
1409
log1 fprintf(Stderr,"Computing f-vector.\n");
1410
IntegerVector fvector=symCom.fvector();
1411
polymakeFile.writeCardinalVectorProperty("F_VECTOR",fvector);
1412
log1 fprintf(Stderr,"Done computing f-vector.\n");
1414
if(flags&FPF_boundedInfo)
1416
log1 fprintf(Stderr,"Computing bounded f-vector.\n");
1417
IntegerVector fvectorBounded=symCom.fvector(true);
1418
polymakeFile.writeCardinalVectorProperty("F_VECTOR_BOUNDED",fvectorBounded);
1419
log1 fprintf(Stderr,"Done computing bounded f-vector.\n");
1422
* Removed to make the Polymake people happy.
1426
for(int i=0;i<fvector.size();i++,mul*=-1)euler+=mul*fvector[i];
1427
polymakeFile.writeCardinalProperty("MY_EULER",euler);
1430
log1 fprintf(Stderr,"Checking if complex is simplicial and pure.\n");
1431
polymakeFile.writeBooleanProperty("SIMPLICIAL",symCom.isSimplicial());
1432
polymakeFile.writeBooleanProperty("PURE",symCom.isPure());
1433
log1 fprintf(Stderr,"Done checking.\n");
1436
if(flags&FPF_conesCompressed)
1438
polymakeFile.writeArrayArrayIntProperty("SYMMETRY_GENERATORS",rowsToIntegerMatrix(sym->getUniqueGenerators(),n));
1439
log1 fprintf(Stderr,"Producing list of cones up to symmetry.\n");
1440
polymakeFile.writeStringProperty("CONES_ORBITS",symCom.toString(symCom.getMinDim(),symCom.getMaxDim(),false,flags&FPF_group,0,true,flags&FPF_tPlaneSort,produceXml));
1441
log1 fprintf(Stderr,"Done producing list of cones up to symmetry.\n");
1442
log1 fprintf(Stderr,"Producing list of maximal cones up to symmetry.\n");
1443
stringstream multiplicities;
1444
polymakeFile.writeStringProperty("MAXIMAL_CONES_ORBITS",symCom.toString(symCom.getMinDim(),symCom.getMaxDim(),true,flags&FPF_group, &multiplicities,true,flags&FPF_tPlaneSort,produceXml));
1445
if(flags&FPF_multiplicities)polymakeFile.writeStringProperty("MULTIPLICITIES_ORBITS",multiplicities.str());
1446
log1 fprintf(Stderr,"Done producing list of maximal cones up to symmetry.\n");
1449
if(flags&FPF_conesExpanded)
1453
log1 fprintf(Stderr,"Producing list of cones.\n");
1454
polymakeFile.writeStringProperty("CONES",symCom.toString(symCom.getMinDim(),symCom.getMaxDim(),false,flags&FPF_group,0,false,flags&FPF_tPlaneSort,produceXml));
1455
log1 fprintf(Stderr,"Done producing list of cones.\n");
1457
if(flags&FPF_maximalCones)
1459
log1 fprintf(Stderr,"Producing list of maximal cones.\n");
1460
stringstream multiplicities;
1461
polymakeFile.writeStringProperty("MAXIMAL_CONES",symCom.toString(symCom.getMinDim(),symCom.getMaxDim(),true,flags&FPF_group, &multiplicities,false,flags&FPF_tPlaneSort,produceXml));
1462
if(flags&FPF_multiplicities)polymakeFile.writeStringProperty("MULTIPLICITIES",multiplicities.str());
1463
log1 fprintf(Stderr,"Done producing list of maximal cones.\n");
1467
if(flags&FPF_values)
1470
IntegerVectorList values;
1471
for(IntegerVectorList::const_iterator i=linealitySpaceGenerators.begin();i!=linealitySpaceGenerators.end();i++)
1474
v[0]=evaluatePiecewiseLinearFunction(*i);
1475
values.push_back(v);
1477
polymakeFile.writeMatrixProperty("LINEALITY_VALUES",rowsToIntegerMatrix(values,1));
1480
IntegerVectorList values;
1481
for(IntegerVectorList::const_iterator i=rays.begin();i!=rays.end();i++)
1484
v[0]=evaluatePiecewiseLinearFunction(*i);
1485
values.push_back(v);
1487
polymakeFile.writeMatrixProperty("RAY_VALUES",rowsToIntegerMatrix(values,1));
1492
log1 fprintf(Stderr,"Producing final string for output.\n");
774
1494
polymakeFile.writeStream(s);
775
1495
string S=s.str();
1496
log1 fprintf(Stderr,"Printing string.\n");
776
1497
p->printString(S.c_str());
1498
log1 fprintf(Stderr,"Done printing string.\n");
1502
PolyhedralFan PolyhedralFan::readFan(string const &filename, bool onlyMaximal, IntegerVector *w, set<int> const *coneIndices, SymmetryGroup const *sym, bool readCompressedIfNotSym)
1504
PolymakeFile inFile;
1505
inFile.open(filename.c_str());
1507
int n=inFile.readCardinalProperty("AMBIENT_DIM");
1508
int nRays=inFile.readCardinalProperty("N_RAYS");
1509
IntegerMatrix rays=inFile.readMatrixProperty("RAYS",nRays,n);
1510
int linealityDim=inFile.readCardinalProperty("LINEALITY_DIM");
1511
IntegerMatrix linealitySpace=inFile.readMatrixProperty("LINEALITY_SPACE",linealityDim,n);
1514
const char *sectionName=0;
1515
const char *sectionNameMultiplicities=0;
1516
if(sym || readCompressedIfNotSym)
1518
sectionName=(onlyMaximal)?"MAXIMAL_CONES_ORBITS":"CONES_ORBITS";
1519
sectionNameMultiplicities=(onlyMaximal)?"MULTIPLICITIES_ORBITS":"DUMMY123";
1522
{ sectionName=(onlyMaximal)?"MAXIMAL_CONES":"CONES";
1523
sectionNameMultiplicities=(onlyMaximal)?"MULTIPLICITIES":"DUMMY123";
1527
IntegerVector w2(n);
1530
SymmetryGroup sym2(n);
1531
if(sym==0)sym=&sym2;
1533
vector<list<int> > cones=inFile.readMatrixIncidenceProperty(sectionName);
1534
IntegerVectorList r;
1536
bool hasMultiplicities=inFile.hasProperty(sectionNameMultiplicities);
1537
IntegerMatrix multiplicities(0,0);
1538
if(hasMultiplicities)multiplicities=inFile.readMatrixProperty(sectionNameMultiplicities,cones.size(),1);
1541
PolyhedralFan ret(n);
1543
log2 cerr<< "Number of orbits to expand "<<cones.size()<<endl;
1544
for(int i=0;i<cones.size();i++)
1545
if(coneIndices==0 || coneIndices->count(i))
1547
log2 cerr<<"Expanding symmetries of cone"<<endl;
1548
/* for(SymmetryGroup::ElementContainer::const_iterator perm=sym->elements.begin();perm!=sym->elements.end();perm++)
1550
IntegerVectorList coneRays;
1551
for(list<int>::const_iterator j=cones[i].begin();j!=cones[i].end();j++)
1552
coneRays.push_back(SymmetryGroup::compose(*perm,rays[*j]));
1553
if(isInNonNegativeSpan(*w,coneRays,linealitySpace.getRows()))
1555
PolyhedralCone C=PolyhedralCone::givenByRays(coneRays,linealitySpace.getRows(),n);
1562
IntegerVectorList coneRays;
1563
for(list<int>::const_iterator j=cones[i].begin();j!=cones[i].end();j++)
1564
coneRays.push_back((rays[*j]));
1565
PolyhedralCone C=PolyhedralCone::givenByRays(coneRays,linealitySpace.getRows(),n);
1566
if(hasMultiplicities)C.setMultiplicity(multiplicities[i][0]);
1567
for(SymmetryGroup::ElementContainer::const_iterator perm=sym->elements.begin();perm!=sym->elements.end();perm++)
1569
if(C.contains(SymmetryGroup::composeInverse(*perm,*w)))
1571
PolyhedralCone C2=C.permuted(*perm);
779
1582
IncidenceList PolyhedralFan::getIncidenceList(SymmetryGroup *sym)const //fan must be pure
902
1714
AsciiPrinter(Stderr).printVector(c.getRelativeInteriorPoint());
1724
/* for(SymmetryGroup::ElementContainer::const_iterator perm=sym->elements.begin();perm!=sym->elements.end();perm++)
1726
if(C.contains(SymmetryGroup::composeInverse(*perm,*w)))
1728
PolyhedralCone C2=C.permuted(*perm);
1734
PolyhedralFan PolyhedralFan::link(IntegerVector const &w, SymmetryGroup *sym)const
1736
SymmetryGroup symL(n);
1739
PolyhedralFan ret(n);
1741
for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++)
1743
for(SymmetryGroup::ElementContainer::const_iterator perm=sym->elements.begin();perm!=sym->elements.end();perm++)
1745
IntegerVector w2=SymmetryGroup::composeInverse(*perm,w);
1748
IntegerVectorList equations=i->getEquations();
1749
IntegerVectorList inequalities1=i->getHalfSpaces();
1750
IntegerVectorList inequalities2;
1751
for(IntegerVectorList::const_iterator j=inequalities1.begin();j!=inequalities1.end();j++)
1752
if(dotLong(w2,*j)==0)inequalities2.push_back(*j);
1753
PolyhedralCone C(inequalities2,equations,n);
1755
C.setLinearForm(i->getLinearForm());
1756
PolyhedralCone C2=C.permuted(*perm);
1758
C2.setMultiplicity(i->getMultiplicity());
1766
PolyhedralFan PolyhedralFan::link(IntegerVector const &w)const
1768
PolyhedralFan ret(n);
1770
for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++)
1774
IntegerVectorList equations=i->getEquations();
1775
IntegerVectorList inequalities1=i->getHalfSpaces();
1776
IntegerVectorList inequalities2;
1777
for(IntegerVectorList::const_iterator j=inequalities1.begin();j!=inequalities1.end();j++)
1778
if(dotLong(w,*j)==0)inequalities2.push_back(*j);
1779
PolyhedralCone C(inequalities2,equations,n);
1781
C.setLinearForm(i->getLinearForm());
1782
C.setMultiplicity(i->getMultiplicity());
1790
int64 PolyhedralFan::evaluatePiecewiseLinearFunction(IntegerVector const &x)const
1792
for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++)
1794
if(i->contains(x))return dotLong(i->getLinearForm(),x);
1801
FieldElement PolyhedralFan::volume(int d, SymmetryGroup *sym)const
1803
SymmetryGroup symL(n);
1806
FieldElement ret(Q);
1808
for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++)
1810
if(i->dimension()==d)
1812
IntegerVector w=stableRay(*i,sym);
1813
ret=ret+Q.zHomomorphism(sym->orbitSize(w))*i->volume();
1820
bool PolyhedralFan::isConnected(SymmetryGroup *sym)const
1822
SymmetryGroup symL(n);
1825
CodimOneConnectednessTester ct;
1827
for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++)
1829
log2 cerr<<"Computing ridges of facet." << endl;
1830
PolyhedralFan ridges=facetsOfCone(*i);
1831
IntegerVectorList interiorPoints;
1832
for(PolyhedralConeList::const_iterator j=ridges.cones.begin();j!=ridges.cones.end();j++)
1833
interiorPoints.push_back(sym->orbitRepresentative(j->getUniquePoint()));
1834
ct.insertFacetOrbit(interiorPoints);
1836
return ct.isConnected();
1840
int PolyhedralFan::size()const
1842
return cones.size();
1845
int PolyhedralFan::dimensionOfLinealitySpace()const
1847
assert(cones.size());//slow!
1848
return cones.begin()->dimensionOfLinealitySpace();
1851
PolyhedralFan PolyhedralFan::negated()const
1853
PolyhedralFan ret(n);
1855
for(coneIterator i=conesBegin();i!=conesEnd();i++)
1856
ret.insert(i->negated());
1861
bool PolyhedralFan::isCompatible(PolyhedralCone const &c)const
1863
for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++)
1865
PolyhedralCone C=intersection(c,*i);
1867
if(!c.hasFace(C))return false;
1868
if(!i->hasFace(C))return false;
1873
void PolyhedralFan::merge(PolyhedralCone const &c)
1875
AsciiPrinter P(Stderr);
1877
if(isCompatible(c))insert(c);
1880
assert(0);//Does not work in general.
1883
// P<<"BEFORE MERGE-------------------------" <<*this;
1885
PolyhedralFan ret=complementOfCone(c,false);
1886
// P<<"COMPLEMENT OF CONE-------------------------" <<ret;
1887
ret=refinement(*this,ret);
1889
PolyhedralFan C(c.ambientDimension());
1892
for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++)
1893
C=refinement(complementOfCone(*i,true),C);
1895
for(PolyhedralConeList::const_iterator i=C.cones.begin();i!=C.cones.end();i++)
1899
// P<<"AFTER MERGE" <<*this;
1905
void PolyhedralFan::removeNonMaximal()
1907
for(PolyhedralConeList::iterator i=cones.begin();i!=cones.end();)
1909
IntegerVector w=i->getRelativeInteriorPoint();
1910
bool containedInOther=false;
1911
for(PolyhedralConeList::iterator j=cones.begin();j!=cones.end();j++)
1914
if(j->contains(w)){containedInOther=true;break;}
1916
if(containedInOther)
1918
PolyhedralConeList::iterator k=i;