Example #1
0
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);
}
Example #2
0
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);
}
Example #3
0
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;
}