tropicalTraversal.cc
Go to the documentation of this file.
1 #include <bbcone.h>
2 #include <groebnerCone.h>
3 #include <tropicalCurves.h>
4 
5 std::vector<bool> checkNecessaryTropicalFlips(const groebnerCones &tropicalVariety, const groebnerCones &workingList,
6  const gfan::ZVector &interiorPoint, const gfan::ZMatrix &normalVectors)
7 {
8  int k = normalVectors.getHeight();
9  std::vector<bool> needToFlip(k,true);
10 
11  int n = normalVectors.getWidth();
12  gfan::ZMatrix testVectors(k,n);
13  gfan::ZVector bigInteriorPoint = 1000*interiorPoint;
14  for (int i=0; i<k; i++)
15  testVectors[i] = bigInteriorPoint+normalVectors[i];
16 
17  for (groebnerCones::iterator sigma = tropicalVariety.begin(); sigma!=tropicalVariety.end(); sigma++)
18  {
19  if (sigma->contains(interiorPoint))
20  {
21  for (int i=0; i<k; i++)
22  {
23  if (needToFlip[i] && sigma->contains(testVectors[i]))
24  needToFlip[i] = false;
25  }
26  }
27  }
28 
29  for (groebnerCones::iterator sigma = workingList.begin(); sigma!=workingList.end(); sigma++)
30  {
31  if (sigma->contains(interiorPoint))
32  {
33  for (int i=0; i<k; i++)
34  {
35  if (needToFlip[i] && sigma->contains(testVectors[i]))
36  needToFlip[i] = false;
37  }
38  }
39  }
40 
41  return needToFlip;
42 }
43 
45 {
47  groebnerCones workingList;
48  workingList.insert(startingCone);
49  const tropicalStrategy* currentStrategy=startingCone.getTropicalStrategy();
50  std::set<gfan::ZVector> finishedInteriorPoints;
51  while(!workingList.empty())
52  {
53  /**
54  * Pick an element the working list and compute interior points on its facets
55  */
56  groebnerCone sigma=*(workingList.begin());
57  gfan::ZMatrix interiorPoints = interiorPointsOfFacets(sigma.getPolyhedralCone(),finishedInteriorPoints);
58 
59  for (int i=0; i<interiorPoints.getHeight(); i++)
60  {
61  /**
62  * For each interior point, compute the rays of the tropical star in that point
63  */
64  gfan::ZVector interiorPoint = interiorPoints[i];
65  if (!(currentStrategy->restrictToLowerHalfSpace() && interiorPoint[0].sign()==0))
66  {
67  ideal inI = initial(sigma.getPolynomialIdeal(),sigma.getPolynomialRing(),interiorPoint);
68  gfan::ZMatrix normalVectors = raysOfTropicalStar(inI,
69  sigma.getPolynomialRing(),
70  interiorPoint,
71  sigma.getTropicalStrategy());
72  id_Delete(&inI,sigma.getPolynomialRing());
73 
74  std::vector<bool> needToFlip = checkNecessaryTropicalFlips(tropicalVariety,workingList,interiorPoint,normalVectors);
75  for (int j=0; j<normalVectors.getHeight(); j++)
76  {
77  if (needToFlip[j])
78  {
79  groebnerCone neighbour = sigma.flipCone(interiorPoint,normalVectors[j]);
80  workingList.insert(neighbour);
81  }
82  }
83  }
84  finishedInteriorPoints.insert(interiorPoint);
85  }
86 
87  sigma.deletePolynomialData();
88  workingList.erase(sigma);
89  tropicalVariety.insert(sigma);
90  if (printlevel > 0)
91  Print("cones finished: %lu cones in working list: %lu\n",
92  (unsigned long)tropicalVariety.size(), (unsigned long)workingList.size());
93  }
94  return tropicalVariety;
95 }
96 
97 
98 std::vector<bool> checkNecessaryGroebnerFlips(const groebnerCones &groebnerFan, const groebnerCones &workingList,
99  const gfan::ZMatrix &interiorPoints)
100 {
101  int k = interiorPoints.getHeight();
102  std::vector<bool> needToFlip(k,true);
103 
104  for (groebnerCones::iterator sigma = groebnerFan.begin(); sigma!=groebnerFan.end(); sigma++)
105  {
106  for (int i=0; i<k; i++)
107  {
108  if (needToFlip[i] && sigma->contains(interiorPoints[i]))
109  needToFlip[i] = false;
110  }
111  }
112 
113  for (groebnerCones::iterator sigma = workingList.begin(); sigma!=workingList.end(); sigma++)
114  {
115  for (int i=0; i<k; i++)
116  {
117  if (needToFlip[i] && sigma->contains(interiorPoints[i]))
118  needToFlip[i] = false;
119  }
120  }
121 
122  return needToFlip;
123 }
124 
125 
127 {
128  const tropicalStrategy* currentStrategy = startingCone.getTropicalStrategy();
129 
131  groebnerCones workingList;
132  workingList.insert(startingCone);
133  std::set<gfan::ZVector> finishedInteriorPoints;
134  bool onlyLowerHalfSpace = !currentStrategy->isValuationTrivial();
135 
136  while(!workingList.empty())
137  {
138  /**
139  * Pick a maximal Groebner cone from the working list
140  * and compute interior points on its facets as well as outer facet normals
141  */
142  groebnerCone sigma=*(workingList.begin());
143  workingList.erase(workingList.begin());
144 
145  std::pair<gfan::ZMatrix,gfan::ZMatrix> interiorPointsAndOuterFacetNormals = interiorPointsAndNormalsOfFacets(sigma.getPolyhedralCone(), finishedInteriorPoints, onlyLowerHalfSpace);
146  gfan::ZMatrix interiorPoints = interiorPointsAndOuterFacetNormals.first;
147  gfan::ZMatrix outerFacetNormals = interiorPointsAndOuterFacetNormals.second;
148  std::vector<bool> needToFlip = checkNecessaryGroebnerFlips(groebnerFan,workingList, interiorPoints);
149 
150  for (int i=0; i<interiorPoints.getHeight(); i++)
151  {
152  gfan::ZVector interiorPoint = interiorPoints[i];
153 
154  if (needToFlip[i]==true)
155  {
156  groebnerCone neighbour = sigma.flipCone(interiorPoint,outerFacetNormals[i]);
157  workingList.insert(neighbour);
158  }
159  finishedInteriorPoints.insert(interiorPoints[i]);
160  }
161 
162  sigma.deletePolynomialData();
163  groebnerFan.insert(sigma);
164  if (printlevel > 0)
165  Print("cones finished: %lu cones in working list: %lu\n",
166  (unsigned long)groebnerFan.size(), (unsigned long)workingList.size());
167  }
168  return groebnerFan;
169 }
const tropicalStrategy * getTropicalStrategy() const
Definition: groebnerCone.h:67
#define Print
Definition: emacs.cc:83
groebnerCone flipCone(const gfan::ZVector &interiorPoint, const gfan::ZVector &facetNormal) const
Given an interior point on the facet and the outer normal factor on the facet, returns the adjacent g...
gfan::ZFan * groebnerFan(const tropicalStrategy currentStrategy)
Definition: groebnerFan.cc:28
const ideal
Definition: gb_hack.h:42
const CanonicalForm CFMap CFMap int &both_non_zero int n
Definition: cfEzgcd.cc:52
std::vector< bool > checkNecessaryTropicalFlips(const groebnerCones &tropicalVariety, const groebnerCones &workingList, const gfan::ZVector &interiorPoint, const gfan::ZMatrix &normalVectors)
void id_Delete(ideal *h, ring r)
gfan::ZCone getPolyhedralCone() const
Definition: groebnerCone.h:65
int k
Definition: cfEzgcd.cc:93
std::pair< gfan::ZMatrix, gfan::ZMatrix > interiorPointsAndNormalsOfFacets(const gfan::ZCone zc, const std::set< gfan::ZVector > &exceptThesePoints, const bool onlyLowerHalfSpace)
Definition: bbcone.cc:1674
groebnerCones groebnerTraversal(const groebnerCone startingCone)
std::set< groebnerCone, groebnerCone_compare > groebnerCones
Definition: groebnerCone.h:24
void deletePolynomialData()
Definition: groebnerCone.h:54
groebnerCones tropicalTraversalMinimizingFlips(const groebnerCone startingCone)
poly initial(const poly p, const ring r, const gfan::ZVector w)
Returns the initial form of p with respect to w.
Definition: initial.cc:32
int j
Definition: myNF.cc:70
BOOLEAN tropicalVariety(leftv res, leftv args)
ideal getPolynomialIdeal() const
Definition: groebnerCone.h:63
int i
Definition: cfEzgcd.cc:123
bool restrictToLowerHalfSpace() const
returns true, if valuation non-trivial, false otherwise
implementation of the class groebnerCone
ring getPolynomialRing() const
Definition: groebnerCone.h:64
std::vector< bool > checkNecessaryGroebnerFlips(const groebnerCones &groebnerFan, const groebnerCones &workingList, const gfan::ZMatrix &interiorPoints)
int printlevel
Definition: febase.cc:42
gfan::ZMatrix raysOfTropicalStar(ideal I, const ring r, const gfan::ZVector &u, const tropicalStrategy *currentStrategy)
gfan::ZMatrix interiorPointsOfFacets(const gfan::ZCone &zc, const std::set< gfan::ZVector > &exceptThese)
Definition: bbcone.cc:1620
bool isValuationTrivial() const