1
#include "tropical_weildivisor.h"
7
PolyhedralFan weilDivisor(PolyhedralFan const &F, PolyhedralFan const &G)//, Polynomial const &g)
9
// PolynomialRing R=g.getRing();
10
// PolyhedralFan G=PolyhedralFan::bergmanOfPrincipalIdeal(g);
11
int n=G.getAmbientDimension();
12
int d=F.getMaxDimension();
14
PolyhedralFan retTemp(n);
16
log1 cerr<<"Computing refinement"<<endl;
17
for(PolyhedralConeList::const_iterator i=F.conesBegin();i!=F.conesEnd();i++)
24
IntegerVector v=i->getRelativeInteriorPoint();
25
PolyhedralCone c=G.coneContaining(v);
34
for(PolyhedralConeList::const_iterator j=G.conesBegin();j!=G.conesEnd();j++)
36
PolyhedralCone c=intersection(*i,*j);
42
log1 cerr<<"Computing full complex"<<endl;
43
retTemp=retTemp.fullComplex();
46
log1 cerr<<"Computing divisor"<<endl;
47
for(PolyhedralConeList::iterator i=retTemp.conesBegin();i!=retTemp.conesEnd();i++)
50
if(i->dimension()==d-1)
52
IntegerVector v=i->getRelativeInteriorPoint();
54
AsciiPrinter P(Stderr);
59
IntegerVector evaluationVector(n);
61
// Polynomial localg=initialForm(g,v);
62
// PolyhedralFan localG=PolyhedralFan::normalFanOfNewtonPolytope(localg);
63
PolyhedralFan localG=G.link(v);
65
for(PolyhedralConeList::const_iterator j=F.conesBegin();j!=F.conesEnd();j++)
69
IntegerVectorList equations=j->getEquations();
70
IntegerVectorList inequalities1=j->getHalfSpaces();
71
IntegerVectorList inequalities2;
72
for(IntegerVectorList::const_iterator i=inequalities1.begin();i!=inequalities1.end();i++)
73
if(dotLong(v,*i)==0)inequalities2.push_back(*i);
74
PolyhedralCone localJ(inequalities2,equations,n);
75
localJ.canonicalize();
77
PolyhedralFan refinement(n);
78
for(PolyhedralConeList::const_iterator k=localG.conesBegin();k!=localG.conesEnd();k++)
80
PolyhedralCone sigma=intersection(localJ,*k);
82
refinement.insert(sigma);
85
for(PolyhedralConeList::const_iterator k=refinement.conesBegin();k!=refinement.conesEnd();k++)
87
PolyhedralCone const &sigma(*k);
88
if(sigma.dimension()==d)
90
/*IntegerVectorList rays=sigma.extremeRays();
91
assert(rays.size()==1);//SHOULD ALWAYS BE TRUE????
93
IntegerVector ray=*rays.begin();
95
IntegerVector ray=sigma.semiGroupGeneratorOfRay();
96
evaluationVector+=j->getMultiplicity()*ray;
97
//multiplicity+=j->getMultiplicity()*localg.degree(ray);
98
multiplicity+=j->getMultiplicity()*localG.evaluatePiecewiseLinearFunction(ray);
104
//multiplicity-=localg.degree(evaluationVector);
105
multiplicity-=localG.evaluatePiecewiseLinearFunction(evaluationVector);
109
c.setMultiplicity(multiplicity);