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