void __cblas_syrk(const enum CBLAS_ORDER order, const enum CBLAS_UPLO uplo, const enum CBLAS_TRANSPOSE trans, int N, int K, DTYPE alpha, DTYPE *A, int lda, DTYPE beta, DTYPE *C, int ldc) { armas_conf_t conf = *armas_conf_default(); armas_x_dense_t Ca, Aa; int flags = 0; switch (order) { case CblasRowMajor: flags |= uplo == CblasUpper ? ARMAS_LOWER : ARMAS_UPPER; if (trans == CblasNoTrans) { flags |= ARMAS_TRANS; armas_x_make(&Aa, K, N, lda, A); } else { armas_x_make(&Aa, N, K, lda, A); } break; case CblasColMajor: default: flags |= uplo == CblasUpper ? ARMAS_UPPER : ARMAS_LOWER; if (trans == CblasTrans) { flags |= ARMAS_TRANS; armas_x_make(&Aa, K, N, lda, A); } else { armas_x_make(&Aa, N, K, lda, A); } break; } armas_x_make(&Ca, N, N, ldc, C); armas_x_update_sym(&Ca, &Aa, alpha, beta, flags, conf); }
void __syrkf(char *uplo, char *trans, int *n, int *k, DTYPE *alpha, DTYPE *A, int *lda, DTYPE *beta, DTYPE *C, int *ldc) { armas_conf_t *conf = armas_conf_default(); armas_x_dense_t c, a; int flags = 0; flags |= toupper(*uplo) == 'L' ? ARMAS_LOWER : ARMAS_UPPER; if (toupper(*trans) == 'T') flags |= ARMAS_TRANS; armas_x_make(&c, *n, *n, *ldc, C); if (flags & ARMAS_TRANS) { armas_x_make(&a, *k, *n, *lda, A); } else { armas_x_make(&a, *n, *k, *lda, A); } armas_x_update_sym(&c, &a, *alpha, *beta, flags, conf); }
static int __blk_cholfactor_lower(armas_x_dense_t *A, int lb, armas_conf_t *conf) { armas_x_dense_t ATL, ABR, A00, A11, A21, A22; int err = 0; EMPTY(A00); __partition_2x2(&ATL, __nil, __nil, &ABR, /**/ A, 0, 0, ARMAS_PTOPLEFT); while (ABR.rows - lb > 0 && ABR.cols - lb > 0) { __repartition_2x2to3x3(&ATL, &A00, __nil, __nil, __nil, &A11, __nil, __nil, &A21, &A22, /**/ A, lb, ARMAS_PBOTTOMRIGHT); // --------------------------------------------------------------------------- // A11 = CHOL(A11) if (__unblk_cholfactor_lower(&A11, conf) != 0) { err = err == 0 ? -1 : err; } // A21 = A21 * tril(A11).-T armas_x_solve_trm(&A21, __ONE, &A11, ARMAS_RIGHT|ARMAS_LOWER|ARMAS_TRANSA, conf); // A22 = A22 - A21*A21.T armas_x_update_sym(__ONE, &A22, -__ONE, &A21, ARMAS_LOWER, conf); // --------------------------------------------------------------------------- __continue_3x3to2x2(&ATL, __nil, __nil, &ABR, /**/ &A00, &A11, &A22, A, ARMAS_PBOTTOMRIGHT); } // last block with unblocked if (ABR.rows > 0) { if (__unblk_cholfactor_lower(&ABR, conf) != 0) { err = err == 0 ? -1 : err; } } return err; }