Borderbasix

IsinB3.hpp
Go to the documentation of this file.
1 #ifndef ALREADY_IsinB
2 #define ALREADY_IsinB
3 //void reinit_multiple();
4 
5 template<typename monom>
6 struct predicat
7 {
8  int taille1;
9  monom * accept;
10  int taille2;
11  monom * refuse;
12  typedef monom monom_t;
13 };
14 
15 template<typename predicat>
16 struct Base
17 {
18  list<predicat> def;
19  int nbvars;
21  typedef typename predicat::monom_t mon;
22  typedef typename list<predicat>::iterator iterator;
23  typedef typename list<predicat>::const_iterator const_iterator;
24  typedef typename list<predicat>::reverse_iterator reverse_iterator;
25  typedef typename list<predicat>::const_reverse_iterator const_reverse_iterator;
26 
27  iterator begin () { return def.begin(); }
28  const_iterator begin () const { return def.begin(); }
29  reverse_iterator rbegin () { return def.rbegin(); }
30  const_reverse_iterator rbegin () const { return def.rbegin(); }
31 
32  iterator end () { return def.end(); }
33  const_iterator end () const { return def.end(); }
34  reverse_iterator rend () { return def.rend(); }
35  const_reverse_iterator rend () const { return def.rend(); }
36 
37  iterator erase(iterator first, iterator last){return def.erase(first,last);};
38  iterator erase(iterator first){return def.erase(first);};
39  int nbvar() {return nbvars;};
40  int nbvar() const {return nbvars;};
41 };
42 
43 template<typename mon,typename predicat,typename Base>
44 int isinb(const mon &m, predicat p,const Base &b)
45 {
46  int inaccept=0,inrefuse=0;
47  for(int i=0;i<p.taille2;i++)
48  {
49 // cout<<"p.refuse[i]).GetDegree"<<(p.refuse[i]).GetDegree()<<endl;
50 // cout<<"m.GetDegree"<<m.GetDegree()<<endl;
51 // if ((p.refuse[i]).GetDegree()<m.GetDegree()){inrefuse=1; goto jesais;break;}
52  inrefuse|=isdivisible(p.refuse[i],m,b);
53 // cout<<"p.refuse[i] "<<p.refuse[i]<<" "<<m<<" "<<inrefuse<<endl;
54  if(inrefuse) {goto jesais; break;}
55  }
56  if(!inrefuse)
57  for(int i=0;i<p.taille1;i++)
58  {
59  // cout<<"p.accept[i] "<<p.accept[i]<<" "<<m<<endl;
60  inaccept|=isdivisible(p.accept[i],m,b);
61  if(inaccept) break;
62  }
63  jesais:
64  return((!inrefuse)&&inaccept);
65 }
66 
67 template<typename mon,typename Base>
68 int IsinB(const mon & m,const Base & b)
69 {
70  int res=0;
71  //cout<<"monom "<<m<<endl;
72  for(typename Base::const_iterator iter=b.begin();iter!=b.end();iter++)
73  {
74 
75  res=res||isinb(m,*iter,b);
76  //cout<<"verdict isinb "<<res<<endl;
77  if (res) break;
78  }
79 
80  return res;
81 }
82 
83 template<typename typMk,typename typdump,typename Base>
84 void Dovoisins(const typename typMk::value_type &m, typMk &voisins,
85  const typdump & dump,const Base &b)
86 {
87  typedef typename typMk::value_type mon;
88  int i=0;
89  typename typdump::const_iterator iter=dump.begin();
90  //on determine un parent
91  typMk ancien;
92  for(i=0;i<b.nbvar();i++)
93  if(m.GetDegree(i)>0)
94  ancien.push_back(my_divmon(m,i,b));
95  //cout<<"Dans Dovoisins "<<m<<endl;
96  for(;iter->k!=(m.GetDegree()-1);iter++);
97  for(i=0;i<iter->size;i++)
98  if(member(ancien,iter->nf[i].ind)) break;
99  //maintenant on l'a on prend toutes les consequences de ce parent
100  for(int j=0;j<b.nbvar();j++)
101  if(!member(voisins,iter->nf[i].ind*mon(j,1)))
102  voisins.push_back(iter->nf[i].ind*mon(j,1));
103 }
104 
105 #ifdef uninf
106  template<typename pol> void reinit_nf();
107 #endif
108 
109 template<typename typPk,typename typMk ,typename typdump,typename Base,
110  typename monomial_server, typename workspace>
111 void rajoute_voisins(typPk &Pk,const typMk & Mk,
112  const typdump &dump, Base &b,workspace &w,
113  monomial_server &serv)
114  // l'object if de la fonction est d'eviter les
115  //oublis de voisin lors d'un rajout au quotient
116 {
117  typedef typename typPk::value_type pol;
118  typedef typename pol::monom_t mon;
119  typedef typename pol::coeff_t coeff;
120 
121 #ifdef unimul
122  // void reinit_multiple();
123  serv.reinit_multiple();
124 #endif
125 #ifdef uninf
126 
127  serv.reinit_nf();
128 #endif
129 #ifdef BONRAJOUT
130  return;
131 #endif
132 
133  mon * baccept=b.rbegin()->accept;
134  int taille=b.rbegin()->taille1;
135  typMk voisins;
136  for(int i=0;i<taille;i++)
137  Dovoisins(baccept[i],voisins,dump,b);
138  //Dovoisins ne cree pas de monomes redondants!!!!!!!!!!!!
139  for(typename typMk::iterator iter=voisins.begin();iter!=voisins.end();iter++)
140  {
141  for(int i=0;i<taille;i++)
142  if(baccept[i].rep==iter->rep)
143  {
144  voisins.erase(iter--);
145  break;
146 
147  }
148  }
149  for(typename typMk::iterator iter=voisins.begin();iter!=voisins.end();iter++)
150  {
151  if(member(Mk,*iter))
152  voisins.erase(iter--);
153  }
154  //on vire les voisins que l on a rajoute a l'accept quotient
155  //et ceux que l'on a deja
156  for(typename typMk::iterator iter=voisins.begin();iter!=voisins.end();iter++)
157  {
158  typMk ancien;
159  for(int i=0;i<b.nbvar();i++)
160  if(iter->GetDegree(i)>0)
161  ancien.push_back(my_divmon(*iter,i,b));
162  //on vient de creer les parents possibles
163  //maintenant on cherche un pere possible
164 
165  {
166  typename typdump::const_iterator iterdump;
167  for(iterdump=dump.begin();iterdump!=dump.end();iterdump++)
168  if(iterdump->k==(iter->GetDegree()-1)) break;
169  {
170  int i,j;
171  for(i=0;i<iterdump->size;i++)
172  if(member(ancien,iterdump->nf[i].ind))
173  break;
174  //on a un parent on calcul la nf du monome *iter maintenant
175  //d'abord on calcul la bonne variable
176  for(j=0;j<b.nbvar();j++)
177  if(iter->rep==(iterdump->nf[i].ind*mon(j,1)).rep)
178  break;
179  mon * tmp=NULL;
180  int tmpsize=0;
181  //Tue Dec 4 16:39:25 MET 2001
182  //pol tmppol;
183  //densify(iterdump->nf[i],tmppol);
184  //cout<<"avant mult"<<endl;
185  //Tue Dec 4 16:39:25 MET 2001
186  //cout<<"Le parent"<<endl<<invconv<Poly>(iterdump->nf[i])<<endl;
187  //Pk.push_back(mult(j,tmppol,dump,b,&tmp,tmpsize));
188  Pk.push_back(mult(j,iterdump->nf[i],dump,b,&tmp,tmpsize,w,serv));
189  //cout<<"j'ai pushe ici"<<endl<<invconv<Poly>(*(Pk.rbegin()))<<endl;
190  //il n devrait y avoir personne dans tmp normalement
191  //int toint=0;
192  //for(;Pk.back().ind.GetCoeff()>toint;toint++);
193  for(int k=0;k<tmpsize-1;k++)
194  {
195  for(typename typPk::iterator iterpk=Pk.begin()
196  ;iterpk!=Pk.end();iterpk++)
197  if(iterpk->ind.rep==tmp[k].rep)
198  {
199  // my_plus(Pk.back(),*iterpk,tmp[k].GetCoeff(),&w,serv);//ICIOMP
200  my_plus(Pk.back(),*iterpk,tmp[k].GetCoeff(),&w);//ICIOMP
201  break;
202  }
203  }
204  MAC_REV_FREE<mon>(tmp,sizeof(mon)*(tmpsize));
205  }
206  }
207  //cout<<"coucou de rajoutevoisins "<<Pk.back().ind<<endl;
208  // cout<<"le pol rajoute vaut"<<endl<<invconv<Poly>(Pk.back())<<endl;
209  Pk.back().ind.SetCoeff((coeff)1);
210  //cout<<"Je l'ai pas !!! "<<endl;
211  //exit(10);
212  }
213  //on rajoute a B les monomes correspondants au voisin
214  //on enleve en fait...
215  //
216  // cout<<"rajoute voisins .size "<<voisins.size()<<endl;
217  b.rbegin()->refuse=(mon*)MAC_REV_REALLOC<mon>(b.rbegin()->refuse
218  ,sizeof(mon)*b.rbegin()->taille2,
219  sizeof(mon)*(b.rbegin()->taille2+voisins.size()));
220  typename typMk::iterator iter=voisins.begin();
221  for(unsigned int i=b.rbegin()->taille2;i<b.rbegin()->taille2+voisins.size()
222  ;i++,iter++)
223  b.rbegin()->refuse[i]=*iter;
224  b.rbegin()->taille2+=voisins.size();
225 }
226 
227 //AddB n'est normalement appele que lorsque la matruice n'a pas rang plein
228 template<typename T>
229 struct sortstruct
230 {
231  int index;
232  T coeff;
233 };
234 template<typename T>
236  bool operator()(const sortstruct<T> &a,const sortstruct<T> &b)
237  {
238  return a.index<b.index;
239  }
240 };
241 
242 template<typename typmat,typename typPk, typename typMk,typename typdump,
243  typename typB,typename monomial_server>
244 void AddB(const typmat & mat, typPk & Pk,const typMk &Mk,const typdump & dump,
245  typB &b, monomial_server &serv)
246 {
247  typedef typename typPk::value_type pol;
248  typedef typename pol::monom_t mon;
249  typedef typename pol::coeff_t coeff_t;
250  typename typPk::iterator iterpk;
251  predicat<mon> tmp;
252  typename typMk::const_iterator iter=Mk.begin();
253  int r=my_rank(mat),comprefuse=0,compaccept=0;
254  unsigned int i;
255  //cout<<"DANS ADDB"<<endl;
256  //cout<<"rang de la matrice m "<<r<<" Mk.size "<<Mk.size()<<endl;
257  //cout<<"taille de la matrice "<<mat.nrow<<"x"<<mat.ncol<<endl;
258  tmp.refuse=(mon*)MAC_REV_MALLOC<mon>(r*sizeof(mon));
259  tmp.taille2=r;
260  tmp.accept=(mon*)MAC_REV_MALLOC<mon>((Mk.size()-r)*sizeof(mon));
261  tmp.taille1=Mk.size()-r;
262  //for(i=0;i<(unsigned)r;i++,iter++)
263  // tmp.refuse[i]=*iter;
264  iter=Mk.begin();
265  for(i=0;i<Mk.size();i++,iter++)
266  {
267  if(Iszero(mat(i,i)))
268  {
269  tmp.accept[compaccept++]=*iter;
270  }
271  else
272  {
273  tmp.refuse[comprefuse++]=*iter;
274  }
275  }
276  b.def.push_back(tmp);
277  //bon maintenant que l'on vient de rajouter des
278  //monomes au quotient il faut remttre les polynomes comme il faut
279  iter=Mk.begin();
280 #ifndef OLDADDB
281  {
282 //On recopie la matrice des colonnes a pivot nul
283 //apres on reporte les modifs faites pendant la resolution sur cette matrice
284  coeff_t *tmpmat;
285  map<int,typename typMk::value_type> mapmon;
286  vector<int> index_line;
287  vector<int> newmonindex;
288  int rowdim=mat.nrow, coldim=0;
289  for(unsigned int i=0;i<Mk.size();i++,iter++)
290  if(Iszero(mat(i,i)))
291  {
292  mapmon[coldim]=*iter;
293  newmonindex.push_back(serv.mon2int(*iter));
294  index_line.push_back(i);
295  coldim++;
296  rowdim=max(rowdim,mat.colptr[i+1]-mat.colptr[i]);
297  }
298 //On alloue la place pour une matrice dense
299 //Et on recopie les valeurs mentionnĂ©es dedans
300  tmpmat=(coeff_t*)MAC_REV_MALLOC<coeff_t>(coldim*rowdim*sizeof(coeff_t));
301  for(int i=0;i<coldim*rowdim;i++)
302  tmpmat[i]=0;
303  coldim=0;
304  for(unsigned int i=0;i<Mk.size();i++)
305  if(Iszero(mat(i,i)))
306  {
307  for(int j=mat.colptr[i];j<mat.colptr[i+1];j++)
308  tmpmat[rowdim*coldim+mat.rowind[j]]=((coeff_t*)mat.nzval)[j];
309  coldim++;
310  }
311 //On reporte les modifs faites pendant la resolution sur cette matrice
312  for(int k=mat.ncol-1;k>=0;k--)
313  {
314  if(Iszero(mat(k,k))) continue;
315  coeff_t pivot=mat(k,k);
316  for(int j=0;j<coldim;j++)
317  tmpmat[rowdim*j+k]/=pivot;
318  for(int j=k-1;j>=0;j--)
319  {
320  coeff_t tmp=mat(j,k);
321  for(int jj=0;jj<coldim;jj++)
322  {
323  tmpmat[rowdim*jj+j]-=tmpmat[rowdim*jj+k]*tmp;
324  }
325  }
326  }
327 //On refait une passe pour determiner les polynomes a modifier et on effectue
328 //les modifications en lisant sur la matrice "tmpmat"
329  typename typPk::iterator iterpk=Pk.begin();
330  vector<int>::iterator iterline=index_line.begin();
331  iter=Mk.begin();
332  for(unsigned int i=0;i<Pk.size();i++,iterpk++,iter++)
333  {
334  {
335  vector<sortstruct<coeff_t> > decal;
336  int maxindex=-1;
337  int expend=0;
338  for(int j=0;j<coldim;j++)
339  //On est oblicge de repasser tout car les indecices de colonnes de tmpmat$
340 // ne correpondanet pas aux indece de la matrice
341  {
342  if(!Iszero(tmpmat[rowdim*j+i]))
343  {
345  expend++;
346  maxindex=max(maxindex,serv.mon2int(mapmon[j]));
347  tmp.index=serv.mon2int(mapmon[j]);
348  tmp.coeff=tmpmat[rowdim*j+i];
349  decal.push_back(tmp);
350 
351  }
352  }
353 // Si on a rien a rajouter on arrete
354  if(decal.empty()) continue;
355 //on augmente la taille du polynome considere
356  iterpk->nf=(typename mon::coeff_t*)
357  MAC_REV_REALLOC<typename mon::coeff_t>(iterpk->nf
358  ,iterpk->size*sizeof(typename mon::coeff_t)
359  ,(iterpk->size+expend)*sizeof(typename mon::coeff_t));
360  if((maxindex/8)>=iterpk->sizenf)
361  {
362  iterpk->nfind=(unsigned char*)
363  MAC_REV_REALLOC<unsigned char>(iterpk->nfind
364  ,iterpk->sizenf,maxindex/8+1);
365  for(int i=iterpk->sizenf;i<maxindex/8+1;i++)
366  iterpk->nfind[i]=0;
367  iterpk->sizenf=maxindex/8+1;
368 
369  }
370 // la place est faite il reste plus qu'a decaler les monomes de iterpk->nf
371 //pour intercaler eventuellment les nouveau monomes
372  stable_sort(decal.begin(),decal.end(),sortstructorder<coeff_t>());
373  int nbcoeff=iterpk->size-1;
374  for(int j=iterpk->sizenf-1;j>=0;j--)
375  {
376  if(8*j>decal.rbegin()->index)
377  for (int jj=0;jj<nbbits[iterpk->nfind[j]];jj++)
378  {
379  iterpk->nf[nbcoeff+decal.size()]=
380  iterpk->nf[nbcoeff];
381  nbcoeff--;
382  }
383  else
384  {
385  int indexnf=decal.back().index;
386  typename typMk::value_type tmpmon;
387  int jj=7;
388  while(8*j<=decal.back().index)
389  {
390  indexnf=decal.back().index % 8;
391  for (;jj>(indexnf);jj--)
392  if(iterpk->nfind[j]&(1<<jj))
393  {
394  iterpk->nf[nbcoeff+decal.size()]=
395  iterpk->nf[nbcoeff];
396  nbcoeff--;
397  }
398  iterpk->nf[nbcoeff+decal.size()]=decal.back().coeff;
399  iterpk->nfind[j]|=(1<<(indexnf));
400  decal.pop_back();
401  jj--;
402  if(decal.empty()) break;
403  }
404  for (;jj>=0;jj--)
405  if(iterpk->nfind[j]&(1<<jj))
406  {
407  iterpk->nf[nbcoeff+decal.size()]=
408  iterpk->nf[nbcoeff];
409  nbcoeff--;
410  }
411  if(decal.empty()) break;
412  }
413 
414  }
415  iterpk->size+=expend;
416  }
417  }
418  MAC_REV_FREE<coeff_t>(tmpmat,coldim*rowdim*sizeof(coeff_t));
419  }
420 #else
421 
422  for(unsigned int i=0;i<Mk.size();i++,iter++)
423  {
424  if(Iszero(mat(i,i)))
425  {
426  int index=serv.mon2int(*iter);
427  iterpk=Pk.begin();
428  //on commence a faire de l'algebre lineaire
429  coeff_t *vec=(coeff_t*)MAC_REV_MALLOC<coeff_t>(i*sizeof(coeff_t));
430  for(unsigned int j=0;j<i;j++)
431  vec[j]=mat(j,i);
432  //le vecteur est fait reste plus qu'a
433  //resoudre le syteme lineaire
434  for(int k=i-1;k>=0;k--)
435  {
436  if(Iszero(mat(k,k))) continue;
437  vec[k]/=mat(k,k);
438  for(int j=k-1;j>=0;j--)
439  vec[j]-=vec[k]*mat(j,k);
440  }
441  //bon ca a l'air d'etre bon pour la resolution du systeme lineaire
442  //on remet les coeff de vec dans les pol a la bonne place
443  for(unsigned int j=0;j<i;j++,iterpk++)
444  {
445  //cout<<"tour deboucle addB "<<j<<endl;
446  if((!Iszero(vec[j])))//&&(!Iszero(mat(j,j))))
447  {
448  int i;
449  iterpk->nf=(typename mon::coeff_t*)
450  MAC_REV_REALLOC<typename mon::coeff_t>(iterpk->nf
451  ,iterpk->size*sizeof(typename mon::coeff_t)
452  ,(iterpk->size+1)*sizeof(typename mon::coeff_t));
453  if((index/8)>=iterpk->sizenf)
454  {
455  iterpk->nfind=(unsigned char*)
456  MAC_REV_REALLOC<unsigned char>(iterpk->nfind
457  ,iterpk->sizenf,index/8+1);
458  for(int i=iterpk->sizenf;i<index/8+1;i++)
459  iterpk->nfind[i]=0;
460  iterpk->sizenf=index/8+1;
461 
462  }
463 
464  i=iterpk->size;
465  for(int k=iterpk->sizenf-1;k>index/8;k--)
466  {
467  //cout<<"k "<<k<<endl;
468  if(iterpk->nfind[k]!=0)
469  {
470  for(int j=0;j<nbbits[iterpk->nfind[k]];j++)
471  {
472  iterpk->nf[i]=iterpk->nf[i-1];
473  i--;
474  }
475  }
476  }
477  for(int k=7;k>(index%8);k--)
478  if((iterpk->nfind[index/8]>>k)&1)
479  {
480  iterpk->nf[i]=iterpk->nf[i-1];
481  i--;
482  }
483  iterpk->nf[i]=vec[j];
484  iterpk->nfind[index/8]|=(1<<(index%8));
485  iterpk->size++;
486  //cout<<"rajoute le monome "<<*iter<<" a la ligne "<<j<<" "<<vec[j]<<" i "<<i<<endl;
487  //cout<<"le pol"<<endl<<invconv<Poly>(*iterpk)<<endl;
488  }
489  }
490  MAC_REV_FREE<coeff_t>(vec,i*sizeof(coeff_t));
491  }
492  }
493 #endif
494  //rajoute_voisins(Pk,Mk,dump,b);
495  return;
496 }
497 
498 
499 //AddB n'est normalement appele que lorsque la matrice n'a pas rang plein
500 //et que le second membre se reduit a 0
501 #if 1
502 template<typename mon,typename typB>
503 predicat<mon> findpred(const mon &m, const typB &b)
504 //findpred est sense renvoyer le predicat qui fait que le
505 // monome "m" se trouve sur la frontiere de b
506 // il faut que m soit sur la frontiere du predicat
507 {
508  int ok=0;
509  typename typB::const_iterator iter;
510  for(iter=b.begin();iter!=b.end();iter++)
511  {
512  for(int i=0;i<iter->taille1;i++)
513  if(isdivisible(iter->accept[i],m,b))
514  ok=1;
515  if(ok)
516  {
517  for(int i=0;i<iter->taille2;i++)
518  if(isdivisible(iter->refuse[i],m,b))
519  {
520  for(int j=0;j<b.nbvar();j++)
521  ok+=(m.GetDegree(i)>m.GetDegree(i));
522  if(ok==1+b.nbvar())
523  ok=0;
524  }
525  }
526  if(ok)
527  break;
528  }
529  cout<<"je cherche le pred pere de "<<m<<endl;
530  cout<<"je renvoie ce pred"<<endl;
531  for(int i=0;i<iter->taille1;i++)
532  {
533  cout<<"iter.accept[i] "<<iter->accept[i]<<endl;
534  }
535  for(int i=0;i<iter->taille2;i++)
536  {
537  cout<<"iter.refuse[i] "<<iter->refuse[i]<<endl;
538  }
539 
540  return *iter;
541 }
542 
543 template<typename typmat,typename typPk, typename typMk,typename typdump,
544  typename typB, typename typP>
545 void AddB_dim(const typmat & mat, const typmat &L, typP &P, typPk & Pk
546  ,const typMk &Mk,const typdump & dump, typB &b)
547 {
548 
549  typedef typename typPk::value_type pol;
550  typedef typename pol::monom_t mon;
551  typedef typename pol::coeff_t coeff_t;
552  typename typPk::iterator iterpk;
553 
554  typename typMk::const_iterator iter=Mk.begin();
555  int r=my_rank(mat);
556  unsigned int i;
557  //cout<<"DANS ADDB"<<endl;
558  //cout<<"rang de la matrice m "<<r<<" Mk.size "<<Mk.size()<<endl;
559  //cout<<"taille de la matrice "<<mat.nrow<<"x"<<mat.ncol<<endl;
560  // tmp.refuse=(mon*)MAC_REV_MALLOC<mon>(r*sizeof(mon));
561  //tmp.taille2=r;
562  //tmp.accept=(mon*)MAC_REV_MALLOC<mon>((Mk.size()-r)*sizeof(mon));
563  //tmp.taille1=Mk.size()-r;
564  //for(i=0;i<(unsigned)r;i++,iter++)
565  // tmp.refuse[i]=*iter;
566 
567  //bon maintenant que l'on vient de rajouter des
568  //monomes au quotient il faut remttre les polynomes comme il faut
569  iter=Mk.begin();
570  for(unsigned int i=0;i<Mk.size();i++,iter++)
571  {
572  if(Iszero(mat(i,i)))
573  {
574  int index=mon2int(*iter);
575  iterpk=Pk.begin();
576  //on commence a faire de l'algebre lineaire
577  coeff_t *vec=(coeff_t*)MAC_REV_MALLOC<coeff_t>(i*sizeof(coeff_t));
578  for(unsigned int j=0;j<i;j++)
579  vec[j]=mat(j,i);
580  //le vecteur est fait reste plus qu'a
581  //resoudre le syteme lineaire
582  for(int k=i-1;k>=0;k--)
583  {
584  if(Iszero(mat(k,k))) continue;
585  vec[k]/=mat(k,k);
586  for(int j=k-1;j>=0;j--)
587  vec[j]-=vec[k]*mat(j,k);
588  }
589  //bon ca a l'air d'etre bon pour la resolution du systeme lineaire
590  //on remet les coeff de vec dans les pol a la bonne place
591  for(unsigned int j=0;j<i;j++,iterpk++)
592  {
593  //cout<<"tour deboucle addB "<<j<<endl;
594  if((!Iszero(vec[j])))//&&(!Iszero(mat(j,j))))
595  {
596  int i;
597  iterpk->nf=(typename mon::coeff_t*)
598  MAC_REV_REALLOC<typename mon::coeff_t>(iterpk->nf
599  ,iterpk->size*sizeof(typename mon::coeff_t)
600  ,(iterpk->size+1)*sizeof(typename mon::coeff_t));
601  if((index/8)>=iterpk->sizenf)
602  {
603  iterpk->nfind=(unsigned char*)
604  MAC_REV_REALLOC<unsigned char>(iterpk->nfind
605  ,iterpk->sizenf,index/8+1);
606  for(int i=iterpk->sizenf;i<index/8+1;i++)
607  iterpk->nfind[i]=0;
608  iterpk->sizenf=index/8+1;
609 
610  }
611 
612  i=iterpk->size;
613  for(int k=iterpk->sizenf-1;k>index/8;k--)
614  {
615  //cout<<"k "<<k<<endl;
616  if(iterpk->nfind[k]!=0)
617  {
618  for(int j=0;j<nbbits[iterpk->nfind[k]];j++)
619  {
620  iterpk->nf[i]=iterpk->nf[i-1];
621  i--;
622  }
623  }
624  }
625  for(int k=7;k>(index%8);k--)
626  if((iterpk->nfind[index/8]>>k)&1)
627  {
628  iterpk->nf[i]=iterpk->nf[i-1];
629  i--;
630  }
631  iterpk->nf[i]=vec[j];
632  iterpk->nfind[index/8]|=(1<<(index%8));
633  iterpk->size++;
634  //cout<<"rajoute le monome "<<*iter<<" a la ligne "<<j<<" "<<vec[j]<<" i "<<i<<endl;
635  //cout<<"le pol"<<endl<<invconv<Poly>(*iterpk)<<endl;
636  }
637  }
638  MAC_REV_FREE<coeff_t>(vec,i*sizeof(coeff_t));
639  }
640  }
641  //rajoute_voisins(Pk,Mk,dump,b);
642  iter=Mk.begin();
643  for(i=0;i<Mk.size();i++,iter++)
644  {
645  if(Iszero(mat(i,i)))
646  {
647  list<mon> listlcm;
648  mon pere;
649  predicat<mon> tmp,stockpred=findpred(*iter,b);
650  int j=0,k=0;
651  tmp.refuse=(mon*)MAC_REV_MALLOC<mon>
652  ((stockpred.taille2)*sizeof(mon));
653  tmp.taille2=(stockpred.taille2-1);
654  tmp.accept=(mon*)MAC_REV_MALLOC<mon>(sizeof(mon));
655  tmp.taille1=1;
656  tmp.accept[0]=*iter;
657  for(int j=0;j<stockpred.taille2;j++)
658  if(isdivisible(stockpred.refuse[j],*iter,b))
659  {
660  pere.rep=stockpred.refuse[j].rep;
661  break;
662  }
663  cout<<"le pere "<<pere<<endl;
664  for(int j=0;j<stockpred.taille2;j++)
665  if(stockpred.refuse[j].rep!=pere.rep)
666  listlcm.push_back(lcm(pere,stockpred.refuse[j]));
667  for(typename list<mon>::iterator iterlcm=listlcm.begin();
668  iterlcm!=listlcm.end();iterlcm++)
669  for(typename list<mon>::iterator iterlcm2=listlcm.begin();
670  iterlcm2!=listlcm.end();iterlcm2++)
671  if ((iterlcm2!=iterlcm) && (isdivisible(*iterlcm,*iterlcm2,b)))
672  {
673  cout<<"je vire "<<*iterlcm2<<" parce que divisible par "<<*iterlcm<<endl;
674  listlcm.erase(iterlcm2--);
675  }
676  cout<<"apres tri il me reste"<<endl;
677  for(typename list<mon>::iterator iterlcm=listlcm.begin();
678  iterlcm!=listlcm.end();iterlcm++)
679  cout<<*iterlcm<<endl;
680  //On a maintenant les minimaux pour la division
681  //reste a retirer les bons
682  for(typename list<mon>::iterator iterlcm=listlcm.begin();
683  iterlcm!=listlcm.end();iterlcm++)
684  if(iterlcm->GetDegree()>=Mk.begin()->GetDegree())
685  {
686  for(j=0;j<stockpred.taille2;j++)
687  if ((isdivisible(stockpred.refuse[j],*iterlcm,b))
688  && (stockpred.refuse[j].rep != pere.rep))
689  break;
690  tmp.refuse[k++]=stockpred.refuse[j];
691  }
692 #if 0
693  iterpk=Pk.begin();
694  cout<<"mon rajoute "<<*iter<<endl;
695  for(typename typMk::const_iterator iter2=Mk.begin()
696  ;iter2!=iter;iter2++,j++,iterpk++)
697  if(!Iszero(L(i,j)))
698  {
699  predicat<mon> tmppred=findpred(*iter2,b);
700  mon tmpmon=lcm(*iter,*iter2), tmpmon2=mon(1);
701  for(int l=0;l<b.nbvar();l++)
702  tmpmon2*=mon(l,tmpmon.GetDegree(l)-iter2->GetDegree(l));
703  tmp.refuse[k++]=tmpmon;
704  cout<<"iterpk->ind*tmpmon2 "<<iterpk->ind*tmpmon2<<endl;
705  cout<<invconv<Poly>(*iterpk)*tmpmon2<<endl;;
706  P.push_back(invconv<Poly>(*iterpk)*tmpmon2);
707  }
708 #endif
709  tmp.refuse=(mon*)MAC_REV_REALLOC<mon>(tmp.refuse,
710  (stockpred.taille2)*sizeof(mon)
711  ,k*sizeof(mon));
712  tmp.taille2=k;
713  b.def.push_back(tmp);
714  //cout<<"monome rajoute au quotient "<<*iter<<endl;
715  }
716  }
717  cout<<"Dans Addb"<<endl;
718  for(typename typB::iterator p=b.begin();p!=b.end();p++)
719  {
720  for(int i=0;i<p->taille1;i++)
721  {
722  cout<<"p.accept[i] "<<p->accept[i]<<endl;
723  }
724  for(int i=0;i<p->taille2;i++)
725  {
726  cout<<"p.refuse[i] "<<p->refuse[i]<<endl;
727  }
728  }
729  cout<<"eeeeeeeeeeeeeeeeeeeeeeeeeee"<<endl;
730 return;
731 }
732 
733 #endif
734 
735 #endif //ALREADY_IsinB
Definition: workspace.hpp:11
T coeff
Definition: IsinB3.hpp:232
const_iterator end() const
Definition: IsinB3.hpp:33
#define max(a, b)
Definition: alp_f2c.H:167
void my_plus(pol &res, const pol &nf, const coeff toto)
Definition: corealgo.hpp:543
int mon2int(const mon &mm)
Definition: placemon3.hpp:679
int isdivisible(const mon &m1, const mon &m2, int nbvar)
Definition: isdivisible.hpp:5
Base< predicat< mon > > typB
Definition: solver_bb_floating.cpp:142
reverse_iterator rend()
Definition: IsinB3.hpp:34
C GetCoeff() const
Definition: Monom.hpp:67
monom monom_t
Definition: IsinB3.hpp:12
MSKaccmodee MSKint32t MSKint32t last
Definition: mosek.h:2545
void Dovoisins(const typename typMk::value_type &m, typMk &voisins, const typdump &dump, const Base &b)
Definition: IsinB3.hpp:84
list< predicat >::iterator iterator
Definition: IsinB3.hpp:22
typpol mult(int i, const typpol &pol, const typdump &dump, const Base &b, mon **exce, int &exsize)
Definition: corealgo.hpp:1077
int nbvar() const
Definition: IsinB3.hpp:40
mon * accept
Definition: types.hpp:6
int member(const typMk &tmpMk, const typename typMk::value_type mon)
Definition: corealgo.hpp:1391
void AddB(const typmat &mat, typPk &Pk, const typMk &Mk, const typdump &dump, typB &b, monomial_server &serv)
Definition: IsinB3.hpp:244
list< predicat >::const_iterator const_iterator
Definition: IsinB3.hpp:23
Definition: types.hpp:3
T coeff_t
Definition: pol.hpp:9
int taille1
Definition: types.hpp:5
MSKaccmodee MSKint32t first
Definition: mosek.h:2545
bool operator()(const sortstruct< T > &a, const sortstruct< T > &b)
Definition: IsinB3.hpp:236
int nbvar()
Definition: IsinB3.hpp:39
int mon2int(const mon &mm)
Definition: placemon.hpp:294
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
void rajoute_voisins(typPk &Pk, const typMk &Mk, const typdump &dump, Base &b, workspace &w, monomial_server &serv)
Definition: IsinB3.hpp:111
C coeff_t
Definition: Monom.hpp:26
int nbbits[256]
Definition: pol2ter.hpp:4
list< predicat >::reverse_iterator reverse_iterator
Definition: IsinB3.hpp:24
Definition: placemon3.hpp:14
MSKCONST char MSKint32t MSKint32t * index
Definition: mosek.h:2860
const_iterator begin() const
Definition: IsinB3.hpp:28
Definition: IsinB3.hpp:229
iterator end()
Definition: IsinB3.hpp:32
int IsinB(const mon &m, const Base &b)
Definition: IsinB3.hpp:68
list< predicat > def
Definition: types.hpp:16
Mon mon
Definition: solver_bb_floating.cpp:136
int nbvars
Definition: types.hpp:17
int taille2
Definition: types.hpp:7
Definition: types.hpp:14
exponent_t GetDegree() const
Definition: Monom.hpp:70
const_reverse_iterator rbegin() const
Definition: IsinB3.hpp:30
Mon my_divmon(const Mon &mon, int i, const Base &b)
Definition: corealgo.hpp:1262
MSKint32t MSKint32t MSKint32t i
Definition: mosek.h:2278
int Iszero(const Scl< MPQ > &c)
Definition: Iszero.hpp:14
predicat predicat_t
Definition: IsinB3.hpp:20
int index
Definition: IsinB3.hpp:231
MSKrescodee r
Definition: mosek.h:2321
mon lcm(const mon &m1, const mon &m2)
Definition: corealgo.hpp:43
MSKstreamtypee MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t a
Definition: mosek.h:3833
int isinb(const mon &m, predicat p, const Base &b)
Definition: IsinB3.hpp:44
mon * refuse
Definition: types.hpp:8
void AddB_dim(const typmat &mat, const typmat &L, typP &P, typPk &Pk, const typMk &Mk, const typdump &dump, typB &b)
Definition: IsinB3.hpp:545
monom * refuse
Definition: IsinB3.hpp:11
iterator erase(iterator first)
Definition: IsinB3.hpp:38
predicat< mon > findpred(const mon &m, const typB &b)
Definition: IsinB3.hpp:503
iterator begin()
Definition: IsinB3.hpp:27
const_reverse_iterator rend() const
Definition: IsinB3.hpp:35
monom * accept
Definition: IsinB3.hpp:9
list< predicat >::const_reverse_iterator const_reverse_iterator
Definition: IsinB3.hpp:25
predicat::monom_t mon
Definition: IsinB3.hpp:21
#define pol
Definition: pol2ter.hpp:3
Multivariate monomials.
Definition: Monom.hpp:21
iterator erase(iterator first, iterator last)
Definition: IsinB3.hpp:37
reverse_iterator rbegin()
Definition: IsinB3.hpp:29
Definition: IsinB3.hpp:235
Home  |  Download & InstallContributions