blob: dff0a805231a52d8ac7f0e78b897b27321df0028 [file] [log] [blame]
#ifndef CS_H
# define CS_H
# ifdef __cplusplus
extern "C" {
# endif // ifdef __cplusplus
# include "types.h" // CSC matrix type
# include "lin_alg.h" // Vector copy operations
/*****************************************************************************
* Create and free CSC Matrices *
*****************************************************************************/
/**
* Create Compressed-Column-Sparse matrix from existing arrays
(no MALLOC to create inner arrays x, i, p)
* @param m First dimension
* @param n Second dimension
* @param nzmax Maximum number of nonzero elements
* @param x Vector of data
* @param i Vector of row indices
* @param p Vector of column pointers
* @return New matrix pointer
*/
csc* csc_matrix(c_int m,
c_int n,
c_int nzmax,
c_float *x,
c_int *i,
c_int *p);
/**
* Create uninitialized CSC matrix atricture
(uses MALLOC to create inner arrays x, i, p)
* @param m First dimension
* @param n Second dimension
* @param nzmax Maximum number of nonzero elements
* @param values Allocate values (0/1)
* @param triplet Allocate CSC or triplet format matrix (1/0)
* @return Matrix pointer
*/
csc* csc_spalloc(c_int m,
c_int n,
c_int nzmax,
c_int values,
c_int triplet);
/**
* Free sparse matrix
(uses FREE to free inner arrays x, i, p)
* @param A Matrix in CSC format
*/
void csc_spfree(csc *A);
/**
* free workspace and return a sparse matrix result
* @param C CSC matrix
* @param w Workspace vector
* @param x Workspace vector
* @param ok flag
* @return Return result C if OK, otherwise free it
*/
csc* csc_done(csc *C,
void *w,
void *x,
c_int ok);
/*****************************************************************************
* Copy Matrices *
*****************************************************************************/
/**
* Copy sparse CSC matrix A to output.
* output is allocated by this function (uses MALLOC)
*/
csc* copy_csc_mat(const csc *A);
/**
* Copy sparse CSC matrix A to B (B is preallocated, NO MALOC)
*/
void prea_copy_csc_mat(const csc *A,
csc *B);
/*****************************************************************************
* Matrices Conversion *
*****************************************************************************/
/**
* C = compressed-column CSC from matrix T in triplet form
*
* TtoC stores the vector of indices from T to C
* -> C[TtoC[i]] = T[i]
*
* @param T matrix in triplet format
* @param TtoC vector of indices from triplet to CSC format
* @return matrix in CSC format
*/
csc* triplet_to_csc(const csc *T,
c_int *TtoC);
/**
* C = compressed-row CSR from matrix T in triplet form
*
* TtoC stores the vector of indices from T to C
* -> C[TtoC[i]] = T[i]
*
* @param T matrix in triplet format
* @param TtoC vector of indices from triplet to CSR format
* @return matrix in CSR format
*/
csc* triplet_to_csr(const csc *T,
c_int *TtoC);
/**
* Convert sparse to dense
*/
c_float* csc_to_dns(csc *M);
/**
* Convert square CSC matrix into upper triangular one
*
* @param M Matrix to be converted
* @return Upper triangular matrix in CSC format
*/
csc* csc_to_triu(csc *M);
/*****************************************************************************
* Extra operations *
*****************************************************************************/
/**
* p [0..n] = cumulative sum of c [0..n-1], and then copy p [0..n-1] into c
*
* @param p Create cumulative sum into p
* @param c Vector of which we compute cumulative sum
* @param n Number of elements
* @return Exitflag
*/
c_int csc_cumsum(c_int *p,
c_int *c,
c_int n);
/**
* Compute inverse of permutation matrix stored in the vector p.
* The computed inverse is also stored in a vector.
*/
c_int* csc_pinv(c_int const *p,
c_int n);
/**
* C = A(p,p)= PAP' where A and C are symmetric the upper part stored;
* NB: pinv not p!
* @param A Original matrix (upper-triangular)
* @param pinv Inverse of permutation vector
* @param AtoC Mapping from indices of A-x to C->x
* @param values Are values of A allocated?
* @return New matrix (allocated)
*/
csc* csc_symperm(const csc *A,
const c_int *pinv,
c_int *AtoC,
c_int values);
# ifdef __cplusplus
}
# endif // ifdef __cplusplus
#endif // ifndef CS_H