1 // =============================================================================
2 // === spqr_maxcolnorm =========================================================
3 // =============================================================================
4
5 // Given an m-by-n sparse matrix A, compute the max 2-norm of its columns.
6
7 #include "spqr.hpp"
8
spqr_private_nrm2(Long n,double * X,cholmod_common * cc)9 inline double spqr_private_nrm2 (Long n, double *X, cholmod_common *cc)
10 {
11 double norm = 0 ;
12 BLAS_INT N = n, one = 1 ;
13 if (CHECK_BLAS_INT && !EQ (N,n))
14 {
15 cc->blas_ok = FALSE ;
16 }
17 if (!CHECK_BLAS_INT || cc->blas_ok)
18 {
19 norm = BLAS_DNRM2 (&N, X, &one) ;
20 }
21 return (norm) ;
22 }
23
spqr_private_nrm2(Long n,Complex * X,cholmod_common * cc)24 inline double spqr_private_nrm2 (Long n, Complex *X, cholmod_common *cc)
25 {
26 double norm = 0 ;
27 BLAS_INT N = n, one = 1 ;
28 if (CHECK_BLAS_INT && !EQ (N,n))
29 {
30 cc->blas_ok = FALSE ;
31 }
32 if (!CHECK_BLAS_INT || cc->blas_ok)
33 {
34 norm = BLAS_DZNRM2 (&N, X, &one) ;
35 }
36 return (norm) ;
37 }
38
39
40 // =============================================================================
41 // === spqr_maxcolnorm =========================================================
42 // =============================================================================
43
spqr_maxcolnorm(cholmod_sparse * A,cholmod_common * cc)44 template <typename Entry> double spqr_maxcolnorm
45 (
46 // inputs, not modified
47 cholmod_sparse *A,
48
49 // workspace and parameters
50 cholmod_common *cc
51 )
52 {
53 double norm, maxnorm ;
54 Long j, p, len, n, *Ap ;
55 Entry *Ax ;
56
57 RETURN_IF_NULL_COMMON (EMPTY) ;
58 RETURN_IF_NULL (A, EMPTY) ;
59
60 cc->blas_ok = TRUE ;
61 n = A->ncol ;
62 Ap = (Long *) A->p ;
63 Ax = (Entry *) A->x ;
64
65 maxnorm = 0 ;
66 for (j = 0 ; j < n ; j++)
67 {
68 p = Ap [j] ;
69 len = Ap [j+1] - p ;
70 norm = spqr_private_nrm2 (len, Ax + p, cc) ;
71 maxnorm = MAX (maxnorm, norm) ;
72 }
73
74 if (CHECK_BLAS_INT && !cc->blas_ok)
75 {
76 ERROR (CHOLMOD_INVALID, "problem too large for the BLAS") ;
77 return (EMPTY) ;
78 }
79
80 return (maxnorm) ;
81 }
82
83 // =============================================================================
84
85 template double spqr_maxcolnorm <double>
86 (
87 // inputs, not modified
88 cholmod_sparse *A,
89
90 // workspace and parameters
91 cholmod_common *cc
92 ) ;
93
94 template double spqr_maxcolnorm <Complex>
95 (
96 // inputs, not modified
97 cholmod_sparse *A,
98
99 // workspace and parameters
100 cholmod_common *cc
101 ) ;
102