pknum.h

Go to the documentation of this file.
00001 
00002 /* ///////////////////////////////////////////////////////////////////////// */
00003 /* This file is a part of the BSTools package                                */
00004 /* written by Przemyslaw Kiciak                                              */
00005 /* ///////////////////////////////////////////////////////////////////////// */
00006 /* (C) Copyright by Przemyslaw Kiciak, 2005, 2013                            */
00007 /* this package is distributed under the terms of the                        */
00008 /* Lesser GNU Public License, see the file COPYING.LIB                       */
00009 /* ///////////////////////////////////////////////////////////////////////// */
00010 
00011 /* Header file for the libpknum library of C procedures - numerical methods */
00012 
00013 #ifndef PKNUM_H
00014 #define PKNUM_H
00015 
00016 #ifndef PKVARIA_H
00017 #include "pkvaria.h"
00018 #endif
00019 
00020 #ifdef __cplusplus
00021 extern "C" {
00022 #endif
00023 
00024 /* ///////////////////////////////////////////////////////////////////////// */
00025 
00026 typedef struct bandm_profile {
00027     int firstnz;  /* index of the first row with a nonzero  */
00028                   /* coefficient in the column */
00029     int ind;      /* index of this coefficient in the array */
00030   } bandm_profile;
00031 
00032 typedef struct {  /* structure for representing sparse matrices */
00033     int i, j;
00034   } index2;
00035 
00036 typedef struct {  /* structure for representing sparse submatrices */
00037     int i, j, k;
00038   } index3;
00039 
00040 typedef struct { float x, y; } complexf;
00041 typedef struct { double x, y; } complexd;
00042 
00043 
00044 #define pkn_LowerTrMatIndex(i,j) \
00045   ( (i)*((i)+1)/2+(j) )
00046 #define pkn_SymMatIndex(i,j) \
00047   ( (i) >= (j) ? (i)*((i)+1)/2+(j) : (j)*((j)+1)/2+(i) )
00048 #define pkn_LHessenbergMatIndex(i,j) \
00049   (pkn_LowerTrMatIndex(((i)+1),(j))-1)
00050 #define pkn_UHessenbergMatIndex(i,j) \
00051   (pkn_LowerTrMatIndex(((j)+1),(i))-1)
00052 
00053 #include "pknumf.h"
00054 #include "pknumd.h"
00055 
00056 /* ///////////////////////////////////////////////////////////////////////// */
00057 void pkn_BandmFindQRMSizes ( int ncols, const bandm_profile *aprof,
00058                              int *qsize, int *rsize );
00059 
00060 void pkn_PrintProfile ( int ncols, const bandm_profile *prof );
00061 
00062 /* ///////////////////////////////////////////////////////////////////////// */
00063 int pkn_Block1ArraySize ( int k, int r, int s );
00064 int pkn_Block1FindBlockPos ( int k, int r, int s, int i, int j );
00065 int pkn_Block1FindElemPos ( int k, int r, int s, int i, int j );
00066 
00067 /* ///////////////////////////////////////////////////////////////////////// */
00068 int pkn_Block2ArraySize ( int k, int r, int s, int t );
00069 int pkn_Block2FindBlockPos ( int k, int r, int s, int t, int i, int j );
00070 int pkn_Block2FindElemPos ( int k, int r, int s, int t, int i, int j );
00071 
00072 /* ///////////////////////////////////////////////////////////////////////// */
00073 int pkn_Block3ArraySize ( int k, int r, int s );
00074 int pkn_Block3FindBlockPos ( int k, int r, int s, int i, int j );
00075 int pkn_Block3FindElemPos ( int k, int r, int s, int i, int j ); 
00076 
00077 /* ///////////////////////////////////////////////////////////////////////// */
00078 int pkn_NRBArraySize ( int n, const int *prof );
00079 
00080 /* ///////////////////////////////////////////////////////////////////////// */
00081 int pkn_TMBSize ( int n );
00082 boolean pkn_TMBElem ( byte *bittm, int i, int j );
00083 void pkn_TMBElemSet ( byte *bittm, int i, int j );
00084 void pkn_TMBElemClear ( byte *bittm, int i, int j );
00085 boolean pkn_TMBTestAndSet ( byte *bittm, int i, int j );
00086 boolean pkn_TMBTestAndClear ( byte *bittm, int i, int j );
00087 
00088 /* ///////////////////////////////////////////////////////////////////////// */
00089 /* auxiliary procedures */
00090 void pkn_SPMindex2to3 ( unsigned int nnz, index2 *ai, index3 *sai );
00091 void pkn_SPMindex3to2 ( unsigned int nnz, index3 *sai, index2 *ai );
00092 
00093 boolean pkn_SPMSortByRows ( unsigned int nrows, unsigned int ncols,
00094                             unsigned int nnz, index2 *ai, unsigned int *permut );
00095 boolean pkn_SPMSortByCols ( unsigned int nrows, unsigned int ncols,
00096                             unsigned int nnz, index2 *ai, unsigned int *permut );
00097 boolean pkn_SPMFindRows ( unsigned int nrows, unsigned int ncols, unsigned int nnz,
00098                           index2 *ai, unsigned int *permut, boolean ro,
00099                           int *rows );
00100 boolean pkn_SPMFindCols ( unsigned int nrows, unsigned int ncols, unsigned int nnz,
00101                           index2 *ai, unsigned int *permut, boolean co,
00102                           int *cols );
00103 
00104 /* fast multiplication algorithm - uses considerable additional memory */
00105 boolean pkn_SPMCountMMnnzR ( int nra, int nca, int ncb,
00106                              unsigned int nnza, index2 *ai,
00107                              unsigned int *apermut, int *arows, boolean ra,
00108                              unsigned int nnzb, index2 *bi,
00109                              unsigned int *bpermut, int *brows, boolean rb,
00110                              unsigned int *nnzab, unsigned int *nmultab );
00111 boolean pkn_SPMFindMMnnzR ( int nra, int nca, int ncb,
00112                             int unsigned nnza, index2 *ai,
00113                             unsigned int *apermut, int *arows,
00114                             unsigned int nnzb, index2 *bi,
00115                             unsigned int *bpermut, int *brows,
00116                             index2 *abi, int *abpos, index2 *aikbkj );
00117 boolean pkn_SPMCountMMnnzC ( int nra, int nca, int ncb,
00118                              unsigned int nnza, index2 *ai,
00119                              unsigned int *apermut, int *acols, boolean ca,
00120                              unsigned int nnzb, index2 *bi,
00121                              unsigned int *bpermut, int *bcols, boolean cb,
00122                              unsigned int *nnzab, unsigned int *nmultab );
00123 boolean pkn_SPMFindMMnnzC ( int nra, int nca, int ncb,
00124                             unsigned int nnza, index2 *ai,
00125                             unsigned int *apermut, int *acols,
00126                             unsigned int nnzb, index2 *bi,
00127                             unsigned int *bpermut, int *bcols,
00128                             index2 *abi, int *abpos, index2 *aikbkj );
00129 
00130 boolean pkn_SPMCountMMTnnzR ( int nra, int nca, int nrb,
00131                               unsigned int nnza, index2 *ai,
00132                               unsigned int *apermut, int *arows, boolean ra,
00133                               unsigned int nnzb, index2 *bi,
00134                               unsigned int *bpermut, int *bcols, boolean cb,
00135                               unsigned int *nnzab, unsigned int *nmultab );
00136 boolean pkn_SPMFindMMTnnzR ( int nra, int nca, int nrb,
00137                              unsigned int nnza, index2 *ai,
00138                              unsigned int *apermut, int *arows,
00139                              unsigned int nnzb, index2 *bi,
00140                              unsigned int *bpermut, int *bcols,
00141                              index2 *abi, int *abpos, index2 *aikbkj );
00142 boolean pkn_SPMCountMMTnnzC ( int nra, int nca, int nrb,
00143                               unsigned int nnza, index2 *ai,
00144                               unsigned int *apermut, int *acols, boolean ca,
00145                               unsigned int nnzb, index2 *bi,
00146                               unsigned int *bpermut, int *brows, boolean rb,
00147                               unsigned int *nnzab, unsigned int *nmultab );
00148 boolean pkn_SPMFindMMTnnzC ( int nra, int nca, int nrb,
00149                              unsigned int nnza, index2 *ai,
00150                              unsigned int *apermut, int *acols,
00151                              unsigned int nnzb, index2 *bi,
00152                              unsigned int *bpermut, int *brows,
00153                              index2 *abi, int *abpos, index2 *aikbkj );
00154 
00155 boolean pkn_SPMCountMTMnnzR ( int nra, int nca, int ncb,
00156                               unsigned int nnza, index2 *ai,
00157                               unsigned int *apermut, int *acols, boolean ca,
00158                               unsigned int nnzb, index2 *bi,
00159                               unsigned int *bpermut, int *brows, boolean rb,
00160                               unsigned int *nnzab, unsigned int *nmultab );
00161 boolean pkn_SPMFindMTMnnzR ( int nra, int nca, int ncb,
00162                              unsigned int nnza, index2 *ai,
00163                              unsigned int *apermut, int *acols,
00164                              unsigned int nnzb, index2 *bi,
00165                              unsigned int *bpermut, int *brows,
00166                              index2 *abi, int *abpos, index2 *aikbkj );
00167 boolean pkn_SPMCountMTMnnzC ( int nra, int nca, int ncb,
00168                               unsigned int nnza, index2 *ai,
00169                               unsigned int *apermut, int *arows, boolean ra,
00170                               unsigned int nnzb, index2 *bi,
00171                               unsigned int *bpermut, int *bcols, boolean cb,
00172                               unsigned int *nnzab, unsigned int *nmultab );
00173 boolean pkn_SPMFindMTMnnzC ( int nra, int nca, int ncb,
00174                              unsigned int nnza, index2 *ai,
00175                              unsigned int *apermut, int *arows,
00176                              unsigned int nnzb, index2 *bi,
00177                              unsigned int *bpermut, int *bcols,
00178                              index2 *abi, int *abpos, index2 *aikbkj );
00179 
00180 /* slower, but requiring less memory multiplication algorithm, */
00181 /* the procedures with headers given below only find the distribution */
00182 /* of nonzero product coefficients; their number must be determined */
00183 /* prior to the call, using the appropriate *Count* procedure above */
00184 boolean pkn_SPMmultMMCempty ( int nra, int nca, int ncb,
00185                               unsigned int nnza, index2 *ai,
00186                               unsigned int *apermut, int *acols, boolean ca,
00187                               unsigned int nnzb, index2 *bi,
00188                               unsigned int *bpermut, int *bcols, boolean cb,
00189                               index2 *abi );
00190 boolean pkn_SPMmultMMTCempty ( int nra, int nca, int nrb,
00191                                unsigned int nnza, index2 *ai,
00192                                unsigned int *apermut, int *acols, boolean ca,
00193                                unsigned int nnzb, index2 *bi,
00194                                unsigned int *bpermut, int *brows, boolean rb,
00195                                index2 *abi );
00196 boolean pkn_SPMmultMTMCempty ( int nra, int nca, int ncb,
00197                                unsigned int nnza, index2 *ai,
00198                                unsigned int *apermut, int *arows, boolean ra,
00199                                unsigned int nnzb, index2 *bi,
00200                                unsigned int *bpermut, int *bcols, boolean ba,
00201                                index2 *abi );
00202 
00203 /* procedures for submatrices */
00204 /* auxiliary procedures */
00205 boolean pkn_SPsubMSortByRows ( unsigned int nrows, unsigned int ncols,
00206                                unsigned int nnz, index3 *ai, unsigned int *permut );
00207 boolean pkn_SPsubMSortByCols ( unsigned int nrows, unsigned int ncols,
00208                                unsigned int nnz, index3 *ai, unsigned int *permut );
00209 boolean pkn_SPsubMFindRows ( unsigned int nrows, unsigned int ncols, unsigned int nnz,
00210                              index3 *ai, unsigned int *permut, boolean ro,
00211                              int *rows );
00212 boolean pkn_SPsubMFindCols ( unsigned int nrows, unsigned int ncols, unsigned int nnz,
00213                              index3 *ai, unsigned int *permut, boolean co,
00214                              int *cols );
00215 
00216 /* fast multiplication algorithm - uses considerable additional memory */
00217 boolean pkn_SPsubMCountMMnnzR ( int nra, int nca, int ncb,
00218                                 unsigned int nnza, index3 *ai,
00219                                 unsigned int *apermut, int *arows, boolean ra,
00220                                 unsigned int nnzb, index3 *bi,
00221                                 unsigned int *bpermut, int *brows, boolean rb,
00222                                 unsigned int *nnzab, unsigned int *nmultab );
00223 boolean pkn_SPsubMFindMMnnzR ( int nra, int nca, int ncb,
00224                                unsigned int nnza, index3 *ai,
00225                                unsigned int *apermut, int *arows,
00226                                unsigned int nnzb, index3 *bi,
00227                                unsigned int *bpermut, int *brows,
00228                                index2 *abi, int *abpos, index2 *aikbkj );
00229 boolean pkn_SPsubMCountMMnnzC ( int nra, int nca, int ncb,
00230                                 unsigned int nnza, index3 *ai,
00231                                 unsigned int *apermut, int *acols, boolean ca,
00232                                 unsigned int nnzb, index3 *bi,
00233                                 unsigned int *bpermut, int *bcols, boolean cb,
00234                                 unsigned int *nnzab, unsigned int *nmultab );
00235 boolean pkn_SPsubMFindMMnnzC ( int nra, int nca, int ncb,
00236                                unsigned int nnza, index3 *ai,
00237                                unsigned int *apermut, int *acols,
00238                                unsigned int nnzb, index3 *bi,
00239                                unsigned int *bpermut, int *bcols,
00240                                index2 *abi, int *abpos, index2 *aikbkj );
00241 
00242 boolean pkn_SPsubMCountMMTnnzR ( int nra, int nca, int nrb,
00243                                  unsigned int nnza, index3 *ai,
00244                                  unsigned int *apermut, int *arows, boolean ra,
00245                                  unsigned int nnzb, index3 *bi,
00246                                  unsigned int *bpermut, int *bcols, boolean cb,
00247                                  unsigned int *nnzab, unsigned int *nmultab );
00248 boolean pkn_SPsubMFindMMTnnzR ( int nra, int nca, int nrb,
00249                                 unsigned int nnza, index3 *ai,
00250                                 unsigned int *apermut, int *arows,
00251                                 unsigned int nnzb, index3 *bi,
00252                                 unsigned int *bpermut, int *bcols,
00253                                 index2 *abi, int *abpos, index2 *aikbkj );
00254 boolean pkn_SPsubMCountMMTnnzC ( int nra, int nca, int nrb,
00255                                  unsigned int nnza, index3 *ai,
00256                                  unsigned int *apermut, int *acols, boolean ca,
00257                                  unsigned int nnzb, index3 *bi,
00258                                  unsigned int *bpermut, int *brows, boolean rb,
00259                                  unsigned int *nnzab, unsigned int *nmultab );
00260 boolean pkn_SPsubMFindMMTnnzC ( int nra, int nca, int nrb,
00261                                 unsigned int nnza, index3 *ai,
00262                                 unsigned int *apermut, int *acols,
00263                                 unsigned int nnzb, index3 *bi,
00264                                 unsigned int *bpermut, int *brows,
00265                                 index2 *abi, int *abpos, index2 *aikbkj );
00266 
00267 boolean pkn_SPsubMCountMTMnnzR ( int nra, int nca, int ncb,
00268                                  unsigned int nnza, index3 *ai,
00269                                  unsigned int *apermut, int *acols, boolean ca,
00270                                  unsigned int nnzb, index3 *bi,
00271                                  unsigned int *bpermut, int *brows, boolean rb,
00272                                  unsigned int *nnzab, unsigned int *nmultab );
00273 boolean pkn_SPsubMFindMTMnnzR ( int nra, int nca, int ncb,
00274                                 unsigned int nnza, index3 *ai,
00275                                 unsigned int *apermut, int *acols,
00276                                 unsigned int nnzb, index3 *bi,
00277                                 unsigned int *bpermut, int *brows,
00278                                 index2 *abi, int *abpos, index2 *aikbkj );
00279 boolean pkn_SPsubMCountMTMnnzC ( int nra, int nca, int ncb,
00280                                  unsigned int nnza, index3 *ai,
00281                                  unsigned int *apermut, int *arows, boolean ra,
00282                                  unsigned int nnzb, index3 *bi,
00283                                  unsigned int *bpermut, int *bcols, boolean cb,
00284                                  unsigned int *nnzab, unsigned int *nmultab );
00285 boolean pkn_SPsubMFindMTMnnzC ( int nra, int nca, int ncb,
00286                                 int unsigned nnza, index3 *ai,
00287                                 unsigned int *apermut, int *arows,
00288                                 unsigned int nnzb, index3 *bi,
00289                                 unsigned int *bpermut, int *bcols,
00290                                 index2 *abi, int *abpos, index2 *aikbkj );
00291 
00292 #ifdef __cplusplus
00293 }
00294 #endif
00295 
00296 #endif /* PKNUM_H*/
00297