source: git/Singular/dyn_modules/gfanlib/tropicalTraversal.cc @ 08b7c2a

spielwiese
Last change on this file since 08b7c2a was 08b7c2a, checked in by Yue Ren <ren@…>, 9 years ago
chg: removed redundant witness computations
  • Property mode set to 100644
File size: 3.9 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    /**
53     * Pick an element the working list and compute interior points on its facets
54     */
55    groebnerCone sigma=*(workingList.begin());
56    gfan::ZMatrix interiorPoints = interiorPointsOfFacets(sigma.getPolyhedralCone());
57
58    for (int i=0; i<interiorPoints.getHeight(); i++)
59    {
60      /**
61       * For each interior point, compute the rays of the tropical star in that point
62       */
63      gfan::ZVector interiorPoint = interiorPoints[i];
64      if (!(currentStrategy->restrictToLowerHalfSpace() && interiorPoint[0].sign()==0))
65      {
66        ideal inI = initial(sigma.getPolynomialIdeal(),sigma.getPolynomialRing(),interiorPoint);
67        gfan::ZMatrix normalVectors = raysOfTropicalStar(inI,
68                                                         sigma.getPolynomialRing(),
69                                                         interiorPoint,
70                                                         sigma.getTropicalStrategy());
71        id_Delete(&inI,sigma.getPolynomialRing());
72
73        std::vector<bool> needToFlip = checkNecessaryFlips(tropicalVariety,workingList,interiorPoint,normalVectors);
74        for (int j=0; j<normalVectors.getHeight(); j++)
75        {
76          if (needToFlip[j])
77          {
78            groebnerCone neighbour = sigma.flipCone(interiorPoint,normalVectors[j]);
79            workingList.insert(neighbour);
80          }
81        }
82      }
83    }
84
85    sigma.deletePolynomialData();
86    workingList.erase(sigma);
87    tropicalVariety.insert(sigma);
88    std::cout << "tropicalVariety.size():" << tropicalVariety.size() << std::endl;
89    std::cout << "workingList.size():" << workingList.size() << std::endl;
90  }
91  return tropicalVariety;
92}
93
94groebnerCones tropicalTraversal(const groebnerCone startingCone)
95{
96  groebnerCones tropicalVariety;
97  groebnerCones workingList;
98  workingList.insert(startingCone);
99  std::cout << "starting traversal" << std::endl;
100  while(!workingList.empty())
101  {
102    const groebnerCone sigma=*(workingList.begin());
103    const groebnerCones neighbours = sigma.tropicalNeighbours();
104    for (groebnerCones::iterator tau = neighbours.begin(); tau!=neighbours.end(); tau++)
105    {
106      if (tropicalVariety.count(*tau)==0)
107        workingList.insert(*tau);
108    }
109    tropicalVariety.insert(sigma);
110    workingList.erase(sigma);
111    std::cout << "tropicalVariety.size():" << tropicalVariety.size() << std::endl;
112    std::cout << "workingList.size():" << workingList.size() << std::endl;
113  }
114  return tropicalVariety;
115}
Note: See TracBrowser for help on using the repository browser.