
%-------------------------------------------------------------------------------
\newpage
\subsection{{\sf GrB\_Semiring} Options}
\label{get_set_semiring}
%-------------------------------------------------------------------------------

\begin{mdframed}[userdefinedwidth=6in]
{\footnotesize
\begin{verbatim}
GrB_Info GrB_get (GrB_Semiring semiring, GrB_Scalar value, int f) ;
GrB_Info GrB_get (GrB_Semiring semiring, char *     value, int f) ;
GrB_Info GrB_get (GrB_Semiring semiring, int32_t *  value, int f) ;
GrB_Info GrB_get (GrB_Semiring semiring, size_t *   value, int f) ;
GrB_Info GrB_get (GrB_Semiring semiring, void *     value, int f) ;

GrB_Info GrB_set (GrB_Semiring semiring, GrB_Scalar value, int f) ;
\end{verbatim}
}\end{mdframed}

\noindent
{\small
\begin{tabular}{|l|l|l|p{2.8in}|}
\hline
\verb'int field'                   & R/W  & C type        & description \\
\hline
\verb'GrB_INP0_TYPE_CODE'          & R    & \verb'int32_t'& 1st input type code (see \verb'GrB_Type_code')
    of the multiplicative operator \\
\verb'GrB_INP1_TYPE_CODE'          & R    & \verb'int32_t'& 2nd input type code
    of the multiplicative operator \\
\verb'GrB_OUTP_TYPE_CODE'          & R    & \verb'int32_t'& output type code 
    of the multiplicative operator,
    and the monoid type. \\
\verb'GxB_THETA_TYPE_CODE'         & R    & \verb'int32_t'& $\Theta$ type code, if any \\
\verb'GrB_INP0_TYPE_STRING'        & R    & \verb'char *' & name of the 1st input type
    of the multiplicative operator \\
\verb'GrB_INP1_TYPE_STRING'        & R    & \verb'char *' & name of the 2nd input type
    of the multiplicative operator \\
\verb'GrB_OUTP_TYPE_STRING'        & R    & \verb'char *' & name of the output type
    of the multiplicative operator,
    and the monoid type. \\
\verb'GxB_THETA_TYPE_STRING'       & R    & \verb'char *' & name of the $\Theta$ type, if any \\
\hline
\verb'GrB_NAME'                     & R/W1 & \verb'char *' &    % GrB_ALREADY_SET (semiring)
    name of the semiring.  For built-in semirings, this returns the GraphBLAS
    name (\verb'"GrB_LOR_LAND_SEMIRING_BOOL"' for \verb'GrB_LOR_LAND_SEMIRING_BOOL',
    for example).  For user-defined semirings, the name can be any string of any
    length.  It is not used by the JIT.  It can be set at most once. \\
\verb'GxB_THETA' & R & \verb'GrB_Scalar' &
    value of \verb'Theta', if any.
    The type of the \verb'GrB_Scalar'
    must match the \verb'Theta' type of the underlying
    index-binary operator exactly. \\
\hline
\end{tabular}
}

\noindent
{\small
\begin{tabular}{|l|l|l|p{2.5in}|}
\hline
\verb'int field'                    & R/W  & C type        & description \\
\hline
\verb'GxB_MONOID_IDENTITY'          & R  & \verb'GrB_Scalar' &
    identity value of the monoid.  The type of the \verb'GrB_Scalar'
    must match the monoid type exactly. \\
\verb'GxB_MONOID_TERMINAL'          & R  & \verb'GrB_Scalar' &
    terminal value of a terminal monoid.  The type of the \verb'GrB_Scalar'
    must match the monoid type exactly.  If the monoid is not terminal,
    the \verb'GrB_Scalar' is returned with no entry. \\
\hline
\verb'GxB_MONOID_OPERATOR'          & R  & \verb'void *' &
    binary operator of the monoid, as a \verb'GrB_BinaryOp';
    See Section~\ref{get_set_monoid} \\
\verb'GxB_SEMIRING_MONOID'          & R  & \verb'void *' &
    monoid of the semiring, as a \verb'GrB_Monoid' \\
\verb'GxB_SEMIRING_MULTIPLY'        & R  & \verb'void *' &
    multiplicative operator of the semiring, as a \verb'GrB_BinaryOp' \\
\hline
\end{tabular}
}

Built-in semirings cannot be modified by \verb'GrB_set'.

The \verb'GxB_SEMIRING_MONOID' option returns the \verb'GrB_Monoid' of the
semiring.  The \verb'GxB_SEMIRING_MULTIPLY' option returns the
\verb'GrB_BinaryOp' for the multiplicative operator of the semiring.  For
example:

    {\footnotesize
    \begin{verbatim}
    // getting an alias to the monoid and multiply operator using GrB_get:
    GrB_BinaryOp op ;
    GrB_Monoid mon ;
    GrB_Semiring semiring = GrB_PLUS_TIMES_FP32 ;
    GrB_get (semiring, (void *) &mon, GxB_SEMIRING_MONOID) ;
    GrB_get (semiring, (void *) &op, GxB_SEMIRING_MULTIPLY) ;
    assert (op == GrB_TIMES_FP32) ;
    assert (mon == GrB_PLUS_MONOID_FP32) ; \end{verbatim} }

The binary op and monoid returned are aliases, not new objects.

The \verb'*THETA*' options can only be used in the multiplicative binary
operator of the semiring was created by \verb'GxB_BinaryOp_new_IndexOp'.


