1 //------------------------------------------------------------------------------
2 // gbformat: get/set the matrix format to use in GraphBLAS
3 //------------------------------------------------------------------------------
4
5 // SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2021, All Rights Reserved.
6 // SPDX-License-Identifier: GPL-3.0-or-later
7
8 //------------------------------------------------------------------------------
9
10 // Usage
11
12 // fmt = gbformat ; get the global default format (row/col)
13 // fmt = gbformat (fmt) ; set the global default format
14 // [f,sparsity] = gbformat (G) ; get the format and sparsity of a matrix
15 // (either GraphBLAS or MATLAB)
16
17 #include "gb_matlab.h"
18
19 #define USAGE "usage: [f,s] = GrB.format, GrB.format (f), GrB.format (G)"
20
mexFunction(int nargout,mxArray * pargout[],int nargin,const mxArray * pargin[])21 void mexFunction
22 (
23 int nargout,
24 mxArray *pargout [ ],
25 int nargin,
26 const mxArray *pargin [ ]
27 )
28 {
29
30 //--------------------------------------------------------------------------
31 // check inputs
32 //--------------------------------------------------------------------------
33
34 gb_usage (nargin <= 1 && nargout <= 2, USAGE) ;
35
36 //--------------------------------------------------------------------------
37 // get/set the format
38 //--------------------------------------------------------------------------
39
40 GxB_Format_Value fmt = GxB_BY_COL ;
41 int sparsity = GxB_AUTO_SPARSITY ;
42
43 if (nargin == 0)
44 {
45
46 //----------------------------------------------------------------------
47 // format = GrB.format
48 //----------------------------------------------------------------------
49
50 // get the global format
51 OK (GxB_Global_Option_get (GxB_FORMAT, &fmt)) ;
52
53 }
54 else // if (nargin == 1)
55 {
56
57 if (mxIsChar (pargin [0]))
58 {
59
60 //------------------------------------------------------------------
61 // GrB.format (format)
62 //------------------------------------------------------------------
63
64 // parse the format string
65 int ignore ;
66 bool ok = gb_mxstring_to_format (pargin [0], &fmt, &ignore) ;
67 CHECK_ERROR (!ok, "invalid format") ;
68 // set the global format
69 OK (GxB_Global_Option_set (GxB_FORMAT, fmt)) ;
70
71 }
72 else if (mxIsStruct (pargin [0]))
73 {
74
75 //------------------------------------------------------------------
76 // GrB.format (G) for a GraphBLAS matrix G
77 //------------------------------------------------------------------
78
79 // get the type
80 mxArray *mx_type = mxGetField (pargin [0], 0, "GraphBLASv5") ;
81 if (mx_type == NULL)
82 {
83 // check if it is a GraphBLASv4 struct
84 mx_type = mxGetField (pargin [0], 0, "GraphBLASv4") ;
85 }
86 if (mx_type == NULL)
87 {
88 // check if it is a GraphBLASv3 struct
89 mx_type = mxGetField (pargin [0], 0, "GraphBLAS") ;
90 }
91 CHECK_ERROR (mx_type == NULL, "invalid GraphBLAS struct") ;
92
93 // get the row/column format of the input matrix G
94 mxArray *opaque = mxGetField (pargin [0], 0, "s") ;
95 CHECK_ERROR (opaque == NULL, "invalid GraphBLAS struct") ;
96 int64_t *s = mxGetInt64s (opaque) ;
97 bool is_csc = (bool) (s [6]) ;
98 fmt = (is_csc) ? GxB_BY_COL : GxB_BY_ROW ;
99
100 // get the current sparsity status of the input matrix G
101 switch (mxGetNumberOfFields (pargin [0]))
102 {
103 case 3 : sparsity = GxB_FULL ; break ;
104 case 4 : sparsity = GxB_BITMAP ; break ;
105 case 5 : sparsity = GxB_SPARSE ; break ;
106 case 6 : sparsity = GxB_HYPERSPARSE ; break ;
107 default: ERROR ("invalid GraphBLAS struct") ;
108 }
109
110 }
111 else
112 {
113
114 //------------------------------------------------------------------
115 // GrB.format (A) for a MATLAB matrix A
116 //------------------------------------------------------------------
117
118 // MATLAB matrices are always stored by column
119 fmt = GxB_BY_COL ;
120 // MATLAB matrices are sparse or full, never hypersparse or bitmap
121 sparsity = mxIsSparse (pargin [0]) ? GxB_SPARSE : GxB_FULL ;
122 }
123 }
124
125 //--------------------------------------------------------------------------
126 // return result
127 //--------------------------------------------------------------------------
128
129 pargout [0] = mxCreateString ((fmt == GxB_BY_ROW) ? "by row" : "by col") ;
130 if (nargout > 1)
131 {
132 char *s ;
133 switch (sparsity)
134 {
135 case GxB_HYPERSPARSE : s = "hypersparse" ; break ;
136 case GxB_SPARSE : s = "sparse" ; break ;
137 case GxB_BITMAP : s = "bitmap" ; break ;
138 case GxB_FULL : s = "full" ; break ;
139 default : s = "" ; break ;
140 }
141 pargout [1] = mxCreateString (s) ;
142 }
143
144 GB_WRAPUP ;
145 }
146
147