source: git/Singular/dyn_modules/gfanlib/tropicalTraversal.cc @ 551009

spielwiese
Last change on this file since 551009 was 551009, checked in by Yue Ren <ren@…>, 9 years ago
new: tropicalTraversalMinimizingFlips
  • Property mode set to 100644
File size: 4.0 KB
Line 
1#include <bbcone.h>
2#include <groebnerCone.h>
3#include <tropicalCurves.h>
4
5std::vector<bool> checkNecessaryFlips(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
44groebnerCones tropicalTraversalMinimizingFlips(const groebnerCone startingCone)
45{
46  groebnerCones tropicalVariety;
47  groebnerCones workingList;
48  workingList.insert(startingCone);
49  const tropicalStrategy* currentStrategy=startingCone.getTropicalStrategy();
50  while(!workingList.empty())
51  {
52    // std::cout << "starting traversal" << std::endl;
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());
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 = checkNecessaryFlips(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    }
85
86    sigma.deletePolynomialData();
87    workingList.erase(sigma);
88    tropicalVariety.insert(sigma);
89    // std::cout << "tropicalVariety.size():" << tropicalVariety.size() << std::endl;
90    // std::cout << "workingList.size():" << workingList.size() << std::endl;
91  }
92  return tropicalVariety;
93}
94
95groebnerCones tropicalTraversal(const groebnerCone startingCone)
96{
97  groebnerCones tropicalVariety;
98  groebnerCones workingList;
99  workingList.insert(startingCone);
100  while(!workingList.empty())
101  {
102    // std::cout << "starting traversal" << std::endl;
103    const groebnerCone sigma=*(workingList.begin());
104    const groebnerCones neighbours = sigma.tropicalNeighbours();
105    for (groebnerCones::iterator tau = neighbours.begin(); tau!=neighbours.end(); tau++)
106    {
107      if (tropicalVariety.count(*tau)==0)
108        workingList.insert(*tau);
109    }
110    tropicalVariety.insert(sigma);
111    workingList.erase(sigma);
112    // std::cout << "tropicalVariety.size():" << tropicalVariety.size() << std::endl;
113    // std::cout << "workingList.size():" << workingList.size() << std::endl;
114  }
115  return tropicalVariety;
116}
Note: See TracBrowser for help on using the repository browser.