GrB_Info GB_subassign_scalar // C(Rows,Cols)<Mask> += x ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // mask for C(Rows,Cols), unused if NULL const GrB_BinaryOp accum, // accum for Z=accum(C(Rows,Cols),T) const void *scalar, // scalar to assign to C(Rows,Cols) const GB_Type_code scalar_code, // type code of scalar to assign const GrB_Index *Rows, // row indices const GrB_Index nRows, // number of row indices const GrB_Index *Cols, // column indices const GrB_Index nCols, // number of column indices const GrB_Descriptor desc, // descriptor for C(Rows,Cols) and Mask GB_Context Context ) { //-------------------------------------------------------------------------- // check inputs //-------------------------------------------------------------------------- ASSERT (GB_ALIAS_OK (C, Mask)) ; GB_RETURN_IF_NULL (scalar) ; ASSERT (scalar_code <= GB_UDT_code) ; // get the descriptor GB_GET_DESCRIPTOR (info, desc, C_replace, Mask_comp, xx1, xx2, xx3) ; //-------------------------------------------------------------------------- // C(Rows,Cols)<Mask> = accum (C(Rows,Cols), scalar) //-------------------------------------------------------------------------- return (GB_subassign ( C, C_replace, // C matrix and its descriptor Mask, Mask_comp, // Mask matrix and its descriptor false, // do not transpose the mask accum, // for accum (C(Rows,Cols),scalar) NULL, false, // no explicit matrix A Rows, nRows, // row indices Cols, nCols, // column indices true, // do scalar expansion scalar, // scalar to assign, expands to become A scalar_code, // type code of scalar to expand Context)) ; }
GrB_Info GB_Mask_compatible // check type and dimensions of mask ( const GrB_Matrix Mask, // mask to check const GrB_Matrix C, // C<Mask>= ... const GrB_Index nrows, // size of output if C is NULL (see GB*assign) const GrB_Index ncols, GB_Context Context ) { ASSERT (GB_ALIAS_OK (C, Mask)) ; if (Mask != NULL) { // Mask is typecast to boolean if (!GB_Type_compatible (Mask->type, GrB_BOOL)) { return (GB_ERROR (GrB_DOMAIN_MISMATCH, (GB_LOG, "Mask of type [%s] cannot be typecast to boolean", Mask->type->name))) ; } // check the Mask dimensions GrB_Index cnrows = (C == NULL) ? nrows : GB_NROWS (C) ; GrB_Index cncols = (C == NULL) ? ncols : GB_NCOLS (C) ; if (GB_NROWS (Mask) != cnrows || GB_NCOLS (Mask) != cncols) { return (GB_ERROR (GrB_DIMENSION_MISMATCH, (GB_LOG, "Mask is "GBd"-by-"GBd"; " "does not match output dimensions ("GBu"-by-"GBu")", GB_NROWS (Mask), GB_NCOLS (Mask), cnrows, cncols))) ; } } return (GrB_SUCCESS) ; }