1 /* Double-precision two-dimensional matrices, and some linear algebra
2  *
3  * SRE, Tue Jul 13 14:41:07 2004 [St. Louis]
4  */
5 #ifndef eslDMATRIX_INCLUDED
6 #define eslDMATRIX_INCLUDED
7 #include "esl_config.h"
8 
9 #include <stdio.h>
10 
11 typedef struct {
12   /*mx, mx[0] are allocated. */
13 /*::cexcerpt::dmatrix_obj::begin::*/
14   double **mx;                  /* mx[i][j] is i'th row, j'th col */
15   int      n;                   /* rows    */
16   int      m;                   /* columns */
17   enum { eslGENERAL, eslUPPER } type;
18 /*::cexcerpt::dmatrix_obj::end::*/
19   int      ncells;		/* number of valid cells (nxm in standard matrix) */
20 } ESL_DMATRIX;
21 
22 typedef struct {
23   int     *pi;
24   int      n;
25 } ESL_PERMUTATION;
26 
27 /* 1. The ESL_DMATRIX object. */
28 extern ESL_DMATRIX *esl_dmatrix_Create(int n, int m);
29 extern ESL_DMATRIX *esl_dmatrix_CreateUpper(int n);
30 extern int          esl_dmatrix_Destroy(ESL_DMATRIX *A);
31 extern int          esl_dmatrix_Copy       (const ESL_DMATRIX *src, ESL_DMATRIX *dest);
32 extern ESL_DMATRIX *esl_dmatrix_Clone      (const ESL_DMATRIX *old);
33 extern int          esl_dmatrix_Compare    (const ESL_DMATRIX *A, const ESL_DMATRIX *B, double tol);
34 extern int          esl_dmatrix_CompareAbs (const ESL_DMATRIX *A, const ESL_DMATRIX *B, double tol);
35 extern int          esl_dmatrix_Set        (ESL_DMATRIX *A, double x);
36 extern int          esl_dmatrix_SetZero    (ESL_DMATRIX *A);
37 extern int          esl_dmatrix_SetIdentity(ESL_DMATRIX *A);
38 
39 /* 2. Debugging/validation for ESL_DMATRIX. */
40 extern int          esl_dmatrix_Dump(FILE *ofp, const ESL_DMATRIX *A,
41 				     const char *rowlabel, const char *collabel);
42 
43 /* 3. Visualization tools. */
44 extern int          esl_dmatrix_PlotHeatMap(FILE *fp, ESL_DMATRIX *D, double min, double max);
45 
46 /* 4. The ESL_PERMUTATION object. */
47 extern ESL_PERMUTATION *esl_permutation_Create(int n);
48 extern int              esl_permutation_Destroy(ESL_PERMUTATION *P);
49 extern int              esl_permutation_Reuse(ESL_PERMUTATION *P);
50 
51 /* 5. Debugging/validation for ESL_PERMUTATION. */
52 extern int              esl_permutation_Dump(FILE *ofp, const ESL_PERMUTATION *P,
53 					     const char *rowlabel, const char *collabel);
54 
55 /* 6. The rest of the dmatrix API. */
56 extern double       esl_dmx_Max    (const ESL_DMATRIX *A);
57 extern double       esl_dmx_Min    (const ESL_DMATRIX *A);
58 extern double       esl_dmx_Sum    (const ESL_DMATRIX *A);
59 extern int          esl_dmx_MinMax(const ESL_DMATRIX *A, double *ret_min, double *ret_max);
60 extern int          esl_dmx_FrobeniusNorm(const ESL_DMATRIX *A, double *ret_fnorm);
61 extern int          esl_dmx_Multiply(const ESL_DMATRIX *A, const ESL_DMATRIX *B, ESL_DMATRIX *C);
62 extern int          esl_dmx_Exp(const ESL_DMATRIX *Q, double t, ESL_DMATRIX *P);
63 extern int          esl_dmx_Transpose(ESL_DMATRIX *A);
64 extern int          esl_dmx_Add(ESL_DMATRIX *A, const ESL_DMATRIX *B);
65 extern int          esl_dmx_Scale(ESL_DMATRIX *A, double k);
66 extern int          esl_dmx_AddScale(ESL_DMATRIX *A, double k, const ESL_DMATRIX *B);
67 extern int          esl_dmx_Permute_PA(const ESL_PERMUTATION *P, const ESL_DMATRIX *A, ESL_DMATRIX *B);
68 extern int          esl_dmx_LUP_decompose(ESL_DMATRIX *A, ESL_PERMUTATION *P);
69 extern int          esl_dmx_LU_separate(const ESL_DMATRIX *LU, ESL_DMATRIX *L, ESL_DMATRIX *U);
70 extern int          esl_dmx_Invert(const ESL_DMATRIX *A, ESL_DMATRIX *Ai);
71 
72 /* 7. Optional: interoperability with GSL */
73 #ifdef HAVE_LIBGSL
74 #include <gsl/gsl_matrix.h>
75 extern int          esl_dmx_MorphGSL(const ESL_DMATRIX *E, gsl_matrix **ret_G);
76 extern int          esl_dmx_UnmorphGSL(const gsl_matrix *G, ESL_DMATRIX **ret_E);
77 #endif
78 
79 /* 8. Optional: interfaces to LAPACK  */
80 #ifdef HAVE_LIBLAPACK
81 extern int esl_dmx_Diagonalize(const ESL_DMATRIX *A, double **ret_Er, double **ret_Ei, ESL_DMATRIX **ret_UL, ESL_DMATRIX **ret_UR);
82 #endif
83 
84 #endif /*eslDMATRIX_INCLUDED*/
85