Borderbasix

corealgo3sdp.hpp
Go to the documentation of this file.
1 
2 #ifndef ALREADY_corealgo3
3 #define ALREADY_corealgo3
4 #include<algorithm>
5 #include<iostream>
6 #include<string>
7 #include<fstream>
8 #include<iomanip>
9 #include<iterator>
10 
11 
12 #include "linalg/clapack.h"
13 
14 namespace coinor {
15 // extern "C" {
16 #define NOSHORTS
17 using namespace std;
18 #include "sdpinclude.hpp"
19 //#include "declarations.hpp"
20 //}
21 }
22 
23 template<typename typP,typename typPk,typename Base>
24 void Crochetchoix(const typP & P,typPk & Pk, typPk & redspol,int k,
25  Base &b);
26 
27 template<typename typPk>
28 void stab(typPk & Pk)
29 {
30  typedef typename typPk::value_type pol;
31  for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
32  {
33  pol tmpres=mon(0);
34  for(typename pol::iterator iterpol=iter->begin();iterpol!=iter->end();
35  iterpol++)
36  {
37  if(!Iszero(iterpol->GetCoeff()))
38  tmpres+=*iterpol;
39  }
40  *iter=tmpres;
41  }
42 }
43 
44 template<typename T>
45 void my_merge(T &l1,const T &l2)
46 {
47  typename T::const_iterator iter=l2.begin();
48  for(;iter!=l2.end();iter++)
49  l1.push_back(*iter);
50 }
51 template<typename mon>
52 mon lcm(const mon &m1,const mon &m2)
53 {
54  mon m(1);
55  int maxi=max(lvar(m1.rep),lvar(m2.rep));
56  for(int i=0;i<=maxi;i++)
57  m*=mon(i,max(m1.GetDegree(i),m2.GetDegree(i)));
58  return m;
59 }
60 
61 static int max_degppcm;
62 
63 template<typename typppcm,typename Base>
64 int compute_ppcm(typppcm &ppcm,const Base & b)
65 {
66  typedef typename Base::mon mon;
67  //typppcm tmpppcm;
68  max_degppcm=0;
69  int maxdeg=-1;
70  list<mon> list1,list2,tmplist2;
71 
72 
73  for(typename Base::const_reverse_iterator iter=b.rbegin()
74  ;iter==b.rbegin();iter++)
75  {
76 #ifndef oldppcm
77  for(int i=0;i<iter->taille2;i++)
78  for(int j=i+1;j<iter->taille2;j++)
79  {
80  mon tmpmon=lcm(iter->refuse[i],iter->refuse[j]);
81 
82  if((!ppcm.count(tmpmon))&&
83  (tmpmon.GetDegree()!=
84  (iter->refuse[i].GetDegree()+iter->refuse[j].GetDegree())))
85  {
86  ppcm[tmpmon]=1;
87  if(tmpmon.GetDegree()>max_degppcm)
88  max_degppcm=tmpmon.GetDegree();
89  }
90 
91  // cout<<"ppcm rajoute "<<tmpmon<<" "<<iter->refuse[i]<<" "<<iter->refuse[j]<<endl;
92  }
93 #else
94  for(int i=0;i<iter->taille2;i++)
95  for(int j=i+1;j<iter->taille2;j++)
96  {
97  mon tmpmon=lcm(iter->refuse[i],iter->refuse[j]);
98 
99  if((tmpmon.GetDegree()!=
100  (iter->refuse[i].GetDegree()+iter->refuse[j].GetDegree())))
101  {
102  int ok=1;
103  for(int k=0;k<iter->taille2;k++)
104  {
105  if((k!=i) && (k!=j)
106  && (isdivisible(iter->refuse[k],tmpmon,b)))
107  {
108  mon lc_i=lcm(iter->refuse[k],iter->refuse[i]);
109  mon lc_j=lcm(iter->refuse[k],iter->refuse[j]);
110  if((lc_i.rep!=tmpmon.rep)
111  && (isdivisible(lc_i,tmpmon,b)) &&
112  (lc_j.rep!=tmpmon.rep)
113  &&(isdivisible(lc_j,tmpmon,b)))
114  ok=0;
115  }
116  }
117  if(ok)
118  list2.push_back(tmpmon);
119  }
120  }
121 #endif
122  }
123 #ifdef oldppcm
124  maxdeg=0;
125  // cout<<"liste2.size "<<list2.size()<<endl;
126  for(typename list<mon>::iterator iter2=list2.begin();
127  iter2!=list2.end();iter2++)
128  {
129  // cout<<"je passe ici "<<*iter2<<endl;
130  ppcm[*iter2]=1;
131  if(iter2->GetDegree()>maxdeg)
132  maxdeg=iter2->GetDegree();
133  }
134  max_degppcm=maxdeg;
135 #endif
136  return maxdeg;
137 }
138 
139 int GB_stop(int k)
140 {
141  int res=0;
142  if(k>max_degppcm) res=1;
143  return res;
144 }
145 
146 template<typename mon,typename Base,typename typppcm,typename typMk>
147 int goodspol(const mon &m1,const mon &m2, typppcm & ppcm,const Base &b
148  ,const typMk &Spoldejavu)
149 {
150  //list<mon> ppcm;
151  int res=0,comp=0;//,nobplus=1;
152  mon m=m1;
153  for(int i=0;i<b.nbvar();i++)
154  if(m1.GetDegree(i)!=m2.GetDegree(i))
155  {
156  comp++;
157  if (m1.GetDegree(i)-m2.GetDegree(i)==1)
158  res+=1;
159  if (m1.GetDegree(i)-m2.GetDegree(i)==-1)
160  {
161  res+=1;
162  m*=mon(i,1);
163  }
164  };
165  //compute_ppcm(ppcm,b);
166  //if((res==2)&&(comp==2))
167  // for(int i=0;i<b.nbvar();i++)
168  // if(m.GetDegree(i)>0)
169  // nobplus=nobplus && !IsinB(my_divmon(m,i,b),b);
170  //cout<<"m1 "<<m1<<" m2 "<<m2<<" resultat "<<((res==2)&&(comp==2))<<endl;
171  //return ((res==2)&&(comp==2)&&nobplus);
172  //cout<<m1<<" < "<<m2<<" res "<<(member(ppcm,m)&&(res==2)&&(comp==2))<<endl;
173 
174  // cout<<"m "<<m<<endl;
175  //il y a un pbm a ne pas refaire les spol deja vu je ne comprends
176  //pas pourquoi voir example caprass
177  #ifdef NO_TWICE
178  return (res==2)&&(comp==2)&&ppcm[m]&&!member(Spoldejavu,m);
179  #else
180  return (res==2)&&(comp==2)&&ppcm.count(m);
181  #endif
182 }
183 
184 template<typename typPk,typename Base,typename typMk>
185 typPk Spolordsup(const typPk &Pk,const Base & b, const typMk & Spoldejavu)
186 {
187  typedef typename typPk::value_type::monom_t mon;
188  //typedef typename typ::order_t O;
189  map<mon,int> ppcm;
190  typPk res;
191  int maxdeg;
192  maxdeg=compute_ppcm(ppcm,b);
193  cout<<"maxdeg"<<maxdeg<<endl;
194  //cout<<"test goodspol"<<endl;
195  for(typename typPk::const_iterator iter1=Pk.begin();iter1!=Pk.end();iter1++)
196 
197  for(typename typPk::const_iterator iter2=iter1;iter2!=Pk.end();iter2++)
198  { cout<<"iter1->ind"<<iter1->ind<<endl;
199  cout<<"iter2->ind"<<iter2->ind<<endl;
200  cout<<"goodspol"<<goodspol(iter1->ind,iter2->ind,ppcm,b,Spoldejavu)<<endl;
201  if (goodspol(iter1->ind,iter2->ind,ppcm,b,Spoldejavu))
202  {
203 // cout<<"iter1"<<*iter1<<endl;
204 // cout<<"iter2"<<*iter2<<endl;
205  res.push_back(*iter1);
206  res.push_back(*iter2);
207  }
208  }
209  return res;
210 }
211 template<typename typP>
212 int minmaxdegP(typP P,int &maxdeg)
213 {
214  int res=Degree(P.front());
215  maxdeg=res;
216  for(typename typP::iterator iter=P.begin();iter!=P.end();iter++)
217  {
218  res=(res>Degree(*iter))?Degree(*iter):res;
219  maxdeg=(maxdeg<Degree(*iter))?Degree(*iter):maxdeg;
220  }
221  return res;
222 }
223 template<typename typP>
224 typP Crochet(const typP &P, int k)
225 {
226  typP res;
227  for(typename typP::const_iterator iter=P.begin();iter!=P.end();iter++)
228  {
229  if(Degree(*iter)==k) res.push_back(*iter);
230  }
231  return res;
232 }
233 
234 template<typename mon, typename T, typename monomial_server>
235 std::list<pol<mon,T> > Crochet(const std::list<pol<mon,T> > &P, int k,
236  monomial_server &serv)
237 {
238  std::list<pol<mon,T> > res;
239  for(typename std::list<pol<mon,T> >::const_iterator iter=P.begin()
240  ;iter!=P.end();iter++)
241  {
242  if(Degree(*iter,serv)==k) res.push_back(*iter);
243  }
244  return res;
245 }
246 
247 template<typename typP, typename Base>
248 void Setnbvars(const typP &tmpPk,Base& b)
249 {
250  int tmpvar=0;
251  for(typename typP::const_iterator iter=tmpPk.begin();iter!=tmpPk.end();iter++)
252  for(typename typP::value_type::const_iterator iterpol=iter->begin();
253  iterpol!=iter->end();iterpol++)
254  {
255  cout<<"iterpol->rep"<<iterpol->rep<<endl;
256  cout<<"lvar(iterpol->rep)"<<lvar(iterpol->rep)<<endl;
257  if(tmpvar<lvar(iterpol->rep)) tmpvar=lvar(iterpol->rep);
258  }
259  b.nbvars=tmpvar+1;
260 }
261 
262 template<typename typP>
263 int Setnvars(const typP &tmpPk)
264 {
265  int tmpvar=0;
266  for(typename typP::const_iterator iter=tmpPk.begin();iter!=tmpPk.end();iter++)
267  for(typename typP::value_type::const_iterator iterpol=iter->begin();
268  iterpol!=iter->end();iterpol++)
269  {
270  cout<<"iterpol->rep"<<iterpol->rep<<endl;
271  cout<<"lvar(iterpol->rep)"<<lvar(iterpol->rep)<<endl;
272  if(tmpvar<lvar(iterpol->rep)) tmpvar=lvar(iterpol->rep);
273  }
274  return tmpvar+1;
275 
276 }
277 
278 template<typename typP, typename typMk, typename Base,
279  typename monomial_server>
280 void DoBaseMk(const typP &tmpPk, typMk &Mk, Base &b, monomial_server &serv)
281 {
282  typedef typename typMk::value_type mon;
283  typename Base::predicat_t tmp;
284  int i=0;
285  //int tmpvar=0;
286 
287  for(typename typP::const_iterator iter=tmpPk.begin();iter!=tmpPk.end();iter++)
288  {
289  mon tmp(choice(*iter,b,serv));
290  int yes=1;
291  // cout<<"pol dans DoBaseMk "<<endl<<*iter<<endl<<"g choisi "<<tmp<<endl;
292  tmp.SetCoeff(1);//*=mon(1/tmp.GetCoeff());
293  for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++)
294  if(*iter==tmp) {yes=0;break;};
295  if(yes) Mk.push_back(tmp);
296  }
297  //cout<<"Mk.size()"<<Mk.size()<<endl;
298  tmp.taille2=Mk.size();
299  tmp.refuse=(mon*)MAC_REV_MALLOC<mon>(tmp.taille2*sizeof(mon));
300  tmp.taille1=1;
301  tmp.accept=(mon*)MAC_REV_MALLOC<mon>(sizeof(mon));
302  // cout<<"mon(1) "<<mon(1)<<endl;
303  tmp.accept[0]=mon(1);
304  //cout<<"tmp.accept "<<tmp.accept[0]<<endl;
305  i=0;//pour en etre bien sur
306  for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++,i++)
307  {
308  tmp.refuse[i]=*iter;
309  };
310  if(!b.def.empty())
311  {
312  typename Base::predicat_t verytmp;
313  for(typename Base::iterator iter=b.begin();iter!=b.end();iter++)
314  {
315  verytmp=*iter;
316  MAC_REV_FREE<mon>(verytmp.refuse,verytmp.taille2*sizeof(mon));
317  MAC_REV_FREE<mon>(verytmp.accept,verytmp.taille1*sizeof(mon));
318  }
319  b.erase(b.begin(),b.end());
320  }
321  b.def.push_back(tmp);
322  return;
323 }
324 
325 template <typename typPk,typename typMk,typename typmat >
326 typmat*
327 MatrixOf(const typPk & L,
328  const typMk & lm,const typmat &mat)
329 {
330  typedef typename typPk::value_type POL;
331  typedef typename typMk::value_type monom_t;
332  typmat *res=NULL;
333  map<monom_t,int> index;
334  int l=1;
335  if (res!=NULL) {delete res;};
336  for(typename typMk::const_iterator m = lm.begin(); m!=lm.end(); m++){
337  // cout<<"*m "<<*m<<endl;
338  index[*m]=l;
339  l++;
340  }
341  int c;
342  res=new typmat(L.size(),lm.size());
343  l=0;
344 
345  cout<<"L.size() "<<L.size()<<" lm.size() "<<lm.size()<<endl;
346  for(typename typPk::const_iterator pi = L.begin(); pi != L.end(); ++pi){
347  for(typename POL::const_iterator m = pi->begin(); m!=pi->end(); m++)
348  {
349 
350  if((index.count(*m)))
351  {
352  c=index[*m];
353  (*res)(l,c-1,m->GetCoeff());
354  }
355  }
356  l++;
357  }
358  cout<<"fin"<<endl;
359  return res;
360 }
361 
362 template<typename typMat,typename typP,typename typPk,typename typMk, typename Base,typename typdump, class monomial_server, typename workspace>
363 void init_algo(typP &P,int &nouveaumon, int &maxdeg, int & k,
364  typPk &Pk, typMk & Mk, Base & b, typdump & dump, workspace &w,
365  monomial_server &serv)
366 {
367  typedef typename typPk::value_type pol;
368  typedef typename pol::coeff_t coeff;
369  typedef typename pol::monom_t mon;
370  const typename typP::value_type::order_t (tmpord)(const mon,const mon);
371  typP tmpPk=P;
372  pol debugpol;
373  typMat *Mat;
374  int *pr,*pc,flag=1;
375  serv.setorder(my_ord);
376  nouveaumon=1;
377  Setnbvars(P,b);
378  cout<<"Init Space"<<endl;
379  init_space(&w);
380  cout<<"Init Space fini"<<endl;
381 #ifdef unimul
382  serv.init_multiple(b.nbvars);
383 #endif
384 #ifdef uninf
385  serv.init_nf(b.nbvars);
386 #endif
387  flag=1;
388 while(flag)
389  {
390  cout<<"Dans While"<<endl;
391  Mk.erase(Mk.begin(),Mk.end());
392  cout<<"Dans While 1"<<endl;
393  k=minmaxdegP(tmpPk,maxdeg);
394  cout<<"Dans While 2"<<endl;
395  tmpPk=Crochet(tmpPk,k);
396  cout<<"Dans While 3"<<endl;
397  DoBaseMk(tmpPk,Mk,b,serv);
398  cout<<"Dans While 4"<<endl;
399  Mat=MatrixOf(tmpPk,Mk,typMat());
400  cout<<"Dans While 5"<<endl;
401  tmpPk=Solve(*Mat,tmpPk,&pr,&pc);
402  cout<<"Dans While 6"<<endl;
403  selectnozero(tmpPk);
404  stab(tmpPk);
405  cout<<"my_rank(*Mat)"<<my_rank(*Mat)<<endl;
406  cout<<"tmpPk.size()"<<tmpPk.size()<<endl;
407  if(my_rank(*Mat)==(int)tmpPk.size()) flag=0;
408  Mat->destroystore();
409  delete(Mat);
410  free(pr);
411  free(pc);
412  }
413  cout<<"While fini"<<endl;
414  for(typename typP::iterator iter=tmpPk.begin();iter!=tmpPk.end();iter++)
415  {
416  Pk.push_back(convert<pol>(*iter,b,serv));
417  cout<<"tmpPk"<<*iter<<endl;
418  }
419 
420  Dump(Pk,dump);
421 
422 
423  return ;
424 }
425 
426 template<typename pol,typename coeff, typename workspace>
427 void inline my_plus(pol &res,const pol & nf,const coeff toto,workspace *w)
428 {
429  typedef typename pol::monom_t mon;
430  typedef typename mon::coeff_t mcoeff_t;
431  //symbolic size
432  int i=0,j=0,k=0,p=0,q=0;
433  int tmpsize=0,tmp;
434  mcoeff_t *tmpnf,*tmpspace,zero=0;
435  unsigned char *tmpnfind;
436 #ifdef DEB
437  cout<<"dans myplus je calcul"<<endl<<invconv<Poly>(res)<<endl<<
438  "toto "<<toto<<endl<<"nf"<<endl<<invconv<Poly>(nf)<<endl;
439 #endif
440  if(res.sizenf<nf.sizenf)
441  {
442  // cout<<"res.sizenf<nf.sizenf "<<endl;
443  if(w->sizenf<nf.sizenf)
444  increase_space(w);
445 
446 //#pragma omp parallel for shared(w,toto)
447  for(i=0;i<res.sizenf;i++)
448  {
449  if(res.nfind[i]|nf.nfind[i])
450  {
451  w->tabnf[i]=res.nfind[i]|nf.nfind[i];
452  for(int j=0;j<8;j++)
453  {
454  if ((res.nfind[i]>>j)&1)
455  w->tabcoeff[8*i+j]=res.nf[p++];
456  if((nf.nfind[i]>>j)&1)
457  w->tabcoeff[8*i+j]-=toto*nf.nf[q++];
458  if(Iszero(w->tabcoeff[8*i+j]))
459  w->tabnf[i]&=~(1<<j);
460  }
461  }
462  }
463 //#pragma omp parallel for shared(w,toto)
464  for(i=res.sizenf;i<nf.sizenf;i++)
465  {
466  if(nf.nfind[i])
467  for(int j=0;j<8;j++)
468  if ((nf.nfind[i]>>j)&1)
469  if (!Iszero(nf.nf[q++]))
470  w->tabcoeff[8*i+j]=((mcoeff_t)-1)*toto*(nf.nf[q-1]);
471  else
472  w->tabnf[i]&=~(1<<j);
473  w->tabnf[i]=nf.nfind[i];
474  }
475  for(int i=0;i<nf.sizenf;i++)
476  tmpsize+=nbbits[w->tabnf[i]];
477  res.nf=(COEFF*)MAC_REV_REALLOC<COEFF>(res.nf,res.size*sizeof(COEFF)
478  ,tmpsize*sizeof(COEFF));
479  res.size=tmpsize;
480  res.nfind=(unsigned char*)realloc(res.nfind,nf.sizenf);
481  res.sizenf=nf.sizenf;
482 
483  for(int i=0;i<nf.sizenf;i++)
484  {
485  if(w->tabnf[i])
486  for(int j=0;j<8;j++)
487  if ((w->tabnf[i]>>j)&1)
488  //if (!Iszero(w->tabcoeff[8*i+j]))
489  {
490  res.nf[k++]=w->tabcoeff[8*i+j];
491  w->tabcoeff[8*i+j]=zero;
492  }
493  //else
494  // w->tabnf[i]&=~(1<<j);
495  res.nfind[i]=w->tabnf[i];
496  w->tabnf[i]=0;
497  }
498  }
499  else
500  {
501  if(w->sizenf<res.sizenf)
502  increase_space(w);
503 //#pragma omp parallel for shared(w,toto)
504  for(i=0;i<nf.sizenf;i++)
505 #if 1
506  {
507  if(res.nfind[i])
508  {
509  unsigned char mask=1;
510  w->tabnf[i]=res.nfind[i];
511  if(res.nfind[i]==255)
512  for(int j=0;j<8;j++)
513  w->tabcoeff[8*i+j]=res.nf[p++];
514  else
515  for(int j=0;j<8;j++,mask<<=1)
516  {
517  //if ((res.nfind[i]>>j)&1)
518  if (res.nfind[i]&mask)
519  w->tabcoeff[8*i+j]=res.nf[p++];
520  }
521  }
522  if(nf.nfind[i])
523  {
524  unsigned char mask=1;
525  w->tabnf[i]|=nf.nfind[i];
526  if(nf.nfind[i]==255)
527  for(int j=0;j<8;j++,mask<<=1)
528  {
529  w->tabcoeff[8*i+j]-=toto*nf.nf[q++];
530  if(Iszero(w->tabcoeff[8*i+j]))
531  w->tabnf[i]&=~mask;
532  }
533  else
534  for(int j=0;j<8;j++,mask<<=1)
535  {
536  if(nf.nfind[i]&mask)
537  w->tabcoeff[8*i+j]-=toto*nf.nf[q++];
538  if(Iszero(w->tabcoeff[8*i+j]))
539  w->tabnf[i]&=~mask;
540  }
541  }
542  }
543 #endif
544 #if 0
545  if(res.nfind[i]|nf.nfind[i])
546  {
547  w->tabnf[i]=res.nfind[i]|nf.nfind[i];
548  for(int j=0;j<8;j++)
549  {
550  if ((res.nfind[i]>>j)&1)
551  {
552  w->tabcoeff[8*i+j]=res.nf[p++];
553  }
554  if((nf.nfind[i]>>j)&1)
555  w->tabcoeff[8*i+j]-=toto*nf.nf[q++];
556  if(Iszero(w->tabcoeff[8*i+j]))
557  w->tabnf[i]&=~(1<<j);
558  }
559  }
560 #endif
561 //#pragma omp parallel for shared(w,toto)
562  for(i=nf.sizenf;i<res.sizenf;i++)
563  {
564  if(res.nfind[i])
565  for(int j=0;j<8;j++)
566  if ((res.nfind[i]>>j)&1)
567  if (!Iszero(res.nf[p++]))
568  w->tabcoeff[8*i+j]=res.nf[p-1];
569  else
570  w->tabnf[i]&=~(1<<j);
571  w->tabnf[i]=res.nfind[i];
572  }
573  for(int i=0;i<res.sizenf;i++)
574  tmpsize+=nbbits[w->tabnf[i]];
575  res.nf=(COEFF*)MAC_REV_REALLOC<COEFF>(res.nf,res.size*sizeof(COEFF)
576  ,tmpsize*sizeof(COEFF));
577  res.size=tmpsize;
578  // res.nfind=(unsigned char*)realloc(res.nfind,nf.sizenf);
579  //res.sizenf=nf.sizenf;
580  for(int i=0;i<res.sizenf;i++)
581  {
582  if(w->tabnf[i])
583  for(int j=0;j<8;j++)
584  if ((w->tabnf[i]>>j)&1)
585  //if (!Iszero(w->tabcoeff[8*i+j]))
586  {
587  res.nf[k++]=w->tabcoeff[8*i+j];
588  w->tabcoeff[8*i+j]=zero;
589  }
590  //else
591  // w->tabnf[i]&=~(1<<j);
592 
593  res.nfind[i]=w->tabnf[i];
594  w->tabnf[i]=0;
595  }
596  }
597 
598 #ifdef DEB
599  cout<<"k "<<k<<" tmpsize "<<tmpsize<<endl;
600  int cpt=0;
601  for(int i=0;i<res.sizenf;i++)
602  if(res.nfind[i])
603  for(int j=0;j<8;j++)
604  if ((res.nfind[i]>>j)&1)
605  if (Iszero(res.nf[cpt++]))
606  cout<<"j'ai fait n'importe quoi ici"<<endl;
607  cout<<"les resultat "<<endl<<invconv<Poly>(res)<<endl;
608 #endif
609  return;
610 }
611 template<typename pol,typename coeff>
612 void inline my_plus(pol &res,const pol & nf,const coeff toto,int removeme)
613 {
614  typedef typename pol::monom_t mon;
615  typedef typename mon::coeff_t mcoeff_t;
616  //symbolic size
617  int i=0,j=0,k=0,p=0,q=0;
618  int tmpsize=0,tmp;
619  mcoeff_t *tmpnf,*tmpspace;
620  unsigned char *tmpnfind;
621 #ifdef DEB
622  cout<<"dans myplus je calcul"<<endl<<invconv<Poly>(res)<<endl<<
623  "toto "<<toto<<endl<<"nf"<<endl<<invconv<Poly>(nf)<<endl;
624 #endif
625  if(res.sizenf<nf.sizenf)
626  {
627  tmpspace=(mcoeff_t*)
628  MAC_REV_MALLOC<mcoeff_t>(sizeof(mcoeff_t)*nf.sizenf*8);
629  for(int i=0;i<nf.sizenf*8;i++)
630  tmpspace[i]=0;
631  for(int i=0;i<res.sizenf;i++)
632  tmpsize+=nbbits[res.nfind[i]|nf.nfind[i]];
633  for(int i=0;i<nf.sizenf;i++)
634  tmpsize+=nbbits[nf.nfind[i]];
635  tmpnf=(mcoeff_t*)
636  MAC_REV_MALLOC<mcoeff_t>(sizeof(mcoeff_t)*tmpsize);
637  tmpnfind=(unsigned char*)
638  MAC_REV_MALLOC<unsigned char>(nf.sizenf);
639  // memset(tmpnfind,0,nf.sizenf);
640 
641  for(int i=0;i<res.sizenf;i++)
642  {
643  if(res.nfind[i]|nf.nfind[i])
644  for(int j=0;j<8;j++)
645  {
646  if ((res.nfind[i]>>j)&1)
647  tmpspace[8*i+j]=res.nf[p++];
648  if((nf.nfind[i]>>j)&1)
649  tmpspace[8*i+j]-=toto*nf.nf[q++];
650  }
651  tmpnfind[i]=res.nfind[i]|nf.nfind[i];
652  }
653 
654  for(int i=res.sizenf;i<nf.sizenf;i++)
655  {
656  if(nf.nfind[i])
657  for(int j=0;j<8;j++)
658  if ((nf.nfind[i]>>j)&1)
659  tmpspace[8*i+j]=((mcoeff_t)-1)*toto*(nf.nf[q++]);
660  tmpnfind[i]=nf.nfind[i];
661  }
662  for(int i=0;i<nf.sizenf;i++)
663  if(tmpnfind[i])
664  for(int j=0;j<8;j++)
665  if ((tmpnfind[i]>>j)&1)
666  if (!Iszero(tmpspace[8*i+j]))
667  tmpnf[k++]=tmpspace[8*i+j];
668  else
669  tmpnfind[i]&=~(1<<j);
670  MAC_REV_FREE<mcoeff_t>(tmpspace,nf.sizenf*8*sizeof(mcoeff_t));
671  res.sizenf=nf.sizenf;
672  }
673  else
674  {
675  tmpspace=(mcoeff_t*)
676  MAC_REV_MALLOC<mcoeff_t>(sizeof(mcoeff_t)*res.sizenf*8);
677  for(int i=0;i<res.sizenf*8;i++)
678  tmpspace[i]=0;
679  for(int i=0;i<nf.sizenf;i++)
680  tmpsize+=nbbits[res.nfind[i]|nf.nfind[i]];
681  for(int i=0;i<res.sizenf;i++)
682  tmpsize+=nbbits[res.nfind[i]];
683  tmpnf=(mcoeff_t*)
684  MAC_REV_MALLOC<mcoeff_t>(sizeof(mcoeff_t)*tmpsize);
685  tmpnfind=(unsigned char*)
686  MAC_REV_MALLOC<unsigned char>(res.sizenf);
687 
688  for(int i=0;i<nf.sizenf;i++)
689  {
690  if(res.nfind[i]|nf.nfind[i])
691  for(int j=0;j<8;j++)
692  {
693  if((res.nfind[i]>>j)&1)
694  tmpspace[8*i+j]=res.nf[p++];
695  if((nf.nfind[i]>>j)&1)
696  tmpspace[8*i+j]-=toto*nf.nf[q++];
697  }
698  tmpnfind[i]=res.nfind[i]|nf.nfind[i];
699  }
700 
701  for(int i=nf.sizenf;i<res.sizenf;i++)
702  {
703  if(res.nfind[i])
704  for(int j=0;j<8;j++)
705  if((res.nfind[i]>>j)&1)
706  tmpspace[8*i+j]=res.nf[p++];
707  tmpnfind[i]=res.nfind[i];
708  }
709 
710  for(int i=0;i<res.sizenf;i++)
711  if(tmpnfind[i])
712  for(int j=0;j<8;j++)
713  if ((tmpnfind[i]>>j)&1)
714  if (!Iszero(tmpspace[8*i+j]))
715  tmpnf[k++]=tmpspace[8*i+j];
716  else
717  tmpnfind[i]&=~(1<<j);
718 
719  MAC_REV_FREE<mcoeff_t>(tmpspace,res.sizenf*8*sizeof(mcoeff_t));
720  }
721 #ifdef DEB
722  cout<<"k "<<k<<" tmpsize "<<tmpsize<<endl;
723 #endif
724  MAC_REV_FREE<mcoeff_t>(res.nf,res.size*sizeof(mcoeff_t));
725  //res.nf=tmpnf;
726  MAC_REV_FREE<unsigned char>(res.nfind,res.sizenf);
727  //res.nfind=tmpnfind;
728 
729  res.nf=tmpnf;
730  res.nf=(mcoeff_t*)MAC_REV_REALLOC<mcoeff_t>(res.nf,res.size*sizeof(mcoeff_t)
731  ,k*sizeof(mcoeff_t));
732 
733  //cout<<"tmpnfind "<<tmpnfind<<endl;
734  res.nfind=tmpnfind;
735  // cout<<"res.nfind "<<res.nfind<<endl;
736  res.size=k;
737 #ifdef DEB
738  int cpt=0;
739  for(int i=0;i<res.sizenf;i++)
740  if(tmpnfind[i])
741  for(int j=0;j<8;j++)
742  if ((tmpnfind[i]>>j)&1)
743  if (Iszero(res.nf[cpt++]))
744  cout<<"j'ai fait n'importe quoi ici"<<endl;
745  cout<<"les resultat "<<endl<<invconv<Poly>(res)<<endl;
746 #endif
747  return;
748 }
749 
750 //#undef DEB
751 //renvoit l'indice du monome x_i*m_j
752 template<typename mon,typename Base>
753 int indice2(int i,int j,const Base & b)
754 {
755  int res=-1;
756  mon tmp;
757  int2mon(j,tmp);
758  tmp*=mon(i,1);//on suppose qd meme que j correspond a qqchose
759  //cout<<"indice2 IsinB("<<mon(i,1)*tmp<<",b) "<<IsinB(mon(i,1)*tmp,b)<<endl;
760  if(IsinB(tmp,b))
761  {
762  res=mon2int(tmp);
763  // cout<<"le monome "<<mon(i,1)*tmp<<" l'indice "<<res<<endl;
764  }
765  return res;
766 }
767 
768 //on lui donne l'ensemble des formes normales, dump, l'indice de b(cf ci dessus)
769 // le numero de la variable par laquelle on multiplie
770 //et elle renvoie un pol(cf def du type) sur la forme normale de var*m_{indmon}
771 #ifndef uninf
772 template<typename typpol,typename typdump,typename Base>
773 typpol nf(int var ,int indmon,const typdump &dump,const Base & b)
774 {
775  //on cherche dans dump...
776  //a optimiser plus tard
777  typedef typename typdump::value_type dumpstruct;
778  typedef typpol pol;
779  typedef typename pol::monom_t mon;
780  pol res;
781  res.nf=NULL;
782  res.size=-1;
783  mon tmpmon;//=mon(1,var)*int2mon<mon>(indmon);
784  int deg=0;//=tmpmon.GetDegree()+1;
785  typename typdump::const_iterator iter;
786  int2mon(indmon,tmpmon);
787  deg=tmpmon.GetDegree()+1;
788  //cout<<"mon("<<var<<",1) "<<mon(var,1)<<" et deg "<<deg<<endl;
789  tmpmon*=mon(var,1);
790  for(iter=dump.begin();
791  (iter!=dump.end()) && (iter->k!=deg);iter++);
792  // cout<<"iter-k "<<iter->k<<endl;
793  // if(iter!=dump.end()) cout<<"iter->k en sortie "<<iter->k<<" et deg "<<deg<<endl;
794  //cout<<"valuer a la sortie "<<(--iter)++->k<<endl;
795  // cout<<"iter!=dump.end() "<<(iter!=dump.end())
796  // <<" dump.empty() "<<dump.empty()<<endl;
797  if(iter!=dump.end())//on cherche pas n'importe quoi qd meme
798  {
799  int i;
800  for(i=0;i<iter->size;i++)
801  {
802  // cout<<"dans nf iter->nf[i].ind "<<iter->nf[i].ind<<endl;
803  if(iter->nf[i].ind.rep==tmpmon.rep)
804  break;
805  }
806  if(i!=iter->size)
807  //Tue Dec 4 16:39:25 MET 2001
808  // densify(iter->nf[i],res);
809 
810  res=(iter->nf[i]);
811  }
812  //cout<<"la gueule de res "<<res<<endl;
813  //if (res!=NULL) cout<<"suite de res "<<res->ind<<" "<<res->nf<<endl;
814  return res;
815 }
816 #endif
817 
818 void getperm(int *perm, int sizeperm, int *indextab)
819 {
820  int median=indextab[sizeperm/2],i,j=sizeperm-1;
821  if(1)
822  for(i=0;i<=j;i++)
823  if(indextab[i]>median)
824  {
825  int tmp=indextab[j];
826  indextab[j]=indextab[i];
827  indextab[i]=tmp;
828  j--;i--;
829  }
830  perm[sizeperm/2]=sizeperm-i;
831  getperm(perm,sizeperm-i-1,indextab);
832  getperm(perm+sizeperm-i,i,indextab+sizeperm-i);
833 }
834 
835 //effectue la multiplication du pol T par la variable x_i
836 template<typename typpol,typename typdump,typename Base,typename mon,
837  typename workspace, typename monomial_server>
838 typpol inline mult(int i,const typpol &pol,const typdump &dump,
839  const Base &b,mon **exce,int &exsize,workspace &w,
840  monomial_server &serv)
841 {
842  typedef typename typpol::coeff_t coeff;
843  static const mon monzero=mon(0);
844  static COEFF zero=0;
845  typpol ret;
846  (*exce)=(mon*)MAC_REV_MALLOC<mon>((pol.size+1)*sizeof(mon));
847  int *stockindicetab=(int*)malloc(pol.size*sizeof(int));
848  int noquo=0,maxind=0,p=0,q=0;
849  coeff *tmpspace;
850  // for(int i=0;i<w.sizenf;i++)
851  // p+=nbbits[w.tabnf[i]];
852  for(int j=0;j<pol.sizenf;++j)
853  if (pol.nfind[j])
854  {
855  for(int k=0;k<8;k++)
856  if((pol.nfind[j]>>k)&1)
857  {
858  int stockindice2=mulind(8*j+k,i,b);
859  if(stockindice2<0)
860  stockindice2=-1*(8*j+k)-1;
861  stockindicetab[p++]=stockindice2;
862 
863  // cout<<"stockindice2 "<<stockindice2<<" pol.size "<<
864  //pol.size<<" J "<<j<<endl;
865  if (stockindice2>=maxind)
866  maxind=stockindice2;
867  }
868  }
869  //cout<<"p "<<p<<" pol.size "<<pol.size<<endl;
870  for(;maxind/8+1>=w.sizenf;increase_space(&w));
871  //tmpspace=(coeff*)MAC_REV_MALLOC<coeff>((maxind/8+1)*8*sizeof(coeff));
872  //ret.sizenf=(maxind/8+1);
873  //ret.nfind=(unsigned char*)MAC_REV_MALLOC<unsigned char>(ret.sizenf);
874  //memset(ret.nfind,0,ret.sizenf);
875 
876 
877 
878  //for(int j=0;j<ret.sizenf*8;j++)
879  // tmpspace[j]=0;
880 #ifdef DEB
881  q=0;
882  for(int j=0;j<p;j++)
883  q+=nbbits[pol.nfind[j]];
884  cout<<" a '"<<q<<endl;
885 #endif
886  int j;
887 //#pragma omp parallel for shared(stockindicetab,w,serv)
888  for(j=0;j<p;j++)
889  if(stockindicetab[j]>=0)
890  {
891 
892 #ifdef DEB
893  mon tmpmm;
894  int2mon(stockindicetab[j],tmpmm);
895  cout<<"le monome la "<<tmpmm<<" "<<pol.nf[j]<<endl;
896 #endif
897  w.tabcoeff[stockindicetab[j]]+=pol.nf[j];
898  if(!Iszero(w.tabcoeff[stockindicetab[j]]))
899  w.tabnf[stockindicetab[j]/8]|=1<<(stockindicetab[j]%8);
900  }
901  else
902  {
903  // cout<<"ici aussi"<<endl;
904  typpol tmp;
905  tmp=serv.nf(i,-1*(stockindicetab[j]+1),dump,b);
906  if (tmp.size!=-1)
907  {
908  int compteurtmp=0;
909  //On fait un plus dense dans tmpspace
910  for(;tmp.sizenf>=w.sizenf;increase_space(&w));
911 // if(tmp.sizenf>res.sizenf)
912 // {
913 // ret.nfind=(unsigned char*)realloc(ret.nfind,tmp.sizenf);
914 // for(int k=ret.sizenf;k<tmp.sizenf;k++)
915 // ret.nfind[k]=0;
916 // tmpspace=(coeff*)MAC_REV_REALLOC<coeff>(tmpspace,
917 // ret.sizenf*8*sizeof(coeff),
918 // tmp.sizenf*8*sizeof(coeff));
919 // for(int k=ret.sizenf*8;k<tmp.sizenf*8;k++)
920 // tmpspace[k]=0;
921 // ret.sizenf=tmp.sizenf;
922 
923 // //normalement on ne devrait JAMAIS passer par la
924 // }
925 #if 1
926  int k,l;
927  unsigned *tmpptr=(unsigned*)tmp.nfind;
928  unsigned mask=1;
929  for(k=0;k<tmp.sizenf/sizeof(unsigned);k++)
930  if(tmpptr[k])
931  {
932  ((unsigned*)w.tabnf)[k]|=tmpptr[k];
933  mask=1;
934  for(l=0;l<8*sizeof(unsigned);l++,mask<<=1)
935  {
936  if(tmpptr[k]&mask)
937  w.tabcoeff[8*sizeof(unsigned)*k+l]
938  -=pol.nf[j]*tmp.nf[compteurtmp++];
939  // if(Iszero(w.tabcoeff[8*k*sizeof(unsigned)+l]))
940  // ((unsigned*)w.tabnf)[k]&=~mask;
941  }
942  }
943  for(k=tmp.sizenf-(tmp.sizenf%sizeof(unsigned))
944  ;k<tmp.sizenf;k++)
945  if(tmp.nfind[k])
946  {
947  w.tabnf[k]|=tmp.nfind[k];
948  mask=1;
949  for(l=0;l<8;l++,mask<<=1)
950  {
951  if(tmp.nfind[k]&mask)
952  w.tabcoeff[8*k+l]-=pol.nf[j]*tmp.nf[compteurtmp++];
953  //if(Iszero(w.tabcoeff[8*k+l]))
954  // w.tabnf[k]&=~mask;
955  }
956  }
957 #endif
958 #if 0
959  for(int k=0;k<tmp.sizenf;k++)
960  {
961  if(tmp.nfind[k])
962  {
963  if(tmp.nfind[k]==255)
964  {
965  unsigned char mask=1;
966  w.tabnf[k]|=tmp.nfind[k];
967  for(int l=0;l<8;l++,mask<<=1)
968  {
969  w.tabcoeff[8*k+l]-=
970  pol.nf[j]*tmp.nf[compteurtmp++];
971  if(Iszero(w.tabcoeff[8*k+l]))
972  w.tabnf[k]&=~mask;
973  }
974  }
975  else
976  {
977  unsigned char mask=1;
978  w.tabnf[k]|=tmp.nfind[k];
979  for(int l=0;l<8;l++,mask<<=1)
980  if(tmp.nfind[k]&mask)
981  {
982  w.tabcoeff[8*k+l]-=
983  pol.nf[j]*tmp.nf[compteurtmp++];
984  if(Iszero(w.tabcoeff[8*k+l]))
985  w.tabnf[k]&=~mask;
986  }
987  }
988  }
989 
990  }
991 #endif
992  }
993  else
994  {
995  mon tmpmon;
996  (*exce)[noquo]=mon(i,1);
997  int2mon(-1*(stockindicetab[j]+1),tmpmon);
998  (*exce)[noquo]*=tmpmon;//int2mon<mon>(j);
999  (*exce)[noquo]*=pol.nf[j];
1000  ++noquo;
1001  };
1002  }
1003  ret.ind=pol.ind;
1004  ret.ind*=mon(i,1);
1005  (*exce)[noquo++]=ret.ind;
1006  exsize=noquo;
1007  (*exce)=(mon*)MAC_REV_REALLOC<mon>((*exce),(pol.size+1)*sizeof(mon)
1008  ,(noquo)*sizeof(mon));
1009 #ifdef DEB
1010  for(int j=0;j<exsize;j++)
1011  cout<<" "<<(*exce)[j];
1012  cout<<endl;
1013 #endif
1014  ret.ind.SetCoeff(noquo+1);
1015  ret.size=0;
1016  p=0;
1017  for(int j=0;j<w.sizenf;j++)
1018  if(w.tabnf[j])
1019  {
1020  ret.size+=nbbits[w.tabnf[j]];
1021  p=j;
1022  }
1023 #ifdef DEB
1024  cout<<" val p "<<p<<" et pol.size "<<pol.size<<endl;
1025 #endif
1026  ret.nf=(coeff*)MAC_REV_MALLOC<coeff>(ret.size*sizeof(coeff));
1027  ret.sizenf=p+1;
1028  ret.nfind=(unsigned char *)malloc(ret.sizenf);
1029  p=0;
1030  for(int j=0;j<ret.sizenf;j++)
1031  {
1032  ret.nfind[j]=w.tabnf[j];
1033  if(w.tabnf[j])
1034  for(int k=0;k<8;k++)
1035  if((w.tabnf[j]>>k)&1)
1036  {
1037  if(!Iszero(w.tabcoeff[8*j+k]))
1038  {
1039  ret.nf[p++]=w.tabcoeff[8*j+k];
1040  w.tabcoeff[8*j+k]=zero;
1041  }
1042  else
1043  {
1044  ret.nfind[j]&=~(1<<k);
1045  }
1046  }
1047  w.tabnf[j]=0;
1048  }
1049  ret.nf=(coeff*)MAC_REV_REALLOC<coeff>(ret.nf,ret.size*sizeof(coeff),
1050  p*sizeof(coeff));
1051  ret.size=p;
1052  //MAC_REV_FREE<coeff>(tmpspace,ret.sizenf*8*sizeof(coeff));
1053  free(stockindicetab);
1054 #ifdef DEB
1055  cout<<"ret.size "<<ret.size<<endl;
1056  cout<<invconv<Poly>(ret)<<endl;
1057  cout<<"-----------------------------------"<<endl;
1058  int cpt=0;
1059  for(int i=0;i<ret.sizenf;i++)
1060  if(ret.nfind[i])
1061  for(int j=0;j<8;j++)
1062  if ((ret.nfind[i]>>j)&1)
1063  if (Iszero(ret.nf[cpt++]))
1064  cout<<"nimpici"<<endl;
1065 #endif
1066  return ret;
1067 }
1068 
1069 // renvoit mon/x_i .... mais suppose qu'on ne fait pas n'importe quoi
1070  template <typename Mon,typename Base>
1071 Mon my_divmon(const Mon &mon,int i,const Base& b)
1072 {
1073  Mon res(1);
1074  for(int j=0;j<b.nbvar();j++)
1075  if(i==j)
1076  {
1077  res*=Mon(j,mon.GetDegree(j)-1);
1078  }
1079  else
1080  {
1081  res*=Mon(j,mon.GetDegree(j));
1082  }
1083  return res;
1084 }
1085 
1086 template<typename typmon,typename Base>
1087 int GoodDir(const typmon &m,int i, const Base & b)
1088 {
1089  int j,res=0;
1090  mon tmpm=m*mon(i,1);
1091  //cout<<"dans GoodDir les monomes "<<m<<"********"<<typmon(i,1)<<endl;
1092  //cout<<"b.nbvar() "<<b.nbvar()<<endl;
1093  //#pragma omp parallel for shared(tmpm,res)
1094  for(j=0;j<b.nbvar();j++)
1095  {
1096  if(tmpm.GetDegree(j)>=1)
1097  if(IsinB(my_divmon(tmpm,j,b),b)) {res|=1;};
1098  }
1099  //cout<<" le verdict de GoodDir "<<res<<endl;
1100  return res;
1101 }
1102 
1103 //fonction adhoc qui merge une liste de polyalp avec une liste de pol
1104 //en cours de calcul cad liste de pol + liste excedentaire
1105 template<typename typPk,typename typP,typename typexceed,
1106  typename typsize ,typename Base,typename monomial_server>
1107 void conv_merge(typPk &Pk,typP &P,typexceed &ex,typsize &sizeex,
1108  const Base &b, monomial_server &serv)
1109 {
1110  typedef typename typP::value_type polalp;
1111  typedef typename polalp::order_t ord;
1112  typedef typename polalp::monom_t mon;
1113  typedef typename typPk::value_type pol;
1114  typedef typename pol::coeff_t coeff;
1115  coeff * tabcoeff=NULL;
1116  unsigned char *tabindices=NULL;
1117  int tabsize=0,tabnfsize=0;
1118 
1119  for(typename typP::iterator iter=P.begin();iter!=P.end();iter++)
1120  {
1121  //cout<<"dans for"<<endl;
1122  int comp=0;int i=0;
1123  pol tmp;
1124  int maxind=0;
1125  tmp.ind=mon(1);
1126  for(typename polalp::iterator iterpol=iter->begin();
1127  iterpol!=iter->end();iterpol++)
1128  {
1129 // cout<<"iterpol"<<*iterpol<<endl;
1130 // cout<<"IsinB(*iterpol,b)"<<IsinB(*iterpol,b)<<endl;
1131 // cout<<"serv.mon2int(*iterpol)"<<serv.mon2int(*iterpol)<<endl;
1132  if (IsinB(*iterpol,b) && (serv.mon2int(*iterpol)>maxind))
1133  maxind=serv.mon2int(*iterpol);
1134  }
1135 // cout<<"maxind"<<maxind<<endl;
1136  tabcoeff=(coeff*)MAC_REV_MALLOC<coeff>((maxind+1)*sizeof(coeff));
1137  tabindices=(unsigned char*)malloc(maxind/8+1);
1138 
1139  tabsize=maxind+1;
1140  tabnfsize=maxind/8+1;
1141  memset((void*)tabindices,0,tabnfsize);
1142  maxind=0;
1143  //ici il faudrait un type template
1144  for(i=0;i<tabsize;i++)
1145  {
1146  tabcoeff[i]=0;
1147  }
1148  //memset((void*)tabcoeff,0,tabsize*sizeof(coeff));
1149  //ici aussi
1150  i=0;
1151  mon * tmpex=NULL;
1152  tmpex=(mon*)MAC_REV_REALLOC<mon>((void*)tmpex,0,iter->size()
1153  *sizeof(mon));
1154 
1155  for(typename polalp::iterator iterpol=iter->begin();
1156  iterpol!=iter->end();iterpol++)
1157  {
1158 #if 1
1159  cout<<"IsinB("<<*iterpol<<","<<"b)"<<IsinB(*iterpol,b)<<endl;
1160 #endif
1161  if (IsinB(*iterpol,b))
1162  {
1163 #ifdef BONRAJOUT
1164  cout<<"dedans"<<endl;
1165 #endif
1166  int tmp=serv.mon2int(*iterpol);
1167  tabcoeff[tmp]=iterpol->GetCoeff();
1168  tabindices[tmp/8]|=1<<(tmp%8);
1169  i++;
1170  maxind++;
1171  }
1172  else
1173  {
1174 #if 1
1175  cout<<"y en a un qu'est pas dans B "<<*iterpol<<endl;
1176 #endif
1177  if(!Iszero(iterpol->GetCoeff()))
1178  tmpex[comp++]=*iterpol;
1179  }
1180  }
1181  tmpex=(mon*)MAC_REV_REALLOC<mon>((void*)tmpex,iter->size()*sizeof(mon)
1182  ,(comp+1)*sizeof(mon));
1183  tmp.size=maxind;
1184  tmp.nf=(coeff*)MAC_REV_MALLOC<coeff>(tmp.size*sizeof(coeff));
1185  tmp.nfind=tabindices;
1186  tmp.sizenf=tabnfsize;
1187  tmp.ind=mon(comp+1);
1188  maxind=0;
1189  for(int i=0;i<tabnfsize;i++)
1190  if(tabindices[i])
1191  {
1192  for(int j=0;j<8;j++)
1193  if (((tabindices[i]>>j)&1) && !Iszero(tabcoeff[8*i+j]))
1194  tmp.nf[maxind++]=tabcoeff[8*i+j];
1195  else
1196  tmp.nfind[i]&=~(1<<j);
1197  }
1198  tmp.nf=(coeff*)MAC_REV_REALLOC<coeff>(tmp.nf,tmp.size*sizeof(coeff)
1199  ,maxind*sizeof(coeff));
1200  tmp.size=maxind;
1201  MAC_REV_FREE<coeff>(tabcoeff,tabsize*sizeof(coeff));
1202  cout<<"tmp"<<tmp.nf<<endl;
1203  cout<<"tmpex"<<*tmpex<<endl;
1204  cout<<"comp"<<comp<<endl;
1205  Pk.push_back(tmp);
1206  ex.push_back(tmpex);
1207  sizeex.push_back(comp);
1208 #ifdef BONRAJOUT
1209  cout<<"ici dans conv merge"<<endl;
1210  for(int i=0;i<comp;i++)
1211  cout<<tmpex[i]<<" ";
1212  cout<<endl;
1213 #endif
1214  }
1215 }
1216 //member ne test que les exposants pas les coefficients
1217 template<typename typMk>
1218 int member(const typMk & tmpMk,const typename typMk::value_type mon)
1219 {
1220  int res=0;
1221  for(typename typMk::const_iterator iter=tmpMk.begin();
1222  iter!=tmpMk.end();iter++)
1223  if(iter->rep==mon.rep) {res=1;break;}
1224  return res;
1225 }
1226 
1227 template<typename typMat,typename typPk,typename typP,
1228  typename typMk,typename Base,typename typdump,typename typrecall,
1229  typename workspace, typename monomial_server>
1230 int newPkMkMatrixof(typMat &mat,typPk &Pk, typP &P,typMk &Mk,
1231  int &k,Base &b, typdump &dump,typrecall &recall
1232  ,workspace &w, monomial_server &serv)
1233 {
1234  typedef typename typMk::value_type mon;
1235  typedef typename typP::value_type::order_t ord;
1236  typedef typename typPk::value_type pol;
1237  typedef typename pol::coeff_t coeff;
1238  typedef typename typP::value_type polyalp;
1239  typPk tmpPk,workvect;
1240  typMk tmpMk;
1241  list<mon *> exceed;
1242  list<int> sizeexceed;
1243  int nbproj=0,flagdoplus=1,*ncol;
1244  //prise en compte des pol pas encore introduits
1245  cerr<<"k on entering newpkmkmatrixof "<<k<<endl;
1246  typP ttmpP=Crochet(P,k+1);//
1247  typrecall verytmp=Crochet(recall,k+1,serv);
1248  recall.erase(recall.begin(),recall.end());
1249  if (!ttmpP.empty())
1250  {
1251  int tmpdeg;
1252  proj(ttmpP,dump,b,serv);
1253  selectnozero(ttmpP);
1254 #if 1
1255  cout<<"---------"<<endl;
1256  for(typename typP::iterator iter=ttmpP.begin();iter!=ttmpP.end();iter++)
1257  cout<<*iter<<endl;
1258 #endif
1259 #ifdef NO_TWICE_FALL
1260  for(typename typP::iterator iter=P.begin();iter!=P.end();iter++)
1261  if(Degree(*iter)==k+1) P.erase(iter--);
1262  for(typename typP::iterator iter=ttmpP.begin()
1263  ;iter!=ttmpP.end();iter++)
1264  P.push_back(*iter);
1265 #endif
1266  // cout<<"pol mal red "<<*iter<<endl;
1267  //cout<<"passage par ici"<<endl;
1268  nbproj=ttmpP.size();
1269  if (!ttmpP.empty())
1270  {
1271  // cout<<"apres select non zero "<<ttmpP.size()<<endl;
1272  tmpdeg=minmaxdegP(ttmpP,tmpdeg);
1273  // cout<<"apres minmax deg "<<tmpdeg<<" "<<k<<endl;
1274  if(tmpdeg<k+1)
1275  {
1276  flagdoplus=0;
1277  cout<<"un des pol de pretendu degre le bon se reduit mal"<<endl;
1278 
1279  //en fait a un polynome de degre inferieur
1280  typPk tmpconv;
1281  //cout<<"recover"<<endl;
1282  recover(tmpPk,Mk,dump,tmpdeg);
1283  //Listedejafait(Mk,Spoldejavu);
1284  for (typename typP::iterator iter=ttmpP.begin();iter!=ttmpP.end();iter++)
1285  cout<<"pol ICI "<<*iter<<endl;
1286  // cout<<"pol ICI "<<invconv<Poly>(*iter,serv)<<endl;
1287 // cout<<"forget "<<tmpdeg<<endl;
1288  recall=verytmp;
1289  forget(b,dump,tmpdeg,recall);
1290  serv.compress(tmpPk,dump,b,tmpdeg);
1291  verytmp.erase(verytmp.begin(),verytmp.end());
1292 
1293 
1294 
1295  //forget(b,dump,tmpdeg);
1296 
1297  ttmpP=Crochet(ttmpP,tmpdeg);
1298 #ifdef NO_TWICE
1299  for(typename typP::iterator iter=P.begin()
1300  ;iter!=P.end();iter++)
1301  if(Degree(*iter)==tmpdeg)
1302  P.erase(iter--);
1303 #endif
1304  nbproj=ttmpP.size();
1305  //for(typename typP::iterator iter=ttmpP.begin();iter!=ttmpP.end();iter++)
1306  // tmpconv.push_back(convert<pol>(*iter,b));
1307  //ttmpP.erase(ttmpP.begin(),ttmpP.end());//samedi 24 aout
1308  //nbproj=1;// samedi 24 aout
1309  //Crochetchoix(P,Pk,tmpconv,tmpdeg,b);
1310  //ttmpP.push_back(invconv<typename typP::value_type>(Pk.back()));
1311  //Pk.pop_back();//on elimine de Pk le pol de proj choisi
1312  //pour se ramner au cas ou proj != 0 et P ok
1313  Mk.erase(Mk.begin(),Mk.end());
1314  for (typename typPk::iterator iterpk=tmpPk.begin();
1315  iterpk!=tmpPk.end();iterpk++)
1316  {
1317  // cout<<"iterpk->ind "<<iterpk->ind
1318  // <<"et Isinb(iterpk-ind,b) "<<IsinB(iterpk->ind,b)<<endl;
1319  if (IsinB(iterpk->ind,b))
1320  {
1321  for(typename Base::iterator iterb=b.begin()
1322  ;iterb!=b.end();iterb++)
1323  {
1324  iterb->refuse=(mon*)MAC_REV_REALLOC<mon>
1325  (iterb->refuse,(iterb->taille2)*sizeof(mon),
1326  (iterb->taille2+1)*sizeof(mon));
1327  iterb->refuse[iterb->taille2]=iterpk->ind;
1328  iterb->refuse[iterb->taille2].SetCoeff(1);
1329  iterb->taille2++;
1330  }
1331  }
1332  }
1333  for(typename typPk::iterator iter=tmpPk.begin()
1334  ;iter!=tmpPk.end();iter++)
1335  {
1336  mon *tmp=(mon*)MAC_REV_MALLOC<mon>(sizeof(mon));
1337  *tmp=iter->ind;
1338  tmpMk.push_back(*tmp);
1339  exceed.push_back(tmp);
1340  sizeexceed.push_back(1);
1341  // cout<<"pour Mk iter->ind "<<iter->ind<<endl;
1342  }
1343  //on vient de chuter de
1344  //degre et on a reconstitue les bons mk et pk
1345  k=tmpdeg-1;
1346  //Dump(Pk,dump);
1347  }
1348  }
1349  }
1350  if(flagdoplus)
1351  {
1352 #ifdef unimul
1353  serv.reinit_multiple();
1354 #endif
1355 #ifdef uninf
1356  serv.reinit_nf();
1357 #endif
1358 
1359  //list<mon> dejavu;
1360  //construction des pol ord sup
1361 //
1362 // Problewme de gestion des accumulateurs ici
1363 int i;
1364 //#pragma omp parallel for shared(tmpPk,tmpMk,exceed,sizeexceed) private(i)
1365 for(i=0;i<b.nbvar();i++)
1366  {
1367 
1368  for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
1369  {
1370  //cout<<"avant gooddir l'ind "<<iter->ind<<" et i "<<i<<endl;
1371  if(GoodDir((*iter).ind,i,b))
1372  {
1373  mon tmpmon=iter->ind*mon(i,1);
1374  tmpmon.SetCoeff(1);
1375  //cout<<"tmpmon ici "<<tmpmon<<endl;
1376  if(!member(tmpMk,tmpmon))
1377  {
1378  //
1379  //ici aussi rendre les op atomic ne suffit pas
1380  //il faut aussi faire l'ajout.
1381  //#pragma omp atomic
1382  typename typrecall::iterator iterrec;
1383 
1384  mon * tmp=NULL;
1385  int tmpsize;
1386  //cout<<"avant mult"<<endl;
1387  pol stockmult=mult(i,*iter,dump,b,&tmp,tmpsize,w
1388  ,serv);
1389 
1390 
1391 
1392  //attention le coefficient de ind est la taille de
1393  // l'exceed correspondant
1394 #ifdef DEB
1395  cout<<"apres mult "<<tmpsize<<endl;
1396 #endif
1397 //#pragma omp critical
1398  {
1399  tmpMk.push_back(tmpmon);
1400  tmpPk.push_back(stockmult);
1401  exceed.push_back(tmp);
1402  sizeexceed.push_back(tmpsize);
1403  }
1404  }
1405  }
1406  }
1407  }
1408  // recall=verytmp;
1409  }
1410  // cout<<"tmpPK.size "<<tmpPk.size()<<endl;
1411  //Constructyion de pol terminee
1412  //cout<<"ttmpP.size "<<ttmpP.size()<<endl;
1413  //cout<<"avant conv merge"<<endl;
1414  conv_merge(tmpPk,ttmpP,exceed,sizeexceed,b,serv);
1415  //cout<<"apres conv merge"<<endl;
1416  //cout<<"tmpMK==empty?? "<<tmpMk.empty()<<endl;
1417 #ifdef DEB
1418  for(typename typPk::iterator iter=tmpPk.begin();iter!=tmpPk.end();iter++)
1419  cout<<"invocn"<<invconv<Poly>(*iter,serv)<<endl;
1420 #endif
1421  // {
1422  // cout<<"iter->ind.GetCoeff() "<<iter->ind.GetCoeff()-1
1423  // <<" et ind "<<iter->ind<<endl;
1424  // }
1425  //cout<<"tmpPK.size "<<tmpPk.size()<<endl;
1426 
1427  //Tue Nov 27 15:57:25 MET 2001
1428  /*
1429  for(typename typPk::iterator iter=tmpPk.begin();iter!=tmpPk.end();iter++)
1430 
1431  {
1432  mon tmp=iter->ind;
1433  tmp.SetCoeff(1);
1434  if((iter->ind.GetDegree()!=0)&&(!member(tmpMk,tmp)))
1435  {
1436  //cout<<"iter->ind.GetCoeff()"<<iter->ind.GetCoeff()-(coeff)1<<" "
1437  // <<tmp<<endl;
1438  tmpMk.push_back(tmp);
1439  //tmpMk.back().SetCoeff(1);
1440  }
1441  }
1442  */
1443  //construction de la matrice maintenant
1444  //positionnement des pointeurs de matrices pour gagner en tps
1445  {
1446  int nnz=0;
1447  //-----------------
1448  //for(typename typMk::iterator iter=tmpMk.begin();iter!=tmpMk.end();iter++)
1449  // cout<<"mon "<<*iter<<endl;
1450  //-----------------
1451  // cout<<"nb proj "<<nbproj<<endl;
1452  //for(list<int>::iterator iter=sizeexceed.begin();iter!=sizeexceed.end()
1453  // ;iter++)
1454  // {
1455  // nnz+=*iter;
1456  // cout<<"on a donc de monme pour celui la "<<
1457  // (int)((iter->ind).GetCoeff()-1)<<" d'ou nnz "<<nnz<<endl;
1458  // }
1459  //for(typename typPk::iterator iter=tmpPk.begin();iter!=tmpPk.end();iter++)
1460  // {
1461  // int tmp=0;
1462  // for(;(iter->ind).GetCoeff()>(coeff)tmp;tmp++);
1463  // nnz+=tmp-1;
1464  // cout<<"on a donc de monme pour celui la "<<
1465  // (int)((iter->ind).GetCoeff()-1)<<" d'ou nnz "<<nnz<<endl;
1466  // }
1467  // nnz+=tmpPk.size()-nbproj;//le 10/05/2001 avant: nnz+=tmpMk.size()-nbproj;
1468  //le -nbproj rajoute le 23/01/2001!!
1469  // #define DEBUG
1470 #ifdef DEBUG
1471  typename typPk::iterator tmpiter=tmpPk.begin();
1472  list<int>::iterator itersize=sizeexceed.begin();
1473  for(typename list<mon*>::iterator iter=exceed.begin();iter!=exceed.end()
1474  ;tmpiter++,iter++,itersize++)
1475  {
1476  cout<<"pour un exceeed la taille attendue est "
1477  <<*itersize<<endl;
1478  for(int i=0;*itersize>i;i++)//;tmpiter->ind.GetCoeff()>i+1;i++)
1479  {
1480  cout<<"le gus que je regarde "<<(*iter)[i]<<endl;
1481  if(!member(tmpMk,(*iter)[i]))
1482  {
1483  cout<<(*iter)[i]<<endl;
1484  cout<<"dans ce pol "<<invconv<Poly>(*tmpiter)<<endl;
1485  cout<<"l'ind "<<tmpiter->ind<<endl;
1486  exit(-10);
1487  }
1488  }
1489  }
1490 #endif
1491  // #undef DEBUG
1492  mat.nrow=tmpPk.size();
1493  mat.ncol=tmpMk.size();
1494  ncol=(int*)calloc(mat.ncol,sizeof(int));
1495  //memset((void*)ncol,0,(*mat)->ncol*sizeof(int));
1496  map<mon,int,ord> mapint;
1497  typename typMk::iterator itermk=tmpMk.begin();
1498  typename typPk::iterator iterpk=tmpPk.begin();
1499  typename list<mon*>::iterator iterex=exceed.begin();
1500  list<int>::iterator itersize=sizeexceed.begin();
1501  int line_num=0;
1502  for(int i=0;itermk!=tmpMk.end();i++,itermk++)
1503  {
1504  mapint[*itermk]=i;
1505  cout<<"mapint "<<*itermk<<" "<<i<<endl;
1506  }
1507  iterpk=tmpPk.begin();
1508  nnz=0;
1509  for(;iterpk!=tmpPk.end();iterpk++,iterex++,itersize++,line_num++)
1510  {
1511  nnz+=*itersize;
1512 #ifdef DEB
1513  cout<<"itesize "<<*itersize<<endl;
1514 #endif
1515  // if(iterpk->ind.GetDegree()>0)
1516  // {
1517  // mon tmpmon=iterpk->ind;
1518  // tmpmon.SetCoeff(1);
1519  // ncol[mapint[tmpmon]]++;
1520  // cout<<"on est a la ligne "<<line_num<<" ai augmente "<<mapint[(iterpk->ind*(1/iterpk->ind.GetCoeff()))]<<" a cause de son monome dom "<<endl;
1521  // cout<<"le voila "<<(iterpk->ind*(1/iterpk->ind.GetCoeff()))<<endl;
1522  //}
1523 
1524  {
1525  // coeff tmpcoeff=(iterpk->ind).GetCoeff()-(coeff)1;
1526  for(int i=0;*itersize>i;i++)
1527  {
1528  //cout<<"iterpk icici ->GetCoeff()"<<iterpk->ind.GetCoeff()<<endl;
1529  if (mapint.count((*iterex)[i]))
1530  {
1531 #ifdef DEB
1532  cout<<"iterex ici "<<(*iterex)[i]<<endl;
1533 #endif
1534  ++ncol[mapint[(*iterex)[i]]];
1535  // cout<<" ai augmente "<<mapint[(*iterex)[i]]<<"a cause de iterex "<<endl;
1536  }
1537 #ifdef FAST
1538  else
1539  {
1540  int j,tmpsize;
1541  cout<<"OUILLE OUILLE OUILLE "<<(*iterex)[i]<<endl;
1542  mat.ncol++;
1543  mat.nrow++;
1544  mapint[(*iterex)[i]]=mat.ncol-1;
1545  ncol=(int*)realloc(ncol,mat.ncol*sizeof(int));
1546  ncol[mapint[(*iterex)[i]]]=1;
1547  //reste a calculer un proj de ce monome et le tour sera joue
1548  Poly tmppolyalp;
1549  mon tmpmon=(*iterex)[i];
1550  pol tmppol;
1551  mon *tmp;
1552  tmpMk.push_back(tmpmon);
1553  for(j=0;j<b.nbvar()&&(!tmpmon.GetDegree(j))
1554  &&IsinB(my_divmon(tmpmon,j,b),b);j++);
1555  tmppolyalp=Poly(my_divmon(tmpmon,j,b));
1556  //proj(tmppolyalp,dump,b);
1557  tmppol=convert<pol>(tmppolyalp,b);
1558  tmpPk.push_back(mult(j,tmppol,dump,b,&tmp,tmpsize,w));
1559  exceed.push_back(tmp);
1560  sizeexceed.push_back(tmpsize);
1561  mat.nnz+=tmpsize;
1562  }
1563 #endif
1564  }
1565  }
1566  }
1567  //rajoute le 23/01/2001
1568  //enleve le 17.05/2001
1569  // for(int i=mat.nrow-nbproj;i<mat.nrow;i++)
1570  // ncol[i]--;
1571  //fin rajout c pour prendre en compte que lors de
1572  //de la proj le monome de tete se trouve dans exceed
1573  //fin enlevement
1574  cout<<"nnz of matrix "<<nnz<<endl;
1575  //en general la matrice est rectangulaire
1576  void * toto=MAC_REV_MALLOC<coeff>(nnz*sizeof(typename typMat::coeff_t));
1577  //+nnz*sizeof(int)+((*mat)->ncol+1)*sizeof(int));
1578  if (mat.nzval!=NULL) MAC_REV_FREE<typename typMat::coeff_t>
1579  (mat.nzval,mat.nnz
1580  *sizeof(typename typMat::coeff_t));
1581  mat.nnz=nnz;
1582  mat.nzval=toto;
1583 
1584 
1585  //for(int i=0;i<nnz;i++)
1586  // ((typename typMat::coeff_t*)mat.nzval)[i]=(coeff)1000000000000.0;
1587 
1588 
1589  // mstore->rowind=(int*)((double*)toto+nnz);
1590  if(mat.rowind!=NULL) free(mat.rowind);
1591  mat.rowind=(int*)malloc(nnz*sizeof(int));
1592  //mstore->colptr=(int*)(mstore->rowind+nnz);//
1593  if(mat.colptr!=NULL) free(mat.colptr);
1594  mat.colptr=(int*)malloc((mat.ncol+1)*sizeof(int));
1595  cout<<"matrix of size "<<mat.nrow<<"x"<<mat.ncol<<endl;
1596  //matrice cree rest plus qu'a ecrire dedans ca
1597  typename typMat::coeff_t* nzval=(typename typMat::coeff_t*)mat.nzval;
1598  int *rowind=mat.rowind;
1599  int *colptr=mat.colptr;
1600  //mise en place des colptr
1601  *colptr=0;
1602  for(int i=0;i<mat.ncol-1;i++)
1603  {
1604  colptr[i+1]=colptr[i]+ncol[i];
1605  //cout<<"nb element colonne "<<i<<" "<<ncol[i]<<endl;
1606  //cout<<"les valeurs de debut de colonne "<<8*colptr[i+1]<<endl;
1607  }
1608  colptr[mat.ncol]=mat.nnz;
1609 
1610  //cout<<"mat.nnz "<<mat.nnz<<" "<<mat.nnz*8<<endl;
1611  //fin mise en place
1612  //la on fait des manip symboliques pour savoir ou ecrire
1613  //les coeffs de chaques colonnes ca evite d'avoir a les
1614  //recopier 50000 fois pour construire la matrice
1615  //c bcp plus rapide
1616  itermk=tmpMk.begin();
1617  iterpk=tmpPk.begin();
1618  iterex=exceed.begin();
1619  itersize=sizeexceed.begin();
1620  line_num=0;
1621  //cout<<"nbproj "<<nbproj<<endl;
1622  for(;0&&(line_num < (int)(tmpPk.size()-nbproj));
1623  iterpk++,iterex++,itersize++,line_num++)
1624  //les polynomes projetes sont foutut au bout de la liste!!
1625  //d'ou le tmpPk.size()-nbproj
1626  {
1627  mon tmpmon=iterpk->ind;
1628  tmpmon.SetCoeff(1);
1629  //const unsigned int tmpplus=line_num+1,tmp=line_num;
1630  const unsigned int tmpplus
1631  =mapint[tmpmon]+1,tmp=tmpplus-1;
1632  // cout<<"ici line_num"<<line_num<<" le mon dom est col "<<tmp<<endl;
1633  //ici couille car le ind n'est pas forcement le mon diag
1634  nzval[colptr[tmpplus]-ncol[tmp]]=1;
1635  //fin couille changer un truc
1636  // cout<<"mat.nnz "<<mat.nnz<<endl;
1637  //cout<<"colptr[...]"<<colptr[tmpplus]<<endl;
1638  //cout<<"ncol[....]"<<ncol[tmp]<<endl;
1639  //cout<<"1 a la pos "<<colptr[tmpplus]-ncol[tmp]<<endl;
1640  rowind[colptr[tmpplus]-ncol[tmp]]=line_num;
1641  //cout<<"1 a la ligne "<<rowind[colptr[tmpplus]-ncol[tmp]]<<endl;
1642  ncol[tmp]--;
1643  {
1644  //coeff tmpcoeff=iterpk->ind.GetCoeff()-(coeff)1;
1645  for(int i=0;*itersize>i;i++)
1646  {
1647  const coeff stock=(*iterex)[i].GetCoeff();
1648  (*iterex)[i].SetCoeff(1);
1649  const unsigned int tmpplusex=mapint[(*iterex)[i]]+1;
1650  const unsigned int tmpex=mapint[(*iterex)[i]];
1651  nzval[colptr[tmpplusex]-ncol[tmpex]]
1652  =stock;
1653  rowind[colptr[tmpplusex]-ncol[tmpex]]=line_num;
1654  ncol[tmpex]--;
1655  cout<<(*iterex)[i]<<" valeur de ncol["<<tmpex<<"] "<<ncol[tmpex]<<endl;
1656  }
1657  }
1658  MAC_REV_FREE<mon>(*iterex,*itersize*sizeof(mon));
1659  }
1660  for(;(iterpk!=tmpPk.end());iterpk++,iterex++,itersize++,line_num++)
1661  {
1662  //La c le traitement des projetes
1663  //const unsigned int tmpplus=line_num+1,tmp=line_num;
1664  {
1665  cout<<"=================================================="<<endl;
1666  //coeff tmpcoeff=iterpk->ind.GetCoeff()-(coeff)1;
1667  for(int i=0;*itersize>i;i++)
1668  {
1669  cout<<" le monome "<<(*iterex)[i]<<endl;
1670  const coeff stock=(*iterex)[i].GetCoeff();
1671  (*iterex)[i].SetCoeff(1);
1672  const unsigned int tmpplusex=mapint[(*iterex)[i]]+1;
1673  const unsigned int tmpex=mapint[(*iterex)[i]];
1674  nzval[colptr[tmpplusex]-ncol[tmpex]]
1675  =stock;
1676  rowind[colptr[tmpplusex]-ncol[tmpex]]=line_num;
1677  ncol[tmpex]--;
1678  cout<<"tmpex "<<tmpex<<endl;
1679  cout<<"tmpplusex "<<tmpplusex<<endl;
1680  cout<<"colptr[tmpplusex] "<<colptr[tmpplusex]<<endl;
1681  cout<<"ncol[tmpex] "<<ncol[tmpex]<<endl;
1682  cout<<"linenum "<<line_num<<endl;
1683  cout<<"nzval "<<stock<<endl;
1684  cout<<"rowind "<<line_num<<endl;
1685  cout<<"colptr[tmpplusex]-ncol[tmpex] "<<colptr[tmpplusex]-ncol[tmpex]+1<<endl;
1686  }
1687  }
1688  MAC_REV_FREE<mon>(*iterex,*itersize*sizeof(mon));
1689  //free(*iterex);
1690  }
1691  free(ncol);
1693  for(typename typPk::iterator iterpk=tmpPk.begin()
1694  ;iterpk!=tmpPk.end();iterpk++)
1695  iterpk->ind.SetCoeff(1);
1696  //iterpk->ind*=1/iterpk->ind.GetCoeff();
1697  // cout<<"la matrice dans newpkmkmatrixof"<<endl;
1698  //cout<<" nombre de non zero "<<mat.nnz<<endl;
1699 #ifdef DEB
1700  affdebug(mat);
1701 #endif
1702  //cout<<"le colptr "<<endl;
1703  //for(int i=0;i<mat.ncol;i++)
1704  // cout<<mat.colptr[i]<<" "<<endl;
1705  cout<<"les indices de lignes et le nnz"<<endl;
1706  for(int i=0;i<mat.nnz;i++)
1707  cout<<mat.rowind[i]<<" "<<((typename typMat::coeff_t*)mat.nzval)[i]<<endl;
1708  cout<<"fin matrice"<<endl;
1709  Pk.swap(tmpPk);
1710  Mk.swap(tmpMk);
1711  }
1712  // for(int i=0;i<mat.nnz;i++)
1713  // cout<<"coeff mat "<<((typename typMat::coeff_t*)mat.nzval)[i]<<" et i "<<i<<endl;
1714  return flagdoplus;
1715 }
1716 //newpkmkmatrixof termine reste plus qu'a tester .... ;-(
1717 
1718 template<typename typdump,typename mon,typename pol>
1719 void findcorresppol(const mon & m,const typdump &dump,pol &res)
1720 {
1721  int i,d=m.GetDegree();
1722  typename typdump::const_iterator iter=dump.begin();
1723  for(;(iter!=dump.end())&&(iter->k!=d);iter++);
1724  {
1725  cout<<"dump"<<iter->k<<endl;
1726  cout<<"nf"<<iter->nf[i].ind.rep<<endl;
1727  cout<<"m.rep"<<m.rep<<endl;
1728  //localise la dump struct de bon degre
1729  if(iter!=dump.end())
1730  {
1731  for(i=0;(i<iter->size)&&(iter->nf[i].ind.rep!=m.rep);i++);
1732  cout<<"monomes passe en revue pour chercher "<<m<<" : "<<iter->nf[i].ind<<endl;;
1733  //trouve dans la dump struct le pol qui marche
1734  if (i<iter->size)//estce que je connais?
1735  //oui super
1736  {
1737  //cout<<"g trouve un gus qui convient"<<endl;
1738  //for(int j=0;j<iter->nf[i].size;j++)
1739  // cout<<"et ses coeff sont "<<iter->nf[i].nf[j]<<endl;
1740  //Tue Dec 4 16:12:10 MET 2001
1741  //densify(iter->nf[i],res);}
1742  //Tue Dec 4 16:12:10 MET 2001
1743  res=iter->nf[i];}
1744  else {
1745  //non ben alors il se reecrit en lui meme
1746  res.ind=mon(0);//m*(1/m.GetCoeff());
1747  res.size=-1;//pour proj avant ct -1
1748  res.nf=NULL;
1749  res.nfind=NULL;
1750  res.sizenf=0;
1751  }
1752  }
1753  }
1754  return;
1755 }
1756 template<typename iterator, typename mon,typename Base>
1757 void varmult(iterator iter1,iterator iter2,mon &var1, mon &var2,const Base &b)
1758 {
1759  for(int i=0;i<b.nbvar();i++)
1760  {
1761  if(iter1->ind.GetDegree(i)>iter2->ind.GetDegree(i))
1762  var2=mon(i,1);
1763  if(iter2->ind.GetDegree(i)>iter1->ind.GetDegree(i))
1764  var1=mon(i,1);
1765  }
1766 }
1767 
1768 template <typename mon,typename pol, typename typdump,typename Base,
1769  typename monomial_server>
1770 pol halfred(const mon &targetind, const pol & p, const typdump & dump
1771  , const Base & b, monomial_server & serv)
1772 {
1773  typedef typename pol::coeff_t coeff;
1774  static const mon monzero=mon(0);
1775  static const typename pol::coeff_t zero(0);
1776  int *place=(int*)MAC_REV_MALLOC<int>(p.size*sizeof(int)),comp=0;
1777  pol res;
1778 #ifdef uninf
1779  int varref;
1780 #else
1781  mon varref;
1782 #endif
1783  int i,maxref=0,ppp=0,nbbitsun=0;
1784  for(int j=0;j<p.size;j++)
1785  place[j]=0;
1786 // coeff *tmpspace;
1787  for(i=0;i<b.nbvar();i++)
1788  {
1789  cout<<"targetind.GetDegree(i)"<<targetind.GetDegree(i)<<endl;
1790  cout<<"p.ind.GetDegree(i)"<<p.ind.GetDegree(i)<<endl;
1791  if(targetind.GetDegree(i)>p.ind.GetDegree(i))
1792  break;
1793  }
1794 #ifdef uninf
1795  varref=i;
1796 #else
1797  varref=mon(i,1);
1798 #endif
1799 
1800  // for(i=0;i<p.size;i++)
1801  // cout<<p.nf[i]<<" ";
1802  //cout<<endl;
1803  //cout<<"ppp "<<ppp<<" p.size "<<p.size<<endl;
1804  //cout<<"p en entree"<<invconv<Poly>(p)<<endl;
1805  //cout<<"mulind(0,1,b) "<<mulind(0,1,b)<<endl;
1806  //cout<<"target "<<targetind<<" et ind "<<p.ind<<" et var "<<varref<<endl;
1807  cout<<"p.size"<<endl;
1808  for(i=0;i<p.sizenf;i++)
1809  {
1810  if(p.nfind[i])
1811  {
1812 #ifdef DEB
1813  cout<<nbbitsun<<" p.nfind[i] "<<(int)p.nfind[i]<<endl;
1814 #endif
1815  nbbitsun+=nbbits[p.nfind[i]];
1816  for(int j=0;j<8;j++)
1817  {
1818  if((p.nfind[i]>>j)&1)
1819  {
1820 #ifdef unimul
1821  cout<<"8*i+j"<<8*i+j<<endl;
1822  cout<<"varref"<<varref<<endl;
1823  cout<<"comp"<<comp<<endl;
1824  cout<<"place[comp]"<<place[comp]<<endl;
1825  place[comp]=serv.mulind(8*i+j,varref,b);
1826  cout<<"place[comp]"<<place[comp]<<endl;
1827  if(place[comp]<0)
1828  place[comp]=-1*(8*i+j+1);
1829  if (place[comp]>maxref)
1830  maxref=place[comp];
1831  cout<<"maxref"<<maxref<<endl;
1832 
1833 #else
1834  //ATTENTION UNIQUEMENT UNIMUL SINON PAS DEBUGGE
1835  int indtmpmon;
1836  mon tmpmon;
1837  int2mon(8*i+j,tmpmon);
1838  tmpmon*=varref;
1839  if(IsinB(tmpmon,b))
1840  {
1841  //int j;
1842  indtmpmon=mon2int(tmpmon);
1843  //for(j=0;j<p.size&&p.nfind[j]!=indtmpmon;j++);
1844  //if(j<p.size)
1845  maxref++;
1846  place[comp]=indtmpmon;
1847  }
1848  else
1849  {
1850  place[comp]=-1*(8*i+j);
1851  }
1852 #endif
1853  comp++;
1854  }
1855  }
1856  }
1857  }
1858  cout<<"despues del for"<<endl;
1859  coeff *tmpspace=(coeff*)MAC_REV_MALLOC<coeff>((maxref/8+1)*8*sizeof(coeff));
1860 #ifdef DEB
1861  cout<<"comp "<<comp<<" et p.size "<<p.size<<endl;
1862 #endif
1863  res.sizenf=(maxref/8+1);
1864  for(int j=0;j<8*res.sizenf;j++)
1865  tmpspace[j]=0;
1866  res.nfind=(unsigned char*)MAC_REV_MALLOC<unsigned char>(res.sizenf);
1867  memset(res.nfind,0,res.sizenf);
1868  cout<<"por aqui"<<endl;
1869  for(int j=0;j<nbbitsun;j++)
1870  if(place[j]>=0)
1871  {
1872 #ifdef DEB
1873  mon tmpmm;
1874  int2mon(place[j],tmpmm);
1875  cout<<"le monome la "<<tmpmm<<" "<<p.nf[j]<<endl;
1876 #endif
1877  tmpspace[place[j]]+=p.nf[j];
1878  res.nfind[place[j]/8]|=1<<(place[j]%8);
1879  }
1880  else
1881  {
1882  pol tmp;
1883 #ifdef unimul
1884  tmp=serv.nf(varref,-1*place[j]-1,dump,b);
1885 #else
1886  mon tmpmon;
1887  int2mon(-1*place[j],tmpmon);
1888  tmpmon*=mon(i,1);
1889  tmp=nf<typpol>(tmpmon,dump,b);
1890 #endif
1891 
1892  if (tmp.size>=0)
1893  {
1894  int compteurtmp=0;
1895  //cout<<" je reduit prr lui"<<endl<<invconv<Poly>(tmp)<<endl;
1896  //On fait un plus dense dans tmpspace
1897  if(tmp.sizenf>res.sizenf)
1898  {
1899  res.nfind=(unsigned char*)realloc(res.nfind,tmp.sizenf);
1900  for(int k=res.sizenf;k<tmp.sizenf;k++)
1901  res.nfind[k]=0;
1902  tmpspace=(coeff*)MAC_REV_REALLOC<coeff>(tmpspace,
1903  res.sizenf*8*sizeof(coeff),
1904  tmp.sizenf*8*sizeof(coeff));
1905  for(int k=res.sizenf*8;k<tmp.sizenf*8;k++)
1906  tmpspace[k]=0;
1907  res.sizenf=tmp.sizenf;
1908 
1909  }
1910  for(int k=0;k<tmp.sizenf;k++)
1911  {
1912  if(tmp.nfind[k])
1913  {
1914  for(int l=0;l<8;l++)
1915  if((tmp.nfind[k]>>l)&1)
1916  tmpspace[8*k+l]-=p.nf[j]*tmp.nf[compteurtmp++];
1917  }
1918  res.nfind[k]|=tmp.nfind[k];
1919  }
1920  }
1921  else
1922  {
1923  mon tmpmon;
1924  serv.int2mon(-1*place[j]-1,tmpmon);
1925  tmpmon*=mon(varref,1);
1926  for(int i=0;i<serv.sizeplacemon();i++)
1927  cout<<i<<" "<<serv.int2mon_[i]<<endl;
1928  cout<<"monom "<<tmpmon<<" "<<-1*place[j]
1929  <<" "<<p.nf[j]<<endl;
1930  cerr<<"Je n'aurrai pas du passer par la "<<endl;
1931  exit(10);
1932  };
1933  }
1934  cout<<"despues del segundo for"<<endl;
1935  res.ind=mon(0);
1936  comp=0;
1937  for(int j=0;j<res.sizenf;j++)
1938  if(res.nfind[j])
1939  comp+=nbbits[res.nfind[j]];
1940  res.nf=(coeff*)MAC_REV_MALLOC<coeff>(comp*sizeof(coeff));
1941  res.size=comp;
1942  comp=0;
1943  cout<<"antes del ultimo for"<<endl;
1944  for(int j=0;j<res.sizenf;j++)
1945  if(res.nfind[j])
1946  for(int k=0;k<8;k++)
1947  if((res.nfind[j]>>k)&1)
1948  if(tmpspace[8*j+k]!=0)
1949  {res.nf[comp++]=tmpspace[8*j+k];
1950 
1951  }
1952  else
1953  res.nfind[j]&=~(1<<k);
1954  cout<<"despues del ultimo for"<<endl;
1955  res.nf=(coeff*)MAC_REV_REALLOC<coeff>(res.nf,res.size*sizeof(coeff)
1956  ,comp*sizeof(coeff));
1957  cout<<"res.nf"<<endl;
1958  res.size=comp;
1959  cout<<"res.size"<<endl;
1960 // for(int j=0;j<8*res.sizenf;j++)
1961 // tmpspace[j]=0;
1962  cout<<"tmpspace.size"<<res.sizenf*8*sizeof(coeff)<<res.sizenf*8<<endl;
1963  MAC_REV_FREE<coeff>(tmpspace,res.sizenf*8*sizeof(coeff));
1964  cout<<"antes de free"<<endl;
1965  free(place);
1966  //cout<<" apres reduction "<<invconv<Poly>(res)<<endl;
1967  return res;
1968 }
1969 
1970 template <typename typPk, typename typdump,typename Base,
1971  typename workspace ,typename monomial_server>//,typename typMk>
1972 void ReduceSpol(typPk &S,const typdump & dump,typPk &redspol,const Base &b
1973  ,workspace &w, monomial_server &serv)
1974  //, typMk & Spoldejavu)
1975 {
1976  typedef typename typPk::value_type pol;
1977  typedef typename pol::monom_t mon;
1978  typedef typename pol::coeff_t coeff;
1979  list<mon> leadmon;
1980  list<typPk> membermon;
1981  cout<<"en entree de RedSpol S.size "<<S.size()/2<<endl;
1982 
1983  for(typename typPk::iterator iterS=S.begin();iterS!=S.end();iterS++,iterS++)
1984  {
1985  typename typPk::iterator iterS2=iterS;
1986  typename list<mon>::iterator itermon=leadmon.begin();
1987  typename list<typPk>::iterator itermemb=membermon.begin();
1988  mon var1,var2,tmpleadmon;
1989  iterS2++;
1990  varmult(iterS,iterS2,var1,var2,b);
1991  tmpleadmon=iterS->ind*var1;
1992  cout<<"tmpleadmon"<<tmpleadmon<<endl;
1993  // Spoldejavu.push_back(tmpleadmon);
1994  for(;itermon!=leadmon.end()&&itermon->rep!=tmpleadmon.rep;
1995  itermon++,itermemb++);
1996  if(itermon!=leadmon.end())
1997  {
1998  int yes1=1,yes2=1;
1999  for(typename typPk::iterator tmpiter=itermemb->begin();
2000  tmpiter!=itermemb->end();tmpiter++)
2001  {
2002  if(tmpiter->ind.rep==iterS->ind.rep) yes1=0;
2003  if(tmpiter->ind.rep==iterS2->ind.rep) yes2=0;
2004  }
2005  if(yes1) itermemb->push_back(*iterS);
2006  if(yes2) itermemb->push_back(*iterS2);
2007  }
2008  else
2009  {
2010  cout<<"iterS"<<iterS->ind<<endl;
2011  cout<<"iterS2"<<iterS2->ind<<endl;
2012  typPk verytmp;
2013  leadmon.push_back(tmpleadmon);
2014  //cout<<"le tmpleadmon "<<tmpleadmon<<endl;
2015  membermon.push_back(verytmp);
2016  membermon.back().push_back(*iterS);
2017  membermon.back().push_back(*iterS2);
2018  }
2019  }
2020  cout<<"sale del primer for"<<endl;
2021  //maintenant on a mis en place la structure de Redspol
2022  //reste plus qu'a calculer les bons et a reduire tout ca!!
2023  {
2024  typename list<mon>::iterator itermon=leadmon.begin();
2025  typename list<typPk>::iterator itermemb=membermon.begin();
2026  cout<<"antes del otro for"<<endl;
2027  for(;itermon!=leadmon.end();itermon++,itermemb++)
2028  {
2029  typename typPk::value_type ref;
2030  typename typPk::iterator tmpiter=itermemb->begin();
2031  cout<<"antes halfred"<<endl;
2032 // cout<<"itermon"<<*itermon<<endl;
2033  cout<<"tmpiter"<<tmpiter->ind<<endl;
2034  ref=halfred(*itermon,*tmpiter,dump,b,serv);
2035  cout<<"ref.size "<<ref.size<<" "<<ref.ind<<endl;
2036  //cout<<"ref en entier"<<endl<<invconv<Poly>(ref)<<endl;
2037  tmpiter++;
2038  for(;tmpiter!=itermemb->end();tmpiter++)
2039  {
2040  typename typPk::value_type redcur;
2041  redcur=halfred(*itermon,*tmpiter,dump,b,serv);
2042  my_plus(redcur,ref,(coeff)1,&w);
2043  if(!Ispolzero(redcur))
2044  {
2045  redspol.push_back(redcur);
2046  //cout<<"redcur "<<endl<<invconv<Poly>(redcur)<<endl;
2047  //cout<<"le leadmon qui donne un non zero "<<*itermon<<endl;
2048  }
2049  else
2050  {
2051  MAC_REV_FREE<coeff>(redcur.nf,redcur.size*sizeof(coeff));
2052  MAC_REV_FREE<unsigned char>(redcur.nfind,redcur.sizenf);
2053  }
2054  }
2055  MAC_REV_FREE<coeff>(ref.nf,ref.size*sizeof(coeff));
2056  MAC_REV_FREE<unsigned char>(ref.nfind,ref.sizenf);
2057  }
2058  }
2059 }
2060 
2061 template<typename typPk,typename monomial_server>
2062 int mindeg(const typPk &l,monomial_server &serv)
2063 {
2064  typedef typename typPk::value_type::monom_t mon;
2065  typedef typename mon::coeff_t coeff;
2066  int res=-1;
2067  // cout<<"dans mindeg res au debut"<<res<<endl;
2068  for(typename typPk::const_iterator iter=l.begin() ;iter!=l.end();iter++)
2069  {
2070  int mmax=-1;
2071  // cout<<"tour de boucle de mindeg "<<endl;
2072  for(int i=0;i<iter->sizenf;i++)
2073  if(iter->nfind[i])
2074  for(int j=0;j<8;j++)
2075  if((iter->nfind[i]>>j)&1)
2076  {
2077  mon tmpmon;
2078  serv.int2mon(8*i+j,tmpmon);
2079  mmax=(mmax<tmpmon.GetDegree())?tmpmon.GetDegree():mmax;
2080  }
2081  // cout<<"mmax ici "<<mmax<<endl;
2082  if (iter->ind.GetCoeff()==(coeff)1)
2083  mmax=(mmax<iter->ind.GetDegree())?iter->ind.GetDegree():mmax;
2084  //cout<<"les gens que je regarde "<<iter->ind<<endl;
2085  if(mmax!=-1)
2086  {
2087  if(res==-1) res=mmax;
2088  res=(mmax>res)?res:mmax;
2089  }
2090  }
2091  //cout<<"resultat de mindeg "<<res<<endl;
2092  return res;
2093 }
2094 
2095 template<typename coeff,typename typiterpk, typename workspace>
2096 void inline update_crochetchoix(typiterpk &iterPk, typiterpk &iter,int tmpind
2097  ,workspace &w)
2098 {
2099 
2100  if((iterPk->sizenf>tmpind/8)&&(((iterPk->nfind[tmpind/8])>>(tmpind%8))&1))
2101  {
2102  // cout<<"g trouve un gus qui a un coeff du mon choisi "<<endl;
2103  //cout<<"le voila "<<invconv<Poly>(*iterPk)<<endl;
2104  int i=0;
2105  coeff tmp;
2106  for(int j=0;8*j<=tmpind;j++)
2107  i+=nbbits[iterPk->nfind[j]];
2108  for(int j=7;j>=(tmpind % 8);j--)
2109  if((iterPk->nfind[tmpind/8]>>j)&1)
2110  i--;
2111 
2112 #ifdef DEB
2113  cout<<"i ici "<<i<<" et iterPk->size "<<iterPk->size<<endl;
2114 #endif
2115  tmp=iterPk->nf[i];
2116  // cout<<"le coeff "<<tmp<<" tmpind "<<tmpind<<endl;
2117  //cout<<"les voisins "<<iterPk->nf[i-1]<<" "<<iterPk->nf[i+1]<<endl;
2118 
2119  //cout<<"les voisins plus loin"<<iterPk->nf[i-2]<<" "<<iterPk->nf[i+2]<<endl;
2120  for(int j=i;j<iterPk->size-1;j++){
2121  iterPk->nf[j]=iterPk->nf[j+1];
2122  }
2123  iterPk->nfind[tmpind/8]&=~(1<< (tmpind%8));
2124  iterPk->nf=(coeff*)MAC_REV_REALLOC<coeff>(iterPk->nf,
2125  iterPk->size*sizeof(coeff),(iterPk->size-1)*sizeof(coeff));
2126  iterPk->size--;
2127  //iterPk->nf[i]=0;
2128  my_plus(*iterPk,*iter,tmp,&w);
2129 
2130  //cout<<"apres plus le coeff vaut "
2131  // <<iterPk->nf[mon2int(iter->ind)]<<endl;
2132  }
2133  //cout<<"apres mise a jour"<<endl<<invconv<Poly>(*iterPk)<<endl;
2134 }
2135 template<typename typP,typename typPk,typename typMk
2136  ,typename Base,typename typdump, typename typrecall,
2137  typename workspace ,typename monomial_server>
2138 void NewCrochetchoix(typP & P,typPk & Pk,typMk & Mk, typPk & redspol
2139  ,int &k,typdump &dump, Base &b, typrecall & recall
2140  ,workspace &w, monomial_server &serv)
2141  //,typMk &Spoldejavu)
2142  //template<typename typP,typename typPk,typename typMk,typename Base,typename typdump>
2143 //void NewCrochetchoix(const typP & P,typPk & Pk,typMk & Mk, typPk & redspol
2144 // ,int &k,typdump &dump, Base &b)
2145  {
2146  typedef typename typP::value_type polyalp;
2147  typedef typename polyalp::monom_t mon;
2148  typedef typename polyalp::coeff_t coeff;
2149  //for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++)
2150  // P.push_back(invconv<Poly>(*iter));
2151  //cout<<"dans newcrochetchoix"<<endl;
2152  /*
2153 
2154  //cout<<"les sizes "<<iter->size<<endl;
2155  {
2156  int cpt=0;
2157  cout<<invconv<typename typP::value_type>(*iter)<<endl;
2158  for(int i=0;i<iter->sizenf;i++)
2159  for(int j=0;j<8;j++)
2160  if (((iter->nfind[i]>>j)&1) && (iter->nf[cpt++]==0))
2161  {
2162  cout<<"ici ca couille a la place "<<8*i+j<<endl;
2163  exit(1);
2164  }
2165  }
2166  */
2167  typPk res=Crochet(redspol,k,serv),tmpres;
2168  //cout<<"redspol.size "<<redspol.size()<<endl;
2169  //cout<<"res.size "<<res.size()<<endl;
2170  for(typename typPk::iterator iter=res.begin();iter!=res.end();iter++)
2171  {
2172  for(typename typPk::iterator iterredspol=redspol.begin();
2173  iterredspol!=redspol.end();iterredspol++)
2174  if(iter->nf==iterredspol->nf)
2175  {
2176  redspol.erase(iterredspol);
2177  break;
2178  }
2179  }
2180  NewDestroyredspol(redspol,Pk);
2181  redspol.erase(redspol.begin(),redspol.end());
2182  //for(typename typPk::iterator iter=res.begin();iter!=res.end();iter++)
2183  // cout<<"res->sizenf<< "<<iter->sizenf<<endl;
2184  for(typename typPk::iterator iter=res.begin();iter!=res.end();iter++)
2185  {
2186  //cout<<"un nouveau tour de boucle "<<endl;
2187  if (!Ispolzero(*iter))
2188  {
2189  int tmpind,i;
2190  iter->ind=choice(*iter,b,serv);
2191  //cout<<"le pol pas zero "<<(invconv<polyalp>(*iter))<<endl;
2192  //cout<<"iter -> size "<<iter->size<<" "<<iter->ind<<endl;
2193  //for (int i=0;i<iter->size;i++)
2194  // cout<<iter->nf[i]<<" "<<iter->nfind[i]<<endl;
2195  if(iter->ind.GetDegree()<k)
2196  {
2197  //cout<<"le pol qui fait chuter"<<(invconv<polyalp>(*iter))<<endl;
2198  k=iter->ind.GetDegree();
2199  iter->ind=mon(0);
2200  //cout<<"passage par bout de code en plus "<<endl;
2201  my_merge(res,tmpres);
2202  my_merge(redspol,res);
2203  tmpres.erase(tmpres.begin(),tmpres.end());
2204  res.erase(res.begin(),res.end());
2205  res=Crochet(redspol,k,serv);
2206  //cout<<"newres.size "<<res.size()<<endl;
2207  for(typename typPk::iterator iterres=res.begin()
2208  ;iterres!=res.end();iterres++)
2209  {
2210  for(typename typPk::iterator iterredspol=redspol.begin();
2211  iterredspol!=redspol.end();iterredspol++)
2212  if(iterres->nf==iterredspol->nf)
2213  {
2214  redspol.erase(iterredspol);
2215  break;
2216  }
2217  }
2218  for(typename typPk::iterator iterredspol=redspol.begin();
2219  iterredspol!=redspol.end();iterredspol++)
2220  if(Degree(*iterredspol,serv)<=k)
2221  {
2222  tmpres.push_back(*iterredspol);
2223  redspol.erase(iterredspol--);
2224  }
2225  NewDestroyredspol(redspol,Pk);
2226  redspol.erase(redspol.begin(),redspol.end());
2227  my_merge(redspol,tmpres);
2228  tmpres.erase(tmpres.begin(),tmpres.end());
2229  iter=res.begin();
2230  iter->ind=choice(*iter,b,serv);
2231 
2232  Dump(Pk,dump);//c pour detruire Pk dans forget
2233  //ca ne respecte pas la structure du dump!!!
2234  recover(Pk,Mk,dump,k);
2235  // Listedejafait(Mk,Spoldejavu);
2236  forget(b,dump,k,recall);
2237  //forget(b,dump,k);
2238  // cout<<"un coup de compress"<<endl;
2239  //ce compresss la vire le 06 10 2006
2240  serv.compress(Pk,redspol,dump,b,k);
2241  //pose un probleme de oherence pour le int2mon
2242  //si on le laisse
2243  //swap(*iter,*res.rbegin());//on veut ne plus
2244 
2245 
2246  //iter=--res.end();//refaire d'autre tours
2247  }
2248  //cout<<"g choisi dans Crochetchoix "<<iter->ind<<endl;
2249  //cout<<"a t'il un mon2int ?"<<IsinB(iter->ind,b)<<endl;
2250  //mon tmp10,tmp11;
2251  // int2mon(10,tmp10);int2mon(11,tmp11);
2252  //cout<<"qu'en est il de int2mon(10) et 11 "<<tmp10<<" "<<tmp11<<endl;
2253  //
2254  //
2255  //
2256  //UGLY HACK
2257  remiseenforme(*iter);
2258  //SALE HACK
2259  //
2260  //
2261  //
2262  //
2263  //
2264  *iter/=iter->ind.GetCoeff();//pour la "nf"
2265  //cout<<"le coeff "<<iter->ind<<endl;
2266  iter->ind*=(coeff)1/iter->ind.GetCoeff();//pour l'ind
2267  tmpind=serv.mon2int(iter->ind);
2268  i=0;
2269  for(int j=0;8*j<=tmpind;j++)
2270  i+=nbbits[iter->nfind[j]];
2271  for(int j=7;j>=(tmpind % 8);j--)
2272  if((iter->nfind[tmpind/8]>>j)&1)
2273  i--;
2274  for(int j=i;j<iter->size-1;j++)
2275  iter->nf[j]=iter->nf[j+1];
2276  iter->nf=(coeff*)MAC_REV_REALLOC<coeff>(iter->nf,
2277  iter->size*sizeof(coeff),
2278  (iter->size-1)*sizeof(coeff));
2279  iter->nfind[tmpind/8]&=~(1<<(tmpind%8));
2280  iter->size--;
2281 #ifdef DEB
2282  cout<<"apres tambouille"<<endl<<invconv<Poly>(*iter)<<endl;
2283 #endif
2284 
2285  //
2286  //
2287  //
2288  //UGLY HACK
2289  remiseenforme(*iter);
2290  //SALE HACK
2291  //
2292  //
2293  //
2294  //
2295  //
2296 
2297  tmpres.push_back(*iter);
2298  //on met a 0 le coeff du mon passe en ind
2299  //maintenant on a une regle en forme comme il faut reste a:
2300  //-reduire les regles deja existantes par rapport a celle ci
2301  //-reduire les autres redspol par rapport a celle ci
2302  for(typename typPk::iterator iterPk=Pk.begin();iterPk!=Pk.end();iterPk++)
2303  update_crochetchoix<coeff>(iterPk,iter,tmpind,w);
2304  typename typPk::iterator iterredspol=iter;
2305  iterredspol++;
2306  for(;iterredspol!=res.end();iterredspol++)
2307  {
2308  //cout<<"redspol.size() "<<redspol.size()<<endl;
2309  //cout<<"iterredspol-ind "<<iterredspol->ind<<" "<<iterredspol->nf<<endl;
2310  update_crochetchoix<coeff>(iterredspol,iter,tmpind,w);
2311  }
2312  //au tour de tmpres...
2313  typename typPk::iterator iterend=tmpres.end();
2314  iterend--;
2315  for(iterredspol=tmpres.begin();iterredspol!=iterend;iterredspol++)
2316  {
2317  //cout<<"redspol.size() "<<redspol.size()<<endl;
2318  //cout<<"iterredspol-ind "<<iterredspol->ind<<" "<<iterredspol->nf<<endl;
2319  update_crochetchoix<coeff>(iterredspol,iter,tmpind,w);
2320  }
2321 
2322  //voila c fait
2323  //maintenant on met a jour la Base b.
2324  for(typename Base::iterator iterb=b.begin();iterb!=b.end();iterb++)
2325  {
2326  int tmptaille1=0;
2327  mon *tmp=(mon*)MAC_REV_MALLOC<mon>(iterb->taille1*sizeof(mon));
2328  for(int i=0;i<iterb->taille1;i++)
2329  if(!isdivisible(iter->ind,iterb->accept[i],b))
2330  tmp[tmptaille1++]=iterb->accept[i];
2331  tmp=(mon*)MAC_REV_REALLOC<mon>(tmp,iterb->taille1*sizeof(mon)
2332  ,tmptaille1*sizeof(mon));
2333  MAC_REV_FREE<mon>(iterb->accept,iterb->taille1*sizeof(mon));
2334  iterb->accept=tmp;
2335  iterb->taille1=tmptaille1;
2336  if(iterb->taille1==0)
2337  {
2338  MAC_REV_FREE<mon>(iterb->refuse,iterb->taille2*sizeof(mon));
2339  b.erase(iterb--);
2340  continue;
2341  }
2342  iterb->refuse=(mon*)MAC_REV_REALLOC<mon>
2343  (iterb->refuse,(iterb->taille2)*sizeof(mon),
2344  (iterb->taille2+1)*sizeof(mon));
2345  iterb->refuse[iterb->taille2]=iter->ind;
2346  // cout<<"reffuse rajoute "<<iter->ind<<endl;
2347  iterb->refuse[iterb->taille2].SetCoeff(1);
2348  iterb->taille2++;
2349  }
2350  res.erase(iter--);
2351  }
2352  //break;//comme ca on fait pas 50 tours.
2353  }
2354  for (typename typPk::iterator iterpk=Pk.begin();iterpk!=Pk.end();iterpk++)
2355  {
2356  //cout<<"iterpk->ind "<<iterpk->ind<<"et Isinb(iterpk-ind,b) "<<IsinB(iterpk->ind,b)<<endl;
2357  //cout<<"le pol "<<invconv<Poly>(*iterpk)<<endl;
2358  if (IsinB(iterpk->ind,b))
2359  {
2360  for(typename Base::iterator iterb=b.begin();iterb!=b.end();iterb++)
2361  {
2362  iterb->refuse=(mon*)MAC_REV_REALLOC<mon>
2363  (iterb->refuse,(iterb->taille2)*sizeof(mon),
2364  (iterb->taille2+1)*sizeof(mon));
2365  iterb->refuse[iterb->taille2]=iterpk->ind;
2366  iterb->refuse[iterb->taille2].SetCoeff(1);
2367  iterb->taille2++;
2368  }
2369  }
2370  }
2371 #ifdef NO_TWICE_FALL
2372  for(typename typPk::iterator iter=tmpres.begin();iter!=tmpres.end();iter++)
2373  P.push_back(invconv<polyalp>(*iter));
2374 #endif
2375 #ifdef BONRAJOUT
2376  for(typename typPk::iterator iter=tmpres.begin();iter!=tmpres.end();iter++)
2377  P.push_back(invconv<polyalp>(*iter));
2378  cout<<"a la fin de §New"<<endl;
2379 #endif
2380 #ifdef DEB
2381  for(typename typPk::iterator iter=tmpres.begin();iter!=tmpres.end();iter++)
2382  cout<<"tmpres"<<endl<<invconv<polyalp>(*iter)<<endl;
2383  cout<<"tmpres.size "<<tmpres.size()<<endl;
2384 #endif
2385  my_merge(Pk,tmpres);//les gens dans res\tmpres ne sont pas detruits ici!!
2386  my_merge(redspol,res);
2387 
2388 
2389  /* for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
2390  //cout<<"les sizes "<<iter->size<<endl;
2391  {
2392  int cpt=0;
2393  cout<<invconv<typename typP::value_type>(*iter)<<endl;
2394  for(int i=0;i<iter->sizenf;i++)
2395  for(int j=0;j<8;j++)
2396  if (((iter->nfind[i]>>j)&1) && (iter->nf[cpt++]==0))
2397  {
2398  cout<<"ici ca couille a la place "<<8*i+j<<endl;
2399  exit(1);
2400  }
2401  }
2402  */
2403  return;
2404 }
2405 //#undef DEB
2406 template<typename typPk>
2407 void NewDestroyredspol(typPk &redspol,const typPk &Pk)
2408 {
2409 // typename typPk::const_iterator iterpk=--Pk.end();
2410  for(typename typPk::iterator iter=redspol.begin();
2411  iter!=redspol.end();iter++)
2412  {
2413  // if(iter->nf!=iterpk->nf)
2414  MAC_REV_FREE<typename typPk::value_type::coeff_t>(iter->nf,iter->size*sizeof(typename typPk::value_type::coeff_t));
2415  MAC_REV_FREE<unsigned char>(iter->nfind,iter->sizenf);
2416  }
2417 }
2418 
2419 template<typename typMk>
2420 void Listedejafait(const typMk &Mk,typMk &Spoldejavu)
2421 {
2422  Spoldejavu.erase(Spoldejavu.begin(),Spoldejavu.end());
2423  for(typename typMk::const_iterator iter1=Mk.begin();iter1!=Mk.end();
2424  iter1++)
2425  for(typename typMk::const_iterator iter2=iter1;iter2!=Mk.end();
2426  iter2++)
2427  {
2428  typename typMk::value_type tmp=lcm(*iter1,*iter2);
2429  if (tmp.GetDegree()==iter1->GetDegree()+1)
2430  Spoldejavu.push_back(tmp);
2431  }
2432 }
2433 
2434 //on suppose stockmon vide
2435 template<typename Base, typename typstock, typename typdump>
2436 void enumeratemon(typstock &stockmon, int k,
2437  const Base &b, const typdump &dump)
2438 {
2439  typedef typename typstock::value_type mon;
2440  int maxdeg=0;
2441  typstock current;
2442  current.push_back(mon(1));
2443  stockmon.push_back(mon(1));
2444  //
2445  //
2446  //on a le degre max : k
2447  // on part de 1 et on decrit le reste en multipliant par les variables
2448  //
2449  //
2450  for(int i=0;i<k;i++)
2451  {
2452  typstock tmpcurrent=current;
2453  current.erase(current.begin(),current.end());
2454  for(int i=0;i<b.nbvar();i++)
2455  {
2456  for(typename list<mon>::iterator iter=tmpcurrent.begin();
2457  iter!=tmpcurrent.end();iter++)
2458  {
2459  mon tmpmon=(*iter)*mon(i,1);
2460  tmpmon.SetCoeff(1);
2461  current.push_back(tmpmon);
2462  }
2463  }
2464  //maintenant on tri;
2465  for(typename list<mon>::iterator iter=current.begin();iter!=current.end();iter++)
2466  if(!member(stockmon,*iter))
2467  {
2468  stockmon.push_back(*iter);
2469  }
2470  else
2471  {
2472  current.erase(iter--);
2473  }
2474  }
2475  // cout<<"ttttttttt "<<stockmon.size()<<endl;
2476  return;
2477 }
2478 template <class M> struct Dlexpolprod
2479 {
2480  static bool less (const M &, const M &);
2481  bool operator() (const M &, const M &) const;
2482 };
2483 template <class M>
2484 bool Dlexpolprod<M>::operator()(const M & m1, const M & m2) const {
2485  return less(m1,m2);
2486 }
2487 
2488 template <class M>
2489 inline bool Dlexpolprod<M>::less(const M & p1, const M & p2){
2490  typedef typename M::monom_t mon;
2491  mon m1=*(p1.begin());
2492  mon m2=*(p2.begin());
2493  int dm1=0,dm2=0,firstdiff=0,tmpdeg1,tmpdeg2;
2494  //int dm1=Degree(m1),dm2=Degree(m2);
2495  int n1 = lvar(m1.rep), n2 =lvar(m2.rep);
2496  int n = max(n1,n2);
2497  if(n1 <0 && n2>0) return false;
2498  if(n2 <0 && n1>0) return true;
2499  for(int i=0;i<=n;i++)
2500  {
2501  tmpdeg1=m1.GetDegree(i);
2502  tmpdeg2=m2.GetDegree(i);
2503  if(tmpdeg1>tmpdeg2 && firstdiff==0) firstdiff=1;
2504  if(tmpdeg2>tmpdeg1 && firstdiff==0) firstdiff=-1;
2505  dm1+=tmpdeg1;
2506  dm2+=tmpdeg2;
2507  }
2508  if (dm1 < dm2) return false;
2509  else if (dm1 > dm2) return true;
2510  return (firstdiff==1);
2511 }
2512 
2513 template<typename typprod,typename Base, typename typstock, typename typdump>
2514 void computeprod(typprod &prod,typstock &stockmon, Base & b,
2515  typdump & dump)
2516 {
2517  //
2518  for(typename typstock::iterator i=stockmon.begin();
2519  i!=stockmon.end();i++)
2520  {
2521  for(typename typstock::iterator j=i;j!=stockmon.end();j++)
2522  prod.push_back(*i * *j);
2523  }
2524  //Maintenant on tri et on ne selectionne que ceux qui sont en dehors de B
2525  //
2526  //Aie ici il faut define DLEX sur des polynomes!
2528  prod.unique();
2529  // for(typename typprod::iterator i=prod.begin();i!=prod.end();i++)
2530  // if (IsinB(*(i->begin()),b)) prod.erase(i--);
2531 }
2532 
2533 template<typename T>
2534 int dgesvd_(char *jobu, char *jobvt, long *m, long *n,
2535  T *a, long *lda, T *s, T *u, long *
2536  ldu, T *vt, long *ldvt, T *work, long *lwork,
2537  long *info);
2538 
2539 template<typename typP, typename typdump,typename Base, typename typserv>
2540 void generickernel(typP &newpol, int k,
2541  const typdump &dump, Base &b, typserv &serv)
2542 {
2543  using namespace coinor;
2544  typedef typename typP::value_type::order_t ord;
2545  //
2546  //Allocation du problem et des
2547  //contraintes
2548  struct blockmatrix<COEFF> C;
2549  struct sparseblock<COEFF> *blockptr;
2550  COEFF *bb;
2551  int i;
2552  struct constraintmatrix<COEFF> *constraints;
2553 
2554  //
2555  //On introduit un variable par monome de degre d en dehors de B
2556  //On va contruire l'operateur de de Hankel associé // // //On commence par enumerer les monomes de degre plus petit que k // // typP stockprod,stockproj;//dans stockprod on a des polynomes // // // int nbconstraint=0; list<typename typserv::monom_t> stockmon,stockksur2; map<mon,int,ord> mapintligne,mapintcolonne,maphankel; enumeratemon(stockmon,k,b,dump); // //ICI on cree un index pour le monomes de degre k //il n'a a priori rien a voir avec int2mon/mon2int du reste du code //sic..... enumeratemon(stockksur2,k/2,b,dump); // //pour le suite il nous faut les monomes de B de degre <=k/2 // for(typename list<typename typserv::monom_t>::iterator iter=stockksur2.begin(); iter!=stockksur2.end();iter++) if(!IsinB(*iter,b)) stockksur2.erase(iter--); #ifdef DEBUGSDP cout<<"monome en degre k/2 "<<endl; for(typename list<typename typserv::monom_t>::iterator iter=stockksur2.begin(); iter!=stockksur2.end();iter++) cout<<*iter<<" "; cout<<endl; #endif i=1; for(typename list<typename typserv::monom_t>::iterator iter=stockksur2.begin();iter!=stockksur2.end();iter++,i++) { int j=1; for(typename list<typename typserv::monom_t>::iterator iter2=stockksur2.begin();iter2!=stockksur2.end();iter2++,j++) { typename typserv::monom_t mono=*iter * (*iter2); // cout<<"monome "<<mono<<" "<<i<<" "<<j<<endl; if (!mapintligne.count(mono)) { mapintligne[mono]=i; mapintcolonne[mono]=j; } } } //cout<<"passé"<<endl; // // On genere les formes normales des produits de monomes de // de tous les monomes de degre <=k/2 dez B. // computeprod(stockprod,stockksur2,b,dump); stockproj=stockprod; proj(stockproj,dump,b,serv); #ifdef DEBUGSDP cout<<"produits "<<endl; for(typename typP::iterator iter=stockprod.begin();iter!=stockprod.end(); iter++) cout<<*iter<<" "; cout<<endl; cout<<"proj "<<endl; for(typename typP::iterator iter=stockproj.begin();iter!=stockproj.end(); iter++) cout<<*iter<<" "; cout<<endl; #endif // // //computerelations();// // // // // // §Ici on va avoir besoin d'une structure contenant un monome de tete // hors de B et sa forme normal for(typename typP::iterator iter=stockprod.begin(); iter!=stockprod.end();iter++) if(!IsinB(*(iter->begin()),b)) nbconstraint++; #ifndef NONEW constraints=new constraintmatrix<COEFF>[nbconstraint+1]; #else constraints=(struct constraintmatrix<COEFF> *) malloc((nbconstraint+1)*sizeof(struct constraintmatrix<COEFF>)); #endif /* * * Les indices partent de 1 pas de 0! * */ // //On construit la liste des contraintes de la fin vers le debut // //Ca c la fin constraints[0].blocks=NULL;//not used dixit the manual // i=1; typename typP::iterator iterstockprod=stockprod.begin(); for(typename typP::iterator iter=stockproj.begin(); iter!=stockproj.end();iter++,iterstockprod++) { if(!IsinB(*(iterstockprod->begin()),b)) { int k; int decal; // //On construit la liste des contraintes de la fin vers le debut // //Ca c la fin constraints[i].blocks=NULL; // #ifndef NONEW blockptr=new sparseblock<COEFF>[1]; #else blockptr=(struct sparseblock<COEFF> *)malloc(sizeof(struct sparseblock<COEFF>)); #endif blockptr->blocknum=1;// // ?????? relations.size()-i; #if 0 blockptr->blocksize=stockksur2.size(); blockptr->numentries=2*iter->size()+2;//pour l'ind decal=iter->size()+1;//pour l'ind #else blockptr->blocksize=stockksur2.size(); blockptr->numentries=iter->size()+1;//pour l'ind decal=0; #endif blockptr->constraintnum=i; blockptr->next=NULL; blockptr->nextbyblock=NULL; #ifndef NONEW blockptr->entries=new COEFF[(blockptr->numentries+1)]; #else blockptr->entries=(COEFF *) malloc((blockptr->numentries+1)*sizeof(COEFF)); #endif #ifndef NOSHORTS blockptr->iindices=(short unsigned int *) malloc((blockptr->numentries+1)*sizeof(short unsigned int)); blockptr->jindices=(short unsigned int *) malloc((blockptr->numentries+1)*sizeof(short unsigned int)); #else blockptr->iindices=( int *) malloc((blockptr->numentries+1)*sizeof( int)); blockptr->jindices=(int *) malloc((blockptr->numentries+1)*sizeof( int)); #endif k=1; // cout<<" matrix contrainte "<<endl<<*iter<<endl; for(typename typP::value_type::iterator iterpol=iter->begin(); iterpol!=iter->end();k++,iterpol++) { if(mapintligne[*iterpol]<mapintcolonne[*iterpol]) { blockptr->iindices[k]=mapintligne[*iterpol]; blockptr->jindices[k]=mapintcolonne[*iterpol]; blockptr->entries[k]=((COEFF)-1)*iterpol->GetCoeff(); // cout<<blockptr->iindices[k]<<" "<<blockptr->jindices[k] // <<" "<<blockptr->entries[k]<<endl; // } else { //blockptr->numentries--; //decal--; if (mapintligne[*iterpol]!=mapintcolonne[*iterpol] ) { blockptr->jindices[k]=mapintligne[*iterpol]; blockptr->iindices[k]=mapintcolonne[*iterpol]; blockptr->entries[k]=((COEFF)-1)*iterpol->GetCoeff(); } else { blockptr->jindices[k]=mapintligne[*iterpol]; blockptr->iindices[k]=mapintcolonne[*iterpol]; blockptr->entries[k]=((COEFF)-2)*iterpol->GetCoeff(); } } } // cout<<"index en plus"<<endl; if(mapintligne[*(iterstockprod->begin())]< mapintcolonne[*(iterstockprod->begin())] ) { blockptr->iindices[k]=mapintligne[*(iterstockprod->begin())]; blockptr->jindices[k]=mapintcolonne[*(iterstockprod->begin())]; blockptr->entries[k]=1; // cout<<blockptr->iindices[k]<<" "<<blockptr->jindices[k] // <<" "<<blockptr->entries[k]<<endl; } else { if (mapintligne[*(iterstockprod->begin())]!= mapintcolonne[*(iterstockprod->begin())]) { blockptr->iindices[k] =mapintcolonne[*(iterstockprod->begin())]; blockptr->jindices[k] =mapintligne[*(iterstockprod->begin())]; blockptr->entries[k]=1; // cout<<"indices ici "<<mapintligne[*(iterstockprod->begin())]<<" "<< // mapintcolonne[*(iterstockprod->begin())]<<endl; } else { blockptr->iindices[k]=mapintligne[*(iterstockprod->begin())]; blockptr->jindices[k]=mapintcolonne[*(iterstockprod->begin())]; blockptr->entries[k]=2; } } /* * Insert block into the linked list of A1 blocks. */ // blockptr->blocksize--; blockptr->next=NULL; //=constraints[i].blocks; constraints[i].blocks=blockptr; // cout<<"i "<<i<<" "<<stockprod.size()<<endl; i++; } } // // On donne les relations Hankel // // // // // // int nbhankelrel=0,i_counter=1,j_counter; for(typename list<typename typserv::monom_t>::iterator i=stockksur2.begin(); i!=stockksur2.end();i++,i_counter++) { j_counter=1; for(typename list<typename typserv::monom_t>::iterator j=stockksur2.begin(); j!=stockksur2.end();j++,j_counter++) if(!maphankel.count(*i * *j)) { maphankel[*i * *j]=j_counter*stockksur2.size()+i_counter; } else if((maphankel[*i * *j]%stockksur2.size()!=j_counter) ||(maphankel[*i * *j]/stockksur2.size()!=i_counter)) { int decal=0; nbhankelrel++; #ifndef NONEW constraintmatrix<COEFF> *tmpconstraints=new constraintmatrix<COEFF>[nbhankelrel+nbconstraint+1]; for(int ii=0;ii<nbhankelrel+nbconstraint;ii++) tmpconstraints[ii]=constraints[ii]; delete[] constraints; constraints=tmpconstraints; blockptr=new sparseblock<COEFF>[1]; #else constraints=(struct constraintmatrix<COEFF> *) realloc(constraints, (nbhankelrel+nbconstraint+1) *sizeof(struct constraintmatrix<COEFF>)); blockptr=(struct sparseblock<COEFF> *)malloc(sizeof(struct sparseblock<COEFF>)); #endif blockptr->blocknum=1;// blockptr->blocksize=stockksur2.size(); #if 0 blockptr->numentries=4; #else blockptr->numentries=2; #endif blockptr->constraintnum=nbconstraint+nbhankelrel; blockptr->next=NULL; blockptr->nextbyblock=NULL; #ifndef NONEW blockptr->entries=new COEFF[(blockptr->numentries+1)]; #else blockptr->entries=(COEFF *) malloc((blockptr->numentries+1)*sizeof(COEFF)); #endif #ifndef NOSHORTS blockptr->iindices=(short unsigned int *) malloc((blockptr->numentries+1)*sizeof(short unsigned int)); blockptr->jindices=(short unsigned int *) malloc((blockptr->numentries+1)*sizeof(short unsigned int)); #else blockptr->iindices=(int *) malloc((blockptr->numentries+1)*sizeof(int)); blockptr->jindices=(int *) malloc((blockptr->numentries+1)*sizeof(int)); #endif //blockptr->numentries=blockptr->blocksize-1; //On a rajoute un avant if((maphankel[*i * *j]%stockksur2.size())< (maphankel[*i * *j]/stockksur2.size())) { blockptr->iindices[1]=maphankel[*i * *j]%stockksur2.size(); blockptr->jindices[1]=maphankel[*i * *j]/stockksur2.size(); blockptr->entries[1]=1; } else { if((maphankel[*i * *j]/stockksur2.size())!= (maphankel[*i * *j]%stockksur2.size())) { blockptr->jindices[1]=maphankel[*i * *j]%stockksur2.size(); blockptr->iindices[1]=maphankel[*i * *j]/stockksur2.size(); blockptr->entries[1]=1; } else { blockptr->jindices[1]=maphankel[*i * *j]%stockksur2.size(); blockptr->iindices[1]=maphankel[*i * *j]/stockksur2.size(); blockptr->entries[1]=2; } } if(i_counter<j_counter) { blockptr->iindices[2]=i_counter; blockptr->jindices[2]=j_counter; blockptr->entries[2]=-1; } else { if(i_counter!=j_counter) { blockptr->iindices[2]=j_counter; blockptr->jindices[2]=i_counter; blockptr->entries[2]=-1; } else { blockptr->iindices[2]=j_counter; blockptr->jindices[2]=i_counter; blockptr->entries[2]=-2; } } #if 0 if((maphankel[*i * *j]/stockksur2.size())!= (maphankel[*i * *j]%stockksur2.size())) { blockptr->iindices[3]=maphankel[*i * *j]/stockksur2.size(); blockptr->jindices[3]=maphankel[*i * *j]%stockksur2.size();; blockptr->entries[3]=1; } else { decal++; blockptr->numentries--; blockptr->entries[1]=2; } if(i_counter!=j_counter) { blockptr->iindices[4-decal]=j_counter; blockptr->jindices[4-decal]=i_counter; blockptr->entries[4-decal]=-1; } else { blockptr->numentries--; blockptr->entries[2]=-2; } #endif // cout<<"indice "<<maphankel[*i * *j]%stockksur2.size() // <<" "<<maphankel[*i * *j]/stockksur2.size()<<endl; // cout<<"indice "<<i_counter<<" "<<j_counter<<endl; // cout<<endl; // cout<<"indice "<<l<<" "<<1<<endl; //cout<<"indice "<<l-k<<" "<<k+1<<endl; /* * Insert block into the linked list of A1 blocks. */ blockptr->next=NULL;//constraints[i].blocks; constraints[nbconstraint+nbhankelrel].blocks=blockptr; } } // // // // les relations de symetrie sont implicites X est recherche SDP // ONrajoute la contrainte sur le coeff en haut a gauche // // nbhankelrel++; #ifndef NONEW constraintmatrix<COEFF> *tmpconstraints= new constraintmatrix<COEFF>[(nbhankelrel+nbconstraint+1)]; for(int ii=0;ii<nbhankelrel+nbconstraint;ii++) tmpconstraints[ii]=constraints[ii]; delete [] constraints; constraints=tmpconstraints; #else constraints=(struct constraintmatrix<COEFF> *) realloc(constraints, (nbhankelrel+nbconstraint+1) *sizeof(struct constraintmatrix<COEFF>)); #endif #ifndef NONEW blockptr=new sparseblock<COEFF>[1]; #else blockptr=(struct sparseblock<COEFF> *)malloc(sizeof(struct sparseblock<COEFF>)); #endif blockptr->blocknum=1;// blockptr->blocksize=stockksur2.size(); blockptr->numentries=1; blockptr->constraintnum=nbconstraint+nbhankelrel; blockptr->next=NULL; blockptr->nextbyblock=NULL; #ifndef NONEW blockptr->entries=new COEFF[blockptr->numentries+1]; #else blockptr->entries=(COEFF *) malloc((blockptr->numentries+1)*sizeof(COEFF)); #endif #ifndef NOSHORTS blockptr->iindices=(short unsigned int *) malloc((blockptr->numentries+1)*sizeof(short unsigned int)); blockptr->jindices=(short unsigned int *) malloc((blockptr->numentries+1)*sizeof(short unsigned int)); #else blockptr->iindices=(int *) malloc((blockptr->numentries+1)*sizeof(int)); blockptr->jindices=(int *) malloc((blockptr->numentries+1)*sizeof(int)); #endif //blockptr->numentries=blockptr->blocksize-1; //On a rajoute un avant blockptr->iindices[1]=1; blockptr->jindices[1]=1; blockptr->entries[1]=1; blockptr->next=NULL;//constraints[i].blocks; constraints[nbconstraint+nbhankelrel].blocks=blockptr; // //On optimise la fonction "0" sous l es contraintes lineaires precedents // struct blockmatrix<COEFF> X,Z; COEFF *y; COEFF pobj,dobj; int tmpsize=(int)stockksur2.size(); #ifndef NONEW bb=new COEFF[nbhankelrel+nbconstraint+1]; #else bb=(COEFF *)malloc((nbhankelrel+nbconstraint+1)*sizeof(COEFF)); #endif //oon a un block de 0 C.nblocks=1; #ifndef NONEW C.blocks=new blockrec<COEFF>[2]; #else C.blocks=(struct blockrec<COEFF> *)malloc(2*sizeof(struct blockrec<COEFF>)); #endif #ifndef CCCCC C.blocks[1].blockcategory=MATRIX; C.blocks[1].blocksize=stockksur2.size(); #ifndef NONEW C.blocks[1].data.mat=new COEFF[stockksur2.size()*stockksur2.size()+1]; #else C.blocks[1].data.mat=(COEFF *)malloc( (stockksur2.size()*stockksur2.size()+1)*sizeof(COEFF)); #endif for(int k=0;k<=(stockksur2.size()*stockksur2.size());k++) C.blocks[1].data.mat[k]=0; // C.blocks[1].data.mat[1]=0; #else C.blocks[1].blockcategory=DIAG; C.blocks[1].blocksize=stockksur2.size(); C.blocks[1].data.vec=(COEFF *)malloc( (stockksur2.size()+1)*sizeof(COEFF)); for(int k=0;k<=(stockksur2.size());k++) C.blocks[1].data.vec[k]=0; #endif for(i=0;i<=nbhankelrel+nbconstraint;i++) bb[i]=0; bb[nbconstraint+nbhankelrel]=(COEFF)1.;//on double qd on est sur la diagonale //cout<<"stockprod.size() "<<stockprod.size()<<endl; // cout<<"nbconstraint "<<nbconstraint<<endl; // cout<<"tmpsize "<<tmpsize<<endl; // cout<<"Affichage contraintes"<<endl; for(i=1;i<nbconstraint+nbhankelrel+1;i++) { // cout<<"le b associe "<<bb[i]<<endl; int tsize=constraints[i].blocks->blocksize; COEFF* tmp= new COEFF[tsize*tsize]; // cout<<"taille "<<tsize<<endl; for(int j;j<tsize*tsize;j++) tmp[j]=0; for(int j=1;j<=constraints[i].blocks->numentries;j++) tmp[constraints[i].blocks->iindices[j]-tsize-1+ constraints[i].blocks->jindices[j]*tsize]= constraints[i].blocks->entries[j]; #ifdef DEBUGSDP for(int j=0;j<tsize;j++) { for(int jj=0;jj<tsize;jj++) cout<<tmp[tsize*(jj)+j]<<" "; cout<<endl; } cout<<endl; #endif } char nom[50]; static int d=0; sprintf(nom,"ficprob_%d",d++); write_prob(nom,tmpsize, nbhankelrel+nbconstraint,C,bb,constraints); //Precision(53); cout<<"SDP of size : "<<stockksur2.size()<<"x"<<nbhankelrel+ nbconstraint<<endl; initsoln(tmpsize,nbhankelrel+nbconstraint, C,bb,constraints,&X,&y,&Z); struct timeval tvini, tvfin; gettimeofday(&tvini,NULL); int return_code=easy_sdp((int)stockksur2.size(),nbhankelrel+ nbconstraint, C,bb,constraints,(COEFF)(0.0),&X,&y,&Z,&pobj,&dobj); //Precision(350); gettimeofday(&tvfin,NULL); tempsCDSP+=tvfin.tv_sec-tvini.tv_sec+1e-6*(tvfin.tv_usec-tvini.tv_usec); // write_sol("prob.sol",tmpsize,nbhankelrel+nbconstraint,X,y,Z); // // // // A ce niveau la il faut verifier le rang // Le cas echeant recuperer le kernel // cout<<"pobj "<<pobj<<" dobj "<<dobj<<" diff "<<pobj-dobj<<endl; // cout<<"return code "<<return_code<<endl; if (1||return_code==8)//c le code de retour indiquant une singularite { long n=stockksur2.size(); COEFF *matdense=new COEFF[n*n]; COEFF *V=new COEFF[n*n]; COEFF *S=new COEFF[n]; COEFF *work=new COEFF[16*n]; long lwork=16*n,info; long k=0;//servira pour le rang0 for(int j=0;j<n*n;j++) matdense[j]=0; /* Warning !!! je ne traite pas les differetn cas des blocks de X il peuvent etre soit DIAG soit MATRIX soit PACKEDMATRIX (on peut s'en passez il y a invalid dasn writesol */ // //on est pas de rang plein // //il faut calculer le noyau // // #ifdef DEBUGSDP for(int i=1;i<=nbconstraint+nbhankelrel;i++) cout<<"y "<<i<<" "<<y[i]<<endl; cout<<"nombre de blocks de X "<<X.nblocks<<endl; #endif for(int i=1;i<=X.nblocks;i++) { //Pour chque block il faut regarder son noyau struct blockrec<COEFF> tmp=X.blocks[i]; // //On recopie le bloc en dense // #ifdef DEBUGSDP cout<<"n _________________________________ "<<n<<endl; cout<<"blockcat "<<tmp.blockcategory<<" "<<k<<endl; #endif switch(tmp.blockcategory) { case DIAG: for(int j=1;j<=tmp.blocksize;j++) matdense[n*(k+j-1)+(k+j-1)]=tmp.data.vec[j]; #ifdef DEBUGSDP for(int j=1;j<=tmp.blocksize;j++) { for(int jj=1;jj<=tmp.blocksize;jj++) cout<<matdense[n*(k+jj-1)+j-1]<<" "; cout<<endl; } cout<<endl; #endif break; case MATRIX: for(int j=1;j<=tmp.blocksize;j++) for(int jj=1;jj<=tmp.blocksize;jj++) matdense[n*(k+jj-1)+j-1]= tmp.data.mat[tmp.blocksize*(jj-1)+j-1]; #ifdef DEBUGSDP for(int j=1;j<=tmp.blocksize;j++) { for(int jj=1;jj<=tmp.blocksize;jj++) cout<<matdense[n*(k+jj-1)+j-1]<<" "; cout<<endl; } #endif } k+=tmp.blocksize; } // //On calcul le noyau // dgesvd_((char*)"N",(char*)"A",&n,&n,matdense, &n,S,(COEFF*)NULL,&n,V,&n,work,&lwork,&info); #if 1 cout<<"info svd "<<info<<endl; cout<<"val singulieres "<<endl; for(k=0;k<n;k++) cout<<S[k]<<" "; cout<<endl; #endif for(k=1;k<n;k++) //if(S[0]>S[k]*1e6) break;//MAGIC if((abs(S[k-1])==0) || (abs(S[k-1])>abs(S[k])*1e6)) break;//MAGIC //#ifdef DEBUGSDP cout<<"----k ici "<<k<<" et n "<<n<<endl; //#endif for(int j=1;j<=n;j++) { for(int jj=1;jj<=n;jj++) cout<<V[n*(jj-1)+j-1]<<" "; cout<<endl; } // //On construit les nouvelles equations // for(;k<n;k++) { #ifdef DEBUGSDP cout<<"equation dans le noyau"<<endl; #endif typedef typename typP::value_type polyalp; polyalp tmp(0); for(typename list<typename typserv::monom_t>::iterator iter=stockksur2.begin(); iter!=stockksur2.end();iter++) { //cout<<"dans construct eq "<<k<<" map "<<mapintcolonne[*iter]<<endl; //cout<<V[k+n*(mapintcolonne[*iter]-1)]<<" "<<*iter<<" "; if(!Iszero(abs(V[k+n*(mapintcolonne[*iter]-1)]))) { // cout<<"tmp avant"<<endl<<tmp<<endl; //cout<<"ajout "<<endl<<polyalp(*iter*V[k+n*(mapintcolonne[*iter]-1)])<<endl; tmp+=polyalp(*iter*(COEFF)V[k+n*(mapintcolonne[*iter]-1)]); //cout<<"tmp aapre"<<endl<<tmp<<endl; } //iter->first;// est le monome //iter->second;//est l'entier associé } // cout<<endl; // cout<<"g trouve ca comme nvlle eq "<<endl<<tmp<<endl; newpol.push_back(tmp); } delete[] S; delete[] V; delete[] work; delete[] matdense; } for(int i=1;i<nbconstraint;i++) { free(constraints[i].blocks->iindices); free(constraints[i].blocks->jindices); delete [] constraints[i].blocks->entries; delete [] constraints[i].blocks; } delete [] constraints; delete [] bb; delete [] C.blocks[1].data.mat; delete [] C.blocks; // il faut desallouer les contraintes mieux (les matrices pointees //il faut desalluer C //Precision(53); //cout<<"en sortie "<<newpol.empty()<<endl; } #include"genekersdpa.hpp" template<typename typmatmap, typename typserv> void write_to_sdpa_fic(typmatmap &matrixmap, int &dim, typserv &serv, int d) { ofstream tmpfic; typename typserv::monom_t m(1); COEFF *tmpval=matrixmap[m]; char nomdufic[50]; sprintf(nomdufic,"tmpfile_%d",d); tmpfic.open(nomdufic); tmpfic<<setprecision(80); tmpfic<<"\" Ceci est un message \""<<endl; tmpfic<<matrixmap.size()-1<<" = mDIM"<<endl; tmpfic<<1<<" = nBLOCK"<<endl; tmpfic<<dim<<" = bLOCKsTRUCT"<<endl; tmpfic<<"{"; for(int i=0;i<((long)matrixmap.size())-2;i++) tmpfic<<"0,"; tmpfic<<"0}"<<endl; tmpfic<<"{"; for(int i=0;i<dim-1;i++) { tmpfic<<"{"; for(int j=0;j<dim-1;j++) { //cout<<(-1*matrixmap[m][i*dim+j])<<" "; tmpfic<<(COEFF)(-1*matrixmap[m][i*dim+j])<<","; } cout<<endl; tmpfic<<(COEFF)(-1*matrixmap[m][i*dim+dim-1])<<"},"; } tmpfic<<"{"; for(int j=0;j<dim-1;j++) tmpfic<<-1*matrixmap[m][(dim-1)*dim+j]<<","; tmpfic<<-1*matrixmap[m][dim*dim-1]<<"}}"<<endl; matrixmap.erase(matrixmap.find(m)); for(typename typmatmap::iterator itermat=matrixmap.begin(); itermat!=matrixmap.end();itermat++) { //cout<<"matrice de "<<itermat->first<<endl; COEFF *tt=itermat->second; tmpfic<<"{"; for(int i=0;i<dim-1;i++) { tmpfic<<"{"; for(int j=0;j<dim-1;j++) tmpfic<<tt[i*dim+j]<<","; tmpfic<<tt[i*dim+dim-1]<<"},"; } tmpfic<<"{"; for(int j=0;j<dim-1;j++) tmpfic<<tt[(dim-1)*dim+j]<<","; tmpfic<<tt[dim*dim-1]<<"}}"<<endl; } matrixmap[m]=tmpval; tmpfic.close(); } template<typename typmatmap, typename coeff, typename typserv> void read_sol_from_sdpa(coeff *&sol, typmatmap &matmap,int dim, typserv &serv) { typedef typename typserv::monom_t mon; ifstream tmpfic; string ligne,ligne2; typename string::iterator debut; int i; coeff *xVec,*xMat; stringstream tmpstr; system( "perl -i.bak -0777 -ne 'if (/^xMat *= *(.*)(?=yMat)/ms) {$toto=$1; $toto=~s/[[:blank:]{}]\\+?//g; $toto=~s/,\\+?/ /g; print $toto}' lenom" // "perl -0777 -i.bak -ne '/^xMat *= *(.*)(?=yMat)/ms and $toto=$1 and $toto=~s/[[:blank:]{}]\\+?//g and $toto=~s/,\\+?/ /g and print $toto' lenom" ); tmpfic.open("lenom"); #if 0 tmpfic>>ligne;//chaine Xvec cout<<"ligne xVec :"<<ligne<<endl; tmpfic>>ligne;// les coordonnées interessantes cout<<"ligne coordq :"<<ligne<<endl; dim=count(ligne.begin(),ligne.end(),'i')+1; xVec=new coeff[dim]; sol=new coeff[dim*dim]; i=0; int tmpindex; for(string::iterator iter=ligne.begin()+1;iter!=ligne.end(); iter=ligne.begin()+tmpindex+1) { stringstream tmpstr; cout<<"iter "<<iter-ligne.begin()<<endl; tmpindex=ligne.find(",",iter-ligne.begin()); if (tmpindex==string::npos) tmpindex=ligne.size()-1; cout<<"tmpindex "<<tmpindex<<endl; copy(iter,ligne.begin()+tmpindex,ostream_iterator<char>(tmpstr,"")); tmpstr>>ligne2; cout<<"eeeee "<<ligne2<<" "<<ligne.find(",",iter-ligne.begin())<<endl; tmpstr<<ligne2; tmpstr>>xVec[i++]; cout<<"i "<<i<<endl; } #endif //en theorie maintenant on a xVec #if 0 tmpfic>>ligne;//chaine xMat cout<<"ligne xmat :"<<ligne<<endl; tmpfic>>ligne;//chaine '{' for(i=0;i<dim;i++) { tmpfic>>ligne;// les coordonnées interessantes int j=0; for(string::iterator iter=ligne.begin()+ligne.find_last_of('{'); iter!=ligne.end(); iter=ligne.begin()+ligne.find(",",iter-ligne.begin())) { stringstream tmpstr; // copy(iter,ligne.begin()+ligne.find(',',iter-ligne.begin()) // ,ostream_iterator<char>(tmpstr,"")); int toto=ligne.find(",",iter-ligne.begin()); cout<<"ligne "<<ligne<<endl; cout<<"toto "<<toto<<" "<<string::npos<<endl; if(toto==string::npos) toto=ligne.size()-2; cout<<"toto "<<toto<<" "<<string::npos<<endl; tmpstr<<ligne.substr(iter-ligne.begin(),toto); tmpstr>>xMat[dim*j++ + i]; } } #endif //maintenant on a relu le xVec et le Xmat //Reconstruction de la solution sol=new coeff[dim*dim]; for(int i=0;i<dim*dim;i++) { tmpfic>>sol[i]; } tmpfic.close(); cout<<"Solution "<<endl; for(int i=0;i<dim*dim;i++) cout<<sol[i]<<" "; cout<<endl; // copy(sol,sol+dim*dim,ostream_iterator<string>(cout," ")); #if 0 for(int i=0;i<dim*dim;i++) sol[i]+=matmap[mon(1)][i]; matmap.erase(matmap.find(mon(1))); int j=0; for(typename typmatmap::iterator itermat=matmap.begin(); itermat!=matmap.end();itermat++) { for(int i=0;i<dim*dim;i++) sol[i]-=xVec[j]*itermat->second[i]; j++; } #endif } template<typename typP, typename typdump,typename Base, typename typserv> void generickernelsdpa(typP &newpol, int k, const typdump &dump, Base &b, typserv &serv) { typedef typename typP::value_type::order_t ord; typedef typename typserv::monom_t Monomial; // //Allocation du problem et des //contraintes COEFF * C; map<Monomial,COEFF*,ord> matrixmap; int i; // //On introduit un variable par monome de degre d en dehors de B //On va contruire l'operateur de de Hankel associé // // //On commence par enumerer les monomes de degre plus petit que k // // typP stockprod,stockproj;//dans stockprod on a des polynomes // // // int nbconstraint=0; typedef list<typename typserv::monom_t> typstock; list<typename typserv::monom_t> stockmon,stockksur2; map<mon,int,ord> mapintligne,mapintcolonne,maphankel; enumeratemon(stockmon,k,b,dump); // //ICI on cree un index pour le monomes de degre k //il n'a a priori rien a voir avec int2mon/mon2int du reste du code //sic..... enumeratemon(stockksur2,k/2,b,dump); // //pour le suite il nous faut les monomes de B de degre <=k/2 // for(typename list<typename typserv::monom_t>::iterator iter=stockksur2.begin(); iter!=stockksur2.end();iter++) if(!IsinB(*iter,b)) stockksur2.erase(iter--); i=1; for(typename list<typename typserv::monom_t>::iterator iter=stockksur2.begin();iter!=stockksur2.end();iter++,i++) { int j=1; for(typename list<typename typserv::monom_t>::iterator iter2=stockksur2.begin();iter2!=stockksur2.end();iter2++,j++) { typename typserv::monom_t mono=*iter * (*iter2); // cout<<"monome "<<mono<<" "<<i<<" "<<j<<endl; if (!mapintligne.count(mono)) { mapintligne[mono]=i; mapintcolonne[mono]=j; } } } //cout<<"passé"<<endl; // // On genere les formes normales des produits de monomes de // de tous les monomes de degre <=k/2 dez B. // int dim=stockksur2.size(); for(typename typstock::iterator i=stockmon.begin(); i!=stockmon.end();i++) if(IsinB(*i,b)) { cout<<"ici "<<*i<<" dim "<<dim<<endl; matrixmap[*i]=new COEFF [dim*dim]; for(int ii=0;ii<dim*dim;ii++) matrixmap[*i][ii]=0; } int ii=0; cout<<"coiucou"<<endl; for(typename typstock::iterator i=stockksur2.begin(); i!=stockksur2.end();i++,ii++) { int jj=ii; cout<<"coiucou"<<endl; for(typename typstock::iterator j=i;j!=stockksur2.end();jj++,j++) { typename typserv::monom_t tmpmon=(*j)*(*i); //cout<<"coiucoufffffff "<<tmpmon<<endl; if (IsinB(tmpmon,b)) { matrixmap[tmpmon][ii*dim+jj]+=1; if(ii!=jj) matrixmap[tmpmon][jj*dim+ii]+=1; } else { typP tmplist; tmplist.push_back(tmpmon); proj(tmplist,dump,b,serv); // cout<<"ici tmpmon "<<tmpmon<<endl; //cout<<"tmplist.front "<<tmplist.front()<<endl; for(typename typP::value_type::iterator iter=tmplist.front().begin(); iter!=tmplist.front().end();iter++) { Monomial verytmpmon=*iter; verytmpmon.SetCoeff(1); //cout<<"tmpmon "<<verytmpmon<<" "<<*iter<<endl; matrixmap[verytmpmon][ii*dim+jj]+=iter->GetCoeff(); if(ii!=jj) matrixmap[verytmpmon][jj*dim+ii]+=iter->GetCoeff(); } } } } if(dim>1) { struct timeval tvini, tvfin; COEFF *sol; static int d=0; static char nom[1024]; gettimeofday(&tvini,NULL); cout<<"coucou dim "<<dim<<endl; write_to_sdpa_fic(matrixmap,dim,serv,d); sprintf(nom,"sdpa_gmp -dd tmpfile_%d -o lenom",d++); system(nom); read_sol_from_sdpa(sol,matrixmap,dim,serv); gettimeofday(&tvfin,NULL); tempsCDSP+=tvfin.tv_sec-tvini.tv_sec+1e-6*(tvfin.tv_usec-tvini.tv_usec); // //cout<<"coiucou"<<endl; // A ce niveau la il faut verifier le rang // Le cas echeant recuperer le kernel // // cout<<"return code "<<return_code<<endl; long n=stockksur2.size(); COEFF *V=new COEFF[n*n]; COEFF *S=new COEFF[n]; COEFF *work=new COEFF[16*n]; long lwork=16*n,info; long kk=0;//servira pour le rang 0 dgesvd_((char*)"N",(char*)"A",&n,&n,sol, &n,S,(COEFF*)NULL,&n,V,&n,work,&lwork,&info); #if 1 cout<<"info svd "<<info<<endl; cout<<"val sing"<<endl; for(kk=0;kk<n;kk++) cout<<S[kk]<<" "; cout<<endl; #endif cout<<"coiucou"<<endl; for(kk=1;kk<n;kk++) //if(S[0]>S[k]*1e6) break;//MAGIC if((abs(S[kk-1])==0) ||(abs(S[kk-1])>abs(S[kk])*1e6)) break;//MAGIC #if 1 cout<<"kk ici "<<kk<<" et n "<<n<<endl; #endif for(int j=0;j<n;j++) { for(int jj=0;jj<n;jj++) cout<<V[n*(jj)+j]<<" "; cout<<endl; } // //On construit les nouvelles equations // for(;kk<(int)n;kk++) { #if 1 cout<<"equation dans le noyau"<<endl; #endif typedef typename typP::value_type polyalp; polyalp tmp(0); for(typename list<typename typserv::monom_t>::iterator iter=stockksur2.begin(); iter!=stockksur2.end();iter++) { //cout<<"dans construct eq "<<k<<" map "<<mapintcolonne[*iter]<<endl; //cout<<V[k+n*(mapintcolonne[*iter]-1)]<<" "<<*iter<<" "; if(!Iszero(abs(V[kk+n*(mapintcolonne[*iter]-1)]))) { // cout<<"tmp avant"<<endl<<tmp<<endl; //cout<<"ajout "<<endl<<polyalp(*iter*V[k+n*(mapintcolonne[*iter]-1)])<<endl; tmp+=polyalp(*iter*(COEFF)V[kk+n*(mapintcolonne[*iter]-1)]); //cout<<"tmp aapre"<<endl<<tmp<<endl; } //iter->first;// est le monome //iter->second;//est l'entier associé } // cout<<endl; cout<<"g trouve ca comme nvlle eq "<<endl<<tmp<<endl; newpol.push_back(tmp); } delete[] S; delete[] V; delete[] work; delete[] sol; } } template<typename typdump,typename Base, typename typserv> int testsdp(int k, const typdump &dump,const Base &b,const typserv &serv) { return !(k%2); } template<typename typP,typename typPk,typename typdump,typename Base , template<typename T> class tmptypmat ,typename monomial_server> void algo(typP P,typdump &dump,Base &b, monomial_server &serv) { #ifdef PEQUAN int toto=0; FILE *fic; char name[8]; #endif typedef typename typP::value_type polyalp; typedef list<typename typPk::value_type::monom_t> typMk; typedef typename typMk::value_type mon; typedef typename typPk::value_type pol; typMk Mk; typMk Spoldejavu; typPk Pk,S; //typP recall typPk recall; //Base b; workspace<typename typP::value_type::coeff_t> w; typedef tmptypmat<typename typP::value_type::coeff_t> typMat; typMat Mat,L; int onemoretime=1,nouveaumon,allpolused=0,maxdeg,k,*pr,*pc; cout<<"avant init"<<endl; init_algo<typMat>(P,nouveaumon,maxdeg,k,Pk,Mk,b,dump,w,serv); cout<<"apres init"<<endl; cout<<"onemoretime "<<onemoretime<<endl; cout<<"nouveaumon "<<nouveaumon<<endl; cout<<"k "<<k<<endl; cout<<"maxdeg "<<maxdeg<<endl; #ifndef GROEBNER // while((critere(b,k)==-1)||(k<=maxdeg)) #ifdef ONEMORETIME cout<<"one"<<endl; while(nouveaumon||(k<=maxdeg)||onemoretime) #else while(nouveaumon||(k<=maxdeg)) #endif #else while(!GB_stop(k)||(k<=maxdeg)) #endif { #ifdef ONEMORETIME cout<<"two"<<endl; cout<<"nouveaumon"<<endl; if(!nouveaumon) cout<<"si"<<endl; onemoretime=0; #endif //if (toto>=5) {exit(0);} //toto++; int killspol; //test si on est dans les conditions d'application gettimeofday(&initclock,NULL); cout<<"onemoretime "<<onemoretime<<endl; cout<<"nouveaumon"<<nouveaumon<< endl; cout<<"k "<<k<<endl; cout<<"maxdeg "<<maxdeg<<endl; cout<<"testsdp(k,dump,b,serv) "<<testsdp(k,dump,b,serv)<<endl; if(testsdp(k,dump,b,serv)||(!onemoretime)) //envoie la routine de calcul de sdp { int mindeg_newpol; typP newpol; cout<<"un nouveau tour de boucle et k vaut "<<k<<endl; if(!onemoretime)//sdpa!!!!!!!! // generickernel(newpol,2*k,dump,b,serv); generickernel_testT(newpol,2*k,dump,b,serv); // generickernelsdpa(newpol,2*k,dump,b,serv); else // generickernel(newpol,k,dump,b,serv); generickernel_testT(newpol,k,dump,b,serv); //generickernelsdpa(newpol,k,dump,b,serv); gettimeofday(&tmpclock,NULL); tempsdssdp+=tmpclock.tv_sec-initclock.tv_sec+1e-6*(tmpclock.tv_usec-initclock.tv_usec); //sdprealrad(newpol,dump,b,serv); //penser a decroitre k le cas echeant avec un coup de recover cout<<"newpol "<<newpol.empty()<<endl; if(!newpol.empty()) { mindeg_newpol=Degree(newpol.front()); // cout<<"mindeg "<<mindeg_newpol<<" k "<<k<<endl; for(typename typP::iterator iter=newpol.begin(); iter!=newpol.end();iter++) mindeg_newpol=(mindeg_newpol<Degree(*iter) ?mindeg_newpol:Degree(*iter)); for(typename typP::iterator iter=newpol.begin(); iter!=newpol.end();iter++) if(Degree(*iter)==mindeg_newpol) P.push_back(*iter); if(k>=mindeg_newpol) { list<mon *> exceed; list<int> sizeexceed; typPk tmpPk; conv_merge(tmpPk,newpol,exceed,sizeexceed,b,serv); // cout<<"merde merde k "<<k<<" mindeg_newpol "<<mindeg_newpol<<endl; k=mindeg_newpol; // forget(b,dump,k,recall); // recover(Pk,Mk,dump,k); recover(Pk,Mk,dump,k); //Listedejafait(Mk,Spoldejavu); // cout<<"Pk.size() apres recover "<<Pk.size()<<endl; if((k>0)||(k==-1)) forget(b,dump,k,recall); else forget0(b,dump,k,recall); // cout<<"forget fait"<<endl; //forget(b,dump,k); NewCrochetchoix(P,Pk,Mk,tmpPk,k,dump,b,recall,w,serv); serv.compress(Pk,dump,b,k); cout<<"compress"<<endl; Dump(Pk,dump); continue; } } } #ifdef BONRAJOUT for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } #endif #if 1//def DEB //cout<<"mon a la fin de la boulcle de l'algo "<<Mk.size()<<endl; //for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++) // cout<<*iter<<endl; cout<<"poly a la fin de la boulcle de l'algo "<<Pk.size()<<endl; for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) //cout<<"les sizes "<<iter->size<<endl; { int cpt=0; cout<<invconv<typename typP::value_type>(*iter,serv)<<endl; for(int i=0;i<iter->sizenf;i++) for(int j=0;j<8;j++) if (((iter->nfind[i]>>j)&1) && (iter->nf[cpt++]==0)) { cout<<"ici ca couille a la place"<<8*i+j<<endl; cout<<iter->sizenf<<" "<<iter->size<<endl; exit(1); } } #endif // cout<<"Spolordsup"<<endl; S=Spolordsup(Pk,b,Spoldejavu); //S.erase(S.begin(),S.end()); //S=Spolordsup(Pk,b); cout<<endl; cout<<endl<<"newpkmkmatrixof"<<endl; //cout<<"Pk.size() "<<Pk.size()<<endl; //killspol=!newPkMkMatrixof(Mat,Pk,P,Mk,k,b,dump,recall,Spoldejavu); killspol=!newPkMkMatrixof(Mat,Pk,P,Mk,k,b,dump,recall,w,serv); #ifdef PEQUAN sprintf(name,"mat%d",toto); fic=fopen(name,"w"); printmatfile_pequan(Mat,fic); fclose(fic); toto++; #endif // if (toto>=5) {cout<<"killredspol "<<killspol<<endl; exit(0);} // killspol=!newPkMkMatrixof(Mat,Pk,P,Mk,k,b,dump); if(killspol) S.erase(S.begin(),S.end()); if (k+1>=maxdeg) allpolused=1; if(Mk.size()==0) nouveaumon=0; //cout<<"j'en suis a k="<<k<<endl; //cout<<"Ici dans algo Mat"<<endl; //#ifdef BONRAJOUT //affdebug(Mat); //#endif //Solve affecte a Mat la valeur U //cout<<"solve"<<endl; //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) // cout<<"avant solve les ind "<<iter->ind<<endl; //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) // cout<<"avant solve les pol "<<invconv<Poly>(*iter)<<endl; //if(k==3) exit(-10); //for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++) // cout<<"monomes dans Mk "<<*iter<<endl; if (Mat.ncol!=0) { //cout<<"debut du solve"<<endl; Solve(Mat,L,Pk,&pr,&pc,w); // cout<<"fin du solve"<<endl; //for(int kk=0;kk<Mk.size();kk++) // cout<<"permc "<<kk<<" "<<pc[kk]<<endl; inverse(pc,Mk.size()); Dopermu(Mk,pc); { //ici on remet les ind a la bonne valuer //a inclure dans une petite fonction inline apres int j=0; typename typMk::iterator itermon=Mk.begin(); typename typPk::iterator iter; for(iter=Pk.begin(); itermon!=Mk.end();iter++,itermon++,j++) { if(!Iszero(Mat(j,j))) { // cout<<"ligne "<<j<<" je mets le monome "<<*itermon<<endl; iter->ind=*itermon*(iter->ind.GetCoeff()); } else { iter->ind=mon(0); } } //for(;itermon!=Mk.end();iter++,itermon++) // iter->ind=mon(0); } free(pr); free(pc); } //appliquer les permutation a MK!!!!!!!! // for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) // cout<<"apres solve les ind "<<iter->ind<<endl; //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) // cout<<"apres solve les pol "<<invconv<Poly>(*iter)<<endl; // // //APPLIQUER LES PERMUTYATIONS A MK!! // // // // if ((unsigned)my_rank(Mat)==Mk.size()) //matrice de rang plein { typMk tmpSpoldejavu; typPk redspol,secd=secondmembre(Mat,Pk);; //secondmembre2(Mat,Pk,secd); //typename typPk::iterator iter=Pk.begin(); cout<<"matrice de rang plein "<<endl; //for(unsigned int i=0;i<Mk.size();i++,iter++); //Pk.erase(iter,Pk.end()); //cout<<"Dump "<<endl; Dump(Pk,dump); //cout<<"Reduce Spol "<<endl; ReduceSpol(S,dump,redspol,b,w,serv);//tmpSpoldejavu); //cout<<"secd.size() "<<secd.size()<<endl; my_merge(redspol,secd); if(redspol.size()==0) { //a voir.... Dump(Pk,dump); k++; my_merge(Spoldejavu,tmpSpoldejavu); L.destroystore(); continue; //la matrice a rang plein //ET les Spol\secondmembre de ce niveau se ,reduisent a 0 } else { //on a des spol\secondmembre qui se reduisent pas a 0 //cad un defaut de commuatation int tmpdeg=mindeg(redspol,serv); max_degppcm=k+2; nouveaumon=1; cout<<"redspol.size() "<<redspol.size()<<endl; //cout<<invconv<typename typP::value_type>(redspol.front())<<endl; if (tmpdeg==(k+1)) my_merge(Spoldejavu,tmpSpoldejavu); k=tmpdeg; //cout<<"le mindeg ici vaut "<<k<<endl; //cout<<"Pk.size() avant recover "<<Pk.size()<<endl; recover(Pk,Mk,dump,k); //Listedejafait(Mk,Spoldejavu); //cout<<"Pk.size() apres recover "<<Pk.size()<<endl; forget(b,dump,k,recall); //forget(b,dump,k); #ifdef DEB cout<<"Pk.size() avant Crochetchoix "<<Pk.size()<<endl; #endif //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu); NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,w,serv); //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b); #ifdef DEB cout<<"Pk.size apres Crochetchoix "<<Pk.size()<<" et k "<<k<<endl; #endif NewDestroyredspol(redspol,Pk); serv.compress(Pk,dump,b,k); Dump(Pk,dump); L.destroystore(); //misa jour de B dans crochet choix!! continue; } } else //la matrice n'est pas de rang plein { cout<<"matrice de rang pas plein "<<endl; typPk secd; #ifdef BONRAJOUT AddB_dim(Mat,L,P,Pk,Mk,dump,b); #else AddB(Mat,Pk,Mk,dump,b,serv); #endif // //secondmembre supprime des trucs dans Pk!! // secd=secondmembre(Mat,Pk); rajoute_voisins(Pk,Mk,dump,b,w,serv); //ne selectionne que les non nuls if(secd.size()==0) { typPk redspol; //for(int i=Pk.size();i>rank(Mat);i--) //{ // if(Pk.back().size!=0) // MAC_REV_FREE<typename typMat::coeff_t>(Pk.rbegin()->nf // ,Pk.rbegin()->size*sizeof(typename typMat::coeff_t)); // Pk.pop_back(); //}//on vire les 0 avant de dumper // AddB(Mat,Pk,Mk,dump,b); Dump(Pk,dump); ReduceSpol(S,dump,redspol,b,w,serv);//,Spoldejavu); #ifdef NO_TWICE for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++) P.push_back(invconv<polyalp>(*iter)); #endif if(redspol.size()==0) { // forget(b,dump,k); //AddB(Mat,Pk,Mk,b); //Dump(Pk,dump); //ici on modifie Pk dans AddB //<=> forget(b,dump,k) AddB(..) Dump(Pk,dump); k++; L.destroystore(); continue; //la matrice a pas rang plein second membre =0 //ET les Spol de ce niveau se ,reduisent a 0 } else { //on a des spol qui se reduisent pas a 0 //cad un defaut de commutation k=mindeg(redspol,serv); recover(Pk,Mk,dump,k); //Listedejafait(Mk,Spoldejavu); forget(b,dump,k,recall); //forget(b,dump,k); cout<<"il ya un passage par mat rang pas" <<"plein et pol non zero"<<endl; //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu); NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,w,serv); //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b); NewDestroyredspol(redspol,Pk); serv.compress(Pk,dump,b,k); Dump(Pk,dump); L.destroystore(); continue; } } else { //on a des pol qui se reduisent pas a 0 //cad un defaut de commuatation dans les coins typPk redspol; //for(int i=Pk.size();i>rank(Mat);i--) // Pk.pop_back(); //cout<<"PK. size "<<Pk.size()<<" Mat.nbcol "<<Mat.ncol<<endl; //cout<<"rank(Mat) "<<rank(Mat)<<endl; //int j=0; //cout<<"avant recover et meme avant le dump "<<endl; //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() // ;iter++,j++) // cout<<"pol de secd num "<<j<<endl<<invconv<Poly>(*iter)<<endl; // AddB(Mat,Pk,Mk,b); //cout<<"apres ADDB le dump "<<endl; //for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; Dump(Pk,dump); //cout<<"secd.size()" <<secd.size()<<endl; ReduceSpol(S,dump,redspol,b,w,serv);//,Spoldejavu); my_merge(secd,redspol); #ifdef NO_TWICE for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++) P.push_back(invconv<polyalp>(*iter)); #endif k=mindeg(secd,serv); recover(Pk,Mk,dump,k); //cout<<"k "<<k<<endl; //Listedejafait(Mk,Spoldejavu); //cout<<"apres recover"<<endl; // for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; //cout<<"les Spol non reduits"<<endl; //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; forget(b,dump,k,recall); //forget(b,dump,k); //cout<<"il ya un passage par mat pas rang plein et Spol non zero"<<endl; //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu); NewCrochetchoix(P,Pk,Mk,secd,k,dump,b,recall,w,serv); //NewCrochetchoix(P,Pk,Mk,secd,k,dump,b); NewDestroyredspol(secd,Pk); #ifdef BONRAJOUT cout<<"Apres NewCrochetchoix"<<endl; for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } #endif //for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; serv.compress(Pk,dump,b,k); Dump(Pk,dump); L.destroystore(); continue; } } } Mat.destroystore(); //while nouveau mon etc... // Pk=recomposePk(dump); //return Pk; // return; #ifdef DEBUG for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } #endif destroy_space(&w); cout<<"sortie d'algo flash et dimension "<<endl;//<<critere(b,k)<<endl; return ;//dump; //comme ca on conserve le tri par degre des formes normales et //donc la construction des operateurs de multiplication se //fait plus vite.. :-) } template<typename typP,typename typPk,typename typdump,typename Base , template<typename T> class tmptypmat ,typename monomial_server> void algo(typP P,typdump &dump,Base &b, monomial_server &serv,typP F) { #ifdef PEQUAN int toto=0; FILE *fic; char name[8]; #endif typedef typename typP::value_type polyalp; typedef list<typename typPk::value_type::monom_t> typMk; typedef typename typMk::value_type mon; typedef typename typPk::value_type pol; cout<<"entra aqui "<<endl; typMk Mk; typMk Spoldejavu; typPk Pk,S; typPk recall; typP Pini; workspace<typename typP::value_type::coeff_t> w; typedef tmptypmat<typename typP::value_type::coeff_t> typMat; typMat Mat,L; int onemoretime=1,nouveaumon,allpolused=0,maxdeg,k,maxdegb,kb,*pr,*pc,optimo=0,k1; int nogap=0,deg=0,nok=1, noreduced=0, kbon,kini; typP newpol,newpol1; COEFF *sol2,*sol3; cout<<"avant init"<<endl; init_algo<typMat>(P,nouveaumon,maxdeg,k,Pk,Mk,b,dump,w,serv); Pini=P; kini=k; cout<<"apres init"<<endl; cout<<"onemoretime "<<onemoretime<<endl; cout<<"nouveaumon "<<nouveaumon<<endl; cout<<"k "<<k<<endl; cout<<"maxdeg "<<maxdeg<<endl; #ifndef GROEBNER #ifdef ONEMORETIME cout<<"one"<<endl; while(nouveaumon||(k<=maxdeg)||onemoretime) #else while(nouveaumon||(k<=maxdeg)|| (!optimo) || nok )//|| (k!=deg)) #endif #else while(!GB_stop(k)||(k<=maxdeg)) #endif { #ifdef ONEMORETIME cout<<"two"<<endl; cout<<"nouveaumon"<<endl; if(!nouveaumon) cout<<"si"<<endl; onemoretime=0; #endif int killspol; //test si on est dans les conditions d'application gettimeofday(&initclock,NULL); cout<<"onemoretime "<<onemoretime<<endl; cout<<"nouveaumon"<<nouveaumon<< endl; cout<<"k "<<k<<endl; cout<<"maxdeg "<<maxdeg<<endl; cout<<"testsdp(k,dump,b,serv) "<<testsdp(k,dump,b,serv)<<endl; for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } //todo este if es por ver si el noyau de k+1 se reduce con la base que hemos calculado o no //hay un problema en la reinicializacion de las variables cuando el noyau no se reduce cout<<"k"<<k<<endl; cout<<"maxdeg"<<maxdeg<<endl; cout<<"optimo"<<optimo<<endl; cout<<"nok"<<nok<<endl; // if(testsdp(k,dump,b,serv)||(!onemoretime)) if((testsdp(k,dump,b,serv) && (!optimo)) || (k==deg)) //envoie la routine de calcul de sdp { int mindeg_newpol; cout<<"un nouveau tour de boucle et k vaut "<<k<<endl; // if(!onemoretime)//sdpa!!!!!!!! // generickernel_testF(newpol,2*k,dump,b,serv,F,*&sol2); // else cout<<"deg"<<deg<<endl; if (nogap) { cout<<"sol3"<<k<<endl; cout<<"kbon"<<kbon<<endl; if (k==deg) { cout<<"pasas por aqui"<<endl; newpol1.erase(newpol1.begin(),newpol1.end()); // newpol=newpol1; for(typename typP::iterator iter=newpol.begin();iter!=newpol.end(); iter++) { cout<<*iter<<" "; cout<<endl; } } newpol1.erase(newpol1.begin(),newpol1.end()); //#ifdef CSDP // generickernel_testTT(newpol1,k,dump,b,serv,F,*&sol3); //#else generickernel_testF(newpol1,k,dump,b,serv,F,*&sol3); //#endif cout<<"solucionprimal k"<< sol2[2] << endl; cout<<"solucionprimal k+1"<< sol3[2] << endl; cout<<"diferenciasprimales"<<abs(sol2[2]-sol3[2])*1e+1<<endl; cout<<"k1"<<k1<<endl; cout<<"k"<<k<<endl; cout<<"gap"<<abs(sol3[2]-sol3[3])*1e+4<<endl; cout<<"deg"<<deg<<endl; cout<<"!newpol.empty()"<<!newpol.empty()<<endl; cout<<"newpol1.empty()"<<newpol1.empty()<<endl; if (((abs(sol2[2]-sol3[2])*1e+1<1) && (!newpol.empty()) && (k1!=k)) || ((k==deg)) ) // if ((abs(sol3[0])*1e+5<1) && (abs(sol2[2]-sol3[2])*1e+5<1) && (!newpol.empty()) && (k1!=k)) { if (k==deg && newpol1.empty()) { nok=0; continue; } else { if (k!=deg) { optimo=1; deg=k+2; cout<<"deg dentro"<<deg<<endl; int numkerf=0; cout<<"noyau bon"<<endl; for(typename typP::iterator iter=newpol.begin();iter!=newpol.end(); iter++,numkerf++) { cout<<*iter<<" "; cout<<endl; } mindeg_newpol=Degree(newpol.front()); cout<<"mindeg "<<mindeg_newpol<<" k1 "<<k1<<endl; for(typename typP::iterator iter=newpol.begin(); iter!=newpol.end();iter++) mindeg_newpol=(mindeg_newpol<Degree(*iter) ?mindeg_newpol:Degree(*iter)); cout<<"mindeg "<<mindeg_newpol<<" k1 "<<k1<<endl; } if (k==deg && (!newpol.empty())) { // for(typename typP::iterator iter=newpol1.begin(); // iter!=newpol1.end();iter++) // newpol.push_back(*iter); // for(typename typP::iterator iter=newpol.begin();iter!=newpol.end(); // iter++) // { // cout<<*iter<<"newpol2fois "; // cout<<endl; // } newpol.erase(newpol.begin(),newpol.end()); newpol=newpol1; mindeg_newpol=Degree(newpol.front()); cout<<"mindeg2fois"<<mindeg_newpol<<endl; } // nok=0; // for(typename typP::iterator iterP=P.begin(); // iterP!=P.end();iterP++) // newpol.push_back(*iterP); P.erase(P.begin(),P.end()); for(typename typP::iterator iter=newpol.begin(); iter!=newpol.end();iter++) if(Degree(*iter)==mindeg_newpol) P.push_back(*iter); if(k-2>=mindeg_newpol) { list<mon *> exceed; list<int> sizeexceed; typPk tmpPk; conv_merge(tmpPk,newpol,exceed,sizeexceed,b,serv); k=mindeg_newpol; // if (!nok) deg=0; // else deg=k*2; cout<<"k noyau bon"<< k<<endl; recover(Pk,Mk,dump,k); // cout<<"Pk.size() apres recover "<<Pk.size()<<endl; if (k!=deg) { if((k>0)||(k==-1)) forget(b,dump,k,recall); else forget0(b,dump,k,recall); } NewCrochetchoix(P,Pk,Mk,tmpPk,k,dump,b,recall,w,serv); for(typename typP::iterator iter=P.begin();iter!=P.end(); iter++) cout<<*iter<<" "; cout<<endl; serv.compress(Pk,dump,b,k); cout<<"compress"<<endl; Dump(Pk,dump); continue; } } } else { cout<<"pasa por aqui cambiamos"<<endl; sol2=sol3; newpol=newpol1; } } else { cout<<"sol2"<<k<<endl; k1=k; newpol.erase(newpol.begin(),newpol.end()); //#ifdef CSDP // generickernel_testTT(newpol,k,dump,b,serv,F,*&sol2); //#else generickernel_testF(newpol,k,dump,b,serv,F,*&sol2); //#endif int numker=0; for(typename typP::iterator iter=newpol.begin();iter!=newpol.end(); iter++,numker++) cout<<*iter<<" "; cout<<endl; cout<<"newpol "<<newpol.empty()<<endl; cout<<"numker"<<numker<<endl; //pour le case de polynome dans degree 2 if (k==2 && maxdeg==1) { nogap=1; optimo=1; nok=0; } else{ cout<<"gap"<<sol2[0]<<endl; cout<<"gapx"<<abs(sol2[0])*1e+4<<endl; if (abs(sol2[0])*1e+4<1){ nogap=1; for(typename typP::iterator iter=newpol.begin();iter!=newpol.end(); iter++,numker++) cout<<*iter<<" "; cout<<endl; cout<<"newpol "<<newpol.empty()<<endl; cout<<"numker"<<numker<<endl; } } } } #ifdef BONRAJOUT for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } #endif #ifdef DEB //cout<<"mon a la fin de la boulcle de l'algo "<<Mk.size()<<endl; //for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++) // cout<<*iter<<endl; cout<<"poly a la fin de la boulcle de l'algo "<<Pk.size()<<endl; for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) //cout<<"les sizes "<<iter->size<<endl; { int cpt=0; cout<<invconv<typename typP::value_type>(*iter)<<endl; for(int i=0;i<iter->sizenf;i++) for(int j=0;j<8;j++) if (((iter->nfind[i]>>j)&1) && (iter->nf[cpt++]==0)) { cout<<"ici ca couille a la place"<<8*i+j<<endl; cout<<iter->sizenf<<" "<<iter->size<<endl; exit(1); } } #endif S=Spolordsup(Pk,b,Spoldejavu); cout<<"newpkmkmatrixof"<<endl; cout<<"k"<<k<<endl; killspol=!newPkMkMatrixof(Mat,Pk,P,Mk,k,b,dump,recall,w,serv); #ifdef PEQUAN sprintf(name,"mat%d",toto); fic=fopen(name,"w"); printmatfile_pequan(Mat,fic); fclose(fic); toto++; #endif if(killspol) S.erase(S.begin(),S.end()); if (k+1>=maxdeg) allpolused=1; cout<<"Mk.size()"<<Mk.size()<<endl; if(Mk.size()==0) nouveaumon=0; //Solve affecte a Mat la valeur U //cout<<"solve"<<endl; for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) cout<<"avant solve les ind "<<iter->ind<<endl; for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++) cout<<"monomes dans Mk "<<*iter<<endl; cout<<"Mat.ncol"<<Mat.ncol<<endl; if (Mat.ncol!=0) { //cout<<"debut du solve"<<endl; Solve(Mat,L,Pk,&pr,&pc,w); // cout<<"fin du solve"<<endl; //for(int kk=0;kk<Mk.size();kk++) // cout<<"permc "<<kk<<" "<<pc[kk]<<endl; inverse(pc,Mk.size()); Dopermu(Mk,pc); { //ici on remet les ind a la bonne valuer //a inclure dans une petite fonction inline apres int j=0; typename typMk::iterator itermon=Mk.begin(); typename typPk::iterator iter; for(iter=Pk.begin(); itermon!=Mk.end();iter++,itermon++,j++) { if(!Iszero(Mat(j,j))) { // cout<<"ligne "<<j<<" je mets le monome "<<*itermon<<endl; iter->ind=*itermon*(iter->ind.GetCoeff()); } else { iter->ind=mon(0); } } //for(;itermon!=Mk.end();iter++,itermon++) // iter->ind=mon(0); } free(pr); free(pc); } //appliquer les permutation a MK!!!!!!!! // for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) // cout<<"apres solve les ind "<<iter->ind<<endl; //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) // cout<<"apres solve les pol "<<invconv<Poly>(*iter)<<endl; // // //APPLIQUER LES PERMUTYATIONS A MK!! // // // // if ((unsigned)my_rank(Mat)==Mk.size()) //matrice de rang plein { typMk tmpSpoldejavu; typPk redspol,secd=secondmembre(Mat,Pk);; cout<<"matrice de rang plein "<<endl; Dump(Pk,dump); cout<<"Reduce Spol "<<endl; ReduceSpol(S,dump,redspol,b,w,serv);//tmpSpoldejavu); cout<<"secd.size() "<<secd.size()<<endl; my_merge(redspol,secd); if(redspol.size()==0) { //a voir.... Dump(Pk,dump); k++; my_merge(Spoldejavu,tmpSpoldejavu); L.destroystore(); continue; //la matrice a rang plein //ET les Spol\secondmembre de ce niveau se ,reduisent a 0 } else { //on a des spol\secondmembre qui se reduisent pas a 0 //cad un defaut de commuatation int tmpdeg=mindeg(redspol,serv); max_degppcm=k+2; nouveaumon=1; cout<<"redspol.size() "<<redspol.size()<<endl; if (tmpdeg==(k+1)) my_merge(Spoldejavu,tmpSpoldejavu); k=tmpdeg; //cout<<"le mindeg ici vaut "<<k<<endl; //cout<<"Pk.size() avant recover "<<Pk.size()<<endl; recover(Pk,Mk,dump,k); //cout<<"Pk.size() apres recover "<<Pk.size()<<endl; forget(b,dump,k,recall); //forget(b,dump,k); #ifdef DEB cout<<"Pk.size() avant Crochetchoix "<<Pk.size()<<endl; #endif //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu); NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,w,serv); //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b); #ifdef DEB cout<<"Pk.size apres Crochetchoix "<<Pk.size()<<" et k "<<k<<endl; #endif NewDestroyredspol(redspol,Pk); serv.compress(Pk,dump,b,k); Dump(Pk,dump); L.destroystore(); cout<<"kaquiPini"<<k<<endl; //misa jour de B dans crochet choix!! continue; } } else //la matrice n'est pas de rang plein { cout<<"matrice de rang pas plein "<<endl; typPk secd; #ifdef BONRAJOUT AddB_dim(Mat,L,P,Pk,Mk,dump,b); #else AddB(Mat,Pk,Mk,dump,b,serv); #endif // //secondmembre supprime des trucs dans Pk!! // secd=secondmembre(Mat,Pk); rajoute_voisins(Pk,Mk,dump,b,w,serv); //ne selectionne que les non nuls if(secd.size()==0) { typPk redspol; Dump(Pk,dump); ReduceSpol(S,dump,redspol,b,w,serv); #ifdef NO_TWICE for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++) P.push_back(invconv<polyalp>(*iter)); #endif if(redspol.size()==0) { //ici on modifie Pk dans AddB //<=> forget(b,dump,k) AddB(..) Dump(Pk,dump); k++; L.destroystore(); continue; //la matrice a pas rang plein second membre =0 //ET les Spol de ce niveau se ,reduisent a 0 } else { //on a des spol qui se reduisent pas a 0 //cad un defaut de commutation k=mindeg(redspol,serv); recover(Pk,Mk,dump,k); //Listedejafait(Mk,Spoldejavu); forget(b,dump,k,recall); //forget(b,dump,k); cout<<"il ya un passage par mat rang pas" <<"plein et pol non zero"<<endl; //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu); NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,w,serv); //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b); NewDestroyredspol(redspol,Pk); serv.compress(Pk,dump,b,k); Dump(Pk,dump); L.destroystore(); continue; } } else { //on a des pol qui se reduisent pas a 0 //cad un defaut de commuatation dans les coins typPk redspol; //for(int i=Pk.size();i>rank(Mat);i--) // Pk.pop_back(); //cout<<"PK. size "<<Pk.size()<<" Mat.nbcol "<<Mat.ncol<<endl; //cout<<"rank(Mat) "<<rank(Mat)<<endl; //int j=0; //cout<<"avant recover et meme avant le dump "<<endl; //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() // ;iter++,j++) // cout<<"pol de secd num "<<j<<endl<<invconv<Poly>(*iter)<<endl; // AddB(Mat,Pk,Mk,b); //cout<<"apres ADDB le dump "<<endl; //for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; Dump(Pk,dump); //cout<<"secd.size()" <<secd.size()<<endl; ReduceSpol(S,dump,redspol,b,w,serv);//,Spoldejavu); my_merge(secd,redspol); #ifdef NO_TWICE for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++) P.push_back(invconv<polyalp>(*iter)); #endif k=mindeg(secd,serv); recover(Pk,Mk,dump,k); //cout<<"k "<<k<<endl; //Listedejafait(Mk,Spoldejavu); //cout<<"apres recover"<<endl; // for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; //cout<<"les Spol non reduits"<<endl; //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; forget(b,dump,k,recall); //forget(b,dump,k); //cout<<"il ya un passage par mat pas rang plein et Spol non zero"<<endl; //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu); NewCrochetchoix(P,Pk,Mk,secd,k,dump,b,recall,w,serv); //NewCrochetchoix(P,Pk,Mk,secd,k,dump,b); NewDestroyredspol(secd,Pk); #ifdef BONRAJOUT cout<<"Apres NewCrochetchoix"<<endl; for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } #endif //for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; serv.compress(Pk,dump,b,k); Dump(Pk,dump); L.destroystore(); continue; } } } Mat.destroystore(); #ifdef DEBUG for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } #endif destroy_space(&w); // delete[] &sol2; // delete[] &sol3; cout<<"sortie d'algo flash et dimension "<<endl;//<<critere(b,k)<<endl; cout<<"TPS SDP "<<tempsCDSP<<endl; return ;//dump; //comme ca on conserve le tri par degre des formes normales et //donc la construction des operateurs de multiplication se //fait plus vite.. :-) } #endif //ALREADY_corealgo3
2557  //
2558 
2559  //
2560  //On commence par enumerer les monomes de degre plus petit que k
2561  //
2562  //
2563  typP stockprod,stockproj;//dans stockprod on a des polynomes
2564  //
2565  //
2566  //
2567  int nbconstraint=0;
2568  list<typename typserv::monom_t> stockmon,stockksur2;
2569  map<mon,int,ord> mapintligne,mapintcolonne,maphankel;
2570  enumeratemon(stockmon,k,b,dump);
2571  //
2572  //ICI on cree un index pour le monomes de degre k
2573  //il n'a a priori rien a voir avec int2mon/mon2int du reste du code
2574  //sic.....
2575  enumeratemon(stockksur2,k/2,b,dump);
2576  //
2577  //pour le suite il nous faut les monomes de B de degre <=k/2
2578  //
2579 
2580  for(typename list<typename typserv::monom_t>::iterator
2581  iter=stockksur2.begin(); iter!=stockksur2.end();iter++)
2582  if(!IsinB(*iter,b)) stockksur2.erase(iter--);
2583 #ifdef DEBUGSDP
2584 cout<<"monome en degre k/2 "<<endl;
2585  for(typename list<typename typserv::monom_t>::iterator
2586  iter=stockksur2.begin(); iter!=stockksur2.end();iter++)
2587  cout<<*iter<<" ";
2588  cout<<endl;
2589 #endif
2590  i=1;
2591  for(typename list<typename typserv::monom_t>::iterator
2592  iter=stockksur2.begin();iter!=stockksur2.end();iter++,i++)
2593  {
2594  int j=1;
2595  for(typename list<typename typserv::monom_t>::iterator
2596  iter2=stockksur2.begin();iter2!=stockksur2.end();iter2++,j++)
2597  {
2598  typename typserv::monom_t mono=*iter * (*iter2);
2599 // cout<<"monome "<<mono<<" "<<i<<" "<<j<<endl;
2600  if (!mapintligne.count(mono))
2601  {
2602  mapintligne[mono]=i;
2603  mapintcolonne[mono]=j;
2604  }
2605  }
2606  }
2607  //cout<<"passé"<<endl;
2608 
2609  //
2610  // On genere les formes normales des produits de monomes de
2611  // de tous les monomes de degre <=k/2 dez B.
2612  //
2613 
2614  computeprod(stockprod,stockksur2,b,dump);
2615  stockproj=stockprod;
2616  proj(stockproj,dump,b,serv);
2617 
2618 #ifdef DEBUGSDP
2619  cout<<"produits "<<endl;
2620  for(typename typP::iterator iter=stockprod.begin();iter!=stockprod.end();
2621  iter++)
2622  cout<<*iter<<" ";
2623  cout<<endl;
2624  cout<<"proj "<<endl;
2625  for(typename typP::iterator iter=stockproj.begin();iter!=stockproj.end();
2626  iter++)
2627  cout<<*iter<<" ";
2628  cout<<endl;
2629 #endif
2630  //
2631  //
2632  //computerelations();//
2633  //
2634  //
2635  //
2636  //
2637  // §Ici on va avoir besoin d'une structure contenant un monome de tete
2638  // hors de B et sa forme normal
2639 
2640  for(typename typP::iterator iter=stockprod.begin();
2641  iter!=stockprod.end();iter++)
2642  if(!IsinB(*(iter->begin()),b))
2643  nbconstraint++;
2644 #ifndef NONEW
2645  constraints=new constraintmatrix<COEFF>[nbconstraint+1];
2646 #else
2647  constraints=(struct constraintmatrix<COEFF> *)
2648  malloc((nbconstraint+1)*sizeof(struct constraintmatrix<COEFF>));
2649  #endif
2650  /*
2651  *
2652  * Les indices partent de 1 pas de 0!
2653  *
2654  */
2655  //
2656  //On construit la liste des contraintes de la fin vers le debut
2657  //
2658  //Ca c la fin
2659  constraints[0].blocks=NULL;//not used dixit the manual
2660  //
2661  i=1;
2662  typename typP::iterator iterstockprod=stockprod.begin();
2663  for(typename typP::iterator iter=stockproj.begin();
2664  iter!=stockproj.end();iter++,iterstockprod++)
2665  {
2666  if(!IsinB(*(iterstockprod->begin()),b))
2667  {
2668  int k;
2669  int decal;
2670  //
2671  //On construit la liste des contraintes de la fin vers le debut
2672  //
2673  //Ca c la fin
2674  constraints[i].blocks=NULL;
2675  //
2676 #ifndef NONEW
2677  blockptr=new sparseblock<COEFF>[1];
2678 #else
2679  blockptr=(struct sparseblock<COEFF> *)malloc(sizeof(struct sparseblock<COEFF>));
2680 #endif
2681  blockptr->blocknum=1;//
2682  // ?????? relations.size()-i;
2683 #if 0
2684  blockptr->blocksize=stockksur2.size();
2685  blockptr->numentries=2*iter->size()+2;//pour l'ind
2686  decal=iter->size()+1;//pour l'ind
2687 #else
2688  blockptr->blocksize=stockksur2.size();
2689  blockptr->numentries=iter->size()+1;//pour l'ind
2690  decal=0;
2691 #endif
2692  blockptr->constraintnum=i;
2693  blockptr->next=NULL;
2694  blockptr->nextbyblock=NULL;
2695 #ifndef NONEW
2696  blockptr->entries=new COEFF[(blockptr->numentries+1)];
2697 #else
2698  blockptr->entries=(COEFF *)
2699  malloc((blockptr->numentries+1)*sizeof(COEFF));
2700 #endif
2701 #ifndef NOSHORTS
2702  blockptr->iindices=(short unsigned int *)
2703  malloc((blockptr->numentries+1)*sizeof(short unsigned int));
2704  blockptr->jindices=(short unsigned int *) malloc((blockptr->numentries+1)*sizeof(short unsigned int));
2705 #else
2706  blockptr->iindices=( int *)
2707  malloc((blockptr->numentries+1)*sizeof( int));
2708  blockptr->jindices=(int *) malloc((blockptr->numentries+1)*sizeof( int));
2709 #endif
2710 
2711  k=1;
2712 // cout<<" matrix contrainte "<<endl<<*iter<<endl;
2713  for(typename typP::value_type::iterator iterpol=iter->begin();
2714  iterpol!=iter->end();k++,iterpol++)
2715  {
2716  if(mapintligne[*iterpol]<mapintcolonne[*iterpol])
2717  {
2718  blockptr->iindices[k]=mapintligne[*iterpol];
2719  blockptr->jindices[k]=mapintcolonne[*iterpol];
2720  blockptr->entries[k]=((COEFF)-1)*iterpol->GetCoeff();
2721 // cout<<blockptr->iindices[k]<<" "<<blockptr->jindices[k]
2722 // <<" "<<blockptr->entries[k]<<endl;
2723  //
2724  }
2725  else
2726  {
2727  //blockptr->numentries--;
2728  //decal--;
2729  if (mapintligne[*iterpol]!=mapintcolonne[*iterpol] )
2730  {
2731  blockptr->jindices[k]=mapintligne[*iterpol];
2732  blockptr->iindices[k]=mapintcolonne[*iterpol];
2733  blockptr->entries[k]=((COEFF)-1)*iterpol->GetCoeff();
2734  }
2735  else
2736  {
2737  blockptr->jindices[k]=mapintligne[*iterpol];
2738  blockptr->iindices[k]=mapintcolonne[*iterpol];
2739  blockptr->entries[k]=((COEFF)-2)*iterpol->GetCoeff();
2740  }
2741  }
2742 
2743  }
2744 
2745 // cout<<"index en plus"<<endl;
2746  if(mapintligne[*(iterstockprod->begin())]<
2747  mapintcolonne[*(iterstockprod->begin())] )
2748  {
2749  blockptr->iindices[k]=mapintligne[*(iterstockprod->begin())];
2750  blockptr->jindices[k]=mapintcolonne[*(iterstockprod->begin())];
2751  blockptr->entries[k]=1;
2752 // cout<<blockptr->iindices[k]<<" "<<blockptr->jindices[k]
2753 // <<" "<<blockptr->entries[k]<<endl;
2754  }
2755  else
2756  {
2757  if (mapintligne[*(iterstockprod->begin())]!=
2758  mapintcolonne[*(iterstockprod->begin())])
2759  {
2760  blockptr->iindices[k]
2761  =mapintcolonne[*(iterstockprod->begin())];
2762 
2763  blockptr->jindices[k]
2764  =mapintligne[*(iterstockprod->begin())];
2765  blockptr->entries[k]=1;
2766 // cout<<"indices ici "<<mapintligne[*(iterstockprod->begin())]<<" "<<
2767 // mapintcolonne[*(iterstockprod->begin())]<<endl;
2768  }
2769  else
2770  {
2771  blockptr->iindices[k]=mapintligne[*(iterstockprod->begin())];
2772  blockptr->jindices[k]=mapintcolonne[*(iterstockprod->begin())];
2773  blockptr->entries[k]=2;
2774  }
2775  }
2776  /*
2777  * Insert block into the linked list of A1 blocks.
2778  */
2779  // blockptr->blocksize--;
2780  blockptr->next=NULL;
2781  //=constraints[i].blocks;
2782  constraints[i].blocks=blockptr;
2783 // cout<<"i "<<i<<" "<<stockprod.size()<<endl;
2784  i++;
2785 
2786  }
2787  }
2788  //
2789  // On donne les relations Hankel
2790  //
2791  //
2792  //
2793  //
2794  //
2795  //
2796  int nbhankelrel=0,i_counter=1,j_counter;
2797  for(typename list<typename typserv::monom_t>::iterator i=stockksur2.begin();
2798  i!=stockksur2.end();i++,i_counter++)
2799  {
2800  j_counter=1;
2801  for(typename list<typename typserv::monom_t>::iterator j=stockksur2.begin();
2802  j!=stockksur2.end();j++,j_counter++)
2803  if(!maphankel.count(*i * *j))
2804  {
2805  maphankel[*i * *j]=j_counter*stockksur2.size()+i_counter;
2806  }
2807  else
2808  if((maphankel[*i * *j]%stockksur2.size()!=j_counter)
2809  ||(maphankel[*i * *j]/stockksur2.size()!=i_counter))
2810  {
2811  int decal=0;
2812  nbhankelrel++;
2813 #ifndef NONEW
2814  constraintmatrix<COEFF> *tmpconstraints=new constraintmatrix<COEFF>[nbhankelrel+nbconstraint+1];
2815  for(int ii=0;ii<nbhankelrel+nbconstraint;ii++)
2816  tmpconstraints[ii]=constraints[ii];
2817  delete[] constraints;
2818  constraints=tmpconstraints;
2819  blockptr=new sparseblock<COEFF>[1];
2820 #else
2821  constraints=(struct constraintmatrix<COEFF> *)
2822  realloc(constraints,
2823  (nbhankelrel+nbconstraint+1)
2824  *sizeof(struct constraintmatrix<COEFF>));
2825 
2826  blockptr=(struct sparseblock<COEFF> *)malloc(sizeof(struct sparseblock<COEFF>));
2827 #endif
2828  blockptr->blocknum=1;//
2829  blockptr->blocksize=stockksur2.size();
2830 #if 0
2831  blockptr->numentries=4;
2832 #else
2833  blockptr->numentries=2;
2834 #endif
2835  blockptr->constraintnum=nbconstraint+nbhankelrel;
2836  blockptr->next=NULL;
2837  blockptr->nextbyblock=NULL;
2838 #ifndef NONEW
2839  blockptr->entries=new COEFF[(blockptr->numentries+1)];
2840 #else
2841  blockptr->entries=(COEFF *)
2842  malloc((blockptr->numentries+1)*sizeof(COEFF));
2843 #endif
2844 #ifndef NOSHORTS
2845  blockptr->iindices=(short unsigned int *) malloc((blockptr->numentries+1)*sizeof(short unsigned int));
2846  blockptr->jindices=(short unsigned int *) malloc((blockptr->numentries+1)*sizeof(short unsigned int));
2847 #else
2848  blockptr->iindices=(int *) malloc((blockptr->numentries+1)*sizeof(int));
2849  blockptr->jindices=(int *) malloc((blockptr->numentries+1)*sizeof(int));
2850 #endif
2851  //blockptr->numentries=blockptr->blocksize-1; //On a rajoute un avant
2852  if((maphankel[*i * *j]%stockksur2.size())<
2853  (maphankel[*i * *j]/stockksur2.size()))
2854  {
2855  blockptr->iindices[1]=maphankel[*i * *j]%stockksur2.size();
2856  blockptr->jindices[1]=maphankel[*i * *j]/stockksur2.size();
2857  blockptr->entries[1]=1;
2858  }
2859  else
2860  {
2861  if((maphankel[*i * *j]/stockksur2.size())!=
2862  (maphankel[*i * *j]%stockksur2.size()))
2863  {
2864  blockptr->jindices[1]=maphankel[*i * *j]%stockksur2.size();
2865  blockptr->iindices[1]=maphankel[*i * *j]/stockksur2.size();
2866  blockptr->entries[1]=1;
2867  }
2868  else
2869  {
2870  blockptr->jindices[1]=maphankel[*i * *j]%stockksur2.size();
2871  blockptr->iindices[1]=maphankel[*i * *j]/stockksur2.size();
2872  blockptr->entries[1]=2;
2873  }
2874 
2875  }
2876  if(i_counter<j_counter)
2877  {
2878  blockptr->iindices[2]=i_counter;
2879  blockptr->jindices[2]=j_counter;
2880  blockptr->entries[2]=-1;
2881  }
2882  else
2883  {
2884  if(i_counter!=j_counter)
2885  {
2886  blockptr->iindices[2]=j_counter;
2887  blockptr->jindices[2]=i_counter;
2888  blockptr->entries[2]=-1;
2889  }
2890  else
2891  {
2892  blockptr->iindices[2]=j_counter;
2893  blockptr->jindices[2]=i_counter;
2894  blockptr->entries[2]=-2;
2895  }
2896  }
2897 #if 0
2898  if((maphankel[*i * *j]/stockksur2.size())!=
2899  (maphankel[*i * *j]%stockksur2.size()))
2900  {
2901  blockptr->iindices[3]=maphankel[*i * *j]/stockksur2.size();
2902  blockptr->jindices[3]=maphankel[*i * *j]%stockksur2.size();;
2903  blockptr->entries[3]=1;
2904  }
2905  else
2906  {
2907  decal++;
2908  blockptr->numentries--;
2909  blockptr->entries[1]=2;
2910  }
2911 
2912  if(i_counter!=j_counter)
2913  {
2914  blockptr->iindices[4-decal]=j_counter;
2915  blockptr->jindices[4-decal]=i_counter;
2916  blockptr->entries[4-decal]=-1;
2917  }
2918  else
2919  {
2920  blockptr->numentries--;
2921  blockptr->entries[2]=-2;
2922 
2923  }
2924 #endif
2925 // cout<<"indice "<<maphankel[*i * *j]%stockksur2.size()
2926 // <<" "<<maphankel[*i * *j]/stockksur2.size()<<endl;
2927 // cout<<"indice "<<i_counter<<" "<<j_counter<<endl;
2928 // cout<<endl;
2929  // cout<<"indice "<<l<<" "<<1<<endl;
2930  //cout<<"indice "<<l-k<<" "<<k+1<<endl;
2931  /*
2932  * Insert block into the linked list of A1 blocks.
2933  */
2934 
2935  blockptr->next=NULL;//constraints[i].blocks;
2936  constraints[nbconstraint+nbhankelrel].blocks=blockptr;
2937 
2938 
2939  }
2940  }
2941  //
2942  //
2943  //
2944  // les relations de symetrie sont implicites X est recherche SDP
2945  // ONrajoute la contrainte sur le coeff en haut a gauche
2946  //
2947  //
2948  nbhankelrel++;
2949 #ifndef NONEW
2950  constraintmatrix<COEFF> *tmpconstraints=
2951  new constraintmatrix<COEFF>[(nbhankelrel+nbconstraint+1)];
2952  for(int ii=0;ii<nbhankelrel+nbconstraint;ii++)
2953  tmpconstraints[ii]=constraints[ii];
2954  delete [] constraints;
2955  constraints=tmpconstraints;
2956 #else
2957  constraints=(struct constraintmatrix<COEFF> *)
2958  realloc(constraints,
2959  (nbhankelrel+nbconstraint+1)
2960  *sizeof(struct constraintmatrix<COEFF>));
2961 #endif
2962 
2963  #ifndef NONEW
2964  blockptr=new sparseblock<COEFF>[1];
2965 #else
2966  blockptr=(struct sparseblock<COEFF> *)malloc(sizeof(struct sparseblock<COEFF>));
2967 #endif
2968  blockptr->blocknum=1;//
2969  blockptr->blocksize=stockksur2.size();
2970  blockptr->numentries=1;
2971  blockptr->constraintnum=nbconstraint+nbhankelrel;
2972  blockptr->next=NULL;
2973  blockptr->nextbyblock=NULL;
2974 #ifndef NONEW
2975  blockptr->entries=new COEFF[blockptr->numentries+1];
2976 #else
2977  blockptr->entries=(COEFF *)
2978  malloc((blockptr->numentries+1)*sizeof(COEFF));
2979 #endif
2980 #ifndef NOSHORTS
2981  blockptr->iindices=(short unsigned int *) malloc((blockptr->numentries+1)*sizeof(short unsigned int));
2982  blockptr->jindices=(short unsigned int *) malloc((blockptr->numentries+1)*sizeof(short unsigned int));
2983 #else
2984  blockptr->iindices=(int *) malloc((blockptr->numentries+1)*sizeof(int));
2985  blockptr->jindices=(int *) malloc((blockptr->numentries+1)*sizeof(int));
2986 #endif
2987  //blockptr->numentries=blockptr->blocksize-1; //On a rajoute un avant
2988 
2989  blockptr->iindices[1]=1;
2990  blockptr->jindices[1]=1;
2991  blockptr->entries[1]=1;
2992  blockptr->next=NULL;//constraints[i].blocks;
2993  constraints[nbconstraint+nbhankelrel].blocks=blockptr;
2994  //
2995  //On optimise la fonction "0" sous l es contraintes lineaires precedents
2996  //
2997  struct blockmatrix<COEFF> X,Z;
2998  COEFF *y;
2999  COEFF pobj,dobj;
3000  int tmpsize=(int)stockksur2.size();
3001 #ifndef NONEW
3002  bb=new COEFF[nbhankelrel+nbconstraint+1];
3003 #else
3004  bb=(COEFF *)malloc((nbhankelrel+nbconstraint+1)*sizeof(COEFF));
3005 #endif //oon a un block de 0
3006  C.nblocks=1;
3007 #ifndef NONEW
3008  C.blocks=new blockrec<COEFF>[2];
3009  #else
3010  C.blocks=(struct blockrec<COEFF> *)malloc(2*sizeof(struct blockrec<COEFF>));
3011 #endif
3012 #ifndef CCCCC
3013  C.blocks[1].blockcategory=MATRIX;
3014  C.blocks[1].blocksize=stockksur2.size();
3015 #ifndef NONEW
3016  C.blocks[1].data.mat=new COEFF[stockksur2.size()*stockksur2.size()+1];
3017 #else
3018  C.blocks[1].data.mat=(COEFF *)malloc(
3019  (stockksur2.size()*stockksur2.size()+1)*sizeof(COEFF));
3020 #endif
3021  for(int k=0;k<=(stockksur2.size()*stockksur2.size());k++)
3022  C.blocks[1].data.mat[k]=0;
3023  //
3024  C.blocks[1].data.mat[1]=0;
3025 #else
3026  C.blocks[1].blockcategory=DIAG;
3027  C.blocks[1].blocksize=stockksur2.size();
3028  C.blocks[1].data.vec=(COEFF *)malloc(
3029  (stockksur2.size()+1)*sizeof(COEFF));
3030  for(int k=0;k<=(stockksur2.size());k++)
3031  C.blocks[1].data.vec[k]=0;
3032 
3033 #endif
3034  for(i=0;i<=nbhankelrel+nbconstraint;i++)
3035  bb[i]=0;
3036  bb[nbconstraint+nbhankelrel]=(COEFF)1.;//on double qd on est sur la diagonale
3037  //cout<<"stockprod.size() "<<stockprod.size()<<endl;
3038  // cout<<"nbconstraint "<<nbconstraint<<endl;
3039  // cout<<"tmpsize "<<tmpsize<<endl;
3040  // cout<<"Affichage contraintes"<<endl;
3041  for(i=1;i<nbconstraint+nbhankelrel+1;i++)
3042  {
3043  // cout<<"le b associe "<<bb[i]<<endl;
3044  int tsize=constraints[i].blocks->blocksize;
3045  COEFF* tmp= new COEFF[tsize*tsize];
3046  // cout<<"taille "<<tsize<<endl;
3047  for(int j;j<tsize*tsize;j++)
3048  tmp[j]=0;
3049  for(int j=1;j<=constraints[i].blocks->numentries;j++)
3050  tmp[constraints[i].blocks->iindices[j]-tsize-1+
3051  constraints[i].blocks->jindices[j]*tsize]=
3052  constraints[i].blocks->entries[j];
3053 #ifdef DEBUGSDP
3054  for(int j=0;j<tsize;j++)
3055  {
3056  for(int jj=0;jj<tsize;jj++)
3057  cout<<tmp[tsize*(jj)+j]<<" ";
3058  cout<<endl;
3059  }
3060  cout<<endl;
3061 #endif
3062  }
3063  char nom[50];
3064  static int d=0;
3065  sprintf(nom,"ficprob_%d",d++);
3066  write_prob(nom,tmpsize,
3067  nbhankelrel+nbconstraint,C,bb,constraints);
3068  //Precision(53);
3069  cout<<"SDP of size : "<<stockksur2.size()<<"x"<<nbhankelrel+
3070  nbconstraint<<endl;
3071  initsoln(tmpsize,nbhankelrel+nbconstraint,
3072  C,bb,constraints,&X,&y,&Z);
3073  struct timeval tvini, tvfin;
3074  gettimeofday(&tvini,NULL);
3075  int return_code=easy_sdp((int)stockksur2.size(),nbhankelrel+
3076  nbconstraint,
3077  C,bb,constraints,(COEFF)(0.0),&X,&y,&Z,&pobj,&dobj);
3078  //Precision(350);
3079  gettimeofday(&tvfin,NULL);
3080  tempsCDSP+=tvfin.tv_sec-tvini.tv_sec+1e-6*(tvfin.tv_usec-tvini.tv_usec);
3081  // write_sol("prob.sol",tmpsize,nbhankelrel+nbconstraint,X,y,Z);
3082  //
3083  //
3084  //
3085  // A ce niveau la il faut verifier le rang
3086  // Le cas echeant recuperer le kernel
3087  //
3088  cout<<"pobj "<<pobj<<" dobj "<<dobj<<" diff "<<pobj-dobj<<endl;
3089 // cout<<"return code "<<return_code<<endl;
3090  if (1||return_code==8)//c le code de retour indiquant une singularite
3091  {
3092  long n=stockksur2.size();
3093  COEFF *matdense=new COEFF[n*n];
3094  COEFF *V=new COEFF[n*n];
3095  COEFF *S=new COEFF[n];
3096  COEFF *work=new COEFF[16*n];
3097  long lwork=16*n,info;
3098  long k=0;//servira pour le rang0
3099  for(int j=0;j<n*n;j++)
3100  matdense[j]=0;
3101  /*
3102  Warning !!!
3103  je ne traite pas les differetn cas des blocks de X
3104  il peuvent etre soit DIAG soit MATRIX
3105  soit PACKEDMATRIX (on peut s'en passez il y a invalid dasn writesol
3106  */
3107 
3108  //
3109  //on est pas de rang plein
3110  //
3111  //il faut calculer le noyau
3112  //
3113  //
3114 #ifdef DEBUGSDP
3115  for(int i=1;i<=nbconstraint+nbhankelrel;i++)
3116  cout<<"y "<<i<<" "<<y[i]<<endl;
3117  cout<<"nombre de blocks de X "<<X.nblocks<<endl;
3118 #endif
3119  for(int i=1;i<=X.nblocks;i++)
3120  {
3121  //Pour chque block il faut regarder son noyau
3122  struct blockrec<COEFF> tmp=X.blocks[i];
3123  //
3124  //On recopie le bloc en dense
3125  //
3126 #ifdef DEBUGSDP
3127  cout<<"n _________________________________ "<<n<<endl;
3128  cout<<"blockcat "<<tmp.blockcategory<<" "<<k<<endl;
3129 #endif
3130  switch(tmp.blockcategory)
3131  {
3132  case DIAG:
3133  for(int j=1;j<=tmp.blocksize;j++)
3134  matdense[n*(k+j-1)+(k+j-1)]=tmp.data.vec[j];
3135 #ifdef DEBUGSDP
3136  for(int j=1;j<=tmp.blocksize;j++)
3137  {
3138  for(int jj=1;jj<=tmp.blocksize;jj++)
3139  cout<<matdense[n*(k+jj-1)+j-1]<<" ";
3140  cout<<endl;
3141  }
3142  cout<<endl;
3143 #endif
3144  break;
3145  case MATRIX:
3146  for(int j=1;j<=tmp.blocksize;j++)
3147  for(int jj=1;jj<=tmp.blocksize;jj++)
3148  matdense[n*(k+jj-1)+j-1]=
3149  tmp.data.mat[tmp.blocksize*(jj-1)+j-1];
3150 #ifdef DEBUGSDP
3151  for(int j=1;j<=tmp.blocksize;j++)
3152  {
3153  for(int jj=1;jj<=tmp.blocksize;jj++)
3154  cout<<matdense[n*(k+jj-1)+j-1]<<" ";
3155  cout<<endl;
3156  }
3157 #endif
3158  }
3159  k+=tmp.blocksize;
3160 
3161  }
3162  //
3163  //On calcul le noyau
3164  //
3165  dgesvd_((char*)"N",(char*)"A",&n,&n,matdense,
3166  &n,S,(COEFF*)NULL,&n,V,&n,work,&lwork,&info);
3167 #if 1
3168  cout<<"info svd "<<info<<endl;
3169  cout<<"val singulieres "<<endl;
3170  for(k=0;k<n;k++)
3171  cout<<S[k]<<" ";
3172  cout<<endl;
3173 #endif
3174  for(k=1;k<n;k++)
3175  //if(S[0]>S[k]*1e6) break;//MAGIC
3176  if((abs(S[k-1])==0) || (abs(S[k-1])>abs(S[k])*1e6)) break;//MAGIC
3177  //#ifdef DEBUGSDP
3178  cout<<"----k ici "<<k<<" et n "<<n<<endl;
3179  //#endif
3180  for(int j=1;j<=n;j++)
3181  {
3182  for(int jj=1;jj<=n;jj++)
3183  cout<<V[n*(jj-1)+j-1]<<" ";
3184  cout<<endl;
3185  }
3186  //
3187  //On construit les nouvelles equations
3188  //
3189  for(;k<n;k++)
3190  {
3191 #ifdef DEBUGSDP
3192  cout<<"equation dans le noyau"<<endl;
3193 #endif
3194  typedef typename typP::value_type polyalp;
3195  polyalp tmp(0);
3196  for(typename list<typename typserv::monom_t>::iterator
3197  iter=stockksur2.begin();
3198  iter!=stockksur2.end();iter++)
3199  {
3200 
3201  //cout<<"dans construct eq "<<k<<" map "<<mapintcolonne[*iter]<<endl;
3202  //cout<<V[k+n*(mapintcolonne[*iter]-1)]<<" "<<*iter<<" ";
3203  if(!Iszero(abs(V[k+n*(mapintcolonne[*iter]-1)])))
3204 
3205  {
3206  // cout<<"tmp avant"<<endl<<tmp<<endl;
3207  //cout<<"ajout "<<endl<<polyalp(*iter*V[k+n*(mapintcolonne[*iter]-1)])<<endl;
3208  tmp+=polyalp(*iter*(COEFF)V[k+n*(mapintcolonne[*iter]-1)]);
3209  //cout<<"tmp aapre"<<endl<<tmp<<endl;
3210  }
3211  //iter->first;// est le monome
3212  //iter->second;//est l'entier associé } // cout<<endl; // cout<<"g trouve ca comme nvlle eq "<<endl<<tmp<<endl; newpol.push_back(tmp); } delete[] S; delete[] V; delete[] work; delete[] matdense; } for(int i=1;i<nbconstraint;i++) { free(constraints[i].blocks->iindices); free(constraints[i].blocks->jindices); delete [] constraints[i].blocks->entries; delete [] constraints[i].blocks; } delete [] constraints; delete [] bb; delete [] C.blocks[1].data.mat; delete [] C.blocks; // il faut desallouer les contraintes mieux (les matrices pointees //il faut desalluer C //Precision(53); //cout<<"en sortie "<<newpol.empty()<<endl; } #include"genekersdpa.hpp" template<typename typmatmap, typename typserv> void write_to_sdpa_fic(typmatmap &matrixmap, int &dim, typserv &serv, int d) { ofstream tmpfic; typename typserv::monom_t m(1); COEFF *tmpval=matrixmap[m]; char nomdufic[50]; sprintf(nomdufic,"tmpfile_%d",d); tmpfic.open(nomdufic); tmpfic<<setprecision(80); tmpfic<<"\" Ceci est un message \""<<endl; tmpfic<<matrixmap.size()-1<<" = mDIM"<<endl; tmpfic<<1<<" = nBLOCK"<<endl; tmpfic<<dim<<" = bLOCKsTRUCT"<<endl; tmpfic<<"{"; for(int i=0;i<((long)matrixmap.size())-2;i++) tmpfic<<"0,"; tmpfic<<"0}"<<endl; tmpfic<<"{"; for(int i=0;i<dim-1;i++) { tmpfic<<"{"; for(int j=0;j<dim-1;j++) { //cout<<(-1*matrixmap[m][i*dim+j])<<" "; tmpfic<<(COEFF)(-1*matrixmap[m][i*dim+j])<<","; } cout<<endl; tmpfic<<(COEFF)(-1*matrixmap[m][i*dim+dim-1])<<"},"; } tmpfic<<"{"; for(int j=0;j<dim-1;j++) tmpfic<<-1*matrixmap[m][(dim-1)*dim+j]<<","; tmpfic<<-1*matrixmap[m][dim*dim-1]<<"}}"<<endl; matrixmap.erase(matrixmap.find(m)); for(typename typmatmap::iterator itermat=matrixmap.begin(); itermat!=matrixmap.end();itermat++) { //cout<<"matrice de "<<itermat->first<<endl; COEFF *tt=itermat->second; tmpfic<<"{"; for(int i=0;i<dim-1;i++) { tmpfic<<"{"; for(int j=0;j<dim-1;j++) tmpfic<<tt[i*dim+j]<<","; tmpfic<<tt[i*dim+dim-1]<<"},"; } tmpfic<<"{"; for(int j=0;j<dim-1;j++) tmpfic<<tt[(dim-1)*dim+j]<<","; tmpfic<<tt[dim*dim-1]<<"}}"<<endl; } matrixmap[m]=tmpval; tmpfic.close(); } template<typename typmatmap, typename coeff, typename typserv> void read_sol_from_sdpa(coeff *&sol, typmatmap &matmap,int dim, typserv &serv) { typedef typename typserv::monom_t mon; ifstream tmpfic; string ligne,ligne2; typename string::iterator debut; int i; coeff *xVec,*xMat; stringstream tmpstr; system( "perl -i.bak -0777 -ne 'if (/^xMat *= *(.*)(?=yMat)/ms) {$toto=$1; $toto=~s/[[:blank:]{}]\\+?//g; $toto=~s/,\\+?/ /g; print $toto}' lenom" // "perl -0777 -i.bak -ne '/^xMat *= *(.*)(?=yMat)/ms and $toto=$1 and $toto=~s/[[:blank:]{}]\\+?//g and $toto=~s/,\\+?/ /g and print $toto' lenom" ); tmpfic.open("lenom"); #if 0 tmpfic>>ligne;//chaine Xvec cout<<"ligne xVec :"<<ligne<<endl; tmpfic>>ligne;// les coordonnées interessantes cout<<"ligne coordq :"<<ligne<<endl; dim=count(ligne.begin(),ligne.end(),'i')+1; xVec=new coeff[dim]; sol=new coeff[dim*dim]; i=0; int tmpindex; for(string::iterator iter=ligne.begin()+1;iter!=ligne.end(); iter=ligne.begin()+tmpindex+1) { stringstream tmpstr; cout<<"iter "<<iter-ligne.begin()<<endl; tmpindex=ligne.find(",",iter-ligne.begin()); if (tmpindex==string::npos) tmpindex=ligne.size()-1; cout<<"tmpindex "<<tmpindex<<endl; copy(iter,ligne.begin()+tmpindex,ostream_iterator<char>(tmpstr,"")); tmpstr>>ligne2; cout<<"eeeee "<<ligne2<<" "<<ligne.find(",",iter-ligne.begin())<<endl; tmpstr<<ligne2; tmpstr>>xVec[i++]; cout<<"i "<<i<<endl; } #endif //en theorie maintenant on a xVec #if 0 tmpfic>>ligne;//chaine xMat cout<<"ligne xmat :"<<ligne<<endl; tmpfic>>ligne;//chaine '{' for(i=0;i<dim;i++) { tmpfic>>ligne;// les coordonnées interessantes int j=0; for(string::iterator iter=ligne.begin()+ligne.find_last_of('{'); iter!=ligne.end(); iter=ligne.begin()+ligne.find(",",iter-ligne.begin())) { stringstream tmpstr; // copy(iter,ligne.begin()+ligne.find(',',iter-ligne.begin()) // ,ostream_iterator<char>(tmpstr,"")); int toto=ligne.find(",",iter-ligne.begin()); cout<<"ligne "<<ligne<<endl; cout<<"toto "<<toto<<" "<<string::npos<<endl; if(toto==string::npos) toto=ligne.size()-2; cout<<"toto "<<toto<<" "<<string::npos<<endl; tmpstr<<ligne.substr(iter-ligne.begin(),toto); tmpstr>>xMat[dim*j++ + i]; } } #endif //maintenant on a relu le xVec et le Xmat //Reconstruction de la solution sol=new coeff[dim*dim]; for(int i=0;i<dim*dim;i++) { tmpfic>>sol[i]; } tmpfic.close(); cout<<"Solution "<<endl; for(int i=0;i<dim*dim;i++) cout<<sol[i]<<" "; cout<<endl; // copy(sol,sol+dim*dim,ostream_iterator<string>(cout," ")); #if 0 for(int i=0;i<dim*dim;i++) sol[i]+=matmap[mon(1)][i]; matmap.erase(matmap.find(mon(1))); int j=0; for(typename typmatmap::iterator itermat=matmap.begin(); itermat!=matmap.end();itermat++) { for(int i=0;i<dim*dim;i++) sol[i]-=xVec[j]*itermat->second[i]; j++; } #endif } template<typename typP, typename typdump,typename Base, typename typserv> void generickernelsdpa(typP &newpol, int k, const typdump &dump, Base &b, typserv &serv) { typedef typename typP::value_type::order_t ord; typedef typename typserv::monom_t Monomial; // //Allocation du problem et des //contraintes COEFF * C; map<Monomial,COEFF*,ord> matrixmap; int i; // //On introduit un variable par monome de degre d en dehors de B //On va contruire l'operateur de de Hankel associé // // //On commence par enumerer les monomes de degre plus petit que k // // typP stockprod,stockproj;//dans stockprod on a des polynomes // // // int nbconstraint=0; typedef list<typename typserv::monom_t> typstock; list<typename typserv::monom_t> stockmon,stockksur2; map<mon,int,ord> mapintligne,mapintcolonne,maphankel; enumeratemon(stockmon,k,b,dump); // //ICI on cree un index pour le monomes de degre k //il n'a a priori rien a voir avec int2mon/mon2int du reste du code //sic..... enumeratemon(stockksur2,k/2,b,dump); // //pour le suite il nous faut les monomes de B de degre <=k/2 // for(typename list<typename typserv::monom_t>::iterator iter=stockksur2.begin(); iter!=stockksur2.end();iter++) if(!IsinB(*iter,b)) stockksur2.erase(iter--); i=1; for(typename list<typename typserv::monom_t>::iterator iter=stockksur2.begin();iter!=stockksur2.end();iter++,i++) { int j=1; for(typename list<typename typserv::monom_t>::iterator iter2=stockksur2.begin();iter2!=stockksur2.end();iter2++,j++) { typename typserv::monom_t mono=*iter * (*iter2); // cout<<"monome "<<mono<<" "<<i<<" "<<j<<endl; if (!mapintligne.count(mono)) { mapintligne[mono]=i; mapintcolonne[mono]=j; } } } //cout<<"passé"<<endl; // // On genere les formes normales des produits de monomes de // de tous les monomes de degre <=k/2 dez B. // int dim=stockksur2.size(); for(typename typstock::iterator i=stockmon.begin(); i!=stockmon.end();i++) if(IsinB(*i,b)) { cout<<"ici "<<*i<<" dim "<<dim<<endl; matrixmap[*i]=new COEFF [dim*dim]; for(int ii=0;ii<dim*dim;ii++) matrixmap[*i][ii]=0; } int ii=0; cout<<"coiucou"<<endl; for(typename typstock::iterator i=stockksur2.begin(); i!=stockksur2.end();i++,ii++) { int jj=ii; cout<<"coiucou"<<endl; for(typename typstock::iterator j=i;j!=stockksur2.end();jj++,j++) { typename typserv::monom_t tmpmon=(*j)*(*i); //cout<<"coiucoufffffff "<<tmpmon<<endl; if (IsinB(tmpmon,b)) { matrixmap[tmpmon][ii*dim+jj]+=1; if(ii!=jj) matrixmap[tmpmon][jj*dim+ii]+=1; } else { typP tmplist; tmplist.push_back(tmpmon); proj(tmplist,dump,b,serv); // cout<<"ici tmpmon "<<tmpmon<<endl; //cout<<"tmplist.front "<<tmplist.front()<<endl; for(typename typP::value_type::iterator iter=tmplist.front().begin(); iter!=tmplist.front().end();iter++) { Monomial verytmpmon=*iter; verytmpmon.SetCoeff(1); //cout<<"tmpmon "<<verytmpmon<<" "<<*iter<<endl; matrixmap[verytmpmon][ii*dim+jj]+=iter->GetCoeff(); if(ii!=jj) matrixmap[verytmpmon][jj*dim+ii]+=iter->GetCoeff(); } } } } if(dim>1) { struct timeval tvini, tvfin; COEFF *sol; static int d=0; static char nom[1024]; gettimeofday(&tvini,NULL); cout<<"coucou dim "<<dim<<endl; write_to_sdpa_fic(matrixmap,dim,serv,d); sprintf(nom,"sdpa_gmp -dd tmpfile_%d -o lenom",d++); system(nom); read_sol_from_sdpa(sol,matrixmap,dim,serv); gettimeofday(&tvfin,NULL); tempsCDSP+=tvfin.tv_sec-tvini.tv_sec+1e-6*(tvfin.tv_usec-tvini.tv_usec); // //cout<<"coiucou"<<endl; // A ce niveau la il faut verifier le rang // Le cas echeant recuperer le kernel // // cout<<"return code "<<return_code<<endl; long n=stockksur2.size(); COEFF *V=new COEFF[n*n]; COEFF *S=new COEFF[n]; COEFF *work=new COEFF[16*n]; long lwork=16*n,info; long kk=0;//servira pour le rang 0 dgesvd_((char*)"N",(char*)"A",&n,&n,sol, &n,S,(COEFF*)NULL,&n,V,&n,work,&lwork,&info); #if 1 cout<<"info svd "<<info<<endl; cout<<"val sing"<<endl; for(kk=0;kk<n;kk++) cout<<S[kk]<<" "; cout<<endl; #endif cout<<"coiucou"<<endl; for(kk=1;kk<n;kk++) //if(S[0]>S[k]*1e6) break;//MAGIC if((abs(S[kk-1])==0) ||(abs(S[kk-1])>abs(S[kk])*1e6)) break;//MAGIC #if 1 cout<<"kk ici "<<kk<<" et n "<<n<<endl; #endif for(int j=0;j<n;j++) { for(int jj=0;jj<n;jj++) cout<<V[n*(jj)+j]<<" "; cout<<endl; } // //On construit les nouvelles equations // for(;kk<(int)n;kk++) { #if 1 cout<<"equation dans le noyau"<<endl; #endif typedef typename typP::value_type polyalp; polyalp tmp(0); for(typename list<typename typserv::monom_t>::iterator iter=stockksur2.begin(); iter!=stockksur2.end();iter++) { //cout<<"dans construct eq "<<k<<" map "<<mapintcolonne[*iter]<<endl; //cout<<V[k+n*(mapintcolonne[*iter]-1)]<<" "<<*iter<<" "; if(!Iszero(abs(V[kk+n*(mapintcolonne[*iter]-1)]))) { // cout<<"tmp avant"<<endl<<tmp<<endl; //cout<<"ajout "<<endl<<polyalp(*iter*V[k+n*(mapintcolonne[*iter]-1)])<<endl; tmp+=polyalp(*iter*(COEFF)V[kk+n*(mapintcolonne[*iter]-1)]); //cout<<"tmp aapre"<<endl<<tmp<<endl; } //iter->first;// est le monome //iter->second;//est l'entier associé } // cout<<endl; cout<<"g trouve ca comme nvlle eq "<<endl<<tmp<<endl; newpol.push_back(tmp); } delete[] S; delete[] V; delete[] work; delete[] sol; } } template<typename typdump,typename Base, typename typserv> int testsdp(int k, const typdump &dump,const Base &b,const typserv &serv) { return !(k%2); } template<typename typP,typename typPk,typename typdump,typename Base , template<typename T> class tmptypmat ,typename monomial_server> void algo(typP P,typdump &dump,Base &b, monomial_server &serv) { #ifdef PEQUAN int toto=0; FILE *fic; char name[8]; #endif typedef typename typP::value_type polyalp; typedef list<typename typPk::value_type::monom_t> typMk; typedef typename typMk::value_type mon; typedef typename typPk::value_type pol; typMk Mk; typMk Spoldejavu; typPk Pk,S; //typP recall typPk recall; //Base b; workspace<typename typP::value_type::coeff_t> w; typedef tmptypmat<typename typP::value_type::coeff_t> typMat; typMat Mat,L; int onemoretime=1,nouveaumon,allpolused=0,maxdeg,k,*pr,*pc; cout<<"avant init"<<endl; init_algo<typMat>(P,nouveaumon,maxdeg,k,Pk,Mk,b,dump,w,serv); cout<<"apres init"<<endl; cout<<"onemoretime "<<onemoretime<<endl; cout<<"nouveaumon "<<nouveaumon<<endl; cout<<"k "<<k<<endl; cout<<"maxdeg "<<maxdeg<<endl; #ifndef GROEBNER // while((critere(b,k)==-1)||(k<=maxdeg)) #ifdef ONEMORETIME cout<<"one"<<endl; while(nouveaumon||(k<=maxdeg)||onemoretime) #else while(nouveaumon||(k<=maxdeg)) #endif #else while(!GB_stop(k)||(k<=maxdeg)) #endif { #ifdef ONEMORETIME cout<<"two"<<endl; cout<<"nouveaumon"<<endl; if(!nouveaumon) cout<<"si"<<endl; onemoretime=0; #endif //if (toto>=5) {exit(0);} //toto++; int killspol; //test si on est dans les conditions d'application gettimeofday(&initclock,NULL); cout<<"onemoretime "<<onemoretime<<endl; cout<<"nouveaumon"<<nouveaumon<< endl; cout<<"k "<<k<<endl; cout<<"maxdeg "<<maxdeg<<endl; cout<<"testsdp(k,dump,b,serv) "<<testsdp(k,dump,b,serv)<<endl; if(testsdp(k,dump,b,serv)||(!onemoretime)) //envoie la routine de calcul de sdp { int mindeg_newpol; typP newpol; cout<<"un nouveau tour de boucle et k vaut "<<k<<endl; if(!onemoretime)//sdpa!!!!!!!! // generickernel(newpol,2*k,dump,b,serv); generickernel_testT(newpol,2*k,dump,b,serv); // generickernelsdpa(newpol,2*k,dump,b,serv); else // generickernel(newpol,k,dump,b,serv); generickernel_testT(newpol,k,dump,b,serv); //generickernelsdpa(newpol,k,dump,b,serv); gettimeofday(&tmpclock,NULL); tempsdssdp+=tmpclock.tv_sec-initclock.tv_sec+1e-6*(tmpclock.tv_usec-initclock.tv_usec); //sdprealrad(newpol,dump,b,serv); //penser a decroitre k le cas echeant avec un coup de recover cout<<"newpol "<<newpol.empty()<<endl; if(!newpol.empty()) { mindeg_newpol=Degree(newpol.front()); // cout<<"mindeg "<<mindeg_newpol<<" k "<<k<<endl; for(typename typP::iterator iter=newpol.begin(); iter!=newpol.end();iter++) mindeg_newpol=(mindeg_newpol<Degree(*iter) ?mindeg_newpol:Degree(*iter)); for(typename typP::iterator iter=newpol.begin(); iter!=newpol.end();iter++) if(Degree(*iter)==mindeg_newpol) P.push_back(*iter); if(k>=mindeg_newpol) { list<mon *> exceed; list<int> sizeexceed; typPk tmpPk; conv_merge(tmpPk,newpol,exceed,sizeexceed,b,serv); // cout<<"merde merde k "<<k<<" mindeg_newpol "<<mindeg_newpol<<endl; k=mindeg_newpol; // forget(b,dump,k,recall); // recover(Pk,Mk,dump,k); recover(Pk,Mk,dump,k); //Listedejafait(Mk,Spoldejavu); // cout<<"Pk.size() apres recover "<<Pk.size()<<endl; if((k>0)||(k==-1)) forget(b,dump,k,recall); else forget0(b,dump,k,recall); // cout<<"forget fait"<<endl; //forget(b,dump,k); NewCrochetchoix(P,Pk,Mk,tmpPk,k,dump,b,recall,w,serv); serv.compress(Pk,dump,b,k); cout<<"compress"<<endl; Dump(Pk,dump); continue; } } } #ifdef BONRAJOUT for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } #endif #if 1//def DEB //cout<<"mon a la fin de la boulcle de l'algo "<<Mk.size()<<endl; //for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++) // cout<<*iter<<endl; cout<<"poly a la fin de la boulcle de l'algo "<<Pk.size()<<endl; for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) //cout<<"les sizes "<<iter->size<<endl; { int cpt=0; cout<<invconv<typename typP::value_type>(*iter,serv)<<endl; for(int i=0;i<iter->sizenf;i++) for(int j=0;j<8;j++) if (((iter->nfind[i]>>j)&1) && (iter->nf[cpt++]==0)) { cout<<"ici ca couille a la place"<<8*i+j<<endl; cout<<iter->sizenf<<" "<<iter->size<<endl; exit(1); } } #endif // cout<<"Spolordsup"<<endl; S=Spolordsup(Pk,b,Spoldejavu); //S.erase(S.begin(),S.end()); //S=Spolordsup(Pk,b); cout<<endl; cout<<endl<<"newpkmkmatrixof"<<endl; //cout<<"Pk.size() "<<Pk.size()<<endl; //killspol=!newPkMkMatrixof(Mat,Pk,P,Mk,k,b,dump,recall,Spoldejavu); killspol=!newPkMkMatrixof(Mat,Pk,P,Mk,k,b,dump,recall,w,serv); #ifdef PEQUAN sprintf(name,"mat%d",toto); fic=fopen(name,"w"); printmatfile_pequan(Mat,fic); fclose(fic); toto++; #endif // if (toto>=5) {cout<<"killredspol "<<killspol<<endl; exit(0);} // killspol=!newPkMkMatrixof(Mat,Pk,P,Mk,k,b,dump); if(killspol) S.erase(S.begin(),S.end()); if (k+1>=maxdeg) allpolused=1; if(Mk.size()==0) nouveaumon=0; //cout<<"j'en suis a k="<<k<<endl; //cout<<"Ici dans algo Mat"<<endl; //#ifdef BONRAJOUT //affdebug(Mat); //#endif //Solve affecte a Mat la valeur U //cout<<"solve"<<endl; //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) // cout<<"avant solve les ind "<<iter->ind<<endl; //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) // cout<<"avant solve les pol "<<invconv<Poly>(*iter)<<endl; //if(k==3) exit(-10); //for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++) // cout<<"monomes dans Mk "<<*iter<<endl; if (Mat.ncol!=0) { //cout<<"debut du solve"<<endl; Solve(Mat,L,Pk,&pr,&pc,w); // cout<<"fin du solve"<<endl; //for(int kk=0;kk<Mk.size();kk++) // cout<<"permc "<<kk<<" "<<pc[kk]<<endl; inverse(pc,Mk.size()); Dopermu(Mk,pc); { //ici on remet les ind a la bonne valuer //a inclure dans une petite fonction inline apres int j=0; typename typMk::iterator itermon=Mk.begin(); typename typPk::iterator iter; for(iter=Pk.begin(); itermon!=Mk.end();iter++,itermon++,j++) { if(!Iszero(Mat(j,j))) { // cout<<"ligne "<<j<<" je mets le monome "<<*itermon<<endl; iter->ind=*itermon*(iter->ind.GetCoeff()); } else { iter->ind=mon(0); } } //for(;itermon!=Mk.end();iter++,itermon++) // iter->ind=mon(0); } free(pr); free(pc); } //appliquer les permutation a MK!!!!!!!! // for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) // cout<<"apres solve les ind "<<iter->ind<<endl; //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) // cout<<"apres solve les pol "<<invconv<Poly>(*iter)<<endl; // // //APPLIQUER LES PERMUTYATIONS A MK!! // // // // if ((unsigned)my_rank(Mat)==Mk.size()) //matrice de rang plein { typMk tmpSpoldejavu; typPk redspol,secd=secondmembre(Mat,Pk);; //secondmembre2(Mat,Pk,secd); //typename typPk::iterator iter=Pk.begin(); cout<<"matrice de rang plein "<<endl; //for(unsigned int i=0;i<Mk.size();i++,iter++); //Pk.erase(iter,Pk.end()); //cout<<"Dump "<<endl; Dump(Pk,dump); //cout<<"Reduce Spol "<<endl; ReduceSpol(S,dump,redspol,b,w,serv);//tmpSpoldejavu); //cout<<"secd.size() "<<secd.size()<<endl; my_merge(redspol,secd); if(redspol.size()==0) { //a voir.... Dump(Pk,dump); k++; my_merge(Spoldejavu,tmpSpoldejavu); L.destroystore(); continue; //la matrice a rang plein //ET les Spol\secondmembre de ce niveau se ,reduisent a 0 } else { //on a des spol\secondmembre qui se reduisent pas a 0 //cad un defaut de commuatation int tmpdeg=mindeg(redspol,serv); max_degppcm=k+2; nouveaumon=1; cout<<"redspol.size() "<<redspol.size()<<endl; //cout<<invconv<typename typP::value_type>(redspol.front())<<endl; if (tmpdeg==(k+1)) my_merge(Spoldejavu,tmpSpoldejavu); k=tmpdeg; //cout<<"le mindeg ici vaut "<<k<<endl; //cout<<"Pk.size() avant recover "<<Pk.size()<<endl; recover(Pk,Mk,dump,k); //Listedejafait(Mk,Spoldejavu); //cout<<"Pk.size() apres recover "<<Pk.size()<<endl; forget(b,dump,k,recall); //forget(b,dump,k); #ifdef DEB cout<<"Pk.size() avant Crochetchoix "<<Pk.size()<<endl; #endif //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu); NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,w,serv); //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b); #ifdef DEB cout<<"Pk.size apres Crochetchoix "<<Pk.size()<<" et k "<<k<<endl; #endif NewDestroyredspol(redspol,Pk); serv.compress(Pk,dump,b,k); Dump(Pk,dump); L.destroystore(); //misa jour de B dans crochet choix!! continue; } } else //la matrice n'est pas de rang plein { cout<<"matrice de rang pas plein "<<endl; typPk secd; #ifdef BONRAJOUT AddB_dim(Mat,L,P,Pk,Mk,dump,b); #else AddB(Mat,Pk,Mk,dump,b,serv); #endif // //secondmembre supprime des trucs dans Pk!! // secd=secondmembre(Mat,Pk); rajoute_voisins(Pk,Mk,dump,b,w,serv); //ne selectionne que les non nuls if(secd.size()==0) { typPk redspol; //for(int i=Pk.size();i>rank(Mat);i--) //{ // if(Pk.back().size!=0) // MAC_REV_FREE<typename typMat::coeff_t>(Pk.rbegin()->nf // ,Pk.rbegin()->size*sizeof(typename typMat::coeff_t)); // Pk.pop_back(); //}//on vire les 0 avant de dumper // AddB(Mat,Pk,Mk,dump,b); Dump(Pk,dump); ReduceSpol(S,dump,redspol,b,w,serv);//,Spoldejavu); #ifdef NO_TWICE for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++) P.push_back(invconv<polyalp>(*iter)); #endif if(redspol.size()==0) { // forget(b,dump,k); //AddB(Mat,Pk,Mk,b); //Dump(Pk,dump); //ici on modifie Pk dans AddB //<=> forget(b,dump,k) AddB(..) Dump(Pk,dump); k++; L.destroystore(); continue; //la matrice a pas rang plein second membre =0 //ET les Spol de ce niveau se ,reduisent a 0 } else { //on a des spol qui se reduisent pas a 0 //cad un defaut de commutation k=mindeg(redspol,serv); recover(Pk,Mk,dump,k); //Listedejafait(Mk,Spoldejavu); forget(b,dump,k,recall); //forget(b,dump,k); cout<<"il ya un passage par mat rang pas" <<"plein et pol non zero"<<endl; //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu); NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,w,serv); //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b); NewDestroyredspol(redspol,Pk); serv.compress(Pk,dump,b,k); Dump(Pk,dump); L.destroystore(); continue; } } else { //on a des pol qui se reduisent pas a 0 //cad un defaut de commuatation dans les coins typPk redspol; //for(int i=Pk.size();i>rank(Mat);i--) // Pk.pop_back(); //cout<<"PK. size "<<Pk.size()<<" Mat.nbcol "<<Mat.ncol<<endl; //cout<<"rank(Mat) "<<rank(Mat)<<endl; //int j=0; //cout<<"avant recover et meme avant le dump "<<endl; //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() // ;iter++,j++) // cout<<"pol de secd num "<<j<<endl<<invconv<Poly>(*iter)<<endl; // AddB(Mat,Pk,Mk,b); //cout<<"apres ADDB le dump "<<endl; //for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; Dump(Pk,dump); //cout<<"secd.size()" <<secd.size()<<endl; ReduceSpol(S,dump,redspol,b,w,serv);//,Spoldejavu); my_merge(secd,redspol); #ifdef NO_TWICE for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++) P.push_back(invconv<polyalp>(*iter)); #endif k=mindeg(secd,serv); recover(Pk,Mk,dump,k); //cout<<"k "<<k<<endl; //Listedejafait(Mk,Spoldejavu); //cout<<"apres recover"<<endl; // for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; //cout<<"les Spol non reduits"<<endl; //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; forget(b,dump,k,recall); //forget(b,dump,k); //cout<<"il ya un passage par mat pas rang plein et Spol non zero"<<endl; //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu); NewCrochetchoix(P,Pk,Mk,secd,k,dump,b,recall,w,serv); //NewCrochetchoix(P,Pk,Mk,secd,k,dump,b); NewDestroyredspol(secd,Pk); #ifdef BONRAJOUT cout<<"Apres NewCrochetchoix"<<endl; for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } #endif //for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; serv.compress(Pk,dump,b,k); Dump(Pk,dump); L.destroystore(); continue; } } } Mat.destroystore(); //while nouveau mon etc... // Pk=recomposePk(dump); //return Pk; // return; #ifdef DEBUG for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } #endif destroy_space(&w); cout<<"sortie d'algo flash et dimension "<<endl;//<<critere(b,k)<<endl; return ;//dump; //comme ca on conserve le tri par degre des formes normales et //donc la construction des operateurs de multiplication se //fait plus vite.. :-) } template<typename typP,typename typPk,typename typdump,typename Base , template<typename T> class tmptypmat ,typename monomial_server> void algo(typP P,typdump &dump,Base &b, monomial_server &serv,typP F) { #ifdef PEQUAN int toto=0; FILE *fic; char name[8]; #endif typedef typename typP::value_type polyalp; typedef list<typename typPk::value_type::monom_t> typMk; typedef typename typMk::value_type mon; typedef typename typPk::value_type pol; cout<<"entra aqui "<<endl; typMk Mk; typMk Spoldejavu; typPk Pk,S; typPk recall; typP Pini; workspace<typename typP::value_type::coeff_t> w; typedef tmptypmat<typename typP::value_type::coeff_t> typMat; typMat Mat,L; int onemoretime=1,nouveaumon,allpolused=0,maxdeg,k,maxdegb,kb,*pr,*pc,optimo=0,k1; int nogap=0,deg=0,nok=1, noreduced=0, kbon,kini; typP newpol,newpol1; COEFF *sol2,*sol3; cout<<"avant init"<<endl; init_algo<typMat>(P,nouveaumon,maxdeg,k,Pk,Mk,b,dump,w,serv); Pini=P; kini=k; cout<<"apres init"<<endl; cout<<"onemoretime "<<onemoretime<<endl; cout<<"nouveaumon "<<nouveaumon<<endl; cout<<"k "<<k<<endl; cout<<"maxdeg "<<maxdeg<<endl; #ifndef GROEBNER #ifdef ONEMORETIME cout<<"one"<<endl; while(nouveaumon||(k<=maxdeg)||onemoretime) #else while(nouveaumon||(k<=maxdeg)|| (!optimo) || nok )//|| (k!=deg)) #endif #else while(!GB_stop(k)||(k<=maxdeg)) #endif { #ifdef ONEMORETIME cout<<"two"<<endl; cout<<"nouveaumon"<<endl; if(!nouveaumon) cout<<"si"<<endl; onemoretime=0; #endif int killspol; //test si on est dans les conditions d'application gettimeofday(&initclock,NULL); cout<<"onemoretime "<<onemoretime<<endl; cout<<"nouveaumon"<<nouveaumon<< endl; cout<<"k "<<k<<endl; cout<<"maxdeg "<<maxdeg<<endl; cout<<"testsdp(k,dump,b,serv) "<<testsdp(k,dump,b,serv)<<endl; for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } //todo este if es por ver si el noyau de k+1 se reduce con la base que hemos calculado o no //hay un problema en la reinicializacion de las variables cuando el noyau no se reduce cout<<"k"<<k<<endl; cout<<"maxdeg"<<maxdeg<<endl; cout<<"optimo"<<optimo<<endl; cout<<"nok"<<nok<<endl; // if(testsdp(k,dump,b,serv)||(!onemoretime)) if((testsdp(k,dump,b,serv) && (!optimo)) || (k==deg)) //envoie la routine de calcul de sdp { int mindeg_newpol; cout<<"un nouveau tour de boucle et k vaut "<<k<<endl; // if(!onemoretime)//sdpa!!!!!!!! // generickernel_testF(newpol,2*k,dump,b,serv,F,*&sol2); // else cout<<"deg"<<deg<<endl; if (nogap) { cout<<"sol3"<<k<<endl; cout<<"kbon"<<kbon<<endl; if (k==deg) { cout<<"pasas por aqui"<<endl; newpol1.erase(newpol1.begin(),newpol1.end()); // newpol=newpol1; for(typename typP::iterator iter=newpol.begin();iter!=newpol.end(); iter++) { cout<<*iter<<" "; cout<<endl; } } newpol1.erase(newpol1.begin(),newpol1.end()); //#ifdef CSDP // generickernel_testTT(newpol1,k,dump,b,serv,F,*&sol3); //#else generickernel_testF(newpol1,k,dump,b,serv,F,*&sol3); //#endif cout<<"solucionprimal k"<< sol2[2] << endl; cout<<"solucionprimal k+1"<< sol3[2] << endl; cout<<"diferenciasprimales"<<abs(sol2[2]-sol3[2])*1e+1<<endl; cout<<"k1"<<k1<<endl; cout<<"k"<<k<<endl; cout<<"gap"<<abs(sol3[2]-sol3[3])*1e+4<<endl; cout<<"deg"<<deg<<endl; cout<<"!newpol.empty()"<<!newpol.empty()<<endl; cout<<"newpol1.empty()"<<newpol1.empty()<<endl; if (((abs(sol2[2]-sol3[2])*1e+1<1) && (!newpol.empty()) && (k1!=k)) || ((k==deg)) ) // if ((abs(sol3[0])*1e+5<1) && (abs(sol2[2]-sol3[2])*1e+5<1) && (!newpol.empty()) && (k1!=k)) { if (k==deg && newpol1.empty()) { nok=0; continue; } else { if (k!=deg) { optimo=1; deg=k+2; cout<<"deg dentro"<<deg<<endl; int numkerf=0; cout<<"noyau bon"<<endl; for(typename typP::iterator iter=newpol.begin();iter!=newpol.end(); iter++,numkerf++) { cout<<*iter<<" "; cout<<endl; } mindeg_newpol=Degree(newpol.front()); cout<<"mindeg "<<mindeg_newpol<<" k1 "<<k1<<endl; for(typename typP::iterator iter=newpol.begin(); iter!=newpol.end();iter++) mindeg_newpol=(mindeg_newpol<Degree(*iter) ?mindeg_newpol:Degree(*iter)); cout<<"mindeg "<<mindeg_newpol<<" k1 "<<k1<<endl; } if (k==deg && (!newpol.empty())) { // for(typename typP::iterator iter=newpol1.begin(); // iter!=newpol1.end();iter++) // newpol.push_back(*iter); // for(typename typP::iterator iter=newpol.begin();iter!=newpol.end(); // iter++) // { // cout<<*iter<<"newpol2fois "; // cout<<endl; // } newpol.erase(newpol.begin(),newpol.end()); newpol=newpol1; mindeg_newpol=Degree(newpol.front()); cout<<"mindeg2fois"<<mindeg_newpol<<endl; } // nok=0; // for(typename typP::iterator iterP=P.begin(); // iterP!=P.end();iterP++) // newpol.push_back(*iterP); P.erase(P.begin(),P.end()); for(typename typP::iterator iter=newpol.begin(); iter!=newpol.end();iter++) if(Degree(*iter)==mindeg_newpol) P.push_back(*iter); if(k-2>=mindeg_newpol) { list<mon *> exceed; list<int> sizeexceed; typPk tmpPk; conv_merge(tmpPk,newpol,exceed,sizeexceed,b,serv); k=mindeg_newpol; // if (!nok) deg=0; // else deg=k*2; cout<<"k noyau bon"<< k<<endl; recover(Pk,Mk,dump,k); // cout<<"Pk.size() apres recover "<<Pk.size()<<endl; if (k!=deg) { if((k>0)||(k==-1)) forget(b,dump,k,recall); else forget0(b,dump,k,recall); } NewCrochetchoix(P,Pk,Mk,tmpPk,k,dump,b,recall,w,serv); for(typename typP::iterator iter=P.begin();iter!=P.end(); iter++) cout<<*iter<<" "; cout<<endl; serv.compress(Pk,dump,b,k); cout<<"compress"<<endl; Dump(Pk,dump); continue; } } } else { cout<<"pasa por aqui cambiamos"<<endl; sol2=sol3; newpol=newpol1; } } else { cout<<"sol2"<<k<<endl; k1=k; newpol.erase(newpol.begin(),newpol.end()); //#ifdef CSDP // generickernel_testTT(newpol,k,dump,b,serv,F,*&sol2); //#else generickernel_testF(newpol,k,dump,b,serv,F,*&sol2); //#endif int numker=0; for(typename typP::iterator iter=newpol.begin();iter!=newpol.end(); iter++,numker++) cout<<*iter<<" "; cout<<endl; cout<<"newpol "<<newpol.empty()<<endl; cout<<"numker"<<numker<<endl; //pour le case de polynome dans degree 2 if (k==2 && maxdeg==1) { nogap=1; optimo=1; nok=0; } else{ cout<<"gap"<<sol2[0]<<endl; cout<<"gapx"<<abs(sol2[0])*1e+4<<endl; if (abs(sol2[0])*1e+4<1){ nogap=1; for(typename typP::iterator iter=newpol.begin();iter!=newpol.end(); iter++,numker++) cout<<*iter<<" "; cout<<endl; cout<<"newpol "<<newpol.empty()<<endl; cout<<"numker"<<numker<<endl; } } } } #ifdef BONRAJOUT for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } #endif #ifdef DEB //cout<<"mon a la fin de la boulcle de l'algo "<<Mk.size()<<endl; //for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++) // cout<<*iter<<endl; cout<<"poly a la fin de la boulcle de l'algo "<<Pk.size()<<endl; for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) //cout<<"les sizes "<<iter->size<<endl; { int cpt=0; cout<<invconv<typename typP::value_type>(*iter)<<endl; for(int i=0;i<iter->sizenf;i++) for(int j=0;j<8;j++) if (((iter->nfind[i]>>j)&1) && (iter->nf[cpt++]==0)) { cout<<"ici ca couille a la place"<<8*i+j<<endl; cout<<iter->sizenf<<" "<<iter->size<<endl; exit(1); } } #endif S=Spolordsup(Pk,b,Spoldejavu); cout<<"newpkmkmatrixof"<<endl; cout<<"k"<<k<<endl; killspol=!newPkMkMatrixof(Mat,Pk,P,Mk,k,b,dump,recall,w,serv); #ifdef PEQUAN sprintf(name,"mat%d",toto); fic=fopen(name,"w"); printmatfile_pequan(Mat,fic); fclose(fic); toto++; #endif if(killspol) S.erase(S.begin(),S.end()); if (k+1>=maxdeg) allpolused=1; cout<<"Mk.size()"<<Mk.size()<<endl; if(Mk.size()==0) nouveaumon=0; //Solve affecte a Mat la valeur U //cout<<"solve"<<endl; for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) cout<<"avant solve les ind "<<iter->ind<<endl; for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++) cout<<"monomes dans Mk "<<*iter<<endl; cout<<"Mat.ncol"<<Mat.ncol<<endl; if (Mat.ncol!=0) { //cout<<"debut du solve"<<endl; Solve(Mat,L,Pk,&pr,&pc,w); // cout<<"fin du solve"<<endl; //for(int kk=0;kk<Mk.size();kk++) // cout<<"permc "<<kk<<" "<<pc[kk]<<endl; inverse(pc,Mk.size()); Dopermu(Mk,pc); { //ici on remet les ind a la bonne valuer //a inclure dans une petite fonction inline apres int j=0; typename typMk::iterator itermon=Mk.begin(); typename typPk::iterator iter; for(iter=Pk.begin(); itermon!=Mk.end();iter++,itermon++,j++) { if(!Iszero(Mat(j,j))) { // cout<<"ligne "<<j<<" je mets le monome "<<*itermon<<endl; iter->ind=*itermon*(iter->ind.GetCoeff()); } else { iter->ind=mon(0); } } //for(;itermon!=Mk.end();iter++,itermon++) // iter->ind=mon(0); } free(pr); free(pc); } //appliquer les permutation a MK!!!!!!!! // for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) // cout<<"apres solve les ind "<<iter->ind<<endl; //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) // cout<<"apres solve les pol "<<invconv<Poly>(*iter)<<endl; // // //APPLIQUER LES PERMUTYATIONS A MK!! // // // // if ((unsigned)my_rank(Mat)==Mk.size()) //matrice de rang plein { typMk tmpSpoldejavu; typPk redspol,secd=secondmembre(Mat,Pk);; cout<<"matrice de rang plein "<<endl; Dump(Pk,dump); cout<<"Reduce Spol "<<endl; ReduceSpol(S,dump,redspol,b,w,serv);//tmpSpoldejavu); cout<<"secd.size() "<<secd.size()<<endl; my_merge(redspol,secd); if(redspol.size()==0) { //a voir.... Dump(Pk,dump); k++; my_merge(Spoldejavu,tmpSpoldejavu); L.destroystore(); continue; //la matrice a rang plein //ET les Spol\secondmembre de ce niveau se ,reduisent a 0 } else { //on a des spol\secondmembre qui se reduisent pas a 0 //cad un defaut de commuatation int tmpdeg=mindeg(redspol,serv); max_degppcm=k+2; nouveaumon=1; cout<<"redspol.size() "<<redspol.size()<<endl; if (tmpdeg==(k+1)) my_merge(Spoldejavu,tmpSpoldejavu); k=tmpdeg; //cout<<"le mindeg ici vaut "<<k<<endl; //cout<<"Pk.size() avant recover "<<Pk.size()<<endl; recover(Pk,Mk,dump,k); //cout<<"Pk.size() apres recover "<<Pk.size()<<endl; forget(b,dump,k,recall); //forget(b,dump,k); #ifdef DEB cout<<"Pk.size() avant Crochetchoix "<<Pk.size()<<endl; #endif //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu); NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,w,serv); //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b); #ifdef DEB cout<<"Pk.size apres Crochetchoix "<<Pk.size()<<" et k "<<k<<endl; #endif NewDestroyredspol(redspol,Pk); serv.compress(Pk,dump,b,k); Dump(Pk,dump); L.destroystore(); cout<<"kaquiPini"<<k<<endl; //misa jour de B dans crochet choix!! continue; } } else //la matrice n'est pas de rang plein { cout<<"matrice de rang pas plein "<<endl; typPk secd; #ifdef BONRAJOUT AddB_dim(Mat,L,P,Pk,Mk,dump,b); #else AddB(Mat,Pk,Mk,dump,b,serv); #endif // //secondmembre supprime des trucs dans Pk!! // secd=secondmembre(Mat,Pk); rajoute_voisins(Pk,Mk,dump,b,w,serv); //ne selectionne que les non nuls if(secd.size()==0) { typPk redspol; Dump(Pk,dump); ReduceSpol(S,dump,redspol,b,w,serv); #ifdef NO_TWICE for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++) P.push_back(invconv<polyalp>(*iter)); #endif if(redspol.size()==0) { //ici on modifie Pk dans AddB //<=> forget(b,dump,k) AddB(..) Dump(Pk,dump); k++; L.destroystore(); continue; //la matrice a pas rang plein second membre =0 //ET les Spol de ce niveau se ,reduisent a 0 } else { //on a des spol qui se reduisent pas a 0 //cad un defaut de commutation k=mindeg(redspol,serv); recover(Pk,Mk,dump,k); //Listedejafait(Mk,Spoldejavu); forget(b,dump,k,recall); //forget(b,dump,k); cout<<"il ya un passage par mat rang pas" <<"plein et pol non zero"<<endl; //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu); NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,w,serv); //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b); NewDestroyredspol(redspol,Pk); serv.compress(Pk,dump,b,k); Dump(Pk,dump); L.destroystore(); continue; } } else { //on a des pol qui se reduisent pas a 0 //cad un defaut de commuatation dans les coins typPk redspol; //for(int i=Pk.size();i>rank(Mat);i--) // Pk.pop_back(); //cout<<"PK. size "<<Pk.size()<<" Mat.nbcol "<<Mat.ncol<<endl; //cout<<"rank(Mat) "<<rank(Mat)<<endl; //int j=0; //cout<<"avant recover et meme avant le dump "<<endl; //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() // ;iter++,j++) // cout<<"pol de secd num "<<j<<endl<<invconv<Poly>(*iter)<<endl; // AddB(Mat,Pk,Mk,b); //cout<<"apres ADDB le dump "<<endl; //for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; Dump(Pk,dump); //cout<<"secd.size()" <<secd.size()<<endl; ReduceSpol(S,dump,redspol,b,w,serv);//,Spoldejavu); my_merge(secd,redspol); #ifdef NO_TWICE for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++) P.push_back(invconv<polyalp>(*iter)); #endif k=mindeg(secd,serv); recover(Pk,Mk,dump,k); //cout<<"k "<<k<<endl; //Listedejafait(Mk,Spoldejavu); //cout<<"apres recover"<<endl; // for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; //cout<<"les Spol non reduits"<<endl; //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; forget(b,dump,k,recall); //forget(b,dump,k); //cout<<"il ya un passage par mat pas rang plein et Spol non zero"<<endl; //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu); NewCrochetchoix(P,Pk,Mk,secd,k,dump,b,recall,w,serv); //NewCrochetchoix(P,Pk,Mk,secd,k,dump,b); NewDestroyredspol(secd,Pk); #ifdef BONRAJOUT cout<<"Apres NewCrochetchoix"<<endl; for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } #endif //for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; serv.compress(Pk,dump,b,k); Dump(Pk,dump); L.destroystore(); continue; } } } Mat.destroystore(); #ifdef DEBUG for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } #endif destroy_space(&w); // delete[] &sol2; // delete[] &sol3; cout<<"sortie d'algo flash et dimension "<<endl;//<<critere(b,k)<<endl; cout<<"TPS SDP "<<tempsCDSP<<endl; return ;//dump; //comme ca on conserve le tri par degre des formes normales et //donc la construction des operateurs de multiplication se //fait plus vite.. :-) } #endif //ALREADY_corealgo3
3213  }
3214 // cout<<endl;
3215 // cout<<"g trouve ca comme nvlle eq "<<endl<<tmp<<endl;
3216  newpol.push_back(tmp);
3217 
3218  }
3219  delete[] S;
3220  delete[] V;
3221  delete[] work;
3222  delete[] matdense;
3223  }
3224  for(int i=1;i<nbconstraint;i++)
3225  {
3226  free(constraints[i].blocks->iindices);
3227  free(constraints[i].blocks->jindices);
3228  delete [] constraints[i].blocks->entries;
3229  delete [] constraints[i].blocks;
3230  }
3231  delete [] constraints;
3232  delete [] bb;
3233  delete [] C.blocks[1].data.mat;
3234  delete [] C.blocks;
3235  // il faut desallouer les contraintes mieux (les matrices pointees
3236  //il faut desalluer C
3237  //Precision(53);
3238  //cout<<"en sortie "<<newpol.empty()<<endl;
3239 }
3240 
3241 #include"genekersdpa.hpp"
3242 
3243 template<typename typmatmap, typename typserv>
3244 void write_to_sdpa_fic(typmatmap &matrixmap, int &dim, typserv &serv,
3245  int d)
3246 {
3247  ofstream tmpfic;
3248  typename typserv::monom_t m(1);
3249  COEFF *tmpval=matrixmap[m];
3250  char nomdufic[50];
3251  sprintf(nomdufic,"tmpfile_%d",d);
3252  tmpfic.open(nomdufic);
3253  tmpfic<<setprecision(80);
3254  tmpfic<<"\" Ceci est un message \""<<endl;
3255  tmpfic<<matrixmap.size()-1<<" = mDIM"<<endl;
3256  tmpfic<<1<<" = nBLOCK"<<endl;
3257  tmpfic<<dim<<" = bLOCKsTRUCT"<<endl;
3258  tmpfic<<"{";
3259  for(int i=0;i<((long)matrixmap.size())-2;i++)
3260  tmpfic<<"0,";
3261  tmpfic<<"0}"<<endl;
3262  tmpfic<<"{";
3263  for(int i=0;i<dim-1;i++)
3264  {
3265  tmpfic<<"{";
3266  for(int j=0;j<dim-1;j++)
3267  {
3268  //cout<<(-1*matrixmap[m][i*dim+j])<<" ";
3269  tmpfic<<(COEFF)(-1*matrixmap[m][i*dim+j])<<",";
3270  }
3271  cout<<endl;
3272  tmpfic<<(COEFF)(-1*matrixmap[m][i*dim+dim-1])<<"},";
3273  }
3274  tmpfic<<"{";
3275 
3276  for(int j=0;j<dim-1;j++)
3277  tmpfic<<-1*matrixmap[m][(dim-1)*dim+j]<<",";
3278  tmpfic<<-1*matrixmap[m][dim*dim-1]<<"}}"<<endl;
3279 
3280  matrixmap.erase(matrixmap.find(m));
3281  for(typename typmatmap::iterator itermat=matrixmap.begin();
3282  itermat!=matrixmap.end();itermat++)
3283  {
3284  //cout<<"matrice de "<<itermat->first<<endl;
3285  COEFF *tt=itermat->second;
3286  tmpfic<<"{";
3287  for(int i=0;i<dim-1;i++)
3288  {
3289  tmpfic<<"{";
3290  for(int j=0;j<dim-1;j++)
3291  tmpfic<<tt[i*dim+j]<<",";
3292  tmpfic<<tt[i*dim+dim-1]<<"},";
3293  }
3294  tmpfic<<"{";
3295 
3296  for(int j=0;j<dim-1;j++)
3297  tmpfic<<tt[(dim-1)*dim+j]<<",";
3298  tmpfic<<tt[dim*dim-1]<<"}}"<<endl;
3299 
3300  }
3301  matrixmap[m]=tmpval;
3302  tmpfic.close();
3303 }
3304 
3305 template<typename typmatmap, typename coeff, typename typserv>
3306 void read_sol_from_sdpa(coeff *&sol, typmatmap &matmap,int dim, typserv &serv)
3307 {
3308  typedef typename typserv::monom_t mon;
3309  ifstream tmpfic;
3310  string ligne,ligne2;
3311  typename string::iterator debut;
3312  int i;
3313  coeff *xVec,*xMat;
3314  stringstream tmpstr;
3315  system(
3316  "perl -i.bak -0777 -ne 'if (/^xMat *= *(.*)(?=yMat)/ms) {$toto=$1; $toto=~s/[[:blank:]{}]\\+?//g; $toto=~s/,\\+?/ /g; print $toto}' lenom" // "perl -0777 -i.bak -ne '/^xMat *= *(.*)(?=yMat)/ms and $toto=$1 and $toto=~s/[[:blank:]{}]\\+?//g and $toto=~s/,\\+?/ /g and print $toto' lenom"
3317  );
3318  tmpfic.open("lenom");
3319 #if 0
3320  tmpfic>>ligne;//chaine Xvec
3321  cout<<"ligne xVec :"<<ligne<<endl;
3322  tmpfic>>ligne;// les coordonnées interessantes
3323  cout<<"ligne coordq :"<<ligne<<endl;
3324  dim=count(ligne.begin(),ligne.end(),'i')+1;
3325  xVec=new coeff[dim];
3326  sol=new coeff[dim*dim];
3327  i=0;
3328  int tmpindex;
3329  for(string::iterator iter=ligne.begin()+1;iter!=ligne.end();
3330  iter=ligne.begin()+tmpindex+1)
3331  {
3332  stringstream tmpstr;
3333  cout<<"iter "<<iter-ligne.begin()<<endl;
3334  tmpindex=ligne.find(",",iter-ligne.begin());
3335  if (tmpindex==string::npos) tmpindex=ligne.size()-1;
3336  cout<<"tmpindex "<<tmpindex<<endl;
3337  copy(iter,ligne.begin()+tmpindex,ostream_iterator<char>(tmpstr,""));
3338  tmpstr>>ligne2;
3339  cout<<"eeeee "<<ligne2<<" "<<ligne.find(",",iter-ligne.begin())<<endl;
3340  tmpstr<<ligne2;
3341  tmpstr>>xVec[i++];
3342  cout<<"i "<<i<<endl;
3343  }
3344 #endif
3345  //en theorie maintenant on a xVec
3346 #if 0
3347  tmpfic>>ligne;//chaine xMat
3348  cout<<"ligne xmat :"<<ligne<<endl;
3349  tmpfic>>ligne;//chaine '{'
3350  for(i=0;i<dim;i++)
3351  {
3352  tmpfic>>ligne;// les coordonnées interessantes
3353  int j=0;
3354  for(string::iterator iter=ligne.begin()+ligne.find_last_of('{');
3355  iter!=ligne.end();
3356  iter=ligne.begin()+ligne.find(",",iter-ligne.begin()))
3357  {
3358  stringstream tmpstr;
3359  // copy(iter,ligne.begin()+ligne.find(',',iter-ligne.begin())
3360  // ,ostream_iterator<char>(tmpstr,""));
3361  int toto=ligne.find(",",iter-ligne.begin());
3362  cout<<"ligne "<<ligne<<endl;
3363  cout<<"toto "<<toto<<" "<<string::npos<<endl;
3364  if(toto==string::npos) toto=ligne.size()-2;
3365  cout<<"toto "<<toto<<" "<<string::npos<<endl;
3366  tmpstr<<ligne.substr(iter-ligne.begin(),toto);
3367  tmpstr>>xMat[dim*j++ + i];
3368  }
3369  }
3370 #endif
3371  //maintenant on a relu le xVec et le Xmat
3372  //Reconstruction de la solution
3373  sol=new coeff[dim*dim];
3374  for(int i=0;i<dim*dim;i++)
3375  {
3376  tmpfic>>sol[i];
3377  }
3378  tmpfic.close();
3379  cout<<"Solution "<<endl;
3380  for(int i=0;i<dim*dim;i++)
3381  cout<<sol[i]<<" ";
3382  cout<<endl;
3383  // copy(sol,sol+dim*dim,ostream_iterator<string>(cout," "));
3384 #if 0
3385 for(int i=0;i<dim*dim;i++)
3386  sol[i]+=matmap[mon(1)][i];
3387  matmap.erase(matmap.find(mon(1)));
3388  int j=0;
3389  for(typename typmatmap::iterator itermat=matmap.begin();
3390  itermat!=matmap.end();itermat++)
3391  {
3392  for(int i=0;i<dim*dim;i++)
3393  sol[i]-=xVec[j]*itermat->second[i];
3394  j++;
3395  }
3396 #endif
3397 }
3398 
3399 template<typename typP, typename typdump,typename Base, typename typserv>
3400 void generickernelsdpa(typP &newpol, int k,
3401  const typdump &dump, Base &b, typserv &serv)
3402 {
3403  typedef typename typP::value_type::order_t ord;
3404  typedef typename typserv::monom_t Monomial;
3405  //
3406  //Allocation du problem et des
3407  //contraintes
3408  COEFF * C;
3409  map<Monomial,COEFF*,ord> matrixmap;
3410  int i;
3411 
3412  //
3413  //On introduit un variable par monome de degre d en dehors de B
3414  //On va contruire l'operateur de de Hankel associé // // //On commence par enumerer les monomes de degre plus petit que k // // typP stockprod,stockproj;//dans stockprod on a des polynomes // // // int nbconstraint=0; typedef list<typename typserv::monom_t> typstock; list<typename typserv::monom_t> stockmon,stockksur2; map<mon,int,ord> mapintligne,mapintcolonne,maphankel; enumeratemon(stockmon,k,b,dump); // //ICI on cree un index pour le monomes de degre k //il n'a a priori rien a voir avec int2mon/mon2int du reste du code //sic..... enumeratemon(stockksur2,k/2,b,dump); // //pour le suite il nous faut les monomes de B de degre <=k/2 // for(typename list<typename typserv::monom_t>::iterator iter=stockksur2.begin(); iter!=stockksur2.end();iter++) if(!IsinB(*iter,b)) stockksur2.erase(iter--); i=1; for(typename list<typename typserv::monom_t>::iterator iter=stockksur2.begin();iter!=stockksur2.end();iter++,i++) { int j=1; for(typename list<typename typserv::monom_t>::iterator iter2=stockksur2.begin();iter2!=stockksur2.end();iter2++,j++) { typename typserv::monom_t mono=*iter * (*iter2); // cout<<"monome "<<mono<<" "<<i<<" "<<j<<endl; if (!mapintligne.count(mono)) { mapintligne[mono]=i; mapintcolonne[mono]=j; } } } //cout<<"passé"<<endl; // // On genere les formes normales des produits de monomes de // de tous les monomes de degre <=k/2 dez B. // int dim=stockksur2.size(); for(typename typstock::iterator i=stockmon.begin(); i!=stockmon.end();i++) if(IsinB(*i,b)) { cout<<"ici "<<*i<<" dim "<<dim<<endl; matrixmap[*i]=new COEFF [dim*dim]; for(int ii=0;ii<dim*dim;ii++) matrixmap[*i][ii]=0; } int ii=0; cout<<"coiucou"<<endl; for(typename typstock::iterator i=stockksur2.begin(); i!=stockksur2.end();i++,ii++) { int jj=ii; cout<<"coiucou"<<endl; for(typename typstock::iterator j=i;j!=stockksur2.end();jj++,j++) { typename typserv::monom_t tmpmon=(*j)*(*i); //cout<<"coiucoufffffff "<<tmpmon<<endl; if (IsinB(tmpmon,b)) { matrixmap[tmpmon][ii*dim+jj]+=1; if(ii!=jj) matrixmap[tmpmon][jj*dim+ii]+=1; } else { typP tmplist; tmplist.push_back(tmpmon); proj(tmplist,dump,b,serv); // cout<<"ici tmpmon "<<tmpmon<<endl; //cout<<"tmplist.front "<<tmplist.front()<<endl; for(typename typP::value_type::iterator iter=tmplist.front().begin(); iter!=tmplist.front().end();iter++) { Monomial verytmpmon=*iter; verytmpmon.SetCoeff(1); //cout<<"tmpmon "<<verytmpmon<<" "<<*iter<<endl; matrixmap[verytmpmon][ii*dim+jj]+=iter->GetCoeff(); if(ii!=jj) matrixmap[verytmpmon][jj*dim+ii]+=iter->GetCoeff(); } } } } if(dim>1) { struct timeval tvini, tvfin; COEFF *sol; static int d=0; static char nom[1024]; gettimeofday(&tvini,NULL); cout<<"coucou dim "<<dim<<endl; write_to_sdpa_fic(matrixmap,dim,serv,d); sprintf(nom,"sdpa_gmp -dd tmpfile_%d -o lenom",d++); system(nom); read_sol_from_sdpa(sol,matrixmap,dim,serv); gettimeofday(&tvfin,NULL); tempsCDSP+=tvfin.tv_sec-tvini.tv_sec+1e-6*(tvfin.tv_usec-tvini.tv_usec); // //cout<<"coiucou"<<endl; // A ce niveau la il faut verifier le rang // Le cas echeant recuperer le kernel // // cout<<"return code "<<return_code<<endl; long n=stockksur2.size(); COEFF *V=new COEFF[n*n]; COEFF *S=new COEFF[n]; COEFF *work=new COEFF[16*n]; long lwork=16*n,info; long kk=0;//servira pour le rang 0 dgesvd_((char*)"N",(char*)"A",&n,&n,sol, &n,S,(COEFF*)NULL,&n,V,&n,work,&lwork,&info); #if 1 cout<<"info svd "<<info<<endl; cout<<"val sing"<<endl; for(kk=0;kk<n;kk++) cout<<S[kk]<<" "; cout<<endl; #endif cout<<"coiucou"<<endl; for(kk=1;kk<n;kk++) //if(S[0]>S[k]*1e6) break;//MAGIC if((abs(S[kk-1])==0) ||(abs(S[kk-1])>abs(S[kk])*1e6)) break;//MAGIC #if 1 cout<<"kk ici "<<kk<<" et n "<<n<<endl; #endif for(int j=0;j<n;j++) { for(int jj=0;jj<n;jj++) cout<<V[n*(jj)+j]<<" "; cout<<endl; } // //On construit les nouvelles equations // for(;kk<(int)n;kk++) { #if 1 cout<<"equation dans le noyau"<<endl; #endif typedef typename typP::value_type polyalp; polyalp tmp(0); for(typename list<typename typserv::monom_t>::iterator iter=stockksur2.begin(); iter!=stockksur2.end();iter++) { //cout<<"dans construct eq "<<k<<" map "<<mapintcolonne[*iter]<<endl; //cout<<V[k+n*(mapintcolonne[*iter]-1)]<<" "<<*iter<<" "; if(!Iszero(abs(V[kk+n*(mapintcolonne[*iter]-1)]))) { // cout<<"tmp avant"<<endl<<tmp<<endl; //cout<<"ajout "<<endl<<polyalp(*iter*V[k+n*(mapintcolonne[*iter]-1)])<<endl; tmp+=polyalp(*iter*(COEFF)V[kk+n*(mapintcolonne[*iter]-1)]); //cout<<"tmp aapre"<<endl<<tmp<<endl; } //iter->first;// est le monome //iter->second;//est l'entier associé } // cout<<endl; cout<<"g trouve ca comme nvlle eq "<<endl<<tmp<<endl; newpol.push_back(tmp); } delete[] S; delete[] V; delete[] work; delete[] sol; } } template<typename typdump,typename Base, typename typserv> int testsdp(int k, const typdump &dump,const Base &b,const typserv &serv) { return !(k%2); } template<typename typP,typename typPk,typename typdump,typename Base , template<typename T> class tmptypmat ,typename monomial_server> void algo(typP P,typdump &dump,Base &b, monomial_server &serv) { #ifdef PEQUAN int toto=0; FILE *fic; char name[8]; #endif typedef typename typP::value_type polyalp; typedef list<typename typPk::value_type::monom_t> typMk; typedef typename typMk::value_type mon; typedef typename typPk::value_type pol; typMk Mk; typMk Spoldejavu; typPk Pk,S; //typP recall typPk recall; //Base b; workspace<typename typP::value_type::coeff_t> w; typedef tmptypmat<typename typP::value_type::coeff_t> typMat; typMat Mat,L; int onemoretime=1,nouveaumon,allpolused=0,maxdeg,k,*pr,*pc; cout<<"avant init"<<endl; init_algo<typMat>(P,nouveaumon,maxdeg,k,Pk,Mk,b,dump,w,serv); cout<<"apres init"<<endl; cout<<"onemoretime "<<onemoretime<<endl; cout<<"nouveaumon "<<nouveaumon<<endl; cout<<"k "<<k<<endl; cout<<"maxdeg "<<maxdeg<<endl; #ifndef GROEBNER // while((critere(b,k)==-1)||(k<=maxdeg)) #ifdef ONEMORETIME cout<<"one"<<endl; while(nouveaumon||(k<=maxdeg)||onemoretime) #else while(nouveaumon||(k<=maxdeg)) #endif #else while(!GB_stop(k)||(k<=maxdeg)) #endif { #ifdef ONEMORETIME cout<<"two"<<endl; cout<<"nouveaumon"<<endl; if(!nouveaumon) cout<<"si"<<endl; onemoretime=0; #endif //if (toto>=5) {exit(0);} //toto++; int killspol; //test si on est dans les conditions d'application gettimeofday(&initclock,NULL); cout<<"onemoretime "<<onemoretime<<endl; cout<<"nouveaumon"<<nouveaumon<< endl; cout<<"k "<<k<<endl; cout<<"maxdeg "<<maxdeg<<endl; cout<<"testsdp(k,dump,b,serv) "<<testsdp(k,dump,b,serv)<<endl; if(testsdp(k,dump,b,serv)||(!onemoretime)) //envoie la routine de calcul de sdp { int mindeg_newpol; typP newpol; cout<<"un nouveau tour de boucle et k vaut "<<k<<endl; if(!onemoretime)//sdpa!!!!!!!! // generickernel(newpol,2*k,dump,b,serv); generickernel_testT(newpol,2*k,dump,b,serv); // generickernelsdpa(newpol,2*k,dump,b,serv); else // generickernel(newpol,k,dump,b,serv); generickernel_testT(newpol,k,dump,b,serv); //generickernelsdpa(newpol,k,dump,b,serv); gettimeofday(&tmpclock,NULL); tempsdssdp+=tmpclock.tv_sec-initclock.tv_sec+1e-6*(tmpclock.tv_usec-initclock.tv_usec); //sdprealrad(newpol,dump,b,serv); //penser a decroitre k le cas echeant avec un coup de recover cout<<"newpol "<<newpol.empty()<<endl; if(!newpol.empty()) { mindeg_newpol=Degree(newpol.front()); // cout<<"mindeg "<<mindeg_newpol<<" k "<<k<<endl; for(typename typP::iterator iter=newpol.begin(); iter!=newpol.end();iter++) mindeg_newpol=(mindeg_newpol<Degree(*iter) ?mindeg_newpol:Degree(*iter)); for(typename typP::iterator iter=newpol.begin(); iter!=newpol.end();iter++) if(Degree(*iter)==mindeg_newpol) P.push_back(*iter); if(k>=mindeg_newpol) { list<mon *> exceed; list<int> sizeexceed; typPk tmpPk; conv_merge(tmpPk,newpol,exceed,sizeexceed,b,serv); // cout<<"merde merde k "<<k<<" mindeg_newpol "<<mindeg_newpol<<endl; k=mindeg_newpol; // forget(b,dump,k,recall); // recover(Pk,Mk,dump,k); recover(Pk,Mk,dump,k); //Listedejafait(Mk,Spoldejavu); // cout<<"Pk.size() apres recover "<<Pk.size()<<endl; if((k>0)||(k==-1)) forget(b,dump,k,recall); else forget0(b,dump,k,recall); // cout<<"forget fait"<<endl; //forget(b,dump,k); NewCrochetchoix(P,Pk,Mk,tmpPk,k,dump,b,recall,w,serv); serv.compress(Pk,dump,b,k); cout<<"compress"<<endl; Dump(Pk,dump); continue; } } } #ifdef BONRAJOUT for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } #endif #if 1//def DEB //cout<<"mon a la fin de la boulcle de l'algo "<<Mk.size()<<endl; //for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++) // cout<<*iter<<endl; cout<<"poly a la fin de la boulcle de l'algo "<<Pk.size()<<endl; for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) //cout<<"les sizes "<<iter->size<<endl; { int cpt=0; cout<<invconv<typename typP::value_type>(*iter,serv)<<endl; for(int i=0;i<iter->sizenf;i++) for(int j=0;j<8;j++) if (((iter->nfind[i]>>j)&1) && (iter->nf[cpt++]==0)) { cout<<"ici ca couille a la place"<<8*i+j<<endl; cout<<iter->sizenf<<" "<<iter->size<<endl; exit(1); } } #endif // cout<<"Spolordsup"<<endl; S=Spolordsup(Pk,b,Spoldejavu); //S.erase(S.begin(),S.end()); //S=Spolordsup(Pk,b); cout<<endl; cout<<endl<<"newpkmkmatrixof"<<endl; //cout<<"Pk.size() "<<Pk.size()<<endl; //killspol=!newPkMkMatrixof(Mat,Pk,P,Mk,k,b,dump,recall,Spoldejavu); killspol=!newPkMkMatrixof(Mat,Pk,P,Mk,k,b,dump,recall,w,serv); #ifdef PEQUAN sprintf(name,"mat%d",toto); fic=fopen(name,"w"); printmatfile_pequan(Mat,fic); fclose(fic); toto++; #endif // if (toto>=5) {cout<<"killredspol "<<killspol<<endl; exit(0);} // killspol=!newPkMkMatrixof(Mat,Pk,P,Mk,k,b,dump); if(killspol) S.erase(S.begin(),S.end()); if (k+1>=maxdeg) allpolused=1; if(Mk.size()==0) nouveaumon=0; //cout<<"j'en suis a k="<<k<<endl; //cout<<"Ici dans algo Mat"<<endl; //#ifdef BONRAJOUT //affdebug(Mat); //#endif //Solve affecte a Mat la valeur U //cout<<"solve"<<endl; //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) // cout<<"avant solve les ind "<<iter->ind<<endl; //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) // cout<<"avant solve les pol "<<invconv<Poly>(*iter)<<endl; //if(k==3) exit(-10); //for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++) // cout<<"monomes dans Mk "<<*iter<<endl; if (Mat.ncol!=0) { //cout<<"debut du solve"<<endl; Solve(Mat,L,Pk,&pr,&pc,w); // cout<<"fin du solve"<<endl; //for(int kk=0;kk<Mk.size();kk++) // cout<<"permc "<<kk<<" "<<pc[kk]<<endl; inverse(pc,Mk.size()); Dopermu(Mk,pc); { //ici on remet les ind a la bonne valuer //a inclure dans une petite fonction inline apres int j=0; typename typMk::iterator itermon=Mk.begin(); typename typPk::iterator iter; for(iter=Pk.begin(); itermon!=Mk.end();iter++,itermon++,j++) { if(!Iszero(Mat(j,j))) { // cout<<"ligne "<<j<<" je mets le monome "<<*itermon<<endl; iter->ind=*itermon*(iter->ind.GetCoeff()); } else { iter->ind=mon(0); } } //for(;itermon!=Mk.end();iter++,itermon++) // iter->ind=mon(0); } free(pr); free(pc); } //appliquer les permutation a MK!!!!!!!! // for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) // cout<<"apres solve les ind "<<iter->ind<<endl; //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) // cout<<"apres solve les pol "<<invconv<Poly>(*iter)<<endl; // // //APPLIQUER LES PERMUTYATIONS A MK!! // // // // if ((unsigned)my_rank(Mat)==Mk.size()) //matrice de rang plein { typMk tmpSpoldejavu; typPk redspol,secd=secondmembre(Mat,Pk);; //secondmembre2(Mat,Pk,secd); //typename typPk::iterator iter=Pk.begin(); cout<<"matrice de rang plein "<<endl; //for(unsigned int i=0;i<Mk.size();i++,iter++); //Pk.erase(iter,Pk.end()); //cout<<"Dump "<<endl; Dump(Pk,dump); //cout<<"Reduce Spol "<<endl; ReduceSpol(S,dump,redspol,b,w,serv);//tmpSpoldejavu); //cout<<"secd.size() "<<secd.size()<<endl; my_merge(redspol,secd); if(redspol.size()==0) { //a voir.... Dump(Pk,dump); k++; my_merge(Spoldejavu,tmpSpoldejavu); L.destroystore(); continue; //la matrice a rang plein //ET les Spol\secondmembre de ce niveau se ,reduisent a 0 } else { //on a des spol\secondmembre qui se reduisent pas a 0 //cad un defaut de commuatation int tmpdeg=mindeg(redspol,serv); max_degppcm=k+2; nouveaumon=1; cout<<"redspol.size() "<<redspol.size()<<endl; //cout<<invconv<typename typP::value_type>(redspol.front())<<endl; if (tmpdeg==(k+1)) my_merge(Spoldejavu,tmpSpoldejavu); k=tmpdeg; //cout<<"le mindeg ici vaut "<<k<<endl; //cout<<"Pk.size() avant recover "<<Pk.size()<<endl; recover(Pk,Mk,dump,k); //Listedejafait(Mk,Spoldejavu); //cout<<"Pk.size() apres recover "<<Pk.size()<<endl; forget(b,dump,k,recall); //forget(b,dump,k); #ifdef DEB cout<<"Pk.size() avant Crochetchoix "<<Pk.size()<<endl; #endif //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu); NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,w,serv); //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b); #ifdef DEB cout<<"Pk.size apres Crochetchoix "<<Pk.size()<<" et k "<<k<<endl; #endif NewDestroyredspol(redspol,Pk); serv.compress(Pk,dump,b,k); Dump(Pk,dump); L.destroystore(); //misa jour de B dans crochet choix!! continue; } } else //la matrice n'est pas de rang plein { cout<<"matrice de rang pas plein "<<endl; typPk secd; #ifdef BONRAJOUT AddB_dim(Mat,L,P,Pk,Mk,dump,b); #else AddB(Mat,Pk,Mk,dump,b,serv); #endif // //secondmembre supprime des trucs dans Pk!! // secd=secondmembre(Mat,Pk); rajoute_voisins(Pk,Mk,dump,b,w,serv); //ne selectionne que les non nuls if(secd.size()==0) { typPk redspol; //for(int i=Pk.size();i>rank(Mat);i--) //{ // if(Pk.back().size!=0) // MAC_REV_FREE<typename typMat::coeff_t>(Pk.rbegin()->nf // ,Pk.rbegin()->size*sizeof(typename typMat::coeff_t)); // Pk.pop_back(); //}//on vire les 0 avant de dumper // AddB(Mat,Pk,Mk,dump,b); Dump(Pk,dump); ReduceSpol(S,dump,redspol,b,w,serv);//,Spoldejavu); #ifdef NO_TWICE for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++) P.push_back(invconv<polyalp>(*iter)); #endif if(redspol.size()==0) { // forget(b,dump,k); //AddB(Mat,Pk,Mk,b); //Dump(Pk,dump); //ici on modifie Pk dans AddB //<=> forget(b,dump,k) AddB(..) Dump(Pk,dump); k++; L.destroystore(); continue; //la matrice a pas rang plein second membre =0 //ET les Spol de ce niveau se ,reduisent a 0 } else { //on a des spol qui se reduisent pas a 0 //cad un defaut de commutation k=mindeg(redspol,serv); recover(Pk,Mk,dump,k); //Listedejafait(Mk,Spoldejavu); forget(b,dump,k,recall); //forget(b,dump,k); cout<<"il ya un passage par mat rang pas" <<"plein et pol non zero"<<endl; //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu); NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,w,serv); //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b); NewDestroyredspol(redspol,Pk); serv.compress(Pk,dump,b,k); Dump(Pk,dump); L.destroystore(); continue; } } else { //on a des pol qui se reduisent pas a 0 //cad un defaut de commuatation dans les coins typPk redspol; //for(int i=Pk.size();i>rank(Mat);i--) // Pk.pop_back(); //cout<<"PK. size "<<Pk.size()<<" Mat.nbcol "<<Mat.ncol<<endl; //cout<<"rank(Mat) "<<rank(Mat)<<endl; //int j=0; //cout<<"avant recover et meme avant le dump "<<endl; //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() // ;iter++,j++) // cout<<"pol de secd num "<<j<<endl<<invconv<Poly>(*iter)<<endl; // AddB(Mat,Pk,Mk,b); //cout<<"apres ADDB le dump "<<endl; //for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; Dump(Pk,dump); //cout<<"secd.size()" <<secd.size()<<endl; ReduceSpol(S,dump,redspol,b,w,serv);//,Spoldejavu); my_merge(secd,redspol); #ifdef NO_TWICE for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++) P.push_back(invconv<polyalp>(*iter)); #endif k=mindeg(secd,serv); recover(Pk,Mk,dump,k); //cout<<"k "<<k<<endl; //Listedejafait(Mk,Spoldejavu); //cout<<"apres recover"<<endl; // for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; //cout<<"les Spol non reduits"<<endl; //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; forget(b,dump,k,recall); //forget(b,dump,k); //cout<<"il ya un passage par mat pas rang plein et Spol non zero"<<endl; //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu); NewCrochetchoix(P,Pk,Mk,secd,k,dump,b,recall,w,serv); //NewCrochetchoix(P,Pk,Mk,secd,k,dump,b); NewDestroyredspol(secd,Pk); #ifdef BONRAJOUT cout<<"Apres NewCrochetchoix"<<endl; for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } #endif //for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; serv.compress(Pk,dump,b,k); Dump(Pk,dump); L.destroystore(); continue; } } } Mat.destroystore(); //while nouveau mon etc... // Pk=recomposePk(dump); //return Pk; // return; #ifdef DEBUG for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } #endif destroy_space(&w); cout<<"sortie d'algo flash et dimension "<<endl;//<<critere(b,k)<<endl; return ;//dump; //comme ca on conserve le tri par degre des formes normales et //donc la construction des operateurs de multiplication se //fait plus vite.. :-) } template<typename typP,typename typPk,typename typdump,typename Base , template<typename T> class tmptypmat ,typename monomial_server> void algo(typP P,typdump &dump,Base &b, monomial_server &serv,typP F) { #ifdef PEQUAN int toto=0; FILE *fic; char name[8]; #endif typedef typename typP::value_type polyalp; typedef list<typename typPk::value_type::monom_t> typMk; typedef typename typMk::value_type mon; typedef typename typPk::value_type pol; cout<<"entra aqui "<<endl; typMk Mk; typMk Spoldejavu; typPk Pk,S; typPk recall; typP Pini; workspace<typename typP::value_type::coeff_t> w; typedef tmptypmat<typename typP::value_type::coeff_t> typMat; typMat Mat,L; int onemoretime=1,nouveaumon,allpolused=0,maxdeg,k,maxdegb,kb,*pr,*pc,optimo=0,k1; int nogap=0,deg=0,nok=1, noreduced=0, kbon,kini; typP newpol,newpol1; COEFF *sol2,*sol3; cout<<"avant init"<<endl; init_algo<typMat>(P,nouveaumon,maxdeg,k,Pk,Mk,b,dump,w,serv); Pini=P; kini=k; cout<<"apres init"<<endl; cout<<"onemoretime "<<onemoretime<<endl; cout<<"nouveaumon "<<nouveaumon<<endl; cout<<"k "<<k<<endl; cout<<"maxdeg "<<maxdeg<<endl; #ifndef GROEBNER #ifdef ONEMORETIME cout<<"one"<<endl; while(nouveaumon||(k<=maxdeg)||onemoretime) #else while(nouveaumon||(k<=maxdeg)|| (!optimo) || nok )//|| (k!=deg)) #endif #else while(!GB_stop(k)||(k<=maxdeg)) #endif { #ifdef ONEMORETIME cout<<"two"<<endl; cout<<"nouveaumon"<<endl; if(!nouveaumon) cout<<"si"<<endl; onemoretime=0; #endif int killspol; //test si on est dans les conditions d'application gettimeofday(&initclock,NULL); cout<<"onemoretime "<<onemoretime<<endl; cout<<"nouveaumon"<<nouveaumon<< endl; cout<<"k "<<k<<endl; cout<<"maxdeg "<<maxdeg<<endl; cout<<"testsdp(k,dump,b,serv) "<<testsdp(k,dump,b,serv)<<endl; for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } //todo este if es por ver si el noyau de k+1 se reduce con la base que hemos calculado o no //hay un problema en la reinicializacion de las variables cuando el noyau no se reduce cout<<"k"<<k<<endl; cout<<"maxdeg"<<maxdeg<<endl; cout<<"optimo"<<optimo<<endl; cout<<"nok"<<nok<<endl; // if(testsdp(k,dump,b,serv)||(!onemoretime)) if((testsdp(k,dump,b,serv) && (!optimo)) || (k==deg)) //envoie la routine de calcul de sdp { int mindeg_newpol; cout<<"un nouveau tour de boucle et k vaut "<<k<<endl; // if(!onemoretime)//sdpa!!!!!!!! // generickernel_testF(newpol,2*k,dump,b,serv,F,*&sol2); // else cout<<"deg"<<deg<<endl; if (nogap) { cout<<"sol3"<<k<<endl; cout<<"kbon"<<kbon<<endl; if (k==deg) { cout<<"pasas por aqui"<<endl; newpol1.erase(newpol1.begin(),newpol1.end()); // newpol=newpol1; for(typename typP::iterator iter=newpol.begin();iter!=newpol.end(); iter++) { cout<<*iter<<" "; cout<<endl; } } newpol1.erase(newpol1.begin(),newpol1.end()); //#ifdef CSDP // generickernel_testTT(newpol1,k,dump,b,serv,F,*&sol3); //#else generickernel_testF(newpol1,k,dump,b,serv,F,*&sol3); //#endif cout<<"solucionprimal k"<< sol2[2] << endl; cout<<"solucionprimal k+1"<< sol3[2] << endl; cout<<"diferenciasprimales"<<abs(sol2[2]-sol3[2])*1e+1<<endl; cout<<"k1"<<k1<<endl; cout<<"k"<<k<<endl; cout<<"gap"<<abs(sol3[2]-sol3[3])*1e+4<<endl; cout<<"deg"<<deg<<endl; cout<<"!newpol.empty()"<<!newpol.empty()<<endl; cout<<"newpol1.empty()"<<newpol1.empty()<<endl; if (((abs(sol2[2]-sol3[2])*1e+1<1) && (!newpol.empty()) && (k1!=k)) || ((k==deg)) ) // if ((abs(sol3[0])*1e+5<1) && (abs(sol2[2]-sol3[2])*1e+5<1) && (!newpol.empty()) && (k1!=k)) { if (k==deg && newpol1.empty()) { nok=0; continue; } else { if (k!=deg) { optimo=1; deg=k+2; cout<<"deg dentro"<<deg<<endl; int numkerf=0; cout<<"noyau bon"<<endl; for(typename typP::iterator iter=newpol.begin();iter!=newpol.end(); iter++,numkerf++) { cout<<*iter<<" "; cout<<endl; } mindeg_newpol=Degree(newpol.front()); cout<<"mindeg "<<mindeg_newpol<<" k1 "<<k1<<endl; for(typename typP::iterator iter=newpol.begin(); iter!=newpol.end();iter++) mindeg_newpol=(mindeg_newpol<Degree(*iter) ?mindeg_newpol:Degree(*iter)); cout<<"mindeg "<<mindeg_newpol<<" k1 "<<k1<<endl; } if (k==deg && (!newpol.empty())) { // for(typename typP::iterator iter=newpol1.begin(); // iter!=newpol1.end();iter++) // newpol.push_back(*iter); // for(typename typP::iterator iter=newpol.begin();iter!=newpol.end(); // iter++) // { // cout<<*iter<<"newpol2fois "; // cout<<endl; // } newpol.erase(newpol.begin(),newpol.end()); newpol=newpol1; mindeg_newpol=Degree(newpol.front()); cout<<"mindeg2fois"<<mindeg_newpol<<endl; } // nok=0; // for(typename typP::iterator iterP=P.begin(); // iterP!=P.end();iterP++) // newpol.push_back(*iterP); P.erase(P.begin(),P.end()); for(typename typP::iterator iter=newpol.begin(); iter!=newpol.end();iter++) if(Degree(*iter)==mindeg_newpol) P.push_back(*iter); if(k-2>=mindeg_newpol) { list<mon *> exceed; list<int> sizeexceed; typPk tmpPk; conv_merge(tmpPk,newpol,exceed,sizeexceed,b,serv); k=mindeg_newpol; // if (!nok) deg=0; // else deg=k*2; cout<<"k noyau bon"<< k<<endl; recover(Pk,Mk,dump,k); // cout<<"Pk.size() apres recover "<<Pk.size()<<endl; if (k!=deg) { if((k>0)||(k==-1)) forget(b,dump,k,recall); else forget0(b,dump,k,recall); } NewCrochetchoix(P,Pk,Mk,tmpPk,k,dump,b,recall,w,serv); for(typename typP::iterator iter=P.begin();iter!=P.end(); iter++) cout<<*iter<<" "; cout<<endl; serv.compress(Pk,dump,b,k); cout<<"compress"<<endl; Dump(Pk,dump); continue; } } } else { cout<<"pasa por aqui cambiamos"<<endl; sol2=sol3; newpol=newpol1; } } else { cout<<"sol2"<<k<<endl; k1=k; newpol.erase(newpol.begin(),newpol.end()); //#ifdef CSDP // generickernel_testTT(newpol,k,dump,b,serv,F,*&sol2); //#else generickernel_testF(newpol,k,dump,b,serv,F,*&sol2); //#endif int numker=0; for(typename typP::iterator iter=newpol.begin();iter!=newpol.end(); iter++,numker++) cout<<*iter<<" "; cout<<endl; cout<<"newpol "<<newpol.empty()<<endl; cout<<"numker"<<numker<<endl; //pour le case de polynome dans degree 2 if (k==2 && maxdeg==1) { nogap=1; optimo=1; nok=0; } else{ cout<<"gap"<<sol2[0]<<endl; cout<<"gapx"<<abs(sol2[0])*1e+4<<endl; if (abs(sol2[0])*1e+4<1){ nogap=1; for(typename typP::iterator iter=newpol.begin();iter!=newpol.end(); iter++,numker++) cout<<*iter<<" "; cout<<endl; cout<<"newpol "<<newpol.empty()<<endl; cout<<"numker"<<numker<<endl; } } } } #ifdef BONRAJOUT for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } #endif #ifdef DEB //cout<<"mon a la fin de la boulcle de l'algo "<<Mk.size()<<endl; //for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++) // cout<<*iter<<endl; cout<<"poly a la fin de la boulcle de l'algo "<<Pk.size()<<endl; for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) //cout<<"les sizes "<<iter->size<<endl; { int cpt=0; cout<<invconv<typename typP::value_type>(*iter)<<endl; for(int i=0;i<iter->sizenf;i++) for(int j=0;j<8;j++) if (((iter->nfind[i]>>j)&1) && (iter->nf[cpt++]==0)) { cout<<"ici ca couille a la place"<<8*i+j<<endl; cout<<iter->sizenf<<" "<<iter->size<<endl; exit(1); } } #endif S=Spolordsup(Pk,b,Spoldejavu); cout<<"newpkmkmatrixof"<<endl; cout<<"k"<<k<<endl; killspol=!newPkMkMatrixof(Mat,Pk,P,Mk,k,b,dump,recall,w,serv); #ifdef PEQUAN sprintf(name,"mat%d",toto); fic=fopen(name,"w"); printmatfile_pequan(Mat,fic); fclose(fic); toto++; #endif if(killspol) S.erase(S.begin(),S.end()); if (k+1>=maxdeg) allpolused=1; cout<<"Mk.size()"<<Mk.size()<<endl; if(Mk.size()==0) nouveaumon=0; //Solve affecte a Mat la valeur U //cout<<"solve"<<endl; for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) cout<<"avant solve les ind "<<iter->ind<<endl; for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++) cout<<"monomes dans Mk "<<*iter<<endl; cout<<"Mat.ncol"<<Mat.ncol<<endl; if (Mat.ncol!=0) { //cout<<"debut du solve"<<endl; Solve(Mat,L,Pk,&pr,&pc,w); // cout<<"fin du solve"<<endl; //for(int kk=0;kk<Mk.size();kk++) // cout<<"permc "<<kk<<" "<<pc[kk]<<endl; inverse(pc,Mk.size()); Dopermu(Mk,pc); { //ici on remet les ind a la bonne valuer //a inclure dans une petite fonction inline apres int j=0; typename typMk::iterator itermon=Mk.begin(); typename typPk::iterator iter; for(iter=Pk.begin(); itermon!=Mk.end();iter++,itermon++,j++) { if(!Iszero(Mat(j,j))) { // cout<<"ligne "<<j<<" je mets le monome "<<*itermon<<endl; iter->ind=*itermon*(iter->ind.GetCoeff()); } else { iter->ind=mon(0); } } //for(;itermon!=Mk.end();iter++,itermon++) // iter->ind=mon(0); } free(pr); free(pc); } //appliquer les permutation a MK!!!!!!!! // for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) // cout<<"apres solve les ind "<<iter->ind<<endl; //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) // cout<<"apres solve les pol "<<invconv<Poly>(*iter)<<endl; // // //APPLIQUER LES PERMUTYATIONS A MK!! // // // // if ((unsigned)my_rank(Mat)==Mk.size()) //matrice de rang plein { typMk tmpSpoldejavu; typPk redspol,secd=secondmembre(Mat,Pk);; cout<<"matrice de rang plein "<<endl; Dump(Pk,dump); cout<<"Reduce Spol "<<endl; ReduceSpol(S,dump,redspol,b,w,serv);//tmpSpoldejavu); cout<<"secd.size() "<<secd.size()<<endl; my_merge(redspol,secd); if(redspol.size()==0) { //a voir.... Dump(Pk,dump); k++; my_merge(Spoldejavu,tmpSpoldejavu); L.destroystore(); continue; //la matrice a rang plein //ET les Spol\secondmembre de ce niveau se ,reduisent a 0 } else { //on a des spol\secondmembre qui se reduisent pas a 0 //cad un defaut de commuatation int tmpdeg=mindeg(redspol,serv); max_degppcm=k+2; nouveaumon=1; cout<<"redspol.size() "<<redspol.size()<<endl; if (tmpdeg==(k+1)) my_merge(Spoldejavu,tmpSpoldejavu); k=tmpdeg; //cout<<"le mindeg ici vaut "<<k<<endl; //cout<<"Pk.size() avant recover "<<Pk.size()<<endl; recover(Pk,Mk,dump,k); //cout<<"Pk.size() apres recover "<<Pk.size()<<endl; forget(b,dump,k,recall); //forget(b,dump,k); #ifdef DEB cout<<"Pk.size() avant Crochetchoix "<<Pk.size()<<endl; #endif //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu); NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,w,serv); //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b); #ifdef DEB cout<<"Pk.size apres Crochetchoix "<<Pk.size()<<" et k "<<k<<endl; #endif NewDestroyredspol(redspol,Pk); serv.compress(Pk,dump,b,k); Dump(Pk,dump); L.destroystore(); cout<<"kaquiPini"<<k<<endl; //misa jour de B dans crochet choix!! continue; } } else //la matrice n'est pas de rang plein { cout<<"matrice de rang pas plein "<<endl; typPk secd; #ifdef BONRAJOUT AddB_dim(Mat,L,P,Pk,Mk,dump,b); #else AddB(Mat,Pk,Mk,dump,b,serv); #endif // //secondmembre supprime des trucs dans Pk!! // secd=secondmembre(Mat,Pk); rajoute_voisins(Pk,Mk,dump,b,w,serv); //ne selectionne que les non nuls if(secd.size()==0) { typPk redspol; Dump(Pk,dump); ReduceSpol(S,dump,redspol,b,w,serv); #ifdef NO_TWICE for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++) P.push_back(invconv<polyalp>(*iter)); #endif if(redspol.size()==0) { //ici on modifie Pk dans AddB //<=> forget(b,dump,k) AddB(..) Dump(Pk,dump); k++; L.destroystore(); continue; //la matrice a pas rang plein second membre =0 //ET les Spol de ce niveau se ,reduisent a 0 } else { //on a des spol qui se reduisent pas a 0 //cad un defaut de commutation k=mindeg(redspol,serv); recover(Pk,Mk,dump,k); //Listedejafait(Mk,Spoldejavu); forget(b,dump,k,recall); //forget(b,dump,k); cout<<"il ya un passage par mat rang pas" <<"plein et pol non zero"<<endl; //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu); NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,w,serv); //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b); NewDestroyredspol(redspol,Pk); serv.compress(Pk,dump,b,k); Dump(Pk,dump); L.destroystore(); continue; } } else { //on a des pol qui se reduisent pas a 0 //cad un defaut de commuatation dans les coins typPk redspol; //for(int i=Pk.size();i>rank(Mat);i--) // Pk.pop_back(); //cout<<"PK. size "<<Pk.size()<<" Mat.nbcol "<<Mat.ncol<<endl; //cout<<"rank(Mat) "<<rank(Mat)<<endl; //int j=0; //cout<<"avant recover et meme avant le dump "<<endl; //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() // ;iter++,j++) // cout<<"pol de secd num "<<j<<endl<<invconv<Poly>(*iter)<<endl; // AddB(Mat,Pk,Mk,b); //cout<<"apres ADDB le dump "<<endl; //for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; Dump(Pk,dump); //cout<<"secd.size()" <<secd.size()<<endl; ReduceSpol(S,dump,redspol,b,w,serv);//,Spoldejavu); my_merge(secd,redspol); #ifdef NO_TWICE for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++) P.push_back(invconv<polyalp>(*iter)); #endif k=mindeg(secd,serv); recover(Pk,Mk,dump,k); //cout<<"k "<<k<<endl; //Listedejafait(Mk,Spoldejavu); //cout<<"apres recover"<<endl; // for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; //cout<<"les Spol non reduits"<<endl; //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; forget(b,dump,k,recall); //forget(b,dump,k); //cout<<"il ya un passage par mat pas rang plein et Spol non zero"<<endl; //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu); NewCrochetchoix(P,Pk,Mk,secd,k,dump,b,recall,w,serv); //NewCrochetchoix(P,Pk,Mk,secd,k,dump,b); NewDestroyredspol(secd,Pk); #ifdef BONRAJOUT cout<<"Apres NewCrochetchoix"<<endl; for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } #endif //for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; serv.compress(Pk,dump,b,k); Dump(Pk,dump); L.destroystore(); continue; } } } Mat.destroystore(); #ifdef DEBUG for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } #endif destroy_space(&w); // delete[] &sol2; // delete[] &sol3; cout<<"sortie d'algo flash et dimension "<<endl;//<<critere(b,k)<<endl; cout<<"TPS SDP "<<tempsCDSP<<endl; return ;//dump; //comme ca on conserve le tri par degre des formes normales et //donc la construction des operateurs de multiplication se //fait plus vite.. :-) } #endif //ALREADY_corealgo3
3415  //
3416 
3417  //
3418  //On commence par enumerer les monomes de degre plus petit que k
3419  //
3420  //
3421  typP stockprod,stockproj;//dans stockprod on a des polynomes
3422  //
3423  //
3424  //
3425  int nbconstraint=0;
3426  typedef list<typename typserv::monom_t> typstock;
3427  list<typename typserv::monom_t> stockmon,stockksur2;
3428  map<mon,int,ord> mapintligne,mapintcolonne,maphankel;
3429  enumeratemon(stockmon,k,b,dump);
3430  //
3431  //ICI on cree un index pour le monomes de degre k
3432  //il n'a a priori rien a voir avec int2mon/mon2int du reste du code
3433  //sic.....
3434  enumeratemon(stockksur2,k/2,b,dump);
3435  //
3436  //pour le suite il nous faut les monomes de B de degre <=k/2
3437  //
3438 
3439  for(typename list<typename typserv::monom_t>::iterator
3440  iter=stockksur2.begin(); iter!=stockksur2.end();iter++)
3441  if(!IsinB(*iter,b)) stockksur2.erase(iter--);
3442  i=1;
3443  for(typename list<typename typserv::monom_t>::iterator
3444  iter=stockksur2.begin();iter!=stockksur2.end();iter++,i++)
3445  {
3446  int j=1;
3447  for(typename list<typename typserv::monom_t>::iterator
3448  iter2=stockksur2.begin();iter2!=stockksur2.end();iter2++,j++)
3449  {
3450  typename typserv::monom_t mono=*iter * (*iter2);
3451 // cout<<"monome "<<mono<<" "<<i<<" "<<j<<endl;
3452  if (!mapintligne.count(mono))
3453  {
3454  mapintligne[mono]=i;
3455  mapintcolonne[mono]=j;
3456  }
3457  }
3458  }
3459  //cout<<"passé"<<endl;
3460 
3461  //
3462  // On genere les formes normales des produits de monomes de
3463  // de tous les monomes de degre <=k/2 dez B.
3464  //
3465  int dim=stockksur2.size();
3466  for(typename typstock::iterator i=stockmon.begin();
3467  i!=stockmon.end();i++)
3468  if(IsinB(*i,b))
3469  {
3470  cout<<"ici "<<*i<<" dim "<<dim<<endl;
3471  matrixmap[*i]=new COEFF [dim*dim];
3472  for(int ii=0;ii<dim*dim;ii++)
3473  matrixmap[*i][ii]=0;
3474  }
3475 
3476 
3477  int ii=0;
3478  cout<<"coiucou"<<endl;
3479  for(typename typstock::iterator i=stockksur2.begin();
3480  i!=stockksur2.end();i++,ii++)
3481  {
3482  int jj=ii;
3483  cout<<"coiucou"<<endl;
3484  for(typename typstock::iterator j=i;j!=stockksur2.end();jj++,j++)
3485  {
3486 
3487  typename typserv::monom_t tmpmon=(*j)*(*i);
3488  //cout<<"coiucoufffffff "<<tmpmon<<endl;
3489  if (IsinB(tmpmon,b))
3490  {
3491  matrixmap[tmpmon][ii*dim+jj]+=1;
3492  if(ii!=jj)
3493  matrixmap[tmpmon][jj*dim+ii]+=1;
3494  }
3495  else
3496  {
3497  typP tmplist;
3498  tmplist.push_back(tmpmon);
3499  proj(tmplist,dump,b,serv);
3500  // cout<<"ici tmpmon "<<tmpmon<<endl;
3501  //cout<<"tmplist.front "<<tmplist.front()<<endl;
3502  for(typename typP::value_type::iterator iter=tmplist.front().begin();
3503  iter!=tmplist.front().end();iter++)
3504  {
3505  Monomial verytmpmon=*iter;
3506  verytmpmon.SetCoeff(1);
3507  //cout<<"tmpmon "<<verytmpmon<<" "<<*iter<<endl;
3508  matrixmap[verytmpmon][ii*dim+jj]+=iter->GetCoeff();
3509  if(ii!=jj)
3510  matrixmap[verytmpmon][jj*dim+ii]+=iter->GetCoeff();
3511 
3512  }
3513  }
3514  }
3515  }
3516 
3517  if(dim>1)
3518  {
3519  struct timeval tvini, tvfin;
3520  COEFF *sol;
3521  static int d=0;
3522  static char nom[1024];
3523  gettimeofday(&tvini,NULL);
3524  cout<<"coucou dim "<<dim<<endl;
3525  write_to_sdpa_fic(matrixmap,dim,serv,d);
3526  sprintf(nom,"sdpa_gmp -dd tmpfile_%d -o lenom",d++);
3527  system(nom);
3528  read_sol_from_sdpa(sol,matrixmap,dim,serv);
3529 
3530 
3531  gettimeofday(&tvfin,NULL);
3532  tempsCDSP+=tvfin.tv_sec-tvini.tv_sec+1e-6*(tvfin.tv_usec-tvini.tv_usec);
3533 
3534  //
3535  //cout<<"coiucou"<<endl;
3536  // A ce niveau la il faut verifier le rang
3537  // Le cas echeant recuperer le kernel
3538  //
3539  // cout<<"return code "<<return_code<<endl;
3540  long n=stockksur2.size();
3541  COEFF *V=new COEFF[n*n];
3542  COEFF *S=new COEFF[n];
3543  COEFF *work=new COEFF[16*n];
3544  long lwork=16*n,info;
3545  long kk=0;//servira pour le rang 0
3546  dgesvd_((char*)"N",(char*)"A",&n,&n,sol,
3547  &n,S,(COEFF*)NULL,&n,V,&n,work,&lwork,&info);
3548 #if 1
3549  cout<<"info svd "<<info<<endl;
3550  cout<<"val sing"<<endl;
3551  for(kk=0;kk<n;kk++)
3552  cout<<S[kk]<<" ";
3553  cout<<endl;
3554 #endif
3555  cout<<"coiucou"<<endl;
3556  for(kk=1;kk<n;kk++)
3557  //if(S[0]>S[k]*1e6) break;//MAGIC
3558  if((abs(S[kk-1])==0) ||(abs(S[kk-1])>abs(S[kk])*1e6)) break;//MAGIC
3559 #if 1
3560  cout<<"kk ici "<<kk<<" et n "<<n<<endl;
3561 #endif
3562  for(int j=0;j<n;j++)
3563  {
3564  for(int jj=0;jj<n;jj++)
3565  cout<<V[n*(jj)+j]<<" ";
3566  cout<<endl;
3567  }
3568  //
3569  //On construit les nouvelles equations
3570  //
3571  for(;kk<(int)n;kk++)
3572  {
3573 #if 1
3574  cout<<"equation dans le noyau"<<endl;
3575 #endif
3576  typedef typename typP::value_type polyalp;
3577  polyalp tmp(0);
3578  for(typename list<typename typserv::monom_t>::iterator
3579  iter=stockksur2.begin();
3580  iter!=stockksur2.end();iter++)
3581  {
3582 
3583  //cout<<"dans construct eq "<<k<<" map "<<mapintcolonne[*iter]<<endl;
3584  //cout<<V[k+n*(mapintcolonne[*iter]-1)]<<" "<<*iter<<" ";
3585  if(!Iszero(abs(V[kk+n*(mapintcolonne[*iter]-1)])))
3586 
3587  {
3588  // cout<<"tmp avant"<<endl<<tmp<<endl;
3589  //cout<<"ajout "<<endl<<polyalp(*iter*V[k+n*(mapintcolonne[*iter]-1)])<<endl;
3590  tmp+=polyalp(*iter*(COEFF)V[kk+n*(mapintcolonne[*iter]-1)]);
3591  //cout<<"tmp aapre"<<endl<<tmp<<endl;
3592  }
3593  //iter->first;// est le monome
3594  //iter->second;//est l'entier associé } // cout<<endl; cout<<"g trouve ca comme nvlle eq "<<endl<<tmp<<endl; newpol.push_back(tmp); } delete[] S; delete[] V; delete[] work; delete[] sol; } } template<typename typdump,typename Base, typename typserv> int testsdp(int k, const typdump &dump,const Base &b,const typserv &serv) { return !(k%2); } template<typename typP,typename typPk,typename typdump,typename Base , template<typename T> class tmptypmat ,typename monomial_server> void algo(typP P,typdump &dump,Base &b, monomial_server &serv) { #ifdef PEQUAN int toto=0; FILE *fic; char name[8]; #endif typedef typename typP::value_type polyalp; typedef list<typename typPk::value_type::monom_t> typMk; typedef typename typMk::value_type mon; typedef typename typPk::value_type pol; typMk Mk; typMk Spoldejavu; typPk Pk,S; //typP recall typPk recall; //Base b; workspace<typename typP::value_type::coeff_t> w; typedef tmptypmat<typename typP::value_type::coeff_t> typMat; typMat Mat,L; int onemoretime=1,nouveaumon,allpolused=0,maxdeg,k,*pr,*pc; cout<<"avant init"<<endl; init_algo<typMat>(P,nouveaumon,maxdeg,k,Pk,Mk,b,dump,w,serv); cout<<"apres init"<<endl; cout<<"onemoretime "<<onemoretime<<endl; cout<<"nouveaumon "<<nouveaumon<<endl; cout<<"k "<<k<<endl; cout<<"maxdeg "<<maxdeg<<endl; #ifndef GROEBNER // while((critere(b,k)==-1)||(k<=maxdeg)) #ifdef ONEMORETIME cout<<"one"<<endl; while(nouveaumon||(k<=maxdeg)||onemoretime) #else while(nouveaumon||(k<=maxdeg)) #endif #else while(!GB_stop(k)||(k<=maxdeg)) #endif { #ifdef ONEMORETIME cout<<"two"<<endl; cout<<"nouveaumon"<<endl; if(!nouveaumon) cout<<"si"<<endl; onemoretime=0; #endif //if (toto>=5) {exit(0);} //toto++; int killspol; //test si on est dans les conditions d'application gettimeofday(&initclock,NULL); cout<<"onemoretime "<<onemoretime<<endl; cout<<"nouveaumon"<<nouveaumon<< endl; cout<<"k "<<k<<endl; cout<<"maxdeg "<<maxdeg<<endl; cout<<"testsdp(k,dump,b,serv) "<<testsdp(k,dump,b,serv)<<endl; if(testsdp(k,dump,b,serv)||(!onemoretime)) //envoie la routine de calcul de sdp { int mindeg_newpol; typP newpol; cout<<"un nouveau tour de boucle et k vaut "<<k<<endl; if(!onemoretime)//sdpa!!!!!!!! // generickernel(newpol,2*k,dump,b,serv); generickernel_testT(newpol,2*k,dump,b,serv); // generickernelsdpa(newpol,2*k,dump,b,serv); else // generickernel(newpol,k,dump,b,serv); generickernel_testT(newpol,k,dump,b,serv); //generickernelsdpa(newpol,k,dump,b,serv); gettimeofday(&tmpclock,NULL); tempsdssdp+=tmpclock.tv_sec-initclock.tv_sec+1e-6*(tmpclock.tv_usec-initclock.tv_usec); //sdprealrad(newpol,dump,b,serv); //penser a decroitre k le cas echeant avec un coup de recover cout<<"newpol "<<newpol.empty()<<endl; if(!newpol.empty()) { mindeg_newpol=Degree(newpol.front()); // cout<<"mindeg "<<mindeg_newpol<<" k "<<k<<endl; for(typename typP::iterator iter=newpol.begin(); iter!=newpol.end();iter++) mindeg_newpol=(mindeg_newpol<Degree(*iter) ?mindeg_newpol:Degree(*iter)); for(typename typP::iterator iter=newpol.begin(); iter!=newpol.end();iter++) if(Degree(*iter)==mindeg_newpol) P.push_back(*iter); if(k>=mindeg_newpol) { list<mon *> exceed; list<int> sizeexceed; typPk tmpPk; conv_merge(tmpPk,newpol,exceed,sizeexceed,b,serv); // cout<<"merde merde k "<<k<<" mindeg_newpol "<<mindeg_newpol<<endl; k=mindeg_newpol; // forget(b,dump,k,recall); // recover(Pk,Mk,dump,k); recover(Pk,Mk,dump,k); //Listedejafait(Mk,Spoldejavu); // cout<<"Pk.size() apres recover "<<Pk.size()<<endl; if((k>0)||(k==-1)) forget(b,dump,k,recall); else forget0(b,dump,k,recall); // cout<<"forget fait"<<endl; //forget(b,dump,k); NewCrochetchoix(P,Pk,Mk,tmpPk,k,dump,b,recall,w,serv); serv.compress(Pk,dump,b,k); cout<<"compress"<<endl; Dump(Pk,dump); continue; } } } #ifdef BONRAJOUT for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } #endif #if 1//def DEB //cout<<"mon a la fin de la boulcle de l'algo "<<Mk.size()<<endl; //for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++) // cout<<*iter<<endl; cout<<"poly a la fin de la boulcle de l'algo "<<Pk.size()<<endl; for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) //cout<<"les sizes "<<iter->size<<endl; { int cpt=0; cout<<invconv<typename typP::value_type>(*iter,serv)<<endl; for(int i=0;i<iter->sizenf;i++) for(int j=0;j<8;j++) if (((iter->nfind[i]>>j)&1) && (iter->nf[cpt++]==0)) { cout<<"ici ca couille a la place"<<8*i+j<<endl; cout<<iter->sizenf<<" "<<iter->size<<endl; exit(1); } } #endif // cout<<"Spolordsup"<<endl; S=Spolordsup(Pk,b,Spoldejavu); //S.erase(S.begin(),S.end()); //S=Spolordsup(Pk,b); cout<<endl; cout<<endl<<"newpkmkmatrixof"<<endl; //cout<<"Pk.size() "<<Pk.size()<<endl; //killspol=!newPkMkMatrixof(Mat,Pk,P,Mk,k,b,dump,recall,Spoldejavu); killspol=!newPkMkMatrixof(Mat,Pk,P,Mk,k,b,dump,recall,w,serv); #ifdef PEQUAN sprintf(name,"mat%d",toto); fic=fopen(name,"w"); printmatfile_pequan(Mat,fic); fclose(fic); toto++; #endif // if (toto>=5) {cout<<"killredspol "<<killspol<<endl; exit(0);} // killspol=!newPkMkMatrixof(Mat,Pk,P,Mk,k,b,dump); if(killspol) S.erase(S.begin(),S.end()); if (k+1>=maxdeg) allpolused=1; if(Mk.size()==0) nouveaumon=0; //cout<<"j'en suis a k="<<k<<endl; //cout<<"Ici dans algo Mat"<<endl; //#ifdef BONRAJOUT //affdebug(Mat); //#endif //Solve affecte a Mat la valeur U //cout<<"solve"<<endl; //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) // cout<<"avant solve les ind "<<iter->ind<<endl; //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) // cout<<"avant solve les pol "<<invconv<Poly>(*iter)<<endl; //if(k==3) exit(-10); //for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++) // cout<<"monomes dans Mk "<<*iter<<endl; if (Mat.ncol!=0) { //cout<<"debut du solve"<<endl; Solve(Mat,L,Pk,&pr,&pc,w); // cout<<"fin du solve"<<endl; //for(int kk=0;kk<Mk.size();kk++) // cout<<"permc "<<kk<<" "<<pc[kk]<<endl; inverse(pc,Mk.size()); Dopermu(Mk,pc); { //ici on remet les ind a la bonne valuer //a inclure dans une petite fonction inline apres int j=0; typename typMk::iterator itermon=Mk.begin(); typename typPk::iterator iter; for(iter=Pk.begin(); itermon!=Mk.end();iter++,itermon++,j++) { if(!Iszero(Mat(j,j))) { // cout<<"ligne "<<j<<" je mets le monome "<<*itermon<<endl; iter->ind=*itermon*(iter->ind.GetCoeff()); } else { iter->ind=mon(0); } } //for(;itermon!=Mk.end();iter++,itermon++) // iter->ind=mon(0); } free(pr); free(pc); } //appliquer les permutation a MK!!!!!!!! // for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) // cout<<"apres solve les ind "<<iter->ind<<endl; //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) // cout<<"apres solve les pol "<<invconv<Poly>(*iter)<<endl; // // //APPLIQUER LES PERMUTYATIONS A MK!! // // // // if ((unsigned)my_rank(Mat)==Mk.size()) //matrice de rang plein { typMk tmpSpoldejavu; typPk redspol,secd=secondmembre(Mat,Pk);; //secondmembre2(Mat,Pk,secd); //typename typPk::iterator iter=Pk.begin(); cout<<"matrice de rang plein "<<endl; //for(unsigned int i=0;i<Mk.size();i++,iter++); //Pk.erase(iter,Pk.end()); //cout<<"Dump "<<endl; Dump(Pk,dump); //cout<<"Reduce Spol "<<endl; ReduceSpol(S,dump,redspol,b,w,serv);//tmpSpoldejavu); //cout<<"secd.size() "<<secd.size()<<endl; my_merge(redspol,secd); if(redspol.size()==0) { //a voir.... Dump(Pk,dump); k++; my_merge(Spoldejavu,tmpSpoldejavu); L.destroystore(); continue; //la matrice a rang plein //ET les Spol\secondmembre de ce niveau se ,reduisent a 0 } else { //on a des spol\secondmembre qui se reduisent pas a 0 //cad un defaut de commuatation int tmpdeg=mindeg(redspol,serv); max_degppcm=k+2; nouveaumon=1; cout<<"redspol.size() "<<redspol.size()<<endl; //cout<<invconv<typename typP::value_type>(redspol.front())<<endl; if (tmpdeg==(k+1)) my_merge(Spoldejavu,tmpSpoldejavu); k=tmpdeg; //cout<<"le mindeg ici vaut "<<k<<endl; //cout<<"Pk.size() avant recover "<<Pk.size()<<endl; recover(Pk,Mk,dump,k); //Listedejafait(Mk,Spoldejavu); //cout<<"Pk.size() apres recover "<<Pk.size()<<endl; forget(b,dump,k,recall); //forget(b,dump,k); #ifdef DEB cout<<"Pk.size() avant Crochetchoix "<<Pk.size()<<endl; #endif //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu); NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,w,serv); //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b); #ifdef DEB cout<<"Pk.size apres Crochetchoix "<<Pk.size()<<" et k "<<k<<endl; #endif NewDestroyredspol(redspol,Pk); serv.compress(Pk,dump,b,k); Dump(Pk,dump); L.destroystore(); //misa jour de B dans crochet choix!! continue; } } else //la matrice n'est pas de rang plein { cout<<"matrice de rang pas plein "<<endl; typPk secd; #ifdef BONRAJOUT AddB_dim(Mat,L,P,Pk,Mk,dump,b); #else AddB(Mat,Pk,Mk,dump,b,serv); #endif // //secondmembre supprime des trucs dans Pk!! // secd=secondmembre(Mat,Pk); rajoute_voisins(Pk,Mk,dump,b,w,serv); //ne selectionne que les non nuls if(secd.size()==0) { typPk redspol; //for(int i=Pk.size();i>rank(Mat);i--) //{ // if(Pk.back().size!=0) // MAC_REV_FREE<typename typMat::coeff_t>(Pk.rbegin()->nf // ,Pk.rbegin()->size*sizeof(typename typMat::coeff_t)); // Pk.pop_back(); //}//on vire les 0 avant de dumper // AddB(Mat,Pk,Mk,dump,b); Dump(Pk,dump); ReduceSpol(S,dump,redspol,b,w,serv);//,Spoldejavu); #ifdef NO_TWICE for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++) P.push_back(invconv<polyalp>(*iter)); #endif if(redspol.size()==0) { // forget(b,dump,k); //AddB(Mat,Pk,Mk,b); //Dump(Pk,dump); //ici on modifie Pk dans AddB //<=> forget(b,dump,k) AddB(..) Dump(Pk,dump); k++; L.destroystore(); continue; //la matrice a pas rang plein second membre =0 //ET les Spol de ce niveau se ,reduisent a 0 } else { //on a des spol qui se reduisent pas a 0 //cad un defaut de commutation k=mindeg(redspol,serv); recover(Pk,Mk,dump,k); //Listedejafait(Mk,Spoldejavu); forget(b,dump,k,recall); //forget(b,dump,k); cout<<"il ya un passage par mat rang pas" <<"plein et pol non zero"<<endl; //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu); NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,w,serv); //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b); NewDestroyredspol(redspol,Pk); serv.compress(Pk,dump,b,k); Dump(Pk,dump); L.destroystore(); continue; } } else { //on a des pol qui se reduisent pas a 0 //cad un defaut de commuatation dans les coins typPk redspol; //for(int i=Pk.size();i>rank(Mat);i--) // Pk.pop_back(); //cout<<"PK. size "<<Pk.size()<<" Mat.nbcol "<<Mat.ncol<<endl; //cout<<"rank(Mat) "<<rank(Mat)<<endl; //int j=0; //cout<<"avant recover et meme avant le dump "<<endl; //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() // ;iter++,j++) // cout<<"pol de secd num "<<j<<endl<<invconv<Poly>(*iter)<<endl; // AddB(Mat,Pk,Mk,b); //cout<<"apres ADDB le dump "<<endl; //for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; Dump(Pk,dump); //cout<<"secd.size()" <<secd.size()<<endl; ReduceSpol(S,dump,redspol,b,w,serv);//,Spoldejavu); my_merge(secd,redspol); #ifdef NO_TWICE for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++) P.push_back(invconv<polyalp>(*iter)); #endif k=mindeg(secd,serv); recover(Pk,Mk,dump,k); //cout<<"k "<<k<<endl; //Listedejafait(Mk,Spoldejavu); //cout<<"apres recover"<<endl; // for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; //cout<<"les Spol non reduits"<<endl; //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; forget(b,dump,k,recall); //forget(b,dump,k); //cout<<"il ya un passage par mat pas rang plein et Spol non zero"<<endl; //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu); NewCrochetchoix(P,Pk,Mk,secd,k,dump,b,recall,w,serv); //NewCrochetchoix(P,Pk,Mk,secd,k,dump,b); NewDestroyredspol(secd,Pk); #ifdef BONRAJOUT cout<<"Apres NewCrochetchoix"<<endl; for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } #endif //for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; serv.compress(Pk,dump,b,k); Dump(Pk,dump); L.destroystore(); continue; } } } Mat.destroystore(); //while nouveau mon etc... // Pk=recomposePk(dump); //return Pk; // return; #ifdef DEBUG for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } #endif destroy_space(&w); cout<<"sortie d'algo flash et dimension "<<endl;//<<critere(b,k)<<endl; return ;//dump; //comme ca on conserve le tri par degre des formes normales et //donc la construction des operateurs de multiplication se //fait plus vite.. :-) } template<typename typP,typename typPk,typename typdump,typename Base , template<typename T> class tmptypmat ,typename monomial_server> void algo(typP P,typdump &dump,Base &b, monomial_server &serv,typP F) { #ifdef PEQUAN int toto=0; FILE *fic; char name[8]; #endif typedef typename typP::value_type polyalp; typedef list<typename typPk::value_type::monom_t> typMk; typedef typename typMk::value_type mon; typedef typename typPk::value_type pol; cout<<"entra aqui "<<endl; typMk Mk; typMk Spoldejavu; typPk Pk,S; typPk recall; typP Pini; workspace<typename typP::value_type::coeff_t> w; typedef tmptypmat<typename typP::value_type::coeff_t> typMat; typMat Mat,L; int onemoretime=1,nouveaumon,allpolused=0,maxdeg,k,maxdegb,kb,*pr,*pc,optimo=0,k1; int nogap=0,deg=0,nok=1, noreduced=0, kbon,kini; typP newpol,newpol1; COEFF *sol2,*sol3; cout<<"avant init"<<endl; init_algo<typMat>(P,nouveaumon,maxdeg,k,Pk,Mk,b,dump,w,serv); Pini=P; kini=k; cout<<"apres init"<<endl; cout<<"onemoretime "<<onemoretime<<endl; cout<<"nouveaumon "<<nouveaumon<<endl; cout<<"k "<<k<<endl; cout<<"maxdeg "<<maxdeg<<endl; #ifndef GROEBNER #ifdef ONEMORETIME cout<<"one"<<endl; while(nouveaumon||(k<=maxdeg)||onemoretime) #else while(nouveaumon||(k<=maxdeg)|| (!optimo) || nok )//|| (k!=deg)) #endif #else while(!GB_stop(k)||(k<=maxdeg)) #endif { #ifdef ONEMORETIME cout<<"two"<<endl; cout<<"nouveaumon"<<endl; if(!nouveaumon) cout<<"si"<<endl; onemoretime=0; #endif int killspol; //test si on est dans les conditions d'application gettimeofday(&initclock,NULL); cout<<"onemoretime "<<onemoretime<<endl; cout<<"nouveaumon"<<nouveaumon<< endl; cout<<"k "<<k<<endl; cout<<"maxdeg "<<maxdeg<<endl; cout<<"testsdp(k,dump,b,serv) "<<testsdp(k,dump,b,serv)<<endl; for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } //todo este if es por ver si el noyau de k+1 se reduce con la base que hemos calculado o no //hay un problema en la reinicializacion de las variables cuando el noyau no se reduce cout<<"k"<<k<<endl; cout<<"maxdeg"<<maxdeg<<endl; cout<<"optimo"<<optimo<<endl; cout<<"nok"<<nok<<endl; // if(testsdp(k,dump,b,serv)||(!onemoretime)) if((testsdp(k,dump,b,serv) && (!optimo)) || (k==deg)) //envoie la routine de calcul de sdp { int mindeg_newpol; cout<<"un nouveau tour de boucle et k vaut "<<k<<endl; // if(!onemoretime)//sdpa!!!!!!!! // generickernel_testF(newpol,2*k,dump,b,serv,F,*&sol2); // else cout<<"deg"<<deg<<endl; if (nogap) { cout<<"sol3"<<k<<endl; cout<<"kbon"<<kbon<<endl; if (k==deg) { cout<<"pasas por aqui"<<endl; newpol1.erase(newpol1.begin(),newpol1.end()); // newpol=newpol1; for(typename typP::iterator iter=newpol.begin();iter!=newpol.end(); iter++) { cout<<*iter<<" "; cout<<endl; } } newpol1.erase(newpol1.begin(),newpol1.end()); //#ifdef CSDP // generickernel_testTT(newpol1,k,dump,b,serv,F,*&sol3); //#else generickernel_testF(newpol1,k,dump,b,serv,F,*&sol3); //#endif cout<<"solucionprimal k"<< sol2[2] << endl; cout<<"solucionprimal k+1"<< sol3[2] << endl; cout<<"diferenciasprimales"<<abs(sol2[2]-sol3[2])*1e+1<<endl; cout<<"k1"<<k1<<endl; cout<<"k"<<k<<endl; cout<<"gap"<<abs(sol3[2]-sol3[3])*1e+4<<endl; cout<<"deg"<<deg<<endl; cout<<"!newpol.empty()"<<!newpol.empty()<<endl; cout<<"newpol1.empty()"<<newpol1.empty()<<endl; if (((abs(sol2[2]-sol3[2])*1e+1<1) && (!newpol.empty()) && (k1!=k)) || ((k==deg)) ) // if ((abs(sol3[0])*1e+5<1) && (abs(sol2[2]-sol3[2])*1e+5<1) && (!newpol.empty()) && (k1!=k)) { if (k==deg && newpol1.empty()) { nok=0; continue; } else { if (k!=deg) { optimo=1; deg=k+2; cout<<"deg dentro"<<deg<<endl; int numkerf=0; cout<<"noyau bon"<<endl; for(typename typP::iterator iter=newpol.begin();iter!=newpol.end(); iter++,numkerf++) { cout<<*iter<<" "; cout<<endl; } mindeg_newpol=Degree(newpol.front()); cout<<"mindeg "<<mindeg_newpol<<" k1 "<<k1<<endl; for(typename typP::iterator iter=newpol.begin(); iter!=newpol.end();iter++) mindeg_newpol=(mindeg_newpol<Degree(*iter) ?mindeg_newpol:Degree(*iter)); cout<<"mindeg "<<mindeg_newpol<<" k1 "<<k1<<endl; } if (k==deg && (!newpol.empty())) { // for(typename typP::iterator iter=newpol1.begin(); // iter!=newpol1.end();iter++) // newpol.push_back(*iter); // for(typename typP::iterator iter=newpol.begin();iter!=newpol.end(); // iter++) // { // cout<<*iter<<"newpol2fois "; // cout<<endl; // } newpol.erase(newpol.begin(),newpol.end()); newpol=newpol1; mindeg_newpol=Degree(newpol.front()); cout<<"mindeg2fois"<<mindeg_newpol<<endl; } // nok=0; // for(typename typP::iterator iterP=P.begin(); // iterP!=P.end();iterP++) // newpol.push_back(*iterP); P.erase(P.begin(),P.end()); for(typename typP::iterator iter=newpol.begin(); iter!=newpol.end();iter++) if(Degree(*iter)==mindeg_newpol) P.push_back(*iter); if(k-2>=mindeg_newpol) { list<mon *> exceed; list<int> sizeexceed; typPk tmpPk; conv_merge(tmpPk,newpol,exceed,sizeexceed,b,serv); k=mindeg_newpol; // if (!nok) deg=0; // else deg=k*2; cout<<"k noyau bon"<< k<<endl; recover(Pk,Mk,dump,k); // cout<<"Pk.size() apres recover "<<Pk.size()<<endl; if (k!=deg) { if((k>0)||(k==-1)) forget(b,dump,k,recall); else forget0(b,dump,k,recall); } NewCrochetchoix(P,Pk,Mk,tmpPk,k,dump,b,recall,w,serv); for(typename typP::iterator iter=P.begin();iter!=P.end(); iter++) cout<<*iter<<" "; cout<<endl; serv.compress(Pk,dump,b,k); cout<<"compress"<<endl; Dump(Pk,dump); continue; } } } else { cout<<"pasa por aqui cambiamos"<<endl; sol2=sol3; newpol=newpol1; } } else { cout<<"sol2"<<k<<endl; k1=k; newpol.erase(newpol.begin(),newpol.end()); //#ifdef CSDP // generickernel_testTT(newpol,k,dump,b,serv,F,*&sol2); //#else generickernel_testF(newpol,k,dump,b,serv,F,*&sol2); //#endif int numker=0; for(typename typP::iterator iter=newpol.begin();iter!=newpol.end(); iter++,numker++) cout<<*iter<<" "; cout<<endl; cout<<"newpol "<<newpol.empty()<<endl; cout<<"numker"<<numker<<endl; //pour le case de polynome dans degree 2 if (k==2 && maxdeg==1) { nogap=1; optimo=1; nok=0; } else{ cout<<"gap"<<sol2[0]<<endl; cout<<"gapx"<<abs(sol2[0])*1e+4<<endl; if (abs(sol2[0])*1e+4<1){ nogap=1; for(typename typP::iterator iter=newpol.begin();iter!=newpol.end(); iter++,numker++) cout<<*iter<<" "; cout<<endl; cout<<"newpol "<<newpol.empty()<<endl; cout<<"numker"<<numker<<endl; } } } } #ifdef BONRAJOUT for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } #endif #ifdef DEB //cout<<"mon a la fin de la boulcle de l'algo "<<Mk.size()<<endl; //for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++) // cout<<*iter<<endl; cout<<"poly a la fin de la boulcle de l'algo "<<Pk.size()<<endl; for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) //cout<<"les sizes "<<iter->size<<endl; { int cpt=0; cout<<invconv<typename typP::value_type>(*iter)<<endl; for(int i=0;i<iter->sizenf;i++) for(int j=0;j<8;j++) if (((iter->nfind[i]>>j)&1) && (iter->nf[cpt++]==0)) { cout<<"ici ca couille a la place"<<8*i+j<<endl; cout<<iter->sizenf<<" "<<iter->size<<endl; exit(1); } } #endif S=Spolordsup(Pk,b,Spoldejavu); cout<<"newpkmkmatrixof"<<endl; cout<<"k"<<k<<endl; killspol=!newPkMkMatrixof(Mat,Pk,P,Mk,k,b,dump,recall,w,serv); #ifdef PEQUAN sprintf(name,"mat%d",toto); fic=fopen(name,"w"); printmatfile_pequan(Mat,fic); fclose(fic); toto++; #endif if(killspol) S.erase(S.begin(),S.end()); if (k+1>=maxdeg) allpolused=1; cout<<"Mk.size()"<<Mk.size()<<endl; if(Mk.size()==0) nouveaumon=0; //Solve affecte a Mat la valeur U //cout<<"solve"<<endl; for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) cout<<"avant solve les ind "<<iter->ind<<endl; for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++) cout<<"monomes dans Mk "<<*iter<<endl; cout<<"Mat.ncol"<<Mat.ncol<<endl; if (Mat.ncol!=0) { //cout<<"debut du solve"<<endl; Solve(Mat,L,Pk,&pr,&pc,w); // cout<<"fin du solve"<<endl; //for(int kk=0;kk<Mk.size();kk++) // cout<<"permc "<<kk<<" "<<pc[kk]<<endl; inverse(pc,Mk.size()); Dopermu(Mk,pc); { //ici on remet les ind a la bonne valuer //a inclure dans une petite fonction inline apres int j=0; typename typMk::iterator itermon=Mk.begin(); typename typPk::iterator iter; for(iter=Pk.begin(); itermon!=Mk.end();iter++,itermon++,j++) { if(!Iszero(Mat(j,j))) { // cout<<"ligne "<<j<<" je mets le monome "<<*itermon<<endl; iter->ind=*itermon*(iter->ind.GetCoeff()); } else { iter->ind=mon(0); } } //for(;itermon!=Mk.end();iter++,itermon++) // iter->ind=mon(0); } free(pr); free(pc); } //appliquer les permutation a MK!!!!!!!! // for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) // cout<<"apres solve les ind "<<iter->ind<<endl; //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) // cout<<"apres solve les pol "<<invconv<Poly>(*iter)<<endl; // // //APPLIQUER LES PERMUTYATIONS A MK!! // // // // if ((unsigned)my_rank(Mat)==Mk.size()) //matrice de rang plein { typMk tmpSpoldejavu; typPk redspol,secd=secondmembre(Mat,Pk);; cout<<"matrice de rang plein "<<endl; Dump(Pk,dump); cout<<"Reduce Spol "<<endl; ReduceSpol(S,dump,redspol,b,w,serv);//tmpSpoldejavu); cout<<"secd.size() "<<secd.size()<<endl; my_merge(redspol,secd); if(redspol.size()==0) { //a voir.... Dump(Pk,dump); k++; my_merge(Spoldejavu,tmpSpoldejavu); L.destroystore(); continue; //la matrice a rang plein //ET les Spol\secondmembre de ce niveau se ,reduisent a 0 } else { //on a des spol\secondmembre qui se reduisent pas a 0 //cad un defaut de commuatation int tmpdeg=mindeg(redspol,serv); max_degppcm=k+2; nouveaumon=1; cout<<"redspol.size() "<<redspol.size()<<endl; if (tmpdeg==(k+1)) my_merge(Spoldejavu,tmpSpoldejavu); k=tmpdeg; //cout<<"le mindeg ici vaut "<<k<<endl; //cout<<"Pk.size() avant recover "<<Pk.size()<<endl; recover(Pk,Mk,dump,k); //cout<<"Pk.size() apres recover "<<Pk.size()<<endl; forget(b,dump,k,recall); //forget(b,dump,k); #ifdef DEB cout<<"Pk.size() avant Crochetchoix "<<Pk.size()<<endl; #endif //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu); NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,w,serv); //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b); #ifdef DEB cout<<"Pk.size apres Crochetchoix "<<Pk.size()<<" et k "<<k<<endl; #endif NewDestroyredspol(redspol,Pk); serv.compress(Pk,dump,b,k); Dump(Pk,dump); L.destroystore(); cout<<"kaquiPini"<<k<<endl; //misa jour de B dans crochet choix!! continue; } } else //la matrice n'est pas de rang plein { cout<<"matrice de rang pas plein "<<endl; typPk secd; #ifdef BONRAJOUT AddB_dim(Mat,L,P,Pk,Mk,dump,b); #else AddB(Mat,Pk,Mk,dump,b,serv); #endif // //secondmembre supprime des trucs dans Pk!! // secd=secondmembre(Mat,Pk); rajoute_voisins(Pk,Mk,dump,b,w,serv); //ne selectionne que les non nuls if(secd.size()==0) { typPk redspol; Dump(Pk,dump); ReduceSpol(S,dump,redspol,b,w,serv); #ifdef NO_TWICE for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++) P.push_back(invconv<polyalp>(*iter)); #endif if(redspol.size()==0) { //ici on modifie Pk dans AddB //<=> forget(b,dump,k) AddB(..) Dump(Pk,dump); k++; L.destroystore(); continue; //la matrice a pas rang plein second membre =0 //ET les Spol de ce niveau se ,reduisent a 0 } else { //on a des spol qui se reduisent pas a 0 //cad un defaut de commutation k=mindeg(redspol,serv); recover(Pk,Mk,dump,k); //Listedejafait(Mk,Spoldejavu); forget(b,dump,k,recall); //forget(b,dump,k); cout<<"il ya un passage par mat rang pas" <<"plein et pol non zero"<<endl; //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu); NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,w,serv); //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b); NewDestroyredspol(redspol,Pk); serv.compress(Pk,dump,b,k); Dump(Pk,dump); L.destroystore(); continue; } } else { //on a des pol qui se reduisent pas a 0 //cad un defaut de commuatation dans les coins typPk redspol; //for(int i=Pk.size();i>rank(Mat);i--) // Pk.pop_back(); //cout<<"PK. size "<<Pk.size()<<" Mat.nbcol "<<Mat.ncol<<endl; //cout<<"rank(Mat) "<<rank(Mat)<<endl; //int j=0; //cout<<"avant recover et meme avant le dump "<<endl; //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() // ;iter++,j++) // cout<<"pol de secd num "<<j<<endl<<invconv<Poly>(*iter)<<endl; // AddB(Mat,Pk,Mk,b); //cout<<"apres ADDB le dump "<<endl; //for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; Dump(Pk,dump); //cout<<"secd.size()" <<secd.size()<<endl; ReduceSpol(S,dump,redspol,b,w,serv);//,Spoldejavu); my_merge(secd,redspol); #ifdef NO_TWICE for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++) P.push_back(invconv<polyalp>(*iter)); #endif k=mindeg(secd,serv); recover(Pk,Mk,dump,k); //cout<<"k "<<k<<endl; //Listedejafait(Mk,Spoldejavu); //cout<<"apres recover"<<endl; // for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; //cout<<"les Spol non reduits"<<endl; //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; forget(b,dump,k,recall); //forget(b,dump,k); //cout<<"il ya un passage par mat pas rang plein et Spol non zero"<<endl; //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu); NewCrochetchoix(P,Pk,Mk,secd,k,dump,b,recall,w,serv); //NewCrochetchoix(P,Pk,Mk,secd,k,dump,b); NewDestroyredspol(secd,Pk); #ifdef BONRAJOUT cout<<"Apres NewCrochetchoix"<<endl; for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } #endif //for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() // ;iter++) // cout<<invconv<Poly>(*iter)<<endl; serv.compress(Pk,dump,b,k); Dump(Pk,dump); L.destroystore(); continue; } } } Mat.destroystore(); #ifdef DEBUG for(typename Base::const_iterator p=b.begin();p!=b.end();p++) { for(int i=0;i<p->taille1;i++) { cout<<"p.accept[i] "<<p->accept[i]<<endl; } for(int i=0;i<p->taille2;i++) { cout<<"p.refuse[i] "<<p->refuse[i]<<endl; } } #endif destroy_space(&w); // delete[] &sol2; // delete[] &sol3; cout<<"sortie d'algo flash et dimension "<<endl;//<<critere(b,k)<<endl; cout<<"TPS SDP "<<tempsCDSP<<endl; return ;//dump; //comme ca on conserve le tri par degre des formes normales et //donc la construction des operateurs de multiplication se //fait plus vite.. :-) } #endif //ALREADY_corealgo3
3595  }
3596  // cout<<endl;
3597  cout<<"g trouve ca comme nvlle eq "<<endl<<tmp<<endl;
3598  newpol.push_back(tmp);
3599 
3600  }
3601 
3602  delete[] S;
3603  delete[] V;
3604  delete[] work;
3605  delete[] sol;
3606  }
3607 }
3608 
3609 template<typename typdump,typename Base, typename typserv>
3610 int testsdp(int k, const typdump &dump,const Base &b,const typserv &serv)
3611 {
3612  return !(k%2);
3613 }
3614 template<typename typP,typename typPk,typename typdump,typename Base
3615  , template<typename T> class tmptypmat ,typename monomial_server>
3616 void algo(typP P,typdump &dump,Base &b, monomial_server &serv)
3617 {
3618 #ifdef PEQUAN
3619  int toto=0;
3620  FILE *fic;
3621  char name[8];
3622 #endif
3623  typedef typename typP::value_type polyalp;
3624  typedef list<typename typPk::value_type::monom_t> typMk;
3625  typedef typename typMk::value_type mon;
3626  typedef typename typPk::value_type pol;
3627 
3628  typMk Mk;
3629  typMk Spoldejavu;
3630  typPk Pk,S;
3631  //typP recall
3632  typPk recall;
3633  //Base b;
3635  typedef tmptypmat<typename typP::value_type::coeff_t> typMat;
3636  typMat Mat,L;
3637  int onemoretime=1,nouveaumon,allpolused=0,maxdeg,k,*pr,*pc;
3638  cout<<"avant init"<<endl;
3639 
3640  init_algo<typMat>(P,nouveaumon,maxdeg,k,Pk,Mk,b,dump,w,serv);
3641  cout<<"apres init"<<endl;
3642  cout<<"onemoretime "<<onemoretime<<endl;
3643  cout<<"nouveaumon "<<nouveaumon<<endl;
3644  cout<<"k "<<k<<endl;
3645  cout<<"maxdeg "<<maxdeg<<endl;
3646 #ifndef GROEBNER
3647 
3648 
3649  // while((critere(b,k)==-1)||(k<=maxdeg))
3650 #ifdef ONEMORETIME
3651  cout<<"one"<<endl;
3652  while(nouveaumon||(k<=maxdeg)||onemoretime)
3653 #else
3654  while(nouveaumon||(k<=maxdeg))
3655 #endif
3656 #else
3657  while(!GB_stop(k)||(k<=maxdeg))
3658 #endif
3659 
3660  {
3661 #ifdef ONEMORETIME
3662  cout<<"two"<<endl;
3663  cout<<"nouveaumon"<<endl;
3664  if(!nouveaumon)
3665  cout<<"si"<<endl;
3666  onemoretime=0;
3667 #endif
3668  //if (toto>=5) {exit(0);}
3669  //toto++;
3670 
3671  int killspol;
3672  //test si on est dans les conditions d'application
3673  gettimeofday(&initclock,NULL);
3674  cout<<"onemoretime "<<onemoretime<<endl;
3675  cout<<"nouveaumon"<<nouveaumon<< endl;
3676  cout<<"k "<<k<<endl;
3677  cout<<"maxdeg "<<maxdeg<<endl;
3678  cout<<"testsdp(k,dump,b,serv) "<<testsdp(k,dump,b,serv)<<endl;
3679  if(testsdp(k,dump,b,serv)||(!onemoretime))
3680  //envoie la routine de calcul de sdp
3681  {
3682  int mindeg_newpol;
3683  typP newpol;
3684  cout<<"un nouveau tour de boucle et k vaut "<<k<<endl;
3685  if(!onemoretime)//sdpa!!!!!!!!
3686  // generickernel(newpol,2*k,dump,b,serv);
3687  generickernel_testT(newpol,2*k,dump,b,serv);
3688  // generickernelsdpa(newpol,2*k,dump,b,serv);
3689  else
3690  // generickernel(newpol,k,dump,b,serv);
3691  generickernel_testT(newpol,k,dump,b,serv);
3692  //generickernelsdpa(newpol,k,dump,b,serv);
3693  gettimeofday(&tmpclock,NULL);
3694  tempsdssdp+=tmpclock.tv_sec-initclock.tv_sec+1e-6*(tmpclock.tv_usec-initclock.tv_usec);
3695 
3696  //sdprealrad(newpol,dump,b,serv);
3697  //penser a decroitre k le cas echeant avec un coup de recover
3698  cout<<"newpol "<<newpol.empty()<<endl;
3699  if(!newpol.empty())
3700  {
3701  mindeg_newpol=Degree(newpol.front());
3702 // cout<<"mindeg "<<mindeg_newpol<<" k "<<k<<endl;
3703  for(typename typP::iterator iter=newpol.begin();
3704  iter!=newpol.end();iter++)
3705  mindeg_newpol=(mindeg_newpol<Degree(*iter)
3706  ?mindeg_newpol:Degree(*iter));
3707  for(typename typP::iterator iter=newpol.begin();
3708  iter!=newpol.end();iter++)
3709  if(Degree(*iter)==mindeg_newpol)
3710  P.push_back(*iter);
3711  if(k>=mindeg_newpol)
3712  {
3713  list<mon *> exceed;
3714  list<int> sizeexceed;
3715  typPk tmpPk;
3716  conv_merge(tmpPk,newpol,exceed,sizeexceed,b,serv);
3717 // cout<<"merde merde k "<<k<<" mindeg_newpol "<<mindeg_newpol<<endl;
3718  k=mindeg_newpol;
3719  // forget(b,dump,k,recall);
3720  // recover(Pk,Mk,dump,k);
3721  recover(Pk,Mk,dump,k);
3722 
3723  //Listedejafait(Mk,Spoldejavu);
3724 // cout<<"Pk.size() apres recover "<<Pk.size()<<endl;
3725  if((k>0)||(k==-1))
3726  forget(b,dump,k,recall);
3727  else
3728  forget0(b,dump,k,recall);
3729 // cout<<"forget fait"<<endl;
3730  //forget(b,dump,k);
3731  NewCrochetchoix(P,Pk,Mk,tmpPk,k,dump,b,recall,w,serv);
3732  serv.compress(Pk,dump,b,k);
3733  cout<<"compress"<<endl;
3734  Dump(Pk,dump);
3735  continue;
3736  }
3737  }
3738  }
3739 #ifdef BONRAJOUT
3740  for(typename Base::const_iterator p=b.begin();p!=b.end();p++)
3741  {
3742  for(int i=0;i<p->taille1;i++)
3743  {
3744  cout<<"p.accept[i] "<<p->accept[i]<<endl;
3745  }
3746  for(int i=0;i<p->taille2;i++)
3747  {
3748  cout<<"p.refuse[i] "<<p->refuse[i]<<endl;
3749  }
3750  }
3751 #endif
3752 #if 1//def DEB
3753 
3754  //cout<<"mon a la fin de la boulcle de l'algo "<<Mk.size()<<endl;
3755  //for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++)
3756  // cout<<*iter<<endl;
3757  cout<<"poly a la fin de la boulcle de l'algo "<<Pk.size()<<endl;
3758  for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
3759  //cout<<"les sizes "<<iter->size<<endl;
3760  {
3761  int cpt=0;
3762  cout<<invconv<typename typP::value_type>(*iter,serv)<<endl;
3763  for(int i=0;i<iter->sizenf;i++)
3764  for(int j=0;j<8;j++)
3765  if (((iter->nfind[i]>>j)&1) && (iter->nf[cpt++]==0))
3766  {
3767  cout<<"ici ca couille a la place"<<8*i+j<<endl;
3768  cout<<iter->sizenf<<" "<<iter->size<<endl;
3769  exit(1);
3770  }
3771  }
3772 #endif
3773 
3774  // cout<<"Spolordsup"<<endl;
3775  S=Spolordsup(Pk,b,Spoldejavu);
3776  //S.erase(S.begin(),S.end());
3777  //S=Spolordsup(Pk,b);
3778  cout<<endl;
3779  cout<<endl<<"newpkmkmatrixof"<<endl;
3780  //cout<<"Pk.size() "<<Pk.size()<<endl;
3781  //killspol=!newPkMkMatrixof(Mat,Pk,P,Mk,k,b,dump,recall,Spoldejavu);
3782  killspol=!newPkMkMatrixof(Mat,Pk,P,Mk,k,b,dump,recall,w,serv);
3783 #ifdef PEQUAN
3784  sprintf(name,"mat%d",toto);
3785  fic=fopen(name,"w");
3786  printmatfile_pequan(Mat,fic);
3787  fclose(fic);
3788  toto++;
3789 #endif
3790  // if (toto>=5) {cout<<"killredspol "<<killspol<<endl; exit(0);}
3791  // killspol=!newPkMkMatrixof(Mat,Pk,P,Mk,k,b,dump);
3792  if(killspol) S.erase(S.begin(),S.end());
3793  if (k+1>=maxdeg) allpolused=1;
3794  if(Mk.size()==0) nouveaumon=0;
3795  //cout<<"j'en suis a k="<<k<<endl;
3796  //cout<<"Ici dans algo Mat"<<endl;
3797  //#ifdef BONRAJOUT
3798  //affdebug(Mat);
3799  //#endif
3800  //Solve affecte a Mat la valeur U
3801  //cout<<"solve"<<endl;
3802  //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
3803  // cout<<"avant solve les ind "<<iter->ind<<endl;
3804  //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
3805  // cout<<"avant solve les pol "<<invconv<Poly>(*iter)<<endl;
3806  //if(k==3) exit(-10);
3807  //for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++)
3808  // cout<<"monomes dans Mk "<<*iter<<endl;
3809 
3810  if (Mat.ncol!=0)
3811  {
3812  //cout<<"debut du solve"<<endl;
3813  Solve(Mat,L,Pk,&pr,&pc,w);
3814 // cout<<"fin du solve"<<endl;
3815  //for(int kk=0;kk<Mk.size();kk++)
3816  // cout<<"permc "<<kk<<" "<<pc[kk]<<endl;
3817  inverse(pc,Mk.size());
3818  Dopermu(Mk,pc);
3819  {
3820  //ici on remet les ind a la bonne valuer
3821  //a inclure dans une petite fonction inline apres
3822  int j=0;
3823  typename typMk::iterator itermon=Mk.begin();
3824  typename typPk::iterator iter;
3825  for(iter=Pk.begin();
3826  itermon!=Mk.end();iter++,itermon++,j++)
3827  {
3828  if(!Iszero(Mat(j,j)))
3829  {
3830  // cout<<"ligne "<<j<<" je mets le monome "<<*itermon<<endl;
3831  iter->ind=*itermon*(iter->ind.GetCoeff());
3832  }
3833  else
3834  {
3835  iter->ind=mon(0);
3836  }
3837  }
3838  //for(;itermon!=Mk.end();iter++,itermon++)
3839  // iter->ind=mon(0);
3840  }
3841 
3842  free(pr);
3843  free(pc);
3844  }
3845 
3846  //appliquer les permutation a MK!!!!!!!!
3847  // for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
3848  // cout<<"apres solve les ind "<<iter->ind<<endl;
3849  //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
3850  // cout<<"apres solve les pol "<<invconv<Poly>(*iter)<<endl;
3851  //
3852  //
3853  //APPLIQUER LES PERMUTYATIONS A MK!!
3854  //
3855  //
3856  //
3857  //
3858  if ((unsigned)my_rank(Mat)==Mk.size())
3859  //matrice de rang plein
3860  {
3861  typMk tmpSpoldejavu;
3862  typPk redspol,secd=secondmembre(Mat,Pk);;
3863  //secondmembre2(Mat,Pk,secd);
3864  //typename typPk::iterator iter=Pk.begin();
3865  cout<<"matrice de rang plein "<<endl;
3866  //for(unsigned int i=0;i<Mk.size();i++,iter++);
3867  //Pk.erase(iter,Pk.end());
3868  //cout<<"Dump "<<endl;
3869  Dump(Pk,dump);
3870  //cout<<"Reduce Spol "<<endl;
3871 
3872  ReduceSpol(S,dump,redspol,b,w,serv);//tmpSpoldejavu);
3873  //cout<<"secd.size() "<<secd.size()<<endl;
3874  my_merge(redspol,secd);
3875  if(redspol.size()==0)
3876  {
3877  //a voir.... Dump(Pk,dump);
3878  k++;
3879  my_merge(Spoldejavu,tmpSpoldejavu);
3880  L.destroystore();
3881  continue;
3882  //la matrice a rang plein
3883  //ET les Spol\secondmembre de ce niveau se ,reduisent a 0
3884  }
3885  else
3886  {
3887  //on a des spol\secondmembre qui se reduisent pas a 0
3888  //cad un defaut de commuatation
3889  int tmpdeg=mindeg(redspol,serv);
3890  max_degppcm=k+2;
3891  nouveaumon=1;
3892  cout<<"redspol.size() "<<redspol.size()<<endl;
3893  //cout<<invconv<typename typP::value_type>(redspol.front())<<endl;
3894  if (tmpdeg==(k+1))
3895  my_merge(Spoldejavu,tmpSpoldejavu);
3896  k=tmpdeg;
3897  //cout<<"le mindeg ici vaut "<<k<<endl;
3898  //cout<<"Pk.size() avant recover "<<Pk.size()<<endl;
3899  recover(Pk,Mk,dump,k);
3900 
3901  //Listedejafait(Mk,Spoldejavu);
3902  //cout<<"Pk.size() apres recover "<<Pk.size()<<endl;
3903  forget(b,dump,k,recall);
3904  //forget(b,dump,k);
3905 #ifdef DEB
3906  cout<<"Pk.size() avant Crochetchoix "<<Pk.size()<<endl;
3907 #endif
3908  //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu);
3909  NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,w,serv);
3910  //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b);
3911 #ifdef DEB
3912  cout<<"Pk.size apres Crochetchoix "<<Pk.size()<<" et k "<<k<<endl;
3913 #endif
3914  NewDestroyredspol(redspol,Pk);
3915  serv.compress(Pk,dump,b,k);
3916  Dump(Pk,dump);
3917  L.destroystore();
3918  //misa jour de B dans crochet choix!!
3919  continue;
3920  }
3921  }
3922  else
3923  //la matrice n'est pas de rang plein
3924  {
3925  cout<<"matrice de rang pas plein "<<endl;
3926  typPk secd;
3927 #ifdef BONRAJOUT
3928  AddB_dim(Mat,L,P,Pk,Mk,dump,b);
3929 #else
3930  AddB(Mat,Pk,Mk,dump,b,serv);
3931 #endif
3932  //
3933  //secondmembre supprime des trucs dans Pk!!
3934  //
3935  secd=secondmembre(Mat,Pk);
3936  rajoute_voisins(Pk,Mk,dump,b,w,serv);
3937  //ne selectionne que les non nuls
3938  if(secd.size()==0)
3939  {
3940  typPk redspol;
3941  //for(int i=Pk.size();i>rank(Mat);i--)
3942  //{
3943  // if(Pk.back().size!=0)
3944  // MAC_REV_FREE<typename typMat::coeff_t>(Pk.rbegin()->nf
3945  // ,Pk.rbegin()->size*sizeof(typename typMat::coeff_t));
3946  // Pk.pop_back();
3947  //}//on vire les 0 avant de dumper
3948  // AddB(Mat,Pk,Mk,dump,b);
3949  Dump(Pk,dump);
3950  ReduceSpol(S,dump,redspol,b,w,serv);//,Spoldejavu);
3951 #ifdef NO_TWICE
3952 for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++)
3953  P.push_back(invconv<polyalp>(*iter));
3954 #endif
3955  if(redspol.size()==0)
3956  {
3957  // forget(b,dump,k);
3958  //AddB(Mat,Pk,Mk,b);
3959  //Dump(Pk,dump);
3960  //ici on modifie Pk dans AddB
3961  //<=> forget(b,dump,k) AddB(..) Dump(Pk,dump);
3962  k++;
3963  L.destroystore();
3964  continue;
3965  //la matrice a pas rang plein second membre =0
3966  //ET les Spol de ce niveau se ,reduisent a 0
3967  }
3968  else
3969  {
3970  //on a des spol qui se reduisent pas a 0
3971  //cad un defaut de commutation
3972  k=mindeg(redspol,serv);
3973  recover(Pk,Mk,dump,k);
3974  //Listedejafait(Mk,Spoldejavu);
3975  forget(b,dump,k,recall);
3976  //forget(b,dump,k);
3977  cout<<"il ya un passage par mat rang pas"
3978  <<"plein et pol non zero"<<endl;
3979  //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu);
3980  NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,w,serv);
3981  //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b);
3982  NewDestroyredspol(redspol,Pk);
3983  serv.compress(Pk,dump,b,k);
3984  Dump(Pk,dump);
3985  L.destroystore();
3986  continue;
3987  }
3988  }
3989  else
3990  {
3991  //on a des pol qui se reduisent pas a 0
3992  //cad un defaut de commuatation dans les coins
3993  typPk redspol;
3994  //for(int i=Pk.size();i>rank(Mat);i--)
3995  // Pk.pop_back();
3996  //cout<<"PK. size "<<Pk.size()<<" Mat.nbcol "<<Mat.ncol<<endl;
3997  //cout<<"rank(Mat) "<<rank(Mat)<<endl;
3998  //int j=0;
3999  //cout<<"avant recover et meme avant le dump "<<endl;
4000  //for(typename typPk::iterator iter = secd.begin();iter!=secd.end()
4001  // ;iter++,j++)
4002  // cout<<"pol de secd num "<<j<<endl<<invconv<Poly>(*iter)<<endl;
4003  // AddB(Mat,Pk,Mk,b);
4004  //cout<<"apres ADDB le dump "<<endl;
4005  //for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end()
4006  // ;iter++)
4007  // cout<<invconv<Poly>(*iter)<<endl;
4008  Dump(Pk,dump);
4009  //cout<<"secd.size()" <<secd.size()<<endl;
4010  ReduceSpol(S,dump,redspol,b,w,serv);//,Spoldejavu);
4011  my_merge(secd,redspol);
4012 #ifdef NO_TWICE
4013 for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++)
4014  P.push_back(invconv<polyalp>(*iter));
4015 #endif
4016  k=mindeg(secd,serv);
4017  recover(Pk,Mk,dump,k);
4018  //cout<<"k "<<k<<endl;
4019  //Listedejafait(Mk,Spoldejavu);
4020  //cout<<"apres recover"<<endl;
4021  // for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end()
4022  // ;iter++)
4023  // cout<<invconv<Poly>(*iter)<<endl;
4024  //cout<<"les Spol non reduits"<<endl;
4025  //for(typename typPk::iterator iter = secd.begin();iter!=secd.end()
4026  // ;iter++)
4027  // cout<<invconv<Poly>(*iter)<<endl;
4028  forget(b,dump,k,recall);
4029 
4030  //forget(b,dump,k);
4031  //cout<<"il ya un passage par mat pas rang plein et Spol non zero"<<endl;
4032  //for(typename typPk::iterator iter = secd.begin();iter!=secd.end()
4033  // ;iter++)
4034  // cout<<invconv<Poly>(*iter)<<endl;
4035  //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu);
4036  NewCrochetchoix(P,Pk,Mk,secd,k,dump,b,recall,w,serv);
4037  //NewCrochetchoix(P,Pk,Mk,secd,k,dump,b);
4038  NewDestroyredspol(secd,Pk);
4039 #ifdef BONRAJOUT
4040  cout<<"Apres NewCrochetchoix"<<endl;
4041 
4042  for(typename Base::const_iterator p=b.begin();p!=b.end();p++)
4043  {
4044  for(int i=0;i<p->taille1;i++)
4045  {
4046  cout<<"p.accept[i] "<<p->accept[i]<<endl;
4047  }
4048  for(int i=0;i<p->taille2;i++)
4049  {
4050  cout<<"p.refuse[i] "<<p->refuse[i]<<endl;
4051  }
4052  }
4053 #endif
4054  //for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end()
4055  // ;iter++)
4056  // cout<<invconv<Poly>(*iter)<<endl;
4057  serv.compress(Pk,dump,b,k);
4058  Dump(Pk,dump);
4059  L.destroystore();
4060  continue;
4061  }
4062 
4063  }
4064  }
4065 
4066  Mat.destroystore();
4067  //while nouveau mon etc...
4068  // Pk=recomposePk(dump);
4069  //return Pk;
4070  // return;
4071 #ifdef DEBUG
4072  for(typename Base::const_iterator p=b.begin();p!=b.end();p++)
4073  {
4074  for(int i=0;i<p->taille1;i++)
4075  {
4076  cout<<"p.accept[i] "<<p->accept[i]<<endl;
4077  }
4078  for(int i=0;i<p->taille2;i++)
4079  {
4080  cout<<"p.refuse[i] "<<p->refuse[i]<<endl;
4081  }
4082  }
4083 #endif
4084  destroy_space(&w);
4085  cout<<"sortie d'algo flash et dimension "<<endl;//<<critere(b,k)<<endl;
4086  return ;//dump;
4087  //comme ca on conserve le tri par degre des formes normales et
4088  //donc la construction des operateurs de multiplication se
4089  //fait plus vite.. :-)
4090 
4091  }
4092 
4093 template<typename typP,typename typPk,typename typdump,typename Base
4094  , template<typename T> class tmptypmat ,typename monomial_server>
4095 void algo(typP P,typdump &dump,Base &b, monomial_server &serv,typP F)
4096 {
4097 #ifdef PEQUAN
4098  int toto=0;
4099  FILE *fic;
4100  char name[8];
4101 #endif
4102  typedef typename typP::value_type polyalp;
4103  typedef list<typename typPk::value_type::monom_t> typMk;
4104  typedef typename typMk::value_type mon;
4105  typedef typename typPk::value_type pol;
4106  cout<<"entra aqui "<<endl;
4107  typMk Mk;
4108  typMk Spoldejavu;
4109  typPk Pk,S;
4110  typPk recall;
4111  typP Pini;
4113  typedef tmptypmat<typename typP::value_type::coeff_t> typMat;
4114  typMat Mat,L;
4115  int onemoretime=1,nouveaumon,allpolused=0,maxdeg,k,maxdegb,kb,*pr,*pc,optimo=0,k1;
4116  int nogap=0,deg=0,nok=1, noreduced=0, kbon,kini;
4117 
4118  typP newpol,newpol1;
4119  COEFF *sol2,*sol3;
4120  cout<<"avant init"<<endl;
4121 
4122  init_algo<typMat>(P,nouveaumon,maxdeg,k,Pk,Mk,b,dump,w,serv);
4123  Pini=P;
4124  kini=k;
4125  cout<<"apres init"<<endl;
4126  cout<<"onemoretime "<<onemoretime<<endl;
4127  cout<<"nouveaumon "<<nouveaumon<<endl;
4128  cout<<"k "<<k<<endl;
4129  cout<<"maxdeg "<<maxdeg<<endl;
4130 #ifndef GROEBNER
4131 
4132 #ifdef ONEMORETIME
4133  cout<<"one"<<endl;
4134  while(nouveaumon||(k<=maxdeg)||onemoretime)
4135 #else
4136  while(nouveaumon||(k<=maxdeg)|| (!optimo) || nok )//|| (k!=deg))
4137 
4138 #endif
4139 #else
4140  while(!GB_stop(k)||(k<=maxdeg))
4141 #endif
4142 
4143  {
4144 #ifdef ONEMORETIME
4145  cout<<"two"<<endl;
4146  cout<<"nouveaumon"<<endl;
4147  if(!nouveaumon)
4148  cout<<"si"<<endl;
4149  onemoretime=0;
4150 #endif
4151 
4152 
4153  int killspol;
4154  //test si on est dans les conditions d'application
4155  gettimeofday(&initclock,NULL);
4156  cout<<"onemoretime "<<onemoretime<<endl;
4157  cout<<"nouveaumon"<<nouveaumon<< endl;
4158  cout<<"k "<<k<<endl;
4159  cout<<"maxdeg "<<maxdeg<<endl;
4160  cout<<"testsdp(k,dump,b,serv) "<<testsdp(k,dump,b,serv)<<endl;
4161  for(typename Base::const_iterator p=b.begin();p!=b.end();p++)
4162  {
4163  for(int i=0;i<p->taille1;i++)
4164  {
4165  cout<<"p.accept[i] "<<p->accept[i]<<endl;
4166  }
4167  for(int i=0;i<p->taille2;i++)
4168  {
4169  cout<<"p.refuse[i] "<<p->refuse[i]<<endl;
4170  }
4171  }
4172 //todo este if es por ver si el noyau de k+1 se reduce con la base que hemos calculado o no
4173 //hay un problema en la reinicializacion de las variables cuando el noyau no se reduce
4174  cout<<"k"<<k<<endl;
4175  cout<<"maxdeg"<<maxdeg<<endl;
4176  cout<<"optimo"<<optimo<<endl;
4177  cout<<"nok"<<nok<<endl;
4178 
4179 
4180 // if(testsdp(k,dump,b,serv)||(!onemoretime))
4181  if((testsdp(k,dump,b,serv) && (!optimo)) || (k==deg))
4182  //envoie la routine de calcul de sdp
4183  {
4184  int mindeg_newpol;
4185 
4186 
4187 
4188 
4189  cout<<"un nouveau tour de boucle et k vaut "<<k<<endl;
4190 // if(!onemoretime)//sdpa!!!!!!!!
4191 // generickernel_testF(newpol,2*k,dump,b,serv,F,*&sol2);
4192 // else
4193 
4194  cout<<"deg"<<deg<<endl;
4195 
4196  if (nogap)
4197  {
4198  cout<<"sol3"<<k<<endl;
4199  cout<<"kbon"<<kbon<<endl;
4200  if (k==deg)
4201  { cout<<"pasas por aqui"<<endl;
4202  newpol1.erase(newpol1.begin(),newpol1.end());
4203 // newpol=newpol1;
4204 
4205  for(typename typP::iterator iter=newpol.begin();iter!=newpol.end();
4206  iter++)
4207  {
4208  cout<<*iter<<" ";
4209  cout<<endl;
4210  }
4211  }
4212 
4213 
4214  newpol1.erase(newpol1.begin(),newpol1.end());
4215 //#ifdef CSDP
4216 // generickernel_testTT(newpol1,k,dump,b,serv,F,*&sol3);
4217 //#else
4218  generickernel_testF(newpol1,k,dump,b,serv,F,*&sol3);
4219 //#endif
4220  cout<<"solucionprimal k"<< sol2[2] << endl;
4221  cout<<"solucionprimal k+1"<< sol3[2] << endl;
4222  cout<<"diferenciasprimales"<<abs(sol2[2]-sol3[2])*1e+1<<endl;
4223  cout<<"k1"<<k1<<endl;
4224  cout<<"k"<<k<<endl;
4225  cout<<"gap"<<abs(sol3[2]-sol3[3])*1e+4<<endl;
4226  cout<<"deg"<<deg<<endl;
4227  cout<<"!newpol.empty()"<<!newpol.empty()<<endl;
4228  cout<<"newpol1.empty()"<<newpol1.empty()<<endl;
4229 
4230 
4231  if (((abs(sol2[2]-sol3[2])*1e+1<1) && (!newpol.empty()) && (k1!=k))
4232  || ((k==deg)) )
4233 // if ((abs(sol3[0])*1e+5<1) && (abs(sol2[2]-sol3[2])*1e+5<1) && (!newpol.empty()) && (k1!=k))
4234 
4235  {
4236  if (k==deg && newpol1.empty())
4237  {
4238 
4239  nok=0;
4240  continue;
4241 
4242  }
4243  else
4244  {
4245  if (k!=deg)
4246  {
4247  optimo=1;
4248  deg=k+2;
4249  cout<<"deg dentro"<<deg<<endl;
4250  int numkerf=0;
4251  cout<<"noyau bon"<<endl;
4252  for(typename typP::iterator iter=newpol.begin();iter!=newpol.end();
4253  iter++,numkerf++)
4254  {
4255  cout<<*iter<<" ";
4256  cout<<endl;
4257  }
4258  mindeg_newpol=Degree(newpol.front());
4259  cout<<"mindeg "<<mindeg_newpol<<" k1 "<<k1<<endl;
4260  for(typename typP::iterator iter=newpol.begin();
4261  iter!=newpol.end();iter++)
4262  mindeg_newpol=(mindeg_newpol<Degree(*iter)
4263  ?mindeg_newpol:Degree(*iter));
4264  cout<<"mindeg "<<mindeg_newpol<<" k1 "<<k1<<endl;
4265  }
4266  if (k==deg && (!newpol.empty()))
4267  {
4268 // for(typename typP::iterator iter=newpol1.begin();
4269 // iter!=newpol1.end();iter++)
4270 // newpol.push_back(*iter);
4271 // for(typename typP::iterator iter=newpol.begin();iter!=newpol.end();
4272 // iter++)
4273 // {
4274 // cout<<*iter<<"newpol2fois ";
4275 // cout<<endl;
4276 // }
4277  newpol.erase(newpol.begin(),newpol.end());
4278  newpol=newpol1;
4279  mindeg_newpol=Degree(newpol.front());
4280  cout<<"mindeg2fois"<<mindeg_newpol<<endl;
4281  }
4282 // nok=0;
4283 
4284 // for(typename typP::iterator iterP=P.begin();
4285 // iterP!=P.end();iterP++)
4286 // newpol.push_back(*iterP);
4287  P.erase(P.begin(),P.end());
4288  for(typename typP::iterator iter=newpol.begin();
4289  iter!=newpol.end();iter++)
4290  if(Degree(*iter)==mindeg_newpol)
4291  P.push_back(*iter);
4292  if(k-2>=mindeg_newpol)
4293  {
4294  list<mon *> exceed;
4295  list<int> sizeexceed;
4296  typPk tmpPk;
4297  conv_merge(tmpPk,newpol,exceed,sizeexceed,b,serv);
4298  k=mindeg_newpol;
4299 
4300 // if (!nok) deg=0;
4301 // else deg=k*2;
4302  cout<<"k noyau bon"<< k<<endl;
4303 
4304 
4305  recover(Pk,Mk,dump,k);
4306 
4307 
4308 // cout<<"Pk.size() apres recover "<<Pk.size()<<endl;
4309  if (k!=deg)
4310  {
4311  if((k>0)||(k==-1))
4312  forget(b,dump,k,recall);
4313  else
4314  forget0(b,dump,k,recall);
4315  }
4316 
4317  NewCrochetchoix(P,Pk,Mk,tmpPk,k,dump,b,recall,w,serv);
4318  for(typename typP::iterator iter=P.begin();iter!=P.end();
4319  iter++)
4320  cout<<*iter<<" ";
4321  cout<<endl;
4322  serv.compress(Pk,dump,b,k);
4323  cout<<"compress"<<endl;
4324  Dump(Pk,dump);
4325 
4326  continue;
4327  }
4328  }
4329  }
4330  else
4331  {
4332 
4333  cout<<"pasa por aqui cambiamos"<<endl;
4334  sol2=sol3;
4335  newpol=newpol1;
4336 
4337 
4338  }
4339  }
4340  else
4341  {
4342  cout<<"sol2"<<k<<endl;
4343  k1=k;
4344  newpol.erase(newpol.begin(),newpol.end());
4345 //#ifdef CSDP
4346 // generickernel_testTT(newpol,k,dump,b,serv,F,*&sol2);
4347 //#else
4348  generickernel_testF(newpol,k,dump,b,serv,F,*&sol2);
4349 //#endif
4350  int numker=0;
4351 
4352  for(typename typP::iterator iter=newpol.begin();iter!=newpol.end();
4353  iter++,numker++)
4354  cout<<*iter<<" ";
4355  cout<<endl;
4356  cout<<"newpol "<<newpol.empty()<<endl;
4357  cout<<"numker"<<numker<<endl;
4358  //pour le case de polynome dans degree 2
4359  if (k==2 && maxdeg==1)
4360  {
4361  nogap=1;
4362  optimo=1;
4363  nok=0;
4364 
4365  }
4366  else{
4367 
4368  cout<<"gap"<<sol2[0]<<endl;
4369  cout<<"gapx"<<abs(sol2[0])*1e+4<<endl;
4370  if (abs(sol2[0])*1e+4<1){
4371  nogap=1;
4372  for(typename typP::iterator iter=newpol.begin();iter!=newpol.end();
4373  iter++,numker++)
4374  cout<<*iter<<" ";
4375  cout<<endl;
4376  cout<<"newpol "<<newpol.empty()<<endl;
4377  cout<<"numker"<<numker<<endl;
4378 
4379  }
4380  }
4381 
4382  }
4383 
4384  }
4385 
4386 
4387 
4388 
4389 
4390 #ifdef BONRAJOUT
4391  for(typename Base::const_iterator p=b.begin();p!=b.end();p++)
4392  {
4393  for(int i=0;i<p->taille1;i++)
4394  {
4395  cout<<"p.accept[i] "<<p->accept[i]<<endl;
4396  }
4397  for(int i=0;i<p->taille2;i++)
4398  {
4399  cout<<"p.refuse[i] "<<p->refuse[i]<<endl;
4400  }
4401  }
4402 #endif
4403 #ifdef DEB
4404 
4405  //cout<<"mon a la fin de la boulcle de l'algo "<<Mk.size()<<endl;
4406  //for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++)
4407  // cout<<*iter<<endl;
4408  cout<<"poly a la fin de la boulcle de l'algo "<<Pk.size()<<endl;
4409  for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
4410  //cout<<"les sizes "<<iter->size<<endl;
4411  {
4412  int cpt=0;
4413  cout<<invconv<typename typP::value_type>(*iter)<<endl;
4414  for(int i=0;i<iter->sizenf;i++)
4415  for(int j=0;j<8;j++)
4416  if (((iter->nfind[i]>>j)&1) && (iter->nf[cpt++]==0))
4417  {
4418  cout<<"ici ca couille a la place"<<8*i+j<<endl;
4419  cout<<iter->sizenf<<" "<<iter->size<<endl;
4420  exit(1);
4421  }
4422  }
4423 #endif
4424 
4425  S=Spolordsup(Pk,b,Spoldejavu);
4426 
4427 
4428  cout<<"newpkmkmatrixof"<<endl;
4429  cout<<"k"<<k<<endl;
4430 
4431  killspol=!newPkMkMatrixof(Mat,Pk,P,Mk,k,b,dump,recall,w,serv);
4432 #ifdef PEQUAN
4433  sprintf(name,"mat%d",toto);
4434  fic=fopen(name,"w");
4435  printmatfile_pequan(Mat,fic);
4436  fclose(fic);
4437  toto++;
4438 #endif
4439 
4440  if(killspol) S.erase(S.begin(),S.end());
4441  if (k+1>=maxdeg) allpolused=1;
4442  cout<<"Mk.size()"<<Mk.size()<<endl;
4443  if(Mk.size()==0) nouveaumon=0;
4444  //Solve affecte a Mat la valeur U
4445  //cout<<"solve"<<endl;
4446  for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
4447  cout<<"avant solve les ind "<<iter->ind<<endl;
4448  for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++)
4449  cout<<"monomes dans Mk "<<*iter<<endl;
4450  cout<<"Mat.ncol"<<Mat.ncol<<endl;
4451  if (Mat.ncol!=0)
4452  {
4453  //cout<<"debut du solve"<<endl;
4454  Solve(Mat,L,Pk,&pr,&pc,w);
4455 // cout<<"fin du solve"<<endl;
4456  //for(int kk=0;kk<Mk.size();kk++)
4457  // cout<<"permc "<<kk<<" "<<pc[kk]<<endl;
4458  inverse(pc,Mk.size());
4459  Dopermu(Mk,pc);
4460  {
4461  //ici on remet les ind a la bonne valuer
4462  //a inclure dans une petite fonction inline apres
4463  int j=0;
4464  typename typMk::iterator itermon=Mk.begin();
4465  typename typPk::iterator iter;
4466  for(iter=Pk.begin();
4467  itermon!=Mk.end();iter++,itermon++,j++)
4468  {
4469  if(!Iszero(Mat(j,j)))
4470  {
4471  // cout<<"ligne "<<j<<" je mets le monome "<<*itermon<<endl;
4472  iter->ind=*itermon*(iter->ind.GetCoeff());
4473  }
4474  else
4475  {
4476  iter->ind=mon(0);
4477  }
4478  }
4479  //for(;itermon!=Mk.end();iter++,itermon++)
4480  // iter->ind=mon(0);
4481  }
4482 
4483  free(pr);
4484  free(pc);
4485  }
4486 
4487  //appliquer les permutation a MK!!!!!!!!
4488  // for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
4489  // cout<<"apres solve les ind "<<iter->ind<<endl;
4490  //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
4491  // cout<<"apres solve les pol "<<invconv<Poly>(*iter)<<endl;
4492  //
4493  //
4494  //APPLIQUER LES PERMUTYATIONS A MK!!
4495  //
4496  //
4497  //
4498  //
4499  if ((unsigned)my_rank(Mat)==Mk.size())
4500  //matrice de rang plein
4501  {
4502  typMk tmpSpoldejavu;
4503  typPk redspol,secd=secondmembre(Mat,Pk);;
4504  cout<<"matrice de rang plein "<<endl;
4505  Dump(Pk,dump);
4506  cout<<"Reduce Spol "<<endl;
4507 
4508  ReduceSpol(S,dump,redspol,b,w,serv);//tmpSpoldejavu);
4509 
4510  cout<<"secd.size() "<<secd.size()<<endl;
4511  my_merge(redspol,secd);
4512  if(redspol.size()==0)
4513  {
4514  //a voir.... Dump(Pk,dump);
4515  k++;
4516  my_merge(Spoldejavu,tmpSpoldejavu);
4517  L.destroystore();
4518  continue;
4519  //la matrice a rang plein
4520  //ET les Spol\secondmembre de ce niveau se ,reduisent a 0
4521  }
4522  else
4523  {
4524  //on a des spol\secondmembre qui se reduisent pas a 0
4525  //cad un defaut de commuatation
4526  int tmpdeg=mindeg(redspol,serv);
4527  max_degppcm=k+2;
4528  nouveaumon=1;
4529  cout<<"redspol.size() "<<redspol.size()<<endl;
4530  if (tmpdeg==(k+1))
4531  my_merge(Spoldejavu,tmpSpoldejavu);
4532  k=tmpdeg;
4533  //cout<<"le mindeg ici vaut "<<k<<endl;
4534  //cout<<"Pk.size() avant recover "<<Pk.size()<<endl;
4535  recover(Pk,Mk,dump,k);
4536 
4537 
4538  //cout<<"Pk.size() apres recover "<<Pk.size()<<endl;
4539  forget(b,dump,k,recall);
4540  //forget(b,dump,k);
4541 #ifdef DEB
4542  cout<<"Pk.size() avant Crochetchoix "<<Pk.size()<<endl;
4543 #endif
4544  //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu);
4545  NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,w,serv);
4546  //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b);
4547 #ifdef DEB
4548  cout<<"Pk.size apres Crochetchoix "<<Pk.size()<<" et k "<<k<<endl;
4549 #endif
4550  NewDestroyredspol(redspol,Pk);
4551  serv.compress(Pk,dump,b,k);
4552  Dump(Pk,dump);
4553 
4554  L.destroystore();
4555  cout<<"kaquiPini"<<k<<endl;
4556  //misa jour de B dans crochet choix!!
4557  continue;
4558  }
4559  }
4560  else
4561  //la matrice n'est pas de rang plein
4562  {
4563  cout<<"matrice de rang pas plein "<<endl;
4564  typPk secd;
4565 #ifdef BONRAJOUT
4566  AddB_dim(Mat,L,P,Pk,Mk,dump,b);
4567 #else
4568  AddB(Mat,Pk,Mk,dump,b,serv);
4569 #endif
4570  //
4571  //secondmembre supprime des trucs dans Pk!!
4572  //
4573  secd=secondmembre(Mat,Pk);
4574  rajoute_voisins(Pk,Mk,dump,b,w,serv);
4575  //ne selectionne que les non nuls
4576  if(secd.size()==0)
4577  {
4578  typPk redspol;
4579  Dump(Pk,dump);
4580 
4581  ReduceSpol(S,dump,redspol,b,w,serv);
4582 #ifdef NO_TWICE
4583 for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++)
4584  P.push_back(invconv<polyalp>(*iter));
4585 #endif
4586  if(redspol.size()==0)
4587  {
4588  //ici on modifie Pk dans AddB
4589  //<=> forget(b,dump,k) AddB(..) Dump(Pk,dump);
4590  k++;
4591  L.destroystore();
4592  continue;
4593  //la matrice a pas rang plein second membre =0
4594  //ET les Spol de ce niveau se ,reduisent a 0
4595  }
4596  else
4597  {
4598  //on a des spol qui se reduisent pas a 0
4599  //cad un defaut de commutation
4600  k=mindeg(redspol,serv);
4601  recover(Pk,Mk,dump,k);
4602  //Listedejafait(Mk,Spoldejavu);
4603  forget(b,dump,k,recall);
4604  //forget(b,dump,k);
4605  cout<<"il ya un passage par mat rang pas"
4606  <<"plein et pol non zero"<<endl;
4607  //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu);
4608  NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,w,serv);
4609  //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b);
4610  NewDestroyredspol(redspol,Pk);
4611  serv.compress(Pk,dump,b,k);
4612  Dump(Pk,dump);
4613 
4614  L.destroystore();
4615  continue;
4616  }
4617  }
4618  else
4619  {
4620  //on a des pol qui se reduisent pas a 0
4621  //cad un defaut de commuatation dans les coins
4622  typPk redspol;
4623  //for(int i=Pk.size();i>rank(Mat);i--)
4624  // Pk.pop_back();
4625  //cout<<"PK. size "<<Pk.size()<<" Mat.nbcol "<<Mat.ncol<<endl;
4626  //cout<<"rank(Mat) "<<rank(Mat)<<endl;
4627  //int j=0;
4628  //cout<<"avant recover et meme avant le dump "<<endl;
4629  //for(typename typPk::iterator iter = secd.begin();iter!=secd.end()
4630  // ;iter++,j++)
4631  // cout<<"pol de secd num "<<j<<endl<<invconv<Poly>(*iter)<<endl;
4632  // AddB(Mat,Pk,Mk,b);
4633  //cout<<"apres ADDB le dump "<<endl;
4634  //for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end()
4635  // ;iter++)
4636  // cout<<invconv<Poly>(*iter)<<endl;
4637  Dump(Pk,dump);
4638 
4639  //cout<<"secd.size()" <<secd.size()<<endl;
4640  ReduceSpol(S,dump,redspol,b,w,serv);//,Spoldejavu);
4641  my_merge(secd,redspol);
4642 #ifdef NO_TWICE
4643 for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++)
4644  P.push_back(invconv<polyalp>(*iter));
4645 #endif
4646  k=mindeg(secd,serv);
4647  recover(Pk,Mk,dump,k);
4648  //cout<<"k "<<k<<endl;
4649  //Listedejafait(Mk,Spoldejavu);
4650  //cout<<"apres recover"<<endl;
4651  // for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end()
4652  // ;iter++)
4653  // cout<<invconv<Poly>(*iter)<<endl;
4654  //cout<<"les Spol non reduits"<<endl;
4655  //for(typename typPk::iterator iter = secd.begin();iter!=secd.end()
4656  // ;iter++)
4657  // cout<<invconv<Poly>(*iter)<<endl;
4658  forget(b,dump,k,recall);
4659 
4660  //forget(b,dump,k);
4661  //cout<<"il ya un passage par mat pas rang plein et Spol non zero"<<endl;
4662  //for(typename typPk::iterator iter = secd.begin();iter!=secd.end()
4663  // ;iter++)
4664  // cout<<invconv<Poly>(*iter)<<endl;
4665  //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu);
4666  NewCrochetchoix(P,Pk,Mk,secd,k,dump,b,recall,w,serv);
4667  //NewCrochetchoix(P,Pk,Mk,secd,k,dump,b);
4668  NewDestroyredspol(secd,Pk);
4669 #ifdef BONRAJOUT
4670  cout<<"Apres NewCrochetchoix"<<endl;
4671 
4672  for(typename Base::const_iterator p=b.begin();p!=b.end();p++)
4673  {
4674  for(int i=0;i<p->taille1;i++)
4675  {
4676  cout<<"p.accept[i] "<<p->accept[i]<<endl;
4677  }
4678  for(int i=0;i<p->taille2;i++)
4679  {
4680  cout<<"p.refuse[i] "<<p->refuse[i]<<endl;
4681  }
4682  }
4683 #endif
4684  //for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end()
4685  // ;iter++)
4686  // cout<<invconv<Poly>(*iter)<<endl;
4687  serv.compress(Pk,dump,b,k);
4688  Dump(Pk,dump);
4689 
4690  L.destroystore();
4691  continue;
4692  }
4693  }
4694  }
4695 
4696  Mat.destroystore();
4697 
4698 #ifdef DEBUG
4699  for(typename Base::const_iterator p=b.begin();p!=b.end();p++)
4700  {
4701  for(int i=0;i<p->taille1;i++)
4702  {
4703  cout<<"p.accept[i] "<<p->accept[i]<<endl;
4704  }
4705  for(int i=0;i<p->taille2;i++)
4706  {
4707  cout<<"p.refuse[i] "<<p->refuse[i]<<endl;
4708  }
4709  }
4710 #endif
4711 
4712  destroy_space(&w);
4713 // delete[] &sol2;
4714 // delete[] &sol3;
4715 
4716  cout<<"sortie d'algo flash et dimension "<<endl;//<<critere(b,k)<<endl;
4717  cout<<"TPS SDP "<<tempsCDSP<<endl;
4718  return ;//dump;
4719  //comme ca on conserve le tri par degre des formes normales et
4720  //donc la construction des operateurs de multiplication se
4721  //fait plus vite.. :-)
4722 
4723  }
4724 #endif //ALREADY_corealgo3
void int2mon(const int &i, mon &res)
Definition: placemon3.hpp:664
Mon my_divmon(const Mon &mon, int i, const Base &b)
Definition: corealgo3sdp.hpp:1071
struct timeval initclock tmpclock
Definition: solver_bb_floating.cpp:67
Definition: workspace.hpp:11
int testsdp(int k, const typdump &dump, const Base &b, const typserv &serv)
Definition: corealgo3sdp.hpp:3610
void remiseenforme(typpol &p)
Definition: ugly.hpp:2
Definition: dump.hpp:2
int member(const typMk &tmpMk, const typename typMk::value_type mon)
Definition: corealgo3sdp.hpp:1218
Multivariate polynomials.
Definition: MPoly.hpp:28
void AddB(const typmat &mat, typPk &Pk, const typMk &Mk, const typexceed &exceed, const typsizeexceed &sizeexceed, const typdump &dump, typB &b, monomial_server &serv)
Definition: pol2terspecial.hpp:2470
void affdebug(const typmat &m)
Definition: io.hpp:30
#define max(a, b)
Definition: alp_f2c.H:167
int GB_stop(int k)
Definition: corealgo3sdp.hpp:139
list< polbis< mono, T > > & Solve(typmat &S, std::list< polbis< mono, T > > &TildePk, int **pr, int **pc, workspace &w)
Definition: pol2bisspecial.hpp:609
bool operator()(const M &, const M &) const
Definition: corealgo3sdp.hpp:2484
int mon2int(const mon &mm)
Definition: placemon3.hpp:679
int isdivisible(const mon &m1, const mon &m2, int nbvar)
Definition: isdivisible.hpp:5
void proj(T &Crochet, const typdump &dump, const Base &b)
Definition: proj.hpp:51
int lvar(const dynamicexp< X, E > &A)
Definition: dynamicexp.hpp:178
void free(void *)
pol halfred(const mon &targetind, const pol &p, const typdump &dump, const Base &b, monomial_server &serv)
Definition: corealgo3sdp.hpp:1770
int compute_ppcm(typppcm &ppcm, const Base &b)
Definition: corealgo3sdp.hpp:64
void write_to_sdpa_fic(typmatmap &matrixmap, int &dim, typserv &serv, int d)
Definition: corealgo3sdp.hpp:3244
void my_merge(T &l1, const T &l2)
Definition: corealgo3sdp.hpp:45
void setorder(ptrfun tmpord)
Definition: placemon3.hpp:301
mon * int2mon_
Definition: placemon3.hpp:21
void generickernelsdpa(typP &newpol, int k, const typdump &dump, Base &b, typserv &serv)
Definition: corealgo3sdp.hpp:3400
Definition: corealgo3sdp.hpp:14
void forget0(Base &b, typdump &dump, int k, typrecall &recall)
Definition: dump3sdp.hpp:197
Definition: pol.hpp:6
list< predicat >::iterator iterator
Definition: types.hpp:20
int minmaxdegP(typP P, int &maxdeg)
Definition: corealgo3sdp.hpp:212
void conv_merge(typPk &Pk, typP &P, typexceed &ex, typsize &sizeex, const Base &b, monomial_server &serv)
Definition: corealgo3sdp.hpp:1107
void init_multiple(int n)
Definition: placemon3.hpp:59
Definition: Scl_mpfr.hpp:827
int Ispolzero(const pol &p)
Definition: Iszero.hpp:30
typP Crochet(const typP &P, int k)
Definition: corealgo3sdp.hpp:224
void NewCrochetchoix(typP &P, typPk &Pk, typMk &Mk, typPk &redspol, int &k, typdump &dump, Base &b, typrecall &recall, workspace &w, monomial_server &serv)
Definition: corealgo3sdp.hpp:2138
mon * accept
Definition: types.hpp:6
int my_ord(const mon &m1, const mon &m2)
Definition: ord.hpp:2
MSKsoltypee MSKrealt * pobj
Definition: mosek.h:3621
double tempsdssdp
Definition: solver_bb_floating.cpp:68
typpol mult(int i, const typpol &pol, const typdump &dump, const Base &b, mon **exce, int &exsize, workspace &w, monomial_server &serv)
Definition: corealgo3sdp.hpp:838
long flag
Definition: alp_f2c.H:52
void inverse(int *&, int)
list< predicat >::const_iterator const_iterator
Definition: types.hpp:21
MSKcallbackcodee MSKsoltypee MSKprostae MSKsolstae MSKstakeye MSKstakeye MSKstakeye MSKrealt MSKrealt MSKrealt * y
Definition: mosek.h:2689
void * malloc(YYSIZE_T)
void recover(typPk &Pk, typMk &Mk, const typdump &dump, int k)
Definition: dump.hpp:192
coeff * tabcoeff
Definition: workspace.hpp:12
void ReduceSpol(typPk &S, const typdump &dump, typPk &redspol, const Base &b, workspace &w, monomial_server &serv)
Definition: corealgo3sdp.hpp:1972
Definition: types.hpp:3
void Dump(const typPk &Pk, typdump &dump)
Definition: dump.hpp:48
T coeff_t
Definition: pol.hpp:9
void NewDestroyredspol(typPk &redspol, const typPk &Pk)
Definition: corealgo3sdp.hpp:2407
MSKint32t MSKCONST MSKint32t * dim
Definition: mosek.h:2407
int taille1
Definition: types.hpp:5
void selectnozero(typP &ttmp)
Definition: Iszero.hpp:40
void enumeratemon(typstock &stockmon, int k, const Base &b, const typdump &dump)
Definition: corealgo3sdp.hpp:2436
int nbvar()
Definition: types.hpp:37
int mon2int(const mon &mm)
Definition: placemon.hpp:294
void read_sol_from_sdpa(coeff *&sol, typmatmap &matmap, int dim, typserv &serv)
Definition: corealgo3sdp.hpp:3306
void reinit_multiple()
Definition: placemon3.hpp:85
MSKconetypee MSKrealt MSKint32t MSKint32t j
Definition: mosek.h:2421
unsigned char * tabnf
Definition: workspace.hpp:13
int mindeg(const typPk &l, monomial_server &serv)
Definition: corealgo3sdp.hpp:2062
void destroy_space(workspace< coeff > *w)
Definition: workspace.hpp:34
static bool less(const M &, const M &)
Definition: corealgo3sdp.hpp:2489
void int2mon(const int &i, mon &res)
Definition: placemon.hpp:288
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
int newPkMkMatrixof(typMat &mat, typPk &Pk, typP &P, typMk &Mk, int &k, Base &b, typdump &dump, typrecall &recall, workspace &w, monomial_server &serv)
Definition: corealgo3sdp.hpp:1230
void computeprod(typprod &prod, typstock &stockmon, Base &b, typdump &dump)
Definition: corealgo3sdp.hpp:2514
int goodspol(const mon &m1, const mon &m2, typppcm &ppcm, const Base &b, const typMk &Spoldejavu)
Definition: corealgo3sdp.hpp:147
C coeff_t
Definition: Monom.hpp:26
void init_space(workspace< coeff > *w)
Definition: workspace.hpp:43
int nbbits[256]
Definition: pol2ter.hpp:4
Definition: placemon3.hpp:14
MSKCONST char MSKint32t MSKint32t * index
Definition: mosek.h:2860
int dgesvd_(char *jobu, char *jobvt, long *m, long *n, T *a, long *lda, T *s, T *u, long *ldu, T *vt, long *ldvt, T *work, long *lwork, long *info)
dynamicexp< X, E >::degree_t Degree(const dynamicexp< X, E > &t)
Definition: dynamicexp.hpp:91
typmat * MatrixOf(const typPk &L, const typMk &lm, const typmat &mat)
Definition: corealgo3sdp.hpp:327
void stab(typPk &Pk)
Definition: corealgo3sdp.hpp:28
void printmatfile_pequan(const typmat< Scl< MPF > > &m, FILE *fic)
Definition: io.hpp:381
iterator end()
Definition: types.hpp:30
void Setnbvars(const typP &tmpPk, Base &b)
Definition: corealgo3sdp.hpp:248
int Setnvars(const typP &tmpPk)
Definition: corealgo3sdp.hpp:263
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 sizeplacemon()
Definition: placemon3.hpp:313
void increase_space(workspace< coeff > *w)
Definition: workspace.hpp:19
int taille2
Definition: types.hpp:7
Definition: types.hpp:14
exponent_t GetDegree() const
Definition: Monom.hpp:70
void getperm(int *perm, int sizeperm, int *indextab)
Definition: corealgo3sdp.hpp:818
MSKrealt * c
Definition: mosek.h:2678
void algo(typP P, typdump &dump, Base &b, monomial_server &serv)
Definition: corealgo3sdp.hpp:3616
int indice2(int i, int j, const Base &b)
Definition: corealgo3sdp.hpp:753
MSKint32t MSKint32t MSKint32t i
Definition: mosek.h:2278
int Iszero(const Scl< MPQ > &c)
Definition: Iszero.hpp:14
MSKsoltypee MSKrealt MSKrealt MSKrealt MSKrealt MSKrealt MSKrealt MSKrealt * dobj
Definition: mosek.h:3621
MPoly< vector< Mon >, my_Dlex< Mon > > Poly
Definition: solver_bb_floating.cpp:138
int sizenf
Definition: workspace.hpp:15
#define abs(x)
Definition: f2c.H:161
Monom< COEFF, dynamicexp<'x'> > Mon
Definition: solver_bb_floating.cpp:134
int GoodDir(const typmon &m, int i, const Base &b)
Definition: corealgo3sdp.hpp:1087
int size
Definition: pol.hpp:10
MSKstreamtypee MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t a
Definition: mosek.h:3833
Definition: corealgo3sdp.hpp:2478
void my_plus(pol &res, const pol &nf, const coeff toto, workspace *w)
Definition: corealgo3sdp.hpp:427
#define COEFF
Definition: symbo2.hpp:8
void update_crochetchoix(typiterpk &iterPk, typiterpk &iter, int tmpind, workspace &w)
Definition: corealgo3sdp.hpp:2096
void Listedejafait(const typMk &Mk, typMk &Spoldejavu)
Definition: corealgo3sdp.hpp:2420
void forget(Base &b, typdump &dump, int k, typrecall &recall)
Definition: dump.hpp:75
mon * refuse
Definition: types.hpp:8
int mulind(int indexbase, int var, const typBase &b)
Definition: placemon3.hpp:126
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
void init_algo(typP &P, int &nouveaumon, int &maxdeg, int &k, typPk &Pk, typMk &Mk, Base &b, typdump &dump, workspace &w, monomial_server &serv)
Definition: corealgo3sdp.hpp:363
void Crochetchoix(const typP &P, typPk &Pk, typPk &redspol, int k, Base &b)
iterator begin()
Definition: types.hpp:25
void generickernel(typP &newpol, int k, const typdump &dump, Base &b, typserv &serv)
Definition: corealgo3sdp.hpp:2540
list< predicat >::const_reverse_iterator const_reverse_iterator
Definition: types.hpp:23
predicat::monom_t mon
Definition: types.hpp:19
#define pol
Definition: pol2ter.hpp:3
double tempsCDSP
Definition: solver_bb_floating.cpp:69
void SetCoeff(const C &c)
Definition: Monom.hpp:68
void findcorresppol(const mon &m, const typdump &dump, pol &res)
Definition: corealgo3sdp.hpp:1719
void compress(typPk &Pk, typdump &dump, const Base &b, int k)
Definition: placemon3.hpp:1076
typPk Spolordsup(const typPk &Pk, const Base &b, const typMk &Spoldejavu)
Definition: corealgo3sdp.hpp:185
mon ind
Definition: pol.hpp:11
Multivariate monomials.
Definition: Monom.hpp:21
iterator erase(iterator first, iterator last)
Definition: types.hpp:35
typpol nf(int var, int indmon, const typdump &dump, const Base &b)
Definition: corealgo3sdp.hpp:773
T * nf
Definition: pol.hpp:12
void DoBaseMk(const typP &tmpPk, typMk &Mk, Base &b, monomial_server &serv)
Definition: corealgo3sdp.hpp:280
mon lcm(const mon &m1, const mon &m2)
Definition: corealgo3sdp.hpp:52
void varmult(iterator iter1, iterator iter2, mon &var1, mon &var2, const Base &b)
Definition: corealgo3sdp.hpp:1757
reverse_iterator rbegin()
Definition: types.hpp:27
MSKint32t MSKint32t char * name
Definition: mosek.h:2853
Home  |  Download & InstallContributions