1 /*
2  * Copyright (C) 2015 FFLAS-FFPACK
3  *
4  * Written by Brice Boyer (briceboyer) <boyer.brice@gmail.com>
5  *
6  *
7  * ========LICENCE========
8  * This file is part of the library FFLAS-FFPACK.
9  *
10  * FFLAS-FFPACK is free software: you can redistribute it and/or modify
11  * it under the terms of the  GNU Lesser General Public
12  * License as published by the Free Software Foundation; either
13  * version 2.1 of the License, or (at your option) any later version.
14  *
15  * This library is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * Lesser General Public License for more detAils.
19  *
20  * You should have received a copy of the GNU Lesser General Public
21  * License along with this library; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
23  * ========LICENCE========
24  *.
25  */
26 
27 /** @file fflas-c.h
28  * @author  Brice Boyer
29  * @brief C functions calls for FFLAS
30  * @see fflas/fflas.h
31  */
32 
33 #ifndef __FFLASFFPACK_interfaces_libs_fflas_c_H
34 #define __FFLASFFPACK_interfaces_libs_fflas_c_H
35 //#include "fflas-ffpack/fflas-ffpack-config.h"
36 
37 #ifndef FFLAS_COMPILED
38 #define FFLAS_COMPILED
39 #endif
40 
41 #include <stdbool.h>
42 #include <stdlib.h>
43 #include <inttypes.h>
44 
45 
46 #ifdef __cplusplus
47 extern "C" {
48 #endif
49 
50     /// Storage by row or col ?
51     enum FFLAS_C_ORDER{
52         FflasRowMajor=101, /**< row major */
53         FflasColMajor=102  /**< col major */
54     };
55     // public:
56     /// Is matrix transposed ?
57     enum FFLAS_C_TRANSPOSE {
58         FflasNoTrans = 111, /**< Matrix is not transposed */
59         FflasTrans   = 112  /**< Matrix is transposed */
60     };
61     /// Is triangular matrix's shape upper ?
62     enum FFLAS_C_UPLO {
63         FflasUpper = 121, /**< Triangular matrix is Upper triangular (if \f$i>j\f$ then \f$T_{i,j} = 0\f$)*/
64         FflasLower = 122  /**< Triangular matrix is Lower triangular (if \f$i<j\f$ then \f$T_{i,j} = 0\f$)*/
65     };
66 
67     /// Is the triangular matrix implicitly unit diagonal ?
68     enum FFLAS_C_DIAG {
69         FflasNonUnit = 131, /**< Triangular matrix has an explicit arbitrary diagonal */
70         FflasUnit    = 132 /**< Triangular matrix has an implicit unit diagonal (\f$T_{i,i} = 1\f$)*/ /**< */
71     };
72 
73     /// On what side ?
74     enum FFLAS_C_SIDE {
75         FflasLeft  = 141,/**< Operator applied on the left */
76         FflasRight = 142 /**< Operator applied on the rigth*/
77     };
78 
79     /** \p FFLAS_C_BASE  determines the type of the element representation for Matrix Mult kernel. (deprecated, should not be used) */
80     enum FFLAS_C_BASE {
81         FflasDouble  = 151,  /**<  to use the double precision BLAS */
82         FflasFloat   = 152,  /**<  to use the single precison BLAS */
83         FflasGeneric = 153   /**< for any other domain, that can not be converted to floating point integers */
84     };
85 
86     /* ******** *
87      * LEVEL1   *
88      * ******** */
89 
90     /*  Modular<double>          */
91     /*  ModularBalanced<double>  */
92 
93     void
94     freducein_1_modular_double (const double p, const size_t n,
95                                 double * X, const size_t incX
96                                 , bool positive );
97 
98     void
99     freduce_1_modular_double (const double  F, const size_t n,
100                               const double * Y, const size_t incY,
101                               double * X, const size_t incX
102                               , bool positive );
103 
104 
105     void
106     fnegin_1_modular_double (const double  F, const size_t n,
107                              double * X, const size_t incX
108                              , bool positive );
109 
110 
111     void
112     fneg_1_modular_double (const double p, const size_t n,
113                            const double * Y, const size_t incY,
114                            double * X, const size_t incX
115                            , bool positive );
116 
117     void
118     fzero_1_modular_double (const double p, const size_t n,
119                             double * X, const size_t incX
120                             , bool positive );
121 
122 
123     bool
124     fiszero_1_modular_double (const double p, const size_t n,
125                               const double * X, const size_t incX
126                               , bool positive );
127 
128     bool
129     fequal_1_modular_double (const double p, const size_t n,
130                              const double * X, const size_t incX,
131                              const double * Y, const size_t incY
132                              , bool positive );
133 
134 
135     void
136     fassign_1_modular_double (const double p, const size_t n,
137                               const double * Y, const size_t incY ,
138                               double * X, const size_t incX
139                               , bool positive );
140 
141 
142     void
143     fscalin_1_modular_double (const double p, const size_t n, const double alpha,
144                               double * X, const size_t incX
145                               , bool positive );
146 
147 
148     void
149     fscal_1_modular_double (const double p, const size_t n
150                             , const double alpha
151                             , const double * X, const size_t incX
152                             , double * Y, const size_t incY
153                             , bool positive );
154 
155 
156     void
157     faxpy_1_modular_double (const double p, const size_t n,
158                             const double alpha,
159                             const double * X, const size_t incX,
160                             double * Y, const size_t incY
161                             , bool positive );
162 
163 #if 0
164     void
165     faxpby_1_modular_double (const double p, const size_t n,
166                              const double alpha,
167                              const double * X, const size_t incX,
168                              const double betA,
169                              double * Y, const size_t incY
170                              , bool positive );
171 #endif
172 
173 
174 
175     double
176     fdot_1_modular_double (const double p, const size_t n,
177                            const double * X, const size_t incX,
178                            const double * Y, const size_t incY
179                            , bool positive );
180 
181 
182     void
183     fswap_1_modular_double (const double p, const size_t n,
184                             double * X, const size_t incX,
185                             double * Y, const size_t incY
186                             , bool positive );
187 
188 
189     void
190     fadd_1_modular_double (const double p,  const size_t n,
191                            const double * A, const size_t incA,
192                            const double * B, const size_t incB,
193                            double * C, const size_t incC
194                            , bool positive );
195 
196     void
197     fsub_1_modular_double (const double p,  const size_t n,
198                            const double * A, const size_t incA,
199                            const double * B, const size_t incB,
200                            double * C, const size_t incC
201                            , bool positive );
202 
203     void
204     faddin_1_modular_double (const double p,  const size_t n,
205                              const double * B, const size_t incB,
206                              double * C, const size_t incC
207                              , bool positive );
208 
209     void
210     fsubin_1_modular_double (const double p,  const size_t n,
211                              const double * B, const size_t incB,
212                              double * C, const size_t incC
213                              , bool positive );
214 
215     /* ******** *
216      * LEVEL1.5 *
217      * ******** */
218 
219     // fspmv
220 
221     /* ******** *
222      * LEVEL2   *
223      * ******** */
224 
225 
226     /*  Modular<double>          */
227     /*  ModularBalanced<double>  */
228 
229 
230     void
231     fassign_2_modular_double (const double p, const size_t m, const size_t n,
232                               const double * B, const size_t ldB ,
233                               double * A, const size_t ldA
234                               , bool positive  );
235 
236 
237 
238     void
239     fzero_2_modular_double (const double p, const size_t m, const size_t n,
240                             double * A, const size_t ldA
241                             , bool positive  );
242 
243 
244     bool
245     fequal_2_modular_double (const double p, const size_t m, const size_t n,
246                              const double * A, const size_t ldA,
247                              const double * B, const size_t ldB
248                              , bool positive  );
249 
250 
251     bool
252     fiszero_2_modular_double (const double p, const size_t m, const size_t n,
253                               const double * A, const size_t ldA
254                               , bool positive  );
255 
256 
257     void
258     fidentity_2_modular_double (const double p, const size_t m, const size_t n,
259                                 double * A, const size_t ldA,
260                                 const double d
261                                 , bool positive  );
262 
263 
264 
265     void
266     freducein_2_modular_double (const double p, const size_t m , const size_t n,
267                                 double * A, const size_t ldA
268                                 , bool positive  );
269 
270 
271     void
272     freduce_2_modular_double (const double p, const size_t m , const size_t n,
273                               const double * B, const size_t ldB,
274                               double * A, const size_t ldA
275                               , bool positive  );
276 
277     void
278     fnegin_2_modular_double (const double p, const size_t m , const size_t n,
279                              double * A, const size_t ldA
280                              , bool positive  );
281 
282 
283     void
284     fneg_2_modular_double (const double p, const size_t m , const size_t n,
285                            const double * B, const size_t ldB,
286                            double * A, const size_t ldA
287                            , bool positive  );
288 
289 
290     void
291     fscalin_2_modular_double (const double p, const size_t m , const size_t n,
292                               const double alpha,
293                               double * A, const size_t ldA
294                               , bool positive  );
295 
296 
297     void
298     fscal_2_modular_double (const double p, const size_t m , const size_t n,
299                             const double alpha,
300                             const double * A, const size_t ldA,
301                             double * B, const size_t ldB
302                             , bool positive  );
303 
304 
305     void
306     faxpy_2_modular_double (const double p, const size_t m, const size_t n
307                             , const double alpha,
308                             const double * X, const size_t ldX,
309                             double * Y, const size_t ldY
310                             , bool positive  );
311 
312 
313 #if 0
314     void
315     faxpby_2_modular_double (const double p, const size_t m, const size_t n,
316                              const double alpha,
317                              const double * X, const size_t ldX,
318                              const double betA,
319                              double * Y, const size_t ldY
320                              , bool positive  );
321 #endif
322 
323 
324     void
325     fmove_2_modular_double (const double p, const size_t m, const size_t n,
326                             double * A, const size_t ldA,
327                             double * B, const size_t ldB
328                             , bool positive  );
329 
330 
331     void
332     fadd_2_modular_double (const double p, const size_t m, const size_t n,
333                            const double * A, const size_t ldA,
334                            const double * B, const size_t ldB,
335                            double * C, const size_t ldC
336                            , bool positive  );
337 
338 
339 
340     void
341     fsub_2_modular_double (const double p, const size_t m, const size_t n,
342                            const double * A, const size_t ldA,
343                            const double * B, const size_t ldB,
344                            double * C, const size_t ldC
345                            , bool positive  );
346 
347 
348     void
349     fsubin_2_modular_double (const double p, const size_t m, const size_t n,
350                              const double * B, const size_t ldB,
351                              double * C, const size_t ldC
352                              , bool positive  );
353 
354 
355 
356     void
357     faddin_2_modular_double (const double p, const size_t m, const size_t n,
358                              const double * B, const size_t ldB,
359                              double * C, const size_t ldC
360                              , bool positive  );
361 
362 
363 
364     double *
365     fgemv_2_modular_double (const double p, const enum FFLAS_C_TRANSPOSE TransA,
366                             const size_t m, const size_t n,
367                             const double alpha,
368                             const double * A, const size_t ldA,
369                             const double * X, const size_t incX,
370                             const  double betA,
371                             double * Y, const size_t incY
372                             , bool positive  );
373 
374 
375     void
376     fger_2_modular_double (const double p, const size_t m, const size_t n,
377                            const double alpha,
378                            const double * x, const size_t incX,
379                            const double * y, const size_t incY,
380                            double * A, const size_t ldA
381                            , bool positive  );
382 
383 
384     void
385     ftrsv_2_modular_double (const double p, const enum FFLAS_C_UPLO Uplo,
386                             const enum FFLAS_C_TRANSPOSE TransA, const enum FFLAS_C_DIAG Diag,
387                             const size_t n,const double * A, const size_t ldA,
388                             double * X, int incX
389                             , bool positive  );
390 
391     /* ******** *
392      * LEVEL2.5 *
393      * ******** */
394 
395     // fspmm
396 
397     /* ******** *
398      * LEVEL3   *
399      * ******** */
400 
401 
402     void
403     ftrsm_3_modular_double (const double p, const enum FFLAS_C_SIDE Side,
404                             const enum FFLAS_C_UPLO Uplo,
405                             const enum FFLAS_C_TRANSPOSE TransA,
406                             const enum FFLAS_C_DIAG Diag,
407                             const size_t m, const size_t n,
408                             const double alpha,
409                             const double * A,
410                             const size_t ldA,
411                             double * B, const size_t ldB
412                             , bool positive  );
413 
414 
415     void
416     ftrmm_3_modular_double (const double p, const enum FFLAS_C_SIDE Side,
417                             const enum FFLAS_C_UPLO Uplo,
418                             const enum FFLAS_C_TRANSPOSE TransA,
419                             const enum FFLAS_C_DIAG Diag,
420                             const size_t m, const size_t n,
421                             const double alpha,
422                             double * A, const size_t ldA,
423                             double * B, const size_t ldB
424                             , bool positive  );
425 
426 
427     double *
428     fgemm_3_modular_double( const double p,
429                             const enum FFLAS_C_TRANSPOSE tA,
430                             const enum FFLAS_C_TRANSPOSE tB,
431                             const size_t m,
432                             const size_t n,
433                             const size_t k,
434                             const double alpha,
435                             const double * A, const size_t ldA,
436                             const double * B, const size_t ldB,
437                             const double betA,
438                             double * C, const size_t ldC
439                             , bool positive  );
440 
441 
442     double *
443     fsquare_3_modular_double (const double p,
444                               const enum FFLAS_C_TRANSPOSE tA,
445                               const size_t n,
446                               const double alpha,
447                               const double * A,
448                               const size_t ldA,
449                               const double betA,
450                               double * C,
451                               const size_t ldC
452                               , bool positive  );
453 
454 #ifdef __cplusplus
455 }
456 #endif
457 
458 #endif // __FFLASFFPACK_interfaces_libs_fflas_c_H
459 /* -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
460 // vim:sts=4:sw=4:ts=4:et:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
461