1 //------------------------------------------------------------------------------
2 // GB_AxB_saxpy3_coarseGus_noM_phase1: symbolic coarse Gustavson, no mask
3 //------------------------------------------------------------------------------
4 
5 // SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2021, All Rights Reserved.
6 // SPDX-License-Identifier: Apache-2.0
7 
8 //------------------------------------------------------------------------------
9 
10 // Initially, Hf [...] < mark for all Hf.
11 // Hf [i] is set to mark when C(i,j) is found.
12 
13 {
14     for (int64_t kk = kfirst ; kk <= klast ; kk++)
15     {
16         GB_GET_B_j ;                    // get B(:,j)
17 
18         //----------------------------------------------------------------------
19         // special cases when B(:,j) has zero or one entries
20         //----------------------------------------------------------------------
21 
22         #if ( GB_B_IS_SPARSE || GB_B_IS_HYPER )
23         if (bjnz == 0)
24         {
25             Cp [kk] = 0 ;               // C(:,j) is empty
26             continue ;
27         }
28         #if ( GB_A_IS_SPARSE )
29         if (bjnz == 1)
30         {
31             GB_GET_B_kj_INDEX ;         // get index k of entry B(k,j)
32             GB_GET_A_k ;                // get A(:,k)
33             Cp [kk] = aknz ;            // nnz (C (:,j)) = nnz (A (:,k))
34             continue ;
35         }
36         #endif
37         #endif
38 
39         //----------------------------------------------------------------------
40         // count nnz in C(:,j)
41         //----------------------------------------------------------------------
42 
43         const int64_t f = (++mark) ;
44         int64_t cjnz = 0 ;
45         for ( ; pB < pB_end ; pB++)     // scan B(:,j)
46         {
47             GB_GET_B_kj_INDEX ;         // get index k of entry B(k,j)
48             GB_GET_A_k ;                // get A(:,k)
49             // scan A(:,k)
50             for (int64_t pA = pA_start ; pA < pA_end ; pA++)
51             {
52                 GB_GET_A_ik_INDEX ;     // get index i of entry A(i,k)
53                 if (Hf [i] != f)        // if true, i is new
54                 {
55                     Hf [i] = f ;        // mark C(i,j) as seen
56                     cjnz++ ;            // C(i,j) is a new entry
57                 }
58             }
59         }
60         Cp [kk] = cjnz ;                // save count of entries in C(:,j)
61     }
62 }
63 
64