1 //------------------------------------------------------------------------------
2 // GB_mex_ewise_alias2: C += A+A
3 //------------------------------------------------------------------------------
4
5 // SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2021, All Rights Reserved.
6 // SPDX-License-Identifier: Apache-2.0
7
8 //------------------------------------------------------------------------------
9
10 #include "GB_mex.h"
11
12 #define USAGE "C = GB_mex_ewise_alias2 (C, accum, A, desc)"
13
14 #define FREE_ALL \
15 { \
16 GrB_Matrix_free_(&A) ; \
17 GrB_Matrix_free_(&C) ; \
18 GrB_Descriptor_free_(&desc) ; \
19 GB_mx_put_global (true) ; \
20 }
21
mexFunction(int nargout,mxArray * pargout[],int nargin,const mxArray * pargin[])22 void mexFunction
23 (
24 int nargout,
25 mxArray *pargout [ ],
26 int nargin,
27 const mxArray *pargin [ ]
28 )
29 {
30
31 bool malloc_debug = GB_mx_get_global (true) ;
32 GrB_Matrix C = NULL, A = NULL ;
33 GrB_Descriptor desc = NULL ;
34
35 // check inputs
36 if (nargout > 1 || nargin < 3 || nargin > 4)
37 {
38 mexErrMsgTxt ("Usage: " USAGE) ;
39 }
40
41 // get C (make a deep copy)
42 #define GET_DEEP_COPY \
43 C = GB_mx_mxArray_to_Matrix (pargin [0], "C input", true, true) ;
44 #define FREE_DEEP_COPY GrB_Matrix_free_(&C) ;
45 GET_DEEP_COPY ;
46 if (C == NULL)
47 {
48 FREE_ALL ;
49 mexErrMsgTxt ("C failed") ;
50 }
51
52 // get accum, must be present
53 bool user_complex = (Complex != GxB_FC64) && (C->type == Complex) ;
54 GrB_BinaryOp accum ;
55 if (!GB_mx_mxArray_to_BinaryOp (&accum, pargin [1], "accum",
56 C->type, user_complex))
57 {
58 FREE_ALL ;
59 mexErrMsgTxt ("accum failed") ;
60 }
61
62 // get A (shallow copy)
63 A = GB_mx_mxArray_to_Matrix (pargin [2], "A input", false, true) ;
64 if (A == NULL)
65 {
66 FREE_ALL ;
67 mexErrMsgTxt ("A failed") ;
68 }
69
70 // get desc
71 if (!GB_mx_mxArray_to_Descriptor (&desc, PARGIN (3), "desc"))
72 {
73 FREE_ALL ;
74 mexErrMsgTxt ("desc failed") ;
75 }
76
77 // C += A+A
78 METHOD (GrB_Matrix_eWiseAdd_BinaryOp_(C, NULL, accum, accum, A, A, desc)) ;
79
80 // return C to MATLAB as a struct and free the GraphBLAS C
81 pargout [0] = GB_mx_Matrix_to_mxArray (&C, "C output", true) ;
82
83 FREE_ALL ;
84 }
85
86