1/* ffpack_inst_implem.inl 2 * Copyright (C) 2005 Clement Pernet 3 * 2014 FFLAS-FFPACK group 4 * 2015 FFLAS-FFPACK group 5 * Written by Clement Pernet <Clement.Pernet@imag.fr> 6 * Brice Boyer (briceboyer) <boyer.brice@gmail.com> 7 * 8 * 9 * ========LICENCE======== 10 * This file is part of the library FFLAS-FFPACK. 11 * 12 * FFLAS-FFPACK is free software: you can redistribute it and/or modify 13 * it under the terms of the GNU Lesser General Public 14 * License as published by the Free Software Foundation; either 15 * version 2.1 of the License, or (at your option) any later version. 16 * 17 * This library is distributed in the hope that it will be useful, 18 * but WITHOUT ANY WARRANTY; without even the implied warranty of 19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 20 * Lesser General Public License for more details. 21 * 22 * You should have received a copy of the GNU Lesser General Public 23 * License along with this library; if not, write to the Free Software 24 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 25 * ========LICENCE======== 26 *. 27 */ 28 29namespace FFPACK { 30 31 void composePermutationsLLM (size_t * MathP, 32 const size_t * P1, 33 const size_t * P2, 34 const size_t R, const size_t N); 35 36 void composePermutationsLLL (size_t * P1, 37 const size_t * P2, 38 const size_t R, const size_t N); 39 40 void composePermutationsMLM (size_t * MathP1, 41 const size_t * P2, 42 const size_t R, const size_t N); 43 44 void cyclic_shift_mathPerm (size_t * P, const size_t s); 45 template<typename Base_t> 46 void cyclic_shift_row_col(Base_t * A, size_t m, size_t n, size_t lda); 47 template INST_OR_DECL 48 void cyclic_shift_row(const FFLAS_FIELD<FFLAS_ELT>& F, FFLAS_ELT* A, size_t m, size_t n, size_t lda); 49 template INST_OR_DECL 50 void cyclic_shift_col(const FFLAS_FIELD<FFLAS_ELT>& F, FFLAS_ELT* A, size_t m, size_t n, size_t lda); 51 52 53 template INST_OR_DECL 54 void applyP( const FFLAS_FIELD<FFLAS_ELT>& F, 55 const FFLAS::FFLAS_SIDE Side, 56 const FFLAS::FFLAS_TRANSPOSE Trans, 57 const size_t M, const size_t ibeg, const size_t iend, 58 FFLAS_ELT* A, const size_t lda, const size_t * P ); 59 60 template INST_OR_DECL 61 void fgetrs (const FFLAS_FIELD<FFLAS_ELT>& F, 62 const FFLAS::FFLAS_SIDE Side, 63 const size_t M, const size_t N, const size_t R, 64 FFLAS_ELT* A, const size_t lda, 65 const size_t *P, const size_t *Q, 66 FFLAS_ELT* B, const size_t ldb, 67 int * info); 68 69 template INST_OR_DECL 70 FFLAS_ELT* fgetrs (const FFLAS_FIELD<FFLAS_ELT>& F, 71 const FFLAS::FFLAS_SIDE Side, 72 const size_t M, const size_t N, const size_t NRHS, const size_t R, 73 FFLAS_ELT* A, const size_t lda, 74 const size_t *P, const size_t *Q, 75 FFLAS_ELT* X, const size_t ldx, 76 const FFLAS_ELT* B, const size_t ldb, 77 int * info); 78 template INST_OR_DECL 79 size_t fgesv (const FFLAS_FIELD<FFLAS_ELT>& F, 80 const FFLAS::FFLAS_SIDE Side, 81 const size_t M, const size_t N, 82 FFLAS_ELT* A, const size_t lda, 83 FFLAS_ELT* B, const size_t ldb, 84 int * info); 85 86 template INST_OR_DECL 87 size_t fgesv (const FFLAS_FIELD<FFLAS_ELT>& F, 88 const FFLAS::FFLAS_SIDE Side, 89 const size_t M, const size_t N, const size_t NRHS, 90 FFLAS_ELT* A, const size_t lda, 91 FFLAS_ELT* X, const size_t ldx, 92 const FFLAS_ELT* B, const size_t ldb, 93 int * info); 94 95 template INST_OR_DECL 96 void ftrtri (const FFLAS_FIELD<FFLAS_ELT>& F, const FFLAS::FFLAS_UPLO Uplo, const FFLAS::FFLAS_DIAG Diag, 97 const size_t N, FFLAS_ELT* A, const size_t lda, const size_t threshold); 98 99 100 template INST_OR_DECL 101 void trinv_left( const FFLAS_FIELD<FFLAS_ELT>& F, const size_t N, const FFLAS_ELT* L, const size_t ldl, 102 FFLAS_ELT* X, const size_t ldx ); 103 104 template INST_OR_DECL 105 void ftrtrm (const FFLAS_FIELD<FFLAS_ELT>& F, const FFLAS::FFLAS_SIDE side, const FFLAS::FFLAS_DIAG diag, const size_t N, 106 FFLAS_ELT* A, const size_t lda); 107 108 template INST_OR_DECL 109 size_t PLUQ (const FFLAS_FIELD<FFLAS_ELT>& F, const FFLAS::FFLAS_DIAG Diag, 110 const size_t M, const size_t N, 111 FFLAS_ELT* A, const size_t lda, 112 size_t*P, size_t *Q); 113 114 template INST_OR_DECL 115 size_t LUdivine (const FFLAS_FIELD<FFLAS_ELT>& F, const FFLAS::FFLAS_DIAG Diag, const FFLAS::FFLAS_TRANSPOSE trans, 116 const size_t M, const size_t N, 117 FFLAS_ELT* A, const size_t lda, 118 size_t* P, size_t* Qt, 119 const FFPACK_LU_TAG LuTag, 120 const size_t cutoff); 121 122 template INST_OR_DECL 123 size_t LUdivine_small (const FFLAS_FIELD<FFLAS_ELT>& F, const FFLAS::FFLAS_DIAG Diag, const FFLAS::FFLAS_TRANSPOSE trans, 124 const size_t M, const size_t N, 125 FFLAS_ELT* A, const size_t lda, 126 size_t* P, size_t* Q, 127 const FFPACK_LU_TAG LuTag); 128 129 template INST_OR_DECL 130 size_t LUdivine_gauss (const FFLAS_FIELD<FFLAS_ELT>& F, const FFLAS::FFLAS_DIAG Diag, 131 const size_t M, const size_t N, 132 FFLAS_ELT* A, const size_t lda, 133 size_t* P, size_t* Q, 134 const FFPACK_LU_TAG LuTag); 135 136 template INST_OR_DECL 137 size_t RowEchelonForm (const FFLAS_FIELD<FFLAS_ELT>& F, const size_t M, const size_t N, 138 FFLAS_ELT* A, const size_t lda, 139 size_t* P, size_t* Qt, const bool transform, 140 const FFPACK_LU_TAG LuTag); 141 142 template INST_OR_DECL 143 size_t ReducedRowEchelonForm (const FFLAS_FIELD<FFLAS_ELT>& F, const size_t M, const size_t N, 144 FFLAS_ELT* A, const size_t lda, 145 size_t* P, size_t* Qt, const bool transform, 146 const FFPACK_LU_TAG LuTag); 147 148 template INST_OR_DECL 149 size_t ColumnEchelonForm (const FFLAS_FIELD<FFLAS_ELT>& F, const size_t M, const size_t N, 150 FFLAS_ELT* A, const size_t lda, 151 size_t* P, size_t* Qt, const bool transform, 152 const FFPACK_LU_TAG LuTag); 153 template INST_OR_DECL 154 size_t ReducedColumnEchelonForm (const FFLAS_FIELD<FFLAS_ELT>& F, const size_t M, const size_t N, 155 FFLAS_ELT* A, const size_t lda, 156 size_t* P, size_t* Qt, const bool transform, 157 const FFPACK_LU_TAG LuTag); 158 159 template INST_OR_DECL 160 FFLAS_ELT* Invert (const FFLAS_FIELD<FFLAS_ELT>& F, const size_t M, 161 FFLAS_ELT* A, const size_t lda, 162 int& nullity); 163 164 template INST_OR_DECL 165 FFLAS_ELT* Invert (const FFLAS_FIELD<FFLAS_ELT>& F, const size_t M, 166 const FFLAS_ELT* A, const size_t lda, 167 FFLAS_ELT* X, const size_t ldx, 168 int& nullity); 169 170 template INST_OR_DECL 171 FFLAS_ELT* Invert2( const FFLAS_FIELD<FFLAS_ELT>& F, const size_t M, 172 FFLAS_ELT* A, const size_t lda, 173 FFLAS_ELT* X, const size_t ldx, 174 int& nullity); 175 176 template INST_OR_DECL 177 std::list<Givaro::Poly1Dom<FFLAS_FIELD<FFLAS_ELT> >::Element>& 178 CharPoly (const Givaro::Poly1Dom<FFLAS_FIELD<FFLAS_ELT> >& R, 179 std::list<Givaro::Poly1Dom<FFLAS_FIELD<FFLAS_ELT> >::Element> & charp, 180 const size_t N, FFLAS_ELT* A, const size_t lda, 181 FFLAS_FIELD<FFLAS_ELT>::RandIter& G, 182 const FFPACK_CHARPOLY_TAG CharpTag, const size_t degree); 183 184 // template INST_OR_DECL 185 // std::list<Givaro::Poly1Dom<FFLAS_FIELD<FFLAS_ELT> >::Element> & 186 // CharPoly<FFLAS_FIELD,Givaro::Poly1Dom<FFLAS_FIELD<FFLAS_ELT> > > 187 // (const FFLAS_FIELD<FFLAS_ELT>& F, 188 // std::list<Givaro::Poly1Dom<FFLAS_FIELD<FFLAS_ELT> >::Element> & charp, 189 // const size_t N, FFLAS_ELT* A, const size_t lda, 190 // const FFPACK_CHARPOLY_TAG CharpTag); 191 192 template INST_OR_DECL 193 Givaro::Poly1Dom<FFLAS_FIELD<FFLAS_ELT> >::Element& 194 CharPoly(const Givaro::Poly1Dom<FFLAS_FIELD<FFLAS_ELT> >& R, 195 Givaro::Poly1Dom<FFLAS_FIELD<FFLAS_ELT> >::Element& charp, 196 const size_t N, FFLAS_ELT* A, const size_t lda, 197 FFLAS_FIELD<FFLAS_ELT>::RandIter& G, const FFPACK_CHARPOLY_TAG CharpTag, const size_t degree); 198 199 template INST_OR_DECL 200 Givaro::Poly1Dom<FFLAS_FIELD<FFLAS_ELT> >::Element& 201 CharPoly(const Givaro::Poly1Dom<FFLAS_FIELD<FFLAS_ELT> >& R, 202 Givaro::Poly1Dom<FFLAS_FIELD<FFLAS_ELT> >::Element& charp, 203 const size_t N, FFLAS_ELT* A, const size_t lda, 204 const FFPACK_CHARPOLY_TAG CharpTag, const size_t degree); 205 206 template INST_OR_DECL 207 std::vector<FFLAS_ELT>& MinPoly( const FFLAS_FIELD<FFLAS_ELT>& F, std::vector<FFLAS_ELT>& minP, const size_t N, 208 const FFLAS_ELT* A, const size_t lda, 209 FFLAS_FIELD<FFLAS_ELT>::RandIter& G); 210 template INST_OR_DECL 211 std::vector<FFLAS_ELT>& MinPoly( const FFLAS_FIELD<FFLAS_ELT>& F, std::vector<FFLAS_ELT>& minP, const size_t N, 212 const FFLAS_ELT* A, const size_t lda); 213 214 template INST_OR_DECL 215 std::vector<FFLAS_ELT>& MatVecMinPoly (const FFLAS_FIELD<FFLAS_ELT>& F, std::vector<FFLAS_ELT>& minP, 216 const size_t N, const FFLAS_ELT* A, const size_t lda, 217 const FFLAS_ELT* V, const size_t incv); 218 219 template INST_OR_DECL 220 size_t KrylovElim( const FFLAS_FIELD<FFLAS_ELT>& F, const size_t M, const size_t N, 221 FFLAS_ELT* A, const size_t lda, size_t*P, 222 size_t *Q, const size_t deg, size_t *iterates, size_t * inviterates, const size_t maxit,size_t virt); 223 224 template INST_OR_DECL 225 size_t SpecRankProfile (const FFLAS_FIELD<FFLAS_ELT>& F, const size_t M, const size_t N, 226 FFLAS_ELT* A, const size_t lda, const size_t deg, size_t *rankProfile); 227 228 template INST_OR_DECL 229 size_t Rank (const FFLAS_FIELD<FFLAS_ELT>& F, const size_t M, const size_t N, 230 FFLAS_ELT* A, const size_t lda); 231 232 template INST_OR_DECL 233 bool IsSingular (const FFLAS_FIELD<FFLAS_ELT>& F, const size_t M, const size_t N, 234 FFLAS_ELT* A, const size_t lda); 235 template INST_OR_DECL 236 FFLAS_ELT& Det (const FFLAS_FIELD<FFLAS_ELT>& F, FFLAS_ELT& det, const size_t N, 237 FFLAS_ELT* A, const size_t lda, size_t *P, size_t *Q); 238 template INST_OR_DECL 239 FFLAS_ELT& Det (const FFLAS_FIELD<FFLAS_ELT>& F, FFLAS_ELT& det, const size_t N, 240 FFLAS_ELT* A, const size_t lda, 241 const FFLAS::ParSeqHelper::Parallel<FFLAS::CuttingStrategy::Recursive, FFLAS::StrategyParameter::Threads>& parH, size_t *P, size_t *Q); 242 243 template INST_OR_DECL 244 FFLAS_ELT* Solve( const FFLAS_FIELD<FFLAS_ELT>& F, const size_t M, 245 FFLAS_ELT* A, const size_t lda, 246 FFLAS_ELT* x, const int incx, 247 const FFLAS_ELT* b, const int incb ); 248 template INST_OR_DECL 249 void solveLB( const FFLAS_FIELD<FFLAS_ELT>& F, const FFLAS::FFLAS_SIDE Side, 250 const size_t M, const size_t N, const size_t R, 251 FFLAS_ELT* L, const size_t ldl, 252 const size_t * Q, 253 FFLAS_ELT* B, const size_t ldb ); 254 255 template INST_OR_DECL 256 void solveLB2( const FFLAS_FIELD<FFLAS_ELT>& F, const FFLAS::FFLAS_SIDE Side, 257 const size_t M, const size_t N, const size_t R, 258 FFLAS_ELT* L, const size_t ldl, 259 const size_t * Q, 260 FFLAS_ELT* B, const size_t ldb ); 261 262 template INST_OR_DECL 263 void RandomNullSpaceVector (const FFLAS_FIELD<FFLAS_ELT>& F, const FFLAS::FFLAS_SIDE Side, 264 const size_t M, const size_t N, 265 FFLAS_ELT* A, const size_t lda, 266 FFLAS_ELT* X, const size_t incX); 267 template INST_OR_DECL 268 size_t NullSpaceBasis (const FFLAS_FIELD<FFLAS_ELT>& F, const FFLAS::FFLAS_SIDE Side, 269 const size_t M, const size_t N, 270 FFLAS_ELT* A, const size_t lda, 271 FFLAS_ELT*& NS, size_t& ldn, 272 size_t& NSdim); 273 template INST_OR_DECL 274 size_t RowRankProfile (const FFLAS_FIELD<FFLAS_ELT>& F, const size_t M, const size_t N, 275 FFLAS_ELT* A, const size_t lda, 276 size_t* &rkprofile, 277 const FFPACK_LU_TAG LuTag); 278 279 template INST_OR_DECL 280 size_t ColumnRankProfile (const FFLAS_FIELD<FFLAS_ELT>& F, const size_t M, const size_t N, 281 FFLAS_ELT* A, const size_t lda, 282 size_t* &rkprofile, 283 const FFPACK_LU_TAG LuTag); 284 285 void RankProfileFromLU (const size_t* P, const size_t N, const size_t R, 286 size_t* rkprofile, const FFPACK_LU_TAG LuTag); 287 288 size_t LeadingSubmatrixRankProfiles (const size_t M, const size_t N, const size_t R, 289 const size_t LSm, const size_t LSn, 290 const size_t* P, const size_t* Q, 291 size_t* RRP, size_t* CRP); 292 template INST_OR_DECL 293 size_t RowRankProfileSubmatrixIndices (const FFLAS_FIELD<FFLAS_ELT>& F, 294 const size_t M, const size_t N, 295 FFLAS_ELT* A, const size_t lda, 296 size_t*& rowindices, size_t*& colindices, 297 size_t& R); 298 299 template INST_OR_DECL 300 size_t ColRankProfileSubmatrixIndices (const FFLAS_FIELD<FFLAS_ELT>& F, 301 const size_t M, const size_t N, 302 FFLAS_ELT* A, const size_t lda, 303 size_t*& rowindices, size_t*& colindices, 304 size_t& R); 305 template INST_OR_DECL 306 size_t RowRankProfileSubmatrix (const FFLAS_FIELD<FFLAS_ELT>& F, 307 const size_t M, const size_t N, 308 FFLAS_ELT* A, const size_t lda, 309 FFLAS_ELT*& X, size_t& R); 310 template INST_OR_DECL 311 size_t ColRankProfileSubmatrix (const FFLAS_FIELD<FFLAS_ELT>& F, const size_t M, const size_t N, 312 FFLAS_ELT* A, const size_t lda, 313 FFLAS_ELT*& X, size_t& R); 314 315 template INST_OR_DECL 316 void getTriangular <FFLAS_FIELD<FFLAS_ELT> > (const FFLAS_FIELD<FFLAS_ELT> & F, const FFLAS::FFLAS_UPLO Uplo, 317 const FFLAS::FFLAS_DIAG diag, 318 const size_t M, const size_t N, const size_t R, 319 const FFLAS_ELT* A, const size_t lda, 320 FFLAS_ELT* T, const size_t ldt, 321 const bool OnlyNonZeroVectors); 322 323 template INST_OR_DECL 324 void getTriangular <FFLAS_FIELD<FFLAS_ELT> >(const FFLAS_FIELD<FFLAS_ELT>& F, const FFLAS::FFLAS_UPLO Uplo, 325 const FFLAS::FFLAS_DIAG diag, 326 const size_t M, const size_t N, const size_t R, 327 FFLAS_ELT* A, const size_t lda); 328 329 template INST_OR_DECL 330 void getEchelonForm <FFLAS_FIELD<FFLAS_ELT> > (const FFLAS_FIELD<FFLAS_ELT>& F, const FFLAS::FFLAS_UPLO Uplo, 331 const FFLAS::FFLAS_DIAG diag, 332 const size_t M, const size_t N, const size_t R, const size_t* P, 333 const FFLAS_ELT* A, const size_t lda, 334 FFLAS_ELT* T, const size_t ldt, 335 const bool OnlyNonZeroVectors, 336 const FFPACK_LU_TAG LuTag); 337 template INST_OR_DECL 338 void getEchelonForm <FFLAS_FIELD<FFLAS_ELT> > (const FFLAS_FIELD<FFLAS_ELT>& F, const FFLAS::FFLAS_UPLO Uplo, 339 const FFLAS::FFLAS_DIAG diag, 340 const size_t M, const size_t N, const size_t R, const size_t* P, 341 FFLAS_ELT* A, const size_t lda, 342 const FFPACK_LU_TAG LuTag); 343 344 template INST_OR_DECL 345 void getEchelonTransform <FFLAS_FIELD<FFLAS_ELT> > (const FFLAS_FIELD<FFLAS_ELT>& F, const FFLAS::FFLAS_UPLO Uplo, 346 const FFLAS::FFLAS_DIAG diag, 347 const size_t M, const size_t N, const size_t R, const size_t* P, const size_t* Q, 348 const FFLAS_ELT* A, const size_t lda, 349 FFLAS_ELT* T, const size_t ldt, 350 const FFPACK_LU_TAG LuTag); 351 template INST_OR_DECL 352 void getReducedEchelonForm<FFLAS_FIELD<FFLAS_ELT> > (const FFLAS_FIELD<FFLAS_ELT> & F, const FFLAS::FFLAS_UPLO Uplo, 353 const size_t M, const size_t N, const size_t R, const size_t* P, 354 const FFLAS_ELT* A, const size_t lda, 355 FFLAS_ELT* T, const size_t ldt, 356 const bool OnlyNonZeroVectors, 357 const FFPACK_LU_TAG LuTag); 358 359 template INST_OR_DECL 360 void getReducedEchelonForm<FFLAS_FIELD<FFLAS_ELT> > (const FFLAS_FIELD<FFLAS_ELT>& F, const FFLAS::FFLAS_UPLO Uplo, 361 const size_t M, const size_t N, const size_t R, const size_t* P, 362 FFLAS_ELT* A, const size_t lda, 363 const FFPACK_LU_TAG LuTag); 364 template INST_OR_DECL 365 void getReducedEchelonTransform<FFLAS_FIELD<FFLAS_ELT> > (const FFLAS_FIELD<FFLAS_ELT>& F, const FFLAS::FFLAS_UPLO Uplo, 366 const size_t M, const size_t N, const size_t R, const size_t* P, const size_t* Q, 367 const FFLAS_ELT* A, const size_t lda, 368 FFLAS_ELT* T, const size_t ldt, 369 const FFPACK_LU_TAG LuTag); 370 void PLUQtoEchelonPermutation (const size_t N, const size_t R, const size_t * P, size_t * outPerm); 371 372 template INST_OR_DECL 373 FFLAS_ELT* LQUPtoInverseOfFullRankMinor( const FFLAS_FIELD<FFLAS_ELT>& F, const size_t rank, 374 FFLAS_ELT* A_factors, const size_t lda, 375 const size_t* QtPointer, 376 FFLAS_ELT* X, const size_t ldx); 377} // FFPACK 378/* -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 379// vim:sts=4:sw=4:ts=4:et:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s 380