1
#include "traverser_sphere.h"
2
#include "determinant.h"
6
//void updatePolyhedralCone();
7
SphereTraverser::SphereTraverser(vector<PolyhedralCone> const &cones_, map<IntegerVector,list<int> > const &adjacency_, IntegerVector const &startCone, IntegerVector const &normal):
12
for(;currentConeIndex<cones.size();currentConeIndex++)
14
if(cones[currentConeIndex].contains(startCone))
17
assert(currentConeIndex!=cones.size());
22
void SphereTraverser::changeCone(IntegerVector const &ridgeVector, IntegerVector const &rayVector)
24
list<int> const &candidates=adjacency[ridgeVector];
25
for(list<int>::const_iterator i=candidates.begin();i!=candidates.end();i++)
27
PolyhedralCone l=cones[*i].link(ridgeVector);
28
if(l.contains(rayVector))
31
M.push_back(cones[currentConeIndex].getRelativeInteriorPoint());
32
M.push_back(currentNormal);
34
IntegerVectorList eq=cones[*i].getEquations();
38
if(!T(*eq.begin(),currentNormal-currentNormal))//HERE
39
// if(dotLong(currentNormal,*eq.begin())>0)
40
{currentNormal=*eq.begin();}
42
{currentNormal=-*eq.begin();}
50
IntegerVectorList SphereTraverser::link(IntegerVector const &ridgeVector)
52
list<int> const &candidates=adjacency[ridgeVector];
54
PolyhedralCone ridge=cones[currentConeIndex].faceContaining(ridgeVector);
56
// IntegerVectorList partialBasis=ridge.getEquations();
57
IntegerVectorList partialBasis=ridge.link(ridge.getRelativeInteriorPoint()).dualCone().getEquations();
59
IntegerVector myRay=cones[currentConeIndex].link(ridgeVector).getUniquePoint();
61
partialBasis.push_back(currentNormal);
62
partialBasis.push_back(myRay);
63
int sign=determinantSign(partialBasis);
64
partialBasis.pop_back();
65
partialBasis.pop_back();
69
for(list<int>::const_iterator i=candidates.begin();i!=candidates.end();i++)
72
PolyhedralCone temp=cones[*i].link(ridgeVector);
73
IntegerVector v=temp.getUniquePoint();
74
if(dotLong(v,currentNormal)>=0)c2.push_back(v);
77
IntegerVectorList ret2;
78
ret2.push_back(myRay);
80
for(IntegerVectorList::const_iterator i=c2.begin();i!=c2.end();i++)
88
PolyhedralFan f(theCone.ambientDimension());
90
f.printWithIndices(&pout);
93
for(IntegerVectorList::const_iterator i=c2.begin();i!=c2.end();i++)
95
if(*i==myRay) continue;
96
partialBasis.push_back(ret);
97
partialBasis.push_back(*i);
98
int s=determinantSign(partialBasis);
99
partialBasis.pop_back();
100
partialBasis.pop_back();
114
PolyhedralCone & SphereTraverser::refToPolyhedralCone()
116
theCone=cones[currentConeIndex];
117
return theCone;//cones[currentCone];