Borderbasix

generkeropt.hpp
Go to the documentation of this file.
1 #include <map>
2 #include <cstdlib>
3 #include <borderbasix/mdebug.hpp>
4 #include <borderbasix/mpoly.hpp>
10 //#include <mosek.h>
11 
12 
13 #include "tensor-decomposition/Decomposer.hpp"
14 //#include "../arithm/Scl.hpp"
15 #include "../arithm/Scl_mpf.hpp"
16 
17 template<typename typP, typename typdump,typename Base, typename typserv,typename coeff>
18 void generickernelNEW(typP &newpol, int k,const typdump &dump, Base &b, typserv &serv, typP F,coeff *&sol2,typP rest, coeff *&solfinal,int solver, int &method, int &flat, string param, double &tresh)
19 {
20  using namespace coinor;
21  typedef typename typP::value_type::coeff_t Scalar;
22  typedef typename typP::value_type::order_t ord;
23  typedef Monom<double, dynamicexp<'x'> > Monomial;
24  typedef Dlex<Monomial> Ordering;
25  typedef MPoly<std::vector<Monomial>, Ordering > Polynomial;
26  //typedef MPoly<std::vector<mon>,Dlex<mon> > mpol;
27  //mdebug()<<"entra en mi generic kernel";
28  //
29  //Allocation du problem et des
30  //contraintes
31 
32  struct sparseblockv<COEFF> *blockptr2;
33  double *bb,*sol1;//*sol3;
34 
35  int i,aveccont=0,numsol=0,solst;
36 
37  struct constraintmatrixv<COEFF> *constraints2;
38 
39  mdebug()<<"tresh dedans de generker"<<tresh;
40  //
41  //On introduit un variable par monome de degre d en dehors de B
42  //On va contruire l'operateur de de Hankel associé
43 
44  //
45  //On commence par enumerer les monomes de degre plus petit que k
46  //
47  //
48  typP stockprod,stockproj,stockproj2,stockproj2b,listmin,listminmon,listrest,listmon,listLambda;//dans stockprod on a des polynomes
49  //
50  //
51  //
52  int degmax,nbconstraint=0;
53  list<typename typserv::monom_t> stockksur2,listmonLambda;
54  list<Monomial> listmonLambda1;
55  map<mon,int,ord> mapmonbase;
56  map<Poly,Poly> mapmonproj;
57  list<Monomial> monomesadd1;
58  int grado=k;
59 
60  //
61  //ICI on cree un index pour le monomes de degre k
62 
63  enumeratemon(stockksur2,k/2,b,dump);
64 
65  enumeratemoninv(listmonLambda,k/2,b,dump);
66  enumeratemoninv(listmonLambda1,k,b,dump);
67 
68 
69  //
70  //pour le suite il nous faut les monomes de B de degre <=k/2
71  //
72 
73  for(typename list<typename typserv::monom_t>::iterator
74  iter=stockksur2.begin(); iter!=stockksur2.end();iter++)
75  {
76  if(!IsinB(*iter,b)) stockksur2.erase(iter--);
77  }
78 
79  for(typename list<typename typserv::monom_t>::iterator
80  iter=listmonLambda.begin(); iter!=listmonLambda.end();iter++)
81  {
82 
83  if(!IsinB(*iter,b)) listmonLambda.erase(iter--);
84  }
85  for(typename list<Monomial>::iterator
86  iter=listmonLambda1.begin(); iter!=listmonLambda1.end();iter++)
87  {
88 
89  if(!IsinB(*iter,b))
90  {
91  mdebug()<<*iter;
92  monomesadd1.push_back(*iter);
93  listmonLambda1.erase(iter--);
94 
95  }
96  if (*iter==1) listmonLambda1.erase(iter--);
97  }
98 #ifdef DEBUGSDP
99  mdebug()<<"monome en degre k/2 ";
100  for(typename list<typename typserv::monom_t>::iterator
101  iter=stockksur2.begin(); iter!=stockksur2.end();iter++)
102  mdebug()<<*iter<<" ";
103 
104  mdebug();
105 #endif
106  for(typename list<typename typserv::monom_t>::iterator
107  iter=stockksur2.begin(); iter!=stockksur2.end();iter++)
108  degmax=2*Degree(*iter);
109  if (degmax<k) k=degmax;
110  //mdebug()<<"paso3";
111 
112  int dim=stockksur2.size();
113  int dimrest=rest.size();
114  int numvar=b.nbvar();
115  int r1=0,u,file,contmon,sizerest=0,relat,s,maxdegrest=0,nummonineq;
116  //COEFF *listdegrest;
117  int listsizerest[dimrest];
118  int listdegrest[dimrest];
119  int listnumeq[dimrest];
120 
121 
122  for(typename Base::iterator itb=b.begin();itb!=b.end();itb++)
123  for(int i=0;i<itb->taille2;i++)
124 
125  if (Degree(itb->refuse[i])==1 ) numvar--;
126 
127  for(typename typP::iterator iter=rest.begin();iter!=rest.end();
128  iter++)
129  if (Degree(*iter)>=maxdegrest) maxdegrest=Degree(*iter);
130 
131  mdebug()<<"maxdegrest"<<maxdegrest;
132  //
133  // On genere les formes normales des produits de monomes de
134  // de tous les monomes de degre <=k/2 dez B.
135  //
136 
137  computeprod(stockprod,stockksur2,b,dump);
138 
139  computeprod(listLambda,listmonLambda,b,dump);
140 
141 // for(typename list<Monomial>::iterator i=listmonLambda1.begin();
142 // i!=listmonLambda1.end();i++)
143 // {
144 // for(typename list<Monomial>::iterator j=i;j!=listmonLambda1.end();j++)
145 // listLambda1.push_back(*i * *j);
146 // }
147 // listLambda1.unique();
148  //listmonLambda1.sort(Dlex<Monomial>());
149 
150  mdebug()<<" MonNoproj";
151  for(typename list<Monomial>::iterator
152  iter=listmonLambda1.begin(); iter!=listmonLambda1.end();iter++)
153  mdebug()<<*iter<<" ";
154 
155  mdebug()<<" Monproj";
156  for(typename list<Monomial>::iterator
157  iter1=monomesadd1.begin(); iter1!=monomesadd1.end();iter1++)
158  mdebug()<<*iter1<<" ";
159 
160 
161  //computeprodMonomial(listLambda1,listmonLambda,b,dump);
162 
163 
164 
165  stockproj=stockprod;
166 
167  //on calcule la forme normale de la liste de monomes de order k
168 // stockproj2=stockprod;
169 // proj(stockproj2,dump,b,serv);
170 
171  for(typename typP::iterator iter=F.begin();iter!=F.end();
172  iter++)
173  mdebug()<<*iter<<" ";
174  //on calcule la forme normale de la function f
175  proj(F,dump,b,serv);
176 
177  //on calcule la forme normale des inegalites
178  proj(rest,dump,b,serv);
179 
180 
181 
182 
183  //on calcule les polynomes qui sont parties de la matrices de localization associes a
184  //les inegalites
185  for(typename typP::iterator iter=rest.begin();iter!=rest.end();
186  iter++,r1++)
187  {
188 
189 
190  listdegrest[r1]=Degree(*iter);
191  u=floor(Degree(*iter)/2);
192  if (Degree(*iter)%2!=0) u++;
193  s=k/2-u;
194  sizerest=factorial(s+numvar)/(factorial(s)*factorial(numvar));
195  listsizerest[r1]=sizerest;
196  nummonineq=0;
197 
198  if (s!=0)
199  {
200 
201  relat=0;
202  file=1;
203  contmon=0;
204  listmon.erase(listmon.begin(),listmon.end());
205  for(typename list<typename typserv::monom_t>::iterator
206  iters=stockksur2.begin(); iters!=stockksur2.end();iters++)
207 
208  if (contmon<sizerest)
209  {
210 
211  listrest.push_back(*iter * *iters);
212  listmon.push_back(*iters);
213  contmon++;
214  nummonineq++;
215 
216  }
217 
218  typename typP::iterator iterm=listmon.begin();
219 
220  for ( ;iterm!=listmon.end(); iterm++)
221  {
222  typename typP::iterator iterm2=listmon.begin();
223  if (file!=sizerest)
224  {
225  file++;
226  relat=file-1;
227  for(int j=1; j<file; j++)
228  {
229  if(file==2) iterm++;
230  iterm2++;
231  }
232 
233 
234  for (;iterm2!=listmon.end(); iterm2++)
235  if (relat!=sizerest)
236  {
237  listrest.push_back(*iter * *iterm * *iterm2);
238  relat++;
239  nummonineq++;
240  }
241 
242  }
243 
244  }
245 
246 
247 
248  }
249 
250  else{
251 
252  listrest.push_back(*iter);
253  nummonineq++;
254  }
255  listnumeq[r1]=nummonineq;
256  }
257 
258  //on calcule les formes normales de cette liste de polynomes (inegalites)
259  proj(listrest,dump,b,serv);
260  selectnozero(listrest);
261 
262 
263 #ifdef DEBUGSDP
264  mdebug()<<"produits ";
265  for(typename typP::iterator iter=stockprod.begin();iter!=stockprod.end();
266  iter++)
267  mdebug()<<*iter<<" ";
268  mdebug();
269  mdebug()<<"proj2 ";
270  mdebug()<<"stockprod.size()"<<stockprod.size();
271  for(typename typP::iterator iter=stockproj2.begin();iter!=stockproj2.end();
272  iter++)
273  mdebug()<<*iter<<" ";
274  mdebug();
275  mdebug()<<"Funcionproj";
276  for(typename typP::iterator iter=F.begin();iter!=F.end();
277  iter++)
278  mdebug()<<*iter<<" ";
279  mdebug();
280  mdebug()<<"rest";
281  for(typename typP::iterator iter=listrest.begin();iter!=listrest.end();
282  iter++)
283  mdebug()<<*iter<<" ";
284  mdebug();
285 
286  mdebug()<<"monomios de Lambda";
287  for(typename list<typename typserv::monom_t>::iterator
288  iter=listmonLambda.begin(); iter!=listmonLambda.end();iter++)
289  {
290 
291  mdebug()<<*iter<<"";
292  mdebug();
293  }
294 
295 #endif
296 
297 
298  for(typename typP::iterator iter=listLambda.begin();iter!=listLambda.end();
299  iter++)
300  {
301  if(!IsinB(*(iter->begin()),b)) listLambda.erase(iter--);
302  if (*(iter->begin())==1) listLambda.erase(iter--);
303  }
304 
305 // for(typename list<Monomial>::iterator iter=listLambda1.begin();iter!=listLambda1.end();iter++)
306 // {
307 // if(!IsinB(*iter,b)) listLambda1.erase(iter--);
308 // if (*iter==1) listLambda1.erase(iter--);
309 // }
310 // for(typename list<Monomial>::iterator
311 // iter=listLambda1.begin(); iter!=listLambda1.end();iter++)
312 // mdebug()<<*iter<<" ";
313 
314  //
315  //
316 
317  //
318  //
319  //
320  //
321  // §Ici on va avoir besoin d'une structure contenant un monome de tete
322  // hors de B et sa forme normal
323 
324 
325  typP listnormalform,stockmonproj;
326 
327 
328  int countmonb=0,countmont=0,countmonp=0;
329  for(typename typP::iterator iter=stockprod.begin();
330  iter!=stockprod.end();iter++)
331  {
332  if(IsinB(*(iter->begin()),b))
333  {
334  if (*iter !=1)
335  {
336  listmin.push_back(*iter);
337  }
338  listminmon.push_back(*iter);
339  nbconstraint++;
340  }
341  else
342  {
343  countmonp++;
344  mdebug()<<"monproj"<<countmonp ;
345  stockmonproj.push_back(*iter);
346  listnormalform.push_back(*iter);
347  }
348  }
349 
350 
351  int count=0;
352  for(typename typP::iterator itermonb=listminmon.begin();itermonb!=listminmon.end();
353  itermonb++)
354  {
355  count++;
356  mapmonbase[*itermonb->begin()]=count;
357  }
358  mdebug()<<"antes de definir las constraint";
359 
360 
361  int iterac=0;
362  if (!rest.empty())
363  {
364  aveccont=1;
365  iterac=0;
366  for(int k=0; k<dimrest; k++)
367  iterac+=listsizerest[k];
368 
369  }
370 
371  int dimmonap=listminmon.size();
372  mdebug()<<"dim mon en b"<<dimmonap;
373  mdebug()<<"dim mon qu'on proj"<<countmonp;
374 
375 
376 
377  int nummatrix;
378 
379  mdebug()<<"dim"<<dim;
380 
381 
382 
383 
384 
385  mdebug()<<"avant proj";
386  proj(listnormalform,dump,b,serv);
387  typename typP::iterator iter=listnormalform.begin();
388  for(typename typP::iterator iterproj=stockmonproj.begin();
389  iterproj!=stockmonproj.end();iterproj++,iter++)
390  mapmonproj[*iterproj]=*iter;
391 
392  mdebug()<<"apres proj";
393 
394  solversdp* slv;
395 
396 
397 
398  if (solver==1) slv= new solversdp_sdpa;
399  else if (solver==2) slv=new solversdp_gmp;
400  else if (solver==3) slv = new solversdp_csdp;
401  else if (solver==4) slv = new solversdp_mosek;
402 
403 
404 
405  slv->dim()=dim;
406  for(unsigned k=0;k<dimrest;k++)
407  slv->dim(k+1)=listsizerest[k];
408 
409 
410  int i2_counter=1,j2_counter;
411 
412  for(typename list<typename typserv::monom_t>::iterator i=stockksur2.begin();
413  i!=stockksur2.end();i++,i2_counter++)
414  {
415  j2_counter=i2_counter;
416  for(typename list<typename typserv::monom_t>::iterator j=i;
417  j!=stockksur2.end();j++,j2_counter++)
418  {
419 
420 
421  if (!IsinB(*i * *j, b))
422  {
423 
424 
425  Poly polproj;
426  polproj=mapmonproj[*i * *j];
427  COEFF value;
428 
429  for(typename typP::value_type::iterator iterpol=polproj.begin();
430  iterpol!=polproj.end();iterpol++)
431  {
432  countmont++;
433  nummatrix=mapmonbase[*iterpol];
434  //std::cout<<nummatrix<<std::endl;
435  value=(COEFF)iterpol->GetCoeff();
436  if (nummatrix==dimmonap)
437  {
438  slv->coeff(0,0,i2_counter-1,j2_counter-1)=Scalar::castDouble(value);
439  slv->nentries(0)++;
440  }
441  else
442  {
443  slv->coeff(nummatrix,0,i2_counter-1,j2_counter-1)=Scalar::castDouble(value);
444  slv->nentries(nummatrix)++;
445  }
446 
447 
448 
449 
450  }
451 
452 
453 
454 
455  }
456  else
457  {
458  countmonb++;
459  countmont++;
460  nummatrix=mapmonbase[*i * *j];
461  if (nummatrix==dimmonap)
462  {
463  slv->coeff(0,0,i2_counter-1,j2_counter-1)=1;
464  slv->nentries(0)++;
465  }
466  else
467  {
468  slv->coeff(nummatrix,0,i2_counter-1,j2_counter-1)=1;
469  slv->nentries(nummatrix)++;
470  }
471 
472  }
473 
474  }
475  }
476 
477 
478 
479 
480  mdebug()<<"num mon total"<<countmont;
481  int indice=0,indicej=0,eqind,indcont,numine=1,numeqmatrix;
482  int nummatrixcon=1;
483 
484 
485 
486 
487  // cout<<"avant ine"<<endl;
488  //numeqmatrix=listrest.size()/dimrest;
489  int nineq=0;
490  int kk=0;
491  for(typename typP::iterator itera=listrest.begin();
492  itera!=listrest.end();itera++,numine++)
493  {
494  eqind=0;
495  mdebug()<<"numine"<<numine;
496  mdebug()<<"listnumeq[nineq]"<<listnumeq[nineq];
497  if (numine==listnumeq[nineq]+1)
498  {
499  nummatrixcon++;
500  indice=0;
501  indicej=0;
502  numine=1;
503  nineq++;
504  kk++;
505  }
506 
507  if (indice==0)
508  indice++;
509  indcont=0;
510 
511  indcont=listsizerest[kk];
512  mdebug()<<"indicej"<<indicej;
513  if (indicej==indcont)
514  {
515  indice++;
516  indicej=indice;
517 
518  eqind=1;
519 
520  }
521 
522 
523  if (eqind!=1)
524  indicej++;
525 
526 
527 
528 
529  COEFF value3;
530  for(typename typP::value_type::iterator itera1=itera->begin();
531  itera1!=itera->end();itera1++)
532  {
533 
534 
535  nummatrix=mapmonbase[*itera1];
536 
537  value3=(COEFF)itera1->GetCoeff();
538 
539  if (nummatrix==dimmonap) nummatrix=0;
540  slv->coeff(nummatrix,nummatrixcon,indice-1,indicej-1)=Scalar::castDouble(value3);
541  slv->nentries(nummatrix)++;
542 
543 
544 
545  }
546 
547  }
548 
549 
550 
551 
552 
553  mdebug()<<"avant obj";
554 
555  struct blockmatrix<COEFF> X,Z;
556  COEFF *y,*pp;
557  //COEFF pobj,dobj;
558  int tmpsize=(int)stockksur2.size(),funcionnonnull=0;
559 
560  //on define pp comme le coeff independ de la function a minimizer et on l'initialize a 0
561  pp=new COEFF[1];
562  pp[0]=0;
563 
564  //on define bb comme les coeffs de la function a minimizer et on l'initialize a 0
565 //#ifndef NONEW
566 // bb=new COEFF[nbconstraint+1];
567 //#else
568 // bb=(COEFF *)malloc((nbconstraint+1)*sizeof(COEFF));
569 //#endif
570 
571 
572  for(i=1;i<=dimmonap-1;i++)
573  slv->obj_coeff(i)=0.0;
574  // bb[i]=0.0;
575 
576 
577 
578 
579 
580  int count_lis;
581  COEFF value2;
582 
583 
584  //on rempli bb comme les coeffs de la function
585  typename typP::iterator iterfuncion=F.begin();
586  for(typename typP::value_type::iterator itermon=iterfuncion->begin();
587  itermon!=iterfuncion->end();itermon++)
588  {
589 
590  value2=(COEFF)itermon->GetCoeff();
591 
592  if (*itermon!=itermon->GetCoeff())
593  {
594  count_lis=1;
595  for(typename typP::iterator iterlis=listmin.begin();iterlis!=listmin.end();
596  iterlis++,count_lis++)
597 
598  if (isEgal(*itermon,*(iterlis->begin()),b))
599  //bb[count_lis]=itermon->GetCoeff();
600  slv->obj_coeff(count_lis)=Scalar::castDouble(value2);
601 
602  }
603  else
604  pp[0]=Scalar::castDouble(value2);
605  }
606 
607 
608 // for(i=0;i<=nbconstraint;i++)
609 // if (bb[i]!=0) funcionnonnull=1;
610 
611 
612  mdebug()<<"avant run";
613  slv->run();
614  mdebug()<<"apres run";
615 
616 
617 
618 
619  //std::cout<<"Extended moments:"<<moments<<std::endl;
620 
621 
622  char nom[50],command[1024],copy[1024],copy1[1024];
623  static int d=0,t=0;
624  int r;
625 
626  Polynomial p=1;
627 
628  int j=0;
629  listmonLambda1.sort(Rlex<Monomial>());
630  for(typename list<Monomial>::iterator iter=listmonLambda1.begin();iter!=listmonLambda1.end();
631  iter++)
632  {
633 
634 
635  mdebug()<<"mon"<<(*iter)<<(COEFF)slv->output[j];
636  p+=(*iter)*slv->output[j];
637 
638  j++;
639 
640  }
641  mdebug()<<"p"<<p;
642 
643  //on appele a la methode de reconstruction (decomposer), d abord on construit la function entree avec les donnes de sortie
644  //du solver SDP
645  //if ((method==0 && solver!=4 && (abs(sol2[0])*1e+2<1)) || (method==0 && solver==4 && r==0 && (solst==1 ||solst==8 || solst==0)))
646  //if ((method==0 && solver!=4 ) || (method==0 && solver==4 && r==0 && (solst==1 ||solst==8 || solst==0)))
647  if (method==0 )
648  {
649  // il faut faire transforme le vecteur lambda en p
650  //il faut definir le variable par defaut
651 
652 
653  double cof;
654  double *listcoef;
655 
656  typP projmonomesadd,prodmonomestot, monomesadd;
657 
658  list<typename typserv::monom_t> monomestot;
659 
660 
661 
662 
663  enumeratemon(monomestot,k/2,b,dump);
664  //enumeratemon(monomestot,1,b,dump);
665  computeprod(prodmonomestot,monomestot,b,dump);
666  //mdebug()<<"falla aqui";
667  int nuevomon;
668  for(typename typP::iterator itert=prodmonomestot.begin(); itert!=prodmonomestot.end();itert++)
669  {
670  nuevomon=0;
671  for(typename typP::iterator iter=listLambda.begin();iter!=listLambda.end();
672  iter++)
673  {
674  // mdebug()<<"itert->begin()"<<*itert->begin();
675  // mdebug()<<"iter->begin()"<<*iter->begin();
676  if (isEgal(*(itert->begin()),*(iter->begin()),b))
677  {
678  nuevomon=1;
679  }
680  }
681  if (nuevomon==0 && *itert!=1)
682  {
683  // mdebug()<<"itert"<<*itert;
684  monomesadd.push_back(*itert);
685  projmonomesadd.push_back(*itert);
686  }
687  }
688 
689 
690  //mdebug()<<"monomesadd"<<monomesadd1.size();
691  mdebug()<<"monomesadd"<<monomesadd.size();
692  int k=0;
693  COEFF coeff2;
694  //if (!monomesadd1.empty())
695  if (!monomesadd.empty())
696  {
697  proj(projmonomesadd,dump,b,serv);
698  listcoef=new double[projmonomesadd.size()];
699  //listcoef=new COEFF[projmonomesadd.size()];
700  for(typename typP::iterator itadd=projmonomesadd.begin(); itadd!=projmonomesadd.end();
701  itadd++)
702  {
703  //mdebug()<<"itadd"<<*itadd;
704  cof=0;
705  for(typename typP::value_type::iterator itaddmon=itadd->begin();
706  itaddmon!=itadd->end();itaddmon++)
707  {
708  for(Polynomial::iterator itp=p.begin();itp!=p.end();
709  itp++)
710 // for(Poly::iterator itp=p.begin();itp!=p.end();
711 // itp++)
712  {
713 // mdebug()<<"itaddmon"<<*itaddmon;
714 // mdebug()<<"itp"<<*itp;
715  if (isEgal(*itaddmon,*itp,b))
716  {
717  // mdebug()<<"coeff(itp)"<<itp->GetCoeff();
718  coeff2=(COEFF)itaddmon->GetCoeff();
719  cof+=Scl<MPF>::castDouble(coeff2)*(itp->GetCoeff());
720  }
721  }
722 
723  }
724  mdebug()<<"coef"<<cof;
725  listcoef[k]=cof;
726  k++;
727  }
728 
729  int j=0;
730  int s=projmonomesadd.size();
731  for(typename list<Monomial>::iterator itp1=monomesadd1.begin(); itp1!=monomesadd1.end();
732  itp1++)
733 // for(typename typP::iterator itp1=monomesadd.begin(); itp1!=monomesadd.end();
734 // itp1++)
735  {
736  if (*itp1!=1)
737  {
738  if (listcoef[s-j-1]==0) listcoef[s-j-1]=10e-20;
739  mdebug()<<"ipt"<<*itp1;
740  p+=(*itp1)*listcoef[s-j-1];
741  j++;
742  }
743 
744  }
745 
746  }
747 
748  int rank_stop=factorial(grado/2+(b.nbvar()))/(factorial(grado/2)*factorial(b.nbvar()));
749  mdebug()<<"rank_stop"<<rank_stop;
750 
751  //double threshold=0.00003;
752  mdebug()<<tresh;
753  mmx::Decomposer<Polynomial> tens(p,tresh,0,-1,-1,rank_stop+1,0);
754 
755  tens.main_algo();
756  mdebug()<<tens.lambdasopt.size();
757 
758 
759  for (int i=0;i<tens.lambdasopt.size();i++)
760  if (tens.lambdasopt[i].real()>tresh) numsol++;
761 
762 
763  mdebug()<<"nombre de solutions"<<numsol;
764 
765  if (numsol!=0)
766  {
767  solfinal= new coeff[numsol*tens.nb_var+2];
768  solfinal[0]=numsol;
769  solfinal[1]=slv->fminprimal+pp[0];
770  mdebug()<<"fmin"<<slv->fminprimal;
771  mdebug()<<"p0"<<pp[0];
772 
773 
774  int k=2;
775  for (int j=0;j< tens.lambdasopt.size();j++)
776  if (tens.lambdasopt[j].real()>tresh)
777 
778  for(unsigned i=0;i<tens.linear_forms.nbrow();i++)
779  {
780  solfinal[k]=tens.linear_forms(i,j).real();
781  k++;
782  }
783  mdebug()<<"on a les bonnes solutions";
784  }
785  else
786  {
787  solfinal= new coeff[2];
788  solfinal[0] = 0;
789  solfinal[1]=slv->fmindual+pp[0];
790 
791  }
792 
793 
794  }
795  else{
796 
797  solfinal= new coeff[2];
798  solfinal[0] = 0;
799  solfinal[1]=slv->fminprimal+pp[0];
800  }
801 
802 
803  // }
804 // else
805 // { //si dimension est egal a 1
806 // //list<COEFF> talist;
807 // sol1=new coeff[dim];
808 // sol1[0]=(coeff)1;
809 // sol2=new coeff[6];
810 // for(i=0;i<6;i++)
811 // sol2[i]=0;
812 
813 // method=1;
814 // solfinal=new coeff[1];
815 // solfinal[0]=-1;
816 
817 // }
818  mdebug()<<"method"<<method;
819  //
820  //On calcul le noyau
821  //
822 
823  if (method==1 && solst!=5)
824  {
825  mdebug()<<"error";
826  long n=stockksur2.size();
827  double *V=new double[n*n];
828  double *S=new double[n];
829  sol1=new double[n*n];
830  double *work=new double[6*n];
831  long eps1=1e5;
832  long eps2=1e7;//AVANT CT 8
833  long eps3=1e17;
834  long eps4=1e14;
835  long lwork=6*n,info;
836  int kk=0;//servira pour le rang 0
837  int rank=0;
838  double *listrank;
839  listrank=new double[dim];
840  std::map<Monomial,double> coeffm;
841  Monomial m;
842 
843  std::map<pair<int,int>,double> mat;
844 
845 
846  for(typename Polynomial::const_iterator it=p.begin();it!= p.end();it++) {
847  m =*it;
848  m.SetCoeff(1);
849  coeffm[m]=it->GetCoeff();
850  }
851  Polynomial lm = matrix_of<Polynomial>::choose(numvar,k/2);
852 
853  mdebug()<<"lm:"<<lm<<"lm.size()"<<lm.size();
854  int i=0,j=0;
855  for(typename Polynomial::const_iterator it= lm.begin();it!= lm.end();it++)
856  {
857  j=i;
858  for(typename Polynomial::const_iterator jt= it; jt!= lm.end();jt++) {
859  m=(*it)*(*jt);
860  //std::cout<<"mon"<<m<<std::endl;
861 
862 
863  mat[make_pair(i,j)]=coeffm[m];
864  mat[make_pair(j,i)]=coeffm[m];
865 
866 
867  mdebug()<<",i:"<<i<<",j:"<<j<<",value"<<coeffm[m];
868  j++;
869  }
870  i++;
871  }
872  int z=0;
873  for (int s=0;s<n;s++)
874  for (int t=0;t<n;t++)
875  {
876  sol1[z]=mat[make_pair(s,t)];
877  z++;
878  }
879 
880  r=dim-2;
881 // int s=slv->output.size();
882 // sol1[0]=1;
883 // for (int k=0;k<n;k++)
884 // //for (int j=0;j<n;j++)
885 // for(int i=0;i<n;i++)
886 // {
887 // if (k*n+i==0) sol1[k*n+i]=0;
888 // else
889 // {
890 // if (k>=1) sol1[k*n+i]= slv->output[s-i]
891 // sol1[k*n+i]=slv->output[s-i];
892 
893 // }
894 // }
895  // mdebug()<<sol2[0];
896  // if (abs(sol2[0])*1e+2<1 )
897  // {
898  list<double> sol1bis;
899 
900  for (int i=0;i<n*n;i++)
901  {
902  sol1bis.push_back(sol1[i]);
903  // mdebug()<<"sol1"<<sol1[i];
904  }
905 
906 
907  dgesvd_((char*)"N",(char*)"A",&n,&n,sol1,
908  &n,S,(double*)NULL,&n,V,&n,work,&lwork,&info);
909 
910  for (long m=dim; m!=1;m--)
911  {
912  double *sol1b;
913 
914  typename list<double>::iterator it1,it2;
915 
916 
917 
918 
919  it1=sol1bis.begin();
920 
921  for (int j=1;j<=m;j++)
922  {
923 
924  if (j!=m)
925  {
926  advance(it1,m-1);
927 
928  it1=sol1bis.erase(it1);
929  }
930  else
931  {
932  it2=it1;
933  advance(it2,m);
934  sol1bis.erase(it1,it2);
935  }
936 
937  }
938 
939  sol1b=new double[sol1bis.size()];
940  it1=sol1bis.begin();
941  for(int k=0;k<sol1bis.size();it1++,k++)
942  {
943 
944  sol1b[k]=*it1;
945  }
946 
947  n=m-1;
948  double *V1=new double[n*n];
949  double *S1=new double[n];
950  double *work1=new double[6*n];
951  long lwork1=6*n,info1;
952  int k1=0;
953 
954 
955  dgesvd_((char*)"N",(char*)"A",&n,&n,sol1b,
956  &n,S1,(double*)NULL,&n,V1,&n,work1,&lwork1,&info1);
957 
958  for(k1=1;k1<n;k1++)
959 
960  {
961  if (k1==1)
962  {
963 
964  if (solver==1 || solver==3 ||solver==4)
965  if (abs(S1[0])>abs(S1[k1])*eps1) break;
966 
967  if (solver==2)
968  if (abs(S1[0])>abs(S1[k1])*eps3) break;
969 
970  }
971  else
972  {
973 
974  if (solver==1 || solver==3 ||solver==4)
975  if(abs(S1[0])>abs(S1[k1])*eps1 || abs(S1[k1-1])>abs(S1[k1])*eps1) break;
976 
977  if (solver==2)
978  {
979 
980  // if(abs(S[0])>abs(S[kk])*eps3 || abs(S[kk-1])>abs(S[kk])*eps2)break;
981  if(abs(S1[0])>abs(S1[k1])*eps4 )break;
982  }
983 
984  }
985 
986  }//MAGIC
987 
988  rank=k1;
989 
990  listrank[r]=k1;
991 
992  r--;
993  mdebug()<<"rank"<<rank;
994  delete[] sol1b;
995  delete[] S1;
996  delete[] V1;
997 
998  }
999  // }
1000 
1001  if(method==1)
1002  {
1003  mdebug()<<"info svd "<<info;
1004  mdebug()<<"val sing X";
1005  for(int kk=0;kk<dim;kk++)
1006  mdebug()<<S[kk]<<" ";
1007  mdebug();
1008 
1009 
1010 
1011 
1012 
1013  // mdebug()<<"coiucou";
1014  for(kk=1;kk<dim;kk++)
1015 
1016  { /*mdebug()<< abs(S[kk-1])<< endl;
1017  mdebug()<<abs(S[kk])*1e6;*/
1018  if (kk==1)
1019  {
1020  //#if defined(SDPA) || defined(CSDP)
1021  // mdebug()<<"svd0SDPA";
1022  if (solver==1 || solver==3 ||solver==4)
1023  if (abs(S[0])>abs(S[kk])*eps1) break;
1024  //#endif
1025  //#ifdef GMPSDPA
1026  // mdebug()<<"svd0";
1027  if (solver==2)
1028  if (abs(S[0])>abs(S[kk])*eps3) break;
1029  //#endif
1030  }
1031  else
1032  {
1033  // #if defined(SDPA) || defined(CSDP)
1034  if (solver==1 || solver==3 || solver==4)
1035  if(abs(S[0])>abs(S[kk])*eps1 || abs(S[kk-1])>abs(S[kk])*eps1) break;
1036  // #endif
1037  // #ifdef GMPSDPA
1038  if (solver==2)
1039  {
1040  mdebug()<<"svdvoisin"<<abs(S[kk])*eps3;
1041  // if(abs(S[0])>abs(S[kk])*eps3 || abs(S[kk-1])>abs(S[kk])*eps2)break;
1042  if(abs(S[0])>abs(S[kk])*eps4 )break;
1043  }
1044  // #endif
1045  }
1046 
1047  }//MAGIC
1048  // if((abs(S[kk-1])>abs(S[kk])*eps1)) break;}//MAGIC
1049  mdebug()<<"kk ici "<<kk<<" et n "<<dim;
1050  // mdebug()<<"V";
1051 
1052  // for(int j=0;j<(int)dim;j++)
1053  // {
1054  // for(int jj=0;jj<dim;jj++)
1055  // mdebug()<<V[dim*(jj)+j]<<" ";
1056  // mdebug();
1057  // }
1058 
1059  //sol2[4]=dim;
1060  //sol2[5]=kk;
1061  rank=kk;
1062  listrank[dim-1]=kk;
1063 
1064  mdebug()<<"grado"<<grado;
1065  mdebug()<<"rank final"<<rank;
1066  for(int l=0;l<dim;l++)
1067  mdebug()<<listrank[l];
1068 
1069  //flat extension condition gloptipoly
1070  int flatext=0;
1071  int j=0,j1,j2,c1,c2;
1072  int rankfinal;
1073 
1074  if (maxdegrest==0) j=1;
1075  else
1076  {
1077  if (maxdegrest%2==1) maxdegrest++;
1078  j=maxdegrest/2;
1079  }
1080  j1=Degree(*F.begin());
1081  if (j1%2==1)j1++;
1082  j1/=2;
1083  j2=max(j1,j);
1084  mdebug()<<"j"<<j;
1085  mdebug()<<"j2"<<j2;
1086  for (;j2<=grado/2;j2++)
1087  {
1088 
1089  c1=(factorial(numvar+j2)/(factorial(j2)*factorial(numvar)))-1;
1090  c2=(factorial(numvar+j2-j)/(factorial(j2-j)*factorial(numvar)))-1;
1091  mdebug()<<"c1 "<<c1<<"c2 "<<c2;
1092 
1093  if (listrank[c1]==listrank[c2])
1094  {
1095  flatext=1;
1096  rank=listrank[c1];
1097  mdebug()<<"rank"<<rank;
1098  break;
1099  }
1100  }
1101  mdebug()<<"flat extension"<<flatext;
1102  flat=flatext;
1103 
1104 
1105  //
1106  //On construit les nouvelles equations
1107  //
1108 
1109  int count_eq;
1110  int keri,kerf;
1111  kerf=c1;
1112  keri=c2+1;
1113  rankfinal=rank;
1114 
1115  for(;rank<dim;rank++)
1116  {
1117 #if 1
1118  // mdebug()<<"equation dans le noyau";
1119 #endif
1120  count_eq=1;
1121  typedef typename typP::value_type polyalp;
1122  polyalp tmp(0);
1123  for(typename list<typename typserv::monom_t>::iterator
1124  iter=stockksur2.begin();
1125  iter!=stockksur2.end();iter++,count_eq++)
1126  {
1127 
1128 
1129  if(!Iszero(abs(V[rank+dim*(count_eq-1)])))
1130 
1131  {
1132 
1133  tmp+=polyalp(*iter*(COEFF)V[rank+dim*(count_eq-1)]);
1134 
1135  }
1136 
1137  }
1138 
1139  mdebug()<<"g trouve ca comme nvlle eq "<<tmp;
1140  newpol.push_back(tmp);
1141 
1142  }
1143 
1144  solfinal[0]=rankfinal;
1145  }
1146 
1147 
1148  delete[] S;
1149  delete[] V;
1150  //delete[] work;
1151 
1152  }
1153  //delete[] sol1;
1154  // #ifdef CSDP
1155  //if (method==1 ) delete[] sol1;
1156 // if (solve3)
1157 // if (dim!=1)
1158 // delete[] sol3;
1159  //#endif
1160 
1161 
1162 
1163 
1164 
1165  delete [] constraints2;
1166  delete[] blockptr2;
1167  delete [] bb;
1168 
1169 }
1170 
1171 template<typename mon, typename mon2, typename Base>
1172 int isEgal(const mon & m1,const mon2 & m2,const Base & b)
1173 {
1174  const int nbvar=b.nbvar();
1175  int res=1;
1176  if((m1.GetCoeff())==0)
1177  res=0;
1178  else
1179  for(int i=0;i<nbvar;i++)
1180  {
1181  //mdebug()<<" isdivisble "<<m2.GetDegree(i)<<" "<<m1.GetDegree(i);
1182  if(m2.GetDegree(i)!=m1.GetDegree(i))
1183  { res=0;break;};
1184  }
1185  return res;
1186 }
1187 
1188 template<typename T>
1189 int dgesvd_(char *jobu, char *jobvt, long *m, long *n,
1190  T *a, long *lda, T *s, T *u, long *
1191  ldu, T *vt, long *ldvt, T *work, long *lwork,
1192  long *info);
1193 
The solversdp_csdp struct The solversdp interface class for csdp.
Definition: solversdp_csdp.h:9
The solversdp_sdpa struct The solversdp interface class for sdpa.
Definition: solversdp_sdpa.h:9
Multivariate polynomials.
Definition: MPoly.hpp:28
#define max(a, b)
Definition: alp_f2c.H:167
int indice(const typename typMk::value_type &m, const typMk &stockmon)
Definition: matmul.hpp:2
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)
void proj(T &Crochet, const typdump &dump, const Base &b)
Definition: proj.hpp:51
Vector output
Definition: solversdp.h:83
iterator end()
Definition: MPoly.hpp:102
C GetCoeff() const
Definition: Monom.hpp:67
MSKCONST char * file
Definition: mosek.h:2254
MSKaccmodee MSKint32t MSKint32t MSKint32t MSKrealt value
Definition: mosek.h:2463
Definition: corealgo3sdp.hpp:14
void generickernelNEW(typP &newpol, int k, const typdump &dump, Base &b, typserv &serv, typP F, coeff *&sol2, typP rest, coeff *&solfinal, int solver, int &method, int &flat, string param, double &tresh)
Definition: generkeropt.hpp:18
Definition: Rlex.hpp:13
list< predicat >::iterator iterator
Definition: types.hpp:20
int & nentries(int i)
number of entries asociated to each matrix
Definition: solversdp.h:65
The solversdp_gmp struct The solversdp interface class for gmp.
Definition: solversdp_gmp.h:9
MSKint32t * numvar
Definition: mosek.h:3018
MSKcallbackcodee MSKsoltypee MSKprostae MSKsolstae MSKstakeye MSKstakeye MSKstakeye MSKrealt MSKrealt MSKrealt * y
Definition: mosek.h:2689
static double castDouble(Scl< T > &ref)
MSKint32t MSKCONST MSKint32t * dim
Definition: mosek.h:2407
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
The solversdp_mosek struct The solversdp interface class for mosek.
Definition: solversdp_mosek.h:14
MSKconetypee MSKrealt MSKint32t MSKint32t j
Definition: mosek.h:2421
static Polynomial choose(unsigned n, unsigned d)
Definition: matrix_of.hpp:10
Definition: mdebug.hpp:11
MSKint32t k
Definition: mosek.h:2713
double & obj_coeff(int i)
Definition: solversdp.h:70
void computeprod(typprod &prod, typstock &stockmon, Base &b, typdump &dump)
Definition: corealgo3sdp.hpp:2514
MSKdparame param
Definition: mosek.h:2743
double & coeff(int i, int j, int k)
Definition: solversdp.h:61
dynamicexp< X, E >::degree_t Degree(const dynamicexp< X, E > &t)
Definition: dynamicexp.hpp:91
double fmindual
Definition: solversdp.h:85
iterator end()
Definition: types.hpp:30
int IsinB(const mon &m, const Base &b)
Definition: IsinB3.hpp:68
Definition: types.hpp:14
exponent_t GetDegree() const
Definition: Monom.hpp:70
void enumeratemoninv(typstock &stockmon, int k, const Base &b, const typdump &dump)
Definition: corealgo3sdpa.hpp:2518
MSKint32t MSKint32t MSKint32t i
Definition: mosek.h:2278
int Iszero(const Scl< MPQ > &c)
Definition: Iszero.hpp:14
#define abs(x)
Definition: f2c.H:161
int & dim()
dimension of the first block
Definition: solversdp.h:43
MSKrescodee r
Definition: mosek.h:2321
int isEgal(const mon &m1, const mon2 &m2, const Base &b)
Definition: generkeropt.hpp:1172
MSKstreamtypee MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t a
Definition: mosek.h:3833
#define COEFF
Definition: symbo2.hpp:8
double fminprimal
Definition: solversdp.h:84
iterator begin()
Definition: types.hpp:25
Definition: Dlex.hpp:19
double factorial(int n)
Definition: Arith.hpp:71
Multivariate monomials.
Definition: Monom.hpp:21
iterator begin()
Definition: MPoly.hpp:97
The solversdp struct.
Definition: solversdp.h:26
virtual void run()=0
Home  |  Download & InstallContributions