Borderbasix

placemon3sdp.hpp
Go to the documentation of this file.
1 #ifndef ALREADY_placemon3
2 #define ALREADY_placemon3
3 //Requiers type mon to be defined somewhere else
4 //on tache de rendre l'acces a int2mon et mon2int
5 //aussi rapide que possible meme si ca coute
6 //un peu, d'inserer puisque par hypothese on fait plus
7 //d'appel a int2mon mon2int
8 //que l'on insere ou enleve de monomes dedans!
9 template<class mon,typename pol>
10 struct monomial_server{
11  typedef mon monom_t;
12  typedef pol pol_t;
13  int sizeplace;
14  mon *int2mon_;
15  mon *mon2intmon;
16  int *mon2intint;
17  int (*ord)(const mon &m1,const mon &m2);
18  int nbvars;
19 #ifdef unimul
20  int **multiple;
21 #endif
22 
23 #ifdef uninf
24  void **nfmul;
25 #endif
26 
27 #ifdef unimul
28 
29 void displaymon()
30 {
31  cout<<"les mon"<<endl;
32  for(int i=0;i<sizeplace;i++)
33  cout<<int2mon_[i]<<" ";
34  cout<<endl;
35 }
37  MAC_REV_FREE<mon>(int2mon_,sizeplace*sizeof(mon));
38  MAC_REV_FREE<mon>(mon2intmon,sizeplace*sizeof(mon));
39  MAC_REV_FREE<int>(mon2intint,sizeplace*sizeof(int));
40 #ifdef unimul
41  for(int i=0;i<nbvars;i++)
42  free(multiple[i]);
43  free(multiple);
44 #endif
45 
46 #ifdef uninf
47  for(int i=0;i<nbvars;i++)
48  free(nfmul[i]);
49  free(nfmul);
50 
51 #endif
52  }
53  monomial_server() {
54  sizeplace=0;int2mon_=NULL;mon2intmon=NULL;mon2intint=NULL;
55  ord=NULL;
56  }
57 
58  //template<typename mon>
59  //void inline int2mon(const int &i,mon &res);
60 
61  //template<typename mon>
62  //int inline mon2int(const mon &mm);
63 
64 inline void init_multiple(int n)
65 {
66  multiple=(int**)malloc(n*sizeof(int*));
67  for(int i=0;i<n;i++)
68  multiple[i]=NULL;
69  nbvars=n;
70 }
71 void reinit_multiple()
72 {
73  for(int i=0;i<nbvars;i++)
74  for(int j=0;j<sizeplace;j++)
75  multiple[i][j]=-2;
76 }
77 
78 template<typename typBase>
79 inline int mulind(int indexbase, int var, const typBase &b)
80 {
81  mon tmpdebug=mon(1,1)*mon(3,1);
82  //cout<<"multiple[var][indexbase]"<<multiple[var][indexbase]<<endl;
83  if(multiple[var][indexbase]==-2)//||(multiple[var][indexbase]>=size))
84  {
85  mon tmpmon;
86  int stock;
87  int2mon(indexbase,tmpmon);
88  tmpmon*=mon(var,1);
89  if(IsinB(tmpmon,b))
90  {
91  stock=mon2int(tmpmon);
92  multiple[var][indexbase]=stock;
93  }
94  else
95  multiple[var][indexbase]=-1;
96  }
97 // if (multiple[var][indexbase]>=0)
98 // cout<<int2mon_[indexbase]<<"*"<<mon(var,1)<<" donne "<<int2mon_[multiple[var][indexbase]]<<endl;
99  return multiple[var][indexbase];
100 }
101 #endif
102 
103 #ifdef uninf
104 //template<typename pol>
105 inline void init_nf(int n)
106 {
107  nfmul=(void**)malloc(n*sizeof(pol*));
108  for(int i=0;i<n;i++)
109  *((pol**)nfmul+i)=NULL;
110 }
111 
112 //template<typename pol>
113 void reinit_nf()
114 {
115  pol toto;
116  toto.size=-1;
117  for(int i=0;i<nbvars;i++)
118  for(int j=0;j<sizeplace;j++)
119  (*((pol**)nfmul+i))[j]=toto;
120 }
121 
122 template<typename typdump,typename Base>
123 pol nf(int var ,int indmon,const typdump &dump,const Base & b)
124 {
125  // cout<<"c moi c moi"<<endl;
126  pol res;
127  if(((*((pol**)nfmul+var)))[indmon].size==-1)
128  {
129  typedef typename typdump::value_type dumpstruct;
130  //typedef typename pol::monom_t mon;
131  res.nf=NULL;
132  res.size=-1;
133  mon tmpmon;//=mon(1,var)*int2mon<mon>(indmon);
134  int deg=0;//=tmpmon.GetDegree()+1;
135  typename typdump::const_iterator iter;
136  int2mon(indmon,tmpmon);
137  deg=tmpmon.GetDegree()+1;
138  tmpmon*=mon(var,1);
139  for(iter=dump.begin();
140  (iter!=dump.end()) && (iter->k!=deg);iter++);
141  if(iter!=dump.end())//on cherche pas n'importe quoi qd meme
142  {
143  int i;
144  for(i=0;i<iter->size;i++)
145  {
146  if(iter->nf[i].ind.rep==tmpmon.rep)
147  break;
148  }
149  if(i!=iter->size)
150  res=(iter->nf[i]);
151  }
152  ((*((pol**)nfmul+var)))[indmon]=res;
153  }
154  return ((*((pol**)nfmul+var)))[indmon];
155 }
156 
157 #endif
158 
159 template<typename ptrfun>
160 void setorder(ptrfun tmpord)
161 {
162  ord=(int (*)(const mon &,const mon &))(tmpord);
163 }
165 {
166  return sizeplace;
167 }
168 
169  //template<typename mon>
170 void putmon2(const mon & m,const int poscurrent)
171 {
172  int i;
173  //si le monome est deja introduit on y touche pas
174  //cout<<"putmon2 atteint"<<endl;
175  //cout<<"poscurrent "<<poscurrent<<endl;
176  //cout<<"mon2intmon==NULL?? "<<(mon2intmon==NULL)<<" m "<<m<<endl;
177  //if (poscurrent<size)
178  // cout<<((mon2intmon==NULL)||(mon2intmon[poscurrent]==m))<<endl;
179  if((mon2intmon==NULL)||(poscurrent==sizeplace)||
180  (mon2intmon[poscurrent].rep!=m.rep))
181  {
182  // cout<<"moncurent etc passe etc vaut "<<endl;
183  sizeplace++;
184 
185 
186  mon2intmon=(mon*)MAC_REV_REALLOC<mon>(mon2intmon,(sizeplace-1)*sizeof(mon)
187  ,(sizeplace)*sizeof(mon));
188  mon2intint=(int*)realloc(mon2intint,sizeplace*sizeof(int));
189 
190  //int2mon=(mon*)realloc(int2mon,size*sizeof(mon));
191  //on vient d'agrandir les tableaux
192  for(int k=sizeplace-1;k>poscurrent;k--)
193  mon2intmon[k]=mon2intmon[k-1];
194 
195  //memmove((mon2intmon+poscurrent+1),(mon2intmon+poscurrent),
196  // (size-1-poscurrent)*sizeof(mon));
197  memmove((mon2intint+poscurrent+1),(mon2intint+poscurrent),
198  (sizeplace-1-poscurrent)*sizeof(int));
199  //on cherche s'il y a un indice dans int2mon libre
200  for(i=0;i<sizeplace-1;i++)
201  if (int2mon_[i]==mon(-1)) break;
202  if (i==sizeplace-1)
203  {
204  int2mon_=(mon*)MAC_REV_REALLOC<mon>(int2mon_,(sizeplace-1)*sizeof(mon)
205  ,sizeplace*sizeof(mon));
206 #ifdef unimul
207  for(int k=0;k<nbvars;k++)
208  {
209  //cout<<"j'ai fait un realloc "<<endl;
210  multiple[k]=(int*)realloc(multiple[k],sizeplace*sizeof(int));
211  multiple[k][sizeplace-1]=-2;
212  }
213 #endif
214 #ifdef uninf
215  for(int k=0;k<nbvars;k++)
216  {
217  //cout<<"j'ai fait un realloc "<<endl;
218  *((pol**)nfmul+k)=(pol*)
219  MAC_REV_REALLOC<pol >
220  ((void*)*((pol**)nfmul+k)
221  ,(sizeplace-1)*sizeof(pol)
222  ,sizeplace*sizeof(pol));
223  ((pol**)nfmul)[k][sizeplace-1].size=-1;
224  }
225 #endif
226 
227  }
228  int2mon_[i]=m;
229  //cout<<"int2mon_["<<i<<"] vaut "<<m<<endl;
230  mon2intint[poscurrent]=i;
231  mon2intmon[poscurrent]=m;
232  //cout<<"mon2intmon["<<poscurrent<<"] vaut"<<mon2intmon[poscurrent]
233  // <<" et est sense valoir "<<m<<endl;
234  }
235  return;
236 }
237 
238  //template<typename mon>
239 void putmon(const mon & m)
240 {
241  int inf=0,sup=sizeplace,poscurrent=0;
242  //on commence par localiser l'endroit dans mon2int*
243  //ou on va rajouter le monom
244  if(sizeplace!=0)
245  for(poscurrent=sizeplace/2;ord(mon2intmon[poscurrent+1],
246  m)&&
247  ord(m,mon2intmon[poscurrent-1]);)
248  {
249  if(ord(mon2intmon[poscurrent],m)>0)
250  {
251  sup=poscurrent;
252  poscurrent=(inf+sup)/2;
253  }
254  else
255  {
256  inf=poscurrent;
257  poscurrent=(inf+sup)/2;
258  }
259  }
260  putmon2(m,poscurrent);
261  return ;
262 }
263 
264 
265  //template<typename mon>
266 void removemon(const mon &m)
267 {
268  int inf=0,sup,poscurrent,i;
269  //on commence par localiser l'endroit dans mon2int*
270  //ou on va rajouter le monom
271  for(poscurrent=sizeplace/2;ord(mon2intmon[poscurrent+1],
272  m)&&
273  ord(m,
274  mon2intmon[poscurrent-1]);)
275  {
276  if(ord(mon2intmon[poscurrent],m)>0)
277  {
278  sup=poscurrent;
279  poscurrent=(inf+sup)/2;
280  }
281  else
282  {
283  inf=poscurrent;
284  poscurrent=(inf+sup)/2;
285  }
286  }
287  //si le monome n'est PAS deja introduit on touche a rien
288  if(mon2intmon[poscurrent]!=m)
289  {
290  //on libere l'endroit ou se trouve ce monome
291  int2mon_[poscurrent]=mon(-1);
292  //on recopier apres dans les mon2int pour enlever le monome
293  memmove((mon2intmon+poscurrent),(mon2intmon+poscurrent+1),
294  (sizeplace-poscurrent-2)*sizeof(mon));
295  memmove((mon2intint+poscurrent),(mon2intint+poscurrent+1),
296  (sizeplace-poscurrent-2)*sizeof(int));
297  //on retrecit les mon2int*
298  // cout<<"la"<<endl;
299  sizeplace--;
300  mon2intmon=(mon*)realloc(mon2intmon,sizeplace*sizeof(mon));
301  mon2intint=(int*)realloc(mon2intint,sizeplace*sizeof(int));
302  }
303  return;
304 }
305 
306 
307  //template<typename mon>
308 void affplace(const mon &m,int p)
309 {
310  int2mon_[p]=m;
311 }
312 
313  //template<typename mon>
314 void freeplace(int p)
315 {
316  int2mon_[p]=mon(-1);
317 }
318 
319  //template<typename mon>
320 void inline int2mon(const int &i,mon &res)
321 {
322  // cout<<"sizeplace ici "<<sizeplace<<" et i "<<i<<endl;
323  res=mon(1,(int2mon_+i)->rep);
324 }
325 
326  //template<typename mon>
327 int inline mon2int(const mon &mm)
328 {
329  typedef typename mon::coeff_t coeff;
330  //mon2intmon et mon2intint doivent etre trie
331  //par ordre (ord) croissant
332  //
333  int inf=0,sup=sizeplace,poscurrent;
334  mon m=mm;
335  m.SetCoeff(1);
336  // cout<<"rentre mon2int"<<endl;
337  //cout<<"size "<<size<<endl;
338  if(sizeplace==0) {mon2intmon=NULL;mon2intint=NULL;
339  int2mon_=NULL;putmon(m);
340  //cout<<"transition mon2int"<<endl;
341  };
342  //cout<<"sup "<<sup<<" inf "<<inf<<endl;
343  for(poscurrent=sizeplace/2;(sup-inf>1)&&
344  (mon2intmon[poscurrent].rep!=m.rep);)
345  {
346  // cout<<"poscurrent "<<poscurrent<<endl;
347  if(ord(mon2intmon[poscurrent],m)>0)
348  {
349  sup=poscurrent;
350  poscurrent=(inf+sup)/2;
351  }
352  else
353  {
354  inf=poscurrent;
355  poscurrent=(inf+sup)/2;
356  }
357  }
358  //cout<<"sortie for mon2int "<<poscurrent<<endl;
359  //cout<<"les monome "<<mon2intmon[poscurrent]<<" "<<m<<endl;
360  if (mon2intmon[poscurrent].rep!=m.rep)
361  {
362  if (ord(mon2intmon[poscurrent],m)<0) poscurrent++;
363  //if(poscurrent<size)
364  //cout<<"ord(mon2intmon[poscurrent],m) "
365  // <<ord(mon2intmon[poscurrent],m)<<endl;
366  //cout<<"appel putmon2 "<<endl;
367  putmon2(m,poscurrent);
368  }
369  //cout<<"sorti mon2int"<<endl;
370  return mon2intint[poscurrent];
371 }
372 
373 template<typename typPk, typename typdump>
374 void swap_all(int i, int j, typPk & Pk ,typdump& dump)
375 {
376  //hypothese i<j
377  //
378  typedef typename typPk::value_type::coeff_t coeff;
379  //typedef typename typPk::value_type::monom_t mon;
380  typedef typename typdump::value_type dumpstruct;
381  mon tmpmon,tmpmon2;
382  int deg,pos1,pos2;
383  int2mon(j,tmpmon);
384  int2mon(i,tmpmon2);
385  deg=tmpmon.GetDegree();
386 #ifdef DEB
387  for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
388  cout<<"swap "<<invconv<Poly>(*iter)<<endl;
389  cout<<"je swap "<<tmpmon<<" et "<<tmpmon2<<endl;
390 #endif
391  for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
392  if(j/8<iter->sizenf && ((iter->nfind[j/8]>>(j%8))&1))
393  {
394 #ifdef DEB
395  cout<<"swapall "<<i<<" "<<j<<" iter->nf[j] "<<endl;
396  //cout<<"x1*x3 a pour indice "<<mon2int(mon(1,1)*mon(3,1))<<endl;
397 #endif
398  int nbentre=0;
399  int indicej=0,indicei=0;
400  coeff tmp;
401  for(int k=i/8+1;k<=j/8;k++)
402  nbentre+=nbbits[iter->nfind[k]];
403  nbentre+=nbbits[iter->nfind[i/8]>>(i%8)];
404  nbentre-=nbbits[iter->nfind[j/8]>>(j%8)];
405  //nbentre--;
406  //nbentre-=2;//on compt i et j dedans dans les formules precedentes
407 
408  for(int k=iter->sizenf-1;k>j/8;k--)
409  indicej+=nbbits[iter->nfind[k]];
410  indicej+=nbbits[iter->nfind[j/8]>>(j%8)];
411  // indicej--;
412  for(int k=iter->sizenf-1;k>i/8;k--)
413  indicei+=nbbits[iter->nfind[k]];
414  indicei+=nbbits[iter->nfind[i/8]>>(i%8)];
415 #ifdef DEB
416  cout<<iter->size<<endl<<indicej<<endl<<nbentre<<endl;
417  cout<<"iter->size-indicej-nbentre+1 "<<iter->size-indicej-nbentre+1<<" et indice i "<<indicei<<" indicej "<<indicej<<endl;
418 
419  cout<<"iter->nf[iter-szie-indicej] "
420  <<iter->nf[iter->size-indicej]<<endl;
421  cout<<"iter->nf[iter-size-indicej-nbentre] "
422  <<iter->nf[iter->size-indicej-nbentre]<<endl;
423 #endif
424  tmp=iter->nf[iter->size-indicej];
425  if((iter->nfind[i/8]>>(i%8))&1)
426  {
427  iter->nf=(coeff*)MAC_REV_REALLOC<coeff>(iter->nf
428  ,iter->size*sizeof(coeff)
429  ,(iter->size-1)*sizeof(coeff));
430  iter->nf[iter->size-indicej-nbentre]=tmp;
431  iter->nfind[i/8]|=1<<(i%8);
432  iter->nfind[j/8]&=~(1<<(j%8));
433  iter->size--;
434  }
435  else
436  {
437  for(int k=0;k<nbentre;k++)
438  iter->nf[iter->size-indicej-k]=iter->nf[iter->size-indicej-k-1];
439  iter->nf[iter->size-indicej-nbentre]=tmp;
440  iter->nfind[i/8]|=1<<(i%8);
441  iter->nfind[j/8]&=~(1<<(j%8));
442 
443  }
444  // iter->nf[i]=iter->nf[j];
445  // iter->nf[j]=0;
446 #ifdef DEB
447  if ((iter->sizenf*8>sizeplace) && ((iter->nfind[iter->sizenf-1]
448  >>(sizeplace%8))&1))
449  {cout<<"swapall "<<iter->sizenf<<" "<<sizeplace<<endl;exit(10);}
450 #endif
451  }
452  for(typename typdump::iterator iter=dump.begin();iter!=dump.end();iter++)
453  {
454 
455  //if(iter->k<=deg)
456  {
457  for(typename dumpstruct::pol_t *iterdump=iter->nf;
458  iterdump!=iter->nf+iter->size;iterdump++)
459  {
460 
461  if(j/8<iterdump->sizenf && (iterdump->nfind[j/8]>>(j%8))&1)
462  {
463  //cout<<"swapall "<<i<<" "<<j<<
464  //" iter->nf[j] "<<iter->nf[j]<<endl;
465  int nbentre=0;
466  int indicej=0;
467  coeff tmp;
468  for(int k=i/8+1;k<=j/8;k++)
469  nbentre+=nbbits[iterdump->nfind[k]];
470  nbentre+=nbbits[iterdump->nfind[i/8]>>(i%8)];
471  nbentre-=nbbits[iterdump->nfind[j/8]>>(j%8)];
472 
473  for(int k=iterdump->sizenf-1;k>j/8;k--)
474  indicej+=nbbits[iterdump->nfind[k]];
475  indicej+=nbbits[iterdump->nfind[j/8]>>(j%8)];
476 
477  tmp=iterdump->nf[iterdump->size-indicej];
478  if((iterdump->nfind[i/8]>>(i%8))&1)
479  {
480  iterdump->nf=(coeff*)
481  MAC_REV_REALLOC<coeff>(iterdump->nf
482  ,iterdump->size*sizeof(coeff)
483  ,(iterdump->size-1)*sizeof(coeff));
484  iterdump->nf[iterdump->size-indicej-nbentre]=tmp;
485  iterdump->nfind[i/8]|=1<<(i%8);
486  iterdump->nfind[j/8]&=~(1<<(j%8));//^=1<<(j%8);
487  iterdump->size--;
488 
489  }
490  else
491  {
492  for(int k=0;k<nbentre;k++)
493  iterdump->nf[iterdump->size-indicej-k]
494  =iterdump->nf[iterdump->size-indicej-k-1];
495  iterdump->nf[iterdump->size-indicej-nbentre]=tmp;
496  iterdump->nfind[i/8]|=1<<(i%8);
497  iterdump->nfind[j/8]&=~(1<<(j%8));//^=1<<(j%8);
498  }
499  // iter->nf[i]=iter->nf[j];
500  // iter->nf[j]=0;
501 #ifdef DEB
502  if ((iterdump->sizenf*8>sizeplace) && ((iterdump->nfind[iterdump->sizenf-1]
503  >>(sizeplace%8))&1))
504  {cout<<"swapall "<<iterdump->sizenf<<" "<<sizeplace<<endl;exit(10);}
505 #endif
506  }
507 
508  }
509  }
510  }
511  tmpmon=int2mon_[i];
512  int2mon_[i]=int2mon_[j];
513  int2mon_[j]=tmpmon;
514  for(pos1=0;mon2intint[pos1]!=j;pos1++);
515  for(pos2=0;mon2intint[pos2]!=i;pos2++);
516  mon2intint[pos1]=i;
517  mon2intint[pos2]=j;
518 
519 #ifdef unimul
520  for(int k=0;k<nbvars;k++)
521  {
522  for(int l=0;l<sizeplace;l++)
523  {
524  if(multiple[k][l]==i)
525  multiple[k][l]=j;
526  else if(multiple[k][l]==j)
527  multiple[k][l]=i;
528  }
529  int stock=multiple[k][i];
530  multiple[k][i]=multiple[k][j];
531  multiple[k][j]=stock;
532  }
533 #endif
534 #ifdef uninf
535  for(int k=0;k<nbvars;k++)
536  {
537  pol stock=(*((pol**)nfmul+k))[i];
538  (*((pol**)nfmul+k))[i]=(*((pol**)nfmul+k))[j];
539  (*((pol**)nfmul+k))[j]=stock;
540  }
541 #endif
542 
543 }
544 
545 void freeint2mon(int k)
546 {
547  //memmove(int2mon_+k,int2mon_+j+1,(size-j-1)*sizeof(mon));
548  int2mon_=(mon*)MAC_REV_REALLOC<mon>(int2mon_,sizeplace*sizeof(mon)
549  ,(k)*sizeof(mon));
550 #ifdef unimul
551  for(int i=0;i<nbvars;i++)
552  multiple[i]=(int *)realloc(multiple[i],k*sizeof(int));
553 #endif
554 #ifdef uninf
555  for(int i=0;i<nbvars;i++)
556  ((pol**)nfmul)[i]=(pol*)
557  MAC_REV_REALLOC<pol >(
558  ((pol**)nfmul)[i],sizeplace*sizeof(pol),k*sizeof(pol));
559 
560 
561 #endif
562 }
563 void freemon(int j)
564 {
565  int k;
566  //memmove(int2mon_+j,int2mon_+j+1,(size-j-1)*sizeof(mon));
567  //int2mon_=(mon*)MAC_REV_REALLOC<mon>(int2mon_,size*sizeof(mon)
568  // ,(size-1)*sizeof(mon));
569  for(k=0;mon2intint[k]!=j;k++);
570  //cout<<"k "<<k<<" et size "<<size<<endl;
571  memmove(mon2intint+k,mon2intint+k+1,(sizeplace-k-1)*sizeof(int));
572  for(int i=k;i<sizeplace-1;i++)
573  mon2intmon[i]=mon2intmon[i+1];
574  mon2intmon[sizeplace-1]=mon(0);
575  //memmove(mon2intmon+k,mon2intmon+k+1,(size-k-1)*sizeof(mon));
576  mon2intint=(int*)MAC_REV_REALLOC<int>(mon2intint,sizeplace*sizeof(int)
577  ,(sizeplace-1)*sizeof(int));
578  mon2intmon=(mon*)MAC_REV_REALLOC<mon>(mon2intmon,sizeplace*sizeof(mon)
579  ,(sizeplace-1)*sizeof(mon));
580  //cout<<"ici "<<endl;
581  sizeplace--;
582 }
583 
584 void serveurcompress(int i)
585 {
586  int tmpsize=sizeplace;
587  freeint2mon(i+2);
588  for(int k=i+2;k<tmpsize;k++)
589  freemon(k);
590  //for(int j=0;j<size;j++)
591  // cout<<j<<" les pos possibles "<<mon2intint[j]<<" "<<mon2intmon[j]<<" int2mon "<<int2mon_[mon2intint[j]]<<endl;
592  // size=i+2;
593 }
594 
595 template<typename typPk, typename typdump>
596 void Docompress(int i, typPk & Pk, typdump& dump)
597 {
598  //typedef typename typPk::value_type::monom_t mon;
599  typedef typename typPk::value_type::coeff_t coeff;
600  typedef typename typdump::value_type dumpstruct;
601  mon tmpmon;
602 
603  for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
604  if(i<iter->sizenf*8)
605  {
606  int k;
607  for(k=i/8;(k>=0) && !(iter->nfind[k]);k--);
608  // cout<<" do compress K "<<k<<" "<<iter->nf[k]<<endl;
609  iter->nfind=(unsigned char*)MAC_REV_REALLOC<unsigned char>(iter->nfind
610  ,iter->sizenf
611  ,(k+1));
612 #ifdef DEB
613  cout<<"I "<<i<<" et iter->sizenf "<<iter->sizenf<<endl;
614 #endif
615  iter->sizenf=k+1;
616 
617  }
618 
619  for(typename typdump::iterator iter=dump.begin();
620  iter!=dump.end();iter++)
621  //if(iter!=dump.rend())
622  {
623  for(typename dumpstruct::pol_t *iterdump=iter->nf;
624  iterdump!=iter->nf+iter->size;iterdump++)
625  if(i<iterdump->sizenf*8)
626  {
627  int k;
628  for(k=i/8;k>=0 && !(iterdump->nfind[k]);k--);
629  iterdump->nfind=(unsigned char*)
630  MAC_REV_REALLOC<unsigned char>(iterdump->nfind
631  ,iterdump->sizenf
632  ,(k+1));
633  iterdump->sizenf=k+1;
634  }
635  }
636 }
637 
638 template<typename typdump, typename Base, typename typPk>
639 void compress(typPk & Pk, typdump & dump, const Base &b, int k)
640 {
641  // return;
642  //typedef typename typPk::value_type pol;
643  //typedef typename pol::monom_t mon;
644  mon tmpmon;
645  int i=0;int j=sizeplacemon()-1;
646 #ifdef DEBUG
647  displaymon();
648  //cout<<"sizeplacemon "<<sizeplacemon()<<endl;
649  //cout<<"Docompress"<<endl;
650 
651  cout<<"poly avantcompress "<<Pk.size()<<endl;
652  for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
653  cout<<invconv<Poly>(*iter)<<endl;
654 #endif
655  for(i=0;i<j;i++)
656  {
657  int2mon(i,tmpmon);
658  if(!IsinB(tmpmon,b))
659  //On peut le virer
660  {
661  for(;j>i;j--)
662  {
663  int2mon(j,tmpmon);
664  if(IsinB(tmpmon,b))
665  break;
666  // cout<<tmpmon<<" n'est pas dans B"<<endl;
667  }
668  if(i==j) break; //c fini on a plus rien a faire ici
669 
670  //cout<<" swap "<<i<<" "<<int2mon_[i]<<" et "<<j<<" "<<int2mon_[j]<<endl;
671  swap_all(i,j,Pk,dump);
672  }
673 
674  }
675  cout<<"i ici place "<<i<<endl;
676  int2mon(i,tmpmon);
677  for(;!IsinB(tmpmon,b);i--)
678  {
679  int2mon(i,tmpmon);
680  //cout<<"tmp mon "<<tmpmon<<endl;
681  }
682  Docompress(i+1,Pk,dump);
683  serveurcompress(i);
684 }
685 
686 template<typename typPk, typename typdump>
687 void swap_all(int i, int j, typPk & Pk , typPk &res,typdump& dump)
688 {
689  //hypothese i<j
690  //
691  typedef typename typPk::value_type::coeff_t coeff;
692  //typedef typename typPk::value_type::monom_t mon;
693  typedef typename typdump::value_type dumpstruct;
694  mon tmpmon,tmpmon2;
695  int deg,pos1,pos2;
696  int2mon(j,tmpmon);
697  int2mon(i,tmpmon2);
698  deg=tmpmon.GetDegree();
699 #ifdef DEBUG
700  for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
701  cout<<"swap "<<invconv<Poly>(*iter)<<endl;
702  cout<<"je swap "<<tmpmon<<" et "<<tmpmon2<<endl;
703 #endif
704  for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
705  if(j/8<iter->sizenf && ((iter->nfind[j/8]>>(j%8))&1))
706  {
707 #ifdef DEBUG
708  cout<<"swapall "<<i<<" "<<j<<" iter->nf[j] "<<endl;
709  //cout<<"x1*x3 a pour indice "<<mon2int(mon(1,1)*mon(3,1))<<endl;
710 #endif
711  int nbentre=0;
712  int indicej=0,indicei=0;
713  coeff tmp;
714  for(int k=i/8+1;k<=j/8;k++)
715  nbentre+=nbbits[iter->nfind[k]];
716  nbentre+=nbbits[iter->nfind[i/8]>>(i%8)];
717  nbentre-=nbbits[iter->nfind[j/8]>>(j%8)];
718  //nbentre--;
719  //nbentre-=2;//on compt i et j dedans dans les formules precedentes
720 
721  for(int k=iter->sizenf-1;k>j/8;k--)
722  indicej+=nbbits[iter->nfind[k]];
723  indicej+=nbbits[iter->nfind[j/8]>>(j%8)];
724  // indicej--;
725  for(int k=iter->sizenf-1;k>i/8;k--)
726  indicei+=nbbits[iter->nfind[k]];
727  indicei+=nbbits[iter->nfind[i/8]>>(i%8)];
728 #ifdef DEB
729  cout<<iter->size<<endl<<indicej<<endl<<nbentre<<endl;
730  cout<<"iter->size-indicej-nbentre+1 "<<iter->size-indicej-nbentre+1<<" et indice i "<<indicei<<" indicej "<<indicej<<endl;
731 
732  cout<<"iter->nf[iter-szie-indicej] "
733  <<iter->nf[iter->size-indicej]<<endl;
734  cout<<"iter->nf[iter-size-indicej-nbentre] "
735  <<iter->nf[iter->size-indicej-nbentre]<<endl;
736 #endif
737  tmp=iter->nf[iter->size-indicej];
738  if((iter->nfind[i/8]>>(i%8))&1)
739  {
740  iter->nf=(coeff*)MAC_REV_REALLOC<coeff>(iter->nf
741  ,iter->size*sizeof(coeff)
742  ,(iter->size-1)*sizeof(coeff));
743  iter->nf[iter->size-indicej-nbentre]=tmp;
744  iter->nfind[i/8]|=1<<(i%8);
745  iter->nfind[j/8]&= ~(1<<(j%8));
746  iter->size--;
747  }
748  else
749  {
750  for(int k=0;k<nbentre;k++)
751  iter->nf[iter->size-indicej-k]=iter->nf[iter->size-indicej-k-1];
752  iter->nf[iter->size-indicej-nbentre]=tmp;
753  iter->nfind[i/8]|=1<<(i%8);
754  iter->nfind[j/8]&= ~(1<<(j%8));
755 
756  }
757  // iter->nf[i]=iter->nf[j];
758  // iter->nf[j]=0;
759 #ifdef DEB
760  if ((iter->sizenf*8>sizeplace) && ((iter->nfind[iter->sizenf-1]
761  >>(sizeplace%8))&1))
762  {cout<<"swapall "<<iter->sizenf<<" "<<sizeplace<<endl;exit(10);}
763 #endif
764  }
765  //RES
766  for(typename typPk::iterator iter=res.begin();iter!=res.end();iter++)
767  if(j/8<iter->sizenf && ((iter->nfind[j/8]>>(j%8))&1))
768  {
769 #ifdef DEB
770  cout<<"swapall "<<i<<" "<<j<<" iter->nf[j] "<<endl;
771  //cout<<"x1*x3 a pour indice "<<mon2int(mon(1,1)*mon(3,1))<<endl;
772 #endif
773  int nbentre=0;
774  int indicej=0,indicei=0;
775  coeff tmp;
776  for(int k=i/8+1;k<=j/8;k++)
777  nbentre+=nbbits[iter->nfind[k]];
778  nbentre+=nbbits[iter->nfind[i/8]>>(i%8)];
779  nbentre-=nbbits[iter->nfind[j/8]>>(j%8)];
780  //nbentre--;
781  //nbentre-=2;//on compt i et j dedans dans les formules precedentes
782 
783  for(int k=iter->sizenf-1;k>j/8;k--)
784  indicej+=nbbits[iter->nfind[k]];
785  indicej+=nbbits[iter->nfind[j/8]>>(j%8)];
786  // indicej--;
787  for(int k=iter->sizenf-1;k>i/8;k--)
788  indicei+=nbbits[iter->nfind[k]];
789  indicei+=nbbits[iter->nfind[i/8]>>(i%8)];
790 #ifdef DEB
791  cout<<iter->size<<endl<<indicej<<endl<<nbentre<<endl;
792  cout<<"iter->size-indicej-nbentre+1 "<<iter->size-indicej-nbentre+1<<" et indice i "<<indicei<<" indicej "<<indicej<<endl;
793 
794  cout<<"iter->nf[iter-szie-indicej] "
795  <<iter->nf[iter->size-indicej]<<endl;
796  cout<<"iter->nf[iter-size-indicej-nbentre] "
797  <<iter->nf[iter->size-indicej-nbentre]<<endl;
798 #endif
799  tmp=iter->nf[iter->size-indicej];
800  if((iter->nfind[i/8]>>(i%8))&1)
801  {
802  iter->nf=(coeff*)MAC_REV_REALLOC<coeff>(iter->nf
803  ,iter->size*sizeof(coeff)
804  ,(iter->size-1)*sizeof(coeff));
805  iter->nf[iter->size-indicej-nbentre]=tmp;
806  iter->nfind[i/8]|=1<<(i%8);
807  iter->nfind[j/8]&= ~(1<<(j%8));
808  iter->size--;
809  }
810  else
811  {
812  for(int k=0;k<nbentre;k++)
813  iter->nf[iter->size-indicej-k]=iter->nf[iter->size-indicej-k-1];
814  iter->nf[iter->size-indicej-nbentre]=tmp;
815  iter->nfind[i/8]|=1<<(i%8);
816  iter->nfind[j/8]&= ~(1<<(j%8));
817 
818  }
819  // iter->nf[i]=iter->nf[j];
820  // iter->nf[j]=0;
821 #ifdef DEB
822  if ((iter->sizenf*8>sizeplace) && ((iter->nfind[iter->sizenf-1]
823  >>(sizeplace%8))&1))
824  {cout<<"swapall "<<iter->sizenf<<" "<<sizeplace<<endl;exit(10);}
825 #endif
826  }
827  for(typename typdump::iterator iter=dump.begin();iter!=dump.end();iter++)
828  {
829 
830  //if(iter->k<=deg)
831  {
832  for(typename dumpstruct::pol_t *iterdump=iter->nf;
833  iterdump!=iter->nf+iter->size;iterdump++)
834  {
835 
836  if(j/8<iterdump->sizenf && (iterdump->nfind[j/8]>>(j%8))&1)
837  {
838  //cout<<"swapall "<<i<<" "<<j<<
839  //" iter->nf[j] "<<iter->nf[j]<<endl;
840  int nbentre=0;
841  int indicej=0;
842  coeff tmp;
843  for(int k=i/8+1;k<=j/8;k++)
844  nbentre+=nbbits[iterdump->nfind[k]];
845  nbentre+=nbbits[iterdump->nfind[i/8]>>(i%8)];
846  nbentre-=nbbits[iterdump->nfind[j/8]>>(j%8)];
847 
848  for(int k=iterdump->sizenf-1;k>j/8;k--)
849  indicej+=nbbits[iterdump->nfind[k]];
850  indicej+=nbbits[iterdump->nfind[j/8]>>(j%8)];
851 
852  tmp=iterdump->nf[iterdump->size-indicej];
853  if((iterdump->nfind[i/8]>>(i%8))&1)
854  {
855  iterdump->nf=(coeff*)
856  MAC_REV_REALLOC<coeff>(iterdump->nf
857  ,iterdump->size*sizeof(coeff)
858  ,(iterdump->size-1)*sizeof(coeff));
859  iterdump->nf[iterdump->size-indicej-nbentre]=tmp;
860  iterdump->nfind[i/8]|=1<<(i%8);
861  iterdump->nfind[j/8]&= ~(1<<(j%8));//^=1<<(j%8);
862  iterdump->size--;
863 
864  }
865  else
866  {
867  for(int k=0;k<nbentre;k++)
868  iterdump->nf[iterdump->size-indicej-k]
869  =iterdump->nf[iterdump->size-indicej-k-1];
870  iterdump->nf[iterdump->size-indicej-nbentre]=tmp;
871  iterdump->nfind[i/8]|=1<<(i%8);
872  iterdump->nfind[j/8]&= ~(1<<(j%8));//^=1<<(j%8);
873  }
874  // iter->nf[i]=iter->nf[j];
875  // iter->nf[j]=0;
876 #ifdef DEB
877  if ((iterdump->sizenf*8>sizeplace) && ((iterdump->nfind[iterdump->sizenf-1]
878  >>(sizeplace%8))&1))
879  {cout<<"swapall "<<iterdump->sizenf<<" "<<sizeplace<<endl;exit(10);}
880 #endif
881  }
882 
883  }
884  }
885  }
886  tmpmon=int2mon_[i];
887  int2mon_[i]=int2mon_[j];
888  int2mon_[j]=tmpmon;
889  for(pos1=0;mon2intint[pos1]!=j;pos1++);
890  for(pos2=0;mon2intint[pos2]!=i;pos2++);
891  mon2intint[pos1]=i;
892  mon2intint[pos2]=j;
893 
894 #ifdef unimul
895  for(int k=0;k<nbvars;k++)
896  {
897  for(int l=0;l<sizeplace;l++)
898  {
899  if(multiple[k][l]==i)
900  multiple[k][l]=j;
901  else if(multiple[k][l]==j)
902  multiple[k][l]=i;
903  }
904  int stock=multiple[k][i];
905  multiple[k][i]=multiple[k][j];
906  multiple[k][j]=stock;
907  }
908 #endif
909 #ifdef uninf
910  for(int k=0;k<nbvars;k++)
911  {
912  pol stock=(*((pol**)nfmul+k))[i];
913  (*((pol**)nfmul+k))[i]=(*((pol**)nfmul+k))[j];
914  (*((pol**)nfmul+k))[j]=stock;
915  }
916 #endif
917 
918 }
919 
920 template<typename typPk, typename typdump>
921 void Docompress(int i, typPk & Pk, typPk &res,typdump& dump)
922 {
923  //typedef typename typPk::value_type::monom_t mon;
924  typedef typename typPk::value_type::coeff_t coeff;
925  typedef typename typdump::value_type dumpstruct;
926  mon tmpmon;
927 
928  for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
929  if(i<iter->size)
930  {
931  int k;
932  for(k=i/8;(k>=0) && !(iter->nfind[k]);k--);
933  // cout<<" do compress K "<<k<<" "<<iter->nf[k]<<endl;
934  iter->nfind=(unsigned char*)MAC_REV_REALLOC<unsigned char>(iter->nfind
935  ,iter->sizenf
936  ,(k+1));
937  //cout<<"I "<<i<<" et iter->size "<<iter->size<<endl;
938  iter->sizenf=k+1;
939 
940  }
941 
942  for(typename typPk::iterator iter=res.begin();iter!=res.end();iter++)
943  if(i<iter->size)
944  {
945  int k;
946  for(k=i/8;(k>=0) && !(iter->nfind[k]);k--);
947  // cout<<" do compress K "<<k<<" "<<iter->nf[k]<<endl;
948  iter->nfind=(unsigned char*)MAC_REV_REALLOC<unsigned char>(iter->nfind
949  ,iter->sizenf
950  ,(k+1));
951  //cout<<"I "<<i<<" et iter->size "<<iter->size<<endl;
952  iter->sizenf=k+1;
953 
954  }
955 
956  for(typename typdump::iterator iter=dump.begin();
957  iter!=dump.end();iter++)
958  //if(iter!=dump.rend())
959  {
960  for(typename dumpstruct::pol_t *iterdump=iter->nf;
961  iterdump!=iter->nf+iter->size;iterdump++)
962  if(i<iterdump->size)
963  {
964  int k;
965  for(k=i/8;k>=0 && !(iterdump->nfind[k]);k--);
966  iterdump->nfind=(unsigned char*)
967  MAC_REV_REALLOC<unsigned char>(iterdump->nfind
968  ,iterdump->sizenf
969  ,(k+1));
970  iterdump->sizenf=k+1;
971  }
972  }
973 }
974 
975 template<typename typdump, typename Base, typename typPk>
976 void compress(typPk & Pk, typPk &res, typdump & dump, const Base &b, int k)
977 {
978  // return;
979  //typedef typename typPk::value_type pol;
980  //typedef typename pol::monom_t mon;
981  mon tmpmon;
982  int i=0;int j=sizeplacemon()-1;
983  //cout<<"sizeplacemon "<<sizeplacemon()<<endl;
984  //cout<<"Docompress"<<endl;
985  for(i=0;i<j;i++)
986  {
987  int2mon(i,tmpmon);
988  if(!IsinB(tmpmon,b))
989  //On peut le virer
990  {
991  for(;j>i;j--)
992  {
993  int2mon(j,tmpmon);
994  if(IsinB(tmpmon,b))
995  break;
996  }
997  if(i==j) break; //c fini on a plus rien a faire ici
998  // cout<<" swap "<<i<<" "<<int2mon_[i]<<" et "<<j<<" "<<int2mon_[j]<<endl;
999  swap_all(i,j,Pk,res,dump);
1000  }
1001 
1002  }
1003  int2mon(i,tmpmon);
1004  for(;!IsinB(tmpmon,b);i--)
1005  {
1006  int2mon(i,tmpmon);
1007  //cout<<"tmp mon "<<tmpmon<<endl;
1008  }
1009  Docompress(i+1,Pk,res,dump);
1010  serveurcompress(i);
1011 }
1012 
1014 {
1015  MAC_REV_FREE<mon>(int2mon_,sizeplace*sizeof(mon));
1016  MAC_REV_FREE<mon>(mon2intmon,sizeplace*sizeof(mon));
1017  free(mon2intint);
1018  sizeplace=0;
1019 
1020 }
1021 };//struct monomial_server
1022 #endif
void int2mon(const int &i, mon &res)
Definition: placemon3.hpp:664
void freeplace(int p)
Definition: placemon3sdp.hpp:314
int ** multiple
Definition: placemon3.hpp:26
Definition: dump.hpp:2
void ** nfmul
Definition: placemon3.hpp:27
void removemon(const mon &m)
Definition: placemon3sdp.hpp:266
int mon2int(const mon &mm)
Definition: placemon3.hpp:679
void free(void *)
void setorder(ptrfun tmpord)
Definition: placemon3sdp.hpp:160
mon * int2mon_
Definition: placemon3.hpp:21
~monomial_server()
Definition: placemon3.hpp:35
Definition: pol.hpp:6
void Docompress(int i, typPk &Pk, typPk &res, typdump &dump)
Definition: placemon3sdp.hpp:921
void putmon2(const mon &m, const int poscurrent)
Definition: placemon3sdp.hpp:170
int sizeplace
Definition: placemon3.hpp:20
void init_multiple(int n)
Definition: placemon3.hpp:59
int * mon2intint
Definition: placemon3.hpp:23
void serveurcompress(int i)
Definition: placemon3sdp.hpp:584
typpol nf(int var, int indmon, const typdump &dump, const Base &b)
Definition: corealgo.hpp:1001
void displaymon()
Definition: placemon3.hpp:28
int nbvars
Definition: placemon3.hpp:25
void freemon(int j)
Definition: placemon3sdp.hpp:563
void * malloc(YYSIZE_T)
void reinit_multiple()
Definition: placemon3.hpp:85
MSKconetypee MSKrealt MSKint32t MSKint32t j
Definition: mosek.h:2421
MSKint32t k
Definition: mosek.h:2713
R rep
Definition: Monom.hpp:30
C coeff_t
Definition: Monom.hpp:26
int nbbits[256]
Definition: pol2ter.hpp:4
Definition: placemon3.hpp:14
int IsinB(const mon &m, const Base &b)
Definition: IsinB3.hpp:68
Mon mon
Definition: solver_bb_floating.cpp:136
int sizeplacemon()
Definition: placemon3sdp.hpp:164
Definition: types.hpp:14
exponent_t GetDegree() const
Definition: Monom.hpp:70
void affplace(const mon &m, int p)
Definition: placemon3sdp.hpp:308
void Docompress(int i, typPk &Pk, typdump &dump)
Definition: placemon3sdp.hpp:596
MSKint32t MSKint32t MSKint32t i
Definition: mosek.h:2278
mon monom_t
Definition: placemon3sdp.hpp:11
void freeplacemon()
Definition: placemon3sdp.hpp:1013
void swap_all(int i, int j, typPk &Pk, typdump &dump)
Definition: placemon3sdp.hpp:374
int size
Definition: pol.hpp:10
void freeint2mon(int k)
Definition: placemon3sdp.hpp:545
void compress(typPk &Pk, typPk &res, typdump &dump, const Base &b, int k)
Definition: placemon3sdp.hpp:976
int mulind(int indexbase, int var, const typBase &b)
Definition: placemon3.hpp:126
void putmon(const mon &m)
Definition: placemon3sdp.hpp:239
void swap_all(int i, int j, typPk &Pk, typPk &res, typdump &dump)
Definition: placemon3sdp.hpp:687
#define pol
Definition: pol2ter.hpp:3
void SetCoeff(const C &c)
Definition: Monom.hpp:68
int(* ord)(const mon &m1, const mon &m2)
Definition: placemon3.hpp:24
void compress(typPk &Pk, typdump &dump, const Base &b, int k)
Definition: placemon3sdp.hpp:639
monomial_server()
Definition: placemon3.hpp:48
Multivariate monomials.
Definition: Monom.hpp:21
T * nf
Definition: pol.hpp:12
mon * mon2intmon
Definition: placemon3.hpp:22
pol pol_t
Definition: placemon3sdp.hpp:12
Home  |  Download & InstallContributions