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