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
|
//------------------------------------------------------------------------------
// GB_subassign_05e: C(:,:)<M,struct> = scalar ; no S, C empty, M structural
//------------------------------------------------------------------------------
// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2022, All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
//------------------------------------------------------------------------------
// Method 05e: C(:,:)<M,struct> = scalar ; no S
// compare with Methods 21, 25, and 05d
// M: present
// Mask_comp: false
// Mask_struct: true
// C_replace: false
// accum: NULL
// A: scalar
// S: none
// C and M can have any sparsity on input. The content of C is replace with
// the structure of M, and the values of C are all set to the scalar. If M is
// bitmap, only assignments where (Mb [pC] == 1) are needed, but it's faster to
// just assign all entries.
// C is always iso, and its iso value has been assigned by GB_assign_prep.
#include "GB_subassign_methods.h"
#undef GB_FREE_ALL
#define GB_FREE_ALL
GrB_Info GB_subassign_05e
(
GrB_Matrix C,
// input:
const GrB_Matrix M,
const void *scalar,
const GrB_Type atype,
GB_Context Context
)
{
//--------------------------------------------------------------------------
// check inputs
//--------------------------------------------------------------------------
ASSERT (!GB_aliased (C, M)) ; // NO ALIAS of C==M
ASSERT (C->iso) ;
//--------------------------------------------------------------------------
// get inputs
//--------------------------------------------------------------------------
GrB_Info info ;
ASSERT_MATRIX_OK (C, "C for subassign method_05e", GB0) ;
ASSERT_MATRIX_OK (M, "M for subassign method_05e", GB0) ;
ASSERT (GB_nnz (C) == 0) ;
// M can be jumbled, in which case C is jumbled on output
ASSERT (!GB_ZOMBIES (M)) ;
ASSERT (GB_JUMBLED_OK (M)) ;
ASSERT (!GB_PENDING (M)) ;
//--------------------------------------------------------------------------
// Method 05e: C(:,:)<M> = x ; C is empty, x is a scalar, M is structural
//--------------------------------------------------------------------------
// Time: Optimal: the method must iterate over all entries in M,
// and the time is O(nnz(M)). This is also the size of C.
//--------------------------------------------------------------------------
// allocate C and create its pattern
//--------------------------------------------------------------------------
// clear prior content and then create a copy of the pattern of M. Keep
// the same type and CSR/CSC for C. Allocate C->x and assign to it the
// scalar.
bool C_is_csc = C->is_csc ;
GB_phybix_free (C) ;
// set C->iso = true OK
GB_OK (GB_dup_worker (&C, true, M, false, C->type, Context)) ;
C->is_csc = C_is_csc ;
GB_cast_scalar (C->x, C->type->code, scalar, atype->code, atype->size) ;
C->jumbled = M->jumbled ; // C is jumbled if M is jumbled
ASSERT_MATRIX_OK (C, "C output for subassign method_05e", GB0) ;
ASSERT (GB_JUMBLED_OK (C)) ;
return (GrB_SUCCESS) ;
}
|