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
|
//------------------------------------------------------------------------------
// GB_enumify_reduce: enumerate a GrB_reduce problem
//------------------------------------------------------------------------------
// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2021, All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
//------------------------------------------------------------------------------
// User-defined types are not handled.
#include "GB.h"
#include "GB_stringify.h"
void GB_enumify_reduce // enumerate a GrB_reduce problem
(
// output:
uint64_t *rcode, // unique encoding of the entire problem
// input:
GrB_Monoid reduce, // the monoid to enumify
GrB_Matrix A
)
{
//--------------------------------------------------------------------------
// get the monoid and type of A
//--------------------------------------------------------------------------
GrB_BinaryOp reduceop = reduce->op ;
GrB_Type atype = A->type ;
GrB_Type ztype = reduceop->ztype ;
GB_Opcode reduce_opcode = reduceop->opcode ;
// these must always be true for any monoid:
ASSERT (reduceop->xtype == reduceop->ztype) ;
ASSERT (reduceop->ytype == reduceop->ztype) ;
//--------------------------------------------------------------------------
// rename redundant boolean operators
//--------------------------------------------------------------------------
// consider z = op(x,y) where both x and y are boolean:
// DIV becomes FIRST
// RDIV becomes SECOND
// MIN and TIMES become LAND
// MAX and PLUS become LOR
// NE, ISNE, RMINUS, and MINUS become LXOR
// ISEQ becomes EQ
// ISGT becomes GT
// ISLT becomes LT
// ISGE becomes GE
// ISLE becomes LE
GB_Type_code zcode = ztype->code ;
if (zcode == GB_BOOL_code)
{
// rename the monoid
reduce_opcode = GB_boolean_rename (reduce_opcode) ;
}
//--------------------------------------------------------------------------
// enumify the monoid
//--------------------------------------------------------------------------
int red_ecode, id_ecode, term_ecode ;
GB_enumify_monoid (&red_ecode, &id_ecode, &term_ecode, reduce_opcode,
zcode) ;
//--------------------------------------------------------------------------
// enumify the type and sparsity structure of A
//--------------------------------------------------------------------------
int acode = atype->code ; // 0 to 14
int A_sparsity = GB_sparsity (A) ;
int asparsity ;
GB_enumify_sparsity (&asparsity, A_sparsity) ;
//--------------------------------------------------------------------------
// construct the reduction rcode
//--------------------------------------------------------------------------
// total rcode bits: 25
(*rcode) =
// range bits
// monoid
GB_LSHIFT (red_ecode , 20) | // 0 to 22 5
GB_LSHIFT (id_ecode , 15) | // 0 to 31 5
GB_LSHIFT (term_ecode , 10) | // 0 to 31 5
// type of the monoid
GB_LSHIFT (zcode , 6) | // 0 to 14 4
// type of A
GB_LSHIFT (acode , 2) | // 0 to 14 4
// sparsity structure of A
GB_LSHIFT (asparsity , 0) ; // 0 to 3 2
}
|