Borderbasix

placemon.hpp
Go to the documentation of this file.
1 //Requiers type mon to be defined somewhere else
2 //on tache de rendre l'acces a int2mon et mon2int
3 //aussi rapide que possible meme si ca coute
4 //un peu, d'inserer puisque par hypothese on fait plus
5 //d'appel a int2mon mon2int
6 //que l'on insere ou enleve de monomes dedans!
7 namespace{
8  int sizeplace;
9  mon *int2mon_;
10  mon *mon2intmon;
11  int *mon2intint;
12  int (*ord)(const mon &m1,const mon &m2);
13  int nbvars;
14 #ifdef unimul
15  int **multiple;
16 
17 #endif
18 #ifdef uninf
19  void **nfmul;
20 #endif
21 }
22 #ifdef unimul
23 
24 void displaymon()
25 {
26  cout<<"les mon"<<endl;
27  for(int i=0;i<sizeplace;i++)
28  cout<<int2mon_[i]<<" ";
29  cout<<endl;
30 }
31 
32 template<typename mon>
33 void inline int2mon(const int &i,mon &res);
34 
35 template<typename mon>
36 int inline mon2int(const mon &mm);
37 
38 inline void init_multiple(int n)
39 {
40  multiple=(int**)malloc(n*sizeof(int*));
41  for(int i=0;i<n;i++)
42  multiple[i]=NULL;
43  nbvars=n;
44 }
45 void reinit_multiple()
46 {
47  for(int i=0;i<nbvars;i++)
48  for(int j=0;j<sizeplace;j++)
49  multiple[i][j]=-2;
50 }
51 
52 template<typename typBase>
53 inline int mulind(int indexbase, int var, const typBase &b)
54 {
55  if(multiple[var][indexbase]==-2)//||(multiple[var][indexbase]>=size))
56  {
57  mon tmpmon;
58  int stock;
59  int2mon(indexbase,tmpmon);
60  tmpmon*=mon(var,1);
61  if(IsinB(tmpmon,b))
62  {
63  stock=mon2int(tmpmon);
64  multiple[var][indexbase]=stock;
65  }
66  else
67  multiple[var][indexbase]=-1;
68  }
69 // if (multiple[var][indexbase]>=0)
70 // cout<<int2mon_[indexbase]<<"*"<<mon(var,1)<<" donne "<<int2mon_[multiple[var][indexbase]]<<endl;
71  return multiple[var][indexbase];
72 }
73 #endif
74 
75 #ifdef uninf
76 template<typename pol>
77 inline void init_nf(int n)
78 {
79  nfmul=(void**)malloc(n*sizeof(pol*));
80  for(int i=0;i<n;i++)
81  *((pol**)nfmul+i)=NULL;
82 }
83 
84 template<typename pol>
85 void reinit_nf()
86 {
87  pol toto;
88  toto.size=-1;
89  for(int i=0;i<nbvars;i++)
90  for(int j=0;j<sizeplace;j++)
91  (*((pol**)nfmul+i))[j]=toto;
92 }
93 
94 template<typename pol,typename typdump,typename Base>
95 pol nf(int var ,int indmon,const typdump &dump,const Base & b)
96 {
97  // cout<<"c moi c moi"<<endl;
98  pol res;
99  if(((*((pol**)nfmul+var)))[indmon].size==-1)
100  {
101  typedef typename typdump::value_type dumpstruct;
102  typedef typename pol::monom_t mon;
103  res.nf=NULL;
104  res.size=-1;
105  mon tmpmon;//=mon(1,var)*int2mon<mon>(indmon);
106  int deg=0;//=tmpmon.GetDegree()+1;
107  typename typdump::const_iterator iter;
108  int2mon(indmon,tmpmon);
109  deg=tmpmon.GetDegree()+1;
110  tmpmon*=mon(var,1);
111  for(iter=dump.begin();
112  (iter!=dump.end()) && (iter->k!=deg);iter++);
113  if(iter!=dump.end())//on cherche pas n'importe quoi qd meme
114  {
115  int i;
116  for(i=0;i<iter->size;i++)
117  {
118  if(iter->nf[i].ind.rep==tmpmon.rep)
119  break;
120  }
121  if(i!=iter->size)
122  res=(iter->nf[i]);
123  }
124  ((*((pol**)nfmul+var)))[indmon]=res;
125  }
126  return ((*((pol**)nfmul+var)))[indmon];
127 }
128 
129 #endif
130 
131 template<typename ptrfun>
132 void setorder(ptrfun tmpord)
133 {
134  ord=(int (*)(const mon &,const mon &))(tmpord);
135 }
137 {
138  return sizeplace;
139 }
140 template<typename mon>
141 void putmon2(const mon & m,const int poscurrent)
142 {
143  int i;
144  //si le monome est deja introduit on y touche pas
145  //cout<<"putmon2 atteint"<<endl;
146  //cout<<"poscurrent "<<poscurrent<<endl;
147  //cout<<"mon2intmon==NULL?? "<<(mon2intmon==NULL)<<" m "<<m<<endl;
148  //if (poscurrent<size)
149  // cout<<((mon2intmon==NULL)||(mon2intmon[poscurrent]==m))<<endl;
150  if((mon2intmon==NULL)||(poscurrent==sizeplace)||
151  (mon2intmon[poscurrent].rep!=m.rep))
152  {
153  // cout<<"moncurent etc passe etc vaut "<<endl;
154  sizeplace++;
155 
156 
157  mon2intmon=(mon*)MAC_REV_REALLOC<mon>(mon2intmon,(sizeplace-1)*sizeof(mon)
158  ,(sizeplace)*sizeof(mon));
159  mon2intint=(int*)realloc(mon2intint,sizeplace*sizeof(int));
160 
161  //int2mon=(mon*)realloc(int2mon,size*sizeof(mon));
162  //on vient d'agrandir les tableaux
163  for(int k=sizeplace-1;k>poscurrent;k--)
164  mon2intmon[k]=mon2intmon[k-1];
165 
166  //memmove((mon2intmon+poscurrent+1),(mon2intmon+poscurrent),
167  // (size-1-poscurrent)*sizeof(mon));
168  memmove((mon2intint+poscurrent+1),(mon2intint+poscurrent),
169  (sizeplace-1-poscurrent)*sizeof(int));
170  //on cherche s'il y a un indice dans int2mon libre
171  for(i=0;i<sizeplace-1;i++)
172  if (int2mon_[i]==mon(-1)) break;
173  if (i==sizeplace-1)
174  {
175  int2mon_=(mon*)MAC_REV_REALLOC<mon>(int2mon_,(sizeplace-1)*sizeof(mon)
176  ,sizeplace*sizeof(mon));
177 #ifdef unimul
178  for(int k=0;k<nbvars;k++)
179  {
180  //cout<<"j'ai fait un realloc "<<endl;
181  multiple[k]=(int*)realloc(multiple[k],sizeplace*sizeof(int));
182  multiple[k][sizeplace-1]=-2;
183  }
184 #endif
185 #ifdef uninf
186  for(int k=0;k<nbvars;k++)
187  {
188  //cout<<"j'ai fait un realloc "<<endl;
189  *((pol<mon,COEFF>**)nfmul+k)=(pol<mon,COEFF>*)
191  ((void*)*((pol<mon,COEFF>**)nfmul+k)
192  ,(sizeplace-1)*sizeof(pol<mon,COEFF>)
193  ,sizeplace*sizeof(pol<mon,COEFF>));
194  ((pol<mon,COEFF>**)nfmul)[k][sizeplace-1].size=-1;
195  }
196 #endif
197 
198  }
199  int2mon_[i]=m;
200  //cout<<"int2mon_["<<i<<"] vaut "<<m<<endl;
201  mon2intint[poscurrent]=i;
202  mon2intmon[poscurrent]=m;
203  //cout<<"mon2intmon["<<poscurrent<<"] vaut"<<mon2intmon[poscurrent]
204  // <<" et est sense valoir "<<m<<endl;
205  }
206  return;
207 }
208 
209 template<typename mon>
210 void putmon(const mon & m)
211 {
212  int inf=0,sup=sizeplace,poscurrent=0;
213  //on commence par localiser l'endroit dans mon2int*
214  //ou on va rajouter le monom
215  if(sizeplace!=0)
216  for(poscurrent=sizeplace/2;ord(mon2intmon[poscurrent+1],
217  m)&&
218  ord(m,mon2intmon[poscurrent-1]);)
219  {
220  if(ord(mon2intmon[poscurrent],m)>0)
221  {
222  sup=poscurrent;
223  poscurrent=(inf+sup)/2;
224  }
225  else
226  {
227  inf=poscurrent;
228  poscurrent=(inf+sup)/2;
229  }
230  }
231  putmon2(m,poscurrent);
232  return ;
233 }
234 
235 
236 template<typename mon>
237 void removemon(const mon &m)
238 {
239  int inf=0,sup,poscurrent,i;
240  //on commence par localiser l'endroit dans mon2int*
241  //ou on va rajouter le monom
242  for(poscurrent=sizeplace/2;ord(mon2intmon[poscurrent+1],
243  m)&&
244  ord(m,
245  mon2intmon[poscurrent-1]);)
246  {
247  if(ord(mon2intmon[poscurrent],m)>0)
248  {
249  sup=poscurrent;
250  poscurrent=(inf+sup)/2;
251  }
252  else
253  {
254  inf=poscurrent;
255  poscurrent=(inf+sup)/2;
256  }
257  }
258  //si le monome n'est PAS deja introduit on touche a rien
259  if(mon2intmon[poscurrent]!=m)
260  {
261  //on libere l'endroit ou se trouve ce monome
262  int2mon_[poscurrent]=mon(-1);
263  //on recopier apres dans les mon2int pour enlever le monome
264  memmove((mon2intmon+poscurrent),(mon2intmon+poscurrent+1),
265  (sizeplace-poscurrent-2)*sizeof(mon));
266  memmove((mon2intint+poscurrent),(mon2intint+poscurrent+1),
267  (sizeplace-poscurrent-2)*sizeof(int));
268  //on retrecit les mon2int*
269  sizeplace--;
270  mon2intmon=(mon*)realloc(mon2intmon,sizeplace*sizeof(mon));
271  mon2intint=(int*)realloc(mon2intint,sizeplace*sizeof(int));
272  }
273  return;
274 }
275 
276 
277 template<typename mon>
278 void affplace(const mon &m,int p)
279 {
280  int2mon_[p]=m;
281 }
282 template<typename mon>
283 void freeplace(int p)
284 {
285  int2mon_[p]=mon(-1);
286 }
287 template<typename mon>
288 void inline int2mon(const int &i,mon &res)
289 {
290  res=mon(1,(int2mon_+i)->rep);
291 }
292 
293 template<typename mon>
294 int inline mon2int(const mon &mm)
295 {
296  typedef typename mon::coeff_t coeff;
297  //mon2intmon et mon2intint doivent etre trie
298  //par aordre (ord) croissant
299  //
300  int inf=0,sup=sizeplace,poscurrent;
301  mon m=mm;
302  m.SetCoeff(1);
303  // cout<<"rentre mon2int"<<endl;
304  //cout<<"size "<<size<<endl;
305  if(sizeplace==0) {mon2intmon=NULL;mon2intint=NULL;
306  int2mon_=NULL;putmon(m);
307  //cout<<"transition mon2int"<<endl;
308  };
309  //cout<<"sup "<<sup<<" inf "<<inf<<endl;
310  for(poscurrent=sizeplace/2;(sup-inf>1)&&
311  (mon2intmon[poscurrent].rep!=m.rep);)
312  {
313  // cout<<"poscurrent "<<poscurrent<<endl;
314  if(ord(mon2intmon[poscurrent],m)>0)
315  {
316  sup=poscurrent;
317  poscurrent=(inf+sup)/2;
318  }
319  else
320  {
321  inf=poscurrent;
322  poscurrent=(inf+sup)/2;
323  }
324  }
325  //cout<<"sortie for mon2int "<<poscurrent<<endl;
326  //cout<<"les monome "<<mon2intmon[poscurrent]<<" "<<m<<endl;
327  if (mon2intmon[poscurrent].rep!=m.rep)
328  {
329  if (ord(mon2intmon[poscurrent],m)<0) poscurrent++;
330  //if(poscurrent<size)
331  //cout<<"ord(mon2intmon[poscurrent],m) "
332  // <<ord(mon2intmon[poscurrent],m)<<endl;
333  //cout<<"appel putmon2 "<<endl;
334  putmon2(m,poscurrent);
335  }
336  //cout<<"sorti mon2int"<<endl;
337  return mon2intint[poscurrent];
338 }
339 
340 template<typename typPk, typename typdump>
341 void swap_all(int i, int j, typPk & Pk ,typdump& dump)
342 {
343  typedef typename typPk::value_type::monom_t mon;
344  typedef typename typdump::value_type dumpstruct;
345  mon tmpmon;
346  int deg,pos1,pos2;
347  int2mon(j,tmpmon);
348  deg=tmpmon.GetDegree();
349  // for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
350  // cout<<"swap "<<invconv<Poly>(*iter)<<endl;
351  for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
352  if(j<iter->size&&!Iszero(iter->nf[j]))
353  {
354  //cout<<"swapall "<<i<<" "<<j<<" iter->nf[j] "<<iter->nf[j]<<endl;
355  iter->nf[i]=iter->nf[j];
356  iter->nf[j]=0;
357  }
358  for(typename typdump::iterator iter=dump.begin();iter!=dump.end();iter++)
359  {
360  //if(iter->k<=deg)
361  {
362  for(typename dumpstruct::pol_t *iterdump=iter->nf;
363  iterdump!=iter->nf+iter->size;iterdump++)
364  {
365  if(j<iterdump->size&&!Iszero(iterdump->nf[j]))
366  {
367  iterdump->nf[i]=iterdump->nf[j];
368  iterdump->nf[j]=0;
369  }
370  }
371  }
372  }
373  tmpmon=int2mon_[i];
374  int2mon_[i]=int2mon_[j];
375  int2mon_[j]=tmpmon;
376  for(pos1=0;mon2intint[pos1]!=j;pos1++);
377  for(pos2=0;mon2intint[pos2]!=i;pos2++);
378  mon2intint[pos1]=i;
379  mon2intint[pos2]=j;
380 
381 #ifdef unimul
382  for(int k=0;k<nbvars;k++)
383  {
384  for(int l=0;l<sizeplace;l++)
385  {
386  if(multiple[k][l]==i)
387  multiple[k][l]=j;
388  else if(multiple[k][l]==j)
389  multiple[k][l]=i;
390  }
391  int stock=multiple[k][i];
392  multiple[k][i]=multiple[k][j];
393  multiple[k][j]=stock;
394  }
395 #endif
396 #ifdef uninf
397  for(int k=0;k<nbvars;k++)
398  {
399  pol<mon,COEFF> stock=(*((pol<mon,COEFF>**)nfmul+k))[i];
400  (*((pol<mon,COEFF>**)nfmul+k))[i]=(*((pol<mon,COEFF>**)nfmul+k))[j];
401  (*((pol<mon,COEFF>**)nfmul+k))[j]=stock;
402  }
403 #endif
404 
405 }
406 
407 void freeint2mon(int k)
408 {
409  //memmove(int2mon_+k,int2mon_+j+1,(size-j-1)*sizeof(mon));
410  int2mon_=(mon*)MAC_REV_REALLOC<mon>(int2mon_,sizeplace*sizeof(mon)
411  ,(k)*sizeof(mon));
412 #ifdef unimul
413  for(int i=0;i<nbvars;i++)
414  multiple[i]=(int *)realloc(multiple[i],k*sizeof(int));
415 #endif
416 #ifdef uninf
417  for(int i=0;i<nbvars;i++)
418  ((pol<mon,COEFF>**)nfmul)[i]=(pol<mon,COEFF>*)
420  ((pol<mon,COEFF>**)nfmul)[i],sizeplace*sizeof(pol<mon,COEFF>),
421  k*sizeof(pol<mon,COEFF>));
422 
423 
424 #endif
425 }
426 void freemon(int j)
427 {
428  int k;
429  //memmove(int2mon_+j,int2mon_+j+1,(size-j-1)*sizeof(mon));
430  //int2mon_=(mon*)MAC_REV_REALLOC<mon>(int2mon_,size*sizeof(mon)
431  // ,(size-1)*sizeof(mon));
432  for(k=0;mon2intint[k]!=j;k++);
433  //cout<<"k "<<k<<" et size "<<size<<endl;
434  memmove(mon2intint+k,mon2intint+k+1,(sizeplace-k-1)*sizeof(int));
435  for(int i=k;i<sizeplace-1;i++)
436  mon2intmon[i]=mon2intmon[i+1];
437  mon2intmon[sizeplace-1]=mon(0);
438  //memmove(mon2intmon+k,mon2intmon+k+1,(size-k-1)*sizeof(mon));
439  mon2intint=(int*)MAC_REV_REALLOC<int>(mon2intint,sizeplace*sizeof(int)
440  ,(sizeplace-1)*sizeof(int));
441  mon2intmon=(mon*)MAC_REV_REALLOC<mon>(mon2intmon,sizeplace*sizeof(mon)
442  ,(sizeplace-1)*sizeof(mon));
443  sizeplace--;
444 }
445 
446 void serveurcompress(int i)
447 {
448  int tmpsize=sizeplace;
449  freeint2mon(i+2);
450  for(int k=i+2;k<tmpsize;k++)
451  freemon(k);
452  //for(int j=0;j<size;j++)
453  // cout<<j<<" les pos possibles "<<mon2intint[j]<<" "<<mon2intmon[j]<<" int2mon "<<int2mon_[mon2intint[j]]<<endl;
454  // size=i+2;
455 }
456 
457 template<typename typPk, typename typdump>
458 void Docompress(int i, typPk & Pk, typdump& dump)
459 {
460  typedef typename typPk::value_type::monom_t mon;
461  typedef typename typPk::value_type::coeff_t coeff;
462  typedef typename typdump::value_type dumpstruct;
463  mon tmpmon;
464 
465  for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
466  if(i<iter->size)
467  {
468  int k;
469  for(k=i;k>=0&&Iszero(iter->nf[k]);k--);
470  // cout<<" do compress K "<<k<<" "<<iter->nf[k]<<endl;
471  iter->nf=(coeff*)MAC_REV_REALLOC<coeff>(iter->nf
472  ,iter->size*sizeof(coeff)
473  ,(k+1)*sizeof(coeff));
474  //cout<<"I "<<i<<" et iter->size "<<iter->size<<endl;
475  iter->size=k+1;
476  }
477 
478  for(typename typdump::iterator iter=dump.begin();
479  iter!=dump.end();iter++)
480  //if(iter!=dump.rend())
481  {
482  for(typename dumpstruct::pol_t *iterdump=iter->nf;
483  iterdump!=iter->nf+iter->size;iterdump++)
484  if(i<iterdump->size)
485  {
486  int k;
487  for(k=i;k>=0&&Iszero(iterdump->nf[k]);k--);
488  iterdump->nf=(coeff*)MAC_REV_REALLOC<coeff>(iterdump->nf
489  ,iterdump->size*sizeof(coeff)
490  ,(k+1)*sizeof(coeff));
491  iterdump->size=k+1;
492  }
493  }
494 }
495 
496 template<typename typdump, typename Base, typename typPk>
497 void compress(typPk & Pk, typdump & dump, const Base &b, int k)
498 {
499  //return;
500  typedef typename typPk::value_type pol;
501  typedef typename pol::monom_t mon;
502  mon tmpmon;
503  int i=0;int j=sizeplacemon()-1;
504  //cout<<"Docompress"<<endl;
505  for(i=0;i<j;i++)
506  {
507  int2mon(i,tmpmon);
508  if(!IsinB(tmpmon,b))
509  //On peut le virer
510  {
511  for(;j>i;j--)
512  {
513  int2mon(j,tmpmon);
514  if(IsinB(tmpmon,b))
515  break;
516  }
517  if(i==j) break; //c fini on a plus rien a faire ici
518  // cout<<" swap "<<i<<" "<<int2mon_[i]<<" et "<<j<<" "<<int2mon_[j]<<endl;
519  swap_all(i,j,Pk,dump);
520  }
521 
522  }
523  int2mon(i,tmpmon);
524  for(;!IsinB(tmpmon,b);i--)
525  {
526  int2mon(i,tmpmon);
527  //cout<<"tmp mon "<<tmpmon<<endl;
528  }
529  Docompress(i+1,Pk,dump);
530  serveurcompress(i);
531 }
532 
533 
534 
535 template<typename typPk, typename typdump>
536 void swap_all(int i, int j, typPk & Pk , typPk & redspol,typdump& dump)
537 {
538  typedef typename typPk::value_type::monom_t mon;
539  typedef typename typdump::value_type dumpstruct;
540  mon tmpmon;
541  int deg,pos1,pos2;
542  int2mon(j,tmpmon);
543  deg=tmpmon.GetDegree();
544  // for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
545  // cout<<"swap "<<invconv<Poly>(*iter)<<endl;
546  for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
547  if(j<iter->size&&!Iszero(iter->nf[j]))
548  {
549  //cout<<"swapall "<<i<<" "<<j<<" iter->nf[j] "<<iter->nf[j]<<endl;
550  iter->nf[i]=iter->nf[j];
551  iter->nf[j]=0;
552  }
553  for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++)
554  if(j<iter->size&&!Iszero(iter->nf[j]))
555  {
556  //cout<<"swapall "<<i<<" "<<j<<" iter->nf[j] "<<iter->nf[j]<<endl;
557  iter->nf[i]=iter->nf[j];
558  iter->nf[j]=0;
559  }
560 
561  for(typename typdump::iterator iter=dump.begin();iter!=dump.end();iter++)
562  {
563  //if(iter->k<=deg)
564  {
565  for(typename dumpstruct::pol_t *iterdump=iter->nf;
566  iterdump!=iter->nf+iter->size;iterdump++)
567  {
568  if(j<iterdump->size&&!Iszero(iterdump->nf[j]))
569  {
570  iterdump->nf[i]=iterdump->nf[j];
571  iterdump->nf[j]=0;
572  }
573  }
574  }
575  }
576  tmpmon=int2mon_[i];
577  int2mon_[i]=int2mon_[j];
578  int2mon_[j]=tmpmon;
579  for(pos1=0;mon2intint[pos1]!=j;pos1++);
580  for(pos2=0;mon2intint[pos2]!=i;pos2++);
581  mon2intint[pos1]=i;
582  mon2intint[pos2]=j;
583 
584 #ifdef unimul
585  for(int k=0;k<nbvars;k++)
586  {
587  for(int l=0;l<sizeplace;l++)
588  {
589  if(multiple[k][l]==i)
590  multiple[k][l]=j;
591  else if(multiple[k][l]==j)
592  multiple[k][l]=i;
593  }
594  int stock=multiple[k][i];
595  multiple[k][i]=multiple[k][j];
596  multiple[k][j]=stock;
597  }
598 #endif
599 #ifdef uninf
600  for(int k=0;k<nbvars;k++)
601  {
602  pol<mon,COEFF> stock=(*((pol<mon,COEFF>**)nfmul+k))[i];
603  (*((pol<mon,COEFF>**)nfmul+k))[i]=(*((pol<mon,COEFF>**)nfmul+k))[j];
604  (*((pol<mon,COEFF>**)nfmul+k))[j]=stock;
605  }
606 #endif
607 
608 }
609 
610 template<typename typPk, typename typdump>
611 void Docompress(int i, typPk & Pk, typPk & redspol,typdump& dump)
612 {
613  typedef typename typPk::value_type::monom_t mon;
614  typedef typename typPk::value_type::coeff_t coeff;
615  typedef typename typdump::value_type dumpstruct;
616  mon tmpmon;
617 
618  for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
619  if(i<iter->size)
620  {
621  int k;
622  for(k=i;k>=0&&Iszero(iter->nf[k]);k--);
623  // cout<<" do compress K "<<k<<" "<<iter->nf[k]<<endl;
624  iter->nf=(coeff*)MAC_REV_REALLOC<coeff>(iter->nf
625  ,iter->size*sizeof(coeff)
626  ,(k+1)*sizeof(coeff));
627  //cout<<"I "<<i<<" et iter->size "<<iter->size<<endl;
628  iter->size=k+1;
629  }
630  for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++)
631  if(i<iter->size)
632  {
633  int k;
634  for(k=i;k>=0&&Iszero(iter->nf[k]);k--);
635  // cout<<" do compress K "<<k<<" "<<iter->nf[k]<<endl;
636  iter->nf=(coeff*)MAC_REV_REALLOC<coeff>(iter->nf
637  ,iter->size*sizeof(coeff)
638  ,(k+1)*sizeof(coeff));
639  //cout<<"I "<<i<<" et iter->size "<<iter->size<<endl;
640  iter->size=k+1;
641  }
642 
643  for(typename typdump::iterator iter=dump.begin();
644  iter!=dump.end();iter++)
645  //if(iter!=dump.rend())
646  {
647  for(typename dumpstruct::pol_t *iterdump=iter->nf;
648  iterdump!=iter->nf+iter->size;iterdump++)
649  if(i<iterdump->size)
650  {
651  int k;
652  for(k=i;k>=0&&Iszero(iterdump->nf[k]);k--);
653  iterdump->nf=(coeff*)MAC_REV_REALLOC<coeff>(iterdump->nf
654  ,iterdump->size*sizeof(coeff)
655  ,(k+1)*sizeof(coeff));
656  iterdump->size=k+1;
657  }
658  }
659 }
660 
661 template<typename typdump, typename Base, typename typPk>
662 void compress(typPk & Pk, typPk &redspol,typdump & dump, const Base &b, int k)
663 {
664  //return;
665  typedef typename typPk::value_type pol;
666  typedef typename pol::monom_t mon;
667  mon tmpmon;
668  int i=0;int j=sizeplacemon()-1;
669  //cout<<"Docompress"<<endl;
670  for(i=0;i<j;i++)
671  {
672  int2mon(i,tmpmon);
673  if(!IsinB(tmpmon,b))
674  //On peut le virer
675  {
676  for(;j>i;j--)
677  {
678  int2mon(j,tmpmon);
679  if(IsinB(tmpmon,b))
680  break;
681  }
682  if(i==j) break; //c fini on a plus rien a faire ici
683  // cout<<" swap "<<i<<" "<<int2mon_[i]<<" et "<<j<<" "<<int2mon_[j]<<endl;
684  swap_all(i,j,Pk,redspol,dump);
685  }
686 
687  }
688  int2mon(i,tmpmon);
689  for(;!IsinB(tmpmon,b);i--)
690  {
691  int2mon(i,tmpmon);
692  //cout<<"tmp mon "<<tmpmon<<endl;
693  }
694  Docompress(i+1,Pk,redspol,dump);
695  serveurcompress(i);
696 }
698 {
699  MAC_REV_FREE<mon>(int2mon_,sizeplace*sizeof(mon));
700  MAC_REV_FREE<mon>(mon2intmon,sizeplace*sizeof(mon));
701  free(mon2intint);
702  sizeplace=0;
703 
704 }
void removemon(const mon &m)
Definition: placemon.hpp:237
void freemon(int j)
Definition: placemon.hpp:426
void * MAC_REV_REALLOC(void *ptr, int size, int newsize)
Definition: memory.hpp:49
Definition: dump.hpp:2
void free(void *)
void freeint2mon(int k)
Definition: placemon.hpp:407
void freeplace(int p)
Definition: placemon.hpp:283
Definition: pol.hpp:6
void compress(typPk &Pk, typdump &dump, const Base &b, int k)
Definition: placemon.hpp:497
typpol nf(int var, int indmon, const typdump &dump, const Base &b)
Definition: corealgo.hpp:1001
void swap_all(int i, int j, typPk &Pk, typdump &dump)
Definition: placemon.hpp:341
void * malloc(YYSIZE_T)
void Docompress(int i, typPk &Pk, typdump &dump)
Definition: placemon.hpp:458
int mon2int(const mon &mm)
Definition: placemon.hpp:294
MSKconetypee MSKrealt MSKint32t MSKint32t j
Definition: mosek.h:2421
void int2mon(const int &i, mon &res)
Definition: placemon.hpp:288
MSKint32t k
Definition: mosek.h:2713
R rep
Definition: Monom.hpp:30
C coeff_t
Definition: Monom.hpp:26
void putmon(const mon &m)
Definition: placemon.hpp:210
void affplace(const mon &m, int p)
Definition: placemon.hpp:278
void serveurcompress(int i)
Definition: placemon.hpp:446
int IsinB(const mon &m, const Base &b)
Definition: IsinB3.hpp:68
Mon mon
Definition: solver_bb_floating.cpp:136
Definition: types.hpp:14
exponent_t GetDegree() const
Definition: Monom.hpp:70
MSKint32t MSKint32t MSKint32t i
Definition: mosek.h:2278
int Iszero(const Scl< MPQ > &c)
Definition: Iszero.hpp:14
int sizeplacemon()
Definition: placemon.hpp:136
void putmon2(const mon &m, const int poscurrent)
Definition: placemon.hpp:141
int size
Definition: pol.hpp:10
#define pol
Definition: pol2ter.hpp:3
void SetCoeff(const C &c)
Definition: Monom.hpp:68
void freeplacemon()
Definition: placemon.hpp:697
Multivariate monomials.
Definition: Monom.hpp:21
void setorder(ptrfun tmpord)
Definition: placemon.hpp:132
T * nf
Definition: pol.hpp:12
Home  |  Download & InstallContributions