home *** CD-ROM | disk | FTP | other *** search
-
- /**************************************************************************
- **
- ** Copyright (C) 1993 David E. Steward & Zbigniew Leyk, all rights reserved.
- **
- ** Meschach Library
- **
- ** This Meschach Library is provided "as is" without any express
- ** or implied warranty of any kind with respect to this software.
- ** In particular the authors shall not be liable for any direct,
- ** indirect, special, incidental or consequential damages arising
- ** in any way from use of the software.
- **
- ** Everyone is granted permission to copy, modify and redistribute this
- ** Meschach Library, provided:
- ** 1. All copies contain this copyright notice.
- ** 2. All modified copies shall carry a notice stating who
- ** made the last modification and the date of such modification.
- ** 3. No charge is made for this software or works derived from it.
- ** This clause shall not be construed as constraining other software
- ** distributed on the same medium as this software, nor is a
- ** distribution fee considered a charge.
- **
- ***************************************************************************/
-
-
- /*
- Type definitions for general purpose maths package
- */
-
- #ifndef MATRIXH
-
- /* RCS id: $Id: matrix.h,v 1.18 1994/04/16 00:33:37 des Exp $ */
-
- #define MATRIXH
-
- #include "machine.h"
- #include "err.h"
- #include "meminfo.h"
-
- /* unsigned integer type */
- #ifndef U_INT_DEF
- typedef unsigned int u_int;
- #define U_INT_DEF
- #endif
-
- /* vector definition */
- typedef struct {
- u_int dim, max_dim;
- Real *ve;
- } VEC;
-
- /* matrix definition */
- typedef struct {
- u_int m, n;
- u_int max_m, max_n, max_size;
- Real **me,*base; /* base is base of alloc'd mem */
- } MAT;
-
- /* band matrix definition */
- typedef struct {
- MAT *mat; /* matrix */
- int lb,ub; /* lower and upper bandwidth */
- } BAND;
-
-
- /* permutation definition */
- typedef struct {
- u_int size, max_size, *pe;
- } PERM;
-
- /* integer vector definition */
- typedef struct {
- u_int dim, max_dim;
- int *ive;
- } IVEC;
-
-
- #ifndef MALLOCDECL
- #ifndef ANSI_C
- extern char *malloc(), *calloc(), *realloc();
- #else
- extern void *malloc(size_t),
- *calloc(size_t,size_t),
- *realloc(void *,size_t);
- #endif
- #endif
-
- #ifndef ANSI_C
- extern void m_version();
- #else
- void m_version( void );
- #endif
-
- #ifndef ANSI_C
- /* allocate one object of given type */
- #define NEW(type) ((type *)calloc(1,sizeof(type)))
-
- /* allocate num objects of given type */
- #define NEW_A(num,type) ((type *)calloc((unsigned)(num),sizeof(type)))
-
- /* re-allocate arry to have num objects of the given type */
- #define RENEW(var,num,type) \
- ((var)=(type *)((var) ? \
- realloc((char *)(var),(unsigned)(num)*sizeof(type)) : \
- calloc((unsigned)(num),sizeof(type))))
-
- #define MEMCOPY(from,to,n_items,type) \
- MEM_COPY((char *)(from),(char *)(to),(unsigned)(n_items)*sizeof(type))
-
- #else
- /* allocate one object of given type */
- #define NEW(type) ((type *)calloc((size_t)1,(size_t)sizeof(type)))
-
- /* allocate num objects of given type */
- #define NEW_A(num,type) ((type *)calloc((size_t)(num),(size_t)sizeof(type)))
-
- /* re-allocate arry to have num objects of the given type */
- #define RENEW(var,num,type) \
- ((var)=(type *)((var) ? \
- realloc((char *)(var),(size_t)((num)*sizeof(type))) : \
- calloc((size_t)(num),(size_t)sizeof(type))))
-
- #define MEMCOPY(from,to,n_items,type) \
- MEM_COPY((char *)(from),(char *)(to),(unsigned)(n_items)*sizeof(type))
-
- #endif
-
- /* type independent min and max operations */
- #ifndef max
- #define max(a,b) ((a) > (b) ? (a) : (b))
- #endif
- #ifndef min
- #define min(a,b) ((a) > (b) ? (b) : (a))
- #endif
-
-
- #undef TRUE
- #define TRUE 1
- #undef FALSE
- #define FALSE 0
-
-
- /* for input routines */
- #define MAXLINE 81
-
-
- /* Dynamic memory allocation */
-
- /* Should use M_FREE/V_FREE/PX_FREE in programs instead of m/v/px_free()
- as this is considerably safer -- also provides a simple type check ! */
-
- #ifndef ANSI_C
-
- extern VEC *v_get(), *v_resize();
- extern MAT *m_get(), *m_resize();
- extern PERM *px_get(), *px_resize();
- extern IVEC *iv_get(), *iv_resize();
- extern int m_free(),v_free();
- extern int px_free();
- extern int iv_free();
- extern BAND *bd_get(), *bd_resize();
- extern int bd_free();
-
- #else
-
- /* get/resize vector to given dimension */
- extern VEC *v_get(int), *v_resize(VEC *,int);
- /* get/resize matrix to be m x n */
- extern MAT *m_get(int,int), *m_resize(MAT *,int,int);
- /* get/resize permutation to have the given size */
- extern PERM *px_get(int), *px_resize(PERM *,int);
- /* get/resize an integer vector to given dimension */
- extern IVEC *iv_get(int), *iv_resize(IVEC *,int);
- /* get/resize a band matrix to given dimension */
- extern BAND *bd_get(int,int,int), *bd_resize(BAND *,int,int,int);
-
- /* free (de-allocate) (band) matrices, vectors, permutations and
- integer vectors */
- extern int iv_free(IVEC *);
- extern m_free(MAT *),v_free(VEC *),px_free(PERM *);
- extern int bd_free(BAND *);
-
- #endif
-
-
- /* MACROS */
-
- /* macros that also check types and sets pointers to NULL */
- #define M_FREE(mat) ( m_free(mat), (mat)=(MAT *)NULL )
- #define V_FREE(vec) ( v_free(vec), (vec)=(VEC *)NULL )
- #define PX_FREE(px) ( px_free(px), (px)=(PERM *)NULL )
- #define IV_FREE(iv) ( iv_free(iv), (iv)=(IVEC *)NULL )
-
- #define MAXDIM 2001
-
-
- /* Entry level access to data structures */
- #ifdef DEBUG
-
- /* returns x[i] */
- #define v_entry(x,i) (((i) < 0 || (i) >= (x)->dim) ? \
- error(E_BOUNDS,"v_entry"), 0.0 : (x)->ve[i] )
-
- /* x[i] <- val */
- #define v_set_val(x,i,val) ((x)->ve[i] = ((i) < 0 || (i) >= (x)->dim) ? \
- error(E_BOUNDS,"v_set_val"), 0.0 : (val))
-
- /* x[i] <- x[i] + val */
- #define v_add_val(x,i,val) ((x)->ve[i] += ((i) < 0 || (i) >= (x)->dim) ? \
- error(E_BOUNDS,"v_add_val"), 0.0 : (val))
-
- /* x[i] <- x[i] - val */
- #define v_sub_val(x,i,val) ((x)->ve[i] -= ((i) < 0 || (i) >= (x)->dim) ? \
- error(E_BOUNDS,"v_sub_val"), 0.0 : (val))
-
- /* returns A[i][j] */
- #define m_entry(A,i,j) (((i) < 0 || (i) >= (A)->m || \
- (j) < 0 || (j) >= (A)->n) ? \
- error(E_BOUNDS,"m_entry"), 0.0 : (A)->me[i][j] )
-
- /* A[i][j] <- val */
- #define m_set_val(A,i,j,val) ((A)->me[i][j] = ((i) < 0 || (i) >= (A)->m || \
- (j) < 0 || (j) >= (A)->n) ? \
- error(E_BOUNDS,"m_set_val"), 0.0 : (val) )
-
- /* A[i][j] <- A[i][j] + val */
- #define m_add_val(A,i,j,val) ((A)->me[i][j] += ((i) < 0 || (i) >= (A)->m || \
- (j) < 0 || (j) >= (A)->n) ? \
- error(E_BOUNDS,"m_add_val"), 0.0 : (val) )
-
- /* A[i][j] <- A[i][j] - val */
- #define m_sub_val(A,i,j,val) ((A)->me[i][j] -= ((i) < 0 || (i) >= (A)->m || \
- (j) < 0 || (j) >= (A)->n) ? \
- error(E_BOUNDS,"m_sub_val"), 0.0 : (val) )
- #else
-
- /* returns x[i] */
- #define v_entry(x,i) ((x)->ve[i])
-
- /* x[i] <- val */
- #define v_set_val(x,i,val) ((x)->ve[i] = (val))
-
- /* x[i] <- x[i] + val */
- #define v_add_val(x,i,val) ((x)->ve[i] += (val))
-
- /* x[i] <- x[i] - val */
- #define v_sub_val(x,i,val) ((x)->ve[i] -= (val))
-
- /* returns A[i][j] */
- #define m_entry(A,i,j) ((A)->me[i][j])
-
- /* A[i][j] <- val */
- #define m_set_val(A,i,j,val) ((A)->me[i][j] = (val) )
-
- /* A[i][j] <- A[i][j] + val */
- #define m_add_val(A,i,j,val) ((A)->me[i][j] += (val) )
-
- /* A[i][j] <- A[i][j] - val */
- #define m_sub_val(A,i,j,val) ((A)->me[i][j] -= (val) )
-
- #endif
-
-
- /* I/O routines */
- #ifndef ANSI_C
-
- extern void v_foutput(),m_foutput(),px_foutput();
- extern void iv_foutput();
- extern VEC *v_finput();
- extern MAT *m_finput();
- extern PERM *px_finput();
- extern IVEC *iv_finput();
- extern int fy_or_n(), fin_int(), yn_dflt(), skipjunk();
- extern double fin_double();
-
- #else
-
- /* print x on file fp */
- void v_foutput(FILE *fp,VEC *x),
- /* print A on file fp */
- m_foutput(FILE *fp,MAT *A),
- /* print px on file fp */
- px_foutput(FILE *fp,PERM *px);
- /* print ix on file fp */
- void iv_foutput(FILE *fp,IVEC *ix);
-
- /* Note: if out is NULL, then returned object is newly allocated;
- Also: if out is not NULL, then that size is assumed */
-
- /* read in vector from fp */
- VEC *v_finput(FILE *fp,VEC *out);
- /* read in matrix from fp */
- MAT *m_finput(FILE *fp,MAT *out);
- /* read in permutation from fp */
- PERM *px_finput(FILE *fp,PERM *out);
- /* read in int vector from fp */
- IVEC *iv_finput(FILE *fp,IVEC *out);
-
- /* fy_or_n -- yes-or-no to question in string s
- -- question written to stderr, input from fp
- -- if fp is NOT a tty then return y_n_dflt */
- int fy_or_n(FILE *fp,char *s);
-
- /* yn_dflt -- sets the value of y_n_dflt to val */
- int yn_dflt(int val);
-
- /* fin_int -- return integer read from file/stream fp
- -- prompt s on stderr if fp is a tty
- -- check that x lies between low and high: re-prompt if
- fp is a tty, error exit otherwise
- -- ignore check if low > high */
- int fin_int(FILE *fp,char *s,int low,int high);
-
- /* fin_double -- return double read from file/stream fp
- -- prompt s on stderr if fp is a tty
- -- check that x lies between low and high: re-prompt if
- fp is a tty, error exit otherwise
- -- ignore check if low > high */
- double fin_double(FILE *fp,char *s,double low,double high);
-
- /* it skips white spaces and strings of the form #....\n
- Here .... is a comment string */
- int skipjunk(FILE *fp);
-
- #endif
-
-
- /* MACROS */
-
- /* macros to use stdout and stdin instead of explicit fp */
- #define v_output(vec) v_foutput(stdout,vec)
- #define v_input(vec) v_finput(stdin,vec)
- #define m_output(mat) m_foutput(stdout,mat)
- #define m_input(mat) m_finput(stdin,mat)
- #define px_output(px) px_foutput(stdout,px)
- #define px_input(px) px_finput(stdin,px)
- #define iv_output(iv) iv_foutput(stdout,iv)
- #define iv_input(iv) iv_finput(stdin,iv)
-
- /* general purpose input routine; skips comments # ... \n */
- #define finput(fp,prompt,fmt,var) \
- ( ( isatty(fileno(fp)) ? fprintf(stderr,prompt) : skipjunk(fp) ), \
- fscanf(fp,fmt,var) )
- #define input(prompt,fmt,var) finput(stdin,prompt,fmt,var)
- #define fprompter(fp,prompt) \
- ( isatty(fileno(fp)) ? fprintf(stderr,prompt) : skipjunk(fp) )
- #define prompter(prompt) fprompter(stdin,prompt)
- #define y_or_n(s) fy_or_n(stdin,s)
- #define in_int(s,lo,hi) fin_int(stdin,s,lo,hi)
- #define in_double(s,lo,hi) fin_double(stdin,s,lo,hi)
-
- /* Copying routines */
- #ifndef ANSI_C
- extern MAT *_m_copy(), *m_move(), *vm_move();
- extern VEC *_v_copy(), *v_move(), *mv_move();
- extern PERM *px_copy();
- extern IVEC *iv_copy(), *iv_move();
- extern BAND *bd_copy();
-
- #else
-
- /* copy in to out starting at out[i0][j0] */
- extern MAT *_m_copy(MAT *in,MAT *out,u_int i0,u_int j0),
- * m_move(MAT *in, int, int, int, int, MAT *out, int, int),
- *vm_move(VEC *in, int, MAT *out, int, int, int, int);
- /* copy in to out starting at out[i0] */
- extern VEC *_v_copy(VEC *in,VEC *out,u_int i0),
- * v_move(VEC *in, int, int, VEC *out, int),
- *mv_move(MAT *in, int, int, int, int, VEC *out, int);
- extern PERM *px_copy(PERM *in,PERM *out);
- extern IVEC *iv_copy(IVEC *in,IVEC *out),
- *iv_move(IVEC *in, int, int, IVEC *out, int);
- extern BAND *bd_copy(BAND *in,BAND *out);
-
- #endif
-
-
- /* MACROS */
- #define m_copy(in,out) _m_copy(in,out,0,0)
- #define v_copy(in,out) _v_copy(in,out,0)
-
-
- /* Initialisation routines -- to be zero, ones, random or identity */
- #ifndef ANSI_C
- extern VEC *v_zero(), *v_rand(), *v_ones();
- extern MAT *m_zero(), *m_ident(), *m_rand(), *m_ones();
- extern PERM *px_ident();
- extern IVEC *iv_zero();
- #else
- extern VEC *v_zero(VEC *), *v_rand(VEC *), *v_ones(VEC *);
- extern MAT *m_zero(MAT *), *m_ident(MAT *), *m_rand(MAT *),
- *m_ones(MAT *);
- extern PERM *px_ident(PERM *);
- extern IVEC *iv_zero(IVEC *);
- #endif
-
- /* Basic vector operations */
- #ifndef ANSI_C
- extern VEC *sv_mlt(), *mv_mlt(), *vm_mlt(), *v_add(), *v_sub(),
- *px_vec(), *pxinv_vec(), *v_mltadd(), *v_map(), *_v_map(),
- *v_lincomb(), *v_linlist();
- extern double v_min(), v_max(), v_sum();
- extern VEC *v_star(), *v_slash(), *v_sort();
- extern double _in_prod(), __ip__();
- extern void __mltadd__(), __add__(), __sub__(),
- __smlt__(), __zero__();
- #else
-
- extern VEC *sv_mlt(double,VEC *,VEC *), /* out <- s.x */
- *mv_mlt(MAT *,VEC *,VEC *), /* out <- A.x */
- *vm_mlt(MAT *,VEC *,VEC *), /* oKPsolve(MAT *A,PERM *pivot,PERM *blocks,VEC *b,VEC *x),
- *CHsolve(MAT *A,VEC *b,VEC *x),
- *LDLsolve(MAT *A,VEC *b,VEC *x),
- *LUsolve(MAT *A,PERM *pivot,VEC *b,VEC *x),
- *_Qsolve(MAT *A,VEC *,VEC *,VEC *, VEC *),
- *QRsolve(MAT *A,VEC *,VEC *b,VEC *x),
- *QRTsolve(MAT *A,VEC *,VEC *b,VEC *x),
-
-
- /* Triangular equations solve routines;
- U for upper triangular, L for lower traingular, D for diagonal
- if diag_val == 0.0 use that values in the matrix */
-
- *Usolve(MAT *A,VEC *b,VEC *x,double diag_val),
- *Lsolve(MAT *A,VEC *b,VEC *x,double diag_val),
- *Dsolve(MAT *A,VEC *b,VEC *x),
- *LTsolve(MAT *A,VEC *b,VEC *x,double diag_val),
- *UTsolve(MAT *A,VEC *b,VEC *x,double diag_val),
- *LUTsolve(MAT *A,PERM *,VEC *,VEC *),
- *QRCPsolve(MAT *QR,VEC *diag,PERM *pivot,VEC *b,VEC *x);
-
- extern BAND *bdLUfactor(BAND *A,PERM *pivot),
- *bdLDLfactor(BAND *A);
- extern VEC *bdLUsolve(BAND *A,PERM *pivot,VEC *b,VEC *x),
- *bdLDLsolve(BAND *A,VEC *b,VEC *x);
-
-
-
- extern VEC *hhvec(VEC *,u_int,Real *,VEC *,Real *);
- extern VEC *hhtrvec(VEC *,double,u_int,VEC *,VEC *);
- extern MAT *hhtrrows(MAT *,u_int,u_int,VEC *,double);
- extern MAT *hhtrcols(MAT *,u_int,u_int,VEC *,double);
-
- extern void givens(double,double,Real *,Real *);
- extern VEC *rot_vec(VEC *,u_int,u_int,double,double,VEC *); /* in situ */
- extern MAT *rot_rows(MAT *,u_int,u_int,double,double,MAT *); /* in situ */
- extern MAT *rot_cols(MAT *,u_int,u_int,double,double,MAT *); /* in situ */
-
-
- /* eigenvalue routines */
-
- /* compute eigenvalues of tridiagonal matrix
- with diagonal entries a[i], super & sub diagonal entries
- b[i]; eigenvectors stored in Q (if not NULL) */
- extern VEC *trieig(VEC *a,VEC *b,MAT *Q),
- /* sets out to be vector of eigenvectors; eigenvectors
- stored in Q (if not NULL). A is unchanged */
- *symmeig(MAT *A,MAT *Q,VEC *out);
-
- /* computes real Schur form = Q^T.A.Q */
- extern MAT *schur(MAT *A,MAT *Q);
- /* computes real and imaginary parts of the eigenvalues
- of A after schur() */
- extern void schur_evals(MAT *A,VEC *re_part,VEC *im_part);
- /* computes real and imaginary parts of the eigenvectors
- of A after schur() */
- extern MAT *schur_vecs(MAT *T,MAT *Q,MAT *X_re,MAT *X_im);
-
-
- /* singular value decomposition */
-
- /* computes singular values of bi-diagonal matrix with
- diagonal entries a[i] and superdiagonal entries b[i];
- singular vectors stored in U and V (if not NULL) */
- VEC *bisvd(VEC *a,VEC *b,MAT *U,MAT *V),
- /* sets out to be vector of singular values;
- singular vectors stored in U and V */
- *svd(MAT *A,MAT *U,MAT *V,VEC *out);
-
- /* matrix powers and exponent */
- MAT *_m_pow(MAT *,int,MAT *,MAT *);
- MAT *m_pow(MAT *,int, MAT *);
- MAT *m_exp(MAT *,double,MAT *);
- MAT *_m_exp(MAT *,double,MAT *,int *,int *);
- MAT *m_poly(MAT *,VEC *,MAT *);
-
- /* FFT */
- void fft(VEC *,VEC *);
- void ifft(VEC *,VEC *);
-
- #endif
-
-
- #endif
- FileDataŵmeminfo 4 EÿÿÿÀ·? OÔ
- /**************************************************************************
- **
- ** Copyright (C) 1993 David E. Steward & Zbigniew Leyk, all rights reserved.
- **
- ** Meschach Library
- **
- ** This Meschach Library is provided "as is" without any express
- ** or implied warranty of any kind with respect to this software.
- ** In particular the authors shall not be liable for any direct,
- ** indirect, special, incidental or consequential damages arising
- ** in any way from use of the software.
- **
- ** Everyone is granted permission to copy, modify and redistribute this
- ** Meschach Library, provided:
- ** 1. All copies contain this copyright notice.
- ** 2. All modified copies shall carry a notice stating who
- ** made the last modification and the date of such modification.
- ** 3. No charge is made for this software or works derived from it.
- ** This clause shall not be construed as constraining other software
- ** distributed on the same medium as this software, nor is a
- ** distribution fee considered a charge.
- **
- ***************************************************************************/
-
-
- /* meminfo.h 26/08/93 */
- /* changed 11/12/93 */
-
-
- #ifndef MEM_INFOH
- #define MEM_INFOH
-
-
-
- /* for hash table in mem_stat.c */
- /* Note: the hash size should be a prime, or at very least odd */
- #define MEM_HASHSIZE 509
- #define MEM_HASHSIZE_FILE "meminfo.h"
-
-
- /* default: memory information is off */
- /* set it to 1 if you want it all the time */
- #define MEM_SWITCH_ON_DEF 0
-
-
- /* available standard types */
- #define TYPE_NULL (-1)
- #define TYPE_MAT 0
- #define TYPE_BAND 1
- #define TYPE_PERM 2
- #define TYPE_VEC 3
- #define TYPE_IVEC 4
-
- #ifdef SPARSE
- #define TYPE_ITER 5
- #define TYPE_SPROW 6
- #define TYPE_SPMAT 7
- #endif
-
- #ifdef COMPLEX
- #ifdef SPARSE
- #define TYPE_ZVEC 8
- #define TYPE_ZMAT 9
- #else
- #define TYPE_ZVEC 5
- #define TYPE_ZMAT 6
- #endif
- #endif
-
- /* structure for memory information */
- typedef struct {
- long bytes; /* # of allocated bytes for each type (summary) */
- int numvar; /* # of allocated variables for each type */
- } MEM_ARRAY;
-
-
-
- #ifdef ANSI_C
-
- int mem_info_is_on(void);
- int mem_info_on(int sw);
-
- long mem_info_bytes(int type,int list);
- int mem_info_numvar(int type,int list);
- void mem_info_file(FILE * fp,int list);
-
- void mem_bytes_list(int type,int old_size,int new_size,
- int list);
- void mem_numvar_list(int type, int num, int list);
-
- int mem_stat_reg_list(void **var,int type,int list);
- int mem_stat_mark(int mark);
- int mem_stat_free_list(int mark,int list);
- int mem_stat_show_mark(void);
- void mem_stat_dump(FILE *fp,int list);
- int mem_attach_list(int list,int ntypes,char *type_names[],
- int (*free_funcs[])(), MEM_ARRAY info_sum[]);
- int mem_free_vars(int list);
- int mem_is_list_attached(int list);
- void mem_dump_list(FILE *fp,int list);
- int mem_stat_reg_vars(int list,int type,...);
-
- #else
- int mem_info_is_on();
- int mem_info_on();
-
- long mem_info_bytes();
- int mem_info_numvar();
- void mem_info_file();
-
- void mem_bytes_list();
- void mem_numvar_list();
-
- int mem_stat_reg_list();
- int mem_stat_mark();
- int mem_stat_free_list();
- int mem_stat_show_mark();
- void mem_stat_dump();
- int mem_attach_list();
- int mem_free_vars();
- int mem_is_list_attached();
- void mem_dump_list();
- int mem_stat_reg_vars();
-
- #endif
-
- /* macros */
-
- #define mem_info() mem_info_file(stdout,0)
-
- #define mem_stat_reg(var,type) mem_stat_reg_list((void **)var,type,0)
- #define MEM_STAT_REG(var,type) mem_stat_reg_list((void **)&(var),type,0)
- #define mem_stat_free(mark) mem_stat_free_list(mark,0)
-
- #define mem_bytes(type,old_size,new_size) \
- mem_bytes_list(type,old_size,new_size,0)
-
- #define mem_numvar(type,num) mem_numvar_list(type,num,0)
-
-
- /* internal type */
-
- typedef struct {
- char **type_names; /* array of names of types (strings) */
- int (**free_funcs)(); /* array of functions for releasing types */
-