12 #include "linalg/clapack.h"
14 #include"linpkg/Lapack.H"
15 #include"linpkg/Eigen.H"
26 void dgees_(
char *JOBVS,
char *SORT,
bool (*SELECT)(
double,
double),
int *N,
double *A,
int *LDA,
int *SDIM,
double *WR,
double *WI,
double *VS,
int *LDVS,
double *WORK,
int *LWORK,
double *BWORK,
int *info);
29 int zgees_(
const char *jobvs,
const char *sort,
33 tla_int *lwork, T *rwork,
logical *bwork, tla_int *info);
35 int ztrsen_(
const char *job,
const char *compq,
logical *select, tla_int
44 template<
typename Mat>
47 typedef typename Mat::rep_t rept;
49 bool (*SELECT)(double,double)=(
bool (*)(double,double))1;
51 double *wr=(
double*)
malloc(m.nbrow()*
sizeof(double));
52 double *wi=(
double*)
malloc(m.nbrow()*
sizeof(double));
53 Mat Mres(m.nbrow(),m.nbrow());
54 double *work=(
double*)
malloc(10*
sizeof(
double)*m.nbrow());
55 int info,n,
i,l,lres,lwork,sdim;
56 double* tab =(
double*)
malloc(m.nbcol()*m.nbrow()*
sizeof(double));
57 double* tabres =(
double*)
malloc(m.nbcol_*m.nbrow_*
sizeof(
double));
58 n=m.nbrow();l=m.nbrow();lres=m.nbrow();lwork=10*m.nbrow();
59 for(i=0;i<m.nbcol_*m.nbrow_;i++) tab[i]=m.tab_[i];
60 dgees_(
"V",
"N",SELECT,&n,tab,&l,&sdim,wr,wi,tabres,&lres,work,
62 (Mres.rep).reserve(m.nbcol_,m.nbcol_);
63 for(i=0;i<m.nbcol_*m.nbrow_;i++) (Mres.rep).tab_[
i]=tabres[
i];
77 static long int rep=1;
87 template<
typename Mat>
90 typedef typename Mat::rep_t rept;
91 typedef typename Mat::coeff_t::value_type T;
96 T *rwork=(T*)
malloc(m.nbrow_*
sizeof(T));
98 Mat Mres(m.nbrow_,m.nbrow_);
101 tla_int info,n,l,lres,lwork,sdim;
107 const char *JOBS=
"V",*SORT=
"N";
109 n=m.nbrow_;l=m.nbrow_;lres=m.nbrow_;lwork=5*m.nbrow_;
111 for(i=0;i<m.nbcol_*m.nbrow_;i++) {
112 tab[
i].
r=m.tab_[
i].real();
113 tab[
i].
i=m.tab_[
i].imag();
116 zgees_(JOBS,SORT,SELECT,&n,tab,&l,&sdim,
117 w,tabres,&lres,work,&lwork,rwork,bwork,&info);
118 (Mres.rep).reserve(m.nbcol_,m.nbcol_);
119 for(i=0;i<m.nbcol_*m.nbrow_;i++)
121 (Mres.rep).tab_[i]=complex<T>(tab[i].
r,tab[i].i);
126 for(i=0;i<m.nbcol_*m.nbrow_;i++)
128 (Mres.rep).tab_[i]=complex<T>(tabres[i].
r,tabres[i].i);
141 MatDense<lapack<complex<mpf_class> > >
144 typedef MatDense<lapack<complex<mpf_class> > > Mat;
145 typedef lapack<complex<mpf_class> > rept;
151 T *rwork=(T*)
malloc(m.nbrow_*
sizeof(T));
153 Mat Mres(m.nbrow_,m.nbrow_);
156 tla_int info,n,l,lres,lwork,sdim;
162 char *JOBS=
"V",*SORT=
"N";
164 n=m.nbrow_;l=m.nbrow_;lres=m.nbrow_;lwork=5*m.nbrow_;
166 for(
i=0;
i<m.nbcol_*m.nbrow_;
i++) {
167 tab[
i].
r=m.tab_[
i].real();
168 tab[
i].i=m.tab_[
i].imag();
172 zgees_(JOBS,SORT,SELECT,&n,tab,&l,&sdim,
173 w,tabres,&lres,work,&lwork,rwork,bwork,&info);
174 (Mres.rep).reserve(m.nbcol_,m.nbcol_);
175 for(
i=0;
i<m.nbcol_*m.nbrow_;
i++)
177 (Mres.rep).tab_[
i]=complex<T>(tab[
i].
r,tab[
i].
i);
182 for(
i=0;
i<m.nbcol_*m.nbrow_;
i++)
184 (Mres.rep).tab_[
i]=complex<T>(tabres[
i].
r,tabres[
i].
i);
200 template<
typename Mat>
206 Shurvect.transpose();
207 invShurvect=Shurvect;
208 Shurvect.transpose();
209 typename list<Mat>::iterator iter;
210 for(iter=lmat.begin();iter!=lmat.end();iter++)
212 Mat tmp=invShurvect*(*iter)*Shurvect;
217 template<
typename Mat,
typename coeff>
221 const char *JOBS=
"E",*COMPQ=
"N";
222 tla_int N=M.nbcol(),LDT=M.nbcol();
232 tla_int LWORK=2*N*N,info;
234 for(
int i=0;
i<N*N;
i++)
236 T[
i].
r=(M.rep).tab_[
i].real();
237 T[
i].
i=(M.rep).tab_[
i].imag();
239 ztrsen_(JOBS,COMPQ,select,&N,T,&LDT,Q,&LDQ,W,&m,&S,&SEP,WORK,&LWORK,&info);
248 template<
typename T,
typename Mat>
265 template<
typename Mat,
typename typcond>
268 typedef typename Mat::coeff_t::value_type T;
273 int *digits=(
int*)
malloc(M.nbcol()*
sizeof(int));
275 char tampon1[60],tampon2[60],*rien;
277 for(
unsigned i=0;
i<M.nbcol();
i++)
278 normM=
max(
sqrt((M(
i,
i)*conj(M(
i,
i))).real()),normM);
281 for(
unsigned i=0;
i<M.nbcol();
i++)
287 for(
unsigned i=0;
i<M.nbcol();
i++)
293 T lambda(1.0/cond[
i]*EPSILON*normM);
295 T nbdigits=(1.0/lambda);
297 for(k=1;nbdigits>1;k++,nbdigits/=10);
302 sprintf(tampon1,
"%%.%dLg\0",(k>16)?16:k);
305 sprintf(tampon2,tampon1,M(
i,
i).real());
308 truncnum[
i].
r=(T)(strtod(tampon2,&rien));
309 sprintf(tampon2,tampon1,M(
i,
i).imag());
312 truncnum[
i].
i=(T)strtod(tampon2,&rien);
314 for(
int i=0;
i<M.nbcol();
i++)
320 cout<<
"i"<<
i<<
"condi"<<cond[
i]<<endl;
321 for(
int j=0;
j<M.nbcol();
j++)
324 cout<<
"digitis_i "<<digits[
i]<<
" "<<digits[
j]<<endl;
325 for(
int k=0;
k<
min(digits[
i],digits[
j]);
k++,val*=10);
326 cout<<
"val "<<val<<endl;
327 cout<<
"la diference "<<
abs(truncnum[j].
r-truncnum[i].
r)<<endl;
328 cout<<
" en complex "<<
abs(truncnum[j].i-truncnum[i].i)<<endl;
329 cout<<
"prod "<<
abs(truncnum[j].r-truncnum[i].r)*val<<endl;
330 if ((
abs(truncnum[j].r-truncnum[i].r)*(T)val<(T)1.0)
331 &&(
abs(truncnum[j].i-truncnum[i].i)*(T)val<(T)1.0))
333 typcond stock=cond[
j];
334 cout<<
"stock"<<stock<<endl;
335 for(
int k=0;
k<M.nbcol();
k++)
337 cout<<
"condk"<< cond[
k]<<endl;
338 if(cond[
k]==stock) cond[
k]=-
i;
348 for(
int k=0;
k<M.nbcol();
k++)
359 template<
typename Mat,
typename typcond>
364 typedef typename Mat::coeff_t::value_type T;
367 tla_int N=M.nbcol(),LDT=M.nbcol(),LDQ=M.nbcol();
368 tla_int m,info,LWORK=N*N*2;
370 T *stockcond=(T*)
malloc(N*
sizeof(T));
381 for(
int k=0;
k<N*N;
k++)
383 tmpM[
k].
r=(M.rep).tab_[
k].real();
384 tmpM[
k].
i=(M.rep).tab_[
k].imag();
386 for(
int k=0;
k<N*N;
k++)
388 tmpQ[
k].
r=(Shurvect.rep).tab_[
k].real();
389 tmpQ[
k].
i=(Shurvect.rep).tab_[
k].imag();
392 for(
int k=0;
k<M.nbcol();
k++)
394 stockW[
k].
r=M(
k,
k).real();
395 stockW[
k].
i=M(
k,
k).imag();
398 for(
int k=0;
k<M.nbcol();
k++)
404 select[
k]=((cond[
k]==-
i)?1:0);
414 const char *JOBS=
"B",*COMPQ=
"V";
415 ztrsen_(JOBS,COMPQ,select,&N,tmpM,&LDT,tmpQ,
416 &LDQ,W,&m,&S,&SEP,WORK,&LWORK,&info);
417 for(
int k=0;
k<N*N;
k++)
418 (M.rep).tab_[
k]=complex<T>(tmpM[
k].
r,tmpM[
k].
i);
419 for(
int k=0;
k<N*N;
k++)
420 (Shurvect.rep).tab_[
k]=complex<T>(tmpQ[
k].
r,tmpQ[
k].
i);
425 char * posbusy=(
char*)
malloc(N);
432 for(;posbusy[stockpos];stockpos++);
434 (W[stockpos].
r-stockW[
k].
r)*(W[stockpos].r-stockW[
k].r)
435 +(W[stockpos].i-stockW[
k].i)*(W[stockpos].i-stockW[
k].i)
438 if((!posbusy[l])&&(
abs((W[l].r-stockW[
k].r)*(W[l].r-stockW[
k].r)+
439 (W[l].i-stockW[
k].i)*(W[l].i-stockW[
k].i)<mindiff))
442 mindiff=
abs((W[l].r-stockW[
k].r)*(W[l].r-stockW[
k].r)
443 +(W[l].i-stockW[
k].i)*(W[l].i-stockW[
k].i)
448 stockcond[stockpos]=(T)cond[
k];
452 cond[
k]=stockcond[
k];
469 template<
typename T,
typename Mat>
470 void reorder(Mat &Combilin,Mat &Shurvect,Mat &invShurvect,
471 list<int> &size_clust)
475 cond=
new T[Combilin.nbcol()];
477 for(i=0;i<(int)Combilin.nbcol();i++)
479 cond[
i]=cond_number<T>(Combilin,
i);
488 for(i=0;i<nbcluster;i++)
492 int tmp_size=
docluster(Combilin,Shurvect,cond,i);
497 size_clust.push_back(tmp_size);
499 size_clust.push_front(tmp_size);
507 for(i=0;i<invShurvect.nbrow();i++)
508 for(
int j=0;
j<invShurvect.nbcol();
j++)
509 invShurvect(i,
j)=conj(Shurvect(
j,i));
520 template<
typename Mat>
524 typedef typename Mat::coeff_t::value_type T;
526 Mat Shurvect,Combilin,tmp;
529 double *tab=(
double*)
malloc(lmat.size()*
sizeof(double));
531 typename list<Mat>::iterator iterComb=lmat.begin();
532 for(
unsigned i=0;
i<lmat.size();
i++)
533 tab[
i]=rand()% 32003+1;
534 for(
unsigned i=0;
i<lmat.size();
i++)
541 Combilin=lmat.front();
542 for(
unsigned i=0;iterComb!=lmat.end();iterComb++,
i++)
544 Combilin+=T(tab[
i])*(*iterComb);
550 Shurvect.transpose();
551 invShurvect=Shurvect;
552 Shurvect.transpose();
556 for(
unsigned i=0;
i<invShurvect.nbrow();
i++)
557 for(
unsigned j=0;
j<invShurvect.nbcol();
j++)
558 invShurvect(
i,
j)=conj(invShurvect(
i,
j));
560 tmp=invShurvect*Combilin*Shurvect;
563 reorder<T>(Combilin,Shurvect,invShurvect,size_clust);
565 typename list<Mat>::iterator iter;
566 for(iter=lmat.begin();iter!=lmat.end();iter++)
581 template<
typename Mat,
typename Complex_Mat>
586 typename list<Mat>::const_iterator iter,deb=lmat.begin();
587 typename list<int>::const_reverse_iterator
588 iter_size=size_clust.rbegin();
594 for(
int i=0;i<deb->nbrow();)
598 for(iter=lmat.begin();iter!=lmat.end();iter++)
602 typename list<Mat>::value_type::coeff_t
value(0) ,tmp(*iter_size);
607 for(
int j=0;
j<*iter_size;
j++) {
615 for(
int j=i;
j<i+*iter_size;
j++) {
617 cout <<
" "<< res(
j,comp,
value);
620 increment=*iter_size;
622 std::cout<<std::endl;
632 template<
typename Mat,
typename Complex_Mat>
636 typename list<Mat>::const_iterator iter,deb=lmat.begin();
637 for(i=0;i<deb->nbrow();)
639 if ((*deb)(i+1,
i)+(*deb)(
i,
i)==(*deb)(
i,
i))
643 for(iter=lmat.begin();iter!=lmat.end();iter++)
645 res(i,comp)=(*iter)(
i,
i);
653 Complex_Mat tmp(2,2),tmpShu(2,2),invtmpShu(2,2);
654 tmp(0,0)=(*deb)(
i,
i);
655 tmp(1,0)=(*deb)(i+1,
i);
656 tmp(1,1)=(*deb)(i+1,i+1);
657 tmp(0,1)=(*deb)(
i,i+1);
662 invtmpShu(0,0)=conj(invtmpShu(0,0));
663 invtmpShu(1,0)=conj(invtmpShu(1,0));
664 invtmpShu(1,1)=conj(invtmpShu(1,1));
665 invtmpShu(0,1)=conj(invtmpShu(0,1));
666 for(iter=lmat.begin();iter!=lmat.end();iter++)
668 tmp(0,0)=(*iter)(
i,
i);
669 tmp(1,0)=(*iter)(i+1,
i);
670 tmp(1,1)=(*iter)(i+1,i+1);
671 tmp(0,1)=(*iter)(
i,i+1);
672 tmp=invtmpShu*tmp*tmpShu;
673 res(i,comp)=tmp(0,0);
674 res(i+1,comp)=tmp(1,1);
682 template<
typename Mat>
685 typedef typename Mat::rep_t rept;
686 typedef typename Mat::coeff_t::value_type T;
690 Mat Mres(m.nbrow(),m.nbrow());
691 int info,n,l,ilo,ihi;
696 (T*)calloc(m.nbcol_,
sizeof(T));
699 n=m.nbrow_;l=m.nbrow_;
701 for(i=0;i<m.nbcol_*m.nbrow_;i++) {
702 tab[
i].
r=m.tab_[
i].real();
703 tab[
i].
i=m.tab_[
i].imag();
713 zgebal_(JOBS,&n,tab,&l,&ilo,&ihi,scale,&info);
715 (Mres.rep).reserve(n,n);
716 for(
unsigned int i=0;i<m.nbcol_*m.nbrow_;i++)
718 (Mres.rep).tab_[i]=complex<double>(tab[i].
r,tab[i].i);
737 template<
typename lmat,
typename typres>
740 list<int> size_clust;
743 for(
typename lmat::iterator iter=lres.begin();iter!=lres.end();iter++)
746 cout<<*iter<<endl<<endl;
747 typres tmpres((lres.front()).nbrow(),lres.size());
757 template<
typename typres,
typename Base>
761 list<MatDense<lapack<typename typres::coeff_t > > >lres;
763 cout<<
"RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"<<endl;
764 for(list<harewell<QQ> >::const_iterator iter=lmat.begin()
765 ;iter!=lmat.end();iter++)
767 MatDense<lapack<typename typres::coeff_t > >
768 tmp(iter->nrow,iter->ncol);
769 (tmp.rep).reserve(iter->nrow,iter->ncol);
770 for(
int j=0;
j<iter->nrow;
j++)
771 for(
int k=0;
k<iter->ncol;
k++)
773 tmp(
j,
k)=mpq_get_d(&(*iter)(
j,
k).rep());
780 cout<<
"RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"<<endl;
784 template<
typename typres,
typename Base>
786 ,
const Base &b,typres &res)
790 typedef typename typres::coeff_t T;
791 list<MatDense<lapack<typename typres::coeff_t > > > lres;
793 for(list<harewell<RR> >::const_iterator iter=lmat.begin()
794 ;iter!=lmat.end();iter++)
796 MatDense<lapack<typename typres::coeff_t> >
797 tmp(iter->nrow,iter->ncol);
798 (tmp.rep).reserve(iter->nrow,iter->ncol);
799 for(
int j=0;
j<iter->nrow;
j++)
800 for(
int k=0;
k<iter->ncol;
k++)
803 char _toto [256];
char* toto= & (_toto[0]);
806 toto= mpf_get_str(toto,&expon,10,50,(*iter)(
j,
k).rep());
814 for(l=0;toto[l]!=
'\0';l++)
816 tmp(
j,
k)=(T)(10)*tmp(
j,
k)+(T)(toto[l]-
'0');
821 tmp(
j,
k)*=(T)(sign*
pow(10.0,(
int)(-l+1+expon-((sign+1)/2))));
834 template<
typename typcoeff,
typename typres,
typename Base>
836 ,
const Base &b,typres &res)
840 list<MatDense<lapack<typename typres::coeff_t > > >lres;
842 for(
typename list<harewell<typcoeff> >::const_iterator iter=lmat.begin()
843 ;iter!=lmat.end();iter++)
845 MatDense<lapack<typename typres::coeff_t > > tmp(iter->nrow
847 (tmp.rep).reserve(iter->nrow,iter->ncol);
848 for(
int j=0;
j<iter->nrow;
j++)
849 for(
int k=0;
k<iter->ncol;
k++)
851 tmp(
j,
k)= (*iter)(
j,
k);
859 template<
int p,
typename typrep,
typename typres,
typename Base>
861 ,
const Base &b,typres &res)
866 template<
typename typres,
867 typename typlmat,
typename Base>
871 typedef typename typlmat::value_type::coeff_t::value_type T;
872 list<MatDense<lapack<complex<T > > > >lres;
874 for(
typename typlmat::const_iterator iter=lmat.begin()
875 ;iter!=lmat.end();iter++)
877 MatDense<lapack<complex<T> > > tmp(iter->nrow,iter->ncol);
878 (tmp.rep).reserve(iter->nrow,iter->ncol);
879 for(
int j=0;
j<iter->nrow;
j++)
880 for(
int k=0;
k<iter->ncol;
k++)
882 tmp(
j,
k)=mpq_get_d(&(*iter)(
j,
k).rep());
void realsolve2(const list< harewell< QQ > > &lmat, const Base &b, typres &res)
Definition: resolve2.hpp:758
void trigsim(list< Mat > &lmat)
Definition: resolve2.hpp:201
#define max(a, b)
Definition: alp_f2c.H:167
void solvefromcompltrigsim(const list< Mat > &lmat, const list< int > &size_clust, Complex_Mat &res)
Definition: resolve2.hpp:582
int docluster(Mat &M, Mat &Shurvect, typcond *cond, int i)
Definition: resolve2.hpp:360
int ztrsen_(const char *job, const char *compq, logical *select, tla_int *n, doublecomplex< T > *t, tla_int *ldt, doublecomplex< T > *q, tla_int *ldq, doublecomplex< T > *w, tla_int *m, T *s, T *sep, doublecomplex< T > *work, tla_int *lwork, tla_int *info)
doublereal i
Definition: alp_f2c.H:30
MSKaccmodee MSKint32t MSKint32t MSKint32t MSKrealt value
Definition: mosek.h:2463
void compltrigsim(list< Mat > &lmat, list< int > &size_clust)
Definition: resolve2.hpp:521
MSKint32t MSKint32t MSKint32t MSKrealt * val
Definition: mosek.h:2359
void realsolve3(const typlmat &lmat, const Base &b, typres &res)
Definition: resolve2.hpp:868
long flag
Definition: alp_f2c.H:52
Scl< T > & pow(const Scl< T > &base, unsigned long exp)
Definition: BC.hpp:1075
int sign(const Scl< T > &b)
Definition: BC.hpp:307
MSKconetypee MSKrealt MSKint32t MSKint32t j
Definition: mosek.h:2421
MSKint32t k
Definition: mosek.h:2713
void GetRootMat(lmat &lres, typres &res)
Definition: resolve2.hpp:738
void solvefromtrigsim(const list< Mat > &lmat, Complex_Mat &res)
Definition: resolve2.hpp:633
int getcluster(Mat &M, typcond *cond)
Definition: resolve2.hpp:266
T cond_number(Mat &Combilin, int i)
Definition: resolve2.hpp:249
typedef void(MSKAPI *MSKexitfunc)(MSKuserhandle_t usrptr
doublereal r
Definition: alp_f2c.H:30
Scl< T > & sqrt(const Scl< T > &b)
Definition: BC.hpp:1103
MSKint32t MSKint32t MSKint32t i
Definition: mosek.h:2278
void dgees_(char *JOBVS, char *SORT, bool(*SELECT)(double, double), int *N, double *A, int *LDA, int *SDIM, double *WR, double *WI, double *VS, int *LDVS, double *WORK, int *LWORK, double *BWORK, int *info)
#define abs(x)
Definition: f2c.H:161
MSKrescodee r
Definition: mosek.h:2321
long int select_true(doublecomplex< T > *toto)
Definition: resolve2.hpp:75
MSKstreamtypee MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t a
Definition: mosek.h:3833
Mat wraplapack_dgees(const Mat &M)
Definition: resolve2.hpp:45
void reorder(Mat &Combilin, Mat &Shurvect, Mat &invShurvect, list< int > &size_clust)
Definition: resolve2.hpp:470
long int logical
Definition: resolve.hpp:8
Mat wraplapack_zgees(Mat M)
Definition: resolve2.hpp:88
Mat wraplapack_zgebal(Mat M)
Definition: resolve2.hpp:683
int zgees_(const char *jobvs, const char *sort, logical(*select)(doublecomplex< T > *), tla_int *n, doublecomplex< T > *a, tla_int *lda, tla_int *sdim, doublecomplex< T > *w, doublecomplex< T > *vs, tla_int *ldvs, doublecomplex< T > *work, tla_int *lwork, T *rwork, logical *bwork, tla_int *info)
void wraplapack_ztrsen(Mat &M, logical *select, coeff *res)
Definition: resolve2.hpp:218
long min(long a, long b)
Definition: workspace.hpp:3