File: GB_mx_mxArray_to_Semiring.c

package info (click to toggle)
suitesparse 1%3A5.8.1%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 152,716 kB
  • sloc: ansic: 774,385; cpp: 24,213; makefile: 6,310; fortran: 1,927; java: 1,826; csh: 1,686; ruby: 725; sh: 535; perl: 225; python: 209; sed: 164; awk: 60
file content (112 lines) | stat: -rw-r--r-- 3,808 bytes parent folder | download
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
//------------------------------------------------------------------------------
// GB_mx_mxArray_to_Semiring
//------------------------------------------------------------------------------

// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2020, All Rights Reserved.
// http://suitesparse.com   See GraphBLAS/Doc/License.txt for license.

//------------------------------------------------------------------------------

// Get a semiring struct from MATLAB and convert it into a GraphBLAS semiring.
//
// The semiring MATLAB struct must contain the following strings:
//
//      multiply    a string with the name of the 'multiply' binary operator.
//      add         a string with the name of the 'add' binary operator.
//                  The operator must be commutative.
//      type        the type of x and y for the multiply operator.
//                  ('logical', 'int8', ... 'double complex').  optional.

#include "GB_mex.h"

bool GB_mx_mxArray_to_Semiring         // true if successful
(
    GrB_Semiring *handle,               // the semiring
    const mxArray *semiring_matlab,     // MATLAB version of semiring
    const char *name,                   // name of the argument
    const GrB_Type default_optype,      // default operator type
    const bool user_complex         // if true, use user-defined Complex op
)
{

    GB_WHERE ("GB_mx_mxArray_to_Semiring") ;

    (*handle) = NULL ;
    const mxArray *multiply_mx = NULL, *type_mx = NULL, *add_mx = NULL ;

    if (semiring_matlab == NULL || mxIsEmpty (semiring_matlab))
    {
        // semiring is not present; defaults will be used
        ;
    }
    else if (mxIsStruct (semiring_matlab))
    {
        // look for semiring.multiply
        int fieldnumber = mxGetFieldNumber (semiring_matlab, "multiply") ;
        if (fieldnumber >= 0)
        {
            multiply_mx = mxGetFieldByNumber (semiring_matlab, 0, fieldnumber) ;
        }
        // look for semiring.class
        fieldnumber = mxGetFieldNumber (semiring_matlab, "class") ;
        if (fieldnumber >= 0)
        {
            type_mx = mxGetFieldByNumber (semiring_matlab, 0, fieldnumber) ;
        }
        // look for semiring.add
        fieldnumber = mxGetFieldNumber (semiring_matlab, "add") ;
        if (fieldnumber >= 0)
        {
            add_mx = mxGetFieldByNumber (semiring_matlab, 0, fieldnumber) ;
        }
    }
    else
    {
        mexWarnMsgIdAndTxt ("GB:warn","invalid semiring") ;
        return (false) ;
    }

    // find the corresponding GraphBLAS multiply operator
    GrB_BinaryOp multiply = NULL ;
    if (!GB_mx_string_to_BinaryOp (&multiply, default_optype,
        multiply_mx, type_mx, user_complex) || multiply == NULL)
    {
        mexWarnMsgIdAndTxt ("GB:warn","mult missing or failed") ;
        return (false) ;
    }

    ASSERT_BINARYOP_OK (multiply, "semiring multiply", GB0) ;

    // find the corresponding GraphBLAS add operator
    GrB_BinaryOp add = NULL ;
    if (!GB_mx_string_to_BinaryOp (&add, multiply->ztype,
        add_mx, NULL, user_complex) || add == NULL)
    {
        mexWarnMsgIdAndTxt ("GB:warn", "add missing or failed") ;
        return (false) ;
    }

    ASSERT_BINARYOP_OK (add, "semiring add", GB0) ;
    ASSERT_BINARYOP_OK (multiply, "semiring multiply", GB0) ;

    // create the monoid with the add operator and its identity value
    GrB_Monoid monoid = GB_mx_BinaryOp_to_Monoid (add) ;
    if (monoid == NULL)
    {
        mexWarnMsgIdAndTxt ("GB:warn", "monoid missing or failed") ;
        return (false) ;
    }

    // create the semiring
    GrB_Semiring semiring = GB_mx_semiring (monoid, multiply) ;
    if (semiring == NULL)
    {
        return (false) ;
    }

    ASSERT_SEMIRING_OK (semiring, "semiring", GB0) ;

    (*handle) = semiring ;
    return (true) ;
}