| 42 | #endif |
| 43 | |
| 44 | GB_PUBLIC |
| 45 | GrB_Info GB_AxB_dot2 // C=A'*B or C<#M>=A'*B, dot product method |
| 46 | ( |
| 47 | GrB_Matrix C, // output matrix, static header |
| 48 | const bool C_iso, // true if C is iso |
| 49 | const GB_void *cscalar, // iso value of C |
| 50 | const GrB_Matrix M_in, // mask matrix for C<#M>=A'*B, may be NULL |
| 51 | const bool Mask_comp, // if true, use !M |
| 52 | const bool Mask_struct, // if true, use the only structure of M |
| 53 | const bool A_not_transposed, // if true, C=A*B, else C=A'*B |
| 54 | const GrB_Matrix A_in, // input matrix |
| 55 | const GrB_Matrix B_in, // input matrix |
| 56 | const GrB_Semiring semiring, // semiring that defines C=A*B |
| 57 | const bool flipxy, // if true, do z=fmult(b,a) vs fmult(a,b) |
| 58 | GB_Context Context |
| 59 | ) |
| 60 | { |
| 61 | |
| 62 | //-------------------------------------------------------------------------- |
| 63 | // check inputs |
| 64 | //-------------------------------------------------------------------------- |
| 65 | |
| 66 | GrB_Info info ; |
| 67 | |
| 68 | ASSERT (C != NULL && (C->static_header || GBNSTATIC)) ; |
| 69 | ASSERT_MATRIX_OK_OR_NULL (M_in, "M for dot A'*B", GB0) ; |
| 70 | ASSERT_MATRIX_OK (A_in, "A for dot A'*B", GB0) ; |
| 71 | ASSERT_MATRIX_OK (B_in, "B for dot A'*B", GB0) ; |
| 72 | |
| 73 | ASSERT (!GB_ZOMBIES (M_in)) ; |
| 74 | ASSERT (GB_JUMBLED_OK (M_in)) ; |
| 75 | ASSERT (!GB_PENDING (M_in)) ; |
| 76 | ASSERT (!GB_ZOMBIES (A_in)) ; |
| 77 | ASSERT (!GB_JUMBLED (A_in)) ; |
| 78 | ASSERT (!GB_PENDING (A_in)) ; |
| 79 | ASSERT (!GB_ZOMBIES (B_in)) ; |
| 80 | ASSERT (!GB_JUMBLED (B_in)) ; |
| 81 | ASSERT (!GB_PENDING (B_in)) ; |
| 82 | |
| 83 | ASSERT_SEMIRING_OK (semiring, "semiring for numeric A'*B", GB0) ; |
| 84 | |
| 85 | struct GB_Matrix_opaque A2_header, B2_header, M2_header ; |
| 86 | GrB_Matrix M = NULL, M2 = NULL, A2 = NULL, B2 = NULL, A = NULL, B = NULL ; |
| 87 | GB_WERK_DECLARE (A_slice, int64_t) ; |
| 88 | GB_WERK_DECLARE (B_slice, int64_t) ; |
| 89 | GB_WERK_DECLARE (M_ek_slicing, int64_t) ; |
| 90 | |
| 91 | // GB_AxB_saxpy punts to this dot2 method for for C=A*B, and in this case, |
| 92 | // A is bitmap or full, and B is hypersparse or sparse |
| 93 | bool A_is_full = GB_as_if_full (A_in) ; |
| 94 | bool B_is_full = GB_as_if_full (B_in) ; |
| 95 | bool A_bitmap_or_full = (GB_IS_BITMAP (A_in) || A_is_full) ; |
| 96 | bool B_bitmap_or_full = (GB_IS_BITMAP (B_in) || B_is_full) ; |
| 97 | ASSERT (GB_IMPLIES (A_not_transposed, |
| 98 | (GB_IS_BITMAP (A_in) || GB_IS_FULL (A_in)) && |
| 99 | (GB_IS_SPARSE (B_in) || GB_IS_HYPERSPARSE (B_in)))) ; |
| 100 | |
| 101 | //-------------------------------------------------------------------------- |
no test coverage detected