source: git/Singular/dyn_modules/gfanlib/tropical.cc @ 9abcc6

spielwiese
Last change on this file since 9abcc6 was 9abcc6, checked in by Yue Ren <ren@…>, 10 years ago
status updated 11.03.
  • Property mode set to 100644
File size: 6.8 KB
Line 
1#include <libpolys/polys/monomials/p_polys.h>
2#include <libpolys/coeffs/coeffs.h>
3
4#include <callgfanlib_conversion.h>
5#include <bbcone.h>
6#include <ppinitialReduction.h>
7#include <ttinitialReduction.h>
8#include <containsMonomial.h>
9#include <initial.h>
10#include <witness.h>
11#include <tropicalCurves.h>
12#include <neighbours.h>
13#include <tropicalVarietyOfPolynomials.h>
14#include <tropicalStrategy.h>
15#include <startingCone.h>
16#include <tropicalVariety.h>
17
18BOOLEAN homogeneitySpace(leftv res, leftv args)
19{
20  leftv u = args;
21  if ((u != NULL) && (u->Typ() == IDEAL_CMD))
22  {
23    leftv v = u->next;
24    if (v == NULL)
25    {
26      int n = currRing->N;
27      ideal I = (ideal) u->Data();
28      poly g;
29      int* leadexpv = (int*) omAlloc((n+1)*sizeof(int));
30      int* tailexpv = (int*) omAlloc((n+1)*sizeof(int));
31      gfan::ZVector leadexpw = gfan::ZVector(n);
32      gfan::ZVector tailexpw = gfan::ZVector(n);
33      gfan::ZMatrix equations = gfan::ZMatrix(0,n);
34      for (int i=0; i<IDELEMS(I); i++)
35      {
36        g = (poly) I->m[i]; pGetExpV(g,leadexpv);
37        leadexpw = intStar2ZVector(n, leadexpv);
38        pIter(g);
39        while (g != NULL)
40        {
41          pGetExpV(g,tailexpv);
42          tailexpw = intStar2ZVector(n, tailexpv);
43          equations.appendRow(leadexpw-tailexpw);
44          pIter(g);
45        }
46      }
47      gfan::ZCone* gCone = new gfan::ZCone(gfan::ZMatrix(0, equations.getWidth()),equations);
48      omFreeSize(leadexpv,(n+1)*sizeof(int));
49      omFreeSize(tailexpv,(n+1)*sizeof(int));
50
51      res->rtyp = coneID;
52      res->data = (void*) gCone;
53      return FALSE;
54    }
55  }
56  WerrorS("homogeneitySpace: unexpected parameters");
57  return TRUE;
58}
59
60
61BOOLEAN groebnerCone(leftv res, leftv args)
62{
63  leftv u = args;
64  if ((u != NULL) && (u->Typ() == IDEAL_CMD))
65  {
66    leftv v = u->next;
67    if (v == NULL)
68    {
69      int n = currRing->N;
70      ideal I = (ideal) u->Data();
71      poly g = NULL;
72      int* leadexpv = (int*) omAlloc((n+1)*sizeof(int));
73      int* tailexpv = (int*) omAlloc((n+1)*sizeof(int));
74      gfan::ZVector leadexpw = gfan::ZVector(n);
75      gfan::ZVector tailexpw = gfan::ZVector(n);
76      gfan::ZMatrix inequalities = gfan::ZMatrix(0,n);
77      gfan::ZMatrix equations = gfan::ZMatrix(0,n);
78      long d;
79      for (int i=0; i<IDELEMS(I); i++)
80      {
81        g = (poly) I->m[i]; pGetExpV(g,leadexpv);
82        leadexpw = intStar2ZVector(n, leadexpv);
83        pIter(g);
84        d = p_Deg(g,currRing);
85        while ((g != NULL) && (p_Deg(g,currRing) == d))
86        {
87          pGetExpV(g,tailexpv);
88          tailexpw = intStar2ZVector(n, tailexpv);
89          equations.appendRow(leadexpw-tailexpw);
90          pIter(g);
91        }
92
93        if (g != NULL)
94        {
95          while (g != NULL)
96          {
97            pGetExpV(g,tailexpv);
98            tailexpw = intStar2ZVector(n, tailexpv);
99            inequalities.appendRow(leadexpw-tailexpw);
100            pIter(g);
101          }
102        }
103      }
104      gfan::ZCone* gCone = new gfan::ZCone(inequalities,equations);
105      omFreeSize(leadexpv,(n+1)*sizeof(int));
106      omFreeSize(tailexpv,(n+1)*sizeof(int));
107
108      res->rtyp = coneID;
109      res->data = (void*) gCone;
110      return FALSE;
111    }
112  }
113  WerrorS("groebnerCone: unexpected parameters");
114  return TRUE;
115}
116
117
118gfan::ZCone* maximalGroebnerCone(const ring &r, const ideal &I)
119{
120  int n = rVar(r);
121  poly g = NULL;
122  int* leadexpv = (int*) omAlloc((n+1)*sizeof(int));
123  int* tailexpv = (int*) omAlloc((n+1)*sizeof(int));
124  gfan::ZVector leadexpw = gfan::ZVector(n);
125  gfan::ZVector tailexpw = gfan::ZVector(n);
126  gfan::ZMatrix inequalities = gfan::ZMatrix(0,n);
127  for (int i=0; i<IDELEMS(I); i++)
128  {
129    g = (poly) I->m[i]; pGetExpV(g,leadexpv);
130    leadexpw = intStar2ZVector(n, leadexpv);
131    pIter(g);
132    while (g != NULL)
133    {
134      pGetExpV(g,tailexpv);
135      tailexpw = intStar2ZVector(n, tailexpv);
136      inequalities.appendRow(leadexpw-tailexpw);
137      pIter(g);
138    }
139  }
140  omFreeSize(leadexpv,(n+1)*sizeof(int));
141  omFreeSize(tailexpv,(n+1)*sizeof(int));
142  return new gfan::ZCone(inequalities,gfan::ZMatrix(0, inequalities.getWidth()));
143}
144
145
146BOOLEAN maximalGroebnerCone(leftv res, leftv args)
147{
148  leftv u = args;
149  if ((u != NULL) && (u->Typ() == IDEAL_CMD))
150  {
151    leftv v = u->next;
152    if (v == NULL)
153    {
154      ideal I = (ideal) u->Data();
155      res->rtyp = coneID;
156      res->data = (void*) maximalGroebnerCone(currRing, I);
157      return FALSE;
158    }
159  }
160  WerrorS("maximalGroebnerCone: unexpected parameters");
161  return TRUE;
162}
163
164
165// gfan::ZCone* startingCone(ideal I)
166// {
167//   I = kStd(I,NULL,isNotHomog,NULL);
168//   gfan::ZCone* zc = maximalGroebnerCone(currRing,I);
169//   gfan::ZMatrix rays = zc->extremeRays();
170//   gfan::ZVector v;
171//   for (int i=0; i<rays.getHeight(); i++)
172//   {
173//     v = rays[i];
174//   }
175//   return zc;
176// }
177
178
179void tropical_setup(SModulFunctions* p)
180{
181  valuedCase = initializeValuedCase();
182  nonValuedCase = initializeNonValuedCase();
183  p->iiAddCproc("","groebnerCone",FALSE,groebnerCone);
184  p->iiAddCproc("","maximalGroebnerCone",FALSE,maximalGroebnerCone);
185  p->iiAddCproc("","initial",FALSE,initial);
186  // p->iiAddCproc("","tropicalNeighbours",FALSE,tropicalNeighbours);
187#ifndef NDEBUG
188  p->iiAddCproc("","initial0",FALSE,initial0);
189  p->iiAddCproc("","pppReduce",FALSE,pppReduce);
190  p->iiAddCproc("","ppreduceInitially0",FALSE,ppreduceInitially0);
191  p->iiAddCproc("","ppreduceInitially1",FALSE,ppreduceInitially1);
192  p->iiAddCproc("","ppreduceInitially2",FALSE,ppreduceInitially2);
193  p->iiAddCproc("","ppreduceInitially3",FALSE,ppreduceInitially3);
194  p->iiAddCproc("","ppreduceInitially4",FALSE,ppreduceInitially4);
195  p->iiAddCproc("","ttpReduce",FALSE,ttpReduce);
196  p->iiAddCproc("","ttreduceInitially0",FALSE,ttreduceInitially0);
197  p->iiAddCproc("","ttreduceInitially1",FALSE,ttreduceInitially1);
198  p->iiAddCproc("","ttreduceInitially2",FALSE,ttreduceInitially2);
199  p->iiAddCproc("","ttreduceInitially3",FALSE,ttreduceInitially3);
200  p->iiAddCproc("","ttreduceInitially4",FALSE,ttreduceInitially4);
201  p->iiAddCproc("","checkForMonomial",FALSE,checkForMonomial);
202  p->iiAddCproc("","dwr0",FALSE,dwr0);
203  p->iiAddCproc("","witness0",FALSE,witness0);
204  p->iiAddCproc("","tropicalVariety00",FALSE,tropicalVariety00);
205  p->iiAddCproc("","tropicalVariety01",FALSE,tropicalVariety01);
206  p->iiAddCproc("","tropicalCurve0",FALSE,tropicalCurve0);
207  p->iiAddCproc("","tropicalCurve1",FALSE,tropicalCurve1);
208  p->iiAddCproc("","tropicalStartingPoint0",FALSE,tropicalStartingPoint0);
209  p->iiAddCproc("","tropicalStartingPoint1",FALSE,tropicalStartingPoint1);
210  p->iiAddCproc("","tropicalStartingCone0",FALSE,tropicalStartingCone0);
211  p->iiAddCproc("","tropicalStartingCone1",FALSE,tropicalStartingCone1);
212  p->iiAddCproc("","tropicalVariety",FALSE,tropicalVariety);
213#endif //NDEBUG
214  p->iiAddCproc("","ppreduceInitially",FALSE,ppreduceInitially);
215  p->iiAddCproc("","ttreduceInitially",FALSE,ttreduceInitially);
216  p->iiAddCproc("","homogeneitySpace",FALSE,homogeneitySpace);
217}
Note: See TracBrowser for help on using the repository browser.