1 | #include <kernel/kstd1.h> |
---|
2 | #include <kernel/ideals.h> |
---|
3 | #include <Singular/ipid.h> |
---|
4 | |
---|
5 | #include <libpolys/polys/monomials/p_polys.h> |
---|
6 | #include <libpolys/polys/monomials/ring.h> |
---|
7 | #include <libpolys/polys/prCopy.h> |
---|
8 | |
---|
9 | #include <gfanlib/gfanlib.h> |
---|
10 | |
---|
11 | #include <callgfanlib_conversion.h> |
---|
12 | #include <groebnerCone.h> |
---|
13 | #include <initial.h> |
---|
14 | |
---|
15 | /*** |
---|
16 | * Computes the Groebner cone of a polynomial g in ring r containing w relatively. |
---|
17 | * Assumes that r has a weighted ordering with weight in the said Groebner cone. |
---|
18 | **/ |
---|
19 | gfan::ZCone sloppyGroebnerCone(const poly g, const ring r, const gfan::ZVector w) |
---|
20 | { |
---|
21 | int n = r->N; |
---|
22 | gfan::ZMatrix inequalities = gfan::ZMatrix(0,n); |
---|
23 | gfan::ZMatrix equations = gfan::ZMatrix(0,n); |
---|
24 | |
---|
25 | int* expv = (int*) omAlloc((n+1)*sizeof(int)); |
---|
26 | p_GetExpV(g,expv,r); |
---|
27 | gfan::ZVector leadexp = intStar2ZVector(n,expv); |
---|
28 | long d = wDeg(g,r,w); |
---|
29 | |
---|
30 | poly h=g->next; |
---|
31 | for (; h && wDeg(h,r,w)==d; pIter(h)) |
---|
32 | { |
---|
33 | p_GetExpV(h,expv,r); |
---|
34 | equations.appendRow(leadexp-intStar2ZVector(n,expv)); |
---|
35 | } |
---|
36 | |
---|
37 | for (; h; pIter(h)) |
---|
38 | { |
---|
39 | p_GetExpV(h,expv,r); |
---|
40 | inequalities.appendRow(leadexp-intStar2ZVector(n,expv)); |
---|
41 | } |
---|
42 | |
---|
43 | omFreeSize(expv,(n+1)*sizeof(int)); |
---|
44 | return gfan::ZCone(inequalities,equations); |
---|
45 | } |
---|
46 | |
---|
47 | /*** |
---|
48 | * Computes the Groebner cone of an ideal I in ring r containing w relatively. |
---|
49 | * Assumes that r has a weighted ordering with weight in the said Groebner cone. |
---|
50 | **/ |
---|
51 | gfan::ZCone sloppyGroebnerCone(const ideal I, const ring r, const gfan::ZVector w) |
---|
52 | { |
---|
53 | int k = idSize(I); |
---|
54 | gfan::ZCone zc = gfan::ZCone(r->N); |
---|
55 | for (int i=0; i<k; i++) |
---|
56 | zc = intersection(zc,sloppyGroebnerCone(I->m[i],r,w)); |
---|
57 | return zc; |
---|
58 | } |
---|
59 | |
---|
60 | /*** |
---|
61 | * Computes the Groebner cone of a polynomial g in ring r containing w relatively. |
---|
62 | **/ |
---|
63 | gfan::ZCone groebnerCone(const poly g, const ring r, const gfan::ZVector w) |
---|
64 | { |
---|
65 | int n = r->N; |
---|
66 | gfan::ZMatrix inequalities = gfan::ZMatrix(0,n); |
---|
67 | gfan::ZMatrix equations = gfan::ZMatrix(0,n); |
---|
68 | |
---|
69 | int* expv = (int*) omAlloc((n+1)*sizeof(int)); |
---|
70 | p_GetExpV(g,expv,r); |
---|
71 | gfan::ZVector leadexp = intStar2ZVector(n,expv); |
---|
72 | long d = wDeg(g,r,w); |
---|
73 | |
---|
74 | for (poly h=g->next; h; pIter(h)) |
---|
75 | { |
---|
76 | p_GetExpV(h,expv,r); |
---|
77 | if (wDeg(h,r,w)<d) |
---|
78 | inequalities.appendRow(leadexp-intStar2ZVector(n,expv)); |
---|
79 | else |
---|
80 | equations.appendRow(leadexp-intStar2ZVector(n,expv)); |
---|
81 | } |
---|
82 | |
---|
83 | omFreeSize(expv,(n+1)*sizeof(int)); |
---|
84 | return gfan::ZCone(inequalities,equations); |
---|
85 | } |
---|
86 | |
---|
87 | /*** |
---|
88 | * Computes the Groebner cone of an ideal I in ring r containing w relatively. |
---|
89 | * Assumes that r has a weighted ordering with weight in the said Groebner cone. |
---|
90 | **/ |
---|
91 | gfan::ZCone groebnerCone(const ideal I, const ring r, const gfan::ZVector w) |
---|
92 | { |
---|
93 | int k = idSize(I); |
---|
94 | gfan::ZCone zc = gfan::ZCone(r->N); |
---|
95 | for (int i=0; i<k; i++) |
---|
96 | zc = intersection(zc,groebnerCone(I->m[i],r,w)); |
---|
97 | return zc; |
---|
98 | } |
---|
99 | |
---|
100 | gfan::ZCone fullGroebnerCone(const ideal &I, const ring &r) |
---|
101 | { |
---|
102 | int n = rVar(r); |
---|
103 | poly g = NULL; |
---|
104 | int* leadexpv = (int*) omAlloc((n+1)*sizeof(int)); |
---|
105 | int* tailexpv = (int*) omAlloc((n+1)*sizeof(int)); |
---|
106 | gfan::ZVector leadexpw = gfan::ZVector(n); |
---|
107 | gfan::ZVector tailexpw = gfan::ZVector(n); |
---|
108 | gfan::ZMatrix inequalities = gfan::ZMatrix(0,n); |
---|
109 | for (int i=0; i<IDELEMS(I); i++) |
---|
110 | { |
---|
111 | g = (poly) I->m[i]; pGetExpV(g,leadexpv); |
---|
112 | leadexpw = intStar2ZVector(n, leadexpv); |
---|
113 | pIter(g); |
---|
114 | while (g != NULL) |
---|
115 | { |
---|
116 | pGetExpV(g,tailexpv); |
---|
117 | tailexpw = intStar2ZVector(n, tailexpv); |
---|
118 | inequalities.appendRow(leadexpw-tailexpw); |
---|
119 | pIter(g); |
---|
120 | } |
---|
121 | } |
---|
122 | omFreeSize(leadexpv,(n+1)*sizeof(int)); |
---|
123 | omFreeSize(tailexpv,(n+1)*sizeof(int)); |
---|
124 | return gfan::ZCone(inequalities,gfan::ZMatrix(0, inequalities.getWidth())); |
---|
125 | } |
---|
126 | |
---|
127 | groebnerConeData::groebnerConeData(): |
---|
128 | I(NULL), |
---|
129 | r(NULL), |
---|
130 | c(gfan::ZCone(0)), |
---|
131 | p(gfan::ZVector(0)) |
---|
132 | { |
---|
133 | } |
---|
134 | |
---|
135 | groebnerConeData::groebnerConeData(const groebnerConeData &sigma): |
---|
136 | I(id_Copy(sigma.getIdeal(),sigma.getRing())), |
---|
137 | r(rCopy(sigma.getRing())), |
---|
138 | c(gfan::ZCone(sigma.getCone())), |
---|
139 | p(gfan::ZVector(sigma.getInteriorPoint())) |
---|
140 | { |
---|
141 | } |
---|
142 | |
---|
143 | groebnerConeData::groebnerConeData(const ideal &J, const ring &s, const gfan::ZCone &d, const gfan::ZVector &q): |
---|
144 | I(J), |
---|
145 | r(s), |
---|
146 | c(d), |
---|
147 | p(q) |
---|
148 | { |
---|
149 | } |
---|
150 | |
---|
151 | groebnerConeData::~groebnerConeData() |
---|
152 | { |
---|
153 | // if (I!=NULL) id_Delete(&I,r); |
---|
154 | // if (r!=NULL) rDelete(r); |
---|
155 | } |
---|
156 | |
---|
157 | |
---|
158 | groebnerConeData maximalGroebnerConeData(ideal I, const ring r) |
---|
159 | { |
---|
160 | int n = rVar(r); |
---|
161 | poly g = NULL; |
---|
162 | int* leadexpv = (int*) omAlloc((n+1)*sizeof(int)); |
---|
163 | int* tailexpv = (int*) omAlloc((n+1)*sizeof(int)); |
---|
164 | gfan::ZVector leadexpw = gfan::ZVector(n); |
---|
165 | gfan::ZVector tailexpw = gfan::ZVector(n); |
---|
166 | gfan::ZMatrix inequalities = gfan::ZMatrix(0,n); |
---|
167 | for (int i=0; i<IDELEMS(I); i++) |
---|
168 | { |
---|
169 | g = (poly) I->m[i]; pGetExpV(g,leadexpv); |
---|
170 | leadexpw = intStar2ZVector(n, leadexpv); |
---|
171 | pIter(g); |
---|
172 | while (g != NULL) |
---|
173 | { |
---|
174 | pGetExpV(g,tailexpv); |
---|
175 | tailexpw = intStar2ZVector(n, tailexpv); |
---|
176 | inequalities.appendRow(leadexpw-tailexpw); |
---|
177 | pIter(g); |
---|
178 | } |
---|
179 | } |
---|
180 | omFreeSize(leadexpv,(n+1)*sizeof(int)); |
---|
181 | omFreeSize(tailexpv,(n+1)*sizeof(int)); |
---|
182 | gfan::ZCone zc = gfan::ZCone(inequalities,gfan::ZMatrix(0, inequalities.getWidth())); |
---|
183 | gfan::ZVector p = zc.getRelativeInteriorPoint(); |
---|
184 | return groebnerConeData(I,r,zc,p); |
---|
185 | } |
---|
186 | |
---|
187 | /*** |
---|
188 | * Given a general ring r with any ordering, changes the ordering to wp(-w) |
---|
189 | **/ |
---|
190 | void changeOrderingTo_wp(ring r, const gfan::ZVector w) |
---|
191 | { |
---|
192 | omFree(r->order); |
---|
193 | r->order = (int*) omAlloc0(3*sizeof(int)); |
---|
194 | omFree(r->block0); |
---|
195 | r->block0 = (int*) omAlloc0(3*sizeof(int)); |
---|
196 | omFree(r->block1); |
---|
197 | r->block1 = (int*) omAlloc0(3*sizeof(int)); |
---|
198 | for (int i=0; r->wvhdl[i]; i++) omFree(r->wvhdl[i]); |
---|
199 | omFree(r->wvhdl); |
---|
200 | r->wvhdl = (int**) omAlloc0(3*sizeof(int*)); |
---|
201 | |
---|
202 | bool ok = false; |
---|
203 | r->order[0] = ringorder_wp; |
---|
204 | r->block0[0] = 1; |
---|
205 | r->block1[0] = r->N; |
---|
206 | r->wvhdl[0] = ZVectorToIntStar(w,ok); |
---|
207 | r->order[1] = ringorder_C; |
---|
208 | rComplete(r,1); |
---|
209 | } |
---|
210 | |
---|
211 | groebnerConeData::groebnerConeData(const ideal J, const ring s, const gfan::ZVector w) |
---|
212 | { |
---|
213 | r = rCopy(s); |
---|
214 | changeOrderingTo_wp(r,w); |
---|
215 | rChangeCurrRing(r); |
---|
216 | |
---|
217 | int k = idSize(J); I = idInit(k); |
---|
218 | nMapFunc identityMap = n_SetMap(s->cf,r->cf); |
---|
219 | for (int i=0; i<k; i++) |
---|
220 | I->m[i] = p_PermPoly(J->m[i],NULL,s,r,identityMap,NULL,0); |
---|
221 | intvec* nullVector = NULL; |
---|
222 | I = kStd(I,currQuotient,testHomog,&nullVector); |
---|
223 | |
---|
224 | c = sloppyGroebnerCone(I,r,w); |
---|
225 | p = c.getRelativeInteriorPoint(); |
---|
226 | } |
---|
227 | |
---|
228 | groebnerConeData::groebnerConeData(const ideal J, const ring s, const gfan::ZCone d) |
---|
229 | { |
---|
230 | c = d; |
---|
231 | p = d.getRelativeInteriorPoint(); |
---|
232 | |
---|
233 | r = rCopy(s); |
---|
234 | changeOrderingTo_wp(r,p); |
---|
235 | rChangeCurrRing(r); |
---|
236 | |
---|
237 | int k = idSize(J); I = idInit(k); |
---|
238 | nMapFunc identityMap = n_SetMap(s->cf,r->cf); |
---|
239 | for (int i=0; i<k; i++) |
---|
240 | I->m[i] = p_PermPoly(J->m[i],NULL,s,r,identityMap,NULL,0); |
---|
241 | intvec* nullVector = NULL; |
---|
242 | I = kStd(I,currQuotient,testHomog,&nullVector); |
---|
243 | } |
---|
244 | |
---|
245 | // /*** |
---|
246 | // * Given a general ring r with any ordering, changes the ordering to a(v),ws(-w) |
---|
247 | // **/ |
---|
248 | // bool changetoAWSRing(ring r, const gfan::ZVector v, const gfan::ZVector w) |
---|
249 | // { |
---|
250 | // omFree(r->order); |
---|
251 | // r->order = (int*) omAlloc0(4*sizeof(int)); |
---|
252 | // omFree(r->block0); |
---|
253 | // r->block0 = (int*) omAlloc0(4*sizeof(int)); |
---|
254 | // omFree(r->block1); |
---|
255 | // r->block1 = (int*) omAlloc0(4*sizeof(int)); |
---|
256 | // for (int i=0; r->wvhdl[i]; i++) |
---|
257 | // { omFree(r->wvhdl[i]); } |
---|
258 | // omFree(r->wvhdl); |
---|
259 | // r->wvhdl = (int**) omAlloc0(4*sizeof(int*)); |
---|
260 | |
---|
261 | // bool ok = false; |
---|
262 | // r->order[0] = ringorder_a; |
---|
263 | // r->block0[0] = 1; |
---|
264 | // r->block1[0] = r->N; |
---|
265 | // r->wvhdl[0] = ZVectorToIntStar(v,ok); |
---|
266 | // r->order[1] = ringorder_ws; |
---|
267 | // r->block0[1] = 1; |
---|
268 | // r->block1[1] = r->N; |
---|
269 | // r->wvhdl[1] = ZVectorToIntStar(w,ok); |
---|
270 | // r->order[2] = ringorder_C; |
---|
271 | // return ok; |
---|
272 | // } |
---|
273 | |
---|
274 | // groebnerConeData::groebnerConeData(const ideal J, const ring s, const gfan::ZVector w) |
---|
275 | // { |
---|
276 | // r = rCopy(s); |
---|
277 | // changeOrderingTo_wp(r,w); |
---|
278 | // rChangeCurrRing(r); |
---|
279 | |
---|
280 | // int k = idSize(J); I = idInit(k); |
---|
281 | // nMapFunc identityMap = n_SetMap(s->cf,r->cf); |
---|
282 | // for (int i=0; i<k; i++) |
---|
283 | // I->m[i] = p_PermPoly(J->m[i],NULL,s,r,nMap,NULL,0); |
---|
284 | // intvec* nullVector = NULL; |
---|
285 | // I = kStd(I,currQuotient,testHomog,&nullVector); |
---|
286 | |
---|
287 | // c = sloppyGroebnerCone(I,r,w); |
---|
288 | // p = c.getRelativeInteriorPoint(); |
---|
289 | // } |
---|
290 | |
---|
291 | gfan::ZFan* toFanStar(setOfGroebnerConeData setOfCones) |
---|
292 | { |
---|
293 | if (setOfCones.size() > 0) |
---|
294 | { |
---|
295 | setOfGroebnerConeData::iterator cone = setOfCones.begin(); |
---|
296 | gfan::ZFan* zf = new gfan::ZFan(cone->getCone().ambientDimension()); |
---|
297 | for (; cone!=setOfCones.end(); cone++) |
---|
298 | zf->insert(cone->getCone()); |
---|
299 | return zf; |
---|
300 | } |
---|
301 | else |
---|
302 | return new gfan::ZFan(gfan::ZFan::fullFan(currRing->N)); |
---|
303 | } |
---|