1 //------------------------------------------------------------------------------
2 // GB_Semiring_check: check and print a semiring
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.h"
11 
12 GB_PUBLIC   // accessed by the MATLAB tests in GraphBLAS/Test only
GB_Semiring_check(const GrB_Semiring semiring,const char * name,int pr,FILE * f)13 GrB_Info GB_Semiring_check          // check a GraphBLAS semiring
14 (
15     const GrB_Semiring semiring,    // GraphBLAS semiring to print and check
16     const char *name,               // name of the semiring, optional
17     int pr,                         // print level
18     FILE *f                         // file for output
19 )
20 {
21 
22     //--------------------------------------------------------------------------
23     // check inputs
24     //--------------------------------------------------------------------------
25 
26     GBPR0 ("\n    GraphBLAS Semiring: %s ", ((name != NULL) ? name : "")) ;
27 
28     if (semiring == NULL)
29     {
30         GBPR0 ("NULL\n") ;
31         return (GrB_NULL_POINTER) ;
32     }
33 
34     //--------------------------------------------------------------------------
35     // check object
36     //--------------------------------------------------------------------------
37 
38     GB_CHECK_MAGIC (semiring, "Semiring") ;
39     GBPR0 (semiring->header_size > 0 ? "(user-defined)" : "(built-in)") ;
40 
41     GrB_Info info ;
42     info = GB_Monoid_check (semiring->add, "semiring->add", pr, f) ;
43     if (info != GrB_SUCCESS)
44     {
45         GBPR0 ("    Semiring->add invalid\n") ;
46         return (GrB_INVALID_OBJECT) ;
47     }
48 
49     info = GB_BinaryOp_check (semiring->multiply, "semiring->multiply", pr, f) ;
50     if (info != GrB_SUCCESS)
51     {
52         GBPR0 ("    Semiring->multiply invalid\n") ;
53         return (GrB_INVALID_OBJECT) ;
54     }
55 
56     // z = multiply(x,y); type of z must match monoid type
57     if (semiring->multiply->ztype != semiring->add->op->ztype)
58     {
59         GBPR0 ("    Semiring multiply output domain must match monoid"
60             " domain\n") ;
61         return (GrB_INVALID_OBJECT) ;
62     }
63 
64     return (GrB_SUCCESS) ;
65 }
66 
67