13 #include "tensor-decomposition/Decomposer.hpp"
15 #include "../arithm/Scl_mpf.hpp"
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)
21 typedef typename typP::value_type::coeff_t Scalar;
22 typedef typename typP::value_type::order_t ord;
32 struct sparseblockv<COEFF> *blockptr2;
35 int i,aveccont=0,numsol=0,solst;
37 struct constraintmatrixv<COEFF> *constraints2;
39 mdebug()<<
"tresh dedans de generker"<<tresh;
48 typP stockprod,stockproj,stockproj2,stockproj2b,listmin,listminmon,listrest,listmon,listLambda;
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;
73 for(
typename list<typename typserv::monom_t>::iterator
74 iter=stockksur2.begin(); iter!=stockksur2.end();iter++)
76 if(!
IsinB(*iter,b)) stockksur2.erase(iter--);
79 for(
typename list<typename typserv::monom_t>::iterator
80 iter=listmonLambda.begin(); iter!=listmonLambda.end();iter++)
83 if(!
IsinB(*iter,b)) listmonLambda.erase(iter--);
85 for(
typename list<Monomial>::iterator
86 iter=listmonLambda1.begin(); iter!=listmonLambda1.end();iter++)
92 monomesadd1.push_back(*iter);
93 listmonLambda1.erase(iter--);
96 if (*iter==1) listmonLambda1.erase(iter--);
99 mdebug()<<
"monome en degre k/2 ";
100 for(
typename list<typename typserv::monom_t>::iterator
101 iter=stockksur2.begin(); iter!=stockksur2.end();iter++)
106 for(
typename list<typename typserv::monom_t>::iterator
107 iter=stockksur2.begin(); iter!=stockksur2.end();iter++)
109 if (degmax<k) k=degmax;
112 int dim=stockksur2.size();
113 int dimrest=rest.size();
115 int r1=0,u,
file,contmon,sizerest=0,relat,s,maxdegrest=0,nummonineq;
117 int listsizerest[dimrest];
118 int listdegrest[dimrest];
119 int listnumeq[dimrest];
123 for(
int i=0;i<itb->taille2;i++)
125 if (
Degree(itb->refuse[i])==1 ) numvar--;
127 for(
typename typP::iterator iter=rest.begin();iter!=rest.end();
129 if (
Degree(*iter)>=maxdegrest) maxdegrest=
Degree(*iter);
131 mdebug()<<
"maxdegrest"<<maxdegrest;
151 for(
typename list<Monomial>::iterator
152 iter=listmonLambda1.begin(); iter!=listmonLambda1.end();iter++)
156 for(
typename list<Monomial>::iterator
157 iter1=monomesadd1.begin(); iter1!=monomesadd1.end();iter1++)
171 for(
typename typP::iterator iter=F.begin();iter!=F.end();
178 proj(rest,dump,b,serv);
185 for(
typename typP::iterator iter=rest.begin();iter!=rest.end();
190 listdegrest[r1]=
Degree(*iter);
192 if (
Degree(*iter)%2!=0) u++;
195 listsizerest[r1]=sizerest;
204 listmon.erase(listmon.begin(),listmon.end());
205 for(
typename list<typename typserv::monom_t>::iterator
206 iters=stockksur2.begin(); iters!=stockksur2.end();iters++)
208 if (contmon<sizerest)
211 listrest.push_back(*iter * *iters);
212 listmon.push_back(*iters);
218 typename typP::iterator iterm=listmon.begin();
220 for ( ;iterm!=listmon.end(); iterm++)
222 typename typP::iterator iterm2=listmon.begin();
234 for (;iterm2!=listmon.end(); iterm2++)
237 listrest.push_back(*iter * *iterm * *iterm2);
252 listrest.push_back(*iter);
255 listnumeq[r1]=nummonineq;
259 proj(listrest,dump,b,serv);
265 for(
typename typP::iterator iter=stockprod.begin();iter!=stockprod.end();
270 mdebug()<<
"stockprod.size()"<<stockprod.size();
271 for(
typename typP::iterator iter=stockproj2.begin();iter!=stockproj2.end();
276 for(
typename typP::iterator iter=F.begin();iter!=F.end();
281 for(
typename typP::iterator iter=listrest.begin();iter!=listrest.end();
286 mdebug()<<
"monomios de Lambda";
287 for(
typename list<typename typserv::monom_t>::iterator
288 iter=listmonLambda.begin(); iter!=listmonLambda.end();iter++)
298 for(
typename typP::iterator iter=listLambda.begin();iter!=listLambda.end();
301 if(!
IsinB(*(iter->begin()),b)) listLambda.erase(iter--);
302 if (*(iter->begin())==1) listLambda.erase(iter--);
325 typP listnormalform,stockmonproj;
328 int countmonb=0,countmont=0,countmonp=0;
329 for(
typename typP::iterator iter=stockprod.begin();
330 iter!=stockprod.end();iter++)
332 if(
IsinB(*(iter->begin()),b))
336 listmin.push_back(*iter);
338 listminmon.push_back(*iter);
344 mdebug()<<
"monproj"<<countmonp ;
345 stockmonproj.push_back(*iter);
346 listnormalform.push_back(*iter);
352 for(
typename typP::iterator itermonb=listminmon.begin();itermonb!=listminmon.end();
356 mapmonbase[*itermonb->begin()]=count;
358 mdebug()<<
"antes de definir las constraint";
366 for(
int k=0; k<dimrest; k++)
367 iterac+=listsizerest[k];
371 int dimmonap=listminmon.size();
372 mdebug()<<
"dim mon en b"<<dimmonap;
373 mdebug()<<
"dim mon qu'on proj"<<countmonp;
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;
406 for(
unsigned k=0;k<dimrest;k++)
407 slv->
dim(k+1)=listsizerest[
k];
410 int i2_counter=1,j2_counter;
412 for(
typename list<typename typserv::monom_t>::iterator i=stockksur2.begin();
413 i!=stockksur2.end();i++,i2_counter++)
415 j2_counter=i2_counter;
416 for(
typename list<typename typserv::monom_t>::iterator
j=i;
417 j!=stockksur2.end();
j++,j2_counter++)
426 polproj=mapmonproj[*i * *
j];
429 for(
typename typP::value_type::iterator iterpol=polproj.
begin();
430 iterpol!=polproj.
end();iterpol++)
433 nummatrix=mapmonbase[*iterpol];
435 value=(
COEFF)iterpol->GetCoeff();
436 if (nummatrix==dimmonap)
438 slv->
coeff(0,0,i2_counter-1,j2_counter-1)=Scalar::castDouble(value);
443 slv->
coeff(nummatrix,0,i2_counter-1,j2_counter-1)=Scalar::castDouble(value);
460 nummatrix=mapmonbase[*i * *
j];
461 if (nummatrix==dimmonap)
463 slv->
coeff(0,0,i2_counter-1,j2_counter-1)=1;
468 slv->
coeff(nummatrix,0,i2_counter-1,j2_counter-1)=1;
480 mdebug()<<
"num mon total"<<countmont;
481 int indice=0,indicej=0,eqind,indcont,numine=1,numeqmatrix;
491 for(
typename typP::iterator itera=listrest.begin();
492 itera!=listrest.end();itera++,numine++)
495 mdebug()<<
"numine"<<numine;
496 mdebug()<<
"listnumeq[nineq]"<<listnumeq[nineq];
497 if (numine==listnumeq[nineq]+1)
511 indcont=listsizerest[kk];
512 mdebug()<<
"indicej"<<indicej;
513 if (indicej==indcont)
530 for(
typename typP::value_type::iterator itera1=itera->begin();
531 itera1!=itera->end();itera1++)
535 nummatrix=mapmonbase[*itera1];
537 value3=(
COEFF)itera1->GetCoeff();
539 if (nummatrix==dimmonap) nummatrix=0;
540 slv->
coeff(nummatrix,nummatrixcon,indice-1,indicej-1)=Scalar::castDouble(value3);
555 struct blockmatrix<COEFF> X,Z;
558 int tmpsize=(int)stockksur2.size(),funcionnonnull=0;
572 for(i=1;i<=dimmonap-1;i++)
585 typename typP::iterator iterfuncion=F.begin();
586 for(
typename typP::value_type::iterator itermon=iterfuncion->begin();
587 itermon!=iterfuncion->end();itermon++)
590 value2=(
COEFF)itermon->GetCoeff();
592 if (*itermon!=itermon->GetCoeff())
595 for(
typename typP::iterator iterlis=listmin.begin();iterlis!=listmin.end();
596 iterlis++,count_lis++)
598 if (
isEgal(*itermon,*(iterlis->begin()),b))
600 slv->
obj_coeff(count_lis)=Scalar::castDouble(value2);
604 pp[0]=Scalar::castDouble(value2);
622 char nom[50],command[1024],copy[1024],copy1[1024];
630 for(
typename list<Monomial>::iterator iter=listmonLambda1.begin();iter!=listmonLambda1.end();
656 typP projmonomesadd,prodmonomestot, monomesadd;
658 list<typename typserv::monom_t> monomestot;
668 for(
typename typP::iterator itert=prodmonomestot.begin(); itert!=prodmonomestot.end();itert++)
671 for(
typename typP::iterator iter=listLambda.begin();iter!=listLambda.end();
676 if (
isEgal(*(itert->begin()),*(iter->begin()),b))
681 if (nuevomon==0 && *itert!=1)
684 monomesadd.push_back(*itert);
685 projmonomesadd.push_back(*itert);
691 mdebug()<<
"monomesadd"<<monomesadd.size();
695 if (!monomesadd.empty())
697 proj(projmonomesadd,dump,b,serv);
698 listcoef=
new double[projmonomesadd.size()];
700 for(
typename typP::iterator itadd=projmonomesadd.begin(); itadd!=projmonomesadd.end();
705 for(
typename typP::value_type::iterator itaddmon=itadd->begin();
706 itaddmon!=itadd->end();itaddmon++)
708 for(Polynomial::iterator itp=p.begin();itp!=p.end();
715 if (
isEgal(*itaddmon,*itp,b))
718 coeff2=(
COEFF)itaddmon->GetCoeff();
730 int s=projmonomesadd.size();
731 for(
typename list<Monomial>::iterator itp1=monomesadd1.begin(); itp1!=monomesadd1.end();
738 if (listcoef[s-j-1]==0) listcoef[s-j-1]=10e-20;
740 p+=(*itp1)*listcoef[s-j-1];
749 mdebug()<<
"rank_stop"<<rank_stop;
753 mmx::Decomposer<Polynomial> tens(p,tresh,0,-1,-1,rank_stop+1,0);
756 mdebug()<<tens.lambdasopt.size();
759 for (
int i=0;i<tens.lambdasopt.size();i++)
760 if (tens.lambdasopt[i].real()>tresh) numsol++;
763 mdebug()<<
"nombre de solutions"<<numsol;
767 solfinal=
new coeff[numsol*tens.nb_var+2];
775 for (
int j=0;j< tens.lambdasopt.size();j++)
776 if (tens.lambdasopt[j].real()>tresh)
778 for(
unsigned i=0;i<tens.linear_forms.nbrow();i++)
780 solfinal[
k]=tens.linear_forms(i,j).real();
783 mdebug()<<
"on a les bonnes solutions";
787 solfinal=
new coeff[2];
797 solfinal=
new coeff[2];
818 mdebug()<<
"method"<<method;
823 if (method==1 && solst!=5)
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];
839 listrank=
new double[
dim];
840 std::map<Monomial,double> coeffm;
843 std::map<pair<int,int>,
double> mat;
846 for(
typename Polynomial::const_iterator it=p.begin();it!= p.end();it++) {
849 coeffm[m]=it->GetCoeff();
853 mdebug()<<
"lm:"<<lm<<
"lm.size()"<<lm.size();
855 for(
typename Polynomial::const_iterator it= lm.begin();it!= lm.end();it++)
858 for(
typename Polynomial::const_iterator jt= it; jt!= lm.end();jt++) {
863 mat[make_pair(i,j)]=coeffm[m];
864 mat[make_pair(j,i)]=coeffm[m];
867 mdebug()<<
",i:"<<i<<
",j:"<<j<<
",value"<<coeffm[m];
873 for (
int s=0;s<n;s++)
874 for (
int t=0;t<n;t++)
876 sol1[z]=mat[make_pair(s,t)];
898 list<double> sol1bis;
900 for (
int i=0;i<n*n;i++)
902 sol1bis.push_back(sol1[i]);
907 dgesvd_((
char*)
"N",(
char*)
"A",&n,&n,sol1,
908 &n,S,(
double*)NULL,&n,V,&n,work,&lwork,&info);
910 for (
long m=dim; m!=1;m--)
914 typename list<double>::iterator it1,it2;
921 for (
int j=1;j<=m;j++)
928 it1=sol1bis.erase(it1);
934 sol1bis.erase(it1,it2);
939 sol1b=
new double[sol1bis.size()];
941 for(
int k=0;k<sol1bis.size();it1++,k++)
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;
955 dgesvd_((
char*)
"N",(
char*)
"A",&n,&n,sol1b,
956 &n,S1,(
double*)NULL,&n,V1,&n,work1,&lwork1,&info1);
964 if (solver==1 || solver==3 ||solver==4)
965 if (
abs(S1[0])>
abs(S1[k1])*eps1)
break;
968 if (
abs(S1[0])>
abs(S1[k1])*eps3)
break;
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;
981 if(
abs(S1[0])>
abs(S1[k1])*eps4 )
break;
1003 mdebug()<<
"info svd "<<info;
1005 for(
int kk=0;kk<
dim;kk++)
1014 for(kk=1;kk<
dim;kk++)
1022 if (solver==1 || solver==3 ||solver==4)
1023 if (
abs(S[0])>
abs(S[kk])*eps1)
break;
1028 if (
abs(S[0])>
abs(S[kk])*eps3)
break;
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;
1042 if(
abs(S[0])>
abs(S[kk])*eps4 )
break;
1064 mdebug()<<
"grado"<<grado;
1065 mdebug()<<
"rank final"<<rank;
1066 for(
int l=0;l<
dim;l++)
1071 int j=0,j1,j2,c1,c2;
1074 if (maxdegrest==0) j=1;
1077 if (maxdegrest%2==1) maxdegrest++;
1086 for (;j2<=grado/2;j2++)
1091 mdebug()<<
"c1 "<<c1<<
"c2 "<<c2;
1093 if (listrank[c1]==listrank[c2])
1101 mdebug()<<
"flat extension"<<flatext;
1115 for(;rank<
dim;rank++)
1121 typedef typename typP::value_type polyalp;
1123 for(
typename list<typename typserv::monom_t>::iterator
1124 iter=stockksur2.begin();
1125 iter!=stockksur2.end();iter++,count_eq++)
1129 if(!
Iszero(
abs(V[rank+dim*(count_eq-1)])))
1133 tmp+=polyalp(*iter*(COEFF)V[rank+dim*(count_eq-1)]);
1139 mdebug()<<
"g trouve ca comme nvlle eq "<<tmp;
1140 newpol.push_back(tmp);
1144 solfinal[0]=rankfinal;
1165 delete [] constraints2;
1171 template<
typename mon,
typename mon2,
typename Base>
1174 const int nbvar=b.
nbvar();
1179 for(
int i=0;
i<nbvar;
i++)
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,
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
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
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
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