| 45 | #define GB_FREE_ALL ; |
| 46 | |
| 47 | GrB_Info GB_AxB_dot // dot product (multiple methods) |
| 48 | ( |
| 49 | GrB_Matrix C, // output matrix, static header |
| 50 | GrB_Matrix C_in, // input/output matrix, if done in-place |
| 51 | GrB_Matrix M, // optional mask matrix |
| 52 | const bool Mask_comp, // if true, use !M |
| 53 | const bool Mask_struct, // if true, use the only structure of M |
| 54 | const GrB_BinaryOp accum, |
| 55 | const GrB_Matrix A, // input matrix A |
| 56 | const GrB_Matrix B, // input matrix B |
| 57 | const GrB_Semiring semiring, // semiring that defines C=A*B |
| 58 | const bool flipxy, // if true, do z=fmult(b,a) vs fmult(a,b) |
| 59 | bool *mask_applied, // if true, mask was applied |
| 60 | bool *done_in_place, // if true, C_in was computed in-place |
| 61 | GB_Context Context |
| 62 | ) |
| 63 | { |
| 64 | |
| 65 | //-------------------------------------------------------------------------- |
| 66 | // check inputs |
| 67 | //-------------------------------------------------------------------------- |
| 68 | |
| 69 | GrB_Info info ; |
| 70 | ASSERT (C != NULL && (C->static_header || GBNSTATIC)) ; |
| 71 | |
| 72 | ASSERT_MATRIX_OK_OR_NULL (M, "M for dot A'*B", GB0) ; |
| 73 | ASSERT (!GB_PENDING (M)) ; |
| 74 | ASSERT (GB_JUMBLED_OK (M)) ; |
| 75 | ASSERT (!GB_ZOMBIES (M)) ; |
| 76 | |
| 77 | ASSERT_MATRIX_OK (A, "A for dot A'*B", GB0) ; |
| 78 | GB_MATRIX_WAIT (A) ; |
| 79 | ASSERT (!GB_PENDING (A)) ; |
| 80 | ASSERT (!GB_JUMBLED (A)) ; |
| 81 | ASSERT (!GB_ZOMBIES (A)) ; |
| 82 | |
| 83 | ASSERT_MATRIX_OK (B, "B for dot A'*B", GB0) ; |
| 84 | GB_MATRIX_WAIT (B) ; |
| 85 | ASSERT (!GB_PENDING (B)) ; |
| 86 | ASSERT (!GB_JUMBLED (B)) ; |
| 87 | ASSERT (!GB_ZOMBIES (B)) ; |
| 88 | |
| 89 | ASSERT_SEMIRING_OK (semiring, "semiring for dot A'*B", GB0) ; |
| 90 | ASSERT_MATRIX_OK_OR_NULL (C_in, "C_in for dot A'*B", GB0) ; |
| 91 | |
| 92 | //-------------------------------------------------------------------------- |
| 93 | // determine if C is iso |
| 94 | //-------------------------------------------------------------------------- |
| 95 | |
| 96 | GrB_Type ztype = semiring->add->op->ztype ; |
| 97 | size_t zsize = ztype->size ; |
| 98 | GB_void cscalar [GB_VLA(zsize)] ; |
| 99 | bool C_iso = GB_iso_AxB (cscalar, A, B, A->vlen, semiring, flipxy, false) ; |
| 100 | |
| 101 | if (C_iso) |
| 102 | { |
| 103 | // revise the method if A and B are both iso and full |
| 104 | if (A->iso && GB_as_if_full (A) && B->iso && GB_as_if_full (B)) |
no test coverage detected