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