/*! \file simple_blas.h
\brief Simple Wrappers around BLAS functions
*/
#ifndef MORHEPUS_SIMPLE_BLAS_H
#define MORHEPUS_SIMPLE_BLAS_H
/*! \defgroup simple_blas simple_blas
\brief Simple Wrappers around BLAS functions
\{
*/
/*! Whether to transpose matrix */
typedef enum {
morpheus_no_trans = 11,
morpheus_trans
} morpheus_transpose_e;
/*! Matrix Layout */
typedef enum {
morpheus_row_major = 21, /*!< C-style layout */
morpheus_col_major /*!< Fortran-style layout */
} morpheus_layout_e;
/*! Scales a vector by a constant. */
void morpheus_dscal(const int n, const double alpha, double *x);
/*! Copies a vector, x, to a vector, y. */
void morpheus_dcopy(const int n, const double *x, double *y);
/*! Fills vector x with values of scalar alpha. */
void morpheus_dcopy_scalar(const int n, const double alpha, double *x);
/*! Performs one of the matrix-vector operations.
y = alpha*A*x + beta*y, or y = alpha*A**T*x + beta*y,
where alpha and beta are scalars, x and y are vectors and A is an
nrows by ncols matrix.
A = nrows x ncols;
x = trans == no ? ncols : nrows;
y = trans == no ? nrows : ncols;
*/
void morpheus_dgemv(const morpheus_layout_e layout,
const morpheus_transpose_e trans, /*!< Specifies whether to transpose matrix A */
const int nrows,
const int ncols,
const double alpha,
const double *A,
const double *x,
const double beta,
double *y);
/*! Constant times a vector plus a vector.
y = alpha*x + y;
*/
void morpheus_daxpy(const int n, /*!< number of elements in vectors x and y */
const double alpha, /*!< scalar alpha */
const double *x, /*!< vector x */
double *y /*!< vector y */);
/*! Returns the euclidean norm of a vector
sqrt( x'*x )
*/
double morpheus_dnrm2(const int n, const double *x);
/*! Forms the dot product of two vectors. */
double morpheus_ddot(const int n, const double *x, const double *y);
/*! Compute the inverse of a given square matrix. */
int morpheus_inverse(int n, /*!< size of the matrix to inverse */
double *x, /*!< matrix to inverse */
int *pivot, /*!< vector of size n */
double *workspace /*!< vector of size of n*n */);
/*!
A = alpha * x * yT + A
*/
void morpheus_dger(const morpheus_layout_e layout,
const int nrows,
const int ncols,
const double alpha,
const double *x,
const double *y,
double *a);
/*!
C = alpha * op(A) * op(B) + beta*C;
op(A) - m x k;
op(B) - k x n;
C - m x n.
*/
void morpheus_dgemm(const morpheus_layout_e layout,
const morpheus_transpose_e trans_a,
const morpheus_transpose_e trans_b,
const int m,
const int n,
const int k,
const double alpha,
const double *a,
const double *b,
const double beta,
double *c);
/*! Creates identity matrix */
void morpheus_identity(const int n, double *a);
/*! \} */
#endif /* MORHEPUS_SIMPLE_BLAS_H */