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