Blame view

fvn_sparse/UMFPACK/Source/umf_version.h 32.6 KB
422234dc3   daniau   git-svn-id: https...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
  /* ========================================================================== */
  /* === umf_version.h ======================================================== */
  /* ========================================================================== */
  
  /* -------------------------------------------------------------------------- */
  /* UMFPACK Copyright (c) Timothy A. Davis, CISE,                              */
  /* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
  /* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
  /* -------------------------------------------------------------------------- */
  
  /*
     Define routine names, depending on version being compiled.
  
     DINT:	double precision, int's as integers
     DLONG:	double precision, UF_long's as integers
     ZLONG:	complex double precision, UF_long's as integers
     ZINT:	complex double precision, int's as integers
  */
  
  /* Set DINT as the default, if nothing is defined */
  #if !defined (DLONG) && !defined (DINT) && !defined (ZLONG) && !defined (ZINT)
  #define DINT
  #endif
  
  /* Determine if this is a real or complex version */
  #if defined (ZLONG) || defined (ZINT)
  #define COMPLEX
  #endif
  
  /* -------------------------------------------------------------------------- */
  /* integer type (Int is int or UF_long) now defined in amd_internal.h */
  /* -------------------------------------------------------------------------- */
  
  #if defined (DLONG) || defined (ZLONG)
  #define LONG_INTEGER
  #endif
  
  /* -------------------------------------------------------------------------- */
  /* Numerical relop macros for correctly handling the NaN case */
  /* -------------------------------------------------------------------------- */
  
  /*
  SCALAR_IS_NAN(x):
      True if x is NaN.  False otherwise.  The commonly-existing isnan(x)
      function could be used, but it's not in Kernighan & Ritchie 2nd edition
      (ANSI C).  It may appear in <math.h>, but I'm not certain about
      portability.  The expression x != x is true if and only if x is NaN,
      according to the IEEE 754 floating-point standard.
  
  SCALAR_IS_ZERO(x):
      True if x is zero.  False if x is nonzero, NaN, or +/- Inf.
      This is (x == 0) if the compiler is IEEE 754 compliant.
  
  SCALAR_IS_NONZERO(x):
      True if x is nonzero, NaN, or +/- Inf.  False if x zero.
      This is (x != 0) if the compiler is IEEE 754 compliant.
  
  SCALAR_IS_LTZERO(x):
      True if x is < zero or -Inf.  False if x is >= 0, NaN, or +Inf.
      This is (x < 0) if the compiler is IEEE 754 compliant.
  */
  
  #if defined (UMF_WINDOWS) && !defined (MATHWORKS)
  
  /* Yes, this is exceedingly ugly.  Blame Microsoft, which hopelessly */
  /* violates the IEEE 754 floating-point standard in a bizarre way. */
  /* If you're using an IEEE 754-compliant compiler, then x != x is true */
  /* iff x is NaN.  For Microsoft, (x < x) is true iff x is NaN. */
  /* So either way, this macro safely detects a NaN. */
  #define SCALAR_IS_NAN(x)	(((x) != (x)) || (((x) < (x))))
  #define SCALAR_IS_ZERO(x)	(((x) == 0.) && !SCALAR_IS_NAN(x))
  #define SCALAR_IS_NONZERO(x)	(((x) != 0.) || SCALAR_IS_NAN(x))
  #define SCALAR_IS_LTZERO(x)	(((x) < 0.) && !SCALAR_IS_NAN(x))
  
  #else
  
  /* These all work properly, according to the IEEE 754 standard ... except on */
  /* a PC with windows.  Works fine in Linux on the same PC... */
  #define SCALAR_IS_NAN(x)	((x) != (x))
  #define SCALAR_IS_ZERO(x)	((x) == 0.)
  #define SCALAR_IS_NONZERO(x)	((x) != 0.)
  #define SCALAR_IS_LTZERO(x)	((x) < 0.)
  
  #endif
  
  /* scalar absolute value macro. If x is NaN, the result is NaN: */
  #define SCALAR_ABS(x) ((SCALAR_IS_LTZERO (x)) ? -(x) : (x))
  
  /* true if an integer (stored in double x) would overflow (or if x is NaN) */
  #define INT_OVERFLOW(x) ((!((x) * (1.0+1e-8) <= (double) Int_MAX)) \
  			|| SCALAR_IS_NAN (x))
  
  /* print a scalar (avoid printing "-0" for negative zero).  */
  #define PRINT_SCALAR(a) \
  { \
      if (SCALAR_IS_NONZERO (a)) \
      { \
  	PRINTF ((" (%g)", (a))) ; \
      } \
      else \
      { \
  	PRINTF ((" (0)")) ; \
      } \
  }
  
  /* -------------------------------------------------------------------------- */
  /* Real floating-point arithmetic */
  /* -------------------------------------------------------------------------- */
  
  #ifndef COMPLEX
  
  #define Entry double
  
  #define SPLIT(s)    		    (1)
  #define REAL_COMPONENT(c)	    (c)
  #define IMAG_COMPONENT(c)	    (0.)
  #define ASSIGN(c,s1,s2,p,split)	    { (c) = (s1)[p] ; }
  #define CLEAR(c)		    { (c) = 0. ; }
  #define CLEAR_AND_INCREMENT(p)	    { *p++ = 0. ; }
  #define IS_NAN(a)		    SCALAR_IS_NAN (a)
  #define IS_ZERO(a)		    SCALAR_IS_ZERO (a)
  #define IS_NONZERO(a)		    SCALAR_IS_NONZERO (a)
  #define SCALE_DIV(c,s)		    { (c) /= (s) ; }
  #define SCALE(c,s)		    { (c) *= (s) ; }
  #define ASSEMBLE(c,a)		    { (c) += (a) ; }
  #define ASSEMBLE_AND_INCREMENT(c,p) { (c) += *p++ ; }
  #define DECREMENT(c,a)		    { (c) -= (a) ; }
  #define MULT(c,a,b)		    { (c) = (a) * (b) ; }
  #define MULT_CONJ(c,a,b)	    { (c) = (a) * (b) ; }
  #define MULT_SUB(c,a,b)		    { (c) -= (a) * (b) ; }
  #define MULT_SUB_CONJ(c,a,b)	    { (c) -= (a) * (b) ; }
  #define DIV(c,a,b)		    { (c) = (a) / (b) ; }
  #define DIV_CONJ(c,a,b)		    { (c) = (a) / (b) ; }
  #define APPROX_ABS(s,a)		    { (s) = SCALAR_ABS (a) ; }
  #define ABS(s,a)		    { (s) = SCALAR_ABS (a) ; }
  #define PRINT_ENTRY(a)		    PRINT_SCALAR (a)
  
  /* for flop counts */
  #define MULTSUB_FLOPS	2.	/* c -= a*b */
  #define DIV_FLOPS	1.	/* c = a/b */
  #define ABS_FLOPS	0.	/* c = abs (a) */
  #define ASSEMBLE_FLOPS	1.	/* c += a */
  #define DECREMENT_FLOPS	1.	/* c -= a */
  #define MULT_FLOPS	1.	/* c = a*b */
  #define SCALE_FLOPS	1.	/* c = a/s */
  
  #else
  
  /* -------------------------------------------------------------------------- */
  /* Complex floating-point arithmetic */
  /* -------------------------------------------------------------------------- */
  
  /*
      Note:  An alternative to this DoubleComplex type would be to use a
      struct { double r ; double i ; }.  The problem with that method
      (used by the Sun Performance Library, for example) is that ANSI C provides
      no guarantee about the layout of a struct.  It is possible that the sizeof
      the struct above would be greater than 2 * sizeof (double).  This would
      mean that the complex BLAS could not be used.  The method used here avoids
      that possibility.  ANSI C *does* guarantee that an array of structs has
      the same size as n times the size of one struct.
  
      The ANSI C99 version of the C language includes a "double _Complex" type.
      It should be possible in that case to do the following:
  
      #define Entry double _Complex
  
      and remove the DoubleComplex struct.  The macros, below, could then be
      replaced with instrinsic operators.  Note that the #define Real and
      #define Imag should also be removed (they only appear in this file).
  
      For the MULT, MULT_SUB, MULT_SUB_CONJ, and MULT_CONJ macros,
      the output argument c cannot be the same as any input argument.
  
  */
  
  typedef struct
  {
      double component [2] ;	/* real and imaginary parts */
  
  } DoubleComplex ;
  
  #define Entry DoubleComplex
  #define Real component [0]
  #define Imag component [1]
  
  /* for flop counts */
  #define MULTSUB_FLOPS	8.	/* c -= a*b */
  #define DIV_FLOPS	9.	/* c = a/b */
  #define ABS_FLOPS	6.	/* c = abs (a), count sqrt as one flop */
  #define ASSEMBLE_FLOPS	2.	/* c += a */
  #define DECREMENT_FLOPS	2.	/* c -= a */
  #define MULT_FLOPS	6.	/* c = a*b */
  #define SCALE_FLOPS	2.	/* c = a/s or c = a*s */
  
  /* -------------------------------------------------------------------------- */
  
  /* real part of c */
  #define REAL_COMPONENT(c) ((c).Real)
  
  /* -------------------------------------------------------------------------- */
  
  /* imag part of c */
  #define IMAG_COMPONENT(c) ((c).Imag)
  
  /* -------------------------------------------------------------------------- */
  
  /* Return TRUE if a complex number is in split form, FALSE if in packed form */
  #define SPLIT(sz) ((sz) != (double *) NULL)
  
  /* -------------------------------------------------------------------------- */
  
  /* c = (s1) + (s2)*i, if s2 is null, then X is in "packed" format (compatible
   * with Entry and ANSI C99 double _Complex type).  */
  #define ASSIGN(c,s1,s2,p,split)	\
  { \
      if (split) \
      { \
          (c).Real = (s1)[p] ; \
          (c).Imag = (s2)[p] ; \
      }  \
      else \
      { \
   	(c) = ((Entry *)(s1))[p] ; \
      }  \
  }
  
  /* -------------------------------------------------------------------------- */
  
  /* c = 0 */
  #define CLEAR(c) \
  { \
      (c).Real = 0. ; \
      (c).Imag = 0. ; \
  }
  
  /* -------------------------------------------------------------------------- */
  
  /* *p++ = 0 */
  #define CLEAR_AND_INCREMENT(p) \
  { \
      p->Real = 0. ; \
      p->Imag = 0. ; \
      p++ ; \
  }
  
  /* -------------------------------------------------------------------------- */
  
  /* True if a == 0 */
  #define IS_ZERO(a) \
      (SCALAR_IS_ZERO ((a).Real) && SCALAR_IS_ZERO ((a).Imag))
  
  /* -------------------------------------------------------------------------- */
  
  /* True if a is NaN */
  #define IS_NAN(a) \
      (SCALAR_IS_NAN ((a).Real) || SCALAR_IS_NAN ((a).Imag))
  
  /* -------------------------------------------------------------------------- */
  
  /* True if a != 0 */
  #define IS_NONZERO(a) \
      (SCALAR_IS_NONZERO ((a).Real) || SCALAR_IS_NONZERO ((a).Imag))
  
  /* -------------------------------------------------------------------------- */
  
  /* c /= s */
  #define SCALE_DIV(c,s) \
  { \
      (c).Real /= (s) ; \
      (c).Imag /= (s) ; \
  }
  
  /* -------------------------------------------------------------------------- */
  
  /* c *= s */
  #define SCALE(c,s) \
  { \
      (c).Real *= (s) ; \
      (c).Imag *= (s) ; \
  }
  
  /* -------------------------------------------------------------------------- */
  
  /* c += a */
  #define ASSEMBLE(c,a) \
  { \
      (c).Real += (a).Real ; \
      (c).Imag += (a).Imag ; \
  }
  
  /* -------------------------------------------------------------------------- */
  
  /* c += *p++ */
  #define ASSEMBLE_AND_INCREMENT(c,p) \
  { \
      (c).Real += p->Real ; \
      (c).Imag += p->Imag ; \
      p++ ; \
  }
  
  /* -------------------------------------------------------------------------- */
  
  /* c -= a */
  #define DECREMENT(c,a) \
  { \
      (c).Real -= (a).Real ; \
      (c).Imag -= (a).Imag ; \
  }
  
  /* -------------------------------------------------------------------------- */
  
  /* c = a*b, assert because c cannot be the same as a or b */
  #define MULT(c,a,b) \
  { \
      ASSERT (&(c) != &(a) && &(c) != &(b)) ; \
      (c).Real = (a).Real * (b).Real - (a).Imag * (b).Imag ; \
      (c).Imag = (a).Imag * (b).Real + (a).Real * (b).Imag ; \
  }
  
  /* -------------------------------------------------------------------------- */
  
  /* c = a*conjugate(b), assert because c cannot be the same as a or b */
  #define MULT_CONJ(c,a,b) \
  { \
      ASSERT (&(c) != &(a) && &(c) != &(b)) ; \
      (c).Real = (a).Real * (b).Real + (a).Imag * (b).Imag ; \
      (c).Imag = (a).Imag * (b).Real - (a).Real * (b).Imag ; \
  }
  
  /* -------------------------------------------------------------------------- */
  
  /* c -= a*b, assert because c cannot be the same as a or b */
  #define MULT_SUB(c,a,b) \
  { \
      ASSERT (&(c) != &(a) && &(c) != &(b)) ; \
      (c).Real -= (a).Real * (b).Real - (a).Imag * (b).Imag ; \
      (c).Imag -= (a).Imag * (b).Real + (a).Real * (b).Imag ; \
  }
  
  /* -------------------------------------------------------------------------- */
  
  /* c -= a*conjugate(b), assert because c cannot be the same as a or b */
  #define MULT_SUB_CONJ(c,a,b) \
  { \
      ASSERT (&(c) != &(a) && &(c) != &(b)) ; \
      (c).Real -= (a).Real * (b).Real + (a).Imag * (b).Imag ; \
      (c).Imag -= (a).Imag * (b).Real - (a).Real * (b).Imag ; \
  }
  
  /* -------------------------------------------------------------------------- */
  
  /* c = a/b, using function pointer */
  #define DIV(c,a,b) \
  { \
      (void) umfpack_divcomplex ((a).Real, (a).Imag, (b).Real, (b).Imag, \
  	&((c).Real), &((c).Imag)) ; \
  }
  
  /* -------------------------------------------------------------------------- */
  
  /* c = a/conjugate(b), using function pointer */
  #define DIV_CONJ(c,a,b) \
  { \
      (void) umfpack_divcomplex ((a).Real, (a).Imag, (b).Real, (-(b).Imag), \
  	&((c).Real), &((c).Imag)) ; \
  }
  
  /* -------------------------------------------------------------------------- */
  
  /* approximate absolute value, s = |r|+|i| */
  #define APPROX_ABS(s,a) \
  { \
      (s) = SCALAR_ABS ((a).Real) + SCALAR_ABS ((a).Imag) ; \
  }
  
  /* -------------------------------------------------------------------------- */
  
  /* exact absolute value, s = sqrt (a.real^2 + a.imag^2) */
  #define ABS(s,a) \
  { \
      (s) = umfpack_hypot ((a).Real, (a).Imag) ; \
  }
  
  /* -------------------------------------------------------------------------- */
  
  /* print an entry (avoid printing "-0" for negative zero).  */
  #define PRINT_ENTRY(a) \
  { \
      if (SCALAR_IS_NONZERO ((a).Real)) \
      { \
  	PRINTF ((" (%g", (a).Real)) ; \
      } \
      else \
      { \
  	PRINTF ((" (0")) ; \
      } \
      if (SCALAR_IS_LTZERO ((a).Imag)) \
      { \
  	PRINTF ((" - %gi)", -(a).Imag)) ; \
      } \
      else if (SCALAR_IS_ZERO ((a).Imag)) \
      { \
  	PRINTF ((" + 0i)")) ; \
      } \
      else \
      { \
  	PRINTF ((" + %gi)", (a).Imag)) ; \
      } \
  }
  
  /* -------------------------------------------------------------------------- */
  
  #endif	/* #ifndef COMPLEX */
  
  /* -------------------------------------------------------------------------- */
  /* Double precision, with int's as integers */
  /* -------------------------------------------------------------------------- */
  
  #ifdef DINT
  
  #define UMF_analyze		 umf_i_analyze
  #define UMF_apply_order		 umf_i_apply_order
  #define UMF_assemble		 umfdi_assemble
  #define UMF_assemble_fixq	 umfdi_assemble_fixq
  #define UMF_blas3_update	 umfdi_blas3_update
  #define UMF_build_tuples	 umfdi_build_tuples
  #define UMF_build_tuples_usage	 umfdi_build_tuples_usage
  #define UMF_colamd		 umf_i_colamd
  #define UMF_colamd_set_defaults	 umf_i_colamd_set_defaults
  #define UMF_create_element	 umfdi_create_element
  #define UMF_extend_front	 umfdi_extend_front
  #define UMF_free		 umf_i_free
  #define UMF_fsize		 umf_i_fsize
  #define UMF_garbage_collection	 umfdi_garbage_collection
  #define UMF_get_memory		 umfdi_get_memory
  #define UMF_grow_front		 umfdi_grow_front
  #define UMF_init_front		 umfdi_init_front
  #define UMF_is_permutation	 umf_i_is_permutation
  #define UMF_kernel		 umfdi_kernel
  #define UMF_kernel_init		 umfdi_kernel_init
  #define UMF_kernel_init_usage	 umfdi_kernel_init_usage
  #define UMF_kernel_wrapup	 umfdi_kernel_wrapup
  #define UMF_local_search	 umfdi_local_search
  #define UMF_lsolve		 umfdi_lsolve
  #define UMF_ltsolve		 umfdi_ltsolve
  #define UMF_lhsolve		 umfdi_lhsolve
  #define UMF_malloc		 umf_i_malloc
  #define UMF_mem_alloc_element	 umfdi_mem_alloc_element
  #define UMF_mem_alloc_head_block umfdi_mem_alloc_head_block
  #define UMF_mem_alloc_tail_block umfdi_mem_alloc_tail_block
  #define UMF_mem_free_tail_block	 umfdi_mem_free_tail_block
  #define UMF_mem_init_memoryspace umfdi_mem_init_memoryspace
  #define UMF_realloc		 umf_i_realloc
  #define UMF_report_perm		 umf_i_report_perm
  #define UMF_report_vector	 umfdi_report_vector
  #define UMF_row_search		 umfdi_row_search
  #define UMF_scale		 umfdi_scale
  #define UMF_scale_column	 umfdi_scale_column
  #define UMF_set_stats		 umf_i_set_stats
  #define UMF_singletons		 umf_i_singletons
  #define UMF_solve		 umfdi_solve
  #define UMF_start_front		 umfdi_start_front
  #define UMF_store_lu		 umfdi_store_lu
  #define UMF_store_lu_drop	 umfdi_store_lu_drop
  #define UMF_symbolic_usage	 umfdi_symbolic_usage
  #define UMF_transpose		 umfdi_transpose
  #define UMF_tuple_lengths	 umfdi_tuple_lengths
  #define UMF_usolve		 umfdi_usolve
  #define UMF_utsolve		 umfdi_utsolve
  #define UMF_uhsolve		 umfdi_uhsolve
  #define UMF_valid_numeric	 umfdi_valid_numeric
  #define UMF_valid_symbolic	 umfdi_valid_symbolic
  #define UMF_triplet_map_x	 umfdi_triplet_map_x
  #define UMF_triplet_map_nox	 umfdi_triplet_map_nox
  #define UMF_triplet_nomap_x	 umfdi_triplet_nomap_x
  #define UMF_triplet_nomap_nox	 umfdi_triplet_nomap_nox
  #define UMF_2by2		 umfdi_2by2
  
  #define UMFPACK_col_to_triplet	 umfpack_di_col_to_triplet
  #define UMFPACK_defaults	 umfpack_di_defaults
  #define UMFPACK_free_numeric	 umfpack_di_free_numeric
  #define UMFPACK_free_symbolic	 umfpack_di_free_symbolic
  #define UMFPACK_get_lunz	 umfpack_di_get_lunz
  #define UMFPACK_get_numeric	 umfpack_di_get_numeric
  #define UMFPACK_get_symbolic	 umfpack_di_get_symbolic
  #define UMFPACK_get_determinant	 umfpack_di_get_determinant
  #define UMFPACK_numeric		 umfpack_di_numeric
  #define UMFPACK_qsymbolic	 umfpack_di_qsymbolic
  #define UMFPACK_report_control	 umfpack_di_report_control
  #define UMFPACK_report_info	 umfpack_di_report_info
  #define UMFPACK_report_matrix	 umfpack_di_report_matrix
  #define UMFPACK_report_numeric	 umfpack_di_report_numeric
  #define UMFPACK_report_perm	 umfpack_di_report_perm
  #define UMFPACK_report_status	 umfpack_di_report_status
  #define UMFPACK_report_symbolic	 umfpack_di_report_symbolic
  #define UMFPACK_report_triplet	 umfpack_di_report_triplet
  #define UMFPACK_report_vector	 umfpack_di_report_vector
  #define UMFPACK_save_numeric	 umfpack_di_save_numeric
  #define UMFPACK_save_symbolic	 umfpack_di_save_symbolic
  #define UMFPACK_load_numeric	 umfpack_di_load_numeric
  #define UMFPACK_load_symbolic	 umfpack_di_load_symbolic
  #define UMFPACK_scale		 umfpack_di_scale
  #define UMFPACK_solve		 umfpack_di_solve
  #define UMFPACK_symbolic	 umfpack_di_symbolic
  #define UMFPACK_transpose	 umfpack_di_transpose
  #define UMFPACK_triplet_to_col	 umfpack_di_triplet_to_col
  #define UMFPACK_wsolve		 umfpack_di_wsolve
  
  /* for debugging only: */
  #define UMF_malloc_count	 umf_i_malloc_count
  #define UMF_debug		 umfdi_debug
  #define UMF_allocfail		 umfdi_allocfail
  #define UMF_gprob		 umfdi_gprob
  #define UMF_dump_dense		 umfdi_dump_dense
  #define UMF_dump_element	 umfdi_dump_element
  #define UMF_dump_rowcol		 umfdi_dump_rowcol
  #define UMF_dump_matrix		 umfdi_dump_matrix
  #define UMF_dump_current_front	 umfdi_dump_current_front
  #define UMF_dump_lu		 umfdi_dump_lu
  #define UMF_dump_memory		 umfdi_dump_memory
  #define UMF_dump_packed_memory	 umfdi_dump_packed_memory
  #define UMF_dump_col_matrix	 umfdi_dump_col_matrix
  #define UMF_dump_chain		 umfdi_dump_chain
  #define UMF_dump_start		 umfdi_dump_start
  #define UMF_dump_rowmerge	 umfdi_dump_rowmerge
  #define UMF_dump_diagonal_map	 umfdi_dump_diagonal_map
  
  #endif
  
  /* -------------------------------------------------------------------------- */
  /* Double precision, with UF_long's as integers */
  /* -------------------------------------------------------------------------- */
  
  #ifdef DLONG
  
  #define UMF_analyze		 umf_l_analyze
  #define UMF_apply_order		 umf_l_apply_order
  #define UMF_assemble		 umfdl_assemble
  #define UMF_assemble_fixq	 umfdl_assemble_fixq
  #define UMF_blas3_update	 umfdl_blas3_update
  #define UMF_build_tuples	 umfdl_build_tuples
  #define UMF_build_tuples_usage	 umfdl_build_tuples_usage
  #define UMF_colamd		 umf_l_colamd
  #define UMF_colamd_set_defaults	 umf_l_colamd_set_defaults
  #define UMF_create_element	 umfdl_create_element
  #define UMF_extend_front	 umfdl_extend_front
  #define UMF_free		 umf_l_free
  #define UMF_fsize		 umf_l_fsize
  #define UMF_garbage_collection	 umfdl_garbage_collection
  #define UMF_get_memory		 umfdl_get_memory
  #define UMF_grow_front		 umfdl_grow_front
  #define UMF_init_front		 umfdl_init_front
  #define UMF_is_permutation	 umf_l_is_permutation
  #define UMF_kernel		 umfdl_kernel
  #define UMF_kernel_init		 umfdl_kernel_init
  #define UMF_kernel_init_usage	 umfdl_kernel_init_usage
  #define UMF_kernel_wrapup	 umfdl_kernel_wrapup
  #define UMF_local_search	 umfdl_local_search
  #define UMF_lsolve		 umfdl_lsolve
  #define UMF_ltsolve		 umfdl_ltsolve
  #define UMF_lhsolve		 umfdl_lhsolve
  #define UMF_malloc		 umf_l_malloc
  #define UMF_mem_alloc_element	 umfdl_mem_alloc_element
  #define UMF_mem_alloc_head_block umfdl_mem_alloc_head_block
  #define UMF_mem_alloc_tail_block umfdl_mem_alloc_tail_block
  #define UMF_mem_free_tail_block	 umfdl_mem_free_tail_block
  #define UMF_mem_init_memoryspace umfdl_mem_init_memoryspace
  #define UMF_realloc		 umf_l_realloc
  #define UMF_report_perm		 umf_l_report_perm
  #define UMF_report_vector	 umfdl_report_vector
  #define UMF_row_search		 umfdl_row_search
  #define UMF_scale		 umfdl_scale
  #define UMF_scale_column	 umfdl_scale_column
  #define UMF_set_stats		 umf_l_set_stats
  #define UMF_singletons		 umf_l_singletons
  #define UMF_solve		 umfdl_solve
  #define UMF_start_front		 umfdl_start_front
  #define UMF_store_lu		 umfdl_store_lu
  #define UMF_store_lu_drop	 umfdl_store_lu_drop
  #define UMF_symbolic_usage	 umfdl_symbolic_usage
  #define UMF_transpose		 umfdl_transpose
  #define UMF_tuple_lengths	 umfdl_tuple_lengths
  #define UMF_usolve		 umfdl_usolve
  #define UMF_utsolve		 umfdl_utsolve
  #define UMF_uhsolve		 umfdl_uhsolve
  #define UMF_valid_numeric	 umfdl_valid_numeric
  #define UMF_valid_symbolic	 umfdl_valid_symbolic
  #define UMF_triplet_map_x	 umfdl_triplet_map_x
  #define UMF_triplet_map_nox	 umfdl_triplet_map_nox
  #define UMF_triplet_nomap_x	 umfdl_triplet_nomap_x
  #define UMF_triplet_nomap_nox	 umfdl_triplet_nomap_nox
  #define UMF_2by2		 umfdl_2by2
  
  #define UMFPACK_col_to_triplet	 umfpack_dl_col_to_triplet
  #define UMFPACK_defaults	 umfpack_dl_defaults
  #define UMFPACK_free_numeric	 umfpack_dl_free_numeric
  #define UMFPACK_free_symbolic	 umfpack_dl_free_symbolic
  #define UMFPACK_get_lunz	 umfpack_dl_get_lunz
  #define UMFPACK_get_numeric	 umfpack_dl_get_numeric
  #define UMFPACK_get_symbolic	 umfpack_dl_get_symbolic
  #define UMFPACK_get_determinant	 umfpack_dl_get_determinant
  #define UMFPACK_numeric		 umfpack_dl_numeric
  #define UMFPACK_qsymbolic	 umfpack_dl_qsymbolic
  #define UMFPACK_report_control	 umfpack_dl_report_control
  #define UMFPACK_report_info	 umfpack_dl_report_info
  #define UMFPACK_report_matrix	 umfpack_dl_report_matrix
  #define UMFPACK_report_numeric	 umfpack_dl_report_numeric
  #define UMFPACK_report_perm	 umfpack_dl_report_perm
  #define UMFPACK_report_status	 umfpack_dl_report_status
  #define UMFPACK_report_symbolic	 umfpack_dl_report_symbolic
  #define UMFPACK_report_triplet	 umfpack_dl_report_triplet
  #define UMFPACK_report_vector	 umfpack_dl_report_vector
  #define UMFPACK_save_numeric	 umfpack_dl_save_numeric
  #define UMFPACK_save_symbolic	 umfpack_dl_save_symbolic
  #define UMFPACK_load_numeric	 umfpack_dl_load_numeric
  #define UMFPACK_load_symbolic	 umfpack_dl_load_symbolic
  #define UMFPACK_scale		 umfpack_dl_scale
  #define UMFPACK_solve		 umfpack_dl_solve
  #define UMFPACK_symbolic	 umfpack_dl_symbolic
  #define UMFPACK_transpose	 umfpack_dl_transpose
  #define UMFPACK_triplet_to_col	 umfpack_dl_triplet_to_col
  #define UMFPACK_wsolve		 umfpack_dl_wsolve
  
  /* for debugging only: */
  #define UMF_malloc_count	 umf_l_malloc_count
  #define UMF_debug		 umfdl_debug
  #define UMF_allocfail		 umfdl_allocfail
  #define UMF_gprob		 umfdl_gprob
  #define UMF_dump_dense		 umfdl_dump_dense
  #define UMF_dump_element	 umfdl_dump_element
  #define UMF_dump_rowcol		 umfdl_dump_rowcol
  #define UMF_dump_matrix		 umfdl_dump_matrix
  #define UMF_dump_current_front	 umfdl_dump_current_front
  #define UMF_dump_lu		 umfdl_dump_lu
  #define UMF_dump_memory		 umfdl_dump_memory
  #define UMF_dump_packed_memory	 umfdl_dump_packed_memory
  #define UMF_dump_col_matrix	 umfdl_dump_col_matrix
  #define UMF_dump_chain		 umfdl_dump_chain
  #define UMF_dump_start		 umfdl_dump_start
  #define UMF_dump_rowmerge	 umfdl_dump_rowmerge
  #define UMF_dump_diagonal_map	 umfdl_dump_diagonal_map
  
  #endif
  
  /* -------------------------------------------------------------------------- */
  /* Complex double precision, with int's as integers */
  /* -------------------------------------------------------------------------- */
  
  #ifdef ZINT
  
  #define UMF_analyze		 umf_i_analyze
  #define UMF_apply_order		 umf_i_apply_order
  #define UMF_assemble		 umfzi_assemble
  #define UMF_assemble_fixq	 umfzi_assemble_fixq
  #define UMF_blas3_update	 umfzi_blas3_update
  #define UMF_build_tuples	 umfzi_build_tuples
  #define UMF_build_tuples_usage	 umfzi_build_tuples_usage
  #define UMF_colamd		 umf_i_colamd
  #define UMF_colamd_set_defaults	 umf_i_colamd_set_defaults
  #define UMF_create_element	 umfzi_create_element
  #define UMF_extend_front	 umfzi_extend_front
  #define UMF_free		 umf_i_free
  #define UMF_fsize		 umf_i_fsize
  #define UMF_garbage_collection	 umfzi_garbage_collection
  #define UMF_get_memory		 umfzi_get_memory
  #define UMF_grow_front		 umfzi_grow_front
  #define UMF_init_front		 umfzi_init_front
  #define UMF_is_permutation	 umf_i_is_permutation
  #define UMF_kernel		 umfzi_kernel
  #define UMF_kernel_init		 umfzi_kernel_init
  #define UMF_kernel_init_usage	 umfzi_kernel_init_usage
  #define UMF_kernel_wrapup	 umfzi_kernel_wrapup
  #define UMF_local_search	 umfzi_local_search
  #define UMF_lsolve		 umfzi_lsolve
  #define UMF_ltsolve		 umfzi_ltsolve
  #define UMF_lhsolve		 umfzi_lhsolve
  #define UMF_malloc		 umf_i_malloc
  #define UMF_mem_alloc_element	 umfzi_mem_alloc_element
  #define UMF_mem_alloc_head_block umfzi_mem_alloc_head_block
  #define UMF_mem_alloc_tail_block umfzi_mem_alloc_tail_block
  #define UMF_mem_free_tail_block	 umfzi_mem_free_tail_block
  #define UMF_mem_init_memoryspace umfzi_mem_init_memoryspace
  #define UMF_realloc		 umf_i_realloc
  #define UMF_report_perm		 umf_i_report_perm
  #define UMF_report_vector	 umfzi_report_vector
  #define UMF_row_search		 umfzi_row_search
  #define UMF_scale		 umfzi_scale
  #define UMF_scale_column	 umfzi_scale_column
  #define UMF_set_stats		 umfzi_set_stats
  #define UMF_singletons		 umf_i_singletons
  #define UMF_solve		 umfzi_solve
  #define UMF_start_front		 umfzi_start_front
  #define UMF_store_lu		 umfzi_store_lu
  #define UMF_store_lu_drop	 umfzi_store_lu_drop
  #define UMF_symbolic_usage	 umfzi_symbolic_usage
  #define UMF_transpose		 umfzi_transpose
  #define UMF_tuple_lengths	 umfzi_tuple_lengths
  #define UMF_usolve		 umfzi_usolve
  #define UMF_utsolve		 umfzi_utsolve
  #define UMF_uhsolve		 umfzi_uhsolve
  #define UMF_valid_numeric	 umfzi_valid_numeric
  #define UMF_valid_symbolic	 umfzi_valid_symbolic
  #define UMF_triplet_map_x	 umfzi_triplet_map_x
  #define UMF_triplet_map_nox	 umfzi_triplet_map_nox
  #define UMF_triplet_nomap_x	 umfzi_triplet_nomap_x
  #define UMF_triplet_nomap_nox	 umfzi_triplet_nomap_nox
  #define UMF_2by2		 umfzi_2by2
  
  #define UMFPACK_col_to_triplet	 umfpack_zi_col_to_triplet
  #define UMFPACK_defaults	 umfpack_zi_defaults
  #define UMFPACK_free_numeric	 umfpack_zi_free_numeric
  #define UMFPACK_free_symbolic	 umfpack_zi_free_symbolic
  #define UMFPACK_get_lunz	 umfpack_zi_get_lunz
  #define UMFPACK_get_numeric	 umfpack_zi_get_numeric
  #define UMFPACK_get_symbolic	 umfpack_zi_get_symbolic
  #define UMFPACK_get_determinant	 umfpack_zi_get_determinant
  #define UMFPACK_numeric		 umfpack_zi_numeric
  #define UMFPACK_qsymbolic	 umfpack_zi_qsymbolic
  #define UMFPACK_report_control	 umfpack_zi_report_control
  #define UMFPACK_report_info	 umfpack_zi_report_info
  #define UMFPACK_report_matrix	 umfpack_zi_report_matrix
  #define UMFPACK_report_numeric	 umfpack_zi_report_numeric
  #define UMFPACK_report_perm	 umfpack_zi_report_perm
  #define UMFPACK_report_status	 umfpack_zi_report_status
  #define UMFPACK_report_symbolic	 umfpack_zi_report_symbolic
  #define UMFPACK_report_triplet	 umfpack_zi_report_triplet
  #define UMFPACK_report_vector	 umfpack_zi_report_vector
  #define UMFPACK_save_numeric	 umfpack_zi_save_numeric
  #define UMFPACK_save_symbolic	 umfpack_zi_save_symbolic
  #define UMFPACK_load_numeric	 umfpack_zi_load_numeric
  #define UMFPACK_load_symbolic	 umfpack_zi_load_symbolic
  #define UMFPACK_scale		 umfpack_zi_scale
  #define UMFPACK_solve		 umfpack_zi_solve
  #define UMFPACK_symbolic	 umfpack_zi_symbolic
  #define UMFPACK_transpose	 umfpack_zi_transpose
  #define UMFPACK_triplet_to_col	 umfpack_zi_triplet_to_col
  #define UMFPACK_wsolve		 umfpack_zi_wsolve
  
  /* for debugging only: */
  #define UMF_malloc_count	 umf_i_malloc_count
  #define UMF_debug		 umfzi_debug
  #define UMF_allocfail		 umfzi_allocfail
  #define UMF_gprob		 umfzi_gprob
  #define UMF_dump_dense		 umfzi_dump_dense
  #define UMF_dump_element	 umfzi_dump_element
  #define UMF_dump_rowcol		 umfzi_dump_rowcol
  #define UMF_dump_matrix		 umfzi_dump_matrix
  #define UMF_dump_current_front	 umfzi_dump_current_front
  #define UMF_dump_lu		 umfzi_dump_lu
  #define UMF_dump_memory		 umfzi_dump_memory
  #define UMF_dump_packed_memory	 umfzi_dump_packed_memory
  #define UMF_dump_col_matrix	 umfzi_dump_col_matrix
  #define UMF_dump_chain		 umfzi_dump_chain
  #define UMF_dump_start		 umfzi_dump_start
  #define UMF_dump_rowmerge	 umfzi_dump_rowmerge
  #define UMF_dump_diagonal_map	 umfzi_dump_diagonal_map
  
  #endif
  
  /* -------------------------------------------------------------------------- */
  /* Complex double precision, with UF_long's as integers */
  /* -------------------------------------------------------------------------- */
  
  #ifdef ZLONG
  
  #define UMF_analyze		 umf_l_analyze
  #define UMF_apply_order		 umf_l_apply_order
  #define UMF_assemble		 umfzl_assemble
  #define UMF_assemble_fixq	 umfzl_assemble_fixq
  #define UMF_blas3_update	 umfzl_blas3_update
  #define UMF_build_tuples	 umfzl_build_tuples
  #define UMF_build_tuples_usage	 umfzl_build_tuples_usage
  #define UMF_colamd		 umf_l_colamd
  #define UMF_colamd_set_defaults	 umf_l_colamd_set_defaults
  #define UMF_create_element	 umfzl_create_element
  #define UMF_extend_front	 umfzl_extend_front
  #define UMF_free		 umf_l_free
  #define UMF_fsize		 umf_l_fsize
  #define UMF_garbage_collection	 umfzl_garbage_collection
  #define UMF_get_memory		 umfzl_get_memory
  #define UMF_grow_front		 umfzl_grow_front
  #define UMF_init_front		 umfzl_init_front
  #define UMF_is_permutation	 umf_l_is_permutation
  #define UMF_kernel		 umfzl_kernel
  #define UMF_kernel_init		 umfzl_kernel_init
  #define UMF_kernel_init_usage	 umfzl_kernel_init_usage
  #define UMF_kernel_wrapup	 umfzl_kernel_wrapup
  #define UMF_local_search	 umfzl_local_search
  #define UMF_lsolve		 umfzl_lsolve
  #define UMF_ltsolve		 umfzl_ltsolve
  #define UMF_lhsolve		 umfzl_lhsolve
  #define UMF_malloc		 umf_l_malloc
  #define UMF_mem_alloc_element	 umfzl_mem_alloc_element
  #define UMF_mem_alloc_head_block umfzl_mem_alloc_head_block
  #define UMF_mem_alloc_tail_block umfzl_mem_alloc_tail_block
  #define UMF_mem_free_tail_block	 umfzl_mem_free_tail_block
  #define UMF_mem_init_memoryspace umfzl_mem_init_memoryspace
  #define UMF_realloc		 umf_l_realloc
  #define UMF_report_perm		 umf_l_report_perm
  #define UMF_report_vector	 umfzl_report_vector
  #define UMF_row_search		 umfzl_row_search
  #define UMF_scale		 umfzl_scale
  #define UMF_scale_column	 umfzl_scale_column
  #define UMF_set_stats		 umfzl_set_stats
  #define UMF_singletons		 umf_l_singletons
  #define UMF_solve		 umfzl_solve
  #define UMF_start_front		 umfzl_start_front
  #define UMF_store_lu		 umfzl_store_lu
  #define UMF_store_lu_drop	 umfzl_store_lu_drop
  #define UMF_symbolic_usage	 umfzl_symbolic_usage
  #define UMF_transpose		 umfzl_transpose
  #define UMF_tuple_lengths	 umfzl_tuple_lengths
  #define UMF_usolve		 umfzl_usolve
  #define UMF_utsolve		 umfzl_utsolve
  #define UMF_uhsolve		 umfzl_uhsolve
  #define UMF_valid_numeric	 umfzl_valid_numeric
  #define UMF_valid_symbolic	 umfzl_valid_symbolic
  #define UMF_triplet_map_x	 umfzl_triplet_map_x
  #define UMF_triplet_map_nox	 umfzl_triplet_map_nox
  #define UMF_triplet_nomap_x	 umfzl_triplet_nomap_x
  #define UMF_triplet_nomap_nox	 umfzl_triplet_nomap_nox
  #define UMF_2by2		 umfzl_2by2
  
  #define UMFPACK_col_to_triplet	 umfpack_zl_col_to_triplet
  #define UMFPACK_defaults	 umfpack_zl_defaults
  #define UMFPACK_free_numeric	 umfpack_zl_free_numeric
  #define UMFPACK_free_symbolic	 umfpack_zl_free_symbolic
  #define UMFPACK_get_lunz	 umfpack_zl_get_lunz
  #define UMFPACK_get_numeric	 umfpack_zl_get_numeric
  #define UMFPACK_get_symbolic	 umfpack_zl_get_symbolic
  #define UMFPACK_get_determinant	 umfpack_zl_get_determinant
  #define UMFPACK_numeric		 umfpack_zl_numeric
  #define UMFPACK_qsymbolic	 umfpack_zl_qsymbolic
  #define UMFPACK_report_control	 umfpack_zl_report_control
  #define UMFPACK_report_info	 umfpack_zl_report_info
  #define UMFPACK_report_matrix	 umfpack_zl_report_matrix
  #define UMFPACK_report_numeric	 umfpack_zl_report_numeric
  #define UMFPACK_report_perm	 umfpack_zl_report_perm
  #define UMFPACK_report_status	 umfpack_zl_report_status
  #define UMFPACK_report_symbolic	 umfpack_zl_report_symbolic
  #define UMFPACK_report_triplet	 umfpack_zl_report_triplet
  #define UMFPACK_report_vector	 umfpack_zl_report_vector
  #define UMFPACK_save_numeric	 umfpack_zl_save_numeric
  #define UMFPACK_save_symbolic	 umfpack_zl_save_symbolic
  #define UMFPACK_load_numeric	 umfpack_zl_load_numeric
  #define UMFPACK_load_symbolic	 umfpack_zl_load_symbolic
  #define UMFPACK_scale		 umfpack_zl_scale
  #define UMFPACK_solve		 umfpack_zl_solve
  #define UMFPACK_symbolic	 umfpack_zl_symbolic
  #define UMFPACK_transpose	 umfpack_zl_transpose
  #define UMFPACK_triplet_to_col	 umfpack_zl_triplet_to_col
  #define UMFPACK_wsolve		 umfpack_zl_wsolve
  
  /* for debugging only: */
  #define UMF_malloc_count	 umf_l_malloc_count
  #define UMF_debug		 umfzl_debug
  #define UMF_allocfail		 umfzl_allocfail
  #define UMF_gprob		 umfzl_gprob
  #define UMF_dump_dense		 umfzl_dump_dense
  #define UMF_dump_element	 umfzl_dump_element
  #define UMF_dump_rowcol		 umfzl_dump_rowcol
  #define UMF_dump_matrix		 umfzl_dump_matrix
  #define UMF_dump_current_front	 umfzl_dump_current_front
  #define UMF_dump_lu		 umfzl_dump_lu
  #define UMF_dump_memory		 umfzl_dump_memory
  #define UMF_dump_packed_memory	 umfzl_dump_packed_memory
  #define UMF_dump_col_matrix	 umfzl_dump_col_matrix
  #define UMF_dump_chain		 umfzl_dump_chain
  #define UMF_dump_start		 umfzl_dump_start
  #define UMF_dump_rowmerge	 umfzl_dump_rowmerge
  #define UMF_dump_diagonal_map	 umfzl_dump_diagonal_map
  
  #endif