30 throw std::range_error(
"info="+std::to_string(info)+
"\n"+std::string(__FILE__)+
" line "+std::to_string(__LINE__));
34 throw std::range_error(
"info="+std::to_string(info)+
"\n"+std::string(__FILE__)+
" line "+std::to_string(__LINE__));
74 const size_t N0 = ms.size();
76 const size_t N1 = ms[0].size();
78 for(
size_t Im0=0; Im0<N0; ++Im0)
79 assert(ms[Im0].size()==N1);
81 for(
size_t Im0=0; Im0<N0; ++Im0)
82 for(
size_t Im1=0; Im1<N1; ++Im1)
83 assert(ms[Im0][Im1].shape.size()==2);
85 std::vector<size_t> n0(N0);
86 for(
size_t Im0=0; Im0<N0; ++Im0)
87 n0[Im0] = ms[Im0][0].shape[0];
88 std::vector<size_t> n1(N1);
89 for(
size_t Im1=0; Im1<N1; ++Im1)
90 n1[Im1] = ms[0][Im1].shape[1];
92 for(
size_t Im0=0; Im0<N0; ++Im0)
93 for(
size_t Im1=0; Im1<N1; ++Im1)
94 assert((ms[Im0][Im1].shape[0]==n0[Im0]) && (ms[Im0][Im1].shape[1]==n1[Im1]));
96 const size_t n_all = std::accumulate(n0.begin(), n0.end(), 0);
97 assert(n_all == std::accumulate(n1.begin(), n1.end(), 0));
98 this->A = RI::Tensor<Tdata>({n_all, n_all});
100 std::vector<size_t> n0_partial(N0+1);
101 std::partial_sum(n0.begin(), n0.end(), n0_partial.begin()+1);
102 std::vector<size_t> n1_partial(N1+1);
103 std::partial_sum(n1.begin(), n1.end(), n1_partial.begin()+1);
105 for(
size_t Im0=0; Im0<N0; ++Im0)
106 for(
size_t Im1=0; Im1<N1; ++Im1)
108 const RI::Tensor<Tdata> &m_tmp = ms.at(Im0).at(Im1);
109 for(
size_t im0=0; im0<m_tmp.shape[0]; ++im0)
110 for(
size_t im1=0; im1<m_tmp.shape[1]; ++im1)
111 this->A(im0+n0_partial[Im0], im1+n1_partial[Im1]) = m_tmp(im0,im1);
127 assert( std::accumulate(n0.begin(), n0.end(), 0) == this->A.shape[0] );
128 assert( std::accumulate(n1.begin(), n1.end(), 0) == this->A.shape[1] );
130 const size_t N0 = n0.size();
131 const size_t N1 = n1.size();
133 std::vector<size_t> n0_partial(N0+1);
134 std::partial_sum(n0.begin(), n0.end(), n0_partial.begin()+1);
135 std::vector<size_t> n1_partial(N1+1);
136 std::partial_sum(n1.begin(), n1.end(), n1_partial.begin()+1);
138 std::vector<std::vector<RI::Tensor<Tdata>>> ms(N0, std::vector<RI::Tensor<Tdata>>(N1));
139 for(
size_t Im0=0; Im0<N0; ++Im0)
140 for(
size_t Im1=0; Im1<N1; ++Im1)
142 RI::Tensor<Tdata> &m_tmp = ms[Im0][Im1] = RI::Tensor<Tdata>({n0[Im0], n1[Im1]});
143 for(
size_t im0=0; im0<n0[Im0]; ++im0)
144 for(
size_t im1=0; im1<n1[Im1]; ++im1)
145 m_tmp(im0,im1) = this->A(im0+n0_partial[Im0], im1+n1_partial[Im1]);
static void potrf(const char &uplo, const int &n, float *const A, const int &lda, int &info)
Definition lapack_connector.h:374
static void potri(const char &uplo, const int &n, float *const A, const int &lda, int &info)
Definition lapack_connector.h:401