1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
//------------------------------------------------------------------------------
// GrB_Vector_eWiseAdd: vector element-wise operations, set union
//------------------------------------------------------------------------------
// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2022, All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
//------------------------------------------------------------------------------
// w<M> = accum (w,u+v)
#include "GB_ewise.h"
#include "GB_get_mask.h"
#define GB_EWISE(op) \
/* check inputs */ \
GB_RETURN_IF_NULL_OR_FAULTY (w) ; \
GB_RETURN_IF_NULL_OR_FAULTY (u) ; \
GB_RETURN_IF_NULL_OR_FAULTY (v) ; \
GB_RETURN_IF_FAULTY (M_in) ; \
ASSERT (GB_VECTOR_OK (w)) ; \
ASSERT (GB_VECTOR_OK (u)) ; \
ASSERT (GB_VECTOR_OK (v)) ; \
ASSERT (M_in == NULL || GB_VECTOR_OK (M_in)) ; \
/* get the descriptor */ \
GB_GET_DESCRIPTOR (info, desc, C_replace, Mask_comp, Mask_struct, \
xx1, xx2, xx3, xx7) ; \
/* get the mask */ \
GrB_Matrix M = GB_get_mask ((GrB_Matrix) M_in, &Mask_comp, &Mask_struct) ; \
/* w<M> = accum (w,t) where t = u+v, u'+v, u+v', or u'+v' */ \
info = GB_ewise ( \
(GrB_Matrix) w, C_replace, /* w and its descriptor */ \
M, Mask_comp, Mask_struct, /* mask and its descriptor */ \
accum, /* accumulate operator */ \
op, /* operator that defines '+' */ \
(GrB_Matrix) u, false, /* u, never transposed */ \
(GrB_Matrix) v, false, /* v, never transposed */ \
true, /* eWiseAdd */ \
false, NULL, NULL, /* not eWiseUnion */ \
Context) ;
//------------------------------------------------------------------------------
// GrB_Vector_eWiseAdd_BinaryOp: vector addition
//------------------------------------------------------------------------------
GrB_Info GrB_Vector_eWiseAdd_BinaryOp // w<M> = accum (w, u+v)
(
GrB_Vector w, // input/output vector for results
const GrB_Vector M_in, // optional mask for w, unused if NULL
const GrB_BinaryOp accum, // optional accum for z=accum(w,t)
const GrB_BinaryOp add, // defines '+' for t=u+v
const GrB_Vector u, // first input: vector u
const GrB_Vector v, // second input: vector v
const GrB_Descriptor desc // descriptor for w and M
)
{
//--------------------------------------------------------------------------
// check inputs
//--------------------------------------------------------------------------
GB_WHERE (w, "GrB_Vector_eWiseAdd_BinaryOp (w, M, accum, add, u, v, desc)");
GB_BURBLE_START ("GrB_eWiseAdd") ;
GB_RETURN_IF_NULL_OR_FAULTY (add) ;
//--------------------------------------------------------------------------
// apply the eWise kernel (using set union)
//--------------------------------------------------------------------------
GB_EWISE (add) ;
GB_BURBLE_END ;
return (info) ;
}
//------------------------------------------------------------------------------
// GrB_Vector_eWiseAdd_Monoid: vector addition
//------------------------------------------------------------------------------
GrB_Info GrB_Vector_eWiseAdd_Monoid // w<M> = accum (w, u+v)
(
GrB_Vector w, // input/output vector for results
const GrB_Vector M_in, // optional mask for w, unused if NULL
const GrB_BinaryOp accum, // optional accum for z=accum(w,t)
const GrB_Monoid monoid, // defines '+' for t=u+v
const GrB_Vector u, // first input: vector u
const GrB_Vector v, // second input: vector v
const GrB_Descriptor desc // descriptor for w and M
)
{
//--------------------------------------------------------------------------
// check inputs
//--------------------------------------------------------------------------
GB_WHERE (w, "GrB_Vector_eWiseAdd_Monoid "
"(w, M, accum, monoid, u, v, desc)") ;
GB_BURBLE_START ("GrB_eWiseAdd") ;
GB_RETURN_IF_NULL_OR_FAULTY (monoid) ;
//--------------------------------------------------------------------------
// eWise add using the monoid operator
//--------------------------------------------------------------------------
GB_EWISE (monoid->op) ;
GB_BURBLE_END ;
return (info) ;
}
//------------------------------------------------------------------------------
// GrB_Vector_eWiseAdd_Semiring: vector addition
//------------------------------------------------------------------------------
GrB_Info GrB_Vector_eWiseAdd_Semiring // w<M> = accum (w, u+v)
(
GrB_Vector w, // input/output vector for results
const GrB_Vector M_in, // optional mask for w, unused if NULL
const GrB_BinaryOp accum, // optional accum for z=accum(w,t)
const GrB_Semiring semiring, // defines '+' for t=u+v
const GrB_Vector u, // first input: vector u
const GrB_Vector v, // second input: vector v
const GrB_Descriptor desc // descriptor for w and M
)
{
//--------------------------------------------------------------------------
// check inputs
//--------------------------------------------------------------------------
GB_WHERE (w, "GrB_Vector_eWiseAdd_Semiring "
"(w, M, accum, semiring, u, v, desc)") ;
GB_BURBLE_START ("GrB_eWiseAdd") ;
GB_RETURN_IF_NULL_OR_FAULTY (semiring) ;
//--------------------------------------------------------------------------
// eWise add using the semiring monoid operator
//--------------------------------------------------------------------------
GB_EWISE (semiring->add->op) ;
GB_BURBLE_END ;
return (info) ;
}
|