1 #include "cholmod.h" 2 #include <stdlib.h> 3 #include <stdio.h> 4 #include <limits.h> 5 #include <math.h> 6 #include <signal.h> 7 8 #define Size_max ((size_t) (-1)) 9 10 /* -------------------------------------------------------------------------- */ 11 /* double, SuiteSparse_long */ 12 /* -------------------------------------------------------------------------- */ 13 14 #ifdef DLONG 15 #define Real double 16 #define Int SuiteSparse_long 17 #define Int_max SuiteSparse_long_max 18 #define CHOLMOD(name) cholmod_l_ ## name 19 #define LONG 20 #define DOUBLE 21 #define ITYPE CHOLMOD_LONG 22 #define DTYPE CHOLMOD_DOUBLE 23 24 /* -------------------------------------------------------------------------- */ 25 /* double, int: this is the default */ 26 /* -------------------------------------------------------------------------- */ 27 28 #else 29 30 #ifndef DINT 31 #define DINT 32 #endif 33 #define INT 34 #define DOUBLE 35 36 #define Real double 37 #define Int int 38 #define Int_max INT_MAX 39 #define CHOLMOD(name) cholmod_ ## name 40 #define ITYPE CHOLMOD_INT 41 #define DTYPE CHOLMOD_DOUBLE 42 43 #endif 44 45 /* -------------------------------------------------------------------------- */ 46 47 #define BLAS_OK cm->blas_ok 48 #include "cholmod_blas.h" 49 50 #define EMPTY (-1) 51 #define TRUE 1 52 #define FALSE 0 53 #define MAX(a,b) (((a) > (b)) ? (a) : (b)) 54 #define MIN(a,b) (((a) < (b)) ? (a) : (b)) 55 56 #define IMPLIES(p,q) (!(p) || (q)) 57 58 #if defined(WIN32) || defined(_WIN32) 59 #define ISNAN(x) (((x) != (x)) || (((x) < (x)))) 60 #else 61 #define ISNAN(x) ((x) != (x)) 62 #endif 63 64 #define MY_RAND_MAX 32767 65 66 #define MAXERR(maxerr,err,anorm) \ 67 { \ 68 if (ISNAN (maxerr)) \ 69 { \ 70 /* do nothing */ ; \ 71 } \ 72 else if (ISNAN (err)) \ 73 { \ 74 maxerr = err ; \ 75 } \ 76 else if (anorm > 0) \ 77 { \ 78 if ((err/anorm) > maxerr) maxerr = (err/anorm) ; \ 79 } \ 80 else \ 81 { \ 82 if (err > maxerr) maxerr = err ; \ 83 } \ 84 /* printf ("MAXERR: %7.2e %7.2e %7.2e in %d : %s\n", \ 85 maxerr, err, (double) anorm, __LINE__, __FILE__ ) ; */ \ 86 } 87 88 #define OKP(p) Assert ((p) != NULL, __FILE__, __LINE__) 89 #define OK(truth) Assert (truth, __FILE__, __LINE__) 90 #define NOT(truth) Assert (!(truth), __FILE__, __LINE__) 91 #define NOP(p) Assert ((p) == NULL, __FILE__, __LINE__) 92 93 #define NSMALL 200 94 #define NLARGE 1000 95 96 #define ERROR(status,message) \ 97 CHOLMOD(error) (status, __FILE__, __LINE__, message, cm) 98 99 /* -------------------------------------------------------------------------- */ 100 /* global variables */ 101 /* -------------------------------------------------------------------------- */ 102 103 #ifndef EXTERN 104 #define EXTERN extern 105 #endif 106 107 EXTERN double zero [2], one [2], minusone [2] ; 108 EXTERN cholmod_common Common, *cm ; 109 EXTERN cholmod_dense *M1 ; 110 EXTERN Int my_tries ; 111 EXTERN double Zero [2] ; 112 113 /* -------------------------------------------------------------------------- */ 114 /* prototypes */ 115 /* -------------------------------------------------------------------------- */ 116 117 void null_test (cholmod_common *) ; 118 void null_test2 (void) ; 119 void Assert (int truth, char *file, int line) ; 120 Int nrand (Int n) ; 121 Int *prand (Int n) ; 122 cholmod_triplet *read_triplet (FILE *f) ; 123 double test_ops (cholmod_sparse *A) ; 124 cholmod_dense *xtrue (Int nrow, Int ncol, Int d, Int xtype) ; 125 double resid (cholmod_sparse *A, cholmod_dense *X, cholmod_dense *B) ; 126 double solve (cholmod_sparse *A) ; 127 double aug (cholmod_sparse *A) ; 128 double do_matrix (cholmod_sparse *A) ; 129 cholmod_dense *rhs (cholmod_sparse *A, Int nrhs, Int d) ; 130 void prune_row (cholmod_sparse *A, Int k) ; 131 double pnorm (cholmod_dense *X, Int *P, cholmod_dense *B, Int inv) ; 132 double test_solver (cholmod_sparse *A) ; 133 Int *rand_set (Int len, Int n) ; 134 void my_handler (int status, const char *file, int line, const char *msg) ; 135 void my_handler2 (int status, const char *file, int line, const char *msg) ; 136 double resid3 (cholmod_sparse *A1, cholmod_sparse *A2, cholmod_sparse *A3, 137 cholmod_dense *X, cholmod_dense *B) ; 138 double xrand (double range) ; 139 double lp_resid (cholmod_sparse *A, Int *rflag, Int *fset, Int fsize, 140 double beta [2], cholmod_dense *X, cholmod_dense *B) ; 141 double lpdemo (cholmod_triplet *T) ; 142 cholmod_sparse *lp_prune ( cholmod_sparse *A, Int *rflag, Int *fset, Int fsize); 143 void null2 (cholmod_triplet *Tok, int do_nantests) ; 144 void *my_malloc2 (size_t size) ; 145 void *my_calloc2 (size_t n, size_t size) ; 146 void *my_realloc2 (void *p, size_t size) ; 147 void my_free2 (void *p) ; 148 void memory_tests (cholmod_triplet *T) ; 149 void progress (Int force, char s) ; 150 void test_memory_handler ( void ) ; 151 void normal_memory_handler ( void ) ; 152 cholmod_sparse *unpack (cholmod_sparse *A) ; 153 Int nzdiag (cholmod_sparse *A) ; 154 Int check_partition (cholmod_sparse *A, Int *Part) ; 155 double raw_factor (cholmod_sparse *A, Int errors) ; 156 double raw_factor2 (cholmod_sparse *A, double alpha, int domask) ; 157 cholmod_sparse *get_row (cholmod_sparse *A, Int i, Int *rflag, Int *fset, 158 Int fsize, double beta [2]) ; 159 Int my_rand (void) ; 160 void my_srand (unsigned seed) ; 161 unsigned long my_seed (void) ; 162 void cctest (cholmod_sparse *A) ; 163 Int check_constraints (Int *P, Int *Cmember, Int n) ; 164 void ctest (cholmod_sparse *A) ; 165 void amdtest (cholmod_sparse *A) ; 166 double resid_sparse (cholmod_sparse *A, cholmod_sparse *X, cholmod_sparse *B) ; 167 cholmod_dense *zeros (Int nrow, Int ncol, Int d, Int xtype) ; 168 169 /* -------------------------------------------------------------------------- */ 170 /* AMD, COLAMD, and CCOLAMD */ 171 /* -------------------------------------------------------------------------- */ 172 173 #ifdef LONG 174 175 #define ID "%ld" 176 177 #define AMD_order amd_l_order 178 #define AMD_defaults amd_l_defaults 179 #define AMD_control amd_l_control 180 #define AMD_info amd_l_info 181 #define AMD_1 amd_l1 182 #define AMD_2 amd_l2 183 #define AMD_valid amd_l_valid 184 #define AMD_aat amd_l_aat 185 #define AMD_postorder amd_l_postorder 186 #define AMD_post_tree amd_l_post_tree 187 #define AMD_dump amd_l_dump 188 #define AMD_debug amd_l_debug 189 #define AMD_debug_init amd_l_debug_init 190 #define AMD_preprocess amd_l_preprocess 191 192 #define CAMD_order camd_l_order 193 #define CAMD_defaults camd_l_defaults 194 #define CAMD_control camd_l_control 195 #define CAMD_info camd_l_info 196 #define CAMD_1 camd_l1 197 #define CAMD_2 camd_l2 198 #define CAMD_valid camd_l_valid 199 #define CAMD_cvalid camd_l_cvalid 200 #define CAMD_aat camd_l_aat 201 #define CAMD_postorder camd_l_postorder 202 #define CAMD_dump camd_l_dump 203 #define CAMD_debug camd_l_debug 204 #define CAMD_debug_init camd_l_debug_init 205 #define CAMD_preprocess camd_l_preprocess 206 207 #define CCOLAMD_recommended ccolamd_l_recommended 208 #define CCOLAMD_set_defaults ccolamd_l_set_defaults 209 #define CCOLAMD_2 ccolamd2_l 210 #define CCOLAMD_MAIN ccolamd_l 211 #define CCOLAMD_apply_order ccolamd_l_apply_order 212 #define CCOLAMD_postorder ccolamd_l_postorder 213 #define CCOLAMD_post_tree ccolamd_l_post_tree 214 #define CCOLAMD_fsize ccolamd_l_fsize 215 #define CSYMAMD_MAIN csymamd_l 216 #define CCOLAMD_report ccolamd_l_report 217 #define CSYMAMD_report csymamd_l_report 218 219 #define COLAMD_recommended colamd_l_recommended 220 #define COLAMD_set_defaults colamd_l_set_defaults 221 #define COLAMD_MAIN colamd_l 222 #define SYMAMD_MAIN symamd_l 223 #define COLAMD_report colamd_l_report 224 #define SYMAMD_report symamd_l_report 225 226 #else 227 228 #define ID "%d" 229 230 #define AMD_order amd_order 231 #define AMD_defaults amd_defaults 232 #define AMD_control amd_control 233 #define AMD_info amd_info 234 #define AMD_1 amd_1 235 #define AMD_2 amd_2 236 #define AMD_valid amd_valid 237 #define AMD_aat amd_aat 238 #define AMD_postorder amd_postorder 239 #define AMD_post_tree amd_post_tree 240 #define AMD_dump amd_dump 241 #define AMD_debug amd_debug 242 #define AMD_debug_init amd_debug_init 243 #define AMD_preprocess amd_preprocess 244 245 #define CAMD_order camd_order 246 #define CAMD_defaults camd_defaults 247 #define CAMD_control camd_control 248 #define CAMD_info camd_info 249 #define CAMD_1 camd_1 250 #define CAMD_2 camd_2 251 #define CAMD_valid camd_valid 252 #define CAMD_cvalid camd_cvalid 253 #define CAMD_aat camd_aat 254 #define CAMD_postorder camd_postorder 255 #define CAMD_dump camd_dump 256 #define CAMD_debug camd_debug 257 #define CAMD_debug_init camd_debug_init 258 #define CAMD_preprocess camd_preprocess 259 260 #define CCOLAMD_recommended ccolamd_recommended 261 #define CCOLAMD_set_defaults ccolamd_set_defaults 262 #define CCOLAMD_2 ccolamd2 263 #define CCOLAMD_MAIN ccolamd 264 #define CCOLAMD_apply_order ccolamd_apply_order 265 #define CCOLAMD_postorder ccolamd_postorder 266 #define CCOLAMD_post_tree ccolamd_post_tree 267 #define CCOLAMD_fsize ccolamd_fsize 268 #define CSYMAMD_MAIN csymamd 269 #define CCOLAMD_report ccolamd_report 270 #define CSYMAMD_report csymamd_report 271 272 #define COLAMD_recommended colamd_recommended 273 #define COLAMD_set_defaults colamd_set_defaults 274 #define COLAMD_MAIN colamd 275 #define SYMAMD_MAIN symamd 276 #define COLAMD_report colamd_report 277 #define SYMAMD_report symamd_report 278 279 #endif 280