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