My Project  debian-1:4.1.1-p2+ds-4build3
tropicalVarietyOfPolynomials.cc
Go to the documentation of this file.
1 #include "gfanlib/gfanlib.h"
4 
5 #include "tropicalStrategy.h"
7 
8 #ifndef SING_NDEBUG
9 #include "Singular/subexpr.h" // for leftv
10 #include "bbfan.h" // for fanID
11 #endif
12 
13 /***
14  * Returns the tropical variety of a polynomial g in ring r.
15  * Depending on the current case, it will compute either the whole tropical variety
16  * or just the part in the first lower half-space.
17  * An empty set means that the tropical Variety is the whole space,
18  * i.e. g is either 0 or a non-zero monomial.
19  **/
20 std::set<gfan::ZCone> tropicalVariety(const poly g, const ring r, const tropicalStrategy* currentCase)
21 {
22  int n = rVar(r);
23  std::set<gfan::ZCone> tropVar;
24  if (g && g->next)
25  {
26  int* expv = (int*) omAlloc((n+1)*sizeof(int));
27  gfan::ZMatrix exponents = gfan::ZMatrix(0,n);
28  for (poly s=g; s; pIter(s))
29  {
30  p_GetExpV(s,expv,r);
31  gfan::ZVector zv = intStar2ZVector(n,expv);
32  exponents.appendRow(intStar2ZVector(n,expv));
33  }
34  omFreeSize(expv,(n+1)*sizeof(int));
35 
36  int l = exponents.getHeight();
37  gfan::ZVector lowerHalfSpaceCondition = gfan::ZVector(n);
38  lowerHalfSpaceCondition[0] = -1;
39  for (int i=0; i<l; i++)
40  {
41  for (int j=i+1; j<l; j++)
42  {
43  gfan::ZMatrix equation = gfan::ZMatrix(0,n);
44  equation.appendRow(exponents[i].toVector()-exponents[j].toVector());
45  gfan::ZMatrix inequalities = gfan::ZMatrix(0,n);
46  if (currentCase->restrictToLowerHalfSpace())
47  inequalities.appendRow(lowerHalfSpaceCondition);
48  for (int k=0; k<l; k++)
49  if (k!=i && k!=j) inequalities.appendRow(((gfan::ZVector)exponents[i])-exponents[k]);
50  gfan::ZCone zc = gfan::ZCone(inequalities,equation);
51  if (zc.dimension()>=n-1)
52  {
53  zc.canonicalize();
54  tropVar.insert(zc);
55  }
56  }
57  }
58  }
59  return tropVar;
60 }
61 
62 ZConesSortedByDimension tropicalVarietySortedByDimension(const poly g, const ring r, const tropicalStrategy* currentCase)
63 {
64  int n = rVar(r);
66  if (g && g->next)
67  {
68  int* expv = (int*) omAlloc((n+1)*sizeof(int));
69  gfan::ZMatrix exponents = gfan::ZMatrix(0,n);
70  for (poly s=g; s; pIter(s))
71  {
72  p_GetExpV(s,expv,r);
73  gfan::ZVector zv = intStar2ZVector(n,expv);
74  exponents.appendRow(intStar2ZVector(n,expv));
75  }
76  omFreeSize(expv,(n+1)*sizeof(int));
77 
78  int l = exponents.getHeight();
79  gfan::ZVector lowerHalfSpaceCondition = gfan::ZVector(n);
80  lowerHalfSpaceCondition[0] = -1;
81  for (int i=0; i<l; i++)
82  {
83  for (int j=i+1; j<l; j++)
84  {
85  gfan::ZMatrix equation = gfan::ZMatrix(0,n);
86  equation.appendRow(exponents[i].toVector()-exponents[j].toVector());
87  gfan::ZMatrix inequalities = gfan::ZMatrix(0,n);
88  if (currentCase->restrictToLowerHalfSpace())
89  inequalities.appendRow(lowerHalfSpaceCondition);
90  for (int k=0; k<l; k++)
91  if (k!=i && k!=j) inequalities.appendRow(exponents[i].toVector()-exponents[k].toVector());
92  gfan::ZCone zc = gfan::ZCone(inequalities,equation);
93  if (zc.dimension()>=n-1)
94  {
95  zc.canonicalize();
96  tropVar.insert(zc);
97  }
98  }
99  }
100  }
101  return tropVar;
102 }
103 
104 
105 // #ifndef SING_NDEBUG
106 // BOOLEAN tropicalVariety00(leftv res, leftv args)
107 // {
108 // leftv u = args;
109 // poly g = (poly) u->CopyD();
110 // omUpdateInfo();
111 // Print("usedBytesBefore=%ld\n",om_Info.UsedBytes);
112 // std::set<gfan::ZCone> C = fullTropicalVarietyOfPolynomial(g,currRing);
113 // p_Delete(&g,currRing);
114 // res->rtyp = fanID;
115 // res->data = (char*) toFanStar(C);
116 // return FALSE;
117 // }
118 // BOOLEAN tropicalVariety01(leftv res, leftv args)
119 // {
120 // leftv u = args;
121 // poly g = (poly) u->CopyD();
122 // omUpdateInfo();
123 // Print("usedBytesBefore=%ld\n",om_Info.UsedBytes);
124 // std::set<gfan::ZCone> C = lowerTropicalVarietyOfPolynomial(g,currRing);
125 // p_Delete(&g,currRing);
126 // res->rtyp = fanID;
127 // res->data = (char*) toFanStar(C);
128 // return FALSE;
129 // }
130 // #endif
callgfanlib_conversion.h
tropicalStrategy::restrictToLowerHalfSpace
bool restrictToLowerHalfSpace() const
returns true, if valuation non-trivial, false otherwise
Definition: tropicalStrategy.h:238
j
int j
Definition: facHensel.cc:105
k
int k
Definition: cfEzgcd.cc:92
bbfan.h
tropicalVariety
std::set< gfan::ZCone > tropicalVariety(const poly g, const ring r, const tropicalStrategy *currentCase)
Definition: tropicalVarietyOfPolynomials.cc:20
g
g
Definition: cfModGcd.cc:4031
intStar2ZVector
gfan::ZVector intStar2ZVector(const int d, const int *i)
Definition: callgfanlib_conversion.cc:86
rVar
static short rVar(const ring r)
#define rVar(r) (r->N)
Definition: ring.h:583
i
int i
Definition: cfEzgcd.cc:125
ZConesSortedByDimension
std::set< gfan::ZCone, ZConeCompareDimensionFirst > ZConesSortedByDimension
Definition: tropicalVarietyOfPolynomials.h:27
omFreeSize
#define omFreeSize(addr, size)
Definition: omAllocDecl.h:260
tropicalStrategy.h
tropicalVarietySortedByDimension
ZConesSortedByDimension tropicalVarietySortedByDimension(const poly g, const ring r, const tropicalStrategy *currentCase)
Definition: tropicalVarietyOfPolynomials.cc:62
pIter
#define pIter(p)
Definition: monomials.h:44
omAlloc
#define omAlloc(size)
Definition: omAllocDecl.h:210
p_polys.h
p_GetExpV
static void p_GetExpV(poly p, int *ev, const ring r)
Definition: p_polys.h:1466
subexpr.h
inequalities
BOOLEAN inequalities(leftv res, leftv args)
Definition: bbcone.cc:560
tropicalVarietyOfPolynomials.h
l
int l
Definition: cfEzgcd.cc:93
s
const CanonicalForm int s
Definition: facAbsFact.cc:55
tropicalStrategy
Definition: tropicalStrategy.h:37