From 8cf65c1b79b31c219c452395e5ad33f143c6a2dc Mon Sep 17 00:00:00 2001 From: Vidith Madhu Date: Tue, 27 Feb 2024 12:46:38 -0600 Subject: [PATCH 01/76] initial progress on cuda rowscale kernel --- CUDA/GB_cuda_rowscale.cpp | 27 ++++ CUDA/GB_cuda_rowscale_branch.cpp | 20 +++ .../JitKernels/GB_jit_kernel_cuda_rowscale.cu | 61 +++++++++ Source/GB_cuda_gateway.h | 17 +++ Source/GB_rowscale.c | 59 +++++---- Source/Template/GB_jit_kernel_proto.h | 11 ++ cmake_modules/GraphBLAS_JIT_paths.cmake | 2 +- notes.txt | 124 ++++++++++++++++++ 8 files changed, 295 insertions(+), 26 deletions(-) create mode 100644 CUDA/GB_cuda_rowscale.cpp create mode 100644 CUDA/GB_cuda_rowscale_branch.cpp create mode 100644 CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu create mode 100644 notes.txt diff --git a/CUDA/GB_cuda_rowscale.cpp b/CUDA/GB_cuda_rowscale.cpp new file mode 100644 index 0000000000..9f2089d824 --- /dev/null +++ b/CUDA/GB_cuda_rowscale.cpp @@ -0,0 +1,27 @@ +#include "GraphBLAS_cuda.hpp" +#include "GB_cuda.hpp" + +#undef GB_FREE_WORKSPACE +#define GB_FREE_WORKSPACE ; + +#undef GB_FREE_ALL +#define GB_FREE_ALL ; + +GrB_Info GB_cuda_rowscale +( + GrB_Matrix C, + const GrB_Matrix D, + const GrB_Matrix B, + const GrB_Semiring semiring, + const bool flipxy +) +{ + // FIXME: use the stream pool + // cudaStream_t stream ; + // CHECK_CUDA (cudaStreamCreate (&stream)) ; + + printf ("Entered GPU rowscale\n") ; + + return GrB_SUCCESS ; + +} \ No newline at end of file diff --git a/CUDA/GB_cuda_rowscale_branch.cpp b/CUDA/GB_cuda_rowscale_branch.cpp new file mode 100644 index 0000000000..cf4aca71b4 --- /dev/null +++ b/CUDA/GB_cuda_rowscale_branch.cpp @@ -0,0 +1,20 @@ +#include "GraphBLAS_cuda.hpp" +#include "GB_cuda.hpp" + +bool GB_cuda_rowscale_branch +( + const GrB_Matrix D, + const GrB_Matrix B, + const GrB_Semiring semiring, + const bool flipxy +) +{ + if (!GB_cuda_type_branch (D->type) || + !GB_cuda_type_branch (B->type) || + !GB_cuda_type_branch (semiring->multiply->ztype)) + { + return false; + } + + return true; +} \ No newline at end of file diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu new file mode 100644 index 0000000000..2882741cf5 --- /dev/null +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu @@ -0,0 +1,61 @@ +using namespace cooperative_groups ; + +__global__ void GB_cuda_rowscale_kernel +( + GrB_Matrix C, + GrB_Matrix D, + GrB_Matrix B +) +{ + const GB_A_TYPE *__restrict__ Dx = (GB_A_TYPE *) D->x ; + const GB_B_TYPE *__restrict__ Bx = (GB_B_TYPE *) B->x ; + GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *) C->x ; + + #ifdef GB_JIT_KERNEL + #define D_iso GB_A_ISO + #define B_iso GB_B_ISO + #else + const bool D_iso = D->iso ; + const bool B_iso = B->iso ; + #endif + + const int64_t *__restrict__ Bi = B->i ; + GB_B_NVALS (bnz) ; + const int64_t bvlen = B->vlen ; + + int ntasks = gridDim.x * blockDim.x; + // ntasks = GB_IMIN (bnz, ntasks) ; take care of this when setting gridsz/blocksz + int tid = blockIdx.x * blockDim.x + threadIdx.x; + + int64_t pstart, pend ; + GB_PARTITION (pstart, pend, bnz, tid, ntasks) ; + for (int64_t p = pstart ; p < pend ; p++) + { + int64_t i = GBI_B (Bi, p, bvlen) ; // get row index of B(i,j) + GB_DECLAREA (dii) ; + GB_GETA (dii, Dx, i, D_iso) ; // dii = D(i,i) + GB_DECLAREB (bij) ; + GB_GETB (bij, Bx, p, B_iso) ; // bij = B(i,j) + GB_EWISEOP (Cx, p, dii, bij, 0, 0) ; // C(i,j) = dii*bij + } +} + +extern "C" { + GB_JIT_CUDA_KERNEL_ROWSCALE_PROTO (GB_jit_kernel) ; +} + +GB_JIT_CUDA_KERNEL_ROWSCALE_PROTO (GB_jit_kernel) +{ + ASSERT (GB_JUMBLED_OK (C)) ; + ASSERT (!GB_JUMBLED (D)) ; + ASSERT (GB_JUMBLED_OK (B)) ; + ASSERT (!C->iso) ; + + dim3 grid (gridsz) ; + dim3 block (blocksz) ; + + GB_cuda_rowscale_kernel <<>> (C, D, B) ; + cudaStreamSynchronize (stream) ; + + return (GrB_SUCCESS) ; +} \ No newline at end of file diff --git a/Source/GB_cuda_gateway.h b/Source/GB_cuda_gateway.h index d43c2686d2..15a42d43a7 100644 --- a/Source/GB_cuda_gateway.h +++ b/Source/GB_cuda_gateway.h @@ -134,6 +134,23 @@ GrB_Info GB_cuda_reduce_to_scalar const GrB_Matrix A ) ; +bool GB_cuda_rowscale_branch +( + const GrB_Matrix D, + const GrB_Matrix B, + const GrB_Semiring semiring, + const bool flipxy +) ; + +GrB_Info GB_cuda_rowscale +( + GrB_Matrix C, + const GrB_Matrix D, + const GrB_Matrix B, + const GrB_Semiring semiring, + const bool flipxy +) ; + bool GB_cuda_type_branch // return true if the type is OK on GPU ( const GrB_Type type // type to query diff --git a/Source/GB_rowscale.c b/Source/GB_rowscale.c index 2eb0c9772e..b44d0b33c8 100644 --- a/Source/GB_rowscale.c +++ b/Source/GB_rowscale.c @@ -194,6 +194,14 @@ GrB_Info GB_rowscale // C = D*B, row scale with diagonal D GB_Type_compatible (B->type, mult->ytype))) ; } + info = GrB_NO_VALUE ; + + #if defined ( GRAPHBLAS_HAS_CUDA ) + if (GB_cuda_rowscale_branch (D, B, mult, flipxy)) { + info = GB_cuda_rowscale (C, D, B, semiring, flipxy) ; + } + #endif + //---------------------------------------------------------------------- // determine the number of threads to use //---------------------------------------------------------------------- @@ -207,36 +215,37 @@ GrB_Info GB_rowscale // C = D*B, row scale with diagonal D // via the factory kernel //---------------------------------------------------------------------- - info = GrB_NO_VALUE ; #ifndef GBCOMPACT GB_IF_FACTORY_KERNELS_ENABLED - { - - //------------------------------------------------------------------ - // define the worker for the switch factory - //------------------------------------------------------------------ - - #define GB_DxB(mult,xname) GB (_DxB_ ## mult ## xname) + if (info == GrB_NO_VALUE){ + { - #define GB_BINOP_WORKER(mult,xname) \ - { \ - info = GB_DxB(mult,xname) (C, D, B, nthreads) ; \ - } \ - break ; + //------------------------------------------------------------------ + // define the worker for the switch factory + //------------------------------------------------------------------ - //------------------------------------------------------------------ - // launch the switch factory - //------------------------------------------------------------------ + #define GB_DxB(mult,xname) GB (_DxB_ ## mult ## xname) - GB_Type_code xcode, ycode, zcode ; - if (GB_binop_builtin (D->type, D_is_pattern, B->type, B_is_pattern, - mult, flipxy, &opcode, &xcode, &ycode, &zcode)) - { - // C=D*B, rowscale with built-in operator - #define GB_BINOP_IS_SEMIRING_MULTIPLIER - #define GB_NO_PAIR - #include "GB_binop_factory.c" - #undef GB_BINOP_IS_SEMIRING_MULTIPLIER + #define GB_BINOP_WORKER(mult,xname) \ + { \ + info = GB_DxB(mult,xname) (C, D, B, nthreads) ; \ + } \ + break ; + + //------------------------------------------------------------------ + // launch the switch factory + //------------------------------------------------------------------ + + GB_Type_code xcode, ycode, zcode ; + if (GB_binop_builtin (D->type, D_is_pattern, B->type, B_is_pattern, + mult, flipxy, &opcode, &xcode, &ycode, &zcode)) + { + // C=D*B, rowscale with built-in operator + #define GB_BINOP_IS_SEMIRING_MULTIPLIER + #define GB_NO_PAIR + #include "GB_binop_factory.c" + #undef GB_BINOP_IS_SEMIRING_MULTIPLIER + } } } #endif diff --git a/Source/Template/GB_jit_kernel_proto.h b/Source/Template/GB_jit_kernel_proto.h index 7da845b6be..6d7390aeb3 100644 --- a/Source/Template/GB_jit_kernel_proto.h +++ b/Source/Template/GB_jit_kernel_proto.h @@ -572,6 +572,17 @@ GrB_Info GB_jit_kernel_reduce \ int32_t blocksz \ ) +#define GB_JIT_CUDA_KERNEL_ROWSCALE_PROTO(GB_jit_kernel_rowscale) \ +GrB_Info GB_jit_kernel_rowscale \ +( \ + GrB_Matrix C, \ + GrB_Matrix D, \ + GrB_Matrix B, \ + cudaStream_t stream, \ + int32_t gridsz, \ + int32_t blocksz \ +) + //------------------------------------------------------------------------------ // shorthand macros for GB_prejit.c: //------------------------------------------------------------------------------ diff --git a/cmake_modules/GraphBLAS_JIT_paths.cmake b/cmake_modules/GraphBLAS_JIT_paths.cmake index cd59d17cd2..21e172d7d8 100644 --- a/cmake_modules/GraphBLAS_JIT_paths.cmake +++ b/cmake_modules/GraphBLAS_JIT_paths.cmake @@ -43,7 +43,7 @@ if ( SUITESPARSE_HAS_CUDA AND GRAPHBLAS_USE_CUDA ) # set ( GRAPHBLAS_COMPACT on ) endif ( ) -option ( GRAPHBLAS_COMPACT "ON: do not compile FactoryKernels. OFF (default): compile FactoryKernels" OFF ) +option ( GRAPHBLAS_COMPACT "ON: do not compile FactoryKernels. OFF (default): compile FactoryKernels" ON ) option ( GRAPHBLAS_USE_JIT "ON (default): use the CPU JIT. OFF: do not use the CPU JIT" ON ) if ( GRAPHBLAS_USE_JIT ) diff --git a/notes.txt b/notes.txt new file mode 100644 index 0000000000..ab581669dc --- /dev/null +++ b/notes.txt @@ -0,0 +1,124 @@ +Structure of JIT kernel source (CPU): + +Enums: +GB_jit_family + - Enum mapping family name (i.e. GB_jit_ewise_family) + - Family of methods supported by the JIT + - Branches off into individual kernels/kcodes +GB_jit_kcode: + - Enum mapping kcode names (i.e. GB_JIT_KERNEL_ROWSCALE) to a kcode number + - CUDA kcodes: >= 1000 + +Structs: +GB_jit_encoding + - Tracks code, kcode, and suffix_len of a problem instance + - code: pinpoints specific instance of problem + - kcode: pinpoints which kernel + - suffix_len: length of kname suffix (may be needed for user-defined types/operators) + +Process: +1. Encodifying: + - Happens in the jit entry point (*_jit functions) + - Calls GB_encodify_{family_name} + - Encodify takes the objects needed for encodifying that family, and the kcode + - For reduce, the input objects would be a monoid and input matrix + - For select, right now needs output characteristics, indexunaryop used for selecting, input matrix, and some other things + - The actual output matrix is not always needed, but may be in certain cases to determine if e.g. atomics are available + - Encodify gives a GB_jit_encoding, the kname suffix, and returns a hash of the entire encoding + - The hash will be invalid (UINT64_MAX) if the encoding is invalid + + a. Enumifying: + - Happens as a step during encodifying + - enumify function exists for all jit families, but extra enumifies may exist where + needed in order to compute family-level enumifies (for example, enumify_sparsity) + - Enumify takes the objects needed to be enumified + - Enumify gives the rcode. Some enumifies don't use too many bits for their rcodes. + Others (like mxm) use a lot. + +2. GB_jitifyer_load + - Main entry point to the JIT + - Takes the family, kname, encoding hash, encoding, kname suffix + - Also takes 5 objects: A semiring, monoid, operator, and 3 types + - These are optional, and depend on the kernel being jitifyed. + - Gives the function to be called + + a. Preliminary steps + - Determines if JIT is enabled (GB_jit_control) + - JIT can be in 5 modes: GxB_JIT_{OFF | PAUSE | RUN | LOAD | ON} + - If in RUN mode and not jitting a user type/op, attempts to lookup in table and run + - Load vs. looking up: Load means dlopen the library + + b. Goes to GB_jitifyer_worker + +3. GB_jitifyer_worker + - Worker function that does hash table lookup, followed by kernel load/compile + - Takes same input as GB_jitifyer_load + - Guarded by critical section: only one thread per process may invoke at a time + - Further, since load/compile alters the filesystem, mutual exclusion must be + enforced across processes. For this reason, a file lock is used. + + a. Performs hash table lookup for function + - Quits early if succeeds + b. Calls macrofy_name to get full kernel_name + c. File locking + d. Calls GB_jitifyer_load_worker, which finishes the load/compile step + + + +Macrofying: + 1. macrofy_preface + - Prints version, date, dislaimer header + - Includes GB_jit_kernel.h + - Setup for kernels + - Includes GB_Template.h which includes all main GraphBLAS headers + - undef's structure access macros to be redefined below + 2. macrofy_family + - Prints the family-relevant macros + - Starts by switching over kernel family (apply, reduce, mxm, ...) + - Low-level macrofy extracts problem characteristics from + encoding code + - Uses macrofy_input to print macros for matrix access + 3. Handle pre-jit case: + #ifndef GB_JIT_RUNTIME ... + #endif + + 4. #include kernel source (named GB_jit_kernel_{kname}.c) + - Will include templates within + - In Source/JitKernels and Source/Template respectively + 5. macrofy_query + - Writes the query function that returns the problem characteristics + using the given encoding + +Old GPU JIT notes: +- Entry point: cpp file like GB_AxB_dot3_cuda_jit.cpp. This is analogous to a *_jit.c file for the CPU jit + - Uses a problem factory to store problem details (i.e. *reduce_factory, *mxm_factory). This is a FileDesc. + - More specifically, the {reduce_factory, mxm_factory, ...} etc. function is called with the problem args to "build" the details + - Uses enumify internally to build the sr_code, source filename with the format "GB_{family}_{sr_code}.h" + - Exposes a macrofy function, that given a FILE* fp, will use the CPU macrofy to dump the family macros (does NOT include the preface, query, etc.) + - Uses a jit factory for things like checking for the function in cache and launching the function + - *cuda_common_jitFactory.hpp: Has compiler flags +- Unlike CPU side, the main code is not in the Templates folder but JitKernels + + + +New GPU JIT notes: +- Moving away from NVIDIA jitifyer, integrating with GraphBLAS JIT +- 3-stage structure: + 1. Entry point (GB_cuda_{problem}.cpp): decides initial things (such as if atomics are available (has_cheeseburger)) + 2. JIT entry (GB_cuda_{problem}_jit.cpp): similar in structure to the CPU jit entries. Computes encoding, calls jitifyer_load, calls returned + function + 3. JitKernel code (JitKernels/GB_jit_kernel_cuda_{problem}.cu): What gets run by the jit. Unlike NVIDIA jitifyer, has host code in it (proto function) + that gets returned by the jitifyer. Advantage of the host proto function: can manage multiple kernel launches in a single run + + +Progress notes: +Kernel development notes: +- Fork GraphBLAS, establish personal branch +- Start with rowscale + - Understand how rowscale works on CPU + - Mainly need to analyze rowscale template code + - Understand structure of CUDA kernel (entry point, jit point, etc.) + +- Rowscale plan: + - Start working on template code + - Work backwards to entry point/jit entry \ No newline at end of file From 6ae36a5b9f5765e6758e4dc26df21bc794567d8d Mon Sep 17 00:00:00 2001 From: Vidith Madhu Date: Tue, 27 Feb 2024 13:40:16 -0600 Subject: [PATCH 02/76] progress on cuda rowscale --- CUDA/GB_cuda_ewise.hpp | 30 +++++++++++ CUDA/GB_cuda_rowscale.cpp | 11 ++-- CUDA/GB_cuda_rowscale_jit.cpp | 52 +++++++++++++++++++ .../JitKernels/GB_jit_kernel_cuda_rowscale.cu | 1 - Source/GB_rowscale.c | 4 +- 5 files changed, 91 insertions(+), 7 deletions(-) create mode 100644 CUDA/GB_cuda_ewise.hpp create mode 100644 CUDA/GB_cuda_rowscale_jit.cpp diff --git a/CUDA/GB_cuda_ewise.hpp b/CUDA/GB_cuda_ewise.hpp new file mode 100644 index 0000000000..07095a5135 --- /dev/null +++ b/CUDA/GB_cuda_ewise.hpp @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// GB_cuda_ewise.hpp: CPU definitions for CUDA ewise operations +//------------------------------------------------------------------------------ + +// SPDX-License-Identifier: Apache-2.0 + +//------------------------------------------------------------------------------ + +#ifndef GB_CUDA_EWISE_H +#define GB_CUDA_EWISE_H + +#include "GB_cuda.hpp" + +GrB_Info GB_cuda_rowscale_jit +( + // output: + GrB_Matrix C, + // input: + GrB_Matrix D, + GrB_Matrix B, + GrB_BinaryOp binaryop, + bool flipxy, + // CUDA stream and launch parameters: + cudaStream_t stream, + int32_t gridsz, + int32_t blocksz +) ; + +#endif + diff --git a/CUDA/GB_cuda_rowscale.cpp b/CUDA/GB_cuda_rowscale.cpp index 9f2089d824..2929fb6559 100644 --- a/CUDA/GB_cuda_rowscale.cpp +++ b/CUDA/GB_cuda_rowscale.cpp @@ -1,5 +1,4 @@ -#include "GraphBLAS_cuda.hpp" -#include "GB_cuda.hpp" +#include "GB_cuda_ewise.hpp" #undef GB_FREE_WORKSPACE #define GB_FREE_WORKSPACE ; @@ -17,11 +16,15 @@ GrB_Info GB_cuda_rowscale ) { // FIXME: use the stream pool - // cudaStream_t stream ; - // CHECK_CUDA (cudaStreamCreate (&stream)) ; + cudaStream_t stream ; + CUDA_OK (cudaStreamCreate (&stream)) ; printf ("Entered GPU rowscale\n") ; + // compute gridsz, blocksz, call GB_cuda_rowscale_jit + + CUDA_OK (cudaStreamSynchronize (stream)) ; + CUDA_OK (cudaStreamDestroy (stream)) ; return GrB_SUCCESS ; } \ No newline at end of file diff --git a/CUDA/GB_cuda_rowscale_jit.cpp b/CUDA/GB_cuda_rowscale_jit.cpp new file mode 100644 index 0000000000..8b178b0091 --- /dev/null +++ b/CUDA/GB_cuda_rowscale_jit.cpp @@ -0,0 +1,52 @@ +#include "GB_cuda_ewise.hpp" + +extern "C" +{ + typedef GB_JIT_CUDA_KERNEL_ROWSCALE_PROTO ((*GB_jit_dl_function)) ; +} + +GrB_Info GB_cuda_rowscale_jit +( + // output: + GrB_Matrix C, + // input: + GrB_Matrix D, + GrB_Matrix B, + GrB_BinaryOp binaryop, + bool flipxy, + // CUDA stream and launch parameters: + cudaStream_t stream, + int32_t gridsz, + int32_t blocksz +) +{ + + //-------------------------------------------------------------------------- + // encodify the problem + //-------------------------------------------------------------------------- + + GB_jit_encoding encoding ; + char *suffix ; + uint64_t hash = GB_encodify_ewise (&encoding, &suffix, + GB_JIT_CUDA_KERNEL_ROWSCALE, false, + false, false, GB_sparsity (C), C->type, NULL, false, false, + binaryop, flipxy, D, B) ; + + //-------------------------------------------------------------------------- + // get the kernel function pointer, loading or compiling it if needed + //-------------------------------------------------------------------------- + + oid *dl_function ; + GrB_Info info = GB_jitifyer_load (&dl_function, + GB_jit_ewise_family, "rowscale", + hash, &encoding, suffix, NULL, NULL, + (GB_Operator) binaryop, C->type, D->type, B->type) ; + if (info != GrB_SUCCESS) return (info) ; + + //-------------------------------------------------------------------------- + // call the jit kernel and return result + //-------------------------------------------------------------------------- + + GB_jit_dl_function GB_jit_kernel = (GB_jit_dl_function) dl_function ; + return (GB_jit_kernel (C, D, B, stream, gridsz, blocksz)) ; +} \ No newline at end of file diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu index 2882741cf5..a50b83cf25 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu @@ -55,7 +55,6 @@ GB_JIT_CUDA_KERNEL_ROWSCALE_PROTO (GB_jit_kernel) dim3 block (blocksz) ; GB_cuda_rowscale_kernel <<>> (C, D, B) ; - cudaStreamSynchronize (stream) ; return (GrB_SUCCESS) ; } \ No newline at end of file diff --git a/Source/GB_rowscale.c b/Source/GB_rowscale.c index b44d0b33c8..7dba96a9d0 100644 --- a/Source/GB_rowscale.c +++ b/Source/GB_rowscale.c @@ -197,8 +197,8 @@ GrB_Info GB_rowscale // C = D*B, row scale with diagonal D info = GrB_NO_VALUE ; #if defined ( GRAPHBLAS_HAS_CUDA ) - if (GB_cuda_rowscale_branch (D, B, mult, flipxy)) { - info = GB_cuda_rowscale (C, D, B, semiring, flipxy) ; + if (GB_cuda_rowscale_branch (D, B, mult, flipxy)) { + info = GB_cuda_rowscale (C, D, B, mult, flipxy) ; } #endif From 5e4e6074de04e8569c3276265a6b3593d19f3515 Mon Sep 17 00:00:00 2001 From: Vidith Madhu Date: Wed, 20 Mar 2024 21:14:57 -0500 Subject: [PATCH 03/76] fixes to cuda rowscale, started on cuda colscale --- CUDA/GB_cuda_rowscale_jit.cpp | 4 +- .../JitKernels/GB_jit_kernel_cuda_colscale.cu | 75 +++++++++++++++++++ .../JitKernels/GB_jit_kernel_cuda_rowscale.cu | 6 +- Source/GB_jitifyer.h | 2 +- notes.txt | 49 +++++++++++- 5 files changed, 127 insertions(+), 9 deletions(-) create mode 100644 CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu diff --git a/CUDA/GB_cuda_rowscale_jit.cpp b/CUDA/GB_cuda_rowscale_jit.cpp index 8b178b0091..c573628f0a 100644 --- a/CUDA/GB_cuda_rowscale_jit.cpp +++ b/CUDA/GB_cuda_rowscale_jit.cpp @@ -36,9 +36,9 @@ GrB_Info GB_cuda_rowscale_jit // get the kernel function pointer, loading or compiling it if needed //-------------------------------------------------------------------------- - oid *dl_function ; + void *dl_function ; GrB_Info info = GB_jitifyer_load (&dl_function, - GB_jit_ewise_family, "rowscale", + GB_jit_ewise_family, "cuda_rowscale", hash, &encoding, suffix, NULL, NULL, (GB_Operator) binaryop, C->type, D->type, B->type) ; if (info != GrB_SUCCESS) return (info) ; diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu new file mode 100644 index 0000000000..f00e5d3651 --- /dev/null +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu @@ -0,0 +1,75 @@ +using namespace cooperative_groups ; + +#define log2_chunk_size 7 +#define chunk_size 128 + +__global__ void GB_cuda_colscale_kernel +( + GrB_Matrix C, + GrB_Matirx A, + GrB_Matrix D +) +{ + + const GB_A_TYPE *__restrict__ Ax = (GB_A_TYPE *) A->x ; + const GB_B_TYPE *__restrict__ Dx = (GB_B_TYPE *) B->x ; + const GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *) C->x ; + + #ifdef GB_JIT_KERNEL + #define A_iso GB_A_ISO + #define D_iso GB_B_ISO + #else + const bool A_iso = A->iso ; + const bool D_iso = D->iso ; + #endif + + #include "GB_cuda_ek_slice.cuh" + + const int64_t *__restrict__ Ai = A->i ; + const int64_t *__restrict__ Ap = A->p ; + GB_A_NVALS (anz) ; + const int64_t anvec = A->nvec ; + + for (int64_t pfirst = blockIdx.x << log2_chunk_size ; + pfirst < anz ; + pfirst += gridDim.x << log2_chunk_size ) + { + int64_t my_chunk_size, anvec_sub1 ; + float slope ; + int64_t kfirst = GB_cuda_ek_slice_setup (Ap, anvec, anz, pfirst, + chunk_size, &my_chunk_size, &anvec_sub1, &slope) ; + + // alternate: + // why not just do ek_slice_setup for one thread per block then this_thread_block.sync()? + + for (int64_t curr_p = threadIdx.x ; curr_p < my_chunk_size ; curr_p += blockDim.x) + { + int64_t k = GB_cuda_ek_slice_entry (curr_p, pfirst, Ap, anvec_sub1, kfirst, slope) ; + + GB_DECLAREB (dii) ; + GB_GETB (dii, Dx, k, D_iso) ; + GB_DECLAREA (aij) ; + GB_GETA (aij, Ax, pfirst + curr_p, A_iso) ; + GB_EWISEOP (Cx, pfirst + curr_p, aij, dii, 0, 0) ; + } + } +} + +extern "C" { + GB_JIT_CUDA_KERNEL_COLSCALE_PROTO (GB_jit_kernel) ; +} + +GB_JIT_CUDA_KERNEL_COLSCALE_PROTO (GB_jit_kernel) +{ + ASSERT (GB_JUMBLED_OK (C)) ; + ASSERT (GB_JUMBLED_OK (A)) ; + ASSERT (!GB_JUMBLED (D)) ; + ASSERT (!C->iso) ; + + dim3 grid (gridsz) ; + dim3 block (blocksz) ; + + GB_cuda_colscale_kernel <<>> (C, A, D) ; + + return (GrB_SUCCESS) ; +} \ No newline at end of file diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu index a50b83cf25..8602847b72 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu @@ -9,7 +9,7 @@ __global__ void GB_cuda_rowscale_kernel { const GB_A_TYPE *__restrict__ Dx = (GB_A_TYPE *) D->x ; const GB_B_TYPE *__restrict__ Bx = (GB_B_TYPE *) B->x ; - GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *) C->x ; + const GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *) C->x ; #ifdef GB_JIT_KERNEL #define D_iso GB_A_ISO @@ -27,9 +27,7 @@ __global__ void GB_cuda_rowscale_kernel // ntasks = GB_IMIN (bnz, ntasks) ; take care of this when setting gridsz/blocksz int tid = blockIdx.x * blockDim.x + threadIdx.x; - int64_t pstart, pend ; - GB_PARTITION (pstart, pend, bnz, tid, ntasks) ; - for (int64_t p = pstart ; p < pend ; p++) + for (int64_t p = tid ; p < bnz ; p += ntasks) { int64_t i = GBI_B (Bi, p, bvlen) ; // get row index of B(i,j) GB_DECLAREA (dii) ; diff --git a/Source/GB_jitifyer.h b/Source/GB_jitifyer.h index cd75830a2b..09729ddadc 100644 --- a/Source/GB_jitifyer.h +++ b/Source/GB_jitifyer.h @@ -186,8 +186,8 @@ typedef enum // ewise methods: // ... GB_JIT_CUDA_KERNEL_ROWSCALE = 1011, + GB_JIT_CUDA_KERNEL_COLSCALE = 1012, // ... - } GB_jit_kcode ; diff --git a/notes.txt b/notes.txt index ab581669dc..34d06dd0f4 100644 --- a/notes.txt +++ b/notes.txt @@ -64,6 +64,11 @@ Process: d. Calls GB_jitifyer_load_worker, which finishes the load/compile step +4. GB_jitifyer_load_worker + - Does main load/compile work, inside both intra-process (critical section) and inter-process (file lock) + guards + a. Checks if kernel is already compiled + b. Macrofying: 1. macrofy_preface @@ -73,6 +78,7 @@ Macrofying: - Includes GB_Template.h which includes all main GraphBLAS headers - undef's structure access macros to be redefined below 2. macrofy_family + - Main part of macrofy - Prints the family-relevant macros - Starts by switching over kernel family (apply, reduce, mxm, ...) - Low-level macrofy extracts problem characteristics from @@ -119,6 +125,45 @@ Kernel development notes: - Mainly need to analyze rowscale template code - Understand structure of CUDA kernel (entry point, jit point, etc.) -- Rowscale plan: +- Overall plan: - Start working on template code - - Work backwards to entry point/jit entry \ No newline at end of file + - Work backwards to entry point/jit entry + +- Rowscale notes: + - Do NOT use GB_PARTITION to divide work for threads + - Do not want consecutive threads operating on blocks of data + with large separation between them, since they will reside on the + same warp and cause locality issues. This means that each thread should + "jump" through the data by the grid/block size. + +- Colscale notes: + - Key idea: At the kernel level, generally all matrices are viewed as being stored by column + - Issue with colscale: Cannot easily identify the column that an entry belongs to + - cuda_ek_slice: slices e entries among ntasks tasks + - Applies only for sparse/hypersparse formats + - Example: CUDA/Template/GB_cuda_jit_AxB_dot3_dense_phase1 + - Core idea: + - Divide work into chunks (size of chunk given by max_pchunk) + - One threadblock may own multiple chunks; staggered + - blk 0 will start at chunk 0, then chunk gridDim, then gridDim * 2, ... + - hybrid approach for work distribution; thread allocation contiguous within chunks but jumps across chunks + + - 3 components: + 1. cuda_ek_slice + - Takes Ap, anvec, anz, pfirst (first entry of work for this threadblock), + max_pchunk + - Computes ks for all entries in the given chunk [pfirst, min(pfirst + max_pchunk - 1, anz - 1)] + 2. cuda_ek_slice_setup + - Gives the kfirst/klast estimates, slope + - slope: rate at which k changes w.r.t one step of p + - sparser matrices -> bigger slope (intuition) + 3. cuda_ek_slice_entry + - Uses estimates + slope from ek_slice_setup to get an exact + k-value for a p-value + +- Apply notes: + - Can use a unary op, index unary op, or binary op + - Entry point: GB_apply + a. ... + - Main work: GB_apply_op + From 6682e714f5823be020ed31778b79d4cd2caaaf37 Mon Sep 17 00:00:00 2001 From: Vidith Madhu Date: Thu, 21 Mar 2024 00:57:31 -0500 Subject: [PATCH 04/76] Got cuda rowscale working - kernel compiles and passes LAGraph tests --- CUDA/GB_cuda_rowscale.cpp | 17 ++++++++++++++--- CUDA/GB_cuda_rowscale_branch.cpp | 5 ++--- CUDA/GB_cuda_rowscale_jit.cpp | 2 +- CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu | 4 ++-- Source/GB_rowscale.c | 5 ++--- 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/CUDA/GB_cuda_rowscale.cpp b/CUDA/GB_cuda_rowscale.cpp index 2929fb6559..2cbff2f21e 100644 --- a/CUDA/GB_cuda_rowscale.cpp +++ b/CUDA/GB_cuda_rowscale.cpp @@ -6,6 +6,9 @@ #undef GB_FREE_ALL #define GB_FREE_ALL ; +#define BLOCK_SIZE 128 +#define LOG2_BLOCK_SIZE 7 + GrB_Info GB_cuda_rowscale ( GrB_Matrix C, @@ -19,12 +22,20 @@ GrB_Info GB_cuda_rowscale cudaStream_t stream ; CUDA_OK (cudaStreamCreate (&stream)) ; - printf ("Entered GPU rowscale\n") ; - // compute gridsz, blocksz, call GB_cuda_rowscale_jit + GrB_Index bnz ; + GrB_Matrix_nvals (&bnz, B) ; + int32_t gridsz = 1 + (bnz >> LOG2_BLOCK_SIZE) ; + + GrB_Info info = GB_cuda_rowscale_jit ( C, D, B, + semiring->multiply, flipxy, stream, gridsz, BLOCK_SIZE) ; + + if (info == GrB_NO_VALUE) info = GrB_PANIC ; + GB_OK (info) ; + CUDA_OK (cudaStreamSynchronize (stream)) ; CUDA_OK (cudaStreamDestroy (stream)) ; return GrB_SUCCESS ; -} \ No newline at end of file +} diff --git a/CUDA/GB_cuda_rowscale_branch.cpp b/CUDA/GB_cuda_rowscale_branch.cpp index cf4aca71b4..c9e164d35c 100644 --- a/CUDA/GB_cuda_rowscale_branch.cpp +++ b/CUDA/GB_cuda_rowscale_branch.cpp @@ -9,12 +9,11 @@ bool GB_cuda_rowscale_branch const bool flipxy ) { - if (!GB_cuda_type_branch (D->type) || + if (!GB_cuda_type_branch (D->type) || !GB_cuda_type_branch (B->type) || !GB_cuda_type_branch (semiring->multiply->ztype)) { return false; } - return true; -} \ No newline at end of file +} diff --git a/CUDA/GB_cuda_rowscale_jit.cpp b/CUDA/GB_cuda_rowscale_jit.cpp index c573628f0a..abb8fd9b3a 100644 --- a/CUDA/GB_cuda_rowscale_jit.cpp +++ b/CUDA/GB_cuda_rowscale_jit.cpp @@ -49,4 +49,4 @@ GrB_Info GB_cuda_rowscale_jit GB_jit_dl_function GB_jit_kernel = (GB_jit_dl_function) dl_function ; return (GB_jit_kernel (C, D, B, stream, gridsz, blocksz)) ; -} \ No newline at end of file +} diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu index 8602847b72..ef18161931 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu @@ -9,7 +9,7 @@ __global__ void GB_cuda_rowscale_kernel { const GB_A_TYPE *__restrict__ Dx = (GB_A_TYPE *) D->x ; const GB_B_TYPE *__restrict__ Bx = (GB_B_TYPE *) B->x ; - const GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *) C->x ; + GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *) C->x ; #ifdef GB_JIT_KERNEL #define D_iso GB_A_ISO @@ -55,4 +55,4 @@ GB_JIT_CUDA_KERNEL_ROWSCALE_PROTO (GB_jit_kernel) GB_cuda_rowscale_kernel <<>> (C, D, B) ; return (GrB_SUCCESS) ; -} \ No newline at end of file +} diff --git a/Source/GB_rowscale.c b/Source/GB_rowscale.c index 7dba96a9d0..ae52a5a375 100644 --- a/Source/GB_rowscale.c +++ b/Source/GB_rowscale.c @@ -73,7 +73,6 @@ GrB_Info GB_rowscale // C = D*B, row scale with diagonal D //-------------------------------------------------------------------------- // determine if C is iso (ignore the monoid since it isn't used) //-------------------------------------------------------------------------- - size_t zsize = ztype->size ; GB_void cscalar [GB_VLA(zsize)] ; bool C_iso = GB_AxB_iso (cscalar, D, B, D->vdim, semiring, flipxy, true) ; @@ -197,8 +196,8 @@ GrB_Info GB_rowscale // C = D*B, row scale with diagonal D info = GrB_NO_VALUE ; #if defined ( GRAPHBLAS_HAS_CUDA ) - if (GB_cuda_rowscale_branch (D, B, mult, flipxy)) { - info = GB_cuda_rowscale (C, D, B, mult, flipxy) ; + if (GB_cuda_rowscale_branch (D, B, semiring, flipxy)) { + info = GB_cuda_rowscale (C, D, B, semiring, flipxy) ; } #endif From e1b58dc85e6814188abd8862fb841109b19250fe Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Thu, 21 Mar 2024 08:16:59 -0500 Subject: [PATCH 05/76] bug fix for GB_add_phase0 --- Config/GraphBLAS.h.in | 4 +- Demo/Program/gauss_demo.c | 2 - Demo/Program/import_demo.c | 1 - Demo/Program/kron_demo.c | 1 - Demo/Program/openmp2_demo.c | 1 - Demo/Program/openmp_demo.c | 1 - Demo/Program/reduce_demo.c | 3 - Demo/Program/wildtype_demo.c | 1 - Doc/ChangeLog | 5 +- Doc/GraphBLAS_UserGuide.tex | 6 +- GraphBLAS/rename/GB_rename.h | 24 + Include/GraphBLAS.h | 4 +- Source/GB.h | 3 - Source/GB_add_phase0.c | 4 +- Source/GB_init.c | 4 +- Tcov/.gitignore | 2 + Tcov/log_GB_mex_test21.txt | 2574 --------------------- Test/.gitignore | 2 + Test/GB_mex_test16.c | 2 +- Test/GB_mex_test21.c | 2 +- Test/GB_mex_test9.c | 2 +- Test/log_GB_mex_test21.txt | 2574 --------------------- Test/test169.m | 49 + Test/testall.m | 1 + Test/unused/{test169.m => test169_orig.m} | 0 cmake_modules/GraphBLAS_JIT_paths.cmake | 2 +- cmake_modules/GraphBLAS_version.cmake | 4 +- 27 files changed, 102 insertions(+), 5176 deletions(-) create mode 100644 Tcov/.gitignore delete mode 100644 Tcov/log_GB_mex_test21.txt create mode 100644 Test/.gitignore delete mode 100644 Test/log_GB_mex_test21.txt create mode 100644 Test/test169.m rename Test/unused/{test169.m => test169_orig.m} (100%) diff --git a/Config/GraphBLAS.h.in b/Config/GraphBLAS.h.in index eb5cded8cc..0dbdd56fe8 100644 --- a/Config/GraphBLAS.h.in +++ b/Config/GraphBLAS.h.in @@ -3975,7 +3975,7 @@ GrB_Info GxB_Context_get (GxB_Context, GxB_Context_Field, ...) ; _Generic \ ( \ (arg1), \ - default : GxB_Global_Option_set , \ + default: GxB_Global_Option_set , \ GxB_Option_Field : GxB_Global_Option_set , \ GrB_Vector : GxB_Vector_Option_set , \ GrB_Matrix : GxB_Matrix_Option_set , \ @@ -3988,7 +3988,7 @@ GrB_Info GxB_Context_get (GxB_Context, GxB_Context_Field, ...) ; _Generic \ ( \ (arg1), \ - default : GxB_Global_Option_get , \ + default: GxB_Global_Option_get , \ GxB_Option_Field : GxB_Global_Option_get , \ GrB_Vector : GxB_Vector_Option_get , \ GrB_Matrix : GxB_Matrix_Option_get , \ diff --git a/Demo/Program/gauss_demo.c b/Demo/Program/gauss_demo.c index cec3a577e2..b32ec76b06 100644 --- a/Demo/Program/gauss_demo.c +++ b/Demo/Program/gauss_demo.c @@ -7,7 +7,6 @@ //------------------------------------------------------------------------------ -// #include "GraphBLAS.h" #include "graphblas_demos.h" #undef I @@ -205,7 +204,6 @@ int main (void) // start GraphBLAS GrB_Info info = GrB_SUCCESS ; TRY (GrB_init (GrB_NONBLOCKING)) ; - TRY (GxB_Global_Option_set (GxB_BURBLE, true)) ; // try using cmake to build all JIT kernels, just as a test. This setting diff --git a/Demo/Program/import_demo.c b/Demo/Program/import_demo.c index 335ab2e01e..410742018a 100644 --- a/Demo/Program/import_demo.c +++ b/Demo/Program/import_demo.c @@ -32,7 +32,6 @@ int main (int argc, char **argv) GrB_Matrix A = NULL ; GrB_Info info ; OK (GrB_init (GrB_NONBLOCKING)) ; - int nthreads ; OK (GxB_Global_Option_get (GxB_GLOBAL_NTHREADS, &nthreads)) ; fprintf (stderr, "import_demo: nthreads: %d\n", nthreads) ; diff --git a/Demo/Program/kron_demo.c b/Demo/Program/kron_demo.c index 5ae2b53ead..acbd3bd84a 100644 --- a/Demo/Program/kron_demo.c +++ b/Demo/Program/kron_demo.c @@ -59,7 +59,6 @@ int main (int argc, char **argv) GrB_Info info ; OK (GrB_init (GrB_NONBLOCKING)) ; - int nthreads ; OK (GxB_Global_Option_get (GxB_GLOBAL_NTHREADS, &nthreads)) ; fprintf (stderr, "kron demo: nthreads %d\n", nthreads) ; diff --git a/Demo/Program/openmp2_demo.c b/Demo/Program/openmp2_demo.c index 49e79f1a4b..fbd35df6ea 100644 --- a/Demo/Program/openmp2_demo.c +++ b/Demo/Program/openmp2_demo.c @@ -85,7 +85,6 @@ int main (int argc, char **argv) // start GraphBLAS OK (GrB_init (GrB_NONBLOCKING)) ; - int nthreads ; OK (GxB_Global_Option_get (GxB_GLOBAL_NTHREADS, &nthreads)) ; int ver [3] ; diff --git a/Demo/Program/openmp_demo.c b/Demo/Program/openmp_demo.c index 1ca6a2a236..c021a0b9b7 100644 --- a/Demo/Program/openmp_demo.c +++ b/Demo/Program/openmp_demo.c @@ -129,7 +129,6 @@ int main (int argc, char **argv) // start GraphBLAS OK (GrB_init (GrB_NONBLOCKING)) ; - int nthreads ; OK (GxB_Global_Option_get (GxB_GLOBAL_NTHREADS, &nthreads)) ; fprintf (stderr, "openmp demo, nthreads %d\n", nthreads) ; diff --git a/Demo/Program/reduce_demo.c b/Demo/Program/reduce_demo.c index 7313a0b3e2..303cca39a4 100644 --- a/Demo/Program/reduce_demo.c +++ b/Demo/Program/reduce_demo.c @@ -7,9 +7,7 @@ //------------------------------------------------------------------------------ -// #include "GraphBLAS.h" #include "graphblas_demos.h" - #undef I #if defined ( _OPENMP ) #include @@ -27,7 +25,6 @@ int main (void) // start GraphBLAS GrB_init (GrB_NONBLOCKING) ; - int nthreads ; GxB_Global_Option_get (GxB_GLOBAL_NTHREADS, &nthreads) ; printf ("demo: reduce a matrix to a scalar, nthreads: %d\n", nthreads) ; diff --git a/Demo/Program/wildtype_demo.c b/Demo/Program/wildtype_demo.c index d971399c32..36e312746e 100644 --- a/Demo/Program/wildtype_demo.c +++ b/Demo/Program/wildtype_demo.c @@ -10,7 +10,6 @@ // Each "scalar" entry of this type consists of a 4x4 matrix and a string of // length 64. -// #include "GraphBLAS.h" #include "graphblas_demos.h" #undef I diff --git a/Doc/ChangeLog b/Doc/ChangeLog index 04b3ba30fd..e1ef26ee59 100644 --- a/Doc/ChangeLog +++ b/Doc/ChangeLog @@ -1,4 +1,4 @@ -Feb XX, 2024: version 9.1.0 +Mar 22, 2024: version 9.1.0 * minor updates to build system * C11 complex type detection: this is now detected and configured by @@ -9,6 +9,9 @@ Feb XX, 2024: version 9.1.0 GraphBLAS.h to indicate which kind of complex data types are available in C11 or MSVC. Contributed by Markus Mützel. * port to clang-cl: fixing the GxB_get and GxB_set macro + * (53) bug fix: eWiseAdd C=A+B when M, A, and B are all hypersparse; + access to M was incorrect (also affects C+=T for any operation, if + M and T are both hypersparse). Mar 1, 2024: version 9.0.3 diff --git a/Doc/GraphBLAS_UserGuide.tex b/Doc/GraphBLAS_UserGuide.tex index f01375178e..598b4c7484 100644 --- a/Doc/GraphBLAS_UserGuide.tex +++ b/Doc/GraphBLAS_UserGuide.tex @@ -14768,7 +14768,7 @@ \section{Release Notes} \begin{itemize} -\item Feb XX, 2024: version 9.1.0 % FIXME for SuiteSparse 7.7.0 +\item Mar 22, 2024: version 9.1.0 \begin{itemize} \item minor updates to build system @@ -14780,6 +14780,10 @@ \section{Release Notes} \verb'GxB_HAVE_COMPLEX*' to GraphBLAS.h to indicate which kind of complex data types are available in C11 or MSVC. Contributed by Markus M\"{u}tzel. + \item (53) bug fix: eWiseAdd \verb'C=A+B' when \verb'M', \verb'A', + and \verb'B' are all hypersparse; access to \verb'M' was incorrect + (also affects \verb'C+=T' for any operation, if \verb'M' and + \verb'T' are both hypersparse). \end{itemize} \item Mar 1, 2024: version 9.0.3 diff --git a/GraphBLAS/rename/GB_rename.h b/GraphBLAS/rename/GB_rename.h index a2a7b272ee..d3362f4ee5 100644 --- a/GraphBLAS/rename/GB_rename.h +++ b/GraphBLAS/rename/GB_rename.h @@ -535,6 +535,7 @@ #define GB_jitifyer_get_C_link_flags GM_jitifyer_get_C_link_flags #define GB_jitifyer_get_control GM_jitifyer_get_control #define GB_jitifyer_get_C_preface GM_jitifyer_get_C_preface +#define GB_jitifyer_get_CUDA_preface GM_jitifyer_get_CUDA_preface #define GB_jitifyer_get_error_log GM_jitifyer_get_error_log #define GB_jitifyer_get_use_cmake GM_jitifyer_get_use_cmake #define GB_jitifyer_hash_encoding GM_jitifyer_hash_encoding @@ -544,6 +545,7 @@ #define GB_jitifyer_load GM_jitifyer_load #define GB_jitifyer_load_worker GM_jitifyer_load_worker #define GB_jitifyer_lookup GM_jitifyer_lookup +#define GB_jitifyer_nvcc_compile GM_jitifyer_nvcc_compile #define GB_jitifyer_path_256 GM_jitifyer_path_256 #define GB_jitifyer_query GM_jitifyer_query #define GB_jitifyer_set_cache_path GM_jitifyer_set_cache_path @@ -561,6 +563,8 @@ #define GB_jitifyer_set_control GM_jitifyer_set_control #define GB_jitifyer_set_C_preface GM_jitifyer_set_C_preface #define GB_jitifyer_set_C_preface_worker GM_jitifyer_set_C_preface_worker +#define GB_jitifyer_set_CUDA_preface GM_jitifyer_set_CUDA_preface +#define GB_jitifyer_set_CUDA_preface_worker GM_jitifyer_set_CUDA_preface_worker #define GB_jitifyer_set_error_log GM_jitifyer_set_error_log #define GB_jitifyer_set_error_log_worker GM_jitifyer_set_error_log_worker #define GB_jitifyer_set_use_cmake GM_jitifyer_set_use_cmake @@ -696,8 +700,27 @@ #define GB_JITpackage_214 GM_JITpackage_214 #define GB_JITpackage_215 GM_JITpackage_215 #define GB_JITpackage_216 GM_JITpackage_216 +#define GB_JITpackage_217 GM_JITpackage_217 +#define GB_JITpackage_218 GM_JITpackage_218 +#define GB_JITpackage_219 GM_JITpackage_219 #define GB_JITpackage_21 GM_JITpackage_21 +#define GB_JITpackage_220 GM_JITpackage_220 +#define GB_JITpackage_221 GM_JITpackage_221 +#define GB_JITpackage_222 GM_JITpackage_222 +#define GB_JITpackage_223 GM_JITpackage_223 +#define GB_JITpackage_224 GM_JITpackage_224 +#define GB_JITpackage_225 GM_JITpackage_225 +#define GB_JITpackage_226 GM_JITpackage_226 +#define GB_JITpackage_227 GM_JITpackage_227 +#define GB_JITpackage_228 GM_JITpackage_228 +#define GB_JITpackage_229 GM_JITpackage_229 #define GB_JITpackage_22 GM_JITpackage_22 +#define GB_JITpackage_230 GM_JITpackage_230 +#define GB_JITpackage_231 GM_JITpackage_231 +#define GB_JITpackage_232 GM_JITpackage_232 +#define GB_JITpackage_233 GM_JITpackage_233 +#define GB_JITpackage_234 GM_JITpackage_234 +#define GB_JITpackage_235 GM_JITpackage_235 #define GB_JITpackage_23 GM_JITpackage_23 #define GB_JITpackage_24 GM_JITpackage_24 #define GB_JITpackage_25 GM_JITpackage_25 @@ -885,6 +908,7 @@ #define GB_macrofy_input GM_macrofy_input #define GB_macrofy_mask GM_macrofy_mask #define GB_macrofy_monoid GM_macrofy_monoid +#define GB_macrofy_multadd GM_macrofy_multadd #define GB_macrofy_mxm GM_macrofy_mxm #define GB_macrofy_name GM_macrofy_name #define GB_macrofy_nvals GM_macrofy_nvals diff --git a/Include/GraphBLAS.h b/Include/GraphBLAS.h index a15b92f04b..b0f9baf691 100644 --- a/Include/GraphBLAS.h +++ b/Include/GraphBLAS.h @@ -3975,7 +3975,7 @@ GrB_Info GxB_Context_get (GxB_Context, GxB_Context_Field, ...) ; _Generic \ ( \ (arg1), \ - default : GxB_Global_Option_set , \ + default: GxB_Global_Option_set , \ GxB_Option_Field : GxB_Global_Option_set , \ GrB_Vector : GxB_Vector_Option_set , \ GrB_Matrix : GxB_Matrix_Option_set , \ @@ -3988,7 +3988,7 @@ GrB_Info GxB_Context_get (GxB_Context, GxB_Context_Field, ...) ; _Generic \ ( \ (arg1), \ - default : GxB_Global_Option_get , \ + default: GxB_Global_Option_get , \ GxB_Option_Field : GxB_Global_Option_get , \ GrB_Vector : GxB_Vector_Option_get , \ GrB_Matrix : GxB_Matrix_Option_get , \ diff --git a/Source/GB.h b/Source/GB.h index b207e7e8de..1ee458b44f 100644 --- a/Source/GB.h +++ b/Source/GB.h @@ -19,8 +19,6 @@ #endif #include "GB_static_header.h" #include "GB_positional.h" -// #include "GB_casting.h" -// #include "GB_math.h" #include "GB_bitwise.h" #include "GB_check.h" #include "GB_nnz.h" @@ -53,7 +51,6 @@ #include "GB_cast.h" #include "GB_wait.h" #include "GB_convert.h" -// #include "GB_ops.h" #include "GB_where.h" #include "GB_Context.h" #include "GB_cuda_gateway.h" diff --git a/Source/GB_add_phase0.c b/Source/GB_add_phase0.c index 067eded6b7..a965bf5486 100644 --- a/Source/GB_add_phase0.c +++ b/Source/GB_add_phase0.c @@ -677,8 +677,8 @@ GrB_Info GB_add_phase0 // find vectors in C for C=A+B or C=A+B GB_OK (GB_hyper_hash_build (M, Werk)) ; const int64_t *restrict M_Yp = (M->Y == NULL) ? NULL : M->Y->p ; - const int64_t *restrict M_Yi = (M->Y == NULL) ? NULL : M->Y->p ; - const int64_t *restrict M_Yx = (M->Y == NULL) ? NULL : M->Y->p ; + const int64_t *restrict M_Yi = (M->Y == NULL) ? NULL : M->Y->i ; + const int64_t *restrict M_Yx = (M->Y == NULL) ? NULL : M->Y->x ; const int64_t M_hash_bits = (M->Y == NULL) ? 0 : (M->Y->vdim - 1) ; int64_t k ; diff --git a/Source/GB_init.c b/Source/GB_init.c index 63d57d1367..c3d6e6d253 100644 --- a/Source/GB_init.c +++ b/Source/GB_init.c @@ -198,10 +198,12 @@ GrB_Info GB_init // start up GraphBLAS //-------------------------------------------------------------------------- #pragma omp flush + #if defined ( GRAPHBLAS_HAS_CUDA ) // this hack_get setting is used by GB_ngpus_to_use: // GB_Global_hack_set (2,0) ; // HACK FIXME: default: GPU for big enough probs - GB_Global_hack_set (2,1) ; // HACK FIXME: force the GPU always to be used +// GB_Global_hack_set (2,1) ; // HACK FIXME: force the GPU always to be used // GB_Global_hack_set (2,2) ; // HACK FIXME: force the GPU never to be used + #endif return (GrB_SUCCESS) ; } diff --git a/Tcov/.gitignore b/Tcov/.gitignore new file mode 100644 index 0000000000..8faafc0802 --- /dev/null +++ b/Tcov/.gitignore @@ -0,0 +1,2 @@ +# ignore these files +log_GB_mex_test21.txt diff --git a/Tcov/log_GB_mex_test21.txt b/Tcov/log_GB_mex_test21.txt deleted file mode 100644 index 369fe5ae07..0000000000 --- a/Tcov/log_GB_mex_test21.txt +++ /dev/null @@ -1,2574 +0,0 @@ - - -================================================================================ -GB_macrofy_cast_output, ztype NULL -#define GB_PUTC(z,Cx,p) - - -================================================================================ -GB_macrofy_cast_output, cast FC64 to bool -#define GB_PUTC(z,Cx,p) Cx [p] = (GB_creal (z) != 0 || GB_cimag (z) != 0) - - -================================================================================ -GB_assign_describe -C = A - - -================================================================================ -GB_enumify_ewise / GB_macrofy_ewise, C iso -// op: symbolic only (C is iso) - -// binary operator types: -#define GB_Z_TYPE void -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// binary operator: -#define GB_BINOP(z,x,y,i,j) -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) -#define GB_COPY_B_to_C(Cx,pC,Bx,pB,B_iso) - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE void -#define GB_PUTC(c,Cx,p) -#define GB_EWISEOP(Cx,p,aij,bij,i,j) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -// B matrix: hypersparse -#define GB_B_IS_HYPER 1 -#define GB_B_IS_SPARSE 0 -#define GB_B_IS_BITMAP 0 -#define GB_B_IS_FULL 0 -#define GBP_B(Bp,k,vlen) Bp [k] -#define GBH_B(Bh,k) Bh [k] -#define GBI_B(Bi,p,vlen) Bi [p] -#define GBB_B(Bb,p) 1 -#define GB_B_NVALS(e) int64_t e = B->nvals -#define GB_B_NHELD(e) GB_B_NVALS(e) -#define GB_B_ISO 0 -#define GB_B_TYPE bool -#define GB_B2TYPE void -#define GB_DECLAREB(b) -#define GB_GETB(b,Bx,p,iso) - -#include "GB_ewise_shared_definitions.h" - - -================================================================================ -GB_enumify_ewise / GB_macrofy_ewise, C non iso -// op: (and, bool) - -// binary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE bool -#define GB_Y_TYPE bool - -// binary operator: -#define GB_BINOP(z,x,y,i,j) z = ((x) && (y)) -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) Cx [pC] = Ax [pA] -#define GB_COPY_B_to_C(Cx,pC,Bx,pB,B_iso) Cx [pC] = Bx [pB] - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(c,Cx,p) Cx [p] = c -#define GB_EWISEOP(Cx,p,aij,bij,i,j) GB_BINOP (Cx [p], aij, bij, i, j) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE bool -#define GB_DECLAREA(a) bool a -#define GB_GETA(a,Ax,p,iso) a = Ax [p] - -// B matrix: hypersparse -#define GB_B_IS_HYPER 1 -#define GB_B_IS_SPARSE 0 -#define GB_B_IS_BITMAP 0 -#define GB_B_IS_FULL 0 -#define GBP_B(Bp,k,vlen) Bp [k] -#define GBH_B(Bh,k) Bh [k] -#define GBI_B(Bi,p,vlen) Bi [p] -#define GBB_B(Bb,p) 1 -#define GB_B_NVALS(e) int64_t e = B->nvals -#define GB_B_NHELD(e) GB_B_NVALS(e) -#define GB_B_ISO 0 -#define GB_B_TYPE bool -#define GB_B2TYPE bool -#define GB_DECLAREB(b) bool b -#define GB_GETB(b,Bx,p,iso) b = Bx [p] - -#include "GB_ewise_shared_definitions.h" - - -================================================================================ -GB_enumify_mxm / GB_macrofy_mxm, C iso -// semiring: symbolic only (C is iso) - -// monoid: -#define GB_Z_TYPE void -#define GB_UPDATE(z,y) -#define GB_ADD(z,x,y) -#define GB_DECLARE_IDENTITY(z) -#define GB_DECLARE_IDENTITY_CONST(z) -#define GB_IS_ANY_MONOID 1 -#define GB_Z_IGNORE_OVERFLOW 1 -#define GB_Z_NBITS 0 -#define GB_Z_ATOMIC_BITS 0 - -// multiplicative operator (flipped): -#define GB_MULT(z,x,y,i,k,j) - -// multiply-add operator: -#define GB_MULTADD(z,x,y,i,k,j) - -// special cases: - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 1 -#define GB_C_TYPE void -#define GB_PUTC(c,Cx,p) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 1 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -// B matrix: hypersparse -#define GB_B_IS_HYPER 1 -#define GB_B_IS_SPARSE 0 -#define GB_B_IS_BITMAP 0 -#define GB_B_IS_FULL 0 -#define GBP_B(Bp,k,vlen) Bp [k] -#define GBH_B(Bh,k) Bh [k] -#define GBI_B(Bi,p,vlen) Bi [p] -#define GBB_B(Bb,p) 1 -#define GB_B_NVALS(e) int64_t e = B->nvals -#define GB_B_NHELD(e) GB_B_NVALS(e) -#define GB_B_ISO 1 -#define GB_B_IS_PATTERN 1 -#define GB_B_TYPE void -#define GB_B2TYPE void -#define GB_DECLAREB(b) -#define GB_GETB(b,Bx,p,iso) - -#include "GB_mxm_shared_definitions.h" - - -================================================================================ -GB_enumify_mxm / GB_macrofy_mxm, any_pair, flipxy -// semiring: symbolic only (C is iso) - -// monoid: -#define GB_Z_TYPE void -#define GB_UPDATE(z,y) -#define GB_ADD(z,x,y) -#define GB_DECLARE_IDENTITY(z) -#define GB_DECLARE_IDENTITY_CONST(z) -#define GB_IS_ANY_MONOID 1 -#define GB_Z_NBITS 0 -#define GB_Z_ATOMIC_BITS 0 - -// multiplicative operator (flipped): -#define GB_MULT(z,x,y,i,k,j) - -// multiply-add operator: -#define GB_MULTADD(z,x,y,i,k,j) - -// special cases: -#define GB_IS_ANY_PAIR_SEMIRING 1 -#define GB_IS_PAIR_MULTIPLIER 1 - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE void -#define GB_PUTC(c,Cx,p) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 1 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -// B matrix: hypersparse -#define GB_B_IS_HYPER 1 -#define GB_B_IS_SPARSE 0 -#define GB_B_IS_BITMAP 0 -#define GB_B_IS_FULL 0 -#define GBP_B(Bp,k,vlen) Bp [k] -#define GBH_B(Bh,k) Bh [k] -#define GBI_B(Bi,p,vlen) Bi [p] -#define GBB_B(Bb,p) 1 -#define GB_B_NVALS(e) int64_t e = B->nvals -#define GB_B_NHELD(e) GB_B_NVALS(e) -#define GB_B_ISO 1 -#define GB_B_IS_PATTERN 1 -#define GB_B_TYPE void -#define GB_B2TYPE void -#define GB_DECLAREB(b) -#define GB_GETB(b,Bx,p,iso) - -#include "GB_mxm_shared_definitions.h" - - -================================================================================ -GB_enumify_mxm / GB_macrofy_mxm, any_pair fp32 -// semiring: (any, pair (flipped), float) - -// monoid: -#define GB_Z_TYPE float -#define GB_ADD(z,x,y) z = y -#define GB_UPDATE(z,y) z = y -#define GB_DECLARE_IDENTITY(z) float z = 0 -#define GB_DECLARE_IDENTITY_CONST(z) const float z = 0 -#define GB_HAS_IDENTITY_BYTE 1 -#define GB_IDENTITY_BYTE 0x00 -#define GB_IS_ANY_MONOID 1 -#define GB_Z_NBITS 32 -#define GB_Z_ATOMIC_BITS 32 -#define GB_Z_HAS_ATOMIC_UPDATE 1 -#define GB_Z_HAS_OMP_ATOMIC_UPDATE 1 -#define GB_Z_HAS_CUDA_ATOMIC_BUILTIN 1 -#define GB_Z_CUDA_ATOMIC GB_cuda_atomic_write -#define GB_Z_CUDA_ATOMIC_TYPE float - -// multiplicative operator (flipped): -#define GB_MULT(z,y,x,j,k,i) z = 1 - -// multiply-add operator: -#define GB_MULTADD(z,y,x,j,k,i) z = 1 - -// special cases: -#define GB_IS_PAIR_MULTIPLIER 1 - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE float -#define GB_PUTC(c,Cx,p) Cx [p] = c - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 1 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -// B matrix: hypersparse -#define GB_B_IS_HYPER 1 -#define GB_B_IS_SPARSE 0 -#define GB_B_IS_BITMAP 0 -#define GB_B_IS_FULL 0 -#define GBP_B(Bp,k,vlen) Bp [k] -#define GBH_B(Bh,k) Bh [k] -#define GBI_B(Bi,p,vlen) Bi [p] -#define GBB_B(Bb,p) 1 -#define GB_B_NVALS(e) int64_t e = B->nvals -#define GB_B_NHELD(e) GB_B_NVALS(e) -#define GB_B_ISO 1 -#define GB_B_IS_PATTERN 1 -#define GB_B_TYPE void -#define GB_B2TYPE void -#define GB_DECLAREB(b) -#define GB_GETB(b,Bx,p,iso) - -#include "GB_mxm_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: rowindex -// op: (rowindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE int32_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((i) + (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_DEPENDS_ON_Y 1 -#define GB_ROWINDEX_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: rowindex -// op: (rowindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((i) + (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_DEPENDS_ON_Y 1 -#define GB_ROWINDEX_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: colindex -// op: (colindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE int32_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) + (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_COLINDEX_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: colindex -// op: (colindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) + (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_COLINDEX_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: diagindex -// op: (diagindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE int32_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) - ((i) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_OFFDIAG_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: diagindex -// op: (diagindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) - ((i) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_OFFDIAG_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: tril -// op: (tril, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) <= ((i) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_TRIL_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: triu -// op: (triu, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) >= ((i) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_TRIU_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: diag -// op: (diag, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) == ((i) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_DIAG_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: offdiag -// op: (offdiag, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) != ((i) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_OFFDIAG_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: colle -// op: (colle, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) <= (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_COLLE_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: colgt -// op: (colgt, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) > (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_COLGT_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: rowle -// op: (rowle, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((i) <= (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_DEPENDS_ON_Y 1 -#define GB_ROWLE_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: rowgt -// op: (rowgt, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((i) > (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_DEPENDS_ON_Y 1 -#define GB_ROWGT_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: flipdiagindex -// op: (flipdiagindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE int32_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((i) - ((j) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_ENTRY_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: flipdiagindex -// op: (flipdiagindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((i) - ((j) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_ENTRY_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: opi32 -// op: opi32func, ztype: GxB_FC32_t, xtype: GxB_FC32_t, ytype: GxB_FC32_t - -// unary operator types: -#define GB_Z_TYPE GxB_FC32_t -#define GB_X_TYPE GxB_FC32_t -#define GB_Y_TYPE GxB_FC32_t - -// index unary operator: -#ifndef GB_GUARD_opi32func_DEFINED -#define GB_GUARD_opi32func_DEFINED -GB_STATIC_INLINE -void opi32func (GxB_FC32_t *z, const GxB_FC32_t *x, GrB_Index i, GrB_Index j, - const GxB_FC32_t *y) -{ - (*z) = (*x) ; -} -#define GB_opi32func_USER_DEFN \ -"void opi32func (GxB_FC32_t *z, const GxB_FC32_t *x, GrB_Index i, GrB_Index j, \n" \ -" const GxB_FC32_t *y) \n" \ -"{ \n" \ -" (*z) = (*x) ; \n" \ -"}" -#endif -#define GB_IDXUNOP(z,x,i,j,y) opi32func (&(z), &(x), i, j, &(y)) -#define GB_DEPENDS_ON_X 1 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_ENTRY_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_DECLAREA (x) ; \ - GB_GETA (x, Ax, p, ) ; \ - GB_IDXUNOP (z, x, i, j, y) ; \ - bool keep = (GB_crealf (z) != 0 || GB_cimagf (z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE GxB_FC32_t - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE GxB_FC32_t -#define GB_A2TYPE GxB_FC32_t -#define GB_DECLAREA(a) GxB_FC32_t a -#define GB_GETA(a,Ax,p,iso) a = Ax [p] - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: one -// op: (one, void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = 1 -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 0 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) \ -{ \ - GB_DECLAREZ (z) ; \ - GB_UNARYOP (z, aij, Ax [pA], , , ) ; \ - GB_PUTC (z, Cx, pC) ; \ -} - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = (int32_t) (c) - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positioni -// op: (positioni, void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (i) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) GB_UNARYOP (Cx [pC], Ax [pA], i, , ) - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = c - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positioni -// op: (positioni, void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (i) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) \ -{ \ - GB_DECLAREZ (z) ; \ - GB_UNARYOP (z, aij, Ax [pA], i, , ) ; \ - GB_PUTC (z, Cx, pC) ; \ -} - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = (int32_t) (c) - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positioni1 -// op: (positioni1, void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (i) + 1 -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) GB_UNARYOP (Cx [pC], Ax [pA], i, , ) - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = c - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positioni1 -// op: (positioni1, void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (i) + 1 -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) \ -{ \ - GB_DECLAREZ (z) ; \ - GB_UNARYOP (z, aij, Ax [pA], i, , ) ; \ - GB_PUTC (z, Cx, pC) ; \ -} - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = (int32_t) (c) - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positionj -// op: (positionj, void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (j) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) GB_UNARYOP (Cx [pC], Ax [pA], , j, ) - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = c - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positionj -// op: (positionj, void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (j) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) \ -{ \ - GB_DECLAREZ (z) ; \ - GB_UNARYOP (z, aij, Ax [pA], , j, ) ; \ - GB_PUTC (z, Cx, pC) ; \ -} - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = (int32_t) (c) - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positionj1 -// op: (positionj1, void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (j) + 1 -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) GB_UNARYOP (Cx [pC], Ax [pA], , j, ) - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = c - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positionj1 -// op: (positionj1, void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (j) + 1 -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) \ -{ \ - GB_DECLAREZ (z) ; \ - GB_UNARYOP (z, aij, Ax [pA], , j, ) ; \ - GB_PUTC (z, Cx, pC) ; \ -} - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = (int32_t) (c) - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: sqrt -// op: (sqrt, GxB_FC64_t) - -// unary operator types: -#define GB_Z_TYPE GxB_FC64_t -#define GB_X_TYPE GxB_FC64_t -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = GB_csqrt (x) -#define GB_DEPENDS_ON_X 1 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 0 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) \ -{ \ - GB_DECLAREA (aij) ; \ - GB_GETA (aij, Ax, pA, ) ; \ - GB_DECLAREZ (z) ; \ - GB_UNARYOP (z, aij, , , ) ; \ - GB_PUTC (z, Cx, pC) ; \ -} - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#ifndef GB_GUARD_GJ_cast_to_int32_DEFINED -#define GB_GUARD_GJ_cast_to_int32_DEFINED -GB_STATIC_INLINE -int32_t GJ_cast_to_int32 (double x) -{ - if (isnan (x)) return (0) ; - if (x <= (double) INT32_MIN) return (INT32_MIN) ; - if (x >= (double) INT32_MAX) return (INT32_MAX) ; - return ((int32_t) x) ; -} -#endif -#define GB_PUTC(c,Cx,p) Cx [p] = GJ_cast_to_int32 (GB_creal (c)) - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_TYPE int32_t -#define GB_A2TYPE GxB_FC64_t -#define GB_DECLAREA(a) GxB_FC64_t a -#define GB_GETA(a,Ax,p,iso) a = (GxB_FC64_t) (Ax [p]) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_build / GB_macrofy_build: times -// op: (times, GxB_FC32_t) - -// binary dup operator types: -#define GB_Z_TYPE GxB_FC32_t -#define GB_X_TYPE GxB_FC32_t -#define GB_Y_TYPE GxB_FC32_t - -// S and T data types: -#define GB_T_TYPE bool -#define GB_S_TYPE bool - -// binary dup operator: -#define GB_DUP(z,x,y) z = GB_FC32_mul (x,y) -#define GB_UPDATE(z,y) GB_DUP(z,z,y) - -// build copy/dup methods: -#define GB_BLD_COPY(Tx,p,Sx,k) Tx [p] = Sx [k] -#define GB_BLD_DUP(Tx,p,Sx,k) \ - GxB_FC32_t y = (GxB_FC32_t) Sx [k] ; \ - GxB_FC32_t x = (GxB_FC32_t) Tx [p] ; \ - GxB_FC32_t z ; \ - GB_DUP (z, x, y) ; \ - Tx [p] = (GB_crealf (z) != 0 || GB_cimagf (z) != 0) ; - -#include "GB_kernel_shared_definitions.h" - - -================================================================================ -GB_enumify_build / GB_macrofy_build: and -// op: (and, bool) - -// binary dup operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE bool -#define GB_Y_TYPE bool - -// S and T data types: -#define GB_T_TYPE GxB_FC32_t -#define GB_S_TYPE GxB_FC32_t - -// binary dup operator: -#define GB_DUP(z,x,y) z = ((x) && (y)) -#define GB_UPDATE(z,y) z &= y - -// build copy/dup methods: -#define GB_BLD_COPY(Tx,p,Sx,k) Tx [p] = Sx [k] -#define GB_BLD_DUP(Tx,p,Sx,k) \ - bool y = (GB_crealf (Sx [k]) != 0 || GB_cimagf (Sx [k]) != 0) ; \ - bool x = (GB_crealf (Tx [p]) != 0 || GB_cimagf (Tx [p]) != 0) ; \ - bool z ; \ - GB_DUP (z, x, y) ; \ - Tx [p] = (GxB_FC32_t) z ; - -#include "GB_kernel_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(lo:hi,lo:hi)=A (assign) -// assign/subassign: C(I,J) = A -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: not present - - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(cwork,Cx,p) Cx [p] = cwork -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) Cx [pC] = Ax [pA] -#define GB_COPY_aij_to_C(Cx,pC,Ax,pA,A_iso,cwork) \ - GB_COPY_A_to_C (Cx, pC, Ax, pA, A_iso) -#define GB_COPY_aij_to_cwork(cwork,Ax,p,iso) cwork = Ax [p] -#define GB_COPY_C_to_xwork(xwork,Cx,p) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(lo:s:hi,lo:s:hi)=A (assign) -// assign/subassign: C(I,J) = A -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_STRIDE -#define GB_J_KIND GB_STRIDE -#define GB_C_REPLACE 0 -// accum: not present - - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(cwork,Cx,p) Cx [p] = cwork -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) Cx [pC] = Ax [pA] -#define GB_COPY_aij_to_C(Cx,pC,Ax,pA,A_iso,cwork) \ - GB_COPY_A_to_C (Cx, pC, Ax, pA, A_iso) -#define GB_COPY_aij_to_cwork(cwork,Ax,p,iso) cwork = Ax [p] -#define GB_COPY_C_to_xwork(xwork,Cx,p) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(i,J)=s (row assign) -// assign/subassign: C(i,J) = A -#define GB_ASSIGN_KIND GB_ROW_ASSIGN -#define GB_I_KIND GB_ALL -#define GB_J_KIND GB_LIST -#define GB_C_REPLACE 0 -// accum: not present - - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(cwork,Cx,p) Cx [p] = cwork -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_scalar_to_cwork(cwork,scalar) cwork = scalar -#define GB_COPY_scalar_to_C(Cx,pC,cwork) Cx [pC] = cwork -#define GB_COPY_C_to_xwork(xwork,Cx,p) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// scalar: -#define GB_A_TYPE bool - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(I,j)=s (col assign) -// assign/subassign: C(I,j) = A -#define GB_ASSIGN_KIND GB_COL_ASSIGN -#define GB_I_KIND GB_LIST -#define GB_J_KIND GB_ALL -#define GB_C_REPLACE 0 -// accum: not present - - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(cwork,Cx,p) Cx [p] = cwork -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_scalar_to_cwork(cwork,scalar) cwork = scalar -#define GB_COPY_scalar_to_C(Cx,pC,cwork) Cx [pC] = cwork -#define GB_COPY_C_to_xwork(xwork,Cx,p) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// scalar: -#define GB_A_TYPE bool - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C_iso(lo:hi,lo:hi)=A (assign) -// assign/subassign: C(I,J) = scalar -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: not present - - -// C matrix: full -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 1 -#define GBP_C(Cp,k,vlen) ((k) * (vlen)) -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) ((p) % (vlen)) -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = 0 ; GB_INT64_MULT (e, C->vlen, C->vdim) -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 1 -#define GB_C_TYPE void -#define GB_PUTC(cwork,Cx,p) -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_scalar_to_cwork(cwork,scalar) cwork = scalar -#define GB_COPY_scalar_to_C(Cx,pC,cwork) -#define GB_COPY_C_to_xwork(xwork,Cx,pC) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// scalar: -#define GB_A_TYPE bool - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C_iso(lo:hi,lo:hi)+=s (assign) -// assign/subassign: C(I,J) += scalar -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: (plus, float) - -// accum operator types: -#define GB_Z_TYPE float -#define GB_X_TYPE float -#define GB_Y_TYPE float -#define GB_DECLAREZ(zwork) float zwork -#define GB_DECLAREX(xwork) float xwork -#define GB_DECLAREY(ywork) float ywork - -// accum operator: -#define GB_UPDATE(z,y) -#define GB_ACCUM_OP(z,x,y) -#define GB_ACCUMULATE_scalar(Cx,pC,ywork) - -// C matrix: full -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 1 -#define GBP_C(Cp,k,vlen) ((k) * (vlen)) -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) ((p) % (vlen)) -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = 0 ; GB_INT64_MULT (e, C->vlen, C->vdim) -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 1 -#define GB_C_TYPE void -#define GB_PUTC(zwork,Cx,p) -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_scalar_to_cwork(cwork,scalar) cwork = scalar -#define GB_COPY_scalar_to_C(Cx,pC,cwork) -#define GB_COPY_C_to_xwork(xwork,Cx,pC) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// scalar: -#define GB_A_TYPE bool -#define GB_COPY_scalar_to_ywork(ywork,scalar) ywork = (float) (scalar) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C_iso(lo:hi,lo:hi)+=s (assign) -// assign/subassign: C(I,J) += scalar -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: (plus, float) - -// accum operator types: -#define GB_Z_TYPE float -#define GB_X_TYPE float -#define GB_Y_TYPE float -#define GB_DECLAREZ(zwork) float zwork -#define GB_DECLAREX(xwork) float xwork -#define GB_DECLAREY(ywork) float ywork - -// accum operator: -#define GB_UPDATE(z,y) -#define GB_ACCUM_OP(z,x,y) -#define GB_ACCUMULATE_scalar(Cx,pC,ywork) - -// C matrix: full -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 1 -#define GBP_C(Cp,k,vlen) ((k) * (vlen)) -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) ((p) % (vlen)) -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = 0 ; GB_INT64_MULT (e, C->vlen, C->vdim) -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 1 -#define GB_C_TYPE void -#define GB_PUTC(zwork,Cx,p) -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_scalar_to_cwork(cwork,scalar) cwork = scalar -#define GB_COPY_scalar_to_C(Cx,pC,cwork) -#define GB_COPY_C_to_xwork(xwork,Cx,pC) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// scalar: -#define GB_A_TYPE bool -#define GB_COPY_scalar_to_ywork(ywork,scalar) ywork = (float) (scalar) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(lo:hi,lo:hi)+=A (assign) -// assign/subassign: C(I,J) += A -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: (plus, float) - -// accum operator types: -#define GB_Z_TYPE float -#define GB_X_TYPE float -#define GB_Y_TYPE float -#define GB_DECLAREZ(zwork) float zwork -#define GB_DECLAREX(xwork) float xwork -#define GB_DECLAREY(ywork) float ywork - -// accum operator: -#define GB_ACCUM_OP(z,x,y) z = (x) + (y) -#define GB_UPDATE(z,y) z += y -#define GB_ACCUMULATE_aij(Cx,pC,Ax,pA,A_iso,ywork) \ -{ \ - GB_DECLAREY (ywork) ; \ - GB_GETA (ywork, Ax, pA, ) ; \ - GB_DECLAREX (xwork) ; \ - GB_COPY_C_to_xwork (xwork, Cx, pC) ; \ - GB_DECLAREZ (zwork) ; \ - GB_ACCUM_OP (zwork, xwork, ywork) ; \ - GB_PUTC (zwork, Cx, pC) ; \ -} - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(zwork,Cx,p) Cx [p] = ((zwork) != 0) -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) Cx [pC] = Ax [pA] -#define GB_COPY_aij_to_C(Cx,pC,Ax,pA,A_iso,cwork) \ - GB_COPY_A_to_C (Cx, pC, Ax, pA, A_iso) -#define GB_COPY_aij_to_cwork(cwork,Ax,p,iso) cwork = Ax [p] -#define GB_COPY_C_to_xwork(xwork,Cx,p) xwork = (float) (Cx [p]) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE float -#define GB_DECLAREA(a) float a -#define GB_GETA(a,Ax,p,iso) a = (float) (Ax [p]) -#define GB_COPY_aij_to_ywork(ywork,Ax,pA,A_iso) GB_GETA (ywork, Ax, pA, A_iso) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(lo:hi,lo:hi)&=A (assign) -// assign/subassign: C(I,J) &= A -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: (and, bool) - -// accum operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE bool -#define GB_Y_TYPE bool -#define GB_DECLAREZ(zwork) bool zwork -#define GB_DECLAREX(xwork) bool xwork -#define GB_DECLAREY(ywork) bool ywork - -// accum operator: -#define GB_ACCUM_OP(z,x,y) z = ((x) && (y)) -#define GB_UPDATE(z,y) z &= y -#define GB_ACCUMULATE_aij(Cx,pC,Ax,pA,A_iso,ywork) \ -{ \ - GB_UPDATE (Cx [pC], Ax [pA]) ; \ -} - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(zwork,Cx,p) Cx [p] = zwork -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) Cx [pC] = Ax [pA] -#define GB_COPY_aij_to_C(Cx,pC,Ax,pA,A_iso,cwork) \ - GB_COPY_A_to_C (Cx, pC, Ax, pA, A_iso) -#define GB_COPY_aij_to_cwork(cwork,Ax,p,iso) cwork = Ax [p] -#define GB_COPY_C_to_xwork(xwork,Cx,p) xwork = Cx [p] - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE bool -#define GB_DECLAREA(a) bool a -#define GB_GETA(a,Ax,p,iso) a = Ax [p] -#define GB_COPY_aij_to_ywork(ywork,Ax,pA,A_iso) GB_GETA (ywork, Ax, pA, A_iso) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(lo:hi,lo:hi)<=A (assign) -// assign/subassign: C(I,J) lt= A -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: (lt, float) - -// accum operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE float -#define GB_Y_TYPE float -#define GB_DECLAREZ(zwork) bool zwork -#define GB_DECLAREX(xwork) float xwork -#define GB_DECLAREY(ywork) float ywork - -// accum operator: -#define GB_ACCUM_OP(z,x,y) z = ((x) < (y)) -#define GB_ACCUMULATE_aij(Cx,pC,Ax,pA,A_iso,ywork) \ -{ \ - GB_DECLAREY (ywork) ; \ - GB_GETA (ywork, Ax, pA, ) ; \ - GB_DECLAREX (xwork) ; \ - GB_COPY_C_to_xwork (xwork, Cx, pC) ; \ - GB_ACCUM_OP (Cx [pC], xwork, ywork) ; \ -} - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(zwork,Cx,p) Cx [p] = zwork -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) Cx [pC] = Ax [pA] -#define GB_COPY_aij_to_C(Cx,pC,Ax,pA,A_iso,cwork) \ - GB_COPY_A_to_C (Cx, pC, Ax, pA, A_iso) -#define GB_COPY_aij_to_cwork(cwork,Ax,p,iso) cwork = Ax [p] -#define GB_COPY_C_to_xwork(xwork,Cx,p) xwork = (float) (Cx [p]) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE float -#define GB_DECLAREA(a) float a -#define GB_GETA(a,Ax,p,iso) a = (float) (Ax [p]) -#define GB_COPY_aij_to_ywork(ywork,Ax,pA,A_iso) GB_GETA (ywork, Ax, pA, A_iso) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C_iso(lo:hi,lo:hi)<=H (assign) -// assign/subassign: C(I,J) lt= A -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: (lt, float) - -// accum operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE float -#define GB_Y_TYPE float -#define GB_DECLAREZ(zwork) bool zwork -#define GB_DECLAREX(xwork) float xwork -#define GB_DECLAREY(ywork) float ywork - -// accum operator: -#define GB_ACCUM_OP(z,x,y) -#define GB_ACCUMULATE_aij(Cx,pC,Ax,pA,A_iso,ywork) - -// C matrix: full -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 1 -#define GBP_C(Cp,k,vlen) ((k) * (vlen)) -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) ((p) % (vlen)) -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = 0 ; GB_INT64_MULT (e, C->vlen, C->vdim) -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 1 -#define GB_C_TYPE void -#define GB_PUTC(zwork,Cx,p) -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) -#define GB_COPY_aij_to_C(Cx,pC,Ax,pA,A_iso,cwork) -#define GB_COPY_aij_to_cwork(cwork,Ax,p,iso) cwork = Ax [p] -#define GB_COPY_C_to_xwork(xwork,Cx,pC) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE float -#define GB_DECLAREA(a) float a -#define GB_GETA(a,Ax,p,iso) a = (float) (Ax [p]) -#define GB_COPY_aij_to_ywork(ywork,Ax,pA,A_iso) GB_GETA (ywork, Ax, pA, A_iso) - -#include "GB_assign_shared_definitions.h" diff --git a/Test/.gitignore b/Test/.gitignore new file mode 100644 index 0000000000..8faafc0802 --- /dev/null +++ b/Test/.gitignore @@ -0,0 +1,2 @@ +# ignore these files +log_GB_mex_test21.txt diff --git a/Test/GB_mex_test16.c b/Test/GB_mex_test16.c index 21e955e111..998f111825 100644 --- a/Test/GB_mex_test16.c +++ b/Test/GB_mex_test16.c @@ -120,7 +120,7 @@ void mexFunction GrB_FP32, NULL, false, false, s, false, A, B) ; CHECK (code == UINT64_MAX) ; - code = GB_encodify_reduce (&e, &suffix, mon, A) ; + code = GB_encodify_reduce (&e, &suffix, GB_JIT_KERNEL_REDUCE, mon, A) ; CHECK (code == UINT64_MAX) ; code = GB_encodify_assign (&e, &suffix, 0, C, false, 0, 0, NULL, diff --git a/Test/GB_mex_test21.c b/Test/GB_mex_test21.c index 37a5bad838..ef7f4c58dc 100644 --- a/Test/GB_mex_test21.c +++ b/Test/GB_mex_test21.c @@ -74,7 +74,7 @@ void mexFunction const char *a, *cuda_type ; bool user_monoid_atomically ; bool has_cheeseburger = GB_enumify_cuda_atomic (&a, - &user_monoid_atomically, &cuda_type, NULL, 0, sizeof (uint16_t), 0) ; + &user_monoid_atomically, &cuda_type, NULL, 0, sizeof (uint32_t), 0) ; CHECK (!has_cheeseburger) ; CHECK (user_monoid_atomically) ; CHECK (cuda_type == NULL) ; diff --git a/Test/GB_mex_test9.c b/Test/GB_mex_test9.c index e4f164c6b8..1f5de9ce09 100644 --- a/Test/GB_mex_test9.c +++ b/Test/GB_mex_test9.c @@ -174,7 +174,7 @@ void mexFunction FILE *fp = fopen ("/tmp/GB_tcov_gunk.h", "w") ; GB_macrofy_binop (fp, "nothing", false, false, false, - 199, false, NULL, NULL, NULL) ; + 199, false, NULL, NULL, NULL, NULL) ; fclose (fp) ; //-------------------------------------------------------------------------- diff --git a/Test/log_GB_mex_test21.txt b/Test/log_GB_mex_test21.txt deleted file mode 100644 index 369fe5ae07..0000000000 --- a/Test/log_GB_mex_test21.txt +++ /dev/null @@ -1,2574 +0,0 @@ - - -================================================================================ -GB_macrofy_cast_output, ztype NULL -#define GB_PUTC(z,Cx,p) - - -================================================================================ -GB_macrofy_cast_output, cast FC64 to bool -#define GB_PUTC(z,Cx,p) Cx [p] = (GB_creal (z) != 0 || GB_cimag (z) != 0) - - -================================================================================ -GB_assign_describe -C = A - - -================================================================================ -GB_enumify_ewise / GB_macrofy_ewise, C iso -// op: symbolic only (C is iso) - -// binary operator types: -#define GB_Z_TYPE void -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// binary operator: -#define GB_BINOP(z,x,y,i,j) -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) -#define GB_COPY_B_to_C(Cx,pC,Bx,pB,B_iso) - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE void -#define GB_PUTC(c,Cx,p) -#define GB_EWISEOP(Cx,p,aij,bij,i,j) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -// B matrix: hypersparse -#define GB_B_IS_HYPER 1 -#define GB_B_IS_SPARSE 0 -#define GB_B_IS_BITMAP 0 -#define GB_B_IS_FULL 0 -#define GBP_B(Bp,k,vlen) Bp [k] -#define GBH_B(Bh,k) Bh [k] -#define GBI_B(Bi,p,vlen) Bi [p] -#define GBB_B(Bb,p) 1 -#define GB_B_NVALS(e) int64_t e = B->nvals -#define GB_B_NHELD(e) GB_B_NVALS(e) -#define GB_B_ISO 0 -#define GB_B_TYPE bool -#define GB_B2TYPE void -#define GB_DECLAREB(b) -#define GB_GETB(b,Bx,p,iso) - -#include "GB_ewise_shared_definitions.h" - - -================================================================================ -GB_enumify_ewise / GB_macrofy_ewise, C non iso -// op: (and, bool) - -// binary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE bool -#define GB_Y_TYPE bool - -// binary operator: -#define GB_BINOP(z,x,y,i,j) z = ((x) && (y)) -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) Cx [pC] = Ax [pA] -#define GB_COPY_B_to_C(Cx,pC,Bx,pB,B_iso) Cx [pC] = Bx [pB] - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(c,Cx,p) Cx [p] = c -#define GB_EWISEOP(Cx,p,aij,bij,i,j) GB_BINOP (Cx [p], aij, bij, i, j) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE bool -#define GB_DECLAREA(a) bool a -#define GB_GETA(a,Ax,p,iso) a = Ax [p] - -// B matrix: hypersparse -#define GB_B_IS_HYPER 1 -#define GB_B_IS_SPARSE 0 -#define GB_B_IS_BITMAP 0 -#define GB_B_IS_FULL 0 -#define GBP_B(Bp,k,vlen) Bp [k] -#define GBH_B(Bh,k) Bh [k] -#define GBI_B(Bi,p,vlen) Bi [p] -#define GBB_B(Bb,p) 1 -#define GB_B_NVALS(e) int64_t e = B->nvals -#define GB_B_NHELD(e) GB_B_NVALS(e) -#define GB_B_ISO 0 -#define GB_B_TYPE bool -#define GB_B2TYPE bool -#define GB_DECLAREB(b) bool b -#define GB_GETB(b,Bx,p,iso) b = Bx [p] - -#include "GB_ewise_shared_definitions.h" - - -================================================================================ -GB_enumify_mxm / GB_macrofy_mxm, C iso -// semiring: symbolic only (C is iso) - -// monoid: -#define GB_Z_TYPE void -#define GB_UPDATE(z,y) -#define GB_ADD(z,x,y) -#define GB_DECLARE_IDENTITY(z) -#define GB_DECLARE_IDENTITY_CONST(z) -#define GB_IS_ANY_MONOID 1 -#define GB_Z_IGNORE_OVERFLOW 1 -#define GB_Z_NBITS 0 -#define GB_Z_ATOMIC_BITS 0 - -// multiplicative operator (flipped): -#define GB_MULT(z,x,y,i,k,j) - -// multiply-add operator: -#define GB_MULTADD(z,x,y,i,k,j) - -// special cases: - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 1 -#define GB_C_TYPE void -#define GB_PUTC(c,Cx,p) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 1 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -// B matrix: hypersparse -#define GB_B_IS_HYPER 1 -#define GB_B_IS_SPARSE 0 -#define GB_B_IS_BITMAP 0 -#define GB_B_IS_FULL 0 -#define GBP_B(Bp,k,vlen) Bp [k] -#define GBH_B(Bh,k) Bh [k] -#define GBI_B(Bi,p,vlen) Bi [p] -#define GBB_B(Bb,p) 1 -#define GB_B_NVALS(e) int64_t e = B->nvals -#define GB_B_NHELD(e) GB_B_NVALS(e) -#define GB_B_ISO 1 -#define GB_B_IS_PATTERN 1 -#define GB_B_TYPE void -#define GB_B2TYPE void -#define GB_DECLAREB(b) -#define GB_GETB(b,Bx,p,iso) - -#include "GB_mxm_shared_definitions.h" - - -================================================================================ -GB_enumify_mxm / GB_macrofy_mxm, any_pair, flipxy -// semiring: symbolic only (C is iso) - -// monoid: -#define GB_Z_TYPE void -#define GB_UPDATE(z,y) -#define GB_ADD(z,x,y) -#define GB_DECLARE_IDENTITY(z) -#define GB_DECLARE_IDENTITY_CONST(z) -#define GB_IS_ANY_MONOID 1 -#define GB_Z_NBITS 0 -#define GB_Z_ATOMIC_BITS 0 - -// multiplicative operator (flipped): -#define GB_MULT(z,x,y,i,k,j) - -// multiply-add operator: -#define GB_MULTADD(z,x,y,i,k,j) - -// special cases: -#define GB_IS_ANY_PAIR_SEMIRING 1 -#define GB_IS_PAIR_MULTIPLIER 1 - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE void -#define GB_PUTC(c,Cx,p) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 1 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -// B matrix: hypersparse -#define GB_B_IS_HYPER 1 -#define GB_B_IS_SPARSE 0 -#define GB_B_IS_BITMAP 0 -#define GB_B_IS_FULL 0 -#define GBP_B(Bp,k,vlen) Bp [k] -#define GBH_B(Bh,k) Bh [k] -#define GBI_B(Bi,p,vlen) Bi [p] -#define GBB_B(Bb,p) 1 -#define GB_B_NVALS(e) int64_t e = B->nvals -#define GB_B_NHELD(e) GB_B_NVALS(e) -#define GB_B_ISO 1 -#define GB_B_IS_PATTERN 1 -#define GB_B_TYPE void -#define GB_B2TYPE void -#define GB_DECLAREB(b) -#define GB_GETB(b,Bx,p,iso) - -#include "GB_mxm_shared_definitions.h" - - -================================================================================ -GB_enumify_mxm / GB_macrofy_mxm, any_pair fp32 -// semiring: (any, pair (flipped), float) - -// monoid: -#define GB_Z_TYPE float -#define GB_ADD(z,x,y) z = y -#define GB_UPDATE(z,y) z = y -#define GB_DECLARE_IDENTITY(z) float z = 0 -#define GB_DECLARE_IDENTITY_CONST(z) const float z = 0 -#define GB_HAS_IDENTITY_BYTE 1 -#define GB_IDENTITY_BYTE 0x00 -#define GB_IS_ANY_MONOID 1 -#define GB_Z_NBITS 32 -#define GB_Z_ATOMIC_BITS 32 -#define GB_Z_HAS_ATOMIC_UPDATE 1 -#define GB_Z_HAS_OMP_ATOMIC_UPDATE 1 -#define GB_Z_HAS_CUDA_ATOMIC_BUILTIN 1 -#define GB_Z_CUDA_ATOMIC GB_cuda_atomic_write -#define GB_Z_CUDA_ATOMIC_TYPE float - -// multiplicative operator (flipped): -#define GB_MULT(z,y,x,j,k,i) z = 1 - -// multiply-add operator: -#define GB_MULTADD(z,y,x,j,k,i) z = 1 - -// special cases: -#define GB_IS_PAIR_MULTIPLIER 1 - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE float -#define GB_PUTC(c,Cx,p) Cx [p] = c - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 1 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -// B matrix: hypersparse -#define GB_B_IS_HYPER 1 -#define GB_B_IS_SPARSE 0 -#define GB_B_IS_BITMAP 0 -#define GB_B_IS_FULL 0 -#define GBP_B(Bp,k,vlen) Bp [k] -#define GBH_B(Bh,k) Bh [k] -#define GBI_B(Bi,p,vlen) Bi [p] -#define GBB_B(Bb,p) 1 -#define GB_B_NVALS(e) int64_t e = B->nvals -#define GB_B_NHELD(e) GB_B_NVALS(e) -#define GB_B_ISO 1 -#define GB_B_IS_PATTERN 1 -#define GB_B_TYPE void -#define GB_B2TYPE void -#define GB_DECLAREB(b) -#define GB_GETB(b,Bx,p,iso) - -#include "GB_mxm_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: rowindex -// op: (rowindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE int32_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((i) + (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_DEPENDS_ON_Y 1 -#define GB_ROWINDEX_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: rowindex -// op: (rowindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((i) + (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_DEPENDS_ON_Y 1 -#define GB_ROWINDEX_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: colindex -// op: (colindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE int32_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) + (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_COLINDEX_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: colindex -// op: (colindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) + (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_COLINDEX_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: diagindex -// op: (diagindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE int32_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) - ((i) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_OFFDIAG_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: diagindex -// op: (diagindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) - ((i) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_OFFDIAG_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: tril -// op: (tril, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) <= ((i) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_TRIL_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: triu -// op: (triu, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) >= ((i) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_TRIU_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: diag -// op: (diag, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) == ((i) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_DIAG_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: offdiag -// op: (offdiag, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) != ((i) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_OFFDIAG_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: colle -// op: (colle, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) <= (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_COLLE_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: colgt -// op: (colgt, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) > (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_COLGT_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: rowle -// op: (rowle, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((i) <= (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_DEPENDS_ON_Y 1 -#define GB_ROWLE_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: rowgt -// op: (rowgt, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((i) > (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_DEPENDS_ON_Y 1 -#define GB_ROWGT_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: flipdiagindex -// op: (flipdiagindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE int32_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((i) - ((j) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_ENTRY_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: flipdiagindex -// op: (flipdiagindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((i) - ((j) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_ENTRY_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: opi32 -// op: opi32func, ztype: GxB_FC32_t, xtype: GxB_FC32_t, ytype: GxB_FC32_t - -// unary operator types: -#define GB_Z_TYPE GxB_FC32_t -#define GB_X_TYPE GxB_FC32_t -#define GB_Y_TYPE GxB_FC32_t - -// index unary operator: -#ifndef GB_GUARD_opi32func_DEFINED -#define GB_GUARD_opi32func_DEFINED -GB_STATIC_INLINE -void opi32func (GxB_FC32_t *z, const GxB_FC32_t *x, GrB_Index i, GrB_Index j, - const GxB_FC32_t *y) -{ - (*z) = (*x) ; -} -#define GB_opi32func_USER_DEFN \ -"void opi32func (GxB_FC32_t *z, const GxB_FC32_t *x, GrB_Index i, GrB_Index j, \n" \ -" const GxB_FC32_t *y) \n" \ -"{ \n" \ -" (*z) = (*x) ; \n" \ -"}" -#endif -#define GB_IDXUNOP(z,x,i,j,y) opi32func (&(z), &(x), i, j, &(y)) -#define GB_DEPENDS_ON_X 1 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_ENTRY_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_DECLAREA (x) ; \ - GB_GETA (x, Ax, p, ) ; \ - GB_IDXUNOP (z, x, i, j, y) ; \ - bool keep = (GB_crealf (z) != 0 || GB_cimagf (z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE GxB_FC32_t - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE GxB_FC32_t -#define GB_A2TYPE GxB_FC32_t -#define GB_DECLAREA(a) GxB_FC32_t a -#define GB_GETA(a,Ax,p,iso) a = Ax [p] - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: one -// op: (one, void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = 1 -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 0 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) \ -{ \ - GB_DECLAREZ (z) ; \ - GB_UNARYOP (z, aij, Ax [pA], , , ) ; \ - GB_PUTC (z, Cx, pC) ; \ -} - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = (int32_t) (c) - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positioni -// op: (positioni, void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (i) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) GB_UNARYOP (Cx [pC], Ax [pA], i, , ) - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = c - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positioni -// op: (positioni, void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (i) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) \ -{ \ - GB_DECLAREZ (z) ; \ - GB_UNARYOP (z, aij, Ax [pA], i, , ) ; \ - GB_PUTC (z, Cx, pC) ; \ -} - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = (int32_t) (c) - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positioni1 -// op: (positioni1, void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (i) + 1 -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) GB_UNARYOP (Cx [pC], Ax [pA], i, , ) - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = c - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positioni1 -// op: (positioni1, void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (i) + 1 -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) \ -{ \ - GB_DECLAREZ (z) ; \ - GB_UNARYOP (z, aij, Ax [pA], i, , ) ; \ - GB_PUTC (z, Cx, pC) ; \ -} - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = (int32_t) (c) - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positionj -// op: (positionj, void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (j) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) GB_UNARYOP (Cx [pC], Ax [pA], , j, ) - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = c - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positionj -// op: (positionj, void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (j) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) \ -{ \ - GB_DECLAREZ (z) ; \ - GB_UNARYOP (z, aij, Ax [pA], , j, ) ; \ - GB_PUTC (z, Cx, pC) ; \ -} - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = (int32_t) (c) - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positionj1 -// op: (positionj1, void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (j) + 1 -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) GB_UNARYOP (Cx [pC], Ax [pA], , j, ) - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = c - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positionj1 -// op: (positionj1, void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (j) + 1 -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) \ -{ \ - GB_DECLAREZ (z) ; \ - GB_UNARYOP (z, aij, Ax [pA], , j, ) ; \ - GB_PUTC (z, Cx, pC) ; \ -} - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = (int32_t) (c) - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: sqrt -// op: (sqrt, GxB_FC64_t) - -// unary operator types: -#define GB_Z_TYPE GxB_FC64_t -#define GB_X_TYPE GxB_FC64_t -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = GB_csqrt (x) -#define GB_DEPENDS_ON_X 1 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 0 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) \ -{ \ - GB_DECLAREA (aij) ; \ - GB_GETA (aij, Ax, pA, ) ; \ - GB_DECLAREZ (z) ; \ - GB_UNARYOP (z, aij, , , ) ; \ - GB_PUTC (z, Cx, pC) ; \ -} - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#ifndef GB_GUARD_GJ_cast_to_int32_DEFINED -#define GB_GUARD_GJ_cast_to_int32_DEFINED -GB_STATIC_INLINE -int32_t GJ_cast_to_int32 (double x) -{ - if (isnan (x)) return (0) ; - if (x <= (double) INT32_MIN) return (INT32_MIN) ; - if (x >= (double) INT32_MAX) return (INT32_MAX) ; - return ((int32_t) x) ; -} -#endif -#define GB_PUTC(c,Cx,p) Cx [p] = GJ_cast_to_int32 (GB_creal (c)) - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_TYPE int32_t -#define GB_A2TYPE GxB_FC64_t -#define GB_DECLAREA(a) GxB_FC64_t a -#define GB_GETA(a,Ax,p,iso) a = (GxB_FC64_t) (Ax [p]) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_build / GB_macrofy_build: times -// op: (times, GxB_FC32_t) - -// binary dup operator types: -#define GB_Z_TYPE GxB_FC32_t -#define GB_X_TYPE GxB_FC32_t -#define GB_Y_TYPE GxB_FC32_t - -// S and T data types: -#define GB_T_TYPE bool -#define GB_S_TYPE bool - -// binary dup operator: -#define GB_DUP(z,x,y) z = GB_FC32_mul (x,y) -#define GB_UPDATE(z,y) GB_DUP(z,z,y) - -// build copy/dup methods: -#define GB_BLD_COPY(Tx,p,Sx,k) Tx [p] = Sx [k] -#define GB_BLD_DUP(Tx,p,Sx,k) \ - GxB_FC32_t y = (GxB_FC32_t) Sx [k] ; \ - GxB_FC32_t x = (GxB_FC32_t) Tx [p] ; \ - GxB_FC32_t z ; \ - GB_DUP (z, x, y) ; \ - Tx [p] = (GB_crealf (z) != 0 || GB_cimagf (z) != 0) ; - -#include "GB_kernel_shared_definitions.h" - - -================================================================================ -GB_enumify_build / GB_macrofy_build: and -// op: (and, bool) - -// binary dup operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE bool -#define GB_Y_TYPE bool - -// S and T data types: -#define GB_T_TYPE GxB_FC32_t -#define GB_S_TYPE GxB_FC32_t - -// binary dup operator: -#define GB_DUP(z,x,y) z = ((x) && (y)) -#define GB_UPDATE(z,y) z &= y - -// build copy/dup methods: -#define GB_BLD_COPY(Tx,p,Sx,k) Tx [p] = Sx [k] -#define GB_BLD_DUP(Tx,p,Sx,k) \ - bool y = (GB_crealf (Sx [k]) != 0 || GB_cimagf (Sx [k]) != 0) ; \ - bool x = (GB_crealf (Tx [p]) != 0 || GB_cimagf (Tx [p]) != 0) ; \ - bool z ; \ - GB_DUP (z, x, y) ; \ - Tx [p] = (GxB_FC32_t) z ; - -#include "GB_kernel_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(lo:hi,lo:hi)=A (assign) -// assign/subassign: C(I,J) = A -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: not present - - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(cwork,Cx,p) Cx [p] = cwork -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) Cx [pC] = Ax [pA] -#define GB_COPY_aij_to_C(Cx,pC,Ax,pA,A_iso,cwork) \ - GB_COPY_A_to_C (Cx, pC, Ax, pA, A_iso) -#define GB_COPY_aij_to_cwork(cwork,Ax,p,iso) cwork = Ax [p] -#define GB_COPY_C_to_xwork(xwork,Cx,p) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(lo:s:hi,lo:s:hi)=A (assign) -// assign/subassign: C(I,J) = A -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_STRIDE -#define GB_J_KIND GB_STRIDE -#define GB_C_REPLACE 0 -// accum: not present - - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(cwork,Cx,p) Cx [p] = cwork -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) Cx [pC] = Ax [pA] -#define GB_COPY_aij_to_C(Cx,pC,Ax,pA,A_iso,cwork) \ - GB_COPY_A_to_C (Cx, pC, Ax, pA, A_iso) -#define GB_COPY_aij_to_cwork(cwork,Ax,p,iso) cwork = Ax [p] -#define GB_COPY_C_to_xwork(xwork,Cx,p) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(i,J)=s (row assign) -// assign/subassign: C(i,J) = A -#define GB_ASSIGN_KIND GB_ROW_ASSIGN -#define GB_I_KIND GB_ALL -#define GB_J_KIND GB_LIST -#define GB_C_REPLACE 0 -// accum: not present - - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(cwork,Cx,p) Cx [p] = cwork -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_scalar_to_cwork(cwork,scalar) cwork = scalar -#define GB_COPY_scalar_to_C(Cx,pC,cwork) Cx [pC] = cwork -#define GB_COPY_C_to_xwork(xwork,Cx,p) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// scalar: -#define GB_A_TYPE bool - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(I,j)=s (col assign) -// assign/subassign: C(I,j) = A -#define GB_ASSIGN_KIND GB_COL_ASSIGN -#define GB_I_KIND GB_LIST -#define GB_J_KIND GB_ALL -#define GB_C_REPLACE 0 -// accum: not present - - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(cwork,Cx,p) Cx [p] = cwork -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_scalar_to_cwork(cwork,scalar) cwork = scalar -#define GB_COPY_scalar_to_C(Cx,pC,cwork) Cx [pC] = cwork -#define GB_COPY_C_to_xwork(xwork,Cx,p) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// scalar: -#define GB_A_TYPE bool - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C_iso(lo:hi,lo:hi)=A (assign) -// assign/subassign: C(I,J) = scalar -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: not present - - -// C matrix: full -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 1 -#define GBP_C(Cp,k,vlen) ((k) * (vlen)) -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) ((p) % (vlen)) -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = 0 ; GB_INT64_MULT (e, C->vlen, C->vdim) -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 1 -#define GB_C_TYPE void -#define GB_PUTC(cwork,Cx,p) -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_scalar_to_cwork(cwork,scalar) cwork = scalar -#define GB_COPY_scalar_to_C(Cx,pC,cwork) -#define GB_COPY_C_to_xwork(xwork,Cx,pC) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// scalar: -#define GB_A_TYPE bool - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C_iso(lo:hi,lo:hi)+=s (assign) -// assign/subassign: C(I,J) += scalar -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: (plus, float) - -// accum operator types: -#define GB_Z_TYPE float -#define GB_X_TYPE float -#define GB_Y_TYPE float -#define GB_DECLAREZ(zwork) float zwork -#define GB_DECLAREX(xwork) float xwork -#define GB_DECLAREY(ywork) float ywork - -// accum operator: -#define GB_UPDATE(z,y) -#define GB_ACCUM_OP(z,x,y) -#define GB_ACCUMULATE_scalar(Cx,pC,ywork) - -// C matrix: full -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 1 -#define GBP_C(Cp,k,vlen) ((k) * (vlen)) -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) ((p) % (vlen)) -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = 0 ; GB_INT64_MULT (e, C->vlen, C->vdim) -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 1 -#define GB_C_TYPE void -#define GB_PUTC(zwork,Cx,p) -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_scalar_to_cwork(cwork,scalar) cwork = scalar -#define GB_COPY_scalar_to_C(Cx,pC,cwork) -#define GB_COPY_C_to_xwork(xwork,Cx,pC) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// scalar: -#define GB_A_TYPE bool -#define GB_COPY_scalar_to_ywork(ywork,scalar) ywork = (float) (scalar) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C_iso(lo:hi,lo:hi)+=s (assign) -// assign/subassign: C(I,J) += scalar -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: (plus, float) - -// accum operator types: -#define GB_Z_TYPE float -#define GB_X_TYPE float -#define GB_Y_TYPE float -#define GB_DECLAREZ(zwork) float zwork -#define GB_DECLAREX(xwork) float xwork -#define GB_DECLAREY(ywork) float ywork - -// accum operator: -#define GB_UPDATE(z,y) -#define GB_ACCUM_OP(z,x,y) -#define GB_ACCUMULATE_scalar(Cx,pC,ywork) - -// C matrix: full -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 1 -#define GBP_C(Cp,k,vlen) ((k) * (vlen)) -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) ((p) % (vlen)) -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = 0 ; GB_INT64_MULT (e, C->vlen, C->vdim) -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 1 -#define GB_C_TYPE void -#define GB_PUTC(zwork,Cx,p) -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_scalar_to_cwork(cwork,scalar) cwork = scalar -#define GB_COPY_scalar_to_C(Cx,pC,cwork) -#define GB_COPY_C_to_xwork(xwork,Cx,pC) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// scalar: -#define GB_A_TYPE bool -#define GB_COPY_scalar_to_ywork(ywork,scalar) ywork = (float) (scalar) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(lo:hi,lo:hi)+=A (assign) -// assign/subassign: C(I,J) += A -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: (plus, float) - -// accum operator types: -#define GB_Z_TYPE float -#define GB_X_TYPE float -#define GB_Y_TYPE float -#define GB_DECLAREZ(zwork) float zwork -#define GB_DECLAREX(xwork) float xwork -#define GB_DECLAREY(ywork) float ywork - -// accum operator: -#define GB_ACCUM_OP(z,x,y) z = (x) + (y) -#define GB_UPDATE(z,y) z += y -#define GB_ACCUMULATE_aij(Cx,pC,Ax,pA,A_iso,ywork) \ -{ \ - GB_DECLAREY (ywork) ; \ - GB_GETA (ywork, Ax, pA, ) ; \ - GB_DECLAREX (xwork) ; \ - GB_COPY_C_to_xwork (xwork, Cx, pC) ; \ - GB_DECLAREZ (zwork) ; \ - GB_ACCUM_OP (zwork, xwork, ywork) ; \ - GB_PUTC (zwork, Cx, pC) ; \ -} - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(zwork,Cx,p) Cx [p] = ((zwork) != 0) -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) Cx [pC] = Ax [pA] -#define GB_COPY_aij_to_C(Cx,pC,Ax,pA,A_iso,cwork) \ - GB_COPY_A_to_C (Cx, pC, Ax, pA, A_iso) -#define GB_COPY_aij_to_cwork(cwork,Ax,p,iso) cwork = Ax [p] -#define GB_COPY_C_to_xwork(xwork,Cx,p) xwork = (float) (Cx [p]) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE float -#define GB_DECLAREA(a) float a -#define GB_GETA(a,Ax,p,iso) a = (float) (Ax [p]) -#define GB_COPY_aij_to_ywork(ywork,Ax,pA,A_iso) GB_GETA (ywork, Ax, pA, A_iso) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(lo:hi,lo:hi)&=A (assign) -// assign/subassign: C(I,J) &= A -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: (and, bool) - -// accum operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE bool -#define GB_Y_TYPE bool -#define GB_DECLAREZ(zwork) bool zwork -#define GB_DECLAREX(xwork) bool xwork -#define GB_DECLAREY(ywork) bool ywork - -// accum operator: -#define GB_ACCUM_OP(z,x,y) z = ((x) && (y)) -#define GB_UPDATE(z,y) z &= y -#define GB_ACCUMULATE_aij(Cx,pC,Ax,pA,A_iso,ywork) \ -{ \ - GB_UPDATE (Cx [pC], Ax [pA]) ; \ -} - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(zwork,Cx,p) Cx [p] = zwork -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) Cx [pC] = Ax [pA] -#define GB_COPY_aij_to_C(Cx,pC,Ax,pA,A_iso,cwork) \ - GB_COPY_A_to_C (Cx, pC, Ax, pA, A_iso) -#define GB_COPY_aij_to_cwork(cwork,Ax,p,iso) cwork = Ax [p] -#define GB_COPY_C_to_xwork(xwork,Cx,p) xwork = Cx [p] - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE bool -#define GB_DECLAREA(a) bool a -#define GB_GETA(a,Ax,p,iso) a = Ax [p] -#define GB_COPY_aij_to_ywork(ywork,Ax,pA,A_iso) GB_GETA (ywork, Ax, pA, A_iso) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(lo:hi,lo:hi)<=A (assign) -// assign/subassign: C(I,J) lt= A -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: (lt, float) - -// accum operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE float -#define GB_Y_TYPE float -#define GB_DECLAREZ(zwork) bool zwork -#define GB_DECLAREX(xwork) float xwork -#define GB_DECLAREY(ywork) float ywork - -// accum operator: -#define GB_ACCUM_OP(z,x,y) z = ((x) < (y)) -#define GB_ACCUMULATE_aij(Cx,pC,Ax,pA,A_iso,ywork) \ -{ \ - GB_DECLAREY (ywork) ; \ - GB_GETA (ywork, Ax, pA, ) ; \ - GB_DECLAREX (xwork) ; \ - GB_COPY_C_to_xwork (xwork, Cx, pC) ; \ - GB_ACCUM_OP (Cx [pC], xwork, ywork) ; \ -} - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(zwork,Cx,p) Cx [p] = zwork -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) Cx [pC] = Ax [pA] -#define GB_COPY_aij_to_C(Cx,pC,Ax,pA,A_iso,cwork) \ - GB_COPY_A_to_C (Cx, pC, Ax, pA, A_iso) -#define GB_COPY_aij_to_cwork(cwork,Ax,p,iso) cwork = Ax [p] -#define GB_COPY_C_to_xwork(xwork,Cx,p) xwork = (float) (Cx [p]) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE float -#define GB_DECLAREA(a) float a -#define GB_GETA(a,Ax,p,iso) a = (float) (Ax [p]) -#define GB_COPY_aij_to_ywork(ywork,Ax,pA,A_iso) GB_GETA (ywork, Ax, pA, A_iso) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C_iso(lo:hi,lo:hi)<=H (assign) -// assign/subassign: C(I,J) lt= A -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: (lt, float) - -// accum operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE float -#define GB_Y_TYPE float -#define GB_DECLAREZ(zwork) bool zwork -#define GB_DECLAREX(xwork) float xwork -#define GB_DECLAREY(ywork) float ywork - -// accum operator: -#define GB_ACCUM_OP(z,x,y) -#define GB_ACCUMULATE_aij(Cx,pC,Ax,pA,A_iso,ywork) - -// C matrix: full -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 1 -#define GBP_C(Cp,k,vlen) ((k) * (vlen)) -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) ((p) % (vlen)) -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = 0 ; GB_INT64_MULT (e, C->vlen, C->vdim) -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 1 -#define GB_C_TYPE void -#define GB_PUTC(zwork,Cx,p) -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) -#define GB_COPY_aij_to_C(Cx,pC,Ax,pA,A_iso,cwork) -#define GB_COPY_aij_to_cwork(cwork,Ax,p,iso) cwork = Ax [p] -#define GB_COPY_C_to_xwork(xwork,Cx,pC) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE float -#define GB_DECLAREA(a) float a -#define GB_GETA(a,Ax,p,iso) a = (float) (Ax [p]) -#define GB_COPY_aij_to_ywork(ywork,Ax,pA,A_iso) GB_GETA (ywork, Ax, pA, A_iso) - -#include "GB_assign_shared_definitions.h" diff --git a/Test/test169.m b/Test/test169.m new file mode 100644 index 0000000000..33c5509b92 --- /dev/null +++ b/Test/test169.m @@ -0,0 +1,49 @@ +function test169 +%TEST169 C=A+B with different sparsity formats + +% SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. +% SPDX-License-Identifier: Apache-2.0 + +rng ('default') ; + +fprintf ('test169:\n') ; + +n = 50 ; + +desc = struct ('mask', 'complement') ; + +for trial = 1:5 + + C = GB_spec_random (n, n, 0.5, 1, 'double') ; + M = GB_spec_random (n, n, 0.2, 1, 'double') ; + A = GB_spec_random (n, n, 0.5, 1, 'double') ; + B = GB_spec_random (n, n, 0.5, 1, 'double') ; + + for C_sparsity = [1 2 4 8] + C.sparsity = C_sparsity ; + + for M_sparsity = [1 2 4 8] + M.sparsity = M_sparsity ; + + for A_sparsity = [1 2 4 8] + A.sparsity = A_sparsity ; + + for B_sparsity = [1 2 4 8] + B.sparsity = B_sparsity ; + + C1 = GB_spec_Matrix_eWiseAdd (C, M, [], 'plus', A, B, desc); + C2 = GB_mex_Matrix_eWiseAdd (C, M, [], 'plus', A, B, desc); + GB_spec_compare (C1, C2) ; + + C1 = GB_spec_Matrix_eWiseAdd (C, M, [], 'plus', A, B, [ ]) ; + C2 = GB_mex_Matrix_eWiseAdd (C, M, [], 'plus', A, B, [ ]) ; + GB_spec_compare (C1, C2) ; + end + end + end + fprintf ('.') ; + end +end + +fprintf ('\ntest169: all tests passed\n') ; + diff --git a/Test/testall.m b/Test/testall.m index 17204c2a56..50cec10f01 100644 --- a/Test/testall.m +++ b/Test/testall.m @@ -99,6 +99,7 @@ function testall (threads,longtests) % tests with high rates (over 100/sec) %---------------------------------------- +logstat ('test169' ,t, j0 , f1 ) ; % C=A+B with many formats logstat ('test250' ,t, j44 , f10 ) ; % JIT tests, set/get, other tests logstat ('test279' ,t, j0 , f1 ) ; % blob get/set logstat ('test278' ,t, j0 , f1 ) ; % descriptor get/set diff --git a/Test/unused/test169.m b/Test/unused/test169_orig.m similarity index 100% rename from Test/unused/test169.m rename to Test/unused/test169_orig.m diff --git a/cmake_modules/GraphBLAS_JIT_paths.cmake b/cmake_modules/GraphBLAS_JIT_paths.cmake index cd59d17cd2..a132e22c2e 100644 --- a/cmake_modules/GraphBLAS_JIT_paths.cmake +++ b/cmake_modules/GraphBLAS_JIT_paths.cmake @@ -40,7 +40,7 @@ endif ( ) if ( SUITESPARSE_HAS_CUDA AND GRAPHBLAS_USE_CUDA ) # FOR NOW: do not compile FactoryKernels when developing the CUDA kernels -# set ( GRAPHBLAS_COMPACT on ) + set ( GRAPHBLAS_COMPACT on ) endif ( ) option ( GRAPHBLAS_COMPACT "ON: do not compile FactoryKernels. OFF (default): compile FactoryKernels" OFF ) diff --git a/cmake_modules/GraphBLAS_version.cmake b/cmake_modules/GraphBLAS_version.cmake index 3c0dd38f2a..e2268f41c0 100644 --- a/cmake_modules/GraphBLAS_version.cmake +++ b/cmake_modules/GraphBLAS_version.cmake @@ -8,10 +8,10 @@ #------------------------------------------------------------------------------- # version of SuiteSparse:GraphBLAS -set ( GraphBLAS_DATE "Feb XX, 2024" ) # FIXME for next release +set ( GraphBLAS_DATE "Apr XX, 2024" ) # FIXME for next release set ( GraphBLAS_VERSION_MAJOR 9 CACHE STRING "" FORCE ) set ( GraphBLAS_VERSION_MINOR 1 CACHE STRING "" FORCE ) -set ( GraphBLAS_VERSION_SUB 2 CACHE STRING "" FORCE ) +set ( GraphBLAS_VERSION_SUB 1 CACHE STRING "" FORCE ) # GraphBLAS C API Specification version, at graphblas.org set ( GraphBLAS_API_DATE "Dec 22, 2023" ) From 28640816aac50e3d3861750b732a022da03746a5 Mon Sep 17 00:00:00 2001 From: Vidith Madhu Date: Thu, 21 Mar 2024 12:45:06 -0500 Subject: [PATCH 06/76] progress on cuda colscale --- CUDA/GB_cuda_colscale.cpp | 41 +++++++++++++++ CUDA/GB_cuda_colscale_branch.cpp | 19 +++++++ CUDA/GB_cuda_colscale_jit.cpp | 52 +++++++++++++++++++ CUDA/GB_cuda_ewise.hpp | 15 ++++++ CUDA/GB_cuda_rowscale_branch.cpp | 2 +- .../JitKernels/GB_jit_kernel_cuda_colscale.cu | 4 +- Doc/GraphBLAS_version.tex | 4 +- Include/GraphBLAS.h | 6 +-- README.md | 2 +- Source/GB_colscale.c | 10 +++- Source/GB_jitifyer.h | 4 +- 11 files changed, 146 insertions(+), 13 deletions(-) create mode 100644 CUDA/GB_cuda_colscale.cpp create mode 100644 CUDA/GB_cuda_colscale_branch.cpp create mode 100644 CUDA/GB_cuda_colscale_jit.cpp diff --git a/CUDA/GB_cuda_colscale.cpp b/CUDA/GB_cuda_colscale.cpp new file mode 100644 index 0000000000..b4e422c93a --- /dev/null +++ b/CUDA/GB_cuda_colscale.cpp @@ -0,0 +1,41 @@ +#include "GB_cuda_ewise.hpp" + +#undef GB_FREE_WORKSPACE +#define GB_FREE_WORKSPACE ; + +#undef GB_FREE_ALL +#define GB_FREE_ALL ; + +#define BLOCK_SIZE 128 +#define LOG2_BLOCK_SIZE 7 + +GrB_Info GB_cuda_colscale +( + GrB_Matrix C, + const GrB_Matrix A, + const GrB_Matrix D, + const GrB_Semiring semiring, + const bool flipxy +) +{ + // FIXME: use the stream pool + cudaStream_t stream ; + CUDA_OK (cudaStreamCreate (&stream)) ; + + // compute gridsz, blocksz, call GB_cuda_rowscale_jit + GrB_Index anz ; + GrB_Matrix_nvals (&anz, A) ; + + int32_t gridsz = 1 + (anz >> LOG2_BLOCK_SIZE) ; + + GrB_Info info = GB_cuda_colscale_jit ( C, A, D, + semiring->multiply, flipxy, stream, gridsz, BLOCK_SIZE) ; + + if (info == GrB_NO_VALUE) info = GrB_PANIC ; + GB_OK (info) ; + + CUDA_OK (cudaStreamSynchronize (stream)) ; + CUDA_OK (cudaStreamDestroy (stream)) ; + return GrB_SUCCESS ; + +} diff --git a/CUDA/GB_cuda_colscale_branch.cpp b/CUDA/GB_cuda_colscale_branch.cpp new file mode 100644 index 0000000000..82897d53d8 --- /dev/null +++ b/CUDA/GB_cuda_colscale_branch.cpp @@ -0,0 +1,19 @@ +#include "GraphBLAS_cuda.hpp" +#include "GB_cuda.hpp" + +bool GB_cuda_colscale_branch +( + const GrB_Matrix A, + const GrB_Matrix D, + const GrB_Semiring semiring, + const bool flipxy +) +{ + if (!GB_cuda_type_branch (A->type) || + !GB_cuda_type_branch (D->type) || + !GB_cuda_type_branch (semiring->multiply->ztype)) + { + return false; + } + return true; +} diff --git a/CUDA/GB_cuda_colscale_jit.cpp b/CUDA/GB_cuda_colscale_jit.cpp new file mode 100644 index 0000000000..ea32ca4525 --- /dev/null +++ b/CUDA/GB_cuda_colscale_jit.cpp @@ -0,0 +1,52 @@ +#include "GB_cuda_ewise.hpp" + +extern "C" +{ + typedef GB_JIT_CUDA_KERNEL_COLSCALE_PROTO ((*GB_jit_dl_function)) ; +} + +GrB_Info GB_cuda_colscale_jit +( + // output: + GrB_Matrix C, + // input: + GrB_Matrix A, + GrB_Matrix D, + GrB_BinaryOp binaryop, + bool flipxy, + // CUDA stream and launch parameters: + cudaStream_t stream, + int32_t gridsz, + int32_t blocksz +) +{ + + //-------------------------------------------------------------------------- + // encodify the problem + //-------------------------------------------------------------------------- + + GB_jit_encoding encoding ; + char *suffix ; + uint64_t hash = GB_encodify_ewise (&encoding, &suffix, + GB_JIT_CUDA_KERNEL_COLSCALE, false, + false, false, GB_sparsity (C), C->type, NULL, false, false, + binaryop, flipxy, A, D) ; + + //-------------------------------------------------------------------------- + // get the kernel function pointer, loading or compiling it if needed + //-------------------------------------------------------------------------- + + void *dl_function ; + GrB_Info info = GB_jitifyer_load (&dl_function, + GB_jit_ewise_family, "cuda_colscale", + hash, &encoding, suffix, NULL, NULL, + (GB_Operator) binaryop, C->type, A->type, D->type) ; + if (info != GrB_SUCCESS) return (info) ; + + //-------------------------------------------------------------------------- + // call the jit kernel and return result + //-------------------------------------------------------------------------- + + GB_jit_dl_function GB_jit_kernel = (GB_jit_dl_function) dl_function ; + return (GB_jit_kernel (C, A, D, stream, gridsz, blocksz)) ; +} diff --git a/CUDA/GB_cuda_ewise.hpp b/CUDA/GB_cuda_ewise.hpp index 07095a5135..533fbfeca5 100644 --- a/CUDA/GB_cuda_ewise.hpp +++ b/CUDA/GB_cuda_ewise.hpp @@ -26,5 +26,20 @@ GrB_Info GB_cuda_rowscale_jit int32_t blocksz ) ; +GrB_Info GB_cuda_colscale_jit +( + // output: + GrB_Matrix C, + // input: + GrB_Matrix A, + GrB_Matrix D, + GrB_BinaryOp binaryop, + bool flipxy, + // CUDA stream and launch parameters: + cudaStream_t stream, + int32_t gridsz, + int32_t blocksz +) ; + #endif diff --git a/CUDA/GB_cuda_rowscale_branch.cpp b/CUDA/GB_cuda_rowscale_branch.cpp index c9e164d35c..f9c492c239 100644 --- a/CUDA/GB_cuda_rowscale_branch.cpp +++ b/CUDA/GB_cuda_rowscale_branch.cpp @@ -9,7 +9,7 @@ bool GB_cuda_rowscale_branch const bool flipxy ) { - if (!GB_cuda_type_branch (D->type) || + if (!GB_cuda_type_branch (D->type) || !GB_cuda_type_branch (B->type) || !GB_cuda_type_branch (semiring->multiply->ztype)) { diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu index f00e5d3651..e4b7b194b6 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu @@ -13,7 +13,7 @@ __global__ void GB_cuda_colscale_kernel const GB_A_TYPE *__restrict__ Ax = (GB_A_TYPE *) A->x ; const GB_B_TYPE *__restrict__ Dx = (GB_B_TYPE *) B->x ; - const GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *) C->x ; + GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *) C->x ; #ifdef GB_JIT_KERNEL #define A_iso GB_A_ISO @@ -72,4 +72,4 @@ GB_JIT_CUDA_KERNEL_COLSCALE_PROTO (GB_jit_kernel) GB_cuda_colscale_kernel <<>> (C, A, D) ; return (GrB_SUCCESS) ; -} \ No newline at end of file +} diff --git a/Doc/GraphBLAS_version.tex b/Doc/GraphBLAS_version.tex index 8416422774..4531864a8c 100644 --- a/Doc/GraphBLAS_version.tex +++ b/Doc/GraphBLAS_version.tex @@ -1,5 +1,5 @@ % version of SuiteSparse:GraphBLAS \date{VERSION -9.1.2, -Feb XX, 2024} +9.1.1, +Apr XX, 2024} diff --git a/Include/GraphBLAS.h b/Include/GraphBLAS.h index b0f9baf691..1f870d0801 100644 --- a/Include/GraphBLAS.h +++ b/Include/GraphBLAS.h @@ -1,4 +1,4 @@ -// SuiteSparse:GraphBLAS 9.1.2 +// SuiteSparse:GraphBLAS 9.1.1 //------------------------------------------------------------------------------ // GraphBLAS.h: definitions for the GraphBLAS package //------------------------------------------------------------------------------ @@ -234,10 +234,10 @@ // The version of this implementation, and the GraphBLAS API version: #define GxB_IMPLEMENTATION_NAME "SuiteSparse:GraphBLAS" -#define GxB_IMPLEMENTATION_DATE "Feb XX, 2024" +#define GxB_IMPLEMENTATION_DATE "Apr XX, 2024" #define GxB_IMPLEMENTATION_MAJOR 9 #define GxB_IMPLEMENTATION_MINOR 1 -#define GxB_IMPLEMENTATION_SUB 2 +#define GxB_IMPLEMENTATION_SUB 1 #define GxB_SPEC_DATE "Dec 22, 2023" #define GxB_SPEC_MAJOR 2 #define GxB_SPEC_MINOR 1 diff --git a/README.md b/README.md index 1b280f0f57..1e7e26b9b7 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. SPDX-License-Identifier: Apache-2.0 -VERSION 9.1.2, Feb XX, 2024 +VERSION 9.1.1, Apr XX, 2024 SuiteSparse:GraphBLAS is a complete implementation of the GraphBLAS standard, which defines a set of sparse matrix operations on an extended algebra of diff --git a/Source/GB_colscale.c b/Source/GB_colscale.c index 7c10bb38d8..024c1477e4 100644 --- a/Source/GB_colscale.c +++ b/Source/GB_colscale.c @@ -206,6 +206,14 @@ GrB_Info GB_colscale // C = A*D, column scale with diagonal D GB_Type_compatible (D->type, mult->ytype))) ; } + info = GrB_NO_VALUE ; + + #if defined ( GRAPHBLAS_HAS_CUDA ) + if (GB_cuda_colscale_branch (A, D, semiring, flipxy)) { + info = GB_cuda_colscale (C, A, D, semiring, flipxy) ; + } + #endif + //---------------------------------------------------------------------- // determine the number of threads to use //---------------------------------------------------------------------- @@ -224,8 +232,6 @@ GrB_Info GB_colscale // C = A*D, column scale with diagonal D // via the factory kernel //---------------------------------------------------------------------- - info = GrB_NO_VALUE ; - #ifndef GBCOMPACT GB_IF_FACTORY_KERNELS_ENABLED { diff --git a/Source/GB_jitifyer.h b/Source/GB_jitifyer.h index 09729ddadc..7a4303a951 100644 --- a/Source/GB_jitifyer.h +++ b/Source/GB_jitifyer.h @@ -185,8 +185,8 @@ typedef enum // ewise methods: // ... - GB_JIT_CUDA_KERNEL_ROWSCALE = 1011, - GB_JIT_CUDA_KERNEL_COLSCALE = 1012, + GB_JIT_CUDA_KERNEL_COLSCALE = 1011, + GB_JIT_CUDA_KERNEL_ROWSCALE = 1012, // ... } GB_jit_kcode ; From 8aa5a16fec850833417a2431b006c56188876074 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Fri, 22 Mar 2024 11:31:23 -0500 Subject: [PATCH 07/76] change date, renable hack to force GPU to always be used --- Doc/GraphBLAS_version.tex | 4 ++-- Include/GraphBLAS.h | 6 +++--- README.md | 2 +- Source/GB_init.c | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Doc/GraphBLAS_version.tex b/Doc/GraphBLAS_version.tex index 8416422774..4531864a8c 100644 --- a/Doc/GraphBLAS_version.tex +++ b/Doc/GraphBLAS_version.tex @@ -1,5 +1,5 @@ % version of SuiteSparse:GraphBLAS \date{VERSION -9.1.2, -Feb XX, 2024} +9.1.1, +Apr XX, 2024} diff --git a/Include/GraphBLAS.h b/Include/GraphBLAS.h index b0f9baf691..1f870d0801 100644 --- a/Include/GraphBLAS.h +++ b/Include/GraphBLAS.h @@ -1,4 +1,4 @@ -// SuiteSparse:GraphBLAS 9.1.2 +// SuiteSparse:GraphBLAS 9.1.1 //------------------------------------------------------------------------------ // GraphBLAS.h: definitions for the GraphBLAS package //------------------------------------------------------------------------------ @@ -234,10 +234,10 @@ // The version of this implementation, and the GraphBLAS API version: #define GxB_IMPLEMENTATION_NAME "SuiteSparse:GraphBLAS" -#define GxB_IMPLEMENTATION_DATE "Feb XX, 2024" +#define GxB_IMPLEMENTATION_DATE "Apr XX, 2024" #define GxB_IMPLEMENTATION_MAJOR 9 #define GxB_IMPLEMENTATION_MINOR 1 -#define GxB_IMPLEMENTATION_SUB 2 +#define GxB_IMPLEMENTATION_SUB 1 #define GxB_SPEC_DATE "Dec 22, 2023" #define GxB_SPEC_MAJOR 2 #define GxB_SPEC_MINOR 1 diff --git a/README.md b/README.md index 1b280f0f57..1e7e26b9b7 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. SPDX-License-Identifier: Apache-2.0 -VERSION 9.1.2, Feb XX, 2024 +VERSION 9.1.1, Apr XX, 2024 SuiteSparse:GraphBLAS is a complete implementation of the GraphBLAS standard, which defines a set of sparse matrix operations on an extended algebra of diff --git a/Source/GB_init.c b/Source/GB_init.c index c3d6e6d253..a25f47d2ce 100644 --- a/Source/GB_init.c +++ b/Source/GB_init.c @@ -201,7 +201,7 @@ GrB_Info GB_init // start up GraphBLAS #if defined ( GRAPHBLAS_HAS_CUDA ) // this hack_get setting is used by GB_ngpus_to_use: // GB_Global_hack_set (2,0) ; // HACK FIXME: default: GPU for big enough probs -// GB_Global_hack_set (2,1) ; // HACK FIXME: force the GPU always to be used + GB_Global_hack_set (2,1) ; // HACK FIXME: force the GPU always to be used // GB_Global_hack_set (2,2) ; // HACK FIXME: force the GPU never to be used #endif return (GrB_SUCCESS) ; From 532e9b26c4c78979cddc001a882a20684068c862 Mon Sep 17 00:00:00 2001 From: Vidith Date: Fri, 22 Mar 2024 15:23:08 -0500 Subject: [PATCH 08/76] colscale notes from 3/22 meeting --- .../JitKernels/GB_jit_kernel_cuda_colscale.cu | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu index e4b7b194b6..0da2f39bca 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu @@ -1,5 +1,8 @@ using namespace cooperative_groups ; +// do not #include functions inside of other functions! +#include "GB_cuda_ek_slice.cuh" + #define log2_chunk_size 7 #define chunk_size 128 @@ -15,21 +18,16 @@ __global__ void GB_cuda_colscale_kernel const GB_B_TYPE *__restrict__ Dx = (GB_B_TYPE *) B->x ; GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *) C->x ; - #ifdef GB_JIT_KERNEL #define A_iso GB_A_ISO #define D_iso GB_B_ISO - #else - const bool A_iso = A->iso ; - const bool D_iso = D->iso ; - #endif - - #include "GB_cuda_ek_slice.cuh" const int64_t *__restrict__ Ai = A->i ; const int64_t *__restrict__ Ap = A->p ; - GB_A_NVALS (anz) ; + GB_A_NVALS (anz) ; // this should be GB_A_NHELD for bitmap/full case const int64_t anvec = A->nvec ; + // TODO: Handle bitmap/full case + for (int64_t pfirst = blockIdx.x << log2_chunk_size ; pfirst < anz ; pfirst += gridDim.x << log2_chunk_size ) @@ -41,6 +39,13 @@ __global__ void GB_cuda_colscale_kernel // alternate: // why not just do ek_slice_setup for one thread per block then this_thread_block.sync()? + // answer: + // better than having a syncrhonization barrier + + // question: why chunks are necessary? why not just do ek_slice_setup across all entries in one go? + // answer: the slope method is only useful for a small range of entries; non-uniform entry distributions + // can distort the usefulness of the slope (will require an exhaustive linear search) + // for a large range of entries for (int64_t curr_p = threadIdx.x ; curr_p < my_chunk_size ; curr_p += blockDim.x) { From 8f5b4af82c6ee11b9718f00bce286d68cea1e3f7 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Sun, 24 Mar 2024 15:47:30 -0500 Subject: [PATCH 09/76] Changelog for 9.1.0 --- Doc/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/ChangeLog b/Doc/ChangeLog index e1ef26ee59..1ad36b0e6c 100644 --- a/Doc/ChangeLog +++ b/Doc/ChangeLog @@ -11,7 +11,7 @@ Mar 22, 2024: version 9.1.0 * port to clang-cl: fixing the GxB_get and GxB_set macro * (53) bug fix: eWiseAdd C=A+B when M, A, and B are all hypersparse; access to M was incorrect (also affects C+=T for any operation, if - M and T are both hypersparse). + M and T are both hypersparse). Caught by Roi Lipman. Mar 1, 2024: version 9.0.3 From b69abc6c4aa4c2cecbff5a4e2f153923bde343ff Mon Sep 17 00:00:00 2001 From: Vidith Madhu Date: Tue, 26 Mar 2024 02:12:24 -0500 Subject: [PATCH 10/76] colscale progress --- .../JitKernels/GB_jit_kernel_cuda_colscale.cu | 30 ++++++++++++++++--- .../JitKernels/GB_jit_kernel_cuda_rowscale.cu | 10 ++----- Source/GB_cuda_gateway.h | 17 +++++++++++ Source/Template/GB_jit_kernel_proto.h | 11 +++++++ 4 files changed, 57 insertions(+), 11 deletions(-) diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu index 0da2f39bca..43ade62e03 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu @@ -3,8 +3,8 @@ using namespace cooperative_groups ; // do not #include functions inside of other functions! #include "GB_cuda_ek_slice.cuh" -#define log2_chunk_size 7 -#define chunk_size 128 +#define log2_chunk_size 10 +#define chunk_size 1024 __global__ void GB_cuda_colscale_kernel ( @@ -23,11 +23,29 @@ __global__ void GB_cuda_colscale_kernel const int64_t *__restrict__ Ai = A->i ; const int64_t *__restrict__ Ap = A->p ; - GB_A_NVALS (anz) ; // this should be GB_A_NHELD for bitmap/full case + const int64_t *__restrict__ Ab = A->b ; + GB_A_NHELD (anz) ; const int64_t anvec = A->nvec ; + const int64_t avlen = A->vlen ; - // TODO: Handle bitmap/full case + #if defined(GB_A_IS_BITMAP) || defined(GB_A_IS_FULL) + // bitmap/full case + int ntasks = blockDim.x * gridDim.x ; + int tid = blockIdx.x * blockDim.x + threadIdx.x ; + for (int64_t p = tid ; p < anz ; p += ntasks) + { + if (!GBB_A (Ab, p)) { continue ; } + int col_idx = p % avlen ; + GB_DECLAREB (dii) ; + GB_GETB (dii, Dx, col_idx, D_iso) ; + GB_DECLAREA (aij) ; + GB_GETA (aij, Ax, p, A_iso) ; + // C has same sparsity as A; ewise op code does not change + GB_EWISEOP (Cx, p, aij, dii, 0, 0) ; + } + #else + // sparse/hypersparse case (cuda_ek_slice only works for sparse/hypersparse) for (int64_t pfirst = blockIdx.x << log2_chunk_size ; pfirst < anz ; pfirst += gridDim.x << log2_chunk_size ) @@ -58,6 +76,8 @@ __global__ void GB_cuda_colscale_kernel GB_EWISEOP (Cx, pfirst + curr_p, aij, dii, 0, 0) ; } } + + #endif } extern "C" { @@ -69,6 +89,8 @@ GB_JIT_CUDA_KERNEL_COLSCALE_PROTO (GB_jit_kernel) ASSERT (GB_JUMBLED_OK (C)) ; ASSERT (GB_JUMBLED_OK (A)) ; ASSERT (!GB_JUMBLED (D)) ; + ASSERT (!GB_IS_BITMAP (D)) ; + ASSERT (!GB_IS_FULL (D)) ; ASSERT (!C->iso) ; dim3 grid (gridsz) ; diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu index ef18161931..b3634632f5 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu @@ -11,20 +11,14 @@ __global__ void GB_cuda_rowscale_kernel const GB_B_TYPE *__restrict__ Bx = (GB_B_TYPE *) B->x ; GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *) C->x ; - #ifdef GB_JIT_KERNEL #define D_iso GB_A_ISO #define B_iso GB_B_ISO - #else - const bool D_iso = D->iso ; - const bool B_iso = B->iso ; - #endif const int64_t *__restrict__ Bi = B->i ; - GB_B_NVALS (bnz) ; + GB_B_NHELD (bnz) ; const int64_t bvlen = B->vlen ; int ntasks = gridDim.x * blockDim.x; - // ntasks = GB_IMIN (bnz, ntasks) ; take care of this when setting gridsz/blocksz int tid = blockIdx.x * blockDim.x + threadIdx.x; for (int64_t p = tid ; p < bnz ; p += ntasks) @@ -46,6 +40,8 @@ GB_JIT_CUDA_KERNEL_ROWSCALE_PROTO (GB_jit_kernel) { ASSERT (GB_JUMBLED_OK (C)) ; ASSERT (!GB_JUMBLED (D)) ; + ASSERT (!GB_IS_BITMAP (D)) ; + ASSERT (!GB_IS_FULL (D)) ; ASSERT (GB_JUMBLED_OK (B)) ; ASSERT (!C->iso) ; diff --git a/Source/GB_cuda_gateway.h b/Source/GB_cuda_gateway.h index 97708addd0..ed13426e25 100644 --- a/Source/GB_cuda_gateway.h +++ b/Source/GB_cuda_gateway.h @@ -151,6 +151,23 @@ GrB_Info GB_cuda_rowscale const bool flipxy ) ; +bool GB_cuda_colscale_branch +( + const GrB_Matrix A, + const GrB_Matrix D, + const GrB_Semiring semiring, + const bool flipxy +) ; + +GrB_Info GB_cuda_colscale +( + GrB_Matrix C, + const GrB_Matrix A, + const GrB_Matrix D, + const GrB_Semiring semiring, + const bool flipxy +) ; + bool GB_cuda_type_branch // return true if the type is OK on GPU ( const GrB_Type type // type to query diff --git a/Source/Template/GB_jit_kernel_proto.h b/Source/Template/GB_jit_kernel_proto.h index e8295808b3..d8578f0b9e 100644 --- a/Source/Template/GB_jit_kernel_proto.h +++ b/Source/Template/GB_jit_kernel_proto.h @@ -583,6 +583,17 @@ GrB_Info GB_jit_kernel_rowscale \ int32_t blocksz \ ) +#define GB_JIT_CUDA_KERNEL_COLSCALE_PROTO(GB_jit_kernel_colscale) \ +GrB_Info GB_jit_kernel_colscale \ +( \ + GrB_Matrix C, \ + GrB_Matrix A, \ + GrB_Matrix B, \ + cudaStream_t stream, \ + int32_t gridsz, \ + int32_t blocksz \ +) + #define GB_JIT_CUDA_KERNEL_DOT3_PROTO(GB_jit_kernel_AxB_dot3) \ GrB_Info GB_jit_kernel_AxB_dot3 \ ( \ From a362d32bd35cc4ea8e84d12fa898921ee32f26ee Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 26 Mar 2024 16:15:47 -0500 Subject: [PATCH 11/76] CUDA reduce: only if A not iso --- CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu index 94de78d706..210793148a 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu @@ -24,8 +24,8 @@ // If the reduction is done on the GPU, A will never be iso-valued. -#if GB_C_ISO -#error "kernel undefined for C iso" +#if GB_C_ISO || GB_A_ISO +#error "kernel undefined for C or A iso" #endif // FIXME: put these definitions in GB_cuda_kernel.h: From d3b23d60dda0cbfec4f57b72fb5995eaf18a217e Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 26 Mar 2024 16:17:05 -0500 Subject: [PATCH 12/76] test coverage for GraphBLAS 9.1.0 (Mar 21, 2024) --- Tcov/log_Jan9.txt | 204 -------------------------------------------- Tcov/log_Mar21.txt | 205 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 205 insertions(+), 204 deletions(-) delete mode 100644 Tcov/log_Jan9.txt create mode 100644 Tcov/log_Mar21.txt diff --git a/Tcov/log_Jan9.txt b/Tcov/log_Jan9.txt deleted file mode 100644 index 6cc3b2d621..0000000000 --- a/Tcov/log_Jan9.txt +++ /dev/null @@ -1,204 +0,0 @@ - ----------------------------------------------- [malloc] [cover] -09-Jan 19:02:10 test250 1.4 sec 415: 24525 of 25102 2.3% 286.32/s -09-Jan 19:02:12 test250 2.1 sec 57: 24468 of 25102 2.5% 26.91/s -09-Jan 19:02:12 test279 0.1 sec 130: 24338 of 25102 3.0% 1120.05/s -09-Jan 19:02:12 test278 0.1 sec 49: 24289 of 25102 3.2% 518.63/s -09-Jan 19:02:12 test277 0.1 sec 38: 24251 of 25102 3.4% 412.87/s -09-Jan 19:02:13 test276 0.1 sec 1626: 22625 of 25102 9.9% 16727.71/s -09-Jan 19:02:13 test275 0.1 sec 117: 22508 of 25102 10.3% 1260.79/s -09-Jan 19:02:13 test274 0.1 sec 129: 22379 of 25102 10.8% 1407.42/s -09-Jan 19:02:13 test273 0.2 sec 110: 22269 of 25102 11.3% 479.04/s -09-Jan 19:02:13 test272 0.1 sec 11: 22258 of 25102 11.3% 117.72/s -09-Jan 19:02:13 test271 0.1 sec 497: 21761 of 25102 13.3% 5283.36/s -09-Jan 19:02:14 test270 0.1 sec 286: 21475 of 25102 14.4% 3084.52/s -09-Jan 19:02:14 test269 0.1 sec 87: 21388 of 25102 14.8% 927.38/s -09-Jan 19:02:14 test268 0.2 sec 102: 21286 of 25102 15.2% 441.67/s -09-Jan 19:02:17 test145 2.5 sec 221: 21065 of 25102 16.1% 88.45/s -09-Jan 19:02:17 test145 0.0 sec 1: 21064 of 25102 16.1% 20.22/s -09-Jan 19:02:17 test145 0.0 sec 18: 21046 of 25102 16.2% 818.74/s -09-Jan 19:02:17 test145 0.0 sec 4: 21042 of 25102 16.2% 225.43/s -09-Jan 19:02:18 test145 1.5 sec 34: 21008 of 25102 16.3% 22.38/s -09-Jan 19:02:18 test145 0.0 sec 3: 21005 of 25102 16.3% 178.81/s -09-Jan 19:02:20 test240 1.2 sec 80: 20922 of 25102 16.7% 68.04/s -09-Jan 19:02:20 test240 0.3 sec 1: 20921 of 25102 16.7% 3.39/s -09-Jan 19:02:22 test237 1.4 sec 42: 20879 of 25102 16.8% 29.50/s -09-Jan 19:02:25 test237 2.8 sec 2: 20877 of 25102 16.8% 0.70/s -09-Jan 19:02:25 test237 0.1 sec 18: 20859 of 25102 16.9% 174.87/s -09-Jan 19:02:25 test237 0.0 sec 6: 20853 of 25102 16.9% 219.04/s -09-Jan 19:02:25 test237 0.1 sec 4: 20849 of 25102 16.9% 46.63/s -09-Jan 19:02:26 test267 0.7 sec 8: 20841 of 25102 17.0% 11.91/s -09-Jan 19:02:26 test267 0.0 sec 1: 20840 of 25102 17.0% 1733.10/s -09-Jan 19:02:26 test265 0.5 sec 36: 20804 of 25102 17.1% 68.46/s -09-Jan 19:02:27 test264 0.1 sec 173: 20631 of 25102 17.8% 1794.94/s -09-Jan 19:02:27 test263 0.8 sec 16: 20615 of 25102 17.9% 19.09/s -09-Jan 19:02:28 test262 0.1 sec 76: 20539 of 25102 18.2% 736.18/s -09-Jan 19:02:28 test261 0.1 sec 22: 20517 of 25102 18.3% 238.46/s -09-Jan 19:02:28 test260 0.1 sec 3: 20514 of 25102 18.3% 33.11/s -09-Jan 19:02:31 test259 2.4 sec 4: 20510 of 25102 18.3% 1.64/s -09-Jan 19:02:31 test258 0.4 sec 20: 20490 of 25102 18.4% 55.72/s -09-Jan 19:02:32 test257 0.3 sec 54: 20436 of 25102 18.6% 187.42/s -09-Jan 19:02:32 test255 0.1 sec 8: 20428 of 25102 18.6% 76.72/s -09-Jan 19:02:32 test254 0.1 sec 29: 20399 of 25102 18.7% 365.91/s -09-Jan 19:02:37 test254 4.9 sec 20: 20379 of 25102 18.8% 4.12/s -09-Jan 19:02:37 test254 0.1 sec 1: 20378 of 25102 18.8% 10.57/s -09-Jan 19:02:37 test253 0.2 sec 8: 20370 of 25102 18.9% 38.22/s -09-Jan 19:02:38 test252 0.1 sec 7: 20363 of 25102 18.9% 78.65/s -09-Jan 19:04:00 test251 81.9 sec 472: 19891 of 25102 20.8% 5.76/s -09-Jan 19:07:30 test251 210.0 sec 76: 19815 of 25102 21.1% 0.36/s -09-Jan 19:07:31 test249 1.3 sec 27: 19788 of 25102 21.2% 20.92/s -09-Jan 19:07:32 test247 0.0 sec 24: 19764 of 25102 21.3% 1196.89/s -09-Jan 19:07:43 test246 11.0 sec 72: 19692 of 25102 21.6% 6.56/s -09-Jan 19:08:02 test01 18.8 sec 1420: 18272 of 25102 27.2% 75.59/s -09-Jan 19:08:03 test245 1.0 sec 34: 18238 of 25102 27.3% 34.16/s -09-Jan 19:08:03 test245 0.0 sec 8: 18230 of 25102 27.4% 216.93/s -09-Jan 19:08:03 test199 0.0 sec 1: 18229 of 25102 27.4% 153.73/s -09-Jan 19:08:03 test83 0.1 sec 15: 18214 of 25102 27.4% 159.22/s -09-Jan 19:08:03 test210 0.0 sec 9: 18205 of 25102 27.5% 2048.71/s -09-Jan 19:08:04 test165 0.0 sec 1: 18204 of 25102 27.5% 180.60/s -09-Jan 19:08:04 test219 0.1 sec 9: 18195 of 25102 27.5% 95.65/s -09-Jan 19:08:04 test219 0.3 sec 3: 18192 of 25102 27.5% 11.22/s -09-Jan 19:08:04 test241 0.1 sec 10: 18182 of 25102 27.6% 99.45/s -09-Jan 19:08:05 test220 0.1 sec 15: 18167 of 25102 27.6% 114.71/s -09-Jan 19:08:05 test211 0.0 sec 15: 18152 of 25102 27.7% 422.63/s -09-Jan 19:08:05 test202 0.1 sec 83: 18069 of 25102 28.0% 601.38/s -09-Jan 19:08:05 test202 0.0 sec 1: 18068 of 25102 28.0% 23.24/s -09-Jan 19:08:09 test152 3.0 sec 827: 17241 of 25102 31.3% 278.37/s -09-Jan 19:08:13 test152 4.1 sec 13: 17228 of 25102 31.4% 3.18/s -09-Jan 19:09:30 test152 76.7 sec 245: 16983 of 25102 32.3% 3.19/s -09-Jan 19:09:30 test222 0.2 sec 18: 16965 of 25102 32.4% 95.26/s -09-Jan 19:09:31 test256 0.7 sec 58: 16907 of 25102 32.6% 87.95/s -09-Jan 19:09:34 test186 2.9 sec 44: 16863 of 25102 32.8% 15.25/s -09-Jan 19:09:35 test186 0.5 sec 3: 16860 of 25102 32.8% 6.63/s -09-Jan 19:09:35 test186(0) 0.4 sec 5: 16855 of 25102 32.9% 12.37/s -09-Jan 19:09:36 test150 0.2 sec 44: 16811 of 25102 33.0% 212.26/s -09-Jan 19:09:36 test239 0.1 sec 15: 16796 of 25102 33.1% 117.90/s -09-Jan 19:09:37 test239 1.0 sec 2: 16794 of 25102 33.1% 2.10/s -09-Jan 19:09:38 test235 0.0 sec 4: 16790 of 25102 33.1% 96.59/s -09-Jan 19:09:38 test226 0.0 sec 8: 16782 of 25102 33.1% 568.87/s -09-Jan 19:09:38 test223 0.0 sec 2: 16780 of 25102 33.2% 61.10/s -09-Jan 19:09:38 test204 0.2 sec 14: 16766 of 25102 33.2% 77.02/s -09-Jan 19:09:39 test203 0.1 sec 19: 16747 of 25102 33.3% 203.20/s -09-Jan 19:09:39 test183 0.0 sec 12: 16735 of 25102 33.3% 417.67/s -09-Jan 19:09:39 test179 0.1 sec 15: 16720 of 25102 33.4% 103.52/s -09-Jan 19:09:41 test179 2.0 sec 4: 16716 of 25102 33.4% 2.05/s -09-Jan 19:09:42 test174 0.1 sec 10: 16706 of 25102 33.4% 195.47/s -09-Jan 19:09:42 test155 0.2 sec 43: 16663 of 25102 33.6% 278.84/s -09-Jan 19:09:43 test136 0.2 sec 57: 16606 of 25102 33.8% 253.63/s -09-Jan 19:09:44 test02 0.7 sec 247: 16359 of 25102 34.8% 333.30/s -09-Jan 19:09:44 test109 0.5 sec 10: 16349 of 25102 34.9% 20.75/s -09-Jan 19:09:45 test109 0.0 sec 4: 16345 of 25102 34.9% 1176.82/s -09-Jan 19:09:45 test109 0.4 sec 8: 16337 of 25102 34.9% 22.49/s -09-Jan 19:09:45 test04 0.1 sec 15: 16322 of 25102 35.0% 124.60/s -09-Jan 19:09:46 test207 0.0 sec 2: 16320 of 25102 35.0% 423.64/s -09-Jan 19:09:46 test221 0.0 sec 2: 16318 of 25102 35.0% 267.45/s -09-Jan 19:09:46 test162 0.1 sec 5: 16313 of 25102 35.0% 93.93/s -09-Jan 19:09:49 test159 2.5 sec 72: 16241 of 25102 35.3% 28.98/s -09-Jan 19:09:49 test09 0.0 sec 5: 16236 of 25102 35.3% 503.93/s -09-Jan 19:09:50 test132 0.1 sec 8: 16228 of 25102 35.4% 70.67/s -09-Jan 19:10:03 test141 12.7 sec 551: 15677 of 25102 37.5% 43.39/s -09-Jan 19:10:04 testc2(1,1) 1.4 sec 20: 15657 of 25102 37.6% 14.22/s -09-Jan 19:10:11 testc2(1,1) 6.6 sec 4: 15653 of 25102 37.6% 0.61/s -09-Jan 19:10:12 test214 0.0 sec 3: 15650 of 25102 37.7% 300.90/s -09-Jan 19:10:12 test213 0.0 sec 2: 15648 of 25102 37.7% 182.93/s -09-Jan 19:10:15 test206 2.5 sec 221: 15427 of 25102 38.5% 88.15/s -09-Jan 19:10:32 test206 16.9 sec 24: 15403 of 25102 38.6% 1.42/s -09-Jan 19:10:32 test212 0.0 sec 9: 15394 of 25102 38.7% 429.04/s -09-Jan 19:10:33 test212 0.2 sec 2: 15392 of 25102 38.7% 10.21/s -09-Jan 19:10:33 test128 0.3 sec 49: 15343 of 25102 38.9% 149.05/s -09-Jan 19:10:34 test82 0.1 sec 18: 15325 of 25102 38.9% 201.77/s -09-Jan 19:10:37 test229 3.1 sec 9: 15316 of 25102 39.0% 2.90/s -09-Jan 19:10:39 test229 1.1 sec 1: 15315 of 25102 39.0% 0.93/s -09-Jan 19:10:39 test144 0.6 sec 2: 15313 of 25102 39.0% 3.32/s -09-Jan 19:12:02 test14 82.0 sec 671: 14642 of 25102 41.7% 8.18/s -09-Jan 19:16:28 test14 265.8 sec 118: 14524 of 25102 42.1% 0.44/s -09-Jan 19:16:38 test180 8.7 sec 136: 14388 of 25102 42.7% 15.60/s -09-Jan 19:16:42 test236 3.6 sec 74: 14314 of 25102 43.0% 20.57/s -09-Jan 19:16:44 test232 2.6 sec 22: 14292 of 25102 43.1% 8.46/s -09-Jan 19:17:04 test228 19.0 sec 27: 14265 of 25102 43.2% 1.42/s -09-Jan 19:19:00 test154 115.8 sec 1502: 12763 of 25102 49.2% 12.97/s -09-Jan 19:25:17 test154 376.6 sec 2: 12761 of 25102 49.2% 0.01/s -09-Jan 19:25:31 test238 13.9 sec 54: 12707 of 25102 49.4% 3.88/s -09-Jan 19:26:41 test238 68.9 sec 9: 12698 of 25102 49.4% 0.13/s -09-Jan 19:28:21 test151b 99.9 sec 174: 12524 of 25102 50.1% 1.74/s -09-Jan 19:28:24 test184 3.1 sec 38: 12486 of 25102 50.3% 12.20/s -09-Jan 19:28:38 test191 12.7 sec 21: 12465 of 25102 50.3% 1.65/s -09-Jan 19:29:06 test191 28.4 sec 3: 12462 of 25102 50.4% 0.11/s -09-Jan 19:36:33 test188 445.8 sec 212: 12250 of 25102 51.2% 0.48/s -09-Jan 19:39:01 test188 147.5 sec 3: 12247 of 25102 51.2% 0.02/s -09-Jan 19:39:07 test224 5.0 sec 24: 12223 of 25102 51.3% 4.79/s -09-Jan 19:39:10 test196 2.4 sec 11: 12212 of 25102 51.4% 4.56/s -09-Jan 19:39:16 test209 6.2 sec 20: 12192 of 25102 51.4% 3.24/s -09-Jan 19:39:35 test104 18.4 sec 40: 12152 of 25102 51.6% 2.17/s -09-Jan 19:39:43 test189 7.9 sec 1: 12151 of 25102 51.6% 0.13/s -09-Jan 19:40:51 test194 67.5 sec 5: 12146 of 25102 51.6% 0.07/s -09-Jan 19:41:07 test76 15.4 sec 15: 12131 of 25102 51.7% 0.97/s -09-Jan 19:41:48 test244 39.9 sec 17: 12114 of 25102 51.7% 0.43/s -[malloc debugging turned off] -09-Jan 19:41:48 test201 0.0 sec 3: 12111 of 25102 51.8% 339.14/s -09-Jan 19:41:49 test225 0.1 sec 4: 12107 of 25102 51.8% 26.83/s -09-Jan 19:41:49 test176 0.1 sec 5: 12102 of 25102 51.8% 65.21/s -09-Jan 19:41:50 test208 0.0 sec 5: 12097 of 25102 51.8% 294.38/s -09-Jan 19:41:50 test216 0.1 sec 3: 12094 of 25102 51.8% 28.18/s -09-Jan 19:42:14 test142 23.8 sec 631: 11463 of 25102 54.3% 26.56/s -09-Jan 19:46:53 test142 278.2 sec 10: 11453 of 25102 54.4% 0.04/s -09-Jan 19:47:18 test142 23.9 sec 2: 11451 of 25102 54.4% 0.08/s -09-Jan 19:47:19 test137 0.4 sec 3: 11448 of 25102 54.4% 7.13/s -09-Jan 19:47:19 test137 0.0 sec 2: 11446 of 25102 54.4% 281.14/s -09-Jan 19:47:20 test139 0.4 sec 2: 11444 of 25102 54.4% 4.65/s -09-Jan 19:47:21 test172 0.1 sec 3: 11441 of 25102 54.4% 39.03/s -09-Jan 19:47:22 test148 0.9 sec 4: 11437 of 25102 54.4% 4.47/s -09-Jan 19:47:23 test157 0.6 sec 12: 11425 of 25102 54.5% 19.20/s -09-Jan 19:47:25 test182 1.0 sec 8: 11417 of 25102 54.5% 8.26/s -09-Jan 19:47:26 test108 0.6 sec 2: 11415 of 25102 54.5% 3.29/s -09-Jan 19:47:27 test108 0.4 sec 2: 11413 of 25102 54.5% 5.31/s -09-Jan 19:47:28 test130 0.9 sec 25: 11388 of 25102 54.6% 28.82/s -09-Jan 19:47:29 test124 0.2 sec 3: 11385 of 25102 54.6% 16.23/s -09-Jan 19:47:29 test138 0.1 sec 1: 11384 of 25102 54.6% 19.12/s -09-Jan 19:47:35 test227 4.6 sec 27: 11357 of 25102 54.8% 5.89/s -09-Jan 19:48:03 test125 28.1 sec 630: 10727 of 25102 57.3% 22.39/s -09-Jan 19:50:25 test234 141.5 sec 397: 10330 of 25102 58.8% 2.81/s -09-Jan 19:54:09 test234 222.8 sec 3: 10327 of 25102 58.9% 0.01/s -09-Jan 19:54:56 test242 46.1 sec 77: 10250 of 25102 59.2% 1.67/s -09-Jan 19:54:58 test173 1.5 sec 12: 10238 of 25102 59.2% 7.93/s -09-Jan 19:55:01 test200 3.2 sec 10: 10228 of 25102 59.3% 3.17/s -09-Jan 19:55:02 test197 0.2 sec 1: 10227 of 25102 59.3% 6.26/s -09-Jan 19:55:04 test84 1.3 sec 18: 10209 of 25102 59.3% 13.73/s -09-Jan 19:55:10 test19b 5.8 sec 59: 10150 of 25102 59.6% 10.09/s -09-Jan 19:55:11 test133 0.4 sec 2: 10148 of 25102 59.6% 4.77/s -09-Jan 19:55:16 test80 4.1 sec 12: 10136 of 25102 59.6% 2.93/s -09-Jan 19:56:20 test23 63.5 sec 148: 9988 of 25102 60.2% 2.33/s -09-Jan 19:56:23 test135 1.9 sec 7: 9981 of 25102 60.2% 3.69/s -09-Jan 19:57:36 test160 72.5 sec 24: 9957 of 25102 60.3% 0.33/s -09-Jan 19:57:42 test54 5.2 sec 20: 9937 of 25102 60.4% 3.87/s -09-Jan 19:57:43 test129 1.1 sec 4: 9933 of 25102 60.4% 3.50/s -09-Jan 19:57:46 test69 2.0 sec 6: 9927 of 25102 60.5% 2.95/s -09-Jan 19:59:15 test230 88.0 sec 114: 9813 of 25102 60.9% 1.30/s -09-Jan 20:31:54 test74 1958.2 sec 6637: 3176 of 25102 87.3% 3.39/s -09-Jan 20:43:55 test127 721.3 sec 1707: 1469 of 25102 94.1% 2.37/s -09-Jan 20:43:59 test19 3.2 sec 12: 1457 of 25102 94.2% 3.75/s -09-Jan 20:44:04 test11 3.7 sec 3: 1454 of 25102 94.2% 0.81/s -09-Jan 20:44:08 test215 3.2 sec 1: 1453 of 25102 94.2% 0.31/s -09-Jan 20:44:25 test193 16.6 sec 5: 1448 of 25102 94.2% 0.30/s -09-Jan 20:47:04 test195 158.6 sec 39: 1409 of 25102 94.4% 0.25/s -09-Jan 20:47:29 test243 23.9 sec 7: 1402 of 25102 94.4% 0.29/s -09-Jan 20:47:40 test29 10.6 sec 3: 1399 of 25102 94.4% 0.28/s -09-Jan 20:47:42 testc2(0,0) 1.3 sec 7: 1392 of 25102 94.5% 5.23/s -09-Jan 20:48:02 testc2(0,0) 19.6 sec 1: 1391 of 25102 94.5% 0.05/s -09-Jan 20:48:04 testc4(0) 0.6 sec 4: 1387 of 25102 94.5% 6.36/s -09-Jan 20:48:19 testc7(0) 14.5 sec 3: 1384 of 25102 94.5% 0.21/s -09-Jan 20:48:24 testcc(1) 5.0 sec 1: 1383 of 25102 94.5% 0.20/s -09-Jan 20:48:33 test187 8.2 sec 3: 1380 of 25102 94.5% 0.36/s -09-Jan 20:48:40 test192 5.6 sec 1: 1379 of 25102 94.5% 0.18/s -09-Jan 20:48:59 test181 18.2 sec 10: 1369 of 25102 94.5% 0.55/s -09-Jan 20:50:48 test185 109.1 sec 6: 1363 of 25102 94.6% 0.05/s -09-Jan 20:51:33 test53 43.6 sec 4: 1359 of 25102 94.6% 0.09/s -09-Jan 20:52:22 test17 48.6 sec 27: 1332 of 25102 94.7% 0.56/s -09-Jan 20:59:30 test231 427.7 sec 162: 1170 of 25102 95.3% 0.38/s -09-Jan 21:48:34 test10 2943.1 sec 970: 200 of 25102 99.2% 0.33/s -09-Jan 22:06:39 test75b 1058.8 sec 155: 45 of 25102 99.8% 0.15/s -09-Jan 22:08:08 test21b 87.4 sec 26: 19 of 25102 99.9% 0.30/s -09-Jan 22:09:00 testca(1) 51.4 sec 5: 14 of 25102 99.9% 0.10/s -09-Jan 22:10:54 test81 112.6 sec 1: 13 of 25102 99.9% 0.01/s -09-Jan 22:16:46 test18 351.2 sec 13: all 25102 full 100% 0.04/s -[malloc debugging turned back on] diff --git a/Tcov/log_Mar21.txt b/Tcov/log_Mar21.txt new file mode 100644 index 0000000000..2278483a35 --- /dev/null +++ b/Tcov/log_Mar21.txt @@ -0,0 +1,205 @@ + +---------------------------------------------- [malloc] [cover] +21-Mar 07:50:09 test169 17.1 sec 550: 24397 of 25111 2.8% 32.14/s +21-Mar 07:50:11 test250 1.4 sec 372: 24025 of 25111 4.3% 272.03/s +21-Mar 07:50:13 test250 2.1 sec 57: 23968 of 25111 4.6% 27.46/s +21-Mar 07:50:13 test279 0.1 sec 119: 23849 of 25111 5.0% 1305.15/s +21-Mar 07:50:13 test278 0.1 sec 48: 23801 of 25111 5.2% 538.99/s +21-Mar 07:50:13 test277 0.1 sec 38: 23763 of 25111 5.4% 444.59/s +21-Mar 07:50:13 test276 0.1 sec 1626: 22137 of 25111 11.8% 20321.70/s +21-Mar 07:50:14 test275 0.1 sec 117: 22020 of 25111 12.3% 1536.24/s +21-Mar 07:50:14 test274 0.1 sec 129: 21891 of 25111 12.8% 1739.53/s +21-Mar 07:50:14 test273 0.2 sec 112: 21779 of 25111 13.3% 645.76/s +21-Mar 07:50:14 test272 0.1 sec 11: 21768 of 25111 13.3% 145.87/s +21-Mar 07:50:14 test271 0.1 sec 497: 21271 of 25111 15.3% 6612.74/s +21-Mar 07:50:14 test270 0.1 sec 286: 20985 of 25111 16.4% 3856.58/s +21-Mar 07:50:14 test269 0.1 sec 83: 20902 of 25111 16.8% 1100.91/s +21-Mar 07:50:15 test268 0.1 sec 5: 20897 of 25111 16.8% 46.09/s +21-Mar 07:50:17 test145 2.2 sec 210: 20687 of 25111 17.6% 94.84/s +21-Mar 07:50:17 test145 0.0 sec 1: 20686 of 25111 17.6% 27.58/s +21-Mar 07:50:17 test145 0.0 sec 18: 20668 of 25111 17.7% 794.04/s +21-Mar 07:50:17 test145 0.0 sec 4: 20664 of 25111 17.7% 221.86/s +21-Mar 07:50:19 test145 1.5 sec 34: 20630 of 25111 17.8% 22.54/s +21-Mar 07:50:19 test145 0.0 sec 3: 20627 of 25111 17.9% 182.85/s +21-Mar 07:50:20 test240 1.2 sec 74: 20550 of 25111 18.2% 62.30/s +21-Mar 07:50:20 test240 0.3 sec 1: 20549 of 25111 18.2% 3.54/s +21-Mar 07:50:22 test237 1.4 sec 40: 20509 of 25111 18.3% 27.64/s +21-Mar 07:50:25 test237 2.8 sec 2: 20507 of 25111 18.3% 0.72/s +21-Mar 07:50:25 test237 0.1 sec 18: 20489 of 25111 18.4% 170.21/s +21-Mar 07:50:25 test237 0.0 sec 6: 20483 of 25111 18.4% 227.98/s +21-Mar 07:50:25 test237 0.1 sec 4: 20479 of 25111 18.4% 47.65/s +21-Mar 07:50:26 test267 0.7 sec 8: 20471 of 25111 18.5% 12.09/s +21-Mar 07:50:26 test267 0.0 sec 1: 20470 of 25111 18.5% 1390.82/s +21-Mar 07:50:27 test265 0.5 sec 36: 20434 of 25111 18.6% 71.16/s +21-Mar 07:50:27 test264 0.1 sec 173: 20261 of 25111 19.3% 2187.82/s +21-Mar 07:50:28 test263 0.8 sec 13: 20248 of 25111 19.4% 15.74/s +21-Mar 07:50:28 test262 0.1 sec 22: 20226 of 25111 19.5% 281.16/s +21-Mar 07:50:28 test261 0.1 sec 22: 20204 of 25111 19.5% 283.35/s +21-Mar 07:50:28 test260 0.1 sec 3: 20201 of 25111 19.6% 40.57/s +21-Mar 07:50:31 test259 2.3 sec 4: 20197 of 25111 19.6% 1.71/s +21-Mar 07:50:31 test258 0.4 sec 20: 20177 of 25111 19.6% 56.34/s +21-Mar 07:50:32 test257 0.3 sec 41: 20136 of 25111 19.8% 143.05/s +21-Mar 07:50:32 test255 0.1 sec 8: 20128 of 25111 19.8% 91.47/s +21-Mar 07:50:32 test254 0.1 sec 14: 20114 of 25111 19.9% 207.79/s +21-Mar 07:50:37 test254 4.9 sec 20: 20094 of 25111 20.0% 4.09/s +21-Mar 07:50:37 test254 0.1 sec 1: 20093 of 25111 20.0% 9.10/s +21-Mar 07:50:38 test253 0.2 sec 9: 20084 of 25111 20.0% 56.44/s +21-Mar 07:50:38 test252 0.1 sec 7: 20077 of 25111 20.0% 92.50/s +21-Mar 07:52:03 test251 85.0 sec 434: 19643 of 25111 21.8% 5.11/s +21-Mar 07:55:34 test251 211.5 sec 76: 19567 of 25111 22.1% 0.36/s +21-Mar 07:55:36 test249 1.3 sec 24: 19543 of 25111 22.2% 18.88/s +21-Mar 07:55:36 test247 0.0 sec 23: 19520 of 25111 22.3% 811.86/s +21-Mar 07:55:47 test246 11.1 sec 70: 19450 of 25111 22.5% 6.32/s +21-Mar 07:56:06 test01 18.6 sec 1340: 18110 of 25111 27.9% 71.92/s +21-Mar 07:56:07 test245 1.0 sec 34: 18076 of 25111 28.0% 34.71/s +21-Mar 07:56:07 test245 0.0 sec 8: 18068 of 25111 28.0% 216.93/s +21-Mar 07:56:08 test199 0.0 sec 1: 18067 of 25111 28.1% 149.90/s +21-Mar 07:56:08 test83 0.1 sec 10: 18057 of 25111 28.1% 129.77/s +21-Mar 07:56:08 test210 0.0 sec 7: 18050 of 25111 28.1% 2143.29/s +21-Mar 07:56:08 test165 0.0 sec 1: 18049 of 25111 28.1% 206.83/s +21-Mar 07:56:08 test219 0.1 sec 9: 18040 of 25111 28.2% 114.72/s +21-Mar 07:56:09 test219 0.3 sec 3: 18037 of 25111 28.2% 10.46/s +21-Mar 07:56:09 test241 0.1 sec 10: 18027 of 25111 28.2% 88.80/s +21-Mar 07:56:09 test220 0.1 sec 10: 18017 of 25111 28.3% 88.20/s +21-Mar 07:56:10 test211 0.0 sec 15: 18002 of 25111 28.3% 450.46/s +21-Mar 07:56:10 test202 0.1 sec 67: 17935 of 25111 28.6% 552.40/s +21-Mar 07:56:10 test202 0.0 sec 1: 17934 of 25111 28.6% 23.10/s +21-Mar 07:56:13 test152 3.1 sec 827: 17107 of 25111 31.9% 270.41/s +21-Mar 07:56:18 test152 4.2 sec 13: 17094 of 25111 31.9% 3.11/s +21-Mar 07:57:35 test152 76.9 sec 245: 16849 of 25111 32.9% 3.19/s +21-Mar 07:57:35 test222 0.2 sec 18: 16831 of 25111 33.0% 112.61/s +21-Mar 07:57:36 test256 0.6 sec 58: 16773 of 25111 33.2% 90.36/s +21-Mar 07:57:39 test186 2.9 sec 44: 16729 of 25111 33.4% 15.37/s +21-Mar 07:57:40 test186 0.4 sec 3: 16726 of 25111 33.4% 6.70/s +21-Mar 07:57:40 test186(0) 0.4 sec 5: 16721 of 25111 33.4% 12.60/s +21-Mar 07:57:41 test150 0.2 sec 36: 16685 of 25111 33.6% 173.63/s +21-Mar 07:57:41 test239 0.1 sec 15: 16670 of 25111 33.6% 135.61/s +21-Mar 07:57:42 test239 0.9 sec 2: 16668 of 25111 33.6% 2.18/s +21-Mar 07:57:42 test235 0.0 sec 4: 16664 of 25111 33.6% 102.84/s +21-Mar 07:57:43 test226 0.0 sec 8: 16656 of 25111 33.7% 531.21/s +21-Mar 07:57:43 test223 0.0 sec 2: 16654 of 25111 33.7% 66.81/s +21-Mar 07:57:43 test204 0.1 sec 14: 16640 of 25111 33.7% 95.85/s +21-Mar 07:57:43 test203 0.1 sec 9: 16631 of 25111 33.8% 116.95/s +21-Mar 07:57:44 test183 0.0 sec 12: 16619 of 25111 33.8% 449.15/s +21-Mar 07:57:44 test179 0.1 sec 15: 16604 of 25111 33.9% 120.94/s +21-Mar 07:57:46 test179 1.9 sec 4: 16600 of 25111 33.9% 2.10/s +21-Mar 07:57:47 test174 0.1 sec 10: 16590 of 25111 33.9% 193.64/s +21-Mar 07:57:47 test155 0.1 sec 41: 16549 of 25111 34.1% 293.90/s +21-Mar 07:57:47 test136 0.2 sec 55: 16494 of 25111 34.3% 283.29/s +21-Mar 07:57:48 test02 0.7 sec 247: 16247 of 25111 35.3% 348.25/s +21-Mar 07:57:49 test109 0.5 sec 10: 16237 of 25111 35.3% 21.79/s +21-Mar 07:57:49 test109 0.0 sec 4: 16233 of 25111 35.4% 1164.82/s +21-Mar 07:57:50 test109 0.4 sec 8: 16225 of 25111 35.4% 21.68/s +21-Mar 07:57:50 test04 0.1 sec 15: 16210 of 25111 35.4% 135.88/s +21-Mar 07:57:50 test207 0.0 sec 2: 16208 of 25111 35.5% 470.37/s +21-Mar 07:57:51 test221 0.0 sec 2: 16206 of 25111 35.5% 281.25/s +21-Mar 07:57:51 test162 0.1 sec 3: 16203 of 25111 35.5% 48.76/s +21-Mar 07:57:54 test159 2.5 sec 72: 16131 of 25111 35.8% 29.25/s +21-Mar 07:57:54 test09 0.0 sec 5: 16126 of 25111 35.8% 414.52/s +21-Mar 07:57:54 test132 0.1 sec 8: 16118 of 25111 35.8% 82.14/s +21-Mar 07:58:07 test141 12.7 sec 549: 15569 of 25111 38.0% 43.27/s +21-Mar 07:58:09 testc2(1,1) 1.4 sec 20: 15549 of 25111 38.1% 14.56/s +21-Mar 07:58:16 testc2(1,1) 6.6 sec 4: 15545 of 25111 38.1% 0.60/s +21-Mar 07:58:16 test214 0.0 sec 3: 15542 of 25111 38.1% 308.10/s +21-Mar 07:58:17 test213 0.0 sec 2: 15540 of 25111 38.1% 176.41/s +21-Mar 07:58:20 test206 2.6 sec 221: 15319 of 25111 39.0% 83.80/s +21-Mar 07:58:37 test206 17.1 sec 24: 15295 of 25111 39.1% 1.40/s +21-Mar 07:58:37 test212 0.0 sec 8: 15287 of 25111 39.1% 394.19/s +21-Mar 07:58:38 test212 0.2 sec 2: 15285 of 25111 39.1% 10.49/s +21-Mar 07:58:39 test128 0.3 sec 41: 15244 of 25111 39.3% 118.86/s +21-Mar 07:58:39 test82 0.1 sec 16: 15228 of 25111 39.4% 176.26/s +21-Mar 07:58:42 test229 3.1 sec 9: 15219 of 25111 39.4% 2.92/s +21-Mar 07:58:44 test229 1.1 sec 1: 15218 of 25111 39.4% 0.95/s +21-Mar 07:58:45 test144 0.6 sec 2: 15216 of 25111 39.4% 3.41/s +21-Mar 08:00:07 test14 82.4 sec 662: 14554 of 25111 42.0% 8.03/s +21-Mar 08:04:35 test14 267.4 sec 118: 14436 of 25111 42.5% 0.44/s +21-Mar 08:04:45 test180 9.0 sec 128: 14308 of 25111 43.0% 14.21/s +21-Mar 08:04:49 test236 3.7 sec 74: 14234 of 25111 43.3% 20.20/s +21-Mar 08:04:52 test232 2.6 sec 22: 14212 of 25111 43.4% 8.38/s +21-Mar 08:05:12 test228 19.7 sec 27: 14185 of 25111 43.5% 1.37/s +21-Mar 08:07:15 test154 122.3 sec 1502: 12683 of 25111 49.5% 12.28/s +21-Mar 08:13:36 test154 381.2 sec 2: 12681 of 25111 49.5% 0.01/s +21-Mar 08:13:51 test238 14.8 sec 54: 12627 of 25111 49.7% 3.65/s +21-Mar 08:15:02 test238 69.8 sec 9: 12618 of 25111 49.8% 0.13/s +21-Mar 08:16:43 test151b 101.3 sec 126: 12492 of 25111 50.3% 1.24/s +21-Mar 08:16:47 test184 3.1 sec 38: 12454 of 25111 50.4% 12.26/s +21-Mar 08:17:00 test191 12.9 sec 21: 12433 of 25111 50.5% 1.63/s +21-Mar 08:17:29 test191 28.6 sec 3: 12430 of 25111 50.5% 0.10/s +21-Mar 08:25:00 test188 450.3 sec 212: 12218 of 25111 51.3% 0.47/s +21-Mar 08:27:30 test188 148.9 sec 3: 12215 of 25111 51.4% 0.02/s +21-Mar 08:27:36 test224 5.2 sec 24: 12191 of 25111 51.5% 4.58/s +21-Mar 08:27:38 test196 2.4 sec 11: 12180 of 25111 51.5% 4.56/s +21-Mar 08:27:44 test209 5.4 sec 20: 12160 of 25111 51.6% 3.68/s +21-Mar 08:28:04 test104 19.0 sec 40: 12120 of 25111 51.7% 2.11/s +21-Mar 08:28:12 test189 8.0 sec 1: 12119 of 25111 51.7% 0.12/s +21-Mar 08:29:23 test194 70.1 sec 5: 12114 of 25111 51.8% 0.07/s +21-Mar 08:29:39 test76 16.0 sec 15: 12099 of 25111 51.8% 0.94/s +21-Mar 08:30:21 test244 41.0 sec 17: 12082 of 25111 51.9% 0.41/s +[malloc debugging turned off] +21-Mar 08:30:21 test201 0.0 sec 3: 12079 of 25111 51.9% 377.74/s +21-Mar 08:30:22 test225 0.1 sec 1: 12078 of 25111 51.9% 6.95/s +21-Mar 08:30:22 test176 0.1 sec 5: 12073 of 25111 51.9% 66.48/s +21-Mar 08:30:23 test208 0.0 sec 5: 12068 of 25111 51.9% 302.72/s +21-Mar 08:30:23 test216 0.1 sec 3: 12065 of 25111 52.0% 33.92/s +21-Mar 08:30:48 test142 24.0 sec 631: 11434 of 25111 54.5% 26.33/s +21-Mar 08:35:28 test142 279.9 sec 10: 11424 of 25111 54.5% 0.04/s +21-Mar 08:35:53 test142 23.6 sec 2: 11422 of 25111 54.5% 0.08/s +21-Mar 08:35:53 test137 0.4 sec 3: 11419 of 25111 54.5% 7.70/s +21-Mar 08:35:54 test137 0.0 sec 2: 11417 of 25111 54.5% 281.53/s +21-Mar 08:35:55 test139 0.4 sec 2: 11415 of 25111 54.5% 5.41/s +21-Mar 08:35:55 test172 0.1 sec 3: 11412 of 25111 54.6% 39.19/s +21-Mar 08:35:57 test148 0.8 sec 4: 11408 of 25111 54.6% 4.94/s +21-Mar 08:35:58 test157 0.7 sec 12: 11396 of 25111 54.6% 17.23/s +21-Mar 08:35:59 test182 1.0 sec 5: 11391 of 25111 54.6% 5.25/s +21-Mar 08:36:00 test108 0.6 sec 2: 11389 of 25111 54.6% 3.23/s +21-Mar 08:36:01 test108 0.4 sec 2: 11387 of 25111 54.7% 5.41/s +21-Mar 08:36:03 test130 0.8 sec 22: 11365 of 25111 54.7% 26.46/s +21-Mar 08:36:03 test124 0.2 sec 3: 11362 of 25111 54.8% 17.33/s +21-Mar 08:36:04 test138 0.0 sec 1: 11361 of 25111 54.8% 20.29/s +21-Mar 08:36:09 test227 4.8 sec 27: 11334 of 25111 54.9% 5.58/s +21-Mar 08:36:39 test125 29.4 sec 630: 10704 of 25111 57.4% 21.46/s +21-Mar 08:39:05 test234 144.9 sec 385: 10319 of 25111 58.9% 2.66/s +21-Mar 08:42:51 test234 225.6 sec 3: 10316 of 25111 58.9% 0.01/s +21-Mar 08:43:40 test242 48.2 sec 77: 10239 of 25111 59.2% 1.60/s +21-Mar 08:43:42 test173 1.6 sec 11: 10228 of 25111 59.3% 7.06/s +21-Mar 08:43:46 test200 3.2 sec 10: 10218 of 25111 59.3% 3.09/s +21-Mar 08:43:46 test197 0.1 sec 1: 10217 of 25111 59.3% 7.52/s +21-Mar 08:43:48 test84 1.3 sec 18: 10199 of 25111 59.4% 13.38/s +21-Mar 08:43:55 test19b 6.0 sec 59: 10140 of 25111 59.6% 9.83/s +21-Mar 08:43:56 test133 0.4 sec 2: 10138 of 25111 59.6% 5.21/s +21-Mar 08:44:00 test80 4.0 sec 12: 10126 of 25111 59.7% 3.03/s +21-Mar 08:45:05 test23 63.9 sec 148: 9978 of 25111 60.3% 2.31/s +21-Mar 08:45:07 test135 1.9 sec 7: 9971 of 25111 60.3% 3.69/s +21-Mar 08:46:23 test160 74.6 sec 24: 9947 of 25111 60.4% 0.32/s +21-Mar 08:46:28 test54 5.2 sec 20: 9927 of 25111 60.5% 3.85/s +21-Mar 08:46:30 test129 1.2 sec 4: 9923 of 25111 60.5% 3.45/s +21-Mar 08:46:33 test69 2.1 sec 6: 9917 of 25111 60.5% 2.91/s +21-Mar 08:48:07 test230 93.5 sec 114: 9803 of 25111 61.0% 1.22/s +21-Mar 09:21:15 test74 1987.5 sec 6637: 3166 of 25111 87.4% 3.34/s +21-Mar 09:33:25 test127 729.1 sec 1703: 1463 of 25111 94.2% 2.34/s +21-Mar 09:33:29 test19 3.3 sec 12: 1451 of 25111 94.2% 3.65/s +21-Mar 09:33:33 test11 3.8 sec 3: 1448 of 25111 94.2% 0.78/s +21-Mar 09:33:37 test215 2.9 sec 1: 1447 of 25111 94.2% 0.34/s +21-Mar 09:33:55 test193 17.1 sec 5: 1442 of 25111 94.3% 0.29/s +21-Mar 09:36:35 test195 159.4 sec 39: 1403 of 25111 94.4% 0.24/s +21-Mar 09:37:00 test243 24.9 sec 7: 1396 of 25111 94.4% 0.28/s +21-Mar 09:37:12 test29 10.8 sec 3: 1393 of 25111 94.5% 0.28/s +21-Mar 09:37:14 testc2(0,0) 1.3 sec 7: 1386 of 25111 94.5% 5.30/s +21-Mar 09:37:34 testc2(0,0) 19.6 sec 1: 1385 of 25111 94.5% 0.05/s +21-Mar 09:37:35 testc4(0) 0.6 sec 4: 1381 of 25111 94.5% 6.53/s +21-Mar 09:37:51 testc7(0) 14.7 sec 3: 1378 of 25111 94.5% 0.20/s +21-Mar 09:37:57 testcc(1) 5.1 sec 1: 1377 of 25111 94.5% 0.20/s +21-Mar 09:38:06 test187 8.6 sec 3: 1374 of 25111 94.5% 0.35/s +21-Mar 09:38:12 test192 5.8 sec 1: 1373 of 25111 94.5% 0.17/s +21-Mar 09:38:32 test181 18.5 sec 4: 1369 of 25111 94.5% 0.22/s +21-Mar 09:40:22 test185 109.6 sec 6: 1363 of 25111 94.6% 0.05/s +21-Mar 09:41:06 test53 43.6 sec 4: 1359 of 25111 94.6% 0.09/s +21-Mar 09:41:57 test17 49.7 sec 27: 1332 of 25111 94.7% 0.54/s +21-Mar 09:49:21 test231 443.1 sec 162: 1170 of 25111 95.3% 0.37/s +21-Mar 10:44:39 test10 3317.2 sec 970: 200 of 25111 99.2% 0.29/s +21-Mar 11:03:35 test75b 1112.2 sec 155: 45 of 25111 99.8% 0.14/s +21-Mar 11:05:08 test21b 90.6 sec 26: 19 of 25111 99.9% 0.29/s +21-Mar 11:06:01 testca(1) 52.1 sec 5: 14 of 25111 99.9% 0.10/s +21-Mar 11:08:01 test81 119.4 sec 1: 13 of 25111 99.9% 0.01/s +21-Mar 11:14:12 test18 369.8 sec 13: all 25111 full 100% 0.04/s +[malloc debugging turned back on] From 2e7499fcad379c81529148f22ec8e6ad30d93a75 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Thu, 28 Mar 2024 09:12:26 -0500 Subject: [PATCH 13/76] remove -latomic from MATLAB library --- GraphBLAS/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/GraphBLAS/CMakeLists.txt b/GraphBLAS/CMakeLists.txt index 51156a96ea..b62e2120f4 100644 --- a/GraphBLAS/CMakeLists.txt +++ b/GraphBLAS/CMakeLists.txt @@ -211,10 +211,10 @@ if ( NOT WIN32 ) target_link_libraries ( graphblas_matlab PUBLIC dl ) endif ( ) -include ( SuiteSparseAtomic ) -if ( LIBATOMIC_REQUIRED ) - target_link_libraries ( graphblas_matlab PUBLIC atomic ) -endif ( ) +# include ( SuiteSparseAtomic ) +# if ( LIBATOMIC_REQUIRED ) +# target_link_libraries ( graphblas_matlab PUBLIC atomic ) +# endif ( ) #------------------------------------------------------------------------------- # add library dependencies From 923612b414996d0283954045160f4c06b4a80ad8 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Thu, 28 Mar 2024 09:12:54 -0500 Subject: [PATCH 14/76] saxpy4 optimizations, in progress --- GraphBLAS/CMakeLists.txt | 8 +- Include/GraphBLAS.h | 2 +- Source/Shared/GB_mxm_shared_definitions.h | 14 +- ...GB_AxB_saxbit_A_sparse_B_bitmap_template.c | 11 +- Source/Template/GB_AxB_saxpy4_meta.c | 23 ++- Source/Template/GB_AxB_saxpy4_panel.c | 142 ++++++++++++++---- Source/Template/GB_AxB_saxpy4_template.c | 42 ++---- 7 files changed, 170 insertions(+), 72 deletions(-) diff --git a/GraphBLAS/CMakeLists.txt b/GraphBLAS/CMakeLists.txt index 51156a96ea..b62e2120f4 100644 --- a/GraphBLAS/CMakeLists.txt +++ b/GraphBLAS/CMakeLists.txt @@ -211,10 +211,10 @@ if ( NOT WIN32 ) target_link_libraries ( graphblas_matlab PUBLIC dl ) endif ( ) -include ( SuiteSparseAtomic ) -if ( LIBATOMIC_REQUIRED ) - target_link_libraries ( graphblas_matlab PUBLIC atomic ) -endif ( ) +# include ( SuiteSparseAtomic ) +# if ( LIBATOMIC_REQUIRED ) +# target_link_libraries ( graphblas_matlab PUBLIC atomic ) +# endif ( ) #------------------------------------------------------------------------------- # add library dependencies diff --git a/Include/GraphBLAS.h b/Include/GraphBLAS.h index 1f870d0801..60aab0295b 100644 --- a/Include/GraphBLAS.h +++ b/Include/GraphBLAS.h @@ -133,7 +133,7 @@ //------------------------------------------------------------------------------ #ifndef GRAPHBLAS_HAS_CUDA -#define GRAPHBLAS_HAS_CUDA +/* #undef GRAPHBLAS_HAS_CUDA */ #endif //------------------------------------------------------------------------------ diff --git a/Source/Shared/GB_mxm_shared_definitions.h b/Source/Shared/GB_mxm_shared_definitions.h index 5db803c302..54ea3af76e 100644 --- a/Source/Shared/GB_mxm_shared_definitions.h +++ b/Source/Shared/GB_mxm_shared_definitions.h @@ -175,6 +175,11 @@ #define GB_PAIR_ONE 1 #endif + // Zx [p] += aik * bkj where Zx is ztype + #ifndef GB_MULTADD2 + #define GB_MULTADD2(Zx,p,a,b,i,k,j) + #endif + #else //-------------------------------------------------------------------------- @@ -183,7 +188,8 @@ // These definitions require explicit types to be used, not GB_void. // Generic methods using GB_void for all types, memcpy, and function - // pointers for all computations must #define these macros first. + // pointers for all computations must #define these macros first, + // or #undef them and re-#define them. // declare a scalar of ztype #ifndef GB_CIJ_DECLARE @@ -231,5 +237,11 @@ #define GB_PAIR_ONE ((GB_Z_TYPE) 1) #endif + // Zx [p] += aik * bkj where Zx is ztype + #ifndef GB_MULTADD2 + #define GB_MULTADD2(Zx,p,a,b,i,k,j) GB_MULTADD (Zx [p], a, b, i, k, j) + #endif + #endif #endif + diff --git a/Source/Template/GB_AxB_saxbit_A_sparse_B_bitmap_template.c b/Source/Template/GB_AxB_saxbit_A_sparse_B_bitmap_template.c index 48d62bf737..b50af16053 100644 --- a/Source/Template/GB_AxB_saxbit_A_sparse_B_bitmap_template.c +++ b/Source/Template/GB_AxB_saxbit_A_sparse_B_bitmap_template.c @@ -117,22 +117,22 @@ #undef GB_MULT_A_ik_G_kj #if ( GB_IS_PAIR_MULTIPLIER && !GB_Z_IS_COMPLEX ) // t = A(i,k) * B (k,j) is already #defined as 1 - #define GB_MULT_A_ik_G_kj(gkj,jj) + #define GB_MULT_A_ik_G_kj(gkj,i,jj) #else // t = A(i,k) * B (k,j) - #define GB_MULT_A_ik_G_kj(gkj,jj) \ + #define GB_MULT_A_ik_G_kj(gkj,i,jj) \ GB_CIJ_DECLARE (t) ; \ GB_MULT (t, aik, gkj, i, k, j1 + jj) #endif #undef GB_HX_COMPUTE - #define GB_HX_COMPUTE(gkj,gb,jj) \ + #define GB_HX_COMPUTE(pH,i,gkj,gb,jj) \ { \ /* H (i,jj) += A(i,k) * B(k,j) */ \ if (GB_B_kj_PRESENT (gb)) \ { \ /* t = A(i,k) * B (k,j) */ \ - GB_MULT_A_ik_G_kj (gkj, jj) ; \ + GB_MULT_A_ik_G_kj (gkj, i, jj) ; \ if (Hf [pH+jj] == 0) \ { \ /* H(i,jj) is a new entry */ \ @@ -149,6 +149,9 @@ } #include "GB_AxB_saxpy4_panel.c" + #undef GB_MULT_A_ik_G_kj + #undef GB_HX_COMPUTE + #undef GB_B_kj_PRESENT //-------------------------------------------------------------- // C<#M>(:,j1:j2-1) = H diff --git a/Source/Template/GB_AxB_saxpy4_meta.c b/Source/Template/GB_AxB_saxpy4_meta.c index ef030b850c..011aaa1c78 100644 --- a/Source/Template/GB_AxB_saxpy4_meta.c +++ b/Source/Template/GB_AxB_saxpy4_meta.c @@ -40,19 +40,36 @@ #endif const int8_t *restrict Bb = B->b ; - const bool B_iso = B->iso ; const int64_t bvlen = B->vlen ; const int64_t bvdim = B->vdim ; + + #ifdef GB_JIT_KERNEL + #define B_is_bitmap GB_B_IS_BITMAP + #define B_iso GB_B_ISO + #else const bool B_is_bitmap = GB_IS_BITMAP (B) ; - ASSERT (B_is_bitmap || GB_IS_FULL (B)) ; + const bool B_iso = B->iso ; + #endif + + ASSERT (GB_IS_BITMAP (B) || GB_IS_FULL (B)) ; const int64_t *restrict Ap = A->p ; const int64_t *restrict Ah = A->h ; const int64_t *restrict Ai = A->i ; - const bool A_iso = A->iso ; const int64_t anvec = A->nvec ; const int64_t avlen = A->vlen ; const int64_t avdim = A->vdim ; + + #ifdef GB_JIT_KERNEL + #define A_is_hyper GB_A_IS_HYPER + #define A_is_sparse GB_A_IS_SPARSE + #define A_iso GB_A_ISO + #else + const bool A_is_hyper = GB_IS_HYPERSPARSE (A) ; + const bool A_is_sparse = GB_IS_SPARSE (A) ; + const bool A_iso = A->iso ; + #endif + ASSERT (GB_IS_SPARSE (A) || GB_IS_HYPERSPARSE (A)) ; #if !GB_A_IS_PATTERN diff --git a/Source/Template/GB_AxB_saxpy4_panel.c b/Source/Template/GB_AxB_saxpy4_panel.c index 76da71e79b..b0f1c75cbb 100644 --- a/Source/Template/GB_AxB_saxpy4_panel.c +++ b/Source/Template/GB_AxB_saxpy4_panel.c @@ -47,10 +47,10 @@ const int64_t pH = i * 4 ; GB_DECLAREA (aik) ; GB_GETA (aik, Ax, pA, A_iso) ; - GB_HX_COMPUTE (gk0, gb0, 0) ; - GB_HX_COMPUTE (gk1, gb1, 1) ; - GB_HX_COMPUTE (gk2, gb2, 2) ; - GB_HX_COMPUTE (gk3, gb3, 3) ; + GB_HX_COMPUTE (pH, i, gk0, gb0, 0) ; + GB_HX_COMPUTE (pH, i, gk1, gb1, 1) ; + GB_HX_COMPUTE (pH, i, gk2, gb2, 2) ; + GB_HX_COMPUTE (pH, i, gk3, gb3, 3) ; } } break ; @@ -82,9 +82,9 @@ const int64_t pH = i * 3 ; GB_DECLAREA (aik) ; GB_GETA (aik, Ax, pA, A_iso) ; - GB_HX_COMPUTE (gk0, gb0, 0) ; - GB_HX_COMPUTE (gk1, gb1, 1) ; - GB_HX_COMPUTE (gk2, gb2, 2) ; + GB_HX_COMPUTE (pH, i, gk0, gb0, 0) ; + GB_HX_COMPUTE (pH, i, gk1, gb1, 1) ; + GB_HX_COMPUTE (pH, i, gk2, gb2, 2) ; } } break ; @@ -113,43 +113,121 @@ const int64_t pH = i * 2 ; GB_DECLAREA (aik) ; GB_GETA (aik, Ax, pA, A_iso) ; - GB_HX_COMPUTE (gk0, gb0, 0) ; - GB_HX_COMPUTE (gk1, gb1, 1) ; + GB_HX_COMPUTE (pH, i, gk0, gb0, 0) ; + GB_HX_COMPUTE (pH, i, gk1, gb1, 1) ; } } break ; case 1 : - for (int64_t kA = 0 ; kA < anvec ; kA++) + if (A_iso) { - // get A(:,k) - const int64_t k = GBH_A (Ah, kA) ; - // get B(k,j1:j2-1) where j1 == j2-1 - #if GB_B_IS_BITMAP - const int8_t gb0 = Gb [k] ; - if (!gb0) continue ; - #endif - // H += A(:,k)*B(k,j1:j2-1) - GB_DECLAREB (gk0) ; - GB_GETB (gk0, Gx, k, B_iso) ; - const int64_t pA_end = Ap [kA+1] ; - for (int64_t pA = Ap [kA] ; pA < pA_end ; pA++) - { - const int64_t i = Ai [pA] ; - const int64_t pH = i ; - GB_DECLAREA (aik) ; - GB_GETA (aik, Ax, pA, A_iso) ; - GB_HX_COMPUTE (gk0, 1, 0) ; + // A is iso + GB_DECLAREA (aik) ; + GB_GETA (aik, Ax, 0, true) ; + if (A_is_hyper) + { + // A is hyper and iso + for (int64_t kA = 0 ; kA < anvec ; kA++) + { + // get A(:,k) + const int64_t k = Ah [kA] ; + // get B(k,j1) + #if GB_B_IS_BITMAP + const int8_t gb0 = Gb [k] ; + if (!gb0) continue ; + #endif + // H += A(:,k)*B(k,j1) + GB_DECLAREB (gk0) ; + GB_GETB (gk0, Gx, k, B_iso) ; + const int64_t pA_end = Ap [kA+1] ; + for (int64_t pA = Ap [kA] ; pA < pA_end ; pA++) + { + // H (i) += aik * gk0 + GB_HX_COMPUTE (Ai [pA], Ai [pA], gk0, 1, 0) ; + } + } + } + else + { + // A is sparse and iso + for (int64_t k = 0 ; k < anvec ; k++) + { + // get B(k,j1) + #if GB_B_IS_BITMAP + const int8_t gb0 = Gb [k] ; + if (!gb0) continue ; + #endif + // H += A(:,k)*B(k,j1) + GB_DECLAREB (gk0) ; + GB_GETB (gk0, Gx, k, B_iso) ; + const int64_t pA_end = Ap [k+1] ; + for (int64_t pA = Ap [k] ; pA < pA_end ; pA++) + { + // H (i) += aik * gk0 + GB_HX_COMPUTE (Ai [pA], Ai [pA], gk0, 1, 0) ; + } + } + } + } + else + { + if (A_is_hyper) + { + // A is hyper and non-iso + for (int64_t kA = 0 ; kA < anvec ; kA++) + { + // get A(:,k) + const int64_t k = Ah [kA] ; + // get B(k,j1) + #if GB_B_IS_BITMAP + const int8_t gb0 = Gb [k] ; + if (!gb0) continue ; + #endif + // H += A(:,k)*B(k,j1) + GB_DECLAREB (gk0) ; + GB_GETB (gk0, Gx, k, B_iso) ; + const int64_t pA_end = Ap [kA+1] ; + for (int64_t pA = Ap [kA] ; pA < pA_end ; pA++) + { + // aik = A (i,j) + GB_DECLAREA (aik) ; + GB_GETA (aik, Ax, pA, false) ; + // H (i) += aik * gk0 + GB_HX_COMPUTE (Ai [pA], Ai [pA], gk0, 1, 0) ; + } + } + } + else + { + // A is sparse and non-iso + for (int64_t k = 0 ; k < anvec ; k++) + { + // get B(k,j1) + #if GB_B_IS_BITMAP + const int8_t gb0 = Gb [k] ; + if (!gb0) continue ; + #endif + // H += A(:,k)*B(k,j1) + GB_DECLAREB (gk0) ; + GB_GETB (gk0, Gx, k, B_iso) ; + const int64_t pA_end = Ap [k+1] ; + for (int64_t pA = Ap [k] ; pA < pA_end ; pA++) + { + // aik = A (i,j) + GB_DECLAREA (aik) ; + GB_GETA (aik, Ax, pA, false) ; + // H (i) += aik * gk0 + GB_HX_COMPUTE (Ai [pA], Ai [pA], gk0, 1, 0) ; + } + } } } + break ; default:; } - - #undef GB_HX_COMPUTE - #undef GB_B_kj_PRESENT - #undef GB_MULT_A_ik_G_kj } diff --git a/Source/Template/GB_AxB_saxpy4_template.c b/Source/Template/GB_AxB_saxpy4_template.c index 6c7d6c06fc..2599378f22 100644 --- a/Source/Template/GB_AxB_saxpy4_template.c +++ b/Source/Template/GB_AxB_saxpy4_template.c @@ -118,38 +118,26 @@ // H += A*G for one panel //-------------------------------------------------------------- - #undef GB_B_kj_PRESENT - #if GB_B_IS_BITMAP - #define GB_B_kj_PRESENT(b) b - #else - #define GB_B_kj_PRESENT(b) 1 - #endif + // GB_HX_COMPUTE: computes H (i,jj) += A(i,k) * B(k,j) + // where H(i,jj) is located at Hx [pH+jj], aij = A(i,k), + // and gkj = B(k,j). gb is the bitmap value for B(k,j). - #undef GB_MULT_A_ik_G_kj - #if ( GB_IS_PAIR_MULTIPLIER && !GB_Z_IS_COMPLEX ) - // t = A(i,k) * B (k,j) is already #defined as 1 - #define GB_MULT_A_ik_G_kj(gkj,jj) + #undef GB_HX_COMPUTE + #if GB_B_IS_BITMAP + #define GB_HX_COMPUTE(pH,i,gkj,gb,jj) \ + if (gb) \ + { \ + GB_MULTADD2 (Hx, pH+jj, aik, gkj, i, k, j1+jj) ; \ + } #else - // t = A(i,k) * B (k,j) - #define GB_MULT_A_ik_G_kj(gkj,jj) \ - GB_CIJ_DECLARE (t) ; \ - GB_MULT (t, aik, gkj, i, k, j1 + jj) + #define GB_HX_COMPUTE(pH,i,gkj,gb,jj) \ + { \ + GB_MULTADD2 (Hx, pH+jj, aik, gkj, i, k, j1+jj) ; \ + } #endif - #undef GB_HX_COMPUTE - #define GB_HX_COMPUTE(gkj,gb,jj) \ - { \ - /* H (i,jj) += A(i,k) * B(k,j) */ \ - if (GB_B_kj_PRESENT (gb)) \ - { \ - /* t = A(i,k) * B (k,j) */ \ - GB_MULT_A_ik_G_kj (gkj, jj) ; \ - /* Hx(i,jj)+=t */ \ - GB_HX_UPDATE (pH+jj, t) ; \ - } \ - } - #include "GB_AxB_saxpy4_panel.c" + #undef GB_HX_COMPUTE //-------------------------------------------------------------- // C(:,j1:j2-1) = H From 271a0d8c868a91ade3ee509ba2ca2f5c3d11cc3f Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Fri, 29 Mar 2024 09:46:35 -0500 Subject: [PATCH 15/76] . --- Include/GraphBLAS.h | 2 +- Source/Template/GB_AxB_saxpy4_panel.c | 120 ++++---------------------- 2 files changed, 20 insertions(+), 102 deletions(-) diff --git a/Include/GraphBLAS.h b/Include/GraphBLAS.h index 60aab0295b..1f870d0801 100644 --- a/Include/GraphBLAS.h +++ b/Include/GraphBLAS.h @@ -133,7 +133,7 @@ //------------------------------------------------------------------------------ #ifndef GRAPHBLAS_HAS_CUDA -/* #undef GRAPHBLAS_HAS_CUDA */ +#define GRAPHBLAS_HAS_CUDA #endif //------------------------------------------------------------------------------ diff --git a/Source/Template/GB_AxB_saxpy4_panel.c b/Source/Template/GB_AxB_saxpy4_panel.c index b0f1c75cbb..c19755af96 100644 --- a/Source/Template/GB_AxB_saxpy4_panel.c +++ b/Source/Template/GB_AxB_saxpy4_panel.c @@ -121,110 +121,28 @@ case 1 : - if (A_iso) - { - // A is iso - GB_DECLAREA (aik) ; - GB_GETA (aik, Ax, 0, true) ; - if (A_is_hyper) - { - // A is hyper and iso - for (int64_t kA = 0 ; kA < anvec ; kA++) - { - // get A(:,k) - const int64_t k = Ah [kA] ; - // get B(k,j1) - #if GB_B_IS_BITMAP - const int8_t gb0 = Gb [k] ; - if (!gb0) continue ; - #endif - // H += A(:,k)*B(k,j1) - GB_DECLAREB (gk0) ; - GB_GETB (gk0, Gx, k, B_iso) ; - const int64_t pA_end = Ap [kA+1] ; - for (int64_t pA = Ap [kA] ; pA < pA_end ; pA++) - { - // H (i) += aik * gk0 - GB_HX_COMPUTE (Ai [pA], Ai [pA], gk0, 1, 0) ; - } - } - } - else - { - // A is sparse and iso - for (int64_t k = 0 ; k < anvec ; k++) - { - // get B(k,j1) - #if GB_B_IS_BITMAP - const int8_t gb0 = Gb [k] ; - if (!gb0) continue ; - #endif - // H += A(:,k)*B(k,j1) - GB_DECLAREB (gk0) ; - GB_GETB (gk0, Gx, k, B_iso) ; - const int64_t pA_end = Ap [k+1] ; - for (int64_t pA = Ap [k] ; pA < pA_end ; pA++) - { - // H (i) += aik * gk0 - GB_HX_COMPUTE (Ai [pA], Ai [pA], gk0, 1, 0) ; - } - } - } - } - else + for (int64_t kA = 0 ; kA < anvec ; kA++) { - if (A_is_hyper) - { - // A is hyper and non-iso - for (int64_t kA = 0 ; kA < anvec ; kA++) - { - // get A(:,k) - const int64_t k = Ah [kA] ; - // get B(k,j1) - #if GB_B_IS_BITMAP - const int8_t gb0 = Gb [k] ; - if (!gb0) continue ; - #endif - // H += A(:,k)*B(k,j1) - GB_DECLAREB (gk0) ; - GB_GETB (gk0, Gx, k, B_iso) ; - const int64_t pA_end = Ap [kA+1] ; - for (int64_t pA = Ap [kA] ; pA < pA_end ; pA++) - { - // aik = A (i,j) - GB_DECLAREA (aik) ; - GB_GETA (aik, Ax, pA, false) ; - // H (i) += aik * gk0 - GB_HX_COMPUTE (Ai [pA], Ai [pA], gk0, 1, 0) ; - } - } - } - else - { - // A is sparse and non-iso - for (int64_t k = 0 ; k < anvec ; k++) - { - // get B(k,j1) - #if GB_B_IS_BITMAP - const int8_t gb0 = Gb [k] ; - if (!gb0) continue ; - #endif - // H += A(:,k)*B(k,j1) - GB_DECLAREB (gk0) ; - GB_GETB (gk0, Gx, k, B_iso) ; - const int64_t pA_end = Ap [k+1] ; - for (int64_t pA = Ap [k] ; pA < pA_end ; pA++) - { - // aik = A (i,j) - GB_DECLAREA (aik) ; - GB_GETA (aik, Ax, pA, false) ; - // H (i) += aik * gk0 - GB_HX_COMPUTE (Ai [pA], Ai [pA], gk0, 1, 0) ; - } - } + // get A(:,k) + const int64_t k = GBH_A (Ah, kA) ; + // get B(k,j1) + #if GB_B_IS_BITMAP + const int8_t gb0 = Gb [k] ; + if (!gb0) continue ; + #endif + // H += A(:,k)*B(k,j1) + GB_DECLAREB (gk0) ; + GB_GETB (gk0, Gx, k, B_iso) ; + const int64_t pA_end = Ap [kA+1] ; + for (int64_t pA = Ap [kA] ; pA < pA_end ; pA++) + { + // aik = A (i,j) + GB_DECLAREA (aik) ; + GB_GETA (aik, Ax, pA, A_iso) ; + // H (i) += aik * gk0 + GB_HX_COMPUTE (Ai [pA], Ai [pA], gk0, 1, 0) ; } } - break ; default:; From 0257f2a7c2debb87618c9eedfe685016d3268190 Mon Sep 17 00:00:00 2001 From: Vidith Madhu Date: Fri, 29 Mar 2024 13:31:29 -0500 Subject: [PATCH 16/76] small fixes --- CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu | 4 +++- CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu | 3 +++ notes.txt | 1 - 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu index 43ade62e03..8f5732b4af 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu @@ -23,7 +23,8 @@ __global__ void GB_cuda_colscale_kernel const int64_t *__restrict__ Ai = A->i ; const int64_t *__restrict__ Ap = A->p ; - const int64_t *__restrict__ Ab = A->b ; + const int64_t *__restrict__ Ah = A->h ; + const int8_t *__restrict__ Ab = A->b ; GB_A_NHELD (anz) ; const int64_t anvec = A->nvec ; const int64_t avlen = A->vlen ; @@ -68,6 +69,7 @@ __global__ void GB_cuda_colscale_kernel for (int64_t curr_p = threadIdx.x ; curr_p < my_chunk_size ; curr_p += blockDim.x) { int64_t k = GB_cuda_ek_slice_entry (curr_p, pfirst, Ap, anvec_sub1, kfirst, slope) ; + k = GBH_A (Ah, k) ; GB_DECLAREB (dii) ; GB_GETB (dii, Dx, k, D_iso) ; diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu index b3634632f5..3080e6fd6e 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu @@ -15,6 +15,7 @@ __global__ void GB_cuda_rowscale_kernel #define B_iso GB_B_ISO const int64_t *__restrict__ Bi = B->i ; + const int8_t *__restrict__ Bb = B->b ; GB_B_NHELD (bnz) ; const int64_t bvlen = B->vlen ; @@ -23,6 +24,8 @@ __global__ void GB_cuda_rowscale_kernel for (int64_t p = tid ; p < bnz ; p += ntasks) { + if (!GBB_B (Bb, p)) { continue ; } + int64_t i = GBI_B (Bi, p, bvlen) ; // get row index of B(i,j) GB_DECLAREA (dii) ; GB_GETA (dii, Dx, i, D_iso) ; // dii = D(i,i) diff --git a/notes.txt b/notes.txt index 34d06dd0f4..b543798eb8 100644 --- a/notes.txt +++ b/notes.txt @@ -164,6 +164,5 @@ Kernel development notes: - Apply notes: - Can use a unary op, index unary op, or binary op - Entry point: GB_apply - a. ... - Main work: GB_apply_op From 87416ab43a84f7343260290f3cf881fa004839f9 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Fri, 29 Mar 2024 15:40:38 -0500 Subject: [PATCH 17/76] simplify cuda colscale kernel --- .../JitKernels/GB_jit_kernel_cuda_colscale.cu | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu index 8f5732b4af..b7254e8a2d 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu @@ -18,10 +18,7 @@ __global__ void GB_cuda_colscale_kernel const GB_B_TYPE *__restrict__ Dx = (GB_B_TYPE *) B->x ; GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *) C->x ; - #define A_iso GB_A_ISO - #define D_iso GB_B_ISO - - const int64_t *__restrict__ Ai = A->i ; +// const int64_t *__restrict__ Ai = A->i ; const int64_t *__restrict__ Ap = A->p ; const int64_t *__restrict__ Ah = A->h ; const int8_t *__restrict__ Ab = A->b ; @@ -35,13 +32,18 @@ __global__ void GB_cuda_colscale_kernel int tid = blockIdx.x * blockDim.x + threadIdx.x ; for (int64_t p = tid ; p < anz ; p += ntasks) { + // ask Joe: + #ifdef GB_A_IS_BITMAP if (!GBB_A (Ab, p)) { continue ; } + #endif - int col_idx = p % avlen ; + // the pth entry in A is A(i,j) where i = p%avlen and j = p/avlen + int64_t col_idx = p / avlen ; +// int64_t row_idx = p % avlen ; GB_DECLAREB (dii) ; - GB_GETB (dii, Dx, col_idx, D_iso) ; + GB_GETB (dii, Dx, col_idx, ) ; GB_DECLAREA (aij) ; - GB_GETA (aij, Ax, p, A_iso) ; + GB_GETA (aij, Ax, p, ) ; // C has same sparsity as A; ewise op code does not change GB_EWISEOP (Cx, p, aij, dii, 0, 0) ; } @@ -72,9 +74,9 @@ __global__ void GB_cuda_colscale_kernel k = GBH_A (Ah, k) ; GB_DECLAREB (dii) ; - GB_GETB (dii, Dx, k, D_iso) ; + GB_GETB (dii, Dx, k, ) ; GB_DECLAREA (aij) ; - GB_GETA (aij, Ax, pfirst + curr_p, A_iso) ; + GB_GETA (aij, Ax, pfirst + curr_p, ) ; GB_EWISEOP (Cx, pfirst + curr_p, aij, dii, 0, 0) ; } } From 0c62ffbcb5fc9bd68a16639a266b060e3d86d691 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Fri, 29 Mar 2024 15:54:44 -0500 Subject: [PATCH 18/76] redirect error output to stdout for burble --- Source/GB_jitifyer.c | 6 +++--- Source/GB_jitifyer.h | 2 +- Source/JitKernels/GB_jit_kernel.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Source/GB_jitifyer.c b/Source/GB_jitifyer.c index d430977e57..e70b79db7a 100644 --- a/Source/GB_jitifyer.c +++ b/Source/GB_jitifyer.c @@ -2288,7 +2288,7 @@ void GB_jitifyer_cmake_compile (char *kernel_name, uint64_t hash) uint32_t bucket = hash & 0xFF ; GBURBLE ("(jit: %s)\n", "cmake") ; char *burble_stdout = GB_Global_burble_get ( ) ? "" : GB_DEV_NULL ; - char *err_redirect = (strlen (GB_jit_error_log) > 0) ? " 2>> " : "" ; + char *err_redirect = (strlen (GB_jit_error_log) > 0) ? " 2>> " : " 2>&1 " ; #if defined (__MINGW32__) #define GB_SH_C "sh -c " @@ -2412,7 +2412,7 @@ void GB_jitifyer_nvcc_compile (char *kernel_name, uint32_t bucket) #if defined ( GRAPHBLAS_HAS_CUDA ) && !defined ( NJIT ) char *burble_stdout = GB_Global_burble_get ( ) ? "" : GB_DEV_NULL ; - char *err_redirect = (strlen (GB_jit_error_log) > 0) ? " 2>> " : "" ; + char *err_redirect = (strlen (GB_jit_error_log) > 0) ? " 2>> " : " 2>&1 " ; GBURBLE ("(jit compiling cuda with nvcc: %s/c/%02x/%s.cu) ", GB_jit_cache_path, bucket, kernel_name) ; @@ -2489,7 +2489,7 @@ void GB_jitifyer_direct_compile (char *kernel_name, uint32_t bucket) #ifndef NJIT char *burble_stdout = GB_Global_burble_get ( ) ? "" : GB_DEV_NULL ; - char *err_redirect = (strlen (GB_jit_error_log) > 0) ? " 2>> " : "" ; + char *err_redirect = (strlen (GB_jit_error_log) > 0) ? " 2>> " : " 2>&1 " ; snprintf (GB_jit_temp, GB_jit_temp_allocated, diff --git a/Source/GB_jitifyer.h b/Source/GB_jitifyer.h index cd75830a2b..9fe587c6c6 100644 --- a/Source/GB_jitifyer.h +++ b/Source/GB_jitifyer.h @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------ -// GB_jitifyer.h: definitions for the CPU jitifyer +// GB_jitifyer.h: definitions for the CPU and CUDA jitifyer //------------------------------------------------------------------------------ // SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. diff --git a/Source/JitKernels/GB_jit_kernel.h b/Source/JitKernels/GB_jit_kernel.h index f421485751..46bbddfcf3 100644 --- a/Source/JitKernels/GB_jit_kernel.h +++ b/Source/JitKernels/GB_jit_kernel.h @@ -7,7 +7,7 @@ //------------------------------------------------------------------------------ -// This file is #include'd into all JIT kernels on the CPU. +// This file is #include'd into all JIT kernels on the CPU and the GPU. #ifndef GB_JIT_KERNEL_H #define GB_JIT_KERNEL_H From 0bc07b60d1ecc6b42e6a443b0741f7d4bc95537a Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 3 Apr 2024 10:21:31 -0500 Subject: [PATCH 19/76] sanitize cache path --- CMakeLists.txt | 4 +- Doc/ChangeLog | 4 ++ Doc/GraphBLAS_UserGuide.pdf | Bin 1127339 -> 1128664 bytes Doc/GraphBLAS_UserGuide.tex | 23 +++++++++++ Doc/GraphBLAS_version.tex | 2 +- Include/GraphBLAS.h | 4 +- README.md | 2 +- Source/GB_jitifyer.c | 53 +++++++++++++++++++++++--- Source/GB_jitifyer.h | 2 + Test/GB_mex_test11.c | 6 ++- Test/GB_mex_test12.c | 12 ------ cmake_modules/GraphBLAS_version.cmake | 2 +- 12 files changed, 89 insertions(+), 25 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ad6e01c173..8229506f9d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,8 +41,8 @@ if ( NOT BUILD_SHARED_LIBS ) endif ( ) # CUDA is under development for now, and not deployed in production: -# set ( GRAPHBLAS_USE_CUDA OFF ) - set ( GRAPHBLAS_USE_CUDA ON ) + set ( GRAPHBLAS_USE_CUDA OFF ) +# set ( GRAPHBLAS_USE_CUDA ON ) include ( SuiteSparsePolicy ) diff --git a/Doc/ChangeLog b/Doc/ChangeLog index 1ad36b0e6c..26431376bc 100644 --- a/Doc/ChangeLog +++ b/Doc/ChangeLog @@ -1,3 +1,7 @@ +Apr 7, 2024: version 9.1.1 + + * JIT: sanitizing the JIT cache path, better burble for compiler errors + Mar 22, 2024: version 9.1.0 * minor updates to build system diff --git a/Doc/GraphBLAS_UserGuide.pdf b/Doc/GraphBLAS_UserGuide.pdf index 40d32a48ddefb3a69a60193460276a83a24a9fc1..5f009929b02de4cb68297228f5f39a0fbc23c713 100644 GIT binary patch delta 129117 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

yg_mD{Y~A~J_e&g?u@X|{VasQH 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�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

-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�g7n>r=QDZ8Lo&3LUQqBso~)fx_d>OIw61c#Mt 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

    ~p_zdus)Nt!v{q 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 delta 127748 zcmV)DK*7J*@kFcVM6fv`mx0j&DSx#XYj5N<@caFWd_r02)=lg@4D^h-fR2snejN=>^AKkANaBvk7vf?d3&Q^7evAJtLP)&tL>|cZ+RB*h-Dd1 zgY9h)i-MJL5@b=zN?rupI`}R8*{E@~77-7x54u(a-u521IjrJPuhwyB)qe)SL5@bf zxgO=vT>WslS^cs79!|-FIAJ2mxH~0=6Z1G&ilTEwf-9=d2W7R1F*ja(roJi{OE&`tTaWi6q>viX>F`($Mnq zv$qI{@aIl{Kw32#Z4r1_6@MaRcqmvb3gTcyvmx;A8Vo1OxgJTzIM|ES5Tr(9?eON} z!W^_!W^g)zX;{^_Ug+eGbK$|7mn=*9Q*j354XZV(*$;cgRJR)$T+&_eqL$uDFUba_ zi+m79|PEe*ew8&3|`4{YbtnSDMR$qvnfm4 z?sP=B`w-kpJL-GC?_+6n8hat2I;s|(DkbqkyoAiLs;gB^E4kmPo6#NX?+QqxT0QD+ zXJ~ma0DJOoVrzS2{We^#+v^t0?uC9>rD-Tft$Z3TXoE+IynmQqpdT@#b1*_z)25|j z0wsxv3>1_U@V_+RCr2TNVXxIh-qUw7mLsVDl9lSJ2U_252KnWoEZU7_rs`+@zs%Vx1(&;9kTV~-yY=}0sz&hq+Ksr$i;yu zMcC+Fv!09sjIHb{MO*Gp1cDX&QQM|9w7!wX`3gX1figjx6GH9PP9CiX2yj)S7PWvK zT^TC+E{>oJ9DOdtF+tq^6VC~MI50_CPT@{|SW0LLIDZc14t)uZuW==?(l&&Ddx_0v z`@`iGt=~Zzj3wkehpU*rRfKMpZKx#IhA_G#QJ+>*xX3B)xX8l8KnRR8w?XJu@As~J zxjo%t#2|Ppjm0?tX>21s0V<9?71}>2|C+WHg^DM+YbJ;)!E)+gfh~y(-oj7(#pTl60&`ZJWfL`-NF>K%DU#wOCU9-g$b-A0 z0~MjCnne6o{_SkImj7f9g+5ihmUhM?p`4msk>%FrFO6C{GauFj3?Y z8G}VdAXu4t2lJ()5|+cnww{rpy(oqSPg#y5;z^ij7ab`_gNC*j&*H^o%8$vE&07d3@I|v#vZjly*x{t0ZRoK!`v-LEaixS>E;H8Z(8V%_75r z>8kH)utFMTI7jc5Zw^_u#+|9+ykq^*vq&pS3Rg;mKY&E{ug5=Lm$1 z@7bg4u7K!ZymP=UOml}3XI@zPwhCy_8iM8kZXlVG(BFTz^=$P2fWUZoVJ;c;o*Evg zNH!ijwMV63xWP!ojq%W}G5Ju1GJo}xX+dWer0P=nE#P_gSX{5~um1e1?<_oE7RyP_ z;`~^adhl?Xg@4iL5Qmk;;h^N&*Yhh+z&% z>Hn#WV{rvPv%>$25uY%8vwih1bWP>$lOcl>v%M*p2m&!MmqAGdDU*OQ1b?^^eb2AZ zBUCN6^=XMpZPgGidvl8{R1)g$UN#Sotz=wy>?zv=VSoKSEn8t>!#J?vA(NJ^K7G{P zYN^ddma~j;!8wyT{TD3f^j|ZcSrQE6N|4|f&+#Wj#zc4}Boi_`QA}t_Le7MB2M{ci zobV)Y!z(G6beaUslq3_4T>+k3L6M8QiC)QOQZzZK!^op2P6$i6EcD9rhY$%N+k_a{8E`#fkV6;?;U?bpU1K~u(4N0(Jc#vSj zD6)%yi;y`IB!wY&N`xGdB?bl>xz1n%(MLSV2BMF623?>yLmtmFq%pZpA|tSRdW(zz z?;uI!b{^&_>>kPzi7C>mpn)x5t%VI_jtpr?3sf1U0NyY)t$zrPRVLse1yoK6Cy^V< z1-o#a&UBC@(>!<*q1EJUP8&+AoF5z>vh<9lzjWsvOP{kx!|rnMd{ws zAVhUD>Av>;Re#rSinjFo&6#8-eZKZsZGYK#RuAlBx9dT@_HDJKKeK&aj0GD%Zo#!^ zt00xdFxKt$Q??sCg9q4uj?b6S%L(XfevH8E5}{$ho@}V7X9FVVr#(nad26W zn_~MD>p*$eG)pGbXC{K1MnGSFWPSI6Kp>S}v)i-*a(_2q4T1jH7wxd^u$bbp?vgz{$a{gcXH)vd4o68H{*DG279!tN%_)n&IE*{^R-R&4k^ZBCdS3*`7YxC#u$Au<^*pBWU)13zY~3fm@f+Wc z_k@{K_0$*DgtD2FmWm2tHhu|0-!EEAFy<2sE4JIFE<*wj^Y(bP_3g=P+AdS68`u5J zdDB(C*%wCpDaY$3tP;GA+hHu4Fg)AAZ)ahvKYtCOd-ig5wx6zz!G6`Umvy_l3798E zxuiBn{iN$XtNd8h&A_@gBr&wvACHdP(Kk;ni@{faJf7EnT`uCvJ8)5W*vabrPSx69CTnL6|1 z7=e%2Ra0C~yJ=eg(Mj=c(c$sRak^{U2=&}=xSXX!K(ExVh~1RV^`xZ&ki)yAO@8uBoc;Q<%A|s;Z_3 zU~uXO+_Fl453N&w<$K@WHTP|}m}l&ir7!C7f~FrH9;D|e@hp8^T>FFcs6)Dg9e>@q z4NW~rZ*8-1`wq`ed{r0Ex*PU3!vjN&t`ipr0O{$(!bLovCazlCMhEtG>IBGiXar_~ zM?pkEMnMJP;@~rm0qr1t*7cR|gX!!d{dant9$|pq;eyzfBYTUsCP9Co1yTq1dZ}%a zp|{eCk{Pqkc9(RprIgX>>hLh&r+=&9$@DCJb9zjFkJjV3eVV2NZJOx@nUvk;F*toE zEg=#OKWLsM!l3uDI4#lRqGLyv=if$b0JE*{Z~`R0z3!8-*z6Kt?b51vUl0F)q!dZ6 zsc8}k^_XbG5}m<$96r_R+ewbNiK0@F>(b|4IaQyp@td((0Kc0q4}(Y-y?;AmOHC)r zIW=;*OwjCdoh4RiOk1(9ZJDY1KMV_pD|2YRCl(@8C|d4bG~C0{5Q-;`x?Z6ZZPA!( zmDterc9r!gNhGmp=z#c#j=kMYbURx6fcWf_|M7M;b#*JmTcX|_Rh1pM;Z>=!69 zfyN6F+I%^N7qNGLOhSB8#Zbqkjn=P4H-f-_D69 zcr+pGo@3zKH)%*=%M6Z%oWA}zbYB=^&q}j@Z#-b7h$J$UQ#ed;p3uic!)4+!v6qH; zKpFxYla5G>YdL+^vl@lVfL4}BE$^oB>Bb};)FqKiP9Me;!zM^nPTWjlGqud+NBG4^ z9LOQ zyTv^5Qxy<`j1V;aaSZ!Ta?s-}c_lM_7t^^CrWF4N`J=9FlOcl?v!iaqIRQ17QGy04 zf7O&tkJ}&+hVS_m9Pz<~8Nh*KTQw_HRS%JGs~)^I$y)2hD`Ttbzc0jY;@ErGs+Foe z%>aUTc;sgre>ZJA-xp0&^mXf!@A;QY0OUT+!Z}M)#rgj* z(wOUN5t%_j1*)6vHL+k*5KO5n7;y%37@WI+=^yP#rMJHKOCabEnMCN2S5jlTc+oS>!;p;9z$o7D#lSAW7+%D>_}{TTVk_d}Toq))Dm=0{_z z)3bHaU$;F9vEwuS*V<#ALWD`8N~-FJ=FCvbfY`S~z!Rn|(9#BPEd^N?rLs3l9qiF| z)|IbRhn5CsFO3J=JqAR;j8b^639Xp~LsE$?sse{@ssp!fssz^80yHp}F(v^imv4dv41ZFU1rs0%lG&3znelikm3U)&_mHHf zXc4klLy-zd+2hOp_U#A2hfJqZwHK+;02+;ceBEHMcv=LD>$AZ9U)`TweA2-}CPK+L zTHJ3JQU)RgQpb@{QL?x%7QZdC)mlmwFYk9|wGNYbd3P*3b9cyXYks)4`C)hU)8!pc zeSf*RU;T0a<>He{K$ytlSfSitu~u5BG-iqK2?*u#ITZm@c~P{E;=kIwAff0G;%rUc z9j)O(x63=Go-FXIS00r6gKbtSSw7>BX;D4YM@AxwH0yI%t#Qt78@tcz4GPSXWwYh~ zV{7cXFuw;fs!f5sblI&`x_ou}TIS_-;eR%Id3o2^_I$ODWIW8iQHZ$R&Ye2aWj&{B zub_4c>gD6Hth#ksJMQFk=H>4H1=TiHC01)4Mb4wZXNv-{$(@u4Wc5vq?2$naF!Pd8J$t!~8b0XjZbC+Qy(r|gOWn-CqCQH(G z^svg*n>bOaa<>}d1h@9$PCbRZ7go#g_8qLPj9dQ57NYdh**Lwz80ZkxCUu`oZEU%j z%fq!>$=7q)IQ4GQXA)3wrGlyLv47rlWGfu8;thlx{B_2i^%#KHsdoqi& zVZ0@;`FgCu*le4;?PgPm@> z!67(mo4x7Ez2DjUhYsrfbE+sOx0bzYV4%?Msk8ezU%TA$vcVR5#uj{S?SCSjQX8Zd z;2SW!lSEe4gG8r+dYhOyJGuAyEb26MQx*tiaZ17?z~R>HOH0~B;Yb^tD#|v0B+KBG zvkc9kCKQ>897m>-nMkDaF?`n??Z#YOUwz#)b!VGO?B?QGDkXv_^}Fy&h*@~f%MJnn zZ?X;}DH1)s&$#L+J+h?gp??peiBk7|5#1+Ax>uCOMi) zNr8Do&W6?qoV~EvA0hGUHFQW(ut-Ff1d;+Sh=i2s0sY4;D0>&B=Su_6gm?D;bO7n(Fie^!RQG@zw^WG0~1X>5&cM(1Agw- zJ^YC0Uk>L{u0Suy+KyqCN>f0gi2u;OK!?>57vTx;gGuxKP&H-8tA76X&5t*iOkdwV zP?1bCCj=bWR8{`SWyHED#--?GroJ=`N<8`q(Bzh2$c$a?jepu$^U99>xv31rIqYYF z#3hZ$(Tllz{%1!eL#GpTfFb1v{Ci*^jLqIdGMR#>qs(K{W}kmEb0`qT00Gi3!zxwq zG3{&HnY}v_TUq1I&*y5t1mKL5q(5#IgM~IbGhhBSq-b=4h1;eo2vq>ZUK}c@Xo-#_ zR#{a{aY|yg9DkTG)G3}F1t&0A_rfnNSgbc9vmZwSIEG;fM?Y{7AY6=eyV*9A%EW3N z<8d4>1q~xUkoo>V9989`&25P$#Z{C*$R9cuWDnqjfCP9agD~KB85cVw^&-f8bNxv> z8y}%ahw%9Cg&4htF0SnrJb>T{G*|2*=unf$?_|{hIe*`IP2rSla=~SAUjX_QH^gzk z4=p%HF3(-&LuiERq&4*65M|Cg5L_Jus^eL+<=zk3&B;0}RsU$2xr4TexdrrTaOega z4S*-P6sV1ViNwLQEyt}CV#oc8iWzq)PH0)b+iNLU=fhe->eu<+adYd4)^t3VAG-z~ zB2Y`K9)B_6?F+HR3;oL?LFgo5_zqS51FnBUXqPHDRX){?KWUs8GYXFq0?P7GuqnNW z=kpU-Q}f{5mM4103+CTA{(J3~jzt{AK9;V3y}bR5yT5+8{P6kX*W1hc&$9sH_f2lV zrR=%1O}$4NpT~r~&#M>`(Uv)Q{L$B8LR0SmYJa{McY$@%mHCxp+*SSKljX-GzZYJZ z*_Q&p$tY5lk5J_z1S3#}Y_MTA9O4(4K7JL&F9$CTq0ND=iRnjQuW)x^I*fC>FZr86 z?B0F;h#8-p==^tmB2^+n?L9f~3uydLYy})HYt;6+w*eQ;gkIY%BpH|Yzwf0`1Yy7JoDX9cK#o+1Hb_CuESP$v zPfT+fKuej)-s4a*zLqsq>zPyIP{g|L4S!ss>BvVQzl{_~pBThFG7uXlj|?!9MZ?#v znDo3K@6Y}`ldfm>pAcmN|IjpV_GiES5iAOr1j~ysOBXM+bia^sEFy^@R4wk#{>2|8 zlLg!^2~##2^x4pDOC1Uor=x!R;uEaMM5dL-g`hliMe9&#=^}CZIEl02aRPL~jekD_ zLgo@6&iL~feLA8McaA`faS26n=_H!_>On~A<8+hr%Lk?iqvO6bW|&l>@3*rMi!S+W zPIZ|r_c%Vb9gl`Qkig}yVTEh7+%%yOzQI@pSXa8uz-XDGFPMB`W)$WC&_;sTz}d*a zDo%tR%Ek993V?~@Lk!C#qc$Z?lYhT*yb@WOP2D~@EliP4Nt8~V-|tKX$otD-&i#Ri z;{Mw~|Ammg;`|c>mmWy1k9q8vwVoQC`U1o`YYtVuA!}-Wbk3L~$wV}KaDxndYYr8F z?xBKqF9sK@|Hm8(Qc5dHq7sM}I`pP4%=d>nM-ST9S+i&*bn=c_+~=X1FKXRar0Fd~ zIIhQ;!aUEM0RfyO!z;$-H9yT+ZsR^bjY67`FXMJm(`O7;E9Vw^tpKyK=)^nx^^PB} z0QB2qcf_XF@X$hJs!&QL%|2yn)!eaLN5!X9HC zvgMUT*!=g~J>9Y;A+k$$uj-!E^Zo13=^pvsgXeqa2R?s~X9w@jROCr160MatTY6H( zB9wt=bSP99d9#K0W%TpPZVtzRZ$|aXA`y+ADqB)ly4~j4Jgu{Wf9F(nTGrJOG^9Vu zYMMV!d30SIj#V^TWXo?f!dseAP9yEDie+!kJe?oH9BBSB`{0dbB(zT88;USA1a?{E z3&f^OG)k8>k+?F?v&{ppdv_MeHqVI$mK8|Etv@f1@3IZxb~C%u2@|2DZf1(ZaVYiZ zqNc+fi|*9CDu`Mif65V(G4qQ+94|O{!pn;FHp?5B>1ILQSzQtFA7AS90pv*>hoLY4 zs>8Bd6aW;GvIK5Hf^ceG7CCi1lL}$ZZt|)?Q9jc+Nf>%RT+E2bDjESzFObtfj%F)c zSv~-_U!|J|%hS@5H&~|&roLwBkhuLWc$9Z#hs7NT--M00e~(a*j9*2}EE4z5ZY(u^ zeX?a{dCDsYqypnsNn7I&-$4*G6MuqT6E!OB(y0p$s0;eu+PSk@*aE!E_oP>%iy<*R zKk&Y|Nz&(W@;>fe7QENO)@hbkEjFFTmGniRO;>0&c|e~rM4Z3Sc7zHn>Vbdm1Pfa+ll0 z7opzi0~|gGf|kPvK}hPyZgM;z9?>mrxv_agdv-vMn@z{0%vVvKT~5w#0jBc(x54Cq zLtq$Q$N>U+`dqvn;^oEF$2~x$^cw*}9DgJbEvPL?cAn}u=oqi#kQuO;LubFzi#oz88St+wyQf5rE%X4C7-A&5aF z!Z_H6TLy6NFj`1`;PdRfRgO+>AZ_^EL)O00e}|Cq0fWds-=2~={NEuvoldW(cbC`a zKcZ+`mW|8j#RH+jyCk=7*WKjg{psD!WcD62owo+0CgnsVjT`L3&SKEAhHtSD63qDR zSL|>KAF4#?kgu`XVXQC}4N=JL~eBEoOk#licKSr ze}6$nHI#D%zEII_7MuYW9VF=JkC63fDKXjHA3T(*8xiYv;wJt(oT-n45VHE1vnJN| z+SV&BKU_wuM^j4W0t8YF9;k%&6_Ar>ND5TuFqUY$!jUm*w)m_c)0#v zaka0%p!5mY@Q-jI)O`hY)~gh^lpz-#)Mu%Samf}gtdTa<2i#OVir32#DQUO3?L)3( z;dIuoC^iM2?*~wy;DWD*R2^Us27LVPN(OA~#4NF-GX_e!B~N!J`>K_b(LiZ)e|IeF#>Iz&Ts=<_ian3@qEba-xcK$@Pa3nX27E2&DQ<#ISPFjo|3r3V0-VpfX&fc3WbpSMrCJ2(Q=|g*27HguokVx8L51ZSxUJ1IVFjD-{RHB?m zg?{VhWI+S3JW>Rqf+{p_e?LOAqQ&p=9*kWK3xHe{R@H#k$8yNCf;O zaC`YOrc*J=dUtOQ#IXFPhOs>d?RES{ViuIKM@A9h3=W{dZ?G5C9#No z?Lql3q~Ukw8ASjE5g>hF(&aVqt(&ovo6kg0vI>NI2t;Ckt7C6L`6XnzltMw@E3T#t zsA->=@_XRBSKJNkf1@?|siLHeAr9=0UN0co>pgo8SBz1xpq3 zRv@S%(-hqCi`V2Py(bTXHs)onxFNsd<&YiVW4+e@4ZLuSb-O$*4&KBUU`5M(%QvfA}+@VlJ^o*=Mxp(k%v2 zxHJeG_*`+{+#$q8!)~CVkdb|M9fzthLLlbN^9D7)9%{_1Gej}`;0z_1j&?$rPHx^G zUrugaWzO;7rS8F_)XvU^%M%GjPPh};_1W3rPI$Q4KksRI)ME$#caTn@fo3mTOb@FS zJPjIgufl57e>?p=tltPK9@To#58}jS4S`FOoPEZ0!N;f^Y}}NV3_FfHPor*-et5vh z&h@bu$_Pw_0Q+p^d;uoxEOl_1Q$C~X=84VkD)&ge_zB-B_{}~H6lR#~t+O#`xby?Q zY>wQyVuGwT!2BP?yC8a=+myFT^PC7uxqFLxkHY((8VC~Z`4I1U2r>}_V24_o?ym+2 z`@aLHrT?avkqQD60yj37;a>(512Qr&m*EHmDSwSvUvJwu5`XWf@S}W)X;Gpmv5R|1 zvQ4fCw&Dob8TZZ|mGcfT19C0Q!d?u$teDbD{NXXwv%GkHg**cs3?rrPpFkgg$^bYz^)i3jedly7FHTv!R z-+${5{h8gkyovew!GU1XPiBiCW}!;x+}rxkE`&w&2nSwj3sc2_cDjlb0J%Pxz77 z?yJU5)7nn*5*f65SEmJ0Hr3%s<|(z2s%>bY+IGj-Z{g@&p@*;XLTB{vwod2VJAdx4 z?k*pQQsfIGq(7GKxlSRj76N2QOZ+%c;Dyqd2#Mq4S)SJL2o9M z_>u6^yhxvm{s5<8xdKd7>fEp+Byx$5l1525$Zr_jAc9sk{n3A>hhw3e&c+f{n&fV0 z-7e+LAAlwpV~i(j<@SOom<}%aeZ_pq2iQs}F_*srsxLp)73BV5xl2z?^Mo-ERJL*Y zghwpoW2ZPSfGC+Mreq)u4u6N>$uLGF2H*J>iQAW>&NSdj6hxjbPlrBz3^&^JUqcKa zP=jE+a&|q?5r3z_$Asd(?=6=^K;*^IBrZ;j(Qsno94BzjTbgZaZE5Bju!}VLLJ&-U zaw~XIr5U8HL-bC-PnVAm??xhW5Rn6Py)I&XDu2ZM`P6n)eYE11FMoekp!>&!gUUntagVj%3Q@B zXMWUQ4_~Mxqm&6nOt(%bq}Q~$DKC*WxquLL5yYc_f&%wI8Gl5Rz6LVXimq62x^WNE zjQx?rD<%iP3865I$M!o1QHNGCW-{hKu}=_)>9t6Z=c+j1QW$Dt)HV#fS4tVqI_pO!mgav->scrJq0 zXua=PccbmBglAF*MqSrcZN;m~EJy!!wPYd~hjMvTv42yC2sKr$n^R$RG?f)93|VUb zQ*Oe(Ava<8urfurkfmEA*)Le3fLJhSu*nZER7p z=q{u0iho=gP0M#Ab?%eV;JyaEA8}OA6u?rVWC=;u(B|~B&qHVlX_=aOAQLo$7yEWP zw)Ft6{^!)#54zx=^r{20!!`~gLB&j>azQzdR3kHD3t)=D79N=%F)`ger#2eL)+%65 zYK-W(YK*_xoNAPh$HT$)ae`A}f#YCwhqT}5vVVaSs%?wi9ZqZAo@z5s`s-*QyRub8 zEDA>9`tW#t{qEu66)+aEhj<%DXeLd3@|IXrsPV3cF)IyCcDjTl+R#4x__4524xpxz zc$~3x&k8?20|yyPYUh3XPEwtUjQ*mgCIFnuMlp-eI%rUK^@tbb({Jy7TiyT5-RLP} zbAS5{wvdLAeI$v!B5jN)(s-F@)-pESyCjAimnYnn#7g$5pkhKhC2eXVrPj9puIav0 z7AREwT1mjcRY^Fya;_flukM^TH&krFP~Z@IN~F>hiD+`DK1{SLX(JYP&?A)oHhx=ve)1i{bZFr&li`an{G&z@$q zdlK(h>#uorYKj;7W_Y{9)e-b7`;ug~nM+Zdfi`6>!O~rd@Pyf~I%t3pJ=L{+VkN>z zP|T`?>QnpGi``YxNUxDFIixMgaVkNtlRblqU{B#wE=}k~Zg>La5#%~bZkc>NToQrbbYL(IUGfNb{Pr!R5L;#?1TqSb0$eSF;#(e7av?cTnKhW&@=S$^(!0BA_j6Fy{lU1(R<}3%G%EtrR!Ag);ZJKH znfP*(=zqYv);8RJtQ(>3Z}!;5jYD_7)Qzpen|&51!FL@Fd%Q`C!2ZrN$U^mz2Mnia zWQziW>zbQi?%u;G_OS|;%6X%8&*OSKFfnu}_VSI6mxokYs0s~(Y0%q0UjO?3-QBMr zet7i_ORrU;)38WVFD*N3JNfd_i^b7p4`+i1dVk`^;`qht_-Pc}-4t;k)6p2xL04Cv zg$Lb(QNlD{AJ=Q6ZgJRXK-Wng2hKK~sp|HDo8~4C&|pX(Q2u1;^F<`0pgVGJKbXcc zYjK=g+`D2MVAs+HGz_&)9W=RVA8fT{oTKZ`Th>T)m?r<&7&=r@?xnZQ8>eAe6xTEU z^ndC5tqF4-<}h4@!6a!!CP~O7K=)nqJGmw|hZ8v&P#4$TH};GU5oJMT8#|ze%92#Y zMl13#EwXE?vH5Xau?`t%KZ3RD;lvI0dmzLzNLKc96sxu#>aNALA%Hr^UA8s%UThkA z92=P$w7|r@_sobwWxr*ufxIJ)Q<({f1AlC7X?yD2v_PrDB+0KW@WZwNvM|X?FWYy1 zQ8TQTzXBKBj%k^27E}s*^I8SgBdU;1kS7rA-UOK(j^<4A;4nI8`AE!IYPSz@iU}>@ zkZQSc2+2@KYPU~d=BVVEKPPc?HR=jrd5|3U9Ri%r2uR_>XadCQtk5Q((>bb}+J7^i zKx5%h(0XL=0g6va0!ym_gYgkXHqDoS{q$^;zqa4rORwDLekAj0Z$1r{9o>QGB0wEC z!Ur?9oe0mz!VYK6zy{Sp-SWt3x`Poc&6Ig*B`?P&1> zxCBC;iZOKD0Dg6Xp?eiYG!cepV}H;+m`9d@(U2oC_z=|dEDi2xW58eQ9vFVW*U&Qi zTeK{)^dE;-o@RdomMYAW_`l^sL`$XS1O_ytCEHLbkCs3!&{CC<9KU!>Rp5@Jn*cKo z3&;j58$D4z9G%o0mrGNF6%JwqVlJAX!+AO{JKSua2e>%NQ^W^^*~;3XJpVaPoDacmC~;kee& z+eStK3~l8~nk$yd4yGb7Mn+TLJL8@NPE1YJlv2@h2o-OP56GaSVF$7WABgc4tk!w> zJbu4Y?C2!S^K=aeI|#udEOfd))5S?G&f5bmk|R*9mt@|5kR+rcYJWyhE-is&9!%Ya z2$jiHRUv%1UN8vN3jm7K}SPY8T55a`7n{&1h5c8 zm}A5Nk>)}Nx(8Q3Jb!qJdcYmRF5V5?d+2cTrs7uJRy9DREMR2Gr+&b_p0_fNXdWa1 z&ZUX~YPw5cgH={60}>Iv%sA&lN8g<-%fkJlVhUppzf&TnmWQAMgAq0b0Jfn((=>cN z?60tBWmhWTI0+@oGGfN8O1efV^tk2#f+6I8D)k~tA@BwGhkyN!!@fK2&-UE8C+-C} zsA@4i2~9N#_fs7d`2+?8MEfnvE?LuLi`pY%*u*c^f7{NwT_I@o?1J{=t4|-l-NcwO zEOoXl5g-{&7b;9liwhNHt{OoxMNB3w0PpC~OD(${v=O}VE1H72WW-1zne$5o2sFk$ zNTIhcVc)S{`+qnE02Lu%c}{?OwIOVt!RM?bM+pkP3Wy)%;0JJLEhV$P!#t7Vg};@1 z6}D(+D%AuVJ@Y8{0PC$Ym(%MHuRb#SbCgB>$PmOF)3e}*S7<*H2cZ~qM^2Xo6k22{ z5T&OU-lGn)sT`Mcb1jX*#&-?)tZEZxaX6|)Wddc%Eq|A*tZ5Lchg+_E{ksB9cCsx~ zV7f_=zrT&WP!gBN&WVV#!{}NtGgi$pLD_~|K63rnOqIzZx{rnol?l*dxc5Wj>lV*z ztPy+q+F*|SEi}oc{7W)m8uUYG7ri~CN0xz10#!4cFEYYv@s7gZgcy*>V?Y7f|Ult zD{elL;gOQ}q2k%Pz@im$y>u)@YsbC(epHa_;QdL(Ip3dfh|C7LtYIlm!^?5L_SL+b zuN7!%k*`gGjM)^}B77{gn1Xp!!H~ntyVz$&i-`>lna4CvHh*sWwoF^-(Z|`3G376`OC6__t z1QeG`rv)|vHkaWD1Sx;bT3c^hxeK$pjK#sLG*t$Zq8$h16Ws5or>bv&-2uaOK{Ix&3sSOJMU8 zYbH>Vum_sl92d=4uT|$u4U}s_q0gG7kG4thW8zLhZ|2%nU=9THLa+tU z@~K2YVNgz4z(P&|eWePJy^Da1a0yteb15j-v!bbzvQrfl)BqWRqP38U6}0s+%rv)6 z1-QD^4%jTYVilXfUT`A#i4_b=H4x2@0%(o6uYo@5R_1J#T@O&Mxi6s)t0`uPV1o4t zIEC4ELJNN__2aomW^&BoiVdiEpM^$ls|x>X-4GNowwihI>eXWT?tlMTh2_s5|Fv2y zzh7T%R#%%FcVU5#zgaBbtZvq~*PmB6TSxDGe_Q?X<>Pnj-@^M8+!1j6Rz57S$Tenz zk+ze+`KIsiLwH}dG2=~G{{0{Sgmb58fCYvd6QqB-y8Zg~!;bqkWC*Wbh2?8^blb|| zt&CRMwV?S-mhM`JF4>*=u7#jsFeYzd(dEzA>(6gjoA4gT{NZ(2zFYma3HSRwbABm@ z=a)3{{Bj4>w^vtdtoD8z5?!7r+jfS<^6l-XO>h78%hkUZ%kS3LzpSqN;_1Wkr{!Ok z-=lw#(QtV_<0M%uX4rg|5>tbkQ;Dv4gu_@WgYVmp;oGqMas6%`po2es{<2xcA8&6q zAOCx^zEbU*N1=A3+?irRpRbh?T}=2Q_Ej)=vG zl?Ig{@+wEqM70?D?Rgc!IdbN@M6PHEQScD_d)^Pxv7L927pN&nhc^JG<8 zI#i|FbXDqBx?VQi5xgVnj*uOpm+3wC#!l}<8j*%8JTz&b>V5<(FgR+~L9O51e!9Wb zFYBu)(EejZUnUC5gGhjpjG`f@Q;vqZ0@*IA*|W0jiNi6!fItdKP=Vb`WEKButVDn1 z1tfx=P(g8N-G5MjMN>PaE_cX;Gj7rcM_r7@F_ z#WI+fOu)ob9;j-Hc;xRK;dPP0UQ;?*H6#lH4V}%n7 z0!m4CL6l;xB((8o7nqa-=LrWZ;9)kbM{c8V4_2Tsu)x#4LO%Bp}=L7u3vM%xTsSn2g)3Umg85z<!eRmJ1K4k|gyi&YDyJ6{$?fT4^7dT2 zsZt_K5*)> zQ8_kAbYJ^_XDTYHT|SE8lGVO3da~X3c@Xp$C(Df&Cb7pW#Dyj zOT1u3oW;?u@inpX`}<9?%*j1u+}7T+i2N{lzVc{c8TK0`p$(7svpH@%u_~5WAs2nj z;j~p$laRa|wRc(jybbzH8uUR^`UfJa(i8Dev><6cn6)avpxD>2!(c>axu)+h*74 zz3(|UpJL?5=Ug*l&M#Kn+$FOraja3eJ5sdx-Ab3}x;>7`_TIe!%FbIG{Uq;2q6!gF zR`8(v=z&p&(AJh~`G?ZtBn%TqEYu`pU%tVQM`y=huKl}aA5Ycq|<3bjjd0U!%jjbD^Ut68SxJTlj>%DLxpo1`#O;lUOt8c3VRte=*bYDC0=#L{*{%M# zcrUmyF6e2{i=Wtb2cpY$ zo{<9t^3!A?mZ^VzDgS}y5ZZKLc|@NzfU7M|OVHCslu2hIa}ns7cti_aax)9xy8-DG z&zK28)KI$VTpG+6GW8`fp8b+v4DBiPfQfS$i2X0|oYJKTCU@SjC>hY!Uje_qgfs4x za$OLfMujy+B;c9j z){3MLE38D-K}Saz$Y_mrPOoub0XW!_Q$I`KFBoLZP%s7$X zAwlC{!y0_`BnSzJELMx9d0zqkKJE`;N(ieTGuKq}$F7lM{ZP*1r9%TrgrEmhvb^7@ zNP^KC;cr5hut2abtWXW#qxeR{Ou}e3sOyduFMlyrW*AA>6$+{p5?ry1=|GzdBrlX(SX3Z& z423S3-8`i5&w9GP?mnp$0I1OIW6n<$5>!NxK88V+QDG4HV5*-ia{H`uo2N|Va|S@v zU|G^BolzyeZFgwPF&^92cReg1`^6M5TxPn!kwLe|-joU&)( zmxP;5Hc3)ge&aBh-Pb{kOlxv*eRYZV<#J|+-cPVvvl#McT9>>6fIoAXDd%fU&_S6G zXg-`Evcj<-cA_9Gli^^Y8qcVScoTf_kGOv3$|t}QQUrCfUQ8|$-}1@m_Q@RFD>$+`LBL=%hV`-=@vUi^SV|BEnfoIqExPDyFqU3Rf zTkCaxmzVa)2JKmtfXk3_VX&8#K|_>40M^MSDq0Bbddj_Gt79;}`415gfq!N-Fru4*eqMmUyWhJ5AF>5C z8p_1nu`uXXX58^0CK?sJcvU|6pq6Fmk=D&+U@Q_eUL8#npe}2iXvFcNhk=i=Fqrs~ z2_ff;fl+2eLbG?TJdwlnoH^YF$oLFGwV-r8qbtV02_0fxq9E8NwP6mY$yXiR0n)r7 zbhp^ZDWBPSs2UrU@|(%jqzerEw3&^sEgoncFxUQy>o>9d3vSLMQ?bs-aZg~wzuZBJ zhPpG(e%%odaJI{kvESY-EA3qX3n>VHOBP`*-mtAcPHQ8aG8h zataKz>CEq#zj9P(n6fooym2>KRQSy~NO0)E*xo@~omC$vszf{O4W;t7EX7lw76;i( zr27|AK*9Fqe_aXAjD;C6)V2Bhm)(=RquVlA98mwzx(3M=lVG>R=n>n}Qu6i;Ohh0>@#Im^XNEA1UYwCtWT z1A{g79VK2swd)@*uK|hFjA}n|QTyY3&#?S&OiZ7Y=5sk%T>6`@a(P|MV@R7nmLc|k zmZF#XF&P!}v6)k~rH5nFoX9Azt2r|=*zEn-Dz%5?IWM8yb5g$R zbvyMn8q}RXy?)12@bKkFbR-g+Zn^F|2N5l$7(yDN^d@Cn-I@v4LDcp=HPrA;X_Ghj znF4f9r=Jynzphw-BVUUMS`IB(Xj0)%H#D=he8U(GCk% z7ibJEx8!AWt41vG^fAZ-TEG21AfXP!_wq3yw8YgaK4|5`&(dJ z@>vz#EG=lSq8~A&t)CUm65N!L@O0-WT9R}PDjy~&bArP}gF1L~so<3_s7vSf(NC%a z!cYlurN}1NE5gEZc=l_T>h5<8x^L20@f9i`Yi9Pd(+C+Y6~4EpE?h-aYn+nSeOQB` zc4L9Xv4>k0bMqMLXHPR8FE9U`#&}C{{}yRG--$6BX(odn@81Xv6V-L1Fw3{@UqcX~ z`K|6Kyj+U1u+`o3q^+rI(Segap$#bqa19|S8~kbR`nS&@6a_EYV^J17c^kugA)GAe zDens5y7q{G5IMajI-31@EgY0PD3h?{VD0hplrA z@`fk1GJu#*7heEx%{cPfZP$|6O?u_vX&oUkrJ~D$)L1tZg6IRlnFBwe{3Eft_0!^V zg`Mf)pxR%vvw`HSiLo*J%~a_DC={gxju+0}hMh>xjpx9SxugZWzeKjrk}h}vsllTR z&N%5b{pwn^Loz^fW<|tnB<>#o1uDBCAZcgnBp(Q;=Lks?GLRUfEKcUTv?HX*f27&j z7f#a^u1#@MK~SO6qLd`9zNI=FmOgD(NK#;N-rb^+?)K?UhS)>H&e6ZrWsABI++etI z5scde#kuhd&|K#=e5Yr}O|kQIXC%}OFiuPFetjN4tctNz$iT0!5)fheaseCmoHv0_ zF7npBw@>>b$E~g%WB16H6lpmbH7XjLgfV8n8XEgr#PThO|Y;^L% z88eI!$>?4-tu$PvW(9IU)%FVL`pbqy`Gr;$MotLpbGctS{Z`fAhua>8M|spmndqdd zuJ>^ir()7-T3F};Mcy^{fRTU!75U9M($-|K0CzW5yUq*f1kk@H#Y#Bf6-=uTT_k7P zws9UQBaaOcUQu|VM5vMk$VS!{m-+DgjW1QWf@j}bj28_=BSTC8Hh09PGZOE!o@mw- zxWrv8++6>{R(>2XVLTb)0!F>~_c_lnsCg`+NnTHcWKt`fCDOZb9nZnLkXm0h0Dl}Si!j>x}lt%$kT$#)2b#6|HZT|K2~ z_#cRowQa#v`P09#JN(9 zS6?7r8X?tM`WwcX&eGg0hcG2oW6U^Od4HcP2KcDjUz!I1c&6ErQjCqoU>ee%Dt*+K zxpR@`5kMg$=U{7OS9gTb!S?dfq>@$>BdD^Kf{b}R^$RncqELeIdcAAT7aK=$VgATL z{KEddroHqrN6XSCkHEopmfWUj%@r6$CxqI~7Ghl5B3mzW?b4-EWtqst_YlK>3_4P& zPX!=K$jTQD4L?vH+0ln^%EQ^$Mf3{N}Wy%=)t8l;#*b~!I$F~*zq3x*uw?W z(UxGB67|XQlkn?gP?gE&=O(eu44Xm2z}tEdN%Dbcw4sd^!75lG!8at`dawbN`H0-G z=7sinEA{32W2*xV=Hxr2-+=60ij+?<4R)8(1~NYbMl|uzqxo!vO7Gg2k0Y~s10k}&O!RK7td zqpdoB?&4FU3g45ydQTvm%aYZ<>>XUbd|j*@Jg*!#nnvcDebYB6Eb0dj#q$<$e2oLs zGa=^zZXErO3Zj7Ps3alzwGb6ZUNXA#KC5o`e8|nup&GBt$)3KWh1_G!Z}t=>n|R{YJLtk@20cTxHUw00>)}+ zgD%%W9}Ns<0Eic0Ug20BmXQ15teuAYZ$2=9#*V_%0v=bOeVo0W8;V+7c*=b(g!7gYuQ>t|yS7>X+^PN%SB< z<_h73--$!tyfBE05PEsomw*S6TLaUuefkps!I@-8=q!*v&#i-_4_*?9=8KZ^y@_^C z@hrLI@1CQqfnko^Zl|=;`3Llq+|ip%`HC3J~0TSu~?QyZ>+ODJH=Q(-Zowj#gLomi!JVu zik2h(1kB3AbA}{*jZPBw7gjW7Wk0RfB2ik|3N!WoXy;;&>CMiM5Jg;_(c=f8(aHr5 zzqT0B``6lNvcUCP5zj;%KKF3j;KkquRoF81i`-EW<3dQkTVZw4_D|ts*se*`J`_ny zbzQ-X&WEDZ=a1#yxz{Ge?aiKkBxP4OO@xL7qN8f44$d8Wdw)*hk6P@-kP+q$NPS|G zI5kwp@*kaOGJ+YOF0OaNOzK5o?f(kY6r~Du5Eix!W4wQoG*??TVY>tQpCn~-iQ;i` z6-!E{IyxGx>*atO(Natl<DJ{-Dit@sHHPN0m(okW z`nBwqD-{4m@D$)!<7PWDor|ovAG>{o`P_N;t6Vef6xP8P<=ar1q7a zq4=o<>8<*vjmzit)^lbjuugCL*tJWjmONOhYnQpVGzPg?^96%$6y;o2Jg=oY^rDuv zz``dfS_?95U(Yo-wd`JqLD0T+BB3TmflQGE*xjOR@AzEQZm}g5U?FWucJ+Ux zw%zS67d;%?Ngm$y-nSy}nz$ny^fyffRzacnrg4!|$w}B61zP|+QT3+m>-9iwy}h6F zJGjWvPM0Mm;i;GkWAaqcQ+%C_Ot+!Pp^4^vxJ#a*yRDT6U%!)UK1%~JAXr&-8F2FwUpUt;=w z=8AaJu}nme^$U`&nmn3GbB8lib~kU&0{(0%Gvh9V%_@mI(691w4}|Iz?@RvYgWde9 zoY0;^VTX^NL+Dv=!0+09b~6C9KBzy9yS+DoB_D?m)NN3ic3lpG=B^W8_#g=(z5%tT z=39tcp+%Y?r=6h-;vG>Ak+p~rU&>Jv)&PVw`$57_o?x4iuZr60BSpJ`vQXZLeDFEI z*&1$zK?+fqLiOlEZ6Dg0)CA8%E8?RM+~Y(i#w!dd!Mx+lmb%+yi5wtS&b!EH&XD7C z{IssVXMdk*G1XT^t&@+?qs*hX4I_iV*Z>@QuCu}xSpYq4;wB=m&+joy?$j^_{*kCc zKTR8g3UASzQEiVEY3q1w47GPFJIoSGgm{T9FfV^ck;2sB`5Jj%f0*tn_14Q3@Nwi2 z&gL!pxmh&LgI=f-5Css7lIH@-S!?`tKL80e-TUv{!!BE(bGeN}Px^xPjxqbWbgtOY z;E5Mh4RD78fpb>VmN&Ag SPwLFF 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

    tjD+ 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

    PW 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 diff --git a/Doc/GraphBLAS_UserGuide.tex b/Doc/GraphBLAS_UserGuide.tex index 598b4c7484..7b234f2088 100644 --- a/Doc/GraphBLAS_UserGuide.tex +++ b/Doc/GraphBLAS_UserGuide.tex @@ -8147,6 +8147,8 @@ \subsection{Using the JIT} is not set, then JIT compilation is disabled and only PreJIT kernels can be used. The optional environment variable, \verb'GRAPHBLAS_CACHE_PATH', is also read by \verb'GrB_init' when the user application runs. +See Section~\ref{cache_path} for a description of the valid characters +that can appear in the cache path. When the user application starts, it can modify the location of the cache folder after calling \verb'GrB_init'. It can also modify the C compiler and @@ -8395,6 +8397,7 @@ \subsubsection{\sf GxB\_JIT\_ERROR\_LOG} %---------------------------------------- \subsubsection{\sf GxB\_JIT\_CACHE\_PATH} +\label{cache_path} %---------------------------------------- The \verb'GxB_JIT_CACHE_PATH' string is the full path to the user's cache @@ -8406,6 +8409,20 @@ \subsubsection{\sf GxB\_JIT\_CACHE\_PATH} exists, and initializes the cache path with that value instead of using the default. +{\bf Restrictions:} the cache path is santized for security reasons. No spaces +are permitted. Backslashes are converted into forward slashes. It can contain +only charactors in the following list: + +\begin{verbatim} + abcdefghijklmnopqrstuvwxyz + ABCDEFGHIJKLMNOPQRSTUVWXYZ + 0123456789.-_/ +\end{verbatim} + +In addition, the second character in the string is allowed to be the colon +character (\verb':') to allow for the use of Windows drive letters. Any +character outside of these rules is converted into an underscore (\verb'_'). + %------------------------------------------------------------------------------- \subsection{Compilation options: {\sf GRAPHBLAS\_USE\_JIT} and {\sf GRAPHBLAS\_COMPACT}} %------------------------------------------------------------------------------- @@ -14768,6 +14785,12 @@ \section{Release Notes} \begin{itemize} +\item Apr 7, 2024: version 9.1.1 + + \begin{itemize} + \item JIT: sanitizing the JIT cache path, better burble for compiler errors. + \end{itemize} + \item Mar 22, 2024: version 9.1.0 \begin{itemize} diff --git a/Doc/GraphBLAS_version.tex b/Doc/GraphBLAS_version.tex index c4b9b9002b..60e7d991fc 100644 --- a/Doc/GraphBLAS_version.tex +++ b/Doc/GraphBLAS_version.tex @@ -1,5 +1,5 @@ % version of SuiteSparse:GraphBLAS \date{VERSION -9.1.0, -Mar 22, 2024} +9.1.1, +Apr 7, 2024} diff --git a/Include/GraphBLAS.h b/Include/GraphBLAS.h index 680ebdfd92..2a63e283b6 100644 --- a/Include/GraphBLAS.h +++ b/Include/GraphBLAS.h @@ -1,4 +1,4 @@ -// SuiteSparse:GraphBLAS 9.1.0 +// SuiteSparse:GraphBLAS 9.1.1 //------------------------------------------------------------------------------ // GraphBLAS.h: definitions for the GraphBLAS package //------------------------------------------------------------------------------ @@ -234,10 +234,10 @@ // The version of this implementation, and the GraphBLAS API version: #define GxB_IMPLEMENTATION_NAME "SuiteSparse:GraphBLAS" -#define GxB_IMPLEMENTATION_DATE "Mar 22, 2024" +#define GxB_IMPLEMENTATION_DATE "Apr 7, 2024" #define GxB_IMPLEMENTATION_MAJOR 9 #define GxB_IMPLEMENTATION_MINOR 1 -#define GxB_IMPLEMENTATION_SUB 0 +#define GxB_IMPLEMENTATION_SUB 1 #define GxB_SPEC_DATE "Dec 22, 2023" #define GxB_SPEC_MAJOR 2 #define GxB_SPEC_MINOR 1 diff --git a/README.md b/README.md index b2ce94c06e..61c6570cbd 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. SPDX-License-Identifier: Apache-2.0 -VERSION 9.1.0, Mar 22, 2024 +VERSION 9.1.1, Apr 7, 2024 SuiteSparse:GraphBLAS is a complete implementation of the GraphBLAS standard, which defines a set of sparse matrix operations on an extended algebra of diff --git a/Source/GB_init.c b/Source/GB_init.c index 4a45839f36..a25f47d2ce 100644 --- a/Source/GB_init.c +++ b/Source/GB_init.c @@ -82,6 +82,7 @@ GrB_Info GB_init // start up GraphBLAS bool malloc_is_thread_safe = true ; #if defined ( GRAPHBLAS_HAS_CUDA ) + mode = GxB_NONBLOCKING_GPU ; // HACK FIXME if (mode == GxB_NONBLOCKING_GPU || mode == GxB_BLOCKING_GPU) { // ignore the memory management function pointers and use rmm_wrap_* @@ -197,6 +198,12 @@ GrB_Info GB_init // start up GraphBLAS //-------------------------------------------------------------------------- #pragma omp flush + #if defined ( GRAPHBLAS_HAS_CUDA ) +// this hack_get setting is used by GB_ngpus_to_use: +// GB_Global_hack_set (2,0) ; // HACK FIXME: default: GPU for big enough probs + GB_Global_hack_set (2,1) ; // HACK FIXME: force the GPU always to be used +// GB_Global_hack_set (2,2) ; // HACK FIXME: force the GPU never to be used + #endif return (GrB_SUCCESS) ; } diff --git a/cmake_modules/GraphBLAS_version.cmake b/cmake_modules/GraphBLAS_version.cmake index a3eba6df7d..7c8f75e6fc 100644 --- a/cmake_modules/GraphBLAS_version.cmake +++ b/cmake_modules/GraphBLAS_version.cmake @@ -8,10 +8,10 @@ #------------------------------------------------------------------------------- # version of SuiteSparse:GraphBLAS -set ( GraphBLAS_DATE "Mar 22, 2024" ) +set ( GraphBLAS_DATE "Apr 7, 2024" ) set ( GraphBLAS_VERSION_MAJOR 9 CACHE STRING "" FORCE ) set ( GraphBLAS_VERSION_MINOR 1 CACHE STRING "" FORCE ) -set ( GraphBLAS_VERSION_SUB 0 CACHE STRING "" FORCE ) +set ( GraphBLAS_VERSION_SUB 1 CACHE STRING "" FORCE ) # GraphBLAS C API Specification version, at graphblas.org set ( GraphBLAS_API_DATE "Dec 22, 2023" ) From a2b5679c1f026b8a9ef10257f1675aa864841b04 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 3 Apr 2024 16:57:00 -0500 Subject: [PATCH 21/76] move GrB_get/set of global settings into critical region --- Doc/ChangeLog | 2 + Doc/GraphBLAS_UserGuide.pdf | Bin 1128664 -> 1128984 bytes Doc/GraphBLAS_UserGuide.tex | 2 + Source/GB_assign_describe.c | 6 +- Source/GB_jitifyer.c | 17 +- Source/GrB_Global_get.c | 236 ++++++++++++++++------------ Source/GrB_Global_set.c | 224 +++++++++++++++----------- Source/Template/GB_printf_kernels.h | 3 + Tcov/log_Apr3.txt | 205 ++++++++++++++++++++++++ 9 files changed, 490 insertions(+), 205 deletions(-) create mode 100644 Tcov/log_Apr3.txt diff --git a/Doc/ChangeLog b/Doc/ChangeLog index 26431376bc..3ba9af37d8 100644 --- a/Doc/ChangeLog +++ b/Doc/ChangeLog @@ -1,6 +1,8 @@ Apr 7, 2024: version 9.1.1 * JIT: sanitizing the JIT cache path, better burble for compiler errors + * GrB_get/GrB_set: better handling of concurrent get/set between different + user threads Mar 22, 2024: version 9.1.0 diff --git a/Doc/GraphBLAS_UserGuide.pdf b/Doc/GraphBLAS_UserGuide.pdf index 5f009929b02de4cb68297228f5f39a0fbc23c713..b5a7413035eb4cdcb0d3b7608a04ea381b1f1561 100644 GIT binary patch delta 81591 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∨8fHFbF!4L?^9@LYN)EbJDrN*u{K|X^R_3{|>?qOTM z7k8uS>+$=m$#^>ceZu=2MURt^wI`ZpFA7=XHUt();?uo;F;&&(@KUV4a~MCZe=`iw zEX5r~uni-mX~5w?RhSAVK;SXE7tKurWIhM9POUPg$!A*w^@4xlfD8pNOE4jD!1})T zXm9ei{O}zK31WAxtFuy9M>RTv^KH^T_@_tFPTveC?@5c`aVv+l0Rqw(b3`Q`NL zukqyNn{0flBi<_X52ayADp z9LLWfjlQ}x^vFI@vB&Z<|F7yko-{%1dz@ox(hml4_r z6#_Cgm+`X%DSy3L>u=n+5&xdQVn4Ooz{`jfDN4DfsO`pwOD}gp>bfYJB9M2vwi>Op z(8G@&`oG@{hk9+ePKpZ(f7sEG8qSL|zmdbm%_3ZU|13QCJ-dAN;vxFZvAEnW zxQdua)go4s38@#Co5eqaUzY#6d^5cD;zH=zD}pJlVSmZ){dvD!2_2a7?YreF3ge(% z@*rzI<>d`M*Jf8OMH1XCaodKN+q&8zrGlNQZ%k9wEj?!ChKSnii)`KRzt7uS;_tJ1 zh3diiD=wLoG3k*Ng(+Z590l8|CZec7w?0bfsuG5P;G_3aq#!N z+>l&QZ|?JXm{!i|E3QDQ@P|qB<6-*#;q2qt-`=17_!?h23~8*Gj+1_Gw%J&}D@8t1 zagfnt)9nXS`Yl_NwOwt{y+Q<+w|PVSd$enKzkeiVhxVd?bw^QLxua+9+8OJAIs)9} zj-ZEXOFrD!xs5ZhD7ES)ugY)X$EVW$y1St>KZIO9yd-DN9WNu6q=Pe0KZGj$rKnDB z^Zx?LUp4Ej$eiMKv8Z0&=F=rlfJ7)+9LK%T(YGMv=f520ft;Bvl9+{p0}(TwNRseD z@PF`WvpLhD><_$JCc=3b!UvZoV(>>K+VG|;9_fk86AW-1h){%R6(ok_DmX*O3Ai%H z9mms{CF7a*f7t!;)#>xj=MN=V1TXhHZFRuYcTjnVDywp3cKa4f&m*OpkSXI@9n_7| zC0R#lHNFFvo;~eZ=OYlzcqo3mWAS`+tbgcJtamIvMJKdj>eomGZ}YOh25ZcU+pL6o zN{qhDTz7e~p|_jIrZv0&vt5EG)-H~uc6ODi6Gu)!t_y$J?+@b@kcDtZDL_(p&1lCNWex2)<7sXENr~(%E#^$3?;oOIal4JhAR?P3gj5yMKkf zu_(e;wX|LG%t5cskJYiA|r2;+LXMsD?HB;0KGv?8C z@HO;7=-OY(jWlAZPQP7pNG)t~ghYHjQVShkv!%TQGucKC_er3L3m2+I7IqjVQ`(hmzAWK5uRj|4ZEtW@=gClJqY$TW(S_nYq*9M zuR_V|eXSypY8`x^H|9{Z7k?7>=ZUoMaw*<~+(ta z%jShp35&yFSMCsIy@es;C77!CfP3L^Nb5hq^M5raJ3d)kk@zg= zLh^BSY}Af%O}lS1T)4Bi)=JsZZ?Ei)0r%mW2&X3??45aD_3;N|bOgb%*cqsGQ8mT_ z3aEvkIw?YH6apYT%HVbjP;eQ*M7zq})2LcKNVN{Z^wkRH0q;OmcZKztN@!X`!q<#w z1wiqQArf*yRoS@Yihpt5cLLY{%VoXVHI?c^$DeX6hXJv2Q%5WE7z2106WtFv!kEsiGSnL20;%#+RFqT1%6>;q0k=Og$Qm-UI9A#3^mvdb_#>VjVTdXBCGG>FQ~#}=3qzHNff-d-*ff& zJs0=m7=Mr##t%dD9ZH25c2N8qs|q|!+GRtWqoYE|SuCc|{`tp^+2*CUrfHZK#&Yf8 zy#mD4go&;FOS_&z1Pu~vRLRq!MMuWgd*9F0s71#K|@NmQ*Dh+`rJ~|tj)`<_q zKXAPLcoPob+DY(^H3|Ygeog%8A6{%L7#|z@v44^vpwUa{ZcMYT^F85WU$n8^s97KT^XtE!e|&zdF^nHX5Oc=q zTopIB1KqTBw{E*SD|%!Pmrjd=PtW!PqKvR%K&0U967yar!FdnZaS_rl>x!15=ukBN z$7`T;FWZJ|7ZH3SCsrp4YNa$VGkPrH-cDv4^G1*&x(2PSf~&TfCdPLBuPRdA}MB@USB@@ z6{ZER-Iwui3lsq~mvIOI6ah1n(cdb6y;c&C<5G29ebf!*n@uX8X zo!IqDbK{{&NaBSbI+BX5`|EEP3sRyDT|0NZzL<*z1T6ORw=iF97JPB_ia-0ly?yoi zL!uT!ur!L~;�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 o`UlP@+yzvW}5 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

    >H56)j1WGI#iLP2 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

    QfW|L} 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 l8ufoG??Z@xJ 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

    #LB->G#trLr_o`R#RY&r!@hX#d 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

    `YKow?IJv&DUC7>;< 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 z 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

    { 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 delta 811668 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 )}kL$yY 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

    n{v&J652F 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궼hu|TdxNt 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%0A)Lh;1#K`6z{NuI~ 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%0A;%==C(`n>HBcI9Qo?u3 z#`a2VIINB@TVLfHD3ScwgLTLd%uYWwpN@GXn!dq{cwby;fP+*LQ|-bM1&fAHB@_+KZDbCYM zUOpJxaLTTq4=-rh`|6~FH(a0x6&R14>i6{K9h~zTt^n6Vu0^XGVmQtc0;eR2cYb(y ziMJr?#{nJQstHfA%2E1F=&X(SYw@n3#_|E=V<|6u3EyCHbk0Oc)-S;@ZPqiapDM6w z8Ikh!53iAf*HM2OVq@b7-pKKjT4g;)BTp?>^wX{2a=yEE3Z9ovz}zQ4+=D9W@CYW- zlQ(Bw;Fh)xvT_jHgc}i?aeUjSNJw%L9-R&4CeGT16Ylc9ng}5CLL~0((c%0JiGk4F z|AtnQOj%`CBxyr8{HMZkp!Jqaqe?Q+6g_IZjt|daHMf6l%oZy>Bo(U(t7*%1(@<)e z61rjRoZ+$&DE93zNlrT*Ggngo2&vqGoyOzCz2N}@Y)VBMg>iHPM4p{R@?p9&Vy?3= zYsr}?f{n2+T%-jGy4G+cwJg<+y_^8vXqi=YB7GJoa$AG22pVx{ILkL&juC^Opau3A z(WEfJbHaa5y4VY3PFlqr-p<(MnwsGNt3Xu0336+P@v5sP?)*vu=F6r27nuc&ppXlo*bzY#;khtwFQ4sap5DjQve2eN5!nWmmCJHC0RVC6wjPbKnQvzxg)C? zJ@-dysm!2K=XYJl7b7qEQnX>JjY78gDS=@u6*1Twhcudh#cM*w2^bzW6%*og5ZyCB z1#EEj*w(il7>Di-ycTaVoC@{aY*s>q)jmtsWK<#qPDWpo37eEmi;~Z5?^|{PS7}5Z z?ph#0I83%1qP*A(ixL1lmwGt!6_fHwVQydi^N7wFA zkm%QJB?K~mWOecw#vj&Z(IxK{PGs zOHhQ%PE?#(MM6Kc!EYW zEEfEJJIH2k^0IUsPu1sMKiWVQlj}S*JICjBZ(iW~H!=u=CKV}IK@d%)X#XwA$1=rW zW9!(}`&=r~!@Dy-ZH94vqR;sJRFIOHi%d77@q!fXSqA5E+^phA)!Id3xFyV#s z4(GA`o60NVX9M^}Q!{D(7{luCO0$Z5zd+iD;d&q8U@a)0z0orv!$j-Kqx$|tJ1~}i zP8MlFj*~XlWOeiTMzQ&==}nqrTB(SD5#;WB9CZP95L()hDM|i~u6^qMJ40=IqP5jC z;7Z$3L?&feBda3RgtjeNweV@oR~;h#1oQIKm|Z(~8O~%*SrnYp-ncE&9E&+J(=Vq3 zZ33@1kE{k(re6%cXT(7V-xQo_n2R`XZ5IO~=*&w|UA!DIk5ql3C^;mWTCtJWOM1KIFt+2l)|L@UWy|=;I#{NY z`XNt0xguzvTs5#WYr@`ZK~pJ&JOl~YbTRkpIP&=cixqr8f7PJ~T|6HV zfiJTKhRj(~1eAC_SBT}Q-H>u~DEZDQyJ0Y7B7MA%y}<3QU9(}PJoQ%fjCxVg>_;9? zOJt6?6@{^VhXhm&y@7~{$4F;?Y2&2~wTc%vZx@cOYs4AX>dg-?OsrLjZC?Q%T4^jW zL?p=cRtp!C^gbGGOPtBkzEch9Vr_>vy75I{)>DR|%PwLVuCjeH;x-c+n~%OBpxfmaudwWqnM5-!&1u8~4wZVho8S8Umbug3SYH>$ez6 z)6^K5jnSb)Ra2-)oKNtezp*m)KW{;|hc3UWq-#nEt>_=!ARt|t^!D2%4*ilxa5k|K zO&ALjL$+LZ3oAd4OG$2zV2S8EOu;n3=;|svv!bpcpGm6^1kN0o?3{SgvAm0aFm!Ac{yyN@Up~STn$ZyOK#@`#Zyw7mbco$uIu(vij~rnw2F>_-T_W#@?SR;;n%ij*nM4Jq;)^y{ zt-#SIA|eDX4VkeD&jcIo=R7Jdt|3!&xaUT0$Za94jMO`|MhiuMQL3F5u}SaQ{HEPg z=*G!7##yvAQsw z{+!RTla3(m#FgY^Z;A?>=2xbCT9D#G`r}ZDlE->-`J-ebNu~gcip94jczB0=>*Nfj zw$WZosf?kn6KIovlmL~C=AC2<=hT?Hd<)x8^7crj&xtubxNXGS(Q+xwFH8tPAN5Dy zAR&kk%#0C@;}Zf7`e6_Or;!bnxn<;mDJR{ah>k;LDOX*h`snWbR}}H1)R>3<4zZWx z8+wnI1=q46Nt|s@SJ~P|3A-B#U#dA4bq9W&z?9T~>Fb(*C9NY2h&c&i#lj}*>|{8I zVfADQN^kw}8k1Y*n|aD?jK!kg5k z)2dQ(>%f8K&1VR!mYcV#l6tLWs<>N3dpMFgpKe8)-yfMM=>Sh+F5r--=MYTVa6V1y@s5Kv&RZGC?r(&3otItH=&fh|&- zJ?ryUGxJz&w#WB940>eeQ|8*-nbwGghN;0UxFey@;>sOtMMCqy6=;s3=G=lTm>5-6n{li(Sx-!Km#gcP_ zmaUBT)0!UU*NK6U3AT_7{>p4LqnF}JOeLa!lbz0@jd78^wjJ5duf}IcG6OUNQ(F#Vr#;cP;*54LdCJ zz8&?gJ2DcItvpm;PtJPtpsb37*uuKIO>bZAFd}Ba?Xl4FdGw}nh#k5WhNK>-BJN;+ zzpc7umrMQ@$TnGdwR#xuooBX#^f=vX-dkoc9oRSkCvK?48?myM^1~9^E%05Cm+-0q$g&m zBgOhJiqgfbr$vPgevrYnT@W1^g`Y8hvB-GhAwPtY=TLRMz2a$fKW36Dd94FAlx+;{b|DiN%-JC{Ua)tpJqk?0 z-LvVDikn^PGxlR6PDd-kn7D;1rn?5U1)Hf`CDPJFms5Mu+c@+7v@V{a(>plJTH-q) z)b9EM54-dItQIj+feOlFlzVl5k3sY)Y=rL|ZJ_>kzo5+ECp%$(Q!Qb&Aec&vFP7NH z)^V$B!F!(H^N&R_1GgNPBc=MA&HXG`Vreee^sV(!gm|-+mShB10jASWC;Xw#IoV&2 zMyV%}f^ILYXyex|27!{#0-WcDQ06i;YnaXm#cn%Qo0W}l7K7n0eNae$L6GWKaxOg( zrU`nhj}g+fTp8DX;kR?1@0;W0OQU86AL@vswh;V~)rT2ixpV_1;+skwX1a_jj>D&17{qjpA?g;T)E#Blv1@` zw}^oaY*FV56qUDuYD7=qhRvGZWOhGEkE@@k$V}zc62N z!0pI8iT{>fc&9IjohxT_EXXWKvXqxy8XDVlved|VyKGxd^@ovi@>C(ezJaZOoI?+3 zX26>PfvP^UskXA@bj9+nTe=rrLu}-mCyuPSYj=)HeO={$ro(-)QKoR%eD3mY$2gp7 zwP2K3Wks?F1ZYUf=pq6TS9^N#ds-<(;v*fDz){j*w_Rb)BS=dG*1z{RIMKyh7&-^`2(t;{qD`hnk&=?Mt5Gw%qk>ZR)k^Iu8x1 zErjLD&^%dW1$%~?nlN+hNo!`pHPB|czvGnt>+jSN^UqPeE6E1Z#qHl^kA6HBG?0eC6F8yMqqcuG#MO~^@cHM_p4x! zAsLVeo^>mS*~MdTpzYww>NM5DCTX)geMXUtibIJj;Rqu<6Z5>{p~J;eB!r6QH1nt_ z7g3&a@S5uDoq^R-sZ4UCghqeMT+8FF=wY6zgSXpf%6Mmd~?a3oTF65%X`Y(jA zlMPG8GbBq1m(Gh~D$2BY5$^D#56^WG{HGxWwT6A51jpORgw1ID-OwE&vw3x1PYSR`jwq-h^i5K8?S zYOD%h(90bTK5A(VD`qT@bVf%loc-2k#+2rFzU9_Jt)r&!C|NS(ht63;?Xw5w);3dx zhXKqkBJ=PmOn~}zgV9f&Np{(^1i66W`+FfNqqD*=>~xZ{RVwmrN%1_ZoGhy5?-nUB zh;-zz5ZUL87f~LG0C8CAFn)(6!wsZ=bK%jMK4<`uCWPdf$5vbSZq<64UE4Hd=R!(7Ai2(0dG7 zvq$rDxg)LRZ&07jR1RQEN#r@9MM5U#@fwHx^_(x0O+>bi6%MITC7}iP=u@wM+{<*k z2b9Hk=$Y@o=F7+%g4U$8uN4V0G_JW2mBq*>uT+`0_0n0s9oTMLR{CP24a0P>_+GRHR&n5h=f!s&DvvGJV+If>S*k zj^V2ZmE@(Mh;aePkHCrlC%G1XM(GCuvMN6ljXOnVa0;%*pLlO6@yyFPy4e=dd;7T3 zc!Di~ktcx5qk4x>LIb@i2+!2PB9Ulh+aEvyFlDYo`!I zfhE-cFk<$L=`F)mP^xr@vL-#k%s2tAoy)n2tU{bws-dy%3RYHjyC_h9aT2u2q#oZX zXqZR~$!9aXUG5T!JpM85v;w9SA?NvmWfmZiH~u zo60C|em@Ya;xFEKZYc?L`T8hQnsy1O&M>f1d~uvlU|njSM7qir+mG?~ZfASxASK zWH;z%KJNcz#x(^Qfv6$9a080`TgfK)(L*r0O@#tOF;TdMr8PCfq2iXr}>c;95hCKlk@VkunNL0 z%g><;TjVl-#0F0~H$U-SE5Eyb&Snm`w05SS5g)Eo*KZ4FdpbbKGAo%J1Hb0o8a95y zyckhq0A%6d{)_3E0$VSO8Y}tY?j+>ir5lftf0RK17@pe2HCY1URR}r${*|E(Ac_$#PVbWMhyNk zzqqO66dxZ#j+JG8aQjX&y`h-~%p}x3|Ir?4N@u5Fgw?bS&^B&Cz9vy|=KP)@L)2N*=WFL&LM5|z$bZ|HG@-1VoBN8d#?^4aED3^M%xnB};#I$j<3 zgR~@~@@69Pd9ZI&e?+A;uANY}vy(Ob3)2g@ofEVBr*)4r5Y4{Z4GidID;msz-CT<7 z^0pGZ%ghX91){y;?#2GivRd(;9B>atBsLv z^Ze^C-06mv<_k>!gO=Eek3Kqu=x+xl7KH*ec}KZm28hIc3zRsg5L5LJNRdSZDmtun ziD}u9$1U+TMBi!Jak$O^p52U(g)hr|7i+2>Z?DEAdp+AqFu}Hxy`$A=T0J;hMH>Qt z$sP1QYoUA22IPx(a4%b0h@hf%QY?BurdQm7Ag1G6hNN*wG^m86m3!Z0l+w>aSYPPX zg#6PH^kCb|ganjl8*zSV-n-4P4tI!*cF^5iqD;%X8?`O_d$83#5NmlW$GO6#B}~kK zIJYS5dpy{_L?{IR@!k*6|Fm{(N*OGF3mIUthRJ>lJuEVuA!*Bm-Eroi(I%#HN$uYt1=ZgsFCPaSc697-@LzgBk?UVT7`%PuAvpm6;oEJekC9>$o4 z>(dH^>Zs+6B8csJ9~)k_GvmQQzNvpSYXVWuyivm+HJU3$?l4% zD1cE{&o~%%Q^c$dDt&g*GkC;h{1ptj8UNh?`ao{|f*N+`-G+yI7(9da*=}&>i2K^;1*=-#D!T(s7{N3Lp#sIYiV#JHZ*IS+cx;gkjs<=uA2gn-Ze|z8 zwQzidvLBa4!qvUqYLp^*vd(Jo*O1gdkm9Hg=y?^i{th!stl&_8ubSy2+#q(qR-atc zc73QqwvSLM?~+p!d`X>u_#=RJsC&P;g}Fl;LX3F_d7^L!p!Gz61S8{(@PiR8;GskY zH3+3yuI$g@@nzMVNPmqjWMbs(*2-6jei$agPXl&WBiv+SYQe~hJ=WBH6o3;w=^?9t z_*M3^!}q{E9H|FqMZ53CZ^OtWmMih(vAiyLf^xh{0J8DyOE;l^I9u)gtdoN)3hCu$ zt0pGAV^|Q^lzl)<_Z1DX^0>yoiCmia_zb$zV3)vg7`rTQtNR_O{V_|*|!6z z8p+{8;SG-~9;JPgT+*Z2_;p z$9RkqtDuNB{EPvA>LTpaC{7emqZ`paLlCl>CM*a)41sW0853+sNT6Io*nNi)m$&SY z9!{x*)uLxpIdN#cP3LB}s4)Hju`sK0l)O#w&@uq-0mbqy?FbCny{=x9WH$ETiY zAkE&rT5mb=JZC)7Zd7klTWp;%Gz+U3FlCU0P5W#3vG-Ab3Uj6O&2JTfbLAuVJ=JaO#f#2}CN=a+WY-8&)(@JcF) z$aKjN|HI6Br$~ko%JLd8DP{Yy&&B?gM8z?+#0P(&hrB;oNakslrL_kytchj`TLDZw zsoTgrUgCHOwfm8@x#|*Yi0n#rLP=Hd1_%nH!ep#})@kz-wP)k1O>g%Ye&`|JAOrcX|qID9%ApjSdoOx0e=AQiD`5~Q{vI4;iX4i3tAmkMz0Cygx zsnY`aM`AlbI!qau(^Ae{D%BOplgpno4_*T38kWM|xKD0#cvDRU2P87*UP8!7 z$kd8@gkVZ&d=&QmF>yA^znEYcN1|;Mqkl(#MiCq*XC6@NqFT`k8Q2#N6#b5ua`etJ z$po*!5ZB-h_tFLZCg*K%|#*Ym{WqD@|ko6KZK(cHxzn(z# z4#dzue36|(fBX1Genope=qxLF(PD+^*52Rx0c<;0HWf8F^Ls*c1 zXXD|;g*Q?@W!stGX4U=17okpc>#g4`8}LJ|V(^{=$?#*Dc{G&+d!QA!vaGH;frRei zkZKQ)r|9KG5@daV8+$f76aCZT&DbxSxio}AW50IO*OiuOV1gqJ<|dkqxFn{U)%liA z-Q;%!9iMci!#|?0-JoAEid!g>B7m=dHRhJn#5vSiXPfNGrjxyyBsrGC^OasdAq0>WQiN0u5D^X5ww`npa;gBUWzB5QG|mV{w)SJ}^?1 zH6OM4OK&TNB|>+(*I3DuC!#G9r_<-0Ua*pIqsZ)l%<4%g{Q!$SWkU29+$d(}8R)~x z42~yW>L2)R%f#_{JTr6`{8%l2(26{k?1Mi=CxY#N;5Lhc@Ep&Z^r6Xql!!yBfr4D{ zsG5z;>@E-rlUPK_4)=$J0$DIL)Eir_- z@#|mX!)a*3(5Ao?M%~4bhs#ieZWysE`;^rR25G_A0E_#3RZU?G_%4xuZU*%S+gmWt zN8Q+bKUybcSIj3?zxn`qeqLL#rU5|009#S?#P55GRze^j$G1PPRu7AVxBoC~kR+WKbB0a|aKvNn%98awh-FLXx^8Fy z)6)(wV(I#R$odkP$v5?X8_cyx&4&SG!%;s|Eu=^!L6J%W9v+=9?vzGvk(}XscD)DqihLFHSOzvgej`b$WEXp1H{7A z(`(*@w_5C_Z?)+lge&SCetFbt&{0C|i*y7aY#UAR7ZEili|tj~q=_QpPkBQMdOJ20 z;O`KA0tqv8<;?i+(YPRG!uj>Gn zk{co&BY1A$YVvx2;h8w-VzqN)I~_)K&`F)_jVNXM33nmyz!am$-01WKjo!ON9QeD! zLCwu(=Z9nJ>8vhjd|5KW3)>_@;~!0T47i-YZV3<+Q!7HsC@7RdTdYp5=%VAAl0AkF z${jC%tXf01G5N&`)x(O510KA+I*=Txv0E169pfw&%Z1T@;w(xBzt&Fqr))Q=NojFD z$>~}n6##Vea*QDzT0P$d6mE{vM-1_N)p?_TM)ILuQbm^uCXXsq+F~k#%6YB>+7o6U zay8Conu~d-<2LRSJ+@<|r$C3w3tzN}W;~^-#01A7gwg1%SP|fhEpt9-(b>&sivL{F zkTk}kwL43H2&WYDTZG8zg}Y+jS8_j;EYoc52A(_+o2};76#mH>yUv-eF)zuoP?;ep z_{{CmwRigxUJ6RzIeRE$qHCtk z!BYiJ8eYyIk&>z|ik5J3=WQ%Jm*jC1J~-)@c!U&x8sXs|!Jhj9h!91s%j7|lC~{oK zukthhY)y*7Xxql|pnnv_?(*w>5KpXashz2?-@^5!RN;c{w44fFbur1XnK3lhde@e7 z9rY-qnU+j&sF-t7d*OA82&90PMQ5yY&HWsLR00q^lPREyrul$K=nY)2t8SU z>r31in-s$}bNHeJaApsC$o>A6mseF!G&v2HMJ|n;HG08G{5_F&=C#hvpSyLk;ke|o zs%?cD2D5oTaQo1uCfbdP37;)tt6_4AeFSwZo-F-uBrHbP{H$5=52W-e8bqCupScf+ z{i?g8i~ZYYAC5_eM!Twh@MGtwRKx*)ZY=XM<*E+v{3VpPdC?hGk<-U6TTmrYt%?yJ`F}qw1I_0$1rdA=XP=aP*Bd$!e^yq31oC4X1#Up=Bn2{Jw6N z40IPo;*F1YzyK zn)g(Q>(Z6HOsYrEd{-G;K@W5&XR%+O6(mO!V#f$K`=>4c_wVOMz!Pk{Sd1ax8UJv^ zdY`YCQy>0i*;+duGqY0Z&CIrc-cCJAiK)5BaU2x9cTaFo?6hYjBS;6kb$a;~sGCku z?Y#Z~H^-Rqbfl{}a2|}&@Xbn1o`;MWT|UJ@gU}`9JGRmCY6H*Fz*0R(1m0r-0#4Gd zvEnAI>Itf%(m%iTEw{t9B;P;?J;zU|B>di?c1-y~xC<$IJ+Rue?u8wH!QVXq&R`B8V%jKv9Q(Ahlbr4A(@N6qL}6&1?JnR0&>NxpKS8Dqk4y*6#9#ep<{m z{rVp}K>s5AEhCCTrHuwbcIFDgi&S6)%F3zz@!DA7-bs|dOEfCXgs-B)Ty`*j`-eQjTMr>keCzX} zwK*%PTtT3O$%NvBoXXH_6jj_T-`$Sb0yMVn%y-eB)oO<&Epp9B{kYF1zwDt4k(OW7QRO~2(FgBBh0%Zi~UtN)dK-2{`6%Kb0Y7Tk{cyKZCq z5;G&wf-L0uy?sT0CLi&qR5*-5=058_y_k^4QLRC6+MR2PR5H7|HgSE;%SvH?&4 z8-9o*Xk|W(b=>%lvKX&(8jA*#U{b^o5|hXMdOx4HrfTQSM=BK#%I4MnTa*r&Pu;_M zipSYvsZfXRbpwOLaq8dJDeh=Fkm%bv|@Jl?;If(md?;T|N9rfV9E#p@$vC6|K$!4u>m_m zOpR>;3dYWsU>j&gQ)6p@nw=>G?ELOOAs7TLot^FZfj~DmH&$aCCssR03n70-W`G;S z*%F`%b^<%Pg3SQGO9m(!+kpQmjTMy^pl%6q`dgu9XYTA~><9)x1=bK#u&oo+#l_YP z>IkuS zc4BpcSpTjO_&W@=%@Vd|Vs?137#5C<2qjQBq`P!Z~r%mVBT;9_HAUDM7!* z&>G%*+S}O!%%Np~-$Ts7&_Af2PR6cafU~0u_`T15C~ufF?9x*fGr@ls87+M zVzBw&7<&GW5O;ts8+80Y0Jh&h|Nf^BoiH;yTkCgE=6@YAP*hT0Nk)R{pOXJoii+B~ z13Xzk02X!*P5>7>CxCyOj|=erzfqKpA^)&od-9aAHMaxs{Y@6yrT-Cj{bvFg{#g%3 zz<*;Y+Ck?Q3}AQ~b3HaLHdE*?(EsOQ|I6k7-;Do`^8Y&K|Cf=Zi?#J%dWOFZ{(tnw zHW2G~|5!lh*2NjR0}6J~O|bpHrkdct7gqsn263_Zzgih*W9WY_h}c?K|Jz82lO)6) zY^DrxHnsd~HvSfC{N6Kbh%H#z&I$7SW&yB(*x3G$4!T^XR?yqS2|AL0sld?P`EN!E zTT?r;-%G~M#SJiabTod4$_AYzb}lY}CkVQYW?=Wfh8O^3wY77Gx&WZny$6`vIimhP zQf@8)P~^AhZ^VBMouVhi0|1IWAzlDb{0Z>^fD->A9yS0_@(FSA$P%g?(2+Bp}2|>B2J|QRAS zqW*-STr{2#l*^kZ1m&XngrHoso)DCa_P>Y^%0=f1LH&P>|3w^7KVutv=q~-f5dXD- zvM_csg+NRpj;1a)|H?t^-2W(?A=YN#f90I)zs1mTg*aI~9nS9{&QCF+nM|G#)WgKs z)XK@)*vayb_?*ARj(-TC-7#@AHU(RQ&7J=cbNwU!d$a$I3i?}Y1$O?AJs-!v^8e!i zZItQ1hzoy8(bUcwx&{9h#`#-fWAoIo-|GQ<>J$gGA!c^g)_-z_-jKkj-ar=u2>wq} z?%#R`7w9$fZxkp$=z3Ti|IunTXot+7qChRoA+CRf{jIih`7O|0h-#@#m40Ky>9UbCFny1w0j~AjcNCX7YO>u0PUaD&>Z&AuL;}# zoIfY%AL)NjpA%Xgbo3#1Pv^-AZKA!k%O6ERzpj7|Pb8roba1hA2Ai2YRnEu#kMKW9 zIrxA6k^VO+2m}rB$C-ejWk03kf;u^YZ6N<0L$2R8VAnqmiVGUV3Hmnw%NyFw|FcUV zD66Nm&{q%WZ0QL8V}hWqa(1)(!vPw@<*6uW&c8mxoJ{Q;|LiyP&|Uw4P{MA1EG9Il z`yUXR_1zy3dR87!oS~6Cz>a@2_|JP{>f(P0JuK(Ho_y$I^FRF87aSPu4mL%dpRqF) z2zXl)@b#ujgv5qxUTA0$FoYg2;78#ZOG|_M9Uxd`_f&YCHUP_4xsN@neIP z7CxJm!FR9JaDM#x+OG)aCL7FNW6xjR9XQFmuy4z?wdojf*qT}3|7cY0ce{8!$w+^| z>~Oj@ov|k+NY_|#U2gdUiN5}j6&-FQG8~DJmzM(_E}%suqoqQ$T4ZvnRffjt?Dfb| zJelO)ZEDXTJJ)*eLMbyWWG$6se;>nM?jmDfC}p>kn^?|h3@}N%*(pJIAH(2x@ioAg z!Nh4uIi`S<*j)Xr;h?}pi7LR?vGISXW>b3fQyKflgz$yB>LE|SOAFoDEmo`rc~Rtw z=5a#&hF;C?sDv3XUa-_uHX2Ebq@WgIlDZgZvVFS@qT}WVZwbK z!9+WS&HM*NwAOWQ?otj==VjGlp;oQlEdzC0@XPc5eR`zKefi8+E1P&HSpp=MCjW8!P$(adngI{snex$Pai*d7S#Y z%=M~ttxA&MQNl$Ohu|bj4+ovM1-RLIpT%4%;FQL5H=_0|@p|=EaqQTD{kIna<`^&a zs;Ep}r_gU7C(ryE7pkHbp^*bA!#Wo_o(Be)rv*5m`OKPzs-;NHx*4{ zj+=hRL)mFnINPrKc~SJn@p5U)1$l;8KATV1*X2D)83PJklw*UBe6;UHt*gM#wfx5S z#!SApZocYjs4%(X$Be+NMd=5+S&3RnqF=##l4d5j*~}@qi<-h2}~?fn^g6JFDid-LzI$%x4rf~>mPmfDEhWUdJ;eUNG6UOY|Z>)PWPQ(o-4n) zXZxr{G)1yOtZTnBhc;Q&3Gb(0d-JQ8H)a`Iz-8bvmY*OceOqR4>5sYXBf)Bk!OA>) z-&xh{1esP>zv$f-k)m?{8v5bOci%Jxr^ob9a9(Q#*-oC1L^QC{JmZ z)5Vg`Eafhegge4v#b3$$?!ZR~a>fnd!D{COBMVovxTf!1q|c~YrFmbw9bH~jpA>%Q z`ub98$dyl6>O&jh+MFPvWe zOe4!>dW)PyFb01H8{_aY!@+ux5k`6KV>IE{k;<178CSaHjKw9BlA1#ZBeHb#Rim%6 z!*{oa_7|dUZGkO-Y7<~Qm2}L-bZnHX{^o$J-_SsmS>yEe4huS1CH?8f9$wS6 z8AP8OtBK|%D6DdokS=IlI*d_0w^$Q-uQIU~=tEb~9QHG$4za|1oGxqh1fjf=gyz>r zDk_rD^Rj<<3}!o6x-|49vU|?jC@hO=9H!O`3dz9ogS@TNh!``imWZ@i6rK|7VZg5F zHp8RO8YbM%xGtJt3DZy92SsecD|+emXR&4M^!%Rz z84$yscv>+uYoHH_+u3BdU^2D~#IyaP2n+U^p%Z@@BCqsy0TK@1%gIz_geIi%(O=S| zW5_l8)XB~JGivZ+V(OFS%+8+*rJfQ5kAW%8Mf=GkZ5&D<6QM5AX48*eHUD! zroMj+tckhrKwI@NU z(Kxg4g2Oc|o|rQmk(5A>!r8f5--a9OyY_!tV>k9C#O=dAL4>up1wdDvqFa8y&GPO6 z^0sZfz_ykz3=Ry!-)RCvVJzoD`+-qb)IS2dnO6-;^`|1XE#QLs?BZrZ-rknSz@GWr zwYC$K%=x?KV_*U03@YQPi7+OncETF_2Q-o0M>-Rg&hM5NzCKUI)y3K1k*V48yJvss za*V3sikk?`UMDgue(qdH5B(aM{LuFNIoun^zMU1Fht@(9H%_j!S{+k{;I%RQQZ}Tc z&3)a&m&KW7uAMRc>=M*6<(vGCwn*bg(M60ym&#B79r=&GR_%=t= zQB=EuZ}Zp}#@N^r+F8>wo3WnlE3AK?;BsO;;3M)3+hiCrU44vZnNu%VmMQ*z`xwh zoYOv~yGJj|iR`EqZDy8_Djq0P_{2joNA>!+Q9Hln;r+vQWy5<#`l}8hcGn^Vwf_A# z?yZ?gUr7MRik&|PQ5B}838a4~{BfkINp6}%&tfSpJ#El&eozuoSnGAESYp|5o#NWi z0ys35zQz)EEYbPmW#*!ol+yQCcPDa2xJP+GZm6g3`mfiozjqZb?{sahM79mX#jxor z?Gwh$6`c}EB@gsAuXVD!Tdl`F)H5q~Atsn=@W#gGT%vbJIq3PVVAy~EcsKev%iWzk zj6{2zxfC**T9hNt5qLMxCmW(h;T?o#8~5%ZHeo%$JXGw2b=XP6Osj5r0ZD9wxlXAU zrvBM$UuN<7X;D!Ff^N%e(VqqDu8I^x9a4MKEj<7&O=L4RdzQeAbZvw|qUBGp4N1=_ zh3Yt?${15C8SZN*dr5ym>S4*L^mpTN8&#DvG}{v7ZN%7P1))RMzHl2~?3D2z$agcN z03#wv)>~lBk3OwJXJ=MfBn@XxLA8{s8+aHfi)8`O?(erWiiC9CtQiEcKgPB_jss>U3Gs4RMR)F-ZEC*E9TjB zF{%5ehv!&f$x~%fKIa!h(@<=BQDshG)omiQk;RvHe9;cS%Bw0_$T2G3gKFX(%W}Cf z?^-ag`XGS*kTe{vHQkGC{b4>!E%MF^d6*%=COmQ|{XqHv>(Z06Xey-RHGO%a<#M|b zSrkUyHwg`3NUndP*eT(144(Ey3+8fqcgEG$>=$q$*x2QZVVL8Y&4gmZsp_EHZQQ{` z$ZnBZR^TR2G!Er2WK>AwQk^&vE>a7tP#~EE0Ymb^BkBt;_O#cYe53jxF=atLLY=pL zChn1tHwXAl%Up9*m=UAoQ5sFwlCEOMvXcgB8@)GJK{bCoyKcLfxGE;H`$E4ShChtc z7o~>Ihx(()T{db=7!n;*qi5xKwsep^2EF2J>llSMyQNHN;>?x^Ijp0cH*f{wv-Ib3~a0dPhvynZ~k7x`U$AxD%=*)>EjeOoJN z?=#W1sgV!~zk0E;#tR#h^44))RMvfzaV~{gz6rS+Vw#>irNh87db}-opQh&Ux_76Z zU-0wt4|FL=Te=dj35>*H<1IWaj;}X%-6lV_j(vY8Lbq`h`VcDx3ybaQ%QGamti(kv z5T$d=v*Ob4tN+U|9Y50(aW|yQ1O{i1o0d7Y$X#D?*_R|BeX(#!#3&a7xvTl-cHtX2 zffQ~-FYWRz3-vSZ>!#v{+^{H@J}$8jAj{w_$=*$lf*x0dz``4VCSvC`NsCQopIh16 zk4Ark8>&P^!e%Nj^{7RDxDm?Pdn%Ek>f z*1(Q5@mbH*a5q`iqs)v@n8XfmJkC5bmXt*v(rR=SZ(g*LCXD9&avNFcrLRtg~J!V>@u$MBp=v*ZM_C|k( z`1JHw!3V;x5e+f?@A#Id>}!+c9!R`7v738Vmu6-rx;H!u>hU<>&R(F|}U(s&NCjA?CgK_|ti|3*7cHxmB9GM>lSK6@Rui!oupIkswpOMshfL$92cEo125(z?`)riXzBtC0p5nl~Rz{JBI8CJ-THyO5ZF% z*8Q9HPIIcwRuQKdJGJB3W2AqJ#!f+GO(ncp$3*4{hjTBA0)tX(>*oaXB!vpoUzD|; z#cTK;1!Xrck0(*Gk)D@aAq(qVT#}JuePWl7kshMNGyXA(Y66~Ro=ixIigU9azKWu{ zmCA|5ggi8hXv@mT&h_l;j8EKkr-?~Un9=Jw$-i!qeg%soz%*OVn{s~%)>^?UNA;J!A_mKKIXz!xW*_f1pD!p$ik+{>28mg&Y8&HgATER5qA%VI@`=E?T? zH5r=)m6gq6&`*y{0m2lHR==iVm?E(kn}_DGriGz~LaiP_{X-2%boav3$Hu&}921^;{>}H>C9tKh;g| z@>8Kj>FW6-HJuFp)pqEBibpC<@AXy-b9y+|NtO90AzYv$f~>Q2w@2+Qt_K{9{{?+- z_2oBf`bwdX0VIDAe9pqg*KbJd!|;4T)@yWF={lm76smjyo8O7(f{aj|ML%VCdG5B3 z8dP?>eu5|F`*=AmMUhx3$}U8Od|b76IBm(4rWv}_fNKgmA5g@{H@3c@k`{5!{ytJM z-1O3br*a)r>XE2PRwzNFxY|{Jxm$xJ;gn@5RSq}0(k_29+K>*%c$V|5gQg|LH~>5%Nj=rrkzS)n77}H1iAb3=UP_=qTkJ7m z8}9au@PsEH>)iD4rh=`6hVfnn-b_Ut6BbzjEL~cp-X5DIJJ}R1I&)k}LE5LkwXMU` zs49S@TK0eLm$4>8@Cl5j*`$e?Ldp~(>$)4!Gxx&TiyduoWDg$9pU=w(Qrf2gRY0o0 zmfxlD;(ez2e3w4ura2mjG6+kko!U*iOB&&o`Ab2c-Y}St)!33om>KrY8q<#_aPJKk z6JOB~FC_0np@dX9tb}V|7#;PFFgj3blHf(9fXzl9KM-MmvA$N8Zgr);2tojNEmAQ! ze}?lK$jz+<5(`wU5#tJVEo;7n_wKNfzQ;zZ}~ao&7J0i%c>bqqPx5g|tRssxg)CLkn3ZhEHirLmHm+4_EwX0&osHk=&;qA!=Y*sno;z&qIbWo|J}_^I8XU_8 z|CqLu*|FVXd5KTU%GLViu{}~-<}Auqmqtgv3M80Jo%;<-%&1ZHC1wzMCihWBtgKih zoP`rM?GKVE|2ld;a~l}Wi?|z0KfxY->2+7#H2@%g4e^?9m$*!7DW^X8r}c3G4Tz=c zMe%3&Bxe)~ZD0VRP;}%^-62anaf3G5JHk*;j0ofRFAP?4yUu+8Q=fFv3N{ZAuFe_> z_NX(zD$x&1C|ITdPQ!0BqzsKlwQs!_8QUjJkfh1A9kVR7m`xtB$dcOs+(3`cA}%Z z*F_HLo3iHNL*J6RN`GSB_h;iK)yHM6EDjWkHRtnrf|7|gvUp<_UWz=rl6r9htB8#2 z(62W}Tji5JFOFLZJs8RQFCb^xc5PEsQ6JEMF_ywy9_L#^FI?5EPbX{|*g8819r+JL z?TAM;XEw2zrQGq|?LgSRO|zm)7>Juxvf}Np#zuklcIL?SJIcll%NuY1!YvAYQZACH zHc#cHh!@^xcgiaXDlc0*6|NK|b~mG54B4Kf3+U*s`g2*08w8z(1ryq=)h2bDas8@) z_Dt^mCdB|#BKd_Z1J|VKyr#Imv;X}R%JH3GvI8<)JIT0@_# zjD4oUpRIsO?+6ZOCJXU4nT?dWeP1(w(L}`L;UrPlXj%7l8_!cX7PlB9doBpv)*LbF z=e~BHX4?rTB1;7Y0*lwA_%(yy z4(Fp>1{~i|#m|ym<*Vo)ALc=-UW-yDA2&6%^@WBzDb1u`%MuiI&GN3&i>Eq&<(kU8 zt@B~;wo?SYDjyeRe@@0uRPrLGpL3Cu&E;Ilv{UQ3ZTJ_O?GjO5d^Q3&?OnvC?)H$7 zrUhrLIY~Hq5i;x}uVSGDd~{9S6<%O(1Q}RrIidk&`h&g@xw6`Deq3mm@%JvkSGN1; z@~oxzYjL$4P5Vad0EY^(=aGhgY8An_QQ6;#*ZbI!7e(zM1jzeQS3ReAi40dKot z1~OLyHCe$TA=)-sB1O=>#?B@G*R!C*8P=O#PF>%T=c) zAoAUqCO0p=k`D;zhy~&B#F28?#1-Rzq@+SyRI)l74p$8U z_aOw9L|ET<`YmEaY91^$B4t*7gv9sf9YP)R+%WJSiP1tK*`-p z?(}|>elnsJyVMQO_|k0sG9(e;Sf3hV|Hz4c2&0mJd_|#k{3*V==?e8^=sV018zgT+ z!{4Jl`oi^U`H|Cq#4)>rlAoH2`$q8MRP9Bic5+C}^?Pe+5cq85dD>h(**n6bc=~F= zwD9?5T7AeAOh*OA@ct6N*291^%b5)fpYxXd)M{&kNZwYLNnh9p#V?co)Lwx;i@}Tf zGvV%$9JqR8z=Ki0w6rLmSe**Ka<9jXV!v0hY3jJR=X{TU*-6w~7(v)ExRlMmn2>O1 z&E|`CFFSD$U9}58eib0eX0hnaJFK?ke)g?m<9&SgM;DIj|G=fu0i7L1Vih} zom7bRqLf+*p{9}5x1&tknJ$b0UrW&u;8ECAM19Sa+_x6CT+8Cg8_P)?Wgm_=!iCb# za>eqDQjQmYn0I9X20m;k_j;pS)KQ9RrNM#xM^g`KsW7|6VCr$}Efi61t`}GJC#M~m zR2qiFazLyl_x-Ni7!kd4{6{5>`y=lc!>&Lbm*x;+7=@Aad9l5sd%Y%9b}na(vv7AC54VsFR# zb;eiB`5##}-cre!DtT>*ulYycjU}?~<*L3yINpGXKB@iq?Ank!YJU9`K%UFh zcbj0y5GISb;A2i!=a*lb3Ddrj5&al%z91qL&WD_z z&5vF9Ap4(sA2Mp8B6_nPc6>UNJ-Nw$Yu71%G`@Q0br{T;{vu4%Fh#peiXsipVcKEi zBk_w)GD$93`tb?)W-x;DLTzGVuYi!sz)vwCRZzr|)|Y6va*M1m~|a^ zw%B8E=91YXc5xrt&i80Cx(#`o)C<46)l1KZeeN;|;TlAwZ_RuuND-Q!cVSQv>5I*O z;Rd?`^Kn95%bd*5tK8UhGu22=-RJ?g=!NJt0L@u?_z?5GV>NrTY0PB;CeoPCX_|>eVXcgM;ziDd!Z~x+fEx8@%{%G-U<%Z zs^P1ivJ{QnrO%Z5vQl#^F~iZ)QUlfpskU`p1M2}ANZ2->S??UKs~h@pPw+#AeyrSR zc_`)KG^cR_-tZlHh2UVpu0@L)k~ssFUn7-e0q@v&4;K7$=2_;Z1Kfrce5ZSVhtX#0 z(pxM$JnuRQN=w^LouLo()lvv~`M#f!tSuD{nQ2w$P!$tX$U)hT7uC;}FW(n^2$cJL zhFw)DIRA?f=NT(1b-d}z>dqWE(5aV&imWJOgNI$%X0#KlKMEaN7LIOyt7v@65jnpr zf5jv$)7yR(u^j9lq{WZMf)g2k#o%V-lxao)58Nd!r$Z0KAE4TfPCRX(&e!hA`~p0+ z>@NcF{yg!~MOInsg2STiMX2E~WkQRPP6nSnYPm7OT7VwpT7$os*{?uYe}>wKtOdz; zyFYbzaeRq1a3Azg`7*$U&MNm;N z669%0X2UXpbl0}074?NxsFtd_e~kpTz;R+;f58dOh(_FAwtdi6QcXz%bC->0Ij&N& zGhFVMf1rJt98{}%^m(R#^Gh$!!7i89O>i}K>O7C>E)rH)TjvzL~gz$+~_6 z+{S2A=%SA_k6M(InY}13Xc^=;6@7S;#*wt>uI!ZOB= zl!LZSPcj9Xmk=){tH^M)e?F^l%qK5R@MI~2$I(tt);b8CIjxm9QD}2#GS@pX?tBwG zo+A4#-8E&I7+73?>o-z|15di%n)EdwuCzAI6rB@OQ%re$Em`jKNpI8CcBEVt2JAqz zo9B&1%}>Orx=VV*&dk9+Ec#EX}|| z=F$8h^J0eAw6t}!({@-Vfq0q5oC?BZx><;lTI=EY^}k@pT6wG6r3*jBqo4wAox|<* z8~Y``|K%NOW+6lDXA={PW?0%9_7-vd*#pF^yV6m#7lveeTY7|$DBdqq2%Tc0AQ8Qq zSTx!_G{wh%@hyQ07naO4!4ieahajz0n^k{Jcjon^PnH$2IU=q#rpLefhZ|5rt;=#A z$)e$mWN3Blp9$q0*(A78Gc?kQpIBI#=PbSe$iMV>g`l#%s@W;t=y155bvKA8Y#Iw{ zlOhnodptA=2kF5-Vx~F;MkO#vRFlPulT!euESM^PMY`3hbuP;&L{^kcdQP&hP^(Ys z)qqVTqYeIx+Ano=`o$t9=MWLB)UFa2<5zhUKZLsNd4%x6NY*NuFazfWMm?vl8l!R% z@XjUjn9YlQJ}CNqthYzi!y+mx$WTs7$FnH2VL=<&wX73wemR&M0xw|uE~7&0^7+)l zki*@7TnKk2tZZ&2Zlx}_%k->P{kE{hju|@ti#adl|N{)JUsWz`Pg2rYDdBL@US?U)8Nj(Mp z?7Dlc0r&U?N|x`VsvO+n=+WDK=Zi;789&IY$o*+|9M;TZ5~sPyc-v+?P`PS#+BPRY zbBN3BpSTPt4COonNg=srS7Gj61#Zu>>s4A%EUiRyZCsAcgvW*_JNvi`iRDrY8;8Ju z781_^5Q__*W1ffS9?usV4%p+DRBGDe+dR%}sp;|S(`WxQj_`&Bphn0sTE2?TQf)VG z>pzGEphqwBMtl)Q#O!Z?|JG-RHpe@J=V6;$ufC{ysyR^7U6K z-hhsF1!qG|L#bLKJN)vTTXsqp@oCF{)oyyj08wXrZz}K|Tu61n;ntWl3?i|tlQz@1 zDfX~U>6Wdd?1S7rY`9+Jr!i1}&o#G_ren+{H)O?I)sOX8Yf#8;BA)R_OA@YNg`u>~ zxgh=~ck$h{2#k&lOKV|4GP;BBkI5r>8l|I+k~s=ZA)`b6;`^k{+VXeB9LQjQXD-Nc zf#ei^tPW$QWbwNi=aNe4h>KEv*^E3Sb1#BWn`H#2;u*2m^Y1c z4hz&Ksr?JWU>Hl7I|B60F^VSPz?-U5E}I5E=Qj`dC_aW!tB5-9hx7_Vpjg59v$f4Z1|!6XWGV{MX^+9}sl&2~2Aq28*dIz*GXhoGiw8ItW} zeMMW8+cF+1TtDBhZ-bgDJnA-$Siv~~r?;zq$%rd$WwP{(mcV*%A9EVMug-u%YuDC# zC$@?`wArL%t%FXF!s-i~;rV;X7+p=2>~DA}+Y{N2JgA#K#-F}om-zmF+E5D;-ZiYq zdkbTWuqDdCVurjx1#a2pBL2auAVR;#$)M`-jiEgn6w{Ys6^I9SrsU$km-FFX*wk?seb8<=x5ID zIY+6~#?3ba*k8}?7bL=eL#;_?3Z`buy02=QS~~jhb?JzmV4Sp5KuB9?BY`BnrYSwCa#UPa{ARel* zesDz7=uFnQNlZGXDziLNb+sy{2UKBrsYU@Mh7~0O)m`3JZ6M3J_Qe^6!|J$H<`Sz(VeBcE73eyP{)YeRJ>TZXN3Hx4S=K9Eg{8Rd3I!SC=6BFWvT zrN}s-fSriSi<;Pgj}wAZVai?Y?NFLBEsx0J>r$sCKrX$1r4?Dlz2}h2^^jdvE}%U5 z#_R6Q?>4-K&vBSqqq}Z-cN9HWVmGmN!`oFyRqFQK!q2-s2yeUNy=AYLK_G_fihBQR z2tKvt%p?o>0J=&Vf0R6tYZjILmxrrQrEw1ZK_PZ)38~fOp|9S3!~h`(_O(Dn`Cw)5 z$E}BELci93eas5{Fxl`v7FhtOZ}WWcA~)8PYTlZY*c4$pdxvtR;|HcKII}~Imxq|z zc6M_1vmFy@g^$`Zx{hQ=p1wDJ{i>rvIi_y5!89IHj~7NPr??SIy3ZqA3w(NN`B8DL zm58{?XY@Cgrin4k%0p!Ya1z{eX9^mU%u8{lLu?{{LISWUlZJ7Y_%jn%k{cbvaYpt1 z6w(>fYFO!4ZUALgfn}Y&9&94_XPGf#TAQOy=25AWs)@ucp8LdOF1xDnLXkIL&3Z45 zoKHms1~~Ht2T5zj_e~v5p21qU#a78xXy3ANL?-UBk)Jdu)1>D{Nqp!;UL1gU{qU@L zZjnQO;Wa%PJr-#?Y}Cy9T`r}gK(Mx{_RM%8Jgk(%iJ(g2kxW5v7Nj||!)k*zpI4Dw zBh8UmN7FGYZ!>YcB76d7y#>vrl?+=ijCjciu5rbT!utIZhjhl03tJVggfX=mhQSwb zaC@9_xe%a-7>J9rdrMC#DkRh3=(>!!09gcougxnt`)6g_;Om)YIb6r_sT=8^)fUKn z;b2_*`0EDmi#8s&;6N==T)_(~QhR#-ksN>$pqM+5hPQ-w-g#KWtaBXGskCqks1i)6 zca56mBUNTDF_o+pTPB19C%Xk)#h!e9<6VprNzsUtl$V4kKSED0ulJ~ff?&R-bgBS< z;f2|RIjY)?)?k$OAd0FixTw+y_nggQ>=8&y^1#W2T|XpDC`hv(`^TNaa^oYv2 zzl&&}Z6LW&&MO$JOt=(MM_LUzGq+EBaW$-I5usR4QS>=>??=hA*!&Ek?5L`mdK&?8 z*OP)YLi+pg8bM>pb8@!sU1`zqSgFi^`x_p+!Z$k?J2tMIFE&T}O)^a#5?SFAzX(>L z6J)$x-i~%lY~s%yr0r>VeQZFoni0lN(}$g`8lp)R+GNQ%|6RifNtD)(pOw(c&O9u= zXTkSPQYli;Pfor9TeIZ`eQxISpK(9Cu0SsE-{)&d8M>k!C=^}|1_mGb+fF8b#zZ6; z0H?}yemXgX%GdK4MM^e=A&bPJ3AZgWW}|pOPH}@`oZnV*E{d>YsY~SNrbFn@_s?C)AW5)muaWUebbS8cWs;D`lAP<$lXgyvR^Z6lIGa@Pikh6Xw{+?kf(|fXPbL2rVHk{ z8l3rhGn`|+V2jsp9?+7JEpP4m!PZw8rmsYcnFQ!QRR-_6vfw(~en3669tV|4T9K#0 zZIBXHqv+D@(LRq6vMS4e6jB8W)Y*y>b&FZYGs75*57Y91q zCr+Hi;`x4c%6Qy=1Zu4=o%o}}wdNYDB6H%NXqnCxsMwT#U-;~W5-IoTnSRHMgw$6@ zALpsR?m3)k%qofrhS8XIGU$-tVO%Y&y&NI%+~^>ww1q zlPWzZQUW{I!G+I66S2j`09`G@Yt%-=4JFJLnq3N5USZ*~JFa9;uOK?YtGbZwtDn z`6A;0i}RNEK&FAkHMQC47oCJ#_d0-CuU=30>7bi3Z)VUK5XBlK{SSzp^GvmaE#^m+Y6s7q-|I)@u? zOn#q#F)Ly(&dHF0;%~#kogLeJuXcrPG+3QKuePWpYoo6Q?ORS1)DCb-=cT%WyCiGL-8+T zi%3;pdJS-V3xq`#4%W9euNAX+rOvP|C=w6VMm|YYB9Sv$r^8cvcERqOJ9zrGEYC$Y zr}0e<%yM#;$b7vR{9#{t*XuZ$%1J9e6c*tgGTd>np8MgU)$S&KMH7St)Y&kw7O)~M>U3sVT5_q|Zv z@F;GRZPwleq-DL&l@`AFKB)~9~OSP_NqJ@c1u!x>Kk-%0~*~mU)3s6jcB6eWC9p} z#TBianKI}6-`|A1oXz@0gu{hDR{!(F#%0I~4lr?nQ5Mg*KrMKBF7U~RCA7kp4bQH<TTZdpWcPddk?jqCz4oU* zHmkcM@1J?Wys|Qf7RRk@?oICGfin>nv6vSx=%Uo)G=F~L{CYbVPk+O565!%s0fuaN zzeHW7x$KQ=?s;{tI?k0eOwYgXgP6FviM*n*5d6&~04~~tV2ZmfJ(zwokVTuT%8qrc zZA8j#4{e<3oi73-Guj+_zbd1Dg3=HEeY(8;Zyg<~$m!v4hI}YXd>VC- zLXga(ZOL>z$2#@{b(ZWI1nJL0_7M|5UV*)1h2iEBNw{H5-qzgXol*Q!t|!8A4;bNV z3s?>u)kkHslye^2C^Fouo64t>iV8ev35KCsf#eJ0sIt@6D8iyWTUwNVZ{L4NJ%ImA z49U!AH|FUUBml|*huJb!8Upl4h-$EbvfoA3Z39Aj&p<>I)EHH~O^CurSIJRP(WX=~ zC<$$YSkuX9!csR}HU)C+TQ08OAM#b$p9yvL!ZgxvmzX?zTbld|L!(K9axauzh%2GA z%DeK;?s+iNw{M)(?UA{E35U(I%o!;UY;(6H_So@4cNd~(l~h5KN!Q+NY5~f+x$@XQ zK1B4Oc)iF&5zIRnV+psnNM=!TAyVNy+P`HF7z!%iB*f&7d2u&`h=XuuGZ-t25vXNKs>P-^#)05H)b~RD<&?mQZZ!hw1#4x6tT$?ZJK1Jd%^>^T@d7^o zas}lBHxU~Axq&O{r0LZOyF`-n6r;U1sydxet8kx;9ATCp@0f1CH#}Eolj-&qw}Z-- z+GLh9#tNfYK%~thX-?_trU+sVAcGpSZEX-}Au#vlGbdVl9c^na5~A@*o3L`sXNdpQ zvgNe0%DW#F+BfEZGNy(I^#-rjGX#o&MhVCVC!b_N=GU(`affg1k)yM*Zi+$bN5D%g z4wnvQOz@zXu*T|KvEhy*vZ?(oB^rL_cU+mkxzl7&6DR$LTbE}ZTKttf+KsD1Iy-WW zl%vf~9r|hZ%IM?koZD}OTI(>38fXP7rzC#0AIUs-$8ffP{;ZsyK4>m%D7mLj64>re z>v+{REi7vFodxqDmqL#o4q{&;`sTVWI{md}K2h@~vYP6A-&}Kc4CRh^wFULf1czDl zR~;5%F>j`lcx}woUjnjh+O;nob?jVT5c@=ur#ujvXL9@R$rT_SJStM8&%|K#cos7B ziUWOdw4lBhf0ognmTRr?1&E9%V$sc;dyn}s zP5TXRelB5PE$vr^m8+P`OnH;%@s{NsG)4OGXz}Sg=DKrd4j{1~EJv8LXoX`#HcO!t zZn>U+JGC@%!G)si>&UNBJl$E)WstJ67jFmKM=@TqR1e%fzRi@`3Yc-U;OM=%SG&tM zm_CMU5{n_cDvQyjY;2(TPFK1dQJjr7D-HPy8VM91&R-NnsP7xu9eU~Z0q%A-t$2`M znW{j;B{_@snY#|6?UYdgvce{bh#9fMzTO0XTJ~&wyeg+`RJHLq1_=j^Ta$yY@aIy;?S>GX9tX)cf z5OO%Ix~;zcI$B+tUj@q{NWd)9eIahWV3AqkIq5}p+>#?jsTV-{k@mzFn_bc7{sOV6 z4}aCw9*iw}%ShK-yp1cPuwnjoOXyV4CqPrWqiqUZTG=mtYQEBoN8r%jDPXwiR%qhl zRF*+M-{24n1~`0zaPH7iPk&EBrJFm zj{Ka>k3%U^@U&U#+HR>h+ePTf+-Hh%O+o3f69@ocVlde?M}Ug}`}mLgu&DBXg~tM? z^*F{;lluHuMd7%Q4qw}P$YB(dnplMP_|OPbM;_p+exBVh66~InODPd)yngglqRo9_y{& zF;*_OR`{9~3%TyLj_PTWzi#e-bSJ*Frg%vu4cMjXqx@k7vQ|%h)~aSRt;&41@;$Q^ zTiN#qk60v8vChv-!<#t&{QlF7{a<@UKMqml3uK=m^AT2dUj^<`C~I$VD(6lC6Dd>e zi}G|2U`iK;`j47z?%9vQ@V6unBQdltc?0Br!YjEVpNB&y0NNv`Hr4+H56ArAo0oys z5EKG9G?xKu5EBwIF)%R-FHB`_XLM*XAUH5FIG0hq4io}8GM7QL2P%J!w*^$weH%AU zN=u{kKvHUSOM`SOEeseiVgok1kq!w-K|+vjkdj6u1f--J=|+@>ck2Dz`aJ*tIq!RR z&bH4LpDVuC_5E$k3|hKeGFC7Pup$hK;Ns;5iUH)*_4GslKp;Oi5Xgti%&Z4NIDr2V z<1#-5yTBnZsMucyaxQ;h5CSQa2O*Gl>M$rk#nl18%Maic65|yX0|EhjK%nS<3}G%} z0C|ub#0sF!4N!qW!Ejt=Ihd2D3&h42feiDXuK+enb^x!as4(X*cYur|*aczm^H#3!}709|D@ zfTj}|`rBCTw*e>MpWXm?xq1Jk`^Wny5d`|n8Dwb*b94ehJt0sVfHlMc4A4|m<3@NO zH~}E2)lWl^0~~*b^ar_tAPyi4q`|MuK>$S=Z2$;a;6LTTEnOf^2sk$!;_$OXo}V8P`!hdzhzr;f*>+E!-zRGig}Fn${{hwzsFn54BCK4Uc%DEZ&aPl( z`F~81BHTYR8!!SO2m}H}_<;bhGXU&iY0LAIUeD7B{7Zky`%{dpz}MRe<^-@t76JB! zSc8!txZZG(8yJ9aaRvK&|E>6Mgv-kdu!2}302W{y2o(1ZJ5mg`{*94`?*j1v7z2^B z#|r@deEs{)6ggg2FsOs)AM;=5%cHNSYox2i@w?)Gb+WQB4}dq9Ab^XHpAR4?AP5i= z6$SYIH;I212=Y%7z(1bKP-_@K^mnevCjBR0w||bG?Vr_P2mCje1`Ii~U;x{n5jOz} z0xgkmy#LRG{>$b6Z@z!B{NG0We-l!4b#VBlX8Wc8|ENKZ5C_kH43H!1ia?IPIt;l4 z(El~n2mfAKb+8r0)$xC|$_Nm04P>A;4*#|h0#|>8cz~_6AP7s_UxV>m{N(3~IY6Lb zEf^f~^G*S9@dAPWqeJeMr9JZAfFtMemkNwroBxie0JVf!{oF4;K_LLh#RcSv3q+0) zpP(SXn-{r=R$z}`6Aa+thQbg?7XY$4Uw}2t1^4HH3JC#tWPgf&BVhoK+`mW|2;fot zgLr=dJW78MAAslaAB6N%|ARyUJevO^5u~NgA0z_cG58mWBK<&rq6;7q;*Sz(YVijl zNiF|Hf=Hbu%mLZ8|44o|kH_jSh)fs!7er=Z{m1<$g1Nf*-_*{yQ8}2Kfsj`)KzUL>6ZM7euD(@E3nX*5ddF@**?;iy3)0@WB4WM%p4D9e=5j zxjX$)BYmBa*EiGwZ2hNo0=)l7e=py^Vq}s|$d!Zr=@UPa-q{s~ocI5-osS{h>pyJrBax1^lNBp=wu zdw?x*rzc>R;=y*+!OdrtGSu!|YeRej1RswhPq6jBDp0y@Xa~tjoPXobjhd2aA776; zUn1GzE4;0@H=qF8KU?%kixQ)lu5EwDw6<8~^cg0Ryx4)Ox$>>6wzV0V^Fys{C=MEQ zdfiW?$Jp<2Iv=fl$=FhoU}-2nEweqqVy)Zd#zz~9iNd-sBEpZ47Th9}(NZp3B{MeO zs>}pGmLA%BNvpVZp4R<|PjKbqOfe@aWI2s`dz-*X^(15aQR-%=5S6O=FkpX-`D>@b z{mVGEpp)j{KsF2bfK~$9ISnU9L{Lc0ihh)8GZDQWBT!Yor-E?3Vl+82JueE&UinG# zT%k1&hrR~S^I?~Ssu_XP!WL}j!!P>xrP~{=YRU#;G_zlHFXt=y$bu|vJvRmK@Nr^ss~kba-Ar5Ge&=4)f`@-qE(S(smrZKlrI4%6WmM^(&v}HDkVgiR50UA zMH-oK#8Qjz2_w>@`az41(JF9*(}3t&EladZ3BwBX%c%U^DBi9h6DfarXe>^JmfQQ= zJO&|>Jp7ZL5@G@c|2v5*o)$v%T=N)*$} zZt<<1vBz>DcxHVdiljz^wiE_*6PS*)Cj{NP7(G{9t(rZarp^|z&eoru^-`xz^)!2X zrTLFSCiW231yZs2Kj^v5_q;W3lLK2&h-WK8xP;YG2FuUPc%y#M~4MXh1qS0iJh`u?%fD1?7$v0BWyR)Pa=5+~$* z=erVB(uH#+{y0Vzvx1*=OqBgZE#2W+-<=86p_|}SV~C;ZM`z;~VUqwYx3gRe7sAnT zzrmi>w2w=?UN4%3f({>1vJA=m+=P!n{92IB)Z@n%L~Lu;{E z@2RkR$S}UAvpRpw@vVFWlVy|h5Rs~mfeZdC)Y}frI!gL>ew1X#H!aWOGdxT`qXy(3 zAB3(1DTWS*yx$Wr^Mk(g#l%O~$(D^}>xcCkzL&BRfRkC1?OmC1Zjjf5_v;fM7VrlrQ6O;MaQXlm+O(bwUp~y4+!8=l&z95d5>wp;W6PdM*XZQWz>y9@xbqTfo zFy6d8*shS+m}a^gPZt;eoP9_&w;*Xj!&WZcv!;uZkoqfOd&QQcao$wNa!BZFR4M{9qdEh)aUs(JUsjD)uY7Xxjn+~}|t ze~-cDt&{Jf;C>BE`l$m(GY?x{v1Jl>vn~b;ZBX&}mJ55#402Ks83^ zg{!LKT?d4=y^l{#?lAL(cjb$_*59$7^mEMSD-pq(+-&rS0>H+d^OmDA&)>Fd<0iCR zM=*bAz4HUzk#4b~K{pZeMb&>DZO0$^^l_a+GM1Gm-KiVxi7a1@-$)UhO=H&T9_o9B z$wQ3Ryp__KAYf%oq!SiId~nh!t?NyGU6mu`0Wm?2f028ze@NYZ>RO)BOe{9hx&9C_ ze)%H{$9><06nT!m(1_t1A*_aDd0U3}y&8Y*&zDhC!4Gg;Cd3CmW}g+-fOT+QJb7Qh zQPETVE*mkw^DT7E^xGq2Q|tO^jBUCkio50fvFKr>3N859gC4|u@;zT#r6$ev5008? zN9|4OSa5(vTee9)_RAhb%D~o2jEAr%GL!aUP9?g5SGK@=-vf9IHb~RQ@K(M2sJ>&!r zi_EmB+M8R;`_RTtc)SNI_-StOo#{ZzRkg(aX*C*x$i`V34On7_C}R)J?zw*$^h=rV zq)Hv=>-_+(!O9i5^u!OJ*kv|t$~Tf6h4q1)#dQ>yN?pFv>+8j1ab?-&K-w|sbSc23(Q8m6BE4FE_AJ(aUvRD;pLzjJWSH*vRlup{+j5fGl zjo4u>4yF+~6#3mrGN);(r?{;SPT?7xEb|6VJ5xrjLY<;0mg#p&mFgEu*Iky(cjr*= z(P!mmidP_^j+5pkx}oGpb%U`RVkMysXBtsY zl}PpQbHbCk$x~au4xWD(9tZj9OR-Qi&OAVU*9-p0h8oS9$$efFNXzvDzL_n)blt|_ zojimla2QQswf}tX5~J?(*M>_zX4l4`a1?&O7_~L+1E+RHFX!*Z5HO7b(}5P3R{Q^*yg9L%uk}^@8N$_-;yPZjD{$3Rj)oz zPCwN95Uw5t-?Z7_XC^10DHXP^;qB}B(hhJRFzi?2nRXo^OB(dve-1wWQ*{i(&wF*)W2W+8NfG#*<~&=C!%8EyCbj(+#K zAe~)L2xXcN^l}IY6;L;YQ%5Eif<@zFl4{h()F!=d;R+2`Iyap$_j00Z-Zoeyq9c3^ zeCqc*MPQb4FUWr^@4awSa$>$nA1~?^DSg#fXWGsq0^ZedlQ;@5Bu|Cb>eS>_(0ifN z_x696@Af;{zejc4Z=Sun_vJk|X(QuuUSj;=Sptou#gzafO>drk!ca?0=6-;t7rQ%r z@fnfQmtvBI94WSWwg}OD5)yUJK>Z*t*>3_39~X#y?(=8$=p>q$8%m|Es19dfe?*zr zcHA7WSuYYwrh8Y}B=IJLX!L45!++a6g<5}px!u_b<$$!ceipcsI;L%7Wc3`;6pPvS zut`5DaE<;5&+xD;pfM`{@By&E;|`7;bDZ$|D|j<&byEw!%;P)H8GUYIBRiZD5S#5c zw;Z{gkhJ89L=WkKmL=hsM?~^MZgI01{`<bS9+~lP!Vn#Pj!(O z_CBY`3b0>wW*k44sAPf&sA4fEyOxu zSBi|N?0c!zZ>@JNGG~ioIFsaSV}xI3qJ@;{ln%{l{TSg{qj7pG=yhx`QUG~`2N4xY z`7u7Rs6v=u9q%+R=8QdvCV~0x&W~hl)I-wR21tT=31qx1*YZkAWp6=&lgoc`ux|gh zq*`py@}W`!+qA@V*Lun}>4$EEEb(W$ONUb5K0k5|FeLfXVMd$zJa_TN^e9V|f{Zze zR<`Nwy{NiXX>|oN0A^UQ##wK~=D5}uyUI>FE`UTa4$m2`h7OCFbn}(db($vP4f;TN@i2ZV(^>%Id=FLV zKG~OySz4XWSDTdS7H@fEKIkP<*CsRgI=I=9Z}<*$Kq;Iowz)eZ<1l|Iq@?y4$y<8x zUcY1zz@N;ui@qBG!N50p=tKB|$iUTP^e$jU(Xxm95Qecguf-}rk#UX~QMc3cz%}iN3S$*^#If#9X?4r|;tYWc6A7%e;DT<%l6E#6a?*Rxs*@z@u1Q z7&&X?cG1uZ@hc;NR6E``nN=m`r(1JO0$J=JB_c+p>B`<)#tVPDb2y7_UqD$C{hfQ0 z-)_mzJCks!h#HXpe5^k|H~*4Pe-CJXe(M=_!}R5l0^fwuXhOD1U7|qL@7O89(cQz4 zP2woN%WgS<=86iQa$`YaanqmGMM$3=7%}%Y8Bp6>87allyO|VX9`g(fcQIH{G9N?V zSN(Rd*ydz+hr54}20|{IE!lZ}Fn0HWD`ySo34Wc;ujRQK~Ac^0*x>3>F&=cd$;NgofhT|Mr#ad>-HJ7 zf%!kfmhTt@s?CZpOx7MmGnkBj>dxwu(?}RAsY{EUd+mQG*lla}CQbPEo>q0!2wiVZ zfTyyhS`j&~ofnyRIKEN#&3sQzife>JQ1@Lw#`G?r%~OiiW(}Ux534DYY=s38%z<1V z-7BZ4IPXrcChlx$6#_d@gT=^!#9X@CZTv}__{yQRl?8s@?4$z+FeHO@P`BPwmTyO+{-~jAeN6K@Gb7ZSK%ab@k>IoO6(4N2F8} zN>xzV`R=}W7a-SLRw0_lx%@+O;PGLt!j~Z#46lEOvcZ#*7Fm>vWvRST+&NT!oU2~= zLm%nCnH}kPg=$&j6)B281N)}7!m-nu+2cgu=!gC6rW)}=H)s;~TsYS2>k~+8*LPXi zp`#gAXO|flHkdygRBs2^m6wE<`ssZ%fg}ofL~BzSzFC)(4kL=8dZI6zNWLq;C-w>- zZ8v{TH_B&O#~!oiJ5KR-npM)?N%C<}+#q_Y(euoAc)a9Qlt{lXp$ZKdTLcHAk2dHB zQwc)C`WG!K$jzWHmp}9#4@ri9tg40Evd3S237V z8W$3WglfVc*87}J$JKhsV&#BzWP}2AQe=O^)ZwEWEr%?m=Dn`@=30qlGkJ@i2|Q$v z0f&qpjxrIBHPUyU40~MiG(8O<+17C~9(1cbiBV)BbD+e@QQq?iN^Z+l1fBS9u;|j^ zy7^I~-L|(i%S{lnm^&Q?31rw#DlduGn)GYrsDx zkn$ltt#)1Axg^i+9qY29k%s|;QqBg!Yo7$BenGtM*ocZ6y#C&&(fEs#j@(PKKJ;U( zm8i?_$9k(1#;oVQqPYMAT!ykPChs=Q%uT7f3|G?%wB{@hdX9OR+P@t}x22H3=dQCU z&~w)AB+)pBbCu;soLexUO;!S+pUQtYmYZLAGuK6YQ!;Ki#D)3pu>8qFZrOEHDZKOG z6&47+ohP4u5Y5b|`-^+37Ea7VqfhZG6^GwnSWFJ2=-=I=>Y@zqQee`@zcXlmlV<^Q zEM%A^9}kZcoZ5Sk@ZR&|4SOpmQ49|4)6aA&A!5m4ZdaWRYk@W^xGn7!&8UBo$LjZI zIF4rs@(9Do1X{BNQrWQ6q??F0dNR@qmQm35Jj~8Ir$y3d57zN;;U>yVRNEE6uJyH} z%E!b7u@&}}iCqgtAnt(ssGz(x%BC`I@r^V+zScnLp@5C|j$(m6h$iw{3Sl6#ukzu< z8}?p{!uokq|9DnXYG>N<;GTcmma8~PHP&!b-vV1E_-(gljGp;~B2h?U6wW&?+V_K_J1^Gub^t`zX56SK!_ z#@WsA91Q%gd%W#tlc7<=D*<-R7tCxpRBS`bMrLQuPUFkA`7YDp*JOW03nNcy{Q;!j zqZ4uH+{fcP2Op|=UmwgcB|a(fy-2@E-jv7luYJdQdHRxkG`Fzi9CMZ+7UT3fVJbAX zIqt=!1%UwnaVP7;(agtqLoYbo!c>jxN+W><`|clVC6u!;7WWEtq#E^~Ql!?|@0Td- z4rRxV9y#=#Yh*tfJ3N2SXK-ZzKkneO%U(-;p!)btXb_(A2%bv)Xf z-D)&{gvw)%xc5%l*oTO*IBmlzPS*;4Zd6l--&Ir-(JCx2H@^T><1gBw5c9d82#*Dz ziOuJZ967_5wy#iNYz$1|<|j)Nsxm!p4kqGQbFLSov8>!1ZnO%VupKRx4{1D<1e)2g&Q?ZZ~s zybqbO*pCE7?79JE6g;d&2Cy!ve8a3E7_n&=ux##ZnDTiO&9CdK+MBPp;G6jiz}6MZ z^jC3ML*}f9#Thk2hgB}9>54q2!ED*W^u*Qayd%NJ7nd2clEo)|CkEkRRO#A>ZXeg> zHKKbRWzXio63sJ5=Mx#vHowZ65GKdD3OxxHEK|&nT7&@!%-G8HJ_GkLfG9&rHYg`1 zDoj^tFX>b>Z>{5umb{^`qCMY)O5}&QFU6wt-Eabed-O0$X{X=6c5_n7((l$3z}C*B z&R_)D!lG1A*Y9CJCjZhvYi9?PH5;J^AXz-@lz+hK9_269*GH<|R&RS*=p4vI(SrnV zipcP!fb{`*)07OwV|Q)CGux~>`DqD0aE<#Np~(JCGKpl;bo(%IRMWC^fJ|r3{%PT8 zz;QIpu*{MVcQ9ODsbAgkf=i?xoA5;bq_mvVH+Wx{>d!0`o~1d)#7&5muw%J6?Ug}Z zT=to_Kx0knGTE5Z+ojA}RYLU;m=p0ED@{tUo>B!&&p~xPVYVS*LOk1KijI7H6T-$Q>}Dv?_=G`1V8Y>Cdc#?xFRJ|oin?IIS6iodLNgWN_8wf7Ppxx`kUDdk08n@lv zPvUSeIDj*QLb$dlO&!E{1W_tb`W!2MXh+G6n7L!KS%IVY!0g5FPp8MD+dj79gt^Q3 zmw+M>_&agiz|L%Al45>9IDxs3xY2%oe3N!a*@^HwPP;o!?fk5TRdK}y_*EzGgo}uW`yY_=F^&kUDVAH#`=aFm~Y7Xf;0-W zBh>zMxYRm}Nr({>cL_7)O0fj|I*Wg{0NF!r7(6IDWboZCF4&6)uW4l_v$Roz_a`Yp zTDL~JrcxKhCvHo=RYa2VgZOC$39B>WI5MN(dU;s- zOK^~(x^w^%Zal5C=+^eK|20=GU)>u(yWjNd-u`CP@`BrgxBlkX8`22j277F&CyTXu z)i{;@)Jo;dgLmN1TcXa8LrHffCre=)hfIs@zfO@>Q39g1d`xaWHMPMMDrTTHD(i<_ zR)ZOrMt#(!=C>y1e|<|j>fV6x{;qYr1;?kR)~-=KS7cz#Vy|P#dXg&%dTLL=1A4s@ zaV?kPi{V5wW@{7SU%!Nl_iFEW%7x(uEIJK`z5PClHtrW?PJ9)_1!o2cpFU&S5}jt# zndkINsf?B0R^hj@MMuJTHFdRG4KdV zx#V9@CC;6%B!9+s(Ti*aErdnvui8XIGK$Qlo1F)sF4s>(P@zW!O$h2k9cWLT04HeZ zr}h_CGzwoG{fEY^15nk0o>2KloUd{=f6tAomzob4c6cn%SCt=|6pjW&m}JC-H#J<9 zou1`#s@8il6t?b~g&-WTQv?Z-1aO>C7&$ZjAYLJAIH_*a;GC~Yti_GJLuGuZHr{R< zFPQuZWYSY^x$+7_pRMPKx0kY4P+_<0_ezVaRW_wnEeaA^(BDLfvBm<~Y$#=D%&Q-4 zT!}EN&ylt@t8HqqsZs#kZhu1wqz%F{bLiHJFM7SWT_`U_`-&GK!`CF4s0b!j_;#jl z>TVHcMC8$+She|%SEM)yVhR)=zTF&R$czk*>TL{r`a0&Wa0rx!ZZB+~h#Ir)nY+z} z9xpe=j%6m%g;Q%?76s#t4Cdey4`_kgTS|k3@}X(gNGEn_l&1k#v6Mmjn}-Y6XdWq| zF<6zm*H3>b<(A!b*xABXdl4YTtVvdiolsF7l}Afk>n=|dhxT4B{E`PY6Ch9@R7xtG zRo+H%6w&(oV{CPITIMjL!~Ud{pcv;udRzQ8nxz+G>9JdW54U?5v=oEB2`C9$Z6AP{ z(*UjAdt+Wl9q0o5wrljsq+H=!4sth(+H%kYEM~_BF)o@JXHvZ%N5q~SR!;7F5x)4b zGg_`@^=d7#T|XzZ=p#_KzjXSY~7`aqyu039{5UGo_W8()^s%J=8 z#iAm#a%FNQ(FWbxpm$K~L=im%{&g=j^eb3C`7Ix?M-vP%mS1JDe>B5cE>VcD1#I#g z+Pz9OPb>p#Kn#M9xsGDu0r|t(UuprClDUYYUf3+(tMKkCeLk3L{^FJ)KU1qrK=S<1 zU02+NIGmGd9zcuc9!#;yX13%Rdzv7em2Z*{zP4`5{bEd|bc#ezkgY#?Ji|yZV=iKo ziDhi`WL5;6@+dXy^=e@aSrt~BYpM}J4NbD|98k`%)O3${(&DzHYq(OqcG!n6Qe@TD zlZ$4_X|lj;7je*~1;5>%N(u4!64_*8T>7%s6Sd6Tq_;{qUMFiXuzGGyf!?w)xeS$H z)6K3Gd(7-J&x4jI=6CPfWu`eC21whQ@1I+;L=plpx`Gp;rp)Ss_mS@!qSVuURe|^B z>vH%*xamxZ9&0YR+eSI|kRw|dj~=tiO#}I%I(y$i%6);H9<`Y|ubGcJmG2?58^>Md ztl%t+COr-?KAoYfK$==DH4ejdZ7uhrZ5iHBd81l}Jx0mIG-$baS>OIGM892Xcs!y^ z9t{FydC*Z#y{6r+_urNabvnPaVBLI!MG7srhAfi%*6O#DCTfOAs!#jwZ^%pq*84O1 z&A$2s3+LYuSN zQGDdbLII-muK+E8Y%2;T6q0N3z2I+Gx<)#H;N;LCA^yPl`ln;0}yqaN!2k4PZO9#Y)xLBMCI6-qU zSRguPm2{=~cP#9b0_h+^m5D_97BK4G$4Yq3&F{enux4`NR!C;H38|n$2gNnM~v!Y z)8@y+s?l&laT_4~K|JXJA&%(TVV)JdBjm{$#eU0Ip0of2n1_E|Ajx1${RN#01P(@| zhRSl21St{#;z1|5Bw^4~492cRJ}s5R%(3h@gvNn4K`jW^5UbEcVYN=$o(J}v`GpLu z$gN~}RV(x!CdR1Bg zB&gqu36cOXyh1e441ke6lfa4i`zNZ76N@2ZNJENBhNc$?(rR=LU!29Pdq%|?^hq_L z%xvzmrPwlJ%ZL!kZg?>@*A6kWP7kAo1KuB1?Gnx`*B)#QXvmlUSo|xEATH~+Y8Gck zqh?x!(~J-2`l+AZlaH(V`LSoPh5(ZE=#xKW^eO?6ypW}5_)@CyZeb_|X_p<%3?0QP z?C9_C&fDxRywKo5Tu9Veh}0nF@f$Ogxep!f1~Qw0vp+I>cqVRBwlxWDym(08tA0(H zt5YISQ}j<-G~&sKhux$XVUF(-Eo#(SatHeqC8`dc+Tpy>G_&5AD*w z24{TQ9kue8cg(|vMijnkz&(q{h=e|V%q=v4(IIf&bOj}Iz_zmV5xt)Kmc?Ykh}w_i z8l(~yeGS()=ocXc#jZaiBk*4)MVYJofRVo4ha0$4vhrqx@?O+fn~)8Z3Q#d4lRr8d z4t=qm)#kcGzC|C2EvHN@a46F}1tNgaRpi2hIr}qA7q8^y-SmdC-$8cnYfTBZ4NhNx z`d5iC&&ScRg+*Rll&N3Ms(8uPMIe3nxKR@q5IJl549b~^3`=TdI&?%w)^s{%%OWd|9-@&P ztIXCob~iH-r0k^nA(1jshV*;H;hcxMP3eq(HrZ=XtAs)XNEBz~+iaB;^NGZKd$U8t zN)EReu=dSHODfwHorqUtLs+BA@+*BGD(a)yMArgxRE;+$7T z>fnc41Lnueehz2GbaafU6t)r`uN!koRu;Uh7-WDh#P=5)?Vl|A0~=-s;D7|`R+rOu(R z5$v_+GRXaEU9tOF)Q`{AGYhj^$i*+GCT=Wm@bfYvmTq69)R^M|270)D5-)h#Y7kGj zTO5#l-?Y5MeF!E2w*f`Rb7MS4D5Fr~iSRj=Jud}EnmBG# ztoT2-DyJj!%)bh10*|dA(qli=V*gor!>!Ms3zo*4Cku5xHtlxn1Aa@CYaZIup5uuj zs2+n(k^LgAy;cj5@VhjI!_^BO;ixcS!sv+rTBCU1??Ev^Vu|a)f|rax**RdTqkYU^ z6bn$IUJ`fcIP{74GnEhyR=35J^1Xe8c^7aVp?WE*(}q8)6d)bwu*WrUC$vxQce`~B zk7AR8jz>zDm1Xh#1qfk@^8e|fTQ4#G6=26PB^;*lB*#jaTqj}wWUHnU&2$7*CDA7s z9&)o~Z{e4*iST9qZEm|EXxX5T$7nU8wQdm*?(0&+!73@TbC)cL#ECH@ea;bG&H?;b zhKEGEB*|+32>V&rCa?9L@MjD|uBLH8)b6;3z>#|T9>(o=DZqJV`Qqj`t;#NoyR7@O z&hg01Q5vq9NLBXA6Y)fYHu2?(!FWsPh_dJOVtS&Ge1ZOj4bAfnrahI8Wwb9AtAQd^ zF}(tFUj_w5JRTVDI|ViK2X)ThFmce@ve7$AeWh{iE{X5(0ij}0B8Di&W=wk8GAGh( zUy5z^dEQ1=I{?U44R(JkSv6{|YqS?6vIAxO4g>@*gephSv@NfEt?>Zv0{?D&IywHT z`5vp?pZ24q7px%;IqF#M+SmPXUd4&F(_vJCiv4hw03{R>qk(o7U+(KUCftk#vp-W{ z(^*1hJHEcVBcF^AlkDjnu)J;l zDp}<#OssSH2p--#NzBmGa%>A)e-7_=EtbGRyG@YeamwY(g%{(9kwOymX)vm}hX@}9 z1ZWPiO(yn{N@|-A=fzSR&cpF81cDN>?s)2ySiEYSM-Jo|^Vvmgz|FdT76JGGDdmn; zMf2ro8=$dKou{<0l19H+EgaP`M=+bvG6RjQ7Ec|*kRA0pDL9 zqg}GQe`c@_VHymFiO}t0y-ytYu`FYa+Z^_iv7!1g>CoCtIQ+3AVoPu?HrJ6uPf08q zg|W2Z_TAdVcnPB@7OfrI*qy6pB!!AuZn>*l0&BI}MI0uuJ~SKRfZA4MC|I5R9+( zjl78%Qd?wd(wob3`#PD`Bdv-fLEh#$5&)Ju;d&$#t&wM*L(yTvXrV)j7&dSB6ld3t z-Dl9Rh^pEk?6HR{Fpf;%_@95P zbJw{A|9Ijyp<^hA$1%%SPAFUiiF@`+5lI=E8JL5AI5tyOFLp?4tMJf9crqvif!njHhJ_T}GfuCfTz3l~kH_ z8Ut~(7a}*3{o=ZcwgTTw#@M85fCSW4270EV$19TO<4#ti!VC>VMkHJlshid6`|R~w zO%_qpXgC%ISoBiv8k~yqlK4+?9xN|OAaqpa9w^=A23x{qZ zbgOE~jxIMuMjY6!5xM)M`!`pL2Rn3kBFufzOZ{m=1mjm@rL38Puf9g;YRTNlDX(EH zKxw@mSFe3!A-dmQUrPv)ZG#+%$qCr*(81O0aF*#kZZ7k(S+ul*wmS2-qkvcy4`R*e z65@2T6AYaJiHw(-e>*rq0~koq*feZ?+)VbsQ;s>{`%(afsS;!Y-X#6e*|hS_G;i;b z(4=^nvJ3xpIY-G6u4nL#;<47FE;Tv@rV3Cl!6Z|0+kVI``^)vL0|QTl&8TFgKS0y*Hng+V=m7PGb4S+&TRPBaER^@t`-8V^?N7Id!{8)G`X}MP%PMeOl+%U<3 zO?ME;Jb6oGg3hi|?JtYoKtMmNjJ47@Yy{ypYB}a9vv+Cix z8y1l*`9ULCQ&s2s)9P5SA87E@w9MLrnJ1K!8*awcIQ2D z`OA^Lvy+1ixklnxUI52bU0W)oiJMNhx4CHZiMAu{9MW0{4El|MIyShLc#Nm2QCT~S z!KxC$HJXC>O8cV4gNx>p?2TWd?f8cQkEz|T$67e->#yHE;9c1}V|6z3A zMN8@6TWb!@_A>047Ko%obz(sK+~4Zd4YbJbBLfHd4NA$;e*ncH2ZP1CIo3g)7s}CS z_!venbKzT}>4geaB-_e+Pn}5*MyBdX``>Qa%R>}CNu5uZDOv(H&^keFwranZV>HbQ zJ*=#WG%&kHwtGFYW~1XxqY%9`#m=&fANAGN6p$R8OQ&r%I5oChXCZu4QFdF$D<6Ch zgHZ_jADySG^#MC{NhmRCOnQ@#MEK@TJ9avUXo!ii8oO@y_Z?KzQ+5Z>f-MlgF&SlS zP>LChV-j3t+?PwF-=ucx#8jH@n#_UEcUl-{qedMIvuSmXq-U(|-E3Na#|XfK0H=a! zHDRp+IuCly?70cD=}jHoWrcO<+&^!2cFPgI+rIC15&&hVy+&?rm@9YE@dOzJAHEuO z3Rw}W-51Kw=)?J^$XB-2ZG7ASM(k`K%{_mkY7lJhcY)pA`9nKK-Yzzt%t(lak68z& zCt#MQ&NIa<;Ug&>>|PwoZ{^MMUuEx${b%xzEgl*?iP(GXAST2E^oeX)-;vfE{sL!R-&!)L{oMvQ4$zRslB;^eSq4s48Xm2Z~@O}G-- zP#0D->n%Yid#rh$-w$6QrnVAJ2yFO7))G$8-}w>Fp)1bhT$(9)<*>c4ZCixwI54eP z%7C%UaWA)zb2DfgZ>;R6t|}kh>Np8x{@g01BZ`^=;N7Q$lOQMiDB_=d? zd1Mrc4$F%hp^~fa=czTfZg)C)%yyk^OlQr&CCZ{T_Z8i8uqjHnx!zMOo6g}}*H>;^ ziD&+rBrP)BwD<6wYTB&7H5?;Gkkz4o6g2L>Tq6VSELIU=L2@qo&mlLy1#p zSU%&``}wRbM!&?<+C|g#l4G_k9RNM*o%fY-SAG%$>jlHjr8xjm=`ON;v^C9~!HBe7|nlG=H9may&h~bR6VD`=hOVEAl7)Fz9Fz_EU2d1>nmD zo08Y_6#=4<{ZcH)m^BD}UfLTisI%X1F6WQ05!A|ATi^``-bf>wdFG-T0b|xPRHl-Z zW$zk~sSn4YPK8J{>`Lr&ShWOyiBned-KfQ0Pd`7Wv#$d7;K9ykUXUxV4{(DfkDA62 z)H`$7W8KNmr4HJY&O4s3dUuPbb6f(BnWY7_L*8sk9#u7>hOG$n5L5z+GX6Awyfjtb z+Q_V1o)}G+(`c>h_umbfy^@y(&b=n|PeC zN;$?8%E!b`7KxQHSzdpec+=2Qj5=cgzS^B3RTDK6h7o@oal7iqnDGqOk(BQK^l|d} z9zvtnO+-n0tB_Y3d9+M>#ouA$*m~l{%ZpPvhtgDc7?S-9AHe6{`(RZjGqbwC-QvfC zAio{dWfR@5CdcF7RF_Jy&F%L1`Uj|%Vxn)*qtBKc6w`C)RCla^s#vKgV&W_^7k(Cko z))<3^0L{l~aZad?R81B0FlLT&C!De*=+T^@J=#XT2xxMcBscM}e+ml4%9gn@w(fsgTLw7+G{LFXL;M6GITS|lRB4u7C%0Pma>Cm+rxG&Qtw_Y!V}Lr z0M$vLle_pUI07lFqMM+;&ky*!j^aC9?6#iL`L&)>F8;|>G4!F5?T5ME$Qrb?8`#Xe z7Ff}WKjiX9)S252T>gfm_PU9w%*cP)#aga;jiKWX@ccym3l#Iakq(u2gi z*kr2S)m0Se4%baWu36u|-UR=7p65?t-COp61g_9oe!6XE0k2@g2Qq9D+x}tF66&r3 zP@f2e`9NMhS4Aw%RGVi1Y`sM0Gg)f8J+T!#bB z1}|ryukqh-ZY3_^yEMYmB3%nGk?ww2ryg&#Qg9B^#Uk8YWk_1)kr7a=sw;((bV8 z>-_H6Kqr5}%+MoLSoc`f0(S;nUmr$WzAQ7(6htA*nP5Oy94TAks5Sc>LfjN8_DX$h z@7_2y@yxcmIM{ZfJE; zfXo<}!Axtf!l@386*5Pq%1+IpWTG$=TH%#Pna@Yp3tvKhGb)$P1|O_vwV;(Xgi|qd z{equb_-She9GK8nHF;HH<^q@)H|jz{WX!>VLmmSSZ5AM_wwz~d>Lomd1Ih;8jzmJg z_^~@5gb?Bt0b^D&ma$N7*UVAaySSZJXFe~D6fmC$`Zs!}0;klZKFx}$H9vnNeMnNQ zyfVfR=HpyqQ2*BgU8XhUff)3a-^_ZFR_;_3r@<24MOv0uMkAyRSnk4F?r^^#YSfEK zg@u0!bN>v&u9@H1t3J{dJ~qgt?$5$+R>M8(62{uxvRO0DW%!vVqXU&qQI)1z_$GO4 zOU7+0$2RMJiE~c)4_(TPONaldRsX3)2Tp*Yfd4^<|4*ShA>$v`6oCRrNd2PdsZr2l&3{3@v zm?=%4CM%oT^uo7yyjyZ4J_Sr|Y5O;DdDDMo8XsSOB~aPNPw>d+UyXQ)nmR6!*`vE7 zBjY!ZmeKVFBEl}%ocOoKVK7L^Ku zZ5O@H;+9Q&$WW9=h$fLNv@*Of3)HSCFgOhMs%T3&m?EPOVT|RpV2!PJLLhbzjW4d` zo6TX{yUm2`V~@EWuml9HzsNY;A!AQui8>xb++m4`{&Cad)?tpFu9*UTjno*7Q&guu z!?r1Pt`;<4Yc{F#TZrSjq$rmBoj*adcpF0^qs$F^@cQJCbh~`U#4Y?|GY6SXUZ~MX zF2k>%;!UZ|rT9b9-pz=oY%=eadB42WiCX;nX)Purq#o=$%{ z!@g>*PW{u*V|%s1&)YwVJz~m?HG%I^?R%SPI?i-1PvY8WTFoF9&-u?&Mu#KQnTDnK ztnc&m{W_cX^AYgvBa{90anG0C&FlSktK0qg7Jo4c0Jyt2QCDVs-94N>XMf+ad`2y% z)O_QQi-I~q07`Hu{sG&N003{hAqe7VKS19i_!=O7$(tyxc!e1^H&!{q!*05lLb#L%_PPfv~;^k?$QHrFtP8Gejvi za0A37#N^}@g5)Bud>O}{3N#5Sj4}hUhX{;)dFc8HAPt8?o&v2cpMD1T!MA^ zXpCfTERM_SY`?8u!x2#Kssz2bb2x>wa2+h_0WY%7VM6U;OAfMzFg zV^UZ)0NRk2ivozJ2fZ1X&h2pc7owP=gB&P@C@RUJHzrJNZIVwPeGtOD-&LNyc| z;sCB@QVj)vJ8=*rPVqRh@G8vh#EZGU;dCdz!E0$bnD^K21WJ*~ z0Z!df$ozo~da5)q_MLmmVe_$|sWzB@#BR!GNq3V5hye%ui<$7u`G zm&dV~L)}h%&P-jS3TnZUoZZ7D32wo9lhRV)r3#|$l?z8t5$Pox6aa1^R<_43gEQ!g z3G7EB&-l51NDAOKTSLnI6p;c~WwIdw)EnL^M3BkN>sDe*1}#Av*@cm&mKKt#&73zt z9IRS0&`4S^5U=>0xFz1H43}F29Hanj@fo8wPD}`R|kM z#Onq>7vB2gVi@#wKKlF{XgvS8-HStq*?Bs_btT;3g|QLAgS5K3o;_Q?^Wu>O;9L<= zSoIkYTVZEh53{x94L+lQS8@7(ac4C&CkOMD9#LzAC+FV4PP;Ud->iJr%HEyABAz!l z-hh$19k+J=v*njXF#a2XGcL4rnd`l7WA`K|y)$|K^6q!-9Hpyus%+o4Zu_U*>@j@=ThMj=L9}qZ*`r=+diUhFTBt9~LX7s;ai=%>F|zr^%DHkd{RVhNZMPmlm!U)M$((KQdMeFo%#?qu8zHHl%d7=2v* zJ}{j!vrjV+SLN_G_TxjB-+zw+caD=|ug$6}oE3CX?x@hV&U4#2$%O9#h7jr~b(b%m zg8z_-T?9+0cXNXn$%J15?V@ZjJIFKU1~2~*txJ}O1#%nv$=3CBAmgK>%1Z1e6wIWd z^8SU9mdO48hn)W{9VM3-wNyA^pmdj%&eXIH$+$GLyVR}FTyg!oD%8v@cz&%@Zo_Na zHZmBA!8(i2ajRWJS)vqJl!0>o@5#$Rmw5@c9F^lAmCL-=J*CcAk#TFVSSg}kXsQDV z@fxMp+0E^`Z^B)Zg(Le9YC;o9P!O#HsAa`~>E4}g%d~!VW_$2mdw$~tv+x}<@Xe3< zHuC&lVBs4^mx0gTX8z#W#op|%hn4-z-hTMT+g{5eDcbWKfn2j0`4de}GZ`#c4dLjWL^Uq^H zpL!+_XjcN;ubI7bLf!e4-+}K>%kIwy`f*Ma;~Ro#cM>5m1l=SZ%2*64xQ2nw#1o>6 z332TSC%A@)U{eu_+#g4X!(LLQ*kzsgDmrerLu;*TpKXkja^CQ8$<)}biF~3u@RF3T zvLetyc*Tl15v8y2O}_@^3!I>ilbJImR{;_Ql!JjOK_8wRgoz+=_WSy zu7IoZLXa^XDN+?}Xcln*GTd}SxA0^|Mfdt74?~yqLmxnQ{3QRkO8C2{k83v=CA@qA z|5vZFIeR1&2$jmE?1Xg?U}FNDI)=}$pb`;HGJ;TeV2zhdxBxfS7cq{6x9~~8Tuupz z2#gz9I5e@T50XVn(|s6K(;?QF)VzErwbK^dk6x8ma$hbspeNPPf`k8`q8UfeKS!yp zoEAGXYGG7!4*vARfAAfx!RWAieqIsa_cLQXWh_aU96j7OOdu0N05?%zclJAfck!;p zzewe8T5+&g*3~TSa&qb-s{)AX@G}OMk&(7= zRQ#v4#|p#Sj@nc00pP~fa1ky_y@8_=r_47&{ELMN;$OOB4cx2b-~!?=F(dFZ`jhSN zz@$$D239YI4=j*4QFR)N^#}uH!hB6cm`cJ)N0^#VhzsUeHUjR?VYmhc+)BFRtB0OQ zNtkNMj|zn@*y+CqgT@W&503JINJim5DT*(^7 z+1~o%VSTtiq__QUl+6|Od_7G7pJO5~{705$Tv1lc1~1mo~msxm)@C+Or}0S9cc z%xjry>zLs#WzkMsvjy zgfMJS8ib7Cc|?edZQxdH4B%$U;>y2!oIp#~rMAE#QF69H!`E0kchKxg_!Vq`5+E8} z;3cvEK>hGJ$b}dkAToK0IPwqRz7w!O(ilKgYsj+(&&JcY=mbqfEek4n6-f@ zwnOvifsAy3%-VqDx{yS+AxAn8W}FCeoJb_+@{AM{M-M4Gkqb#uss7T*ntLWTYF>3L zzDc-e8L9RjOSojAElZ$p8)qG8RDr6N)ngO^TIY#_c&z@9o(e($%?BWvhlF`wXOU4Xj#5 z7bD@r=%Wz@pj~qENXy7VFJ3-aPtgTeWqJ0I=V*P7m>JF7KFl=Iyn<9MN@z1LWp3pL zICuMiBPt(magWMm^W3<_6m#h>FJFUaYhRjJ_capWqiT4?sJv(9_zluxS~Ar2^a17L zrH+6toiC_;QUTG7YF3ogtn^8Oo(BPmJ*Y1u^So&ru??#~Fekc4S94DPxgvkz7^)+s z6-uc)nVZLzh!AOkBZ66-h1@l0SvwG znDkE2w|T8*CX+%Ezlku+k{|j^5$3WlSkTww9IEJg}m)#<}VTOh+Zb<#c1d#{*vz_hAGV)MAya#FxqX2 zQe*j(fg)g~HmgZOv{w-Yq~Im1=GBme6XdHGf9f5X^32dth%CZAy@i zWmffa4fmHPoFwioy1_M9MX2jaOocU^{IX3ROm}Xeu&qjF8Lu%>uW-+`R3`3^FuvU@ zbY25)rw}`@VvJdO{AqrBnW(=Cs8eeSl`)^i`%N1magIF5XpZ%pRx<(p5THsT+cuW( znTL@@)}LowYbK9Qn=CS3W2R2yK{;DzhJ{Y68Ihc*e4Z#0QD?TQ*#H-jyqKq`g4Z-; zpIS##)RCB4xr$jtLuqqb*EiRnVVZstrZbDTMQh#;NOX-j++^&~+*6?i9RBo64tb#?XNVpKYxS_$?4`MeGKSVHv8sn``D_%En~FOK~LA6OIAaLv`h^48#mZd zeGuqnl*EFdi}0(Sm4qGdF~)46f#@=zG`?sHW{mKoR~zdYWVHK_f@Ot5LSJ1Q51bY{ zXm?&r+lT=RoEC+3zQ(bx(SYV=5qr%CMESyN^FIt{?d@ABTGk~jYp+6jmY9>8%WBn% zg~kJ_d-mv#uH*rh!$;4*acxqR_Yh}B%*i7?KVYn!nvNhe$mDJPB=tlcvYIc*(#XA& z|D3nL90|Jc6o~BX%>SDe_`}A=n2v&dOKuDeZOIi3=4IMo|b_jEy zV5J`yJre$%;mb?Rg-2;j`B>kiuDmc7HMi`gT0#Kz% z*E1iv7RWCRbp$5-VYKuW8@&_0HitxmCBo%jIR6{ImkJLOj7<~{Vyx2$7jc8j|Btdn z_|6{{6R?<8$x?(~JxtU;{PYVq=o*x0OwcCOXjuNcV=rW>RgpvB`)DHc{;!hdp#s~5 zG02#)$oZxN@>Aw0aN_E)zufct-~o}RqU^hJc4l>pTdZZ2yFKjUy+nTY14)H8t#S$V5(q_qHrXs@-=%@p!@Rj z!Qd&>M40}2zIr0Ajf5?^dV|VWJtd&TyAF6kOrpK?A15u5<>27wEs}}&+yFw%lxGiX zy~ra`S3@5x@by&E7=I`gEfepl7(KiNU-%)?_#Du2LgqtAP!OElRG`3QNp@c+s?c82 zzS#IbIda_iwLA zu6Q&k`|BwS|&*nn>5QQOB4{A!=q zpXh|m@_t!Xw{p^z@B1E)oo`la&S(dN@j}Exm>cKzBCI%TtkTeao(*~1zRP)|q$QeZ zT11*Y>w(J2G%T;vP%+f$-{r%eI6Y%$XtJ72bqzfuk)*CZ8ab>;9cn`10_OS1lzh{z zCU^JVb;w3$xT)d$7630WlWM6obTrmkePC3M7^`kH);#RcXe179)kxesC@BMuBcA9V zTq#{`1_cK)**^+%vhbG>rEq+O(>XklnmFJHteTT}Pk?C;GFDA0a0E>&#;~_h zj{yWt-GL77Gq%003(cMXI}aD5-XGB9x4l+}4J;>sn|2frfzENA4tin{mB|7l*5ife z*C;^aOn!mO`BwICre&H=f}*a-Q#|gifedYe;`FLaE;gkR1Wf|4tlGgt_&a0gZ?3G` zjZLK0+El!8Bfzi@L>Qdfgs(B{l!yrZISg#Z>#DC z3_{Qz3yb`dF)gQ;#KBq6jB-IdOBA<+z@4dZQM%VS{-6z%_xQMk6`?5#%u%&-qLC`( zrojM|e^yFRO|=EpLfwFa@RE3fMVg(ael2^&3BIvmdWw~!y&7d71 zhJ$RhXLJksepd2E!hRO<)o2U7)K$cPk0R`KlQ%Gic|M!4{ zOxtn)j~pdAf#_n~D#dg?vnGQg?y_!`Zo28b_9wk;)c&L0VYI$VC)PA>(mp}ovRzM- zZ_K2T6}eQ29oJU*SnlHTs>PC}B7GcQG-@=g8fVy^Z$9bk&bULlj>RAbF=5ifjdc@w zs08)S2zoT?OHO0jgA2f7NC&<*>S0Q52PFnIVbYtDYRUw5H0rT}m@pshWYUX(u(_|LZMq-#}mR$E>s`35c8&fbMFwlQ*aaxhLQRe*&3iAPy};?ds-?5s@x z?}X%FPuV4epagiUYe$eZBYAgs3&vzY4wq4RvtSB|GeCo(#CL%6(ddJ~sv}&;L;|{E z-pZBM+Whrxbe$LF7daHNueua0Lj}qLHT)B4W5}1pp-wd67`@{1d)0sT#xvhC>1( zcEWaJue~__^>RD#y<|&0@V$l5zYw+VgF(UA1XfQ%SOpn0@+yfirR`~;uC(KJa3l?* zAM_pu1<4q&4NGYmIQJ73zn8^Gerya*kL_nLA)%_UdN;_?!SeaGpn5mTD?aqjXdCCq zg%hBA0kzN5P@(~SpGsi)(BEd~iReSXuF*IetD~~)K=0sla>d;?w*uP55OF2MZUK^d z#6S?eWV<FRF@&^JgqSC#d0>K@ zrNBv;y*QwV6^BrLVVIC7zOk{TE6e0N+!;`jhY)bU~R|^v%Oadj2W0VP8o{ zaAz}G)yVw%jT}tuahw+sU9zFBr5n`)zbY63U1sGs;giw_=kVlkJ@?%F_%}{rtt&}F zIz!w`)Cxs2Y{|9TNKkTh=H6Qyg^+5?F{xNaVIb0K z%8_PTtu2q$LRTLJw>R2D1v-vAKC-hkNCj$5O~aU1Lk?3)k(i=p0$bAzF1}g>AX}fc z0={bkqI|X=^=95k81`1W+K+!XYl*>szCFrnMtlCeG8%AbIj*Es(J{cfB5_xfs8!i` z_9Pu_E6b>{xoTY`Q(;y6_52xpG!##^H1er@7+AQmO!nM}O%vnUs9hy>6?Iu>+FsE# z?mXIAtNmn^vgp!E)5_K~o^@FVSfl%yBf)CcY#lbOtf(dZ@{_;wYma?vSNR70@^aE` zo0ejFkrLn0Xw0>GGzU+yp|f5VuG<*vuZb+sdQJw}U)+XRSQ~8%e(nxCSmU9491P{4 z_Xj;F$+w12AE}Em>d96St01H6AQlZYQdg^X^!U#f?Gyj&6JY!!@SS9xNkb*ySi>54 zU*LI*vl%Exb4SB^8GWS)YcblrY2Py5P;&Z24L;Qrv}tw7ca=#`1@vgu*Sg(?%%atc zqi9$Q5RE5NGoh`FKM`jvbA)x87DuPcW7RDo^>Rw{!;#C@ZgrywBSt|GUdhxue42Ffa zUJUIG2Od&Nxx_w5ITFT3TSS>+aG0~62Q9ozPKBz#EKO20h_TGh`QvX;9@T+F(2v_= z7tZO*K^e)bqCtD5vC2WXs%oPpJ4;DQK}yMLq6rt~fOw^Z0p6uJ?h3x8@H#&# zmD%z!p;-g8$@$2$@Mby{v{dg3l5`$4HRYTj zm}BS1IVNnRl~6m@4=c^MaDJ6Q%jkT^I}fr&-#uauZ0L~$!ZNVhikwIg8)f+)(=|aX zjywQ)2=>iEw~B8)MMC*cg0|Xz-BUVaO`8R8Op_q5W2nD8N6xCjD z+)MIgVY?08yhKr7@&e4trC}*AfiJ{n-9YM?WZ1V7^RcmH6;{P?)y{m^q~BrEZDY z>lX%W)4c81+B?RJR(8T+ZF6T-2$#E%bry_Q=T2R%FK0!{cbKnA23te4vd%O|McDcc zjxsvFy-D$0yuvZ_yR&`MJf)na>TX2YPX@U=*}YV`xfXx~+>bRr`#qoBJ{GL*9n!9+ zbv|4l9zG^DUe8L5t3Xr+`cF(&O(YKKcfHs>BYTscTqP;P@ECSlv+O@#=VW|^WWlEU zHKNaVz%vc^kl|29^P6( zH%AjvK5b9|ue$1RBgMcwdk<=tWZ(Rm@24F($+q?SZN~(rxBP!iO{9F|-y0Fp8Ie6y zb!4=2erlS%{oW>iO}U-KB%%XUr5PNZ;@@M=C?Ql354om|W4<4MUzP7)+&sNJNVlit zl2I(1N1=U{;}WQ{93~%Ha41t4um1LTtO#NMqKoT|yUXoX)I!8PWwbsD>3`jR=Kg#8 znGuhhi~^orlSyMWr0`680FH_m(#9mAIX}0m zDeb~23EcG~7<1;HpXLK*aA^*oj8h+9A6`bC{LaBr~Qw!Fp9PWe-UVbbgF zt;vSh<=K}ER+pqK$u-@!{DSp}@ZfJyjo3F1{dZ0VHAG4C@dNXX2Ze4G-3ZF=1CCn_ z1uuxpi#iAq1WIqP3#nLXP|83o}d5w(sn*8thOud0v@h?27N3lgG8y=~boIO>A;C}`#*qlc zpf4Q}clp%b;*R`zWwf76C+e*Sg0uwrBh@YXIlK{an7!FR)e9->%&QpH+GCR z@Z$l}H*-!uRl6h{8-LR**qrara&>u>4pewxczmoT5}~-STV{2Vs`CBw=h8Xg`QEwX zacro+pL6K>X%f;V8sL}oqbGNujFt^zY^(%RbZQX!289q_zeZNN%71}ho*<>Hem5kr z`n0>dF^PHTPkEK({B#l)==F1(c+$Di(p~$tKAB>j3o6T@BIB2vz++~F;IsEFXI0qb zDoOO)Nsr&6-o}ct=}RrBBvF=_SJ){G($tHg586|I+3__AQ|m?2wuQuyDi*ZSzv`-) z%?YX@9<_lqXE+gt2~^aM=1zz07spv1XBkti{yZ7w@P2wHH{ATm^QLpoR45`rs#jXJ!>55A3C4BH{qau-rwz)_z-Y=+ds7P zK09C`^6BV&W23gxJc<{$zH@Mlpl>kX`f_M!OF$%fuirp<#qsi3L*miz_D>Z3Vf1-) zbf>rkB%tBiTdeV;dAmVSsKIh zZ~Xh7$#c$5U!MStsN;T1ZT1`#}Y-1f80y#1}o$9 zE(G5JiOKx;?-%oxU;63Z9KLQ+^lJ-JiARC~j2H)y6$wdISa4ficxeL-b2eVBz0;?I ze?G4D71DN<6KsR8@EN7I!yK1n6_Fh>4%8?c@X_dAjVpq6;UD)o4Dtx;@rC!wNv7n2 z1d}eU@>-R37-SJq{WAI&IAj@4KYS%2nvAmKwm}7$RoLl@DFCD282}@?7<}lEG7ylo z+e-j_BZ{Lq6`st|%@1Z|gxZ&hLG9Uuq4uwRJl1aHegP`t;;FtGh)Xn!adh#6=?YLs zwULBWqtgrId5~~3BKx$3!Mff?2$91-k#tIGdB+yn8{tADPo!C^LDJ*R`2+#5!j2eB zNhrM$z#*?WC3EA$;}6XQz;sp!-~&$#s70p^z-Yq-Pyv%71kCEI(!iL^6AxqACKYM~ z!I5IPK_Y!MC|LAs-;rho+lmp%GSqa(?_>uLW6N~1^eLMdEl>D@`{;zgk>ypwVD?iZ z)Czc_*+AJ$(Qod)ulFxvAr643cxOOVa16@Y+yD@u_X|h{ErpM{Y<*3CaD;2|BG#cR z(q9Y7=^%m(Y+*75CGVHRZgQW%qYX%T;q2)9x=7I@tQ=LlU19uBmx%VLVp7|i2~FXp zOv#PrV);L^gB@bu{O=S!ERP0<=sa!0mSY9a6ZR&ResK!%0(uMVuG{DXg%Wxte0aL4;7{M)4g zb|p`v*vA^zHbppt=0md;YLym7)~Lx1|~ZSX{icRUD)I6zN>9o}y>?nM!kd_$`U zS9Uo18V@Jt8U%wLac%FZ5Dn4)42KR7mC5sxMr%=a(7tIMiAfs+YTw2N-ER|v=Jl$G zj?a)JZ+HFtwXZwgcZ~|4xHjg(;8^E^>??VxV*_M5Vpb~9B3FwJ)n4gO3t89KY&R*2 z-j{pg@M&R#((r+?624BZ z5PsrN0(d)65V`t`eev=inl^L;$+tLz zAj-{dJks%l3DHaR{&_GTs@-eBKptmpb;`mWv|l*5r}MALrt+ zemaBdoKZdky6v1BTv*BEnR4WBcxWW*-kRgl|Dz7gWj%}HV- zs9dSk$XE9Tkd6BiC4wBq&)@wKXQDMgi0nrg9L_}=93Ut$#FZ=(1IXFMV6v0L%xT?X z$u_0&X=lbZYY3|YDj;yE0aFy41BKYp-)ILfdFcaYy?p@+{KcOyRX)qgLrk_QVJVx1 zkN;%S$p3|fVZ!q1E+m>FCm?5Sj(&NrNZNP8>A&fPka){v2}5bdTTTL^>`3ZVO17uTc{4 z!E)xB^RH;Ri^CZZ!EbAHWbYE#(P9J2H!#AS!~hvr0K#yo!?pyZS>~=wi-?RfH#t8Q zgf=?2yc@`em+`7A3d>}G$xYQ$!MN(%z^$gn$4@q4MtDA4fueW@Tu=8UlmqrkX88He z`tv{*nMOvG`d9X}0*G+p3Uk8_f0;$pW!DYeaWRnBDqEEMfLQ ztgeyTPcFb}E0fxYz)aPAR%!#D*i`jDzhrsj+}_h6Z-c62?LOyq;xpmE_be||BKF~q zbwDmpR%9U-=8j$AaeGJCOw?JoR3>Y}ka*hdG(Q8Jm&RqBcoRybny-LGnXJe_0k7u3M~)9_C{vz7BvUFneq zc{@RYHjM$3@)3Fl0sF>@=}=+e0AUN8!8Lrt0>%h@?LXDb2`^#1>x9(o1c$z&Fm9MQ zk@HY)p%P)sn_YIgyR(}WNYmxm4fph=o-(<6`Q#NnX~BYkXM60doukM%t-uUmdyLLu zSZ4l8a`D2<#Qf1ayP7xLrRxxY7S%}UVD>n#@#|x@kDr@=QN`P6 z_&!mn-#fnr*IXDUKCU&7KYdXY3fiR7S34 zuD#sQpG38_B&|!)=ded?{i`|Y*%E_eMV9wbas}ldq)Mnj`p$N$)Ayz?zNsDxa*dZ1 z3L-57@C1p;7>9?bnZw-33nZMuotNw4){J6HFjeZ&+9PIbevk6uBcU%h^qV}E&A2$u zyVrqX-u|LvLmwAwheVM%muF7?=t3?k^kB0^oOQ4Y4ozm6K+|T1$oE`JJVtmPhGD;3<%=Or-1N0SgPWHx>`AM^LG*cJ`{)g{T!P&*PP<7O zOv%R?rp6joxb9u(Q4h3F@%_IKM9tS}@}u8JB^5`#M=$d+Y~MJ&txMZ`1!ZT6YLKmn z2^FTf(~zNzLEOy2p)Bie)raV{jY1mSzFh(j3w_*?TQ6XVfY!aw$W{BAnrqX)KO?s- z04f{4&t4|_Tw10dX8Jf@q6qU8HuxY>>gyP`2ij4d5$+mLoZ)-PP$IZ@+UAsY6?uEc ze-brg#_dIyap8F{WBHH`#0e}h#dfiU3a`v)P>)U?6^9*oZL;3o=|Mb$TVL;Ea%bPu zZX!^Q{6L`mS+mGWiOAc$p@T;`L@MPfwccAe2L%gzJRKh#n=t!4pSg!EVO33*0*6p_6w8PIXnGZR-7IS(QR< zOcuUlBf#w5O`W)ef>lY2Ov?2j9cpMhG+=d~ZiwM-v@M7~<_vLFMG8&I{H^FzNqJZv zk7;2)QmHmy;ohtZ3o6@4k$HuiN71IuxVQndbJl4fb_i0PH}*t#AH4cK^b{gOSh3cy zH@=t!e}4~*i-;wIz&5to_430rzg6$`ZTaXeqw%rJsK#h#HN+#JGq@*>G49n90*z(4 z%O~>G+;=Y*`~X(0L|WEJ#{1g7#GVw;)X@$)aItX3o8qM~nTmjewq6N9zd<9K!FF!; zuXyW0$*IKq_`}Ac;qkunRlD>We~*!CGewKiU(PtcpAqtC{nP*ZNspQ1-y>&pI}9L~ z0Cy6*{!2Opt|U$Umqu(rE+K9n9w8tm@%;NhZSerxrfM%C8CiiU@aTZmKE%G}n>DM`xUB{3d13x>G( z|M2CGGsUJLPExI|348KJY2w}*tbY5kPHL0h}Q!6?eN50Fn4exp~<%{ zl3_BU+7;ZZ4NE^zH0C7Nq*#+Z(ZjKT^mpdQM#6*vN$TA50>b0=&%^ON5g)tb3ATQq zHyO}`W9n<_l$%PaFd!LB=>%FA$*6}6Xfl`7InX2EZwhOwLN$+pbQulvZrSK$9ucq2 zoJMj}A$Trd9nqV^<;2WnX3!kJyI`r%y|#d+e!G{vT$RriiivljVrG(WpeSa|Cy~f7 zW}*VAXm3|%zK~-YiH|!;PEp1u6@HsI<>37)Cb4y!MtNdLQb?CqiC(FGSg|~awEnG& zyqGR)U%cyg(Y$ZphtZ~%%y=!nmqWKrmFsZ>h9M;>)nrO`$d2Od>PS3}OWHEr9IW+P zjpwh680jkq?c8tJVhjkb4yKpdEzK|2LkLVhwWnel4mTC%i@Q?e94Kww<6 zX@#$}!zid>*KfzFUP8MlI<4BpD6sZSHT1+WBZ9N@8qbMA@)-+kk$F zr&e_slqsLM6N>F{gPmc()<-T}x-Q_x|FcK@Z5#P$nz$-MHD*s1}~C@HZ#x7K%$3K09U`ln(2yPBKdx|2-k!cnjKp0(j+;FNp_zM zj8`1|-(xhw(tfza?8LOOD+xALDQFOuytJFJ3)hT$CnO!IduaFr^?vJ*+PdhkMyM$6 zS-Wg;>@h`-ytsixR6FJ-QBEqcTXZvRdXfqac{_{I*EYw{q!)cCxKO$&$RDW)%`{S4 z>49;sN)Iy46?~4NG{5EAtMV%nM2rGm85!FZ~ ztll4cq`JY`JM6~iJ??4_WcjWmq`tAkIfsA$p31Ja<2bOPIz?fS*3MrdvYFj~`r2P_ z^?LrAecRNZT7S}JRbk~~{yJ93|LPIj(?Pe*fBD*d_4>t_f|=F_~n<- zP~Ny4M?)`>GKhjR1~uj{Wt$z1Xo+@-D0jU}xiL{o+_OD_I&Y9@`w;agS+v8mEEjGh zpXxl@a<&WU$Dclk7TvtgU!8YaphZEZ0G0#FS#XyLTbUQ>Ik1kp#kDbgtrTuS*z2cxxoJD0vgUi!ydaeQ8`68bWq)q`&1@Wh! zeOzB0S1w5JNM?N%HO1`>-jiyL1z%PSiUT|R_1y>da=%2da_l`AC7t}Z$G zL71CybPxgF4;Y*}wmw!gaCZhCwW3F3$W6mb!wsiuJ3G7mrE<}5 z(P(3EDmhs@|2^gYuTxnXLs5A?Sy^5=Ss<4nub{lVlpL3UfS{m^JTFjMN}7vHnn#@G z|561HUI)(Vzuqww5)$~&vonTtZ!be%@109K6SiY@3eIW*5f=)k>Wp7X6e6()bJfuq z{*9E2)jisUMo#x=NmfoQX$H(zT9{TC7NN#tU7{St8mL|z>|7Vpu=tm2KZ-9Jrb51i zdH7%|5QlE%pb6jkosTi?JU&HP?Y6C6|51F(^b(~S>+}_)s_YldY=P`abU*l47CD)d zjzEbI5f+e?sZa9Q^VqdeB**vBv0sc6vB=PTo%!4#Ns6FV*8{p{vB*X_WL^*(6fBk# z3HL~I~!AO>r0G>eAwUrQR&CEnpA&XJd~@wW`nK z2#;6feaJg_aSwY3tAJ>G1Ul7)f%KShp~1S2yg?o*HK-T4aLrwU(N^>vm>)VH9Rq26qh4=S*}$QQW8SAK$q$P3s%o%&xzF8 zLs!e$o!ei(H2+@7LlHMSsuWsWT~+E@LkvqEdolByX=UIi!7Fk-M9mS@?FN zGLKSvk~Y@XDR&?aU77TVe}NQ8sh)Dlu|Tq*q)hrKZh)^=J|4rCtCoYUW!FWOy?av< zNjCbb&Je@|Vb<%G0ghC%RiVtlfSvu!)Vf;5IKFGV(`LBNB$!^sT~)+wAmh5ccr4%U zXhx)sPQ)H#wA_I%1!mGKX%a_jvK4l&gAnFaoGUZs(00w>!r;hbOf26VqH^-`q;F=N zQ+Wej!>WO1oWR`OO_vxr1(Zo@hi>mTK(e>AfFPq7BHgPBdD;KA%wP$Bo&7M=S{k-y`+79Z$`+AR1^hB z7>NzBdLCcSv<}a!kXn#0Y>JBUI~WI^F2_K*u$n8Xuv^PMW%CDeoq8P^e1I|1i_wgR z@DVEkv1Q}o9aYWQO&-+7@`aCZ?k)O<##*;}S@( ze(2WWrT!hAkpgC(Ef&eu4>d@gVCr8nEy+(R8PNAu5g+B+5{bfvy)JGrP2zluxp1(l0??}*#+_-LUKWEJ%vX)eUjJlSf2jH({~uHdo)`Ut6>!B&r;*vPiwZa#)1uT&{8o%~z&v#7AGEM}^DA^3f^q)- zBtMUSm1h<@r8~$m9{DcVBjgMq__^D8C0bA4q#s9EK&F&}+9svcul zwS-zpAMe4dTm3NELbJIyN#pqOJQO{~DKeAm@%p4!gM4*y@jSvk#_P*M1@AzLBv*ru zb+pRZBt6FZk~-vk=~%uYrP)*HgSuT+dO*yYE;7@(H*IG5QCjc9mLaW1lvj6)aGh1S z&c~5S@~+A0oJVQjL8&8aJ-=u10D?g2?K%p~@HMcn)%ANc4`MDz7#@%NHINL*w})p% zF_pVZbEQ2K=mVter5Z#T|I8ol5mSQ>%-e+n-2t9-xQS51UFQh79OOCP!h9Xb59Hv~ zxo26FLQO@6=qNzPjn~|X~!J57+^J!-y zq64vWaZcfiD(sln$waV$0n_cqm<7WMJ<|;axw)d?*A9gjSVNQJZSecTJq^QPB>CxQmWVuVcV{ zkl_RZhbT3&Uoz|&4XhHBPrbc zFet1U-B)08hGT^UlI=+zSd3T8CWS<*Ty3%s5>=sM2fudK{;Q{S%Wnez6gB!VupbY9 z_yULO8JQK+Ty)<6vv)!brdyuNZzba#Q2+BItDpaO%w+9X_oFG~thfo|GRgk~1I^TrDDn@d{GP6xl2vI$6 zcTPk5ud)OYUNikOT%lqqxfDnnARg;~m`apvm4w?Zvg0bH!(7x1*^MvULh2<vOa zGwpx4iY!gr6jG-AtPi|>tD%PKf}_^|#8yBCCXFQU)8su}dZ zg+r@3yf2(BB|CoIDev@@tE7jec13P-Ur>o9Z&hJ(U-J#{bp*(VQYN0P3Ke8jz%VV3 zy@Qczya>nD37(p99P&(;Fd4N}TtD0}eRQ7_u@hs1FE%+mJ;qnLr}IGXzl-%f>}EK= z7h)CKP9Yn|9j(c80NLUqOTtrXGqj!?nl`Is*@aTV4bl)FD4jCyrenA&$sX49TK!6! z=U~eRxYGS?ST)6rQy_Qu!0YeoE0A~Ulwi3sh~?{zYd~xu0AK5!gW_4XUw7Py$a>|#;h3}yaxrYaHKWm!@FiFNXba?&U#KoxLZK`_b8m_ zZ*$!A;aH zPijz{gck;0{*~DxNH~CuHniQ3IP%Sx{4hADRfUZa z+8k0iiwKZW0wZMR@Bfg170Lv|&T!FIX1g?Jc`3sAQRlkQsT5C*?t|LGU%z86?fmsT zuve9Ja8cFO#h3`g@`Ak^r}_)SNLqC^xVLyY{H2pRd3koyEE(_l4LRr~BKxykjeV_pZ(Y*LUgP2Q$Vkb#46(p>QOD0JGLV+a4N5w0o9T+&{z)Yp^&%Jnj5r+V z4JI{0(Cg*{Q!W7ny4k_xO9-CbVqj`Es9eU+4R2aCn87KtG4UIrHVq5zk z-v4LPB?V^F&M@RWmw5l@TgR81I^HKrNDq$>O4MtW+Zrg6c%LLmWF-lEC9yvT8)%~L zNg;t=zztR%RLqnUgnTba4nn2OCOAO-kWEejK$XJ%gRB5;>2%7}d&n{FryXTz96n#M zO?X^mCIR$!!RIO<(y1nHvxPX&C# zaD=wlqI>U_tpC4-PiE2mZTq&jaQqU}Qt6mqdsZV#v9gI|L$=6da zw@sUj+R{Rb>|=QlS7}`6_kb*RhL8L6=NyNgN~;gq4Qq7e+5VP{^;#8K?` zsn&#ge+qXVNL=QBG<}{X>&QB#o@nc%!^62Sg=c21QA%Y;p zX@YCq6~^*FCQ>Bccy{D?dUSoODAd0DT_8a!U>| z$@zc-Fy}?`&+acf-7ye+fztI7QhQ}(`v`p)>f)~LDW8Zs#~Q7bL$ii{8tTfP53jU$ zPo8ddcB#g!C6H?l2XH ztr>FJDV7&htxgSz=NEl#lB3FbYNLwUJQhH;mK3qca?<%~s=xkA0l!NxBgec0fX_Om zKiUYDtH(NTesPr(d&gm7cSOwkI3qSxh5vNOI&J)& zR65N;o(%5$AJO?NNBL|7%c~T;_Y>rG;7l7i34YF?c>U8RB1Qnmd^*qlc4PjoL-$V2 z2do+)+^R0dhPgJ3KTnMB=H0r!&YwqTC8%TEp|@2F*<9sO+augNK)%;Ejs%?QO>m8D zBY{`j0%w&bnP`k^Zt>XC1X>D^v1)G7%2FD)#3p9uZ&7Y(KT2^&d*ixFkwv9=XZe>j zprQU$MEdEsE!ND!4uBugL9sO1P!ykfe`n)-8WsuAlaP8~nt1__7Ju}y6|QHit|tbj zT`Ol08AvjL_>RjV5=jlXc)!9A1&)!j>Nq56m}ZbZFZJRiU;m_@VJ%4~iA{SiK?5Qn z2lU#T_jl9$;XUSrXh=x)G4f+64)=x*-NrGRs6URLY-DbLiJV@LYG#{l~v!O z0CN=P!a}T6iyQJ>=LW!0^0iEKR<~I8wA}gAz(&@1wF&ZDNU?D&-W+~aIjuBJBhUxPSP{ep{gKCq6VN3g z0-!%AfrZ$@?NVQDgA*Oc`>;{RkFXcorCJ3**ASG$mF#8mI*$#a;=AMiqKovD@kkM9 zh0_whbAbt_n~zMt70j>0B(4w>tEDA}zao{hP-!K5Kn|&{?7bt%J~1SB)=#A~w;V6q zTaK}r1h^Xbft_nd&PP8#N$&35*R=~L6Pe~|xAN0{xuXw0 zWDrz9I~z}nobda6E4k37IaClR7RJs>udw<>xsSU=ZfhOnsKp{kX7KhZGL$I6D=$ZG zYY7C>+U19n3jdNU|B@y^##*+(RK2$-k=w6qjbs0Jh0`naNFrN{SZ?--Ho9e2R>E1w z4ogT9PWVSxESuP3Q0x;C`e&k)>EEAj3%Bd2YYp;CoNl{5fOGXJVx2TNq7uqSo3JGK#m>-N2bXPq#v6Tk}98G!-i7y#LN zag0!aL<~KH=#5-obBjUgf(GeWUli+gICMBmOzp9fa#9;kKZ%c_W+={BJk{N$F%%?~ zUtJfqv+g=4#v3PgSkZ6a|12c>W)^vEVW--u~h48vCr zvHq4%OxC)o$mS+6BJtvwy)x6#FRKsFr{9UBp>fj4yl>67A(N$bl3#1JQNijVwUQys z)&(;Uog1Jed2z2Zb5=n}?u7Z1r$jmO<5tj)b~nu{tiOeW*1XNrwZHQHdJ;xMv0K{n zZkBQn=ilFm5{%CwmRguM1wrhrkK504t`jFJAv#i9O}7%~#1mX<$O>=c{U~^zcRC7? zpPJHW4h=|=>9?PUcnvhkv|skQZa<%GAcab?5=%`yKprI_srZq+rh^ZVW91&2S1l$f ze9w)}O8Die*6|dhYqpt8hYdj|r5wiATC0Jp4 z8FQ+cNsWppgb|^wBs9p6ss&0!Ba>ylrKnnX#1&c4-qYZg$U+vTvR`V9L!0PcjK_Fj zStqXPg5+p`lF&+hEPp=ymR#=;&Q>%*0wHo^VjaSwS!Nq?frh4=N%{3q^>ORK>Yal6 zU?kH{WR3uR1L8jjuMcOUkJWNXikU zP(_R}A5IPHSW9K+a_dE=)g|(9j@CX?3b)r11NGPDx!LhHmS}yOC+z~IgMq(OL@qpw zCJ`a*VTa6Llv+Jo*iY2-O;HsNnBUCX2SRQ;C#G!0-XJqp|HK(tB(3VgO{|O1jc zfhgf$TK6*h{f0iK&+2PO!tsR+Zp_duNJ3#eefe^;Y4^f2dt~M@bA_O7cVVS6y>`s! zYB`8!A^RNJbP(NFJ?M|H*)DfUdrv1svKC%kYxcR*8zB*>@zMBZ1~M4csKInB#v^B0 z#La!D0y)}Wm8@YdXFz0#Nc7Rb_Qq5pTq?nyNY%Su4uxIIqMLg74S%s}w*E;ABu~3q zYU>%1sBMx-?PWK~=l5WSH)<|j!kYfY(~uYb$s+N zdpfAHxirKd3S9w*A+HLumJ{H$ZFGdsfs>GVuj?g2(f5qzJz_+Di`V&-i227&=3lYn znm6#d`xwj}ywEQ6Pdp(iBGjmmqOL0B=kpD`f))JFTsYCtNmD|2(0NXO=LQy&R7dN; zuvS#CE73#Tn7uoeD)gM_VJfi>(-h-v#yPR$1V@mHDatS+>L00{Za&TWDPre6CXQfo z$y*&{ol3)#N~3btxa*5*nqZ%kfSOPl}?65or)l`Vv28n_=Dx*MISEh$k*MHEgmh9hE-S zv(-h=Dyxwzz+1u#j&N;lCGptk#bi9ez;WGiX}F zXwXYcA#e7zoO0JSQIh)c$S*`ygYWQFgD{B<9AMHIYf0>F)$TCq{VdoIU>AcS(9M2E zT0>M^P&N@?dCC}B&?W+SKJyB*eb0U&r0bk$biTzZXSPzgN5&8`XTF~q5^!GyJg5zk zYDi?e7@dW$M1~}m_K|J{)%A8ca6Ogo6CIfc*#8!nJmOL><~ph$pCm9q1JneEGd6rC z?z70ok!8D3h**gJYL>2P)`oyb{&k-T4YSX%OI*`A=NXolMZ-? zXqsMT(uVq${RHAI$FzY82<-HdC^pDGIfh@A+;ss+UMR3%)I%n}*R<3?Gl#e|QS=ZN zX)zx^WL$|L%R{vr@+9XMxMN<}uw77QdA#fLKvWHm59tsoK`yX)m85%g`7I=1sUn1Q z4Qg+?A}#U8UP}Lch>0`ccloK|8dZ~%*?sDj4w;(5M+69-VI*hpJyDdOZYvu?O{q)0 z@6R9DX$J2ZSihIsjTvT5&(LE^oV!|S?*=TeEfviszGLJ=d>|6PGqb&+p+r>9Fb@QZ zX-uBGP5q$f1WDA4q8p?!s-^Z}*$&6R3$mDPhWzUwVa%eAeCo-pWI;h Ujl)IRdv zcbFn$wh-cjxT6<049m!1B{IYOYB{pbd?lYk5jMX=raSH**|yplyW*If!^-qGDU97I zR8=QEkc3c`37f9$kSvlI`E1@ulZhLKNU4cW0+UUz%VXkki5>QIU(mU=mOfFP1#Zg+d?p(t>rM286yQIT!{i^E9$(VQWLXm z55|!u2D@_bO*)6}220?}RD#-zx^|4NUvK3|)FACI`n2;@cgSDsW7yfTt8kkvBjO^EU?&`lc zRYPieDSEZzLOdZdm?Zi6)H*y(c7e{+Q$as^lo31)ZcO0bn3NfriLmMVb5S@e3*oR( z?v(v{R;N*Fg~%l!ol04O{r7!7k)TyP2xR+<&Wto)c1#6W=e9t1if!waCu`gRbc*d` z%7=~PkGz33;xDtRz0W_iF=$5<6pIHrLc-a6ZD;7(Hw?BeG;@;})By}u+SPvHIEha0 zElt(#UBsDTNBFeY_}J_&*38^H1;`QUZ;Mob&9ZtbZuNBzvDKvP<2Mtm+&b>=BXl}E zYT?;FyDu@PpPoj{7~X}asNb=DJa17h&_RN#?pdP62xpWby^LV1v+E?G@ewW|fBE{VLoD``NeJg=m`HO>s#-H~3=*gUzkuNmeb`0M)o- ztO>d@++UTflrwIoJ;b9K67ue)t9(+hRo3&U;d>EfxLLwfC)wfp@dcLQ>q(l!*MgYe ziM)1p@-q-DOsD9MePiofY0$qnK)hN$EO>Jv6iN-!QQy`PH7RiCByk}TX1^1@`z9xT z+Pd%)L7?kZgx?+c1YzR4AGd{a;?Fp?jnIkVYqqnWq_!BMrIRW|x5|;gkhJN|Fd~+K zw`7frjDl5*bsmcru^%cDe=l0Y1iau^WiI1%tGCz*zyJ{(bE4aoEG31@DTs* z72w_Pq$j60J1QHE2}ioB*U55=diCcnlH`r3>^>)A6QBnV#PK6XvKIfrT!ohUL1L5? z5$OAC{_%wGY3Q%MC`vqq3!_ z`a=y-YsEtR%@|3)2FaIu29|{ANCqBE5j*NU`_Z-6@71r`~&1M zeP+jDP3TU+&!!L{*P!v0SDls@A(p?) zA1h-+(|D2@3F_y@omF}iNsW@i4G+o!tWX53F099lMr z9tP?=ToEj2m>5G$1F;~b!)sNlOkH}U2XXWE-0i2+)>Zl_^i~%HsO$|FuI%6{-V0G) z0GBrWzhE5{cpecx8kq{3U|XIggcw@OZ?u`2Lgv-P15up8J8)v_R*i`PBle*5Rj$iYFnl16C|aRL|YDil<`LJP#4}tI^fjp5w+jfhTpt z50H1RZj}u!<<=EShNxxR0#EvesO8&ZS<~;Lryuf++7|6yOpFY}*q$c%94Q-ah%4+$ z$9}I)k{nP~FL=otKE6vcn4ZxpeXK`u#D0HxHCE?7Y=_BndE`?1Xj9ps{{F)bZ_mckiS&v6KiSH=;OF|JX!1u>M3JcAP-zBm!}} zsp$H9Mjl1+WJn%1hJYhLE^I_8yp*_oVxt^(A5C#2=qC6m@{sfj=bBn*_{P>7Il2b&p-TODN}FX{`h&pADO=Shd+Wu|L>i4nBAd$nZ=#z#|5lSzX9)D2xY`;BAb{&iCzLv5b6VJ|MyL0=^hxiVQJH4+ygtNB4 zZ>L_pq%WpZN+)lY0w4^7WQy>~Vf9D>eUfg!2<;6Fc|E#WWyX$T2m2t>T|W iuLQGlKK-dre|zJ^^yAHfay*6>=Ejy>s;aL3Zd?Fvo4SJl diff --git a/Doc/GraphBLAS_UserGuide.tex b/Doc/GraphBLAS_UserGuide.tex index 16e9097513..29e311cae0 100644 --- a/Doc/GraphBLAS_UserGuide.tex +++ b/Doc/GraphBLAS_UserGuide.tex @@ -14053,7 +14053,61 @@ \section{Compiling and Installing SuiteSparse:GraphBLAS} \label{sec:install} %---------------------------------------- -\subsection{On Linux and Mac} +\subsection{Quick Start} +%---------------------------------------- + +A \verb'cmake' build system is available for Linux, Mac, and Windows. +For Linux or Mac, a simple Makefile wrapper is availble. Simple do: + + {\small + \begin{verbatim} + make + sudo make install \end{verbatim} } + +For Windows, open CMake and use the provided \verb'CMakeLists.txt' file +to build GraphBLAS in the \verb'GraphBLAS/build' folder. + +As of GraphBLAS 9.2.0, a new and simpler method for compiling GraphBLAS and its +MATLAB interface has been added. In the MATLAB/Octave Command Window, simply +type: + + + {\small + \begin{verbatim} + cd GraphBLAS/GraphBLAS + graphblas_install \end{verbatim} } + +This will use \verb'cmake' to compile the GraphBLAS library. You can skip +the details in the remainder of this section. Next, add your \verb'GraphBLAS/GraphBLAS' +folder to your path, by editting your \verb'startup.m' script. Add this line: + + {\small + \begin{verbatim} + addpath ('/home/me/GraphBLAS/GraphBLAS') ; \end{verbatim} } + +\noindent +where \verb'/home/me/GraphBLAS' is the top-level folder containing your +copy of GraphBLAS. + +After \verb'make' in the top-level directory to compile the library, type +\verb'make demo' to run the demos (also in the top-level directory). The +output of the demos will be compared with expected output files in +\verb'Demo/Output'. + +NOTE: +DO NOT publish benchmarks of these demos, and do not link against the +demo library in any user application. These codes are sometimes slow, +and are meant as simple illustrations only, not for performance. The fastest +methods are in LAGraph, not in SuiteSparse/GraphBLAS/Demo. Benchmark LAGraph +instead. Eventually, all GraphBLAS/Demos methods will be removed, and LAGraph +will serve all uses: for illustration, benchmarking, and production uses. + +%---------------------------------------- +\subsection{More details} +%---------------------------------------- + +%---------------------------------------- +\subsubsection{On Linux and Mac} %---------------------------------------- GraphBLAS makes extensive use of features in the C11 standard, and thus a @@ -14153,7 +14207,7 @@ \subsection{On Linux and Mac} JOBS=32 CC=gcc make \end{verbatim} } %---------------------------------------- -\subsection{More details on the Mac (Intel-based) using gcc} +\subsubsection{On the Mac (Intel-based) using gcc} %---------------------------------------- SuiteSparse:GraphBLAS requires OpenMP for its internal parallelism, but @@ -14228,8 +14282,7 @@ \subsection{More details on the Mac (Intel-based) using gcc} {\small \begin{verbatim} - addpath ('/Users/davis/GraphBLAS/GraphBLAS') ; - addpath ('/Users/davis/GraphBLAS/GraphBLAS/build') ; \end{verbatim} } + addpath ('/Users/davis/GraphBLAS/GraphBLAS') ; \end{verbatim} } Finally, you can run the tests to see if your installation works: @@ -14239,71 +14292,19 @@ \subsection{More details on the Mac (Intel-based) using gcc} gbtest \end{verbatim} } %---------------------------------------- -\subsection{More details for MATLAB on the Mac (Apple Silicon based)} -%---------------------------------------- - -MATLAB on the Apple-Silicon-based Mac (M1, M2) is not yet a native ARM64 -application (as of R2022b). - -For MATLAB on the M1 Mac, you must compile the x86 version of -\verb'libgraphblas_matlab.so'. This requires the x86 version of \verb'brew'. -First, install it in \verb'/usr/local/bin/brew' with these 2 commands (the 2nd -as a single line). - -\begin{verbatim} -arch -x86_64 zsh -arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com - /Homebrew/install/master/install.sh)" -\end{verbatim} - -If you install the default arm64 \verb'brew', it is located in -\verb'/opt/homebrew/bin/brew'. I created these two aliases in my \verb'.zshrc' -file: - -\begin{verbatim} -alias brew_arm='arch -arm64 /opt/homebrew/bin/brew' -alias brew_x86='arch -x86_64 /usr/local/bin/brew' -\end{verbatim} - -Next, use \verb'brew_86' to install \verb'gcc-12' and \verb'libomp'. - -\begin{verbatim} -brew_x86 install gcc -brew_x86 install libomp -\end{verbatim} - -In the \verb'GraphBLAS/GraphBLAS' folder, do the following to compile -\verb'libgraphblas_matlab.so': - -\begin{verbatim} -make CC=/usr/local/bin/gcc-12 CXX=/usr/local/bin/g++-12 JOBS=8 -sudo make install -\end{verbatim} - -Ignore the \verb'"-arch option ignored..."' warnings. - -You can now start MATLAB and install the MATLAB interface with -\verb'gbmake' as described in the previous section. - -%---------------------------------------- -\subsection{On the ARM64 architecture} +\subsubsection{MATLAB on the Mac (Apple Silicon based)} %---------------------------------------- -You may encounter a compiler error on the ARM64 architecture when using the -\verb'gcc' compiler, versions 6.x and earlier. This error was encountered on -ARM64 Linux with gcc 6.x: +MATLAB on the Apple-Silicon-based Mac is now a native ARM64 application (as of +R2023b). These instructions assume you are using the native MATLAB version +(R2023b or later). GraphBLAS 9.2.0 and later are not supported for +earlier versions of MATLAB on Apple Silicon. -\begin{verbatim} -`In function GrB_Matrix_apply_BinaryOp1st_Scalar.part.1': -GrB_Matrix_apply.c:(.text+0x210): relocation truncated to -fit: R_AARCH64_CALL26 against `.text.unlikely' -\end{verbatim} - -For the ARM64, this error is silenced with gcc v7.x and later, at least on -Linux. +Note that GraphBLAS must use the same OpenMP library as MATLAB. This is +handled by the \verb'graphblas_install.m' script. %---------------------------------------- -\subsection{On Microsoft Windows} +\subsubsection{On Microsoft Windows} \label{sec:windows} %---------------------------------------- @@ -14411,9 +14412,12 @@ \subsection{On Microsoft Windows} \end{enumerate} %---------------------------------------- -\subsection{Mac using clang} +\subsubsection{Mac using clang} %---------------------------------------- +MATLAB on the Mac now includes its own OpenMP library. If you do not have +a recent copy of MATLAB, you may need to install a copy of OpenMP first. + To use OpenMP with clang on the Mac, try installing it from the \url{https://mac.r-project.org/openmp/} project. Be sure to check that page for the OpenMP version @@ -14446,272 +14450,11 @@ \subsection{Mac using clang} /usr/local/include/omp-tools.h \end{verbatim} } - Once you do this, the GraphBLAS Cmake should find this copy of OpenMP for clang. %---------------------------------------- -\subsection{Compiling the MATLAB/Octave interface (for Octave)} -%---------------------------------------- -\label{gbmake} - -I'm working closely with John Eaton (the primary developer of Octave) to -enable SuiteSparse:GraphBLAS to work with Octave, and thus Octave 7 is -required. The latest version of Octave is 6.4.0, so you need to download and -install the development version of Octave 7 to use SuiteSparse:GraphBLAS within -Octave. - -First, compile the SuiteSparse:GraphBLAS dynamic library -(\verb'libgraphblas.so' for Linux, \verb'libgraphblas.dylib' for Mac, -or \verb'graphblas.dll' for Windows), as described in the prior two -subsections. - -On the Mac, SuiteSparse:GraphBLAS v6.1.4 and Octave 7 will work -Apple Silicon (thanks to G{\'{a}}bor Sz{\'{a}}rnyas). Here are his instructions -(replicated from -\url{https://github.com/DrTimothyAldenDavis/GraphBLAS/issues/90}); do -these in your Mac Terminal: - -\begin{itemize} -\item Building Octave. Grab the brew formula: - - {\scriptsize - \begin{verbatim} - wget https://raw.githubusercontent.com/Homebrew/homebrew-core/master/Formula/octave.rb - \end{verbatim} } - -\item Edit \verb'octave.rb'. - - Add \verb`"disable-docs"` to \verb`args` (or ensure that you have a working - texinfo installation). - Edit Mercurial (\verb`hg`) repository: switch from the \verb`default` branch - (containing code for Octave v8.0) to \verb`stable` (v7.0). Then do: - - {\small - \begin{verbatim} - brew install --head ./octave.rb - \end{verbatim} } - -\item Building the tests (\verb'gbmake'). - Grab the OpenMP binaries as described at - \url{https://mac.r-project.org/openmp/} - - {\scriptsize - \begin{verbatim} - curl -O https://mac.r-project.org/openmp/openmp-13.0.0-darwin21-Release.tar.gz - sudo tar fvxz openmp-13.0.0-darwin21-Release.tar.gz -C / - \end{verbatim} } - -\item Do the following to edit \verb'gbmake.m': - - {\scriptsize - \begin{verbatim} - sed -i.bkp 's/-fopenmp/-Xclang -fopenmp/g' @GrB/private/gbmake.m - \end{verbatim} } - -\end{itemize} - -Once Octave 7 and SuiteSparse:GraphBLAS are compiled and installed, -and \verb'gbmake.m' is modified if needed for Octave 7 on the Mac, -(or if using MATLAB) continue with the following instructions: - -\begin{enumerate} -\item In the MATLAB/Octave command window: - - {\small - \begin{verbatim} - cd GraphBLAS/GraphBLAS/@GrB/private - gbmake \end{verbatim} } - -\item Follow the remaining instructions in the - \verb'GraphBLAS/GraphBLAS/README.md' file, to revise your - MATLAB/Octave path and \verb'startup.m' file. - -\item As a quick test, try the command \verb'GrB(1)', which - creates and displays a 1-by-1 GraphBLAS matrix. For a longer test, do the - following: - - {\small - \begin{verbatim} - cd GraphBLAS/GraphBLAS/test - gbtest \end{verbatim} } - -\item In Windows, if the tests fail with an error stating that the - mex file is invalid because the module could not be found, it means - that MATLAB could not find the compiled \verb'graphblas.lib', \verb'*.dll' - or \verb'*.exp' files in the \verb'build/Release' folder. This can happen - if your Windows System path is not set properly, or if Windows is not - recognizing the \verb'GraphBLAS/build/Release' folder (see - Section~\ref{sec:windows}) Or, you might not have permission to change your - Windows System path. In this case, do the following in the MATLAB Command - \vspace{-0.1in} - Window: - - \vspace{-0.1in} - {\small - \begin{verbatim} - cd GraphBLAS/build/Release - GrB(1) \end{verbatim} } - - \vspace{-0.1in} - After this step, the GraphBLAS library will be loaded into MATLAB. You may - need to add the above lines in your \verb'Documents/MATLAB/startup.m' file, - so that they are done each time MATLAB starts. You will also need to do - this after \verb'clear all' or \verb'clear mex', since those MATLAB - commands remove all loaded libraries from MATLAB. - - You might also get an error ``the specified procedure cannot be found.'' - This can occur if you have upgraded your GraphBLAS library from a prior - version, and some of the compiled files \verb'@GrB/private/*.mex*' - are stale. Try the command \verb'gbmake all' in the MATLAB Command - Window, which forces all of the MATLAB interface to be recompiled. - Or, try deleting all \verb'@GrB/private/*.mex*' files and running - \verb'gbmake' again. - -\item On Windows, the \verb'casin', \verb'casinf', \verb'casinh', and - \verb'casinhf' functions provided by Microsoft do not return the correct - imaginary part. As a result, \verb'GxB_ASIN_FC32', \verb'GxB_ASIN_FC64' - \verb'GxB_ASINH_FC32', and \verb'GxB_ASINH_FC64' do not work properly on - Windows. This affects the \verb'GrB/asin', \verb'GrB/acsc', - \verb'GrB/asinh', and \verb'GrB/acsch', functions in the MATLAB interface. - See the MATLAB tests bypassed in \verb'gbtest76.m' for details, in the - \newline - \verb'GraphBLAS/GraphBLAS/test' folder. - %% FUTURE: fix asin and acsc on Windows for the complex case. - -\end{enumerate} - -%---------------------------------------- -\subsection{Compiling the MATLAB/Octave interface (for MATLAB)} -\label{R2021a} -%---------------------------------------- - -MATLAB R2021a includes its own copy of SuiteSparse:GraphBLAS v3.3.3, as the -file \verb'libmwgraphblas.so', which is used for the built-in \verb'C=A*B' when -both \verb'A' and \verb'B' are sparse (see the Release Notes of MATLAB R2021a, -which discusses the performance gained in MATLAB by using GraphBLAS). - -That's great news for the impact of GraphBLAS on MATLAB itself, and the domain -of high performance computing in general, but it causes a linking problem when -using this MATLAB interface for GraphBLAS. The two use different versions of -the same library, and a segfault arises if the MATLAB interface for v4.x (or -later) tries to link with the older GraphBLAS v3.3.3 library. Likewise, the -built-in \verb'C=A*B' causes a segfault if it tries to use the newer GraphBLAS -v4.x (or later) libraries. - -To resolve this issue, a second GraphBLAS library must be compiled, -\verb'libgraphblas_matlab', where the internal symbols are all renamed so they -do not conflict with the \verb'libmwgraphblas' library. Then both libraries -can co-exist in the same instance of MATLAB. - -To do this, go to the \verb'GraphBLAS/GraphBLAS' folder, containing the -MATLAB interface. That folder contains a \verb'CMakeLists.txt' file to -compile the \verb'libgraphblas_matlab' library. See the instructions -for how to compile the C library \verb'libgraphblas', and repeat them but -using the folder \newline -\verb'SuiteSparse/GraphBLAS/GraphBLAS/build' instead of \newline -\verb'SuiteSparse/GraphBLAS/build'. - -This will compile the renamed SuiteSparse:GraphBLAS dynamic library -(\verb'libgraphblas_matlab.so' for Linux, \verb'libgraphblas_matlab.dylib' -for Mac, or \verb'graphblas_matlab.dll' for Windows). These can be -placed in the same system-wide location as the standard \verb'libgraphblas' -libraries, such as \verb'/usr/local/lib' for Linux. The two pairs of -libraries share the identical \verb'GraphBLAS.h' include file. - -If you do not have system privileges to install the GraphBLAS compiled -libraries via \verb'sudo make install', then augment your -\verb'LD_LIBRARY_PATH' (Linux) or \verb'DYLD_LIBRARY_PATH' (MacOS) to point to -your personal copy of the \newline -\verb'SuiteSparse/GraphBLAS/GraphBLAS/build' folder. See \newline -\url{https://www.mathworks.com/help/matlab/matlab_external/building-on-unix-operating-systems.html} -for details. - -Next, compile the MATLAB interface as described in Section~\ref{gbmake}. For -any instructions in that Section that refer to the \verb'GraphBLAS/build' -folder (Linux and Mac) or \verb'GraphBLAS/build/Release' (Windows), use \newline -\verb'GraphBLAS/GraphBLAS/build' (Linux and Mac) or \newline -\verb'GraphBLAS/GraphBLAS/build/Release' (Windows) instead. - -The resulting functions for your \verb'@GrB' object will now work just fine; -no other changes are needed. - -%---------------------------------------- -\subsection{Setting the C flags and using CMake} -%---------------------------------------- - -Next, do \verb'make' in the \verb'build' directory. If this still fails, see -the \verb'CMakeLists.txt' file. You can edit that file to pass -compiler-specific options to your compiler. Locate this section in the -\verb'CMakeLists.txt' file. Use the \verb'set' command in \verb'cmake', as in -the example below, to set the compiler flags you need. - - {\small - \begin{verbatim} - # check which compiler is being used. If you need to make - # compiler-specific modifications, here is the place to do it. - if ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") - # cmake 2.8 workaround: gcc needs to be told to do C11. - # cmake 3.0 doesn't have this problem. - set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11 -lm " ) - ... - elseif ("${CMAKE_C_COMPILER_ID}" STREQUAL "Intel") - ... - elseif ("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang") - ... - elseif ("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC") - ... - endif ( ) - \end{verbatim} } - -To compile SuiteSparse:GraphBLAS without running the demos, use \newline -\verb'make library' in the top-level directory, or \verb'make' in the -\verb'build' directory. - -Several compile-time options can be selected by editing the \verb'Source/GB.h' -file, but these are meant only for code development of SuiteSparse:GraphBLAS -itself, not for end-users of SuiteSparse:GraphBLAS. - -%---------------------------------------- -\subsection{Running the Demos} -%---------------------------------------- - -After \verb'make' in the top-level directory to compile the library, type -\verb'make demo' to run the demos (also in the top-level directory). -You can also run the demos after compiling with \verb'make all': - - {\small - \begin{verbatim} - make all - cd Demo - ./demo \end{verbatim} } - -The \verb'./demo' command is a script that runs the demos with various input -matrices in the \verb'Demo/Matrix' folder. The output of the demos will be -compared with expected output files in \verb'Demo/Output'. - -NOTE: -DO NOT publish benchmarks of these demos, and do not link against the -demo library in any user application. These codes are sometimes slow, -and are meant as simple illustrations only, not for performance. The fastest -methods are in LAGraph, not in SuiteSparse/GraphBLAS/Demo. Benchmark LAGraph -instead. Eventually, all GraphBLAS/Demos methods will be removed, and LAGraph -will serve all uses: for illustration, benchmarking, and production uses. - -%---------------------------------------- -\subsection{Installing SuiteSparse:GraphBLAS} -%---------------------------------------- - -To install the library (typically in \verb'/usr/local/lib' and -\verb'/usr/local/include' for Linux systems), go to the top-level GraphBLAS -folder and type: - - {\small - \begin{verbatim} - sudo make install \end{verbatim} } - -%---------------------------------------- -\subsection{Linking issues after installation} +\subsubsection{Linking issues after installation} %---------------------------------------- My Linux distro (Ubuntu 18.04) includes a copy of \verb'libgraphblas.so.1', @@ -14728,12 +14471,12 @@ \subsection{Linking issues after installation} Revising my \verb'LD_LIBRARY_PATH' to put \verb'/usr/local/lib' first in the library directory order didn't help. If you encounter this problem, try one of the following options (all four work for me, and link against the proper -version, \verb'/usr/local/lib/libgraphblas.so.6.1.4' for example): +version, \verb'/usr/local/lib/libgraphblas.so.9.2.0' for example): {\small \begin{verbatim} - gcc prog.c -l:libgraphblas.so.6 - gcc prog.c -l:libgraphblas.so.6.1.4 + gcc prog.c -l:libgraphblas.so.9 + gcc prog.c -l:libgraphblas.so.9.2.0 gcc prog.c /usr/local/lib/libgraphblas.so gcc prog.c -Wl,-v -L/usr/local/lib -lgraphblas \end{verbatim} } @@ -14750,14 +14493,14 @@ \subsection{Linking issues after installation} } \end{verbatim} } Compile the program above, then use this command to ensure -\verb'libgraphblas.so.6' appears: +\verb'libgraphblas.so.9' appears: {\small \begin{verbatim} ldd a.out \end{verbatim} } %---------------------------------------- -\subsection{Running the tests} +\subsubsection{Running the tests} %---------------------------------------- To run a short test, type \verb'make demo' at the top-level \verb'GraphBLAS' @@ -14773,7 +14516,7 @@ \subsection{Running the tests} \verb'GraphBLAS/GraphBLAS' folder for more details. %---------------------------------------- -\subsection{Cleaning up} +\subsubsection{Cleaning up} %---------------------------------------- To remove all compiled files, type \verb'make' \verb'distclean' in the top-level @@ -14785,9 +14528,11 @@ \section{Release Notes} \begin{itemize} -\item Apr 9, 2024: version 9.1.1 +\item May XX, 2024: version 9.2.0 % FIXME \begin{itemize} + \item Added \verb'graphblas_install.m' for a simpler method of compiling + the MATLAB/Octave interface for GraphBLAS. \item JIT: sanitizing the JIT cache path, better burble for compiler errors. \item \verb'GrB_get/GrB_set': better handling of concurrent get/set between different user threads. diff --git a/Doc/GraphBLAS_version.tex b/Doc/GraphBLAS_version.tex index 41f4bb825e..6d67a0b22d 100644 --- a/Doc/GraphBLAS_version.tex +++ b/Doc/GraphBLAS_version.tex @@ -1,5 +1,5 @@ % version of SuiteSparse:GraphBLAS \date{VERSION -9.1.2, -Apr XX, 2024} +9.2.0, +May XX, 2024} diff --git a/GraphBLAS/Contents.m b/GraphBLAS/Contents.m index e15d66278e..f07afa664e 100644 --- a/GraphBLAS/Contents.m +++ b/GraphBLAS/Contents.m @@ -22,6 +22,10 @@ % overloaded by the @GrB class, so that they can be used for GraphBLAS % matrices. See 'help GrB' for more details. % +% To install the GraphBLAS library and its MATLAB interface: +% +% graphblas_install - compile SuiteSparse:GraphBLAS for MATLAB or Octave +% % Tim Davis, Texas A&M University, % http://faculty.cse.tamu.edu/davis/GraphBLAS % diff --git a/Include/GraphBLAS.h b/Include/GraphBLAS.h index 6db995b69e..a823fbefc0 100644 --- a/Include/GraphBLAS.h +++ b/Include/GraphBLAS.h @@ -1,4 +1,4 @@ -// SuiteSparse:GraphBLAS 9.1.2 +// SuiteSparse:GraphBLAS 9.2.0 //------------------------------------------------------------------------------ // GraphBLAS.h: definitions for the GraphBLAS package //------------------------------------------------------------------------------ @@ -158,7 +158,7 @@ extern "C" //------------------------------------------------------------------------------ #ifndef GRAPHBLAS_HAS_CUDA -#define GRAPHBLAS_HAS_CUDA +/* #undef GRAPHBLAS_HAS_CUDA */ #endif //------------------------------------------------------------------------------ @@ -259,10 +259,10 @@ extern "C" // The version of this implementation, and the GraphBLAS API version: #define GxB_IMPLEMENTATION_NAME "SuiteSparse:GraphBLAS" -#define GxB_IMPLEMENTATION_DATE "Apr XX, 2024" +#define GxB_IMPLEMENTATION_DATE "May XX, 2024" #define GxB_IMPLEMENTATION_MAJOR 9 -#define GxB_IMPLEMENTATION_MINOR 1 -#define GxB_IMPLEMENTATION_SUB 2 +#define GxB_IMPLEMENTATION_MINOR 2 +#define GxB_IMPLEMENTATION_SUB 0 #define GxB_SPEC_DATE "Dec 22, 2023" #define GxB_SPEC_MAJOR 2 #define GxB_SPEC_MINOR 1 diff --git a/README.md b/README.md index 083413c33c..e48de181cf 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. SPDX-License-Identifier: Apache-2.0 -VERSION 9.1.2, Apr XX, 2024 +VERSION 9.2.0, May XX, 2024 SuiteSparse:GraphBLAS is a complete implementation of the GraphBLAS standard, which defines a set of sparse matrix operations on an extended algebra of diff --git a/Source/GB_jitifyer.c b/Source/GB_jitifyer.c index fc46ef2bfb..c3e74e61e4 100644 --- a/Source/GB_jitifyer.c +++ b/Source/GB_jitifyer.c @@ -223,7 +223,7 @@ void GB_jitifyer_finalize (void) // Replace invalid characters in a string with underscore. -// FIXME: allow spaces in the string, but fix the use of the string so +// FIXME NOW: allow spaces in the string, but fix the use of the string so // that a path can include spaces. void GB_jitifyer_sanitize (char *string, size_t len) @@ -2489,7 +2489,7 @@ void GB_jitifyer_nvcc_compile (char *kernel_name, uint32_t bucket) " -arch=sm_60 " " -fPIC " // FIXME: add GB_CUDA_FLAGS here: - " -G " // HACK FIXME + " -G " // HACK FIXME (for CUDA) "-I%s/src " // include source directory "-o %s/c/%02x/%s%s " // *.o output file "-c %s/c/%02x/%s.cu " // *.cu input file diff --git a/cmake_modules/GraphBLAS_version.cmake b/cmake_modules/GraphBLAS_version.cmake index 5ab05a5dd1..0c4d85c4c4 100644 --- a/cmake_modules/GraphBLAS_version.cmake +++ b/cmake_modules/GraphBLAS_version.cmake @@ -8,10 +8,10 @@ #------------------------------------------------------------------------------- # version of SuiteSparse:GraphBLAS -set ( GraphBLAS_DATE "Apr XX, 2024" ) +set ( GraphBLAS_DATE "May XX, 2024" ) # FIXME NOW set ( GraphBLAS_VERSION_MAJOR 9 CACHE STRING "" FORCE ) -set ( GraphBLAS_VERSION_MINOR 1 CACHE STRING "" FORCE ) -set ( GraphBLAS_VERSION_SUB 2 CACHE STRING "" FORCE ) +set ( GraphBLAS_VERSION_MINOR 2 CACHE STRING "" FORCE ) +set ( GraphBLAS_VERSION_SUB 0 CACHE STRING "" FORCE ) # GraphBLAS C API Specification version, at graphblas.org set ( GraphBLAS_API_DATE "Dec 22, 2023" ) From a932de773efb7cc413ff6b8b313673b8ccdeb4d2 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Mon, 20 May 2024 10:02:37 -0500 Subject: [PATCH 63/76] MATLAB tests --- Test/GB_mex_test7.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Test/GB_mex_test7.c b/Test/GB_mex_test7.c index cffd16f7aa..fd5c0c78bb 100644 --- a/Test/GB_mex_test7.c +++ b/Test/GB_mex_test7.c @@ -44,15 +44,15 @@ void mexFunction OK (GrB_Scalar_new (&s, GrB_INT64)) ; OK (GrB_Scalar_setElement_INT64 (s, 0)) ; - OK (GrB_Global_set_Scalar (GrB_GLOBAL, s, GxB_HYPER_HASH)) ; + OK (GrB_Global_set_Scalar (GrB_GLOBAL, s, (GrB_Field) GxB_HYPER_HASH)) ; OK (GrB_Scalar_clear (s)) ; - OK (GrB_Global_get_Scalar (GrB_GLOBAL, s, GxB_HYPER_HASH)) ; + OK (GrB_Global_get_Scalar (GrB_GLOBAL, s, (GrB_Field) GxB_HYPER_HASH)) ; int64_t i = 1 ; OK (GrB_Scalar_extractElement_INT64 (&i, s)) ; CHECK (i == 0) ; OK (GrB_Matrix_new (&A, GrB_FP64, 100, 100)) ; - OK (GxB_Matrix_Option_set (A, GxB_SPARSITY_CONTROL, GxB_HYPERSPARSE)) ; + OK (GxB_Matrix_Option_set (A, GxB_SPARSITY_CONTROL, (GrB_Field) GxB_HYPERSPARSE)) ; OK (GrB_Matrix_setElement_FP64 (A, (double) 1.2, 0, 0)) ; OK (GrB_Matrix_wait (A, 1)) ; OK (GxB_Matrix_fprint (A, "A valid", 3, NULL)) ; @@ -297,9 +297,9 @@ void mexFunction //-------------------------------------------------------------------------- OK (GrB_Scalar_setElement_INT64 (s, 1024)) ; - OK (GrB_Global_set_Scalar (GrB_GLOBAL, s, GxB_HYPER_HASH)) ; + OK (GrB_Global_set_Scalar (GrB_GLOBAL, s, (GrB_Field) GxB_HYPER_HASH)) ; OK (GrB_Scalar_clear (s)) ; - OK (GrB_Global_get_Scalar (GrB_GLOBAL, s, GxB_HYPER_HASH)) ; + OK (GrB_Global_get_Scalar (GrB_GLOBAL, s, (GrB_Field) GxB_HYPER_HASH)) ; OK (GrB_Scalar_extractElement_INT64 (&i, s)) ; CHECK (i == 1024) ; OK (GrB_Scalar_free (&s)) ; From 117c00bd761fc6f9a4fd9dd1337064a0f6d754cb Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Mon, 20 May 2024 15:13:47 -0500 Subject: [PATCH 64/76] testing --- Test/testall.m | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/Test/testall.m b/Test/testall.m index 50cec10f01..d2e229363d 100644 --- a/Test/testall.m +++ b/Test/testall.m @@ -14,6 +14,7 @@ function testall (threads,longtests) % SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. % SPDX-License-Identifier: Apache-2.0 +GrB.init ; GB_mex_init ; testall_time = tic ; @@ -140,13 +141,11 @@ function testall (threads,longtests) logstat ('test254' ,t, j440, f100) ; %% mask types logstat ('test253' ,t, j4 , f1 ) ; % basic JIT tests logstat ('test252' ,t, j4 , f1 ) ; % basic tests -%ogstat ('test251' ,t, j404, f110) ; % dot4, dot2, with plus_pair logstat ('test251' ,t, j44 , f10 ) ; % dot4, dot2, with plus_pair logstat ('test249' ,t, j4 , f1 ) ; % GxB_Context object logstat ('test247' ,t, j4 , f1 ) ; % GrB_mxm: fine Hash method logstat ('test246' ,t, j4 , f1 ) ; % GrB_mxm parallelism (slice_balanced) -%ogstat ('test01' ,t, j44 , f10 ) ; % error handling logstat ('test01' ,t, j4 , f1 ) ; % error handling logstat ('test245' ,t, j40 , f11 ) ; % test complex row/col scale logstat ('test199' ,t, j4 , f1 ) ; % test dot2 with hypersparse @@ -166,7 +165,6 @@ function testall (threads,longtests) logstat ('test256' ,t, j4 , f0 ) ; % JIT error handling logstat ('test186' ,t, j40 , f11 ) ; % saxpy, all formats (slice_balanced) logstat ('test186(0)' ,t, j4 , f1 ) ; % repeat with default slice_balanced -%ogstat ('test150' ,t, j40 , f10 ) ; %% mxm zombies, typecasting (dot3,saxpy) logstat ('test150' ,t, j0 , f0 ) ; %% mxm zombies, typecasting (dot3,saxpy) hack (2) = 0 ; GB_mex_hack (hack) ; % re-enable the Werk stack @@ -181,7 +179,6 @@ function testall (threads,longtests) logstat ('test179' ,t, j44 , f10 ) ; % test bitmap select logstat ('test174' ,t, j4 , f1 ) ; % test GrB_assign C=A logstat ('test155' ,t, j4 , f1 ) ; % test GrB_*_setElement, removeElement -%ogstat ('test156' ,t, j44 , f10 ) ; % test GrB_assign C=A with typecasting logstat ('test136' ,s, j4 , f1 ) ; % subassignment special cases logstat ('test02' ,t, j4 , f1 ) ; % matrix copy and dup tests logstat ('test109' ,t, j404, f110) ; % terminal monoid with user-defined type @@ -189,11 +186,9 @@ function testall (threads,longtests) logstat ('test207' ,t, j4 , f1 ) ; % test iso subref logstat ('test221' ,t, j4 , f1 ) ; % test C += A, C is bitmap and A is full logstat ('test162' ,t, j4 , f1 ) ; % test C=A*B with very sparse M -%ogstat ('test159' ,t, j40 , f10 ) ; %% test A*B logstat ('test159' ,t, j0 , f0 ) ; %% test A*B logstat ('test09' ,t, j4 , f1 ) ; % duplicate I,J test of GB_mex_subassign logstat ('test132' ,t, j4 , f1 ) ; % setElement -%ogstat ('test141' ,t, j404, f110) ; % eWiseAdd with dense matrices logstat ('test141' ,t, j0 , f1 ) ; % eWiseAdd with dense matrices logstat ('testc2(1,1)',t, j44 , f10 ) ; % complex tests (quick case, builtin) logstat ('test214' ,t, j4 , f1 ) ; % test C=A'*B (tricount) @@ -216,10 +211,8 @@ function testall (threads,longtests) hack (2) = 1 ; GB_mex_hack (hack) ; % disable the Werk stack -%ogstat ('test14' ,t, j404, f110) ; % GrB_reduce logstat ('test14' ,t, j44 , f10 ) ; % GrB_reduce logstat ('test180' ,s, j4 , f1 ) ; % test assign and subassign (1 thread) -%ogstat ('test180' ,t, j4 , f1 ) ; % test assign and subassign (4 threads) logstat ('test236' ,t, j4 , f1 ) ; % test GxB_Matrix_sort, GxB_Vector_sort hack (2) = 0 ; GB_mex_hack (hack) ; % re-enable the Werk stack @@ -239,7 +232,6 @@ function testall (threads,longtests) logstat ('test154' ,t, j40 , f11 ) ; % apply with binop and scalar binding logstat ('test238' ,t, j44 , f10 ) ; % test GrB_mxm (dot4 and dot2) -%ogstat ('test151b' ,t, j404, f110) ; % test bshift operator logstat ('test151b' ,t, j4 , f1 ) ; % test bshift operator logstat ('test184' ,t, j4 , f1 ) ; % special cases: mxm, transpose, build logstat ('test191' ,t, j40 , f10 ) ; %% test split @@ -283,7 +275,6 @@ function testall (threads,longtests) logstat ('test176' ,t, j4 , f1 ) ; % test GrB_assign, method 09, 11 logstat ('test208' ,t, j4 , f1 ) ; % test iso apply, bind 1st and 2nd logstat ('test216' ,t, j4 , f1 ) ; % test C=A, iso case -%ogstat ('test142' ,t, j4040, f1100) ; %% test GrB_assign with accum logstat ('test142' ,t, j040, f100) ; %% test GrB_assign with accum logstat ('test137' ,s, j40 , f11 ) ; % GrB_eWiseMult, FIRST and SECOND logstat ('test139' ,s, j4 , f1 ) ; % merge sort, special cases @@ -318,23 +309,17 @@ function testall (threads,longtests) logstat ('test200' ,t, j4 , f1 ) ; % test iso full matrix multiply logstat ('test197' ,t, j4 , f1 ) ; % test large sparse split logstat ('test84' ,t, j4 , f1 ) ; % GrB_assign (row/col with C CSR/CSC) -%ogstat ('test19b' ,t, j4 , f1 ) ; % GrB_assign, many pending operators logstat ('test19b' ,s, j4 , f1 ) ; % GrB_assign, many pending operators logstat ('test133' ,t, j4 , f1 ) ; % test mask operations (GB_masker) logstat ('test80' ,t, j4 , f1 ) ; % test GrB_mxm on all semirings -%ogstat ('test151' ,t, j44 , f10 ) ; % test bitwise operators -%ogstat ('test23' ,t, j40 , f11 ) ; % quick test of GB_*_build logstat ('test23' ,t, j0 , f1 ) ; % quick test of GB_*_build logstat ('test135' ,t, j4 , f1 ) ; % reduce to scalar -%ogstat ('test160' ,s, j40 , f11 ) ; % test A*B, single threaded logstat ('test160' ,s, j0 , f1 ) ; % test A*B, single threaded logstat ('test54' ,t, j4 , f1 ) ; % assign and extract with begin:inc:end logstat ('test129' ,t, j4 , f1 ) ; % test GxB_select (tril, nonz, hyper) logstat ('test69' ,t, j4 , f1 ) ; % assign and subassign with alias logstat ('test230' ,t, j4 , f1 ) ; % test apply with idxunops -%ogstat ('test74' ,t, j40 , f11 ) ; % test GrB_mxm on all semirings logstat ('test74' ,t, j0 , f1 ) ; % test GrB_mxm on all semirings -%ogstat ('test127' ,t, j40 , f11 ) ; % test eWiseAdd, eWiseMult logstat ('test127' ,t, j0 , f1 ) ; % test eWiseAdd, eWiseMult logstat ('test19' ,t, j4 , f1 ) ; % GxB_subassign, many pending operators @@ -345,14 +330,10 @@ function testall (threads,longtests) logstat ('test11' ,t, j4 , f1 ) ; % exhaustive test of GrB_extractTuples logstat ('test215' ,t, j4 , f1 ) ; % test C=A'*B (dot2, ANY_PAIR) logstat ('test193' ,t, j4 , f1 ) ; % test GxB_Matrix_diag -%ogstat ('test195' ,t, j0 , f1 ) ; % all variants of saxpy3 slice_balanced logstat ('test195' ,t, j4 , f1 ) ; % all variants of saxpy3 slice_balanced -%ogstat ('test233' ,t, j4 , f1 ) ; % bitmap saxpy C=A*B, A sparse, B bitmap logstat ('test243' ,t, j4 , f1 ) ; % test GxB_Vector_Iterator -%ogstat ('test29' ,t, j40 , f11 ) ; % reduce with zombies logstat ('test29' ,t, j0 , f1 ) ; % reduce with zombies -%ogstat ('testc2(0,0)',t, j404, f110) ; % A'*B, A+B, A*B, user-defined complex logstat ('testc2(0,0)',t, j04, f10 ) ; % A'*B, A+B, A*B, user-defined complex logstat ('testc4(0)' ,t, j4 , f1 ) ; % extractElement, setElement, user type logstat ('testc7(0)' ,t, j4 , f1 ) ; % assign, builtin complex @@ -369,7 +350,6 @@ function testall (threads,longtests) logstat ('test53' ,t, j4 , f1 ) ; % quick test of GB_mex_Matrix_extract logstat ('test17' ,t, j4 , f1 ) ; % quick test of GrB_*_extractElement -%ogstat ('test231' ,t, j0 , f1 ) ; % test GrB_select with idxunp logstat ('test231' ,t, j4 , f1 ) ; % test GrB_select with idxunp %---------------------------------------- From 35d9a47d5976f12e93e4c6596d10e603686d9025 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Mon, 20 May 2024 18:20:11 -0500 Subject: [PATCH 65/76] testing --- CMakeLists.txt | 4 +-- Doc/GraphBLAS_UserGuide.tex | 32 ++++++++++++++---- GraphBLAS/.gitignore | 2 -- GraphBLAS/@GrB/private/.gitignore | 1 + GraphBLAS/GraphBLAS_MATLAB_OpenMP.cmake | 1 + GraphBLAS/graphblas_install.m | 44 ++++++++++++++++--------- Tcov/Makefile | 4 +-- Tcov/grbcover.m | 16 +++++---- Test/test75b.m | 1 + 9 files changed, 71 insertions(+), 34 deletions(-) delete mode 100644 GraphBLAS/.gitignore create mode 100644 GraphBLAS/@GrB/private/.gitignore create mode 100644 GraphBLAS/GraphBLAS_MATLAB_OpenMP.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 2b7a00994b..c74b8d17f2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,8 +41,8 @@ if ( NOT BUILD_SHARED_LIBS ) endif ( ) # CUDA is under development for now, and not deployed in production: -# set ( GRAPHBLAS_USE_CUDA OFF ) % FIXME NOW - set ( GRAPHBLAS_USE_CUDA ON ) + set ( GRAPHBLAS_USE_CUDA OFF ) +# set ( GRAPHBLAS_USE_CUDA ON ) # FIXME: use this for CUDA development include ( SuiteSparsePolicy ) diff --git a/Doc/GraphBLAS_UserGuide.tex b/Doc/GraphBLAS_UserGuide.tex index 29e311cae0..945b6672fd 100644 --- a/Doc/GraphBLAS_UserGuide.tex +++ b/Doc/GraphBLAS_UserGuide.tex @@ -14057,7 +14057,7 @@ \subsection{Quick Start} %---------------------------------------- A \verb'cmake' build system is available for Linux, Mac, and Windows. -For Linux or Mac, a simple Makefile wrapper is availble. Simple do: +For Linux or Mac, a simple Makefile wrapper is availble. Simply do: {\small \begin{verbatim} @@ -14071,15 +14071,15 @@ \subsection{Quick Start} MATLAB interface has been added. In the MATLAB/Octave Command Window, simply type: - {\small \begin{verbatim} cd GraphBLAS/GraphBLAS graphblas_install \end{verbatim} } -This will use \verb'cmake' to compile the GraphBLAS library. You can skip -the details in the remainder of this section. Next, add your \verb'GraphBLAS/GraphBLAS' -folder to your path, by editting your \verb'startup.m' script. Add this line: +This will use \verb'cmake' to compile the GraphBLAS library. You can skip the +details in the remainder of this section. Next, add your +\verb'GraphBLAS/GraphBLAS' folder to your path, by editting your +\verb'startup.m' script. Add this line: {\small \begin{verbatim} @@ -14089,7 +14089,27 @@ \subsection{Quick Start} where \verb'/home/me/GraphBLAS' is the top-level folder containing your copy of GraphBLAS. -After \verb'make' in the top-level directory to compile the library, type +The \verb'graphblas_install' MATLAB script may fail to run \verb'cmake'. +If it does, it will print the following workaround, where the commands it +tells you to use will differ depending on the platform: + + {\small + \begin{verbatim} + Building GraphBLAS with cmake failed. Try this outside of MATLAB: + + cmake .. + cmake --build . --config Release -j40 + + Then do this inside MATLAB: + + cd /home/me/GraphBLAS/GraphBLAS/@GrB/private + gbmake \end{verbatim} } + +\noindent +where \verb'/home/me/GraphBLAS' is your copy of GraphBLAS. + +After building the GraphBLAS library with \verb'cmake' and its MATLAB +interface with \verb'gbmake', type \verb'make demo' to run the demos (also in the top-level directory). The output of the demos will be compared with expected output files in \verb'Demo/Output'. diff --git a/GraphBLAS/.gitignore b/GraphBLAS/.gitignore deleted file mode 100644 index 4a8f695ad4..0000000000 --- a/GraphBLAS/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Ignore the configured file for cmake: -GraphBLAS_MATLAB_OpenMP.cmake diff --git a/GraphBLAS/@GrB/private/.gitignore b/GraphBLAS/@GrB/private/.gitignore new file mode 100644 index 0000000000..af86b0481a --- /dev/null +++ b/GraphBLAS/@GrB/private/.gitignore @@ -0,0 +1 @@ +GraphBLAS_MATLAB_OpenMP.cmake diff --git a/GraphBLAS/GraphBLAS_MATLAB_OpenMP.cmake b/GraphBLAS/GraphBLAS_MATLAB_OpenMP.cmake new file mode 100644 index 0000000000..733bddc784 --- /dev/null +++ b/GraphBLAS/GraphBLAS_MATLAB_OpenMP.cmake @@ -0,0 +1 @@ +target_link_libraries ( graphblas_matlab PRIVATE ${OpenMP_C_LIBRARIES} ) diff --git a/GraphBLAS/graphblas_install.m b/GraphBLAS/graphblas_install.m index d720631d14..20879c8564 100644 --- a/GraphBLAS/graphblas_install.m +++ b/GraphBLAS/graphblas_install.m @@ -65,14 +65,8 @@ function graphblas_install (cmake_options) cd ../build end - % configure with cmake - cmd = sprintf ('cmake %s ..', cmake_options) ; - fprintf ('\n================================\n%s\n', cmd) ; - [status, result] = system (cmd, '-echo') ; - if (status ~= 0) - cd (here) ; - error ('GrB:mex', 'GraphBLAS library not compiled') ; - end + % cmd1: configure with cmake + cmd1 = sprintf ('cmake %s ..', cmake_options) ; % build the GraphBLAS library if (ispc) @@ -81,25 +75,43 @@ function graphblas_install (cmake_options) else library = 'graphblas' ; end - cmd = sprintf ('devenv %s.sln /build "release|x64" /project %s', ... + cmd2 = sprintf ('devenv %s.sln /build "release|x64" /project %s', ... library, library) ; else - cmd = sprintf ('cmake --build . --config Release -j%d', threads) ; + cmd2 = sprintf ('cmake --build . --config Release -j%d', threads) ; end - fprintf ('\n================================\n%s\n', cmd) ; - [status, result] = system (cmd, '-echo') ; - cd (here) ; + + % execute cmd1: configure with cmake + fprintf ('\n================================\n%s\n', cmd1) ; + [status, result] = system (cmd1, '-echo') ; if (status ~= 0) + cd (here) ; error ('GrB:mex', 'GraphBLAS library not compiled') ; end - % build the GraphBLAS MATLAB interface - cd '@GrB/private' - gbmake + % execute cmd2: build the GraphBLAS library + fprintf ('\n================================\n%s\n', cmd2) ; + [status, result] = system (cmd2, '-echo') ; + cd (here) ; + if (status ~= 0) + error ('GrB:mex', 'GraphBLAS library not compiled') ; + end catch me me + fprintf ('Building GraphBLAS with cmake failed. Try this outside of MATLAB:\n') ; + fprintf ('\n %s\n', cmd1) ; + fprintf (' %s\n', cmd2) ; + cd (here) ; + + fprintf ('\nThen do this inside MATLAB:\n\n') ; + fprintf (' cd %s/@GrB/private\n gbmake\n', here) ; + return ; end +% build the GraphBLAS MATLAB interface +cd '@GrB/private' +gbmake + cd (here) ; diff --git a/Tcov/Makefile b/Tcov/Makefile index 30a68a9807..3fe2276993 100644 --- a/Tcov/Makefile +++ b/Tcov/Makefile @@ -37,11 +37,11 @@ SO_OPTS = $(LDFLAGS) ifeq ($(UNAME),Darwin) # Mac SO_NAME = libgraphblas_tcov.dylib - SO_OPTS += -dynamiclib -shared -Wl,-install_name -Wl,$(SO_NAME) -undefined dynamic_lookup + SO_OPTS += -dynamiclib -shared -Wl,-install_name -Wl,$(SO_NAME) -undefined dynamic_lookup -Wl,'-rpath .' else # Linux SO_NAME = libgraphblas_tcov.so - SO_OPTS += -shared -Wl,-soname -Wl,$(SO_NAME) -Wl,--no-undefined + SO_OPTS += -shared -Wl,-soname -Wl,$(SO_NAME) -Wl,--no-undefined -Wl,-rpath=. endif default: $(SO_NAME) diff --git a/Tcov/grbcover.m b/Tcov/grbcover.m index 5438273d15..a27ee5f293 100644 --- a/Tcov/grbcover.m +++ b/Tcov/grbcover.m @@ -84,16 +84,19 @@ function grbcover (what) libraries = sprintf ('-L%s -lgraphblas_tcov', pwd) ; +rpath = '' ; if (ismac) - % Mac (do 'make install' for GraphBLAS first) -% flags = [ flags ' CFLAGS="$CXXFLAGS -Xpreprocessor -fopenmp" ' ] ; -% flags = [ flags ' CXXFLAGS="$CXXFLAGS -Xpreprocessor -fopenmp" ' ] ; -% flags = [ flags ' LDFLAGS="$LDFLAGS -fopenmp"' ] ; -else + rpath = '-rpath ' ; +elseif (isunix) + rpath = '-rpath=' ; +end + +if (ismac || isunix) % Linux + rpath = sprintf (' -Wl,%s''''%s'''' ', rpath, pwd) ; flags = [ flags ' CFLAGS="$CXXFLAGS -fopenmp -fPIC -Wno-pragmas" '] ; flags = [ flags ' CXXFLAGS="$CXXFLAGS -fopenmp -fPIC -Wno-pragmas" '] ; - flags = [ flags ' LDFLAGS="$LDFLAGS -fopenmp -fPIC" '] ; + flags = [ flags ' LDFLAGS=''$LDFLAGS -fopenmp -fPIC ' rpath ' '' '] ; end dryrun = false ; @@ -175,6 +178,7 @@ function grbcover (what) flags, inc, mexfunction, objlist, libraries) ; fprintf ('.', mexfunction) ; % fprintf ('%s\n', mexfunction) ; + % fprintf ('%s\n', mexcmd) ; if (dryrun) fprintf ('%s\n', mexcmd) ; else diff --git a/Test/test75b.m b/Test/test75b.m index 1b54b006ad..ff5c04702c 100644 --- a/Test/test75b.m +++ b/Test/test75b.m @@ -4,6 +4,7 @@ % SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. % SPDX-License-Identifier: Apache-2.0 +fprintf ('test75b: test mxm and vxm on all semirings\n') ; [binops, ~, add_ops, types, ~, ~] = GB_spec_opsall ; % mult_ops = binops.positional mult_ops = binops.all ; From 13798ee595c2eeada8f61adb4f4e56c205a40e51 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Mon, 20 May 2024 18:30:00 -0500 Subject: [PATCH 66/76] . --- Tcov/Makefile | 2 +- Tcov/grbcover.m | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Tcov/Makefile b/Tcov/Makefile index 3fe2276993..c32b000fb8 100644 --- a/Tcov/Makefile +++ b/Tcov/Makefile @@ -37,7 +37,7 @@ SO_OPTS = $(LDFLAGS) ifeq ($(UNAME),Darwin) # Mac SO_NAME = libgraphblas_tcov.dylib - SO_OPTS += -dynamiclib -shared -Wl,-install_name -Wl,$(SO_NAME) -undefined dynamic_lookup -Wl,'-rpath .' + SO_OPTS += -dynamiclib -shared -Wl,-install_name -Wl,$(SO_NAME) -undefined dynamic_lookup else # Linux SO_NAME = libgraphblas_tcov.so diff --git a/Tcov/grbcover.m b/Tcov/grbcover.m index a27ee5f293..c55bfefe9e 100644 --- a/Tcov/grbcover.m +++ b/Tcov/grbcover.m @@ -91,9 +91,14 @@ function grbcover (what) rpath = '-rpath=' ; end -if (ismac || isunix) +rpath = sprintf (' -Wl,%s''''%s'''' ', rpath, pwd) ; +if (ismac) + % Mac + flags = [ flags ' CFLAGS="$CXXFLAGS -fPIC -Wno-pragmas" '] ; + flags = [ flags ' CXXFLAGS="$CXXFLAGS -fPIC -Wno-pragmas" '] ; + flags = [ flags ' LDFLAGS=''$LDFLAGS -fPIC ' rpath ' '' '] ; +elseif (isunix) % Linux - rpath = sprintf (' -Wl,%s''''%s'''' ', rpath, pwd) ; flags = [ flags ' CFLAGS="$CXXFLAGS -fopenmp -fPIC -Wno-pragmas" '] ; flags = [ flags ' CXXFLAGS="$CXXFLAGS -fopenmp -fPIC -Wno-pragmas" '] ; flags = [ flags ' LDFLAGS=''$LDFLAGS -fopenmp -fPIC ' rpath ' '' '] ; From b95a70408dafa658dae294136b8694f6a2daef20 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Mon, 20 May 2024 18:54:09 -0500 Subject: [PATCH 67/76] . --- Test/GB_mx_at_exit.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Test/GB_mx_at_exit.c b/Test/GB_mx_at_exit.c index be54cfb2eb..26ab05f9e7 100644 --- a/Test/GB_mx_at_exit.c +++ b/Test/GB_mx_at_exit.c @@ -17,6 +17,8 @@ void GB_mx_at_exit ( void ) // Finalize GraphBLAS, clearing all JIT kernels and freeing the hash table. // MATLAB can only use GraphBLAS if GrB_init / GxB_init is called again. + GB_Global_persistent_set (mexMakeMemoryPersistent) ; + // The call to GB_Global_GrB_init_called_set allows GrB_init or GxB_init to // be called again. This is an extension to the spec that is possible with // SuiteSparse:GraphBLAS but not available via a documented function. From 919a046d80131fb426a9665c3e58e481ae36b74c Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 21 May 2024 10:25:24 -0500 Subject: [PATCH 68/76] Intel MAC: using MATLAB libiomp5.dylib --- GraphBLAS/GraphBLAS_MATLAB_OpenMP.cmake | 2 +- GraphBLAS/graphblas_install.m | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/GraphBLAS/GraphBLAS_MATLAB_OpenMP.cmake b/GraphBLAS/GraphBLAS_MATLAB_OpenMP.cmake index 733bddc784..ab776f06ac 100644 --- a/GraphBLAS/GraphBLAS_MATLAB_OpenMP.cmake +++ b/GraphBLAS/GraphBLAS_MATLAB_OpenMP.cmake @@ -1 +1 @@ -target_link_libraries ( graphblas_matlab PRIVATE ${OpenMP_C_LIBRARIES} ) +target_link_libraries ( graphblas_matlab PRIVATE /Applications/MATLAB_R2022a.app/sys/os/maci64/libiomp5.dylib ) diff --git a/GraphBLAS/graphblas_install.m b/GraphBLAS/graphblas_install.m index 20879c8564..d25334b065 100644 --- a/GraphBLAS/graphblas_install.m +++ b/GraphBLAS/graphblas_install.m @@ -38,9 +38,16 @@ function graphblas_install (cmake_options) openmp_library = '${OpenMP_C_LIBRARIES}' ; if (ismac) % use the OpenMP library inside MATLAB + % look for libomp.dylib for Apple Silicon Macs o = [matlabroot '/bin/maca64/libomp.dylib'] ; if (isfile (o)) openmp_library = o ; + else + % look for libiomp5.dylib for Intel Macs + o = [matlabroot '/sys/os/maci64/libiomp5.dylib'] ; + if (isfile (o)) + openmp_library = o ; + end end end From 4ed8183e9495e1182913c43b214de4ee10c78936 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 21 May 2024 14:58:37 -0500 Subject: [PATCH 69/76] testing --- Test/test10.m | 1 + Test/test75b.m | 1 + 2 files changed, 2 insertions(+) diff --git a/Test/test10.m b/Test/test10.m index 0562168e67..8980d636a9 100644 --- a/Test/test10.m +++ b/Test/test10.m @@ -98,6 +98,7 @@ fprintf ('\n') ; end fprintf (' %s', op.opname) ; + GB_mex_finalize ; for k3 = 1:length(types) op.optype = types {k3} ; diff --git a/Test/test75b.m b/Test/test75b.m index ff5c04702c..1d364260f2 100644 --- a/Test/test75b.m +++ b/Test/test75b.m @@ -92,6 +92,7 @@ for k1 = 1:length(mult_ops) mulop = mult_ops {k1} ; fprintf ('\n%-10s ', mulop) ; + GB_mex_finalize ; for k2 = 1:length(add_ops) addop = add_ops {k2} ; From 5e9a6ef2d8f79da142c9d938c4b4694919c85164 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 21 May 2024 15:11:02 -0500 Subject: [PATCH 70/76] matlab --- GraphBLAS/GraphBLAS_MATLAB_OpenMP.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GraphBLAS/GraphBLAS_MATLAB_OpenMP.cmake b/GraphBLAS/GraphBLAS_MATLAB_OpenMP.cmake index ab776f06ac..733bddc784 100644 --- a/GraphBLAS/GraphBLAS_MATLAB_OpenMP.cmake +++ b/GraphBLAS/GraphBLAS_MATLAB_OpenMP.cmake @@ -1 +1 @@ -target_link_libraries ( graphblas_matlab PRIVATE /Applications/MATLAB_R2022a.app/sys/os/maci64/libiomp5.dylib ) +target_link_libraries ( graphblas_matlab PRIVATE ${OpenMP_C_LIBRARIES} ) From bebbb8d2314ab227cb5fbe7d1d50459dd0535fb6 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 21 May 2024 15:33:28 -0500 Subject: [PATCH 71/76] MATLAB installation --- GraphBLAS/graphblas_install.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GraphBLAS/graphblas_install.m b/GraphBLAS/graphblas_install.m index d25334b065..af6fd1f69a 100644 --- a/GraphBLAS/graphblas_install.m +++ b/GraphBLAS/graphblas_install.m @@ -73,6 +73,7 @@ function graphblas_install (cmake_options) end % cmd1: configure with cmake + build_folder = pwd ; cmd1 = sprintf ('cmake %s ..', cmake_options) ; % build the GraphBLAS library @@ -107,8 +108,7 @@ function graphblas_install (cmake_options) catch me me fprintf ('Building GraphBLAS with cmake failed. Try this outside of MATLAB:\n') ; - fprintf ('\n %s\n', cmd1) ; - fprintf (' %s\n', cmd2) ; + fprintf ('\n cd %s\n %s\n %s\n', build_folder, cmd1, cmd2) ; cd (here) ; fprintf ('\nThen do this inside MATLAB:\n\n') ; From b2ec3b4cde35b868d94394179b9e7b2bdf1d5770 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 21 May 2024 16:05:45 -0500 Subject: [PATCH 72/76] user guide --- Doc/GraphBLAS_UserGuide.pdf | Bin 1147889 -> 1115099 bytes Doc/GraphBLAS_UserGuide.tex | 180 ++++++++++++------------------------ 2 files changed, 58 insertions(+), 122 deletions(-) diff --git a/Doc/GraphBLAS_UserGuide.pdf b/Doc/GraphBLAS_UserGuide.pdf index 43af8548985db28770570bd476261069579afab0..753194f8e6f322f5229c53c4abfe3b36d7d48017 100644 GIT binary patch delta 695310 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 z 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%0A1gyJ z1-6-wb$lCk8Bq304ROqB-^)FqMg)q%OnFI+rV zPS4CeY?V(Q#tAaXd~%OVQq!g^x~{HJ&XQsz-PF{i=nC@5t`ZFv!x2`W)Td%r4GNeTu#XT}a{AID`bOBKA0`w`D40}J zGmKHZehGLt=SA|epB?-3z8eA>CDQpX1R)$9NL$qanNjANtKqna4~UztF3|Zi{)GIY zuElGO!vTTTCMk!*@nH&&e>ak*h-)N&UqK3-%Govb_(Q+4=t+o=Nt?0Q*WK3``M&6@ zp$7`Aq}1+#X~snIfe^`OERhcg2AmEYLmeVJk|A}MSwMo@fU^xagXc(o?L>!75xp;6 zfT8+|%%%ohpvhMfr5;|RkmJJJU*@HTfuR@uYm+}394uP72m=TaQU;J_7zhJUv?Hza zC%dkmkfQ#(C?`Z6HvsrmBpOyZ&v4c*hE)SVRAhOXq`1R^*XqqYe3Sokz1N=t>^|XO zq8O>T5V4=MTNuHgjeh|IB~_M}F^&Ng0XCQ6>jM-5I53xyR0AuQ8l(Y80%e@fM&+pkjQ>V=8ByVn;e%P@*vRTuJZt*2ol zGt*U5H>!AmL0PFz)z`=ahx-YVd7MpU9&<0{5p3043fbqKYJtZk{QxHTVeLe=aJMXS zcfBmAg+j)EZ*HBd&7MY@c2G?%O6s+u1GI=r4ibf;w{C?YS2cQbvDSA31g0KKf95yT zWOk zp3md?jfbu&OVBAS4q{kbwYx!Bk>U`5 zy4iJrVoy^6(~hFd&@gs&X@xZte?#V;{`r>1EAdrhzn=�|V;^Rp)~O!8A3EU6J54 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 )} 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�Y;pNhwi7QZ=w4 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 WAQ+Pvl?BMd&4WxuC9Wue{Qm(*aoIQk delta 726588 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≻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 YU7tUm{>qALK8u`m^$k1UGG&--&3sxAg#20 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�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�VjOZ=LNh*uDOGtRT*;cm8wwO84+OH7m}; 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 Date: Wed, 22 May 2024 06:37:58 -0500 Subject: [PATCH 73/76] testing --- Tcov/grbshow.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Tcov/grbshow.m b/Tcov/grbshow.m index d312cd719e..44e28f1ecf 100644 --- a/Tcov/grbshow.m +++ b/Tcov/grbshow.m @@ -38,7 +38,9 @@ ~isempty (strfind (cline, '++'))) % got one; get the count k1 = strfind (cline, '[') ; + k1 = k1 (1) ; k2 = strfind (cline, ']') ; + k2 = k2 (1) ; s = cline (k1+1:k2-1) ; i = str2num (s) + 1 ; c = GraphBLAS_grbcov (i) ; From 5a27b442beab42f6ce0bf3d49dfe5fb4c965ca54 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 22 May 2024 08:13:35 -0500 Subject: [PATCH 74/76] testing --- Source/GB_jitifyer.c | 38 ++++++++++++++++---------------------- Test/GB_spec_compare.m | 10 ++++++++-- Test/isequal_roundoff.m | 8 +++++--- Test/test243.m | 6 +++--- 4 files changed, 32 insertions(+), 30 deletions(-) diff --git a/Source/GB_jitifyer.c b/Source/GB_jitifyer.c index c3e74e61e4..895d556b47 100644 --- a/Source/GB_jitifyer.c +++ b/Source/GB_jitifyer.c @@ -28,7 +28,12 @@ typedef GB_JIT_KERNEL_USER_TYPE_PROTO ((*GB_user_type_f)) ; // The strings are used to create filenames and JIT compilation commands. +#ifdef GBCOVER +// use a smaller JIT table size during test coverage +#define GB_JITIFIER_INITIAL_SIZE (1024) +#else #define GB_JITIFIER_INITIAL_SIZE (32*1024) +#endif static GB_jit_entry *GB_jit_table = NULL ; static int64_t GB_jit_table_size = 0 ; // always a power of 2 @@ -146,8 +151,8 @@ static void check_table (void) #define GB_MALLOC_PERSISTENT(X,siz) \ { \ X = GB_Global_persistent_malloc (siz) ; \ - printf ("persistent malloc (%4d): %p size %lu\n", /* MEMDUMP */ \ - __LINE__, X, siz) ; \ + printf ("persistent malloc (%4d): %p size %g\n", /* MEMDUMP */ \ + __LINE__, X, (double) siz) ; \ } #define GB_FREE_PERSISTENT(X) \ @@ -1417,7 +1422,7 @@ bool GB_jitifyer_query //-------------------------------------------------------------------------- int version [3] ; - const char *library_defn [5] ; + const char *ldef [5] ; size_t zsize = 0 ; size_t tsize = 0 ; void *id = NULL ; @@ -1454,7 +1459,7 @@ bool GB_jitifyer_query //-------------------------------------------------------------------------- uint64_t hash2 = 0 ; - bool ok = dl_query (&hash2, version, library_defn, id, term, zsize, tsize) ; + bool ok = dl_query (&hash2, version, ldef, id, term, zsize, tsize) ; ok = ok && (version [0] == GxB_IMPLEMENTATION_MAJOR) && (version [1] == GxB_IMPLEMENTATION_MINOR) && (version [2] == GxB_IMPLEMENTATION_SUB) && @@ -1465,29 +1470,18 @@ bool GB_jitifyer_query //-------------------------------------------------------------------------- char *defn [5] ; - defn [0] = (builtin || op1 == NULL) ? NULL : op1->defn ; - defn [1] = (builtin || op2 == NULL) ? NULL : op2->defn ; + defn [0] = (builtin || op1 == NULL) ? NULL : op1->defn ; + defn [1] = (builtin || op2 == NULL) ? NULL : op2->defn ; defn [2] = (builtin || type1 == NULL) ? NULL : type1->defn ; defn [3] = (builtin || type2 == NULL) ? NULL : type2->defn ; defn [4] = (builtin || type3 == NULL) ? NULL : type3->defn ; for (int k = 0 ; k < 5 ; k++) - { - if ((defn [k] != NULL) != (library_defn [k] != NULL)) - { - // one is not NULL but the other is NULL - ok = false ; - } - else if (defn [k] != NULL) - { - // both definitions are present - // ensure the definition hasn't changed - ok = ok && (strcmp (defn [k], library_defn [k]) == 0) ; - } - else - { - // both definitions are NULL, so they match - } + { + // ensure the definition hasn't changed + ok = ok && (strcmp ( + ((defn [k] == NULL) ? "" : defn [k]), + ((ldef [k] == NULL) ? "" : ldef [k])) == 0) ; } return (ok) ; } diff --git a/Test/GB_spec_compare.m b/Test/GB_spec_compare.m index 3af4f55b05..ec47b9fd3c 100644 --- a/Test/GB_spec_compare.m +++ b/Test/GB_spec_compare.m @@ -7,9 +7,12 @@ % some GraphBLAS method. C_mex = GB_mex_* (...) is the output of the % corresponding interface to the true GraphBLAS method, in C. -% SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. +% SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. % SPDX-License-Identifier: Apache-2.0 +err = 0 ; +anorm = 0 ; + % get the semiring identity if (nargin < 3) identity = 0 ; @@ -43,7 +46,7 @@ try % ok_matrix = isequalwithequalnans (C1.matrix, C2.matrix) ; - ok_matrix = isequal_roundoff (C1.matrix, C2.matrix, tol) ; + [ok_matrix, err, anorm] = isequal_roundoff (C1.matrix, C2.matrix, tol) ; catch ok_matrix = false ; end @@ -84,6 +87,9 @@ fprintf ('matrix: %d pattern: %d class %d\n', ... ok_matrix, ok_pattern, ok_class) ; norm (double (C1.matrix) - double (C2.matrix), 1) + if (~ok_matrix) + fprintf ('err: %g tol %g anorm %g\n', err, tol, anorm) ; + end end % with no output, just assert that ok is true diff --git a/Test/isequal_roundoff.m b/Test/isequal_roundoff.m index 34c2ccb2b4..aa5bfc6fb2 100644 --- a/Test/isequal_roundoff.m +++ b/Test/isequal_roundoff.m @@ -1,11 +1,11 @@ -function ok = isequal_roundoff (A,B,tol) +function [ok, err, anorm] = isequal_roundoff (A,B,tol) %ISEQUAL_ROUNDOFF compare two matrices, allowing for roundoff errors % % returns true if A == B to within relative tolerance tol. % tol = 64*eps if not present. NaNs and Infs are ignored in the % tol, but the NaN and +/-Inf pattern must be the same. -% SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. +% SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. % SPDX-License-Identifier: Apache-2.0 % if (~isequal (GB_spec_type (A), GB_spec_type (B))) @@ -13,6 +13,9 @@ % return ; % end +err = 0 ; +anorm = 0 ; + if (isequalwithequalnans (A, B)) ok = true ; return @@ -49,4 +52,3 @@ end anorm = max (anorm, 1) ; ok = (err == 0) || (err <= tol * anorm) ; - diff --git a/Test/test243.m b/Test/test243.m index ae79b3eb41..740093d145 100644 --- a/Test/test243.m +++ b/Test/test243.m @@ -30,11 +30,11 @@ type = types {k} ; fprintf ('\n%s:\n', type) ; end - + if (test_contains (type, 'single')) - tol = 1e-5 ; + tol = 1e-4 ; elseif (test_contains (type, 'double')) - tol = 1e-11 ; + tol = 1e-9 ; else tol = 0 ; end From 40a5250da69d36dce048d7efe2711516c220de03 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 22 May 2024 21:39:21 -0500 Subject: [PATCH 75/76] 9.2.0.beta1, sanitize JIT cache folder (allow spaces) --- Doc/ChangeLog | 2 +- Doc/GraphBLAS_UserGuide.pdf | Bin 1115099 -> 1115090 bytes Doc/GraphBLAS_UserGuide.tex | 2 +- Doc/GraphBLAS_version.tex | 2 +- GraphBLAS/graphblas_install.m | 21 ++- Include/GraphBLAS.h | 2 +- README.md | 2 +- Source/GB_jitifyer.c | 82 ++++++----- Tcov/log_Apr3.txt | 205 -------------------------- Tcov/log_Apr9.txt | 205 -------------------------- Tcov/log_Mar21.txt | 205 -------------------------- Tcov/log_May22.txt | 205 ++++++++++++++++++++++++++ Test/GB_mex_test11.c | 2 +- cmake_modules/GraphBLAS_version.cmake | 2 +- 14 files changed, 276 insertions(+), 661 deletions(-) delete mode 100644 Tcov/log_Apr3.txt delete mode 100644 Tcov/log_Apr9.txt delete mode 100644 Tcov/log_Mar21.txt create mode 100644 Tcov/log_May22.txt diff --git a/Doc/ChangeLog b/Doc/ChangeLog index 0f0d861f2c..cb71863924 100644 --- a/Doc/ChangeLog +++ b/Doc/ChangeLog @@ -1,4 +1,4 @@ -May XX, 2024: version 9.2.0 FIXME +May 22, 2024: version 9.2.0 * Added graphblas_install.m: for a simpler method of compiling the MATLAB/Octave interface for GraphBLAS. diff --git a/Doc/GraphBLAS_UserGuide.pdf b/Doc/GraphBLAS_UserGuide.pdf index 753194f8e6f322f5229c53c4abfe3b36d7d48017..d7362c512b0048563696c072fd7b1a8b2bd155f0 100644 GIT binary patch delta 13477 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 DS~QVk delta 13493 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 n+zvgbvxBO0{_~Bb-5Xq*S+$ 0) ? - " 2>> " : " 2>&1 " ; + bool have_log = (GB_STRLEN (GB_jit_error_log) > 0) ; + char *err_redirect = have_log ? " 2>> " : " 2>&1 " ; + char *log_quote = have_log ? "\"" : "" ; #if defined (__MINGW32__) #define GB_SH_C "sh -c " @@ -2349,9 +2353,10 @@ void GB_jitifyer_cmake_compile (char *kernel_name, uint64_t hash) // remove any prior build folder for this kernel, and all its contents snprintf (GB_jit_temp, GB_jit_temp_allocated, - GB_SH_C "cmake -E remove_directory \"" GB_BLD_DIR "\" %s %s %s", + GB_SH_C "cmake -E remove_directory \"" GB_BLD_DIR "\" %s %s %s%s%s", GB_jit_cache_path, hash, // build path - burble_stdout, err_redirect, GB_jit_error_log) ; + burble_stdout, err_redirect, + log_quote, GB_jit_error_log, log_quote) ; GB_jitifyer_command (GB_jit_temp) ; // OK: see security comment above // create the build folder for this kernel @@ -2408,33 +2413,34 @@ void GB_jitifyer_cmake_compile (char *kernel_name, uint64_t hash) // generate the build system for this kernel snprintf (GB_jit_temp, GB_jit_temp_allocated, GB_SH_C "cmake -S \"" GB_BLD_DIR "\" -B \"" GB_BLD_DIR "\"" - " -DCMAKE_C_COMPILER=\"%s\" %s %s %s", + " -DCMAKE_C_COMPILER=\"%s\" %s %s %s%s%s", GB_jit_cache_path, hash, // -S source path GB_jit_cache_path, hash, // -B build path GB_jit_C_compiler, // C compiler to use - burble_stdout, err_redirect, GB_jit_error_log) ; + burble_stdout, err_redirect, log_quote, GB_jit_error_log, log_quote) ; GB_jitifyer_command (GB_jit_temp) ; // OK: see security comment above // compile the library for this kernel snprintf (GB_jit_temp, GB_jit_temp_allocated, - GB_SH_C "cmake --build \"" GB_BLD_DIR "\" --config Release %s %s %s", + GB_SH_C "cmake --build \"" GB_BLD_DIR + "\" --config Release %s %s %s%s%s", // can add "--verbose" here too GB_jit_cache_path, hash, // build path - burble_stdout, err_redirect, GB_jit_error_log) ; + burble_stdout, err_redirect, log_quote, GB_jit_error_log, log_quote) ; GB_jitifyer_command (GB_jit_temp) ; // OK: see security comment above // install the library snprintf (GB_jit_temp, GB_jit_temp_allocated, - GB_SH_C "cmake --install \"" GB_BLD_DIR "\" %s %s %s", + GB_SH_C "cmake --install \"" GB_BLD_DIR "\" %s %s %s%s%s", GB_jit_cache_path, hash, // build path - burble_stdout, err_redirect, GB_jit_error_log) ; + burble_stdout, err_redirect, log_quote, GB_jit_error_log, log_quote) ; GB_jitifyer_command (GB_jit_temp) ; // OK: see security comment above // remove the build folder and all its contents snprintf (GB_jit_temp, GB_jit_temp_allocated, - GB_SH_C "cmake -E remove_directory \"" GB_BLD_DIR "\" %s %s %s", + GB_SH_C "cmake -E remove_directory \"" GB_BLD_DIR "\" %s %s %s%s%s", GB_jit_cache_path, hash, // build path - burble_stdout, err_redirect, GB_jit_error_log) ; + burble_stdout, err_redirect, log_quote, GB_jit_error_log, log_quote) ; GB_jitifyer_command (GB_jit_temp) ; // OK: see security comment above #endif @@ -2463,8 +2469,9 @@ void GB_jitifyer_nvcc_compile (char *kernel_name, uint32_t bucket) #if defined ( GRAPHBLAS_HAS_CUDA ) && !defined ( NJIT ) char *burble_stdout = GB_Global_burble_get ( ) ? "" : GB_DEV_NULL ; - char *err_redirect = (GB_STRLEN (GB_jit_error_log) > 0) ? - " 2>> " : " 2>&1 " ; + bool have_log = (GB_STRLEN (GB_jit_error_log) > 0) ; + char *err_redirect = have_log ? " 2>> " : " 2>&1 " ; + char *log_quote = have_log ? "'" : "" ; GBURBLE ("(jit compiling cuda with nvcc: %s/c/%02x/%s.cu) ", GB_jit_cache_path, bucket, kernel_name) ; @@ -2484,30 +2491,30 @@ void GB_jitifyer_nvcc_compile (char *kernel_name, uint32_t bucket) " -fPIC " // FIXME: add GB_CUDA_FLAGS here: " -G " // HACK FIXME (for CUDA) - "-I%s/src " // include source directory - "-o %s/c/%02x/%s%s " // *.o output file - "-c %s/c/%02x/%s.cu " // *.cu input file + "-I '%s/src' " // include source directory + "-o '%s/c/%02x/%s%s' " // *.o output file + "-c '%s/c/%02x/%s.cu' " // *.cu input file "%s " // burble stdout - "%s %s ; " // error log file + "%s %s%s%s ; " // error log file // link: "nvcc " // compiler "-DGB_JIT_RUNTIME=1 " // nvcc flags "-I/usr/local/cuda/include -std=c++17 -arch=sm_60 " " -shared " - "-o %s/lib/%02x/%s%s%s " // lib*.so output file - "%s/c/%02x/%s%s " // *.o input file + "-o '%s/lib/%02x/%s%s%s' " // lib*.so output file + "'%s/c/%02x/%s%s' " // *.o input file " -cudart shared " // "%s " // libraries to link with (any?) "%s " // burble stdout - "%s %s\"", // error log file + "%s %s%s%s\"", // error log file // compile: GB_jit_cache_path, // include source directory (cache/src) GB_jit_cache_path, bucket, kernel_name, GB_OBJ_SUFFIX, // *.o output file GB_jit_cache_path, bucket, kernel_name, // *.cu input file burble_stdout, // burble stdout - err_redirect, GB_jit_error_log, // error log file + err_redirect, log_quote, GB_jit_error_log, log_quote, // error log file // link: GB_jit_cache_path, bucket, @@ -2515,7 +2522,7 @@ void GB_jitifyer_nvcc_compile (char *kernel_name, uint32_t bucket) GB_jit_cache_path, bucket, kernel_name, GB_OBJ_SUFFIX, // *.o input file // GB_jit_C_libraries // libraries to link with burble_stdout, // burble stdout - err_redirect, GB_jit_error_log) ; // error log file + err_redirect, log_quote, GB_jit_error_log, log_quote) ; // error log file // compile the library and return result GBURBLE ("\n(jit: %s) ", GB_jit_temp) ; @@ -2548,8 +2555,9 @@ void GB_jitifyer_direct_compile (char *kernel_name, uint32_t bucket) #ifndef NJIT char *burble_stdout = GB_Global_burble_get ( ) ? "" : GB_DEV_NULL ; - char *err_redirect = (GB_STRLEN (GB_jit_error_log) > 0) ? - " 2>> " : " 2>&1 " ; + bool have_log = (GB_STRLEN (GB_jit_error_log) > 0) ; + char *err_redirect = have_log ? " 2>> " : " 2>&1 " ; + char *log_quote = have_log ? "'" : "" ; snprintf (GB_jit_temp, GB_jit_temp_allocated, @@ -2557,22 +2565,22 @@ void GB_jitifyer_direct_compile (char *kernel_name, uint32_t bucket) "sh -c \"" // execute with POSIX shell "%s " // compiler command "-DGB_JIT_RUNTIME=1 %s " // C flags - "-I%s/src " // include source directory + "-I'%s/src' " // include source directory "%s " // openmp include directories - "-o %s/c/%02x/%s%s " // *.o output file - "-c %s/c/%02x/%s.c " // *.c input file + "-o '%s/c/%02x/%s%s' " // *.o output file + "-c '%s/c/%02x/%s.c' " // *.c input file "%s " // burble stdout - "%s %s ; " // error log file + "%s %s%s%s ; " // error log file // link: "%s " // C compiler "%s " // C flags "%s " // C link flags - "-o %s/lib/%02x/%s%s%s " // lib*.so output file - "%s/c/%02x/%s%s " // *.o input file + "-o '%s/lib/%02x/%s%s%s' " // lib*.so output file + "'%s/c/%02x/%s%s' " // *.o input file "%s " // libraries to link with "%s " // burble stdout - "%s %s\"", // error log file + "%s %s%s%s\"", // error log file // compile: GB_jit_C_compiler, // C compiler @@ -2582,7 +2590,7 @@ void GB_jitifyer_direct_compile (char *kernel_name, uint32_t bucket) GB_jit_cache_path, bucket, kernel_name, GB_OBJ_SUFFIX, // *.o output file GB_jit_cache_path, bucket, kernel_name, // *.c input file burble_stdout, // burble stdout - err_redirect, GB_jit_error_log, // error log file + err_redirect, log_quote, GB_jit_error_log, log_quote, // error log file // link: GB_jit_C_compiler, // C compiler @@ -2593,7 +2601,7 @@ void GB_jitifyer_direct_compile (char *kernel_name, uint32_t bucket) GB_jit_cache_path, bucket, kernel_name, GB_OBJ_SUFFIX, // *.o input file GB_jit_C_libraries, // libraries to link with burble_stdout, // burble stdout - err_redirect, GB_jit_error_log) ; // error log file + err_redirect, log_quote, GB_jit_error_log, log_quote) ; // error log file // compile the library and return result GBURBLE ("(jit: %s) ", GB_jit_temp) ; diff --git a/Tcov/log_Apr3.txt b/Tcov/log_Apr3.txt deleted file mode 100644 index 4942f54c27..0000000000 --- a/Tcov/log_Apr3.txt +++ /dev/null @@ -1,205 +0,0 @@ - ----------------------------------------------- [malloc] [cover] -03-Apr 17:39:46 test169 17.2 sec 550: 24401 of 25116 2.8% 32.00/s -03-Apr 17:39:48 test250 1.4 sec 374: 24027 of 25116 4.3% 275.57/s -03-Apr 17:39:50 test250 2.1 sec 57: 23970 of 25116 4.6% 26.69/s -03-Apr 17:39:50 test279 0.1 sec 119: 23851 of 25116 5.0% 1887.18/s -03-Apr 17:39:50 test278 0.1 sec 48: 23803 of 25116 5.2% 810.63/s -03-Apr 17:39:50 test277 0.0 sec 38: 23765 of 25116 5.4% 803.64/s -03-Apr 17:39:50 test276 0.1 sec 1626: 22139 of 25116 11.9% 31302.34/s -03-Apr 17:39:50 test275 0.0 sec 117: 22022 of 25116 12.3% 2430.31/s -03-Apr 17:39:51 test274 0.0 sec 129: 21893 of 25116 12.8% 2712.25/s -03-Apr 17:39:51 test273 0.2 sec 114: 21779 of 25116 13.3% 759.73/s -03-Apr 17:39:51 test272 0.0 sec 11: 21768 of 25116 13.3% 230.04/s -03-Apr 17:39:51 test271 0.0 sec 497: 21271 of 25116 15.3% 10069.29/s -03-Apr 17:39:51 test270 0.0 sec 286: 20985 of 25116 16.4% 5881.14/s -03-Apr 17:39:51 test269 0.1 sec 83: 20902 of 25116 16.8% 1641.09/s -03-Apr 17:39:51 test268 0.1 sec 5: 20897 of 25116 16.8% 65.36/s -03-Apr 17:39:53 test145 2.1 sec 210: 20687 of 25116 17.6% 100.27/s -03-Apr 17:39:54 test145 0.0 sec 1: 20686 of 25116 17.6% 28.11/s -03-Apr 17:39:54 test145 0.0 sec 18: 20668 of 25116 17.7% 861.04/s -03-Apr 17:39:54 test145 0.0 sec 4: 20664 of 25116 17.7% 257.60/s -03-Apr 17:39:55 test145 1.5 sec 34: 20630 of 25116 17.9% 22.26/s -03-Apr 17:39:55 test145 0.0 sec 3: 20627 of 25116 17.9% 176.21/s -03-Apr 17:39:56 test240 1.1 sec 74: 20550 of 25116 18.2% 68.37/s -03-Apr 17:39:57 test240 0.3 sec 1: 20549 of 25116 18.2% 3.51/s -03-Apr 17:39:58 test237 0.9 sec 40: 20509 of 25116 18.3% 42.91/s -03-Apr 17:40:00 test237 2.5 sec 2: 20507 of 25116 18.4% 0.81/s -03-Apr 17:40:01 test237 0.1 sec 18: 20489 of 25116 18.4% 163.58/s -03-Apr 17:40:01 test237 0.0 sec 6: 20483 of 25116 18.4% 219.23/s -03-Apr 17:40:01 test237 0.1 sec 4: 20479 of 25116 18.5% 45.97/s -03-Apr 17:40:02 test267 0.7 sec 8: 20471 of 25116 18.5% 12.28/s -03-Apr 17:40:02 test267 0.0 sec 1: 20470 of 25116 18.5% 1322.75/s -03-Apr 17:40:02 test265 0.5 sec 36: 20434 of 25116 18.6% 74.58/s -03-Apr 17:40:02 test264 0.0 sec 173: 20261 of 25116 19.3% 3534.51/s -03-Apr 17:40:03 test263 0.8 sec 13: 20248 of 25116 19.4% 16.46/s -03-Apr 17:40:03 test262 0.1 sec 22: 20226 of 25116 19.5% 433.24/s -03-Apr 17:40:04 test261 0.0 sec 22: 20204 of 25116 19.6% 484.34/s -03-Apr 17:40:04 test260 0.0 sec 3: 20201 of 25116 19.6% 67.06/s -03-Apr 17:40:06 test259 2.4 sec 4: 20197 of 25116 19.6% 1.69/s -03-Apr 17:40:07 test258 0.3 sec 20: 20177 of 25116 19.7% 62.21/s -03-Apr 17:40:07 test257 0.2 sec 41: 20136 of 25116 19.8% 174.19/s -03-Apr 17:40:07 test255 0.0 sec 8: 20128 of 25116 19.9% 168.82/s -03-Apr 17:40:07 test254 0.1 sec 14: 20114 of 25116 19.9% 251.85/s -03-Apr 17:40:12 test254 4.8 sec 20: 20094 of 25116 20.0% 4.20/s -03-Apr 17:40:12 test254 0.1 sec 1: 20093 of 25116 20.0% 8.74/s -03-Apr 17:40:13 test253 0.1 sec 9: 20084 of 25116 20.0% 68.92/s -03-Apr 17:40:13 test252 0.0 sec 7: 20077 of 25116 20.1% 152.89/s -03-Apr 17:41:35 test251 81.8 sec 434: 19643 of 25116 21.8% 5.31/s -03-Apr 17:44:56 test251 201.2 sec 76: 19567 of 25116 22.1% 0.38/s -03-Apr 17:44:58 test249 1.3 sec 24: 19543 of 25116 22.2% 18.23/s -03-Apr 17:44:58 test247 0.0 sec 24: 19519 of 25116 22.3% 729.90/s -03-Apr 17:45:09 test246 11.1 sec 69: 19450 of 25116 22.6% 6.20/s -03-Apr 17:45:28 test01 18.8 sec 1340: 18110 of 25116 27.9% 71.16/s -03-Apr 17:45:29 test245 1.0 sec 34: 18076 of 25116 28.0% 33.90/s -03-Apr 17:45:29 test245 0.0 sec 8: 18068 of 25116 28.1% 215.67/s -03-Apr 17:45:30 test199 0.0 sec 1: 18067 of 25116 28.1% 153.14/s -03-Apr 17:45:30 test83 0.1 sec 10: 18057 of 25116 28.1% 133.42/s -03-Apr 17:45:30 test210 0.0 sec 7: 18050 of 25116 28.1% 2136.75/s -03-Apr 17:45:30 test165 0.0 sec 1: 18049 of 25116 28.1% 209.25/s -03-Apr 17:45:30 test219 0.1 sec 9: 18040 of 25116 28.2% 117.29/s -03-Apr 17:45:31 test219 0.3 sec 3: 18037 of 25116 28.2% 10.80/s -03-Apr 17:45:31 test241 0.1 sec 10: 18027 of 25116 28.2% 85.59/s -03-Apr 17:45:31 test220 0.1 sec 10: 18017 of 25116 28.3% 90.50/s -03-Apr 17:45:31 test211 0.0 sec 15: 18002 of 25116 28.3% 459.73/s -03-Apr 17:45:32 test202 0.1 sec 67: 17935 of 25116 28.6% 571.25/s -03-Apr 17:45:32 test202 0.0 sec 1: 17934 of 25116 28.6% 23.80/s -03-Apr 17:45:35 test152 3.0 sec 827: 17107 of 25116 31.9% 275.17/s -03-Apr 17:45:39 test152 4.1 sec 13: 17094 of 25116 31.9% 3.14/s -03-Apr 17:46:57 test152 77.3 sec 245: 16849 of 25116 32.9% 3.17/s -03-Apr 17:46:57 test222 0.2 sec 18: 16831 of 25116 33.0% 113.13/s -03-Apr 17:46:58 test256 0.7 sec 58: 16773 of 25116 33.2% 87.99/s -03-Apr 17:47:01 test186 2.8 sec 44: 16729 of 25116 33.4% 15.62/s -03-Apr 17:47:02 test186 0.4 sec 3: 16726 of 25116 33.4% 6.81/s -03-Apr 17:47:02 test186(0) 0.4 sec 5: 16721 of 25116 33.4% 12.91/s -03-Apr 17:47:03 test150 0.2 sec 36: 16685 of 25116 33.6% 171.70/s -03-Apr 17:47:03 test239 0.1 sec 15: 16670 of 25116 33.6% 118.06/s -03-Apr 17:47:04 test239 1.0 sec 2: 16668 of 25116 33.6% 2.09/s -03-Apr 17:47:05 test235 0.0 sec 4: 16664 of 25116 33.7% 100.36/s -03-Apr 17:47:05 test226 0.0 sec 8: 16656 of 25116 33.7% 629.13/s -03-Apr 17:47:05 test223 0.0 sec 2: 16654 of 25116 33.7% 66.10/s -03-Apr 17:47:05 test204 0.1 sec 14: 16640 of 25116 33.7% 93.73/s -03-Apr 17:47:06 test203 0.1 sec 9: 16631 of 25116 33.8% 114.57/s -03-Apr 17:47:06 test183 0.0 sec 12: 16619 of 25116 33.8% 432.59/s -03-Apr 17:47:06 test179 0.1 sec 15: 16604 of 25116 33.9% 118.43/s -03-Apr 17:47:09 test179 2.0 sec 4: 16600 of 25116 33.9% 2.04/s -03-Apr 17:47:09 test174 0.1 sec 10: 16590 of 25116 33.9% 198.72/s -03-Apr 17:47:09 test155 0.1 sec 41: 16549 of 25116 34.1% 289.40/s -03-Apr 17:47:10 test136 0.2 sec 55: 16494 of 25116 34.3% 280.13/s -03-Apr 17:47:11 test02 0.7 sec 247: 16247 of 25116 35.3% 332.71/s -03-Apr 17:47:11 test109 0.5 sec 10: 16237 of 25116 35.4% 20.66/s -03-Apr 17:47:12 test109 0.0 sec 4: 16233 of 25116 35.4% 1162.45/s -03-Apr 17:47:12 test109 0.4 sec 8: 16225 of 25116 35.4% 22.43/s -03-Apr 17:47:13 test04 0.1 sec 15: 16210 of 25116 35.5% 134.14/s -03-Apr 17:47:13 test207 0.0 sec 2: 16208 of 25116 35.5% 459.88/s -03-Apr 17:47:13 test221 0.0 sec 2: 16206 of 25116 35.5% 272.55/s -03-Apr 17:47:13 test162 0.1 sec 3: 16203 of 25116 35.5% 45.43/s -03-Apr 17:47:16 test159 2.5 sec 72: 16131 of 25116 35.8% 28.52/s -03-Apr 17:47:17 test09 0.0 sec 5: 16126 of 25116 35.8% 412.85/s -03-Apr 17:47:17 test132 0.1 sec 8: 16118 of 25116 35.8% 80.91/s -03-Apr 17:47:30 test141 12.7 sec 549: 15569 of 25116 38.0% 43.12/s -03-Apr 17:47:32 testc2(1,1) 1.4 sec 20: 15549 of 25116 38.1% 14.15/s -03-Apr 17:47:39 testc2(1,1) 6.7 sec 4: 15545 of 25116 38.1% 0.60/s -03-Apr 17:47:39 test214 0.0 sec 3: 15542 of 25116 38.1% 306.31/s -03-Apr 17:47:39 test213 0.0 sec 2: 15540 of 25116 38.1% 178.97/s -03-Apr 17:47:42 test206 2.6 sec 221: 15319 of 25116 39.0% 85.01/s -03-Apr 17:47:59 test206 16.9 sec 24: 15295 of 25116 39.1% 1.42/s -03-Apr 17:48:00 test212 0.0 sec 8: 15287 of 25116 39.1% 371.44/s -03-Apr 17:48:00 test212 0.2 sec 2: 15285 of 25116 39.1% 10.99/s -03-Apr 17:48:01 test128 0.4 sec 41: 15244 of 25116 39.3% 108.86/s -03-Apr 17:48:01 test82 0.1 sec 16: 15228 of 25116 39.4% 156.51/s -03-Apr 17:48:05 test229 3.2 sec 9: 15219 of 25116 39.4% 2.84/s -03-Apr 17:48:06 test229 1.0 sec 1: 15218 of 25116 39.4% 0.96/s -03-Apr 17:48:07 test144 0.6 sec 2: 15216 of 25116 39.4% 3.40/s -03-Apr 17:49:30 test14 82.5 sec 662: 14554 of 25116 42.1% 8.02/s -03-Apr 17:53:56 test14 265.6 sec 118: 14436 of 25116 42.5% 0.44/s -03-Apr 17:54:05 test180 8.4 sec 128: 14308 of 25116 43.0% 15.28/s -03-Apr 17:54:09 test236 3.6 sec 74: 14234 of 25116 43.3% 20.39/s -03-Apr 17:54:12 test232 2.6 sec 22: 14212 of 25116 43.4% 8.52/s -03-Apr 17:54:32 test228 19.4 sec 27: 14185 of 25116 43.5% 1.39/s -03-Apr 17:56:34 test154 121.8 sec 1502: 12683 of 25116 49.5% 12.33/s -03-Apr 18:02:57 test154 382.7 sec 2: 12681 of 25116 49.5% 0.01/s -03-Apr 18:03:12 test238 14.2 sec 54: 12627 of 25116 49.7% 3.80/s -03-Apr 18:04:22 test238 70.2 sec 9: 12618 of 25116 49.8% 0.13/s -03-Apr 18:06:03 test151b 100.1 sec 126: 12492 of 25116 50.3% 1.26/s -03-Apr 18:06:06 test184 3.3 sec 38: 12454 of 25116 50.4% 11.58/s -03-Apr 18:06:20 test191 13.2 sec 21: 12433 of 25116 50.5% 1.59/s -03-Apr 18:06:49 test191 28.6 sec 3: 12430 of 25116 50.5% 0.10/s -03-Apr 18:14:20 test188 450.4 sec 212: 12218 of 25116 51.4% 0.47/s -03-Apr 18:16:51 test188 150.1 sec 3: 12215 of 25116 51.4% 0.02/s -03-Apr 18:16:57 test224 5.4 sec 24: 12191 of 25116 51.5% 4.48/s -03-Apr 18:17:00 test196 2.4 sec 11: 12180 of 25116 51.5% 4.58/s -03-Apr 18:17:06 test209 5.5 sec 20: 12160 of 25116 51.6% 3.66/s -03-Apr 18:17:25 test104 18.6 sec 40: 12120 of 25116 51.7% 2.15/s -03-Apr 18:17:33 test189 7.9 sec 1: 12119 of 25116 51.7% 0.13/s -03-Apr 18:18:45 test194 71.1 sec 5: 12114 of 25116 51.8% 0.07/s -03-Apr 18:19:01 test76 16.0 sec 15: 12099 of 25116 51.8% 0.94/s -03-Apr 18:19:43 test244 41.6 sec 17: 12082 of 25116 51.9% 0.41/s -[malloc debugging turned off] -03-Apr 18:19:43 test201 0.0 sec 3: 12079 of 25116 51.9% 333.85/s -03-Apr 18:19:44 test225 0.1 sec 1: 12078 of 25116 51.9% 6.96/s -03-Apr 18:19:45 test176 0.1 sec 5: 12073 of 25116 51.9% 65.80/s -03-Apr 18:19:45 test208 0.0 sec 5: 12068 of 25116 52.0% 256.53/s -03-Apr 18:19:46 test216 0.1 sec 3: 12065 of 25116 52.0% 33.13/s -03-Apr 18:20:10 test142 23.8 sec 631: 11434 of 25116 54.5% 26.55/s -03-Apr 18:24:51 test142 281.0 sec 10: 11424 of 25116 54.5% 0.04/s -03-Apr 18:25:16 test142 23.9 sec 2: 11422 of 25116 54.5% 0.08/s -03-Apr 18:25:17 test137 0.4 sec 3: 11419 of 25116 54.5% 7.89/s -03-Apr 18:25:18 test137 0.0 sec 2: 11417 of 25116 54.5% 288.06/s -03-Apr 18:25:19 test139 0.4 sec 2: 11415 of 25116 54.6% 5.33/s -03-Apr 18:25:19 test172 0.1 sec 3: 11412 of 25116 54.6% 39.09/s -03-Apr 18:25:20 test148 0.8 sec 4: 11408 of 25116 54.6% 4.92/s -03-Apr 18:25:22 test157 0.7 sec 12: 11396 of 25116 54.6% 18.37/s -03-Apr 18:25:23 test182 1.0 sec 5: 11391 of 25116 54.6% 5.21/s -03-Apr 18:25:24 test108 0.7 sec 2: 11389 of 25116 54.7% 3.06/s -03-Apr 18:25:25 test108 0.4 sec 2: 11387 of 25116 54.7% 5.43/s -03-Apr 18:25:27 test130 0.9 sec 22: 11365 of 25116 54.7% 25.11/s -03-Apr 18:25:27 test124 0.2 sec 3: 11362 of 25116 54.8% 16.14/s -03-Apr 18:25:28 test138 0.1 sec 1: 11361 of 25116 54.8% 19.95/s -03-Apr 18:25:33 test227 4.7 sec 27: 11334 of 25116 54.9% 5.74/s -03-Apr 18:26:02 test125 28.5 sec 630: 10704 of 25116 57.4% 22.12/s -03-Apr 18:28:28 test234 145.8 sec 385: 10319 of 25116 58.9% 2.64/s -03-Apr 18:32:14 test234 225.3 sec 3: 10316 of 25116 58.9% 0.01/s -03-Apr 18:33:02 test242 47.6 sec 77: 10239 of 25116 59.2% 1.62/s -03-Apr 18:33:05 test173 1.5 sec 11: 10228 of 25116 59.3% 7.30/s -03-Apr 18:33:08 test200 3.1 sec 10: 10218 of 25116 59.3% 3.27/s -03-Apr 18:33:09 test197 0.1 sec 1: 10217 of 25116 59.3% 7.47/s -03-Apr 18:33:11 test84 1.4 sec 18: 10199 of 25116 59.4% 13.05/s -03-Apr 18:33:17 test19b 5.8 sec 59: 10140 of 25116 59.6% 10.16/s -03-Apr 18:33:18 test133 0.4 sec 2: 10138 of 25116 59.6% 5.19/s -03-Apr 18:33:23 test80 3.9 sec 12: 10126 of 25116 59.7% 3.10/s -03-Apr 18:34:28 test23 64.7 sec 148: 9978 of 25116 60.3% 2.29/s -03-Apr 18:34:30 test135 1.9 sec 7: 9971 of 25116 60.3% 3.69/s -03-Apr 18:35:45 test160 74.1 sec 24: 9947 of 25116 60.4% 0.32/s -03-Apr 18:35:51 test54 5.2 sec 20: 9927 of 25116 60.5% 3.83/s -03-Apr 18:35:53 test129 1.2 sec 4: 9923 of 25116 60.5% 3.38/s -03-Apr 18:35:55 test69 2.1 sec 6: 9917 of 25116 60.5% 2.90/s -03-Apr 18:37:31 test230 94.7 sec 114: 9803 of 25116 61.0% 1.20/s -03-Apr 19:10:23 test74 1971.7 sec 6637: 3166 of 25116 87.4% 3.37/s -03-Apr 19:22:39 test127 734.9 sec 1703: 1463 of 25116 94.2% 2.32/s -03-Apr 19:22:43 test19 3.3 sec 12: 1451 of 25116 94.2% 3.61/s -03-Apr 19:22:47 test11 3.8 sec 3: 1448 of 25116 94.2% 0.80/s -03-Apr 19:22:51 test215 2.9 sec 1: 1447 of 25116 94.2% 0.34/s -03-Apr 19:23:09 test193 17.6 sec 5: 1442 of 25116 94.3% 0.28/s -03-Apr 19:25:46 test195 156.1 sec 39: 1403 of 25116 94.4% 0.25/s -03-Apr 19:26:12 test243 25.4 sec 7: 1396 of 25116 94.4% 0.28/s -03-Apr 19:26:23 test29 10.7 sec 3: 1393 of 25116 94.5% 0.28/s -03-Apr 19:26:25 testc2(0,0) 1.3 sec 7: 1386 of 25116 94.5% 5.41/s -03-Apr 19:26:46 testc2(0,0) 20.1 sec 1: 1385 of 25116 94.5% 0.05/s -03-Apr 19:26:47 testc4(0) 0.6 sec 4: 1381 of 25116 94.5% 6.47/s -03-Apr 19:27:03 testc7(0) 14.8 sec 3: 1378 of 25116 94.5% 0.20/s -03-Apr 19:27:08 testcc(1) 5.1 sec 1: 1377 of 25116 94.5% 0.19/s -03-Apr 19:27:18 test187 8.9 sec 3: 1374 of 25116 94.5% 0.34/s -03-Apr 19:27:25 test192 5.9 sec 1: 1373 of 25116 94.5% 0.17/s -03-Apr 19:27:45 test181 19.1 sec 4: 1369 of 25116 94.5% 0.21/s -03-Apr 19:29:33 test185 108.0 sec 6: 1363 of 25116 94.6% 0.06/s -03-Apr 19:30:18 test53 44.3 sec 4: 1359 of 25116 94.6% 0.09/s -03-Apr 19:31:09 test17 49.9 sec 27: 1332 of 25116 94.7% 0.54/s -03-Apr 19:38:36 test231 446.6 sec 162: 1170 of 25116 95.3% 0.36/s -03-Apr 20:28:35 test10 2997.4 sec 970: 200 of 25116 99.2% 0.32/s -03-Apr 20:47:06 test75b 1086.4 sec 155: 45 of 25116 99.8% 0.14/s -03-Apr 20:48:39 test21b 90.7 sec 26: 19 of 25116 99.9% 0.29/s -03-Apr 20:49:32 testca(1) 52.6 sec 5: 14 of 25116 99.9% 0.10/s -03-Apr 20:51:33 test81 120.2 sec 1: 13 of 25116 99.9% 0.01/s -03-Apr 20:57:43 test18 369.6 sec 13: all 25116 full 100% 0.04/s -[malloc debugging turned back on] diff --git a/Tcov/log_Apr9.txt b/Tcov/log_Apr9.txt deleted file mode 100644 index c10784201a..0000000000 --- a/Tcov/log_Apr9.txt +++ /dev/null @@ -1,205 +0,0 @@ - ----------------------------------------------- [malloc] [cover] -09-Apr 12:37:53 test169 17.6 sec 550: 24393 of 25108 2.8% 31.20/s -09-Apr 12:37:55 test250 1.4 sec 374: 24019 of 25108 4.3% 263.66/s -09-Apr 12:37:57 test250 2.1 sec 57: 23962 of 25108 4.6% 26.83/s -09-Apr 12:37:57 test279 0.1 sec 119: 23843 of 25108 5.0% 1944.64/s -09-Apr 12:37:57 test278 0.1 sec 48: 23795 of 25108 5.2% 801.24/s -09-Apr 12:37:57 test277 0.1 sec 38: 23757 of 25108 5.4% 714.34/s -09-Apr 12:37:57 test276 0.1 sec 1626: 22131 of 25108 11.9% 32257.42/s -09-Apr 12:37:57 test275 0.0 sec 117: 22014 of 25108 12.3% 2491.64/s -09-Apr 12:37:57 test274 0.0 sec 129: 21885 of 25108 12.8% 2795.78/s -09-Apr 12:37:58 test273 0.1 sec 114: 21771 of 25108 13.3% 764.89/s -09-Apr 12:37:58 test272 0.0 sec 11: 21760 of 25108 13.3% 236.49/s -09-Apr 12:37:58 test271 0.0 sec 497: 21263 of 25108 15.3% 10313.56/s -09-Apr 12:37:58 test270 0.0 sec 286: 20977 of 25108 16.5% 6094.70/s -09-Apr 12:37:58 test269 0.0 sec 83: 20894 of 25108 16.8% 1711.09/s -09-Apr 12:37:58 test268 0.1 sec 5: 20889 of 25108 16.8% 68.85/s -09-Apr 12:38:00 test145 2.1 sec 210: 20679 of 25108 17.6% 100.02/s -09-Apr 12:38:00 test145 0.0 sec 1: 20678 of 25108 17.6% 26.99/s -09-Apr 12:38:00 test145 0.0 sec 18: 20660 of 25108 17.7% 883.31/s -09-Apr 12:38:01 test145 0.0 sec 4: 20656 of 25108 17.7% 245.64/s -09-Apr 12:38:02 test145 1.5 sec 34: 20622 of 25108 17.9% 22.25/s -09-Apr 12:38:02 test145 0.0 sec 3: 20619 of 25108 17.9% 169.97/s -09-Apr 12:38:03 test240 1.1 sec 74: 20542 of 25108 18.2% 68.86/s -09-Apr 12:38:04 test240 0.3 sec 1: 20541 of 25108 18.2% 3.45/s -09-Apr 12:38:05 test237 0.9 sec 40: 20501 of 25108 18.3% 42.56/s -09-Apr 12:38:07 test237 2.6 sec 2: 20499 of 25108 18.4% 0.77/s -09-Apr 12:38:08 test237 0.1 sec 18: 20481 of 25108 18.4% 144.19/s -09-Apr 12:38:08 test237 0.0 sec 6: 20475 of 25108 18.5% 186.32/s -09-Apr 12:38:08 test237 0.1 sec 4: 20471 of 25108 18.5% 42.23/s -09-Apr 12:38:09 test267 0.7 sec 8: 20463 of 25108 18.5% 12.22/s -09-Apr 12:38:09 test267 0.0 sec 1: 20462 of 25108 18.5% 1336.90/s -09-Apr 12:38:09 test265 0.5 sec 36: 20426 of 25108 18.6% 76.37/s -09-Apr 12:38:09 test264 0.0 sec 173: 20253 of 25108 19.3% 3523.49/s -09-Apr 12:38:10 test263 0.8 sec 13: 20240 of 25108 19.4% 16.60/s -09-Apr 12:38:10 test262 0.0 sec 22: 20218 of 25108 19.5% 445.50/s -09-Apr 12:38:11 test261 0.1 sec 22: 20196 of 25108 19.6% 379.15/s -09-Apr 12:38:11 test260 0.1 sec 3: 20193 of 25108 19.6% 59.66/s -09-Apr 12:38:13 test259 2.4 sec 4: 20189 of 25108 19.6% 1.70/s -09-Apr 12:38:14 test258 0.3 sec 20: 20169 of 25108 19.7% 62.60/s -09-Apr 12:38:14 test257 0.2 sec 41: 20128 of 25108 19.8% 170.14/s -09-Apr 12:38:14 test255 0.0 sec 8: 20120 of 25108 19.9% 167.92/s -09-Apr 12:38:14 test254 0.1 sec 14: 20106 of 25108 19.9% 231.67/s -09-Apr 12:38:19 test254 4.9 sec 20: 20086 of 25108 20.0% 4.05/s -09-Apr 12:38:20 test254 0.1 sec 1: 20085 of 25108 20.0% 8.79/s -09-Apr 12:38:20 test253 0.1 sec 9: 20076 of 25108 20.0% 64.46/s -09-Apr 12:38:20 test252 0.1 sec 7: 20069 of 25108 20.1% 131.43/s -09-Apr 12:39:49 test251 88.6 sec 434: 19635 of 25108 21.8% 4.90/s -09-Apr 12:43:19 test251 209.7 sec 76: 19559 of 25108 22.1% 0.36/s -09-Apr 12:43:20 test249 1.2 sec 24: 19535 of 25108 22.2% 19.22/s -09-Apr 12:43:20 test247 0.0 sec 24: 19511 of 25108 22.3% 1393.32/s -09-Apr 12:43:32 test246 11.2 sec 69: 19442 of 25108 22.6% 6.19/s -09-Apr 12:43:50 test01 18.2 sec 1340: 18102 of 25108 27.9% 73.70/s -09-Apr 12:43:51 test245 1.0 sec 34: 18068 of 25108 28.0% 33.66/s -09-Apr 12:43:51 test245 0.0 sec 8: 18060 of 25108 28.1% 169.07/s -09-Apr 12:43:52 test199 0.0 sec 1: 18059 of 25108 28.1% 216.68/s -09-Apr 12:43:52 test83 0.1 sec 10: 18049 of 25108 28.1% 197.60/s -09-Apr 12:43:52 test210 0.0 sec 7: 18042 of 25108 28.1% 2393.16/s -09-Apr 12:43:52 test165 0.0 sec 1: 18041 of 25108 28.1% 213.54/s -09-Apr 12:43:52 test219 0.1 sec 9: 18032 of 25108 28.2% 178.94/s -09-Apr 12:43:53 test219 0.3 sec 3: 18029 of 25108 28.2% 10.67/s -09-Apr 12:43:53 test241 0.1 sec 10: 18019 of 25108 28.2% 94.25/s -09-Apr 12:43:53 test220 0.1 sec 10: 18009 of 25108 28.3% 119.33/s -09-Apr 12:43:53 test211 0.0 sec 15: 17994 of 25108 28.3% 505.31/s -09-Apr 12:43:54 test202 0.1 sec 67: 17927 of 25108 28.6% 719.83/s -09-Apr 12:43:54 test202 0.0 sec 1: 17926 of 25108 28.6% 22.82/s -09-Apr 12:43:57 test152 3.1 sec 827: 17099 of 25108 31.9% 269.85/s -09-Apr 12:44:02 test152 4.5 sec 13: 17086 of 25108 31.9% 2.92/s -09-Apr 12:45:20 test152 77.9 sec 245: 16841 of 25108 32.9% 3.15/s -09-Apr 12:45:20 test222 0.1 sec 18: 16823 of 25108 33.0% 159.94/s -09-Apr 12:45:21 test256 0.6 sec 58: 16765 of 25108 33.2% 93.02/s -09-Apr 12:45:24 test186 2.9 sec 44: 16721 of 25108 33.4% 15.06/s -09-Apr 12:45:25 test186 0.5 sec 3: 16718 of 25108 33.4% 6.16/s -09-Apr 12:45:25 test186(0) 0.4 sec 5: 16713 of 25108 33.4% 12.01/s -09-Apr 12:45:26 test150 0.2 sec 36: 16677 of 25108 33.6% 160.28/s -09-Apr 12:45:26 test239 0.1 sec 15: 16662 of 25108 33.6% 177.97/s -09-Apr 12:45:27 test239 0.9 sec 2: 16660 of 25108 33.6% 2.15/s -09-Apr 12:45:27 test235 0.0 sec 4: 16656 of 25108 33.7% 99.39/s -09-Apr 12:45:28 test226 0.0 sec 8: 16648 of 25108 33.7% 640.97/s -09-Apr 12:45:28 test223 0.0 sec 2: 16646 of 25108 33.7% 63.34/s -09-Apr 12:45:28 test204 0.1 sec 14: 16632 of 25108 33.8% 144.60/s -09-Apr 12:45:29 test203 0.0 sec 9: 16623 of 25108 33.8% 181.43/s -09-Apr 12:45:29 test183 0.0 sec 12: 16611 of 25108 33.8% 439.09/s -09-Apr 12:45:29 test179 0.1 sec 15: 16596 of 25108 33.9% 162.45/s -09-Apr 12:45:31 test179 1.9 sec 4: 16592 of 25108 33.9% 2.08/s -09-Apr 12:45:32 test174 0.0 sec 10: 16582 of 25108 34.0% 235.24/s -09-Apr 12:45:32 test155 0.1 sec 41: 16541 of 25108 34.1% 373.30/s -09-Apr 12:45:32 test136 0.1 sec 55: 16486 of 25108 34.3% 378.89/s -09-Apr 12:45:33 test02 0.7 sec 247: 16239 of 25108 35.3% 366.39/s -09-Apr 12:45:34 test109 0.4 sec 10: 16229 of 25108 35.4% 23.00/s -09-Apr 12:45:34 test109 0.0 sec 4: 16225 of 25108 35.4% 1133.14/s -09-Apr 12:45:35 test109 0.4 sec 8: 16217 of 25108 35.4% 21.55/s -09-Apr 12:45:35 test04 0.1 sec 15: 16202 of 25108 35.5% 190.06/s -09-Apr 12:45:35 test207 0.0 sec 2: 16200 of 25108 35.5% 598.27/s -09-Apr 12:45:36 test221 0.0 sec 2: 16198 of 25108 35.5% 296.60/s -09-Apr 12:45:36 test162 0.1 sec 3: 16195 of 25108 35.5% 54.87/s -09-Apr 12:45:39 test159 2.7 sec 72: 16123 of 25108 35.8% 26.90/s -09-Apr 12:45:39 test09 0.0 sec 5: 16118 of 25108 35.8% 619.58/s -09-Apr 12:45:40 test132 0.1 sec 8: 16110 of 25108 35.8% 113.36/s -09-Apr 12:45:53 test141 13.4 sec 549: 15561 of 25108 38.0% 40.83/s -09-Apr 12:45:55 testc2(1,1) 1.3 sec 20: 15541 of 25108 38.1% 15.48/s -09-Apr 12:46:02 testc2(1,1) 6.7 sec 4: 15537 of 25108 38.1% 0.60/s -09-Apr 12:46:02 test214 0.0 sec 3: 15534 of 25108 38.1% 335.76/s -09-Apr 12:46:02 test213 0.0 sec 2: 15532 of 25108 38.1% 200.40/s -09-Apr 12:46:05 test206 2.7 sec 221: 15311 of 25108 39.0% 82.52/s -09-Apr 12:46:23 test206 17.3 sec 24: 15287 of 25108 39.1% 1.39/s -09-Apr 12:46:23 test212 0.0 sec 8: 15279 of 25108 39.1% 416.71/s -09-Apr 12:46:24 test212 0.2 sec 2: 15277 of 25108 39.2% 10.47/s -09-Apr 12:46:25 test128 0.3 sec 41: 15236 of 25108 39.3% 125.92/s -09-Apr 12:46:25 test82 0.1 sec 16: 15220 of 25108 39.4% 179.99/s -09-Apr 12:46:29 test229 3.2 sec 9: 15211 of 25108 39.4% 2.84/s -09-Apr 12:46:30 test229 1.1 sec 1: 15210 of 25108 39.4% 0.92/s -09-Apr 12:46:31 test144 0.6 sec 2: 15208 of 25108 39.4% 3.62/s -09-Apr 12:47:55 test14 83.4 sec 662: 14546 of 25108 42.1% 7.93/s -09-Apr 12:52:23 test14 267.6 sec 118: 14428 of 25108 42.5% 0.44/s -09-Apr 12:52:32 test180 8.8 sec 128: 14300 of 25108 43.0% 14.50/s -09-Apr 12:52:36 test236 3.6 sec 74: 14226 of 25108 43.3% 20.67/s -09-Apr 12:52:39 test232 2.4 sec 22: 14204 of 25108 43.4% 9.03/s -09-Apr 12:52:59 test228 20.1 sec 27: 14177 of 25108 43.5% 1.34/s -09-Apr 12:55:04 test154 124.6 sec 1506: 12671 of 25108 49.5% 12.09/s -09-Apr 13:01:50 test154 405.3 sec 2: 12669 of 25108 49.5% 0.00/s -09-Apr 13:02:05 test238 14.7 sec 54: 12615 of 25108 49.8% 3.67/s -09-Apr 13:03:16 test238 70.8 sec 9: 12606 of 25108 49.8% 0.13/s -09-Apr 13:05:00 test151b 103.0 sec 126: 12480 of 25108 50.3% 1.22/s -09-Apr 13:05:03 test184 3.1 sec 38: 12442 of 25108 50.4% 12.32/s -09-Apr 13:05:17 test191 13.4 sec 21: 12421 of 25108 50.5% 1.56/s -09-Apr 13:05:48 test191 30.1 sec 3: 12418 of 25108 50.5% 0.10/s -09-Apr 13:13:21 test188 453.5 sec 212: 12206 of 25108 51.4% 0.47/s -09-Apr 13:15:59 test188 156.2 sec 3: 12203 of 25108 51.4% 0.02/s -09-Apr 13:16:05 test224 5.2 sec 24: 12179 of 25108 51.5% 4.62/s -09-Apr 13:16:08 test196 2.5 sec 11: 12168 of 25108 51.5% 4.36/s -09-Apr 13:16:13 test209 5.5 sec 20: 12148 of 25108 51.6% 3.64/s -09-Apr 13:16:33 test104 18.9 sec 40: 12108 of 25108 51.8% 2.12/s -09-Apr 13:16:41 test189 8.0 sec 1: 12107 of 25108 51.8% 0.13/s -09-Apr 13:17:54 test194 72.0 sec 5: 12102 of 25108 51.8% 0.07/s -09-Apr 13:18:10 test76 16.0 sec 15: 12087 of 25108 51.9% 0.94/s -09-Apr 13:18:53 test244 42.5 sec 17: 12070 of 25108 51.9% 0.40/s -[malloc debugging turned off] -09-Apr 13:18:53 test201 0.0 sec 3: 12067 of 25108 51.9% 631.05/s -09-Apr 13:18:54 test225 0.2 sec 1: 12066 of 25108 51.9% 6.62/s -09-Apr 13:18:55 test176 0.1 sec 5: 12061 of 25108 52.0% 65.53/s -09-Apr 13:18:55 test208 0.0 sec 5: 12056 of 25108 52.0% 312.32/s -09-Apr 13:18:56 test216 0.1 sec 3: 12053 of 25108 52.0% 47.38/s -09-Apr 13:19:22 test142 25.7 sec 631: 11422 of 25108 54.5% 24.55/s -09-Apr 13:24:03 test142 281.1 sec 10: 11412 of 25108 54.5% 0.04/s -09-Apr 13:24:30 test142 25.5 sec 2: 11410 of 25108 54.6% 0.08/s -09-Apr 13:24:31 test137 0.3 sec 3: 11407 of 25108 54.6% 8.92/s -09-Apr 13:24:31 test137 0.0 sec 2: 11405 of 25108 54.6% 251.51/s -09-Apr 13:24:32 test139 0.4 sec 2: 11403 of 25108 54.6% 5.44/s -09-Apr 13:24:33 test172 0.1 sec 3: 11400 of 25108 54.6% 35.11/s -09-Apr 13:24:34 test148 0.7 sec 4: 11396 of 25108 54.6% 6.12/s -09-Apr 13:24:35 test157 0.6 sec 12: 11384 of 25108 54.7% 19.05/s -09-Apr 13:24:36 test182 1.0 sec 5: 11379 of 25108 54.7% 5.19/s -09-Apr 13:24:38 test108 0.6 sec 2: 11377 of 25108 54.7% 3.35/s -09-Apr 13:24:38 test108 0.4 sec 2: 11375 of 25108 54.7% 5.38/s -09-Apr 13:24:40 test130 0.8 sec 22: 11353 of 25108 54.8% 26.56/s -09-Apr 13:24:41 test124 0.2 sec 3: 11350 of 25108 54.8% 13.94/s -09-Apr 13:24:41 test138 0.1 sec 1: 11349 of 25108 54.8% 10.47/s -09-Apr 13:24:47 test227 5.0 sec 27: 11322 of 25108 54.9% 5.43/s -09-Apr 13:25:17 test125 30.1 sec 618: 10704 of 25108 57.4% 20.55/s -09-Apr 13:28:38 test234 200.6 sec 385: 10319 of 25108 58.9% 1.92/s -09-Apr 13:34:31 test234 351.7 sec 3: 10316 of 25108 58.9% 0.01/s -09-Apr 13:35:20 test242 48.4 sec 77: 10239 of 25108 59.2% 1.59/s -09-Apr 13:35:22 test173 1.6 sec 11: 10228 of 25108 59.3% 7.09/s -09-Apr 13:35:26 test200 3.3 sec 10: 10218 of 25108 59.3% 3.05/s -09-Apr 13:35:27 test197 0.2 sec 1: 10217 of 25108 59.3% 5.63/s -09-Apr 13:35:29 test84 1.3 sec 18: 10199 of 25108 59.4% 13.37/s -09-Apr 13:35:35 test19b 5.9 sec 59: 10140 of 25108 59.6% 9.92/s -09-Apr 13:35:36 test133 0.4 sec 2: 10138 of 25108 59.6% 4.73/s -09-Apr 13:35:41 test80 4.0 sec 12: 10126 of 25108 59.7% 3.02/s -09-Apr 13:36:50 test23 68.3 sec 148: 9978 of 25108 60.3% 2.17/s -09-Apr 13:36:52 test135 1.9 sec 7: 9971 of 25108 60.3% 3.61/s -09-Apr 13:38:10 test160 77.6 sec 24: 9947 of 25108 60.4% 0.31/s -09-Apr 13:38:16 test54 5.4 sec 20: 9927 of 25108 60.5% 3.73/s -09-Apr 13:38:18 test129 1.2 sec 4: 9923 of 25108 60.5% 3.34/s -09-Apr 13:38:21 test69 2.0 sec 6: 9917 of 25108 60.5% 3.05/s -09-Apr 13:39:56 test230 94.8 sec 114: 9803 of 25108 61.0% 1.20/s -09-Apr 14:14:51 test74 2094.0 sec 6637: 3166 of 25108 87.4% 3.17/s -09-Apr 14:27:42 test127 770.4 sec 1703: 1463 of 25108 94.2% 2.21/s -09-Apr 14:27:46 test19 3.3 sec 12: 1451 of 25108 94.2% 3.67/s -09-Apr 14:27:50 test11 3.7 sec 3: 1448 of 25108 94.2% 0.81/s -09-Apr 14:27:54 test215 3.0 sec 1: 1447 of 25108 94.2% 0.33/s -09-Apr 14:28:12 test193 17.5 sec 5: 1442 of 25108 94.3% 0.29/s -09-Apr 14:30:56 test195 163.6 sec 39: 1403 of 25108 94.4% 0.24/s -09-Apr 14:31:22 test243 25.4 sec 7: 1396 of 25108 94.4% 0.28/s -09-Apr 14:31:34 test29 11.0 sec 3: 1393 of 25108 94.5% 0.27/s -09-Apr 14:31:36 testc2(0,0) 1.3 sec 7: 1386 of 25108 94.5% 5.37/s -09-Apr 14:31:56 testc2(0,0) 19.6 sec 1: 1385 of 25108 94.5% 0.05/s -09-Apr 14:31:57 testc4(0) 0.5 sec 4: 1381 of 25108 94.5% 8.25/s -09-Apr 14:32:13 testc7(0) 14.9 sec 3: 1378 of 25108 94.5% 0.20/s -09-Apr 14:32:19 testcc(1) 5.1 sec 1: 1377 of 25108 94.5% 0.20/s -09-Apr 14:32:28 test187 8.7 sec 3: 1374 of 25108 94.5% 0.35/s -09-Apr 14:32:35 test192 5.8 sec 1: 1373 of 25108 94.5% 0.17/s -09-Apr 14:32:54 test181 18.8 sec 4: 1369 of 25108 94.5% 0.21/s -09-Apr 14:34:47 test185 112.5 sec 6: 1363 of 25108 94.6% 0.05/s -09-Apr 14:35:32 test53 44.3 sec 4: 1359 of 25108 94.6% 0.09/s -09-Apr 14:36:24 test17 50.7 sec 27: 1332 of 25108 94.7% 0.53/s -09-Apr 14:43:58 test231 452.8 sec 162: 1170 of 25108 95.3% 0.36/s -09-Apr 15:34:01 test10 3002.5 sec 970: 200 of 25108 99.2% 0.32/s -09-Apr 15:52:36 test75b 1089.8 sec 155: 45 of 25108 99.8% 0.14/s -09-Apr 15:54:08 test21b 90.9 sec 26: 19 of 25108 99.9% 0.29/s -09-Apr 15:55:02 testca(1) 53.0 sec 5: 14 of 25108 99.9% 0.09/s -09-Apr 15:56:59 test81 115.9 sec 1: 13 of 25108 99.9% 0.01/s -09-Apr 16:03:14 test18 374.8 sec 13: all 25108 full 100% 0.03/s -[malloc debugging turned back on] diff --git a/Tcov/log_Mar21.txt b/Tcov/log_Mar21.txt deleted file mode 100644 index 2278483a35..0000000000 --- a/Tcov/log_Mar21.txt +++ /dev/null @@ -1,205 +0,0 @@ - ----------------------------------------------- [malloc] [cover] -21-Mar 07:50:09 test169 17.1 sec 550: 24397 of 25111 2.8% 32.14/s -21-Mar 07:50:11 test250 1.4 sec 372: 24025 of 25111 4.3% 272.03/s -21-Mar 07:50:13 test250 2.1 sec 57: 23968 of 25111 4.6% 27.46/s -21-Mar 07:50:13 test279 0.1 sec 119: 23849 of 25111 5.0% 1305.15/s -21-Mar 07:50:13 test278 0.1 sec 48: 23801 of 25111 5.2% 538.99/s -21-Mar 07:50:13 test277 0.1 sec 38: 23763 of 25111 5.4% 444.59/s -21-Mar 07:50:13 test276 0.1 sec 1626: 22137 of 25111 11.8% 20321.70/s -21-Mar 07:50:14 test275 0.1 sec 117: 22020 of 25111 12.3% 1536.24/s -21-Mar 07:50:14 test274 0.1 sec 129: 21891 of 25111 12.8% 1739.53/s -21-Mar 07:50:14 test273 0.2 sec 112: 21779 of 25111 13.3% 645.76/s -21-Mar 07:50:14 test272 0.1 sec 11: 21768 of 25111 13.3% 145.87/s -21-Mar 07:50:14 test271 0.1 sec 497: 21271 of 25111 15.3% 6612.74/s -21-Mar 07:50:14 test270 0.1 sec 286: 20985 of 25111 16.4% 3856.58/s -21-Mar 07:50:14 test269 0.1 sec 83: 20902 of 25111 16.8% 1100.91/s -21-Mar 07:50:15 test268 0.1 sec 5: 20897 of 25111 16.8% 46.09/s -21-Mar 07:50:17 test145 2.2 sec 210: 20687 of 25111 17.6% 94.84/s -21-Mar 07:50:17 test145 0.0 sec 1: 20686 of 25111 17.6% 27.58/s -21-Mar 07:50:17 test145 0.0 sec 18: 20668 of 25111 17.7% 794.04/s -21-Mar 07:50:17 test145 0.0 sec 4: 20664 of 25111 17.7% 221.86/s -21-Mar 07:50:19 test145 1.5 sec 34: 20630 of 25111 17.8% 22.54/s -21-Mar 07:50:19 test145 0.0 sec 3: 20627 of 25111 17.9% 182.85/s -21-Mar 07:50:20 test240 1.2 sec 74: 20550 of 25111 18.2% 62.30/s -21-Mar 07:50:20 test240 0.3 sec 1: 20549 of 25111 18.2% 3.54/s -21-Mar 07:50:22 test237 1.4 sec 40: 20509 of 25111 18.3% 27.64/s -21-Mar 07:50:25 test237 2.8 sec 2: 20507 of 25111 18.3% 0.72/s -21-Mar 07:50:25 test237 0.1 sec 18: 20489 of 25111 18.4% 170.21/s -21-Mar 07:50:25 test237 0.0 sec 6: 20483 of 25111 18.4% 227.98/s -21-Mar 07:50:25 test237 0.1 sec 4: 20479 of 25111 18.4% 47.65/s -21-Mar 07:50:26 test267 0.7 sec 8: 20471 of 25111 18.5% 12.09/s -21-Mar 07:50:26 test267 0.0 sec 1: 20470 of 25111 18.5% 1390.82/s -21-Mar 07:50:27 test265 0.5 sec 36: 20434 of 25111 18.6% 71.16/s -21-Mar 07:50:27 test264 0.1 sec 173: 20261 of 25111 19.3% 2187.82/s -21-Mar 07:50:28 test263 0.8 sec 13: 20248 of 25111 19.4% 15.74/s -21-Mar 07:50:28 test262 0.1 sec 22: 20226 of 25111 19.5% 281.16/s -21-Mar 07:50:28 test261 0.1 sec 22: 20204 of 25111 19.5% 283.35/s -21-Mar 07:50:28 test260 0.1 sec 3: 20201 of 25111 19.6% 40.57/s -21-Mar 07:50:31 test259 2.3 sec 4: 20197 of 25111 19.6% 1.71/s -21-Mar 07:50:31 test258 0.4 sec 20: 20177 of 25111 19.6% 56.34/s -21-Mar 07:50:32 test257 0.3 sec 41: 20136 of 25111 19.8% 143.05/s -21-Mar 07:50:32 test255 0.1 sec 8: 20128 of 25111 19.8% 91.47/s -21-Mar 07:50:32 test254 0.1 sec 14: 20114 of 25111 19.9% 207.79/s -21-Mar 07:50:37 test254 4.9 sec 20: 20094 of 25111 20.0% 4.09/s -21-Mar 07:50:37 test254 0.1 sec 1: 20093 of 25111 20.0% 9.10/s -21-Mar 07:50:38 test253 0.2 sec 9: 20084 of 25111 20.0% 56.44/s -21-Mar 07:50:38 test252 0.1 sec 7: 20077 of 25111 20.0% 92.50/s -21-Mar 07:52:03 test251 85.0 sec 434: 19643 of 25111 21.8% 5.11/s -21-Mar 07:55:34 test251 211.5 sec 76: 19567 of 25111 22.1% 0.36/s -21-Mar 07:55:36 test249 1.3 sec 24: 19543 of 25111 22.2% 18.88/s -21-Mar 07:55:36 test247 0.0 sec 23: 19520 of 25111 22.3% 811.86/s -21-Mar 07:55:47 test246 11.1 sec 70: 19450 of 25111 22.5% 6.32/s -21-Mar 07:56:06 test01 18.6 sec 1340: 18110 of 25111 27.9% 71.92/s -21-Mar 07:56:07 test245 1.0 sec 34: 18076 of 25111 28.0% 34.71/s -21-Mar 07:56:07 test245 0.0 sec 8: 18068 of 25111 28.0% 216.93/s -21-Mar 07:56:08 test199 0.0 sec 1: 18067 of 25111 28.1% 149.90/s -21-Mar 07:56:08 test83 0.1 sec 10: 18057 of 25111 28.1% 129.77/s -21-Mar 07:56:08 test210 0.0 sec 7: 18050 of 25111 28.1% 2143.29/s -21-Mar 07:56:08 test165 0.0 sec 1: 18049 of 25111 28.1% 206.83/s -21-Mar 07:56:08 test219 0.1 sec 9: 18040 of 25111 28.2% 114.72/s -21-Mar 07:56:09 test219 0.3 sec 3: 18037 of 25111 28.2% 10.46/s -21-Mar 07:56:09 test241 0.1 sec 10: 18027 of 25111 28.2% 88.80/s -21-Mar 07:56:09 test220 0.1 sec 10: 18017 of 25111 28.3% 88.20/s -21-Mar 07:56:10 test211 0.0 sec 15: 18002 of 25111 28.3% 450.46/s -21-Mar 07:56:10 test202 0.1 sec 67: 17935 of 25111 28.6% 552.40/s -21-Mar 07:56:10 test202 0.0 sec 1: 17934 of 25111 28.6% 23.10/s -21-Mar 07:56:13 test152 3.1 sec 827: 17107 of 25111 31.9% 270.41/s -21-Mar 07:56:18 test152 4.2 sec 13: 17094 of 25111 31.9% 3.11/s -21-Mar 07:57:35 test152 76.9 sec 245: 16849 of 25111 32.9% 3.19/s -21-Mar 07:57:35 test222 0.2 sec 18: 16831 of 25111 33.0% 112.61/s -21-Mar 07:57:36 test256 0.6 sec 58: 16773 of 25111 33.2% 90.36/s -21-Mar 07:57:39 test186 2.9 sec 44: 16729 of 25111 33.4% 15.37/s -21-Mar 07:57:40 test186 0.4 sec 3: 16726 of 25111 33.4% 6.70/s -21-Mar 07:57:40 test186(0) 0.4 sec 5: 16721 of 25111 33.4% 12.60/s -21-Mar 07:57:41 test150 0.2 sec 36: 16685 of 25111 33.6% 173.63/s -21-Mar 07:57:41 test239 0.1 sec 15: 16670 of 25111 33.6% 135.61/s -21-Mar 07:57:42 test239 0.9 sec 2: 16668 of 25111 33.6% 2.18/s -21-Mar 07:57:42 test235 0.0 sec 4: 16664 of 25111 33.6% 102.84/s -21-Mar 07:57:43 test226 0.0 sec 8: 16656 of 25111 33.7% 531.21/s -21-Mar 07:57:43 test223 0.0 sec 2: 16654 of 25111 33.7% 66.81/s -21-Mar 07:57:43 test204 0.1 sec 14: 16640 of 25111 33.7% 95.85/s -21-Mar 07:57:43 test203 0.1 sec 9: 16631 of 25111 33.8% 116.95/s -21-Mar 07:57:44 test183 0.0 sec 12: 16619 of 25111 33.8% 449.15/s -21-Mar 07:57:44 test179 0.1 sec 15: 16604 of 25111 33.9% 120.94/s -21-Mar 07:57:46 test179 1.9 sec 4: 16600 of 25111 33.9% 2.10/s -21-Mar 07:57:47 test174 0.1 sec 10: 16590 of 25111 33.9% 193.64/s -21-Mar 07:57:47 test155 0.1 sec 41: 16549 of 25111 34.1% 293.90/s -21-Mar 07:57:47 test136 0.2 sec 55: 16494 of 25111 34.3% 283.29/s -21-Mar 07:57:48 test02 0.7 sec 247: 16247 of 25111 35.3% 348.25/s -21-Mar 07:57:49 test109 0.5 sec 10: 16237 of 25111 35.3% 21.79/s -21-Mar 07:57:49 test109 0.0 sec 4: 16233 of 25111 35.4% 1164.82/s -21-Mar 07:57:50 test109 0.4 sec 8: 16225 of 25111 35.4% 21.68/s -21-Mar 07:57:50 test04 0.1 sec 15: 16210 of 25111 35.4% 135.88/s -21-Mar 07:57:50 test207 0.0 sec 2: 16208 of 25111 35.5% 470.37/s -21-Mar 07:57:51 test221 0.0 sec 2: 16206 of 25111 35.5% 281.25/s -21-Mar 07:57:51 test162 0.1 sec 3: 16203 of 25111 35.5% 48.76/s -21-Mar 07:57:54 test159 2.5 sec 72: 16131 of 25111 35.8% 29.25/s -21-Mar 07:57:54 test09 0.0 sec 5: 16126 of 25111 35.8% 414.52/s -21-Mar 07:57:54 test132 0.1 sec 8: 16118 of 25111 35.8% 82.14/s -21-Mar 07:58:07 test141 12.7 sec 549: 15569 of 25111 38.0% 43.27/s -21-Mar 07:58:09 testc2(1,1) 1.4 sec 20: 15549 of 25111 38.1% 14.56/s -21-Mar 07:58:16 testc2(1,1) 6.6 sec 4: 15545 of 25111 38.1% 0.60/s -21-Mar 07:58:16 test214 0.0 sec 3: 15542 of 25111 38.1% 308.10/s -21-Mar 07:58:17 test213 0.0 sec 2: 15540 of 25111 38.1% 176.41/s -21-Mar 07:58:20 test206 2.6 sec 221: 15319 of 25111 39.0% 83.80/s -21-Mar 07:58:37 test206 17.1 sec 24: 15295 of 25111 39.1% 1.40/s -21-Mar 07:58:37 test212 0.0 sec 8: 15287 of 25111 39.1% 394.19/s -21-Mar 07:58:38 test212 0.2 sec 2: 15285 of 25111 39.1% 10.49/s -21-Mar 07:58:39 test128 0.3 sec 41: 15244 of 25111 39.3% 118.86/s -21-Mar 07:58:39 test82 0.1 sec 16: 15228 of 25111 39.4% 176.26/s -21-Mar 07:58:42 test229 3.1 sec 9: 15219 of 25111 39.4% 2.92/s -21-Mar 07:58:44 test229 1.1 sec 1: 15218 of 25111 39.4% 0.95/s -21-Mar 07:58:45 test144 0.6 sec 2: 15216 of 25111 39.4% 3.41/s -21-Mar 08:00:07 test14 82.4 sec 662: 14554 of 25111 42.0% 8.03/s -21-Mar 08:04:35 test14 267.4 sec 118: 14436 of 25111 42.5% 0.44/s -21-Mar 08:04:45 test180 9.0 sec 128: 14308 of 25111 43.0% 14.21/s -21-Mar 08:04:49 test236 3.7 sec 74: 14234 of 25111 43.3% 20.20/s -21-Mar 08:04:52 test232 2.6 sec 22: 14212 of 25111 43.4% 8.38/s -21-Mar 08:05:12 test228 19.7 sec 27: 14185 of 25111 43.5% 1.37/s -21-Mar 08:07:15 test154 122.3 sec 1502: 12683 of 25111 49.5% 12.28/s -21-Mar 08:13:36 test154 381.2 sec 2: 12681 of 25111 49.5% 0.01/s -21-Mar 08:13:51 test238 14.8 sec 54: 12627 of 25111 49.7% 3.65/s -21-Mar 08:15:02 test238 69.8 sec 9: 12618 of 25111 49.8% 0.13/s -21-Mar 08:16:43 test151b 101.3 sec 126: 12492 of 25111 50.3% 1.24/s -21-Mar 08:16:47 test184 3.1 sec 38: 12454 of 25111 50.4% 12.26/s -21-Mar 08:17:00 test191 12.9 sec 21: 12433 of 25111 50.5% 1.63/s -21-Mar 08:17:29 test191 28.6 sec 3: 12430 of 25111 50.5% 0.10/s -21-Mar 08:25:00 test188 450.3 sec 212: 12218 of 25111 51.3% 0.47/s -21-Mar 08:27:30 test188 148.9 sec 3: 12215 of 25111 51.4% 0.02/s -21-Mar 08:27:36 test224 5.2 sec 24: 12191 of 25111 51.5% 4.58/s -21-Mar 08:27:38 test196 2.4 sec 11: 12180 of 25111 51.5% 4.56/s -21-Mar 08:27:44 test209 5.4 sec 20: 12160 of 25111 51.6% 3.68/s -21-Mar 08:28:04 test104 19.0 sec 40: 12120 of 25111 51.7% 2.11/s -21-Mar 08:28:12 test189 8.0 sec 1: 12119 of 25111 51.7% 0.12/s -21-Mar 08:29:23 test194 70.1 sec 5: 12114 of 25111 51.8% 0.07/s -21-Mar 08:29:39 test76 16.0 sec 15: 12099 of 25111 51.8% 0.94/s -21-Mar 08:30:21 test244 41.0 sec 17: 12082 of 25111 51.9% 0.41/s -[malloc debugging turned off] -21-Mar 08:30:21 test201 0.0 sec 3: 12079 of 25111 51.9% 377.74/s -21-Mar 08:30:22 test225 0.1 sec 1: 12078 of 25111 51.9% 6.95/s -21-Mar 08:30:22 test176 0.1 sec 5: 12073 of 25111 51.9% 66.48/s -21-Mar 08:30:23 test208 0.0 sec 5: 12068 of 25111 51.9% 302.72/s -21-Mar 08:30:23 test216 0.1 sec 3: 12065 of 25111 52.0% 33.92/s -21-Mar 08:30:48 test142 24.0 sec 631: 11434 of 25111 54.5% 26.33/s -21-Mar 08:35:28 test142 279.9 sec 10: 11424 of 25111 54.5% 0.04/s -21-Mar 08:35:53 test142 23.6 sec 2: 11422 of 25111 54.5% 0.08/s -21-Mar 08:35:53 test137 0.4 sec 3: 11419 of 25111 54.5% 7.70/s -21-Mar 08:35:54 test137 0.0 sec 2: 11417 of 25111 54.5% 281.53/s -21-Mar 08:35:55 test139 0.4 sec 2: 11415 of 25111 54.5% 5.41/s -21-Mar 08:35:55 test172 0.1 sec 3: 11412 of 25111 54.6% 39.19/s -21-Mar 08:35:57 test148 0.8 sec 4: 11408 of 25111 54.6% 4.94/s -21-Mar 08:35:58 test157 0.7 sec 12: 11396 of 25111 54.6% 17.23/s -21-Mar 08:35:59 test182 1.0 sec 5: 11391 of 25111 54.6% 5.25/s -21-Mar 08:36:00 test108 0.6 sec 2: 11389 of 25111 54.6% 3.23/s -21-Mar 08:36:01 test108 0.4 sec 2: 11387 of 25111 54.7% 5.41/s -21-Mar 08:36:03 test130 0.8 sec 22: 11365 of 25111 54.7% 26.46/s -21-Mar 08:36:03 test124 0.2 sec 3: 11362 of 25111 54.8% 17.33/s -21-Mar 08:36:04 test138 0.0 sec 1: 11361 of 25111 54.8% 20.29/s -21-Mar 08:36:09 test227 4.8 sec 27: 11334 of 25111 54.9% 5.58/s -21-Mar 08:36:39 test125 29.4 sec 630: 10704 of 25111 57.4% 21.46/s -21-Mar 08:39:05 test234 144.9 sec 385: 10319 of 25111 58.9% 2.66/s -21-Mar 08:42:51 test234 225.6 sec 3: 10316 of 25111 58.9% 0.01/s -21-Mar 08:43:40 test242 48.2 sec 77: 10239 of 25111 59.2% 1.60/s -21-Mar 08:43:42 test173 1.6 sec 11: 10228 of 25111 59.3% 7.06/s -21-Mar 08:43:46 test200 3.2 sec 10: 10218 of 25111 59.3% 3.09/s -21-Mar 08:43:46 test197 0.1 sec 1: 10217 of 25111 59.3% 7.52/s -21-Mar 08:43:48 test84 1.3 sec 18: 10199 of 25111 59.4% 13.38/s -21-Mar 08:43:55 test19b 6.0 sec 59: 10140 of 25111 59.6% 9.83/s -21-Mar 08:43:56 test133 0.4 sec 2: 10138 of 25111 59.6% 5.21/s -21-Mar 08:44:00 test80 4.0 sec 12: 10126 of 25111 59.7% 3.03/s -21-Mar 08:45:05 test23 63.9 sec 148: 9978 of 25111 60.3% 2.31/s -21-Mar 08:45:07 test135 1.9 sec 7: 9971 of 25111 60.3% 3.69/s -21-Mar 08:46:23 test160 74.6 sec 24: 9947 of 25111 60.4% 0.32/s -21-Mar 08:46:28 test54 5.2 sec 20: 9927 of 25111 60.5% 3.85/s -21-Mar 08:46:30 test129 1.2 sec 4: 9923 of 25111 60.5% 3.45/s -21-Mar 08:46:33 test69 2.1 sec 6: 9917 of 25111 60.5% 2.91/s -21-Mar 08:48:07 test230 93.5 sec 114: 9803 of 25111 61.0% 1.22/s -21-Mar 09:21:15 test74 1987.5 sec 6637: 3166 of 25111 87.4% 3.34/s -21-Mar 09:33:25 test127 729.1 sec 1703: 1463 of 25111 94.2% 2.34/s -21-Mar 09:33:29 test19 3.3 sec 12: 1451 of 25111 94.2% 3.65/s -21-Mar 09:33:33 test11 3.8 sec 3: 1448 of 25111 94.2% 0.78/s -21-Mar 09:33:37 test215 2.9 sec 1: 1447 of 25111 94.2% 0.34/s -21-Mar 09:33:55 test193 17.1 sec 5: 1442 of 25111 94.3% 0.29/s -21-Mar 09:36:35 test195 159.4 sec 39: 1403 of 25111 94.4% 0.24/s -21-Mar 09:37:00 test243 24.9 sec 7: 1396 of 25111 94.4% 0.28/s -21-Mar 09:37:12 test29 10.8 sec 3: 1393 of 25111 94.5% 0.28/s -21-Mar 09:37:14 testc2(0,0) 1.3 sec 7: 1386 of 25111 94.5% 5.30/s -21-Mar 09:37:34 testc2(0,0) 19.6 sec 1: 1385 of 25111 94.5% 0.05/s -21-Mar 09:37:35 testc4(0) 0.6 sec 4: 1381 of 25111 94.5% 6.53/s -21-Mar 09:37:51 testc7(0) 14.7 sec 3: 1378 of 25111 94.5% 0.20/s -21-Mar 09:37:57 testcc(1) 5.1 sec 1: 1377 of 25111 94.5% 0.20/s -21-Mar 09:38:06 test187 8.6 sec 3: 1374 of 25111 94.5% 0.35/s -21-Mar 09:38:12 test192 5.8 sec 1: 1373 of 25111 94.5% 0.17/s -21-Mar 09:38:32 test181 18.5 sec 4: 1369 of 25111 94.5% 0.22/s -21-Mar 09:40:22 test185 109.6 sec 6: 1363 of 25111 94.6% 0.05/s -21-Mar 09:41:06 test53 43.6 sec 4: 1359 of 25111 94.6% 0.09/s -21-Mar 09:41:57 test17 49.7 sec 27: 1332 of 25111 94.7% 0.54/s -21-Mar 09:49:21 test231 443.1 sec 162: 1170 of 25111 95.3% 0.37/s -21-Mar 10:44:39 test10 3317.2 sec 970: 200 of 25111 99.2% 0.29/s -21-Mar 11:03:35 test75b 1112.2 sec 155: 45 of 25111 99.8% 0.14/s -21-Mar 11:05:08 test21b 90.6 sec 26: 19 of 25111 99.9% 0.29/s -21-Mar 11:06:01 testca(1) 52.1 sec 5: 14 of 25111 99.9% 0.10/s -21-Mar 11:08:01 test81 119.4 sec 1: 13 of 25111 99.9% 0.01/s -21-Mar 11:14:12 test18 369.8 sec 13: all 25111 full 100% 0.04/s -[malloc debugging turned back on] diff --git a/Tcov/log_May22.txt b/Tcov/log_May22.txt new file mode 100644 index 0000000000..ebe423dda0 --- /dev/null +++ b/Tcov/log_May22.txt @@ -0,0 +1,205 @@ + +---------------------------------------------- [malloc] [cover] +22-May 18:35:46 test169 8.9 sec 550: 24390 of 25105 2.8% 61.48/s +22-May 18:35:47 test250 1.6 sec 373: 24017 of 25105 4.3% 239.64/s +22-May 18:35:50 test250 2.4 sec 57: 23960 of 25105 4.6% 23.71/s +22-May 18:35:50 test279 0.1 sec 119: 23841 of 25105 5.0% 1570.29/s +22-May 18:35:50 test278 0.1 sec 48: 23793 of 25105 5.2% 658.19/s +22-May 18:35:50 test277 0.1 sec 38: 23755 of 25105 5.4% 599.77/s +22-May 18:35:50 test276 0.1 sec 1626: 22129 of 25105 11.9% 26337.96/s +22-May 18:35:50 test275 0.1 sec 117: 22012 of 25105 12.3% 1920.68/s +22-May 18:35:51 test274 0.1 sec 129: 21883 of 25105 12.8% 2258.48/s +22-May 18:35:51 test273 0.2 sec 114: 21769 of 25105 13.3% 695.05/s +22-May 18:35:51 test272 0.1 sec 11: 21758 of 25105 13.3% 186.21/s +22-May 18:35:51 test271 0.1 sec 497: 21261 of 25105 15.3% 8422.30/s +22-May 18:35:51 test270 0.1 sec 286: 20975 of 25105 16.5% 4941.09/s +22-May 18:35:51 test269 0.1 sec 83: 20892 of 25105 16.8% 1401.39/s +22-May 18:35:51 test268 0.1 sec 5: 20887 of 25105 16.8% 60.92/s +22-May 18:35:54 test145 2.4 sec 210: 20677 of 25105 17.6% 88.99/s +22-May 18:35:54 test145 0.0 sec 1: 20676 of 25105 17.6% 26.26/s +22-May 18:35:54 test145 0.0 sec 18: 20658 of 25105 17.7% 791.10/s +22-May 18:35:54 test145 0.0 sec 4: 20654 of 25105 17.7% 217.32/s +22-May 18:35:56 test145 1.7 sec 34: 20620 of 25105 17.9% 19.91/s +22-May 18:35:56 test145 0.0 sec 3: 20617 of 25105 17.9% 179.97/s +22-May 18:35:57 test240 1.1 sec 74: 20540 of 25105 18.2% 64.78/s +22-May 18:35:57 test240 0.3 sec 1: 20539 of 25105 18.2% 3.19/s +22-May 18:35:59 test237 1.0 sec 40: 20499 of 25105 18.3% 38.57/s +22-May 18:36:01 test237 2.8 sec 2: 20497 of 25105 18.4% 0.72/s +22-May 18:36:02 test237 0.0 sec 18: 20479 of 25105 18.4% 410.28/s +22-May 18:36:02 test237 0.0 sec 6: 20473 of 25105 18.5% 192.54/s +22-May 18:36:02 test237 0.0 sec 4: 20469 of 25105 18.5% 126.51/s +22-May 18:36:03 test267 0.8 sec 8: 20461 of 25105 18.5% 10.21/s +22-May 18:36:03 test267 0.0 sec 1: 20460 of 25105 18.5% 2079.00/s +22-May 18:36:03 test265 0.5 sec 36: 20424 of 25105 18.6% 66.23/s +22-May 18:36:03 test264 0.1 sec 173: 20251 of 25105 19.3% 2716.58/s +22-May 18:36:05 test263 0.9 sec 13: 20238 of 25105 19.4% 14.15/s +22-May 18:36:05 test262 0.1 sec 22: 20216 of 25105 19.5% 314.59/s +22-May 18:36:05 test261 0.1 sec 22: 20194 of 25105 19.6% 377.94/s +22-May 18:36:05 test260 0.1 sec 3: 20191 of 25105 19.6% 52.03/s +22-May 18:36:08 test259 2.6 sec 4: 20187 of 25105 19.6% 1.51/s +22-May 18:36:08 test258 0.4 sec 20: 20167 of 25105 19.7% 56.51/s +22-May 18:36:09 test257 0.3 sec 41: 20126 of 25105 19.8% 142.48/s +22-May 18:36:09 test255 0.1 sec 8: 20118 of 25105 19.9% 131.14/s +22-May 18:36:09 test254 0.1 sec 14: 20104 of 25105 19.9% 240.15/s +22-May 18:36:15 test254 5.5 sec 20: 20084 of 25105 20.0% 3.63/s +22-May 18:36:15 test254 0.1 sec 1: 20083 of 25105 20.0% 17.63/s +22-May 18:36:15 test253 0.1 sec 9: 20074 of 25105 20.0% 61.02/s +22-May 18:36:15 test252 0.1 sec 7: 20067 of 25105 20.1% 102.93/s +22-May 18:37:44 test251 88.3 sec 434: 19633 of 25105 21.8% 4.92/s +22-May 18:41:28 test251 223.8 sec 78: 19555 of 25105 22.1% 0.35/s +22-May 18:41:29 test249 1.2 sec 24: 19531 of 25105 22.2% 19.20/s +22-May 18:41:29 test247 0.0 sec 24: 19507 of 25105 22.3% 1304.56/s +22-May 18:41:41 test246 11.1 sec 69: 19438 of 25105 22.6% 6.21/s +22-May 18:42:02 test01 21.1 sec 1339: 18099 of 25105 27.9% 63.47/s +22-May 18:42:03 test245 1.1 sec 34: 18065 of 25105 28.0% 30.17/s +22-May 18:42:03 test245 0.0 sec 8: 18057 of 25105 28.1% 451.93/s +22-May 18:42:03 test199 0.0 sec 1: 18056 of 25105 28.1% 236.18/s +22-May 18:42:04 test83 0.1 sec 10: 18046 of 25105 28.1% 162.79/s +22-May 18:42:04 test210 0.0 sec 7: 18039 of 25105 28.1% 2893.76/s +22-May 18:42:04 test165 0.0 sec 1: 18038 of 25105 28.1% 239.87/s +22-May 18:42:04 test219 0.1 sec 9: 18029 of 25105 28.2% 146.91/s +22-May 18:42:05 test219 0.3 sec 3: 18026 of 25105 28.2% 9.78/s +22-May 18:42:05 test241 0.1 sec 10: 18016 of 25105 28.2% 94.17/s +22-May 18:42:05 test220 0.1 sec 10: 18006 of 25105 28.3% 105.49/s +22-May 18:42:05 test211 0.0 sec 15: 17991 of 25105 28.3% 482.75/s +22-May 18:42:06 test202 0.1 sec 67: 17924 of 25105 28.6% 635.26/s +22-May 18:42:06 test202 0.0 sec 1: 17923 of 25105 28.6% 32.24/s +22-May 18:42:09 test152 3.2 sec 827: 17096 of 25105 31.9% 255.85/s +22-May 18:42:11 test152 1.4 sec 13: 17083 of 25105 32.0% 9.21/s +22-May 18:43:40 test152 89.1 sec 245: 16838 of 25105 32.9% 2.75/s +22-May 18:43:41 test222 0.1 sec 18: 16820 of 25105 33.0% 134.05/s +22-May 18:43:41 test256 0.7 sec 58: 16762 of 25105 33.2% 84.49/s +22-May 18:43:45 test186 3.1 sec 44: 16718 of 25105 33.4% 14.36/s +22-May 18:43:45 test186 0.4 sec 3: 16715 of 25105 33.4% 6.68/s +22-May 18:43:46 test186(0) 0.4 sec 5: 16710 of 25105 33.4% 11.62/s +22-May 18:43:46 test150 0.1 sec 36: 16674 of 25105 33.6% 289.39/s +22-May 18:43:47 test239 0.1 sec 15: 16659 of 25105 33.6% 160.60/s +22-May 18:43:48 test239 1.0 sec 2: 16657 of 25105 33.7% 1.91/s +22-May 18:43:48 test235 0.0 sec 4: 16653 of 25105 33.7% 102.00/s +22-May 18:43:48 test226 0.0 sec 8: 16645 of 25105 33.7% 656.76/s +22-May 18:43:49 test223 0.0 sec 2: 16643 of 25105 33.7% 71.61/s +22-May 18:43:49 test204 0.1 sec 14: 16629 of 25105 33.8% 119.97/s +22-May 18:43:49 test203 0.1 sec 9: 16620 of 25105 33.8% 152.16/s +22-May 18:43:49 test183 0.0 sec 12: 16608 of 25105 33.8% 462.77/s +22-May 18:43:50 test179 0.1 sec 15: 16593 of 25105 33.9% 146.96/s +22-May 18:43:52 test179 2.3 sec 4: 16589 of 25105 33.9% 1.76/s +22-May 18:43:53 test174 0.0 sec 10: 16579 of 25105 34.0% 239.85/s +22-May 18:43:53 test155 0.1 sec 41: 16538 of 25105 34.1% 343.00/s +22-May 18:43:53 test136 0.2 sec 55: 16483 of 25105 34.3% 332.95/s +22-May 18:43:54 test02 0.7 sec 247: 16236 of 25105 35.3% 332.14/s +22-May 18:43:55 test109 0.5 sec 10: 16226 of 25105 35.4% 21.57/s +22-May 18:43:55 test109 0.0 sec 4: 16222 of 25105 35.4% 1586.67/s +22-May 18:43:56 test109 0.4 sec 8: 16214 of 25105 35.4% 22.62/s +22-May 18:43:56 test04 0.1 sec 15: 16199 of 25105 35.5% 163.52/s +22-May 18:43:56 test207 0.0 sec 2: 16197 of 25105 35.5% 600.96/s +22-May 18:43:57 test221 0.0 sec 2: 16195 of 25105 35.5% 257.43/s +22-May 18:43:57 test162 0.1 sec 3: 16192 of 25105 35.5% 58.77/s +22-May 18:43:59 test159 1.2 sec 72: 16120 of 25105 35.8% 60.65/s +22-May 18:43:59 test09 0.0 sec 5: 16115 of 25105 35.8% 620.27/s +22-May 18:43:59 test132 0.1 sec 8: 16107 of 25105 35.8% 97.70/s +22-May 18:44:04 test141 4.5 sec 549: 15558 of 25105 38.0% 121.98/s +22-May 18:44:06 testc2(1,1) 1.4 sec 20: 15538 of 25105 38.1% 13.83/s +22-May 18:44:13 testc2(1,1) 7.5 sec 4: 15534 of 25105 38.1% 0.54/s +22-May 18:44:14 test214 0.0 sec 3: 15531 of 25105 38.1% 340.17/s +22-May 18:44:14 test213 0.0 sec 2: 15529 of 25105 38.1% 201.31/s +22-May 18:44:17 test206 2.7 sec 221: 15308 of 25105 39.0% 82.45/s +22-May 18:44:37 test206 19.5 sec 24: 15284 of 25105 39.1% 1.23/s +22-May 18:44:37 test212 0.0 sec 8: 15276 of 25105 39.2% 424.74/s +22-May 18:44:38 test212 0.2 sec 2: 15274 of 25105 39.2% 9.43/s +22-May 18:44:38 test128 0.3 sec 41: 15233 of 25105 39.3% 127.02/s +22-May 18:44:39 test82 0.1 sec 16: 15217 of 25105 39.4% 184.12/s +22-May 18:44:43 test229 3.5 sec 9: 15208 of 25105 39.4% 2.58/s +22-May 18:44:44 test229 0.8 sec 1: 15207 of 25105 39.4% 1.22/s +22-May 18:44:45 test144 0.6 sec 2: 15205 of 25105 39.4% 3.61/s +22-May 18:46:13 test14 88.4 sec 662: 14543 of 25105 42.1% 7.49/s +22-May 18:51:04 test14 290.4 sec 118: 14425 of 25105 42.5% 0.41/s +22-May 18:51:13 test180 8.4 sec 128: 14297 of 25105 43.1% 15.17/s +22-May 18:51:17 test236 3.7 sec 74: 14223 of 25105 43.3% 20.12/s +22-May 18:51:20 test232 2.4 sec 22: 14201 of 25105 43.4% 9.04/s +22-May 18:51:40 test228 19.7 sec 27: 14174 of 25105 43.5% 1.37/s +22-May 18:53:43 test154 122.2 sec 1506: 12668 of 25105 49.5% 12.33/s +22-May 18:55:53 test154 129.7 sec 2: 12666 of 25105 49.5% 0.02/s +22-May 18:56:08 test238 14.5 sec 54: 12612 of 25105 49.8% 3.73/s +22-May 18:57:25 test238 76.4 sec 9: 12603 of 25105 49.8% 0.12/s +22-May 18:59:12 test151b 107.3 sec 126: 12477 of 25105 50.3% 1.17/s +22-May 18:59:16 test184 3.2 sec 38: 12439 of 25105 50.5% 11.85/s +22-May 18:59:30 test191 13.3 sec 21: 12418 of 25105 50.5% 1.58/s +22-May 18:59:44 test191 13.8 sec 3: 12415 of 25105 50.5% 0.22/s +22-May 19:08:08 test188 503.5 sec 212: 12203 of 25105 51.4% 0.42/s +22-May 19:09:11 test188 61.7 sec 3: 12200 of 25105 51.4% 0.05/s +22-May 19:09:16 test224 5.1 sec 24: 12176 of 25105 51.5% 4.66/s +22-May 19:09:19 test196 2.4 sec 11: 12165 of 25105 51.5% 4.54/s +22-May 19:09:25 test209 5.3 sec 20: 12145 of 25105 51.6% 3.77/s +22-May 19:09:44 test104 18.9 sec 40: 12105 of 25105 51.8% 2.12/s +22-May 19:09:53 test189 8.8 sec 1: 12104 of 25105 51.8% 0.11/s +22-May 19:11:05 test194 70.8 sec 5: 12099 of 25105 51.8% 0.07/s +22-May 19:11:21 test76 15.8 sec 15: 12084 of 25105 51.9% 0.95/s +22-May 19:12:03 test244 41.7 sec 17: 12067 of 25105 51.9% 0.41/s +[malloc debugging turned off] +22-May 19:12:03 test201 0.0 sec 3: 12064 of 25105 51.9% 627.35/s +22-May 19:12:04 test225 0.1 sec 1: 12063 of 25105 51.9% 6.95/s +22-May 19:12:04 test176 0.1 sec 5: 12058 of 25105 52.0% 67.53/s +22-May 19:12:05 test208 0.0 sec 5: 12053 of 25105 52.0% 278.44/s +22-May 19:12:05 test216 0.1 sec 3: 12050 of 25105 52.0% 35.37/s +22-May 19:12:14 test142 8.0 sec 631: 11419 of 25105 54.5% 78.66/s +22-May 19:17:30 test142 316.0 sec 10: 11409 of 25105 54.6% 0.03/s +22-May 19:17:39 test142 7.8 sec 2: 11407 of 25105 54.6% 0.26/s +22-May 19:17:40 test137 0.4 sec 3: 11404 of 25105 54.6% 7.85/s +22-May 19:17:41 test137 0.0 sec 2: 11402 of 25105 54.6% 304.37/s +22-May 19:17:41 test139 0.3 sec 2: 11400 of 25105 54.6% 5.91/s +22-May 19:17:42 test172 0.1 sec 3: 11397 of 25105 54.6% 39.62/s +22-May 19:17:43 test148 0.8 sec 4: 11393 of 25105 54.6% 5.21/s +22-May 19:17:44 test157 0.6 sec 12: 11381 of 25105 54.7% 19.43/s +22-May 19:17:46 test182 0.9 sec 5: 11376 of 25105 54.7% 5.33/s +22-May 19:17:47 test108 0.6 sec 2: 11374 of 25105 54.7% 3.30/s +22-May 19:17:48 test108 0.2 sec 2: 11372 of 25105 54.7% 11.63/s +22-May 19:17:49 test130 0.8 sec 22: 11350 of 25105 54.8% 27.11/s +22-May 19:17:50 test124 0.2 sec 3: 11347 of 25105 54.8% 16.60/s +22-May 19:17:50 test138 0.0 sec 1: 11346 of 25105 54.8% 20.13/s +22-May 19:17:56 test227 4.7 sec 27: 11319 of 25105 54.9% 5.75/s +22-May 19:18:26 test125 29.7 sec 618: 10701 of 25105 57.4% 20.83/s +22-May 19:20:59 test234 152.8 sec 385: 10316 of 25105 58.9% 2.52/s +22-May 19:22:11 test234 70.8 sec 3: 10313 of 25105 58.9% 0.04/s +22-May 19:23:00 test242 48.4 sec 77: 10236 of 25105 59.2% 1.59/s +22-May 19:23:02 test173 1.5 sec 11: 10225 of 25105 59.3% 7.11/s +22-May 19:23:05 test200 3.2 sec 10: 10215 of 25105 59.3% 3.14/s +22-May 19:23:06 test197 0.1 sec 1: 10214 of 25105 59.3% 7.37/s +22-May 19:23:08 test84 1.3 sec 18: 10196 of 25105 59.4% 13.55/s +22-May 19:23:14 test19b 5.9 sec 59: 10137 of 25105 59.6% 10.04/s +22-May 19:23:15 test133 0.4 sec 2: 10135 of 25105 59.6% 5.20/s +22-May 19:23:20 test80 4.3 sec 12: 10123 of 25105 59.7% 2.78/s +22-May 19:23:40 test23 19.1 sec 148: 9975 of 25105 60.3% 7.75/s +22-May 19:23:43 test135 2.0 sec 7: 9968 of 25105 60.3% 3.59/s +22-May 19:25:02 test160 78.5 sec 24: 9944 of 25105 60.4% 0.31/s +22-May 19:25:08 test54 5.2 sec 20: 9924 of 25105 60.5% 3.81/s +22-May 19:25:09 test129 1.1 sec 4: 9920 of 25105 60.5% 3.49/s +22-May 19:25:12 test69 2.0 sec 6: 9914 of 25105 60.5% 3.03/s +22-May 19:26:46 test230 93.7 sec 114: 9800 of 25105 61.0% 1.22/s +22-May 19:39:09 test74 742.1 sec 6637: 3163 of 25105 87.4% 8.94/s +22-May 19:42:59 test127 229.7 sec 1703: 1460 of 25105 94.2% 7.41/s +22-May 19:43:03 test19 3.2 sec 12: 1448 of 25105 94.2% 3.74/s +22-May 19:43:08 test11 3.7 sec 3: 1445 of 25105 94.2% 0.81/s +22-May 19:43:11 test215 3.3 sec 1: 1444 of 25105 94.2% 0.31/s +22-May 19:43:29 test193 17.3 sec 5: 1439 of 25105 94.3% 0.29/s +22-May 19:46:15 test195 165.4 sec 39: 1400 of 25105 94.4% 0.24/s +22-May 19:46:41 test243 25.2 sec 7: 1393 of 25105 94.5% 0.28/s +22-May 19:46:49 test29 6.5 sec 3: 1390 of 25105 94.5% 0.46/s +22-May 19:46:50 testc2(0,0) 1.0 sec 7: 1383 of 25105 94.5% 7.33/s +22-May 19:47:13 testc2(0,0) 21.7 sec 1: 1382 of 25105 94.5% 0.05/s +22-May 19:47:14 testc4(0) 0.5 sec 4: 1378 of 25105 94.5% 7.51/s +22-May 19:47:29 testc7(0) 14.8 sec 2: 1376 of 25105 94.5% 0.14/s +22-May 19:47:35 testcc(1) 5.2 sec 1: 1375 of 25105 94.5% 0.19/s +22-May 19:47:45 test187 8.7 sec 3: 1372 of 25105 94.5% 0.34/s +22-May 19:47:51 test192 5.9 sec 1: 1371 of 25105 94.5% 0.17/s +22-May 19:48:11 test181 19.1 sec 4: 1367 of 25105 94.6% 0.21/s +22-May 19:50:06 test185 114.0 sec 6: 1361 of 25105 94.6% 0.05/s +22-May 19:50:53 test53 46.6 sec 4: 1357 of 25105 94.6% 0.09/s +22-May 19:51:44 test17 50.2 sec 27: 1330 of 25105 94.7% 0.54/s +22-May 19:59:16 test231 451.5 sec 162: 1168 of 25105 95.3% 0.36/s +22-May 20:54:05 test10 3288.1 sec 968: 200 of 25105 99.2% 0.29/s +22-May 21:13:05 test75b 1139.1 sec 155: 45 of 25105 99.8% 0.14/s +22-May 21:14:37 test21b 90.8 sec 26: 19 of 25105 99.9% 0.29/s +22-May 21:15:31 testca(1) 53.1 sec 5: 14 of 25105 99.9% 0.09/s +22-May 21:17:31 test81 119.2 sec 1: 13 of 25105 99.9% 0.01/s +22-May 21:23:42 test18 370.4 sec 13: all 25105 full 100% 0.04/s +[malloc debugging turned back on] diff --git a/Test/GB_mex_test11.c b/Test/GB_mex_test11.c index dbfe878dca..b84675238e 100644 --- a/Test/GB_mex_test11.c +++ b/Test/GB_mex_test11.c @@ -312,7 +312,7 @@ if (jit_enabled) OK (GxB_set (GxB_JIT_CACHE_PATH, "/tmp/::tmp/grb_@cache \\gunk??")) ; OK (GxB_get (GxB_JIT_CACHE_PATH, &s)) ; printf ("\nfixed cache path: [%s]\n", s) ; - CHECK (MATCH (s, "/tmp/__tmp/grb__cache_/gunk__")) ; + CHECK (MATCH (s, "/tmp/__tmp/grb__cache /gunk__")) ; expected = GrB_INVALID_VALUE ; ERR (GxB_Global_Option_set_CHAR (999, "gunk")) ; diff --git a/cmake_modules/GraphBLAS_version.cmake b/cmake_modules/GraphBLAS_version.cmake index 0c4d85c4c4..94076cf9e9 100644 --- a/cmake_modules/GraphBLAS_version.cmake +++ b/cmake_modules/GraphBLAS_version.cmake @@ -8,7 +8,7 @@ #------------------------------------------------------------------------------- # version of SuiteSparse:GraphBLAS -set ( GraphBLAS_DATE "May XX, 2024" ) # FIXME NOW +set ( GraphBLAS_DATE "May 22, 2024" ) set ( GraphBLAS_VERSION_MAJOR 9 CACHE STRING "" FORCE ) set ( GraphBLAS_VERSION_MINOR 2 CACHE STRING "" FORCE ) set ( GraphBLAS_VERSION_SUB 0 CACHE STRING "" FORCE ) From 349d14bed416ef4488632861ade24a6c08d5bc32 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Thu, 23 May 2024 08:49:21 -0500 Subject: [PATCH 76/76] sync with paru_dev2 --- Config/GraphBLAS.h.in | 10 +++++----- Include/GraphBLAS.h | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Config/GraphBLAS.h.in b/Config/GraphBLAS.h.in index 30a0cecd00..864a4f5841 100644 --- a/Config/GraphBLAS.h.in +++ b/Config/GraphBLAS.h.in @@ -40,11 +40,6 @@ #ifndef GRAPHBLAS_H #define GRAPHBLAS_H -#if defined ( __cplusplus ) -extern "C" -{ -#endif - //============================================================================== //=== GraphBLAS macros, typedefs, enums, and global variables ================= //============================================================================== @@ -2682,6 +2677,11 @@ GrB_Format ; // GraphBLAS/CUDA, since they do not need access these definitions. User // applications have access to these methods. +#if defined ( __cplusplus ) +extern "C" +{ +#endif + #ifndef GB_CUDA_FOLDER //============================================================================== diff --git a/Include/GraphBLAS.h b/Include/GraphBLAS.h index c1968a42b9..150bf3d07b 100644 --- a/Include/GraphBLAS.h +++ b/Include/GraphBLAS.h @@ -40,11 +40,6 @@ #ifndef GRAPHBLAS_H #define GRAPHBLAS_H -#if defined ( __cplusplus ) -extern "C" -{ -#endif - //============================================================================== //=== GraphBLAS macros, typedefs, enums, and global variables ================= //============================================================================== @@ -2682,6 +2677,11 @@ GrB_Format ; // GraphBLAS/CUDA, since they do not need access these definitions. User // applications have access to these methods. +#if defined ( __cplusplus ) +extern "C" +{ +#endif + #ifndef GB_CUDA_FOLDER //==============================================================================

    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 RCOn8B1doM9Syu(`zW`toX{G=G diff --git a/Doc/GraphBLAS_UserGuide.tex b/Doc/GraphBLAS_UserGuide.tex index 7b234f2088..1b0ce7b17e 100644 --- a/Doc/GraphBLAS_UserGuide.tex +++ b/Doc/GraphBLAS_UserGuide.tex @@ -14789,6 +14789,8 @@ \section{Release Notes} \begin{itemize} \item JIT: sanitizing the JIT cache path, better burble for compiler errors. + \item \verb'GrB_get/GrB_set': better handling of concurrent get/set between + different user threads. \end{itemize} \item Mar 22, 2024: version 9.1.0 diff --git a/Source/GB_assign_describe.c b/Source/GB_assign_describe.c index 908ce7ecd4..5dd15d46ec 100644 --- a/Source/GB_assign_describe.c +++ b/Source/GB_assign_describe.c @@ -59,9 +59,9 @@ void GB_assign_describe // construct the Mask string //-------------------------------------------------------------------------- - #define GB_STRLEN 128 + #define GB_MASK_STRING_LEN 128 const char *Mask ; - char Mask_string [GB_STRLEN+1] ; + char Mask_string [GB_MASK_STRING_LEN+1] ; if (M_is_null) { // M is not present @@ -77,7 +77,7 @@ void GB_assign_describe else { // M is present - snprintf (Mask_string, GB_STRLEN, "<%sM%s%s%s>", + snprintf (Mask_string, GB_MASK_STRING_LEN, "<%sM%s%s%s>", (Mask_comp) ? "!" : "", (M_sparsity == GxB_BITMAP) ? ",bitmap" : ((M_sparsity == GxB_FULL) ? ",full" : ""), diff --git a/Source/GB_jitifyer.c b/Source/GB_jitifyer.c index 5ec1e205c7..7ea125fd3f 100644 --- a/Source/GB_jitifyer.c +++ b/Source/GB_jitifyer.c @@ -192,6 +192,7 @@ static void check_table (void) #define GB_COPY_STUFF(X,src) \ { \ + ASSERT (src != NULL) ; \ size_t len = strlen (src) ; \ GB_MALLOC_STUFF (X, len) ; \ strncpy (X, src, X ## _allocated) ; \ @@ -347,7 +348,7 @@ GrB_Info GB_jitifyer_init (void) // initialize the remaining strings //-------------------------------------------------------------------------- - GB_COPY_STUFF (GB_jit_error_log, "") ; + GB_COPY_STUFF (GB_jit_error_log, "") ; GB_COPY_STUFF (GB_jit_C_compiler, GB_C_COMPILER) ; GB_COPY_STUFF (GB_jit_C_flags, GB_C_FLAGS) ; GB_COPY_STUFF (GB_jit_C_link_flags, GB_C_LINK_FLAGS) ; @@ -495,8 +496,7 @@ GrB_Info GB_jitifyer_init (void) #undef IS encoding->kcode = c ; encoding->code = scode ; - encoding->suffix_len = (suffix == NULL) ? 0 : - ((int32_t) strlen (suffix)) ; + encoding->suffix_len = (int32_t) GB_STRLEN (suffix) ; //---------------------------------------------------------------------- // get the hash of this PreJIT kernel @@ -2331,7 +2331,8 @@ void GB_jitifyer_cmake_compile (char *kernel_name, uint64_t hash) uint32_t bucket = hash & 0xFF ; GBURBLE ("(jit: %s)\n", "cmake") ; char *burble_stdout = GB_Global_burble_get ( ) ? "" : GB_DEV_NULL ; - char *err_redirect = (strlen (GB_jit_error_log) > 0) ? " 2>> " : " 2>&1 " ; + char *err_redirect = (GB_STRLEN (GB_jit_error_log) > 0) ? + " 2>> " : " 2>&1 " ; #if defined (__MINGW32__) #define GB_SH_C "sh -c " @@ -2375,7 +2376,7 @@ void GB_jitifyer_cmake_compile (char *kernel_name, uint64_t hash) "add_library ( %s SHARED \"%s/c/%02x/%s.c\" )\n", kernel_name, // target name for add_library command GB_jit_cache_path, bucket, kernel_name) ; // source file for add_library - if (strlen (GB_jit_C_cmake_libs) > 0) + if (GB_STRLEN (GB_jit_C_cmake_libs) > 0) { fprintf (fp, "target_link_libraries ( %s PUBLIC %s )\n", @@ -2455,7 +2456,8 @@ void GB_jitifyer_nvcc_compile (char *kernel_name, uint32_t bucket) #if defined ( GRAPHBLAS_HAS_CUDA ) && !defined ( NJIT ) char *burble_stdout = GB_Global_burble_get ( ) ? "" : GB_DEV_NULL ; - char *err_redirect = (strlen (GB_jit_error_log) > 0) ? " 2>> " : " 2>&1 " ; + char *err_redirect = (GB_STRLEN (GB_jit_error_log) > 0) ? + " 2>> " : " 2>&1 " ; GBURBLE ("(jit compiling cuda with nvcc: %s/c/%02x/%s.cu) ", GB_jit_cache_path, bucket, kernel_name) ; @@ -2532,7 +2534,8 @@ void GB_jitifyer_direct_compile (char *kernel_name, uint32_t bucket) #ifndef NJIT char *burble_stdout = GB_Global_burble_get ( ) ? "" : GB_DEV_NULL ; - char *err_redirect = (strlen (GB_jit_error_log) > 0) ? " 2>> " : " 2>&1 " ; + char *err_redirect = (GB_STRLEN (GB_jit_error_log) > 0) ? + " 2>> " : " 2>&1 " ; snprintf (GB_jit_temp, GB_jit_temp_allocated, diff --git a/Source/GrB_Global_get.c b/Source/GrB_Global_get.c index 9bfb095a86..5722360549 100644 --- a/Source/GrB_Global_get.c +++ b/Source/GrB_Global_get.c @@ -160,46 +160,51 @@ GrB_Info GrB_Global_get_Scalar // get the field //-------------------------------------------------------------------------- - int32_t i ; - GrB_Info info = GB_global_enum_get (&i, field) ; - if (info == GrB_SUCCESS) - { - // field specifies an int: assign it to the scalar - info = GB_setElement ((GrB_Matrix) value, NULL, &i, 0, 0, - GB_INT32_code, Werk) ; - } - else - { - double x ; - int64_t i64 ; - switch ((int) field) - { + GrB_Info info = GrB_NO_VALUE ; + + #pragma omp critical (GB_global_get_set) + { + int32_t i ; + info = GB_global_enum_get (&i, field) ; + if (info == GrB_SUCCESS) + { + // field specifies an int: assign it to the scalar + info = GB_setElement ((GrB_Matrix) value, NULL, &i, 0, 0, + GB_INT32_code, Werk) ; + } + else + { + double x ; + int64_t i64 ; + switch ((int) field) + { - case GxB_HYPER_SWITCH : + case GxB_HYPER_SWITCH : - x = (double) GB_Global_hyper_switch_get ( ) ; - info = GB_setElement ((GrB_Matrix) value, NULL, &x, 0, 0, - GB_FP64_code, Werk) ; + x = (double) GB_Global_hyper_switch_get ( ) ; + info = GB_setElement ((GrB_Matrix) value, NULL, &x, 0, 0, + GB_FP64_code, Werk) ; - break ; + break ; - case GxB_GLOBAL_CHUNK : // same as GxB_CHUNK + case GxB_GLOBAL_CHUNK : // same as GxB_CHUNK - x = GB_Context_chunk_get (NULL) ; - info = GB_setElement ((GrB_Matrix) value, NULL, &x, 0, 0, - GB_FP64_code, Werk) ; - break ; + x = GB_Context_chunk_get (NULL) ; + info = GB_setElement ((GrB_Matrix) value, NULL, &x, 0, 0, + GB_FP64_code, Werk) ; + break ; - case GxB_HYPER_HASH : + case GxB_HYPER_HASH : - i64 = GB_Global_hyper_hash_get ( ) ; - info = GB_setElement ((GrB_Matrix) value, NULL, &i64, 0, 0, - GB_INT64_code, Werk) ; - break ; + i64 = GB_Global_hyper_hash_get ( ) ; + info = GB_setElement ((GrB_Matrix) value, NULL, &i64, 0, 0, + GB_INT64_code, Werk) ; + break ; - default : + default : - return (GrB_INVALID_VALUE) ; + info = GrB_INVALID_VALUE ; + } } } @@ -354,12 +359,18 @@ GrB_Info GrB_Global_get_String // get the field //-------------------------------------------------------------------------- - const char *s ; - GrB_Info info = GB_global_string_get (&s, field) ; - if (info == GrB_SUCCESS) - { - strcpy (value, s) ; + GrB_Info info = GrB_NO_VALUE ; + + #pragma omp critical (GB_global_get_set) + { + const char *s ; + GB_global_string_get (&s, field) ; + if (info == GrB_SUCCESS) + { + strcpy (value, s) ; + } } + #pragma omp flush return (info) ; } @@ -388,7 +399,14 @@ GrB_Info GrB_Global_get_INT32 // get the field //-------------------------------------------------------------------------- - return (GB_global_enum_get (value, field)) ; + GrB_Info info = GrB_NO_VALUE ; + + #pragma omp critical (GB_global_get_set) + { + info = GB_global_enum_get (value, field) ; + } + + return (info) ; } //------------------------------------------------------------------------------ @@ -417,42 +435,47 @@ GrB_Info GrB_Global_get_SIZE //-------------------------------------------------------------------------- const char *s ; - GrB_Info info = GB_global_string_get (&s, field) ; - if (info == GrB_SUCCESS) - { - (*value) = strlen (s) + 1 ; - } - else - { - switch ((int) field) - { + GrB_Info info = GrB_NO_VALUE ; - case GxB_BITMAP_SWITCH : + #pragma omp critical (GB_global_get_set) + { + info = GB_global_string_get (&s, field) ; + if (info == GrB_SUCCESS) + { + (*value) = GB_STRLEN (s) + 1 ; + } + else + { + switch ((int) field) + { - (*value) = sizeof (double) * GxB_NBITMAP_SWITCH ; - break ; + case GxB_BITMAP_SWITCH : - case GxB_COMPILER_VERSION : + (*value) = sizeof (double) * GxB_NBITMAP_SWITCH ; + break ; - (*value) = sizeof (int32_t) * 3 ; - break ; + case GxB_COMPILER_VERSION : - case GxB_MALLOC_FUNCTION : - case GxB_CALLOC_FUNCTION : - case GxB_REALLOC_FUNCTION : - case GxB_FREE_FUNCTION : + (*value) = sizeof (int32_t) * 3 ; + break ; - (*value) = sizeof (void *) ; - break ; + case GxB_MALLOC_FUNCTION : + case GxB_CALLOC_FUNCTION : + case GxB_REALLOC_FUNCTION : + case GxB_FREE_FUNCTION : - default : + (*value) = sizeof (void *) ; + break ; - return (GrB_INVALID_VALUE) ; + default : + + info = GrB_INVALID_VALUE ; + } } } #pragma omp flush - return (GrB_SUCCESS) ; + return (info) ; } //------------------------------------------------------------------------------ @@ -479,64 +502,69 @@ GrB_Info GrB_Global_get_VOID // get the field //-------------------------------------------------------------------------- - switch ((int) field) + GrB_Info info = GrB_NO_VALUE ; + + #pragma omp critical (GB_global_get_set) { + switch ((int) field) + { - case GxB_BITMAP_SWITCH : + case GxB_BITMAP_SWITCH : - { - double *dvalue = (double *) value ; - for (int k = 0 ; k < GxB_NBITMAP_SWITCH ; k++) { - dvalue [k] = (double) GB_Global_bitmap_switch_get (k) ; + double *dvalue = (double *) value ; + for (int k = 0 ; k < GxB_NBITMAP_SWITCH ; k++) + { + dvalue [k] = (double) GB_Global_bitmap_switch_get (k) ; + } } - } - break ; + break ; - case GxB_COMPILER_VERSION : + case GxB_COMPILER_VERSION : - { - int32_t *ivalue = (int32_t *) value ; - ivalue [0] = GB_COMPILER_MAJOR ; - ivalue [1] = GB_COMPILER_MINOR ; - ivalue [2] = GB_COMPILER_SUB ; - } - break ; + { + int32_t *ivalue = (int32_t *) value ; + ivalue [0] = GB_COMPILER_MAJOR ; + ivalue [1] = GB_COMPILER_MINOR ; + ivalue [2] = GB_COMPILER_SUB ; + } + break ; - case GxB_MALLOC_FUNCTION : - { - void **func = (void **) value ; - (*func) = GB_Global_malloc_function_get ( ) ; - } - break ; + case GxB_MALLOC_FUNCTION : + { + void **func = (void **) value ; + (*func) = GB_Global_malloc_function_get ( ) ; + } + break ; - case GxB_CALLOC_FUNCTION : - { - void **func = (void **) value ; - (*func) = GB_Global_calloc_function_get ( ) ; - } - break ; + case GxB_CALLOC_FUNCTION : + { + void **func = (void **) value ; + (*func) = GB_Global_calloc_function_get ( ) ; + } + break ; - case GxB_REALLOC_FUNCTION : - { - void **func = (void **) value ; - (*func) = GB_Global_realloc_function_get ( ) ; - } - break ; + case GxB_REALLOC_FUNCTION : + { + void **func = (void **) value ; + (*func) = GB_Global_realloc_function_get ( ) ; + } + break ; - case GxB_FREE_FUNCTION : - { - void **func = (void **) value ; - (*func) = GB_Global_free_function_get ( ) ; - } - break ; + case GxB_FREE_FUNCTION : + { + void **func = (void **) value ; + (*func) = GB_Global_free_function_get ( ) ; + } + break ; - default : + default : - return (GrB_INVALID_VALUE) ; + info = GrB_INVALID_VALUE ; + } } #pragma omp flush - return (GrB_SUCCESS) ; + return (info) ; } diff --git a/Source/GrB_Global_set.c b/Source/GrB_Global_set.c index 540b69d06e..c38e1b5aac 100644 --- a/Source/GrB_Global_set.c +++ b/Source/GrB_Global_set.c @@ -103,49 +103,52 @@ GrB_Info GrB_Global_set_Scalar // set the field //-------------------------------------------------------------------------- - double dvalue = 0 ; - int32_t ivalue = 0 ; - int64_t i64value = 0 ; - GrB_Info info ; + GrB_Info info = GrB_NO_VALUE ; - switch ((int) field) + #pragma omp critical (GB_global_get_set) { + double dvalue = 0 ; + int32_t ivalue = 0 ; + int64_t i64value = 0 ; + switch ((int) field) + { + + case GxB_HYPER_SWITCH : + + info = GrB_Scalar_extractElement_FP64 (&dvalue, value) ; + if (info == GrB_SUCCESS) + { + GB_Global_hyper_switch_set ((float) dvalue) ; + } + break ; - case GxB_HYPER_SWITCH : - - info = GrB_Scalar_extractElement_FP64 (&dvalue, value) ; - if (info == GrB_SUCCESS) - { - GB_Global_hyper_switch_set ((float) dvalue) ; - } - break ; - - case GxB_GLOBAL_CHUNK : // same as GxB_CHUNK + case GxB_GLOBAL_CHUNK : // same as GxB_CHUNK - info = GrB_Scalar_extractElement_FP64 (&dvalue, value) ; - if (info == GrB_SUCCESS) - { - GB_Context_chunk_set (NULL, dvalue) ; - } - break ; + info = GrB_Scalar_extractElement_FP64 (&dvalue, value) ; + if (info == GrB_SUCCESS) + { + GB_Context_chunk_set (NULL, dvalue) ; + } + break ; - case GxB_HYPER_HASH : + case GxB_HYPER_HASH : - info = GrB_Scalar_extractElement_INT64 (&i64value, value) ; - if (info == GrB_SUCCESS) - { - GB_Global_hyper_hash_set (i64value) ; - } - break ; + info = GrB_Scalar_extractElement_INT64 (&i64value, value) ; + if (info == GrB_SUCCESS) + { + GB_Global_hyper_hash_set (i64value) ; + } + break ; - default : + default : - info = GrB_Scalar_extractElement_INT32 (&ivalue, value) ; - if (info == GrB_SUCCESS) - { - info = GB_global_enum_set (ivalue, field) ; - } - break ; + info = GrB_Scalar_extractElement_INT32 (&ivalue, value) ; + if (info == GrB_SUCCESS) + { + info = GB_global_enum_set (ivalue, field) ; + } + break ; + } } return ((info == GrB_NO_VALUE) ? GrB_EMPTY_OBJECT : info) ; @@ -175,49 +178,66 @@ GrB_Info GrB_Global_set_String // get the field //-------------------------------------------------------------------------- - switch ((int) field) + GrB_Info info = GrB_NO_VALUE ; + + #pragma omp critical (GB_global_get_set) { + switch ((int) field) + { - case GxB_JIT_C_COMPILER_NAME : + case GxB_JIT_C_COMPILER_NAME : - return (GB_jitifyer_set_C_compiler (value)) ; + info = GB_jitifyer_set_C_compiler (value) ; + break ; - case GxB_JIT_C_COMPILER_FLAGS : + case GxB_JIT_C_COMPILER_FLAGS : - return (GB_jitifyer_set_C_flags (value)) ; + info = GB_jitifyer_set_C_flags (value) ; + break ; - case GxB_JIT_C_LINKER_FLAGS : + case GxB_JIT_C_LINKER_FLAGS : - return (GB_jitifyer_set_C_link_flags (value)) ; + info = GB_jitifyer_set_C_link_flags (value) ; + break ; - case GxB_JIT_C_LIBRARIES : + case GxB_JIT_C_LIBRARIES : - return (GB_jitifyer_set_C_libraries (value)) ; + info = GB_jitifyer_set_C_libraries (value) ; + break ; - case GxB_JIT_C_CMAKE_LIBS : + case GxB_JIT_C_CMAKE_LIBS : - return (GB_jitifyer_set_C_cmake_libs (value)) ; + info = GB_jitifyer_set_C_cmake_libs (value) ; + break ; - case GxB_JIT_C_PREFACE : + case GxB_JIT_C_PREFACE : - return (GB_jitifyer_set_C_preface (value)) ; + info = GB_jitifyer_set_C_preface (value) ; + break ; - case GxB_JIT_CUDA_PREFACE : + case GxB_JIT_CUDA_PREFACE : - return (GB_jitifyer_set_CUDA_preface (value)) ; + info = GB_jitifyer_set_CUDA_preface (value) ; + break ; - case GxB_JIT_ERROR_LOG : + case GxB_JIT_ERROR_LOG : - return (GB_jitifyer_set_error_log (value)) ; + info = GB_jitifyer_set_error_log (value) ; + break ; - case GxB_JIT_CACHE_PATH : + case GxB_JIT_CACHE_PATH : - return (GB_jitifyer_set_cache_path (value)) ; + info = GB_jitifyer_set_cache_path (value) ; + break ; - default : + default : - return (GrB_INVALID_VALUE) ; + info = GrB_INVALID_VALUE ; + break ; + } } + + return (info) ; } //------------------------------------------------------------------------------ @@ -243,7 +263,14 @@ GrB_Info GrB_Global_set_INT32 // set the field //-------------------------------------------------------------------------- - return (GB_global_enum_set (value, field)) ; + GrB_Info info = GrB_NO_VALUE ; + + #pragma omp critical (GB_global_get_set) + { + info = GB_global_enum_set (value, field) ; + } + + return (info) ; } //------------------------------------------------------------------------------ @@ -270,52 +297,67 @@ GrB_Info GrB_Global_set_VOID // set the field //-------------------------------------------------------------------------- - switch ((int) field) + GrB_Info info = GrB_SUCCESS ; + + #pragma omp critical (GB_global_get_set) { + switch ((int) field) + { - case GxB_BITMAP_SWITCH : + case GxB_BITMAP_SWITCH : - if (value == NULL) - { - // set all switches to their default - GB_Global_bitmap_switch_default ( ) ; - } - else - { - if (size < sizeof (double) * GxB_NBITMAP_SWITCH) + if (value == NULL) { - return (GrB_INVALID_VALUE) ; + // set all switches to their default + GB_Global_bitmap_switch_default ( ) ; } - double *dvalue = (double *) value ; - for (int k = 0 ; k < GxB_NBITMAP_SWITCH ; k++) - { - float b = (float) dvalue [k] ; - GB_Global_bitmap_switch_set (k, b) ; + else + { + if (size < sizeof (double) * GxB_NBITMAP_SWITCH) + { + info = GrB_INVALID_VALUE ; + } + else + { + double *dvalue = (double *) value ; + for (int k = 0 ; k < GxB_NBITMAP_SWITCH ; k++) + { + float b = (float) dvalue [k] ; + GB_Global_bitmap_switch_set (k, b) ; + } + } } - } - break ; + break ; - case GxB_PRINTF : + case GxB_PRINTF : - if (size != sizeof (GB_printf_function_t)) - { - return (GrB_INVALID_VALUE) ; - } - GB_Global_printf_set ((GB_printf_function_t) value) ; - break ; + if (size != sizeof (GB_printf_function_t)) + { + info = GrB_INVALID_VALUE ; + } + else + { + GB_Global_printf_set ((GB_printf_function_t) value) ; + } + break ; - case GxB_FLUSH : + case GxB_FLUSH : - if (size != sizeof (GB_flush_function_t)) - { - return (GrB_INVALID_VALUE) ; - } - GB_Global_flush_set ((GB_flush_function_t) value) ; - break ; + if (size != sizeof (GB_flush_function_t)) + { + info = GrB_INVALID_VALUE ; + } + else + { + GB_Global_flush_set ((GB_flush_function_t) value) ; + } + break ; - default : + default : - return (GrB_INVALID_VALUE) ; + info = GrB_INVALID_VALUE ; + break ; + } } #pragma omp flush diff --git a/Source/Template/GB_printf_kernels.h b/Source/Template/GB_printf_kernels.h index 915b7564dd..aa6d795e7b 100644 --- a/Source/Template/GB_printf_kernels.h +++ b/Source/Template/GB_printf_kernels.h @@ -10,6 +10,9 @@ #ifndef GB_PRINTF_KERNELS_H #define GB_PRINTF_KERNELS_H +// return the length of a string, or 0 if the string is NULL +#define GB_STRLEN(s) ((s == NULL) ? 0 : strlen (s)) + #define GB_STRING_MATCH(s,t) (strcmp (s,t) == 0) // format strings, normally %llu and %lld, for GrB_Index values diff --git a/Tcov/log_Apr3.txt b/Tcov/log_Apr3.txt new file mode 100644 index 0000000000..a9b3dacbc9 --- /dev/null +++ b/Tcov/log_Apr3.txt @@ -0,0 +1,205 @@ + +---------------------------------------------- [malloc] [cover] +03-Apr 10:32:44 test169 17.4 sec 550: 24399 of 25114 2.8% 31.68/s +03-Apr 10:32:46 test250 1.4 sec 374: 24025 of 25114 4.3% 275.28/s +03-Apr 10:32:48 test250 2.0 sec 57: 23968 of 25114 4.6% 27.95/s +03-Apr 10:32:48 test279 0.1 sec 119: 23849 of 25114 5.0% 2039.21/s +03-Apr 10:32:48 test278 0.1 sec 48: 23801 of 25114 5.2% 865.79/s +03-Apr 10:32:48 test277 0.0 sec 38: 23763 of 25114 5.4% 766.01/s +03-Apr 10:32:48 test276 0.1 sec 1626: 22137 of 25114 11.9% 28832.85/s +03-Apr 10:32:48 test275 0.1 sec 117: 22020 of 25114 12.3% 2294.34/s +03-Apr 10:32:48 test274 0.0 sec 129: 21891 of 25114 12.8% 2581.45/s +03-Apr 10:32:49 test273 0.2 sec 112: 21779 of 25114 13.3% 731.81/s +03-Apr 10:32:49 test272 0.1 sec 11: 21768 of 25114 13.3% 215.84/s +03-Apr 10:32:49 test271 0.1 sec 497: 21271 of 25114 15.3% 9552.18/s +03-Apr 10:32:49 test270 0.1 sec 286: 20985 of 25114 16.4% 5600.27/s +03-Apr 10:32:49 test269 0.1 sec 83: 20902 of 25114 16.8% 1633.44/s +03-Apr 10:32:49 test268 0.1 sec 5: 20897 of 25114 16.8% 63.83/s +03-Apr 10:32:51 test145 2.1 sec 210: 20687 of 25114 17.6% 101.80/s +03-Apr 10:32:51 test145 0.0 sec 1: 20686 of 25114 17.6% 26.05/s +03-Apr 10:32:51 test145 0.0 sec 18: 20668 of 25114 17.7% 734.99/s +03-Apr 10:32:51 test145 0.0 sec 4: 20664 of 25114 17.7% 175.96/s +03-Apr 10:32:53 test145 1.5 sec 34: 20630 of 25114 17.9% 22.47/s +03-Apr 10:32:53 test145 0.0 sec 3: 20627 of 25114 17.9% 176.86/s +03-Apr 10:32:54 test240 1.1 sec 74: 20550 of 25114 18.2% 66.80/s +03-Apr 10:32:55 test240 0.3 sec 1: 20549 of 25114 18.2% 3.61/s +03-Apr 10:32:56 test237 1.0 sec 40: 20509 of 25114 18.3% 38.84/s +03-Apr 10:32:58 test237 2.5 sec 2: 20507 of 25114 18.3% 0.79/s +03-Apr 10:32:59 test237 0.1 sec 18: 20489 of 25114 18.4% 164.96/s +03-Apr 10:32:59 test237 0.0 sec 6: 20483 of 25114 18.4% 179.68/s +03-Apr 10:32:59 test237 0.1 sec 4: 20479 of 25114 18.5% 46.30/s +03-Apr 10:33:00 test267 0.6 sec 8: 20471 of 25114 18.5% 12.78/s +03-Apr 10:33:00 test267 0.0 sec 1: 20470 of 25114 18.5% 1364.26/s +03-Apr 10:33:00 test265 0.5 sec 36: 20434 of 25114 18.6% 73.96/s +03-Apr 10:33:00 test264 0.1 sec 173: 20261 of 25114 19.3% 3384.86/s +03-Apr 10:33:01 test263 0.8 sec 13: 20248 of 25114 19.4% 16.60/s +03-Apr 10:33:01 test262 0.1 sec 22: 20226 of 25114 19.5% 392.47/s +03-Apr 10:33:02 test261 0.0 sec 22: 20204 of 25114 19.6% 440.23/s +03-Apr 10:33:02 test260 0.0 sec 3: 20201 of 25114 19.6% 61.27/s +03-Apr 10:33:04 test259 2.4 sec 4: 20197 of 25114 19.6% 1.69/s +03-Apr 10:33:05 test258 0.3 sec 20: 20177 of 25114 19.7% 64.64/s +03-Apr 10:33:05 test257 0.2 sec 41: 20136 of 25114 19.8% 164.48/s +03-Apr 10:33:05 test255 0.0 sec 8: 20128 of 25114 19.9% 166.37/s +03-Apr 10:33:05 test254 0.1 sec 14: 20114 of 25114 19.9% 242.01/s +03-Apr 10:33:10 test254 4.8 sec 20: 20094 of 25114 20.0% 4.16/s +03-Apr 10:33:11 test254 0.1 sec 1: 20093 of 25114 20.0% 8.68/s +03-Apr 10:33:11 test253 0.1 sec 9: 20084 of 25114 20.0% 68.43/s +03-Apr 10:33:11 test252 0.1 sec 7: 20077 of 25114 20.1% 122.56/s +03-Apr 10:34:37 test251 85.7 sec 434: 19643 of 25114 21.8% 5.06/s +03-Apr 10:38:05 test251 208.1 sec 76: 19567 of 25114 22.1% 0.37/s +03-Apr 10:38:07 test249 1.3 sec 24: 19543 of 25114 22.2% 18.78/s +03-Apr 10:38:07 test247 0.0 sec 24: 19519 of 25114 22.3% 1035.20/s +03-Apr 10:38:18 test246 11.2 sec 69: 19450 of 25114 22.6% 6.14/s +03-Apr 10:38:37 test01 18.1 sec 1340: 18110 of 25114 27.9% 73.96/s +03-Apr 10:38:38 test245 1.0 sec 34: 18076 of 25114 28.0% 33.53/s +03-Apr 10:38:38 test245 0.0 sec 8: 18068 of 25114 28.1% 214.96/s +03-Apr 10:38:38 test199 0.0 sec 1: 18067 of 25114 28.1% 235.07/s +03-Apr 10:38:38 test83 0.0 sec 10: 18057 of 25114 28.1% 202.28/s +03-Apr 10:38:38 test210 0.0 sec 7: 18050 of 25114 28.1% 2706.88/s +03-Apr 10:38:39 test165 0.0 sec 1: 18049 of 25114 28.1% 240.79/s +03-Apr 10:38:39 test219 0.1 sec 9: 18040 of 25114 28.2% 150.03/s +03-Apr 10:38:39 test219 0.3 sec 3: 18037 of 25114 28.2% 10.61/s +03-Apr 10:38:39 test241 0.1 sec 10: 18027 of 25114 28.2% 89.82/s +03-Apr 10:38:40 test220 0.1 sec 10: 18017 of 25114 28.3% 119.22/s +03-Apr 10:38:40 test211 0.0 sec 15: 18002 of 25114 28.3% 496.21/s +03-Apr 10:38:40 test202 0.1 sec 67: 17935 of 25114 28.6% 593.46/s +03-Apr 10:38:40 test202 0.0 sec 1: 17934 of 25114 28.6% 22.99/s +03-Apr 10:38:44 test152 3.0 sec 827: 17107 of 25114 31.9% 271.92/s +03-Apr 10:38:48 test152 4.3 sec 13: 17094 of 25114 31.9% 3.03/s +03-Apr 10:40:03 test152 74.9 sec 245: 16849 of 25114 32.9% 3.27/s +03-Apr 10:40:04 test222 0.1 sec 18: 16831 of 25114 33.0% 164.42/s +03-Apr 10:40:04 test256 0.6 sec 58: 16773 of 25114 33.2% 97.56/s +03-Apr 10:40:08 test186 2.9 sec 44: 16729 of 25114 33.4% 15.07/s +03-Apr 10:40:08 test186 0.5 sec 3: 16726 of 25114 33.4% 6.57/s +03-Apr 10:40:09 test186(0) 0.4 sec 5: 16721 of 25114 33.4% 11.84/s +03-Apr 10:40:09 test150 0.2 sec 36: 16685 of 25114 33.6% 160.66/s +03-Apr 10:40:10 test239 0.1 sec 15: 16670 of 25114 33.6% 174.96/s +03-Apr 10:40:11 test239 0.9 sec 2: 16668 of 25114 33.6% 2.16/s +03-Apr 10:40:11 test235 0.0 sec 4: 16664 of 25114 33.6% 102.13/s +03-Apr 10:40:11 test226 0.0 sec 8: 16656 of 25114 33.7% 627.89/s +03-Apr 10:40:12 test223 0.0 sec 2: 16654 of 25114 33.7% 64.85/s +03-Apr 10:40:12 test204 0.1 sec 14: 16640 of 25114 33.7% 146.10/s +03-Apr 10:40:12 test203 0.1 sec 9: 16631 of 25114 33.8% 178.99/s +03-Apr 10:40:12 test183 0.0 sec 12: 16619 of 25114 33.8% 455.29/s +03-Apr 10:40:13 test179 0.1 sec 15: 16604 of 25114 33.9% 153.32/s +03-Apr 10:40:15 test179 2.0 sec 4: 16600 of 25114 33.9% 2.04/s +03-Apr 10:40:15 test174 0.0 sec 10: 16590 of 25114 33.9% 243.37/s +03-Apr 10:40:16 test155 0.1 sec 41: 16549 of 25114 34.1% 345.94/s +03-Apr 10:40:16 test136 0.1 sec 55: 16494 of 25114 34.3% 383.25/s +03-Apr 10:40:17 test02 0.7 sec 247: 16247 of 25114 35.3% 368.73/s +03-Apr 10:40:18 test109 0.4 sec 10: 16237 of 25114 35.3% 22.50/s +03-Apr 10:40:18 test109 0.0 sec 4: 16233 of 25114 35.4% 1095.29/s +03-Apr 10:40:19 test109 0.4 sec 8: 16225 of 25114 35.4% 21.64/s +03-Apr 10:40:19 test04 0.1 sec 15: 16210 of 25114 35.5% 194.54/s +03-Apr 10:40:19 test207 0.0 sec 2: 16208 of 25114 35.5% 553.40/s +03-Apr 10:40:19 test221 0.0 sec 2: 16206 of 25114 35.5% 290.70/s +03-Apr 10:40:20 test162 0.1 sec 3: 16203 of 25114 35.5% 43.50/s +03-Apr 10:40:23 test159 2.6 sec 72: 16131 of 25114 35.8% 27.53/s +03-Apr 10:40:23 test09 0.0 sec 5: 16126 of 25114 35.8% 638.81/s +03-Apr 10:40:23 test132 0.1 sec 8: 16118 of 25114 35.8% 115.96/s +03-Apr 10:40:36 test141 12.9 sec 549: 15569 of 25114 38.0% 42.53/s +03-Apr 10:40:38 testc2(1,1) 1.3 sec 20: 15549 of 25114 38.1% 15.48/s +03-Apr 10:40:45 testc2(1,1) 6.6 sec 4: 15545 of 25114 38.1% 0.60/s +03-Apr 10:40:45 test214 0.0 sec 3: 15542 of 25114 38.1% 316.29/s +03-Apr 10:40:46 test213 0.0 sec 2: 15540 of 25114 38.1% 204.52/s +03-Apr 10:40:48 test206 2.6 sec 221: 15319 of 25114 39.0% 86.61/s +03-Apr 10:41:06 test206 16.8 sec 24: 15295 of 25114 39.1% 1.42/s +03-Apr 10:41:06 test212 0.0 sec 8: 15287 of 25114 39.1% 436.73/s +03-Apr 10:41:06 test212 0.2 sec 2: 15285 of 25114 39.1% 10.62/s +03-Apr 10:41:07 test128 0.3 sec 41: 15244 of 25114 39.3% 125.71/s +03-Apr 10:41:07 test82 0.1 sec 16: 15228 of 25114 39.4% 185.79/s +03-Apr 10:41:11 test229 3.1 sec 9: 15219 of 25114 39.4% 2.90/s +03-Apr 10:41:12 test229 1.1 sec 1: 15218 of 25114 39.4% 0.89/s +03-Apr 10:41:13 test144 0.6 sec 2: 15216 of 25114 39.4% 3.50/s +03-Apr 10:42:37 test14 83.2 sec 662: 14554 of 25114 42.0% 7.96/s +03-Apr 10:47:08 test14 270.7 sec 118: 14436 of 25114 42.5% 0.44/s +03-Apr 10:47:18 test180 8.9 sec 128: 14308 of 25114 43.0% 14.32/s +03-Apr 10:47:22 test236 3.6 sec 74: 14234 of 25114 43.3% 20.67/s +03-Apr 10:47:24 test232 2.5 sec 22: 14212 of 25114 43.4% 8.86/s +03-Apr 10:47:45 test228 19.8 sec 27: 14185 of 25114 43.5% 1.36/s +03-Apr 10:49:49 test154 124.2 sec 1502: 12683 of 25114 49.5% 12.10/s +03-Apr 10:58:34 test154 524.6 sec 2: 12681 of 25114 49.5% 0.00/s +03-Apr 10:58:49 test238 14.6 sec 54: 12627 of 25114 49.7% 3.69/s +03-Apr 11:00:00 test238 70.8 sec 9: 12618 of 25114 49.8% 0.13/s +03-Apr 11:01:44 test151b 103.7 sec 126: 12492 of 25114 50.3% 1.21/s +03-Apr 11:01:48 test184 3.3 sec 38: 12454 of 25114 50.4% 11.62/s +03-Apr 11:02:02 test191 13.5 sec 21: 12433 of 25114 50.5% 1.55/s +03-Apr 11:02:32 test191 29.4 sec 3: 12430 of 25114 50.5% 0.10/s +03-Apr 11:10:11 test188 458.7 sec 212: 12218 of 25114 51.3% 0.46/s +03-Apr 11:12:46 test188 154.0 sec 3: 12215 of 25114 51.4% 0.02/s +03-Apr 11:12:52 test224 5.4 sec 24: 12191 of 25114 51.5% 4.46/s +03-Apr 11:12:55 test196 2.5 sec 11: 12180 of 25114 51.5% 4.48/s +03-Apr 11:13:01 test209 5.7 sec 20: 12160 of 25114 51.6% 3.52/s +03-Apr 11:13:20 test104 18.9 sec 40: 12120 of 25114 51.7% 2.12/s +03-Apr 11:13:29 test189 8.1 sec 1: 12119 of 25114 51.7% 0.12/s +03-Apr 11:14:43 test194 73.7 sec 5: 12114 of 25114 51.8% 0.07/s +03-Apr 11:15:00 test76 16.6 sec 15: 12099 of 25114 51.8% 0.91/s +03-Apr 11:15:44 test244 43.2 sec 17: 12082 of 25114 51.9% 0.39/s +[malloc debugging turned off] +03-Apr 11:15:44 test201 0.0 sec 3: 12079 of 25114 51.9% 352.07/s +03-Apr 11:15:45 test225 0.1 sec 1: 12078 of 25114 51.9% 6.71/s +03-Apr 11:15:45 test176 0.1 sec 5: 12073 of 25114 51.9% 63.40/s +03-Apr 11:15:46 test208 0.0 sec 5: 12068 of 25114 51.9% 269.51/s +03-Apr 11:15:46 test216 0.1 sec 3: 12065 of 25114 52.0% 31.61/s +03-Apr 11:16:12 test142 25.2 sec 631: 11434 of 25114 54.5% 25.06/s +03-Apr 11:21:02 test142 289.6 sec 10: 11424 of 25114 54.5% 0.03/s +03-Apr 11:21:29 test142 25.7 sec 2: 11422 of 25114 54.5% 0.08/s +03-Apr 11:21:30 test137 0.4 sec 3: 11419 of 25114 54.5% 7.47/s +03-Apr 11:21:30 test137 0.0 sec 2: 11417 of 25114 54.5% 220.09/s +03-Apr 11:21:31 test139 0.4 sec 2: 11415 of 25114 54.5% 4.78/s +03-Apr 11:21:32 test172 0.1 sec 3: 11412 of 25114 54.6% 35.93/s +03-Apr 11:21:33 test148 0.9 sec 4: 11408 of 25114 54.6% 4.70/s +03-Apr 11:21:35 test157 0.7 sec 12: 11396 of 25114 54.6% 17.47/s +03-Apr 11:21:36 test182 1.0 sec 5: 11391 of 25114 54.6% 4.97/s +03-Apr 11:21:37 test108 0.6 sec 2: 11389 of 25114 54.7% 3.14/s +03-Apr 11:21:38 test108 0.4 sec 2: 11387 of 25114 54.7% 5.31/s +03-Apr 11:21:40 test130 0.9 sec 22: 11365 of 25114 54.7% 24.86/s +03-Apr 11:21:40 test124 0.2 sec 3: 11362 of 25114 54.8% 15.45/s +03-Apr 11:21:41 test138 0.1 sec 1: 11361 of 25114 54.8% 18.44/s +03-Apr 11:21:46 test227 5.0 sec 27: 11334 of 25114 54.9% 5.45/s +03-Apr 11:22:18 test125 31.3 sec 630: 10704 of 25114 57.4% 20.12/s +03-Apr 11:24:55 test234 156.3 sec 385: 10319 of 25114 58.9% 2.46/s +03-Apr 11:28:59 test234 243.6 sec 3: 10316 of 25114 58.9% 0.01/s +03-Apr 11:29:51 test242 51.6 sec 77: 10239 of 25114 59.2% 1.49/s +03-Apr 11:29:54 test173 1.6 sec 11: 10228 of 25114 59.3% 7.04/s +03-Apr 11:29:58 test200 3.3 sec 10: 10218 of 25114 59.3% 3.02/s +03-Apr 11:29:58 test197 0.1 sec 1: 10217 of 25114 59.3% 7.25/s +03-Apr 11:30:00 test84 1.5 sec 18: 10199 of 25114 59.4% 12.10/s +03-Apr 11:30:07 test19b 6.3 sec 59: 10140 of 25114 59.6% 9.30/s +03-Apr 11:30:08 test133 0.4 sec 2: 10138 of 25114 59.6% 4.88/s +03-Apr 11:30:13 test80 4.1 sec 12: 10126 of 25114 59.7% 2.94/s +03-Apr 11:31:22 test23 68.1 sec 148: 9978 of 25114 60.3% 2.17/s +03-Apr 11:31:24 test135 1.9 sec 7: 9971 of 25114 60.3% 3.62/s +03-Apr 11:32:43 test160 78.1 sec 24: 9947 of 25114 60.4% 0.31/s +03-Apr 11:32:49 test54 5.6 sec 20: 9927 of 25114 60.5% 3.55/s +03-Apr 11:32:51 test129 1.3 sec 4: 9923 of 25114 60.5% 3.16/s +03-Apr 11:32:54 test69 2.1 sec 6: 9917 of 25114 60.5% 2.86/s +03-Apr 11:34:33 test230 98.3 sec 114: 9803 of 25114 61.0% 1.16/s +03-Apr 12:08:53 test74 2059.3 sec 6637: 3166 of 25114 87.4% 3.22/s +03-Apr 12:21:45 test127 771.7 sec 1703: 1463 of 25114 94.2% 2.21/s +03-Apr 12:21:49 test19 3.5 sec 12: 1451 of 25114 94.2% 3.41/s +03-Apr 12:21:54 test11 3.9 sec 3: 1448 of 25114 94.2% 0.78/s +03-Apr 12:21:57 test215 3.0 sec 1: 1447 of 25114 94.2% 0.34/s +03-Apr 12:22:16 test193 18.4 sec 5: 1442 of 25114 94.3% 0.27/s +03-Apr 12:25:03 test195 166.0 sec 39: 1403 of 25114 94.4% 0.23/s +03-Apr 12:25:30 test243 26.3 sec 7: 1396 of 25114 94.4% 0.27/s +03-Apr 12:25:42 test29 11.3 sec 3: 1393 of 25114 94.5% 0.26/s +03-Apr 12:25:44 testc2(0,0) 1.3 sec 7: 1386 of 25114 94.5% 5.20/s +03-Apr 12:26:05 testc2(0,0) 20.6 sec 1: 1385 of 25114 94.5% 0.05/s +03-Apr 12:26:07 testc4(0) 0.6 sec 4: 1381 of 25114 94.5% 6.36/s +03-Apr 12:26:23 testc7(0) 15.4 sec 3: 1378 of 25114 94.5% 0.19/s +03-Apr 12:26:29 testcc(1) 5.3 sec 1: 1377 of 25114 94.5% 0.19/s +03-Apr 12:26:39 test187 9.2 sec 3: 1374 of 25114 94.5% 0.33/s +03-Apr 12:26:46 test192 6.2 sec 1: 1373 of 25114 94.5% 0.16/s +03-Apr 12:27:06 test181 19.8 sec 4: 1369 of 25114 94.5% 0.20/s +03-Apr 12:29:02 test185 114.4 sec 6: 1363 of 25114 94.6% 0.05/s +03-Apr 12:29:50 test53 47.3 sec 4: 1359 of 25114 94.6% 0.08/s +03-Apr 12:30:43 test17 52.3 sec 27: 1332 of 25114 94.7% 0.52/s +03-Apr 12:38:20 test231 456.9 sec 162: 1170 of 25114 95.3% 0.35/s +03-Apr 13:28:18 test10 2996.9 sec 970: 200 of 25114 99.2% 0.32/s +03-Apr 13:46:51 test75b 1087.5 sec 155: 45 of 25114 99.8% 0.14/s +03-Apr 13:48:24 test21b 91.1 sec 26: 19 of 25114 99.9% 0.29/s +03-Apr 13:49:17 testca(1) 52.6 sec 5: 14 of 25114 99.9% 0.10/s +03-Apr 13:51:14 test81 116.4 sec 1: 13 of 25114 99.9% 0.01/s +03-Apr 13:57:33 test18 377.6 sec 13: all 25114 full 100% 0.03/s +[malloc debugging turned back on] From f038657cb6933d48bcc67e26f3483e42ca3e26b2 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 3 Apr 2024 17:12:03 -0500 Subject: [PATCH 22/76] . --- Source/GrB_Global_get.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/GrB_Global_get.c b/Source/GrB_Global_get.c index 5722360549..22b61f7922 100644 --- a/Source/GrB_Global_get.c +++ b/Source/GrB_Global_get.c @@ -364,7 +364,7 @@ GrB_Info GrB_Global_get_String #pragma omp critical (GB_global_get_set) { const char *s ; - GB_global_string_get (&s, field) ; + info = GB_global_string_get (&s, field) ; if (info == GrB_SUCCESS) { strcpy (value, s) ; From 43d8aad45fe12378ef0068b0084b880d5764d5ee Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 3 Apr 2024 17:19:49 -0500 Subject: [PATCH 23/76] . --- Source/GrB_Global_get.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Source/GrB_Global_get.c b/Source/GrB_Global_get.c index 22b61f7922..95dce502fa 100644 --- a/Source/GrB_Global_get.c +++ b/Source/GrB_Global_get.c @@ -452,11 +452,13 @@ GrB_Info GrB_Global_get_SIZE case GxB_BITMAP_SWITCH : (*value) = sizeof (double) * GxB_NBITMAP_SWITCH ; + info = GrB_SUCCESS ; break ; case GxB_COMPILER_VERSION : (*value) = sizeof (int32_t) * 3 ; + info = GrB_SUCCESS ; break ; case GxB_MALLOC_FUNCTION : @@ -465,6 +467,7 @@ GrB_Info GrB_Global_get_SIZE case GxB_FREE_FUNCTION : (*value) = sizeof (void *) ; + info = GrB_SUCCESS ; break ; default : @@ -518,6 +521,7 @@ GrB_Info GrB_Global_get_VOID dvalue [k] = (double) GB_Global_bitmap_switch_get (k) ; } } + info = GrB_SUCCESS ; break ; case GxB_COMPILER_VERSION : @@ -528,6 +532,7 @@ GrB_Info GrB_Global_get_VOID ivalue [1] = GB_COMPILER_MINOR ; ivalue [2] = GB_COMPILER_SUB ; } + info = GrB_SUCCESS ; break ; case GxB_MALLOC_FUNCTION : @@ -535,6 +540,7 @@ GrB_Info GrB_Global_get_VOID void **func = (void **) value ; (*func) = GB_Global_malloc_function_get ( ) ; } + info = GrB_SUCCESS ; break ; case GxB_CALLOC_FUNCTION : @@ -542,6 +548,7 @@ GrB_Info GrB_Global_get_VOID void **func = (void **) value ; (*func) = GB_Global_calloc_function_get ( ) ; } + info = GrB_SUCCESS ; break ; case GxB_REALLOC_FUNCTION : @@ -549,6 +556,7 @@ GrB_Info GrB_Global_get_VOID void **func = (void **) value ; (*func) = GB_Global_realloc_function_get ( ) ; } + info = GrB_SUCCESS ; break ; case GxB_FREE_FUNCTION : @@ -556,6 +564,7 @@ GrB_Info GrB_Global_get_VOID void **func = (void **) value ; (*func) = GB_Global_free_function_get ( ) ; } + info = GrB_SUCCESS ; break ; default : From 34291e4c33acd07e08243fe50b2b818e29e1b6e8 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 3 Apr 2024 17:30:13 -0500 Subject: [PATCH 24/76] . --- Source/GrB_Global_set.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/GrB_Global_set.c b/Source/GrB_Global_set.c index c38e1b5aac..80c659333a 100644 --- a/Source/GrB_Global_set.c +++ b/Source/GrB_Global_set.c @@ -361,6 +361,6 @@ GrB_Info GrB_Global_set_VOID } #pragma omp flush - return (GrB_SUCCESS) ; + return (info) ; } From dced49ab967fdbaea64b0c56b00c9892fd4c31b1 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 3 Apr 2024 21:17:55 -0500 Subject: [PATCH 25/76] full test coverage --- Tcov/log_Apr3.txt | 402 +++++++++++++++++++++++----------------------- 1 file changed, 201 insertions(+), 201 deletions(-) diff --git a/Tcov/log_Apr3.txt b/Tcov/log_Apr3.txt index a9b3dacbc9..4942f54c27 100644 --- a/Tcov/log_Apr3.txt +++ b/Tcov/log_Apr3.txt @@ -1,205 +1,205 @@ ---------------------------------------------- [malloc] [cover] -03-Apr 10:32:44 test169 17.4 sec 550: 24399 of 25114 2.8% 31.68/s -03-Apr 10:32:46 test250 1.4 sec 374: 24025 of 25114 4.3% 275.28/s -03-Apr 10:32:48 test250 2.0 sec 57: 23968 of 25114 4.6% 27.95/s -03-Apr 10:32:48 test279 0.1 sec 119: 23849 of 25114 5.0% 2039.21/s -03-Apr 10:32:48 test278 0.1 sec 48: 23801 of 25114 5.2% 865.79/s -03-Apr 10:32:48 test277 0.0 sec 38: 23763 of 25114 5.4% 766.01/s -03-Apr 10:32:48 test276 0.1 sec 1626: 22137 of 25114 11.9% 28832.85/s -03-Apr 10:32:48 test275 0.1 sec 117: 22020 of 25114 12.3% 2294.34/s -03-Apr 10:32:48 test274 0.0 sec 129: 21891 of 25114 12.8% 2581.45/s -03-Apr 10:32:49 test273 0.2 sec 112: 21779 of 25114 13.3% 731.81/s -03-Apr 10:32:49 test272 0.1 sec 11: 21768 of 25114 13.3% 215.84/s -03-Apr 10:32:49 test271 0.1 sec 497: 21271 of 25114 15.3% 9552.18/s -03-Apr 10:32:49 test270 0.1 sec 286: 20985 of 25114 16.4% 5600.27/s -03-Apr 10:32:49 test269 0.1 sec 83: 20902 of 25114 16.8% 1633.44/s -03-Apr 10:32:49 test268 0.1 sec 5: 20897 of 25114 16.8% 63.83/s -03-Apr 10:32:51 test145 2.1 sec 210: 20687 of 25114 17.6% 101.80/s -03-Apr 10:32:51 test145 0.0 sec 1: 20686 of 25114 17.6% 26.05/s -03-Apr 10:32:51 test145 0.0 sec 18: 20668 of 25114 17.7% 734.99/s -03-Apr 10:32:51 test145 0.0 sec 4: 20664 of 25114 17.7% 175.96/s -03-Apr 10:32:53 test145 1.5 sec 34: 20630 of 25114 17.9% 22.47/s -03-Apr 10:32:53 test145 0.0 sec 3: 20627 of 25114 17.9% 176.86/s -03-Apr 10:32:54 test240 1.1 sec 74: 20550 of 25114 18.2% 66.80/s -03-Apr 10:32:55 test240 0.3 sec 1: 20549 of 25114 18.2% 3.61/s -03-Apr 10:32:56 test237 1.0 sec 40: 20509 of 25114 18.3% 38.84/s -03-Apr 10:32:58 test237 2.5 sec 2: 20507 of 25114 18.3% 0.79/s -03-Apr 10:32:59 test237 0.1 sec 18: 20489 of 25114 18.4% 164.96/s -03-Apr 10:32:59 test237 0.0 sec 6: 20483 of 25114 18.4% 179.68/s -03-Apr 10:32:59 test237 0.1 sec 4: 20479 of 25114 18.5% 46.30/s -03-Apr 10:33:00 test267 0.6 sec 8: 20471 of 25114 18.5% 12.78/s -03-Apr 10:33:00 test267 0.0 sec 1: 20470 of 25114 18.5% 1364.26/s -03-Apr 10:33:00 test265 0.5 sec 36: 20434 of 25114 18.6% 73.96/s -03-Apr 10:33:00 test264 0.1 sec 173: 20261 of 25114 19.3% 3384.86/s -03-Apr 10:33:01 test263 0.8 sec 13: 20248 of 25114 19.4% 16.60/s -03-Apr 10:33:01 test262 0.1 sec 22: 20226 of 25114 19.5% 392.47/s -03-Apr 10:33:02 test261 0.0 sec 22: 20204 of 25114 19.6% 440.23/s -03-Apr 10:33:02 test260 0.0 sec 3: 20201 of 25114 19.6% 61.27/s -03-Apr 10:33:04 test259 2.4 sec 4: 20197 of 25114 19.6% 1.69/s -03-Apr 10:33:05 test258 0.3 sec 20: 20177 of 25114 19.7% 64.64/s -03-Apr 10:33:05 test257 0.2 sec 41: 20136 of 25114 19.8% 164.48/s -03-Apr 10:33:05 test255 0.0 sec 8: 20128 of 25114 19.9% 166.37/s -03-Apr 10:33:05 test254 0.1 sec 14: 20114 of 25114 19.9% 242.01/s -03-Apr 10:33:10 test254 4.8 sec 20: 20094 of 25114 20.0% 4.16/s -03-Apr 10:33:11 test254 0.1 sec 1: 20093 of 25114 20.0% 8.68/s -03-Apr 10:33:11 test253 0.1 sec 9: 20084 of 25114 20.0% 68.43/s -03-Apr 10:33:11 test252 0.1 sec 7: 20077 of 25114 20.1% 122.56/s -03-Apr 10:34:37 test251 85.7 sec 434: 19643 of 25114 21.8% 5.06/s -03-Apr 10:38:05 test251 208.1 sec 76: 19567 of 25114 22.1% 0.37/s -03-Apr 10:38:07 test249 1.3 sec 24: 19543 of 25114 22.2% 18.78/s -03-Apr 10:38:07 test247 0.0 sec 24: 19519 of 25114 22.3% 1035.20/s -03-Apr 10:38:18 test246 11.2 sec 69: 19450 of 25114 22.6% 6.14/s -03-Apr 10:38:37 test01 18.1 sec 1340: 18110 of 25114 27.9% 73.96/s -03-Apr 10:38:38 test245 1.0 sec 34: 18076 of 25114 28.0% 33.53/s -03-Apr 10:38:38 test245 0.0 sec 8: 18068 of 25114 28.1% 214.96/s -03-Apr 10:38:38 test199 0.0 sec 1: 18067 of 25114 28.1% 235.07/s -03-Apr 10:38:38 test83 0.0 sec 10: 18057 of 25114 28.1% 202.28/s -03-Apr 10:38:38 test210 0.0 sec 7: 18050 of 25114 28.1% 2706.88/s -03-Apr 10:38:39 test165 0.0 sec 1: 18049 of 25114 28.1% 240.79/s -03-Apr 10:38:39 test219 0.1 sec 9: 18040 of 25114 28.2% 150.03/s -03-Apr 10:38:39 test219 0.3 sec 3: 18037 of 25114 28.2% 10.61/s -03-Apr 10:38:39 test241 0.1 sec 10: 18027 of 25114 28.2% 89.82/s -03-Apr 10:38:40 test220 0.1 sec 10: 18017 of 25114 28.3% 119.22/s -03-Apr 10:38:40 test211 0.0 sec 15: 18002 of 25114 28.3% 496.21/s -03-Apr 10:38:40 test202 0.1 sec 67: 17935 of 25114 28.6% 593.46/s -03-Apr 10:38:40 test202 0.0 sec 1: 17934 of 25114 28.6% 22.99/s -03-Apr 10:38:44 test152 3.0 sec 827: 17107 of 25114 31.9% 271.92/s -03-Apr 10:38:48 test152 4.3 sec 13: 17094 of 25114 31.9% 3.03/s -03-Apr 10:40:03 test152 74.9 sec 245: 16849 of 25114 32.9% 3.27/s -03-Apr 10:40:04 test222 0.1 sec 18: 16831 of 25114 33.0% 164.42/s -03-Apr 10:40:04 test256 0.6 sec 58: 16773 of 25114 33.2% 97.56/s -03-Apr 10:40:08 test186 2.9 sec 44: 16729 of 25114 33.4% 15.07/s -03-Apr 10:40:08 test186 0.5 sec 3: 16726 of 25114 33.4% 6.57/s -03-Apr 10:40:09 test186(0) 0.4 sec 5: 16721 of 25114 33.4% 11.84/s -03-Apr 10:40:09 test150 0.2 sec 36: 16685 of 25114 33.6% 160.66/s -03-Apr 10:40:10 test239 0.1 sec 15: 16670 of 25114 33.6% 174.96/s -03-Apr 10:40:11 test239 0.9 sec 2: 16668 of 25114 33.6% 2.16/s -03-Apr 10:40:11 test235 0.0 sec 4: 16664 of 25114 33.6% 102.13/s -03-Apr 10:40:11 test226 0.0 sec 8: 16656 of 25114 33.7% 627.89/s -03-Apr 10:40:12 test223 0.0 sec 2: 16654 of 25114 33.7% 64.85/s -03-Apr 10:40:12 test204 0.1 sec 14: 16640 of 25114 33.7% 146.10/s -03-Apr 10:40:12 test203 0.1 sec 9: 16631 of 25114 33.8% 178.99/s -03-Apr 10:40:12 test183 0.0 sec 12: 16619 of 25114 33.8% 455.29/s -03-Apr 10:40:13 test179 0.1 sec 15: 16604 of 25114 33.9% 153.32/s -03-Apr 10:40:15 test179 2.0 sec 4: 16600 of 25114 33.9% 2.04/s -03-Apr 10:40:15 test174 0.0 sec 10: 16590 of 25114 33.9% 243.37/s -03-Apr 10:40:16 test155 0.1 sec 41: 16549 of 25114 34.1% 345.94/s -03-Apr 10:40:16 test136 0.1 sec 55: 16494 of 25114 34.3% 383.25/s -03-Apr 10:40:17 test02 0.7 sec 247: 16247 of 25114 35.3% 368.73/s -03-Apr 10:40:18 test109 0.4 sec 10: 16237 of 25114 35.3% 22.50/s -03-Apr 10:40:18 test109 0.0 sec 4: 16233 of 25114 35.4% 1095.29/s -03-Apr 10:40:19 test109 0.4 sec 8: 16225 of 25114 35.4% 21.64/s -03-Apr 10:40:19 test04 0.1 sec 15: 16210 of 25114 35.5% 194.54/s -03-Apr 10:40:19 test207 0.0 sec 2: 16208 of 25114 35.5% 553.40/s -03-Apr 10:40:19 test221 0.0 sec 2: 16206 of 25114 35.5% 290.70/s -03-Apr 10:40:20 test162 0.1 sec 3: 16203 of 25114 35.5% 43.50/s -03-Apr 10:40:23 test159 2.6 sec 72: 16131 of 25114 35.8% 27.53/s -03-Apr 10:40:23 test09 0.0 sec 5: 16126 of 25114 35.8% 638.81/s -03-Apr 10:40:23 test132 0.1 sec 8: 16118 of 25114 35.8% 115.96/s -03-Apr 10:40:36 test141 12.9 sec 549: 15569 of 25114 38.0% 42.53/s -03-Apr 10:40:38 testc2(1,1) 1.3 sec 20: 15549 of 25114 38.1% 15.48/s -03-Apr 10:40:45 testc2(1,1) 6.6 sec 4: 15545 of 25114 38.1% 0.60/s -03-Apr 10:40:45 test214 0.0 sec 3: 15542 of 25114 38.1% 316.29/s -03-Apr 10:40:46 test213 0.0 sec 2: 15540 of 25114 38.1% 204.52/s -03-Apr 10:40:48 test206 2.6 sec 221: 15319 of 25114 39.0% 86.61/s -03-Apr 10:41:06 test206 16.8 sec 24: 15295 of 25114 39.1% 1.42/s -03-Apr 10:41:06 test212 0.0 sec 8: 15287 of 25114 39.1% 436.73/s -03-Apr 10:41:06 test212 0.2 sec 2: 15285 of 25114 39.1% 10.62/s -03-Apr 10:41:07 test128 0.3 sec 41: 15244 of 25114 39.3% 125.71/s -03-Apr 10:41:07 test82 0.1 sec 16: 15228 of 25114 39.4% 185.79/s -03-Apr 10:41:11 test229 3.1 sec 9: 15219 of 25114 39.4% 2.90/s -03-Apr 10:41:12 test229 1.1 sec 1: 15218 of 25114 39.4% 0.89/s -03-Apr 10:41:13 test144 0.6 sec 2: 15216 of 25114 39.4% 3.50/s -03-Apr 10:42:37 test14 83.2 sec 662: 14554 of 25114 42.0% 7.96/s -03-Apr 10:47:08 test14 270.7 sec 118: 14436 of 25114 42.5% 0.44/s -03-Apr 10:47:18 test180 8.9 sec 128: 14308 of 25114 43.0% 14.32/s -03-Apr 10:47:22 test236 3.6 sec 74: 14234 of 25114 43.3% 20.67/s -03-Apr 10:47:24 test232 2.5 sec 22: 14212 of 25114 43.4% 8.86/s -03-Apr 10:47:45 test228 19.8 sec 27: 14185 of 25114 43.5% 1.36/s -03-Apr 10:49:49 test154 124.2 sec 1502: 12683 of 25114 49.5% 12.10/s -03-Apr 10:58:34 test154 524.6 sec 2: 12681 of 25114 49.5% 0.00/s -03-Apr 10:58:49 test238 14.6 sec 54: 12627 of 25114 49.7% 3.69/s -03-Apr 11:00:00 test238 70.8 sec 9: 12618 of 25114 49.8% 0.13/s -03-Apr 11:01:44 test151b 103.7 sec 126: 12492 of 25114 50.3% 1.21/s -03-Apr 11:01:48 test184 3.3 sec 38: 12454 of 25114 50.4% 11.62/s -03-Apr 11:02:02 test191 13.5 sec 21: 12433 of 25114 50.5% 1.55/s -03-Apr 11:02:32 test191 29.4 sec 3: 12430 of 25114 50.5% 0.10/s -03-Apr 11:10:11 test188 458.7 sec 212: 12218 of 25114 51.3% 0.46/s -03-Apr 11:12:46 test188 154.0 sec 3: 12215 of 25114 51.4% 0.02/s -03-Apr 11:12:52 test224 5.4 sec 24: 12191 of 25114 51.5% 4.46/s -03-Apr 11:12:55 test196 2.5 sec 11: 12180 of 25114 51.5% 4.48/s -03-Apr 11:13:01 test209 5.7 sec 20: 12160 of 25114 51.6% 3.52/s -03-Apr 11:13:20 test104 18.9 sec 40: 12120 of 25114 51.7% 2.12/s -03-Apr 11:13:29 test189 8.1 sec 1: 12119 of 25114 51.7% 0.12/s -03-Apr 11:14:43 test194 73.7 sec 5: 12114 of 25114 51.8% 0.07/s -03-Apr 11:15:00 test76 16.6 sec 15: 12099 of 25114 51.8% 0.91/s -03-Apr 11:15:44 test244 43.2 sec 17: 12082 of 25114 51.9% 0.39/s +03-Apr 17:39:46 test169 17.2 sec 550: 24401 of 25116 2.8% 32.00/s +03-Apr 17:39:48 test250 1.4 sec 374: 24027 of 25116 4.3% 275.57/s +03-Apr 17:39:50 test250 2.1 sec 57: 23970 of 25116 4.6% 26.69/s +03-Apr 17:39:50 test279 0.1 sec 119: 23851 of 25116 5.0% 1887.18/s +03-Apr 17:39:50 test278 0.1 sec 48: 23803 of 25116 5.2% 810.63/s +03-Apr 17:39:50 test277 0.0 sec 38: 23765 of 25116 5.4% 803.64/s +03-Apr 17:39:50 test276 0.1 sec 1626: 22139 of 25116 11.9% 31302.34/s +03-Apr 17:39:50 test275 0.0 sec 117: 22022 of 25116 12.3% 2430.31/s +03-Apr 17:39:51 test274 0.0 sec 129: 21893 of 25116 12.8% 2712.25/s +03-Apr 17:39:51 test273 0.2 sec 114: 21779 of 25116 13.3% 759.73/s +03-Apr 17:39:51 test272 0.0 sec 11: 21768 of 25116 13.3% 230.04/s +03-Apr 17:39:51 test271 0.0 sec 497: 21271 of 25116 15.3% 10069.29/s +03-Apr 17:39:51 test270 0.0 sec 286: 20985 of 25116 16.4% 5881.14/s +03-Apr 17:39:51 test269 0.1 sec 83: 20902 of 25116 16.8% 1641.09/s +03-Apr 17:39:51 test268 0.1 sec 5: 20897 of 25116 16.8% 65.36/s +03-Apr 17:39:53 test145 2.1 sec 210: 20687 of 25116 17.6% 100.27/s +03-Apr 17:39:54 test145 0.0 sec 1: 20686 of 25116 17.6% 28.11/s +03-Apr 17:39:54 test145 0.0 sec 18: 20668 of 25116 17.7% 861.04/s +03-Apr 17:39:54 test145 0.0 sec 4: 20664 of 25116 17.7% 257.60/s +03-Apr 17:39:55 test145 1.5 sec 34: 20630 of 25116 17.9% 22.26/s +03-Apr 17:39:55 test145 0.0 sec 3: 20627 of 25116 17.9% 176.21/s +03-Apr 17:39:56 test240 1.1 sec 74: 20550 of 25116 18.2% 68.37/s +03-Apr 17:39:57 test240 0.3 sec 1: 20549 of 25116 18.2% 3.51/s +03-Apr 17:39:58 test237 0.9 sec 40: 20509 of 25116 18.3% 42.91/s +03-Apr 17:40:00 test237 2.5 sec 2: 20507 of 25116 18.4% 0.81/s +03-Apr 17:40:01 test237 0.1 sec 18: 20489 of 25116 18.4% 163.58/s +03-Apr 17:40:01 test237 0.0 sec 6: 20483 of 25116 18.4% 219.23/s +03-Apr 17:40:01 test237 0.1 sec 4: 20479 of 25116 18.5% 45.97/s +03-Apr 17:40:02 test267 0.7 sec 8: 20471 of 25116 18.5% 12.28/s +03-Apr 17:40:02 test267 0.0 sec 1: 20470 of 25116 18.5% 1322.75/s +03-Apr 17:40:02 test265 0.5 sec 36: 20434 of 25116 18.6% 74.58/s +03-Apr 17:40:02 test264 0.0 sec 173: 20261 of 25116 19.3% 3534.51/s +03-Apr 17:40:03 test263 0.8 sec 13: 20248 of 25116 19.4% 16.46/s +03-Apr 17:40:03 test262 0.1 sec 22: 20226 of 25116 19.5% 433.24/s +03-Apr 17:40:04 test261 0.0 sec 22: 20204 of 25116 19.6% 484.34/s +03-Apr 17:40:04 test260 0.0 sec 3: 20201 of 25116 19.6% 67.06/s +03-Apr 17:40:06 test259 2.4 sec 4: 20197 of 25116 19.6% 1.69/s +03-Apr 17:40:07 test258 0.3 sec 20: 20177 of 25116 19.7% 62.21/s +03-Apr 17:40:07 test257 0.2 sec 41: 20136 of 25116 19.8% 174.19/s +03-Apr 17:40:07 test255 0.0 sec 8: 20128 of 25116 19.9% 168.82/s +03-Apr 17:40:07 test254 0.1 sec 14: 20114 of 25116 19.9% 251.85/s +03-Apr 17:40:12 test254 4.8 sec 20: 20094 of 25116 20.0% 4.20/s +03-Apr 17:40:12 test254 0.1 sec 1: 20093 of 25116 20.0% 8.74/s +03-Apr 17:40:13 test253 0.1 sec 9: 20084 of 25116 20.0% 68.92/s +03-Apr 17:40:13 test252 0.0 sec 7: 20077 of 25116 20.1% 152.89/s +03-Apr 17:41:35 test251 81.8 sec 434: 19643 of 25116 21.8% 5.31/s +03-Apr 17:44:56 test251 201.2 sec 76: 19567 of 25116 22.1% 0.38/s +03-Apr 17:44:58 test249 1.3 sec 24: 19543 of 25116 22.2% 18.23/s +03-Apr 17:44:58 test247 0.0 sec 24: 19519 of 25116 22.3% 729.90/s +03-Apr 17:45:09 test246 11.1 sec 69: 19450 of 25116 22.6% 6.20/s +03-Apr 17:45:28 test01 18.8 sec 1340: 18110 of 25116 27.9% 71.16/s +03-Apr 17:45:29 test245 1.0 sec 34: 18076 of 25116 28.0% 33.90/s +03-Apr 17:45:29 test245 0.0 sec 8: 18068 of 25116 28.1% 215.67/s +03-Apr 17:45:30 test199 0.0 sec 1: 18067 of 25116 28.1% 153.14/s +03-Apr 17:45:30 test83 0.1 sec 10: 18057 of 25116 28.1% 133.42/s +03-Apr 17:45:30 test210 0.0 sec 7: 18050 of 25116 28.1% 2136.75/s +03-Apr 17:45:30 test165 0.0 sec 1: 18049 of 25116 28.1% 209.25/s +03-Apr 17:45:30 test219 0.1 sec 9: 18040 of 25116 28.2% 117.29/s +03-Apr 17:45:31 test219 0.3 sec 3: 18037 of 25116 28.2% 10.80/s +03-Apr 17:45:31 test241 0.1 sec 10: 18027 of 25116 28.2% 85.59/s +03-Apr 17:45:31 test220 0.1 sec 10: 18017 of 25116 28.3% 90.50/s +03-Apr 17:45:31 test211 0.0 sec 15: 18002 of 25116 28.3% 459.73/s +03-Apr 17:45:32 test202 0.1 sec 67: 17935 of 25116 28.6% 571.25/s +03-Apr 17:45:32 test202 0.0 sec 1: 17934 of 25116 28.6% 23.80/s +03-Apr 17:45:35 test152 3.0 sec 827: 17107 of 25116 31.9% 275.17/s +03-Apr 17:45:39 test152 4.1 sec 13: 17094 of 25116 31.9% 3.14/s +03-Apr 17:46:57 test152 77.3 sec 245: 16849 of 25116 32.9% 3.17/s +03-Apr 17:46:57 test222 0.2 sec 18: 16831 of 25116 33.0% 113.13/s +03-Apr 17:46:58 test256 0.7 sec 58: 16773 of 25116 33.2% 87.99/s +03-Apr 17:47:01 test186 2.8 sec 44: 16729 of 25116 33.4% 15.62/s +03-Apr 17:47:02 test186 0.4 sec 3: 16726 of 25116 33.4% 6.81/s +03-Apr 17:47:02 test186(0) 0.4 sec 5: 16721 of 25116 33.4% 12.91/s +03-Apr 17:47:03 test150 0.2 sec 36: 16685 of 25116 33.6% 171.70/s +03-Apr 17:47:03 test239 0.1 sec 15: 16670 of 25116 33.6% 118.06/s +03-Apr 17:47:04 test239 1.0 sec 2: 16668 of 25116 33.6% 2.09/s +03-Apr 17:47:05 test235 0.0 sec 4: 16664 of 25116 33.7% 100.36/s +03-Apr 17:47:05 test226 0.0 sec 8: 16656 of 25116 33.7% 629.13/s +03-Apr 17:47:05 test223 0.0 sec 2: 16654 of 25116 33.7% 66.10/s +03-Apr 17:47:05 test204 0.1 sec 14: 16640 of 25116 33.7% 93.73/s +03-Apr 17:47:06 test203 0.1 sec 9: 16631 of 25116 33.8% 114.57/s +03-Apr 17:47:06 test183 0.0 sec 12: 16619 of 25116 33.8% 432.59/s +03-Apr 17:47:06 test179 0.1 sec 15: 16604 of 25116 33.9% 118.43/s +03-Apr 17:47:09 test179 2.0 sec 4: 16600 of 25116 33.9% 2.04/s +03-Apr 17:47:09 test174 0.1 sec 10: 16590 of 25116 33.9% 198.72/s +03-Apr 17:47:09 test155 0.1 sec 41: 16549 of 25116 34.1% 289.40/s +03-Apr 17:47:10 test136 0.2 sec 55: 16494 of 25116 34.3% 280.13/s +03-Apr 17:47:11 test02 0.7 sec 247: 16247 of 25116 35.3% 332.71/s +03-Apr 17:47:11 test109 0.5 sec 10: 16237 of 25116 35.4% 20.66/s +03-Apr 17:47:12 test109 0.0 sec 4: 16233 of 25116 35.4% 1162.45/s +03-Apr 17:47:12 test109 0.4 sec 8: 16225 of 25116 35.4% 22.43/s +03-Apr 17:47:13 test04 0.1 sec 15: 16210 of 25116 35.5% 134.14/s +03-Apr 17:47:13 test207 0.0 sec 2: 16208 of 25116 35.5% 459.88/s +03-Apr 17:47:13 test221 0.0 sec 2: 16206 of 25116 35.5% 272.55/s +03-Apr 17:47:13 test162 0.1 sec 3: 16203 of 25116 35.5% 45.43/s +03-Apr 17:47:16 test159 2.5 sec 72: 16131 of 25116 35.8% 28.52/s +03-Apr 17:47:17 test09 0.0 sec 5: 16126 of 25116 35.8% 412.85/s +03-Apr 17:47:17 test132 0.1 sec 8: 16118 of 25116 35.8% 80.91/s +03-Apr 17:47:30 test141 12.7 sec 549: 15569 of 25116 38.0% 43.12/s +03-Apr 17:47:32 testc2(1,1) 1.4 sec 20: 15549 of 25116 38.1% 14.15/s +03-Apr 17:47:39 testc2(1,1) 6.7 sec 4: 15545 of 25116 38.1% 0.60/s +03-Apr 17:47:39 test214 0.0 sec 3: 15542 of 25116 38.1% 306.31/s +03-Apr 17:47:39 test213 0.0 sec 2: 15540 of 25116 38.1% 178.97/s +03-Apr 17:47:42 test206 2.6 sec 221: 15319 of 25116 39.0% 85.01/s +03-Apr 17:47:59 test206 16.9 sec 24: 15295 of 25116 39.1% 1.42/s +03-Apr 17:48:00 test212 0.0 sec 8: 15287 of 25116 39.1% 371.44/s +03-Apr 17:48:00 test212 0.2 sec 2: 15285 of 25116 39.1% 10.99/s +03-Apr 17:48:01 test128 0.4 sec 41: 15244 of 25116 39.3% 108.86/s +03-Apr 17:48:01 test82 0.1 sec 16: 15228 of 25116 39.4% 156.51/s +03-Apr 17:48:05 test229 3.2 sec 9: 15219 of 25116 39.4% 2.84/s +03-Apr 17:48:06 test229 1.0 sec 1: 15218 of 25116 39.4% 0.96/s +03-Apr 17:48:07 test144 0.6 sec 2: 15216 of 25116 39.4% 3.40/s +03-Apr 17:49:30 test14 82.5 sec 662: 14554 of 25116 42.1% 8.02/s +03-Apr 17:53:56 test14 265.6 sec 118: 14436 of 25116 42.5% 0.44/s +03-Apr 17:54:05 test180 8.4 sec 128: 14308 of 25116 43.0% 15.28/s +03-Apr 17:54:09 test236 3.6 sec 74: 14234 of 25116 43.3% 20.39/s +03-Apr 17:54:12 test232 2.6 sec 22: 14212 of 25116 43.4% 8.52/s +03-Apr 17:54:32 test228 19.4 sec 27: 14185 of 25116 43.5% 1.39/s +03-Apr 17:56:34 test154 121.8 sec 1502: 12683 of 25116 49.5% 12.33/s +03-Apr 18:02:57 test154 382.7 sec 2: 12681 of 25116 49.5% 0.01/s +03-Apr 18:03:12 test238 14.2 sec 54: 12627 of 25116 49.7% 3.80/s +03-Apr 18:04:22 test238 70.2 sec 9: 12618 of 25116 49.8% 0.13/s +03-Apr 18:06:03 test151b 100.1 sec 126: 12492 of 25116 50.3% 1.26/s +03-Apr 18:06:06 test184 3.3 sec 38: 12454 of 25116 50.4% 11.58/s +03-Apr 18:06:20 test191 13.2 sec 21: 12433 of 25116 50.5% 1.59/s +03-Apr 18:06:49 test191 28.6 sec 3: 12430 of 25116 50.5% 0.10/s +03-Apr 18:14:20 test188 450.4 sec 212: 12218 of 25116 51.4% 0.47/s +03-Apr 18:16:51 test188 150.1 sec 3: 12215 of 25116 51.4% 0.02/s +03-Apr 18:16:57 test224 5.4 sec 24: 12191 of 25116 51.5% 4.48/s +03-Apr 18:17:00 test196 2.4 sec 11: 12180 of 25116 51.5% 4.58/s +03-Apr 18:17:06 test209 5.5 sec 20: 12160 of 25116 51.6% 3.66/s +03-Apr 18:17:25 test104 18.6 sec 40: 12120 of 25116 51.7% 2.15/s +03-Apr 18:17:33 test189 7.9 sec 1: 12119 of 25116 51.7% 0.13/s +03-Apr 18:18:45 test194 71.1 sec 5: 12114 of 25116 51.8% 0.07/s +03-Apr 18:19:01 test76 16.0 sec 15: 12099 of 25116 51.8% 0.94/s +03-Apr 18:19:43 test244 41.6 sec 17: 12082 of 25116 51.9% 0.41/s [malloc debugging turned off] -03-Apr 11:15:44 test201 0.0 sec 3: 12079 of 25114 51.9% 352.07/s -03-Apr 11:15:45 test225 0.1 sec 1: 12078 of 25114 51.9% 6.71/s -03-Apr 11:15:45 test176 0.1 sec 5: 12073 of 25114 51.9% 63.40/s -03-Apr 11:15:46 test208 0.0 sec 5: 12068 of 25114 51.9% 269.51/s -03-Apr 11:15:46 test216 0.1 sec 3: 12065 of 25114 52.0% 31.61/s -03-Apr 11:16:12 test142 25.2 sec 631: 11434 of 25114 54.5% 25.06/s -03-Apr 11:21:02 test142 289.6 sec 10: 11424 of 25114 54.5% 0.03/s -03-Apr 11:21:29 test142 25.7 sec 2: 11422 of 25114 54.5% 0.08/s -03-Apr 11:21:30 test137 0.4 sec 3: 11419 of 25114 54.5% 7.47/s -03-Apr 11:21:30 test137 0.0 sec 2: 11417 of 25114 54.5% 220.09/s -03-Apr 11:21:31 test139 0.4 sec 2: 11415 of 25114 54.5% 4.78/s -03-Apr 11:21:32 test172 0.1 sec 3: 11412 of 25114 54.6% 35.93/s -03-Apr 11:21:33 test148 0.9 sec 4: 11408 of 25114 54.6% 4.70/s -03-Apr 11:21:35 test157 0.7 sec 12: 11396 of 25114 54.6% 17.47/s -03-Apr 11:21:36 test182 1.0 sec 5: 11391 of 25114 54.6% 4.97/s -03-Apr 11:21:37 test108 0.6 sec 2: 11389 of 25114 54.7% 3.14/s -03-Apr 11:21:38 test108 0.4 sec 2: 11387 of 25114 54.7% 5.31/s -03-Apr 11:21:40 test130 0.9 sec 22: 11365 of 25114 54.7% 24.86/s -03-Apr 11:21:40 test124 0.2 sec 3: 11362 of 25114 54.8% 15.45/s -03-Apr 11:21:41 test138 0.1 sec 1: 11361 of 25114 54.8% 18.44/s -03-Apr 11:21:46 test227 5.0 sec 27: 11334 of 25114 54.9% 5.45/s -03-Apr 11:22:18 test125 31.3 sec 630: 10704 of 25114 57.4% 20.12/s -03-Apr 11:24:55 test234 156.3 sec 385: 10319 of 25114 58.9% 2.46/s -03-Apr 11:28:59 test234 243.6 sec 3: 10316 of 25114 58.9% 0.01/s -03-Apr 11:29:51 test242 51.6 sec 77: 10239 of 25114 59.2% 1.49/s -03-Apr 11:29:54 test173 1.6 sec 11: 10228 of 25114 59.3% 7.04/s -03-Apr 11:29:58 test200 3.3 sec 10: 10218 of 25114 59.3% 3.02/s -03-Apr 11:29:58 test197 0.1 sec 1: 10217 of 25114 59.3% 7.25/s -03-Apr 11:30:00 test84 1.5 sec 18: 10199 of 25114 59.4% 12.10/s -03-Apr 11:30:07 test19b 6.3 sec 59: 10140 of 25114 59.6% 9.30/s -03-Apr 11:30:08 test133 0.4 sec 2: 10138 of 25114 59.6% 4.88/s -03-Apr 11:30:13 test80 4.1 sec 12: 10126 of 25114 59.7% 2.94/s -03-Apr 11:31:22 test23 68.1 sec 148: 9978 of 25114 60.3% 2.17/s -03-Apr 11:31:24 test135 1.9 sec 7: 9971 of 25114 60.3% 3.62/s -03-Apr 11:32:43 test160 78.1 sec 24: 9947 of 25114 60.4% 0.31/s -03-Apr 11:32:49 test54 5.6 sec 20: 9927 of 25114 60.5% 3.55/s -03-Apr 11:32:51 test129 1.3 sec 4: 9923 of 25114 60.5% 3.16/s -03-Apr 11:32:54 test69 2.1 sec 6: 9917 of 25114 60.5% 2.86/s -03-Apr 11:34:33 test230 98.3 sec 114: 9803 of 25114 61.0% 1.16/s -03-Apr 12:08:53 test74 2059.3 sec 6637: 3166 of 25114 87.4% 3.22/s -03-Apr 12:21:45 test127 771.7 sec 1703: 1463 of 25114 94.2% 2.21/s -03-Apr 12:21:49 test19 3.5 sec 12: 1451 of 25114 94.2% 3.41/s -03-Apr 12:21:54 test11 3.9 sec 3: 1448 of 25114 94.2% 0.78/s -03-Apr 12:21:57 test215 3.0 sec 1: 1447 of 25114 94.2% 0.34/s -03-Apr 12:22:16 test193 18.4 sec 5: 1442 of 25114 94.3% 0.27/s -03-Apr 12:25:03 test195 166.0 sec 39: 1403 of 25114 94.4% 0.23/s -03-Apr 12:25:30 test243 26.3 sec 7: 1396 of 25114 94.4% 0.27/s -03-Apr 12:25:42 test29 11.3 sec 3: 1393 of 25114 94.5% 0.26/s -03-Apr 12:25:44 testc2(0,0) 1.3 sec 7: 1386 of 25114 94.5% 5.20/s -03-Apr 12:26:05 testc2(0,0) 20.6 sec 1: 1385 of 25114 94.5% 0.05/s -03-Apr 12:26:07 testc4(0) 0.6 sec 4: 1381 of 25114 94.5% 6.36/s -03-Apr 12:26:23 testc7(0) 15.4 sec 3: 1378 of 25114 94.5% 0.19/s -03-Apr 12:26:29 testcc(1) 5.3 sec 1: 1377 of 25114 94.5% 0.19/s -03-Apr 12:26:39 test187 9.2 sec 3: 1374 of 25114 94.5% 0.33/s -03-Apr 12:26:46 test192 6.2 sec 1: 1373 of 25114 94.5% 0.16/s -03-Apr 12:27:06 test181 19.8 sec 4: 1369 of 25114 94.5% 0.20/s -03-Apr 12:29:02 test185 114.4 sec 6: 1363 of 25114 94.6% 0.05/s -03-Apr 12:29:50 test53 47.3 sec 4: 1359 of 25114 94.6% 0.08/s -03-Apr 12:30:43 test17 52.3 sec 27: 1332 of 25114 94.7% 0.52/s -03-Apr 12:38:20 test231 456.9 sec 162: 1170 of 25114 95.3% 0.35/s -03-Apr 13:28:18 test10 2996.9 sec 970: 200 of 25114 99.2% 0.32/s -03-Apr 13:46:51 test75b 1087.5 sec 155: 45 of 25114 99.8% 0.14/s -03-Apr 13:48:24 test21b 91.1 sec 26: 19 of 25114 99.9% 0.29/s -03-Apr 13:49:17 testca(1) 52.6 sec 5: 14 of 25114 99.9% 0.10/s -03-Apr 13:51:14 test81 116.4 sec 1: 13 of 25114 99.9% 0.01/s -03-Apr 13:57:33 test18 377.6 sec 13: all 25114 full 100% 0.03/s +03-Apr 18:19:43 test201 0.0 sec 3: 12079 of 25116 51.9% 333.85/s +03-Apr 18:19:44 test225 0.1 sec 1: 12078 of 25116 51.9% 6.96/s +03-Apr 18:19:45 test176 0.1 sec 5: 12073 of 25116 51.9% 65.80/s +03-Apr 18:19:45 test208 0.0 sec 5: 12068 of 25116 52.0% 256.53/s +03-Apr 18:19:46 test216 0.1 sec 3: 12065 of 25116 52.0% 33.13/s +03-Apr 18:20:10 test142 23.8 sec 631: 11434 of 25116 54.5% 26.55/s +03-Apr 18:24:51 test142 281.0 sec 10: 11424 of 25116 54.5% 0.04/s +03-Apr 18:25:16 test142 23.9 sec 2: 11422 of 25116 54.5% 0.08/s +03-Apr 18:25:17 test137 0.4 sec 3: 11419 of 25116 54.5% 7.89/s +03-Apr 18:25:18 test137 0.0 sec 2: 11417 of 25116 54.5% 288.06/s +03-Apr 18:25:19 test139 0.4 sec 2: 11415 of 25116 54.6% 5.33/s +03-Apr 18:25:19 test172 0.1 sec 3: 11412 of 25116 54.6% 39.09/s +03-Apr 18:25:20 test148 0.8 sec 4: 11408 of 25116 54.6% 4.92/s +03-Apr 18:25:22 test157 0.7 sec 12: 11396 of 25116 54.6% 18.37/s +03-Apr 18:25:23 test182 1.0 sec 5: 11391 of 25116 54.6% 5.21/s +03-Apr 18:25:24 test108 0.7 sec 2: 11389 of 25116 54.7% 3.06/s +03-Apr 18:25:25 test108 0.4 sec 2: 11387 of 25116 54.7% 5.43/s +03-Apr 18:25:27 test130 0.9 sec 22: 11365 of 25116 54.7% 25.11/s +03-Apr 18:25:27 test124 0.2 sec 3: 11362 of 25116 54.8% 16.14/s +03-Apr 18:25:28 test138 0.1 sec 1: 11361 of 25116 54.8% 19.95/s +03-Apr 18:25:33 test227 4.7 sec 27: 11334 of 25116 54.9% 5.74/s +03-Apr 18:26:02 test125 28.5 sec 630: 10704 of 25116 57.4% 22.12/s +03-Apr 18:28:28 test234 145.8 sec 385: 10319 of 25116 58.9% 2.64/s +03-Apr 18:32:14 test234 225.3 sec 3: 10316 of 25116 58.9% 0.01/s +03-Apr 18:33:02 test242 47.6 sec 77: 10239 of 25116 59.2% 1.62/s +03-Apr 18:33:05 test173 1.5 sec 11: 10228 of 25116 59.3% 7.30/s +03-Apr 18:33:08 test200 3.1 sec 10: 10218 of 25116 59.3% 3.27/s +03-Apr 18:33:09 test197 0.1 sec 1: 10217 of 25116 59.3% 7.47/s +03-Apr 18:33:11 test84 1.4 sec 18: 10199 of 25116 59.4% 13.05/s +03-Apr 18:33:17 test19b 5.8 sec 59: 10140 of 25116 59.6% 10.16/s +03-Apr 18:33:18 test133 0.4 sec 2: 10138 of 25116 59.6% 5.19/s +03-Apr 18:33:23 test80 3.9 sec 12: 10126 of 25116 59.7% 3.10/s +03-Apr 18:34:28 test23 64.7 sec 148: 9978 of 25116 60.3% 2.29/s +03-Apr 18:34:30 test135 1.9 sec 7: 9971 of 25116 60.3% 3.69/s +03-Apr 18:35:45 test160 74.1 sec 24: 9947 of 25116 60.4% 0.32/s +03-Apr 18:35:51 test54 5.2 sec 20: 9927 of 25116 60.5% 3.83/s +03-Apr 18:35:53 test129 1.2 sec 4: 9923 of 25116 60.5% 3.38/s +03-Apr 18:35:55 test69 2.1 sec 6: 9917 of 25116 60.5% 2.90/s +03-Apr 18:37:31 test230 94.7 sec 114: 9803 of 25116 61.0% 1.20/s +03-Apr 19:10:23 test74 1971.7 sec 6637: 3166 of 25116 87.4% 3.37/s +03-Apr 19:22:39 test127 734.9 sec 1703: 1463 of 25116 94.2% 2.32/s +03-Apr 19:22:43 test19 3.3 sec 12: 1451 of 25116 94.2% 3.61/s +03-Apr 19:22:47 test11 3.8 sec 3: 1448 of 25116 94.2% 0.80/s +03-Apr 19:22:51 test215 2.9 sec 1: 1447 of 25116 94.2% 0.34/s +03-Apr 19:23:09 test193 17.6 sec 5: 1442 of 25116 94.3% 0.28/s +03-Apr 19:25:46 test195 156.1 sec 39: 1403 of 25116 94.4% 0.25/s +03-Apr 19:26:12 test243 25.4 sec 7: 1396 of 25116 94.4% 0.28/s +03-Apr 19:26:23 test29 10.7 sec 3: 1393 of 25116 94.5% 0.28/s +03-Apr 19:26:25 testc2(0,0) 1.3 sec 7: 1386 of 25116 94.5% 5.41/s +03-Apr 19:26:46 testc2(0,0) 20.1 sec 1: 1385 of 25116 94.5% 0.05/s +03-Apr 19:26:47 testc4(0) 0.6 sec 4: 1381 of 25116 94.5% 6.47/s +03-Apr 19:27:03 testc7(0) 14.8 sec 3: 1378 of 25116 94.5% 0.20/s +03-Apr 19:27:08 testcc(1) 5.1 sec 1: 1377 of 25116 94.5% 0.19/s +03-Apr 19:27:18 test187 8.9 sec 3: 1374 of 25116 94.5% 0.34/s +03-Apr 19:27:25 test192 5.9 sec 1: 1373 of 25116 94.5% 0.17/s +03-Apr 19:27:45 test181 19.1 sec 4: 1369 of 25116 94.5% 0.21/s +03-Apr 19:29:33 test185 108.0 sec 6: 1363 of 25116 94.6% 0.06/s +03-Apr 19:30:18 test53 44.3 sec 4: 1359 of 25116 94.6% 0.09/s +03-Apr 19:31:09 test17 49.9 sec 27: 1332 of 25116 94.7% 0.54/s +03-Apr 19:38:36 test231 446.6 sec 162: 1170 of 25116 95.3% 0.36/s +03-Apr 20:28:35 test10 2997.4 sec 970: 200 of 25116 99.2% 0.32/s +03-Apr 20:47:06 test75b 1086.4 sec 155: 45 of 25116 99.8% 0.14/s +03-Apr 20:48:39 test21b 90.7 sec 26: 19 of 25116 99.9% 0.29/s +03-Apr 20:49:32 testca(1) 52.6 sec 5: 14 of 25116 99.9% 0.10/s +03-Apr 20:51:33 test81 120.2 sec 1: 13 of 25116 99.9% 0.01/s +03-Apr 20:57:43 test18 369.6 sec 13: all 25116 full 100% 0.04/s [malloc debugging turned back on] From de5ae0cd40c27f2def8dc453b1afea2f3113136a Mon Sep 17 00:00:00 2001 From: Vidith Madhu Date: Thu, 4 Apr 2024 23:18:21 -0500 Subject: [PATCH 26/76] notes --- Source/GB_apply_op.c | 4 ++++ notes.txt | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/Source/GB_apply_op.c b/Source/GB_apply_op.c index 0af3cb9b8a..c897500313 100644 --- a/Source/GB_apply_op.c +++ b/Source/GB_apply_op.c @@ -391,6 +391,8 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) } #endif + // TODO: CUDA JIT unop entry point here + //---------------------------------------------------------------------- // via the JIT or PreJIT kernel //---------------------------------------------------------------------- @@ -656,6 +658,8 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) ythunk = ywork ; } + // TODO: CUDA JIT unop entry point here + //---------------------------------------------------------------------- // via the JIT or PreJIT kernel //---------------------------------------------------------------------- diff --git a/notes.txt b/notes.txt index b543798eb8..8fa5de031b 100644 --- a/notes.txt +++ b/notes.txt @@ -119,6 +119,8 @@ New GPU JIT notes: Progress notes: Kernel development notes: +- Useful guide: https://docs.nvidia.com/cuda/cuda-c-best-practices-guide/index.html +- Good tips: https://on-demand.gputechconf.com/gtc/2017/presentation/s7122-stephen-jones-cuda-optimization-tips-tricks-and-techniques.pdf - Fork GraphBLAS, establish personal branch - Start with rowscale - Understand how rowscale works on CPU @@ -165,4 +167,17 @@ Kernel development notes: - Can use a unary op, index unary op, or binary op - Entry point: GB_apply - Main work: GB_apply_op + - 5 cases: + 1. Positional op (not user-defined) + - Handled by templates (NOT JIT) + 2. Iso op + - When C is iso. Handled by iso kernel (NOT JIT) + 3. Unary op (not positional) + - Tries factory kernel, then CUDA JIT, then JIT then generic + 4. Binary op (not positional) + - bind1st/bind2nd: is the scalar on left or right + - Same process as (3) + 5. User-defined indexunaryop (not positional) + + From 1b50ff06bb513ca15a37db068cdd8f8f23b4f3fe Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Fri, 5 Apr 2024 08:56:28 -0500 Subject: [PATCH 27/76] bump version to 9.1.2 --- CMakeLists.txt | 4 +- CUDA/unused/GB_search_for_vector_device.cuh | 69 --------------------- Doc/GraphBLAS_version.tex | 4 +- Include/GraphBLAS.h | 8 +-- README.md | 2 +- cmake_modules/GraphBLAS_version.cmake | 4 +- 6 files changed, 11 insertions(+), 80 deletions(-) delete mode 100644 CUDA/unused/GB_search_for_vector_device.cuh diff --git a/CMakeLists.txt b/CMakeLists.txt index 8229506f9d..ad6e01c173 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,8 +41,8 @@ if ( NOT BUILD_SHARED_LIBS ) endif ( ) # CUDA is under development for now, and not deployed in production: - set ( GRAPHBLAS_USE_CUDA OFF ) -# set ( GRAPHBLAS_USE_CUDA ON ) +# set ( GRAPHBLAS_USE_CUDA OFF ) + set ( GRAPHBLAS_USE_CUDA ON ) include ( SuiteSparsePolicy ) diff --git a/CUDA/unused/GB_search_for_vector_device.cuh b/CUDA/unused/GB_search_for_vector_device.cuh deleted file mode 100644 index 6384c1c840..0000000000 --- a/CUDA/unused/GB_search_for_vector_device.cuh +++ /dev/null @@ -1,69 +0,0 @@ -//------------------------------------------------------------------------------ -// GB_search_for_vector_device -//------------------------------------------------------------------------------ - -static __device__ __inline__ int64_t GB_search_for_vector_device -( - const int64_t p, // search for vector k that contains p - const int64_t *restrict Ap, // vector pointers to search - int64_t kleft, // left-most k to search - int64_t anvec, // Ap is of size anvec+1 - int64_t avlen // A->vlen -) -{ - - //-------------------------------------------------------------------------- - // check inputs - //-------------------------------------------------------------------------- - - if (Ap == NULL) - { - // A is full or bitmap - ASSERT (p >= 0 && p < avlen * anvec) ; - return ((avlen == 0) ? 0 : (p / avlen)) ; - } - - // A is sparse or hypersparse - ASSERT (p >= 0 && p < Ap [anvec]) ; - - //-------------------------------------------------------------------------- - // search for k - //-------------------------------------------------------------------------- - - int64_t k = kleft ; - int64_t kright = anvec ; - bool found ; - GB_SPLIT_BINARY_SEARCH (p, Ap, k, kright, found) ; - - // FIXME: this is not needed if the search is approximate: - if (found) - { - // Ap [k] == p has been found, but if k is an empty vector, then the - // next vector will also contain the entry p. In that case, k needs to - // be incremented until finding the first non-empty vector for which - // Ap [k] == p. - ASSERT (Ap [k] == p) ; - while (k < anvec-1 && Ap [k+1] == p) - { - k++ ; - } - } - else - { - // p has not been found in Ap, so it appears in the middle of Ap [k-1] - // ... Ap [k], as computed by the binary search. This is the range of - // entries for the vector k-1, so k must be decremented. - k-- ; - } - - //-------------------------------------------------------------------------- - // return result - //-------------------------------------------------------------------------- - - // The entry p must reside in a non-empty vector. - ASSERT (k >= 0 && k < anvec) ; - ASSERT (Ap [k] <= p && p < Ap [k+1]) ; - - return (k) ; -} - diff --git a/Doc/GraphBLAS_version.tex b/Doc/GraphBLAS_version.tex index 60e7d991fc..41f4bb825e 100644 --- a/Doc/GraphBLAS_version.tex +++ b/Doc/GraphBLAS_version.tex @@ -1,5 +1,5 @@ % version of SuiteSparse:GraphBLAS \date{VERSION -9.1.1, -Apr 7, 2024} +9.1.2, +Apr XX, 2024} diff --git a/Include/GraphBLAS.h b/Include/GraphBLAS.h index 2a63e283b6..02fedfdb95 100644 --- a/Include/GraphBLAS.h +++ b/Include/GraphBLAS.h @@ -1,4 +1,4 @@ -// SuiteSparse:GraphBLAS 9.1.1 +// SuiteSparse:GraphBLAS 9.1.2 //------------------------------------------------------------------------------ // GraphBLAS.h: definitions for the GraphBLAS package //------------------------------------------------------------------------------ @@ -133,7 +133,7 @@ //------------------------------------------------------------------------------ #ifndef GRAPHBLAS_HAS_CUDA -/* #undef GRAPHBLAS_HAS_CUDA */ +#define GRAPHBLAS_HAS_CUDA #endif //------------------------------------------------------------------------------ @@ -234,10 +234,10 @@ // The version of this implementation, and the GraphBLAS API version: #define GxB_IMPLEMENTATION_NAME "SuiteSparse:GraphBLAS" -#define GxB_IMPLEMENTATION_DATE "Apr 7, 2024" +#define GxB_IMPLEMENTATION_DATE "Apr XX, 2024" #define GxB_IMPLEMENTATION_MAJOR 9 #define GxB_IMPLEMENTATION_MINOR 1 -#define GxB_IMPLEMENTATION_SUB 1 +#define GxB_IMPLEMENTATION_SUB 2 #define GxB_SPEC_DATE "Dec 22, 2023" #define GxB_SPEC_MAJOR 2 #define GxB_SPEC_MINOR 1 diff --git a/README.md b/README.md index 61c6570cbd..083413c33c 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. SPDX-License-Identifier: Apache-2.0 -VERSION 9.1.1, Apr 7, 2024 +VERSION 9.1.2, Apr XX, 2024 SuiteSparse:GraphBLAS is a complete implementation of the GraphBLAS standard, which defines a set of sparse matrix operations on an extended algebra of diff --git a/cmake_modules/GraphBLAS_version.cmake b/cmake_modules/GraphBLAS_version.cmake index 7c8f75e6fc..5ab05a5dd1 100644 --- a/cmake_modules/GraphBLAS_version.cmake +++ b/cmake_modules/GraphBLAS_version.cmake @@ -8,10 +8,10 @@ #------------------------------------------------------------------------------- # version of SuiteSparse:GraphBLAS -set ( GraphBLAS_DATE "Apr 7, 2024" ) +set ( GraphBLAS_DATE "Apr XX, 2024" ) set ( GraphBLAS_VERSION_MAJOR 9 CACHE STRING "" FORCE ) set ( GraphBLAS_VERSION_MINOR 1 CACHE STRING "" FORCE ) -set ( GraphBLAS_VERSION_SUB 1 CACHE STRING "" FORCE ) +set ( GraphBLAS_VERSION_SUB 2 CACHE STRING "" FORCE ) # GraphBLAS C API Specification version, at graphblas.org set ( GraphBLAS_API_DATE "Dec 22, 2023" ) From f9b4ba333190da6395912d4e39e3e97a6836a2f4 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Fri, 5 Apr 2024 10:50:02 -0500 Subject: [PATCH 28/76] Apr 5 meeting --- CUDA/GB_cuda_type_branch.cpp | 3 ++- .../JitKernels/GB_jit_kernel_cuda_AxB_dot3.cu | 4 +++- CUDA/TODO.txt | 7 +++--- CUDA/Template/GB_cuda_ek_slice.cuh | 2 +- .../GB_cuda_jit_AxB_dot3_dense_phase1.cuh | 24 ++----------------- CUDA/Template/GB_cuda_jit_AxB_dot3_phase1.cuh | 21 ++++------------ Source/Template/GB_rowscale_template.c | 3 +++ 7 files changed, 19 insertions(+), 45 deletions(-) diff --git a/CUDA/GB_cuda_type_branch.cpp b/CUDA/GB_cuda_type_branch.cpp index 1debd0eb4b..57e779afff 100644 --- a/CUDA/GB_cuda_type_branch.cpp +++ b/CUDA/GB_cuda_type_branch.cpp @@ -38,7 +38,8 @@ bool GB_cuda_type_branch // return true if the type is OK on GPU return (true) ; } - if (size % sizeof (uint32_t) == 0 && size <= 32) + if (size % sizeof (uint32_t) == 0 && + size <= 32) // FIXME: Joe { // size is 4, 16, 20, 24, 28, or 32 return (true) ; diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_AxB_dot3.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_AxB_dot3.cu index f515ef2177..b97454b112 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_AxB_dot3.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_AxB_dot3.cu @@ -23,10 +23,12 @@ #endif //------------------------------------------------------------------------------ -// kernel launch geometry +// dot3 kernel launch geometry //------------------------------------------------------------------------------ // FIXME: some duplicates here +// FIXME: tune these values. Bigger chunk_size leads to fewer binary searches +// with GB_cuda_ek_slice_setup, for example. #define chunk_size 128 #define log2_chunk_size 7 #define tile_sz 32 diff --git a/CUDA/TODO.txt b/CUDA/TODO.txt index 1b4fa1620e..00a8860627 100644 --- a/CUDA/TODO.txt +++ b/CUDA/TODO.txt @@ -1,18 +1,17 @@ TODO (Mar 2024): + complex data types set/get cuda archictures CUDA PreJIT kernels GB_cuda_matrix_advise: write it dot3: allow iso use a stream pool (from RMM) can rmm_wrap be thread safe? - # of threadblocks in reduce + # of threadblocks in reduce : Joe reduce calls GB_enumify_reduce twice set/get which GPU(s) to use - data types > 32 bytes + data types > 32 bytes : Joe (wildtype demo, type branch) handling nvcc compiler errors - static device function for computing ks (acts like GB_ek_slice, - so call it GB_ek_slice_device -------------------------------------------------------------------------------- diff --git a/CUDA/Template/GB_cuda_ek_slice.cuh b/CUDA/Template/GB_cuda_ek_slice.cuh index 8b864a22fd..b92e7181a3 100644 --- a/CUDA/Template/GB_cuda_ek_slice.cuh +++ b/CUDA/Template/GB_cuda_ek_slice.cuh @@ -26,7 +26,7 @@ static __device__ __inline__ int64_t GB_cuda_ek_slice_setup { //-------------------------------------------------------------------------- - // determine the range of entryes pfirst:plast-1 for this chunk + // determine the range of entries pfirst:plast-1 for this chunk //-------------------------------------------------------------------------- // The slice for each threadblock contains entries pfirst:plast-1 of A. diff --git a/CUDA/Template/GB_cuda_jit_AxB_dot3_dense_phase1.cuh b/CUDA/Template/GB_cuda_jit_AxB_dot3_dense_phase1.cuh index 4c202eeaf5..a56b11e940 100644 --- a/CUDA/Template/GB_cuda_jit_AxB_dot3_dense_phase1.cuh +++ b/CUDA/Template/GB_cuda_jit_AxB_dot3_dense_phase1.cuh @@ -54,13 +54,7 @@ __global__ void GB_cuda_AxB_dot3_dense_phase1_kernel // determine the vector k of all entries in C(i,j), one chunk at a time //-------------------------------------------------------------------------- -#if 0 - __shared__ int64_t ks [chunk_size] ; -#endif - -// int64_t chunk_max = GB_ICEIL (mnz, chunk_size) ; -// for (int64_t chunk = blockIdx.x ; chunk < chunk_max ; chunk += gridDim.x ) - + // gride-stride loop for each threadblock: for (int64_t pfirst = blockIdx.x << log2_chunk_size ; pfirst < mnz ; pfirst += gridDim.x << log2_chunk_size) @@ -72,35 +66,21 @@ __global__ void GB_cuda_AxB_dot3_dense_phase1_kernel // This threadblock works on Mi/Mx and Ci/Cx, in positions pfirst to // pfirst + my_chunk_size - 1. - -#if 0 - int64_t my_chunk_size = GB_cuda_ek_slice (Mp, mnvec, mnz, pfirst, - chunk_size, /* output: */ ks) ; -#else int64_t my_chunk_size, mnvec1 ; float slope ; int64_t kfirst = GB_cuda_ek_slice_setup (Mp, mnvec, mnz, pfirst, chunk_size, &my_chunk_size, &mnvec1, &slope) ; -#endif //---------------------------------------------------------------------- // assign entries in C(i,j): either its vector k or its zombie status //---------------------------------------------------------------------- -// for (int64_t pM = pfirst + threadIdx.x ; -// pM < pfirst + my_chunk_size ; -// pM += blockDim.x) - for (int64_t kk = threadIdx.x ; kk < my_chunk_size ; kk += blockDim.x) { -#if 0 - int64_t k = ks [kk] ; // get the k value of Mi,Mx [pM]. -#else + // get the pM and k value of Mi,Mx [pM]: int64_t k = GB_cuda_ek_slice_entry (kk, pfirst, Mp, mnvec1, kfirst, slope) ; -#endif - int64_t pM = kk + pfirst ; #if GB_MASK_STRUCT diff --git a/CUDA/Template/GB_cuda_jit_AxB_dot3_phase1.cuh b/CUDA/Template/GB_cuda_jit_AxB_dot3_phase1.cuh index 346b5de04a..199a3120c6 100644 --- a/CUDA/Template/GB_cuda_jit_AxB_dot3_phase1.cuh +++ b/CUDA/Template/GB_cuda_jit_AxB_dot3_phase1.cuh @@ -123,12 +123,10 @@ __global__ void GB_jit_AxB_dot3_phase1_kernel // assign buckets to all entries in C(i,j), one chunk at a time //-------------------------------------------------------------------------- -#if 0 - // removing ks saves about 10% of the phase1 time - // (19.5 msec to 17.5 msec for the com-Orkut matrix) - __shared__ int64_t ks [chunk_size] ; -#endif + // FIXME: tune this loop (and all others) for GPU architectures, where # of + // threadblocks can differ on different GPUs. + // grid-stide loop for each threadblock: for (int64_t pfirst = blockIdx.x << log2_chunk_size ; pfirst < mnz ; pfirst += gridDim.x << log2_chunk_size) @@ -140,16 +138,10 @@ __global__ void GB_jit_AxB_dot3_phase1_kernel // This threadblock works on Mi/Mx and Ci/Mx, in positions pfirst to // pfirst + my_chunk_size - 1. - -#if 0 - int64_t my_chunk_size = GB_cuda_ek_slice (Mp, mnvec, mnz, pfirst, - chunk_size, /* output: */ ks) ; -#else int64_t my_chunk_size, mnvec1 ; float slope ; int64_t kfirst = GB_cuda_ek_slice_setup (Mp, mnvec, mnz, pfirst, chunk_size, &my_chunk_size, &mnvec1, &slope) ; -#endif //---------------------------------------------------------------------- // assign entries in C(i,j) to the buckets @@ -162,12 +154,10 @@ __global__ void GB_jit_AxB_dot3_phase1_kernel // determine the kth vector that contains the pth entry //------------------------------------------------------------------ -#if 0 - int64_t k = ks [kk] ; // get the k value of Mi,Mx [pM] -#else + // get the pM and k value of Mi,Mx [pM] int64_t k = GB_cuda_ek_slice_entry (kk, pfirst, Mp, mnvec1, kfirst, slope) ; -#endif + int64_t pM = kk + pfirst ; //------------------------------------------------------------------ // get C(i,j): zombie if A(:,i) and B(:,j) are empty or M(i,j) false @@ -177,7 +167,6 @@ __global__ void GB_jit_AxB_dot3_phase1_kernel // or j = Mh [k] if C is hypersparse GB_bucket_code bucket = GB_BUCKET_ZOMBIE ; - int64_t pM = kk + pfirst ; int64_t i = Mi [pM] ; if (GB_MCAST (Mx, pM, )) // if (M (i,j) is true): diff --git a/Source/Template/GB_rowscale_template.c b/Source/Template/GB_rowscale_template.c index cc22d86541..fcc849c959 100644 --- a/Source/Template/GB_rowscale_template.c +++ b/Source/Template/GB_rowscale_template.c @@ -51,6 +51,9 @@ int ntasks = nthreads ; ntasks = GB_IMIN (bnz, ntasks) ; + // parition the space into ntasks, to do this in parallel: + // for (p = 0 ; p < bnz ; p++) { ... work on Bi [p] and Bx [p] ... } + int tid ; #pragma omp parallel for num_threads(nthreads) schedule(static) for (tid = 0 ; tid < ntasks ; tid++) From c8f2aef5224746b0a33557af273635d5a5d9891a Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Fri, 5 Apr 2024 17:23:18 -0500 Subject: [PATCH 29/76] split GraphBLAS.h into two parts for CUDA; rename positional binary ops in apply --- CUDA/GraphBLAS_cuda.hpp | 1 + .../GB_cuda_jit_AxB_dot3_dense_phase1.cuh | 2 +- CUDA/Template/GB_cuda_jit_AxB_dot3_phase1.cuh | 2 +- Config/GraphBLAS.h.in | 121 ++++++++++++++++-- Include/GraphBLAS.h | 121 ++++++++++++++++-- Source/GB_apply_op.c | 75 +++++++---- 6 files changed, 271 insertions(+), 51 deletions(-) diff --git a/CUDA/GraphBLAS_cuda.hpp b/CUDA/GraphBLAS_cuda.hpp index c3968e37a7..2acdacf5f0 100644 --- a/CUDA/GraphBLAS_cuda.hpp +++ b/CUDA/GraphBLAS_cuda.hpp @@ -21,6 +21,7 @@ #endif +#define GB_CUDA_FOLDER #define GB_LIBRARY #include "GraphBLAS.h" #undef I diff --git a/CUDA/Template/GB_cuda_jit_AxB_dot3_dense_phase1.cuh b/CUDA/Template/GB_cuda_jit_AxB_dot3_dense_phase1.cuh index a56b11e940..2c343deb12 100644 --- a/CUDA/Template/GB_cuda_jit_AxB_dot3_dense_phase1.cuh +++ b/CUDA/Template/GB_cuda_jit_AxB_dot3_dense_phase1.cuh @@ -54,7 +54,7 @@ __global__ void GB_cuda_AxB_dot3_dense_phase1_kernel // determine the vector k of all entries in C(i,j), one chunk at a time //-------------------------------------------------------------------------- - // gride-stride loop for each threadblock: + // grid-stride loop for each threadblock: for (int64_t pfirst = blockIdx.x << log2_chunk_size ; pfirst < mnz ; pfirst += gridDim.x << log2_chunk_size) diff --git a/CUDA/Template/GB_cuda_jit_AxB_dot3_phase1.cuh b/CUDA/Template/GB_cuda_jit_AxB_dot3_phase1.cuh index 199a3120c6..ef6d2e12fb 100644 --- a/CUDA/Template/GB_cuda_jit_AxB_dot3_phase1.cuh +++ b/CUDA/Template/GB_cuda_jit_AxB_dot3_phase1.cuh @@ -126,7 +126,7 @@ __global__ void GB_jit_AxB_dot3_phase1_kernel // FIXME: tune this loop (and all others) for GPU architectures, where # of // threadblocks can differ on different GPUs. - // grid-stide loop for each threadblock: + // grid-stride loop for each threadblock: for (int64_t pfirst = blockIdx.x << log2_chunk_size ; pfirst < mnz ; pfirst += gridDim.x << log2_chunk_size) diff --git a/Config/GraphBLAS.h.in b/Config/GraphBLAS.h.in index 0dbdd56fe8..24ad016505 100644 --- a/Config/GraphBLAS.h.in +++ b/Config/GraphBLAS.h.in @@ -41,9 +41,19 @@ #define GRAPHBLAS_H //============================================================================== -// include files required by GraphBLAS +//=== GraphBLAS macros, typedefs, enums, and global variables ================= //============================================================================== +// This GraphBLAS.h header file is split into two parts. The first part +// defines macros, typedefs, enums, global variables, and pulls in standard C +// #include files. + +// The second part defines all of the user-callable GrB_* + +//------------------------------------------------------------------------------ +// include files required by GraphBLAS +//------------------------------------------------------------------------------ + #include #include #include @@ -56,13 +66,21 @@ #include #include -//============================================================================== -// renaming for use in MATLAB R2021a or later -//============================================================================== +//------------------------------------------------------------------------------ +// helper macros +//------------------------------------------------------------------------------ #define GB_CAT2(x,y) x ## y #define GB_EVAL2(x,y) GB_CAT2 (x,y) +// GB_STR: convert the content of x into a string "x" +#define GB_XSTR(x) GB_STR(x) +#define GB_STR(x) #x + +//------------------------------------------------------------------------------ +// renaming for use in MATLAB R2021a or later +//------------------------------------------------------------------------------ + #if defined ( GBMATLAB ) && !defined ( GB_JIT_RUNTIME ) // All symbols must be renamed for the @GrB interface when using MATLAB // R2021a and following, since those versions include an earlier version of @@ -375,11 +393,17 @@ typedef enum } GrB_Mode ; +//============================================================================== +// GrB_init / GrB_finalize +//============================================================================== + #if defined ( __cplusplus ) extern "C" { #endif +#ifndef GB_CUDA_FOLDER + GrB_Info GrB_init // start up GraphBLAS ( GrB_Mode mode // blocking or non-blocking mode, no GPU @@ -414,6 +438,8 @@ GrB_Info GrB_getVersion // runtime access to C API version number unsigned int *subversion // returns GRB_SUBVERSION ) ; +#endif // GB_CUDA_FOLDER + //============================================================================== // GrB_Descriptor: the GraphBLAS descriptor //============================================================================== @@ -542,6 +568,8 @@ GrB_Desc_Value ; typedef struct GB_Descriptor_opaque *GrB_Descriptor ; +#ifndef GB_CUDA_FOLDER + GrB_Info GrB_Descriptor_new // create a new descriptor ( GrB_Descriptor *descriptor // handle of descriptor to create @@ -562,6 +590,8 @@ GrB_Info GrB_Descriptor_free // free a descriptor GrB_Descriptor *descriptor // handle of descriptor to free ) ; +#endif // GB_CUDA_FOLDER + // Predefined descriptors and their values: GB_GLOBAL GrB_Descriptor @@ -702,6 +732,10 @@ GB_GLOBAL GrB_Type // GrB_Type_new: create a new type //------------------------------------------------------------------------------ +#define GxB_MAX_NAME_LEN 128 + +#ifndef GB_CUDA_FOLDER + GrB_Info GrB_Type_new // create a new GraphBLAS type ( GrB_Type *type, // handle of user type to create @@ -727,8 +761,6 @@ GrB_Info GrB_Type_new // create a new GraphBLAS type // At most GxB_MAX_NAME_LEN characters are accessed in type_name; characters // beyond that limit are silently ignored. -#define GxB_MAX_NAME_LEN 128 - GrB_Info GxB_Type_new // create a new named GraphBLAS type ( GrB_Type *type, // handle of user type to create @@ -755,6 +787,8 @@ GrB_Info GrB_Type_free // free a user-defined type GrB_Type *type // handle of user-defined type to free ) ; +#endif // GB_CUDA_FOLDER + //============================================================================== // GrB_UnaryOp: unary operators //============================================================================== @@ -951,6 +985,8 @@ GB_GLOBAL GrB_UnaryOp typedef void (*GxB_unary_function) (void *, const void *) ; +#ifndef GB_CUDA_FOLDER + // GrB_UnaryOp_new creates a user-defined unary op (with no name or defn) GrB_Info GrB_UnaryOp_new // create a new user-defined unary operator ( @@ -982,6 +1018,8 @@ GrB_Info GrB_UnaryOp_free // free a user-created unary operator GrB_UnaryOp *unaryop // handle of unary operator to free ) ; +#endif // GB_CUDA_FOLDER + //============================================================================== // GrB_BinaryOp: binary operators //============================================================================== @@ -1387,6 +1425,8 @@ GB_GLOBAL GrB_BinaryOp GxB_IGNORE_DUP ; typedef void (*GxB_binary_function) (void *, const void *, const void *) ; +#ifndef GB_CUDA_FOLDER + // GrB_BinaryOp_new creates a user-defined binary op (no name or defn) GrB_Info GrB_BinaryOp_new ( @@ -1422,6 +1462,8 @@ GrB_Info GrB_BinaryOp_free // free a user-created binary operator GrB_BinaryOp *binaryop // handle of binary operator to free ) ; +#endif // GB_CUDA_FOLDER + //============================================================================== // GxB_SelectOp: select operators (DEPRECATED: do not use) //============================================================================== @@ -1431,8 +1473,10 @@ typedef struct GB_SelectOp_opaque *GxB_SelectOp ; GB_GLOBAL GxB_SelectOp GxB_TRIL, GxB_TRIU, GxB_DIAG, GxB_OFFDIAG, GxB_NONZERO, GxB_EQ_ZERO, GxB_GT_ZERO, GxB_GE_ZERO, GxB_LT_ZERO, GxB_LE_ZERO, GxB_NE_THUNK, GxB_EQ_THUNK, GxB_GT_THUNK, GxB_GE_THUNK, GxB_LT_THUNK, GxB_LE_THUNK ; +#ifndef GB_CUDA_FOLDER GrB_Info GxB_SelectOp_xtype (GrB_Type *xtype, GxB_SelectOp selectop) ; GrB_Info GxB_SelectOp_ttype (GrB_Type *ttype, GxB_SelectOp selectop) ; +#endif // GB_CUDA_FOLDER //============================================================================== // GrB_IndexUnaryOp: a unary operator that depends on the row/col indices @@ -1453,6 +1497,8 @@ typedef void (*GxB_index_unary_function) const void *y // input scalar y ) ; +#ifndef GB_CUDA_FOLDER + // GrB_IndexUnaryOp_new creates a user-defined unary op (no name or defn) GrB_Info GrB_IndexUnaryOp_new // create a new user-defined IndexUnary op @@ -1485,6 +1531,8 @@ GrB_Info GrB_IndexUnaryOp_free // free a user-created IndexUnaryOp GrB_IndexUnaryOp *op // handle of IndexUnary to free ) ; +#endif // GB_CUDA_FOLDER + //------------------------------------------------------------------------------ // built-in IndexUnaryOps //------------------------------------------------------------------------------ @@ -1579,6 +1627,8 @@ GB_GLOBAL GrB_IndexUnaryOp typedef struct GB_Monoid_opaque *GrB_Monoid ; +#ifndef GB_CUDA_FOLDER + GrB_Info GrB_Monoid_new_BOOL // create a new boolean monoid ( GrB_Monoid *monoid, // handle of monoid to create @@ -1847,12 +1897,16 @@ GrB_Info GrB_Monoid_free // free a user-created monoid GrB_Monoid *monoid // handle of monoid to free ) ; +#endif // GB_CUDA_FOLDER + //============================================================================== // GrB_Semiring //============================================================================== typedef struct GB_Semiring_opaque *GrB_Semiring ; +#ifndef GB_CUDA_FOLDER + GrB_Info GrB_Semiring_new // create a semiring ( GrB_Semiring *semiring, // handle of semiring to create @@ -1869,6 +1923,8 @@ GrB_Info GrB_Semiring_free // free a user-created semiring GrB_Semiring *semiring // handle of semiring to free ) ; +#endif // GB_CUDA_FOLDER + //============================================================================== // GrB_Scalar: a GraphBLAS scalar //============================================================================== @@ -1876,6 +1932,8 @@ GrB_Info GrB_Semiring_free // free a user-created semiring typedef struct GB_Scalar_opaque *GxB_Scalar ; // historical: use GrB_Scalar typedef struct GB_Scalar_opaque *GrB_Scalar ; // use this instead +#ifndef GB_CUDA_FOLDER + // These methods create, free, copy, and clear a GrB_Scalar. The nvals, // and type methods return basic information about a GrB_Scalar. @@ -2184,12 +2242,16 @@ GrB_Info GrB_Scalar_extractElement // x = s #define GxB_Scalar_extractElement(x,s) GrB_Scalar_extractElement (x, s) #endif +#endif // GB_CUDA_FOLDER + //============================================================================== // GrB_Vector: a GraphBLAS vector //============================================================================== typedef struct GB_Vector_opaque *GrB_Vector ; +#ifndef GB_CUDA_FOLDER + // These methods create, free, copy, and clear a vector. The size, nvals, // and type methods return basic information about a vector. @@ -2846,12 +2908,16 @@ GrB_Info GrB_Vector_extractTuples // [I,~,X] = find (v) (Ilist, X, nvals, v) #endif +#endif // GB_CUDA_FOLDER + //============================================================================== // GrB_Matrix: a GraphBLAS matrix //============================================================================== typedef struct GB_Matrix_opaque *GrB_Matrix ; +#ifndef GB_CUDA_FOLDER + // These methods create, free, copy, and clear a matrix. The nrows, ncols, // nvals, and type methods return basic information about a matrix. @@ -3699,6 +3765,8 @@ GrB_Info GxB_Vector_diag // extract a diagonal from a matrix, as a vector const GrB_Descriptor desc // unused, except threading control ) ; +#endif // GB_CUDA_FOLDER + //============================================================================== // SuiteSparse:GraphBLAS options //============================================================================== @@ -3913,6 +3981,8 @@ typedef enum } GxB_Context_Field ; +#ifndef GB_CUDA_FOLDER + GrB_Info GxB_Context_new // create a new Context ( GxB_Context *Context // handle of Context to create @@ -3998,6 +4068,8 @@ GrB_Info GxB_Context_get (GxB_Context, GxB_Context_Field, ...) ; (arg1, __VA_ARGS__) #endif +#endif // GB_CUDA_FOLDER + //============================================================================== // GrB_set and GrB_get //============================================================================== @@ -4099,6 +4171,7 @@ GrB_Type_Code ; // GrB_get: get a scalar, string, enum, size, or void * from an object //------------------------------------------------------------------------------ +#ifndef GB_CUDA_FOLDER GrB_Info GrB_Scalar_get_Scalar (GrB_Scalar, GrB_Scalar, GrB_Field) ; GrB_Info GrB_Scalar_get_String (GrB_Scalar, char * , GrB_Field) ; GrB_Info GrB_Scalar_get_INT32 (GrB_Scalar, int32_t * , GrB_Field) ; @@ -4324,6 +4397,7 @@ GrB_Info GxB_Context_get_VOID (GxB_Context, void * , GrB_Field) ; void * : GxB_Serialized_get_VOID \ ) \ ) (object, value, __VA_ARGS__) +#endif //------------------------------------------------------------------------------ // GrB_set: set a scalar, string, enum, size, or void * of an object @@ -4508,7 +4582,7 @@ GrB_Info GxB_Context_set_VOID (GxB_Context, void * , GrB_Field, size_t) ; ) (object, value, __VA_ARGS__) #endif -#endif +#endif // GB_CUDA_FOLDER //============================================================================== // GrB_free: free any GraphBLAS object @@ -4518,6 +4592,8 @@ GrB_Info GxB_Context_set_VOID (GxB_Context, void * , GrB_Field, size_t) ; #define GrB_NULL NULL #define GrB_INVALID_HANDLE NULL +#ifndef GB_CUDA_FOLDER + #if GxB_STDC_VERSION >= 201112L #define GrB_free(object) \ _Generic \ @@ -4539,6 +4615,8 @@ GrB_Info GxB_Context_set_VOID (GxB_Context, void * , GrB_Field, size_t) ; (object) #endif +#endif + //============================================================================== // GrB_wait: finish computations //============================================================================== @@ -4550,6 +4628,8 @@ typedef enum } GrB_WaitMode ; +#ifndef GB_CUDA_FOLDER + // Finish all pending work in a specific object. GrB_Info GrB_Type_wait (GrB_Type type , GrB_WaitMode waitmode); @@ -4585,7 +4665,6 @@ GrB_Info GxB_Context_wait (GxB_Context Context , GrB_WaitMode waitmode); (object, waitmode) #endif - // NOTE: GxB_Scalar_wait is historical; use GrB_Scalar_wait instead GrB_Info GxB_Scalar_wait (GrB_Scalar *s) ; @@ -4933,6 +5012,8 @@ GrB_Info GxB_Matrix_eWiseUnion // C = accum (C, A+B) (C, Mask, accum, op, A, alpha, B, beta, desc) #endif +#endif // GB_CUDA_FOLDER + //============================================================================== // GrB_extract: extract a submatrix or subvector //============================================================================== @@ -4977,6 +5058,8 @@ GB_GLOBAL const uint64_t *GrB_ALL ; // I [GxB_INC ] = 2 ; // the magnitude of the increment // I [GxB_END ] = 1 ; // the end of the sequence +#ifndef GB_CUDA_FOLDER + GrB_Info GrB_Vector_extract // w = accum (w, u(I)) ( GrB_Vector w, // input/output vector for results @@ -8058,6 +8141,7 @@ GrB_Info GrB_Matrix_kronecker_Semiring // C = accum (C, kron(A,B)) (C, Mask, accum, op, A, B, desc) #endif +#endif // GB_CUDA_FOLDER //============================================================================== // GrB_Monoid: built-in monoids @@ -9004,6 +9088,8 @@ GB_GLOBAL GrB_Semiring // GrB_*_resize: change the size of a matrix or vector //============================================================================== +#ifndef GB_CUDA_FOLDER + // If the dimensions decrease, entries that fall outside the resized matrix or // vector are deleted. @@ -9050,6 +9136,8 @@ GrB_Info GxB_Vector_resize // change the size of a vector (historical) (arg1, __VA_ARGS__) #endif +#endif // GB_CUDA_FOLDER + //============================================================================== // GxB_fprint and GxB_print: print the contents of a GraphBLAS object //============================================================================== @@ -9106,6 +9194,8 @@ typedef enum } GxB_Print_Level ; +#ifndef GB_CUDA_FOLDER + GrB_Info GxB_Type_fprint // print and check a GrB_Type ( GrB_Type type, // object to print and check @@ -9197,11 +9287,6 @@ GrB_Info GxB_Context_fprint // print and check a GxB_Context FILE *f // file for output ) ; -// user code should not directly use GB_STR or GB_XSTR -// GB_STR: convert the content of x into a string "x" -#define GB_XSTR(x) GB_STR(x) -#define GB_STR(x) #x - #if GxB_STDC_VERSION >= 201112L #define GxB_fprint(object,pr,f) \ _Generic \ @@ -10245,6 +10330,8 @@ GrB_Info GxB_pack_HyperHash // move Y into A->Y const GrB_Descriptor desc // unused ) ; +#endif // GB_CUDA_FOLDER + //============================================================================== // GrB import/export //============================================================================== @@ -10273,6 +10360,8 @@ typedef enum } GrB_Format ; +#ifndef GB_CUDA_FOLDER + GrB_Info GrB_Matrix_import_BOOL // import a GrB_BOOL matrix ( GrB_Matrix *A, // handle of matrix to create @@ -10691,6 +10780,8 @@ GrB_Info GrB_Matrix_exportHint // suggest the best export format GrB_Matrix A // matrix to export ) ; +#endif // GB_CUDA_FOLDER + //============================================================================== // serialize/deserialize //============================================================================== @@ -10824,6 +10915,8 @@ GrB_Info GrB_Matrix_exportHint // suggest the best export format // positive but unrecognized, the default is used (GxB_COMPRESSION_ZSTD, // level 1). +#ifndef GB_CUDA_FOLDER + GrB_Info GxB_Matrix_serialize // serialize a GrB_Matrix to a blob ( // output: @@ -11969,6 +12062,8 @@ void GxB_Iterator_get_UDT (GxB_Iterator iterator, (iterator)->type_size) \ ) +#endif // GB_CUDA_FOLDER + #if defined ( __cplusplus ) } #endif diff --git a/Include/GraphBLAS.h b/Include/GraphBLAS.h index 02fedfdb95..829b451755 100644 --- a/Include/GraphBLAS.h +++ b/Include/GraphBLAS.h @@ -41,9 +41,19 @@ #define GRAPHBLAS_H //============================================================================== -// include files required by GraphBLAS +//=== GraphBLAS macros, typedefs, enums, and global variables ================= //============================================================================== +// This GraphBLAS.h header file is split into two parts. The first part +// defines macros, typedefs, enums, global variables, and pulls in standard C +// #include files. + +// The second part defines all of the user-callable GrB_* + +//------------------------------------------------------------------------------ +// include files required by GraphBLAS +//------------------------------------------------------------------------------ + #include #include #include @@ -56,13 +66,21 @@ #include #include -//============================================================================== -// renaming for use in MATLAB R2021a or later -//============================================================================== +//------------------------------------------------------------------------------ +// helper macros +//------------------------------------------------------------------------------ #define GB_CAT2(x,y) x ## y #define GB_EVAL2(x,y) GB_CAT2 (x,y) +// GB_STR: convert the content of x into a string "x" +#define GB_XSTR(x) GB_STR(x) +#define GB_STR(x) #x + +//------------------------------------------------------------------------------ +// renaming for use in MATLAB R2021a or later +//------------------------------------------------------------------------------ + #if defined ( GBMATLAB ) && !defined ( GB_JIT_RUNTIME ) // All symbols must be renamed for the @GrB interface when using MATLAB // R2021a and following, since those versions include an earlier version of @@ -375,11 +393,17 @@ typedef enum } GrB_Mode ; +//============================================================================== +// GrB_init / GrB_finalize +//============================================================================== + #if defined ( __cplusplus ) extern "C" { #endif +#ifndef GB_CUDA_FOLDER + GrB_Info GrB_init // start up GraphBLAS ( GrB_Mode mode // blocking or non-blocking mode, no GPU @@ -414,6 +438,8 @@ GrB_Info GrB_getVersion // runtime access to C API version number unsigned int *subversion // returns GRB_SUBVERSION ) ; +#endif // GB_CUDA_FOLDER + //============================================================================== // GrB_Descriptor: the GraphBLAS descriptor //============================================================================== @@ -542,6 +568,8 @@ GrB_Desc_Value ; typedef struct GB_Descriptor_opaque *GrB_Descriptor ; +#ifndef GB_CUDA_FOLDER + GrB_Info GrB_Descriptor_new // create a new descriptor ( GrB_Descriptor *descriptor // handle of descriptor to create @@ -562,6 +590,8 @@ GrB_Info GrB_Descriptor_free // free a descriptor GrB_Descriptor *descriptor // handle of descriptor to free ) ; +#endif // GB_CUDA_FOLDER + // Predefined descriptors and their values: GB_GLOBAL GrB_Descriptor @@ -702,6 +732,10 @@ GB_GLOBAL GrB_Type // GrB_Type_new: create a new type //------------------------------------------------------------------------------ +#define GxB_MAX_NAME_LEN 128 + +#ifndef GB_CUDA_FOLDER + GrB_Info GrB_Type_new // create a new GraphBLAS type ( GrB_Type *type, // handle of user type to create @@ -727,8 +761,6 @@ GrB_Info GrB_Type_new // create a new GraphBLAS type // At most GxB_MAX_NAME_LEN characters are accessed in type_name; characters // beyond that limit are silently ignored. -#define GxB_MAX_NAME_LEN 128 - GrB_Info GxB_Type_new // create a new named GraphBLAS type ( GrB_Type *type, // handle of user type to create @@ -755,6 +787,8 @@ GrB_Info GrB_Type_free // free a user-defined type GrB_Type *type // handle of user-defined type to free ) ; +#endif // GB_CUDA_FOLDER + //============================================================================== // GrB_UnaryOp: unary operators //============================================================================== @@ -951,6 +985,8 @@ GB_GLOBAL GrB_UnaryOp typedef void (*GxB_unary_function) (void *, const void *) ; +#ifndef GB_CUDA_FOLDER + // GrB_UnaryOp_new creates a user-defined unary op (with no name or defn) GrB_Info GrB_UnaryOp_new // create a new user-defined unary operator ( @@ -982,6 +1018,8 @@ GrB_Info GrB_UnaryOp_free // free a user-created unary operator GrB_UnaryOp *unaryop // handle of unary operator to free ) ; +#endif // GB_CUDA_FOLDER + //============================================================================== // GrB_BinaryOp: binary operators //============================================================================== @@ -1387,6 +1425,8 @@ GB_GLOBAL GrB_BinaryOp GxB_IGNORE_DUP ; typedef void (*GxB_binary_function) (void *, const void *, const void *) ; +#ifndef GB_CUDA_FOLDER + // GrB_BinaryOp_new creates a user-defined binary op (no name or defn) GrB_Info GrB_BinaryOp_new ( @@ -1422,6 +1462,8 @@ GrB_Info GrB_BinaryOp_free // free a user-created binary operator GrB_BinaryOp *binaryop // handle of binary operator to free ) ; +#endif // GB_CUDA_FOLDER + //============================================================================== // GxB_SelectOp: select operators (DEPRECATED: do not use) //============================================================================== @@ -1431,8 +1473,10 @@ typedef struct GB_SelectOp_opaque *GxB_SelectOp ; GB_GLOBAL GxB_SelectOp GxB_TRIL, GxB_TRIU, GxB_DIAG, GxB_OFFDIAG, GxB_NONZERO, GxB_EQ_ZERO, GxB_GT_ZERO, GxB_GE_ZERO, GxB_LT_ZERO, GxB_LE_ZERO, GxB_NE_THUNK, GxB_EQ_THUNK, GxB_GT_THUNK, GxB_GE_THUNK, GxB_LT_THUNK, GxB_LE_THUNK ; +#ifndef GB_CUDA_FOLDER GrB_Info GxB_SelectOp_xtype (GrB_Type *xtype, GxB_SelectOp selectop) ; GrB_Info GxB_SelectOp_ttype (GrB_Type *ttype, GxB_SelectOp selectop) ; +#endif // GB_CUDA_FOLDER //============================================================================== // GrB_IndexUnaryOp: a unary operator that depends on the row/col indices @@ -1453,6 +1497,8 @@ typedef void (*GxB_index_unary_function) const void *y // input scalar y ) ; +#ifndef GB_CUDA_FOLDER + // GrB_IndexUnaryOp_new creates a user-defined unary op (no name or defn) GrB_Info GrB_IndexUnaryOp_new // create a new user-defined IndexUnary op @@ -1485,6 +1531,8 @@ GrB_Info GrB_IndexUnaryOp_free // free a user-created IndexUnaryOp GrB_IndexUnaryOp *op // handle of IndexUnary to free ) ; +#endif // GB_CUDA_FOLDER + //------------------------------------------------------------------------------ // built-in IndexUnaryOps //------------------------------------------------------------------------------ @@ -1579,6 +1627,8 @@ GB_GLOBAL GrB_IndexUnaryOp typedef struct GB_Monoid_opaque *GrB_Monoid ; +#ifndef GB_CUDA_FOLDER + GrB_Info GrB_Monoid_new_BOOL // create a new boolean monoid ( GrB_Monoid *monoid, // handle of monoid to create @@ -1847,12 +1897,16 @@ GrB_Info GrB_Monoid_free // free a user-created monoid GrB_Monoid *monoid // handle of monoid to free ) ; +#endif // GB_CUDA_FOLDER + //============================================================================== // GrB_Semiring //============================================================================== typedef struct GB_Semiring_opaque *GrB_Semiring ; +#ifndef GB_CUDA_FOLDER + GrB_Info GrB_Semiring_new // create a semiring ( GrB_Semiring *semiring, // handle of semiring to create @@ -1869,6 +1923,8 @@ GrB_Info GrB_Semiring_free // free a user-created semiring GrB_Semiring *semiring // handle of semiring to free ) ; +#endif // GB_CUDA_FOLDER + //============================================================================== // GrB_Scalar: a GraphBLAS scalar //============================================================================== @@ -1876,6 +1932,8 @@ GrB_Info GrB_Semiring_free // free a user-created semiring typedef struct GB_Scalar_opaque *GxB_Scalar ; // historical: use GrB_Scalar typedef struct GB_Scalar_opaque *GrB_Scalar ; // use this instead +#ifndef GB_CUDA_FOLDER + // These methods create, free, copy, and clear a GrB_Scalar. The nvals, // and type methods return basic information about a GrB_Scalar. @@ -2184,12 +2242,16 @@ GrB_Info GrB_Scalar_extractElement // x = s #define GxB_Scalar_extractElement(x,s) GrB_Scalar_extractElement (x, s) #endif +#endif // GB_CUDA_FOLDER + //============================================================================== // GrB_Vector: a GraphBLAS vector //============================================================================== typedef struct GB_Vector_opaque *GrB_Vector ; +#ifndef GB_CUDA_FOLDER + // These methods create, free, copy, and clear a vector. The size, nvals, // and type methods return basic information about a vector. @@ -2846,12 +2908,16 @@ GrB_Info GrB_Vector_extractTuples // [I,~,X] = find (v) (Ilist, X, nvals, v) #endif +#endif // GB_CUDA_FOLDER + //============================================================================== // GrB_Matrix: a GraphBLAS matrix //============================================================================== typedef struct GB_Matrix_opaque *GrB_Matrix ; +#ifndef GB_CUDA_FOLDER + // These methods create, free, copy, and clear a matrix. The nrows, ncols, // nvals, and type methods return basic information about a matrix. @@ -3699,6 +3765,8 @@ GrB_Info GxB_Vector_diag // extract a diagonal from a matrix, as a vector const GrB_Descriptor desc // unused, except threading control ) ; +#endif // GB_CUDA_FOLDER + //============================================================================== // SuiteSparse:GraphBLAS options //============================================================================== @@ -3913,6 +3981,8 @@ typedef enum } GxB_Context_Field ; +#ifndef GB_CUDA_FOLDER + GrB_Info GxB_Context_new // create a new Context ( GxB_Context *Context // handle of Context to create @@ -3998,6 +4068,8 @@ GrB_Info GxB_Context_get (GxB_Context, GxB_Context_Field, ...) ; (arg1, __VA_ARGS__) #endif +#endif // GB_CUDA_FOLDER + //============================================================================== // GrB_set and GrB_get //============================================================================== @@ -4099,6 +4171,7 @@ GrB_Type_Code ; // GrB_get: get a scalar, string, enum, size, or void * from an object //------------------------------------------------------------------------------ +#ifndef GB_CUDA_FOLDER GrB_Info GrB_Scalar_get_Scalar (GrB_Scalar, GrB_Scalar, GrB_Field) ; GrB_Info GrB_Scalar_get_String (GrB_Scalar, char * , GrB_Field) ; GrB_Info GrB_Scalar_get_INT32 (GrB_Scalar, int32_t * , GrB_Field) ; @@ -4324,6 +4397,7 @@ GrB_Info GxB_Context_get_VOID (GxB_Context, void * , GrB_Field) ; void * : GxB_Serialized_get_VOID \ ) \ ) (object, value, __VA_ARGS__) +#endif //------------------------------------------------------------------------------ // GrB_set: set a scalar, string, enum, size, or void * of an object @@ -4508,7 +4582,7 @@ GrB_Info GxB_Context_set_VOID (GxB_Context, void * , GrB_Field, size_t) ; ) (object, value, __VA_ARGS__) #endif -#endif +#endif // GB_CUDA_FOLDER //============================================================================== // GrB_free: free any GraphBLAS object @@ -4518,6 +4592,8 @@ GrB_Info GxB_Context_set_VOID (GxB_Context, void * , GrB_Field, size_t) ; #define GrB_NULL NULL #define GrB_INVALID_HANDLE NULL +#ifndef GB_CUDA_FOLDER + #if GxB_STDC_VERSION >= 201112L #define GrB_free(object) \ _Generic \ @@ -4539,6 +4615,8 @@ GrB_Info GxB_Context_set_VOID (GxB_Context, void * , GrB_Field, size_t) ; (object) #endif +#endif + //============================================================================== // GrB_wait: finish computations //============================================================================== @@ -4550,6 +4628,8 @@ typedef enum } GrB_WaitMode ; +#ifndef GB_CUDA_FOLDER + // Finish all pending work in a specific object. GrB_Info GrB_Type_wait (GrB_Type type , GrB_WaitMode waitmode); @@ -4585,7 +4665,6 @@ GrB_Info GxB_Context_wait (GxB_Context Context , GrB_WaitMode waitmode); (object, waitmode) #endif - // NOTE: GxB_Scalar_wait is historical; use GrB_Scalar_wait instead GrB_Info GxB_Scalar_wait (GrB_Scalar *s) ; @@ -4933,6 +5012,8 @@ GrB_Info GxB_Matrix_eWiseUnion // C = accum (C, A+B) (C, Mask, accum, op, A, alpha, B, beta, desc) #endif +#endif // GB_CUDA_FOLDER + //============================================================================== // GrB_extract: extract a submatrix or subvector //============================================================================== @@ -4977,6 +5058,8 @@ GB_GLOBAL const uint64_t *GrB_ALL ; // I [GxB_INC ] = 2 ; // the magnitude of the increment // I [GxB_END ] = 1 ; // the end of the sequence +#ifndef GB_CUDA_FOLDER + GrB_Info GrB_Vector_extract // w = accum (w, u(I)) ( GrB_Vector w, // input/output vector for results @@ -8058,6 +8141,7 @@ GrB_Info GrB_Matrix_kronecker_Semiring // C = accum (C, kron(A,B)) (C, Mask, accum, op, A, B, desc) #endif +#endif // GB_CUDA_FOLDER //============================================================================== // GrB_Monoid: built-in monoids @@ -9004,6 +9088,8 @@ GB_GLOBAL GrB_Semiring // GrB_*_resize: change the size of a matrix or vector //============================================================================== +#ifndef GB_CUDA_FOLDER + // If the dimensions decrease, entries that fall outside the resized matrix or // vector are deleted. @@ -9050,6 +9136,8 @@ GrB_Info GxB_Vector_resize // change the size of a vector (historical) (arg1, __VA_ARGS__) #endif +#endif // GB_CUDA_FOLDER + //============================================================================== // GxB_fprint and GxB_print: print the contents of a GraphBLAS object //============================================================================== @@ -9106,6 +9194,8 @@ typedef enum } GxB_Print_Level ; +#ifndef GB_CUDA_FOLDER + GrB_Info GxB_Type_fprint // print and check a GrB_Type ( GrB_Type type, // object to print and check @@ -9197,11 +9287,6 @@ GrB_Info GxB_Context_fprint // print and check a GxB_Context FILE *f // file for output ) ; -// user code should not directly use GB_STR or GB_XSTR -// GB_STR: convert the content of x into a string "x" -#define GB_XSTR(x) GB_STR(x) -#define GB_STR(x) #x - #if GxB_STDC_VERSION >= 201112L #define GxB_fprint(object,pr,f) \ _Generic \ @@ -10245,6 +10330,8 @@ GrB_Info GxB_pack_HyperHash // move Y into A->Y const GrB_Descriptor desc // unused ) ; +#endif // GB_CUDA_FOLDER + //============================================================================== // GrB import/export //============================================================================== @@ -10273,6 +10360,8 @@ typedef enum } GrB_Format ; +#ifndef GB_CUDA_FOLDER + GrB_Info GrB_Matrix_import_BOOL // import a GrB_BOOL matrix ( GrB_Matrix *A, // handle of matrix to create @@ -10691,6 +10780,8 @@ GrB_Info GrB_Matrix_exportHint // suggest the best export format GrB_Matrix A // matrix to export ) ; +#endif // GB_CUDA_FOLDER + //============================================================================== // serialize/deserialize //============================================================================== @@ -10824,6 +10915,8 @@ GrB_Info GrB_Matrix_exportHint // suggest the best export format // positive but unrecognized, the default is used (GxB_COMPRESSION_ZSTD, // level 1). +#ifndef GB_CUDA_FOLDER + GrB_Info GxB_Matrix_serialize // serialize a GrB_Matrix to a blob ( // output: @@ -11969,6 +12062,8 @@ void GxB_Iterator_get_UDT (GxB_Iterator iterator, (iterator)->type_size) \ ) +#endif // GB_CUDA_FOLDER + #if defined ( __cplusplus ) } #endif diff --git a/Source/GB_apply_op.c b/Source/GB_apply_op.c index 0af3cb9b8a..4d3b3e1347 100644 --- a/Source/GB_apply_op.c +++ b/Source/GB_apply_op.c @@ -37,7 +37,7 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) GB_void *Cx, // output array const GrB_Type ctype, // type of C const GB_iso_code C_code_iso, // C non-iso, or code to compute C iso value - const GB_Operator op, // unary/index-unary/binop to apply + const GB_Operator op_in, // unary/index-unary/binop to apply const GrB_Scalar scalar, // scalar to bind to binary operator bool binop_bind1st, // if true, C=binop(s,A), else C=binop(A,s) bool flipij, // if true, flip i,j for user idxunop @@ -51,6 +51,7 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) //-------------------------------------------------------------------------- GrB_Info info ; + GB_Operator op = op_in ; ASSERT (Cx != NULL) ; ASSERT_MATRIX_OK (A, "A input for GB_apply_op", GB0) ; ASSERT (GB_JUMBLED_OK (A)) ; // A can be jumbled @@ -84,11 +85,57 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) GB_Opcode opcode ; bool op_is_unop = false ; bool op_is_binop = false ; + bool is64 = false ; + bool is32 = false ; + if (op != NULL) { opcode = op->opcode ; op_is_unop = GB_IS_UNARYOP_CODE (opcode) ; op_is_binop = GB_IS_BINARYOP_CODE (opcode) ; + is64 = (op->ztype == GrB_INT64) ; + is32 = (op->ztype == GrB_INT32) ; + + if (op_is_binop && GB_OPCODE_IS_POSITIONAL (opcode)) + { + // rename positional binary ops to positional unary ops + GrB_UnaryOp op1 = NULL ; + switch (opcode) + { + case GB_FIRSTI_binop_code : // z = first_i(A(i,j),y) == i + case GB_SECONDI_binop_code : // z = second_i(x,A(i,j)) == i + // rename FIRSTI and SECONDI to POSITIONI + op1 = is64 ? GxB_POSITIONI_INT64 : GxB_POSITIONI_INT32 ; + break ; + + case GB_FIRSTI1_binop_code : // z = first_i1(A(i,j),y) == i+1 + case GB_SECONDI1_binop_code : // z = second_i1(x,A(i,j)) == i+1 + // rename FIRSTI1 and SECONDI1 to POSITIONI1 + op1 = is64 ? GxB_POSITIONI1_INT64 : GxB_POSITIONI1_INT32 ; + break ; + + case GB_FIRSTJ_binop_code : // z = first_j(A(i,j),y) == j + case GB_SECONDJ_binop_code : // z = second_j(x,A(i,j)) == j + // rename FIRSTJ and SECONDJ to POSITIONJ + op1 = is64 ? GxB_POSITIONJ_INT64 : GxB_POSITIONJ_INT32 ; + break ; + + case GB_FIRSTJ1_binop_code : // z = first_j1(A(i,j),y) == j+1 + case GB_SECONDJ1_binop_code : // z = second_j1(x,A(i,j)) == j+1 + // rename FIRSTJ1 and SECONDJ1 to POSITIONJ1 + op1 = is64 ? GxB_POSITIONJ1_INT64 : GxB_POSITIONJ1_INT32 ; + break ; + + default:; + } + ASSERT (op1 != NULL) ; + op = (GB_Operator) op1 ; + opcode = op->opcode ; + op_is_unop = true ; + op_is_binop = false ; + ASSERT (GB_OPCODE_IS_POSITIONAL (opcode)) ; + } + } else { @@ -133,8 +180,6 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) // via the positional kernel //---------------------------------------------------------------------- - bool is64 = (op->ztype == GrB_INT64) ; - bool is32 = (op->ztype == GrB_INT32) ; ASSERT_OP_OK (op, "positional unop/idxunop/binop: GB_apply_op", GB0) ; // get A and C @@ -160,10 +205,6 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) case GB_POSITIONI_unop_code : // z = position_i(A(i,j)) == i case GB_POSITIONI1_unop_code : // z = position_i1(A(i,j)) == i+1 - case GB_FIRSTI_binop_code : // z = first_i(A(i,j),y) == i - case GB_FIRSTI1_binop_code : // z = first_i1(A(i,j),y) == i+1 - case GB_SECONDI_binop_code : // z = second_i(x,A(i,j)) == i - case GB_SECONDI1_binop_code : // z = second_i1(x,A(i,j)) == i+1 case GB_ROWINDEX_idxunop_code : // z = i+thunk #define GB_APPLY_OP(p) \ int64_t i = GBI_A (Ai, p, avlen) ; \ @@ -173,10 +214,6 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) case GB_POSITIONJ_unop_code : // z = position_j(A(i,j)) == j case GB_POSITIONJ1_unop_code : // z = position_j1(A(i,j)) == j+1 - case GB_FIRSTJ_binop_code : // z = first_j(A(i,j),y) == j - case GB_FIRSTJ1_binop_code : // z = first_j1(A(i,j),y) == j+1 - case GB_SECONDJ_binop_code : // z = second_j(x,A(i,j)) == j - case GB_SECONDJ1_binop_code : // z = second_j1(x,A(i,j)) == j+1 case GB_COLINDEX_idxunop_code : // z = j+thunk #define GB_APPLY_OP(p) \ Cz [p] = (j + thunk) ; @@ -214,10 +251,6 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) case GB_POSITIONI_unop_code : // z = position_i(A(i,j)) == i case GB_POSITIONI1_unop_code : // z = position_i1(A(i,j)) == i+1 - case GB_FIRSTI_binop_code : // z = first_i(A(i,j),y) == i - case GB_FIRSTI1_binop_code : // z = first_i1(A(i,j),y) == i+1 - case GB_SECONDI_binop_code : // z = second_i(x,A(i,j)) == i - case GB_SECONDI1_binop_code : // z = second_i1(x,A(i,j)) == i+1 case GB_ROWINDEX_idxunop_code : // z = i+thunk #define GB_APPLY_OP(p) \ int64_t i = GBI_A (Ai, p, avlen) ; \ @@ -227,10 +260,6 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) case GB_POSITIONJ_unop_code : // z = position_j(A(i,j)) == j case GB_POSITIONJ1_unop_code : // z = position_j1(A(i,j)) == j+1 - case GB_FIRSTJ_binop_code : // z = first_j(A(i,j),y) == j - case GB_FIRSTJ1_binop_code : // z = first_j1(A(i,j),y) == j+1 - case GB_SECONDJ_binop_code : // z = second_j(x,A(i,j)) == j - case GB_SECONDJ1_binop_code : // z = second_j1(x,A(i,j)) == j+1 case GB_COLINDEX_idxunop_code : // z = j+thunk #define GB_APPLY_OP(p) \ Cz [p] = (int32_t) (j + thunk) ; @@ -368,9 +397,9 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) // typecasting. IDENTITY operator can do arbitrary typecasting // (it is not used if no typecasting is done). - //--------------------------------------------------------------- + //-------------------------------------------------------------- // define the worker for the switch factory - //--------------------------------------------------------------- + //-------------------------------------------------------------- #define GB_unop_apply(unop,zname,aname) \ GB (_unop_apply_ ## unop ## zname ## aname) @@ -382,9 +411,9 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) } \ break ; - //--------------------------------------------------------------- + //-------------------------------------------------------------- // launch the switch factory - //--------------------------------------------------------------- + //-------------------------------------------------------------- #include "GB_unop_factory.c" } From 1f3829bfd51982aa71c63f43061799386a0b69fd Mon Sep 17 00:00:00 2001 From: Vidith Madhu Date: Sun, 7 Apr 2024 19:24:22 -0500 Subject: [PATCH 30/76] starting work on apply kernels --- CUDA/GB_cuda_apply_binop_branch.cpp | 27 ++++++++++++ .../GB_jit_kernel_cuda_apply_bind1st.cu | 44 +++++++++++++++++++ Source/GB_apply_op.c | 12 ++++- Source/GB_cuda_gateway.h | 8 ++++ notes.txt | 26 +++++++++-- 5 files changed, 112 insertions(+), 5 deletions(-) create mode 100644 CUDA/GB_cuda_apply_binop_branch.cpp create mode 100644 CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind1st.cu diff --git a/CUDA/GB_cuda_apply_binop_branch.cpp b/CUDA/GB_cuda_apply_binop_branch.cpp new file mode 100644 index 0000000000..52805b1e01 --- /dev/null +++ b/CUDA/GB_cuda_apply_binop_branch.cpp @@ -0,0 +1,27 @@ +#include "GraphBLAS_cuda.hpp" +#include "GB_cuda.hpp" + +bool GB_cuda_apply_binop_branch +( + const GrB_Type ctype, + const GrB_BinaryOp op, + const GrB_Matrix A, + const bool bind1st, +) +{ + bool ok = GB_cuda_type_branch (ctype) && GB_cuda_type_branch (A->type) ; + if (bind1st) + { + ok = ok && GB_cuda_type_branch (op->xtype) ; + } + else + { + ok = ok && GB_cuda_type_branch (op->ytype) ; + } + + if (!ok) + { + return false; + } + return true; +} diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind1st.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind1st.cu new file mode 100644 index 0000000000..0ad6b6d179 --- /dev/null +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind1st.cu @@ -0,0 +1,44 @@ +using namespace cooperative_groups ; + +__global__ void GB_cuda_apply_bind1st_kernel +( + GB_void *Cx, + GB_void *scalarx, + GrB_Matrix B, +) +{ + const GB_X_TYPE x = * ((GB_X_TYPE *) scalarx) ; // gets scalarx [0] + const GB_B_TYPE *__restrict__ Bx = (GB_B_TYPE *) B->x ; + GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *) Cx ; + + const int8_t *__restrict__ Bb = B->b ; + + GB_B_NHELD (nvals) ; + + int tid = blockDim.x * blockIdx.x + threadIdx.x; + int nthreads = blockDim.x * gridDim.x ; + + for (int p = tid ; p < nvals ; p += nthreads) + { + if (!GBB_B (Bb, p)) { continue ; } + GB_DECLAREB (bij) ; + GB_GETB (bij, Bx, p, false) ; + GB_EWISEOP (Cx, p, x, bij, 0, 0) ; + } +} + +extern "C" { + GB_JIT_CUDA_KERNEL_APPLY_BIND1ST_PROTO (GB_jit_kernel) ; +} + +GB_JIT_CUDA_KERNEL_APPLY_BIND1ST_PROTO (GB_jit_kernel) +{ + ASSERT (Cx != NULL) ; + + dim3 grid (gridsz) ; + dim3 block (blocksz) ; + + GB_cuda_apply_bind1st_kernel <<>> (Cx, scalarx, A) ; + + return (GrB_SUCCESS) ; +} \ No newline at end of file diff --git a/Source/GB_apply_op.c b/Source/GB_apply_op.c index c897500313..7975107318 100644 --- a/Source/GB_apply_op.c +++ b/Source/GB_apply_op.c @@ -357,6 +357,8 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) ASSERT_OP_OK (op, "unop for GB_apply_op", GB0) ; ASSERT (!A->iso) ; + // TODO: CUDA JIT unop entry point here + // determine number of threads to use #ifndef GBCOMPACT GB_IF_FACTORY_KERNELS_ENABLED @@ -391,8 +393,6 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) } #endif - // TODO: CUDA JIT unop entry point here - //---------------------------------------------------------------------- // via the JIT or PreJIT kernel //---------------------------------------------------------------------- @@ -492,6 +492,12 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) // z = binop (scalar,Ax) //------------------------------------------------------------------ + // #if defined ( GRAPHBLAS_HAS_CUDA ) + // if (GB_cuda_apply_binop_branch (ctype, (GrB_BinaryOp) op, A, true)) { + // info = GB_cuda_apply_bind1st_jit (Cx, scalarx, A) ; + // } + // #endif + #ifndef GBCOMPACT GB_IF_FACTORY_KERNELS_ENABLED { @@ -541,6 +547,8 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) //------------------------------------------------------------------ // z = binop (Ax,scalar) //------------------------------------------------------------------ + + // TODO: binop bind2nd CUDA JIT entry point here #ifndef GBCOMPACT GB_IF_FACTORY_KERNELS_ENABLED diff --git a/Source/GB_cuda_gateway.h b/Source/GB_cuda_gateway.h index ed13426e25..3beeac50b4 100644 --- a/Source/GB_cuda_gateway.h +++ b/Source/GB_cuda_gateway.h @@ -168,6 +168,14 @@ GrB_Info GB_cuda_colscale const bool flipxy ) ; +bool GB_cuda_apply_binop_branch +( + const GrB_Type ctype, + const GrB_BinaryOp op, + const GrB_Matrix A, + const bool bind1st, +) ; + bool GB_cuda_type_branch // return true if the type is OK on GPU ( const GrB_Type type // type to query diff --git a/notes.txt b/notes.txt index 8fa5de031b..d09f206466 100644 --- a/notes.txt +++ b/notes.txt @@ -170,6 +170,26 @@ Kernel development notes: - 5 cases: 1. Positional op (not user-defined) - Handled by templates (NOT JIT) + - Ideally, should be handled by JIT. Problem: positional binops not jitted + - Solution: Convert positional binops to positional unops + - Overview of all ops: + a. unops (GrB_UnaryOp): + - Have both positional/non-positional + - Non-positional are plain z = f(x) + - Positional: GxB_POSITION* (does NOT depend on x) + - f(x) = i/j + b. binops (GrB_BinaryOp): + - Like unop, has positional/non-positional + - Non-positional: are plain z = f(x, y) + - Positional: GxB_{FIRST | SECOND}* (does NOT depend on x, y) + - Always gives row/col, based on I or J name + c. indexunaryops (GrB_IndexUnaryOp) + - Part of spec, fulfill the role of positional unops + - While positional unops do NOT consider the input, + IndexUnaryOps can (the "thunk") + - thunk adds a constant offset to result + + 2. Iso op - When C is iso. Handled by iso kernel (NOT JIT) 3. Unary op (not positional) @@ -177,7 +197,7 @@ Kernel development notes: 4. Binary op (not positional) - bind1st/bind2nd: is the scalar on left or right - Same process as (3) - 5. User-defined indexunaryop (not positional) + 5. User-defined indexunaryop + - Need to handle all "depends on" cases (i, j, x, y) since + user-defined - - From f612c2b6ecb33d8407b2bc879e295fcba2177d69 Mon Sep 17 00:00:00 2001 From: Vidith Madhu Date: Mon, 8 Apr 2024 01:06:32 -0500 Subject: [PATCH 31/76] apply progress --- CUDA/GB_cuda_apply_unop_branch.cpp | 17 +++++ .../GB_jit_kernel_cuda_apply_bind1st.cu | 2 +- .../GB_jit_kernel_cuda_apply_unop.cu | 40 ++++++++++ Source/Template/GB_jit_kernel_proto.h | 16 ++++ notes.txt | 73 +++++++++++++------ 5 files changed, 126 insertions(+), 22 deletions(-) create mode 100644 CUDA/GB_cuda_apply_unop_branch.cpp create mode 100644 CUDA/JitKernels/GB_jit_kernel_cuda_apply_unop.cu diff --git a/CUDA/GB_cuda_apply_unop_branch.cpp b/CUDA/GB_cuda_apply_unop_branch.cpp new file mode 100644 index 0000000000..1b0729f64a --- /dev/null +++ b/CUDA/GB_cuda_apply_unop_branch.cpp @@ -0,0 +1,17 @@ +#include "GraphBLAS_cuda.hpp" +#include "GB_cuda.hpp" + +bool GB_cuda_apply_unop_branch +( + const GrB_Type ctype, + const GrB_Matrix A, +) +{ + bool ok = GB_cuda_type_branch (ctype) && GB_cuda_type_branch (A->type) ; + + if (!ok) + { + return false; + } + return true; +} \ No newline at end of file diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind1st.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind1st.cu index 0ad6b6d179..9948c516a5 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind1st.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind1st.cu @@ -38,7 +38,7 @@ GB_JIT_CUDA_KERNEL_APPLY_BIND1ST_PROTO (GB_jit_kernel) dim3 grid (gridsz) ; dim3 block (blocksz) ; - GB_cuda_apply_bind1st_kernel <<>> (Cx, scalarx, A) ; + GB_cuda_apply_bind1st_kernel <<>> (Cx, scalarx, B) ; return (GrB_SUCCESS) ; } \ No newline at end of file diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_unop.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_unop.cu new file mode 100644 index 0000000000..7b287feb62 --- /dev/null +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_unop.cu @@ -0,0 +1,40 @@ +using namespace cooperative_groups ; + +__global__ void GB_cuda_apply_unop_kernel +( + GB_void *Cx, + GB_void *thunk_value, + GrB_Matrix A +) +{ + + GB_A_NHELD (nvals) ; + GB_Y_TYPE thunk ; // uninitialized if no thunk, not used by macro + + #if defined ( GB_DEPENDS_ON_Y ) + // get thunk value (of type GB_Y_TYPE) + thunk = * ((GB_Y_TYPE *) thunk_value) ; + #endif + + #if defined ( GB_DEPENDS_ON_J ) + // need to do ek_slice method + #else + // can do normal method + int tid = blockDim.x * blockIdx.x + threadIdx.x ; + int nthreads = blockDim.x * gridDim.x ; + + for (int p = tid ; p < nvals ; p += nthreads) + { + + } + #endif +} + +extern "C" { + GB_JIT_CUDA_KERNEL_APPLY_UNOP_PROTO (GB_jit_kernel) ; +} + +GB_JIT_CUDA_KERNEL_APPLY_UNOP_PROTO (GB_jit_kernel) +{ + return (GrB_SUCCESS) ; +} \ No newline at end of file diff --git a/Source/Template/GB_jit_kernel_proto.h b/Source/Template/GB_jit_kernel_proto.h index d8578f0b9e..a94a242eb9 100644 --- a/Source/Template/GB_jit_kernel_proto.h +++ b/Source/Template/GB_jit_kernel_proto.h @@ -594,6 +594,22 @@ GrB_Info GB_jit_kernel_colscale \ int32_t blocksz \ ) +#define GB_JIT_CUDA_KERNEL_APPLY_BIND1ST_PROTO(GB_jit_kernel_apply_bind1st) \ +GrB_Info GB_jit_kernel_apply_bind1st \ +( \ + GB_void *Cx, \ + GB_void *scalarx, \ + GrB_Matrix B \ +) \ + +#define GB_JIT_CUDA_KERNEL_APPLY_UNOP_PROTO(GB_jit_kernel_apply_unop) \ +GrB_Info GB_jit_kernel_apply_unop \ +( \ + GB_void *Cx, \ + GB_void *thunk_value, \ + GrB_Matrix A \ +) \ + #define GB_JIT_CUDA_KERNEL_DOT3_PROTO(GB_jit_kernel_AxB_dot3) \ GrB_Info GB_jit_kernel_AxB_dot3 \ ( \ diff --git a/notes.txt b/notes.txt index d09f206466..dc6e8f3760 100644 --- a/notes.txt +++ b/notes.txt @@ -167,29 +167,33 @@ Kernel development notes: - Can use a unary op, index unary op, or binary op - Entry point: GB_apply - Main work: GB_apply_op - - 5 cases: - 1. Positional op (not user-defined) + - Overview of all ops: + 1. unops (GrB_UnaryOp): + - Have both positional/non-positional + - Non-positional are plain z = f(x), and can be user-defined + - Positional: GxB_POSITION* (does NOT depend on x). CANNOT be user-defined, non-spec + - f(x) = i/j + 2. binops (GrB_BinaryOp): + - Like unop, has positional/non-positional + - Non-positional: are plain z = f(x, y), can be user-defined + - Positional: GxB_{FIRST | SECOND}* (does NOT depend on x, y). CANNOT be user-defined, non-spec + - Always gives row/col, based on I or J name + 3. indexunaryops (GrB_IndexUnaryOp) + - Part of spec, fulfill the role of positional unops + - Only positional op that can be user-defined + - While positional unops do NOT consider the input, + IndexUnaryOps can (the "thunk") + - thunk can be used for comparisons, add a constant offset, etc + + - Positional ops always return int64, int32, or bool + - Non-positional return type can be based on type of matrix + + - 5 cases for apply_op: + 1. Positional op (not user-defined, but can still be an indexunaryop) + - Handles all 3 of above ops, positional variants, not user-defined - Handled by templates (NOT JIT) - Ideally, should be handled by JIT. Problem: positional binops not jitted - Solution: Convert positional binops to positional unops - - Overview of all ops: - a. unops (GrB_UnaryOp): - - Have both positional/non-positional - - Non-positional are plain z = f(x) - - Positional: GxB_POSITION* (does NOT depend on x) - - f(x) = i/j - b. binops (GrB_BinaryOp): - - Like unop, has positional/non-positional - - Non-positional: are plain z = f(x, y) - - Positional: GxB_{FIRST | SECOND}* (does NOT depend on x, y) - - Always gives row/col, based on I or J name - c. indexunaryops (GrB_IndexUnaryOp) - - Part of spec, fulfill the role of positional unops - - While positional unops do NOT consider the input, - IndexUnaryOps can (the "thunk") - - thunk adds a constant offset to result - - 2. Iso op - When C is iso. Handled by iso kernel (NOT JIT) 3. Unary op (not positional) @@ -198,6 +202,33 @@ Kernel development notes: - bind1st/bind2nd: is the scalar on left or right - Same process as (3) 5. User-defined indexunaryop - - Need to handle all "depends on" cases (i, j, x, y) since + - Need to handle all "depends on" cases (i, j, y) since user-defined + - Progress notes: + - binops (bind1st/bind2nd) -> straightforward + - unops: + 1. Positional ops: needs to handle positional unops and idxunops + a. Needed for input: + - Cx (of type int64_t, int32_t, or bool respectively, can get by GB_C_TYPE) + - thunk + - A matrix + b. Needed for branch input: + - None for now? (should always be true?) + 2. Non-positional ops + a. Needed for input: + - Cx (could be whatever type) + - A matrix + b. Needed for branch input: + - Ctype + - A matrix (for checking A->type) + 3. Consolidated kernel: + a. Needed for input: + - Cx (whatever type) + - thunk + - A matrix + b. Needed for branch input: + - Requirements for non-positional branch input + + + From 92284619964ae84c5c434d7af82bf7e4ba30137d Mon Sep 17 00:00:00 2001 From: Vidith Madhu Date: Mon, 8 Apr 2024 01:25:09 -0500 Subject: [PATCH 32/76] some fixes --- CUDA/GB_cuda_apply_binop_branch.cpp | 2 +- CUDA/GB_cuda_apply_unop_branch.cpp | 4 ++-- CUDA/GB_cuda_colscale.cpp | 3 +-- CUDA/GB_cuda_rowscale.cpp | 3 +-- Source/GB_cuda_gateway.h | 9 ++++++++- 5 files changed, 13 insertions(+), 8 deletions(-) diff --git a/CUDA/GB_cuda_apply_binop_branch.cpp b/CUDA/GB_cuda_apply_binop_branch.cpp index 52805b1e01..e79fb8ed4d 100644 --- a/CUDA/GB_cuda_apply_binop_branch.cpp +++ b/CUDA/GB_cuda_apply_binop_branch.cpp @@ -6,7 +6,7 @@ bool GB_cuda_apply_binop_branch const GrB_Type ctype, const GrB_BinaryOp op, const GrB_Matrix A, - const bool bind1st, + const bool bind1st ) { bool ok = GB_cuda_type_branch (ctype) && GB_cuda_type_branch (A->type) ; diff --git a/CUDA/GB_cuda_apply_unop_branch.cpp b/CUDA/GB_cuda_apply_unop_branch.cpp index 1b0729f64a..fe4d518890 100644 --- a/CUDA/GB_cuda_apply_unop_branch.cpp +++ b/CUDA/GB_cuda_apply_unop_branch.cpp @@ -4,11 +4,11 @@ bool GB_cuda_apply_unop_branch ( const GrB_Type ctype, - const GrB_Matrix A, + const GrB_Matrix A ) { bool ok = GB_cuda_type_branch (ctype) && GB_cuda_type_branch (A->type) ; - + if (!ok) { return false; diff --git a/CUDA/GB_cuda_colscale.cpp b/CUDA/GB_cuda_colscale.cpp index b4e422c93a..c9e561e5b7 100644 --- a/CUDA/GB_cuda_colscale.cpp +++ b/CUDA/GB_cuda_colscale.cpp @@ -23,8 +23,7 @@ GrB_Info GB_cuda_colscale CUDA_OK (cudaStreamCreate (&stream)) ; // compute gridsz, blocksz, call GB_cuda_rowscale_jit - GrB_Index anz ; - GrB_Matrix_nvals (&anz, A) ; + GrB_Index anz = GB_nnz_held (A) ; int32_t gridsz = 1 + (anz >> LOG2_BLOCK_SIZE) ; diff --git a/CUDA/GB_cuda_rowscale.cpp b/CUDA/GB_cuda_rowscale.cpp index 2cbff2f21e..3951bd1491 100644 --- a/CUDA/GB_cuda_rowscale.cpp +++ b/CUDA/GB_cuda_rowscale.cpp @@ -23,8 +23,7 @@ GrB_Info GB_cuda_rowscale CUDA_OK (cudaStreamCreate (&stream)) ; // compute gridsz, blocksz, call GB_cuda_rowscale_jit - GrB_Index bnz ; - GrB_Matrix_nvals (&bnz, B) ; + GrB_Index bnz = GB_nnz_held (B) ; int32_t gridsz = 1 + (bnz >> LOG2_BLOCK_SIZE) ; diff --git a/Source/GB_cuda_gateway.h b/Source/GB_cuda_gateway.h index 3beeac50b4..cfef994188 100644 --- a/Source/GB_cuda_gateway.h +++ b/Source/GB_cuda_gateway.h @@ -173,9 +173,16 @@ bool GB_cuda_apply_binop_branch const GrB_Type ctype, const GrB_BinaryOp op, const GrB_Matrix A, - const bool bind1st, + const bool bind1st ) ; +bool GB_cuda_apply_unop_branch +( + const GrB_Type ctype, + const GrB_Matrix A +) ; + + bool GB_cuda_type_branch // return true if the type is OK on GPU ( const GrB_Type type // type to query From f66813203f73925af08b2d1e6926e6b17af60eb9 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 9 Apr 2024 11:12:42 -0500 Subject: [PATCH 33/76] split GraphBLAS.h: first part enums & typedefs, 2nd part GrB/GxB function prototypes --- CMakeLists.txt | 2 +- CUDA/GraphBLAS_cuda.hpp | 1 - Config/GraphBLAS.h.in | 12155 +++++++++++----------- Include/GraphBLAS.h | 12155 +++++++++++----------- Source/Template/GB_Template.h | 1 - cmake_modules/GraphBLAS_JIT_paths.cmake | 2 +- 6 files changed, 12122 insertions(+), 12194 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ad6e01c173..f09ea1fd91 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -60,7 +60,7 @@ endif ( ) if ( SUITESPARSE_HAS_CUDA AND GRAPHBLAS_USE_CUDA ) # FOR NOW: do not compile FactoryKernels when developing the CUDA kernels - set ( GRAPHBLAS_COMPACT ON ) +# set ( GRAPHBLAS_COMPACT ON ) message ( STATUS "GraphBLAS CUDA JIT: enabled") enable_language ( CUDA ) set ( GRAPHBLAS_HAS_CUDA ON ) diff --git a/CUDA/GraphBLAS_cuda.hpp b/CUDA/GraphBLAS_cuda.hpp index 2acdacf5f0..7de3cb0398 100644 --- a/CUDA/GraphBLAS_cuda.hpp +++ b/CUDA/GraphBLAS_cuda.hpp @@ -22,7 +22,6 @@ #endif #define GB_CUDA_FOLDER -#define GB_LIBRARY #include "GraphBLAS.h" #undef I diff --git a/Config/GraphBLAS.h.in b/Config/GraphBLAS.h.in index 24ad016505..30a0cecd00 100644 --- a/Config/GraphBLAS.h.in +++ b/Config/GraphBLAS.h.in @@ -40,15 +40,19 @@ #ifndef GRAPHBLAS_H #define GRAPHBLAS_H +#if defined ( __cplusplus ) +extern "C" +{ +#endif + //============================================================================== //=== GraphBLAS macros, typedefs, enums, and global variables ================= //============================================================================== // This GraphBLAS.h header file is split into two parts. The first part // defines macros, typedefs, enums, global variables, and pulls in standard C -// #include files. - -// The second part defines all of the user-callable GrB_* +// #include files. The second part defines all of the user-callable GrB_*, +// with access controlled by the internal definition, GB_CUDA_FOLDER. //------------------------------------------------------------------------------ // include files required by GraphBLAS @@ -70,6 +74,9 @@ // helper macros //------------------------------------------------------------------------------ +// These are required for internal use in GraphBLAS.h, but should not be used +// by the end user application. + #define GB_CAT2(x,y) x ## y #define GB_EVAL2(x,y) GB_CAT2 (x,y) @@ -329,10 +336,6 @@ typedef uint64_t GrB_Index ; // called, which returns a string that provides more information on the last // return value from GraphBLAS. -// The v1.3 C API did not specify the enum values, but they appear in v2.0. -// Changing them will require SuiteSparse:GraphBLAS to bump to v6.x. -// Error codes GrB_NOT_IMPLEMENTED and GrB_EMPTY_OBJECT are new to v2.0. - typedef enum { @@ -368,6 +371,10 @@ typedef enum } GrB_Info ; +// for null and invalid objects +#define GrB_NULL NULL +#define GrB_INVALID_HANDLE NULL + //============================================================================== // GrB_init / GrB_finalize //============================================================================== @@ -393,53 +400,6 @@ typedef enum } GrB_Mode ; -//============================================================================== -// GrB_init / GrB_finalize -//============================================================================== - -#if defined ( __cplusplus ) -extern "C" -{ -#endif - -#ifndef GB_CUDA_FOLDER - -GrB_Info GrB_init // start up GraphBLAS -( - GrB_Mode mode // blocking or non-blocking mode, no GPU -) ; - -GrB_Info GxB_init // start up GraphBLAS and also define malloc, etc -( - GrB_Mode mode, // blocking or non-blocking mode, - // with or without GPU - // pointers to memory management functions - void * (* user_malloc_function ) (size_t), - void * (* user_calloc_function ) (size_t, size_t), - void * (* user_realloc_function ) (void *, size_t), - void (* user_free_function ) (void *) -) ; - -GrB_Info GrB_finalize (void) ; // finish GraphBLAS - -//============================================================================== -// GrB_getVersion: GraphBLAS C API version -//============================================================================== - -// GrB_getVersion provides a runtime access of the C API Version. Can also be -// done with two calls to GrB_Global_get_INT32 with the v2.1 C API: -// -// GrB_get (GrB_GLOBAL, &version, GrB_API_VER_MAJOR) ; -// GrB_get (GrB_GLOBAL, &subversion, GrB_API_VER_MINOR) ; - -GrB_Info GrB_getVersion // runtime access to C API version number -( - unsigned int *version, // returns GRB_VERSION - unsigned int *subversion // returns GRB_SUBVERSION -) ; - -#endif // GB_CUDA_FOLDER - //============================================================================== // GrB_Descriptor: the GraphBLAS descriptor //============================================================================== @@ -568,30 +528,6 @@ GrB_Desc_Value ; typedef struct GB_Descriptor_opaque *GrB_Descriptor ; -#ifndef GB_CUDA_FOLDER - -GrB_Info GrB_Descriptor_new // create a new descriptor -( - GrB_Descriptor *descriptor // handle of descriptor to create -) ; - -// historical methods; use GrB_set and GrB_get instead: -GrB_Info GrB_Descriptor_set (GrB_Descriptor, GrB_Desc_Field, GrB_Desc_Value) ; -GrB_Info GxB_Descriptor_get (GrB_Desc_Value *, GrB_Descriptor, GrB_Desc_Field) ; -GrB_Info GxB_Desc_set (GrB_Descriptor, GrB_Desc_Field, ...) ; -GrB_Info GxB_Desc_set_INT32 (GrB_Descriptor, GrB_Desc_Field, int32_t) ; -GrB_Info GxB_Desc_set_FP64 (GrB_Descriptor, GrB_Desc_Field, double) ; -GrB_Info GxB_Desc_get (GrB_Descriptor, GrB_Desc_Field, ...) ; -GrB_Info GxB_Desc_get_INT32 (GrB_Descriptor, GrB_Desc_Field, int32_t *) ; -GrB_Info GxB_Desc_get_FP64 (GrB_Descriptor, GrB_Desc_Field, double *) ; - -GrB_Info GrB_Descriptor_free // free a descriptor -( - GrB_Descriptor *descriptor // handle of descriptor to free -) ; - -#endif // GB_CUDA_FOLDER - // Predefined descriptors and their values: GB_GLOBAL GrB_Descriptor @@ -672,123 +608,8 @@ GB_GLOBAL GrB_Type GxB_FC32 , // in C: float complex GxB_FC64 ; // in C: double complex -//------------------------------------------------------------------------------ -// helper macros for polymorphic functions -//------------------------------------------------------------------------------ - -#define GB_CAT(w,x,y,z) w ## x ## y ## z -#define GB_CONCAT(w,x,y,z) GB_CAT (w, x, y, z) - -// methods for C scalars of various types -#define GB_CASES(prefix,func) \ - bool : GB_CONCAT ( prefix, _, func, _BOOL ), \ - int8_t : GB_CONCAT ( prefix, _, func, _INT8 ), \ - int16_t : GB_CONCAT ( prefix, _, func, _INT16 ), \ - int32_t : GB_CONCAT ( prefix, _, func, _INT32 ), \ - int64_t : GB_CONCAT ( prefix, _, func, _INT64 ), \ - uint8_t : GB_CONCAT ( prefix, _, func, _UINT8 ), \ - uint16_t : GB_CONCAT ( prefix, _, func, _UINT16 ), \ - uint32_t : GB_CONCAT ( prefix, _, func, _UINT32 ), \ - uint64_t : GB_CONCAT ( prefix, _, func, _UINT64 ), \ - float : GB_CONCAT ( prefix, _, func, _FP32 ), \ - double : GB_CONCAT ( prefix, _, func, _FP64 ), \ - GxB_FC32_t : GB_CONCAT ( GxB , _, func, _FC32 ), \ - GxB_FC64_t : GB_CONCAT ( GxB , _, func, _FC64 ), \ - const void * : GB_CONCAT ( prefix, _, func, _UDT ), \ - void * : GB_CONCAT ( prefix, _, func, _UDT ) - -// methods for C arrays of various types -#define GB_PCASES(prefix,func) \ - const bool * : GB_CONCAT ( prefix, _, func, _BOOL ), \ - bool * : GB_CONCAT ( prefix, _, func, _BOOL ), \ - const int8_t * : GB_CONCAT ( prefix, _, func, _INT8 ), \ - int8_t * : GB_CONCAT ( prefix, _, func, _INT8 ), \ - const int16_t * : GB_CONCAT ( prefix, _, func, _INT16 ), \ - int16_t * : GB_CONCAT ( prefix, _, func, _INT16 ), \ - const int32_t * : GB_CONCAT ( prefix, _, func, _INT32 ), \ - int32_t * : GB_CONCAT ( prefix, _, func, _INT32 ), \ - const int64_t * : GB_CONCAT ( prefix, _, func, _INT64 ), \ - int64_t * : GB_CONCAT ( prefix, _, func, _INT64 ), \ - const uint8_t * : GB_CONCAT ( prefix, _, func, _UINT8 ), \ - uint8_t * : GB_CONCAT ( prefix, _, func, _UINT8 ), \ - const uint16_t * : GB_CONCAT ( prefix, _, func, _UINT16 ), \ - uint16_t * : GB_CONCAT ( prefix, _, func, _UINT16 ), \ - const uint32_t * : GB_CONCAT ( prefix, _, func, _UINT32 ), \ - uint32_t * : GB_CONCAT ( prefix, _, func, _UINT32 ), \ - const uint64_t * : GB_CONCAT ( prefix, _, func, _UINT64 ), \ - uint64_t * : GB_CONCAT ( prefix, _, func, _UINT64 ), \ - const float * : GB_CONCAT ( prefix, _, func, _FP32 ), \ - float * : GB_CONCAT ( prefix, _, func, _FP32 ), \ - const double * : GB_CONCAT ( prefix, _, func, _FP64 ), \ - double * : GB_CONCAT ( prefix, _, func, _FP64 ), \ - const GxB_FC32_t * : GB_CONCAT ( GxB , _, func, _FC32 ), \ - GxB_FC32_t * : GB_CONCAT ( GxB , _, func, _FC32 ), \ - const GxB_FC64_t * : GB_CONCAT ( GxB , _, func, _FC64 ), \ - GxB_FC64_t * : GB_CONCAT ( GxB , _, func, _FC64 ), \ - const void * : GB_CONCAT ( prefix, _, func, _UDT ), \ - void * : GB_CONCAT ( prefix, _, func, _UDT ) - -//------------------------------------------------------------------------------ -// GrB_Type_new: create a new type -//------------------------------------------------------------------------------ - #define GxB_MAX_NAME_LEN 128 -#ifndef GB_CUDA_FOLDER - -GrB_Info GrB_Type_new // create a new GraphBLAS type -( - GrB_Type *type, // handle of user type to create - size_t sizeof_ctype // size = sizeof (ctype) of the C type -) ; - -// GxB_Type_new creates a type with a name and definition that are known to -// GraphBLAS, as strings. The type_name is any valid string (max length of 128 -// characters, including the required null-terminating character) that may -// appear as the name of a C type created by a C "typedef" statement. It must -// not contain any white-space characters. Example, creating a type of size -// 16*4+4 = 68 bytes, with a 4-by-4 dense float array and a 32-bit integer: -// -// typedef struct { float x [4][4] ; int color ; } myquaternion ; -// GrB_Type MyQtype ; -// GxB_Type_new (&MyQtype, sizeof (myquaternion), "myquaternion", -// "typedef struct { float x [4][4] ; int color ; } myquaternion ;") ; -// -// The type_name and type_defn are both null-terminated strings. The two -// strings are required for best performance in the JIT (both on the CPU and -// GPU). User defined types created by GrB_Type_new will not work with a JIT. -// -// At most GxB_MAX_NAME_LEN characters are accessed in type_name; characters -// beyond that limit are silently ignored. - -GrB_Info GxB_Type_new // create a new named GraphBLAS type -( - GrB_Type *type, // handle of user type to create - size_t sizeof_ctype, // size = sizeof (ctype) of the C type - const char *type_name, // name of the type (max 128 characters) - const char *type_defn // typedef for the type (no max length) -) ; - -// historical; use GrB_get instead: -GrB_Info GxB_Type_name (char *type_name, const GrB_Type type) ; -GrB_Info GxB_Type_size (size_t *size, const GrB_Type type) ; - -GrB_Info GxB_Type_from_name // return the built-in GrB_Type from a name -( - GrB_Type *type, // built-in type, or NULL if user-defined. - // The name can be the underlying C type - // ("int8_t") or the GraphBLAS name - // ("GrB_INT8"). - const char *type_name // array of size at least GxB_MAX_NAME_LEN -) ; - -GrB_Info GrB_Type_free // free a user-defined type -( - GrB_Type *type // handle of user-defined type to free -) ; - -#endif // GB_CUDA_FOLDER - //============================================================================== // GrB_UnaryOp: unary operators //============================================================================== @@ -979,47 +800,8 @@ GB_GLOBAL GrB_UnaryOp GxB_ISFINITE_FC32, // isfinite (real (x)) && isfinite (cimag (x)) GxB_ISFINITE_FC64 ; // isfinite (real (x)) && isfinite (cimag (x)) -//------------------------------------------------------------------------------ -// methods for unary operators -//------------------------------------------------------------------------------ - typedef void (*GxB_unary_function) (void *, const void *) ; -#ifndef GB_CUDA_FOLDER - -// GrB_UnaryOp_new creates a user-defined unary op (with no name or defn) -GrB_Info GrB_UnaryOp_new // create a new user-defined unary operator -( - GrB_UnaryOp *unaryop, // handle for the new unary operator - GxB_unary_function function, // pointer to the unary function - GrB_Type ztype, // type of output z - GrB_Type xtype // type of input x -) ; - -// GxB_UnaryOp_new creates a named and defined user-defined unary op. -GrB_Info GxB_UnaryOp_new // create a new user-defined unary operator -( - GrB_UnaryOp *unaryop, // handle for the new unary operator - GxB_unary_function function, // pointer to the unary function - GrB_Type ztype, // type of output z - GrB_Type xtype, // type of input x - const char *unop_name, // name of the user function - const char *unop_defn // definition of the user function -) ; - -// historical; use GrB_get instead: -GrB_Info GxB_UnaryOp_ztype (GrB_Type *ztype, GrB_UnaryOp unaryop) ; -GrB_Info GxB_UnaryOp_ztype_name (char *type_name, const GrB_UnaryOp unaryop) ; -GrB_Info GxB_UnaryOp_xtype (GrB_Type *xtype, GrB_UnaryOp unaryop) ; -GrB_Info GxB_UnaryOp_xtype_name (char *type_name, const GrB_UnaryOp unaryop) ; - -GrB_Info GrB_UnaryOp_free // free a user-created unary operator -( - GrB_UnaryOp *unaryop // handle of unary operator to free -) ; - -#endif // GB_CUDA_FOLDER - //============================================================================== // GrB_BinaryOp: binary operators //============================================================================== @@ -1419,64 +1201,18 @@ GB_GLOBAL GrB_BinaryOp GxB_IGNORE_DUP ; // BXOR, and BXNOR. This assumes that the computations for each bit are // entirely independent (so BSHIFT would not fit in the table above). -//------------------------------------------------------------------------------ -// methods for binary operators -//------------------------------------------------------------------------------ - typedef void (*GxB_binary_function) (void *, const void *, const void *) ; -#ifndef GB_CUDA_FOLDER +//============================================================================== +// GxB_SelectOp: select operators (DEPRECATED: do not use) +//============================================================================== -// GrB_BinaryOp_new creates a user-defined binary op (no name or defn) -GrB_Info GrB_BinaryOp_new -( - GrB_BinaryOp *binaryop, // handle for the new binary operator - GxB_binary_function function, // pointer to the binary function - GrB_Type ztype, // type of output z - GrB_Type xtype, // type of input x - GrB_Type ytype // type of input y -) ; - -// GxB_BinaryOp_new creates a named and defined user-defined binary op. -GrB_Info GxB_BinaryOp_new -( - GrB_BinaryOp *op, // handle for the new binary operator - GxB_binary_function function, // pointer to the binary function - GrB_Type ztype, // type of output z - GrB_Type xtype, // type of input x - GrB_Type ytype, // type of input y - const char *binop_name, // name of the user function - const char *binop_defn // definition of the user function -) ; - -// historical; use GrB_get instead: -GrB_Info GxB_BinaryOp_ztype (GrB_Type *ztype, GrB_BinaryOp op) ; -GrB_Info GxB_BinaryOp_ztype_name (char *type_name, const GrB_BinaryOp op) ; -GrB_Info GxB_BinaryOp_xtype (GrB_Type *xtype, GrB_BinaryOp op) ; -GrB_Info GxB_BinaryOp_xtype_name (char *type_name, const GrB_BinaryOp op) ; -GrB_Info GxB_BinaryOp_ytype (GrB_Type *ytype, GrB_BinaryOp op) ; -GrB_Info GxB_BinaryOp_ytype_name (char *type_name, const GrB_BinaryOp op) ; - -GrB_Info GrB_BinaryOp_free // free a user-created binary operator -( - GrB_BinaryOp *binaryop // handle of binary operator to free -) ; - -#endif // GB_CUDA_FOLDER - -//============================================================================== -// GxB_SelectOp: select operators (DEPRECATED: do not use) -//============================================================================== - -// historical; use GrB_select and GrB_IndexUnaryOp instead: -typedef struct GB_SelectOp_opaque *GxB_SelectOp ; -GB_GLOBAL GxB_SelectOp GxB_TRIL, GxB_TRIU, GxB_DIAG, GxB_OFFDIAG, GxB_NONZERO, -GxB_EQ_ZERO, GxB_GT_ZERO, GxB_GE_ZERO, GxB_LT_ZERO, GxB_LE_ZERO, GxB_NE_THUNK, -GxB_EQ_THUNK, GxB_GT_THUNK, GxB_GE_THUNK, GxB_LT_THUNK, GxB_LE_THUNK ; -#ifndef GB_CUDA_FOLDER -GrB_Info GxB_SelectOp_xtype (GrB_Type *xtype, GxB_SelectOp selectop) ; -GrB_Info GxB_SelectOp_ttype (GrB_Type *ttype, GxB_SelectOp selectop) ; -#endif // GB_CUDA_FOLDER +// historical; use GrB_select and GrB_IndexUnaryOp instead: +typedef struct GB_SelectOp_opaque *GxB_SelectOp ; +GB_GLOBAL GxB_SelectOp GxB_TRIL, GxB_TRIU, GxB_DIAG, GxB_OFFDIAG, GxB_NONZERO, + GxB_EQ_ZERO, GxB_GT_ZERO, GxB_GE_ZERO, GxB_LT_ZERO, GxB_LE_ZERO, + GxB_NE_THUNK, GxB_EQ_THUNK, GxB_GT_THUNK, GxB_GE_THUNK, GxB_LT_THUNK, + GxB_LE_THUNK ; //============================================================================== // GrB_IndexUnaryOp: a unary operator that depends on the row/col indices @@ -1497,45 +1233,9 @@ typedef void (*GxB_index_unary_function) const void *y // input scalar y ) ; -#ifndef GB_CUDA_FOLDER - -// GrB_IndexUnaryOp_new creates a user-defined unary op (no name or defn) - -GrB_Info GrB_IndexUnaryOp_new // create a new user-defined IndexUnary op -( - GrB_IndexUnaryOp *op, // handle for the new IndexUnary operator - GxB_index_unary_function function, // pointer to IndexUnary function - GrB_Type ztype, // type of output z - GrB_Type xtype, // type of input x (the A(i,j) entry) - GrB_Type ytype // type of input y (the scalar) -) ; - -GrB_Info GxB_IndexUnaryOp_new // create a named user-created IndexUnaryOp -( - GrB_IndexUnaryOp *op, // handle for the new IndexUnary operator - GxB_index_unary_function function, // pointer to index_unary function - GrB_Type ztype, // type of output z - GrB_Type xtype, // type of input x (the A(i,j) entry) - GrB_Type ytype, // type of input y (the scalar) - const char *idxop_name, // name of the user function - const char *idxop_defn // definition of the user function -) ; - -// historical; use GrB_get instead: -GrB_Info GxB_IndexUnaryOp_ztype_name (char *, const GrB_IndexUnaryOp op) ; -GrB_Info GxB_IndexUnaryOp_xtype_name (char *, const GrB_IndexUnaryOp op) ; -GrB_Info GxB_IndexUnaryOp_ytype_name (char *, const GrB_IndexUnaryOp op) ; - -GrB_Info GrB_IndexUnaryOp_free // free a user-created IndexUnaryOp -( - GrB_IndexUnaryOp *op // handle of IndexUnary to free -) ; - -#endif // GB_CUDA_FOLDER - -//------------------------------------------------------------------------------ -// built-in IndexUnaryOps -//------------------------------------------------------------------------------ +//============================================================================== +// GrB_IndexUnaryOp: a unary operator that depends on the row/col indices +//============================================================================== // To facilitate computations with negative integers, the indices i and j are // of type int64_t. The scalar y has the type corresponding to the suffix @@ -1627,5681 +1327,6152 @@ GB_GLOBAL GrB_IndexUnaryOp typedef struct GB_Monoid_opaque *GrB_Monoid ; -#ifndef GB_CUDA_FOLDER - -GrB_Info GrB_Monoid_new_BOOL // create a new boolean monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - bool identity // identity value of the monoid -) ; +//============================================================================== +// GrB_Semiring +//============================================================================== -GrB_Info GrB_Monoid_new_INT8 // create a new int8 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - int8_t identity // identity value of the monoid -) ; +typedef struct GB_Semiring_opaque *GrB_Semiring ; -GrB_Info GrB_Monoid_new_UINT8 // create a new uint8 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - uint8_t identity // identity value of the monoid -) ; +//============================================================================== +// GrB_Scalar: a GraphBLAS scalar +//============================================================================== -GrB_Info GrB_Monoid_new_INT16 // create a new int16 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - int16_t identity // identity value of the monoid -) ; +typedef struct GB_Scalar_opaque *GxB_Scalar ; // historical: use GrB_Scalar +typedef struct GB_Scalar_opaque *GrB_Scalar ; // use this instead -GrB_Info GrB_Monoid_new_UINT16 // create a new uint16 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - uint16_t identity // identity value of the monoid -) ; +//============================================================================== +// GrB_Vector: a GraphBLAS vector +//============================================================================== -GrB_Info GrB_Monoid_new_INT32 // create a new int32 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - int32_t identity // identity value of the monoid -) ; +typedef struct GB_Vector_opaque *GrB_Vector ; -GrB_Info GrB_Monoid_new_UINT32 // create a new uint32 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - uint32_t identity // identity value of the monoid -) ; +//============================================================================== +// GrB_Matrix: a GraphBLAS matrix +//============================================================================== -GrB_Info GrB_Monoid_new_INT64 // create a new int64 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - int64_t identity // identity value of the monoid -) ; +typedef struct GB_Matrix_opaque *GrB_Matrix ; -GrB_Info GrB_Monoid_new_UINT64 // create a new uint64 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - uint64_t identity // identity value of the monoid -) ; +//============================================================================== +// SuiteSparse:GraphBLAS options +//============================================================================== -GrB_Info GrB_Monoid_new_FP32 // create a new float monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - float identity // identity value of the monoid -) ; +// The following options modify how SuiteSparse:GraphBLAS stores and operates +// on its matrices. The GrB_get/set methods allow the user to suggest how the +// internal representation of a matrix, or all matrices, should be held. These +// options have no effect on the result (except for minor roundoff differences +// for floating-point types). They only affect the time and memory usage of the +// computations. -GrB_Info GrB_Monoid_new_FP64 // create a new double monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - double identity // identity value of the monoid -) ; +typedef enum // for global options or matrix options +{ -GrB_Info GxB_Monoid_new_FC32 // create a new float complex monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - GxB_FC32_t identity // identity value of the monoid -) ; + //------------------------------------------------------------ + // GrB_get / GrB_set for GrB_Matrix and GrB_GLOBAL: + //------------------------------------------------------------ -GrB_Info GxB_Monoid_new_FC64 // create a new double complex monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - GxB_FC64_t identity // identity value of the monoid -) ; + GxB_HYPER_SWITCH = 7000, // switch to hypersparse (double value) + GxB_HYPER_HASH = 7048, // hyper_hash control (int64 value) + GxB_BITMAP_SWITCH = 7001, // switch to bitmap (double value) + GxB_FORMAT = 7002, // historical; use GrB_STORAGE_ORIENTATION_HINT -GrB_Info GrB_Monoid_new_UDT // create a monoid with a user-defined type -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - void *identity // identity value of the monoid -) ; + //------------------------------------------------------------ + // GrB_get for GrB_GLOBAL: + //------------------------------------------------------------ -// Type-generic method for creating a new monoid: + GxB_MODE = 7003, // historical; use GrB_BLOCKING_MODE + GxB_LIBRARY_NAME = 7004, // historical; use GrB_NAME + GxB_LIBRARY_VERSION = 7005, // historical; use GrB_LIBRARY_VER_* + GxB_LIBRARY_DATE = 7006, // date of the library (char *) + GxB_LIBRARY_ABOUT = 7007, // about the library (char *) + GxB_LIBRARY_URL = 7008, // URL for the library (char *) + GxB_LIBRARY_LICENSE = 7009, // license of the library (char *) + GxB_LIBRARY_COMPILE_DATE = 7010, // date library was compiled (char *) + GxB_LIBRARY_COMPILE_TIME = 7011, // time library was compiled (char *) + GxB_API_VERSION = 7012, // historical; use GrB_API_VER_* + GxB_API_DATE = 7013, // date of the API (char *) + GxB_API_ABOUT = 7014, // about the API (char *) + GxB_API_URL = 7015, // URL for the API (char *) + GxB_COMPILER_VERSION = 7016, // compiler version (3 int's) + GxB_COMPILER_NAME = 7017, // compiler name (char *) + GxB_LIBRARY_OPENMP = 7018, // library compiled with OpenMP + GxB_MALLOC_FUNCTION = 7037, // malloc function pointer + GxB_CALLOC_FUNCTION = 7038, // calloc function pointer + GxB_REALLOC_FUNCTION = 7039, // realloc function pointer + GxB_FREE_FUNCTION = 7040, // free function pointer -/* -GrB_Info GrB_Monoid_new // create a monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - identity // identity value of the monoid -) ; -*/ + //------------------------------------------------------------ + // GrB_get / GrB_set for GrB_GLOBAL: + //------------------------------------------------------------ -#if GxB_STDC_VERSION >= 201112L -#define GrB_Monoid_new(monoid,op,identity) \ - _Generic \ - ( \ - (identity), \ - GB_CASES (GrB, Monoid_new) \ - ) \ - (monoid, op, identity) -#endif + GxB_GLOBAL_NTHREADS = GxB_NTHREADS, // max number of threads to use + GxB_GLOBAL_CHUNK = GxB_CHUNK, // chunk size for small problems. + GxB_GLOBAL_GPU_ID = GxB_GPU_ID, // which GPU to use (DRAFT) -// GxB_Monoid_terminal_new is identical to GrB_Monoid_new, except that a -// terminal value can be specified. The terminal may be NULL, which indicates -// no terminal value (and in this case, it is identical to GrB_Monoid_new). -// The terminal value, if not NULL, must have the same type as the identity. + GxB_BURBLE = 7019, // diagnostic output + GxB_PRINTF = 7020, // printf function diagnostic output + GxB_FLUSH = 7021, // flush function diagnostic output + GxB_MEMORY_POOL = 7022, // no longer used + GxB_PRINT_1BASED = 7023, // print matrices as 0-based or 1-based -GrB_Info GxB_Monoid_terminal_new_BOOL // create a new boolean monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - bool identity, // identity value of the monoid - bool terminal // terminal value of the monoid -) ; - -GrB_Info GxB_Monoid_terminal_new_INT8 // create a new int8 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - int8_t identity, // identity value of the monoid - int8_t terminal // terminal value of the monoid -) ; - -GrB_Info GxB_Monoid_terminal_new_UINT8 // create a new uint8 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - uint8_t identity, // identity value of the monoid - uint8_t terminal // terminal value of the monoid -) ; + GxB_JIT_C_COMPILER_NAME = 7024, // CPU JIT C compiler name + GxB_JIT_C_COMPILER_FLAGS = 7025, // CPU JIT C compiler flags + GxB_JIT_C_LINKER_FLAGS = 7026, // CPU JIT C linker flags + GxB_JIT_C_LIBRARIES = 7027, // CPU JIT C libraries + GxB_JIT_C_PREFACE = 7028, // CPU JIT C preface + GxB_JIT_C_CONTROL = 7029, // CPU JIT C control + GxB_JIT_CACHE_PATH = 7030, // CPU/CUDA JIT path for compiled kernels + GxB_JIT_C_CMAKE_LIBS = 7031, // CPU JIT C libraries when using cmake + GxB_JIT_USE_CMAKE = 7032, // CPU JIT: use cmake or direct compile + GxB_JIT_ERROR_LOG = 7033, // CPU JIT: error log file -GrB_Info GxB_Monoid_terminal_new_INT16 // create a new int16 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - int16_t identity, // identity value of the monoid - int16_t terminal // terminal value of the monoid -) ; + GxB_JIT_CUDA_PREFACE = 7100, // CUDA JIT C++ preface -GrB_Info GxB_Monoid_terminal_new_UINT16 // create a new uint16 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - uint16_t identity, // identity value of the monoid - uint16_t terminal // terminal value of the monoid -) ; + //------------------------------------------------------------ + // GrB_get for GrB_Matrix: + //------------------------------------------------------------ -GrB_Info GxB_Monoid_terminal_new_INT32 // create a new int32 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - int32_t identity, // identity value of the monoid - int32_t terminal // terminal value of the monoid -) ; + GxB_SPARSITY_STATUS = 7034, // hyper, sparse, bitmap or full (1,2,4,8) + GxB_IS_HYPER = 7035, // historical; use GxB_SPARSITY_STATUS -GrB_Info GxB_Monoid_terminal_new_UINT32 // create a new uint32 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - uint32_t identity, // identity value of the monoid - uint32_t terminal // terminal value of the monoid -) ; + //------------------------------------------------------------ + // GrB_get/GrB_set for GrB_Matrix: + //------------------------------------------------------------ -GrB_Info GxB_Monoid_terminal_new_INT64 // create a new int64 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - int64_t identity, // identity value of the monoid - int64_t terminal // terminal value of the monoid -) ; + GxB_SPARSITY_CONTROL = 7036, // sparsity control: 0 to 15; see below -GrB_Info GxB_Monoid_terminal_new_UINT64 // create a new uint64 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - uint64_t identity, // identity value of the monoid - uint64_t terminal // terminal value of the monoid -) ; +} GxB_Option_Field ; -GrB_Info GxB_Monoid_terminal_new_FP32 // create a new float monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - float identity, // identity value of the monoid - float terminal // terminal value of the monoid -) ; +// for GxB_JIT_C_CONTROL: +typedef enum +{ + GxB_JIT_OFF = 0, // do not use the JIT: free all JIT kernels if loaded + GxB_JIT_PAUSE = 1, // do not run JIT kernels but keep any loaded + GxB_JIT_RUN = 2, // run JIT kernels if already loaded; no load/compile + GxB_JIT_LOAD = 3, // able to load and run JIT kernels; may not compile + GxB_JIT_ON = 4, // full JIT: able to compile, load, and run +} +GxB_JIT_Control ; -GrB_Info GxB_Monoid_terminal_new_FP64 // create a new double monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - double identity, // identity value of the monoid - double terminal // terminal value of the monoid -) ; +// GxB_FORMAT is historical, but it can be by row or by column: +typedef enum +{ + GxB_BY_ROW = 0, // CSR: compressed sparse row format + GxB_BY_COL = 1, // CSC: compressed sparse column format + GxB_NO_FORMAT = -1 // format not defined +} +GxB_Format_Value ; -GrB_Info GxB_Monoid_terminal_new_FC32 // create a new float complex monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - GxB_FC32_t identity, // identity value of the monoid - GxB_FC32_t terminal // terminal value of the monoid -) ; +// The default format is by row. These constants are defined as GB_GLOBAL +// const, so that if SuiteSparse:GraphBLAS is recompiled with a different +// default format, and the application is relinked but not recompiled, it will +// acquire the new default values. +GB_GLOBAL const GxB_Format_Value GxB_FORMAT_DEFAULT ; -GrB_Info GxB_Monoid_terminal_new_FC64 // create a new double complex monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - GxB_FC64_t identity, // identity value of the monoid - GxB_FC64_t terminal // terminal value of the monoid -) ; +// the default hyper_switch parameter +GB_GLOBAL const double GxB_HYPER_DEFAULT ; -GrB_Info GxB_Monoid_terminal_new_UDT // create a monoid with a user type -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - void *identity, // identity value of the monoid - void *terminal // terminal value of the monoid -) ; +// GxB_SPARSITY_CONTROL can be any sum or bitwise OR of these 4 values: +#define GxB_HYPERSPARSE 1 // store matrix in hypersparse form +#define GxB_SPARSE 2 // store matrix as sparse form (compressed vector) +#define GxB_BITMAP 4 // store matrix as a bitmap +#define GxB_FULL 8 // store matrix as full; all entries must be present -// Type-generic method for creating a new monoid with a terminal value: +// size of b array for GxB_set/get (GxB_BITMAP_SWITCH, b) +#define GxB_NBITMAP_SWITCH 8 // size of bitmap_switch parameter array -/* -GrB_Info GxB_Monoid_terminal_new // create a monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - identity, // identity value of the monoid - terminal // terminal value of the monoid -) ; -*/ +// any sparsity value: +#define GxB_ANY_SPARSITY (GxB_HYPERSPARSE + GxB_SPARSE + GxB_BITMAP + GxB_FULL) -#if GxB_STDC_VERSION >= 201112L -#define GxB_Monoid_terminal_new(monoid,op,identity,terminal) \ - _Generic \ - ( \ - (identity), \ - GB_CASES (GxB, Monoid_terminal_new) \ - ) \ - (monoid, op, identity, terminal) -#endif +// the default sparsity control is any format: +#define GxB_AUTO_SPARSITY GxB_ANY_SPARSITY -// historical; use GrB_get instead: -GrB_Info GxB_Monoid_operator (GrB_BinaryOp *op, GrB_Monoid monoid) ; -GrB_Info GxB_Monoid_identity (void *identity, GrB_Monoid monoid) ; -GrB_Info GxB_Monoid_terminal (bool *, void *terminal, GrB_Monoid monoid) ; +// GrB_set (A, scontrol, GxB_SPARSITY_CONTROL) provides hints +// about which data structure GraphBLAS should use for the matrix A: +// +// GxB_AUTO_SPARSITY: GraphBLAS selects automatically. +// GxB_HYPERSPARSE: always hypersparse, taking O(nvals(A)) space. +// GxB_SPARSE: always in a sparse struture: compressed-sparse row/column, +// taking O(nrows+nvals(A)) space if stored by row, or +// O(ncols+nvals(A)) if stored by column. +// GxB_BITMAP: always in a bitmap struture, taking O(nrows*ncols) space. +// GxB_FULL: always in a full structure, taking O(nrows*ncols) space, +// unless not all entries are present, in which case the bitmap +// storage is used. +// +// These options can be summed. For example, to allow a matrix to be sparse +// or hypersparse, but not bitmap or full, use GxB_SPARSE + GxB_HYPERSPARSE. +// Since GxB_FULL can only be used when all entries are present, matrices with +// the just GxB_FULL control setting are stored in bitmap form if any entries +// are not present. +// +// Only the least 4 bits of the sparsity control are considered, so the +// formats can be bitwise negated. For example, to allow for any format +// except full, use ~GxB_FULL. +// +// GrB_get (A, &sparsity, GxB_SPARSITY_STATUS) returns the +// current data structure currently used for the matrix A (either hypersparse, +// sparse, bitmap, or full). +// +// GrB_get (A, &scontrol, GxB_SPARSITY_CONTROL) returns the hint +// for how A should be stored (hypersparse, sparse, bitmap, or full, or any +// combination). -GrB_Info GrB_Monoid_free // free a user-created monoid -( - GrB_Monoid *monoid // handle of monoid to free -) ; +// GxB_HYPER_SWITCH: +// If the matrix or vector structure can be sparse or hypersparse, the +// GxB_HYPER_SWITCH parameter controls when each of these structures are +// used. The parameter is not used if the matrix or vector is full or +// bitmap. +// +// Let k be the actual number of non-empty vectors (with at least one +// entry). This value k is not dependent on whether or not the matrix is +// stored in hypersparse structure. Let n be the number of vectors (the # +// of columns if CSC, or rows if CSR). Let h be the value of the +// GxB_HYPER_SWITCH setting of the matrix. +// +// If a matrix is currently hypersparse, it can be converted to +// non-hypersparse if (n <= 1 || k > 2*n*h). Otherwise it stays +// hypersparse. If (n <= 1) the matrix is always stored as +// non-hypersparse. +// +// If currently non-hypersparse, it can be converted to hypersparse if (n +// > 1 && k <= n*h). Otherwise, it stays non-hypersparse. If (n <= 1) +// the matrix always remains non-hypersparse. +// +// Setting GxB_HYPER_SWITCH to GxB_ALWAYS_HYPER or GxB_NEVER_HYPER ensures +// a matrix always stays hypersparse, or always stays non-hypersparse, +// respectively. -#endif // GB_CUDA_FOLDER +GB_GLOBAL const double GxB_ALWAYS_HYPER, GxB_NEVER_HYPER ; //============================================================================== -// GrB_Semiring +// GxB_Context: for managing computational resources //============================================================================== -typedef struct GB_Semiring_opaque *GrB_Semiring ; - -#ifndef GB_CUDA_FOLDER +typedef struct GB_Context_opaque *GxB_Context ; -GrB_Info GrB_Semiring_new // create a semiring -( - GrB_Semiring *semiring, // handle of semiring to create - GrB_Monoid add, // add monoid of the semiring - GrB_BinaryOp multiply // multiply operator of the semiring -) ; +// GxB_CONTEXT_WORLD is the default Context for all user threads. +GB_GLOBAL GxB_Context GxB_CONTEXT_WORLD ; -// historical; use GrB_get instead: -GrB_Info GxB_Semiring_add (GrB_Monoid *add, GrB_Semiring semiring) ; -GrB_Info GxB_Semiring_multiply (GrB_BinaryOp *multiply, GrB_Semiring semiring) ; +typedef enum +{ + GxB_CONTEXT_NTHREADS = GxB_NTHREADS, // max number of threads to use. + // If <= 0, then one thread is used. -GrB_Info GrB_Semiring_free // free a user-created semiring -( - GrB_Semiring *semiring // handle of semiring to free -) ; + GxB_CONTEXT_CHUNK = GxB_CHUNK, // chunk size for small problems. + // If < 1, then the default is used. -#endif // GB_CUDA_FOLDER + // GPU control (DRAFT: in progress, do not use) + GxB_CONTEXT_GPU_ID = GxB_GPU_ID, +} +GxB_Context_Field ; //============================================================================== -// GrB_Scalar: a GraphBLAS scalar +// GrB_set and GrB_get //============================================================================== -typedef struct GB_Scalar_opaque *GxB_Scalar ; // historical: use GrB_Scalar -typedef struct GB_Scalar_opaque *GrB_Scalar ; // use this instead - -#ifndef GB_CUDA_FOLDER +typedef struct GB_Global_opaque *GrB_Global ; +GB_GLOBAL const GrB_Global GrB_GLOBAL ; -// These methods create, free, copy, and clear a GrB_Scalar. The nvals, -// and type methods return basic information about a GrB_Scalar. +typedef enum +{ -GrB_Info GrB_Scalar_new // create a new GrB_Scalar with no entry -( - GrB_Scalar *s, // handle of GrB_Scalar to create - GrB_Type type // type of GrB_Scalar to create -) ; + //-------------------------------------------------------------------------- + // GrB enums in the C API + //-------------------------------------------------------------------------- -GrB_Info GrB_Scalar_dup // make an exact copy of a GrB_Scalar -( - GrB_Scalar *s, // handle of output GrB_Scalar to create - const GrB_Scalar t // input GrB_Scalar to copy -) ; + // GrB_Descriptor only: + GrB_OUTP_FIELD = 0, // descriptor for output of a method + GrB_MASK_FIELD = 1, // descriptor for the mask input of a method + GrB_INP0_FIELD = 2, // descriptor for the first input of a method + GrB_INP1_FIELD = 3, // descriptor for the second input of a method -GrB_Info GrB_Scalar_clear // clear a GrB_Scalar of its entry -( // type remains unchanged. - GrB_Scalar s // GrB_Scalar to clear -) ; + // all objects, including GrB_GLOBAL: + GrB_NAME = 10, // name of the object, as a string -GrB_Info GrB_Scalar_nvals // get the number of entries in a GrB_Scalar -( - GrB_Index *nvals, // GrB_Scalar has nvals entries (0 or 1) - const GrB_Scalar s // GrB_Scalar to query -) ; + // GrB_GLOBAL only: + GrB_LIBRARY_VER_MAJOR = 11, // SuiteSparse:GraphBLAS version + GrB_LIBRARY_VER_MINOR = 12, + GrB_LIBRARY_VER_PATCH = 13, + GrB_API_VER_MAJOR = 14, // C API version + GrB_API_VER_MINOR = 15, + GrB_API_VER_PATCH = 16, + GrB_BLOCKING_MODE = 17, // GrB_Mode -// historical; use GrB_get instead: -GrB_Info GxB_Scalar_type (GrB_Type *type, const GrB_Scalar s) ; -GrB_Info GxB_Scalar_type_name (char *type_name, const GrB_Scalar s) ; + // GrB_GLOBAL, GrB_Matrix, GrB_Vector, GrB_Scalar: + GrB_STORAGE_ORIENTATION_HINT = 100, // GrB_Orientation -GrB_Info GxB_Scalar_memoryUsage // return # of bytes used for a scalar -( - size_t *size, // # of bytes used by the scalar s - const GrB_Scalar s // GrB_Scalar to query -) ; + // GrB_Matrix, GrB_Vector, GrB_Scalar (and void * serialize): + GrB_EL_TYPE_CODE = 102, // a GrB_Type_code (see below) + GrB_EL_TYPE_STRING = 106, // name of the type -GrB_Info GrB_Scalar_free // free a GrB_Scalar -( - GrB_Scalar *s // handle of GrB_Scalar to free -) ; + // GrB_*Op, GrB_Monoid, and GrB_Semiring: + GrB_INP0_TYPE_CODE = 103, // GrB_Type_code + GrB_INP1_TYPE_CODE = 104, + GrB_OUTP_TYPE_CODE = 105, + GrB_INP0_TYPE_STRING = 107, // name of the type, as a string + GrB_INP1_TYPE_STRING = 108, + GrB_OUTP_TYPE_STRING = 109, -// historical names identical to GrB_Scalar_methods above: -GrB_Info GxB_Scalar_new (GrB_Scalar *s, GrB_Type type) ; -GrB_Info GxB_Scalar_dup (GrB_Scalar *s, const GrB_Scalar t) ; -GrB_Info GxB_Scalar_clear (GrB_Scalar s) ; -GrB_Info GxB_Scalar_nvals (GrB_Index *nvals, const GrB_Scalar s) ; -GrB_Info GxB_Scalar_free (GrB_Scalar *s) ; + // GrB_Type (readable only): + GrB_SIZE = 110, // size of the type -//------------------------------------------------------------------------------ -// GrB_Scalar_setElement -//------------------------------------------------------------------------------ + //-------------------------------------------------------------------------- + // SuiteSparse extensions: + //-------------------------------------------------------------------------- -// Set a single GrB_Scalar s, from a user scalar x: s = x, typecasting from the -// type of x to the type of w as needed. + // GrB_Type, GrB_UnaryOp, GrB_BinaryOp, and GrB_IndexUnaryOp: + GxB_JIT_C_NAME = 7041, // C type or function name + GxB_JIT_C_DEFINITION = 7042, // C typedef or function definition -GrB_Info GrB_Scalar_setElement_BOOL // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - bool x // user scalar to assign to s -) ; + // GrB_Monoid and GrB_Semiring: + GxB_MONOID_IDENTITY = 7043, // monoid identity value + GxB_MONOID_TERMINAL = 7044, // monoid terminal value + GxB_MONOID_OPERATOR = 7045, // monoid binary operator -GrB_Info GrB_Scalar_setElement_INT8 // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - int8_t x // user scalar to assign to s -) ; + // GrB_Semiring only: + GxB_SEMIRING_MONOID = 7046, // semiring monoid + GxB_SEMIRING_MULTIPLY = 7047, // semiring multiplicative op +} +GrB_Field ; -GrB_Info GrB_Scalar_setElement_UINT8 // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - uint8_t x // user scalar to assign to s -) ; +typedef enum +{ + GrB_ROWMAJOR = 0, + GrB_COLMAJOR = 1, + GrB_BOTH = 2, + GrB_UNKNOWN = 3, +} +GrB_Orientation ; -GrB_Info GrB_Scalar_setElement_INT16 // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - int16_t x // user scalar to assign to s -) ; +typedef enum +{ + GrB_UDT_CODE = 0, // user-defined type + GrB_BOOL_CODE = 1, // GraphBLAS: GrB_BOOL C: bool + GrB_INT8_CODE = 2, // GraphBLAS: GrB_INT8 C: int8_t + GrB_UINT8_CODE = 3, // GraphBLAS: GrB_UINT8 C: uint8_t + GrB_INT16_CODE = 4, // GraphBLAS: GrB_INT16 C: int16_t + GrB_UINT16_CODE = 5, // GraphBLAS: GrB_UINT16 C: uint16_t + GrB_INT32_CODE = 6, // GraphBLAS: GrB_INT32 C: int32_t + GrB_UINT32_CODE = 7, // GraphBLAS: GrB_UINT32 C: uint32_t + GrB_INT64_CODE = 8, // GraphBLAS: GrB_INT64 C: int64_t + GrB_UINT64_CODE = 9, // GraphBLAS: GrB_UINT64 C: uint64_t + GrB_FP32_CODE = 10, // GraphBLAS: GrB_FP32 C: float + GrB_FP64_CODE = 11, // GraphBLAS: GrB_FP64 C: double + GxB_FC32_CODE = 7070, // GraphBLAS: GxB_FC32 C: float complex + GxB_FC64_CODE = 7071, // GraphBLAS: GxB_FC64 C: double complex +} +GrB_Type_Code ; -GrB_Info GrB_Scalar_setElement_UINT16 // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - uint16_t x // user scalar to assign to s -) ; +//============================================================================== +// GrB_wait: finish computations +//============================================================================== -GrB_Info GrB_Scalar_setElement_INT32 // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - int32_t x // user scalar to assign to s -) ; +typedef enum +{ + GrB_COMPLETE = 0, // establishes a happens-before relation + GrB_MATERIALIZE = 1 // object is complete +} +GrB_WaitMode ; -GrB_Info GrB_Scalar_setElement_UINT32 // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - uint32_t x // user scalar to assign to s -) ; +//============================================================================== +// GrB_extract: extract a submatrix or subvector +//============================================================================== -GrB_Info GrB_Scalar_setElement_INT64 // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - int64_t x // user scalar to assign to s -) ; +GB_GLOBAL const uint64_t *GrB_ALL ; -GrB_Info GrB_Scalar_setElement_UINT64 // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - uint64_t x // user scalar to assign to s -) ; +// These special values of ni and nj can be used for GrB_assign, +// GrB_extract, and GxB_subassign. +#define GxB_RANGE (INT64_MAX) +#define GxB_STRIDE (INT64_MAX-1) +#define GxB_BACKWARDS (INT64_MAX-2) -GrB_Info GrB_Scalar_setElement_FP32 // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - float x // user scalar to assign to s -) ; +// for the strided range begin:inc:end, I [GxB_BEGIN] is the value of begin, I +// [GxB_END] is the value end, I [GxB_INC] is the magnitude of the stride. If +// the stride is negative, use ni = GxB_BACKWARDS. +#define GxB_BEGIN (0) +#define GxB_END (1) +#define GxB_INC (2) -GrB_Info GrB_Scalar_setElement_FP64 // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - double x // user scalar to assign to s -) ; +//============================================================================== +// GrB_Monoid: built-in monoids +//============================================================================== -GrB_Info GxB_Scalar_setElement_FC32 // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - GxB_FC32_t x // user scalar to assign to s -) ; +GB_GLOBAL GrB_Monoid -GrB_Info GxB_Scalar_setElement_FC64 // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - GxB_FC64_t x // user scalar to assign to s -) ; + //-------------------------------------------------------------------------- + // 10 MIN monoids: (not for complex types) + //-------------------------------------------------------------------------- -GrB_Info GrB_Scalar_setElement_UDT // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - void *x // user scalar to assign to s -) ; + // GxB_MIN monoids, historical, use GrB_MIN_MONOID_* instead: + GxB_MIN_INT8_MONOID, // identity: INT8_MAX terminal: INT8_MIN + GxB_MIN_INT16_MONOID, // identity: INT16_MAX terminal: INT16_MIN + GxB_MIN_INT32_MONOID, // identity: INT32_MAX terminal: INT32_MIN + GxB_MIN_INT64_MONOID, // identity: INT64_MAX terminal: INT32_MIN + GxB_MIN_UINT8_MONOID, // identity: UINT8_MAX terminal: 0 + GxB_MIN_UINT16_MONOID, // identity: UINT16_MAX terminal: 0 + GxB_MIN_UINT32_MONOID, // identity: UINT32_MAX terminal: 0 + GxB_MIN_UINT64_MONOID, // identity: UINT64_MAX terminal: 0 + GxB_MIN_FP32_MONOID, // identity: INFINITY terminal: -INFINITY + GxB_MIN_FP64_MONOID, // identity: INFINITY terminal: -INFINITY -// historical names identical to GrB_Scalar_methods above: -GrB_Info GxB_Scalar_setElement_BOOL (GrB_Scalar s, bool x) ; -GrB_Info GxB_Scalar_setElement_INT8 (GrB_Scalar s, int8_t x) ; -GrB_Info GxB_Scalar_setElement_INT16 (GrB_Scalar s, int16_t x) ; -GrB_Info GxB_Scalar_setElement_INT32 (GrB_Scalar s, int32_t x) ; -GrB_Info GxB_Scalar_setElement_INT64 (GrB_Scalar s, int64_t x) ; -GrB_Info GxB_Scalar_setElement_UINT8 (GrB_Scalar s, uint8_t x) ; -GrB_Info GxB_Scalar_setElement_UINT16 (GrB_Scalar s, uint16_t x) ; -GrB_Info GxB_Scalar_setElement_UINT32 (GrB_Scalar s, uint32_t x) ; -GrB_Info GxB_Scalar_setElement_UINT64 (GrB_Scalar s, uint64_t x) ; -GrB_Info GxB_Scalar_setElement_FP32 (GrB_Scalar s, float x) ; -GrB_Info GxB_Scalar_setElement_FP64 (GrB_Scalar s, double x) ; -GrB_Info GxB_Scalar_setElement_UDT (GrB_Scalar s, void *x) ; + // preferred names from the v1.3 spec: + GrB_MIN_MONOID_INT8, // identity: INT8_MAX terminal: INT8_MIN + GrB_MIN_MONOID_INT16, // identity: INT16_MAX terminal: INT16_MIN + GrB_MIN_MONOID_INT32, // identity: INT32_MAX terminal: INT32_MIN + GrB_MIN_MONOID_INT64, // identity: INT64_MAX terminal: INT32_MIN + GrB_MIN_MONOID_UINT8, // identity: UINT8_MAX terminal: 0 + GrB_MIN_MONOID_UINT16, // identity: UINT16_MAX terminal: 0 + GrB_MIN_MONOID_UINT32, // identity: UINT32_MAX terminal: 0 + GrB_MIN_MONOID_UINT64, // identity: UINT64_MAX terminal: 0 + GrB_MIN_MONOID_FP32, // identity: INFINITY terminal: -INFINITY + GrB_MIN_MONOID_FP64, // identity: INFINITY terminal: -INFINITY -// Type-generic version: x can be any supported C type or void * for a -// user-defined type. + //-------------------------------------------------------------------------- + // 10 MAX monoids: + //-------------------------------------------------------------------------- -/* -GrB_Info GrB_Scalar_setElement // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - x // user scalar to assign to s -) ; -*/ + // GxB_MAX monoids, historical, use GrB_MAX_MONOID_* instead: + GxB_MAX_INT8_MONOID, // identity: INT8_MIN terminal: INT8_MAX + GxB_MAX_INT16_MONOID, // identity: INT16_MIN terminal: INT16_MAX + GxB_MAX_INT32_MONOID, // identity: INT32_MIN terminal: INT32_MAX + GxB_MAX_INT64_MONOID, // identity: INT64_MIN terminal: INT64_MAX + GxB_MAX_UINT8_MONOID, // identity: 0 terminal: UINT8_MAX + GxB_MAX_UINT16_MONOID, // identity: 0 terminal: UINT16_MAX + GxB_MAX_UINT32_MONOID, // identity: 0 terminal: UINT32_MAX + GxB_MAX_UINT64_MONOID, // identity: 0 terminal: UINT64_MAX + GxB_MAX_FP32_MONOID, // identity: -INFINITY terminal: INFINITY + GxB_MAX_FP64_MONOID, // identity: -INFINITY terminal: INFINITY -#if GxB_STDC_VERSION >= 201112L -#define GrB_Scalar_setElement(s,x) \ - _Generic \ - ( \ - (x), \ - GB_CASES (GrB, Scalar_setElement) \ - ) \ - (s, x) + // preferred names from the v1.3 spec: + GrB_MAX_MONOID_INT8, // identity: INT8_MIN terminal: INT8_MAX + GrB_MAX_MONOID_INT16, // identity: INT16_MIN terminal: INT16_MAX + GrB_MAX_MONOID_INT32, // identity: INT32_MIN terminal: INT32_MAX + GrB_MAX_MONOID_INT64, // identity: INT64_MIN terminal: INT64_MAX + GrB_MAX_MONOID_UINT8, // identity: 0 terminal: UINT8_MAX + GrB_MAX_MONOID_UINT16, // identity: 0 terminal: UINT16_MAX + GrB_MAX_MONOID_UINT32, // identity: 0 terminal: UINT32_MAX + GrB_MAX_MONOID_UINT64, // identity: 0 terminal: UINT64_MAX + GrB_MAX_MONOID_FP32, // identity: -INFINITY terminal: INFINITY + GrB_MAX_MONOID_FP64, // identity: -INFINITY terminal: INFINITY -// historical; use GrB_Scalar_setElement instead: -#define GxB_Scalar_setElement(s,x) GrB_Scalar_setElement (s, x) -#endif + //-------------------------------------------------------------------------- + // 12 PLUS monoids: + //-------------------------------------------------------------------------- -//------------------------------------------------------------------------------ -// GrB_Scalar_extractElement -//------------------------------------------------------------------------------ + // GxB_PLUS monoids, historical, use GrB_PLUS_MONOID_* instead: + GxB_PLUS_INT8_MONOID, // identity: 0 + GxB_PLUS_INT16_MONOID, // identity: 0 + GxB_PLUS_INT32_MONOID, // identity: 0 + GxB_PLUS_INT64_MONOID, // identity: 0 + GxB_PLUS_UINT8_MONOID, // identity: 0 + GxB_PLUS_UINT16_MONOID, // identity: 0 + GxB_PLUS_UINT32_MONOID, // identity: 0 + GxB_PLUS_UINT64_MONOID, // identity: 0 + GxB_PLUS_FP32_MONOID, // identity: 0 + GxB_PLUS_FP64_MONOID, // identity: 0 -// Extract a single entry from a GrB_Scalar, x = s, typecasting from the type -// of s to the type of x as needed. + // preferred names from the v1.3 spec: + GrB_PLUS_MONOID_INT8, // identity: 0 + GrB_PLUS_MONOID_INT16, // identity: 0 + GrB_PLUS_MONOID_INT32, // identity: 0 + GrB_PLUS_MONOID_INT64, // identity: 0 + GrB_PLUS_MONOID_UINT8, // identity: 0 + GrB_PLUS_MONOID_UINT16, // identity: 0 + GrB_PLUS_MONOID_UINT32, // identity: 0 + GrB_PLUS_MONOID_UINT64, // identity: 0 + GrB_PLUS_MONOID_FP32, // identity: 0 + GrB_PLUS_MONOID_FP64, // identity: 0 -GrB_Info GrB_Scalar_extractElement_BOOL // x = s -( - bool *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + // complex monoids: + GxB_PLUS_FC32_MONOID, // identity: 0 + GxB_PLUS_FC64_MONOID, // identity: 0 -GrB_Info GrB_Scalar_extractElement_INT8 // x = s -( - int8_t *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + //-------------------------------------------------------------------------- + // 12 TIMES monoids: identity value is 1, int* and uint* are terminal + //-------------------------------------------------------------------------- -GrB_Info GrB_Scalar_extractElement_UINT8 // x = s -( - uint8_t *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + // GxB_TIMES monoids, historical, use GrB_TIMES_MONOID_* instead: + GxB_TIMES_INT8_MONOID, // identity: 1 terminal: 0 + GxB_TIMES_INT16_MONOID, // identity: 1 terminal: 0 + GxB_TIMES_INT32_MONOID, // identity: 1 terminal: 0 + GxB_TIMES_INT64_MONOID, // identity: 1 terminal: 0 + GxB_TIMES_UINT8_MONOID, // identity: 1 terminal: 0 + GxB_TIMES_UINT16_MONOID, // identity: 1 terminal: 0 + GxB_TIMES_UINT32_MONOID, // identity: 1 terminal: 0 + GxB_TIMES_UINT64_MONOID, // identity: 1 terminal: 0 + GxB_TIMES_FP32_MONOID, // identity: 1 + GxB_TIMES_FP64_MONOID, // identity: 1 -GrB_Info GrB_Scalar_extractElement_INT16 // x = s -( - int16_t *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + // preferred names from the v1.3 spec: + GrB_TIMES_MONOID_INT8, // identity: 1 terminal: 0 + GrB_TIMES_MONOID_INT16, // identity: 1 terminal: 0 + GrB_TIMES_MONOID_INT32, // identity: 1 terminal: 0 + GrB_TIMES_MONOID_INT64, // identity: 1 terminal: 0 + GrB_TIMES_MONOID_UINT8, // identity: 1 terminal: 0 + GrB_TIMES_MONOID_UINT16, // identity: 1 terminal: 0 + GrB_TIMES_MONOID_UINT32, // identity: 1 terminal: 0 + GrB_TIMES_MONOID_UINT64, // identity: 1 terminal: 0 + GrB_TIMES_MONOID_FP32, // identity: 1 + GrB_TIMES_MONOID_FP64, // identity: 1 -GrB_Info GrB_Scalar_extractElement_UINT16 // x = s -( - uint16_t *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + // complex monoids: + GxB_TIMES_FC32_MONOID, // identity: 1 + GxB_TIMES_FC64_MONOID, // identity: 1 -GrB_Info GrB_Scalar_extractElement_INT32 // x = s -( - int32_t *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + //-------------------------------------------------------------------------- + // 13 ANY monoids: + //-------------------------------------------------------------------------- -GrB_Info GrB_Scalar_extractElement_UINT32 // x = s -( - uint32_t *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + GxB_ANY_BOOL_MONOID, // identity: any value terminal: any value + GxB_ANY_INT8_MONOID, // identity: any value terminal: any value + GxB_ANY_INT16_MONOID, // identity: any value terminal: any value + GxB_ANY_INT32_MONOID, // identity: any value terminal: any value + GxB_ANY_INT64_MONOID, // identity: any value terminal: any value + GxB_ANY_UINT8_MONOID, // identity: any value terminal: any value + GxB_ANY_UINT16_MONOID, // identity: any value terminal: any value + GxB_ANY_UINT32_MONOID, // identity: any value terminal: any value + GxB_ANY_UINT64_MONOID, // identity: any value terminal: any value + GxB_ANY_FP32_MONOID, // identity: any value terminal: any value + GxB_ANY_FP64_MONOID, // identity: any value terminal: any value + GxB_ANY_FC32_MONOID, // identity: any value terminal: any value + GxB_ANY_FC64_MONOID, // identity: any value terminal: any value -GrB_Info GrB_Scalar_extractElement_INT64 // x = s -( - int64_t *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + //-------------------------------------------------------------------------- + // 4 Boolean monoids: (see also the GxB_ANY_BOOL_MONOID above) + //-------------------------------------------------------------------------- -GrB_Info GrB_Scalar_extractElement_UINT64 // x = s -( - uint64_t *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + // GxB_* boolean monoids, historical, use GrB_* instead: + GxB_LOR_BOOL_MONOID, // identity: false terminal: true + GxB_LAND_BOOL_MONOID, // identity: true terminal: false + GxB_LXOR_BOOL_MONOID, // identity: false + GxB_LXNOR_BOOL_MONOID, // identity: true + GxB_EQ_BOOL_MONOID, // (another name for GrB_LXNOR_MONOID_BOOL) -GrB_Info GrB_Scalar_extractElement_FP32 // x = s -( - float *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + // preferred names from the v1.3 spec: + GrB_LOR_MONOID_BOOL, // identity: false terminal: true + GrB_LAND_MONOID_BOOL, // identity: true terminal: false + GrB_LXOR_MONOID_BOOL, // identity: false + GrB_LXNOR_MONOID_BOOL, // identity: true -GrB_Info GrB_Scalar_extractElement_FP64 // x = s -( - double *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + //-------------------------------------------------------------------------- + // 16 Bitwise-or monoids: + //-------------------------------------------------------------------------- -GrB_Info GxB_Scalar_extractElement_FC32 // x = s -( - GxB_FC32_t *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + // BOR monoids (bitwise or): + GxB_BOR_UINT8_MONOID, // identity: 0 terminal: 0xFF + GxB_BOR_UINT16_MONOID, // identity: 0 terminal: 0xFFFF + GxB_BOR_UINT32_MONOID, // identity: 0 terminal: 0xFFFFFFFF + GxB_BOR_UINT64_MONOID, // identity: 0 terminal: 0xFFFFFFFFFFFFFFFF -GrB_Info GxB_Scalar_extractElement_FC64 // x = s -( - GxB_FC64_t *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + // BAND monoids (bitwise and): + GxB_BAND_UINT8_MONOID, // identity: 0xFF terminal: 0 + GxB_BAND_UINT16_MONOID, // identity: 0xFFFF terminal: 0 + GxB_BAND_UINT32_MONOID, // identity: 0xFFFFFFFF terminal: 0 + GxB_BAND_UINT64_MONOID, // identity: 0xFFFFFFFFFFFFFFFF terminal: 0 -GrB_Info GrB_Scalar_extractElement_UDT // x = s -( - void *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + // BXOR monoids (bitwise xor): + GxB_BXOR_UINT8_MONOID, // identity: 0 + GxB_BXOR_UINT16_MONOID, // identity: 0 + GxB_BXOR_UINT32_MONOID, // identity: 0 + GxB_BXOR_UINT64_MONOID, // identity: 0 -// historical names identical to GrB_Scalar_methods above: -GrB_Info GxB_Scalar_extractElement_BOOL (bool *x, const GrB_Scalar s) ; -GrB_Info GxB_Scalar_extractElement_INT8 (int8_t *x, const GrB_Scalar s) ; -GrB_Info GxB_Scalar_extractElement_INT16 (int16_t *x, const GrB_Scalar s) ; -GrB_Info GxB_Scalar_extractElement_INT32 (int32_t *x, const GrB_Scalar s) ; -GrB_Info GxB_Scalar_extractElement_INT64 (int64_t *x, const GrB_Scalar s) ; -GrB_Info GxB_Scalar_extractElement_UINT8 (uint8_t *x, const GrB_Scalar s) ; -GrB_Info GxB_Scalar_extractElement_UINT16 (uint16_t *x, const GrB_Scalar s) ; -GrB_Info GxB_Scalar_extractElement_UINT32 (uint32_t *x, const GrB_Scalar s) ; -GrB_Info GxB_Scalar_extractElement_UINT64 (uint64_t *x, const GrB_Scalar s) ; -GrB_Info GxB_Scalar_extractElement_FP32 (float *x, const GrB_Scalar s) ; -GrB_Info GxB_Scalar_extractElement_FP64 (double *x, const GrB_Scalar s) ; -GrB_Info GxB_Scalar_extractElement_UDT (void *x, const GrB_Scalar s) ; - -// Type-generic version: x can be a pointer to any supported C type or void * -// for a user-defined type. + // BXNOR monoids (bitwise xnor): + GxB_BXNOR_UINT8_MONOID, // identity: 0xFF + GxB_BXNOR_UINT16_MONOID, // identity: 0xFFFF + GxB_BXNOR_UINT32_MONOID, // identity: 0xFFFFFFFF + GxB_BXNOR_UINT64_MONOID ; // identity: 0xFFFFFFFFFFFFFFFF -/* +//============================================================================== +// GrB_Semiring: built-in semirings +//============================================================================== -GrB_Info GrB_Scalar_extractElement // x = s -( - *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; +// Using built-in types and operators, SuiteSparse:GraphBLAS provides +// 1553 pre-defined, built-in semirings: -*/ +// 1000 semirings with a multiply operator TxT -> T where T is non-Boolean, +// from the complete cross product of: -#if GxB_STDC_VERSION >= 201112L -#define GrB_Scalar_extractElement(x,s) \ - _Generic \ - ( \ - (x), \ - GB_PCASES (GrB, Scalar_extractElement) \ - ) \ - (x, s) +// 5 monoids: MIN, MAX, PLUS, TIMES, ANY +// 20 multiply operators: +// FIRST, SECOND, PAIR (=ONEB), MIN, MAX, PLUS, MINUS, TIMES, DIV, +// RDIV, RMINUS +// ISEQ, ISNE, ISGT, ISLT, ISGE, ISLE, +// LOR, LAND, LXOR +// 10 non-Boolean real types, T +// +// Note that min_pair, max_pair, times_pair are all identical to any_pair. +// These 30 semirings are named below, but are internally remapped to +// their corresponding any_pair semiring. -// historical; use GrB_Scalar_extractElement instead: -#define GxB_Scalar_extractElement(x,s) GrB_Scalar_extractElement (x, s) -#endif +// 300 semirings with a comparator TxT -> bool, where T is +// non-Boolean, from the complete cross product of: -#endif // GB_CUDA_FOLDER +// 5 Boolean monoids: LAND, LOR, LXOR, EQ (=LXNOR), ANY +// 6 multiply operators: EQ, NE, GT, LT, GE, LE +// 10 non-Boolean real types, T -//============================================================================== -// GrB_Vector: a GraphBLAS vector -//============================================================================== +// 55 semirings with purely Boolean types, bool x bool -> bool, from the +// complete cross product of: -typedef struct GB_Vector_opaque *GrB_Vector ; +// 5 Boolean monoids LAND, LOR, LXOR, EQ (=LXNOR), ANY +// 11 multiply operators: +// FIRST, SECOND, LOR, LAND, LXOR, EQ (=LXNOR), GT, LT, GE, LE, +// PAIR (=ONEB) +// +// Note that lor_pair, land_pair, and eq_pair are all identical to +// any_pair. These 3 semirings are named below, but are internally +// remapped to any_pair_bool semiring. -#ifndef GB_CUDA_FOLDER +// 54 complex semirings: TxT -> T where T is float complex or double complex: -// These methods create, free, copy, and clear a vector. The size, nvals, -// and type methods return basic information about a vector. +// 3 complex monoids: PLUS, TIMES, ANY +// 9 complex multiply operators: +// FIRST, SECOND, PAIR (=ONEB), PLUS, MINUS, TIMES, DIV, RDIV, RMINUS +// 2 complex types +// +// Note that times_pair is identical to any_pair. +// These 2 semirings are named below, but are internally remapped to +// their corresponding any_pair semiring. -GrB_Info GrB_Vector_new // create a new vector with no entries -( - GrB_Vector *v, // handle of vector to create - GrB_Type type, // type of vector to create - GrB_Index n // vector dimension is n-by-1 - // (n must be <= GrB_INDEX_MAX+1) -) ; +// 64 bitwise semirings: TxT -> T where T is an unsigned integer: -GrB_Info GrB_Vector_dup // make an exact copy of a vector -( - GrB_Vector *w, // handle of output vector to create - const GrB_Vector u // input vector to copy -) ; +// 4 bitwise monoids: BOR, BAND, BXOR, BXNOR +// 4 bitwise multiply operators: BOR, BAND, BXOR, BXNOR +// 4 unsigned integer types: UINT8, UINT16, UINT32, UINT64 -GrB_Info GrB_Vector_clear // clear a vector of all entries; -( // type and dimension remain unchanged. - GrB_Vector v // vector to clear -) ; +// 80 positional semirings: XxX -> T where T is int64 or int32, and the type of +// X is ignored: -GrB_Info GrB_Vector_size // get the dimension of a vector -( - GrB_Index *n, // vector dimension is n-by-1 - const GrB_Vector v // vector to query -) ; +// 5 monoids: MIN, MAX, PLUS, TIMES, ANY +// 8 multiply operators: +// FIRSTI, FIRSTI1, FIRSTJ, FIRSTJ1, +// SECONDI, SECONDI1, SECONDJ, SECONDJ1 +// 2 types: int32, int64 -GrB_Info GrB_Vector_nvals // get the number of entries in a vector -( - GrB_Index *nvals, // vector has nvals entries - const GrB_Vector v // vector to query -) ; +// The ANY operator is also valid to use as a multiplicative operator in a +// semiring, but serves no purpose in that case. The ANY operator is meant as +// a fast additive operator for a monoid, that terminates, or short-circuits, +// as soon as any value is found. A valid user semiring can be constructed +// with ANY as the multiply operator, but they are not predefined below. -// historical; use GrB_get instead: -GrB_Info GxB_Vector_type (GrB_Type *type, const GrB_Vector v) ; -GrB_Info GxB_Vector_type_name (char *type_name, const GrB_Vector v) ; +// Likewise, additional built-in operators can be used as multiplicative +// operators for floating-point semirings (POW, ATAN2, HYPOT, ...) and many +// more semirings can be constructed from bitwise monoids and many integer +// binary (non-bitwise) multiplicative operators, but these are not +// pre-defined. -GrB_Info GxB_Vector_memoryUsage // return # of bytes used for a vector -( - size_t *size, // # of bytes used by the vector v - const GrB_Vector v // vector to query -) ; +// In the names below, each semiring has a name of the form GxB_add_mult_T +// where add is the additive monoid, mult is the multiply operator, and T is +// the type. The type T is always the type of x and y for the z=mult(x,y) +// operator. The monoid's three types and the ztype of the mult operator are +// always the same. This is the type T for the first set, and Boolean for +// the second and third sets of semirngs. -GrB_Info GxB_Vector_iso // return iso status of a vector -( - bool *iso, // true if the vector is iso-valued - const GrB_Vector v // vector to query -) ; +// 1553 = 1000 + 300 + 55 + 54 + 64 + 80 semirings are named below, but 35 = 30 +// + 3 + 2 are identical to the corresponding any_pair semirings of the same +// type. For positional semirings, the mulitiply ops FIRSTJ and SECONDI are +// identical, as are FIRSTJ1 and SECONDI1. These semirings still appear as +// predefined, for convenience. -GrB_Info GrB_Vector_free // free a vector -( - GrB_Vector *v // handle of vector to free -) ; +GB_GLOBAL GrB_Semiring //------------------------------------------------------------------------------ -// GrB_Vector_build +// 1000 non-Boolean semirings where all types are the same, given by suffix _T //------------------------------------------------------------------------------ -// GrB_Vector_build: w = sparse (I,1,X), but using any -// associative operator to assemble duplicate entries. + // semirings with multiply op: z = FIRST (x,y), all types x,y,z the same: + GxB_MIN_FIRST_INT8 , GxB_MAX_FIRST_INT8 , GxB_PLUS_FIRST_INT8 , GxB_TIMES_FIRST_INT8 , GxB_ANY_FIRST_INT8 , + GxB_MIN_FIRST_INT16 , GxB_MAX_FIRST_INT16 , GxB_PLUS_FIRST_INT16 , GxB_TIMES_FIRST_INT16 , GxB_ANY_FIRST_INT16 , + GxB_MIN_FIRST_INT32 , GxB_MAX_FIRST_INT32 , GxB_PLUS_FIRST_INT32 , GxB_TIMES_FIRST_INT32 , GxB_ANY_FIRST_INT32 , + GxB_MIN_FIRST_INT64 , GxB_MAX_FIRST_INT64 , GxB_PLUS_FIRST_INT64 , GxB_TIMES_FIRST_INT64 , GxB_ANY_FIRST_INT64 , + GxB_MIN_FIRST_UINT8 , GxB_MAX_FIRST_UINT8 , GxB_PLUS_FIRST_UINT8 , GxB_TIMES_FIRST_UINT8 , GxB_ANY_FIRST_UINT8 , + GxB_MIN_FIRST_UINT16 , GxB_MAX_FIRST_UINT16 , GxB_PLUS_FIRST_UINT16 , GxB_TIMES_FIRST_UINT16 , GxB_ANY_FIRST_UINT16 , + GxB_MIN_FIRST_UINT32 , GxB_MAX_FIRST_UINT32 , GxB_PLUS_FIRST_UINT32 , GxB_TIMES_FIRST_UINT32 , GxB_ANY_FIRST_UINT32 , + GxB_MIN_FIRST_UINT64 , GxB_MAX_FIRST_UINT64 , GxB_PLUS_FIRST_UINT64 , GxB_TIMES_FIRST_UINT64 , GxB_ANY_FIRST_UINT64 , + GxB_MIN_FIRST_FP32 , GxB_MAX_FIRST_FP32 , GxB_PLUS_FIRST_FP32 , GxB_TIMES_FIRST_FP32 , GxB_ANY_FIRST_FP32 , + GxB_MIN_FIRST_FP64 , GxB_MAX_FIRST_FP64 , GxB_PLUS_FIRST_FP64 , GxB_TIMES_FIRST_FP64 , GxB_ANY_FIRST_FP64 , -GrB_Info GrB_Vector_build_BOOL // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const bool *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = SECOND (x,y), all types x,y,z the same: + GxB_MIN_SECOND_INT8 , GxB_MAX_SECOND_INT8 , GxB_PLUS_SECOND_INT8 , GxB_TIMES_SECOND_INT8 , GxB_ANY_SECOND_INT8 , + GxB_MIN_SECOND_INT16 , GxB_MAX_SECOND_INT16 , GxB_PLUS_SECOND_INT16 , GxB_TIMES_SECOND_INT16 , GxB_ANY_SECOND_INT16 , + GxB_MIN_SECOND_INT32 , GxB_MAX_SECOND_INT32 , GxB_PLUS_SECOND_INT32 , GxB_TIMES_SECOND_INT32 , GxB_ANY_SECOND_INT32 , + GxB_MIN_SECOND_INT64 , GxB_MAX_SECOND_INT64 , GxB_PLUS_SECOND_INT64 , GxB_TIMES_SECOND_INT64 , GxB_ANY_SECOND_INT64 , + GxB_MIN_SECOND_UINT8 , GxB_MAX_SECOND_UINT8 , GxB_PLUS_SECOND_UINT8 , GxB_TIMES_SECOND_UINT8 , GxB_ANY_SECOND_UINT8 , + GxB_MIN_SECOND_UINT16 , GxB_MAX_SECOND_UINT16 , GxB_PLUS_SECOND_UINT16 , GxB_TIMES_SECOND_UINT16, GxB_ANY_SECOND_UINT16 , + GxB_MIN_SECOND_UINT32 , GxB_MAX_SECOND_UINT32 , GxB_PLUS_SECOND_UINT32 , GxB_TIMES_SECOND_UINT32, GxB_ANY_SECOND_UINT32 , + GxB_MIN_SECOND_UINT64 , GxB_MAX_SECOND_UINT64 , GxB_PLUS_SECOND_UINT64 , GxB_TIMES_SECOND_UINT64, GxB_ANY_SECOND_UINT64 , + GxB_MIN_SECOND_FP32 , GxB_MAX_SECOND_FP32 , GxB_PLUS_SECOND_FP32 , GxB_TIMES_SECOND_FP32 , GxB_ANY_SECOND_FP32 , + GxB_MIN_SECOND_FP64 , GxB_MAX_SECOND_FP64 , GxB_PLUS_SECOND_FP64 , GxB_TIMES_SECOND_FP64 , GxB_ANY_SECOND_FP64 , -GrB_Info GrB_Vector_build_INT8 // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const int8_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = PAIR (x,y), all types x,y,z the same: + // (note that min_pair, max_pair, times_pair are all identical to any_pair, and are marked below) + GxB_MIN_PAIR_INT8 /**/, GxB_MAX_PAIR_INT8 /**/, GxB_PLUS_PAIR_INT8 , GxB_TIMES_PAIR_INT8 /**/, GxB_ANY_PAIR_INT8 , + GxB_MIN_PAIR_INT16 /**/, GxB_MAX_PAIR_INT16 /**/, GxB_PLUS_PAIR_INT16 , GxB_TIMES_PAIR_INT16 /**/, GxB_ANY_PAIR_INT16 , + GxB_MIN_PAIR_INT32 /**/, GxB_MAX_PAIR_INT32 /**/, GxB_PLUS_PAIR_INT32 , GxB_TIMES_PAIR_INT32 /**/, GxB_ANY_PAIR_INT32 , + GxB_MIN_PAIR_INT64 /**/, GxB_MAX_PAIR_INT64 /**/, GxB_PLUS_PAIR_INT64 , GxB_TIMES_PAIR_INT64 /**/, GxB_ANY_PAIR_INT64 , + GxB_MIN_PAIR_UINT8 /**/, GxB_MAX_PAIR_UINT8 /**/, GxB_PLUS_PAIR_UINT8 , GxB_TIMES_PAIR_UINT8 /**/, GxB_ANY_PAIR_UINT8 , + GxB_MIN_PAIR_UINT16/**/, GxB_MAX_PAIR_UINT16/**/, GxB_PLUS_PAIR_UINT16 , GxB_TIMES_PAIR_UINT16/**/, GxB_ANY_PAIR_UINT16 , + GxB_MIN_PAIR_UINT32/**/, GxB_MAX_PAIR_UINT32/**/, GxB_PLUS_PAIR_UINT32 , GxB_TIMES_PAIR_UINT32/**/, GxB_ANY_PAIR_UINT32 , + GxB_MIN_PAIR_UINT64/**/, GxB_MAX_PAIR_UINT64/**/, GxB_PLUS_PAIR_UINT64 , GxB_TIMES_PAIR_UINT64/**/, GxB_ANY_PAIR_UINT64 , + GxB_MIN_PAIR_FP32 /**/, GxB_MAX_PAIR_FP32 /**/, GxB_PLUS_PAIR_FP32 , GxB_TIMES_PAIR_FP32 /**/, GxB_ANY_PAIR_FP32 , + GxB_MIN_PAIR_FP64 /**/, GxB_MAX_PAIR_FP64 /**/, GxB_PLUS_PAIR_FP64 , GxB_TIMES_PAIR_FP64 /**/, GxB_ANY_PAIR_FP64 , -GrB_Info GrB_Vector_build_UINT8 // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const uint8_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = MIN (x,y), all types x,y,z the same: + GxB_MIN_MIN_INT8 , GxB_MAX_MIN_INT8 , GxB_PLUS_MIN_INT8 , GxB_TIMES_MIN_INT8 , GxB_ANY_MIN_INT8 , + GxB_MIN_MIN_INT16 , GxB_MAX_MIN_INT16 , GxB_PLUS_MIN_INT16 , GxB_TIMES_MIN_INT16 , GxB_ANY_MIN_INT16 , + GxB_MIN_MIN_INT32 , GxB_MAX_MIN_INT32 , GxB_PLUS_MIN_INT32 , GxB_TIMES_MIN_INT32 , GxB_ANY_MIN_INT32 , + GxB_MIN_MIN_INT64 , GxB_MAX_MIN_INT64 , GxB_PLUS_MIN_INT64 , GxB_TIMES_MIN_INT64 , GxB_ANY_MIN_INT64 , + GxB_MIN_MIN_UINT8 , GxB_MAX_MIN_UINT8 , GxB_PLUS_MIN_UINT8 , GxB_TIMES_MIN_UINT8 , GxB_ANY_MIN_UINT8 , + GxB_MIN_MIN_UINT16 , GxB_MAX_MIN_UINT16 , GxB_PLUS_MIN_UINT16 , GxB_TIMES_MIN_UINT16 , GxB_ANY_MIN_UINT16 , + GxB_MIN_MIN_UINT32 , GxB_MAX_MIN_UINT32 , GxB_PLUS_MIN_UINT32 , GxB_TIMES_MIN_UINT32 , GxB_ANY_MIN_UINT32 , + GxB_MIN_MIN_UINT64 , GxB_MAX_MIN_UINT64 , GxB_PLUS_MIN_UINT64 , GxB_TIMES_MIN_UINT64 , GxB_ANY_MIN_UINT64 , + GxB_MIN_MIN_FP32 , GxB_MAX_MIN_FP32 , GxB_PLUS_MIN_FP32 , GxB_TIMES_MIN_FP32 , GxB_ANY_MIN_FP32 , + GxB_MIN_MIN_FP64 , GxB_MAX_MIN_FP64 , GxB_PLUS_MIN_FP64 , GxB_TIMES_MIN_FP64 , GxB_ANY_MIN_FP64 , -GrB_Info GrB_Vector_build_INT16 // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const int16_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = MAX (x,y), all types x,y,z the same: + GxB_MIN_MAX_INT8 , GxB_MAX_MAX_INT8 , GxB_PLUS_MAX_INT8 , GxB_TIMES_MAX_INT8 , GxB_ANY_MAX_INT8 , + GxB_MIN_MAX_INT16 , GxB_MAX_MAX_INT16 , GxB_PLUS_MAX_INT16 , GxB_TIMES_MAX_INT16 , GxB_ANY_MAX_INT16 , + GxB_MIN_MAX_INT32 , GxB_MAX_MAX_INT32 , GxB_PLUS_MAX_INT32 , GxB_TIMES_MAX_INT32 , GxB_ANY_MAX_INT32 , + GxB_MIN_MAX_INT64 , GxB_MAX_MAX_INT64 , GxB_PLUS_MAX_INT64 , GxB_TIMES_MAX_INT64 , GxB_ANY_MAX_INT64 , + GxB_MIN_MAX_UINT8 , GxB_MAX_MAX_UINT8 , GxB_PLUS_MAX_UINT8 , GxB_TIMES_MAX_UINT8 , GxB_ANY_MAX_UINT8 , + GxB_MIN_MAX_UINT16 , GxB_MAX_MAX_UINT16 , GxB_PLUS_MAX_UINT16 , GxB_TIMES_MAX_UINT16 , GxB_ANY_MAX_UINT16 , + GxB_MIN_MAX_UINT32 , GxB_MAX_MAX_UINT32 , GxB_PLUS_MAX_UINT32 , GxB_TIMES_MAX_UINT32 , GxB_ANY_MAX_UINT32 , + GxB_MIN_MAX_UINT64 , GxB_MAX_MAX_UINT64 , GxB_PLUS_MAX_UINT64 , GxB_TIMES_MAX_UINT64 , GxB_ANY_MAX_UINT64 , + GxB_MIN_MAX_FP32 , GxB_MAX_MAX_FP32 , GxB_PLUS_MAX_FP32 , GxB_TIMES_MAX_FP32 , GxB_ANY_MAX_FP32 , + GxB_MIN_MAX_FP64 , GxB_MAX_MAX_FP64 , GxB_PLUS_MAX_FP64 , GxB_TIMES_MAX_FP64 , GxB_ANY_MAX_FP64 , -GrB_Info GrB_Vector_build_UINT16 // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const uint16_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = PLUS (x,y), all types x,y,z the same: + GxB_MIN_PLUS_INT8 , GxB_MAX_PLUS_INT8 , GxB_PLUS_PLUS_INT8 , GxB_TIMES_PLUS_INT8 , GxB_ANY_PLUS_INT8 , + GxB_MIN_PLUS_INT16 , GxB_MAX_PLUS_INT16 , GxB_PLUS_PLUS_INT16 , GxB_TIMES_PLUS_INT16 , GxB_ANY_PLUS_INT16 , + GxB_MIN_PLUS_INT32 , GxB_MAX_PLUS_INT32 , GxB_PLUS_PLUS_INT32 , GxB_TIMES_PLUS_INT32 , GxB_ANY_PLUS_INT32 , + GxB_MIN_PLUS_INT64 , GxB_MAX_PLUS_INT64 , GxB_PLUS_PLUS_INT64 , GxB_TIMES_PLUS_INT64 , GxB_ANY_PLUS_INT64 , + GxB_MIN_PLUS_UINT8 , GxB_MAX_PLUS_UINT8 , GxB_PLUS_PLUS_UINT8 , GxB_TIMES_PLUS_UINT8 , GxB_ANY_PLUS_UINT8 , + GxB_MIN_PLUS_UINT16 , GxB_MAX_PLUS_UINT16 , GxB_PLUS_PLUS_UINT16 , GxB_TIMES_PLUS_UINT16 , GxB_ANY_PLUS_UINT16 , + GxB_MIN_PLUS_UINT32 , GxB_MAX_PLUS_UINT32 , GxB_PLUS_PLUS_UINT32 , GxB_TIMES_PLUS_UINT32 , GxB_ANY_PLUS_UINT32 , + GxB_MIN_PLUS_UINT64 , GxB_MAX_PLUS_UINT64 , GxB_PLUS_PLUS_UINT64 , GxB_TIMES_PLUS_UINT64 , GxB_ANY_PLUS_UINT64 , + GxB_MIN_PLUS_FP32 , GxB_MAX_PLUS_FP32 , GxB_PLUS_PLUS_FP32 , GxB_TIMES_PLUS_FP32 , GxB_ANY_PLUS_FP32 , + GxB_MIN_PLUS_FP64 , GxB_MAX_PLUS_FP64 , GxB_PLUS_PLUS_FP64 , GxB_TIMES_PLUS_FP64 , GxB_ANY_PLUS_FP64 , -GrB_Info GrB_Vector_build_INT32 // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const int32_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = MINUS (x,y), all types x,y,z the same: + GxB_MIN_MINUS_INT8 , GxB_MAX_MINUS_INT8 , GxB_PLUS_MINUS_INT8 , GxB_TIMES_MINUS_INT8 , GxB_ANY_MINUS_INT8 , + GxB_MIN_MINUS_INT16 , GxB_MAX_MINUS_INT16 , GxB_PLUS_MINUS_INT16 , GxB_TIMES_MINUS_INT16 , GxB_ANY_MINUS_INT16 , + GxB_MIN_MINUS_INT32 , GxB_MAX_MINUS_INT32 , GxB_PLUS_MINUS_INT32 , GxB_TIMES_MINUS_INT32 , GxB_ANY_MINUS_INT32 , + GxB_MIN_MINUS_INT64 , GxB_MAX_MINUS_INT64 , GxB_PLUS_MINUS_INT64 , GxB_TIMES_MINUS_INT64 , GxB_ANY_MINUS_INT64 , + GxB_MIN_MINUS_UINT8 , GxB_MAX_MINUS_UINT8 , GxB_PLUS_MINUS_UINT8 , GxB_TIMES_MINUS_UINT8 , GxB_ANY_MINUS_UINT8 , + GxB_MIN_MINUS_UINT16 , GxB_MAX_MINUS_UINT16 , GxB_PLUS_MINUS_UINT16 , GxB_TIMES_MINUS_UINT16 , GxB_ANY_MINUS_UINT16 , + GxB_MIN_MINUS_UINT32 , GxB_MAX_MINUS_UINT32 , GxB_PLUS_MINUS_UINT32 , GxB_TIMES_MINUS_UINT32 , GxB_ANY_MINUS_UINT32 , + GxB_MIN_MINUS_UINT64 , GxB_MAX_MINUS_UINT64 , GxB_PLUS_MINUS_UINT64 , GxB_TIMES_MINUS_UINT64 , GxB_ANY_MINUS_UINT64 , + GxB_MIN_MINUS_FP32 , GxB_MAX_MINUS_FP32 , GxB_PLUS_MINUS_FP32 , GxB_TIMES_MINUS_FP32 , GxB_ANY_MINUS_FP32 , + GxB_MIN_MINUS_FP64 , GxB_MAX_MINUS_FP64 , GxB_PLUS_MINUS_FP64 , GxB_TIMES_MINUS_FP64 , GxB_ANY_MINUS_FP64 , -GrB_Info GrB_Vector_build_UINT32 // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const uint32_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = TIMES (x,y), all types x,y,z the same: + GxB_MIN_TIMES_INT8 , GxB_MAX_TIMES_INT8 , GxB_PLUS_TIMES_INT8 , GxB_TIMES_TIMES_INT8 , GxB_ANY_TIMES_INT8 , + GxB_MIN_TIMES_INT16 , GxB_MAX_TIMES_INT16 , GxB_PLUS_TIMES_INT16 , GxB_TIMES_TIMES_INT16 , GxB_ANY_TIMES_INT16 , + GxB_MIN_TIMES_INT32 , GxB_MAX_TIMES_INT32 , GxB_PLUS_TIMES_INT32 , GxB_TIMES_TIMES_INT32 , GxB_ANY_TIMES_INT32 , + GxB_MIN_TIMES_INT64 , GxB_MAX_TIMES_INT64 , GxB_PLUS_TIMES_INT64 , GxB_TIMES_TIMES_INT64 , GxB_ANY_TIMES_INT64 , + GxB_MIN_TIMES_UINT8 , GxB_MAX_TIMES_UINT8 , GxB_PLUS_TIMES_UINT8 , GxB_TIMES_TIMES_UINT8 , GxB_ANY_TIMES_UINT8 , + GxB_MIN_TIMES_UINT16 , GxB_MAX_TIMES_UINT16 , GxB_PLUS_TIMES_UINT16 , GxB_TIMES_TIMES_UINT16 , GxB_ANY_TIMES_UINT16 , + GxB_MIN_TIMES_UINT32 , GxB_MAX_TIMES_UINT32 , GxB_PLUS_TIMES_UINT32 , GxB_TIMES_TIMES_UINT32 , GxB_ANY_TIMES_UINT32 , + GxB_MIN_TIMES_UINT64 , GxB_MAX_TIMES_UINT64 , GxB_PLUS_TIMES_UINT64 , GxB_TIMES_TIMES_UINT64 , GxB_ANY_TIMES_UINT64 , + GxB_MIN_TIMES_FP32 , GxB_MAX_TIMES_FP32 , GxB_PLUS_TIMES_FP32 , GxB_TIMES_TIMES_FP32 , GxB_ANY_TIMES_FP32 , + GxB_MIN_TIMES_FP64 , GxB_MAX_TIMES_FP64 , GxB_PLUS_TIMES_FP64 , GxB_TIMES_TIMES_FP64 , GxB_ANY_TIMES_FP64 , -GrB_Info GrB_Vector_build_INT64 // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const int64_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = DIV (x,y), all types x,y,z the same: + GxB_MIN_DIV_INT8 , GxB_MAX_DIV_INT8 , GxB_PLUS_DIV_INT8 , GxB_TIMES_DIV_INT8 , GxB_ANY_DIV_INT8 , + GxB_MIN_DIV_INT16 , GxB_MAX_DIV_INT16 , GxB_PLUS_DIV_INT16 , GxB_TIMES_DIV_INT16 , GxB_ANY_DIV_INT16 , + GxB_MIN_DIV_INT32 , GxB_MAX_DIV_INT32 , GxB_PLUS_DIV_INT32 , GxB_TIMES_DIV_INT32 , GxB_ANY_DIV_INT32 , + GxB_MIN_DIV_INT64 , GxB_MAX_DIV_INT64 , GxB_PLUS_DIV_INT64 , GxB_TIMES_DIV_INT64 , GxB_ANY_DIV_INT64 , + GxB_MIN_DIV_UINT8 , GxB_MAX_DIV_UINT8 , GxB_PLUS_DIV_UINT8 , GxB_TIMES_DIV_UINT8 , GxB_ANY_DIV_UINT8 , + GxB_MIN_DIV_UINT16 , GxB_MAX_DIV_UINT16 , GxB_PLUS_DIV_UINT16 , GxB_TIMES_DIV_UINT16 , GxB_ANY_DIV_UINT16 , + GxB_MIN_DIV_UINT32 , GxB_MAX_DIV_UINT32 , GxB_PLUS_DIV_UINT32 , GxB_TIMES_DIV_UINT32 , GxB_ANY_DIV_UINT32 , + GxB_MIN_DIV_UINT64 , GxB_MAX_DIV_UINT64 , GxB_PLUS_DIV_UINT64 , GxB_TIMES_DIV_UINT64 , GxB_ANY_DIV_UINT64 , + GxB_MIN_DIV_FP32 , GxB_MAX_DIV_FP32 , GxB_PLUS_DIV_FP32 , GxB_TIMES_DIV_FP32 , GxB_ANY_DIV_FP32 , + GxB_MIN_DIV_FP64 , GxB_MAX_DIV_FP64 , GxB_PLUS_DIV_FP64 , GxB_TIMES_DIV_FP64 , GxB_ANY_DIV_FP64 , -GrB_Info GrB_Vector_build_UINT64 // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const uint64_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = RDIV (x,y), all types x,y,z the same: + GxB_MIN_RDIV_INT8 , GxB_MAX_RDIV_INT8 , GxB_PLUS_RDIV_INT8 , GxB_TIMES_RDIV_INT8 , GxB_ANY_RDIV_INT8 , + GxB_MIN_RDIV_INT16 , GxB_MAX_RDIV_INT16 , GxB_PLUS_RDIV_INT16 , GxB_TIMES_RDIV_INT16 , GxB_ANY_RDIV_INT16 , + GxB_MIN_RDIV_INT32 , GxB_MAX_RDIV_INT32 , GxB_PLUS_RDIV_INT32 , GxB_TIMES_RDIV_INT32 , GxB_ANY_RDIV_INT32 , + GxB_MIN_RDIV_INT64 , GxB_MAX_RDIV_INT64 , GxB_PLUS_RDIV_INT64 , GxB_TIMES_RDIV_INT64 , GxB_ANY_RDIV_INT64 , + GxB_MIN_RDIV_UINT8 , GxB_MAX_RDIV_UINT8 , GxB_PLUS_RDIV_UINT8 , GxB_TIMES_RDIV_UINT8 , GxB_ANY_RDIV_UINT8 , + GxB_MIN_RDIV_UINT16 , GxB_MAX_RDIV_UINT16 , GxB_PLUS_RDIV_UINT16 , GxB_TIMES_RDIV_UINT16 , GxB_ANY_RDIV_UINT16 , + GxB_MIN_RDIV_UINT32 , GxB_MAX_RDIV_UINT32 , GxB_PLUS_RDIV_UINT32 , GxB_TIMES_RDIV_UINT32 , GxB_ANY_RDIV_UINT32 , + GxB_MIN_RDIV_UINT64 , GxB_MAX_RDIV_UINT64 , GxB_PLUS_RDIV_UINT64 , GxB_TIMES_RDIV_UINT64 , GxB_ANY_RDIV_UINT64 , + GxB_MIN_RDIV_FP32 , GxB_MAX_RDIV_FP32 , GxB_PLUS_RDIV_FP32 , GxB_TIMES_RDIV_FP32 , GxB_ANY_RDIV_FP32 , + GxB_MIN_RDIV_FP64 , GxB_MAX_RDIV_FP64 , GxB_PLUS_RDIV_FP64 , GxB_TIMES_RDIV_FP64 , GxB_ANY_RDIV_FP64 , -GrB_Info GrB_Vector_build_FP32 // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const float *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = RMINUS (x,y), all types x,y,z the same: + GxB_MIN_RMINUS_INT8 , GxB_MAX_RMINUS_INT8 , GxB_PLUS_RMINUS_INT8 , GxB_TIMES_RMINUS_INT8 , GxB_ANY_RMINUS_INT8 , + GxB_MIN_RMINUS_INT16 , GxB_MAX_RMINUS_INT16 , GxB_PLUS_RMINUS_INT16 , GxB_TIMES_RMINUS_INT16 , GxB_ANY_RMINUS_INT16 , + GxB_MIN_RMINUS_INT32 , GxB_MAX_RMINUS_INT32 , GxB_PLUS_RMINUS_INT32 , GxB_TIMES_RMINUS_INT32 , GxB_ANY_RMINUS_INT32 , + GxB_MIN_RMINUS_INT64 , GxB_MAX_RMINUS_INT64 , GxB_PLUS_RMINUS_INT64 , GxB_TIMES_RMINUS_INT64 , GxB_ANY_RMINUS_INT64 , + GxB_MIN_RMINUS_UINT8 , GxB_MAX_RMINUS_UINT8 , GxB_PLUS_RMINUS_UINT8 , GxB_TIMES_RMINUS_UINT8 , GxB_ANY_RMINUS_UINT8 , + GxB_MIN_RMINUS_UINT16 , GxB_MAX_RMINUS_UINT16 , GxB_PLUS_RMINUS_UINT16 , GxB_TIMES_RMINUS_UINT16, GxB_ANY_RMINUS_UINT16 , + GxB_MIN_RMINUS_UINT32 , GxB_MAX_RMINUS_UINT32 , GxB_PLUS_RMINUS_UINT32 , GxB_TIMES_RMINUS_UINT32, GxB_ANY_RMINUS_UINT32 , + GxB_MIN_RMINUS_UINT64 , GxB_MAX_RMINUS_UINT64 , GxB_PLUS_RMINUS_UINT64 , GxB_TIMES_RMINUS_UINT64, GxB_ANY_RMINUS_UINT64 , + GxB_MIN_RMINUS_FP32 , GxB_MAX_RMINUS_FP32 , GxB_PLUS_RMINUS_FP32 , GxB_TIMES_RMINUS_FP32 , GxB_ANY_RMINUS_FP32 , + GxB_MIN_RMINUS_FP64 , GxB_MAX_RMINUS_FP64 , GxB_PLUS_RMINUS_FP64 , GxB_TIMES_RMINUS_FP64 , GxB_ANY_RMINUS_FP64 , -GrB_Info GrB_Vector_build_FP64 // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const double *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = ISEQ (x,y), all types x,y,z the same: + GxB_MIN_ISEQ_INT8 , GxB_MAX_ISEQ_INT8 , GxB_PLUS_ISEQ_INT8 , GxB_TIMES_ISEQ_INT8 , GxB_ANY_ISEQ_INT8 , + GxB_MIN_ISEQ_INT16 , GxB_MAX_ISEQ_INT16 , GxB_PLUS_ISEQ_INT16 , GxB_TIMES_ISEQ_INT16 , GxB_ANY_ISEQ_INT16 , + GxB_MIN_ISEQ_INT32 , GxB_MAX_ISEQ_INT32 , GxB_PLUS_ISEQ_INT32 , GxB_TIMES_ISEQ_INT32 , GxB_ANY_ISEQ_INT32 , + GxB_MIN_ISEQ_INT64 , GxB_MAX_ISEQ_INT64 , GxB_PLUS_ISEQ_INT64 , GxB_TIMES_ISEQ_INT64 , GxB_ANY_ISEQ_INT64 , + GxB_MIN_ISEQ_UINT8 , GxB_MAX_ISEQ_UINT8 , GxB_PLUS_ISEQ_UINT8 , GxB_TIMES_ISEQ_UINT8 , GxB_ANY_ISEQ_UINT8 , + GxB_MIN_ISEQ_UINT16 , GxB_MAX_ISEQ_UINT16 , GxB_PLUS_ISEQ_UINT16 , GxB_TIMES_ISEQ_UINT16 , GxB_ANY_ISEQ_UINT16 , + GxB_MIN_ISEQ_UINT32 , GxB_MAX_ISEQ_UINT32 , GxB_PLUS_ISEQ_UINT32 , GxB_TIMES_ISEQ_UINT32 , GxB_ANY_ISEQ_UINT32 , + GxB_MIN_ISEQ_UINT64 , GxB_MAX_ISEQ_UINT64 , GxB_PLUS_ISEQ_UINT64 , GxB_TIMES_ISEQ_UINT64 , GxB_ANY_ISEQ_UINT64 , + GxB_MIN_ISEQ_FP32 , GxB_MAX_ISEQ_FP32 , GxB_PLUS_ISEQ_FP32 , GxB_TIMES_ISEQ_FP32 , GxB_ANY_ISEQ_FP32 , + GxB_MIN_ISEQ_FP64 , GxB_MAX_ISEQ_FP64 , GxB_PLUS_ISEQ_FP64 , GxB_TIMES_ISEQ_FP64 , GxB_ANY_ISEQ_FP64 , -GrB_Info GxB_Vector_build_FC32 // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const GxB_FC32_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = ISNE (x,y), all types x,y,z the same: + GxB_MIN_ISNE_INT8 , GxB_MAX_ISNE_INT8 , GxB_PLUS_ISNE_INT8 , GxB_TIMES_ISNE_INT8 , GxB_ANY_ISNE_INT8 , + GxB_MIN_ISNE_INT16 , GxB_MAX_ISNE_INT16 , GxB_PLUS_ISNE_INT16 , GxB_TIMES_ISNE_INT16 , GxB_ANY_ISNE_INT16 , + GxB_MIN_ISNE_INT32 , GxB_MAX_ISNE_INT32 , GxB_PLUS_ISNE_INT32 , GxB_TIMES_ISNE_INT32 , GxB_ANY_ISNE_INT32 , + GxB_MIN_ISNE_INT64 , GxB_MAX_ISNE_INT64 , GxB_PLUS_ISNE_INT64 , GxB_TIMES_ISNE_INT64 , GxB_ANY_ISNE_INT64 , + GxB_MIN_ISNE_UINT8 , GxB_MAX_ISNE_UINT8 , GxB_PLUS_ISNE_UINT8 , GxB_TIMES_ISNE_UINT8 , GxB_ANY_ISNE_UINT8 , + GxB_MIN_ISNE_UINT16 , GxB_MAX_ISNE_UINT16 , GxB_PLUS_ISNE_UINT16 , GxB_TIMES_ISNE_UINT16 , GxB_ANY_ISNE_UINT16 , + GxB_MIN_ISNE_UINT32 , GxB_MAX_ISNE_UINT32 , GxB_PLUS_ISNE_UINT32 , GxB_TIMES_ISNE_UINT32 , GxB_ANY_ISNE_UINT32 , + GxB_MIN_ISNE_UINT64 , GxB_MAX_ISNE_UINT64 , GxB_PLUS_ISNE_UINT64 , GxB_TIMES_ISNE_UINT64 , GxB_ANY_ISNE_UINT64 , + GxB_MIN_ISNE_FP32 , GxB_MAX_ISNE_FP32 , GxB_PLUS_ISNE_FP32 , GxB_TIMES_ISNE_FP32 , GxB_ANY_ISNE_FP32 , + GxB_MIN_ISNE_FP64 , GxB_MAX_ISNE_FP64 , GxB_PLUS_ISNE_FP64 , GxB_TIMES_ISNE_FP64 , GxB_ANY_ISNE_FP64 , -GrB_Info GxB_Vector_build_FC64 // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const GxB_FC64_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = ISGT (x,y), all types x,y,z the same: + GxB_MIN_ISGT_INT8 , GxB_MAX_ISGT_INT8 , GxB_PLUS_ISGT_INT8 , GxB_TIMES_ISGT_INT8 , GxB_ANY_ISGT_INT8 , + GxB_MIN_ISGT_INT16 , GxB_MAX_ISGT_INT16 , GxB_PLUS_ISGT_INT16 , GxB_TIMES_ISGT_INT16 , GxB_ANY_ISGT_INT16 , + GxB_MIN_ISGT_INT32 , GxB_MAX_ISGT_INT32 , GxB_PLUS_ISGT_INT32 , GxB_TIMES_ISGT_INT32 , GxB_ANY_ISGT_INT32 , + GxB_MIN_ISGT_INT64 , GxB_MAX_ISGT_INT64 , GxB_PLUS_ISGT_INT64 , GxB_TIMES_ISGT_INT64 , GxB_ANY_ISGT_INT64 , + GxB_MIN_ISGT_UINT8 , GxB_MAX_ISGT_UINT8 , GxB_PLUS_ISGT_UINT8 , GxB_TIMES_ISGT_UINT8 , GxB_ANY_ISGT_UINT8 , + GxB_MIN_ISGT_UINT16 , GxB_MAX_ISGT_UINT16 , GxB_PLUS_ISGT_UINT16 , GxB_TIMES_ISGT_UINT16 , GxB_ANY_ISGT_UINT16 , + GxB_MIN_ISGT_UINT32 , GxB_MAX_ISGT_UINT32 , GxB_PLUS_ISGT_UINT32 , GxB_TIMES_ISGT_UINT32 , GxB_ANY_ISGT_UINT32 , + GxB_MIN_ISGT_UINT64 , GxB_MAX_ISGT_UINT64 , GxB_PLUS_ISGT_UINT64 , GxB_TIMES_ISGT_UINT64 , GxB_ANY_ISGT_UINT64 , + GxB_MIN_ISGT_FP32 , GxB_MAX_ISGT_FP32 , GxB_PLUS_ISGT_FP32 , GxB_TIMES_ISGT_FP32 , GxB_ANY_ISGT_FP32 , + GxB_MIN_ISGT_FP64 , GxB_MAX_ISGT_FP64 , GxB_PLUS_ISGT_FP64 , GxB_TIMES_ISGT_FP64 , GxB_ANY_ISGT_FP64 , -GrB_Info GrB_Vector_build_UDT // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const void *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = ISLT (x,y), all types x,y,z the same: + GxB_MIN_ISLT_INT8 , GxB_MAX_ISLT_INT8 , GxB_PLUS_ISLT_INT8 , GxB_TIMES_ISLT_INT8 , GxB_ANY_ISLT_INT8 , + GxB_MIN_ISLT_INT16 , GxB_MAX_ISLT_INT16 , GxB_PLUS_ISLT_INT16 , GxB_TIMES_ISLT_INT16 , GxB_ANY_ISLT_INT16 , + GxB_MIN_ISLT_INT32 , GxB_MAX_ISLT_INT32 , GxB_PLUS_ISLT_INT32 , GxB_TIMES_ISLT_INT32 , GxB_ANY_ISLT_INT32 , + GxB_MIN_ISLT_INT64 , GxB_MAX_ISLT_INT64 , GxB_PLUS_ISLT_INT64 , GxB_TIMES_ISLT_INT64 , GxB_ANY_ISLT_INT64 , + GxB_MIN_ISLT_UINT8 , GxB_MAX_ISLT_UINT8 , GxB_PLUS_ISLT_UINT8 , GxB_TIMES_ISLT_UINT8 , GxB_ANY_ISLT_UINT8 , + GxB_MIN_ISLT_UINT16 , GxB_MAX_ISLT_UINT16 , GxB_PLUS_ISLT_UINT16 , GxB_TIMES_ISLT_UINT16 , GxB_ANY_ISLT_UINT16 , + GxB_MIN_ISLT_UINT32 , GxB_MAX_ISLT_UINT32 , GxB_PLUS_ISLT_UINT32 , GxB_TIMES_ISLT_UINT32 , GxB_ANY_ISLT_UINT32 , + GxB_MIN_ISLT_UINT64 , GxB_MAX_ISLT_UINT64 , GxB_PLUS_ISLT_UINT64 , GxB_TIMES_ISLT_UINT64 , GxB_ANY_ISLT_UINT64 , + GxB_MIN_ISLT_FP32 , GxB_MAX_ISLT_FP32 , GxB_PLUS_ISLT_FP32 , GxB_TIMES_ISLT_FP32 , GxB_ANY_ISLT_FP32 , + GxB_MIN_ISLT_FP64 , GxB_MAX_ISLT_FP64 , GxB_PLUS_ISLT_FP64 , GxB_TIMES_ISLT_FP64 , GxB_ANY_ISLT_FP64 , -GrB_Info GxB_Vector_build_Scalar // build a vector from (i,scalar) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - GrB_Scalar scalar, // value for all tuples - GrB_Index nvals // number of tuples -) ; + // semirings with multiply op: z = ISGE (x,y), all types x,y,z the same: + GxB_MIN_ISGE_INT8 , GxB_MAX_ISGE_INT8 , GxB_PLUS_ISGE_INT8 , GxB_TIMES_ISGE_INT8 , GxB_ANY_ISGE_INT8 , + GxB_MIN_ISGE_INT16 , GxB_MAX_ISGE_INT16 , GxB_PLUS_ISGE_INT16 , GxB_TIMES_ISGE_INT16 , GxB_ANY_ISGE_INT16 , + GxB_MIN_ISGE_INT32 , GxB_MAX_ISGE_INT32 , GxB_PLUS_ISGE_INT32 , GxB_TIMES_ISGE_INT32 , GxB_ANY_ISGE_INT32 , + GxB_MIN_ISGE_INT64 , GxB_MAX_ISGE_INT64 , GxB_PLUS_ISGE_INT64 , GxB_TIMES_ISGE_INT64 , GxB_ANY_ISGE_INT64 , + GxB_MIN_ISGE_UINT8 , GxB_MAX_ISGE_UINT8 , GxB_PLUS_ISGE_UINT8 , GxB_TIMES_ISGE_UINT8 , GxB_ANY_ISGE_UINT8 , + GxB_MIN_ISGE_UINT16 , GxB_MAX_ISGE_UINT16 , GxB_PLUS_ISGE_UINT16 , GxB_TIMES_ISGE_UINT16 , GxB_ANY_ISGE_UINT16 , + GxB_MIN_ISGE_UINT32 , GxB_MAX_ISGE_UINT32 , GxB_PLUS_ISGE_UINT32 , GxB_TIMES_ISGE_UINT32 , GxB_ANY_ISGE_UINT32 , + GxB_MIN_ISGE_UINT64 , GxB_MAX_ISGE_UINT64 , GxB_PLUS_ISGE_UINT64 , GxB_TIMES_ISGE_UINT64 , GxB_ANY_ISGE_UINT64 , + GxB_MIN_ISGE_FP32 , GxB_MAX_ISGE_FP32 , GxB_PLUS_ISGE_FP32 , GxB_TIMES_ISGE_FP32 , GxB_ANY_ISGE_FP32 , + GxB_MIN_ISGE_FP64 , GxB_MAX_ISGE_FP64 , GxB_PLUS_ISGE_FP64 , GxB_TIMES_ISGE_FP64 , GxB_ANY_ISGE_FP64 , -// Type-generic version: X can be a pointer to any supported C type or void * -// for a user-defined type. + // semirings with multiply op: z = ISLE (x,y), all types x,y,z the same: + GxB_MIN_ISLE_INT8 , GxB_MAX_ISLE_INT8 , GxB_PLUS_ISLE_INT8 , GxB_TIMES_ISLE_INT8 , GxB_ANY_ISLE_INT8 , + GxB_MIN_ISLE_INT16 , GxB_MAX_ISLE_INT16 , GxB_PLUS_ISLE_INT16 , GxB_TIMES_ISLE_INT16 , GxB_ANY_ISLE_INT16 , + GxB_MIN_ISLE_INT32 , GxB_MAX_ISLE_INT32 , GxB_PLUS_ISLE_INT32 , GxB_TIMES_ISLE_INT32 , GxB_ANY_ISLE_INT32 , + GxB_MIN_ISLE_INT64 , GxB_MAX_ISLE_INT64 , GxB_PLUS_ISLE_INT64 , GxB_TIMES_ISLE_INT64 , GxB_ANY_ISLE_INT64 , + GxB_MIN_ISLE_UINT8 , GxB_MAX_ISLE_UINT8 , GxB_PLUS_ISLE_UINT8 , GxB_TIMES_ISLE_UINT8 , GxB_ANY_ISLE_UINT8 , + GxB_MIN_ISLE_UINT16 , GxB_MAX_ISLE_UINT16 , GxB_PLUS_ISLE_UINT16 , GxB_TIMES_ISLE_UINT16 , GxB_ANY_ISLE_UINT16 , + GxB_MIN_ISLE_UINT32 , GxB_MAX_ISLE_UINT32 , GxB_PLUS_ISLE_UINT32 , GxB_TIMES_ISLE_UINT32 , GxB_ANY_ISLE_UINT32 , + GxB_MIN_ISLE_UINT64 , GxB_MAX_ISLE_UINT64 , GxB_PLUS_ISLE_UINT64 , GxB_TIMES_ISLE_UINT64 , GxB_ANY_ISLE_UINT64 , + GxB_MIN_ISLE_FP32 , GxB_MAX_ISLE_FP32 , GxB_PLUS_ISLE_FP32 , GxB_TIMES_ISLE_FP32 , GxB_ANY_ISLE_FP32 , + GxB_MIN_ISLE_FP64 , GxB_MAX_ISLE_FP64 , GxB_PLUS_ISLE_FP64 , GxB_TIMES_ISLE_FP64 , GxB_ANY_ISLE_FP64 , -/* -GrB_Info GrB_Vector_build // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; -*/ + // semirings with multiply op: z = LOR (x,y), all types x,y,z the same: + GxB_MIN_LOR_INT8 , GxB_MAX_LOR_INT8 , GxB_PLUS_LOR_INT8 , GxB_TIMES_LOR_INT8 , GxB_ANY_LOR_INT8 , + GxB_MIN_LOR_INT16 , GxB_MAX_LOR_INT16 , GxB_PLUS_LOR_INT16 , GxB_TIMES_LOR_INT16 , GxB_ANY_LOR_INT16 , + GxB_MIN_LOR_INT32 , GxB_MAX_LOR_INT32 , GxB_PLUS_LOR_INT32 , GxB_TIMES_LOR_INT32 , GxB_ANY_LOR_INT32 , + GxB_MIN_LOR_INT64 , GxB_MAX_LOR_INT64 , GxB_PLUS_LOR_INT64 , GxB_TIMES_LOR_INT64 , GxB_ANY_LOR_INT64 , + GxB_MIN_LOR_UINT8 , GxB_MAX_LOR_UINT8 , GxB_PLUS_LOR_UINT8 , GxB_TIMES_LOR_UINT8 , GxB_ANY_LOR_UINT8 , + GxB_MIN_LOR_UINT16 , GxB_MAX_LOR_UINT16 , GxB_PLUS_LOR_UINT16 , GxB_TIMES_LOR_UINT16 , GxB_ANY_LOR_UINT16 , + GxB_MIN_LOR_UINT32 , GxB_MAX_LOR_UINT32 , GxB_PLUS_LOR_UINT32 , GxB_TIMES_LOR_UINT32 , GxB_ANY_LOR_UINT32 , + GxB_MIN_LOR_UINT64 , GxB_MAX_LOR_UINT64 , GxB_PLUS_LOR_UINT64 , GxB_TIMES_LOR_UINT64 , GxB_ANY_LOR_UINT64 , + GxB_MIN_LOR_FP32 , GxB_MAX_LOR_FP32 , GxB_PLUS_LOR_FP32 , GxB_TIMES_LOR_FP32 , GxB_ANY_LOR_FP32 , + GxB_MIN_LOR_FP64 , GxB_MAX_LOR_FP64 , GxB_PLUS_LOR_FP64 , GxB_TIMES_LOR_FP64 , GxB_ANY_LOR_FP64 , -#if GxB_STDC_VERSION >= 201112L -#define GrB_Vector_build(w,Ilist,X,nvals,dup) \ - _Generic \ - ( \ - (X), \ - GB_PCASES (GrB, Vector_build) \ - ) \ - (w, Ilist, ((const void *) (X)), nvals, dup) -#endif + // semirings with multiply op: z = LAND (x,y), all types x,y,z the same: + GxB_MIN_LAND_INT8 , GxB_MAX_LAND_INT8 , GxB_PLUS_LAND_INT8 , GxB_TIMES_LAND_INT8 , GxB_ANY_LAND_INT8 , + GxB_MIN_LAND_INT16 , GxB_MAX_LAND_INT16 , GxB_PLUS_LAND_INT16 , GxB_TIMES_LAND_INT16 , GxB_ANY_LAND_INT16 , + GxB_MIN_LAND_INT32 , GxB_MAX_LAND_INT32 , GxB_PLUS_LAND_INT32 , GxB_TIMES_LAND_INT32 , GxB_ANY_LAND_INT32 , + GxB_MIN_LAND_INT64 , GxB_MAX_LAND_INT64 , GxB_PLUS_LAND_INT64 , GxB_TIMES_LAND_INT64 , GxB_ANY_LAND_INT64 , + GxB_MIN_LAND_UINT8 , GxB_MAX_LAND_UINT8 , GxB_PLUS_LAND_UINT8 , GxB_TIMES_LAND_UINT8 , GxB_ANY_LAND_UINT8 , + GxB_MIN_LAND_UINT16 , GxB_MAX_LAND_UINT16 , GxB_PLUS_LAND_UINT16 , GxB_TIMES_LAND_UINT16 , GxB_ANY_LAND_UINT16 , + GxB_MIN_LAND_UINT32 , GxB_MAX_LAND_UINT32 , GxB_PLUS_LAND_UINT32 , GxB_TIMES_LAND_UINT32 , GxB_ANY_LAND_UINT32 , + GxB_MIN_LAND_UINT64 , GxB_MAX_LAND_UINT64 , GxB_PLUS_LAND_UINT64 , GxB_TIMES_LAND_UINT64 , GxB_ANY_LAND_UINT64 , + GxB_MIN_LAND_FP32 , GxB_MAX_LAND_FP32 , GxB_PLUS_LAND_FP32 , GxB_TIMES_LAND_FP32 , GxB_ANY_LAND_FP32 , + GxB_MIN_LAND_FP64 , GxB_MAX_LAND_FP64 , GxB_PLUS_LAND_FP64 , GxB_TIMES_LAND_FP64 , GxB_ANY_LAND_FP64 , + + // semirings with multiply op: z = LXOR (x,y), all types x,y,z the same: + GxB_MIN_LXOR_INT8 , GxB_MAX_LXOR_INT8 , GxB_PLUS_LXOR_INT8 , GxB_TIMES_LXOR_INT8 , GxB_ANY_LXOR_INT8 , + GxB_MIN_LXOR_INT16 , GxB_MAX_LXOR_INT16 , GxB_PLUS_LXOR_INT16 , GxB_TIMES_LXOR_INT16 , GxB_ANY_LXOR_INT16 , + GxB_MIN_LXOR_INT32 , GxB_MAX_LXOR_INT32 , GxB_PLUS_LXOR_INT32 , GxB_TIMES_LXOR_INT32 , GxB_ANY_LXOR_INT32 , + GxB_MIN_LXOR_INT64 , GxB_MAX_LXOR_INT64 , GxB_PLUS_LXOR_INT64 , GxB_TIMES_LXOR_INT64 , GxB_ANY_LXOR_INT64 , + GxB_MIN_LXOR_UINT8 , GxB_MAX_LXOR_UINT8 , GxB_PLUS_LXOR_UINT8 , GxB_TIMES_LXOR_UINT8 , GxB_ANY_LXOR_UINT8 , + GxB_MIN_LXOR_UINT16 , GxB_MAX_LXOR_UINT16 , GxB_PLUS_LXOR_UINT16 , GxB_TIMES_LXOR_UINT16 , GxB_ANY_LXOR_UINT16 , + GxB_MIN_LXOR_UINT32 , GxB_MAX_LXOR_UINT32 , GxB_PLUS_LXOR_UINT32 , GxB_TIMES_LXOR_UINT32 , GxB_ANY_LXOR_UINT32 , + GxB_MIN_LXOR_UINT64 , GxB_MAX_LXOR_UINT64 , GxB_PLUS_LXOR_UINT64 , GxB_TIMES_LXOR_UINT64 , GxB_ANY_LXOR_UINT64 , + GxB_MIN_LXOR_FP32 , GxB_MAX_LXOR_FP32 , GxB_PLUS_LXOR_FP32 , GxB_TIMES_LXOR_FP32 , GxB_ANY_LXOR_FP32 , + GxB_MIN_LXOR_FP64 , GxB_MAX_LXOR_FP64 , GxB_PLUS_LXOR_FP64 , GxB_TIMES_LXOR_FP64 , GxB_ANY_LXOR_FP64 , //------------------------------------------------------------------------------ -// GrB_Vector_setElement -//------------------------------------------------------------------------------ +// 300 semirings with a comparator TxT -> bool, where T is non-Boolean +//------------------------------------------------------------------------------ -// Set a single scalar in a vector, w(i) = x, typecasting from the type of x to -// the type of w as needed. + // In the 4th column the GxB_EQ_*_* semirings could also be called + // GxB_LXNOR_*_*, since the EQ and LXNOR boolean operators are identical + // but those names are not included. -GrB_Info GrB_Vector_setElement_BOOL // w(i) = x -( - GrB_Vector w, // vector to modify - bool x, // scalar to assign to w(i) - GrB_Index i // row index -) ; + // semirings with multiply op: z = EQ (x,y), where z is boolean and x,y are given by the suffix: + GxB_LOR_EQ_INT8 , GxB_LAND_EQ_INT8 , GxB_LXOR_EQ_INT8 , GxB_EQ_EQ_INT8 , GxB_ANY_EQ_INT8 , + GxB_LOR_EQ_INT16 , GxB_LAND_EQ_INT16 , GxB_LXOR_EQ_INT16 , GxB_EQ_EQ_INT16 , GxB_ANY_EQ_INT16 , + GxB_LOR_EQ_INT32 , GxB_LAND_EQ_INT32 , GxB_LXOR_EQ_INT32 , GxB_EQ_EQ_INT32 , GxB_ANY_EQ_INT32 , + GxB_LOR_EQ_INT64 , GxB_LAND_EQ_INT64 , GxB_LXOR_EQ_INT64 , GxB_EQ_EQ_INT64 , GxB_ANY_EQ_INT64 , + GxB_LOR_EQ_UINT8 , GxB_LAND_EQ_UINT8 , GxB_LXOR_EQ_UINT8 , GxB_EQ_EQ_UINT8 , GxB_ANY_EQ_UINT8 , + GxB_LOR_EQ_UINT16 , GxB_LAND_EQ_UINT16 , GxB_LXOR_EQ_UINT16 , GxB_EQ_EQ_UINT16 , GxB_ANY_EQ_UINT16 , + GxB_LOR_EQ_UINT32 , GxB_LAND_EQ_UINT32 , GxB_LXOR_EQ_UINT32 , GxB_EQ_EQ_UINT32 , GxB_ANY_EQ_UINT32 , + GxB_LOR_EQ_UINT64 , GxB_LAND_EQ_UINT64 , GxB_LXOR_EQ_UINT64 , GxB_EQ_EQ_UINT64 , GxB_ANY_EQ_UINT64 , + GxB_LOR_EQ_FP32 , GxB_LAND_EQ_FP32 , GxB_LXOR_EQ_FP32 , GxB_EQ_EQ_FP32 , GxB_ANY_EQ_FP32 , + GxB_LOR_EQ_FP64 , GxB_LAND_EQ_FP64 , GxB_LXOR_EQ_FP64 , GxB_EQ_EQ_FP64 , GxB_ANY_EQ_FP64 , -GrB_Info GrB_Vector_setElement_INT8 // w(i) = x -( - GrB_Vector w, // vector to modify - int8_t x, // scalar to assign to w(i) - GrB_Index i // row index -) ; + // semirings with multiply op: z = NE (x,y), where z is boolean and x,y are given by the suffix: + GxB_LOR_NE_INT8 , GxB_LAND_NE_INT8 , GxB_LXOR_NE_INT8 , GxB_EQ_NE_INT8 , GxB_ANY_NE_INT8 , + GxB_LOR_NE_INT16 , GxB_LAND_NE_INT16 , GxB_LXOR_NE_INT16 , GxB_EQ_NE_INT16 , GxB_ANY_NE_INT16 , + GxB_LOR_NE_INT32 , GxB_LAND_NE_INT32 , GxB_LXOR_NE_INT32 , GxB_EQ_NE_INT32 , GxB_ANY_NE_INT32 , + GxB_LOR_NE_INT64 , GxB_LAND_NE_INT64 , GxB_LXOR_NE_INT64 , GxB_EQ_NE_INT64 , GxB_ANY_NE_INT64 , + GxB_LOR_NE_UINT8 , GxB_LAND_NE_UINT8 , GxB_LXOR_NE_UINT8 , GxB_EQ_NE_UINT8 , GxB_ANY_NE_UINT8 , + GxB_LOR_NE_UINT16 , GxB_LAND_NE_UINT16 , GxB_LXOR_NE_UINT16 , GxB_EQ_NE_UINT16 , GxB_ANY_NE_UINT16 , + GxB_LOR_NE_UINT32 , GxB_LAND_NE_UINT32 , GxB_LXOR_NE_UINT32 , GxB_EQ_NE_UINT32 , GxB_ANY_NE_UINT32 , + GxB_LOR_NE_UINT64 , GxB_LAND_NE_UINT64 , GxB_LXOR_NE_UINT64 , GxB_EQ_NE_UINT64 , GxB_ANY_NE_UINT64 , + GxB_LOR_NE_FP32 , GxB_LAND_NE_FP32 , GxB_LXOR_NE_FP32 , GxB_EQ_NE_FP32 , GxB_ANY_NE_FP32 , + GxB_LOR_NE_FP64 , GxB_LAND_NE_FP64 , GxB_LXOR_NE_FP64 , GxB_EQ_NE_FP64 , GxB_ANY_NE_FP64 , -GrB_Info GrB_Vector_setElement_UINT8 // w(i) = x -( - GrB_Vector w, // vector to modify - uint8_t x, // scalar to assign to w(i) - GrB_Index i // row index -) ; + // semirings with multiply op: z = GT (x,y), where z is boolean and x,y are given by the suffix: + GxB_LOR_GT_INT8 , GxB_LAND_GT_INT8 , GxB_LXOR_GT_INT8 , GxB_EQ_GT_INT8 , GxB_ANY_GT_INT8 , + GxB_LOR_GT_INT16 , GxB_LAND_GT_INT16 , GxB_LXOR_GT_INT16 , GxB_EQ_GT_INT16 , GxB_ANY_GT_INT16 , + GxB_LOR_GT_INT32 , GxB_LAND_GT_INT32 , GxB_LXOR_GT_INT32 , GxB_EQ_GT_INT32 , GxB_ANY_GT_INT32 , + GxB_LOR_GT_INT64 , GxB_LAND_GT_INT64 , GxB_LXOR_GT_INT64 , GxB_EQ_GT_INT64 , GxB_ANY_GT_INT64 , + GxB_LOR_GT_UINT8 , GxB_LAND_GT_UINT8 , GxB_LXOR_GT_UINT8 , GxB_EQ_GT_UINT8 , GxB_ANY_GT_UINT8 , + GxB_LOR_GT_UINT16 , GxB_LAND_GT_UINT16 , GxB_LXOR_GT_UINT16 , GxB_EQ_GT_UINT16 , GxB_ANY_GT_UINT16 , + GxB_LOR_GT_UINT32 , GxB_LAND_GT_UINT32 , GxB_LXOR_GT_UINT32 , GxB_EQ_GT_UINT32 , GxB_ANY_GT_UINT32 , + GxB_LOR_GT_UINT64 , GxB_LAND_GT_UINT64 , GxB_LXOR_GT_UINT64 , GxB_EQ_GT_UINT64 , GxB_ANY_GT_UINT64 , + GxB_LOR_GT_FP32 , GxB_LAND_GT_FP32 , GxB_LXOR_GT_FP32 , GxB_EQ_GT_FP32 , GxB_ANY_GT_FP32 , + GxB_LOR_GT_FP64 , GxB_LAND_GT_FP64 , GxB_LXOR_GT_FP64 , GxB_EQ_GT_FP64 , GxB_ANY_GT_FP64 , -GrB_Info GrB_Vector_setElement_INT16 // w(i) = x -( - GrB_Vector w, // vector to modify - int16_t x, // scalar to assign to w(i) - GrB_Index i // row index -) ; + // semirings with multiply op: z = LT (x,y), where z is boolean and x,y are given by the suffix: + GxB_LOR_LT_INT8 , GxB_LAND_LT_INT8 , GxB_LXOR_LT_INT8 , GxB_EQ_LT_INT8 , GxB_ANY_LT_INT8 , + GxB_LOR_LT_INT16 , GxB_LAND_LT_INT16 , GxB_LXOR_LT_INT16 , GxB_EQ_LT_INT16 , GxB_ANY_LT_INT16 , + GxB_LOR_LT_INT32 , GxB_LAND_LT_INT32 , GxB_LXOR_LT_INT32 , GxB_EQ_LT_INT32 , GxB_ANY_LT_INT32 , + GxB_LOR_LT_INT64 , GxB_LAND_LT_INT64 , GxB_LXOR_LT_INT64 , GxB_EQ_LT_INT64 , GxB_ANY_LT_INT64 , + GxB_LOR_LT_UINT8 , GxB_LAND_LT_UINT8 , GxB_LXOR_LT_UINT8 , GxB_EQ_LT_UINT8 , GxB_ANY_LT_UINT8 , + GxB_LOR_LT_UINT16 , GxB_LAND_LT_UINT16 , GxB_LXOR_LT_UINT16 , GxB_EQ_LT_UINT16 , GxB_ANY_LT_UINT16 , + GxB_LOR_LT_UINT32 , GxB_LAND_LT_UINT32 , GxB_LXOR_LT_UINT32 , GxB_EQ_LT_UINT32 , GxB_ANY_LT_UINT32 , + GxB_LOR_LT_UINT64 , GxB_LAND_LT_UINT64 , GxB_LXOR_LT_UINT64 , GxB_EQ_LT_UINT64 , GxB_ANY_LT_UINT64 , + GxB_LOR_LT_FP32 , GxB_LAND_LT_FP32 , GxB_LXOR_LT_FP32 , GxB_EQ_LT_FP32 , GxB_ANY_LT_FP32 , + GxB_LOR_LT_FP64 , GxB_LAND_LT_FP64 , GxB_LXOR_LT_FP64 , GxB_EQ_LT_FP64 , GxB_ANY_LT_FP64 , -GrB_Info GrB_Vector_setElement_UINT16 // w(i) = x -( - GrB_Vector w, // vector to modify - uint16_t x, // scalar to assign to w(i) - GrB_Index i // row index -) ; + // semirings with multiply op: z = GE (x,y), where z is boolean and x,y are given by the suffix: + GxB_LOR_GE_INT8 , GxB_LAND_GE_INT8 , GxB_LXOR_GE_INT8 , GxB_EQ_GE_INT8 , GxB_ANY_GE_INT8 , + GxB_LOR_GE_INT16 , GxB_LAND_GE_INT16 , GxB_LXOR_GE_INT16 , GxB_EQ_GE_INT16 , GxB_ANY_GE_INT16 , + GxB_LOR_GE_INT32 , GxB_LAND_GE_INT32 , GxB_LXOR_GE_INT32 , GxB_EQ_GE_INT32 , GxB_ANY_GE_INT32 , + GxB_LOR_GE_INT64 , GxB_LAND_GE_INT64 , GxB_LXOR_GE_INT64 , GxB_EQ_GE_INT64 , GxB_ANY_GE_INT64 , + GxB_LOR_GE_UINT8 , GxB_LAND_GE_UINT8 , GxB_LXOR_GE_UINT8 , GxB_EQ_GE_UINT8 , GxB_ANY_GE_UINT8 , + GxB_LOR_GE_UINT16 , GxB_LAND_GE_UINT16 , GxB_LXOR_GE_UINT16 , GxB_EQ_GE_UINT16 , GxB_ANY_GE_UINT16 , + GxB_LOR_GE_UINT32 , GxB_LAND_GE_UINT32 , GxB_LXOR_GE_UINT32 , GxB_EQ_GE_UINT32 , GxB_ANY_GE_UINT32 , + GxB_LOR_GE_UINT64 , GxB_LAND_GE_UINT64 , GxB_LXOR_GE_UINT64 , GxB_EQ_GE_UINT64 , GxB_ANY_GE_UINT64 , + GxB_LOR_GE_FP32 , GxB_LAND_GE_FP32 , GxB_LXOR_GE_FP32 , GxB_EQ_GE_FP32 , GxB_ANY_GE_FP32 , + GxB_LOR_GE_FP64 , GxB_LAND_GE_FP64 , GxB_LXOR_GE_FP64 , GxB_EQ_GE_FP64 , GxB_ANY_GE_FP64 , -GrB_Info GrB_Vector_setElement_INT32 // w(i) = x -( - GrB_Vector w, // vector to modify - int32_t x, // scalar to assign to w(i) - GrB_Index i // row index -) ; + // semirings with multiply op: z = LE (x,y), where z is boolean and x,y are given by the suffix: + GxB_LOR_LE_INT8 , GxB_LAND_LE_INT8 , GxB_LXOR_LE_INT8 , GxB_EQ_LE_INT8 , GxB_ANY_LE_INT8 , + GxB_LOR_LE_INT16 , GxB_LAND_LE_INT16 , GxB_LXOR_LE_INT16 , GxB_EQ_LE_INT16 , GxB_ANY_LE_INT16 , + GxB_LOR_LE_INT32 , GxB_LAND_LE_INT32 , GxB_LXOR_LE_INT32 , GxB_EQ_LE_INT32 , GxB_ANY_LE_INT32 , + GxB_LOR_LE_INT64 , GxB_LAND_LE_INT64 , GxB_LXOR_LE_INT64 , GxB_EQ_LE_INT64 , GxB_ANY_LE_INT64 , + GxB_LOR_LE_UINT8 , GxB_LAND_LE_UINT8 , GxB_LXOR_LE_UINT8 , GxB_EQ_LE_UINT8 , GxB_ANY_LE_UINT8 , + GxB_LOR_LE_UINT16 , GxB_LAND_LE_UINT16 , GxB_LXOR_LE_UINT16 , GxB_EQ_LE_UINT16 , GxB_ANY_LE_UINT16 , + GxB_LOR_LE_UINT32 , GxB_LAND_LE_UINT32 , GxB_LXOR_LE_UINT32 , GxB_EQ_LE_UINT32 , GxB_ANY_LE_UINT32 , + GxB_LOR_LE_UINT64 , GxB_LAND_LE_UINT64 , GxB_LXOR_LE_UINT64 , GxB_EQ_LE_UINT64 , GxB_ANY_LE_UINT64 , + GxB_LOR_LE_FP32 , GxB_LAND_LE_FP32 , GxB_LXOR_LE_FP32 , GxB_EQ_LE_FP32 , GxB_ANY_LE_FP32 , + GxB_LOR_LE_FP64 , GxB_LAND_LE_FP64 , GxB_LXOR_LE_FP64 , GxB_EQ_LE_FP64 , GxB_ANY_LE_FP64 , -GrB_Info GrB_Vector_setElement_UINT32 // w(i) = x -( - GrB_Vector w, // vector to modify - uint32_t x, // scalar to assign to w(i) - GrB_Index i // row index -) ; +//------------------------------------------------------------------------------ +// 55 semirings with purely Boolean types, bool x bool -> bool +//------------------------------------------------------------------------------ -GrB_Info GrB_Vector_setElement_INT64 // w(i) = x -( - GrB_Vector w, // vector to modify - int64_t x, // scalar to assign to w(i) - GrB_Index i // row index -) ; + // Note that lor_pair, land_pair, and eq_pair are all identical to any_pair. + // These 3 are marked below. GxB_EQ_*_BOOL could be called + // GxB_LXNOR_*_BOOL, and GxB_*_EQ_BOOL could be called GxB_*_LXNOR_BOOL, + // but those names are not included. -GrB_Info GrB_Vector_setElement_UINT64 // w(i) = x -( - GrB_Vector w, // vector to modify - uint64_t x, // scalar to assign to w(i) - GrB_Index i // row index -) ; + // purely boolean semirings in the form GxB_(add monoid)_(multiply operator)_BOOL: + GxB_LOR_FIRST_BOOL , GxB_LAND_FIRST_BOOL , GxB_LXOR_FIRST_BOOL , GxB_EQ_FIRST_BOOL , GxB_ANY_FIRST_BOOL , + GxB_LOR_SECOND_BOOL , GxB_LAND_SECOND_BOOL , GxB_LXOR_SECOND_BOOL , GxB_EQ_SECOND_BOOL , GxB_ANY_SECOND_BOOL , + GxB_LOR_PAIR_BOOL/**/ , GxB_LAND_PAIR_BOOL/**/ , GxB_LXOR_PAIR_BOOL , GxB_EQ_PAIR_BOOL/**/ , GxB_ANY_PAIR_BOOL , + GxB_LOR_LOR_BOOL , GxB_LAND_LOR_BOOL , GxB_LXOR_LOR_BOOL , GxB_EQ_LOR_BOOL , GxB_ANY_LOR_BOOL , + GxB_LOR_LAND_BOOL , GxB_LAND_LAND_BOOL , GxB_LXOR_LAND_BOOL , GxB_EQ_LAND_BOOL , GxB_ANY_LAND_BOOL , + GxB_LOR_LXOR_BOOL , GxB_LAND_LXOR_BOOL , GxB_LXOR_LXOR_BOOL , GxB_EQ_LXOR_BOOL , GxB_ANY_LXOR_BOOL , + GxB_LOR_EQ_BOOL , GxB_LAND_EQ_BOOL , GxB_LXOR_EQ_BOOL , GxB_EQ_EQ_BOOL , GxB_ANY_EQ_BOOL , + GxB_LOR_GT_BOOL , GxB_LAND_GT_BOOL , GxB_LXOR_GT_BOOL , GxB_EQ_GT_BOOL , GxB_ANY_GT_BOOL , + GxB_LOR_LT_BOOL , GxB_LAND_LT_BOOL , GxB_LXOR_LT_BOOL , GxB_EQ_LT_BOOL , GxB_ANY_LT_BOOL , + GxB_LOR_GE_BOOL , GxB_LAND_GE_BOOL , GxB_LXOR_GE_BOOL , GxB_EQ_GE_BOOL , GxB_ANY_GE_BOOL , + GxB_LOR_LE_BOOL , GxB_LAND_LE_BOOL , GxB_LXOR_LE_BOOL , GxB_EQ_LE_BOOL , GxB_ANY_LE_BOOL , -GrB_Info GrB_Vector_setElement_FP32 // w(i) = x -( - GrB_Vector w, // vector to modify - float x, // scalar to assign to w(i) - GrB_Index i // row index -) ; +//------------------------------------------------------------------------------ +// 54 complex semirings +//------------------------------------------------------------------------------ -GrB_Info GrB_Vector_setElement_FP64 // w(i) = x -( - GrB_Vector w, // vector to modify - double x, // scalar to assign to w(i) - GrB_Index i // row index -) ; + // 3 monoids (plus, times, any), 2 types (FC32 and FC64), and 9 + // multiplicative operators. -GrB_Info GxB_Vector_setElement_FC32 // w(i) = x -( - GrB_Vector w, // vector to modify - GxB_FC32_t x, // scalar to assign to w(i) - GrB_Index i // row index -) ; + // Note that times_pair is identical to any_pair. + // These 2 are marked below. -GrB_Info GxB_Vector_setElement_FC64 // w(i) = x -( - GrB_Vector w, // vector to modify - GxB_FC64_t x, // scalar to assign to w(i) - GrB_Index i // row index -) ; + GxB_PLUS_FIRST_FC32 , GxB_TIMES_FIRST_FC32 , GxB_ANY_FIRST_FC32 , + GxB_PLUS_FIRST_FC64 , GxB_TIMES_FIRST_FC64 , GxB_ANY_FIRST_FC64 , -GrB_Info GrB_Vector_setElement_UDT // w(i) = x -( - GrB_Vector w, // vector to modify - void *x, // scalar to assign to w(i) - GrB_Index i // row index -) ; + GxB_PLUS_SECOND_FC32 , GxB_TIMES_SECOND_FC32 , GxB_ANY_SECOND_FC32 , + GxB_PLUS_SECOND_FC64 , GxB_TIMES_SECOND_FC64 , GxB_ANY_SECOND_FC64 , -GrB_Info GrB_Vector_setElement_Scalar // w(i) = x -( - GrB_Vector w, // vector to modify - GrB_Scalar x, // scalar to assign to w(i) - GrB_Index i // row index -) ; + GxB_PLUS_PAIR_FC32 , GxB_TIMES_PAIR_FC32/**/, GxB_ANY_PAIR_FC32 , + GxB_PLUS_PAIR_FC64 , GxB_TIMES_PAIR_FC64/**/, GxB_ANY_PAIR_FC64 , -// Type-generic version: x can be any supported C type or void * for a -// user-defined type. + GxB_PLUS_PLUS_FC32 , GxB_TIMES_PLUS_FC32 , GxB_ANY_PLUS_FC32 , + GxB_PLUS_PLUS_FC64 , GxB_TIMES_PLUS_FC64 , GxB_ANY_PLUS_FC64 , -/* -GrB_Info GrB_Vector_setElement // w(i) = x -( - GrB_Vector w, // vector to modify - x, // scalar to assign to w(i) - GrB_Index i // row index -) ; -*/ + GxB_PLUS_MINUS_FC32 , GxB_TIMES_MINUS_FC32 , GxB_ANY_MINUS_FC32 , + GxB_PLUS_MINUS_FC64 , GxB_TIMES_MINUS_FC64 , GxB_ANY_MINUS_FC64 , -#if GxB_STDC_VERSION >= 201112L -#define GrB_Vector_setElement(w,x,i) \ - _Generic \ - ( \ - (x), \ - GB_CASES (GrB, Vector_setElement), \ - default: GrB_Vector_setElement_Scalar \ - ) \ - (w, x, i) -#endif + GxB_PLUS_TIMES_FC32 , GxB_TIMES_TIMES_FC32 , GxB_ANY_TIMES_FC32 , + GxB_PLUS_TIMES_FC64 , GxB_TIMES_TIMES_FC64 , GxB_ANY_TIMES_FC64 , + + GxB_PLUS_DIV_FC32 , GxB_TIMES_DIV_FC32 , GxB_ANY_DIV_FC32 , + GxB_PLUS_DIV_FC64 , GxB_TIMES_DIV_FC64 , GxB_ANY_DIV_FC64 , + + GxB_PLUS_RDIV_FC32 , GxB_TIMES_RDIV_FC32 , GxB_ANY_RDIV_FC32 , + GxB_PLUS_RDIV_FC64 , GxB_TIMES_RDIV_FC64 , GxB_ANY_RDIV_FC64 , + + GxB_PLUS_RMINUS_FC32 , GxB_TIMES_RMINUS_FC32 , GxB_ANY_RMINUS_FC32 , + GxB_PLUS_RMINUS_FC64 , GxB_TIMES_RMINUS_FC64 , GxB_ANY_RMINUS_FC64 , //------------------------------------------------------------------------------ -// GrB_Vector_extractElement +// 64 bitwise semirings //------------------------------------------------------------------------------ -// Extract a single entry from a vector, x = v(i), typecasting from the type of -// v to the type of x as needed. - -GrB_Info GrB_Vector_extractElement_BOOL // x = v(i) -( - bool *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + // monoids: (BOR, BAND, BXOR, BXNOR) x + // mult: (BOR, BAND, BXOR, BXNOR) x + // types: (UINT8, UINT16, UINT32, UINT64) -GrB_Info GrB_Vector_extractElement_INT8 // x = v(i) -( - int8_t *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + GxB_BOR_BOR_UINT8 , GxB_BOR_BOR_UINT16 , GxB_BOR_BOR_UINT32 , GxB_BOR_BOR_UINT64 , + GxB_BOR_BAND_UINT8 , GxB_BOR_BAND_UINT16 , GxB_BOR_BAND_UINT32 , GxB_BOR_BAND_UINT64 , + GxB_BOR_BXOR_UINT8 , GxB_BOR_BXOR_UINT16 , GxB_BOR_BXOR_UINT32 , GxB_BOR_BXOR_UINT64 , + GxB_BOR_BXNOR_UINT8 , GxB_BOR_BXNOR_UINT16 , GxB_BOR_BXNOR_UINT32 , GxB_BOR_BXNOR_UINT64 , -GrB_Info GrB_Vector_extractElement_UINT8 // x = v(i) -( - uint8_t *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + GxB_BAND_BOR_UINT8 , GxB_BAND_BOR_UINT16 , GxB_BAND_BOR_UINT32 , GxB_BAND_BOR_UINT64 , + GxB_BAND_BAND_UINT8 , GxB_BAND_BAND_UINT16 , GxB_BAND_BAND_UINT32 , GxB_BAND_BAND_UINT64 , + GxB_BAND_BXOR_UINT8 , GxB_BAND_BXOR_UINT16 , GxB_BAND_BXOR_UINT32 , GxB_BAND_BXOR_UINT64 , + GxB_BAND_BXNOR_UINT8 , GxB_BAND_BXNOR_UINT16 , GxB_BAND_BXNOR_UINT32 , GxB_BAND_BXNOR_UINT64 , -GrB_Info GrB_Vector_extractElement_INT16 // x = v(i) -( - int16_t *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + GxB_BXOR_BOR_UINT8 , GxB_BXOR_BOR_UINT16 , GxB_BXOR_BOR_UINT32 , GxB_BXOR_BOR_UINT64 , + GxB_BXOR_BAND_UINT8 , GxB_BXOR_BAND_UINT16 , GxB_BXOR_BAND_UINT32 , GxB_BXOR_BAND_UINT64 , + GxB_BXOR_BXOR_UINT8 , GxB_BXOR_BXOR_UINT16 , GxB_BXOR_BXOR_UINT32 , GxB_BXOR_BXOR_UINT64 , + GxB_BXOR_BXNOR_UINT8 , GxB_BXOR_BXNOR_UINT16 , GxB_BXOR_BXNOR_UINT32 , GxB_BXOR_BXNOR_UINT64 , -GrB_Info GrB_Vector_extractElement_UINT16 // x = v(i) -( - uint16_t *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + GxB_BXNOR_BOR_UINT8 , GxB_BXNOR_BOR_UINT16 , GxB_BXNOR_BOR_UINT32 , GxB_BXNOR_BOR_UINT64 , + GxB_BXNOR_BAND_UINT8 , GxB_BXNOR_BAND_UINT16 , GxB_BXNOR_BAND_UINT32 , GxB_BXNOR_BAND_UINT64 , + GxB_BXNOR_BXOR_UINT8 , GxB_BXNOR_BXOR_UINT16 , GxB_BXNOR_BXOR_UINT32 , GxB_BXNOR_BXOR_UINT64 , + GxB_BXNOR_BXNOR_UINT8 , GxB_BXNOR_BXNOR_UINT16 , GxB_BXNOR_BXNOR_UINT32 , GxB_BXNOR_BXNOR_UINT64 , -GrB_Info GrB_Vector_extractElement_INT32 // x = v(i) -( - int32_t *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; +//------------------------------------------------------------------------------ +// 80 positional semirings +//------------------------------------------------------------------------------ -GrB_Info GrB_Vector_extractElement_UINT32 // x = v(i) -( - uint32_t *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + // monoids: (MIN, MAX, ANY, PLUS, TIMES) x + // mult: (FIRSTI, FIRSTI1, FIRSTJ, FIRSTJ1, SECONDI, SECONDI1, SECONDJ, SECONDJ1) + // types: (INT32, INT64) -GrB_Info GrB_Vector_extractElement_INT64 // x = v(i) -( - int64_t *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + GxB_MIN_FIRSTI_INT32, GxB_MIN_FIRSTI_INT64, + GxB_MAX_FIRSTI_INT32, GxB_MAX_FIRSTI_INT64, + GxB_ANY_FIRSTI_INT32, GxB_ANY_FIRSTI_INT64, + GxB_PLUS_FIRSTI_INT32, GxB_PLUS_FIRSTI_INT64, + GxB_TIMES_FIRSTI_INT32, GxB_TIMES_FIRSTI_INT64, -GrB_Info GrB_Vector_extractElement_UINT64 // x = v(i) -( - uint64_t *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + GxB_MIN_FIRSTI1_INT32, GxB_MIN_FIRSTI1_INT64, + GxB_MAX_FIRSTI1_INT32, GxB_MAX_FIRSTI1_INT64, + GxB_ANY_FIRSTI1_INT32, GxB_ANY_FIRSTI1_INT64, + GxB_PLUS_FIRSTI1_INT32, GxB_PLUS_FIRSTI1_INT64, + GxB_TIMES_FIRSTI1_INT32, GxB_TIMES_FIRSTI1_INT64, -GrB_Info GrB_Vector_extractElement_FP32 // x = v(i) -( - float *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + GxB_MIN_FIRSTJ_INT32, GxB_MIN_FIRSTJ_INT64, + GxB_MAX_FIRSTJ_INT32, GxB_MAX_FIRSTJ_INT64, + GxB_ANY_FIRSTJ_INT32, GxB_ANY_FIRSTJ_INT64, + GxB_PLUS_FIRSTJ_INT32, GxB_PLUS_FIRSTJ_INT64, + GxB_TIMES_FIRSTJ_INT32, GxB_TIMES_FIRSTJ_INT64, -GrB_Info GrB_Vector_extractElement_FP64 // x = v(i) -( - double *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + GxB_MIN_FIRSTJ1_INT32, GxB_MIN_FIRSTJ1_INT64, + GxB_MAX_FIRSTJ1_INT32, GxB_MAX_FIRSTJ1_INT64, + GxB_ANY_FIRSTJ1_INT32, GxB_ANY_FIRSTJ1_INT64, + GxB_PLUS_FIRSTJ1_INT32, GxB_PLUS_FIRSTJ1_INT64, + GxB_TIMES_FIRSTJ1_INT32, GxB_TIMES_FIRSTJ1_INT64, -GrB_Info GxB_Vector_extractElement_FC32 // x = v(i) -( - GxB_FC32_t *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + GxB_MIN_SECONDI_INT32, GxB_MIN_SECONDI_INT64, + GxB_MAX_SECONDI_INT32, GxB_MAX_SECONDI_INT64, + GxB_ANY_SECONDI_INT32, GxB_ANY_SECONDI_INT64, + GxB_PLUS_SECONDI_INT32, GxB_PLUS_SECONDI_INT64, + GxB_TIMES_SECONDI_INT32, GxB_TIMES_SECONDI_INT64, -GrB_Info GxB_Vector_extractElement_FC64 // x = v(i) -( - GxB_FC64_t *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + GxB_MIN_SECONDI1_INT32, GxB_MIN_SECONDI1_INT64, + GxB_MAX_SECONDI1_INT32, GxB_MAX_SECONDI1_INT64, + GxB_ANY_SECONDI1_INT32, GxB_ANY_SECONDI1_INT64, + GxB_PLUS_SECONDI1_INT32, GxB_PLUS_SECONDI1_INT64, + GxB_TIMES_SECONDI1_INT32, GxB_TIMES_SECONDI1_INT64, -GrB_Info GrB_Vector_extractElement_UDT // x = v(i) -( - void *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + GxB_MIN_SECONDJ_INT32, GxB_MIN_SECONDJ_INT64, + GxB_MAX_SECONDJ_INT32, GxB_MAX_SECONDJ_INT64, + GxB_ANY_SECONDJ_INT32, GxB_ANY_SECONDJ_INT64, + GxB_PLUS_SECONDJ_INT32, GxB_PLUS_SECONDJ_INT64, + GxB_TIMES_SECONDJ_INT32, GxB_TIMES_SECONDJ_INT64, -GrB_Info GrB_Vector_extractElement_Scalar // x = v(i) -( - GrB_Scalar x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + GxB_MIN_SECONDJ1_INT32, GxB_MIN_SECONDJ1_INT64, + GxB_MAX_SECONDJ1_INT32, GxB_MAX_SECONDJ1_INT64, + GxB_ANY_SECONDJ1_INT32, GxB_ANY_SECONDJ1_INT64, + GxB_PLUS_SECONDJ1_INT32, GxB_PLUS_SECONDJ1_INT64, + GxB_TIMES_SECONDJ1_INT32, GxB_TIMES_SECONDJ1_INT64 ; -// Type-generic version: x can be a pointer to any supported C type or void * -// for a user-defined type. +//------------------------------------------------------------------------------ +// GrB_* semirings +//------------------------------------------------------------------------------ -/* -GrB_Info GrB_Vector_extractElement // x = v(i) -( - *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; -*/ +// The v1.3 C API for GraphBLAS adds the following 124 predefined semirings, +// with GrB_* names. They are identical to 124 GxB_* semirings defined above, +// with the same name, except that GrB_LXNOR_LOR_SEMIRING_BOOL is identical to +// GxB_EQ_LOR_BOOL (since GrB_EQ_BOOL == GrB_LXNOR). The old names are listed +// below alongside each new name; the new GrB_* names are preferred. -#if GxB_STDC_VERSION >= 201112L -#define GrB_Vector_extractElement(x,v,i) \ - _Generic \ - ( \ - (x), \ - GB_PCASES (GrB, Vector_extractElement), \ - default: GrB_Vector_extractElement_Scalar \ - ) \ - (x, v, i) -#endif +// 12 kinds of GrB_* semirings are available for all 10 real non-boolean types: -// GxB_Vector_isStoredElement determines if v(i) is present in the structure -// of the vector v, as a stored element. It does not return the value. It -// returns GrB_SUCCESS if the element is present, or GrB_NO_VALUE otherwise. + // PLUS_TIMES, PLUS_MIN, + // MIN_PLUS, MIN_TIMES, MIN_FIRST, MIN_SECOND, MIN_MAX, + // MAX_PLUS, MAX_TIMES, MAX_FIRST, MAX_SECOND, MAX_MIN -GrB_Info GxB_Vector_isStoredElement // determine if v(i) is a stored element -( - const GrB_Vector v, // vector to check - GrB_Index i // row index -) ; +// and 4 semirings for boolean only: -//------------------------------------------------------------------------------ -// GrB_Vector_removeElement -//------------------------------------------------------------------------------ + // LOR_LAND, LAND_LOR, LXOR_LAND, LXNOR_LOR. -// GrB_Vector_removeElement (v,i) removes the element v(i) from the vector v. +// GxB_* semirings corresponding to the equivalent GrB_* semiring are +// historical. -GrB_Info GrB_Vector_removeElement -( - GrB_Vector v, // vector to remove an element from - GrB_Index i // index -) ; +GB_GLOBAL GrB_Semiring -//------------------------------------------------------------------------------ -// GrB_Vector_extractTuples -//------------------------------------------------------------------------------ + //-------------------------------------------------------------------------- + // 20 semirings with PLUS monoids + //-------------------------------------------------------------------------- -// Extracts all tuples from a vector, like [I,~,X] = find (v). If -// any parameter I and/or X is NULL, then that component is not extracted. For -// example, to extract just the row indices, pass I as non-NULL, and X as NULL. -// This is like [I,~,~] = find (v). + // PLUS_TIMES semirings for all 10 real, non-boolean types: + GrB_PLUS_TIMES_SEMIRING_INT8, // GxB_PLUS_TIMES_INT8 + GrB_PLUS_TIMES_SEMIRING_INT16, // GxB_PLUS_TIMES_INT16 + GrB_PLUS_TIMES_SEMIRING_INT32, // GxB_PLUS_TIMES_INT32 + GrB_PLUS_TIMES_SEMIRING_INT64, // GxB_PLUS_TIMES_INT64 + GrB_PLUS_TIMES_SEMIRING_UINT8, // GxB_PLUS_TIMES_UINT8 + GrB_PLUS_TIMES_SEMIRING_UINT16, // GxB_PLUS_TIMES_UINT16 + GrB_PLUS_TIMES_SEMIRING_UINT32, // GxB_PLUS_TIMES_UINT32 + GrB_PLUS_TIMES_SEMIRING_UINT64, // GxB_PLUS_TIMES_UINT64 + GrB_PLUS_TIMES_SEMIRING_FP32, // GxB_PLUS_TIMES_FP32 + GrB_PLUS_TIMES_SEMIRING_FP64, // GxB_PLUS_TIMES_FP64 -GrB_Info GrB_Vector_extractTuples_BOOL // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - bool *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + // PLUS_MIN semirings for all 10 real, non-boolean types: + GrB_PLUS_MIN_SEMIRING_INT8, // GxB_PLUS_MIN_INT8 + GrB_PLUS_MIN_SEMIRING_INT16, // GxB_PLUS_MIN_INT16 + GrB_PLUS_MIN_SEMIRING_INT32, // GxB_PLUS_MIN_INT32 + GrB_PLUS_MIN_SEMIRING_INT64, // GxB_PLUS_MIN_INT64 + GrB_PLUS_MIN_SEMIRING_UINT8, // GxB_PLUS_MIN_UINT8 + GrB_PLUS_MIN_SEMIRING_UINT16, // GxB_PLUS_MIN_UINT16 + GrB_PLUS_MIN_SEMIRING_UINT32, // GxB_PLUS_MIN_UINT32 + GrB_PLUS_MIN_SEMIRING_UINT64, // GxB_PLUS_MIN_UINT64 + GrB_PLUS_MIN_SEMIRING_FP32, // GxB_PLUS_MIN_FP32 + GrB_PLUS_MIN_SEMIRING_FP64, // GxB_PLUS_MIN_FP64 -GrB_Info GrB_Vector_extractTuples_INT8 // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - int8_t *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + //-------------------------------------------------------------------------- + // 50 semirings with MIN monoids + //-------------------------------------------------------------------------- -GrB_Info GrB_Vector_extractTuples_UINT8 // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - uint8_t *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + // MIN_PLUS semirings for all 10 real, non-boolean types: + GrB_MIN_PLUS_SEMIRING_INT8, // GxB_MIN_PLUS_INT8 + GrB_MIN_PLUS_SEMIRING_INT16, // GxB_MIN_PLUS_INT16 + GrB_MIN_PLUS_SEMIRING_INT32, // GxB_MIN_PLUS_INT32 + GrB_MIN_PLUS_SEMIRING_INT64, // GxB_MIN_PLUS_INT64 + GrB_MIN_PLUS_SEMIRING_UINT8, // GxB_MIN_PLUS_UINT8 + GrB_MIN_PLUS_SEMIRING_UINT16, // GxB_MIN_PLUS_UINT16 + GrB_MIN_PLUS_SEMIRING_UINT32, // GxB_MIN_PLUS_UINT32 + GrB_MIN_PLUS_SEMIRING_UINT64, // GxB_MIN_PLUS_UINT64 + GrB_MIN_PLUS_SEMIRING_FP32, // GxB_MIN_PLUS_FP32 + GrB_MIN_PLUS_SEMIRING_FP64, // GxB_MIN_PLUS_FP64 -GrB_Info GrB_Vector_extractTuples_INT16 // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - int16_t *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + // MIN_TIMES semirings for all 10 real, non-boolean types: + GrB_MIN_TIMES_SEMIRING_INT8, // GxB_MIN_TIMES_INT8 + GrB_MIN_TIMES_SEMIRING_INT16, // GxB_MIN_TIMES_INT16 + GrB_MIN_TIMES_SEMIRING_INT32, // GxB_MIN_TIMES_INT32 + GrB_MIN_TIMES_SEMIRING_INT64, // GxB_MIN_TIMES_INT64 + GrB_MIN_TIMES_SEMIRING_UINT8, // GxB_MIN_TIMES_UINT8 + GrB_MIN_TIMES_SEMIRING_UINT16, // GxB_MIN_TIMES_UINT16 + GrB_MIN_TIMES_SEMIRING_UINT32, // GxB_MIN_TIMES_UINT32 + GrB_MIN_TIMES_SEMIRING_UINT64, // GxB_MIN_TIMES_UINT64 + GrB_MIN_TIMES_SEMIRING_FP32, // GxB_MIN_TIMES_FP32 + GrB_MIN_TIMES_SEMIRING_FP64, // GxB_MIN_TIMES_FP64 -GrB_Info GrB_Vector_extractTuples_UINT16 // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - uint16_t *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + // MIN_FIRST semirings for all 10 real, non-boolean types: + GrB_MIN_FIRST_SEMIRING_INT8, // GxB_MIN_FIRST_INT8 + GrB_MIN_FIRST_SEMIRING_INT16, // GxB_MIN_FIRST_INT16 + GrB_MIN_FIRST_SEMIRING_INT32, // GxB_MIN_FIRST_INT32 + GrB_MIN_FIRST_SEMIRING_INT64, // GxB_MIN_FIRST_INT64 + GrB_MIN_FIRST_SEMIRING_UINT8, // GxB_MIN_FIRST_UINT8 + GrB_MIN_FIRST_SEMIRING_UINT16, // GxB_MIN_FIRST_UINT16 + GrB_MIN_FIRST_SEMIRING_UINT32, // GxB_MIN_FIRST_UINT32 + GrB_MIN_FIRST_SEMIRING_UINT64, // GxB_MIN_FIRST_UINT64 + GrB_MIN_FIRST_SEMIRING_FP32, // GxB_MIN_FIRST_FP32 + GrB_MIN_FIRST_SEMIRING_FP64, // GxB_MIN_FIRST_FP64 -GrB_Info GrB_Vector_extractTuples_INT32 // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - int32_t *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + // MIN_SECOND semirings for all 10 real, non-boolean types: + GrB_MIN_SECOND_SEMIRING_INT8, // GxB_MIN_SECOND_INT8 + GrB_MIN_SECOND_SEMIRING_INT16, // GxB_MIN_SECOND_INT16 + GrB_MIN_SECOND_SEMIRING_INT32, // GxB_MIN_SECOND_INT32 + GrB_MIN_SECOND_SEMIRING_INT64, // GxB_MIN_SECOND_INT64 + GrB_MIN_SECOND_SEMIRING_UINT8, // GxB_MIN_SECOND_UINT8 + GrB_MIN_SECOND_SEMIRING_UINT16, // GxB_MIN_SECOND_UINT16 + GrB_MIN_SECOND_SEMIRING_UINT32, // GxB_MIN_SECOND_UINT32 + GrB_MIN_SECOND_SEMIRING_UINT64, // GxB_MIN_SECOND_UINT64 + GrB_MIN_SECOND_SEMIRING_FP32, // GxB_MIN_SECOND_FP32 + GrB_MIN_SECOND_SEMIRING_FP64, // GxB_MIN_SECOND_FP64 -GrB_Info GrB_Vector_extractTuples_UINT32 // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - uint32_t *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + // MIN_MAX semirings for all 10 real, non-boolean types: + GrB_MIN_MAX_SEMIRING_INT8, // GxB_MIN_MAX_INT8 + GrB_MIN_MAX_SEMIRING_INT16, // GxB_MIN_MAX_INT16 + GrB_MIN_MAX_SEMIRING_INT32, // GxB_MIN_MAX_INT32 + GrB_MIN_MAX_SEMIRING_INT64, // GxB_MIN_MAX_INT64 + GrB_MIN_MAX_SEMIRING_UINT8, // GxB_MIN_MAX_UINT8 + GrB_MIN_MAX_SEMIRING_UINT16, // GxB_MIN_MAX_UINT16 + GrB_MIN_MAX_SEMIRING_UINT32, // GxB_MIN_MAX_UINT32 + GrB_MIN_MAX_SEMIRING_UINT64, // GxB_MIN_MAX_UINT64 + GrB_MIN_MAX_SEMIRING_FP32, // GxB_MIN_MAX_FP32 + GrB_MIN_MAX_SEMIRING_FP64, // GxB_MIN_MAX_FP64 -GrB_Info GrB_Vector_extractTuples_INT64 // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - int64_t *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + //-------------------------------------------------------------------------- + // 50 semirings with MAX monoids + //-------------------------------------------------------------------------- -GrB_Info GrB_Vector_extractTuples_UINT64 // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - uint64_t *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + // MAX_PLUS semirings for all 10 real, non-boolean types + GrB_MAX_PLUS_SEMIRING_INT8, // GxB_MAX_PLUS_INT8 + GrB_MAX_PLUS_SEMIRING_INT16, // GxB_MAX_PLUS_INT16 + GrB_MAX_PLUS_SEMIRING_INT32, // GxB_MAX_PLUS_INT32 + GrB_MAX_PLUS_SEMIRING_INT64, // GxB_MAX_PLUS_INT64 + GrB_MAX_PLUS_SEMIRING_UINT8, // GxB_MAX_PLUS_UINT8 + GrB_MAX_PLUS_SEMIRING_UINT16, // GxB_MAX_PLUS_UINT16 + GrB_MAX_PLUS_SEMIRING_UINT32, // GxB_MAX_PLUS_UINT32 + GrB_MAX_PLUS_SEMIRING_UINT64, // GxB_MAX_PLUS_UINT64 + GrB_MAX_PLUS_SEMIRING_FP32, // GxB_MAX_PLUS_FP32 + GrB_MAX_PLUS_SEMIRING_FP64, // GxB_MAX_PLUS_FP64 -GrB_Info GrB_Vector_extractTuples_FP32 // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - float *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + // MAX_TIMES semirings for all 10 real, non-boolean types: + GrB_MAX_TIMES_SEMIRING_INT8, // GxB_MAX_TIMES_INT8 + GrB_MAX_TIMES_SEMIRING_INT16, // GxB_MAX_TIMES_INT16 + GrB_MAX_TIMES_SEMIRING_INT32, // GxB_MAX_TIMES_INT32 + GrB_MAX_TIMES_SEMIRING_INT64, // GxB_MAX_TIMES_INT64 + GrB_MAX_TIMES_SEMIRING_UINT8, // GxB_MAX_TIMES_UINT8 + GrB_MAX_TIMES_SEMIRING_UINT16, // GxB_MAX_TIMES_UINT16 + GrB_MAX_TIMES_SEMIRING_UINT32, // GxB_MAX_TIMES_UINT32 + GrB_MAX_TIMES_SEMIRING_UINT64, // GxB_MAX_TIMES_UINT64 + GrB_MAX_TIMES_SEMIRING_FP32, // GxB_MAX_TIMES_FP32 + GrB_MAX_TIMES_SEMIRING_FP64, // GxB_MAX_TIMES_FP64 -GrB_Info GrB_Vector_extractTuples_FP64 // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - double *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + // MAX_FIRST semirings for all 10 real, non-boolean types: + GrB_MAX_FIRST_SEMIRING_INT8, // GxB_MAX_FIRST_INT8 + GrB_MAX_FIRST_SEMIRING_INT16, // GxB_MAX_FIRST_INT16 + GrB_MAX_FIRST_SEMIRING_INT32, // GxB_MAX_FIRST_INT32 + GrB_MAX_FIRST_SEMIRING_INT64, // GxB_MAX_FIRST_INT64 + GrB_MAX_FIRST_SEMIRING_UINT8, // GxB_MAX_FIRST_UINT8 + GrB_MAX_FIRST_SEMIRING_UINT16, // GxB_MAX_FIRST_UINT16 + GrB_MAX_FIRST_SEMIRING_UINT32, // GxB_MAX_FIRST_UINT32 + GrB_MAX_FIRST_SEMIRING_UINT64, // GxB_MAX_FIRST_UINT64 + GrB_MAX_FIRST_SEMIRING_FP32, // GxB_MAX_FIRST_FP32 + GrB_MAX_FIRST_SEMIRING_FP64, // GxB_MAX_FIRST_FP64 -GrB_Info GxB_Vector_extractTuples_FC32 // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - GxB_FC32_t *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + // MAX_SECOND semirings for all 10 real, non-boolean types: + GrB_MAX_SECOND_SEMIRING_INT8, // GxB_MAX_SECOND_INT8 + GrB_MAX_SECOND_SEMIRING_INT16, // GxB_MAX_SECOND_INT16 + GrB_MAX_SECOND_SEMIRING_INT32, // GxB_MAX_SECOND_INT32 + GrB_MAX_SECOND_SEMIRING_INT64, // GxB_MAX_SECOND_INT64 + GrB_MAX_SECOND_SEMIRING_UINT8, // GxB_MAX_SECOND_UINT8 + GrB_MAX_SECOND_SEMIRING_UINT16, // GxB_MAX_SECOND_UINT16 + GrB_MAX_SECOND_SEMIRING_UINT32, // GxB_MAX_SECOND_UINT32 + GrB_MAX_SECOND_SEMIRING_UINT64, // GxB_MAX_SECOND_UINT64 + GrB_MAX_SECOND_SEMIRING_FP32, // GxB_MAX_SECOND_FP32 + GrB_MAX_SECOND_SEMIRING_FP64, // GxB_MAX_SECOND_FP64 -GrB_Info GxB_Vector_extractTuples_FC64 // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - GxB_FC64_t *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + // MAX_MIN semirings for all 10 real, non-boolean types: + GrB_MAX_MIN_SEMIRING_INT8, // GxB_MAX_MIN_INT8 + GrB_MAX_MIN_SEMIRING_INT16, // GxB_MAX_MIN_INT16 + GrB_MAX_MIN_SEMIRING_INT32, // GxB_MAX_MIN_INT32 + GrB_MAX_MIN_SEMIRING_INT64, // GxB_MAX_MIN_INT64 + GrB_MAX_MIN_SEMIRING_UINT8, // GxB_MAX_MIN_UINT8 + GrB_MAX_MIN_SEMIRING_UINT16, // GxB_MAX_MIN_UINT16 + GrB_MAX_MIN_SEMIRING_UINT32, // GxB_MAX_MIN_UINT32 + GrB_MAX_MIN_SEMIRING_UINT64, // GxB_MAX_MIN_UINT64 + GrB_MAX_MIN_SEMIRING_FP32, // GxB_MAX_MIN_FP32 + GrB_MAX_MIN_SEMIRING_FP64, // GxB_MAX_MIN_FP64 -GrB_Info GrB_Vector_extractTuples_UDT // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - void *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + //-------------------------------------------------------------------------- + // 4 boolean semirings: + //-------------------------------------------------------------------------- -// Type-generic version: X can be a pointer to any supported C type or void * -// for a user-defined type. + GrB_LOR_LAND_SEMIRING_BOOL, // GxB_LOR_LAND_BOOL + GrB_LAND_LOR_SEMIRING_BOOL, // GxB_LAND_LOR_BOOL + GrB_LXOR_LAND_SEMIRING_BOOL, // GxB_LXOR_LAND_BOOL + GrB_LXNOR_LOR_SEMIRING_BOOL ; // GxB_EQ_LOR_BOOL (note EQ == LXNOR) -/* -GrB_Info GrB_Vector_extractTuples // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; -*/ +//============================================================================== +// GxB_fprint and GxB_print: print the contents of a GraphBLAS object +//============================================================================== -#if GxB_STDC_VERSION >= 201112L -#define GrB_Vector_extractTuples(Ilist,X,nvals,v) \ - _Generic \ - ( \ - (X), \ - GB_PCASES (GrB, Vector_extractTuples) \ - ) \ - (Ilist, X, nvals, v) -#endif +typedef enum +{ + GxB_SILENT = 0, // nothing is printed, just check the object + GxB_SUMMARY = 1, // print a terse summary + GxB_SHORT = 2, // short description, about 30 entries of a matrix + GxB_COMPLETE = 3, // print the entire contents of the object + GxB_SHORT_VERBOSE = 4, // GxB_SHORT but with "%.15g" for doubles + GxB_COMPLETE_VERBOSE = 5 // GxB_COMPLETE but with "%.15g" for doubles +} +GxB_Print_Level ; -#endif // GB_CUDA_FOLDER +//============================================================================== +// GrB import/export +//============================================================================== + +// The GrB C API specification supports 3 formats: +typedef enum +{ + GrB_CSR_FORMAT = 0, // CSR format (equiv to GxB_SPARSE with GxB_BY_ROW) + GrB_CSC_FORMAT = 1, // CSC format (equiv to GxB_SPARSE with GxB_BY_COL) + GrB_COO_FORMAT = 2 // triplet format (like input to GrB*build) +} +GrB_Format ; //============================================================================== -// GrB_Matrix: a GraphBLAS matrix +// serialize/deserialize compression levels //============================================================================== -typedef struct GB_Matrix_opaque *GrB_Matrix ; +// Currently implemented: no compression, LZ4, LZ4HC, and ZSTD +#define GxB_COMPRESSION_NONE -1 // no compression +#define GxB_COMPRESSION_DEFAULT 0 // ZSTD (level 1) +#define GxB_COMPRESSION_LZ4 1000 // LZ4 +#define GxB_COMPRESSION_LZ4HC 2000 // LZ4HC, with default level 9 +#define GxB_COMPRESSION_ZSTD 3000 // ZSTD, with default level 1 -#ifndef GB_CUDA_FOLDER +//============================================================================== +//=== GraphBLAS functions ====================================================== +//============================================================================== -// These methods create, free, copy, and clear a matrix. The nrows, ncols, -// nvals, and type methods return basic information about a matrix. +// All user-callable GrB* and GxB* functions in GraphBLAS are defined below. +// The GB_CUDA_FOLDER flag is only meant for use by the C++ functions in +// GraphBLAS/CUDA, since they do not need access these definitions. User +// applications have access to these methods. -GrB_Info GrB_Matrix_new // create a new matrix with no entries +#ifndef GB_CUDA_FOLDER + +//============================================================================== +// GrB_init / GrB_finalize +//============================================================================== + +GrB_Info GrB_init // start up GraphBLAS ( - GrB_Matrix *A, // handle of matrix to create - GrB_Type type, // type of matrix to create - GrB_Index nrows, // matrix dimension is nrows-by-ncols - GrB_Index ncols // (nrows and ncols must be <= GrB_INDEX_MAX+1) + GrB_Mode mode // blocking or non-blocking mode, no GPU ) ; -GrB_Info GrB_Matrix_dup // make an exact copy of a matrix +GrB_Info GxB_init // start up GraphBLAS and also define malloc, etc ( - GrB_Matrix *C, // handle of output matrix to create - const GrB_Matrix A // input matrix to copy + GrB_Mode mode, // blocking or non-blocking mode, + // with or without GPU + // pointers to memory management functions + void * (* user_malloc_function ) (size_t), + void * (* user_calloc_function ) (size_t, size_t), + void * (* user_realloc_function ) (void *, size_t), + void (* user_free_function ) (void *) ) ; -GrB_Info GrB_Matrix_clear // clear a matrix of all entries; -( // type and dimensions remain unchanged - GrB_Matrix A // matrix to clear -) ; +GrB_Info GrB_finalize (void) ; // finish GraphBLAS -GrB_Info GrB_Matrix_nrows // get the number of rows of a matrix -( - GrB_Index *nrows, // matrix has nrows rows - const GrB_Matrix A // matrix to query -) ; +//============================================================================== +// GrB_getVersion: GraphBLAS C API version +//============================================================================== -GrB_Info GrB_Matrix_ncols // get the number of columns of a matrix -( - GrB_Index *ncols, // matrix has ncols columns - const GrB_Matrix A // matrix to query -) ; +// GrB_getVersion provides a runtime access of the C API Version. Can also be +// done with two calls to GrB_Global_get_INT32 with the v2.1 C API: +// +// GrB_get (GrB_GLOBAL, &version, GrB_API_VER_MAJOR) ; +// GrB_get (GrB_GLOBAL, &subversion, GrB_API_VER_MINOR) ; -GrB_Info GrB_Matrix_nvals // get the number of entries in a matrix +GrB_Info GrB_getVersion // runtime access to C API version number ( - GrB_Index *nvals, // matrix has nvals entries - const GrB_Matrix A // matrix to query + unsigned int *version, // returns GRB_VERSION + unsigned int *subversion // returns GRB_SUBVERSION ) ; -// historical; use GrB_get instead: -GrB_Info GxB_Matrix_type (GrB_Type *type, const GrB_Matrix A) ; -GrB_Info GxB_Matrix_type_name (char *type_name, const GrB_Matrix A) ; +//============================================================================== +// GrB_Descriptor: the GraphBLAS descriptor +//============================================================================== -GrB_Info GxB_Matrix_memoryUsage // return # of bytes used for a matrix +GrB_Info GrB_Descriptor_new // create a new descriptor ( - size_t *size, // # of bytes used by the matrix A - const GrB_Matrix A // matrix to query + GrB_Descriptor *descriptor // handle of descriptor to create ) ; -GrB_Info GxB_Matrix_iso // return iso status of a matrix -( - bool *iso, // true if the matrix is iso-valued - const GrB_Matrix A // matrix to query -) ; +// historical methods; use GrB_set and GrB_get instead: +GrB_Info GrB_Descriptor_set (GrB_Descriptor, GrB_Desc_Field, GrB_Desc_Value) ; +GrB_Info GxB_Descriptor_get (GrB_Desc_Value *, GrB_Descriptor, GrB_Desc_Field) ; +GrB_Info GxB_Desc_set (GrB_Descriptor, GrB_Desc_Field, ...) ; +GrB_Info GxB_Desc_set_INT32 (GrB_Descriptor, GrB_Desc_Field, int32_t) ; +GrB_Info GxB_Desc_set_FP64 (GrB_Descriptor, GrB_Desc_Field, double) ; +GrB_Info GxB_Desc_get (GrB_Descriptor, GrB_Desc_Field, ...) ; +GrB_Info GxB_Desc_get_INT32 (GrB_Descriptor, GrB_Desc_Field, int32_t *) ; +GrB_Info GxB_Desc_get_FP64 (GrB_Descriptor, GrB_Desc_Field, double *) ; -GrB_Info GrB_Matrix_free // free a matrix +GrB_Info GrB_Descriptor_free // free a descriptor ( - GrB_Matrix *A // handle of matrix to free + GrB_Descriptor *descriptor // handle of descriptor to free ) ; +//============================================================================== +// helper macros for polymorphic functions +//============================================================================== + +#define GB_CAT(w,x,y,z) w ## x ## y ## z +#define GB_CONCAT(w,x,y,z) GB_CAT (w, x, y, z) + +// methods for C scalars of various types +#define GB_CASES(prefix,func) \ + bool : GB_CONCAT ( prefix, _, func, _BOOL ), \ + int8_t : GB_CONCAT ( prefix, _, func, _INT8 ), \ + int16_t : GB_CONCAT ( prefix, _, func, _INT16 ), \ + int32_t : GB_CONCAT ( prefix, _, func, _INT32 ), \ + int64_t : GB_CONCAT ( prefix, _, func, _INT64 ), \ + uint8_t : GB_CONCAT ( prefix, _, func, _UINT8 ), \ + uint16_t : GB_CONCAT ( prefix, _, func, _UINT16 ), \ + uint32_t : GB_CONCAT ( prefix, _, func, _UINT32 ), \ + uint64_t : GB_CONCAT ( prefix, _, func, _UINT64 ), \ + float : GB_CONCAT ( prefix, _, func, _FP32 ), \ + double : GB_CONCAT ( prefix, _, func, _FP64 ), \ + GxB_FC32_t : GB_CONCAT ( GxB , _, func, _FC32 ), \ + GxB_FC64_t : GB_CONCAT ( GxB , _, func, _FC64 ), \ + const void * : GB_CONCAT ( prefix, _, func, _UDT ), \ + void * : GB_CONCAT ( prefix, _, func, _UDT ) + +// methods for C arrays of various types +#define GB_PCASES(prefix,func) \ + const bool * : GB_CONCAT ( prefix, _, func, _BOOL ), \ + bool * : GB_CONCAT ( prefix, _, func, _BOOL ), \ + const int8_t * : GB_CONCAT ( prefix, _, func, _INT8 ), \ + int8_t * : GB_CONCAT ( prefix, _, func, _INT8 ), \ + const int16_t * : GB_CONCAT ( prefix, _, func, _INT16 ), \ + int16_t * : GB_CONCAT ( prefix, _, func, _INT16 ), \ + const int32_t * : GB_CONCAT ( prefix, _, func, _INT32 ), \ + int32_t * : GB_CONCAT ( prefix, _, func, _INT32 ), \ + const int64_t * : GB_CONCAT ( prefix, _, func, _INT64 ), \ + int64_t * : GB_CONCAT ( prefix, _, func, _INT64 ), \ + const uint8_t * : GB_CONCAT ( prefix, _, func, _UINT8 ), \ + uint8_t * : GB_CONCAT ( prefix, _, func, _UINT8 ), \ + const uint16_t * : GB_CONCAT ( prefix, _, func, _UINT16 ), \ + uint16_t * : GB_CONCAT ( prefix, _, func, _UINT16 ), \ + const uint32_t * : GB_CONCAT ( prefix, _, func, _UINT32 ), \ + uint32_t * : GB_CONCAT ( prefix, _, func, _UINT32 ), \ + const uint64_t * : GB_CONCAT ( prefix, _, func, _UINT64 ), \ + uint64_t * : GB_CONCAT ( prefix, _, func, _UINT64 ), \ + const float * : GB_CONCAT ( prefix, _, func, _FP32 ), \ + float * : GB_CONCAT ( prefix, _, func, _FP32 ), \ + const double * : GB_CONCAT ( prefix, _, func, _FP64 ), \ + double * : GB_CONCAT ( prefix, _, func, _FP64 ), \ + const GxB_FC32_t * : GB_CONCAT ( GxB , _, func, _FC32 ), \ + GxB_FC32_t * : GB_CONCAT ( GxB , _, func, _FC32 ), \ + const GxB_FC64_t * : GB_CONCAT ( GxB , _, func, _FC64 ), \ + GxB_FC64_t * : GB_CONCAT ( GxB , _, func, _FC64 ), \ + const void * : GB_CONCAT ( prefix, _, func, _UDT ), \ + void * : GB_CONCAT ( prefix, _, func, _UDT ) + +//============================================================================== +// GrB_Type: data types +//============================================================================== + //------------------------------------------------------------------------------ -// GrB_Matrix_build +// GrB_Type_new: create a new type //------------------------------------------------------------------------------ -// GrB_Matrix_build: C = sparse (I,J,X), but using any -// associative operator to assemble duplicate entries. - -GrB_Info GrB_Matrix_build_BOOL // build a matrix from (I,J,X) tuples +GrB_Info GrB_Type_new // create a new GraphBLAS type ( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const bool *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates + GrB_Type *type, // handle of user type to create + size_t sizeof_ctype // size = sizeof (ctype) of the C type ) ; -GrB_Info GrB_Matrix_build_INT8 // build a matrix from (I,J,X) tuples -( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const int8_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; +// GxB_Type_new creates a type with a name and definition that are known to +// GraphBLAS, as strings. The type_name is any valid string (max length of 128 +// characters, including the required null-terminating character) that may +// appear as the name of a C type created by a C "typedef" statement. It must +// not contain any white-space characters. Example, creating a type of size +// 16*4+4 = 68 bytes, with a 4-by-4 dense float array and a 32-bit integer: +// +// typedef struct { float x [4][4] ; int color ; } myquaternion ; +// GrB_Type MyQtype ; +// GxB_Type_new (&MyQtype, sizeof (myquaternion), "myquaternion", +// "typedef struct { float x [4][4] ; int color ; } myquaternion ;") ; +// +// The type_name and type_defn are both null-terminated strings. The two +// strings are required for best performance in the JIT (both on the CPU and +// GPU). User defined types created by GrB_Type_new will not work with a JIT. +// +// At most GxB_MAX_NAME_LEN characters are accessed in type_name; characters +// beyond that limit are silently ignored. -GrB_Info GrB_Matrix_build_UINT8 // build a matrix from (I,J,X) tuples +GrB_Info GxB_Type_new // create a new named GraphBLAS type ( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const uint8_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates + GrB_Type *type, // handle of user type to create + size_t sizeof_ctype, // size = sizeof (ctype) of the C type + const char *type_name, // name of the type (max 128 characters) + const char *type_defn // typedef for the type (no max length) ) ; -GrB_Info GrB_Matrix_build_INT16 // build a matrix from (I,J,X) tuples +// historical; use GrB_get instead: +GrB_Info GxB_Type_name (char *type_name, const GrB_Type type) ; +GrB_Info GxB_Type_size (size_t *size, const GrB_Type type) ; + +GrB_Info GxB_Type_from_name // return the built-in GrB_Type from a name ( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const int16_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates + GrB_Type *type, // built-in type, or NULL if user-defined. + // The name can be the underlying C type + // ("int8_t") or the GraphBLAS name + // ("GrB_INT8"). + const char *type_name // array of size at least GxB_MAX_NAME_LEN ) ; -GrB_Info GrB_Matrix_build_UINT16 // build a matrix from (I,J,X) tuples +GrB_Info GrB_Type_free // free a user-defined type ( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const uint16_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates + GrB_Type *type // handle of user-defined type to free ) ; -GrB_Info GrB_Matrix_build_INT32 // build a matrix from (I,J,X) tuples +//============================================================================== +// GrB_UnaryOp: unary operators +//============================================================================== + +// GrB_UnaryOp_new creates a user-defined unary op (with no name or defn) +GrB_Info GrB_UnaryOp_new // create a new user-defined unary operator ( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const int32_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates + GrB_UnaryOp *unaryop, // handle for the new unary operator + GxB_unary_function function, // pointer to the unary function + GrB_Type ztype, // type of output z + GrB_Type xtype // type of input x ) ; -GrB_Info GrB_Matrix_build_UINT32 // build a matrix from (I,J,X) tuples +// GxB_UnaryOp_new creates a named and defined user-defined unary op. +GrB_Info GxB_UnaryOp_new // create a new user-defined unary operator ( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const uint32_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates + GrB_UnaryOp *unaryop, // handle for the new unary operator + GxB_unary_function function, // pointer to the unary function + GrB_Type ztype, // type of output z + GrB_Type xtype, // type of input x + const char *unop_name, // name of the user function + const char *unop_defn // definition of the user function ) ; -GrB_Info GrB_Matrix_build_INT64 // build a matrix from (I,J,X) tuples -( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const int64_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; +// historical; use GrB_get instead: +GrB_Info GxB_UnaryOp_ztype (GrB_Type *ztype, GrB_UnaryOp unaryop) ; +GrB_Info GxB_UnaryOp_ztype_name (char *type_name, const GrB_UnaryOp unaryop) ; +GrB_Info GxB_UnaryOp_xtype (GrB_Type *xtype, GrB_UnaryOp unaryop) ; +GrB_Info GxB_UnaryOp_xtype_name (char *type_name, const GrB_UnaryOp unaryop) ; -GrB_Info GrB_Matrix_build_UINT64 // build a matrix from (I,J,X) tuples +GrB_Info GrB_UnaryOp_free // free a user-created unary operator ( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const uint64_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates + GrB_UnaryOp *unaryop // handle of unary operator to free ) ; -GrB_Info GrB_Matrix_build_FP32 // build a matrix from (I,J,X) tuples -( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const float *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; +//============================================================================== +// GrB_BinaryOp: binary operators +//============================================================================== -GrB_Info GrB_Matrix_build_FP64 // build a matrix from (I,J,X) tuples +// GrB_BinaryOp_new creates a user-defined binary op (no name or defn) +GrB_Info GrB_BinaryOp_new ( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const double *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates + GrB_BinaryOp *binaryop, // handle for the new binary operator + GxB_binary_function function, // pointer to the binary function + GrB_Type ztype, // type of output z + GrB_Type xtype, // type of input x + GrB_Type ytype // type of input y ) ; -GrB_Info GxB_Matrix_build_FC32 // build a matrix from (I,J,X) tuples +// GxB_BinaryOp_new creates a named and defined user-defined binary op. +GrB_Info GxB_BinaryOp_new ( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const GxB_FC32_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates + GrB_BinaryOp *op, // handle for the new binary operator + GxB_binary_function function, // pointer to the binary function + GrB_Type ztype, // type of output z + GrB_Type xtype, // type of input x + GrB_Type ytype, // type of input y + const char *binop_name, // name of the user function + const char *binop_defn // definition of the user function ) ; -GrB_Info GxB_Matrix_build_FC64 // build a matrix from (I,J,X) tuples +// historical; use GrB_get instead: +GrB_Info GxB_BinaryOp_ztype (GrB_Type *ztype, GrB_BinaryOp op) ; +GrB_Info GxB_BinaryOp_ztype_name (char *type_name, const GrB_BinaryOp op) ; +GrB_Info GxB_BinaryOp_xtype (GrB_Type *xtype, GrB_BinaryOp op) ; +GrB_Info GxB_BinaryOp_xtype_name (char *type_name, const GrB_BinaryOp op) ; +GrB_Info GxB_BinaryOp_ytype (GrB_Type *ytype, GrB_BinaryOp op) ; +GrB_Info GxB_BinaryOp_ytype_name (char *type_name, const GrB_BinaryOp op) ; + +GrB_Info GrB_BinaryOp_free // free a user-created binary operator ( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const GxB_FC64_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates + GrB_BinaryOp *binaryop // handle of binary operator to free ) ; -GrB_Info GrB_Matrix_build_UDT // build a matrix from (I,J,X) tuples +//============================================================================== +// GxB_SelectOp: select operators (DEPRECATED: do not use) +//============================================================================== + +// historical; use GrB_select and GrB_IndexUnaryOp instead: +GrB_Info GxB_SelectOp_xtype (GrB_Type *xtype, GxB_SelectOp selectop) ; +GrB_Info GxB_SelectOp_ttype (GrB_Type *ttype, GxB_SelectOp selectop) ; + +//============================================================================== +// GrB_IndexUnaryOp: a unary operator that depends on the row/col indices +//============================================================================== + +// GrB_IndexUnaryOp_new creates a user-defined unary op (no name or defn) + +GrB_Info GrB_IndexUnaryOp_new // create a new user-defined IndexUnary op ( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const void *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates + GrB_IndexUnaryOp *op, // handle for the new IndexUnary operator + GxB_index_unary_function function, // pointer to IndexUnary function + GrB_Type ztype, // type of output z + GrB_Type xtype, // type of input x (the A(i,j) entry) + GrB_Type ytype // type of input y (the scalar) ) ; -GrB_Info GxB_Matrix_build_Scalar // build a matrix from (I,J,scalar) tuples +GrB_Info GxB_IndexUnaryOp_new // create a named user-created IndexUnaryOp ( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - GrB_Scalar scalar, // value for all tuples - GrB_Index nvals // number of tuples + GrB_IndexUnaryOp *op, // handle for the new IndexUnary operator + GxB_index_unary_function function, // pointer to index_unary function + GrB_Type ztype, // type of output z + GrB_Type xtype, // type of input x (the A(i,j) entry) + GrB_Type ytype, // type of input y (the scalar) + const char *idxop_name, // name of the user function + const char *idxop_defn // definition of the user function ) ; -// Type-generic version: X can be a pointer to any supported C type or void * -// for a user-defined type. +// historical; use GrB_get instead: +GrB_Info GxB_IndexUnaryOp_ztype_name (char *, const GrB_IndexUnaryOp op) ; +GrB_Info GxB_IndexUnaryOp_xtype_name (char *, const GrB_IndexUnaryOp op) ; +GrB_Info GxB_IndexUnaryOp_ytype_name (char *, const GrB_IndexUnaryOp op) ; -/* -GrB_Info GrB_Matrix_build // build a matrix from (I,J,X) tuples +GrB_Info GrB_IndexUnaryOp_free // free a user-created IndexUnaryOp ( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates + GrB_IndexUnaryOp *op // handle of IndexUnary to free ) ; -*/ - -#if GxB_STDC_VERSION >= 201112L -#define GrB_Matrix_build(C,Ilist,J,X,nvals,dup) \ - _Generic \ - ( \ - (X), \ - GB_PCASES (GrB, Matrix_build) \ - ) \ - (C, Ilist, J, ((const void *) (X)), nvals, dup) -#endif - -//------------------------------------------------------------------------------ -// GrB_Matrix_setElement -//------------------------------------------------------------------------------ -// Set a single entry in a matrix, C(i,j) = x, typecasting -// from the type of x to the type of C, as needed. +//============================================================================== +// GrB_Monoid +//============================================================================== -GrB_Info GrB_Matrix_setElement_BOOL // C (i,j) = x +GrB_Info GrB_Monoid_new_BOOL // create a new boolean monoid ( - GrB_Matrix C, // matrix to modify - bool x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + bool identity // identity value of the monoid ) ; -GrB_Info GrB_Matrix_setElement_INT8 // C (i,j) = x +GrB_Info GrB_Monoid_new_INT8 // create a new int8 monoid ( - GrB_Matrix C, // matrix to modify - int8_t x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + int8_t identity // identity value of the monoid ) ; -GrB_Info GrB_Matrix_setElement_UINT8 // C (i,j) = x +GrB_Info GrB_Monoid_new_UINT8 // create a new uint8 monoid ( - GrB_Matrix C, // matrix to modify - uint8_t x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + uint8_t identity // identity value of the monoid ) ; -GrB_Info GrB_Matrix_setElement_INT16 // C (i,j) = x +GrB_Info GrB_Monoid_new_INT16 // create a new int16 monoid ( - GrB_Matrix C, // matrix to modify - int16_t x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + int16_t identity // identity value of the monoid ) ; -GrB_Info GrB_Matrix_setElement_UINT16 // C (i,j) = x +GrB_Info GrB_Monoid_new_UINT16 // create a new uint16 monoid ( - GrB_Matrix C, // matrix to modify - uint16_t x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + uint16_t identity // identity value of the monoid ) ; -GrB_Info GrB_Matrix_setElement_INT32 // C (i,j) = x +GrB_Info GrB_Monoid_new_INT32 // create a new int32 monoid ( - GrB_Matrix C, // matrix to modify - int32_t x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + int32_t identity // identity value of the monoid ) ; -GrB_Info GrB_Matrix_setElement_UINT32 // C (i,j) = x +GrB_Info GrB_Monoid_new_UINT32 // create a new uint32 monoid ( - GrB_Matrix C, // matrix to modify - uint32_t x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + uint32_t identity // identity value of the monoid ) ; -GrB_Info GrB_Matrix_setElement_INT64 // C (i,j) = x +GrB_Info GrB_Monoid_new_INT64 // create a new int64 monoid ( - GrB_Matrix C, // matrix to modify - int64_t x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + int64_t identity // identity value of the monoid ) ; -GrB_Info GrB_Matrix_setElement_UINT64 // C (i,j) = x +GrB_Info GrB_Monoid_new_UINT64 // create a new uint64 monoid ( - GrB_Matrix C, // matrix to modify - uint64_t x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + uint64_t identity // identity value of the monoid ) ; -GrB_Info GrB_Matrix_setElement_FP32 // C (i,j) = x +GrB_Info GrB_Monoid_new_FP32 // create a new float monoid ( - GrB_Matrix C, // matrix to modify - float x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + float identity // identity value of the monoid ) ; -GrB_Info GrB_Matrix_setElement_FP64 // C (i,j) = x +GrB_Info GrB_Monoid_new_FP64 // create a new double monoid ( - GrB_Matrix C, // matrix to modify - double x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + double identity // identity value of the monoid ) ; -GrB_Info GxB_Matrix_setElement_FC32 // C (i,j) = x -( - GrB_Matrix C, // matrix to modify - GxB_FC32_t x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index -) ; - -GrB_Info GxB_Matrix_setElement_FC64 // C (i,j) = x +GrB_Info GxB_Monoid_new_FC32 // create a new float complex monoid ( - GrB_Matrix C, // matrix to modify - GxB_FC64_t x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + GxB_FC32_t identity // identity value of the monoid ) ; -GrB_Info GrB_Matrix_setElement_UDT // C (i,j) = x +GrB_Info GxB_Monoid_new_FC64 // create a new double complex monoid ( - GrB_Matrix C, // matrix to modify - void *x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + GxB_FC64_t identity // identity value of the monoid ) ; -GrB_Info GrB_Matrix_setElement_Scalar // C (i,j) = x +GrB_Info GrB_Monoid_new_UDT // create a monoid with a user-defined type ( - GrB_Matrix C, // matrix to modify - GrB_Scalar x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + void *identity // identity value of the monoid ) ; -// Type-generic version: x can be any supported C type or void * for a -// user-defined type. +// Type-generic method for creating a new monoid: /* -GrB_Info GrB_Matrix_setElement // C (i,j) = x +GrB_Info GrB_Monoid_new // create a monoid ( - GrB_Matrix C, // matrix to modify - x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + identity // identity value of the monoid ) ; */ #if GxB_STDC_VERSION >= 201112L -#define GrB_Matrix_setElement(C,x,i,j) \ - _Generic \ - ( \ - (x), \ - GB_CASES (GrB, Matrix_setElement), \ - default: GrB_Matrix_setElement_Scalar \ - ) \ - (C, x, i, j) +#define GrB_Monoid_new(monoid,op,identity) \ + _Generic \ + ( \ + (identity), \ + GB_CASES (GrB, Monoid_new) \ + ) \ + (monoid, op, identity) #endif -//------------------------------------------------------------------------------ -// GrB_Matrix_extractElement -//------------------------------------------------------------------------------ - -// Extract a single entry from a matrix, x = A(i,j), typecasting from the type -// of A to the type of x, as needed. - -GrB_Info GrB_Matrix_extractElement_BOOL // x = A(i,j) -( - bool *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index -) ; +// GxB_Monoid_terminal_new is identical to GrB_Monoid_new, except that a +// terminal value can be specified. The terminal may be NULL, which indicates +// no terminal value (and in this case, it is identical to GrB_Monoid_new). +// The terminal value, if not NULL, must have the same type as the identity. -GrB_Info GrB_Matrix_extractElement_INT8 // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_BOOL // create a new boolean monoid ( - int8_t *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + bool identity, // identity value of the monoid + bool terminal // terminal value of the monoid ) ; -GrB_Info GrB_Matrix_extractElement_UINT8 // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_INT8 // create a new int8 monoid ( - uint8_t *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + int8_t identity, // identity value of the monoid + int8_t terminal // terminal value of the monoid ) ; -GrB_Info GrB_Matrix_extractElement_INT16 // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_UINT8 // create a new uint8 monoid ( - int16_t *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + uint8_t identity, // identity value of the monoid + uint8_t terminal // terminal value of the monoid ) ; -GrB_Info GrB_Matrix_extractElement_UINT16 // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_INT16 // create a new int16 monoid ( - uint16_t *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + int16_t identity, // identity value of the monoid + int16_t terminal // terminal value of the monoid ) ; -GrB_Info GrB_Matrix_extractElement_INT32 // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_UINT16 // create a new uint16 monoid ( - int32_t *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + uint16_t identity, // identity value of the monoid + uint16_t terminal // terminal value of the monoid ) ; -GrB_Info GrB_Matrix_extractElement_UINT32 // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_INT32 // create a new int32 monoid ( - uint32_t *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + int32_t identity, // identity value of the monoid + int32_t terminal // terminal value of the monoid ) ; -GrB_Info GrB_Matrix_extractElement_INT64 // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_UINT32 // create a new uint32 monoid ( - int64_t *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + uint32_t identity, // identity value of the monoid + uint32_t terminal // terminal value of the monoid ) ; -GrB_Info GrB_Matrix_extractElement_UINT64 // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_INT64 // create a new int64 monoid ( - uint64_t *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + int64_t identity, // identity value of the monoid + int64_t terminal // terminal value of the monoid ) ; -GrB_Info GrB_Matrix_extractElement_FP32 // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_UINT64 // create a new uint64 monoid ( - float *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + uint64_t identity, // identity value of the monoid + uint64_t terminal // terminal value of the monoid ) ; -GrB_Info GrB_Matrix_extractElement_FP64 // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_FP32 // create a new float monoid ( - double *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + float identity, // identity value of the monoid + float terminal // terminal value of the monoid ) ; -GrB_Info GxB_Matrix_extractElement_FC32 // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_FP64 // create a new double monoid ( - GxB_FC32_t *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + double identity, // identity value of the monoid + double terminal // terminal value of the monoid ) ; -GrB_Info GxB_Matrix_extractElement_FC64 // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_FC32 // create a new float complex monoid ( - GxB_FC64_t *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + GxB_FC32_t identity, // identity value of the monoid + GxB_FC32_t terminal // terminal value of the monoid ) ; -GrB_Info GrB_Matrix_extractElement_UDT // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_FC64 // create a new double complex monoid ( - void *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + GxB_FC64_t identity, // identity value of the monoid + GxB_FC64_t terminal // terminal value of the monoid ) ; -GrB_Info GrB_Matrix_extractElement_Scalar // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_UDT // create a monoid with a user type ( - GrB_Scalar x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + void *identity, // identity value of the monoid + void *terminal // terminal value of the monoid ) ; -// Type-generic version: x can be a pointer to any supported C type or void * -// for a user-defined type. +// Type-generic method for creating a new monoid with a terminal value: /* -GrB_Info GrB_Matrix_extractElement // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new // create a monoid ( - *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + identity, // identity value of the monoid + terminal // terminal value of the monoid ) ; */ #if GxB_STDC_VERSION >= 201112L -#define GrB_Matrix_extractElement(x,A,i,j) \ +#define GxB_Monoid_terminal_new(monoid,op,identity,terminal) \ _Generic \ ( \ - (x), \ - GB_PCASES (GrB, Matrix_extractElement), \ - default: GrB_Matrix_extractElement_Scalar \ + (identity), \ + GB_CASES (GxB, Monoid_terminal_new) \ ) \ - (x, A, i, j) + (monoid, op, identity, terminal) #endif -// GxB_Matrix_isStoredElement determines if A(i,j) is present in the structure -// of the matrix A, as a stored element. It does not return the value. It -// returns GrB_SUCCESS if the element is present, or GrB_NO_VALUE otherwise. +// historical; use GrB_get instead: +GrB_Info GxB_Monoid_operator (GrB_BinaryOp *op, GrB_Monoid monoid) ; +GrB_Info GxB_Monoid_identity (void *identity, GrB_Monoid monoid) ; +GrB_Info GxB_Monoid_terminal (bool *, void *terminal, GrB_Monoid monoid) ; -GrB_Info GxB_Matrix_isStoredElement // determine if A(i,j) is a stored element +GrB_Info GrB_Monoid_free // free a user-created monoid ( - const GrB_Matrix A, // matrix to check - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid // handle of monoid to free ) ; -//------------------------------------------------------------------------------ -// GrB_Matrix_removeElement -//------------------------------------------------------------------------------ +//============================================================================== +// GrB_Semiring +//============================================================================== -// GrB_Matrix_removeElement (A,i,j) removes the entry A(i,j) from the matrix A. +GrB_Info GrB_Semiring_new // create a semiring +( + GrB_Semiring *semiring, // handle of semiring to create + GrB_Monoid add, // add monoid of the semiring + GrB_BinaryOp multiply // multiply operator of the semiring +) ; -GrB_Info GrB_Matrix_removeElement +// historical; use GrB_get instead: +GrB_Info GxB_Semiring_add (GrB_Monoid *add, GrB_Semiring semiring) ; +GrB_Info GxB_Semiring_multiply (GrB_BinaryOp *multiply, GrB_Semiring semiring) ; + +GrB_Info GrB_Semiring_free // free a user-created semiring ( - GrB_Matrix C, // matrix to remove entry from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Semiring *semiring // handle of semiring to free +) ; + +//============================================================================== +// GrB_Scalar: a GraphBLAS scalar +//============================================================================== + +// These methods create, free, copy, and clear a GrB_Scalar. The nvals, +// and type methods return basic information about a GrB_Scalar. + +GrB_Info GrB_Scalar_new // create a new GrB_Scalar with no entry +( + GrB_Scalar *s, // handle of GrB_Scalar to create + GrB_Type type // type of GrB_Scalar to create +) ; + +GrB_Info GrB_Scalar_dup // make an exact copy of a GrB_Scalar +( + GrB_Scalar *s, // handle of output GrB_Scalar to create + const GrB_Scalar t // input GrB_Scalar to copy +) ; + +GrB_Info GrB_Scalar_clear // clear a GrB_Scalar of its entry +( // type remains unchanged. + GrB_Scalar s // GrB_Scalar to clear +) ; + +GrB_Info GrB_Scalar_nvals // get the number of entries in a GrB_Scalar +( + GrB_Index *nvals, // GrB_Scalar has nvals entries (0 or 1) + const GrB_Scalar s // GrB_Scalar to query +) ; + +// historical; use GrB_get instead: +GrB_Info GxB_Scalar_type (GrB_Type *type, const GrB_Scalar s) ; +GrB_Info GxB_Scalar_type_name (char *type_name, const GrB_Scalar s) ; + +GrB_Info GxB_Scalar_memoryUsage // return # of bytes used for a scalar +( + size_t *size, // # of bytes used by the scalar s + const GrB_Scalar s // GrB_Scalar to query +) ; + +GrB_Info GrB_Scalar_free // free a GrB_Scalar +( + GrB_Scalar *s // handle of GrB_Scalar to free ) ; +// historical names identical to GrB_Scalar_methods above: +GrB_Info GxB_Scalar_new (GrB_Scalar *s, GrB_Type type) ; +GrB_Info GxB_Scalar_dup (GrB_Scalar *s, const GrB_Scalar t) ; +GrB_Info GxB_Scalar_clear (GrB_Scalar s) ; +GrB_Info GxB_Scalar_nvals (GrB_Index *nvals, const GrB_Scalar s) ; +GrB_Info GxB_Scalar_free (GrB_Scalar *s) ; + //------------------------------------------------------------------------------ -// GrB_Matrix_extractTuples +// GrB_Scalar_setElement //------------------------------------------------------------------------------ -// Extracts all tuples from a matrix, like [I,J,X] = find (A). If -// any parameter I, J and/or X is NULL, then that component is not extracted. -// For example, to extract just the row and col indices, pass I and J as -// non-NULL, and X as NULL. This is like [I,J,~] = find (A). +// Set a single GrB_Scalar s, from a user scalar x: s = x, typecasting from the +// type of x to the type of w as needed. -GrB_Info GrB_Matrix_extractTuples_BOOL // [I,J,X] = find (A) +GrB_Info GrB_Scalar_setElement_BOOL // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - bool *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + bool x // user scalar to assign to s ) ; -GrB_Info GrB_Matrix_extractTuples_INT8 // [I,J,X] = find (A) +GrB_Info GrB_Scalar_setElement_INT8 // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - int8_t *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + int8_t x // user scalar to assign to s ) ; -GrB_Info GrB_Matrix_extractTuples_UINT8 // [I,J,X] = find (A) +GrB_Info GrB_Scalar_setElement_UINT8 // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - uint8_t *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + uint8_t x // user scalar to assign to s ) ; -GrB_Info GrB_Matrix_extractTuples_INT16 // [I,J,X] = find (A) +GrB_Info GrB_Scalar_setElement_INT16 // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - int16_t *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + int16_t x // user scalar to assign to s ) ; -GrB_Info GrB_Matrix_extractTuples_UINT16 // [I,J,X] = find (A) +GrB_Info GrB_Scalar_setElement_UINT16 // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - uint16_t *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + uint16_t x // user scalar to assign to s ) ; -GrB_Info GrB_Matrix_extractTuples_INT32 // [I,J,X] = find (A) +GrB_Info GrB_Scalar_setElement_INT32 // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - int32_t *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + int32_t x // user scalar to assign to s ) ; -GrB_Info GrB_Matrix_extractTuples_UINT32 // [I,J,X] = find (A) +GrB_Info GrB_Scalar_setElement_UINT32 // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - uint32_t *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + uint32_t x // user scalar to assign to s ) ; -GrB_Info GrB_Matrix_extractTuples_INT64 // [I,J,X] = find (A) +GrB_Info GrB_Scalar_setElement_INT64 // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - int64_t *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + int64_t x // user scalar to assign to s ) ; -GrB_Info GrB_Matrix_extractTuples_UINT64 // [I,J,X] = find (A) +GrB_Info GrB_Scalar_setElement_UINT64 // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - uint64_t *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + uint64_t x // user scalar to assign to s ) ; -GrB_Info GrB_Matrix_extractTuples_FP32 // [I,J,X] = find (A) +GrB_Info GrB_Scalar_setElement_FP32 // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - float *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + float x // user scalar to assign to s ) ; -GrB_Info GrB_Matrix_extractTuples_FP64 // [I,J,X] = find (A) +GrB_Info GrB_Scalar_setElement_FP64 // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - double *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + double x // user scalar to assign to s ) ; -GrB_Info GxB_Matrix_extractTuples_FC32 // [I,J,X] = find (A) +GrB_Info GxB_Scalar_setElement_FC32 // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - GxB_FC32_t *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + GxB_FC32_t x // user scalar to assign to s ) ; -GrB_Info GxB_Matrix_extractTuples_FC64 // [I,J,X] = find (A) +GrB_Info GxB_Scalar_setElement_FC64 // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - GxB_FC64_t *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + GxB_FC64_t x // user scalar to assign to s ) ; -GrB_Info GrB_Matrix_extractTuples_UDT // [I,J,X] = find (A) +GrB_Info GrB_Scalar_setElement_UDT // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - void *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + void *x // user scalar to assign to s ) ; -// Type-generic version: X can be a pointer to any supported C type or void * -// for a user-defined type. +// historical names identical to GrB_Scalar_methods above: +GrB_Info GxB_Scalar_setElement_BOOL (GrB_Scalar s, bool x) ; +GrB_Info GxB_Scalar_setElement_INT8 (GrB_Scalar s, int8_t x) ; +GrB_Info GxB_Scalar_setElement_INT16 (GrB_Scalar s, int16_t x) ; +GrB_Info GxB_Scalar_setElement_INT32 (GrB_Scalar s, int32_t x) ; +GrB_Info GxB_Scalar_setElement_INT64 (GrB_Scalar s, int64_t x) ; +GrB_Info GxB_Scalar_setElement_UINT8 (GrB_Scalar s, uint8_t x) ; +GrB_Info GxB_Scalar_setElement_UINT16 (GrB_Scalar s, uint16_t x) ; +GrB_Info GxB_Scalar_setElement_UINT32 (GrB_Scalar s, uint32_t x) ; +GrB_Info GxB_Scalar_setElement_UINT64 (GrB_Scalar s, uint64_t x) ; +GrB_Info GxB_Scalar_setElement_FP32 (GrB_Scalar s, float x) ; +GrB_Info GxB_Scalar_setElement_FP64 (GrB_Scalar s, double x) ; +GrB_Info GxB_Scalar_setElement_UDT (GrB_Scalar s, void *x) ; + +// Type-generic version: x can be any supported C type or void * for a +// user-defined type. /* -GrB_Info GrB_Matrix_extractTuples // [I,J,X] = find (A) +GrB_Info GrB_Scalar_setElement // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + x // user scalar to assign to s ) ; */ #if GxB_STDC_VERSION >= 201112L -#define GrB_Matrix_extractTuples(Ilist,J,X,nvals,A) \ - _Generic \ - ( \ - (X), \ - GB_PCASES (GrB, Matrix_extractTuples) \ - ) \ - (Ilist, J, X, nvals, A) +#define GrB_Scalar_setElement(s,x) \ + _Generic \ + ( \ + (x), \ + GB_CASES (GrB, Scalar_setElement) \ + ) \ + (s, x) + +// historical; use GrB_Scalar_setElement instead: +#define GxB_Scalar_setElement(s,x) GrB_Scalar_setElement (s, x) #endif //------------------------------------------------------------------------------ -// GxB_Matrix_concat and GxB_Matrix_split +// GrB_Scalar_extractElement //------------------------------------------------------------------------------ -// GxB_Matrix_concat concatenates an array of matrices (Tiles) into a single -// GrB_Matrix C. - -// Tiles is an m-by-n dense array of matrices held in row-major format, where -// Tiles [i*n+j] is the (i,j)th tile, and where m > 0 and n > 0 must hold. Let -// A{i,j} denote the (i,j)th tile. The matrix C is constructed by -// concatenating these tiles together, as: +// Extract a single entry from a GrB_Scalar, x = s, typecasting from the type +// of s to the type of x as needed. -// C = [ A{0,0} A{0,1} A{0,2} ... A{0,n-1} -// A{1,0} A{1,1} A{1,2} ... A{1,n-1} -// ... -// A{m-1,0} A{m-1,1} A{m-1,2} ... A{m-1,n-1} ] +GrB_Info GrB_Scalar_extractElement_BOOL // x = s +( + bool *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from +) ; -// On input, the matrix C must already exist. Any existing entries in C are -// discarded. C must have dimensions nrows by ncols where nrows is the sum of -// # of rows in the matrices A{i,0} for all i, and ncols is the sum of the # of -// columns in the matrices A{0,j} for all j. All matrices in any given tile -// row i must have the same number of rows (that is, nrows(A{i,0}) must equal -// nrows(A{i,j}) for all j), and all matrices in any given tile column j must -// have the same number of columns (that is, ncols(A{0,j}) must equal -// ncols(A{i,j}) for all i). +GrB_Info GrB_Scalar_extractElement_INT8 // x = s +( + int8_t *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from +) ; -// The type of C is unchanged, and all matrices A{i,j} are typecasted into the -// type of C. Any settings made to C by GrB_set (format by row -// or by column, bitmap switch, hyper switch, and sparsity control) are -// unchanged. +GrB_Info GrB_Scalar_extractElement_UINT8 // x = s +( + uint8_t *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from +) ; -GrB_Info GxB_Matrix_concat // concatenate a 2D array of matrices +GrB_Info GrB_Scalar_extractElement_INT16 // x = s ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix *Tiles, // 2D row-major array of size m-by-n - const GrB_Index m, - const GrB_Index n, - const GrB_Descriptor desc // unused, except threading control + int16_t *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from ) ; -// GxB_Matrix_split does the opposite of GxB_Matrix_concat. It splits a single -// input matrix A into a 2D array of tiles. On input, the Tiles array must be -// a non-NULL pointer to a previously allocated array of size at least m*n -// where both m and n must be > 0. The Tiles_nrows array has size m, and -// Tiles_ncols has size n. The (i,j)th tile has dimension -// Tiles_nrows[i]-by-Tiles_ncols[j]. The sum of Tiles_nrows [0:m-1] must equal -// the number of rows of A, and the sum of Tiles_ncols [0:n-1] must equal the -// number of columns of A. The type of each tile is the same as the type of A; -// no typecasting is done. +GrB_Info GrB_Scalar_extractElement_UINT16 // x = s +( + uint16_t *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from +) ; -GrB_Info GxB_Matrix_split // split a matrix into 2D array of matrices +GrB_Info GrB_Scalar_extractElement_INT32 // x = s ( - GrB_Matrix *Tiles, // 2D row-major array of size m-by-n - const GrB_Index m, - const GrB_Index n, - const GrB_Index *Tile_nrows, // array of size m - const GrB_Index *Tile_ncols, // array of size n - const GrB_Matrix A, // input matrix to split - const GrB_Descriptor desc // unused, except threading control + int32_t *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from ) ; -//------------------------------------------------------------------------------ -// GxB_Matrix_diag, GxB_Vector_diag, GrB_Matrix_diag -//------------------------------------------------------------------------------ +GrB_Info GrB_Scalar_extractElement_UINT32 // x = s +( + uint32_t *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from +) ; -// GrB_Matrix_diag constructs a new matrix from a vector. Let n be the length -// of the v vector, from GrB_Vector_size (&n, v). If k = 0, then C is an -// n-by-n diagonal matrix with the entries from v along the main diagonal of C, -// with C(i,i) = v(i). If k is nonzero, C is square with dimension n+abs(k). -// If k is positive, it denotes diagonals above the main diagonal, with -// C(i,i+k) = v(i). If k is negative, it denotes diagonals below the main -// diagonal of C, with C(i-k,i) = v(i). C is constructed with the same type -// as v. +GrB_Info GrB_Scalar_extractElement_INT64 // x = s +( + int64_t *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from +) ; -GrB_Info GrB_Matrix_diag // build a diagonal matrix from a vector +GrB_Info GrB_Scalar_extractElement_UINT64 // x = s ( - GrB_Matrix *C, // output matrix - const GrB_Vector v, // input vector - int64_t k + uint64_t *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from ) ; -// GrB_Matrix_diag is like GxB_Matrix_diag (&C, v, k, NULL), except that C must -// already exist on input, of the correct size. Any existing entries in C are -// discarded. The type of C is preserved, so that if the type of C and v -// differ, the entries are typecasted into the type of C. Any settings made to -// C by GrB_set (format by row or by column, bitmap switch, hyper -// switch, and sparsity control) are unchanged. +GrB_Info GrB_Scalar_extractElement_FP32 // x = s +( + float *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from +) ; -GrB_Info GxB_Matrix_diag // construct a diagonal matrix from a vector +GrB_Info GrB_Scalar_extractElement_FP64 // x = s ( - GrB_Matrix C, // output matrix - const GrB_Vector v, // input vector - int64_t k, - const GrB_Descriptor desc // to specify # of threads + double *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from ) ; -// GxB_Vector_diag extracts a vector v from an input matrix A, which may be -// rectangular. If k = 0, the main diagonal of A is extracted; k > 0 denotes -// diagonals above the main diagonal of A, and k < 0 denotes diagonals below -// the main diagonal of A. Let A have dimension m-by-n. If k is in the range -// 0 to n-1, then v has length min(m,n-k). If k is negative and in the range -// -1 to -m+1, then v has length min(m+k,n). If k is outside these ranges, -// v has length 0 (this is not an error). +GrB_Info GxB_Scalar_extractElement_FC32 // x = s +( + GxB_FC32_t *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from +) ; -// v must already exist on input, of the correct length; that is -// GrB_Vector_size (&len,v) must return len = 0 if k >= n or k <= -m, len = -// min(m,n-k) if k is in the range 0 to n-1, and len = min(m+k,n) if k is in -// the range -1 to -m+1. Any existing entries in v are discarded. The type of -// v is preserved, so that if the type of A and v differ, the entries are -// typecasted into the type of v. Any settings made to v by -// GrB_set (bitmap switch and sparsity control) are unchanged. +GrB_Info GxB_Scalar_extractElement_FC64 // x = s +( + GxB_FC64_t *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from +) ; -GrB_Info GxB_Vector_diag // extract a diagonal from a matrix, as a vector +GrB_Info GrB_Scalar_extractElement_UDT // x = s ( - GrB_Vector v, // output vector - const GrB_Matrix A, // input matrix - int64_t k, - const GrB_Descriptor desc // unused, except threading control + void *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from ) ; -#endif // GB_CUDA_FOLDER +// historical names identical to GrB_Scalar_methods above: +GrB_Info GxB_Scalar_extractElement_BOOL (bool *x, const GrB_Scalar s) ; +GrB_Info GxB_Scalar_extractElement_INT8 (int8_t *x, const GrB_Scalar s) ; +GrB_Info GxB_Scalar_extractElement_INT16 (int16_t *x, const GrB_Scalar s) ; +GrB_Info GxB_Scalar_extractElement_INT32 (int32_t *x, const GrB_Scalar s) ; +GrB_Info GxB_Scalar_extractElement_INT64 (int64_t *x, const GrB_Scalar s) ; +GrB_Info GxB_Scalar_extractElement_UINT8 (uint8_t *x, const GrB_Scalar s) ; +GrB_Info GxB_Scalar_extractElement_UINT16 (uint16_t *x, const GrB_Scalar s) ; +GrB_Info GxB_Scalar_extractElement_UINT32 (uint32_t *x, const GrB_Scalar s) ; +GrB_Info GxB_Scalar_extractElement_UINT64 (uint64_t *x, const GrB_Scalar s) ; +GrB_Info GxB_Scalar_extractElement_FP32 (float *x, const GrB_Scalar s) ; +GrB_Info GxB_Scalar_extractElement_FP64 (double *x, const GrB_Scalar s) ; +GrB_Info GxB_Scalar_extractElement_UDT (void *x, const GrB_Scalar s) ; -//============================================================================== -// SuiteSparse:GraphBLAS options -//============================================================================== +// Type-generic version: x can be a pointer to any supported C type or void * +// for a user-defined type. -// The following options modify how SuiteSparse:GraphBLAS stores and operates -// on its matrices. The GrB_get/set methods allow the user to suggest how the -// internal representation of a matrix, or all matrices, should be held. These -// options have no effect on the result (except for minor roundoff differences -// for floating-point types). They only affect the time and memory usage of the -// computations. +/* -typedef enum // for global options or matrix options -{ +GrB_Info GrB_Scalar_extractElement // x = s +( + *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from +) ; - //------------------------------------------------------------ - // GrB_get / GrB_set for GrB_Matrix and GrB_GLOBAL: - //------------------------------------------------------------ +*/ - GxB_HYPER_SWITCH = 7000, // switch to hypersparse (double value) - GxB_HYPER_HASH = 7048, // hyper_hash control (int64 value) - GxB_BITMAP_SWITCH = 7001, // switch to bitmap (double value) - GxB_FORMAT = 7002, // historical; use GrB_STORAGE_ORIENTATION_HINT +#if GxB_STDC_VERSION >= 201112L +#define GrB_Scalar_extractElement(x,s) \ + _Generic \ + ( \ + (x), \ + GB_PCASES (GrB, Scalar_extractElement) \ + ) \ + (x, s) - //------------------------------------------------------------ - // GrB_get for GrB_GLOBAL: - //------------------------------------------------------------ +// historical; use GrB_Scalar_extractElement instead: +#define GxB_Scalar_extractElement(x,s) GrB_Scalar_extractElement (x, s) +#endif - GxB_MODE = 7003, // historical; use GrB_BLOCKING_MODE - GxB_LIBRARY_NAME = 7004, // historical; use GrB_NAME - GxB_LIBRARY_VERSION = 7005, // historical; use GrB_LIBRARY_VER_* - GxB_LIBRARY_DATE = 7006, // date of the library (char *) - GxB_LIBRARY_ABOUT = 7007, // about the library (char *) - GxB_LIBRARY_URL = 7008, // URL for the library (char *) - GxB_LIBRARY_LICENSE = 7009, // license of the library (char *) - GxB_LIBRARY_COMPILE_DATE = 7010, // date library was compiled (char *) - GxB_LIBRARY_COMPILE_TIME = 7011, // time library was compiled (char *) - GxB_API_VERSION = 7012, // historical; use GrB_API_VER_* - GxB_API_DATE = 7013, // date of the API (char *) - GxB_API_ABOUT = 7014, // about the API (char *) - GxB_API_URL = 7015, // URL for the API (char *) - GxB_COMPILER_VERSION = 7016, // compiler version (3 int's) - GxB_COMPILER_NAME = 7017, // compiler name (char *) - GxB_LIBRARY_OPENMP = 7018, // library compiled with OpenMP - GxB_MALLOC_FUNCTION = 7037, // malloc function pointer - GxB_CALLOC_FUNCTION = 7038, // calloc function pointer - GxB_REALLOC_FUNCTION = 7039, // realloc function pointer - GxB_FREE_FUNCTION = 7040, // free function pointer +//============================================================================== +// GrB_Vector: a GraphBLAS vector +//============================================================================== - //------------------------------------------------------------ - // GrB_get / GrB_set for GrB_GLOBAL: - //------------------------------------------------------------ +// These methods create, free, copy, and clear a vector. The size, nvals, +// and type methods return basic information about a vector. - GxB_GLOBAL_NTHREADS = GxB_NTHREADS, // max number of threads to use - GxB_GLOBAL_CHUNK = GxB_CHUNK, // chunk size for small problems. - GxB_GLOBAL_GPU_ID = GxB_GPU_ID, // which GPU to use (DRAFT) +GrB_Info GrB_Vector_new // create a new vector with no entries +( + GrB_Vector *v, // handle of vector to create + GrB_Type type, // type of vector to create + GrB_Index n // vector dimension is n-by-1 + // (n must be <= GrB_INDEX_MAX+1) +) ; - GxB_BURBLE = 7019, // diagnostic output - GxB_PRINTF = 7020, // printf function diagnostic output - GxB_FLUSH = 7021, // flush function diagnostic output - GxB_MEMORY_POOL = 7022, // no longer used - GxB_PRINT_1BASED = 7023, // print matrices as 0-based or 1-based +GrB_Info GrB_Vector_dup // make an exact copy of a vector +( + GrB_Vector *w, // handle of output vector to create + const GrB_Vector u // input vector to copy +) ; - GxB_JIT_C_COMPILER_NAME = 7024, // CPU JIT C compiler name - GxB_JIT_C_COMPILER_FLAGS = 7025, // CPU JIT C compiler flags - GxB_JIT_C_LINKER_FLAGS = 7026, // CPU JIT C linker flags - GxB_JIT_C_LIBRARIES = 7027, // CPU JIT C libraries - GxB_JIT_C_PREFACE = 7028, // CPU JIT C preface - GxB_JIT_C_CONTROL = 7029, // CPU JIT C control - GxB_JIT_CACHE_PATH = 7030, // CPU/CUDA JIT path for compiled kernels - GxB_JIT_C_CMAKE_LIBS = 7031, // CPU JIT C libraries when using cmake - GxB_JIT_USE_CMAKE = 7032, // CPU JIT: use cmake or direct compile - GxB_JIT_ERROR_LOG = 7033, // CPU JIT: error log file - - GxB_JIT_CUDA_PREFACE = 7100, // CUDA JIT C++ preface - - //------------------------------------------------------------ - // GrB_get for GrB_Matrix: - //------------------------------------------------------------ - - GxB_SPARSITY_STATUS = 7034, // hyper, sparse, bitmap or full (1,2,4,8) - GxB_IS_HYPER = 7035, // historical; use GxB_SPARSITY_STATUS - - //------------------------------------------------------------ - // GrB_get/GrB_set for GrB_Matrix: - //------------------------------------------------------------ - - GxB_SPARSITY_CONTROL = 7036, // sparsity control: 0 to 15; see below - -} GxB_Option_Field ; - -// for GxB_JIT_C_CONTROL: -typedef enum -{ - GxB_JIT_OFF = 0, // do not use the JIT: free all JIT kernels if loaded - GxB_JIT_PAUSE = 1, // do not run JIT kernels but keep any loaded - GxB_JIT_RUN = 2, // run JIT kernels if already loaded; no load/compile - GxB_JIT_LOAD = 3, // able to load and run JIT kernels; may not compile - GxB_JIT_ON = 4, // full JIT: able to compile, load, and run -} -GxB_JIT_Control ; - -// GxB_FORMAT is historical, but it can be by row or by column: -typedef enum -{ - GxB_BY_ROW = 0, // CSR: compressed sparse row format - GxB_BY_COL = 1, // CSC: compressed sparse column format - GxB_NO_FORMAT = -1 // format not defined -} -GxB_Format_Value ; - -// The default format is by row. These constants are defined as GB_GLOBAL -// const, so that if SuiteSparse:GraphBLAS is recompiled with a different -// default format, and the application is relinked but not recompiled, it will -// acquire the new default values. -GB_GLOBAL const GxB_Format_Value GxB_FORMAT_DEFAULT ; - -// the default hyper_switch parameter -GB_GLOBAL const double GxB_HYPER_DEFAULT ; +GrB_Info GrB_Vector_clear // clear a vector of all entries; +( // type and dimension remain unchanged. + GrB_Vector v // vector to clear +) ; -// GxB_SPARSITY_CONTROL can be any sum or bitwise OR of these 4 values: -#define GxB_HYPERSPARSE 1 // store matrix in hypersparse form -#define GxB_SPARSE 2 // store matrix as sparse form (compressed vector) -#define GxB_BITMAP 4 // store matrix as a bitmap -#define GxB_FULL 8 // store matrix as full; all entries must be present +GrB_Info GrB_Vector_size // get the dimension of a vector +( + GrB_Index *n, // vector dimension is n-by-1 + const GrB_Vector v // vector to query +) ; -// size of b array for GxB_set/get (GxB_BITMAP_SWITCH, b) -#define GxB_NBITMAP_SWITCH 8 // size of bitmap_switch parameter array +GrB_Info GrB_Vector_nvals // get the number of entries in a vector +( + GrB_Index *nvals, // vector has nvals entries + const GrB_Vector v // vector to query +) ; -// any sparsity value: -#define GxB_ANY_SPARSITY (GxB_HYPERSPARSE + GxB_SPARSE + GxB_BITMAP + GxB_FULL) +// historical; use GrB_get instead: +GrB_Info GxB_Vector_type (GrB_Type *type, const GrB_Vector v) ; +GrB_Info GxB_Vector_type_name (char *type_name, const GrB_Vector v) ; -// the default sparsity control is any format: -#define GxB_AUTO_SPARSITY GxB_ANY_SPARSITY +GrB_Info GxB_Vector_memoryUsage // return # of bytes used for a vector +( + size_t *size, // # of bytes used by the vector v + const GrB_Vector v // vector to query +) ; -// GrB_set (A, scontrol, GxB_SPARSITY_CONTROL) provides hints -// about which data structure GraphBLAS should use for the matrix A: -// -// GxB_AUTO_SPARSITY: GraphBLAS selects automatically. -// GxB_HYPERSPARSE: always hypersparse, taking O(nvals(A)) space. -// GxB_SPARSE: always in a sparse struture: compressed-sparse row/column, -// taking O(nrows+nvals(A)) space if stored by row, or -// O(ncols+nvals(A)) if stored by column. -// GxB_BITMAP: always in a bitmap struture, taking O(nrows*ncols) space. -// GxB_FULL: always in a full structure, taking O(nrows*ncols) space, -// unless not all entries are present, in which case the bitmap -// storage is used. -// -// These options can be summed. For example, to allow a matrix to be sparse -// or hypersparse, but not bitmap or full, use GxB_SPARSE + GxB_HYPERSPARSE. -// Since GxB_FULL can only be used when all entries are present, matrices with -// the just GxB_FULL control setting are stored in bitmap form if any entries -// are not present. -// -// Only the least 4 bits of the sparsity control are considered, so the -// formats can be bitwise negated. For example, to allow for any format -// except full, use ~GxB_FULL. -// -// GrB_get (A, &sparsity, GxB_SPARSITY_STATUS) returns the -// current data structure currently used for the matrix A (either hypersparse, -// sparse, bitmap, or full). -// -// GrB_get (A, &scontrol, GxB_SPARSITY_CONTROL) returns the hint -// for how A should be stored (hypersparse, sparse, bitmap, or full, or any -// combination). +GrB_Info GxB_Vector_iso // return iso status of a vector +( + bool *iso, // true if the vector is iso-valued + const GrB_Vector v // vector to query +) ; -// GxB_HYPER_SWITCH: -// If the matrix or vector structure can be sparse or hypersparse, the -// GxB_HYPER_SWITCH parameter controls when each of these structures are -// used. The parameter is not used if the matrix or vector is full or -// bitmap. -// -// Let k be the actual number of non-empty vectors (with at least one -// entry). This value k is not dependent on whether or not the matrix is -// stored in hypersparse structure. Let n be the number of vectors (the # -// of columns if CSC, or rows if CSR). Let h be the value of the -// GxB_HYPER_SWITCH setting of the matrix. -// -// If a matrix is currently hypersparse, it can be converted to -// non-hypersparse if (n <= 1 || k > 2*n*h). Otherwise it stays -// hypersparse. If (n <= 1) the matrix is always stored as -// non-hypersparse. -// -// If currently non-hypersparse, it can be converted to hypersparse if (n -// > 1 && k <= n*h). Otherwise, it stays non-hypersparse. If (n <= 1) -// the matrix always remains non-hypersparse. -// -// Setting GxB_HYPER_SWITCH to GxB_ALWAYS_HYPER or GxB_NEVER_HYPER ensures -// a matrix always stays hypersparse, or always stays non-hypersparse, -// respectively. +GrB_Info GrB_Vector_free // free a vector +( + GrB_Vector *v // handle of vector to free +) ; -GB_GLOBAL const double GxB_ALWAYS_HYPER, GxB_NEVER_HYPER ; +//------------------------------------------------------------------------------ +// GrB_Vector_build +//------------------------------------------------------------------------------ -//============================================================================== -// GxB_Context: for managing computational resources -//============================================================================== +// GrB_Vector_build: w = sparse (I,1,X), but using any +// associative operator to assemble duplicate entries. -typedef struct GB_Context_opaque *GxB_Context ; +GrB_Info GrB_Vector_build_BOOL // build a vector from (I,X) tuples +( + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const bool *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates +) ; -// GxB_CONTEXT_WORLD is the default Context for all user threads. -GB_GLOBAL GxB_Context GxB_CONTEXT_WORLD ; +GrB_Info GrB_Vector_build_INT8 // build a vector from (I,X) tuples +( + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const int8_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates +) ; -typedef enum -{ - GxB_CONTEXT_NTHREADS = GxB_NTHREADS, // max number of threads to use. - // If <= 0, then one thread is used. +GrB_Info GrB_Vector_build_UINT8 // build a vector from (I,X) tuples +( + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const uint8_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates +) ; - GxB_CONTEXT_CHUNK = GxB_CHUNK, // chunk size for small problems. - // If < 1, then the default is used. +GrB_Info GrB_Vector_build_INT16 // build a vector from (I,X) tuples +( + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const int16_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates +) ; - // GPU control (DRAFT: in progress, do not use) - GxB_CONTEXT_GPU_ID = GxB_GPU_ID, -} -GxB_Context_Field ; +GrB_Info GrB_Vector_build_UINT16 // build a vector from (I,X) tuples +( + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const uint16_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates +) ; -#ifndef GB_CUDA_FOLDER +GrB_Info GrB_Vector_build_INT32 // build a vector from (I,X) tuples +( + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const int32_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates +) ; -GrB_Info GxB_Context_new // create a new Context +GrB_Info GrB_Vector_build_UINT32 // build a vector from (I,X) tuples ( - GxB_Context *Context // handle of Context to create + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const uint32_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -GrB_Info GxB_Context_free // free a Context +GrB_Info GrB_Vector_build_INT64 // build a vector from (I,X) tuples ( - GxB_Context *Context // handle of Context to free + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const int64_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -GrB_Info GxB_Context_engage // engage a Context +GrB_Info GrB_Vector_build_UINT64 // build a vector from (I,X) tuples ( - GxB_Context Context // Context to engage + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const uint64_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -GrB_Info GxB_Context_disengage // disengage a Context +GrB_Info GrB_Vector_build_FP32 // build a vector from (I,X) tuples ( - GxB_Context Context // Context to disengage + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const float *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -//============================================================================== -// GxB_set and GxB_get: historical; use GrB_set and GrB_get instead -//============================================================================== +GrB_Info GrB_Vector_build_FP64 // build a vector from (I,X) tuples +( + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const double *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates +) ; -// historical: use GrB_set and GrB_get instead of these methods: -GrB_Info GxB_Matrix_Option_set (GrB_Matrix, GxB_Option_Field, ...) ; -GrB_Info GxB_Matrix_Option_set_INT32 (GrB_Matrix, GxB_Option_Field, int32_t) ; -GrB_Info GxB_Matrix_Option_set_FP64 (GrB_Matrix, GxB_Option_Field, double) ; -GrB_Info GxB_Matrix_Option_get (GrB_Matrix, GxB_Option_Field, ...) ; -GrB_Info GxB_Matrix_Option_get_INT32 (GrB_Matrix, GxB_Option_Field, int32_t *) ; -GrB_Info GxB_Matrix_Option_get_FP64 (GrB_Matrix, GxB_Option_Field, double *) ; -GrB_Info GxB_Vector_Option_set (GrB_Vector, GxB_Option_Field, ...) ; -GrB_Info GxB_Vector_Option_set_INT32 (GrB_Vector, GxB_Option_Field, int32_t) ; -GrB_Info GxB_Vector_Option_set_FP64 (GrB_Vector, GxB_Option_Field, double) ; -GrB_Info GxB_Vector_Option_get (GrB_Vector, GxB_Option_Field, ...) ; -GrB_Info GxB_Vector_Option_get_INT32 (GrB_Vector, GxB_Option_Field, int32_t *) ; -GrB_Info GxB_Vector_Option_get_FP64 (GrB_Vector, GxB_Option_Field, double *) ; -GrB_Info GxB_Global_Option_set (GxB_Option_Field, ...) ; -GrB_Info GxB_Global_Option_set_INT32 (GxB_Option_Field, int32_t) ; -GrB_Info GxB_Global_Option_set_FP64 (GxB_Option_Field, double) ; -GrB_Info GxB_Global_Option_set_FP64_ARRAY (GxB_Option_Field, double *) ; -GrB_Info GxB_Global_Option_set_INT64_ARRAY (GxB_Option_Field, int64_t *) ; -GrB_Info GxB_Global_Option_set_CHAR (GxB_Option_Field, const char *) ; -GrB_Info GxB_Global_Option_set_FUNCTION (GxB_Option_Field, void *) ; -GrB_Info GxB_Global_Option_get (GxB_Option_Field, ...) ; -GrB_Info GxB_Global_Option_get_INT32 (GxB_Option_Field, int32_t *) ; -GrB_Info GxB_Global_Option_get_FP64 (GxB_Option_Field, double *) ; -GrB_Info GxB_Global_Option_get_INT64 (GxB_Option_Field, int64_t *) ; -GrB_Info GxB_Global_Option_get_CHAR (GxB_Option_Field, const char **) ; -GrB_Info GxB_Global_Option_get_FUNCTION (GxB_Option_Field, void **) ; -GrB_Info GxB_Context_set_INT32 (GxB_Context, GxB_Context_Field, int32_t) ; -GrB_Info GxB_Context_set_FP64 (GxB_Context, GxB_Context_Field, double) ; -GrB_Info GxB_Context_set (GxB_Context, GxB_Context_Field, ...) ; -GrB_Info GxB_Context_get_INT32 (GxB_Context, GxB_Context_Field, int32_t *) ; -GrB_Info GxB_Context_get_FP64 (GxB_Context, GxB_Context_Field, double *) ; -GrB_Info GxB_Context_get (GxB_Context, GxB_Context_Field, ...) ; +GrB_Info GxB_Vector_build_FC32 // build a vector from (I,X) tuples +( + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const GxB_FC32_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates +) ; -#if GxB_STDC_VERSION >= 201112L -#define GxB_set(arg1,...) \ - _Generic \ - ( \ - (arg1), \ - default: GxB_Global_Option_set , \ - GxB_Option_Field : GxB_Global_Option_set , \ - GrB_Vector : GxB_Vector_Option_set , \ - GrB_Matrix : GxB_Matrix_Option_set , \ - GrB_Descriptor : GxB_Desc_set , \ - GxB_Context : GxB_Context_set \ - ) \ - (arg1, __VA_ARGS__) +GrB_Info GxB_Vector_build_FC64 // build a vector from (I,X) tuples +( + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const GxB_FC64_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates +) ; -#define GxB_get(arg1,...) \ - _Generic \ - ( \ - (arg1), \ - default: GxB_Global_Option_get , \ - GxB_Option_Field : GxB_Global_Option_get , \ - GrB_Vector : GxB_Vector_Option_get , \ - GrB_Matrix : GxB_Matrix_Option_get , \ - GrB_Descriptor : GxB_Desc_get , \ - GxB_Context : GxB_Context_get \ - ) \ - (arg1, __VA_ARGS__) -#endif +GrB_Info GrB_Vector_build_UDT // build a vector from (I,X) tuples +( + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const void *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates +) ; -#endif // GB_CUDA_FOLDER +GrB_Info GxB_Vector_build_Scalar // build a vector from (i,scalar) tuples +( + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + GrB_Scalar scalar, // value for all tuples + GrB_Index nvals // number of tuples +) ; -//============================================================================== -// GrB_set and GrB_get -//============================================================================== +// Type-generic version: X can be a pointer to any supported C type or void * +// for a user-defined type. -typedef struct GB_Global_opaque *GrB_Global ; -GB_GLOBAL const GrB_Global GrB_GLOBAL ; +/* +GrB_Info GrB_Vector_build // build a vector from (I,X) tuples +( + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates +) ; +*/ -typedef enum -{ +#if GxB_STDC_VERSION >= 201112L +#define GrB_Vector_build(w,Ilist,X,nvals,dup) \ + _Generic \ + ( \ + (X), \ + GB_PCASES (GrB, Vector_build) \ + ) \ + (w, Ilist, ((const void *) (X)), nvals, dup) +#endif - //-------------------------------------------------------------------------- - // GrB enums in the C API - //-------------------------------------------------------------------------- +//------------------------------------------------------------------------------ +// GrB_Vector_setElement +//------------------------------------------------------------------------------ - // GrB_Descriptor only: - GrB_OUTP_FIELD = 0, // descriptor for output of a method - GrB_MASK_FIELD = 1, // descriptor for the mask input of a method - GrB_INP0_FIELD = 2, // descriptor for the first input of a method - GrB_INP1_FIELD = 3, // descriptor for the second input of a method +// Set a single scalar in a vector, w(i) = x, typecasting from the type of x to +// the type of w as needed. - // all objects, including GrB_GLOBAL: - GrB_NAME = 10, // name of the object, as a string +GrB_Info GrB_Vector_setElement_BOOL // w(i) = x +( + GrB_Vector w, // vector to modify + bool x, // scalar to assign to w(i) + GrB_Index i // row index +) ; - // GrB_GLOBAL only: - GrB_LIBRARY_VER_MAJOR = 11, // SuiteSparse:GraphBLAS version - GrB_LIBRARY_VER_MINOR = 12, - GrB_LIBRARY_VER_PATCH = 13, - GrB_API_VER_MAJOR = 14, // C API version - GrB_API_VER_MINOR = 15, - GrB_API_VER_PATCH = 16, - GrB_BLOCKING_MODE = 17, // GrB_Mode +GrB_Info GrB_Vector_setElement_INT8 // w(i) = x +( + GrB_Vector w, // vector to modify + int8_t x, // scalar to assign to w(i) + GrB_Index i // row index +) ; - // GrB_GLOBAL, GrB_Matrix, GrB_Vector, GrB_Scalar: - GrB_STORAGE_ORIENTATION_HINT = 100, // GrB_Orientation +GrB_Info GrB_Vector_setElement_UINT8 // w(i) = x +( + GrB_Vector w, // vector to modify + uint8_t x, // scalar to assign to w(i) + GrB_Index i // row index +) ; - // GrB_Matrix, GrB_Vector, GrB_Scalar (and void * serialize): - GrB_EL_TYPE_CODE = 102, // a GrB_Type_code (see below) - GrB_EL_TYPE_STRING = 106, // name of the type +GrB_Info GrB_Vector_setElement_INT16 // w(i) = x +( + GrB_Vector w, // vector to modify + int16_t x, // scalar to assign to w(i) + GrB_Index i // row index +) ; - // GrB_*Op, GrB_Monoid, and GrB_Semiring: - GrB_INP0_TYPE_CODE = 103, // GrB_Type_code - GrB_INP1_TYPE_CODE = 104, - GrB_OUTP_TYPE_CODE = 105, - GrB_INP0_TYPE_STRING = 107, // name of the type, as a string - GrB_INP1_TYPE_STRING = 108, - GrB_OUTP_TYPE_STRING = 109, +GrB_Info GrB_Vector_setElement_UINT16 // w(i) = x +( + GrB_Vector w, // vector to modify + uint16_t x, // scalar to assign to w(i) + GrB_Index i // row index +) ; - // GrB_Type (readable only): - GrB_SIZE = 110, // size of the type +GrB_Info GrB_Vector_setElement_INT32 // w(i) = x +( + GrB_Vector w, // vector to modify + int32_t x, // scalar to assign to w(i) + GrB_Index i // row index +) ; - //-------------------------------------------------------------------------- - // SuiteSparse extensions: - //-------------------------------------------------------------------------- +GrB_Info GrB_Vector_setElement_UINT32 // w(i) = x +( + GrB_Vector w, // vector to modify + uint32_t x, // scalar to assign to w(i) + GrB_Index i // row index +) ; - // GrB_Type, GrB_UnaryOp, GrB_BinaryOp, and GrB_IndexUnaryOp: - GxB_JIT_C_NAME = 7041, // C type or function name - GxB_JIT_C_DEFINITION = 7042, // C typedef or function definition +GrB_Info GrB_Vector_setElement_INT64 // w(i) = x +( + GrB_Vector w, // vector to modify + int64_t x, // scalar to assign to w(i) + GrB_Index i // row index +) ; - // GrB_Monoid and GrB_Semiring: - GxB_MONOID_IDENTITY = 7043, // monoid identity value - GxB_MONOID_TERMINAL = 7044, // monoid terminal value - GxB_MONOID_OPERATOR = 7045, // monoid binary operator +GrB_Info GrB_Vector_setElement_UINT64 // w(i) = x +( + GrB_Vector w, // vector to modify + uint64_t x, // scalar to assign to w(i) + GrB_Index i // row index +) ; - // GrB_Semiring only: - GxB_SEMIRING_MONOID = 7046, // semiring monoid - GxB_SEMIRING_MULTIPLY = 7047, // semiring multiplicative op -} -GrB_Field ; +GrB_Info GrB_Vector_setElement_FP32 // w(i) = x +( + GrB_Vector w, // vector to modify + float x, // scalar to assign to w(i) + GrB_Index i // row index +) ; -typedef enum -{ - GrB_ROWMAJOR = 0, - GrB_COLMAJOR = 1, - GrB_BOTH = 2, - GrB_UNKNOWN = 3, -} -GrB_Orientation ; +GrB_Info GrB_Vector_setElement_FP64 // w(i) = x +( + GrB_Vector w, // vector to modify + double x, // scalar to assign to w(i) + GrB_Index i // row index +) ; -typedef enum -{ - GrB_UDT_CODE = 0, // user-defined type - GrB_BOOL_CODE = 1, // GraphBLAS: GrB_BOOL C: bool - GrB_INT8_CODE = 2, // GraphBLAS: GrB_INT8 C: int8_t - GrB_UINT8_CODE = 3, // GraphBLAS: GrB_UINT8 C: uint8_t - GrB_INT16_CODE = 4, // GraphBLAS: GrB_INT16 C: int16_t - GrB_UINT16_CODE = 5, // GraphBLAS: GrB_UINT16 C: uint16_t - GrB_INT32_CODE = 6, // GraphBLAS: GrB_INT32 C: int32_t - GrB_UINT32_CODE = 7, // GraphBLAS: GrB_UINT32 C: uint32_t - GrB_INT64_CODE = 8, // GraphBLAS: GrB_INT64 C: int64_t - GrB_UINT64_CODE = 9, // GraphBLAS: GrB_UINT64 C: uint64_t - GrB_FP32_CODE = 10, // GraphBLAS: GrB_FP32 C: float - GrB_FP64_CODE = 11, // GraphBLAS: GrB_FP64 C: double - GxB_FC32_CODE = 7070, // GraphBLAS: GxB_FC32 C: float complex - GxB_FC64_CODE = 7071, // GraphBLAS: GxB_FC64 C: double complex -} -GrB_Type_Code ; +GrB_Info GxB_Vector_setElement_FC32 // w(i) = x +( + GrB_Vector w, // vector to modify + GxB_FC32_t x, // scalar to assign to w(i) + GrB_Index i // row index +) ; + +GrB_Info GxB_Vector_setElement_FC64 // w(i) = x +( + GrB_Vector w, // vector to modify + GxB_FC64_t x, // scalar to assign to w(i) + GrB_Index i // row index +) ; + +GrB_Info GrB_Vector_setElement_UDT // w(i) = x +( + GrB_Vector w, // vector to modify + void *x, // scalar to assign to w(i) + GrB_Index i // row index +) ; + +GrB_Info GrB_Vector_setElement_Scalar // w(i) = x +( + GrB_Vector w, // vector to modify + GrB_Scalar x, // scalar to assign to w(i) + GrB_Index i // row index +) ; + +// Type-generic version: x can be any supported C type or void * for a +// user-defined type. + +/* +GrB_Info GrB_Vector_setElement // w(i) = x +( + GrB_Vector w, // vector to modify + x, // scalar to assign to w(i) + GrB_Index i // row index +) ; +*/ + +#if GxB_STDC_VERSION >= 201112L +#define GrB_Vector_setElement(w,x,i) \ + _Generic \ + ( \ + (x), \ + GB_CASES (GrB, Vector_setElement), \ + default: GrB_Vector_setElement_Scalar \ + ) \ + (w, x, i) +#endif //------------------------------------------------------------------------------ -// GrB_get: get a scalar, string, enum, size, or void * from an object +// GrB_Vector_extractElement //------------------------------------------------------------------------------ -#ifndef GB_CUDA_FOLDER -GrB_Info GrB_Scalar_get_Scalar (GrB_Scalar, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Scalar_get_String (GrB_Scalar, char * , GrB_Field) ; -GrB_Info GrB_Scalar_get_INT32 (GrB_Scalar, int32_t * , GrB_Field) ; -GrB_Info GrB_Scalar_get_SIZE (GrB_Scalar, size_t * , GrB_Field) ; -GrB_Info GrB_Scalar_get_VOID (GrB_Scalar, void * , GrB_Field) ; +// Extract a single entry from a vector, x = v(i), typecasting from the type of +// v to the type of x as needed. -GrB_Info GrB_Vector_get_Scalar (GrB_Vector, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Vector_get_String (GrB_Vector, char * , GrB_Field) ; -GrB_Info GrB_Vector_get_INT32 (GrB_Vector, int32_t * , GrB_Field) ; -GrB_Info GrB_Vector_get_SIZE (GrB_Vector, size_t * , GrB_Field) ; -GrB_Info GrB_Vector_get_VOID (GrB_Vector, void * , GrB_Field) ; +GrB_Info GrB_Vector_extractElement_BOOL // x = v(i) +( + bool *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; -GrB_Info GrB_Matrix_get_Scalar (GrB_Matrix, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Matrix_get_String (GrB_Matrix, char * , GrB_Field) ; -GrB_Info GrB_Matrix_get_INT32 (GrB_Matrix, int32_t * , GrB_Field) ; -GrB_Info GrB_Matrix_get_SIZE (GrB_Matrix, size_t * , GrB_Field) ; -GrB_Info GrB_Matrix_get_VOID (GrB_Matrix, void * , GrB_Field) ; +GrB_Info GrB_Vector_extractElement_INT8 // x = v(i) +( + int8_t *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; -GrB_Info GxB_Serialized_get_Scalar (const void *, GrB_Scalar, GrB_Field, size_t) ; -GrB_Info GxB_Serialized_get_String (const void *, char * , GrB_Field, size_t) ; -GrB_Info GxB_Serialized_get_INT32 (const void *, int32_t * , GrB_Field, size_t) ; -GrB_Info GxB_Serialized_get_SIZE (const void *, size_t * , GrB_Field, size_t) ; -GrB_Info GxB_Serialized_get_VOID (const void *, void * , GrB_Field, size_t) ; +GrB_Info GrB_Vector_extractElement_UINT8 // x = v(i) +( + uint8_t *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; -GrB_Info GrB_UnaryOp_get_Scalar (GrB_UnaryOp, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_UnaryOp_get_String (GrB_UnaryOp, char * , GrB_Field) ; -GrB_Info GrB_UnaryOp_get_INT32 (GrB_UnaryOp, int32_t * , GrB_Field) ; -GrB_Info GrB_UnaryOp_get_SIZE (GrB_UnaryOp, size_t * , GrB_Field) ; -GrB_Info GrB_UnaryOp_get_VOID (GrB_UnaryOp, void * , GrB_Field) ; +GrB_Info GrB_Vector_extractElement_INT16 // x = v(i) +( + int16_t *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; -GrB_Info GrB_IndexUnaryOp_get_Scalar (GrB_IndexUnaryOp, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_IndexUnaryOp_get_String (GrB_IndexUnaryOp, char * , GrB_Field) ; -GrB_Info GrB_IndexUnaryOp_get_INT32 (GrB_IndexUnaryOp, int32_t * , GrB_Field) ; -GrB_Info GrB_IndexUnaryOp_get_SIZE (GrB_IndexUnaryOp, size_t * , GrB_Field) ; -GrB_Info GrB_IndexUnaryOp_get_VOID (GrB_IndexUnaryOp, void * , GrB_Field) ; +GrB_Info GrB_Vector_extractElement_UINT16 // x = v(i) +( + uint16_t *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; -GrB_Info GrB_BinaryOp_get_Scalar (GrB_BinaryOp, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_BinaryOp_get_String (GrB_BinaryOp, char * , GrB_Field) ; -GrB_Info GrB_BinaryOp_get_INT32 (GrB_BinaryOp, int32_t * , GrB_Field) ; -GrB_Info GrB_BinaryOp_get_SIZE (GrB_BinaryOp, size_t * , GrB_Field) ; -GrB_Info GrB_BinaryOp_get_VOID (GrB_BinaryOp, void * , GrB_Field) ; +GrB_Info GrB_Vector_extractElement_INT32 // x = v(i) +( + int32_t *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; -GrB_Info GrB_Monoid_get_Scalar (GrB_Monoid, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Monoid_get_String (GrB_Monoid, char * , GrB_Field) ; -GrB_Info GrB_Monoid_get_INT32 (GrB_Monoid, int32_t * , GrB_Field) ; -GrB_Info GrB_Monoid_get_SIZE (GrB_Monoid, size_t * , GrB_Field) ; -GrB_Info GrB_Monoid_get_VOID (GrB_Monoid, void * , GrB_Field) ; +GrB_Info GrB_Vector_extractElement_UINT32 // x = v(i) +( + uint32_t *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; -GrB_Info GrB_Semiring_get_Scalar (GrB_Semiring, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Semiring_get_String (GrB_Semiring, char * , GrB_Field) ; -GrB_Info GrB_Semiring_get_INT32 (GrB_Semiring, int32_t * , GrB_Field) ; -GrB_Info GrB_Semiring_get_SIZE (GrB_Semiring, size_t * , GrB_Field) ; -GrB_Info GrB_Semiring_get_VOID (GrB_Semiring, void * , GrB_Field) ; +GrB_Info GrB_Vector_extractElement_INT64 // x = v(i) +( + int64_t *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; -GrB_Info GrB_Descriptor_get_Scalar (GrB_Descriptor, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Descriptor_get_String (GrB_Descriptor, char * , GrB_Field) ; -GrB_Info GrB_Descriptor_get_INT32 (GrB_Descriptor, int32_t * , GrB_Field) ; -GrB_Info GrB_Descriptor_get_SIZE (GrB_Descriptor, size_t * , GrB_Field) ; -GrB_Info GrB_Descriptor_get_VOID (GrB_Descriptor, void * , GrB_Field) ; +GrB_Info GrB_Vector_extractElement_UINT64 // x = v(i) +( + uint64_t *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; -GrB_Info GrB_Type_get_Scalar (GrB_Type, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Type_get_String (GrB_Type, char * , GrB_Field) ; -GrB_Info GrB_Type_get_INT32 (GrB_Type, int32_t * , GrB_Field) ; -GrB_Info GrB_Type_get_SIZE (GrB_Type, size_t * , GrB_Field) ; -GrB_Info GrB_Type_get_VOID (GrB_Type, void * , GrB_Field) ; +GrB_Info GrB_Vector_extractElement_FP32 // x = v(i) +( + float *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; -GrB_Info GrB_Global_get_Scalar (GrB_Global, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Global_get_String (GrB_Global, char * , GrB_Field) ; -GrB_Info GrB_Global_get_INT32 (GrB_Global, int32_t * , GrB_Field) ; -GrB_Info GrB_Global_get_SIZE (GrB_Global, size_t * , GrB_Field) ; -GrB_Info GrB_Global_get_VOID (GrB_Global, void * , GrB_Field) ; +GrB_Info GrB_Vector_extractElement_FP64 // x = v(i) +( + double *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; -GrB_Info GxB_Context_get_Scalar (GxB_Context, GrB_Scalar, GrB_Field) ; -GrB_Info GxB_Context_get_String (GxB_Context, char * , GrB_Field) ; -GrB_Info GxB_Context_get_INT (GxB_Context, int32_t * , GrB_Field) ; -GrB_Info GxB_Context_get_SIZE (GxB_Context, size_t * , GrB_Field) ; -GrB_Info GxB_Context_get_VOID (GxB_Context, void * , GrB_Field) ; +GrB_Info GxB_Vector_extractElement_FC32 // x = v(i) +( + GxB_FC32_t *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; + +GrB_Info GxB_Vector_extractElement_FC64 // x = v(i) +( + GxB_FC64_t *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; + +GrB_Info GrB_Vector_extractElement_UDT // x = v(i) +( + void *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; + +GrB_Info GrB_Vector_extractElement_Scalar // x = v(i) +( + GrB_Scalar x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; + +// Type-generic version: x can be a pointer to any supported C type or void * +// for a user-defined type. + +/* +GrB_Info GrB_Vector_extractElement // x = v(i) +( + *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; +*/ -// GrB_get (object, value, field): #if GxB_STDC_VERSION >= 201112L -#define GrB_get(object,value,...) \ - _Generic \ - ( \ - (object), \ - GrB_Scalar : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Scalar_get_Scalar , \ - char * : GrB_Scalar_get_String , \ - int32_t * : GrB_Scalar_get_INT32 , \ - size_t * : GrB_Scalar_get_SIZE , \ - void * : GrB_Scalar_get_VOID \ - ) , \ - GrB_Vector : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Vector_get_Scalar , \ - char * : GrB_Vector_get_String , \ - int32_t * : GrB_Vector_get_INT32 , \ - size_t * : GrB_Vector_get_SIZE , \ - void * : GrB_Vector_get_VOID \ - ) , \ - GrB_Matrix : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Matrix_get_Scalar , \ - char * : GrB_Matrix_get_String , \ - int32_t * : GrB_Matrix_get_INT32 , \ - size_t * : GrB_Matrix_get_SIZE , \ - void * : GrB_Matrix_get_VOID \ - ) , \ - GrB_UnaryOp : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_UnaryOp_get_Scalar , \ - char * : GrB_UnaryOp_get_String , \ - int32_t * : GrB_UnaryOp_get_INT32 , \ - size_t * : GrB_UnaryOp_get_SIZE , \ - void * : GrB_UnaryOp_get_VOID \ - ) , \ - GrB_IndexUnaryOp : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_IndexUnaryOp_get_Scalar , \ - char * : GrB_IndexUnaryOp_get_String , \ - int32_t * : GrB_IndexUnaryOp_get_INT32 , \ - size_t * : GrB_IndexUnaryOp_get_SIZE , \ - void * : GrB_IndexUnaryOp_get_VOID \ - ) , \ - GrB_BinaryOp : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_BinaryOp_get_Scalar , \ - char * : GrB_BinaryOp_get_String , \ - int32_t * : GrB_BinaryOp_get_INT32 , \ - size_t * : GrB_BinaryOp_get_SIZE , \ - void * : GrB_BinaryOp_get_VOID \ - ) , \ - GrB_Monoid : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Monoid_get_Scalar , \ - char * : GrB_Monoid_get_String , \ - int32_t * : GrB_Monoid_get_INT32 , \ - size_t * : GrB_Monoid_get_SIZE , \ - void * : GrB_Monoid_get_VOID \ - ) , \ - GrB_Semiring : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Semiring_get_Scalar , \ - char * : GrB_Semiring_get_String , \ - int32_t * : GrB_Semiring_get_INT32 , \ - size_t * : GrB_Semiring_get_SIZE , \ - void * : GrB_Semiring_get_VOID \ - ) , \ - GrB_Type : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Type_get_Scalar , \ - char * : GrB_Type_get_String , \ - int32_t * : GrB_Type_get_INT32 , \ - size_t * : GrB_Type_get_SIZE , \ - void * : GrB_Type_get_VOID \ - ) , \ - GrB_Descriptor : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Descriptor_get_Scalar , \ - char * : GrB_Descriptor_get_String , \ - int32_t * : GrB_Descriptor_get_INT32 , \ - size_t * : GrB_Descriptor_get_SIZE , \ - void * : GrB_Descriptor_get_VOID \ - ) , \ - GrB_Global : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Global_get_Scalar , \ - char * : GrB_Global_get_String , \ - int32_t * : GrB_Global_get_INT32 , \ - size_t * : GrB_Global_get_SIZE , \ - void * : GrB_Global_get_VOID \ - ) , \ - GxB_Context : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GxB_Context_get_Scalar , \ - char * : GxB_Context_get_String , \ - int32_t * : GxB_Context_get_INT , \ - size_t * : GxB_Context_get_SIZE , \ - void * : GxB_Context_get_VOID \ - ) , \ - const void *: \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GxB_Serialized_get_Scalar , \ - char * : GxB_Serialized_get_String , \ - int32_t * : GxB_Serialized_get_INT32 , \ - size_t * : GxB_Serialized_get_SIZE , \ - void * : GxB_Serialized_get_VOID \ - ) , \ - void *: \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GxB_Serialized_get_Scalar , \ - char * : GxB_Serialized_get_String , \ - int32_t * : GxB_Serialized_get_INT32 , \ - size_t * : GxB_Serialized_get_SIZE , \ - void * : GxB_Serialized_get_VOID \ - ) \ - ) (object, value, __VA_ARGS__) +#define GrB_Vector_extractElement(x,v,i) \ + _Generic \ + ( \ + (x), \ + GB_PCASES (GrB, Vector_extractElement), \ + default: GrB_Vector_extractElement_Scalar \ + ) \ + (x, v, i) #endif -//------------------------------------------------------------------------------ -// GrB_set: set a scalar, string, enum, size, or void * of an object -//------------------------------------------------------------------------------ +// GxB_Vector_isStoredElement determines if v(i) is present in the structure +// of the vector v, as a stored element. It does not return the value. It +// returns GrB_SUCCESS if the element is present, or GrB_NO_VALUE otherwise. -GrB_Info GrB_Scalar_set_Scalar (GrB_Scalar, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Scalar_set_String (GrB_Scalar, char * , GrB_Field) ; -GrB_Info GrB_Scalar_set_INT32 (GrB_Scalar, int32_t , GrB_Field) ; -GrB_Info GrB_Scalar_set_VOID (GrB_Scalar, void * , GrB_Field, size_t) ; +GrB_Info GxB_Vector_isStoredElement // determine if v(i) is a stored element +( + const GrB_Vector v, // vector to check + GrB_Index i // row index +) ; -GrB_Info GrB_Vector_set_Scalar (GrB_Vector, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Vector_set_String (GrB_Vector, char * , GrB_Field) ; -GrB_Info GrB_Vector_set_INT32 (GrB_Vector, int32_t , GrB_Field) ; -GrB_Info GrB_Vector_set_VOID (GrB_Vector, void * , GrB_Field, size_t) ; +//------------------------------------------------------------------------------ +// GrB_Vector_removeElement +//------------------------------------------------------------------------------ -GrB_Info GrB_Matrix_set_Scalar (GrB_Matrix, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Matrix_set_String (GrB_Matrix, char * , GrB_Field) ; -GrB_Info GrB_Matrix_set_INT32 (GrB_Matrix, int32_t , GrB_Field) ; -GrB_Info GrB_Matrix_set_VOID (GrB_Matrix, void * , GrB_Field, size_t) ; +// GrB_Vector_removeElement (v,i) removes the element v(i) from the vector v. -GrB_Info GrB_UnaryOp_set_Scalar (GrB_UnaryOp, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_UnaryOp_set_String (GrB_UnaryOp, char * , GrB_Field) ; -GrB_Info GrB_UnaryOp_set_INT32 (GrB_UnaryOp, int32_t , GrB_Field) ; -GrB_Info GrB_UnaryOp_set_VOID (GrB_UnaryOp, void * , GrB_Field, size_t) ; +GrB_Info GrB_Vector_removeElement +( + GrB_Vector v, // vector to remove an element from + GrB_Index i // index +) ; -GrB_Info GrB_IndexUnaryOp_set_Scalar (GrB_IndexUnaryOp, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_IndexUnaryOp_set_String (GrB_IndexUnaryOp, char * , GrB_Field) ; -GrB_Info GrB_IndexUnaryOp_set_INT32 (GrB_IndexUnaryOp, int32_t , GrB_Field) ; -GrB_Info GrB_IndexUnaryOp_set_VOID (GrB_IndexUnaryOp, void * , GrB_Field, - size_t) ; +//------------------------------------------------------------------------------ +// GrB_Vector_extractTuples +//------------------------------------------------------------------------------ -GrB_Info GrB_BinaryOp_set_Scalar (GrB_BinaryOp, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_BinaryOp_set_String (GrB_BinaryOp, char * , GrB_Field) ; -GrB_Info GrB_BinaryOp_set_INT32 (GrB_BinaryOp, int32_t , GrB_Field) ; -GrB_Info GrB_BinaryOp_set_VOID (GrB_BinaryOp, void * , GrB_Field, size_t) ; +// Extracts all tuples from a vector, like [I,~,X] = find (v). If +// any parameter I and/or X is NULL, then that component is not extracted. For +// example, to extract just the row indices, pass I as non-NULL, and X as NULL. +// This is like [I,~,~] = find (v). -GrB_Info GrB_Monoid_set_Scalar (GrB_Monoid, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Monoid_set_String (GrB_Monoid, char * , GrB_Field) ; -GrB_Info GrB_Monoid_set_INT32 (GrB_Monoid, int32_t , GrB_Field) ; -GrB_Info GrB_Monoid_set_VOID (GrB_Monoid, void * , GrB_Field, size_t) ; +GrB_Info GrB_Vector_extractTuples_BOOL // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + bool *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; -GrB_Info GrB_Semiring_set_Scalar (GrB_Semiring, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Semiring_set_String (GrB_Semiring, char * , GrB_Field) ; -GrB_Info GrB_Semiring_set_INT32 (GrB_Semiring, int32_t , GrB_Field) ; -GrB_Info GrB_Semiring_set_VOID (GrB_Semiring, void * , GrB_Field, size_t) ; +GrB_Info GrB_Vector_extractTuples_INT8 // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + int8_t *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; -GrB_Info GrB_Descriptor_set_Scalar (GrB_Descriptor, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Descriptor_set_String (GrB_Descriptor, char * , GrB_Field) ; -GrB_Info GrB_Descriptor_set_INT32 (GrB_Descriptor, int32_t , GrB_Field) ; -GrB_Info GrB_Descriptor_set_VOID (GrB_Descriptor, void * , GrB_Field, - size_t) ; +GrB_Info GrB_Vector_extractTuples_UINT8 // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + uint8_t *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; -GrB_Info GrB_Type_set_Scalar (GrB_Type, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Type_set_String (GrB_Type, char * , GrB_Field) ; -GrB_Info GrB_Type_set_INT32 (GrB_Type, int32_t , GrB_Field) ; -GrB_Info GrB_Type_set_VOID (GrB_Type, void * , GrB_Field, size_t) ; +GrB_Info GrB_Vector_extractTuples_INT16 // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + int16_t *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; -GrB_Info GrB_Global_set_Scalar (GrB_Global, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Global_set_String (GrB_Global, char * , GrB_Field) ; -GrB_Info GrB_Global_set_INT32 (GrB_Global, int32_t , GrB_Field) ; -GrB_Info GrB_Global_set_VOID (GrB_Global, void * , GrB_Field, size_t) ; +GrB_Info GrB_Vector_extractTuples_UINT16 // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + uint16_t *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; -GrB_Info GxB_Context_set_Scalar (GxB_Context, GrB_Scalar, GrB_Field) ; -GrB_Info GxB_Context_set_String (GxB_Context, char * , GrB_Field) ; -GrB_Info GxB_Context_set_INT (GxB_Context, int32_t , GrB_Field) ; -GrB_Info GxB_Context_set_VOID (GxB_Context, void * , GrB_Field, size_t) ; +GrB_Info GrB_Vector_extractTuples_INT32 // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + int32_t *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; -// GrB_set (object, value, field) or (object, value, field, size) for _VOID -#if GxB_STDC_VERSION >= 201112L -#define GrB_set(object,value,...) \ - _Generic \ - ( \ - (object), \ - GrB_Scalar : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Scalar_set_Scalar , \ - char * : GrB_Scalar_set_String , \ - int32_t : GrB_Scalar_set_INT32 , \ - void * : GrB_Scalar_set_VOID \ - ) , \ - GrB_Vector : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Vector_set_Scalar , \ - char * : GrB_Vector_set_String , \ - int32_t : GrB_Vector_set_INT32 , \ - void * : GrB_Vector_set_VOID \ - ) , \ - GrB_Matrix : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Matrix_set_Scalar , \ - char * : GrB_Matrix_set_String , \ - int32_t : GrB_Matrix_set_INT32 , \ - void * : GrB_Matrix_set_VOID \ - ) , \ - GrB_UnaryOp : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_UnaryOp_set_Scalar , \ - char * : GrB_UnaryOp_set_String , \ - int32_t : GrB_UnaryOp_set_INT32 , \ - void * : GrB_UnaryOp_set_VOID \ - ) , \ - GrB_IndexUnaryOp : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_IndexUnaryOp_set_Scalar , \ - char * : GrB_IndexUnaryOp_set_String , \ - int32_t : GrB_IndexUnaryOp_set_INT32 , \ - void * : GrB_IndexUnaryOp_set_VOID \ - ) , \ - GrB_BinaryOp : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_BinaryOp_set_Scalar , \ - char * : GrB_BinaryOp_set_String , \ - int32_t : GrB_BinaryOp_set_INT32 , \ - void * : GrB_BinaryOp_set_VOID \ - ) , \ - GrB_Monoid : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Monoid_set_Scalar , \ - char * : GrB_Monoid_set_String , \ - int32_t : GrB_Monoid_set_INT32 , \ - void * : GrB_Monoid_set_VOID \ - ) , \ - GrB_Semiring : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Semiring_set_Scalar , \ - char * : GrB_Semiring_set_String , \ - int32_t : GrB_Semiring_set_INT32 , \ - void * : GrB_Semiring_set_VOID \ - ) , \ - GrB_Type : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Type_set_Scalar , \ - char * : GrB_Type_set_String , \ - int32_t : GrB_Type_set_INT32 , \ - void * : GrB_Type_set_VOID \ - ) , \ - GrB_Descriptor : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Descriptor_set_Scalar , \ - char * : GrB_Descriptor_set_String , \ - int32_t : GrB_Descriptor_set_INT32 , \ - void * : GrB_Descriptor_set_VOID \ - ) , \ - GrB_Global : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Global_set_Scalar , \ - char * : GrB_Global_set_String , \ - int32_t : GrB_Global_set_INT32 , \ - void * : GrB_Global_set_VOID \ - ) , \ - GxB_Context : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GxB_Context_set_Scalar , \ - char * : GxB_Context_set_String , \ - int32_t : GxB_Context_set_INT , \ - void * : GxB_Context_set_VOID \ - ) \ - ) (object, value, __VA_ARGS__) -#endif +GrB_Info GrB_Vector_extractTuples_UINT32 // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + uint32_t *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; -#endif // GB_CUDA_FOLDER +GrB_Info GrB_Vector_extractTuples_INT64 // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + int64_t *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; -//============================================================================== -// GrB_free: free any GraphBLAS object -//============================================================================== +GrB_Info GrB_Vector_extractTuples_UINT64 // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + uint64_t *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; -// for null and invalid objects -#define GrB_NULL NULL -#define GrB_INVALID_HANDLE NULL +GrB_Info GrB_Vector_extractTuples_FP32 // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + float *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; -#ifndef GB_CUDA_FOLDER +GrB_Info GrB_Vector_extractTuples_FP64 // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + double *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; + +GrB_Info GxB_Vector_extractTuples_FC32 // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + GxB_FC32_t *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; + +GrB_Info GxB_Vector_extractTuples_FC64 // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + GxB_FC64_t *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; + +GrB_Info GrB_Vector_extractTuples_UDT // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + void *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; + +// Type-generic version: X can be a pointer to any supported C type or void * +// for a user-defined type. + +/* +GrB_Info GrB_Vector_extractTuples // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; +*/ #if GxB_STDC_VERSION >= 201112L -#define GrB_free(object) \ +#define GrB_Vector_extractTuples(Ilist,X,nvals,v) \ _Generic \ ( \ - (object), \ - GrB_Type *: GrB_Type_free , \ - GrB_UnaryOp *: GrB_UnaryOp_free , \ - GrB_BinaryOp *: GrB_BinaryOp_free , \ - GrB_IndexUnaryOp *: GrB_IndexUnaryOp_free , \ - GrB_Monoid *: GrB_Monoid_free , \ - GrB_Semiring *: GrB_Semiring_free , \ - GrB_Scalar *: GrB_Scalar_free , \ - GrB_Vector *: GrB_Vector_free , \ - GrB_Matrix *: GrB_Matrix_free , \ - GrB_Descriptor *: GrB_Descriptor_free , \ - GxB_Context *: GxB_Context_free , \ - GxB_Iterator *: GxB_Iterator_free \ + (X), \ + GB_PCASES (GrB, Vector_extractTuples) \ ) \ - (object) -#endif - + (Ilist, X, nvals, v) #endif //============================================================================== -// GrB_wait: finish computations +// GrB_Matrix: a GraphBLAS matrix //============================================================================== -typedef enum -{ - GrB_COMPLETE = 0, // establishes a happens-before relation - GrB_MATERIALIZE = 1 // object is complete -} -GrB_WaitMode ; +// These methods create, free, copy, and clear a matrix. The nrows, ncols, +// nvals, and type methods return basic information about a matrix. -#ifndef GB_CUDA_FOLDER +GrB_Info GrB_Matrix_new // create a new matrix with no entries +( + GrB_Matrix *A, // handle of matrix to create + GrB_Type type, // type of matrix to create + GrB_Index nrows, // matrix dimension is nrows-by-ncols + GrB_Index ncols // (nrows and ncols must be <= GrB_INDEX_MAX+1) +) ; -// Finish all pending work in a specific object. +GrB_Info GrB_Matrix_dup // make an exact copy of a matrix +( + GrB_Matrix *C, // handle of output matrix to create + const GrB_Matrix A // input matrix to copy +) ; -GrB_Info GrB_Type_wait (GrB_Type type , GrB_WaitMode waitmode); -GrB_Info GrB_UnaryOp_wait (GrB_UnaryOp op , GrB_WaitMode waitmode); -GrB_Info GrB_BinaryOp_wait (GrB_BinaryOp op , GrB_WaitMode waitmode); -GrB_Info GrB_IndexUnaryOp_wait (GrB_IndexUnaryOp op , GrB_WaitMode waitmode); -GrB_Info GrB_Monoid_wait (GrB_Monoid monoid , GrB_WaitMode waitmode); -GrB_Info GrB_Semiring_wait (GrB_Semiring semiring, GrB_WaitMode waitmode); -GrB_Info GrB_Descriptor_wait (GrB_Descriptor desc , GrB_WaitMode waitmode); -GrB_Info GrB_Scalar_wait (GrB_Scalar s , GrB_WaitMode waitmode); -GrB_Info GrB_Vector_wait (GrB_Vector v , GrB_WaitMode waitmode); -GrB_Info GrB_Matrix_wait (GrB_Matrix A , GrB_WaitMode waitmode); -GrB_Info GxB_Context_wait (GxB_Context Context , GrB_WaitMode waitmode); +GrB_Info GrB_Matrix_clear // clear a matrix of all entries; +( // type and dimensions remain unchanged + GrB_Matrix A // matrix to clear +) ; -// GrB_wait (object,waitmode) polymorphic function: -#if GxB_STDC_VERSION >= 201112L -#define GrB_wait(object,waitmode) \ - _Generic \ - ( \ - (object), \ - GrB_Type : GrB_Type_wait , \ - GrB_UnaryOp : GrB_UnaryOp_wait , \ - GrB_BinaryOp : GrB_BinaryOp_wait , \ - GrB_IndexUnaryOp : GrB_IndexUnaryOp_wait , \ - GrB_Monoid : GrB_Monoid_wait , \ - GrB_Semiring : GrB_Semiring_wait , \ - GrB_Scalar : GrB_Scalar_wait , \ - GrB_Vector : GrB_Vector_wait , \ - GrB_Matrix : GrB_Matrix_wait , \ - GxB_Context : GxB_Context_wait , \ - GrB_Descriptor : GrB_Descriptor_wait \ - ) \ - (object, waitmode) -#endif - -// NOTE: GxB_Scalar_wait is historical; use GrB_Scalar_wait instead -GrB_Info GxB_Scalar_wait (GrB_Scalar *s) ; +GrB_Info GrB_Matrix_nrows // get the number of rows of a matrix +( + GrB_Index *nrows, // matrix has nrows rows + const GrB_Matrix A // matrix to query +) ; -//============================================================================== -// GrB_error: error handling -//============================================================================== +GrB_Info GrB_Matrix_ncols // get the number of columns of a matrix +( + GrB_Index *ncols, // matrix has ncols columns + const GrB_Matrix A // matrix to query +) ; -// Each GraphBLAS method and operation returns a GrB_Info error code. -// GrB_error returns additional information on the error in a thread-safe -// null-terminated string. The string returned by GrB_error is owned by -// the GraphBLAS library and must not be free'd. +GrB_Info GrB_Matrix_nvals // get the number of entries in a matrix +( + GrB_Index *nvals, // matrix has nvals entries + const GrB_Matrix A // matrix to query +) ; -GrB_Info GrB_Type_error (const char **error, const GrB_Type type) ; -GrB_Info GrB_UnaryOp_error (const char **error, const GrB_UnaryOp op) ; -GrB_Info GrB_BinaryOp_error (const char **error, const GrB_BinaryOp op) ; -GrB_Info GrB_IndexUnaryOp_error (const char **error, const GrB_IndexUnaryOp op) ; -GrB_Info GrB_Monoid_error (const char **error, const GrB_Monoid monoid) ; -GrB_Info GrB_Semiring_error (const char **error, const GrB_Semiring semiring) ; -GrB_Info GrB_Scalar_error (const char **error, const GrB_Scalar s) ; -GrB_Info GrB_Vector_error (const char **error, const GrB_Vector v) ; -GrB_Info GrB_Matrix_error (const char **error, const GrB_Matrix A) ; -GrB_Info GrB_Descriptor_error (const char **error, const GrB_Descriptor d) ; -// GxB_Scalar_error is historical: use GrB_Scalar_error instead -GrB_Info GxB_Scalar_error (const char **error, const GrB_Scalar s) ; -GrB_Info GxB_Context_error (const char **error, const GxB_Context Context); +// historical; use GrB_get instead: +GrB_Info GxB_Matrix_type (GrB_Type *type, const GrB_Matrix A) ; +GrB_Info GxB_Matrix_type_name (char *type_name, const GrB_Matrix A) ; -// GrB_error (error,object) polymorphic function: -#if GxB_STDC_VERSION >= 201112L -#define GrB_error(error,object) \ - _Generic \ - ( \ - (object), \ - GrB_Type : GrB_Type_error , \ - GrB_UnaryOp : GrB_UnaryOp_error , \ - GrB_BinaryOp : GrB_BinaryOp_error , \ - GrB_IndexUnaryOp : GrB_IndexUnaryOp_error , \ - GrB_Monoid : GrB_Monoid_error , \ - GrB_Semiring : GrB_Semiring_error , \ - GrB_Scalar : GrB_Scalar_error , \ - GrB_Vector : GrB_Vector_error , \ - GrB_Matrix : GrB_Matrix_error , \ - GxB_Context : GxB_Context_error , \ - GrB_Descriptor : GrB_Descriptor_error \ - ) \ - (error, object) -#endif +GrB_Info GxB_Matrix_memoryUsage // return # of bytes used for a matrix +( + size_t *size, // # of bytes used by the matrix A + const GrB_Matrix A // matrix to query +) ; -//============================================================================== -// GrB_mxm, vxm, mxv: matrix multiplication over a semiring -//============================================================================== +GrB_Info GxB_Matrix_iso // return iso status of a matrix +( + bool *iso, // true if the matrix is iso-valued + const GrB_Matrix A // matrix to query +) ; -GrB_Info GrB_mxm // C = accum (C, A*B) +GrB_Info GrB_Matrix_free // free a matrix ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_Semiring semiring, // defines '+' and '*' for A*B - const GrB_Matrix A, // first input: matrix A - const GrB_Matrix B, // second input: matrix B - const GrB_Descriptor desc // descriptor for C, Mask, A, and B + GrB_Matrix *A // handle of matrix to free ) ; -GrB_Info GrB_vxm // w' = accum (w, u'*A) +//------------------------------------------------------------------------------ +// GrB_Matrix_build +//------------------------------------------------------------------------------ + +// GrB_Matrix_build: C = sparse (I,J,X), but using any +// associative operator to assemble duplicate entries. + +GrB_Info GrB_Matrix_build_BOOL // build a matrix from (I,J,X) tuples ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_Semiring semiring, // defines '+' and '*' for u'*A - const GrB_Vector u, // first input: vector u - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for w, mask, and A + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const bool *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -GrB_Info GrB_mxv // w = accum (w, A*u) +GrB_Info GrB_Matrix_build_INT8 // build a matrix from (I,J,X) tuples ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_Semiring semiring, // defines '+' and '*' for A*B - const GrB_Matrix A, // first input: matrix A - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w, mask, and A + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const int8_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -//============================================================================== -// GrB_eWiseMult: element-wise matrix and vector operations, set intersection -//============================================================================== +GrB_Info GrB_Matrix_build_UINT8 // build a matrix from (I,J,X) tuples +( + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const uint8_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates +) ; -// GrB_eWiseMult computes C = accum (C, A.*B), where ".*" is the Hadamard -// product, and where pairs of elements in two matrices (or vectors) are -// pairwise "multiplied" with C(i,j) = mult (A(i,j),B(i,j)). +GrB_Info GrB_Matrix_build_INT16 // build a matrix from (I,J,X) tuples +( + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const int16_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates +) ; -GrB_Info GrB_Vector_eWiseMult_Semiring // w = accum (w, u.*v) +GrB_Info GrB_Matrix_build_UINT16 // build a matrix from (I,J,X) tuples ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_Semiring semiring, // defines '.*' for t=u.*v - const GrB_Vector u, // first input: vector u - const GrB_Vector v, // second input: vector v - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const uint16_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -GrB_Info GrB_Vector_eWiseMult_Monoid // w = accum (w, u.*v) +GrB_Info GrB_Matrix_build_INT32 // build a matrix from (I,J,X) tuples ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_Monoid monoid, // defines '.*' for t=u.*v - const GrB_Vector u, // first input: vector u - const GrB_Vector v, // second input: vector v - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const int32_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -GrB_Info GrB_Vector_eWiseMult_BinaryOp // w = accum (w, u.*v) +GrB_Info GrB_Matrix_build_UINT32 // build a matrix from (I,J,X) tuples ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp mult, // defines '.*' for t=u.*v - const GrB_Vector u, // first input: vector u - const GrB_Vector v, // second input: vector v - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const uint32_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -GrB_Info GrB_Matrix_eWiseMult_Semiring // C = accum (C, A.*B) +GrB_Info GrB_Matrix_build_INT64 // build a matrix from (I,J,X) tuples ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_Semiring semiring, // defines '.*' for T=A.*B - const GrB_Matrix A, // first input: matrix A - const GrB_Matrix B, // second input: matrix B - const GrB_Descriptor desc // descriptor for C, Mask, A, and B + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const int64_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -GrB_Info GrB_Matrix_eWiseMult_Monoid // C = accum (C, A.*B) +GrB_Info GrB_Matrix_build_UINT64 // build a matrix from (I,J,X) tuples ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_Monoid monoid, // defines '.*' for T=A.*B - const GrB_Matrix A, // first input: matrix A - const GrB_Matrix B, // second input: matrix B - const GrB_Descriptor desc // descriptor for C, Mask, A, and B + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const uint64_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -GrB_Info GrB_Matrix_eWiseMult_BinaryOp // C = accum (C, A.*B) +GrB_Info GrB_Matrix_build_FP32 // build a matrix from (I,J,X) tuples ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp mult, // defines '.*' for T=A.*B - const GrB_Matrix A, // first input: matrix A - const GrB_Matrix B, // second input: matrix B - const GrB_Descriptor desc // descriptor for C, Mask, A, and B + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const float *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -// All 6 of the above type-specific functions are captured in a single -// type-generic function, GrB_eWiseMult: - -#if GxB_STDC_VERSION >= 201112L -#define GrB_eWiseMult(C,Mask,accum,op,A,B,desc) \ - _Generic \ - ( \ - (C), \ - GrB_Matrix : \ - _Generic \ - ( \ - (op), \ - GrB_Semiring : GrB_Matrix_eWiseMult_Semiring , \ - GrB_Monoid : GrB_Matrix_eWiseMult_Monoid , \ - GrB_BinaryOp : GrB_Matrix_eWiseMult_BinaryOp \ - ), \ - GrB_Vector : \ - _Generic \ - ( \ - (op), \ - GrB_Semiring : GrB_Vector_eWiseMult_Semiring , \ - GrB_Monoid : GrB_Vector_eWiseMult_Monoid , \ - GrB_BinaryOp : GrB_Vector_eWiseMult_BinaryOp \ - ) \ - ) \ - (C, Mask, accum, op, A, B, desc) -#endif - -//============================================================================== -// GrB_eWiseAdd: element-wise matrix and vector operations, set union -//============================================================================== - -// GrB_eWiseAdd computes C = accum (C, A+B), where pairs of elements in -// two matrices (or two vectors) are pairwise "added". - -GrB_Info GrB_Vector_eWiseAdd_Semiring // w = accum (w, u+v) +GrB_Info GrB_Matrix_build_FP64 // build a matrix from (I,J,X) tuples ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_Semiring semiring, // defines '+' for t=u+v - const GrB_Vector u, // first input: vector u - const GrB_Vector v, // second input: vector v - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const double *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -GrB_Info GrB_Vector_eWiseAdd_Monoid // w = accum (w, u+v) +GrB_Info GxB_Matrix_build_FC32 // build a matrix from (I,J,X) tuples ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_Monoid monoid, // defines '+' for t=u+v - const GrB_Vector u, // first input: vector u - const GrB_Vector v, // second input: vector v - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const GxB_FC32_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -GrB_Info GrB_Vector_eWiseAdd_BinaryOp // w = accum (w, u+v) +GrB_Info GxB_Matrix_build_FC64 // build a matrix from (I,J,X) tuples ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp add, // defines '+' for t=u+v - const GrB_Vector u, // first input: vector u - const GrB_Vector v, // second input: vector v - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const GxB_FC64_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -GrB_Info GrB_Matrix_eWiseAdd_Semiring // C = accum (C, A+B) +GrB_Info GrB_Matrix_build_UDT // build a matrix from (I,J,X) tuples ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_Semiring semiring, // defines '+' for T=A+B - const GrB_Matrix A, // first input: matrix A - const GrB_Matrix B, // second input: matrix B - const GrB_Descriptor desc // descriptor for C, Mask, A, and B + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const void *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -GrB_Info GrB_Matrix_eWiseAdd_Monoid // C = accum (C, A+B) +GrB_Info GxB_Matrix_build_Scalar // build a matrix from (I,J,scalar) tuples ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_Monoid monoid, // defines '+' for T=A+B - const GrB_Matrix A, // first input: matrix A - const GrB_Matrix B, // second input: matrix B - const GrB_Descriptor desc // descriptor for C, Mask, A, and B + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + GrB_Scalar scalar, // value for all tuples + GrB_Index nvals // number of tuples ) ; -GrB_Info GrB_Matrix_eWiseAdd_BinaryOp // C = accum (C, A+B) +// Type-generic version: X can be a pointer to any supported C type or void * +// for a user-defined type. + +/* +GrB_Info GrB_Matrix_build // build a matrix from (I,J,X) tuples ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp add, // defines '+' for T=A+B - const GrB_Matrix A, // first input: matrix A - const GrB_Matrix B, // second input: matrix B - const GrB_Descriptor desc // descriptor for C, Mask, A, and B + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; +*/ #if GxB_STDC_VERSION >= 201112L -#define GrB_eWiseAdd(C,Mask,accum,op,A,B,desc) \ - _Generic \ - ( \ - (C), \ - GrB_Matrix : \ - _Generic \ - ( \ - (op), \ - GrB_Semiring : GrB_Matrix_eWiseAdd_Semiring , \ - GrB_Monoid : GrB_Matrix_eWiseAdd_Monoid , \ - GrB_BinaryOp : GrB_Matrix_eWiseAdd_BinaryOp \ - ), \ - GrB_Vector : \ - _Generic \ - ( \ - (op), \ - GrB_Semiring : GrB_Vector_eWiseAdd_Semiring , \ - GrB_Monoid : GrB_Vector_eWiseAdd_Monoid , \ - GrB_BinaryOp : GrB_Vector_eWiseAdd_BinaryOp \ - ) \ - ) \ - (C, Mask, accum, op, A, B, desc) +#define GrB_Matrix_build(C,Ilist,J,X,nvals,dup) \ + _Generic \ + ( \ + (X), \ + GB_PCASES (GrB, Matrix_build) \ + ) \ + (C, Ilist, J, ((const void *) (X)), nvals, dup) #endif -//============================================================================== -// GxB_eWiseUnion: a variant of GrB_eWiseAdd -//============================================================================== - -// GxB_eWiseUnion is a variant of eWiseAdd. The methods create a result with -// the same sparsity structure. They differ when an entry is present in A but -// not B, or in B but not A. - -// eWiseAdd does the following, for a matrix, where "+" is the add binary op: +//------------------------------------------------------------------------------ +// GrB_Matrix_setElement +//------------------------------------------------------------------------------ -// if A(i,j) and B(i,j) are both present: -// C(i,j) = A(i,j) + B(i,j) -// else if A(i,j) is present but not B(i,j) -// C(i,j) = A(i,j) -// else if B(i,j) is present but not A(i,j) -// C(i,j) = B(i,j) +// Set a single entry in a matrix, C(i,j) = x, typecasting +// from the type of x to the type of C, as needed. -// by contrast, eWiseUnion always applies the operator: +GrB_Info GrB_Matrix_setElement_BOOL // C (i,j) = x +( + GrB_Matrix C, // matrix to modify + bool x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index +) ; -// if A(i,j) and B(i,j) are both present: -// C(i,j) = A(i,j) + B(i,j) -// else if A(i,j) is present but not B(i,j) -// C(i,j) = A(i,j) + beta -// else if B(i,j) is present but not A(i,j) -// C(i,j) = alpha + B(i,j) +GrB_Info GrB_Matrix_setElement_INT8 // C (i,j) = x +( + GrB_Matrix C, // matrix to modify + int8_t x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index +) ; -GrB_Info GxB_Vector_eWiseUnion // w = accum (w, u+v) +GrB_Info GrB_Matrix_setElement_UINT8 // C (i,j) = x ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp add, // defines '+' for t=u+v - const GrB_Vector u, // first input: vector u - const GrB_Scalar alpha, - const GrB_Vector v, // second input: vector v - const GrB_Scalar beta, - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // matrix to modify + uint8_t x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Matrix_eWiseUnion // C = accum (C, A+B) +GrB_Info GrB_Matrix_setElement_INT16 // C (i,j) = x ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp add, // defines '+' for T=A+B - const GrB_Matrix A, // first input: matrix A - const GrB_Scalar alpha, - const GrB_Matrix B, // second input: matrix B - const GrB_Scalar beta, - const GrB_Descriptor desc // descriptor for C, M, A, and B + GrB_Matrix C, // matrix to modify + int16_t x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index ) ; -#if GxB_STDC_VERSION >= 201112L -#define GxB_eWiseUnion(C,Mask,accum,op,A,alpha,B,beta,desc) \ - _Generic \ - ( \ - (C), \ - GrB_Matrix : GxB_Matrix_eWiseUnion , \ - GrB_Vector : GxB_Vector_eWiseUnion \ - ) \ - (C, Mask, accum, op, A, alpha, B, beta, desc) -#endif +GrB_Info GrB_Matrix_setElement_UINT16 // C (i,j) = x +( + GrB_Matrix C, // matrix to modify + uint16_t x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index +) ; -#endif // GB_CUDA_FOLDER +GrB_Info GrB_Matrix_setElement_INT32 // C (i,j) = x +( + GrB_Matrix C, // matrix to modify + int32_t x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index +) ; -//============================================================================== -// GrB_extract: extract a submatrix or subvector -//============================================================================== - -// Extract entries from a matrix or vector; T = A(I,J). This (like most -// GraphBLAS methods) is then followed by C=accum(C,T). - -// To extract all rows of a matrix or vector, as in A (:,J), use I=GrB_ALL as -// the input argument. For all columns of a matrix, use J=GrB_ALL. - -GB_GLOBAL const uint64_t *GrB_ALL ; - -// To extract a range of rows and columns, I and J can be a list of 2 or 3 -// indices that defines a range (begin:end) or a strided range (begin:inc:end). -// To specify the colon syntax I = begin:end, the array I has size at least 2, -// where I [GxB_BEGIN] = begin and I [GxB_END] = end. The parameter ni is then -// passed as the special value GxB_RANGE. To specify the colon syntax I = -// begin:inc:end, the array I has size at least three, with the values begin, -// end, and inc (in that order), and then pass in the value ni = GxB_STRIDE. -// The same can be done for the list J and its size, nj. - -// These special values of ni and nj can be used for GrB_assign, -// GrB_extract, and GxB_subassign. -#define GxB_RANGE (INT64_MAX) -#define GxB_STRIDE (INT64_MAX-1) -#define GxB_BACKWARDS (INT64_MAX-2) +GrB_Info GrB_Matrix_setElement_UINT32 // C (i,j) = x +( + GrB_Matrix C, // matrix to modify + uint32_t x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index +) ; -// for the strided range begin:inc:end, I [GxB_BEGIN] is the value of begin, I -// [GxB_END] is the value end, I [GxB_INC] is the magnitude of the stride. If -// the stride is negative, use ni = GxB_BACKWARDS. -#define GxB_BEGIN (0) -#define GxB_END (1) -#define GxB_INC (2) +GrB_Info GrB_Matrix_setElement_INT64 // C (i,j) = x +( + GrB_Matrix C, // matrix to modify + int64_t x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index +) ; -// For example, the notation 10:-2:1 defines a sequence [10 8 6 4 2]. -// The end point of the sequence (1) need not appear in the sequence, if -// the last increment goes past it. To specify the same in GraphBLAS, -// use: +GrB_Info GrB_Matrix_setElement_UINT64 // C (i,j) = x +( + GrB_Matrix C, // matrix to modify + uint64_t x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index +) ; -// GrB_Index I [3], ni = GxB_BACKWARDS ; -// I [GxB_BEGIN ] = 10 ; // the start of the sequence -// I [GxB_INC ] = 2 ; // the magnitude of the increment -// I [GxB_END ] = 1 ; // the end of the sequence +GrB_Info GrB_Matrix_setElement_FP32 // C (i,j) = x +( + GrB_Matrix C, // matrix to modify + float x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index +) ; -#ifndef GB_CUDA_FOLDER +GrB_Info GrB_Matrix_setElement_FP64 // C (i,j) = x +( + GrB_Matrix C, // matrix to modify + double x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index +) ; -GrB_Info GrB_Vector_extract // w = accum (w, u(I)) +GrB_Info GxB_Matrix_setElement_FC32 // C (i,j) = x ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_Vector u, // first input: vector u - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // matrix to modify + GxB_FC32_t x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GrB_Matrix_extract // C = accum (C, A(I,J)) +GrB_Info GxB_Matrix_setElement_FC64 // C (i,j) = x ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_Matrix A, // first input: matrix A - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C, Mask, and A + GrB_Matrix C, // matrix to modify + GxB_FC64_t x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GrB_Col_extract // w = accum (w, A(I,j)) +GrB_Info GrB_Matrix_setElement_UDT // C (i,j) = x ( - GrB_Vector w, // input/output matrix for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_Matrix A, // first input: matrix A - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - GrB_Index j, // column index - const GrB_Descriptor desc // descriptor for w, mask, and A + GrB_Matrix C, // matrix to modify + void *x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index ) ; -//------------------------------------------------------------------------------ -// GrB_extract: generic matrix/vector extraction -//------------------------------------------------------------------------------ +GrB_Info GrB_Matrix_setElement_Scalar // C (i,j) = x +( + GrB_Matrix C, // matrix to modify + GrB_Scalar x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index +) ; -// GrB_extract is a generic interface to the following functions: +// Type-generic version: x can be any supported C type or void * for a +// user-defined type. -// GrB_Vector_extract (w,mask,acc,u,I,ni,d) // w = acc (w, u(I)) -// GrB_Col_extract (w,mask,acc,A,I,ni,j,d) // w = acc (w, A(I,j)) -// GrB_Matrix_extract (C,Mask,acc,A,I,ni,J,nj,d) // C = acc (C, A(I,J)) +/* +GrB_Info GrB_Matrix_setElement // C (i,j) = x +( + GrB_Matrix C, // matrix to modify + x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index +) ; +*/ #if GxB_STDC_VERSION >= 201112L -#define GrB_extract(arg1,Mask,accum,arg4,...) \ - _Generic \ - ( \ - (arg1), \ - GrB_Vector : \ - _Generic \ - ( \ - (arg4), \ - GrB_Vector : GrB_Vector_extract , \ - GrB_Matrix : GrB_Col_extract \ - ), \ - GrB_Matrix : GrB_Matrix_extract \ - ) \ - (arg1, Mask, accum, arg4, __VA_ARGS__) +#define GrB_Matrix_setElement(C,x,i,j) \ + _Generic \ + ( \ + (x), \ + GB_CASES (GrB, Matrix_setElement), \ + default: GrB_Matrix_setElement_Scalar \ + ) \ + (C, x, i, j) #endif -//============================================================================== -// GxB_subassign: matrix and vector subassign: C(I,J) = accum (C(I,J), A) -//============================================================================== - -// Assign entries in a matrix or vector; C(I,J) = A. - -// Each GxB_subassign function is very similar to its corresponding GrB_assign -// function in the spec, but they differ in two ways: (1) the mask in -// GxB_subassign has the same size as w(I) for vectors and C(I,J) for matrices, -// and (2) they differ in the GrB_REPLACE option. See the user guide for -// details. - -// In GraphBLAS notation, the two methods can be described as follows: +//------------------------------------------------------------------------------ +// GrB_Matrix_extractElement +//------------------------------------------------------------------------------ -// matrix and vector subassign: C(I,J) = accum (C(I,J), A) -// matrix and vector assign: C(I,J) = accum (C(I,J), A) +// Extract a single entry from a matrix, x = A(i,j), typecasting from the type +// of A to the type of x, as needed. -// --- assign ------------------------------------------------------------------ -// -// GrB_Matrix_assign C(I,J) += A M same size as matrix C. -// A is |I|-by-|J| -// -// GrB_Vector_assign w(I) += u m same size as column vector w. -// u is |I|-by-1 -// -// GrB_Row_assign C(i,J) += u' m is a column vector the same -// size as a row of C. -// u is |J|-by-1, i is a scalar. -// -// GrB_Col_assign C(I,j) += u m is a column vector the same -// size as a column of C. -// u is |I|-by-1, j is a scalar. -// -// --- subassign --------------------------------------------------------------- -// -// GxB_Matrix_subassign C(I,J) += A M same size as matrix A. -// A is |I|-by-|J| -// -// GxB_Vector_subassign w(I) += u m same size as column vector u. -// u is |I|-by-1 -// -// GxB_Row_subassign C(i,J) += u' m same size as column vector u. -// u is |J|-by-1, i is a scalar. -// -// GxB_Col_subassign C(I,j) += u m same size as column vector u. -// u is |I|-by-1, j is a scalar. +GrB_Info GrB_Matrix_extractElement_BOOL // x = A(i,j) +( + bool *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index +) ; -GrB_Info GxB_Vector_subassign // w(I) = accum (w(I),u) +GrB_Info GrB_Matrix_extractElement_INT8 // x = A(i,j) ( - GrB_Vector w, // input/output matrix for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w(I),t) - const GrB_Vector u, // first input: vector u - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask + int8_t *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Matrix_subassign // C(I,J) = accum (C(I,J),A) +GrB_Info GrB_Matrix_extractElement_UINT8 // x = A(i,j) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),T) - const GrB_Matrix A, // first input: matrix A - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J), Mask, and A + uint8_t *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Col_subassign // C(I,j) = accum (C(I,j),u) +GrB_Info GrB_Matrix_extractElement_INT16 // x = A(i,j) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Vector mask, // optional mask for C(I,j), unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(C(I,j),t) - const GrB_Vector u, // input vector - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - GrB_Index j, // column index - const GrB_Descriptor desc // descriptor for C(I,j) and mask + int16_t *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Row_subassign // C(i,J) = accum (C(i,J),u') +GrB_Info GrB_Matrix_extractElement_UINT16 // x = A(i,j) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Vector mask, // optional mask for C(i,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(C(i,J),t) - const GrB_Vector u, // input vector - GrB_Index i, // row index - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(i,J) and mask + uint16_t *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -//------------------------------------------------------------------------------ -// GxB_Vector_subassign_[SCALAR]: scalar expansion assignment to subvector -//------------------------------------------------------------------------------ - -// Assigns a single scalar to a subvector, w(I) = accum(w(I),x). The -// scalar x is implicitly expanded into a vector u of size ni-by-1, with each -// entry in u equal to x, and then w(I) = accum(w(I),u) is done. - -GrB_Info GxB_Vector_subassign_BOOL // w(I) = accum (w(I),x) +GrB_Info GrB_Matrix_extractElement_INT32 // x = A(i,j) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w(I),x) - bool x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask + int32_t *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Vector_subassign_INT8 // w(I) = accum (w(I),x) +GrB_Info GrB_Matrix_extractElement_UINT32 // x = A(i,j) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - int8_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask + uint32_t *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Vector_subassign_UINT8 // w(I) = accum (w(I),x) +GrB_Info GrB_Matrix_extractElement_INT64 // x = A(i,j) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - uint8_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask + int64_t *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Vector_subassign_INT16 // w(I) = accum (w(I),x) +GrB_Info GrB_Matrix_extractElement_UINT64 // x = A(i,j) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - int16_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask + uint64_t *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Vector_subassign_UINT16 // w(I) = accum (w(I),x) +GrB_Info GrB_Matrix_extractElement_FP32 // x = A(i,j) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - uint16_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask + float *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Vector_subassign_INT32 // w(I) = accum (w(I),x) +GrB_Info GrB_Matrix_extractElement_FP64 // x = A(i,j) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - int32_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask + double *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Vector_subassign_UINT32 // w(I) = accum (w(I),x) +GrB_Info GxB_Matrix_extractElement_FC32 // x = A(i,j) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - uint32_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask + GxB_FC32_t *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Vector_subassign_INT64 // w(I) = accum (w(I),x) +GrB_Info GxB_Matrix_extractElement_FC64 // x = A(i,j) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - int64_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask + GxB_FC64_t *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Vector_subassign_UINT64 // w(I) = accum (w(I),x) +GrB_Info GrB_Matrix_extractElement_UDT // x = A(i,j) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - uint64_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask + void *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Vector_subassign_FP32 // w(I) = accum (w(I),x) +GrB_Info GrB_Matrix_extractElement_Scalar // x = A(i,j) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - float x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask + GrB_Scalar x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Vector_subassign_FP64 // w(I) = accum (w(I),x) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - double x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask -) ; +// Type-generic version: x can be a pointer to any supported C type or void * +// for a user-defined type. -GrB_Info GxB_Vector_subassign_FC32 // w(I) = accum (w(I),x) +/* +GrB_Info GrB_Matrix_extractElement // x = A(i,j) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - GxB_FC32_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask + *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; +*/ -GrB_Info GxB_Vector_subassign_FC64 // w(I) = accum (w(I),x) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - GxB_FC64_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask -) ; +#if GxB_STDC_VERSION >= 201112L +#define GrB_Matrix_extractElement(x,A,i,j) \ + _Generic \ + ( \ + (x), \ + GB_PCASES (GrB, Matrix_extractElement), \ + default: GrB_Matrix_extractElement_Scalar \ + ) \ + (x, A, i, j) +#endif -GrB_Info GxB_Vector_subassign_UDT // w(I) = accum (w(I),x) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - void *x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask -) ; +// GxB_Matrix_isStoredElement determines if A(i,j) is present in the structure +// of the matrix A, as a stored element. It does not return the value. It +// returns GrB_SUCCESS if the element is present, or GrB_NO_VALUE otherwise. -GrB_Info GxB_Vector_subassign_Scalar // w(I) = accum (w(I),x) +GrB_Info GxB_Matrix_isStoredElement // determine if A(i,j) is a stored element ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - GrB_Scalar x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask + const GrB_Matrix A, // matrix to check + GrB_Index i, // row index + GrB_Index j // column index ) ; //------------------------------------------------------------------------------ -// GxB_Matrix_subassign_[SCALAR]: scalar expansion assignment to submatrix +// GrB_Matrix_removeElement //------------------------------------------------------------------------------ -// Assigns a single scalar to a submatrix, C(I,J) = accum(C(I,J),x). The -// scalar x is implicitly expanded into a matrix A of size ni-by-nj, with each -// entry in A equal to x, and then C(I,J) = accum(C(I,J),A) is done. +// GrB_Matrix_removeElement (A,i,j) removes the entry A(i,j) from the matrix A. -GrB_Info GxB_Matrix_subassign_BOOL // C(I,J) = accum (C(I,J),x) +GrB_Info GrB_Matrix_removeElement ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - bool x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Matrix C, // matrix to remove entry from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Matrix_subassign_INT8 // C(I,J) = accum (C(I,J),x) +//------------------------------------------------------------------------------ +// GrB_Matrix_extractTuples +//------------------------------------------------------------------------------ + +// Extracts all tuples from a matrix, like [I,J,X] = find (A). If +// any parameter I, J and/or X is NULL, then that component is not extracted. +// For example, to extract just the row and col indices, pass I and J as +// non-NULL, and X as NULL. This is like [I,J,~] = find (A). + +GrB_Info GrB_Matrix_extractTuples_BOOL // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - int8_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + bool *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; -GrB_Info GxB_Matrix_subassign_UINT8 // C(I,J) = accum (C(I,J),x) +GrB_Info GrB_Matrix_extractTuples_INT8 // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - uint8_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + int8_t *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; -GrB_Info GxB_Matrix_subassign_INT16 // C(I,J) = accum (C(I,J),x) +GrB_Info GrB_Matrix_extractTuples_UINT8 // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - int16_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + uint8_t *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; -GrB_Info GxB_Matrix_subassign_UINT16 // C(I,J) = accum (C(I,J),x) +GrB_Info GrB_Matrix_extractTuples_INT16 // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - uint16_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + int16_t *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; -GrB_Info GxB_Matrix_subassign_INT32 // C(I,J) = accum (C(I,J),x) +GrB_Info GrB_Matrix_extractTuples_UINT16 // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - int32_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + uint16_t *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; -GrB_Info GxB_Matrix_subassign_UINT32 // C(I,J) = accum (C(I,J),x) +GrB_Info GrB_Matrix_extractTuples_INT32 // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - uint32_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + int32_t *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; -GrB_Info GxB_Matrix_subassign_INT64 // C(I,J) = accum (C(I,J),x) +GrB_Info GrB_Matrix_extractTuples_UINT32 // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - int64_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + uint32_t *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; -GrB_Info GxB_Matrix_subassign_UINT64 // C(I,J) = accum (C(I,J),x) +GrB_Info GrB_Matrix_extractTuples_INT64 // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - uint64_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + int64_t *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; -GrB_Info GxB_Matrix_subassign_FP32 // C(I,J) = accum (C(I,J),x) +GrB_Info GrB_Matrix_extractTuples_UINT64 // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - float x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + uint64_t *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; -GrB_Info GxB_Matrix_subassign_FP64 // C(I,J) = accum (C(I,J),x) +GrB_Info GrB_Matrix_extractTuples_FP32 // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - double x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + float *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; -GrB_Info GxB_Matrix_subassign_FC32 // C(I,J) = accum (C(I,J),x) +GrB_Info GrB_Matrix_extractTuples_FP64 // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - GxB_FC32_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + double *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; -GrB_Info GxB_Matrix_subassign_FC64 // C(I,J) = accum (C(I,J),x) +GrB_Info GxB_Matrix_extractTuples_FC32 // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - GxB_FC64_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + GxB_FC32_t *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; -GrB_Info GxB_Matrix_subassign_UDT // C(I,J) = accum (C(I,J),x) +GrB_Info GxB_Matrix_extractTuples_FC64 // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - void *x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + GxB_FC64_t *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; -GrB_Info GxB_Matrix_subassign_Scalar // C(I,J) = accum (C(I,J),x) +GrB_Info GrB_Matrix_extractTuples_UDT // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - GrB_Scalar x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + void *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from +) ; + +// Type-generic version: X can be a pointer to any supported C type or void * +// for a user-defined type. + +/* +GrB_Info GrB_Matrix_extractTuples // [I,J,X] = find (A) +( + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; +*/ + +#if GxB_STDC_VERSION >= 201112L +#define GrB_Matrix_extractTuples(Ilist,J,X,nvals,A) \ + _Generic \ + ( \ + (X), \ + GB_PCASES (GrB, Matrix_extractTuples) \ + ) \ + (Ilist, J, X, nvals, A) +#endif //------------------------------------------------------------------------------ -// GxB_subassign: generic submatrix/subvector assignment +// GxB_Matrix_concat and GxB_Matrix_split //------------------------------------------------------------------------------ -// GxB_subassign is a generic function that provides access to all specific -// GxB_*_subassign* functions: +// GxB_Matrix_concat concatenates an array of matrices (Tiles) into a single +// GrB_Matrix C. -// GxB_Vector_subassign (w,m,acc,u,I,ni,d) // w(I) = acc(w(I),u) -// GxB_Matrix_subassign (C,M,acc,A,I,ni,J,nj,d) // C(I,J) = acc(C(I,J),A) -// GxB_Col_subassign (C,m,acc,u,I,ni,j,d) // C(I,j) = acc(C(I,j),u) -// GxB_Row_subassign (C,m,acc,u,i,J,nj,d) // C(i,J) = acc(C(i,J),u') -// GxB_Vector_subassign_T (w,m,acc,x,I,ni,d) // w(I) = acc(w(I),x) -// GxB_Matrix_subassign_T (C,M,acc,x,I,ni,J,nj,d) // C(I,J) = acc(C(I,J),x) +// Tiles is an m-by-n dense array of matrices held in row-major format, where +// Tiles [i*n+j] is the (i,j)th tile, and where m > 0 and n > 0 must hold. Let +// A{i,j} denote the (i,j)th tile. The matrix C is constructed by +// concatenating these tiles together, as: -#if GxB_STDC_VERSION >= 201112L -#define GxB_subassign(arg1,Mask,accum,arg4,arg5,...) \ - _Generic \ - ( \ - (arg1), \ - GrB_Vector : \ - _Generic \ - ( \ - (arg4), \ - GB_CASES (GxB, Vector_subassign) , \ - GrB_Scalar : GxB_Vector_subassign_Scalar, \ - default: GxB_Vector_subassign \ - ), \ - default: \ - _Generic \ - ( \ - (arg4), \ - GB_CASES (GxB, Matrix_subassign) , \ - GrB_Scalar : GxB_Matrix_subassign_Scalar, \ - GrB_Vector : \ - _Generic \ - ( \ - (arg5), \ - const GrB_Index *: GxB_Col_subassign , \ - GrB_Index *: GxB_Col_subassign , \ - default: GxB_Row_subassign \ - ), \ - default: GxB_Matrix_subassign \ - ) \ - ) \ - (arg1, Mask, accum, arg4, arg5, __VA_ARGS__) -#endif - -//============================================================================== -// GrB_assign: matrix and vector assign: C(I,J) = accum (C(I,J), A) -//============================================================================== +// C = [ A{0,0} A{0,1} A{0,2} ... A{0,n-1} +// A{1,0} A{1,1} A{1,2} ... A{1,n-1} +// ... +// A{m-1,0} A{m-1,1} A{m-1,2} ... A{m-1,n-1} ] -// Assign entries in a matrix or vector; C(I,J) = A. -// Each of these can be used with their generic name, GrB_assign. +// On input, the matrix C must already exist. Any existing entries in C are +// discarded. C must have dimensions nrows by ncols where nrows is the sum of +// # of rows in the matrices A{i,0} for all i, and ncols is the sum of the # of +// columns in the matrices A{0,j} for all j. All matrices in any given tile +// row i must have the same number of rows (that is, nrows(A{i,0}) must equal +// nrows(A{i,j}) for all j), and all matrices in any given tile column j must +// have the same number of columns (that is, ncols(A{0,j}) must equal +// ncols(A{i,j}) for all i). -GrB_Info GrB_Vector_assign // w(I) = accum (w(I),u) -( - GrB_Vector w, // input/output matrix for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w(I),t) - const GrB_Vector u, // first input: vector u - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask -) ; +// The type of C is unchanged, and all matrices A{i,j} are typecasted into the +// type of C. Any settings made to C by GrB_set (format by row +// or by column, bitmap switch, hyper switch, and sparsity control) are +// unchanged. -GrB_Info GrB_Matrix_assign // C(I,J) = accum (C(I,J),A) +GrB_Info GxB_Matrix_concat // concatenate a 2D array of matrices ( GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),T) - const GrB_Matrix A, // first input: matrix A - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C, Mask, and A + const GrB_Matrix *Tiles, // 2D row-major array of size m-by-n + const GrB_Index m, + const GrB_Index n, + const GrB_Descriptor desc // unused, except threading control ) ; -GrB_Info GrB_Col_assign // C(I,j) = accum (C(I,j),u) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Vector mask, // optional mask for C(:,j), unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(C(I,j),t) - const GrB_Vector u, // input vector - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - GrB_Index j, // column index - const GrB_Descriptor desc // descriptor for C(:,j) and mask -) ; +// GxB_Matrix_split does the opposite of GxB_Matrix_concat. It splits a single +// input matrix A into a 2D array of tiles. On input, the Tiles array must be +// a non-NULL pointer to a previously allocated array of size at least m*n +// where both m and n must be > 0. The Tiles_nrows array has size m, and +// Tiles_ncols has size n. The (i,j)th tile has dimension +// Tiles_nrows[i]-by-Tiles_ncols[j]. The sum of Tiles_nrows [0:m-1] must equal +// the number of rows of A, and the sum of Tiles_ncols [0:n-1] must equal the +// number of columns of A. The type of each tile is the same as the type of A; +// no typecasting is done. -GrB_Info GrB_Row_assign // C(i,J) = accum (C(i,J),u') +GrB_Info GxB_Matrix_split // split a matrix into 2D array of matrices ( - GrB_Matrix C, // input/output matrix for results - const GrB_Vector mask, // optional mask for C(i,:), unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(C(i,J),t) - const GrB_Vector u, // input vector - GrB_Index i, // row index - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(i,:) and mask + GrB_Matrix *Tiles, // 2D row-major array of size m-by-n + const GrB_Index m, + const GrB_Index n, + const GrB_Index *Tile_nrows, // array of size m + const GrB_Index *Tile_ncols, // array of size n + const GrB_Matrix A, // input matrix to split + const GrB_Descriptor desc // unused, except threading control ) ; //------------------------------------------------------------------------------ -// GrB_Vector_assign_[SCALAR]: scalar expansion assignment to subvector +// GxB_Matrix_diag, GxB_Vector_diag, GrB_Matrix_diag //------------------------------------------------------------------------------ -// Assigns a single scalar to a subvector, w(I) = accum(w(I),x). The -// scalar x is implicitly expanded into a vector u of size ni-by-1, with each -// entry in u equal to x, and then w(I) = accum(w(I),u) is done. +// GrB_Matrix_diag constructs a new matrix from a vector. Let n be the length +// of the v vector, from GrB_Vector_size (&n, v). If k = 0, then C is an +// n-by-n diagonal matrix with the entries from v along the main diagonal of C, +// with C(i,i) = v(i). If k is nonzero, C is square with dimension n+abs(k). +// If k is positive, it denotes diagonals above the main diagonal, with +// C(i,i+k) = v(i). If k is negative, it denotes diagonals below the main +// diagonal of C, with C(i-k,i) = v(i). C is constructed with the same type +// as v. -GrB_Info GrB_Vector_assign_BOOL // w(I) = accum (w(I),x) +GrB_Info GrB_Matrix_diag // build a diagonal matrix from a vector ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w(I),x) - bool x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix *C, // output matrix + const GrB_Vector v, // input vector + int64_t k ) ; -GrB_Info GrB_Vector_assign_INT8 // w(I) = accum (w(I),x) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - int8_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask -) ; +// GrB_Matrix_diag is like GxB_Matrix_diag (&C, v, k, NULL), except that C must +// already exist on input, of the correct size. Any existing entries in C are +// discarded. The type of C is preserved, so that if the type of C and v +// differ, the entries are typecasted into the type of C. Any settings made to +// C by GrB_set (format by row or by column, bitmap switch, hyper +// switch, and sparsity control) are unchanged. -GrB_Info GrB_Vector_assign_UINT8 // w(I) = accum (w(I),x) +GrB_Info GxB_Matrix_diag // construct a diagonal matrix from a vector ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - uint8_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // output matrix + const GrB_Vector v, // input vector + int64_t k, + const GrB_Descriptor desc // to specify # of threads ) ; -GrB_Info GrB_Vector_assign_INT16 // w(I) = accum (w(I),x) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - int16_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask -) ; +// GxB_Vector_diag extracts a vector v from an input matrix A, which may be +// rectangular. If k = 0, the main diagonal of A is extracted; k > 0 denotes +// diagonals above the main diagonal of A, and k < 0 denotes diagonals below +// the main diagonal of A. Let A have dimension m-by-n. If k is in the range +// 0 to n-1, then v has length min(m,n-k). If k is negative and in the range +// -1 to -m+1, then v has length min(m+k,n). If k is outside these ranges, +// v has length 0 (this is not an error). -GrB_Info GrB_Vector_assign_UINT16 // w(I) = accum (w(I),x) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - uint16_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask -) ; +// v must already exist on input, of the correct length; that is +// GrB_Vector_size (&len,v) must return len = 0 if k >= n or k <= -m, len = +// min(m,n-k) if k is in the range 0 to n-1, and len = min(m+k,n) if k is in +// the range -1 to -m+1. Any existing entries in v are discarded. The type of +// v is preserved, so that if the type of A and v differ, the entries are +// typecasted into the type of v. Any settings made to v by +// GrB_set (bitmap switch and sparsity control) are unchanged. -GrB_Info GrB_Vector_assign_INT32 // w(I) = accum (w(I),x) +GrB_Info GxB_Vector_diag // extract a diagonal from a matrix, as a vector ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - int32_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask + GrB_Vector v, // output vector + const GrB_Matrix A, // input matrix + int64_t k, + const GrB_Descriptor desc // unused, except threading control ) ; -GrB_Info GrB_Vector_assign_UINT32 // w(I) = accum (w(I),x) +//============================================================================== +// GxB_Context: for managing computational resources +//============================================================================== + +GrB_Info GxB_Context_new // create a new Context ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - uint32_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask + GxB_Context *Context // handle of Context to create ) ; -GrB_Info GrB_Vector_assign_INT64 // w(I) = accum (w(I),x) +GrB_Info GxB_Context_free // free a Context ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - int64_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask + GxB_Context *Context // handle of Context to free ) ; -GrB_Info GrB_Vector_assign_UINT64 // w(I) = accum (w(I),x) +GrB_Info GxB_Context_engage // engage a Context ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - uint64_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask + GxB_Context Context // Context to engage ) ; -GrB_Info GrB_Vector_assign_FP32 // w(I) = accum (w(I),x) +GrB_Info GxB_Context_disengage // disengage a Context ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - float x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask + GxB_Context Context // Context to disengage ) ; -GrB_Info GrB_Vector_assign_FP64 // w(I) = accum (w(I),x) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - double x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask -) ; +//============================================================================== +// GxB_set and GxB_get: historical; use GrB_set and GrB_get instead +//============================================================================== -GrB_Info GxB_Vector_assign_FC32 // w(I) = accum (w(I),x) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - GxB_FC32_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask -) ; +// historical: use GrB_set and GrB_get instead of these methods: +GrB_Info GxB_Matrix_Option_set (GrB_Matrix, GxB_Option_Field, ...) ; +GrB_Info GxB_Matrix_Option_set_INT32 (GrB_Matrix, GxB_Option_Field, int32_t) ; +GrB_Info GxB_Matrix_Option_set_FP64 (GrB_Matrix, GxB_Option_Field, double) ; +GrB_Info GxB_Matrix_Option_get (GrB_Matrix, GxB_Option_Field, ...) ; +GrB_Info GxB_Matrix_Option_get_INT32 (GrB_Matrix, GxB_Option_Field, int32_t *) ; +GrB_Info GxB_Matrix_Option_get_FP64 (GrB_Matrix, GxB_Option_Field, double *) ; +GrB_Info GxB_Vector_Option_set (GrB_Vector, GxB_Option_Field, ...) ; +GrB_Info GxB_Vector_Option_set_INT32 (GrB_Vector, GxB_Option_Field, int32_t) ; +GrB_Info GxB_Vector_Option_set_FP64 (GrB_Vector, GxB_Option_Field, double) ; +GrB_Info GxB_Vector_Option_get (GrB_Vector, GxB_Option_Field, ...) ; +GrB_Info GxB_Vector_Option_get_INT32 (GrB_Vector, GxB_Option_Field, int32_t *) ; +GrB_Info GxB_Vector_Option_get_FP64 (GrB_Vector, GxB_Option_Field, double *) ; +GrB_Info GxB_Global_Option_set (GxB_Option_Field, ...) ; +GrB_Info GxB_Global_Option_set_INT32 (GxB_Option_Field, int32_t) ; +GrB_Info GxB_Global_Option_set_FP64 (GxB_Option_Field, double) ; +GrB_Info GxB_Global_Option_set_FP64_ARRAY (GxB_Option_Field, double *) ; +GrB_Info GxB_Global_Option_set_INT64_ARRAY (GxB_Option_Field, int64_t *) ; +GrB_Info GxB_Global_Option_set_CHAR (GxB_Option_Field, const char *) ; +GrB_Info GxB_Global_Option_set_FUNCTION (GxB_Option_Field, void *) ; +GrB_Info GxB_Global_Option_get (GxB_Option_Field, ...) ; +GrB_Info GxB_Global_Option_get_INT32 (GxB_Option_Field, int32_t *) ; +GrB_Info GxB_Global_Option_get_FP64 (GxB_Option_Field, double *) ; +GrB_Info GxB_Global_Option_get_INT64 (GxB_Option_Field, int64_t *) ; +GrB_Info GxB_Global_Option_get_CHAR (GxB_Option_Field, const char **) ; +GrB_Info GxB_Global_Option_get_FUNCTION (GxB_Option_Field, void **) ; +GrB_Info GxB_Context_set_INT32 (GxB_Context, GxB_Context_Field, int32_t) ; +GrB_Info GxB_Context_set_FP64 (GxB_Context, GxB_Context_Field, double) ; +GrB_Info GxB_Context_set (GxB_Context, GxB_Context_Field, ...) ; +GrB_Info GxB_Context_get_INT32 (GxB_Context, GxB_Context_Field, int32_t *) ; +GrB_Info GxB_Context_get_FP64 (GxB_Context, GxB_Context_Field, double *) ; +GrB_Info GxB_Context_get (GxB_Context, GxB_Context_Field, ...) ; -GrB_Info GxB_Vector_assign_FC64 // w(I) = accum (w(I),x) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - GxB_FC64_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask -) ; +#if GxB_STDC_VERSION >= 201112L +#define GxB_set(arg1,...) \ + _Generic \ + ( \ + (arg1), \ + default: GxB_Global_Option_set , \ + GxB_Option_Field : GxB_Global_Option_set , \ + GrB_Vector : GxB_Vector_Option_set , \ + GrB_Matrix : GxB_Matrix_Option_set , \ + GrB_Descriptor : GxB_Desc_set , \ + GxB_Context : GxB_Context_set \ + ) \ + (arg1, __VA_ARGS__) -GrB_Info GrB_Vector_assign_UDT // w(I) = accum (w(I),x) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - void *x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask -) ; +#define GxB_get(arg1,...) \ + _Generic \ + ( \ + (arg1), \ + default: GxB_Global_Option_get , \ + GxB_Option_Field : GxB_Global_Option_get , \ + GrB_Vector : GxB_Vector_Option_get , \ + GrB_Matrix : GxB_Matrix_Option_get , \ + GrB_Descriptor : GxB_Desc_get , \ + GxB_Context : GxB_Context_get \ + ) \ + (arg1, __VA_ARGS__) +#endif -GrB_Info GrB_Vector_assign_Scalar // w(I) = accum (w(I),x) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - GrB_Scalar x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask -) ; +//============================================================================== +// GrB_set and GrB_get +//============================================================================== //------------------------------------------------------------------------------ -// GrB_Matrix_assign_[SCALAR]: scalar expansion assignment to submatrix +// GrB_get: get a scalar, string, enum, size, or void * from an object //------------------------------------------------------------------------------ -// Assigns a single scalar to a submatrix, C(I,J) = accum(C(I,J),x). The -// scalar x is implicitly expanded into a matrix A of size ni-by-nj, with each -// entry in A equal to x, and then C(I,J) = accum(C(I,J),A) is done. +GrB_Info GrB_Scalar_get_Scalar (GrB_Scalar, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Scalar_get_String (GrB_Scalar, char * , GrB_Field) ; +GrB_Info GrB_Scalar_get_INT32 (GrB_Scalar, int32_t * , GrB_Field) ; +GrB_Info GrB_Scalar_get_SIZE (GrB_Scalar, size_t * , GrB_Field) ; +GrB_Info GrB_Scalar_get_VOID (GrB_Scalar, void * , GrB_Field) ; -GrB_Info GrB_Matrix_assign_BOOL // C(I,J) = accum (C(I,J),x) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - bool x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask -) ; +GrB_Info GrB_Vector_get_Scalar (GrB_Vector, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Vector_get_String (GrB_Vector, char * , GrB_Field) ; +GrB_Info GrB_Vector_get_INT32 (GrB_Vector, int32_t * , GrB_Field) ; +GrB_Info GrB_Vector_get_SIZE (GrB_Vector, size_t * , GrB_Field) ; +GrB_Info GrB_Vector_get_VOID (GrB_Vector, void * , GrB_Field) ; -GrB_Info GrB_Matrix_assign_INT8 // C(I,J) = accum (C(I,J),x) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - int8_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask -) ; +GrB_Info GrB_Matrix_get_Scalar (GrB_Matrix, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Matrix_get_String (GrB_Matrix, char * , GrB_Field) ; +GrB_Info GrB_Matrix_get_INT32 (GrB_Matrix, int32_t * , GrB_Field) ; +GrB_Info GrB_Matrix_get_SIZE (GrB_Matrix, size_t * , GrB_Field) ; +GrB_Info GrB_Matrix_get_VOID (GrB_Matrix, void * , GrB_Field) ; -GrB_Info GrB_Matrix_assign_UINT8 // C(I,J) = accum (C(I,J),x) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - uint8_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask -) ; +GrB_Info GxB_Serialized_get_Scalar (const void *, GrB_Scalar, GrB_Field, size_t) ; +GrB_Info GxB_Serialized_get_String (const void *, char * , GrB_Field, size_t) ; +GrB_Info GxB_Serialized_get_INT32 (const void *, int32_t * , GrB_Field, size_t) ; +GrB_Info GxB_Serialized_get_SIZE (const void *, size_t * , GrB_Field, size_t) ; +GrB_Info GxB_Serialized_get_VOID (const void *, void * , GrB_Field, size_t) ; -GrB_Info GrB_Matrix_assign_INT16 // C(I,J) = accum (C(I,J),x) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - int16_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask -) ; +GrB_Info GrB_UnaryOp_get_Scalar (GrB_UnaryOp, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_UnaryOp_get_String (GrB_UnaryOp, char * , GrB_Field) ; +GrB_Info GrB_UnaryOp_get_INT32 (GrB_UnaryOp, int32_t * , GrB_Field) ; +GrB_Info GrB_UnaryOp_get_SIZE (GrB_UnaryOp, size_t * , GrB_Field) ; +GrB_Info GrB_UnaryOp_get_VOID (GrB_UnaryOp, void * , GrB_Field) ; -GrB_Info GrB_Matrix_assign_UINT16 // C(I,J) = accum (C(I,J),x) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - uint16_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask -) ; +GrB_Info GrB_IndexUnaryOp_get_Scalar (GrB_IndexUnaryOp, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_IndexUnaryOp_get_String (GrB_IndexUnaryOp, char * , GrB_Field) ; +GrB_Info GrB_IndexUnaryOp_get_INT32 (GrB_IndexUnaryOp, int32_t * , GrB_Field) ; +GrB_Info GrB_IndexUnaryOp_get_SIZE (GrB_IndexUnaryOp, size_t * , GrB_Field) ; +GrB_Info GrB_IndexUnaryOp_get_VOID (GrB_IndexUnaryOp, void * , GrB_Field) ; -GrB_Info GrB_Matrix_assign_INT32 // C(I,J) = accum (C(I,J),x) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - int32_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask -) ; +GrB_Info GrB_BinaryOp_get_Scalar (GrB_BinaryOp, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_BinaryOp_get_String (GrB_BinaryOp, char * , GrB_Field) ; +GrB_Info GrB_BinaryOp_get_INT32 (GrB_BinaryOp, int32_t * , GrB_Field) ; +GrB_Info GrB_BinaryOp_get_SIZE (GrB_BinaryOp, size_t * , GrB_Field) ; +GrB_Info GrB_BinaryOp_get_VOID (GrB_BinaryOp, void * , GrB_Field) ; -GrB_Info GrB_Matrix_assign_UINT32 // C(I,J) = accum (C(I,J),x) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - uint32_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask -) ; +GrB_Info GrB_Monoid_get_Scalar (GrB_Monoid, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Monoid_get_String (GrB_Monoid, char * , GrB_Field) ; +GrB_Info GrB_Monoid_get_INT32 (GrB_Monoid, int32_t * , GrB_Field) ; +GrB_Info GrB_Monoid_get_SIZE (GrB_Monoid, size_t * , GrB_Field) ; +GrB_Info GrB_Monoid_get_VOID (GrB_Monoid, void * , GrB_Field) ; -GrB_Info GrB_Matrix_assign_INT64 // C(I,J) = accum (C(I,J),x) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - int64_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask -) ; +GrB_Info GrB_Semiring_get_Scalar (GrB_Semiring, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Semiring_get_String (GrB_Semiring, char * , GrB_Field) ; +GrB_Info GrB_Semiring_get_INT32 (GrB_Semiring, int32_t * , GrB_Field) ; +GrB_Info GrB_Semiring_get_SIZE (GrB_Semiring, size_t * , GrB_Field) ; +GrB_Info GrB_Semiring_get_VOID (GrB_Semiring, void * , GrB_Field) ; -GrB_Info GrB_Matrix_assign_UINT64 // C(I,J) = accum (C(I,J),x) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - uint64_t x, // scalar to assign to C(I,J) +GrB_Info GrB_Descriptor_get_Scalar (GrB_Descriptor, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Descriptor_get_String (GrB_Descriptor, char * , GrB_Field) ; +GrB_Info GrB_Descriptor_get_INT32 (GrB_Descriptor, int32_t * , GrB_Field) ; +GrB_Info GrB_Descriptor_get_SIZE (GrB_Descriptor, size_t * , GrB_Field) ; +GrB_Info GrB_Descriptor_get_VOID (GrB_Descriptor, void * , GrB_Field) ; + +GrB_Info GrB_Type_get_Scalar (GrB_Type, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Type_get_String (GrB_Type, char * , GrB_Field) ; +GrB_Info GrB_Type_get_INT32 (GrB_Type, int32_t * , GrB_Field) ; +GrB_Info GrB_Type_get_SIZE (GrB_Type, size_t * , GrB_Field) ; +GrB_Info GrB_Type_get_VOID (GrB_Type, void * , GrB_Field) ; + +GrB_Info GrB_Global_get_Scalar (GrB_Global, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Global_get_String (GrB_Global, char * , GrB_Field) ; +GrB_Info GrB_Global_get_INT32 (GrB_Global, int32_t * , GrB_Field) ; +GrB_Info GrB_Global_get_SIZE (GrB_Global, size_t * , GrB_Field) ; +GrB_Info GrB_Global_get_VOID (GrB_Global, void * , GrB_Field) ; + +GrB_Info GxB_Context_get_Scalar (GxB_Context, GrB_Scalar, GrB_Field) ; +GrB_Info GxB_Context_get_String (GxB_Context, char * , GrB_Field) ; +GrB_Info GxB_Context_get_INT (GxB_Context, int32_t * , GrB_Field) ; +GrB_Info GxB_Context_get_SIZE (GxB_Context, size_t * , GrB_Field) ; +GrB_Info GxB_Context_get_VOID (GxB_Context, void * , GrB_Field) ; + +// GrB_get (object, value, field): +#if GxB_STDC_VERSION >= 201112L +#define GrB_get(object,value,...) \ + _Generic \ + ( \ + (object), \ + GrB_Scalar : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Scalar_get_Scalar , \ + char * : GrB_Scalar_get_String , \ + int32_t * : GrB_Scalar_get_INT32 , \ + size_t * : GrB_Scalar_get_SIZE , \ + void * : GrB_Scalar_get_VOID \ + ) , \ + GrB_Vector : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Vector_get_Scalar , \ + char * : GrB_Vector_get_String , \ + int32_t * : GrB_Vector_get_INT32 , \ + size_t * : GrB_Vector_get_SIZE , \ + void * : GrB_Vector_get_VOID \ + ) , \ + GrB_Matrix : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Matrix_get_Scalar , \ + char * : GrB_Matrix_get_String , \ + int32_t * : GrB_Matrix_get_INT32 , \ + size_t * : GrB_Matrix_get_SIZE , \ + void * : GrB_Matrix_get_VOID \ + ) , \ + GrB_UnaryOp : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_UnaryOp_get_Scalar , \ + char * : GrB_UnaryOp_get_String , \ + int32_t * : GrB_UnaryOp_get_INT32 , \ + size_t * : GrB_UnaryOp_get_SIZE , \ + void * : GrB_UnaryOp_get_VOID \ + ) , \ + GrB_IndexUnaryOp : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_IndexUnaryOp_get_Scalar , \ + char * : GrB_IndexUnaryOp_get_String , \ + int32_t * : GrB_IndexUnaryOp_get_INT32 , \ + size_t * : GrB_IndexUnaryOp_get_SIZE , \ + void * : GrB_IndexUnaryOp_get_VOID \ + ) , \ + GrB_BinaryOp : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_BinaryOp_get_Scalar , \ + char * : GrB_BinaryOp_get_String , \ + int32_t * : GrB_BinaryOp_get_INT32 , \ + size_t * : GrB_BinaryOp_get_SIZE , \ + void * : GrB_BinaryOp_get_VOID \ + ) , \ + GrB_Monoid : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Monoid_get_Scalar , \ + char * : GrB_Monoid_get_String , \ + int32_t * : GrB_Monoid_get_INT32 , \ + size_t * : GrB_Monoid_get_SIZE , \ + void * : GrB_Monoid_get_VOID \ + ) , \ + GrB_Semiring : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Semiring_get_Scalar , \ + char * : GrB_Semiring_get_String , \ + int32_t * : GrB_Semiring_get_INT32 , \ + size_t * : GrB_Semiring_get_SIZE , \ + void * : GrB_Semiring_get_VOID \ + ) , \ + GrB_Type : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Type_get_Scalar , \ + char * : GrB_Type_get_String , \ + int32_t * : GrB_Type_get_INT32 , \ + size_t * : GrB_Type_get_SIZE , \ + void * : GrB_Type_get_VOID \ + ) , \ + GrB_Descriptor : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Descriptor_get_Scalar , \ + char * : GrB_Descriptor_get_String , \ + int32_t * : GrB_Descriptor_get_INT32 , \ + size_t * : GrB_Descriptor_get_SIZE , \ + void * : GrB_Descriptor_get_VOID \ + ) , \ + GrB_Global : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Global_get_Scalar , \ + char * : GrB_Global_get_String , \ + int32_t * : GrB_Global_get_INT32 , \ + size_t * : GrB_Global_get_SIZE , \ + void * : GrB_Global_get_VOID \ + ) , \ + GxB_Context : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GxB_Context_get_Scalar , \ + char * : GxB_Context_get_String , \ + int32_t * : GxB_Context_get_INT , \ + size_t * : GxB_Context_get_SIZE , \ + void * : GxB_Context_get_VOID \ + ) , \ + const void *: \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GxB_Serialized_get_Scalar , \ + char * : GxB_Serialized_get_String , \ + int32_t * : GxB_Serialized_get_INT32 , \ + size_t * : GxB_Serialized_get_SIZE , \ + void * : GxB_Serialized_get_VOID \ + ) , \ + void *: \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GxB_Serialized_get_Scalar , \ + char * : GxB_Serialized_get_String , \ + int32_t * : GxB_Serialized_get_INT32 , \ + size_t * : GxB_Serialized_get_SIZE , \ + void * : GxB_Serialized_get_VOID \ + ) \ + ) (object, value, __VA_ARGS__) +#endif + +//------------------------------------------------------------------------------ +// GrB_set: set a scalar, string, enum, size, or void * of an object +//------------------------------------------------------------------------------ + +GrB_Info GrB_Scalar_set_Scalar (GrB_Scalar, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Scalar_set_String (GrB_Scalar, char * , GrB_Field) ; +GrB_Info GrB_Scalar_set_INT32 (GrB_Scalar, int32_t , GrB_Field) ; +GrB_Info GrB_Scalar_set_VOID (GrB_Scalar, void * , GrB_Field, size_t) ; + +GrB_Info GrB_Vector_set_Scalar (GrB_Vector, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Vector_set_String (GrB_Vector, char * , GrB_Field) ; +GrB_Info GrB_Vector_set_INT32 (GrB_Vector, int32_t , GrB_Field) ; +GrB_Info GrB_Vector_set_VOID (GrB_Vector, void * , GrB_Field, size_t) ; + +GrB_Info GrB_Matrix_set_Scalar (GrB_Matrix, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Matrix_set_String (GrB_Matrix, char * , GrB_Field) ; +GrB_Info GrB_Matrix_set_INT32 (GrB_Matrix, int32_t , GrB_Field) ; +GrB_Info GrB_Matrix_set_VOID (GrB_Matrix, void * , GrB_Field, size_t) ; + +GrB_Info GrB_UnaryOp_set_Scalar (GrB_UnaryOp, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_UnaryOp_set_String (GrB_UnaryOp, char * , GrB_Field) ; +GrB_Info GrB_UnaryOp_set_INT32 (GrB_UnaryOp, int32_t , GrB_Field) ; +GrB_Info GrB_UnaryOp_set_VOID (GrB_UnaryOp, void * , GrB_Field, size_t) ; + +GrB_Info GrB_IndexUnaryOp_set_Scalar (GrB_IndexUnaryOp, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_IndexUnaryOp_set_String (GrB_IndexUnaryOp, char * , GrB_Field) ; +GrB_Info GrB_IndexUnaryOp_set_INT32 (GrB_IndexUnaryOp, int32_t , GrB_Field) ; +GrB_Info GrB_IndexUnaryOp_set_VOID (GrB_IndexUnaryOp, void * , GrB_Field, + size_t) ; + +GrB_Info GrB_BinaryOp_set_Scalar (GrB_BinaryOp, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_BinaryOp_set_String (GrB_BinaryOp, char * , GrB_Field) ; +GrB_Info GrB_BinaryOp_set_INT32 (GrB_BinaryOp, int32_t , GrB_Field) ; +GrB_Info GrB_BinaryOp_set_VOID (GrB_BinaryOp, void * , GrB_Field, size_t) ; + +GrB_Info GrB_Monoid_set_Scalar (GrB_Monoid, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Monoid_set_String (GrB_Monoid, char * , GrB_Field) ; +GrB_Info GrB_Monoid_set_INT32 (GrB_Monoid, int32_t , GrB_Field) ; +GrB_Info GrB_Monoid_set_VOID (GrB_Monoid, void * , GrB_Field, size_t) ; + +GrB_Info GrB_Semiring_set_Scalar (GrB_Semiring, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Semiring_set_String (GrB_Semiring, char * , GrB_Field) ; +GrB_Info GrB_Semiring_set_INT32 (GrB_Semiring, int32_t , GrB_Field) ; +GrB_Info GrB_Semiring_set_VOID (GrB_Semiring, void * , GrB_Field, size_t) ; + +GrB_Info GrB_Descriptor_set_Scalar (GrB_Descriptor, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Descriptor_set_String (GrB_Descriptor, char * , GrB_Field) ; +GrB_Info GrB_Descriptor_set_INT32 (GrB_Descriptor, int32_t , GrB_Field) ; +GrB_Info GrB_Descriptor_set_VOID (GrB_Descriptor, void * , GrB_Field, + size_t) ; + +GrB_Info GrB_Type_set_Scalar (GrB_Type, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Type_set_String (GrB_Type, char * , GrB_Field) ; +GrB_Info GrB_Type_set_INT32 (GrB_Type, int32_t , GrB_Field) ; +GrB_Info GrB_Type_set_VOID (GrB_Type, void * , GrB_Field, size_t) ; + +GrB_Info GrB_Global_set_Scalar (GrB_Global, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Global_set_String (GrB_Global, char * , GrB_Field) ; +GrB_Info GrB_Global_set_INT32 (GrB_Global, int32_t , GrB_Field) ; +GrB_Info GrB_Global_set_VOID (GrB_Global, void * , GrB_Field, size_t) ; + +GrB_Info GxB_Context_set_Scalar (GxB_Context, GrB_Scalar, GrB_Field) ; +GrB_Info GxB_Context_set_String (GxB_Context, char * , GrB_Field) ; +GrB_Info GxB_Context_set_INT (GxB_Context, int32_t , GrB_Field) ; +GrB_Info GxB_Context_set_VOID (GxB_Context, void * , GrB_Field, size_t) ; + +// GrB_set (object, value, field) or (object, value, field, size) for _VOID +#if GxB_STDC_VERSION >= 201112L +#define GrB_set(object,value,...) \ + _Generic \ + ( \ + (object), \ + GrB_Scalar : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Scalar_set_Scalar , \ + char * : GrB_Scalar_set_String , \ + int32_t : GrB_Scalar_set_INT32 , \ + void * : GrB_Scalar_set_VOID \ + ) , \ + GrB_Vector : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Vector_set_Scalar , \ + char * : GrB_Vector_set_String , \ + int32_t : GrB_Vector_set_INT32 , \ + void * : GrB_Vector_set_VOID \ + ) , \ + GrB_Matrix : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Matrix_set_Scalar , \ + char * : GrB_Matrix_set_String , \ + int32_t : GrB_Matrix_set_INT32 , \ + void * : GrB_Matrix_set_VOID \ + ) , \ + GrB_UnaryOp : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_UnaryOp_set_Scalar , \ + char * : GrB_UnaryOp_set_String , \ + int32_t : GrB_UnaryOp_set_INT32 , \ + void * : GrB_UnaryOp_set_VOID \ + ) , \ + GrB_IndexUnaryOp : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_IndexUnaryOp_set_Scalar , \ + char * : GrB_IndexUnaryOp_set_String , \ + int32_t : GrB_IndexUnaryOp_set_INT32 , \ + void * : GrB_IndexUnaryOp_set_VOID \ + ) , \ + GrB_BinaryOp : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_BinaryOp_set_Scalar , \ + char * : GrB_BinaryOp_set_String , \ + int32_t : GrB_BinaryOp_set_INT32 , \ + void * : GrB_BinaryOp_set_VOID \ + ) , \ + GrB_Monoid : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Monoid_set_Scalar , \ + char * : GrB_Monoid_set_String , \ + int32_t : GrB_Monoid_set_INT32 , \ + void * : GrB_Monoid_set_VOID \ + ) , \ + GrB_Semiring : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Semiring_set_Scalar , \ + char * : GrB_Semiring_set_String , \ + int32_t : GrB_Semiring_set_INT32 , \ + void * : GrB_Semiring_set_VOID \ + ) , \ + GrB_Type : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Type_set_Scalar , \ + char * : GrB_Type_set_String , \ + int32_t : GrB_Type_set_INT32 , \ + void * : GrB_Type_set_VOID \ + ) , \ + GrB_Descriptor : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Descriptor_set_Scalar , \ + char * : GrB_Descriptor_set_String , \ + int32_t : GrB_Descriptor_set_INT32 , \ + void * : GrB_Descriptor_set_VOID \ + ) , \ + GrB_Global : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Global_set_Scalar , \ + char * : GrB_Global_set_String , \ + int32_t : GrB_Global_set_INT32 , \ + void * : GrB_Global_set_VOID \ + ) , \ + GxB_Context : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GxB_Context_set_Scalar , \ + char * : GxB_Context_set_String , \ + int32_t : GxB_Context_set_INT , \ + void * : GxB_Context_set_VOID \ + ) \ + ) (object, value, __VA_ARGS__) +#endif + +//============================================================================== +// GrB_free: free any GraphBLAS object +//============================================================================== + +#if GxB_STDC_VERSION >= 201112L +#define GrB_free(object) \ + _Generic \ + ( \ + (object), \ + GrB_Type *: GrB_Type_free , \ + GrB_UnaryOp *: GrB_UnaryOp_free , \ + GrB_BinaryOp *: GrB_BinaryOp_free , \ + GrB_IndexUnaryOp *: GrB_IndexUnaryOp_free , \ + GrB_Monoid *: GrB_Monoid_free , \ + GrB_Semiring *: GrB_Semiring_free , \ + GrB_Scalar *: GrB_Scalar_free , \ + GrB_Vector *: GrB_Vector_free , \ + GrB_Matrix *: GrB_Matrix_free , \ + GrB_Descriptor *: GrB_Descriptor_free , \ + GxB_Context *: GxB_Context_free , \ + GxB_Iterator *: GxB_Iterator_free \ + ) \ + (object) +#endif + +//============================================================================== +// GrB_wait: finish computations +//============================================================================== + +// Finish all pending work in a specific object. + +GrB_Info GrB_Type_wait (GrB_Type type , GrB_WaitMode waitmode); +GrB_Info GrB_UnaryOp_wait (GrB_UnaryOp op , GrB_WaitMode waitmode); +GrB_Info GrB_BinaryOp_wait (GrB_BinaryOp op , GrB_WaitMode waitmode); +GrB_Info GrB_IndexUnaryOp_wait (GrB_IndexUnaryOp op , GrB_WaitMode waitmode); +GrB_Info GrB_Monoid_wait (GrB_Monoid monoid , GrB_WaitMode waitmode); +GrB_Info GrB_Semiring_wait (GrB_Semiring semiring, GrB_WaitMode waitmode); +GrB_Info GrB_Descriptor_wait (GrB_Descriptor desc , GrB_WaitMode waitmode); +GrB_Info GrB_Scalar_wait (GrB_Scalar s , GrB_WaitMode waitmode); +GrB_Info GrB_Vector_wait (GrB_Vector v , GrB_WaitMode waitmode); +GrB_Info GrB_Matrix_wait (GrB_Matrix A , GrB_WaitMode waitmode); +GrB_Info GxB_Context_wait (GxB_Context Context , GrB_WaitMode waitmode); + +// GrB_wait (object,waitmode) polymorphic function: +#if GxB_STDC_VERSION >= 201112L +#define GrB_wait(object,waitmode) \ + _Generic \ + ( \ + (object), \ + GrB_Type : GrB_Type_wait , \ + GrB_UnaryOp : GrB_UnaryOp_wait , \ + GrB_BinaryOp : GrB_BinaryOp_wait , \ + GrB_IndexUnaryOp : GrB_IndexUnaryOp_wait , \ + GrB_Monoid : GrB_Monoid_wait , \ + GrB_Semiring : GrB_Semiring_wait , \ + GrB_Scalar : GrB_Scalar_wait , \ + GrB_Vector : GrB_Vector_wait , \ + GrB_Matrix : GrB_Matrix_wait , \ + GxB_Context : GxB_Context_wait , \ + GrB_Descriptor : GrB_Descriptor_wait \ + ) \ + (object, waitmode) +#endif + +// NOTE: GxB_Scalar_wait is historical; use GrB_Scalar_wait instead +GrB_Info GxB_Scalar_wait (GrB_Scalar *s) ; + +//============================================================================== +// GrB_error: error handling +//============================================================================== + +// Each GraphBLAS method and operation returns a GrB_Info error code. +// GrB_error returns additional information on the error in a thread-safe +// null-terminated string. The string returned by GrB_error is owned by +// the GraphBLAS library and must not be free'd. + +GrB_Info GrB_Type_error (const char **error, const GrB_Type type) ; +GrB_Info GrB_UnaryOp_error (const char **error, const GrB_UnaryOp op) ; +GrB_Info GrB_BinaryOp_error (const char **error, const GrB_BinaryOp op) ; +GrB_Info GrB_IndexUnaryOp_error (const char **error, const GrB_IndexUnaryOp op) ; +GrB_Info GrB_Monoid_error (const char **error, const GrB_Monoid monoid) ; +GrB_Info GrB_Semiring_error (const char **error, const GrB_Semiring semiring) ; +GrB_Info GrB_Scalar_error (const char **error, const GrB_Scalar s) ; +GrB_Info GrB_Vector_error (const char **error, const GrB_Vector v) ; +GrB_Info GrB_Matrix_error (const char **error, const GrB_Matrix A) ; +GrB_Info GrB_Descriptor_error (const char **error, const GrB_Descriptor d) ; +// GxB_Scalar_error is historical: use GrB_Scalar_error instead +GrB_Info GxB_Scalar_error (const char **error, const GrB_Scalar s) ; +GrB_Info GxB_Context_error (const char **error, const GxB_Context Context); + +// GrB_error (error,object) polymorphic function: +#if GxB_STDC_VERSION >= 201112L +#define GrB_error(error,object) \ + _Generic \ + ( \ + (object), \ + GrB_Type : GrB_Type_error , \ + GrB_UnaryOp : GrB_UnaryOp_error , \ + GrB_BinaryOp : GrB_BinaryOp_error , \ + GrB_IndexUnaryOp : GrB_IndexUnaryOp_error , \ + GrB_Monoid : GrB_Monoid_error , \ + GrB_Semiring : GrB_Semiring_error , \ + GrB_Scalar : GrB_Scalar_error , \ + GrB_Vector : GrB_Vector_error , \ + GrB_Matrix : GrB_Matrix_error , \ + GxB_Context : GxB_Context_error , \ + GrB_Descriptor : GrB_Descriptor_error \ + ) \ + (error, object) +#endif + +//============================================================================== +// GrB_mxm, vxm, mxv: matrix multiplication over a semiring +//============================================================================== + +GrB_Info GrB_mxm // C = accum (C, A*B) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_Semiring semiring, // defines '+' and '*' for A*B + const GrB_Matrix A, // first input: matrix A + const GrB_Matrix B, // second input: matrix B + const GrB_Descriptor desc // descriptor for C, Mask, A, and B +) ; + +GrB_Info GrB_vxm // w' = accum (w, u'*A) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_Semiring semiring, // defines '+' and '*' for u'*A + const GrB_Vector u, // first input: vector u + const GrB_Matrix A, // second input: matrix A + const GrB_Descriptor desc // descriptor for w, mask, and A +) ; + +GrB_Info GrB_mxv // w = accum (w, A*u) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_Semiring semiring, // defines '+' and '*' for A*B + const GrB_Matrix A, // first input: matrix A + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w, mask, and A +) ; + +//============================================================================== +// GrB_eWiseMult: element-wise matrix and vector operations, set intersection +//============================================================================== + +// GrB_eWiseMult computes C = accum (C, A.*B), where ".*" is the Hadamard +// product, and where pairs of elements in two matrices (or vectors) are +// pairwise "multiplied" with C(i,j) = mult (A(i,j),B(i,j)). + +GrB_Info GrB_Vector_eWiseMult_Semiring // w = accum (w, u.*v) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_Semiring semiring, // defines '.*' for t=u.*v + const GrB_Vector u, // first input: vector u + const GrB_Vector v, // second input: vector v + const GrB_Descriptor desc // descriptor for w and mask +) ; + +GrB_Info GrB_Vector_eWiseMult_Monoid // w = accum (w, u.*v) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_Monoid monoid, // defines '.*' for t=u.*v + const GrB_Vector u, // first input: vector u + const GrB_Vector v, // second input: vector v + const GrB_Descriptor desc // descriptor for w and mask +) ; + +GrB_Info GrB_Vector_eWiseMult_BinaryOp // w = accum (w, u.*v) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp mult, // defines '.*' for t=u.*v + const GrB_Vector u, // first input: vector u + const GrB_Vector v, // second input: vector v + const GrB_Descriptor desc // descriptor for w and mask +) ; + +GrB_Info GrB_Matrix_eWiseMult_Semiring // C = accum (C, A.*B) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_Semiring semiring, // defines '.*' for T=A.*B + const GrB_Matrix A, // first input: matrix A + const GrB_Matrix B, // second input: matrix B + const GrB_Descriptor desc // descriptor for C, Mask, A, and B +) ; + +GrB_Info GrB_Matrix_eWiseMult_Monoid // C = accum (C, A.*B) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_Monoid monoid, // defines '.*' for T=A.*B + const GrB_Matrix A, // first input: matrix A + const GrB_Matrix B, // second input: matrix B + const GrB_Descriptor desc // descriptor for C, Mask, A, and B +) ; + +GrB_Info GrB_Matrix_eWiseMult_BinaryOp // C = accum (C, A.*B) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp mult, // defines '.*' for T=A.*B + const GrB_Matrix A, // first input: matrix A + const GrB_Matrix B, // second input: matrix B + const GrB_Descriptor desc // descriptor for C, Mask, A, and B +) ; + +// All 6 of the above type-specific functions are captured in a single +// type-generic function, GrB_eWiseMult: + +#if GxB_STDC_VERSION >= 201112L +#define GrB_eWiseMult(C,Mask,accum,op,A,B,desc) \ + _Generic \ + ( \ + (C), \ + GrB_Matrix : \ + _Generic \ + ( \ + (op), \ + GrB_Semiring : GrB_Matrix_eWiseMult_Semiring , \ + GrB_Monoid : GrB_Matrix_eWiseMult_Monoid , \ + GrB_BinaryOp : GrB_Matrix_eWiseMult_BinaryOp \ + ), \ + GrB_Vector : \ + _Generic \ + ( \ + (op), \ + GrB_Semiring : GrB_Vector_eWiseMult_Semiring , \ + GrB_Monoid : GrB_Vector_eWiseMult_Monoid , \ + GrB_BinaryOp : GrB_Vector_eWiseMult_BinaryOp \ + ) \ + ) \ + (C, Mask, accum, op, A, B, desc) +#endif + +//============================================================================== +// GrB_eWiseAdd: element-wise matrix and vector operations, set union +//============================================================================== + +// GrB_eWiseAdd computes C = accum (C, A+B), where pairs of elements in +// two matrices (or two vectors) are pairwise "added". + +GrB_Info GrB_Vector_eWiseAdd_Semiring // w = accum (w, u+v) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_Semiring semiring, // defines '+' for t=u+v + const GrB_Vector u, // first input: vector u + const GrB_Vector v, // second input: vector v + const GrB_Descriptor desc // descriptor for w and mask +) ; + +GrB_Info GrB_Vector_eWiseAdd_Monoid // w = accum (w, u+v) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_Monoid monoid, // defines '+' for t=u+v + const GrB_Vector u, // first input: vector u + const GrB_Vector v, // second input: vector v + const GrB_Descriptor desc // descriptor for w and mask +) ; + +GrB_Info GrB_Vector_eWiseAdd_BinaryOp // w = accum (w, u+v) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp add, // defines '+' for t=u+v + const GrB_Vector u, // first input: vector u + const GrB_Vector v, // second input: vector v + const GrB_Descriptor desc // descriptor for w and mask +) ; + +GrB_Info GrB_Matrix_eWiseAdd_Semiring // C = accum (C, A+B) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_Semiring semiring, // defines '+' for T=A+B + const GrB_Matrix A, // first input: matrix A + const GrB_Matrix B, // second input: matrix B + const GrB_Descriptor desc // descriptor for C, Mask, A, and B +) ; + +GrB_Info GrB_Matrix_eWiseAdd_Monoid // C = accum (C, A+B) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_Monoid monoid, // defines '+' for T=A+B + const GrB_Matrix A, // first input: matrix A + const GrB_Matrix B, // second input: matrix B + const GrB_Descriptor desc // descriptor for C, Mask, A, and B +) ; + +GrB_Info GrB_Matrix_eWiseAdd_BinaryOp // C = accum (C, A+B) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp add, // defines '+' for T=A+B + const GrB_Matrix A, // first input: matrix A + const GrB_Matrix B, // second input: matrix B + const GrB_Descriptor desc // descriptor for C, Mask, A, and B +) ; + +#if GxB_STDC_VERSION >= 201112L +#define GrB_eWiseAdd(C,Mask,accum,op,A,B,desc) \ + _Generic \ + ( \ + (C), \ + GrB_Matrix : \ + _Generic \ + ( \ + (op), \ + GrB_Semiring : GrB_Matrix_eWiseAdd_Semiring , \ + GrB_Monoid : GrB_Matrix_eWiseAdd_Monoid , \ + GrB_BinaryOp : GrB_Matrix_eWiseAdd_BinaryOp \ + ), \ + GrB_Vector : \ + _Generic \ + ( \ + (op), \ + GrB_Semiring : GrB_Vector_eWiseAdd_Semiring , \ + GrB_Monoid : GrB_Vector_eWiseAdd_Monoid , \ + GrB_BinaryOp : GrB_Vector_eWiseAdd_BinaryOp \ + ) \ + ) \ + (C, Mask, accum, op, A, B, desc) +#endif + +//============================================================================== +// GxB_eWiseUnion: a variant of GrB_eWiseAdd +//============================================================================== + +// GxB_eWiseUnion is a variant of eWiseAdd. The methods create a result with +// the same sparsity structure. They differ when an entry is present in A but +// not B, or in B but not A. + +// eWiseAdd does the following, for a matrix, where "+" is the add binary op: + +// if A(i,j) and B(i,j) are both present: +// C(i,j) = A(i,j) + B(i,j) +// else if A(i,j) is present but not B(i,j) +// C(i,j) = A(i,j) +// else if B(i,j) is present but not A(i,j) +// C(i,j) = B(i,j) + +// by contrast, eWiseUnion always applies the operator: + +// if A(i,j) and B(i,j) are both present: +// C(i,j) = A(i,j) + B(i,j) +// else if A(i,j) is present but not B(i,j) +// C(i,j) = A(i,j) + beta +// else if B(i,j) is present but not A(i,j) +// C(i,j) = alpha + B(i,j) + +GrB_Info GxB_Vector_eWiseUnion // w = accum (w, u+v) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp add, // defines '+' for t=u+v + const GrB_Vector u, // first input: vector u + const GrB_Scalar alpha, + const GrB_Vector v, // second input: vector v + const GrB_Scalar beta, + const GrB_Descriptor desc // descriptor for w and mask +) ; + +GrB_Info GxB_Matrix_eWiseUnion // C = accum (C, A+B) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp add, // defines '+' for T=A+B + const GrB_Matrix A, // first input: matrix A + const GrB_Scalar alpha, + const GrB_Matrix B, // second input: matrix B + const GrB_Scalar beta, + const GrB_Descriptor desc // descriptor for C, M, A, and B +) ; + +#if GxB_STDC_VERSION >= 201112L +#define GxB_eWiseUnion(C,Mask,accum,op,A,alpha,B,beta,desc) \ + _Generic \ + ( \ + (C), \ + GrB_Matrix : GxB_Matrix_eWiseUnion , \ + GrB_Vector : GxB_Vector_eWiseUnion \ + ) \ + (C, Mask, accum, op, A, alpha, B, beta, desc) +#endif + +//============================================================================== +// GrB_extract: extract a submatrix or subvector +//============================================================================== + +GrB_Info GrB_Vector_extract // w = accum (w, u(I)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_Vector u, // first input: vector u const GrB_Index *Ilist, // row indices GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_assign_FP32 // C(I,J) = accum (C(I,J),x) +GrB_Info GrB_Matrix_extract // C = accum (C, A(I,J)) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - float x, // scalar to assign to C(I,J) + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_Matrix A, // first input: matrix A const GrB_Index *Ilist, // row indices GrB_Index ni, // number of row indices const GrB_Index *J, // column indices GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask + const GrB_Descriptor desc // descriptor for C, Mask, and A ) ; -GrB_Info GrB_Matrix_assign_FP64 // C(I,J) = accum (C(I,J),x) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - double x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask -) ; +GrB_Info GrB_Col_extract // w = accum (w, A(I,j)) +( + GrB_Vector w, // input/output matrix for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_Matrix A, // first input: matrix A + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + GrB_Index j, // column index + const GrB_Descriptor desc // descriptor for w, mask, and A +) ; + +// GrB_extract is a generic interface to the following functions: + +// GrB_Vector_extract (w,mask,acc,u,I,ni,d) // w = acc (w, u(I)) +// GrB_Col_extract (w,mask,acc,A,I,ni,j,d) // w = acc (w, A(I,j)) +// GrB_Matrix_extract (C,Mask,acc,A,I,ni,J,nj,d) // C = acc (C, A(I,J)) + +#if GxB_STDC_VERSION >= 201112L +#define GrB_extract(arg1,Mask,accum,arg4,...) \ + _Generic \ + ( \ + (arg1), \ + GrB_Vector : \ + _Generic \ + ( \ + (arg4), \ + GrB_Vector : GrB_Vector_extract , \ + GrB_Matrix : GrB_Col_extract \ + ), \ + GrB_Matrix : GrB_Matrix_extract \ + ) \ + (arg1, Mask, accum, arg4, __VA_ARGS__) +#endif + +//============================================================================== +// GxB_subassign: matrix and vector subassign: C(I,J) = accum (C(I,J), A) +//============================================================================== + +// Assign entries in a matrix or vector; C(I,J) = A. + +// Each GxB_subassign function is very similar to its corresponding GrB_assign +// function in the spec, but they differ in two ways: (1) the mask in +// GxB_subassign has the same size as w(I) for vectors and C(I,J) for matrices, +// and (2) they differ in the GrB_REPLACE option. See the user guide for +// details. + +// In GraphBLAS notation, the two methods can be described as follows: + +// matrix and vector subassign: C(I,J) = accum (C(I,J), A) +// matrix and vector assign: C(I,J) = accum (C(I,J), A) -GrB_Info GxB_Matrix_assign_FC32 // C(I,J) = accum (C(I,J),x) +// --- assign ------------------------------------------------------------------ +// +// GrB_Matrix_assign C(I,J) += A M same size as matrix C. +// A is |I|-by-|J| +// +// GrB_Vector_assign w(I) += u m same size as column vector w. +// u is |I|-by-1 +// +// GrB_Row_assign C(i,J) += u' m is a column vector the same +// size as a row of C. +// u is |J|-by-1, i is a scalar. +// +// GrB_Col_assign C(I,j) += u m is a column vector the same +// size as a column of C. +// u is |I|-by-1, j is a scalar. +// +// --- subassign --------------------------------------------------------------- +// +// GxB_Matrix_subassign C(I,J) += A M same size as matrix A. +// A is |I|-by-|J| +// +// GxB_Vector_subassign w(I) += u m same size as column vector u. +// u is |I|-by-1 +// +// GxB_Row_subassign C(i,J) += u' m same size as column vector u. +// u is |J|-by-1, i is a scalar. +// +// GxB_Col_subassign C(I,j) += u m same size as column vector u. +// u is |I|-by-1, j is a scalar. + +GrB_Info GxB_Vector_subassign // w(I) = accum (w(I),u) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - GxB_FC32_t x, // scalar to assign to C(I,J) + GrB_Vector w, // input/output matrix for results + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w(I),t) + const GrB_Vector u, // first input: vector u const GrB_Index *Ilist, // row indices GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GxB_Matrix_assign_FC64 // C(I,J) = accum (C(I,J),x) +GrB_Info GxB_Matrix_subassign // C(I,J) = accum (C(I,J),A) ( GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - GxB_FC64_t x, // scalar to assign to C(I,J) + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),T) + const GrB_Matrix A, // first input: matrix A const GrB_Index *Ilist, // row indices GrB_Index ni, // number of row indices const GrB_Index *J, // column indices GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask + const GrB_Descriptor desc // descriptor for C(I,J), Mask, and A ) ; -GrB_Info GrB_Matrix_assign_UDT // C(I,J) = accum (C(I,J),x) +GrB_Info GxB_Col_subassign // C(I,j) = accum (C(I,j),u) ( GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - void *x, // scalar to assign to C(I,J) + const GrB_Vector mask, // optional mask for C(I,j), unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(C(I,j),t) + const GrB_Vector u, // input vector const GrB_Index *Ilist, // row indices GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask + GrB_Index j, // column index + const GrB_Descriptor desc // descriptor for C(I,j) and mask ) ; -GrB_Info GrB_Matrix_assign_Scalar // C(I,J) = accum (C(I,J),x) +GrB_Info GxB_Row_subassign // C(i,J) = accum (C(i,J),u') ( GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - GrB_Scalar x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices + const GrB_Vector mask, // optional mask for C(i,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(C(i,J),t) + const GrB_Vector u, // input vector + GrB_Index i, // row index const GrB_Index *J, // column indices GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask + const GrB_Descriptor desc // descriptor for C(i,J) and mask ) ; //------------------------------------------------------------------------------ -// GrB_assign: generic submatrix/subvector assignment +// GxB_Vector_subassign_[SCALAR]: scalar expansion assignment to subvector //------------------------------------------------------------------------------ -// GrB_assign is a generic function that provides access to all specific -// GrB_*_assign* functions: - -// GrB_Vector_assign_T (w,m,acc,x,I,ni,d) // w(I) = acc(w(I),x) -// GrB_Vector_assign (w,m,acc,u,I,ni,d) // w(I) = acc(w(I),u) -// GrB_Matrix_assign_T (C,M,acc,x,I,ni,J,nj,d) // C(I,J) = acc(C(I,J),x) -// GrB_Col_assign (C,m,acc,u,I,ni,j,d) // C(I,j) = acc(C(I,j),u) -// GrB_Row_assign (C,m,acc,u,i,J,nj,d) // C(i,J) = acc(C(i,J),u') -// GrB_Matrix_assign (C,M,acc,A,I,ni,J,nj,d) // C(I,J) = acc(C(I,J),A) - -#if GxB_STDC_VERSION >= 201112L -#define GrB_assign(arg1,Mask,accum,arg4,arg5,...) \ - _Generic \ - ( \ - (arg1), \ - GrB_Vector : \ - _Generic \ - ( \ - (arg4), \ - GB_CASES (GrB, Vector_assign) , \ - GrB_Scalar : GrB_Vector_assign_Scalar , \ - default: GrB_Vector_assign \ - ), \ - default: \ - _Generic \ - ( \ - (arg4), \ - GB_CASES (GrB, Matrix_assign) , \ - GrB_Scalar : GrB_Matrix_assign_Scalar , \ - GrB_Vector : \ - _Generic \ - ( \ - (arg5), \ - const GrB_Index *: GrB_Col_assign , \ - GrB_Index *: GrB_Col_assign , \ - default: GrB_Row_assign \ - ), \ - default: GrB_Matrix_assign \ - ) \ - ) \ - (arg1, Mask, accum, arg4, arg5, __VA_ARGS__) -#endif - -//============================================================================== -// GrB_apply: matrix and vector apply -//============================================================================== - -// Apply a unary, index_unary, or binary operator to entries in a matrix or -// vector, C = accum (C, op (A)). - -GrB_Info GrB_Vector_apply // w = accum (w, op(u)) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_UnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - const GrB_Descriptor desc // descriptor for w and mask -) ; - -GrB_Info GrB_Matrix_apply // C = accum (C, op(A)) or op(A') -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_UnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A -) ; - -//------------------------------------------- -// vector apply: binaryop variants (bind 1st) -//------------------------------------------- - -// Apply a binary operator to the entries in a vector, binding the first -// input to a scalar x, w = accum (w, op (x,u)). +// Assigns a single scalar to a subvector, w(I) = accum(w(I),x). The +// scalar x is implicitly expanded into a vector u of size ni-by-1, with each +// entry in u equal to x, and then w(I) = accum(w(I),u) is done. -GrB_Info GrB_Vector_apply_BinaryOp1st_Scalar // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_BOOL // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Scalar x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w(I),x) + bool x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -// historical: identical to GxB_Vector_apply_BinaryOp1st -GrB_Info GxB_Vector_apply_BinaryOp1st // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_INT8 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Scalar x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + int8_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp1st_BOOL // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_UINT8 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - bool x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + uint8_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp1st_INT8 // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_INT16 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - int8_t x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + int16_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp1st_INT16 // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_UINT16 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - int16_t x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + uint16_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp1st_INT32 // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_INT32 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - int32_t x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + int32_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp1st_INT64 // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_UINT32 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - int64_t x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + uint32_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp1st_UINT8 // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_INT64 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - uint8_t x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + int64_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp1st_UINT16 // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_UINT64 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - uint16_t x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + uint64_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp1st_UINT32 // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_FP32 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - uint32_t x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + float x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp1st_UINT64 // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_FP64 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - uint64_t x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + double x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp1st_FP32 // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_FC32 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - float x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + GxB_FC32_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp1st_FP64 // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_FC64 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - double x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + GxB_FC64_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GxB_Vector_apply_BinaryOp1st_FC32 // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_UDT // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - GxB_FC32_t x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + void *x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GxB_Vector_apply_BinaryOp1st_FC64 // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_Scalar // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - GxB_FC64_t x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + GrB_Scalar x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp1st_UDT // w = accum (w, op(x,u)) +//------------------------------------------------------------------------------ +// GxB_Matrix_subassign_[SCALAR]: scalar expansion assignment to submatrix +//------------------------------------------------------------------------------ + +// Assigns a single scalar to a submatrix, C(I,J) = accum(C(I,J),x). The +// scalar x is implicitly expanded into a matrix A of size ni-by-nj, with each +// entry in A equal to x, and then C(I,J) = accum(C(I,J),A) is done. + +GrB_Info GxB_Matrix_subassign_BOOL // C(I,J) = accum (C(I,J),x) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const void *x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + bool x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask ) ; -//------------------------------------------- -// vector apply: binaryop variants (bind 2nd) -//------------------------------------------- +GrB_Info GxB_Matrix_subassign_INT8 // C(I,J) = accum (C(I,J),x) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + int8_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask +) ; -// Apply a binary operator to the entries in a vector, binding the second -// input to a scalar y, w = accum (w, op (u,y)). +GrB_Info GxB_Matrix_subassign_UINT8 // C(I,J) = accum (C(I,J),x) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + uint8_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask +) ; -GrB_Info GrB_Vector_apply_BinaryOp2nd_Scalar // w = accum (w, op(u,y)) +GrB_Info GxB_Matrix_subassign_INT16 // C(I,J) = accum (C(I,J),x) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - const GrB_Scalar y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + int16_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask ) ; -// historical: identical to GrB_Vector_apply_BinaryOp2nd_Scalar -GrB_Info GxB_Vector_apply_BinaryOp2nd // w = accum (w, op(u,y)) +GrB_Info GxB_Matrix_subassign_UINT16 // C(I,J) = accum (C(I,J),x) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - const GrB_Scalar y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + uint16_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp2nd_BOOL // w = accum (w, op(u,y)) +GrB_Info GxB_Matrix_subassign_INT32 // C(I,J) = accum (C(I,J),x) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - bool y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + int32_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp2nd_INT8 // w = accum (w, op(u,y)) +GrB_Info GxB_Matrix_subassign_UINT32 // C(I,J) = accum (C(I,J),x) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - int8_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + uint32_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp2nd_INT16 // w = accum (w, op(u,y)) +GrB_Info GxB_Matrix_subassign_INT64 // C(I,J) = accum (C(I,J),x) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - int16_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + int64_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp2nd_INT32 // w = accum (w, op(u,y)) +GrB_Info GxB_Matrix_subassign_UINT64 // C(I,J) = accum (C(I,J),x) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - int32_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + uint64_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp2nd_INT64 // w = accum (w, op(u,y)) +GrB_Info GxB_Matrix_subassign_FP32 // C(I,J) = accum (C(I,J),x) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - int64_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + float x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp2nd_UINT8 // w = accum (w, op(u,y)) +GrB_Info GxB_Matrix_subassign_FP64 // C(I,J) = accum (C(I,J),x) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - uint8_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + double x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp2nd_UINT16 // w = accum (w, op(u,y)) +GrB_Info GxB_Matrix_subassign_FC32 // C(I,J) = accum (C(I,J),x) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - uint16_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + GxB_FC32_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp2nd_UINT32 // w = accum (w, op(u,y)) +GrB_Info GxB_Matrix_subassign_FC64 // C(I,J) = accum (C(I,J),x) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - uint32_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + GxB_FC64_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp2nd_UINT64 // w = accum (w, op(u,y)) +GrB_Info GxB_Matrix_subassign_UDT // C(I,J) = accum (C(I,J),x) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - uint64_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + void *x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp2nd_FP32 // w = accum (w, op(u,y)) +GrB_Info GxB_Matrix_subassign_Scalar // C(I,J) = accum (C(I,J),x) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - float y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + GrB_Scalar x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp2nd_FP64 // w = accum (w, op(u,y)) +//------------------------------------------------------------------------------ +// GxB_subassign: generic submatrix/subvector assignment +//------------------------------------------------------------------------------ + +// GxB_subassign is a generic function that provides access to all specific +// GxB_*_subassign* functions: + +// GxB_Vector_subassign (w,m,acc,u,I,ni,d) // w(I) = acc(w(I),u) +// GxB_Matrix_subassign (C,M,acc,A,I,ni,J,nj,d) // C(I,J) = acc(C(I,J),A) +// GxB_Col_subassign (C,m,acc,u,I,ni,j,d) // C(I,j) = acc(C(I,j),u) +// GxB_Row_subassign (C,m,acc,u,i,J,nj,d) // C(i,J) = acc(C(i,J),u') +// GxB_Vector_subassign_T (w,m,acc,x,I,ni,d) // w(I) = acc(w(I),x) +// GxB_Matrix_subassign_T (C,M,acc,x,I,ni,J,nj,d) // C(I,J) = acc(C(I,J),x) + +#if GxB_STDC_VERSION >= 201112L +#define GxB_subassign(arg1,Mask,accum,arg4,arg5,...) \ + _Generic \ + ( \ + (arg1), \ + GrB_Vector : \ + _Generic \ + ( \ + (arg4), \ + GB_CASES (GxB, Vector_subassign) , \ + GrB_Scalar : GxB_Vector_subassign_Scalar, \ + default: GxB_Vector_subassign \ + ), \ + default: \ + _Generic \ + ( \ + (arg4), \ + GB_CASES (GxB, Matrix_subassign) , \ + GrB_Scalar : GxB_Matrix_subassign_Scalar, \ + GrB_Vector : \ + _Generic \ + ( \ + (arg5), \ + const GrB_Index *: GxB_Col_subassign , \ + GrB_Index *: GxB_Col_subassign , \ + default: GxB_Row_subassign \ + ), \ + default: GxB_Matrix_subassign \ + ) \ + ) \ + (arg1, Mask, accum, arg4, arg5, __VA_ARGS__) +#endif + +//============================================================================== +// GrB_assign: matrix and vector assign: C(I,J) = accum (C(I,J), A) +//============================================================================== + +// Assign entries in a matrix or vector; C(I,J) = A. +// Each of these can be used with their generic name, GrB_assign. + +GrB_Info GrB_Vector_assign // w(I) = accum (w(I),u) ( - GrB_Vector w, // input/output vector for results + GrB_Vector w, // input/output matrix for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries + const GrB_BinaryOp accum, // optional accum for z=accum(w(I),t) const GrB_Vector u, // first input: vector u - double y, // second input: scalar y + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GxB_Vector_apply_BinaryOp2nd_FC32 // w = accum (w, op(u,y)) +GrB_Info GrB_Matrix_assign // C(I,J) = accum (C(I,J),A) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - GxB_FC32_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),T) + const GrB_Matrix A, // first input: matrix A + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C, Mask, and A ) ; -GrB_Info GxB_Vector_apply_BinaryOp2nd_FC64 // w = accum (w, op(u,y)) +GrB_Info GrB_Col_assign // C(I,j) = accum (C(I,j),u) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - GxB_FC64_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Vector mask, // optional mask for C(:,j), unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(C(I,j),t) + const GrB_Vector u, // input vector + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + GrB_Index j, // column index + const GrB_Descriptor desc // descriptor for C(:,j) and mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp2nd_UDT // w = accum (w, op(u,y)) +GrB_Info GrB_Row_assign // C(i,J) = accum (C(i,J),u') ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - const void *y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Vector mask, // optional mask for C(i,:), unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(C(i,J),t) + const GrB_Vector u, // input vector + GrB_Index i, // row index + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(i,:) and mask ) ; -//------------------------------------------- -// vector apply: IndexUnaryOp variants -//------------------------------------------- +//------------------------------------------------------------------------------ +// GrB_Vector_assign_[SCALAR]: scalar expansion assignment to subvector +//------------------------------------------------------------------------------ -// Apply a GrB_IndexUnaryOp to the entries in a vector +// Assigns a single scalar to a subvector, w(I) = accum(w(I),x). The +// scalar x is implicitly expanded into a vector u of size ni-by-1, with each +// entry in u equal to x, and then w(I) = accum(w(I),u) is done. -GrB_Info GrB_Vector_apply_IndexOp_Scalar // w = accum (w, op(u)) +GrB_Info GrB_Vector_assign_BOOL // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - const GrB_Scalar y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for z=accum(w(I),x) + bool x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_apply_IndexOp_BOOL // w = accum (w, op(u)) +GrB_Info GrB_Vector_assign_INT8 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - bool y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + int8_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_apply_IndexOp_INT8 // w = accum (w, op(u)) +GrB_Info GrB_Vector_assign_UINT8 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - int8_t y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + uint8_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_apply_IndexOp_INT16 // w = accum (w, op(u)) +GrB_Info GrB_Vector_assign_INT16 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - int16_t y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + int16_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_apply_IndexOp_INT32 // w = accum (w, op(u)) +GrB_Info GrB_Vector_assign_UINT16 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - int32_t y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + uint16_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_apply_IndexOp_INT64 // w = accum (w, op(u)) +GrB_Info GrB_Vector_assign_INT32 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - int64_t y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + int32_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_apply_IndexOp_UINT8 // w = accum (w, op(u)) +GrB_Info GrB_Vector_assign_UINT32 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - uint8_t y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + uint32_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_apply_IndexOp_UINT16 // w = accum (w, op(u)) +GrB_Info GrB_Vector_assign_INT64 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - uint16_t y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + int64_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_apply_IndexOp_UINT32 // w = accum (w, op(u)) +GrB_Info GrB_Vector_assign_UINT64 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - uint32_t y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + uint64_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_apply_IndexOp_UINT64 // w = accum (w, op(u)) +GrB_Info GrB_Vector_assign_FP32 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - uint64_t y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + float x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_apply_IndexOp_FP32 // w = accum (w, op(u)) +GrB_Info GrB_Vector_assign_FP64 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - float y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + double x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_apply_IndexOp_FP64 // w = accum (w, op(u)) +GrB_Info GxB_Vector_assign_FC32 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - double y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + GxB_FC32_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GxB_Vector_apply_IndexOp_FC32 // w = accum (w, op(u)) +GrB_Info GxB_Vector_assign_FC64 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - GxB_FC32_t y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + GxB_FC64_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GxB_Vector_apply_IndexOp_FC64 // w = accum (w, op(u)) +GrB_Info GrB_Vector_assign_UDT // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - GxB_FC64_t y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + void *x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_apply_IndexOp_UDT // w = accum (w, op(u)) +GrB_Info GrB_Vector_assign_Scalar // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - const void *y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + GrB_Scalar x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -//------------------------------------------- -// matrix apply: binaryop variants (bind 1st) -//------------------------------------------- +//------------------------------------------------------------------------------ +// GrB_Matrix_assign_[SCALAR]: scalar expansion assignment to submatrix +//------------------------------------------------------------------------------ -// Apply a binary operator to the entries in a matrix, binding the first input -// to a scalar x, C = accum (C, op (x,A)), or op(x,A'). +// Assigns a single scalar to a submatrix, C(I,J) = accum(C(I,J),x). The +// scalar x is implicitly expanded into a matrix A of size ni-by-nj, with each +// entry in A equal to x, and then C(I,J) = accum(C(I,J),A) is done. -GrB_Info GrB_Matrix_apply_BinaryOp1st_Scalar // C=accum(C,op(x,A)) +GrB_Info GrB_Matrix_assign_BOOL // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Scalar x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + bool x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -// historical: identical to GrB_Matrix_apply_BinaryOp1st_Scalar -GrB_Info GxB_Matrix_apply_BinaryOp1st // C=accum(C,op(x,A)) +GrB_Info GrB_Matrix_assign_INT8 // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Scalar x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + int8_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp1st_BOOL // C=accum(C,op(x,A)) +GrB_Info GrB_Matrix_assign_UINT8 // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - bool x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + uint8_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp1st_INT8 // C=accum(C,op(x,A)) +GrB_Info GrB_Matrix_assign_INT16 // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - int8_t x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + int16_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp1st_INT16 // C=accum(C,op(x,A)) +GrB_Info GrB_Matrix_assign_UINT16 // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - int16_t x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + uint16_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask +) ; + +GrB_Info GrB_Matrix_assign_INT32 // C(I,J) = accum (C(I,J),x) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + int32_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp1st_INT32 // C=accum(C,op(x,A)) +GrB_Info GrB_Matrix_assign_UINT32 // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - int32_t x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + uint32_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp1st_INT64 // C=accum(C,op(x,A)) +GrB_Info GrB_Matrix_assign_INT64 // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - int64_t x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + int64_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp1st_UINT8 // C=accum(C,op(x,A)) +GrB_Info GrB_Matrix_assign_UINT64 // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - uint8_t x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + uint64_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp1st_UINT16 // C=accum(C,op(x,A)) +GrB_Info GrB_Matrix_assign_FP32 // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - uint16_t x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + float x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp1st_UINT32 // C=accum(C,op(x,A)) +GrB_Info GrB_Matrix_assign_FP64 // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - uint32_t x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + double x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp1st_UINT64 // C=accum(C,op(x,A)) +GrB_Info GxB_Matrix_assign_FC32 // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - uint64_t x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + GxB_FC32_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp1st_FP32 // C=accum(C,op(x,A)) +GrB_Info GxB_Matrix_assign_FC64 // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - float x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + GxB_FC64_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp1st_FP64 // C=accum(C,op(x,A)) +GrB_Info GrB_Matrix_assign_UDT // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - double x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + void *x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -GrB_Info GxB_Matrix_apply_BinaryOp1st_FC32 // C=accum(C,op(x,A)) +GrB_Info GrB_Matrix_assign_Scalar // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - GxB_FC32_t x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + GrB_Scalar x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -GrB_Info GxB_Matrix_apply_BinaryOp1st_FC64 // C=accum(C,op(x,A)) +//------------------------------------------------------------------------------ +// GrB_assign: generic submatrix/subvector assignment +//------------------------------------------------------------------------------ + +// GrB_assign is a generic function that provides access to all specific +// GrB_*_assign* functions: + +// GrB_Vector_assign_T (w,m,acc,x,I,ni,d) // w(I) = acc(w(I),x) +// GrB_Vector_assign (w,m,acc,u,I,ni,d) // w(I) = acc(w(I),u) +// GrB_Matrix_assign_T (C,M,acc,x,I,ni,J,nj,d) // C(I,J) = acc(C(I,J),x) +// GrB_Col_assign (C,m,acc,u,I,ni,j,d) // C(I,j) = acc(C(I,j),u) +// GrB_Row_assign (C,m,acc,u,i,J,nj,d) // C(i,J) = acc(C(i,J),u') +// GrB_Matrix_assign (C,M,acc,A,I,ni,J,nj,d) // C(I,J) = acc(C(I,J),A) + +#if GxB_STDC_VERSION >= 201112L +#define GrB_assign(arg1,Mask,accum,arg4,arg5,...) \ + _Generic \ + ( \ + (arg1), \ + GrB_Vector : \ + _Generic \ + ( \ + (arg4), \ + GB_CASES (GrB, Vector_assign) , \ + GrB_Scalar : GrB_Vector_assign_Scalar , \ + default: GrB_Vector_assign \ + ), \ + default: \ + _Generic \ + ( \ + (arg4), \ + GB_CASES (GrB, Matrix_assign) , \ + GrB_Scalar : GrB_Matrix_assign_Scalar , \ + GrB_Vector : \ + _Generic \ + ( \ + (arg5), \ + const GrB_Index *: GrB_Col_assign , \ + GrB_Index *: GrB_Col_assign , \ + default: GrB_Row_assign \ + ), \ + default: GrB_Matrix_assign \ + ) \ + ) \ + (arg1, Mask, accum, arg4, arg5, __VA_ARGS__) +#endif + +//============================================================================== +// GrB_apply: matrix and vector apply +//============================================================================== + +// Apply a unary, index_unary, or binary operator to entries in a matrix or +// vector, C = accum (C, op (A)). + +GrB_Info GrB_Vector_apply // w = accum (w, op(u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - GxB_FC64_t x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_UnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp1st_UDT // C=accum(C,op(x,A)) +GrB_Info GrB_Matrix_apply // C = accum (C, op(A)) or op(A') ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - const void *x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A + const GrB_UnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A const GrB_Descriptor desc // descriptor for C, mask, and A ) ; //------------------------------------------- -// matrix apply: binaryop variants (bind 2nd) +// vector apply: binaryop variants (bind 1st) //------------------------------------------- -// Apply a binary operator to the entries in a matrix, binding the second input -// to a scalar y, C = accum (C, op (A,y)), or op(A',y). +// Apply a binary operator to the entries in a vector, binding the first +// input to a scalar x, w = accum (w, op (x,u)). -GrB_Info GrB_Matrix_apply_BinaryOp2nd_Scalar // C=accum(C,op(A,y)) +GrB_Info GrB_Vector_apply_BinaryOp1st_Scalar // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - const GrB_Scalar y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Scalar x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -// historical: identical to GrB_Matrix_apply_BinaryOp2nd_Scalar -GrB_Info GxB_Matrix_apply_BinaryOp2nd // C=accum(C,op(A,y)) +// historical: identical to GxB_Vector_apply_BinaryOp1st +GrB_Info GxB_Vector_apply_BinaryOp1st // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - const GrB_Scalar y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Scalar x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp2nd_BOOL // C=accum(C,op(A,y)) +GrB_Info GrB_Vector_apply_BinaryOp1st_BOOL // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - bool y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + bool x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp2nd_INT8 // C=accum(C,op(A,y)) +GrB_Info GrB_Vector_apply_BinaryOp1st_INT8 // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - int8_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + int8_t x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp2nd_INT16 // C=accum(C,op(A,y)) +GrB_Info GrB_Vector_apply_BinaryOp1st_INT16 // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - int16_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + int16_t x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp2nd_INT32 // C=accum(C,op(A,y)) +GrB_Info GrB_Vector_apply_BinaryOp1st_INT32 // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - int32_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + int32_t x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp2nd_INT64 // C=accum(C,op(A,y)) +GrB_Info GrB_Vector_apply_BinaryOp1st_INT64 // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - int64_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + int64_t x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp2nd_UINT8 // C=accum(C,op(A,y)) +GrB_Info GrB_Vector_apply_BinaryOp1st_UINT8 // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - uint8_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + uint8_t x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp2nd_UINT16 // C=accum(C,op(A,y)) +GrB_Info GrB_Vector_apply_BinaryOp1st_UINT16 // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - uint16_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + uint16_t x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp2nd_UINT32 // C=accum(C,op(A,y)) +GrB_Info GrB_Vector_apply_BinaryOp1st_UINT32 // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - uint32_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + uint32_t x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp2nd_UINT64 // C=accum(C,op(A,y)) +GrB_Info GrB_Vector_apply_BinaryOp1st_UINT64 // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - uint64_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + uint64_t x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp2nd_FP32 // C=accum(C,op(A,y)) +GrB_Info GrB_Vector_apply_BinaryOp1st_FP32 // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - float y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + float x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp2nd_FP64 // C=accum(C,op(A,y)) +GrB_Info GrB_Vector_apply_BinaryOp1st_FP64 // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - double y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + double x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GxB_Matrix_apply_BinaryOp2nd_FC32 // C=accum(C,op(A,y)) +GrB_Info GxB_Vector_apply_BinaryOp1st_FC32 // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - GxB_FC32_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + GxB_FC32_t x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GxB_Matrix_apply_BinaryOp2nd_FC64 // C=accum(C,op(A,y)) +GrB_Info GxB_Vector_apply_BinaryOp1st_FC64 // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - GxB_FC64_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + GxB_FC64_t x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp2nd_UDT // C=accum(C,op(A,y)) +GrB_Info GrB_Vector_apply_BinaryOp1st_UDT // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - const void *y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const void *x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; //------------------------------------------- -// matrix apply: IndexUnaryOp variants +// vector apply: binaryop variants (bind 2nd) //------------------------------------------- -// Apply a GrB_IndexUnaryOp to the entries in a matrix. +// Apply a binary operator to the entries in a vector, binding the second +// input to a scalar y, w = accum (w, op (u,y)). -GrB_Info GrB_Matrix_apply_IndexOp_Scalar // C=accum(C,op(A)) +GrB_Info GrB_Vector_apply_BinaryOp2nd_Scalar // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u const GrB_Scalar y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_IndexOp_BOOL // C=accum(C,op(A)) +// historical: identical to GrB_Vector_apply_BinaryOp2nd_Scalar +GrB_Info GxB_Vector_apply_BinaryOp2nd // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + const GrB_Scalar y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; + +GrB_Info GrB_Vector_apply_BinaryOp2nd_BOOL // w = accum (w, op(u,y)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u bool y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_IndexOp_INT8 // C=accum(C,op(A)) +GrB_Info GrB_Vector_apply_BinaryOp2nd_INT8 // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u int8_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_IndexOp_INT16 // C=accum(C,op(A)) +GrB_Info GrB_Vector_apply_BinaryOp2nd_INT16 // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u int16_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_IndexOp_INT32 // C=accum(C,op(A)) +GrB_Info GrB_Vector_apply_BinaryOp2nd_INT32 // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u int32_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_IndexOp_INT64 // C=accum(C,op(A)) +GrB_Info GrB_Vector_apply_BinaryOp2nd_INT64 // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u int64_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_IndexOp_UINT8 // C=accum(C,op(A)) +GrB_Info GrB_Vector_apply_BinaryOp2nd_UINT8 // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u uint8_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_IndexOp_UINT16 // C=accum(C,op(A)) +GrB_Info GrB_Vector_apply_BinaryOp2nd_UINT16 // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u uint16_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_IndexOp_UINT32 // C=accum(C,op(A)) +GrB_Info GrB_Vector_apply_BinaryOp2nd_UINT32 // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u uint32_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_IndexOp_UINT64 // C=accum(C,op(A)) +GrB_Info GrB_Vector_apply_BinaryOp2nd_UINT64 // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u uint64_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_IndexOp_FP32 // C=accum(C,op(A)) +GrB_Info GrB_Vector_apply_BinaryOp2nd_FP32 // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u float y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_IndexOp_FP64 // C=accum(C,op(A)) +GrB_Info GrB_Vector_apply_BinaryOp2nd_FP64 // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u double y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GxB_Matrix_apply_IndexOp_FC32 // C=accum(C,op(A)) +GrB_Info GxB_Vector_apply_BinaryOp2nd_FC32 // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u GxB_FC32_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GxB_Matrix_apply_IndexOp_FC64 // C=accum(C,op(A)) +GrB_Info GxB_Vector_apply_BinaryOp2nd_FC64 // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u GxB_FC64_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_IndexOp_UDT // C=accum(C,op(A)) +GrB_Info GrB_Vector_apply_BinaryOp2nd_UDT // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u const void *y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -//------------------------------------------------------------------------------ -// GrB_apply: generic matrix/vector apply -//------------------------------------------------------------------------------ - -// GrB_apply is a generic function for applying a unary operator to a matrix -// or vector and provides access to these functions: - -// GrB_Vector_apply (w,mask,acc,op,u,d) // w = accum (w, op(u)) -// GrB_Matrix_apply (C,Mask,acc,op,A,d) // C = accum (C, op(A)) - -// GrB_Vector_apply (w,m,acc,unop ,u,d) -// GrB_Vector_apply_BinaryOp1st_TYPE (w,m,acc,binop,x,u,d) -// GrB_Vector_apply_BinaryOp2nd_TYPE (w,m,acc,binop,u,y,d) -// GrB_Vector_apply_IndexOp_TYPE (w,m,acc,idxop,u,y,d) - -// GrB_Matrix_apply (C,M,acc,unop ,A,d) -// GrB_Matrix_apply_BinaryOp1st_TYPE (C,M,acc,binop,x,A,d) -// GrB_Matrix_apply_BinaryOp2nd_TYPE (C,M,acc,binop,A,y,d) -// GrB_Matrix_apply_IndexOp_TYPE (C,M,acc,idxop,A,y,d) - -#if GxB_STDC_VERSION >= 201112L - -#define GB_BIND(kind,x,y,...) \ - _Generic \ - ( \ - (x), \ - GrB_Scalar: GB_CONCAT ( GrB,_,kind,_apply_BinaryOp1st_Scalar), \ - GB_CASES (GrB, GB_CONCAT ( kind, _apply_BinaryOp1st,, )) , \ - default: \ - _Generic \ - ( \ - (y), \ - GB_CASES (GrB, GB_CONCAT ( kind , _apply_BinaryOp2nd,, )), \ - default: GB_CONCAT ( GrB,_,kind,_apply_BinaryOp2nd_Scalar) \ - ) \ - ) - -#define GB_IDXOP(kind,A,y,...) \ - _Generic \ - ( \ - (y), \ - GB_CASES (GrB, GB_CONCAT ( kind, _apply_IndexOp,, )), \ - default: GB_CONCAT ( GrB, _, kind, _apply_IndexOp_Scalar) \ - ) - -#define GrB_apply(C,Mask,accum,op,...) \ - _Generic \ - ( \ - (C), \ - GrB_Vector : \ - _Generic \ - ( \ - (op), \ - GrB_UnaryOp : GrB_Vector_apply , \ - GrB_BinaryOp : GB_BIND (Vector, __VA_ARGS__), \ - GrB_IndexUnaryOp : GB_IDXOP (Vector, __VA_ARGS__) \ - ), \ - GrB_Matrix : \ - _Generic \ - ( \ - (op), \ - GrB_UnaryOp : GrB_Matrix_apply , \ - GrB_BinaryOp : GB_BIND (Matrix, __VA_ARGS__), \ - GrB_IndexUnaryOp : GB_IDXOP (Matrix, __VA_ARGS__) \ - ) \ - ) \ - (C, Mask, accum, op, __VA_ARGS__) -#endif - -//============================================================================== -// GrB_select: matrix and vector selection using an IndexUnaryOp -//============================================================================== - //------------------------------------------- -// vector select using an IndexUnaryOp +// vector apply: IndexUnaryOp variants //------------------------------------------- -GrB_Info GrB_Vector_select_Scalar // w = accum (w, op(u)) +// Apply a GrB_IndexUnaryOp to the entries in a vector + +GrB_Info GrB_Vector_apply_IndexOp_Scalar // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7312,7 +7483,7 @@ GrB_Info GrB_Vector_select_Scalar // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_select_BOOL // w = accum (w, op(u)) +GrB_Info GrB_Vector_apply_IndexOp_BOOL // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7323,7 +7494,7 @@ GrB_Info GrB_Vector_select_BOOL // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_select_INT8 // w = accum (w, op(u)) +GrB_Info GrB_Vector_apply_IndexOp_INT8 // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7334,7 +7505,7 @@ GrB_Info GrB_Vector_select_INT8 // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_select_INT16 // w = accum (w, op(u)) +GrB_Info GrB_Vector_apply_IndexOp_INT16 // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7345,7 +7516,7 @@ GrB_Info GrB_Vector_select_INT16 // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_select_INT32 // w = accum (w, op(u)) +GrB_Info GrB_Vector_apply_IndexOp_INT32 // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7356,7 +7527,7 @@ GrB_Info GrB_Vector_select_INT32 // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_select_INT64 // w = accum (w, op(u)) +GrB_Info GrB_Vector_apply_IndexOp_INT64 // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7367,7 +7538,7 @@ GrB_Info GrB_Vector_select_INT64 // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_select_UINT8 // w = accum (w, op(u)) +GrB_Info GrB_Vector_apply_IndexOp_UINT8 // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7378,7 +7549,7 @@ GrB_Info GrB_Vector_select_UINT8 // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_select_UINT16 // w = accum (w, op(u)) +GrB_Info GrB_Vector_apply_IndexOp_UINT16 // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7389,7 +7560,7 @@ GrB_Info GrB_Vector_select_UINT16 // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_select_UINT32 // w = accum (w, op(u)) +GrB_Info GrB_Vector_apply_IndexOp_UINT32 // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7400,7 +7571,7 @@ GrB_Info GrB_Vector_select_UINT32 // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_select_UINT64 // w = accum (w, op(u)) +GrB_Info GrB_Vector_apply_IndexOp_UINT64 // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7411,7 +7582,7 @@ GrB_Info GrB_Vector_select_UINT64 // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_select_FP32 // w = accum (w, op(u)) +GrB_Info GrB_Vector_apply_IndexOp_FP32 // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7422,7 +7593,7 @@ GrB_Info GrB_Vector_select_FP32 // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_select_FP64 // w = accum (w, op(u)) +GrB_Info GrB_Vector_apply_IndexOp_FP64 // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7433,7 +7604,7 @@ GrB_Info GrB_Vector_select_FP64 // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GxB_Vector_select_FC32 // w = accum (w, op(u)) +GrB_Info GxB_Vector_apply_IndexOp_FC32 // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7444,7 +7615,7 @@ GrB_Info GxB_Vector_select_FC32 // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GxB_Vector_select_FC64 // w = accum (w, op(u)) +GrB_Info GxB_Vector_apply_IndexOp_FC64 // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7455,7 +7626,7 @@ GrB_Info GxB_Vector_select_FC64 // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_select_UDT // w = accum (w, op(u)) +GrB_Info GrB_Vector_apply_IndexOp_UDT // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7467,1629 +7638,1465 @@ GrB_Info GrB_Vector_select_UDT // w = accum (w, op(u)) ) ; //------------------------------------------- -// matrix select using an IndexUnaryOp +// matrix apply: binaryop variants (bind 1st) //------------------------------------------- -GrB_Info GrB_Matrix_select_Scalar // C=accum(C,op(A)) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - const GrB_Scalar y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A -) ; - -GrB_Info GrB_Matrix_select_BOOL // C=accum(C,op(A)) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - bool y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A -) ; - -GrB_Info GrB_Matrix_select_INT8 // C=accum(C,op(A)) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - int8_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A -) ; - -GrB_Info GrB_Matrix_select_INT16 // C=accum(C,op(A)) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - int16_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A -) ; - -GrB_Info GrB_Matrix_select_INT32 // C=accum(C,op(A)) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - int32_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A -) ; - -GrB_Info GrB_Matrix_select_INT64 // C=accum(C,op(A)) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - int64_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A -) ; - -GrB_Info GrB_Matrix_select_UINT8 // C=accum(C,op(A)) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - uint8_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A -) ; - -GrB_Info GrB_Matrix_select_UINT16 // C=accum(C,op(A)) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - uint16_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A -) ; - -GrB_Info GrB_Matrix_select_UINT32 // C=accum(C,op(A)) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - uint32_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A -) ; +// Apply a binary operator to the entries in a matrix, binding the first input +// to a scalar x, C = accum (C, op (x,A)), or op(x,A'). -GrB_Info GrB_Matrix_select_UINT64 // C=accum(C,op(A)) +GrB_Info GrB_Matrix_apply_BinaryOp1st_Scalar // C=accum(C,op(x,A)) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - uint64_t y, // second input: scalar y + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Scalar x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_select_FP32 // C=accum(C,op(A)) +// historical: identical to GrB_Matrix_apply_BinaryOp1st_Scalar +GrB_Info GxB_Matrix_apply_BinaryOp1st // C=accum(C,op(x,A)) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - float y, // second input: scalar y + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Scalar x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_select_FP64 // C=accum(C,op(A)) +GrB_Info GrB_Matrix_apply_BinaryOp1st_BOOL // C=accum(C,op(x,A)) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - double y, // second input: scalar y + const GrB_BinaryOp op, // operator to apply to the entries + bool x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GxB_Matrix_select_FC32 // C=accum(C,op(A)) +GrB_Info GrB_Matrix_apply_BinaryOp1st_INT8 // C=accum(C,op(x,A)) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - GxB_FC32_t y, // second input: scalar y + const GrB_BinaryOp op, // operator to apply to the entries + int8_t x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GxB_Matrix_select_FC64 // C=accum(C,op(A)) +GrB_Info GrB_Matrix_apply_BinaryOp1st_INT16 // C=accum(C,op(x,A)) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - GxB_FC64_t y, // second input: scalar y + const GrB_BinaryOp op, // operator to apply to the entries + int16_t x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_select_UDT // C=accum(C,op(A)) +GrB_Info GrB_Matrix_apply_BinaryOp1st_INT32 // C=accum(C,op(x,A)) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - const void *y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A -) ; - -// GrB_select is a generic method that applies an IndexUnaryOp to -// a matrix or vector, using any type of the scalar y. - -// GrB_Vector_select_TYPE (w,m,acc,idxop,u,y,d) -// GrB_Matrix_select_TYPE (C,M,acc,idxop,A,y,d) - -#if GxB_STDC_VERSION >= 201112L -#define GrB_select(C,Mask,accum,op,x,y,d) \ - _Generic \ - ( \ - (C), \ - GrB_Vector : \ - _Generic \ - ( \ - (y), \ - GB_CASES (GrB, Vector_select), \ - default: GrB_Vector_select_Scalar \ - ), \ - GrB_Matrix : \ - _Generic \ - ( \ - (y), \ - GB_CASES (GrB, Matrix_select), \ - default: GrB_Matrix_select_Scalar \ - ) \ - ) \ - (C, Mask, accum, op, x, y, d) -#endif - -//============================================================================== -// GxB_select: matrix and vector selection (DEPRECATED: use GrB_select instead) -//============================================================================== - -GrB_Info GxB_Vector_select (GrB_Vector w, const GrB_Vector mask, -const GrB_BinaryOp accum, const GxB_SelectOp op, const GrB_Vector u, -const GrB_Scalar Thunk, const GrB_Descriptor desc) ; -GrB_Info GxB_Matrix_select (GrB_Matrix C, const GrB_Matrix Mask, -const GrB_BinaryOp accum, const GxB_SelectOp op, const GrB_Matrix A, -const GrB_Scalar Thunk, const GrB_Descriptor desc) ; -#if GxB_STDC_VERSION >= 201112L -#define GxB_select(C,Mask,accum,op,A,Thunk,desc) _Generic \ -((C), GrB_Vector:GxB_Vector_select , GrB_Matrix:GxB_Matrix_select ) \ -(C, Mask, accum, op, A, Thunk, desc) -#endif - -//============================================================================== -// GrB_reduce: matrix and vector reduction -//============================================================================== - -// Reduce the entries in a matrix to a vector, a column vector t such that -// t(i) = sum (A (i,:)), and where "sum" is a commutative and associative -// monoid with an identity value. A can be transposed, which reduces down the -// columns instead of the rows. - -// For GrB_Matrix_reduce_BinaryOp, the GrB_BinaryOp op must correspond to a -// known built-in monoid: -// -// operator data-types (all built-in) -// ---------------------- --------------------------- -// MIN, MAX INT*, UINT*, FP* -// TIMES, PLUS INT*, UINT*, FP*, FC* -// ANY INT*, UINT*, FP*, FC*, BOOL -// LOR, LAND, LXOR, EQ BOOL -// BOR, BAND, BXOR, BXNOR UINT* - -GrB_Info GrB_Matrix_reduce_Monoid // w = accum (w,reduce(A)) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_Monoid monoid, // reduce operator for t=reduce(A) - const GrB_Matrix A, // first input: matrix A - const GrB_Descriptor desc // descriptor for w, mask, and A -) ; - -GrB_Info GrB_Matrix_reduce_BinaryOp // w = accum (w,reduce(A)) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // reduce operator for t=reduce(A) - const GrB_Matrix A, // first input: matrix A - const GrB_Descriptor desc // descriptor for w, mask, and A -) ; - -//------------------------------------------------------------------------------ -// reduce a vector to a scalar -//------------------------------------------------------------------------------ - -// Reduce entries in a vector to a scalar, c = accum (c, reduce_to_scalar(u)) - -GrB_Info GrB_Vector_reduce_BOOL // c = accum (c, reduce_to_scalar (u)) -( - bool *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + const GrB_BinaryOp op, // operator to apply to the entries + int32_t x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Vector_reduce_INT8 // c = accum (c, reduce_to_scalar (u)) +GrB_Info GrB_Matrix_apply_BinaryOp1st_INT64 // C=accum(C,op(x,A)) ( - int8_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + int64_t x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Vector_reduce_UINT8 // c = accum (c, reduce_to_scalar (u)) +GrB_Info GrB_Matrix_apply_BinaryOp1st_UINT8 // C=accum(C,op(x,A)) ( - uint8_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + uint8_t x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Vector_reduce_INT16 // c = accum (c, reduce_to_scalar (u)) +GrB_Info GrB_Matrix_apply_BinaryOp1st_UINT16 // C=accum(C,op(x,A)) ( - int16_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + uint16_t x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Vector_reduce_UINT16 // c = accum (c, reduce_to_scalar (u)) +GrB_Info GrB_Matrix_apply_BinaryOp1st_UINT32 // C=accum(C,op(x,A)) ( - uint16_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + uint32_t x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Vector_reduce_INT32 // c = accum (c, reduce_to_scalar (u)) +GrB_Info GrB_Matrix_apply_BinaryOp1st_UINT64 // C=accum(C,op(x,A)) ( - int32_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + uint64_t x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Vector_reduce_UINT32 // c = accum (c, reduce_to_scalar (u)) +GrB_Info GrB_Matrix_apply_BinaryOp1st_FP32 // C=accum(C,op(x,A)) ( - uint32_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + float x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Vector_reduce_INT64 // c = accum (c, reduce_to_scalar (u)) +GrB_Info GrB_Matrix_apply_BinaryOp1st_FP64 // C=accum(C,op(x,A)) ( - int64_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + double x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Vector_reduce_UINT64 // c = accum (c, reduce_to_scalar (u)) +GrB_Info GxB_Matrix_apply_BinaryOp1st_FC32 // C=accum(C,op(x,A)) ( - uint64_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + GxB_FC32_t x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Vector_reduce_FP32 // c = accum (c, reduce_to_scalar (u)) +GrB_Info GxB_Matrix_apply_BinaryOp1st_FC64 // C=accum(C,op(x,A)) ( - float *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + GxB_FC64_t x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Vector_reduce_FP64 // c = accum (c, reduce_to_scalar (u)) +GrB_Info GrB_Matrix_apply_BinaryOp1st_UDT // C=accum(C,op(x,A)) ( - double *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const void *x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GxB_Vector_reduce_FC32 // c = accum (c, reduce_to_scalar (u)) -( - GxB_FC32_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc -) ; +//------------------------------------------- +// matrix apply: binaryop variants (bind 2nd) +//------------------------------------------- -GrB_Info GxB_Vector_reduce_FC64 // c = accum (c, reduce_to_scalar (u)) +// Apply a binary operator to the entries in a matrix, binding the second input +// to a scalar y, C = accum (C, op (A,y)), or op(A',y). + +GrB_Info GrB_Matrix_apply_BinaryOp2nd_Scalar // C=accum(C,op(A,y)) ( - GxB_FC64_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + const GrB_Scalar y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Vector_reduce_UDT // c = accum (c, reduce_to_scalar (u)) +// historical: identical to GrB_Matrix_apply_BinaryOp2nd_Scalar +GrB_Info GxB_Matrix_apply_BinaryOp2nd // C=accum(C,op(A,y)) ( - void *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + const GrB_Scalar y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Vector_reduce_Monoid_Scalar // c = accum(c,reduce_to_scalar(u)) +GrB_Info GrB_Matrix_apply_BinaryOp2nd_BOOL // C=accum(C,op(A,y)) ( - GrB_Scalar c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + bool y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Vector_reduce_BinaryOp_Scalar +GrB_Info GrB_Matrix_apply_BinaryOp2nd_INT8 // C=accum(C,op(A,y)) ( - GrB_Scalar c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_BinaryOp op, // binary op to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + int8_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -//------------------------------------------------------------------------------ -// reduce a matrix to a scalar -//------------------------------------------------------------------------------ - -// Reduce entries in a matrix to a scalar, c = accum (c, reduce_to_scalar(A)) - -GrB_Info GrB_Matrix_reduce_BOOL // c = accum (c, reduce_to_scalar (A)) +GrB_Info GrB_Matrix_apply_BinaryOp2nd_INT16 // C=accum(C,op(A,y)) ( - bool *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + int16_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_reduce_INT8 // c = accum (c, reduce_to_scalar (A)) +GrB_Info GrB_Matrix_apply_BinaryOp2nd_INT32 // C=accum(C,op(A,y)) ( - int8_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + int32_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_reduce_UINT8 // c = accum (c, reduce_to_scalar (A)) +GrB_Info GrB_Matrix_apply_BinaryOp2nd_INT64 // C=accum(C,op(A,y)) ( - uint8_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + int64_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_reduce_INT16 // c = accum (c, reduce_to_scalar (A)) +GrB_Info GrB_Matrix_apply_BinaryOp2nd_UINT8 // C=accum(C,op(A,y)) ( - int16_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + uint8_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_reduce_UINT16 // c = accum (c, reduce_to_scalar (A)) +GrB_Info GrB_Matrix_apply_BinaryOp2nd_UINT16 // C=accum(C,op(A,y)) ( - uint16_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + uint16_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_reduce_INT32 // c = accum (c, reduce_to_scalar (A)) +GrB_Info GrB_Matrix_apply_BinaryOp2nd_UINT32 // C=accum(C,op(A,y)) ( - int32_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + uint32_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_reduce_UINT32 // c = accum (c, reduce_to_scalar (A)) +GrB_Info GrB_Matrix_apply_BinaryOp2nd_UINT64 // C=accum(C,op(A,y)) ( - uint32_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + uint64_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_reduce_INT64 // c = accum (c, reduce_to_scalar (A)) +GrB_Info GrB_Matrix_apply_BinaryOp2nd_FP32 // C=accum(C,op(A,y)) ( - int64_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + float y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_reduce_UINT64 // c = accum (c, reduce_to_scalar (A)) +GrB_Info GrB_Matrix_apply_BinaryOp2nd_FP64 // C=accum(C,op(A,y)) ( - uint64_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + double y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_reduce_FP32 // c = accum (c, reduce_to_scalar (A)) +GrB_Info GxB_Matrix_apply_BinaryOp2nd_FC32 // C=accum(C,op(A,y)) ( - float *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + GxB_FC32_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_reduce_FP64 // c = accum (c, reduce_to_scalar (A)) +GrB_Info GxB_Matrix_apply_BinaryOp2nd_FC64 // C=accum(C,op(A,y)) ( - double *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + GxB_FC64_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GxB_Matrix_reduce_FC32 // c = accum (c, reduce_to_scalar (A)) +GrB_Info GrB_Matrix_apply_BinaryOp2nd_UDT // C=accum(C,op(A,y)) ( - GxB_FC32_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + const void *y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GxB_Matrix_reduce_FC64 // c = accum (c, reduce_to_scalar (A)) +//------------------------------------------- +// matrix apply: IndexUnaryOp variants +//------------------------------------------- + +// Apply a GrB_IndexUnaryOp to the entries in a matrix. + +GrB_Info GrB_Matrix_apply_IndexOp_Scalar // C=accum(C,op(A)) ( - GxB_FC64_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + const GrB_Scalar y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_reduce_UDT // c = accum (c, reduce_to_scalar (A)) +GrB_Info GrB_Matrix_apply_IndexOp_BOOL // C=accum(C,op(A)) ( - void *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + bool y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_reduce_Monoid_Scalar // c = accum(c,reduce_to_scalar(A)) +GrB_Info GrB_Matrix_apply_IndexOp_INT8 // C=accum(C,op(A)) ( - GrB_Scalar c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + int8_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_reduce_BinaryOp_Scalar +GrB_Info GrB_Matrix_apply_IndexOp_INT16 // C=accum(C,op(A)) ( - GrB_Scalar S, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_BinaryOp op, // binary op to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + int16_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -//------------------------------------------------------------------------------ -// GrB_reduce: generic matrix/vector reduction to a vector or scalar -//------------------------------------------------------------------------------ - -// GrB_reduce is a generic function that provides access to all GrB_*reduce* -// functions: - -// reduce matrix to vector: -// GrB_Matrix_reduce_Monoid (w,mask,acc,mo,A,d) // w = acc (w,reduce(A)) -// GrB_Matrix_reduce_BinaryOp (w,mask,acc,op,A,d) // w = acc (w,reduce(A)) - -// reduce matrix to scalar: -// GrB_Vector_reduce_[SCALAR] (c,acc,monoid,u,d) // c = acc (c,reduce(u)) -// GrB_Matrix_reduce_[SCALAR] (c,acc,monoid,A,d) // c = acc (c,reduce(A)) -// GrB_Vector_reduce_Monoid_Scalar (s,acc,monoid,u,d) // s = acc (s,reduce(u)) -// GrB_Matrix_reduce_Monoid_Scalar (s,acc,monoid,A,d) // s = acc (s,reduce(A)) -// GrB_Vector_reduce_BinaryOp_Scalar (s,acc,op,u,d) // s = acc (s,reduce(u)) -// GrB_Matrix_reduce_BinaryOp_Scalar (s,acc,op,A,d) // s = acc (s,reduce(A)) - -#if GxB_STDC_VERSION >= 201112L -#define GB_REDUCE_TO_SCALAR(kind,c,op) \ - _Generic \ - ( \ - (c), \ - GB_PCASES (GrB, GB_CONCAT ( kind, _reduce,, )), \ - default: \ - _Generic \ - ( \ - (op), \ - GrB_BinaryOp : \ - GB_CONCAT (GrB,_,kind,_reduce_BinaryOp_Scalar),\ - default: GB_CONCAT (GrB,_,kind,_reduce_Monoid_Scalar) \ - ) \ - ) - -#define GrB_reduce(arg1,arg2,arg3,arg4,...) \ - _Generic \ - ( \ - (arg4), \ - GrB_Vector : GB_REDUCE_TO_SCALAR (Vector, arg1, arg3), \ - GrB_Matrix : GB_REDUCE_TO_SCALAR (Matrix, arg1, arg3), \ - GrB_Monoid : GrB_Matrix_reduce_Monoid , \ - GrB_BinaryOp : GrB_Matrix_reduce_BinaryOp \ - ) \ - (arg1, arg2, arg3, arg4, __VA_ARGS__) -#endif +GrB_Info GrB_Matrix_apply_IndexOp_INT32 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + int32_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; -//============================================================================== -// GrB_transpose: matrix transpose -//============================================================================== +GrB_Info GrB_Matrix_apply_IndexOp_INT64 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + int64_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; -GrB_Info GrB_transpose // C = accum (C, A') +GrB_Info GrB_Matrix_apply_IndexOp_UINT8 // C=accum(C,op(A)) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries const GrB_Matrix A, // first input: matrix A - const GrB_Descriptor desc // descriptor for C, Mask, and A + uint8_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -//============================================================================== -// GrB_kronecker: Kronecker product -//============================================================================== - -// GxB_kron is historical; use GrB_kronecker instead -GrB_Info GxB_kron // C = accum(C,kron(A,B)) (historical) +GrB_Info GrB_Matrix_apply_IndexOp_UINT16 // C=accum(C,op(A)) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // defines '*' for T=kron(A,B) + const GrB_IndexUnaryOp op, // operator to apply to the entries const GrB_Matrix A, // first input: matrix A - const GrB_Matrix B, // second input: matrix B - const GrB_Descriptor desc // descriptor for C, Mask, A, and B + uint16_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_kronecker_BinaryOp // C = accum (C, kron(A,B)) +GrB_Info GrB_Matrix_apply_IndexOp_UINT32 // C=accum(C,op(A)) ( GrB_Matrix C, // input/output matrix for results - const GrB_Matrix M, // optional mask for C, unused if NULL + const GrB_Matrix Mask, // optional mask for C, unused if NULL const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // defines '*' for T=kron(A,B) + const GrB_IndexUnaryOp op, // operator to apply to the entries const GrB_Matrix A, // first input: matrix A - const GrB_Matrix B, // second input: matrix B - const GrB_Descriptor desc // descriptor for C, M, A, and B + uint32_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_kronecker_Monoid // C = accum (C, kron(A,B)) +GrB_Info GrB_Matrix_apply_IndexOp_UINT64 // C=accum(C,op(A)) ( GrB_Matrix C, // input/output matrix for results - const GrB_Matrix M, // optional mask for C, unused if NULL + const GrB_Matrix Mask, // optional mask for C, unused if NULL const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_Monoid monoid, // defines '*' for T=kron(A,B) + const GrB_IndexUnaryOp op, // operator to apply to the entries const GrB_Matrix A, // first input: matrix A - const GrB_Matrix B, // second input: matrix B - const GrB_Descriptor desc // descriptor for C, M, A, and B + uint64_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_kronecker_Semiring // C = accum (C, kron(A,B)) +GrB_Info GrB_Matrix_apply_IndexOp_FP32 // C=accum(C,op(A)) ( GrB_Matrix C, // input/output matrix for results - const GrB_Matrix M, // optional mask for C, unused if NULL + const GrB_Matrix Mask, // optional mask for C, unused if NULL const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_Semiring semiring, // defines '*' for T=kron(A,B) + const GrB_IndexUnaryOp op, // operator to apply to the entries const GrB_Matrix A, // first input: matrix A - const GrB_Matrix B, // second input: matrix B - const GrB_Descriptor desc // descriptor for C, M, A, and B + float y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -#if GxB_STDC_VERSION >= 201112L -#define GrB_kronecker(C,Mask,accum,op,A,B,desc) \ - _Generic \ - ( \ - (op), \ - GrB_Semiring : GrB_Matrix_kronecker_Semiring , \ - GrB_Monoid : GrB_Matrix_kronecker_Monoid , \ - GrB_BinaryOp : GrB_Matrix_kronecker_BinaryOp \ - ) \ - (C, Mask, accum, op, A, B, desc) -#endif - -#endif // GB_CUDA_FOLDER - -//============================================================================== -// GrB_Monoid: built-in monoids -//============================================================================== - -GB_GLOBAL GrB_Monoid - - //-------------------------------------------------------------------------- - // 10 MIN monoids: (not for complex types) - //-------------------------------------------------------------------------- - - // GxB_MIN monoids, historical, use GrB_MIN_MONOID_* instead: - GxB_MIN_INT8_MONOID, // identity: INT8_MAX terminal: INT8_MIN - GxB_MIN_INT16_MONOID, // identity: INT16_MAX terminal: INT16_MIN - GxB_MIN_INT32_MONOID, // identity: INT32_MAX terminal: INT32_MIN - GxB_MIN_INT64_MONOID, // identity: INT64_MAX terminal: INT32_MIN - GxB_MIN_UINT8_MONOID, // identity: UINT8_MAX terminal: 0 - GxB_MIN_UINT16_MONOID, // identity: UINT16_MAX terminal: 0 - GxB_MIN_UINT32_MONOID, // identity: UINT32_MAX terminal: 0 - GxB_MIN_UINT64_MONOID, // identity: UINT64_MAX terminal: 0 - GxB_MIN_FP32_MONOID, // identity: INFINITY terminal: -INFINITY - GxB_MIN_FP64_MONOID, // identity: INFINITY terminal: -INFINITY - - // preferred names from the v1.3 spec: - GrB_MIN_MONOID_INT8, // identity: INT8_MAX terminal: INT8_MIN - GrB_MIN_MONOID_INT16, // identity: INT16_MAX terminal: INT16_MIN - GrB_MIN_MONOID_INT32, // identity: INT32_MAX terminal: INT32_MIN - GrB_MIN_MONOID_INT64, // identity: INT64_MAX terminal: INT32_MIN - GrB_MIN_MONOID_UINT8, // identity: UINT8_MAX terminal: 0 - GrB_MIN_MONOID_UINT16, // identity: UINT16_MAX terminal: 0 - GrB_MIN_MONOID_UINT32, // identity: UINT32_MAX terminal: 0 - GrB_MIN_MONOID_UINT64, // identity: UINT64_MAX terminal: 0 - GrB_MIN_MONOID_FP32, // identity: INFINITY terminal: -INFINITY - GrB_MIN_MONOID_FP64, // identity: INFINITY terminal: -INFINITY - - //-------------------------------------------------------------------------- - // 10 MAX monoids: - //-------------------------------------------------------------------------- - - // GxB_MAX monoids, historical, use GrB_MAX_MONOID_* instead: - GxB_MAX_INT8_MONOID, // identity: INT8_MIN terminal: INT8_MAX - GxB_MAX_INT16_MONOID, // identity: INT16_MIN terminal: INT16_MAX - GxB_MAX_INT32_MONOID, // identity: INT32_MIN terminal: INT32_MAX - GxB_MAX_INT64_MONOID, // identity: INT64_MIN terminal: INT64_MAX - GxB_MAX_UINT8_MONOID, // identity: 0 terminal: UINT8_MAX - GxB_MAX_UINT16_MONOID, // identity: 0 terminal: UINT16_MAX - GxB_MAX_UINT32_MONOID, // identity: 0 terminal: UINT32_MAX - GxB_MAX_UINT64_MONOID, // identity: 0 terminal: UINT64_MAX - GxB_MAX_FP32_MONOID, // identity: -INFINITY terminal: INFINITY - GxB_MAX_FP64_MONOID, // identity: -INFINITY terminal: INFINITY - - // preferred names from the v1.3 spec: - GrB_MAX_MONOID_INT8, // identity: INT8_MIN terminal: INT8_MAX - GrB_MAX_MONOID_INT16, // identity: INT16_MIN terminal: INT16_MAX - GrB_MAX_MONOID_INT32, // identity: INT32_MIN terminal: INT32_MAX - GrB_MAX_MONOID_INT64, // identity: INT64_MIN terminal: INT64_MAX - GrB_MAX_MONOID_UINT8, // identity: 0 terminal: UINT8_MAX - GrB_MAX_MONOID_UINT16, // identity: 0 terminal: UINT16_MAX - GrB_MAX_MONOID_UINT32, // identity: 0 terminal: UINT32_MAX - GrB_MAX_MONOID_UINT64, // identity: 0 terminal: UINT64_MAX - GrB_MAX_MONOID_FP32, // identity: -INFINITY terminal: INFINITY - GrB_MAX_MONOID_FP64, // identity: -INFINITY terminal: INFINITY - - //-------------------------------------------------------------------------- - // 12 PLUS monoids: - //-------------------------------------------------------------------------- - - // GxB_PLUS monoids, historical, use GrB_PLUS_MONOID_* instead: - GxB_PLUS_INT8_MONOID, // identity: 0 - GxB_PLUS_INT16_MONOID, // identity: 0 - GxB_PLUS_INT32_MONOID, // identity: 0 - GxB_PLUS_INT64_MONOID, // identity: 0 - GxB_PLUS_UINT8_MONOID, // identity: 0 - GxB_PLUS_UINT16_MONOID, // identity: 0 - GxB_PLUS_UINT32_MONOID, // identity: 0 - GxB_PLUS_UINT64_MONOID, // identity: 0 - GxB_PLUS_FP32_MONOID, // identity: 0 - GxB_PLUS_FP64_MONOID, // identity: 0 - - // preferred names from the v1.3 spec: - GrB_PLUS_MONOID_INT8, // identity: 0 - GrB_PLUS_MONOID_INT16, // identity: 0 - GrB_PLUS_MONOID_INT32, // identity: 0 - GrB_PLUS_MONOID_INT64, // identity: 0 - GrB_PLUS_MONOID_UINT8, // identity: 0 - GrB_PLUS_MONOID_UINT16, // identity: 0 - GrB_PLUS_MONOID_UINT32, // identity: 0 - GrB_PLUS_MONOID_UINT64, // identity: 0 - GrB_PLUS_MONOID_FP32, // identity: 0 - GrB_PLUS_MONOID_FP64, // identity: 0 - - // complex monoids: - GxB_PLUS_FC32_MONOID, // identity: 0 - GxB_PLUS_FC64_MONOID, // identity: 0 - - //-------------------------------------------------------------------------- - // 12 TIMES monoids: identity value is 1, int* and uint* are terminal - //-------------------------------------------------------------------------- - - // GxB_TIMES monoids, historical, use GrB_TIMES_MONOID_* instead: - GxB_TIMES_INT8_MONOID, // identity: 1 terminal: 0 - GxB_TIMES_INT16_MONOID, // identity: 1 terminal: 0 - GxB_TIMES_INT32_MONOID, // identity: 1 terminal: 0 - GxB_TIMES_INT64_MONOID, // identity: 1 terminal: 0 - GxB_TIMES_UINT8_MONOID, // identity: 1 terminal: 0 - GxB_TIMES_UINT16_MONOID, // identity: 1 terminal: 0 - GxB_TIMES_UINT32_MONOID, // identity: 1 terminal: 0 - GxB_TIMES_UINT64_MONOID, // identity: 1 terminal: 0 - GxB_TIMES_FP32_MONOID, // identity: 1 - GxB_TIMES_FP64_MONOID, // identity: 1 - - // preferred names from the v1.3 spec: - GrB_TIMES_MONOID_INT8, // identity: 1 terminal: 0 - GrB_TIMES_MONOID_INT16, // identity: 1 terminal: 0 - GrB_TIMES_MONOID_INT32, // identity: 1 terminal: 0 - GrB_TIMES_MONOID_INT64, // identity: 1 terminal: 0 - GrB_TIMES_MONOID_UINT8, // identity: 1 terminal: 0 - GrB_TIMES_MONOID_UINT16, // identity: 1 terminal: 0 - GrB_TIMES_MONOID_UINT32, // identity: 1 terminal: 0 - GrB_TIMES_MONOID_UINT64, // identity: 1 terminal: 0 - GrB_TIMES_MONOID_FP32, // identity: 1 - GrB_TIMES_MONOID_FP64, // identity: 1 - - // complex monoids: - GxB_TIMES_FC32_MONOID, // identity: 1 - GxB_TIMES_FC64_MONOID, // identity: 1 - - //-------------------------------------------------------------------------- - // 13 ANY monoids: - //-------------------------------------------------------------------------- - - GxB_ANY_BOOL_MONOID, // identity: any value terminal: any value - GxB_ANY_INT8_MONOID, // identity: any value terminal: any value - GxB_ANY_INT16_MONOID, // identity: any value terminal: any value - GxB_ANY_INT32_MONOID, // identity: any value terminal: any value - GxB_ANY_INT64_MONOID, // identity: any value terminal: any value - GxB_ANY_UINT8_MONOID, // identity: any value terminal: any value - GxB_ANY_UINT16_MONOID, // identity: any value terminal: any value - GxB_ANY_UINT32_MONOID, // identity: any value terminal: any value - GxB_ANY_UINT64_MONOID, // identity: any value terminal: any value - GxB_ANY_FP32_MONOID, // identity: any value terminal: any value - GxB_ANY_FP64_MONOID, // identity: any value terminal: any value - GxB_ANY_FC32_MONOID, // identity: any value terminal: any value - GxB_ANY_FC64_MONOID, // identity: any value terminal: any value - - //-------------------------------------------------------------------------- - // 4 Boolean monoids: (see also the GxB_ANY_BOOL_MONOID above) - //-------------------------------------------------------------------------- - - // GxB_* boolean monoids, historical, use GrB_* instead: - GxB_LOR_BOOL_MONOID, // identity: false terminal: true - GxB_LAND_BOOL_MONOID, // identity: true terminal: false - GxB_LXOR_BOOL_MONOID, // identity: false - GxB_LXNOR_BOOL_MONOID, // identity: true - GxB_EQ_BOOL_MONOID, // (another name for GrB_LXNOR_MONOID_BOOL) - - // preferred names from the v1.3 spec: - GrB_LOR_MONOID_BOOL, // identity: false terminal: true - GrB_LAND_MONOID_BOOL, // identity: true terminal: false - GrB_LXOR_MONOID_BOOL, // identity: false - GrB_LXNOR_MONOID_BOOL, // identity: true - - //-------------------------------------------------------------------------- - // 16 Bitwise-or monoids: - //-------------------------------------------------------------------------- - - // BOR monoids (bitwise or): - GxB_BOR_UINT8_MONOID, // identity: 0 terminal: 0xFF - GxB_BOR_UINT16_MONOID, // identity: 0 terminal: 0xFFFF - GxB_BOR_UINT32_MONOID, // identity: 0 terminal: 0xFFFFFFFF - GxB_BOR_UINT64_MONOID, // identity: 0 terminal: 0xFFFFFFFFFFFFFFFF +GrB_Info GrB_Matrix_apply_IndexOp_FP64 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + double y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // BAND monoids (bitwise and): - GxB_BAND_UINT8_MONOID, // identity: 0xFF terminal: 0 - GxB_BAND_UINT16_MONOID, // identity: 0xFFFF terminal: 0 - GxB_BAND_UINT32_MONOID, // identity: 0xFFFFFFFF terminal: 0 - GxB_BAND_UINT64_MONOID, // identity: 0xFFFFFFFFFFFFFFFF terminal: 0 +GrB_Info GxB_Matrix_apply_IndexOp_FC32 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + GxB_FC32_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // BXOR monoids (bitwise xor): - GxB_BXOR_UINT8_MONOID, // identity: 0 - GxB_BXOR_UINT16_MONOID, // identity: 0 - GxB_BXOR_UINT32_MONOID, // identity: 0 - GxB_BXOR_UINT64_MONOID, // identity: 0 +GrB_Info GxB_Matrix_apply_IndexOp_FC64 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + GxB_FC64_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // BXNOR monoids (bitwise xnor): - GxB_BXNOR_UINT8_MONOID, // identity: 0xFF - GxB_BXNOR_UINT16_MONOID, // identity: 0xFFFF - GxB_BXNOR_UINT32_MONOID, // identity: 0xFFFFFFFF - GxB_BXNOR_UINT64_MONOID ; // identity: 0xFFFFFFFFFFFFFFFF +GrB_Info GrB_Matrix_apply_IndexOp_UDT // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + const void *y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; -//============================================================================== -// GrB_Semiring: built-in semirings -//============================================================================== +//------------------------------------------------------------------------------ +// GrB_apply: generic matrix/vector apply +//------------------------------------------------------------------------------ -// Using built-in types and operators, SuiteSparse:GraphBLAS provides -// 1553 pre-defined, built-in semirings: +// GrB_apply is a generic function for applying a unary operator to a matrix +// or vector and provides access to these functions: -// 1000 semirings with a multiply operator TxT -> T where T is non-Boolean, -// from the complete cross product of: +// GrB_Vector_apply (w,mask,acc,op,u,d) // w = accum (w, op(u)) +// GrB_Matrix_apply (C,Mask,acc,op,A,d) // C = accum (C, op(A)) -// 5 monoids: MIN, MAX, PLUS, TIMES, ANY -// 20 multiply operators: -// FIRST, SECOND, PAIR (=ONEB), MIN, MAX, PLUS, MINUS, TIMES, DIV, -// RDIV, RMINUS -// ISEQ, ISNE, ISGT, ISLT, ISGE, ISLE, -// LOR, LAND, LXOR -// 10 non-Boolean real types, T -// -// Note that min_pair, max_pair, times_pair are all identical to any_pair. -// These 30 semirings are named below, but are internally remapped to -// their corresponding any_pair semiring. +// GrB_Vector_apply (w,m,acc,unop ,u,d) +// GrB_Vector_apply_BinaryOp1st_TYPE (w,m,acc,binop,x,u,d) +// GrB_Vector_apply_BinaryOp2nd_TYPE (w,m,acc,binop,u,y,d) +// GrB_Vector_apply_IndexOp_TYPE (w,m,acc,idxop,u,y,d) -// 300 semirings with a comparator TxT -> bool, where T is -// non-Boolean, from the complete cross product of: +// GrB_Matrix_apply (C,M,acc,unop ,A,d) +// GrB_Matrix_apply_BinaryOp1st_TYPE (C,M,acc,binop,x,A,d) +// GrB_Matrix_apply_BinaryOp2nd_TYPE (C,M,acc,binop,A,y,d) +// GrB_Matrix_apply_IndexOp_TYPE (C,M,acc,idxop,A,y,d) -// 5 Boolean monoids: LAND, LOR, LXOR, EQ (=LXNOR), ANY -// 6 multiply operators: EQ, NE, GT, LT, GE, LE -// 10 non-Boolean real types, T +#if GxB_STDC_VERSION >= 201112L -// 55 semirings with purely Boolean types, bool x bool -> bool, from the -// complete cross product of: +#define GB_BIND(kind,x,y,...) \ + _Generic \ + ( \ + (x), \ + GrB_Scalar: GB_CONCAT ( GrB,_,kind,_apply_BinaryOp1st_Scalar), \ + GB_CASES (GrB, GB_CONCAT ( kind, _apply_BinaryOp1st,, )) , \ + default: \ + _Generic \ + ( \ + (y), \ + GB_CASES (GrB, GB_CONCAT ( kind , _apply_BinaryOp2nd,, )), \ + default: GB_CONCAT ( GrB,_,kind,_apply_BinaryOp2nd_Scalar) \ + ) \ + ) -// 5 Boolean monoids LAND, LOR, LXOR, EQ (=LXNOR), ANY -// 11 multiply operators: -// FIRST, SECOND, LOR, LAND, LXOR, EQ (=LXNOR), GT, LT, GE, LE, -// PAIR (=ONEB) -// -// Note that lor_pair, land_pair, and eq_pair are all identical to -// any_pair. These 3 semirings are named below, but are internally -// remapped to any_pair_bool semiring. +#define GB_IDXOP(kind,A,y,...) \ + _Generic \ + ( \ + (y), \ + GB_CASES (GrB, GB_CONCAT ( kind, _apply_IndexOp,, )), \ + default: GB_CONCAT ( GrB, _, kind, _apply_IndexOp_Scalar) \ + ) -// 54 complex semirings: TxT -> T where T is float complex or double complex: +#define GrB_apply(C,Mask,accum,op,...) \ + _Generic \ + ( \ + (C), \ + GrB_Vector : \ + _Generic \ + ( \ + (op), \ + GrB_UnaryOp : GrB_Vector_apply , \ + GrB_BinaryOp : GB_BIND (Vector, __VA_ARGS__), \ + GrB_IndexUnaryOp : GB_IDXOP (Vector, __VA_ARGS__) \ + ), \ + GrB_Matrix : \ + _Generic \ + ( \ + (op), \ + GrB_UnaryOp : GrB_Matrix_apply , \ + GrB_BinaryOp : GB_BIND (Matrix, __VA_ARGS__), \ + GrB_IndexUnaryOp : GB_IDXOP (Matrix, __VA_ARGS__) \ + ) \ + ) \ + (C, Mask, accum, op, __VA_ARGS__) +#endif -// 3 complex monoids: PLUS, TIMES, ANY -// 9 complex multiply operators: -// FIRST, SECOND, PAIR (=ONEB), PLUS, MINUS, TIMES, DIV, RDIV, RMINUS -// 2 complex types -// -// Note that times_pair is identical to any_pair. -// These 2 semirings are named below, but are internally remapped to -// their corresponding any_pair semiring. +//============================================================================== +// GrB_select: matrix and vector selection using an IndexUnaryOp +//============================================================================== -// 64 bitwise semirings: TxT -> T where T is an unsigned integer: +//------------------------------------------- +// vector select using an IndexUnaryOp +//------------------------------------------- -// 4 bitwise monoids: BOR, BAND, BXOR, BXNOR -// 4 bitwise multiply operators: BOR, BAND, BXOR, BXNOR -// 4 unsigned integer types: UINT8, UINT16, UINT32, UINT64 +GrB_Info GrB_Vector_select_Scalar // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + const GrB_Scalar y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; -// 80 positional semirings: XxX -> T where T is int64 or int32, and the type of -// X is ignored: +GrB_Info GrB_Vector_select_BOOL // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + bool y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; -// 5 monoids: MIN, MAX, PLUS, TIMES, ANY -// 8 multiply operators: -// FIRSTI, FIRSTI1, FIRSTJ, FIRSTJ1, -// SECONDI, SECONDI1, SECONDJ, SECONDJ1 -// 2 types: int32, int64 +GrB_Info GrB_Vector_select_INT8 // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + int8_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; -// The ANY operator is also valid to use as a multiplicative operator in a -// semiring, but serves no purpose in that case. The ANY operator is meant as -// a fast additive operator for a monoid, that terminates, or short-circuits, -// as soon as any value is found. A valid user semiring can be constructed -// with ANY as the multiply operator, but they are not predefined below. +GrB_Info GrB_Vector_select_INT16 // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + int16_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; -// Likewise, additional built-in operators can be used as multiplicative -// operators for floating-point semirings (POW, ATAN2, HYPOT, ...) and many -// more semirings can be constructed from bitwise monoids and many integer -// binary (non-bitwise) multiplicative operators, but these are not -// pre-defined. +GrB_Info GrB_Vector_select_INT32 // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + int32_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; -// In the names below, each semiring has a name of the form GxB_add_mult_T -// where add is the additive monoid, mult is the multiply operator, and T is -// the type. The type T is always the type of x and y for the z=mult(x,y) -// operator. The monoid's three types and the ztype of the mult operator are -// always the same. This is the type T for the first set, and Boolean for -// the second and third sets of semirngs. +GrB_Info GrB_Vector_select_INT64 // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + int64_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; -// 1553 = 1000 + 300 + 55 + 54 + 64 + 80 semirings are named below, but 35 = 30 -// + 3 + 2 are identical to the corresponding any_pair semirings of the same -// type. For positional semirings, the mulitiply ops FIRSTJ and SECONDI are -// identical, as are FIRSTJ1 and SECONDI1. These semirings still appear as -// predefined, for convenience. +GrB_Info GrB_Vector_select_UINT8 // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + uint8_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; -GB_GLOBAL GrB_Semiring +GrB_Info GrB_Vector_select_UINT16 // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + uint16_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; -//------------------------------------------------------------------------------ -// 1000 non-Boolean semirings where all types are the same, given by suffix _T -//------------------------------------------------------------------------------ +GrB_Info GrB_Vector_select_UINT32 // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + uint32_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; - // semirings with multiply op: z = FIRST (x,y), all types x,y,z the same: - GxB_MIN_FIRST_INT8 , GxB_MAX_FIRST_INT8 , GxB_PLUS_FIRST_INT8 , GxB_TIMES_FIRST_INT8 , GxB_ANY_FIRST_INT8 , - GxB_MIN_FIRST_INT16 , GxB_MAX_FIRST_INT16 , GxB_PLUS_FIRST_INT16 , GxB_TIMES_FIRST_INT16 , GxB_ANY_FIRST_INT16 , - GxB_MIN_FIRST_INT32 , GxB_MAX_FIRST_INT32 , GxB_PLUS_FIRST_INT32 , GxB_TIMES_FIRST_INT32 , GxB_ANY_FIRST_INT32 , - GxB_MIN_FIRST_INT64 , GxB_MAX_FIRST_INT64 , GxB_PLUS_FIRST_INT64 , GxB_TIMES_FIRST_INT64 , GxB_ANY_FIRST_INT64 , - GxB_MIN_FIRST_UINT8 , GxB_MAX_FIRST_UINT8 , GxB_PLUS_FIRST_UINT8 , GxB_TIMES_FIRST_UINT8 , GxB_ANY_FIRST_UINT8 , - GxB_MIN_FIRST_UINT16 , GxB_MAX_FIRST_UINT16 , GxB_PLUS_FIRST_UINT16 , GxB_TIMES_FIRST_UINT16 , GxB_ANY_FIRST_UINT16 , - GxB_MIN_FIRST_UINT32 , GxB_MAX_FIRST_UINT32 , GxB_PLUS_FIRST_UINT32 , GxB_TIMES_FIRST_UINT32 , GxB_ANY_FIRST_UINT32 , - GxB_MIN_FIRST_UINT64 , GxB_MAX_FIRST_UINT64 , GxB_PLUS_FIRST_UINT64 , GxB_TIMES_FIRST_UINT64 , GxB_ANY_FIRST_UINT64 , - GxB_MIN_FIRST_FP32 , GxB_MAX_FIRST_FP32 , GxB_PLUS_FIRST_FP32 , GxB_TIMES_FIRST_FP32 , GxB_ANY_FIRST_FP32 , - GxB_MIN_FIRST_FP64 , GxB_MAX_FIRST_FP64 , GxB_PLUS_FIRST_FP64 , GxB_TIMES_FIRST_FP64 , GxB_ANY_FIRST_FP64 , +GrB_Info GrB_Vector_select_UINT64 // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + uint64_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; - // semirings with multiply op: z = SECOND (x,y), all types x,y,z the same: - GxB_MIN_SECOND_INT8 , GxB_MAX_SECOND_INT8 , GxB_PLUS_SECOND_INT8 , GxB_TIMES_SECOND_INT8 , GxB_ANY_SECOND_INT8 , - GxB_MIN_SECOND_INT16 , GxB_MAX_SECOND_INT16 , GxB_PLUS_SECOND_INT16 , GxB_TIMES_SECOND_INT16 , GxB_ANY_SECOND_INT16 , - GxB_MIN_SECOND_INT32 , GxB_MAX_SECOND_INT32 , GxB_PLUS_SECOND_INT32 , GxB_TIMES_SECOND_INT32 , GxB_ANY_SECOND_INT32 , - GxB_MIN_SECOND_INT64 , GxB_MAX_SECOND_INT64 , GxB_PLUS_SECOND_INT64 , GxB_TIMES_SECOND_INT64 , GxB_ANY_SECOND_INT64 , - GxB_MIN_SECOND_UINT8 , GxB_MAX_SECOND_UINT8 , GxB_PLUS_SECOND_UINT8 , GxB_TIMES_SECOND_UINT8 , GxB_ANY_SECOND_UINT8 , - GxB_MIN_SECOND_UINT16 , GxB_MAX_SECOND_UINT16 , GxB_PLUS_SECOND_UINT16 , GxB_TIMES_SECOND_UINT16, GxB_ANY_SECOND_UINT16 , - GxB_MIN_SECOND_UINT32 , GxB_MAX_SECOND_UINT32 , GxB_PLUS_SECOND_UINT32 , GxB_TIMES_SECOND_UINT32, GxB_ANY_SECOND_UINT32 , - GxB_MIN_SECOND_UINT64 , GxB_MAX_SECOND_UINT64 , GxB_PLUS_SECOND_UINT64 , GxB_TIMES_SECOND_UINT64, GxB_ANY_SECOND_UINT64 , - GxB_MIN_SECOND_FP32 , GxB_MAX_SECOND_FP32 , GxB_PLUS_SECOND_FP32 , GxB_TIMES_SECOND_FP32 , GxB_ANY_SECOND_FP32 , - GxB_MIN_SECOND_FP64 , GxB_MAX_SECOND_FP64 , GxB_PLUS_SECOND_FP64 , GxB_TIMES_SECOND_FP64 , GxB_ANY_SECOND_FP64 , +GrB_Info GrB_Vector_select_FP32 // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + float y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; - // semirings with multiply op: z = PAIR (x,y), all types x,y,z the same: - // (note that min_pair, max_pair, times_pair are all identical to any_pair, and are marked below) - GxB_MIN_PAIR_INT8 /**/, GxB_MAX_PAIR_INT8 /**/, GxB_PLUS_PAIR_INT8 , GxB_TIMES_PAIR_INT8 /**/, GxB_ANY_PAIR_INT8 , - GxB_MIN_PAIR_INT16 /**/, GxB_MAX_PAIR_INT16 /**/, GxB_PLUS_PAIR_INT16 , GxB_TIMES_PAIR_INT16 /**/, GxB_ANY_PAIR_INT16 , - GxB_MIN_PAIR_INT32 /**/, GxB_MAX_PAIR_INT32 /**/, GxB_PLUS_PAIR_INT32 , GxB_TIMES_PAIR_INT32 /**/, GxB_ANY_PAIR_INT32 , - GxB_MIN_PAIR_INT64 /**/, GxB_MAX_PAIR_INT64 /**/, GxB_PLUS_PAIR_INT64 , GxB_TIMES_PAIR_INT64 /**/, GxB_ANY_PAIR_INT64 , - GxB_MIN_PAIR_UINT8 /**/, GxB_MAX_PAIR_UINT8 /**/, GxB_PLUS_PAIR_UINT8 , GxB_TIMES_PAIR_UINT8 /**/, GxB_ANY_PAIR_UINT8 , - GxB_MIN_PAIR_UINT16/**/, GxB_MAX_PAIR_UINT16/**/, GxB_PLUS_PAIR_UINT16 , GxB_TIMES_PAIR_UINT16/**/, GxB_ANY_PAIR_UINT16 , - GxB_MIN_PAIR_UINT32/**/, GxB_MAX_PAIR_UINT32/**/, GxB_PLUS_PAIR_UINT32 , GxB_TIMES_PAIR_UINT32/**/, GxB_ANY_PAIR_UINT32 , - GxB_MIN_PAIR_UINT64/**/, GxB_MAX_PAIR_UINT64/**/, GxB_PLUS_PAIR_UINT64 , GxB_TIMES_PAIR_UINT64/**/, GxB_ANY_PAIR_UINT64 , - GxB_MIN_PAIR_FP32 /**/, GxB_MAX_PAIR_FP32 /**/, GxB_PLUS_PAIR_FP32 , GxB_TIMES_PAIR_FP32 /**/, GxB_ANY_PAIR_FP32 , - GxB_MIN_PAIR_FP64 /**/, GxB_MAX_PAIR_FP64 /**/, GxB_PLUS_PAIR_FP64 , GxB_TIMES_PAIR_FP64 /**/, GxB_ANY_PAIR_FP64 , +GrB_Info GrB_Vector_select_FP64 // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + double y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; - // semirings with multiply op: z = MIN (x,y), all types x,y,z the same: - GxB_MIN_MIN_INT8 , GxB_MAX_MIN_INT8 , GxB_PLUS_MIN_INT8 , GxB_TIMES_MIN_INT8 , GxB_ANY_MIN_INT8 , - GxB_MIN_MIN_INT16 , GxB_MAX_MIN_INT16 , GxB_PLUS_MIN_INT16 , GxB_TIMES_MIN_INT16 , GxB_ANY_MIN_INT16 , - GxB_MIN_MIN_INT32 , GxB_MAX_MIN_INT32 , GxB_PLUS_MIN_INT32 , GxB_TIMES_MIN_INT32 , GxB_ANY_MIN_INT32 , - GxB_MIN_MIN_INT64 , GxB_MAX_MIN_INT64 , GxB_PLUS_MIN_INT64 , GxB_TIMES_MIN_INT64 , GxB_ANY_MIN_INT64 , - GxB_MIN_MIN_UINT8 , GxB_MAX_MIN_UINT8 , GxB_PLUS_MIN_UINT8 , GxB_TIMES_MIN_UINT8 , GxB_ANY_MIN_UINT8 , - GxB_MIN_MIN_UINT16 , GxB_MAX_MIN_UINT16 , GxB_PLUS_MIN_UINT16 , GxB_TIMES_MIN_UINT16 , GxB_ANY_MIN_UINT16 , - GxB_MIN_MIN_UINT32 , GxB_MAX_MIN_UINT32 , GxB_PLUS_MIN_UINT32 , GxB_TIMES_MIN_UINT32 , GxB_ANY_MIN_UINT32 , - GxB_MIN_MIN_UINT64 , GxB_MAX_MIN_UINT64 , GxB_PLUS_MIN_UINT64 , GxB_TIMES_MIN_UINT64 , GxB_ANY_MIN_UINT64 , - GxB_MIN_MIN_FP32 , GxB_MAX_MIN_FP32 , GxB_PLUS_MIN_FP32 , GxB_TIMES_MIN_FP32 , GxB_ANY_MIN_FP32 , - GxB_MIN_MIN_FP64 , GxB_MAX_MIN_FP64 , GxB_PLUS_MIN_FP64 , GxB_TIMES_MIN_FP64 , GxB_ANY_MIN_FP64 , +GrB_Info GxB_Vector_select_FC32 // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + GxB_FC32_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; - // semirings with multiply op: z = MAX (x,y), all types x,y,z the same: - GxB_MIN_MAX_INT8 , GxB_MAX_MAX_INT8 , GxB_PLUS_MAX_INT8 , GxB_TIMES_MAX_INT8 , GxB_ANY_MAX_INT8 , - GxB_MIN_MAX_INT16 , GxB_MAX_MAX_INT16 , GxB_PLUS_MAX_INT16 , GxB_TIMES_MAX_INT16 , GxB_ANY_MAX_INT16 , - GxB_MIN_MAX_INT32 , GxB_MAX_MAX_INT32 , GxB_PLUS_MAX_INT32 , GxB_TIMES_MAX_INT32 , GxB_ANY_MAX_INT32 , - GxB_MIN_MAX_INT64 , GxB_MAX_MAX_INT64 , GxB_PLUS_MAX_INT64 , GxB_TIMES_MAX_INT64 , GxB_ANY_MAX_INT64 , - GxB_MIN_MAX_UINT8 , GxB_MAX_MAX_UINT8 , GxB_PLUS_MAX_UINT8 , GxB_TIMES_MAX_UINT8 , GxB_ANY_MAX_UINT8 , - GxB_MIN_MAX_UINT16 , GxB_MAX_MAX_UINT16 , GxB_PLUS_MAX_UINT16 , GxB_TIMES_MAX_UINT16 , GxB_ANY_MAX_UINT16 , - GxB_MIN_MAX_UINT32 , GxB_MAX_MAX_UINT32 , GxB_PLUS_MAX_UINT32 , GxB_TIMES_MAX_UINT32 , GxB_ANY_MAX_UINT32 , - GxB_MIN_MAX_UINT64 , GxB_MAX_MAX_UINT64 , GxB_PLUS_MAX_UINT64 , GxB_TIMES_MAX_UINT64 , GxB_ANY_MAX_UINT64 , - GxB_MIN_MAX_FP32 , GxB_MAX_MAX_FP32 , GxB_PLUS_MAX_FP32 , GxB_TIMES_MAX_FP32 , GxB_ANY_MAX_FP32 , - GxB_MIN_MAX_FP64 , GxB_MAX_MAX_FP64 , GxB_PLUS_MAX_FP64 , GxB_TIMES_MAX_FP64 , GxB_ANY_MAX_FP64 , +GrB_Info GxB_Vector_select_FC64 // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + GxB_FC64_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; - // semirings with multiply op: z = PLUS (x,y), all types x,y,z the same: - GxB_MIN_PLUS_INT8 , GxB_MAX_PLUS_INT8 , GxB_PLUS_PLUS_INT8 , GxB_TIMES_PLUS_INT8 , GxB_ANY_PLUS_INT8 , - GxB_MIN_PLUS_INT16 , GxB_MAX_PLUS_INT16 , GxB_PLUS_PLUS_INT16 , GxB_TIMES_PLUS_INT16 , GxB_ANY_PLUS_INT16 , - GxB_MIN_PLUS_INT32 , GxB_MAX_PLUS_INT32 , GxB_PLUS_PLUS_INT32 , GxB_TIMES_PLUS_INT32 , GxB_ANY_PLUS_INT32 , - GxB_MIN_PLUS_INT64 , GxB_MAX_PLUS_INT64 , GxB_PLUS_PLUS_INT64 , GxB_TIMES_PLUS_INT64 , GxB_ANY_PLUS_INT64 , - GxB_MIN_PLUS_UINT8 , GxB_MAX_PLUS_UINT8 , GxB_PLUS_PLUS_UINT8 , GxB_TIMES_PLUS_UINT8 , GxB_ANY_PLUS_UINT8 , - GxB_MIN_PLUS_UINT16 , GxB_MAX_PLUS_UINT16 , GxB_PLUS_PLUS_UINT16 , GxB_TIMES_PLUS_UINT16 , GxB_ANY_PLUS_UINT16 , - GxB_MIN_PLUS_UINT32 , GxB_MAX_PLUS_UINT32 , GxB_PLUS_PLUS_UINT32 , GxB_TIMES_PLUS_UINT32 , GxB_ANY_PLUS_UINT32 , - GxB_MIN_PLUS_UINT64 , GxB_MAX_PLUS_UINT64 , GxB_PLUS_PLUS_UINT64 , GxB_TIMES_PLUS_UINT64 , GxB_ANY_PLUS_UINT64 , - GxB_MIN_PLUS_FP32 , GxB_MAX_PLUS_FP32 , GxB_PLUS_PLUS_FP32 , GxB_TIMES_PLUS_FP32 , GxB_ANY_PLUS_FP32 , - GxB_MIN_PLUS_FP64 , GxB_MAX_PLUS_FP64 , GxB_PLUS_PLUS_FP64 , GxB_TIMES_PLUS_FP64 , GxB_ANY_PLUS_FP64 , +GrB_Info GrB_Vector_select_UDT // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + const void *y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; - // semirings with multiply op: z = MINUS (x,y), all types x,y,z the same: - GxB_MIN_MINUS_INT8 , GxB_MAX_MINUS_INT8 , GxB_PLUS_MINUS_INT8 , GxB_TIMES_MINUS_INT8 , GxB_ANY_MINUS_INT8 , - GxB_MIN_MINUS_INT16 , GxB_MAX_MINUS_INT16 , GxB_PLUS_MINUS_INT16 , GxB_TIMES_MINUS_INT16 , GxB_ANY_MINUS_INT16 , - GxB_MIN_MINUS_INT32 , GxB_MAX_MINUS_INT32 , GxB_PLUS_MINUS_INT32 , GxB_TIMES_MINUS_INT32 , GxB_ANY_MINUS_INT32 , - GxB_MIN_MINUS_INT64 , GxB_MAX_MINUS_INT64 , GxB_PLUS_MINUS_INT64 , GxB_TIMES_MINUS_INT64 , GxB_ANY_MINUS_INT64 , - GxB_MIN_MINUS_UINT8 , GxB_MAX_MINUS_UINT8 , GxB_PLUS_MINUS_UINT8 , GxB_TIMES_MINUS_UINT8 , GxB_ANY_MINUS_UINT8 , - GxB_MIN_MINUS_UINT16 , GxB_MAX_MINUS_UINT16 , GxB_PLUS_MINUS_UINT16 , GxB_TIMES_MINUS_UINT16 , GxB_ANY_MINUS_UINT16 , - GxB_MIN_MINUS_UINT32 , GxB_MAX_MINUS_UINT32 , GxB_PLUS_MINUS_UINT32 , GxB_TIMES_MINUS_UINT32 , GxB_ANY_MINUS_UINT32 , - GxB_MIN_MINUS_UINT64 , GxB_MAX_MINUS_UINT64 , GxB_PLUS_MINUS_UINT64 , GxB_TIMES_MINUS_UINT64 , GxB_ANY_MINUS_UINT64 , - GxB_MIN_MINUS_FP32 , GxB_MAX_MINUS_FP32 , GxB_PLUS_MINUS_FP32 , GxB_TIMES_MINUS_FP32 , GxB_ANY_MINUS_FP32 , - GxB_MIN_MINUS_FP64 , GxB_MAX_MINUS_FP64 , GxB_PLUS_MINUS_FP64 , GxB_TIMES_MINUS_FP64 , GxB_ANY_MINUS_FP64 , +//------------------------------------------- +// matrix select using an IndexUnaryOp +//------------------------------------------- - // semirings with multiply op: z = TIMES (x,y), all types x,y,z the same: - GxB_MIN_TIMES_INT8 , GxB_MAX_TIMES_INT8 , GxB_PLUS_TIMES_INT8 , GxB_TIMES_TIMES_INT8 , GxB_ANY_TIMES_INT8 , - GxB_MIN_TIMES_INT16 , GxB_MAX_TIMES_INT16 , GxB_PLUS_TIMES_INT16 , GxB_TIMES_TIMES_INT16 , GxB_ANY_TIMES_INT16 , - GxB_MIN_TIMES_INT32 , GxB_MAX_TIMES_INT32 , GxB_PLUS_TIMES_INT32 , GxB_TIMES_TIMES_INT32 , GxB_ANY_TIMES_INT32 , - GxB_MIN_TIMES_INT64 , GxB_MAX_TIMES_INT64 , GxB_PLUS_TIMES_INT64 , GxB_TIMES_TIMES_INT64 , GxB_ANY_TIMES_INT64 , - GxB_MIN_TIMES_UINT8 , GxB_MAX_TIMES_UINT8 , GxB_PLUS_TIMES_UINT8 , GxB_TIMES_TIMES_UINT8 , GxB_ANY_TIMES_UINT8 , - GxB_MIN_TIMES_UINT16 , GxB_MAX_TIMES_UINT16 , GxB_PLUS_TIMES_UINT16 , GxB_TIMES_TIMES_UINT16 , GxB_ANY_TIMES_UINT16 , - GxB_MIN_TIMES_UINT32 , GxB_MAX_TIMES_UINT32 , GxB_PLUS_TIMES_UINT32 , GxB_TIMES_TIMES_UINT32 , GxB_ANY_TIMES_UINT32 , - GxB_MIN_TIMES_UINT64 , GxB_MAX_TIMES_UINT64 , GxB_PLUS_TIMES_UINT64 , GxB_TIMES_TIMES_UINT64 , GxB_ANY_TIMES_UINT64 , - GxB_MIN_TIMES_FP32 , GxB_MAX_TIMES_FP32 , GxB_PLUS_TIMES_FP32 , GxB_TIMES_TIMES_FP32 , GxB_ANY_TIMES_FP32 , - GxB_MIN_TIMES_FP64 , GxB_MAX_TIMES_FP64 , GxB_PLUS_TIMES_FP64 , GxB_TIMES_TIMES_FP64 , GxB_ANY_TIMES_FP64 , +GrB_Info GrB_Matrix_select_Scalar // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + const GrB_Scalar y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // semirings with multiply op: z = DIV (x,y), all types x,y,z the same: - GxB_MIN_DIV_INT8 , GxB_MAX_DIV_INT8 , GxB_PLUS_DIV_INT8 , GxB_TIMES_DIV_INT8 , GxB_ANY_DIV_INT8 , - GxB_MIN_DIV_INT16 , GxB_MAX_DIV_INT16 , GxB_PLUS_DIV_INT16 , GxB_TIMES_DIV_INT16 , GxB_ANY_DIV_INT16 , - GxB_MIN_DIV_INT32 , GxB_MAX_DIV_INT32 , GxB_PLUS_DIV_INT32 , GxB_TIMES_DIV_INT32 , GxB_ANY_DIV_INT32 , - GxB_MIN_DIV_INT64 , GxB_MAX_DIV_INT64 , GxB_PLUS_DIV_INT64 , GxB_TIMES_DIV_INT64 , GxB_ANY_DIV_INT64 , - GxB_MIN_DIV_UINT8 , GxB_MAX_DIV_UINT8 , GxB_PLUS_DIV_UINT8 , GxB_TIMES_DIV_UINT8 , GxB_ANY_DIV_UINT8 , - GxB_MIN_DIV_UINT16 , GxB_MAX_DIV_UINT16 , GxB_PLUS_DIV_UINT16 , GxB_TIMES_DIV_UINT16 , GxB_ANY_DIV_UINT16 , - GxB_MIN_DIV_UINT32 , GxB_MAX_DIV_UINT32 , GxB_PLUS_DIV_UINT32 , GxB_TIMES_DIV_UINT32 , GxB_ANY_DIV_UINT32 , - GxB_MIN_DIV_UINT64 , GxB_MAX_DIV_UINT64 , GxB_PLUS_DIV_UINT64 , GxB_TIMES_DIV_UINT64 , GxB_ANY_DIV_UINT64 , - GxB_MIN_DIV_FP32 , GxB_MAX_DIV_FP32 , GxB_PLUS_DIV_FP32 , GxB_TIMES_DIV_FP32 , GxB_ANY_DIV_FP32 , - GxB_MIN_DIV_FP64 , GxB_MAX_DIV_FP64 , GxB_PLUS_DIV_FP64 , GxB_TIMES_DIV_FP64 , GxB_ANY_DIV_FP64 , +GrB_Info GrB_Matrix_select_BOOL // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + bool y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // semirings with multiply op: z = RDIV (x,y), all types x,y,z the same: - GxB_MIN_RDIV_INT8 , GxB_MAX_RDIV_INT8 , GxB_PLUS_RDIV_INT8 , GxB_TIMES_RDIV_INT8 , GxB_ANY_RDIV_INT8 , - GxB_MIN_RDIV_INT16 , GxB_MAX_RDIV_INT16 , GxB_PLUS_RDIV_INT16 , GxB_TIMES_RDIV_INT16 , GxB_ANY_RDIV_INT16 , - GxB_MIN_RDIV_INT32 , GxB_MAX_RDIV_INT32 , GxB_PLUS_RDIV_INT32 , GxB_TIMES_RDIV_INT32 , GxB_ANY_RDIV_INT32 , - GxB_MIN_RDIV_INT64 , GxB_MAX_RDIV_INT64 , GxB_PLUS_RDIV_INT64 , GxB_TIMES_RDIV_INT64 , GxB_ANY_RDIV_INT64 , - GxB_MIN_RDIV_UINT8 , GxB_MAX_RDIV_UINT8 , GxB_PLUS_RDIV_UINT8 , GxB_TIMES_RDIV_UINT8 , GxB_ANY_RDIV_UINT8 , - GxB_MIN_RDIV_UINT16 , GxB_MAX_RDIV_UINT16 , GxB_PLUS_RDIV_UINT16 , GxB_TIMES_RDIV_UINT16 , GxB_ANY_RDIV_UINT16 , - GxB_MIN_RDIV_UINT32 , GxB_MAX_RDIV_UINT32 , GxB_PLUS_RDIV_UINT32 , GxB_TIMES_RDIV_UINT32 , GxB_ANY_RDIV_UINT32 , - GxB_MIN_RDIV_UINT64 , GxB_MAX_RDIV_UINT64 , GxB_PLUS_RDIV_UINT64 , GxB_TIMES_RDIV_UINT64 , GxB_ANY_RDIV_UINT64 , - GxB_MIN_RDIV_FP32 , GxB_MAX_RDIV_FP32 , GxB_PLUS_RDIV_FP32 , GxB_TIMES_RDIV_FP32 , GxB_ANY_RDIV_FP32 , - GxB_MIN_RDIV_FP64 , GxB_MAX_RDIV_FP64 , GxB_PLUS_RDIV_FP64 , GxB_TIMES_RDIV_FP64 , GxB_ANY_RDIV_FP64 , +GrB_Info GrB_Matrix_select_INT8 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + int8_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // semirings with multiply op: z = RMINUS (x,y), all types x,y,z the same: - GxB_MIN_RMINUS_INT8 , GxB_MAX_RMINUS_INT8 , GxB_PLUS_RMINUS_INT8 , GxB_TIMES_RMINUS_INT8 , GxB_ANY_RMINUS_INT8 , - GxB_MIN_RMINUS_INT16 , GxB_MAX_RMINUS_INT16 , GxB_PLUS_RMINUS_INT16 , GxB_TIMES_RMINUS_INT16 , GxB_ANY_RMINUS_INT16 , - GxB_MIN_RMINUS_INT32 , GxB_MAX_RMINUS_INT32 , GxB_PLUS_RMINUS_INT32 , GxB_TIMES_RMINUS_INT32 , GxB_ANY_RMINUS_INT32 , - GxB_MIN_RMINUS_INT64 , GxB_MAX_RMINUS_INT64 , GxB_PLUS_RMINUS_INT64 , GxB_TIMES_RMINUS_INT64 , GxB_ANY_RMINUS_INT64 , - GxB_MIN_RMINUS_UINT8 , GxB_MAX_RMINUS_UINT8 , GxB_PLUS_RMINUS_UINT8 , GxB_TIMES_RMINUS_UINT8 , GxB_ANY_RMINUS_UINT8 , - GxB_MIN_RMINUS_UINT16 , GxB_MAX_RMINUS_UINT16 , GxB_PLUS_RMINUS_UINT16 , GxB_TIMES_RMINUS_UINT16, GxB_ANY_RMINUS_UINT16 , - GxB_MIN_RMINUS_UINT32 , GxB_MAX_RMINUS_UINT32 , GxB_PLUS_RMINUS_UINT32 , GxB_TIMES_RMINUS_UINT32, GxB_ANY_RMINUS_UINT32 , - GxB_MIN_RMINUS_UINT64 , GxB_MAX_RMINUS_UINT64 , GxB_PLUS_RMINUS_UINT64 , GxB_TIMES_RMINUS_UINT64, GxB_ANY_RMINUS_UINT64 , - GxB_MIN_RMINUS_FP32 , GxB_MAX_RMINUS_FP32 , GxB_PLUS_RMINUS_FP32 , GxB_TIMES_RMINUS_FP32 , GxB_ANY_RMINUS_FP32 , - GxB_MIN_RMINUS_FP64 , GxB_MAX_RMINUS_FP64 , GxB_PLUS_RMINUS_FP64 , GxB_TIMES_RMINUS_FP64 , GxB_ANY_RMINUS_FP64 , +GrB_Info GrB_Matrix_select_INT16 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + int16_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // semirings with multiply op: z = ISEQ (x,y), all types x,y,z the same: - GxB_MIN_ISEQ_INT8 , GxB_MAX_ISEQ_INT8 , GxB_PLUS_ISEQ_INT8 , GxB_TIMES_ISEQ_INT8 , GxB_ANY_ISEQ_INT8 , - GxB_MIN_ISEQ_INT16 , GxB_MAX_ISEQ_INT16 , GxB_PLUS_ISEQ_INT16 , GxB_TIMES_ISEQ_INT16 , GxB_ANY_ISEQ_INT16 , - GxB_MIN_ISEQ_INT32 , GxB_MAX_ISEQ_INT32 , GxB_PLUS_ISEQ_INT32 , GxB_TIMES_ISEQ_INT32 , GxB_ANY_ISEQ_INT32 , - GxB_MIN_ISEQ_INT64 , GxB_MAX_ISEQ_INT64 , GxB_PLUS_ISEQ_INT64 , GxB_TIMES_ISEQ_INT64 , GxB_ANY_ISEQ_INT64 , - GxB_MIN_ISEQ_UINT8 , GxB_MAX_ISEQ_UINT8 , GxB_PLUS_ISEQ_UINT8 , GxB_TIMES_ISEQ_UINT8 , GxB_ANY_ISEQ_UINT8 , - GxB_MIN_ISEQ_UINT16 , GxB_MAX_ISEQ_UINT16 , GxB_PLUS_ISEQ_UINT16 , GxB_TIMES_ISEQ_UINT16 , GxB_ANY_ISEQ_UINT16 , - GxB_MIN_ISEQ_UINT32 , GxB_MAX_ISEQ_UINT32 , GxB_PLUS_ISEQ_UINT32 , GxB_TIMES_ISEQ_UINT32 , GxB_ANY_ISEQ_UINT32 , - GxB_MIN_ISEQ_UINT64 , GxB_MAX_ISEQ_UINT64 , GxB_PLUS_ISEQ_UINT64 , GxB_TIMES_ISEQ_UINT64 , GxB_ANY_ISEQ_UINT64 , - GxB_MIN_ISEQ_FP32 , GxB_MAX_ISEQ_FP32 , GxB_PLUS_ISEQ_FP32 , GxB_TIMES_ISEQ_FP32 , GxB_ANY_ISEQ_FP32 , - GxB_MIN_ISEQ_FP64 , GxB_MAX_ISEQ_FP64 , GxB_PLUS_ISEQ_FP64 , GxB_TIMES_ISEQ_FP64 , GxB_ANY_ISEQ_FP64 , +GrB_Info GrB_Matrix_select_INT32 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + int32_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // semirings with multiply op: z = ISNE (x,y), all types x,y,z the same: - GxB_MIN_ISNE_INT8 , GxB_MAX_ISNE_INT8 , GxB_PLUS_ISNE_INT8 , GxB_TIMES_ISNE_INT8 , GxB_ANY_ISNE_INT8 , - GxB_MIN_ISNE_INT16 , GxB_MAX_ISNE_INT16 , GxB_PLUS_ISNE_INT16 , GxB_TIMES_ISNE_INT16 , GxB_ANY_ISNE_INT16 , - GxB_MIN_ISNE_INT32 , GxB_MAX_ISNE_INT32 , GxB_PLUS_ISNE_INT32 , GxB_TIMES_ISNE_INT32 , GxB_ANY_ISNE_INT32 , - GxB_MIN_ISNE_INT64 , GxB_MAX_ISNE_INT64 , GxB_PLUS_ISNE_INT64 , GxB_TIMES_ISNE_INT64 , GxB_ANY_ISNE_INT64 , - GxB_MIN_ISNE_UINT8 , GxB_MAX_ISNE_UINT8 , GxB_PLUS_ISNE_UINT8 , GxB_TIMES_ISNE_UINT8 , GxB_ANY_ISNE_UINT8 , - GxB_MIN_ISNE_UINT16 , GxB_MAX_ISNE_UINT16 , GxB_PLUS_ISNE_UINT16 , GxB_TIMES_ISNE_UINT16 , GxB_ANY_ISNE_UINT16 , - GxB_MIN_ISNE_UINT32 , GxB_MAX_ISNE_UINT32 , GxB_PLUS_ISNE_UINT32 , GxB_TIMES_ISNE_UINT32 , GxB_ANY_ISNE_UINT32 , - GxB_MIN_ISNE_UINT64 , GxB_MAX_ISNE_UINT64 , GxB_PLUS_ISNE_UINT64 , GxB_TIMES_ISNE_UINT64 , GxB_ANY_ISNE_UINT64 , - GxB_MIN_ISNE_FP32 , GxB_MAX_ISNE_FP32 , GxB_PLUS_ISNE_FP32 , GxB_TIMES_ISNE_FP32 , GxB_ANY_ISNE_FP32 , - GxB_MIN_ISNE_FP64 , GxB_MAX_ISNE_FP64 , GxB_PLUS_ISNE_FP64 , GxB_TIMES_ISNE_FP64 , GxB_ANY_ISNE_FP64 , +GrB_Info GrB_Matrix_select_INT64 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + int64_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // semirings with multiply op: z = ISGT (x,y), all types x,y,z the same: - GxB_MIN_ISGT_INT8 , GxB_MAX_ISGT_INT8 , GxB_PLUS_ISGT_INT8 , GxB_TIMES_ISGT_INT8 , GxB_ANY_ISGT_INT8 , - GxB_MIN_ISGT_INT16 , GxB_MAX_ISGT_INT16 , GxB_PLUS_ISGT_INT16 , GxB_TIMES_ISGT_INT16 , GxB_ANY_ISGT_INT16 , - GxB_MIN_ISGT_INT32 , GxB_MAX_ISGT_INT32 , GxB_PLUS_ISGT_INT32 , GxB_TIMES_ISGT_INT32 , GxB_ANY_ISGT_INT32 , - GxB_MIN_ISGT_INT64 , GxB_MAX_ISGT_INT64 , GxB_PLUS_ISGT_INT64 , GxB_TIMES_ISGT_INT64 , GxB_ANY_ISGT_INT64 , - GxB_MIN_ISGT_UINT8 , GxB_MAX_ISGT_UINT8 , GxB_PLUS_ISGT_UINT8 , GxB_TIMES_ISGT_UINT8 , GxB_ANY_ISGT_UINT8 , - GxB_MIN_ISGT_UINT16 , GxB_MAX_ISGT_UINT16 , GxB_PLUS_ISGT_UINT16 , GxB_TIMES_ISGT_UINT16 , GxB_ANY_ISGT_UINT16 , - GxB_MIN_ISGT_UINT32 , GxB_MAX_ISGT_UINT32 , GxB_PLUS_ISGT_UINT32 , GxB_TIMES_ISGT_UINT32 , GxB_ANY_ISGT_UINT32 , - GxB_MIN_ISGT_UINT64 , GxB_MAX_ISGT_UINT64 , GxB_PLUS_ISGT_UINT64 , GxB_TIMES_ISGT_UINT64 , GxB_ANY_ISGT_UINT64 , - GxB_MIN_ISGT_FP32 , GxB_MAX_ISGT_FP32 , GxB_PLUS_ISGT_FP32 , GxB_TIMES_ISGT_FP32 , GxB_ANY_ISGT_FP32 , - GxB_MIN_ISGT_FP64 , GxB_MAX_ISGT_FP64 , GxB_PLUS_ISGT_FP64 , GxB_TIMES_ISGT_FP64 , GxB_ANY_ISGT_FP64 , +GrB_Info GrB_Matrix_select_UINT8 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + uint8_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // semirings with multiply op: z = ISLT (x,y), all types x,y,z the same: - GxB_MIN_ISLT_INT8 , GxB_MAX_ISLT_INT8 , GxB_PLUS_ISLT_INT8 , GxB_TIMES_ISLT_INT8 , GxB_ANY_ISLT_INT8 , - GxB_MIN_ISLT_INT16 , GxB_MAX_ISLT_INT16 , GxB_PLUS_ISLT_INT16 , GxB_TIMES_ISLT_INT16 , GxB_ANY_ISLT_INT16 , - GxB_MIN_ISLT_INT32 , GxB_MAX_ISLT_INT32 , GxB_PLUS_ISLT_INT32 , GxB_TIMES_ISLT_INT32 , GxB_ANY_ISLT_INT32 , - GxB_MIN_ISLT_INT64 , GxB_MAX_ISLT_INT64 , GxB_PLUS_ISLT_INT64 , GxB_TIMES_ISLT_INT64 , GxB_ANY_ISLT_INT64 , - GxB_MIN_ISLT_UINT8 , GxB_MAX_ISLT_UINT8 , GxB_PLUS_ISLT_UINT8 , GxB_TIMES_ISLT_UINT8 , GxB_ANY_ISLT_UINT8 , - GxB_MIN_ISLT_UINT16 , GxB_MAX_ISLT_UINT16 , GxB_PLUS_ISLT_UINT16 , GxB_TIMES_ISLT_UINT16 , GxB_ANY_ISLT_UINT16 , - GxB_MIN_ISLT_UINT32 , GxB_MAX_ISLT_UINT32 , GxB_PLUS_ISLT_UINT32 , GxB_TIMES_ISLT_UINT32 , GxB_ANY_ISLT_UINT32 , - GxB_MIN_ISLT_UINT64 , GxB_MAX_ISLT_UINT64 , GxB_PLUS_ISLT_UINT64 , GxB_TIMES_ISLT_UINT64 , GxB_ANY_ISLT_UINT64 , - GxB_MIN_ISLT_FP32 , GxB_MAX_ISLT_FP32 , GxB_PLUS_ISLT_FP32 , GxB_TIMES_ISLT_FP32 , GxB_ANY_ISLT_FP32 , - GxB_MIN_ISLT_FP64 , GxB_MAX_ISLT_FP64 , GxB_PLUS_ISLT_FP64 , GxB_TIMES_ISLT_FP64 , GxB_ANY_ISLT_FP64 , +GrB_Info GrB_Matrix_select_UINT16 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + uint16_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // semirings with multiply op: z = ISGE (x,y), all types x,y,z the same: - GxB_MIN_ISGE_INT8 , GxB_MAX_ISGE_INT8 , GxB_PLUS_ISGE_INT8 , GxB_TIMES_ISGE_INT8 , GxB_ANY_ISGE_INT8 , - GxB_MIN_ISGE_INT16 , GxB_MAX_ISGE_INT16 , GxB_PLUS_ISGE_INT16 , GxB_TIMES_ISGE_INT16 , GxB_ANY_ISGE_INT16 , - GxB_MIN_ISGE_INT32 , GxB_MAX_ISGE_INT32 , GxB_PLUS_ISGE_INT32 , GxB_TIMES_ISGE_INT32 , GxB_ANY_ISGE_INT32 , - GxB_MIN_ISGE_INT64 , GxB_MAX_ISGE_INT64 , GxB_PLUS_ISGE_INT64 , GxB_TIMES_ISGE_INT64 , GxB_ANY_ISGE_INT64 , - GxB_MIN_ISGE_UINT8 , GxB_MAX_ISGE_UINT8 , GxB_PLUS_ISGE_UINT8 , GxB_TIMES_ISGE_UINT8 , GxB_ANY_ISGE_UINT8 , - GxB_MIN_ISGE_UINT16 , GxB_MAX_ISGE_UINT16 , GxB_PLUS_ISGE_UINT16 , GxB_TIMES_ISGE_UINT16 , GxB_ANY_ISGE_UINT16 , - GxB_MIN_ISGE_UINT32 , GxB_MAX_ISGE_UINT32 , GxB_PLUS_ISGE_UINT32 , GxB_TIMES_ISGE_UINT32 , GxB_ANY_ISGE_UINT32 , - GxB_MIN_ISGE_UINT64 , GxB_MAX_ISGE_UINT64 , GxB_PLUS_ISGE_UINT64 , GxB_TIMES_ISGE_UINT64 , GxB_ANY_ISGE_UINT64 , - GxB_MIN_ISGE_FP32 , GxB_MAX_ISGE_FP32 , GxB_PLUS_ISGE_FP32 , GxB_TIMES_ISGE_FP32 , GxB_ANY_ISGE_FP32 , - GxB_MIN_ISGE_FP64 , GxB_MAX_ISGE_FP64 , GxB_PLUS_ISGE_FP64 , GxB_TIMES_ISGE_FP64 , GxB_ANY_ISGE_FP64 , +GrB_Info GrB_Matrix_select_UINT32 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + uint32_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // semirings with multiply op: z = ISLE (x,y), all types x,y,z the same: - GxB_MIN_ISLE_INT8 , GxB_MAX_ISLE_INT8 , GxB_PLUS_ISLE_INT8 , GxB_TIMES_ISLE_INT8 , GxB_ANY_ISLE_INT8 , - GxB_MIN_ISLE_INT16 , GxB_MAX_ISLE_INT16 , GxB_PLUS_ISLE_INT16 , GxB_TIMES_ISLE_INT16 , GxB_ANY_ISLE_INT16 , - GxB_MIN_ISLE_INT32 , GxB_MAX_ISLE_INT32 , GxB_PLUS_ISLE_INT32 , GxB_TIMES_ISLE_INT32 , GxB_ANY_ISLE_INT32 , - GxB_MIN_ISLE_INT64 , GxB_MAX_ISLE_INT64 , GxB_PLUS_ISLE_INT64 , GxB_TIMES_ISLE_INT64 , GxB_ANY_ISLE_INT64 , - GxB_MIN_ISLE_UINT8 , GxB_MAX_ISLE_UINT8 , GxB_PLUS_ISLE_UINT8 , GxB_TIMES_ISLE_UINT8 , GxB_ANY_ISLE_UINT8 , - GxB_MIN_ISLE_UINT16 , GxB_MAX_ISLE_UINT16 , GxB_PLUS_ISLE_UINT16 , GxB_TIMES_ISLE_UINT16 , GxB_ANY_ISLE_UINT16 , - GxB_MIN_ISLE_UINT32 , GxB_MAX_ISLE_UINT32 , GxB_PLUS_ISLE_UINT32 , GxB_TIMES_ISLE_UINT32 , GxB_ANY_ISLE_UINT32 , - GxB_MIN_ISLE_UINT64 , GxB_MAX_ISLE_UINT64 , GxB_PLUS_ISLE_UINT64 , GxB_TIMES_ISLE_UINT64 , GxB_ANY_ISLE_UINT64 , - GxB_MIN_ISLE_FP32 , GxB_MAX_ISLE_FP32 , GxB_PLUS_ISLE_FP32 , GxB_TIMES_ISLE_FP32 , GxB_ANY_ISLE_FP32 , - GxB_MIN_ISLE_FP64 , GxB_MAX_ISLE_FP64 , GxB_PLUS_ISLE_FP64 , GxB_TIMES_ISLE_FP64 , GxB_ANY_ISLE_FP64 , +GrB_Info GrB_Matrix_select_UINT64 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + uint64_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // semirings with multiply op: z = LOR (x,y), all types x,y,z the same: - GxB_MIN_LOR_INT8 , GxB_MAX_LOR_INT8 , GxB_PLUS_LOR_INT8 , GxB_TIMES_LOR_INT8 , GxB_ANY_LOR_INT8 , - GxB_MIN_LOR_INT16 , GxB_MAX_LOR_INT16 , GxB_PLUS_LOR_INT16 , GxB_TIMES_LOR_INT16 , GxB_ANY_LOR_INT16 , - GxB_MIN_LOR_INT32 , GxB_MAX_LOR_INT32 , GxB_PLUS_LOR_INT32 , GxB_TIMES_LOR_INT32 , GxB_ANY_LOR_INT32 , - GxB_MIN_LOR_INT64 , GxB_MAX_LOR_INT64 , GxB_PLUS_LOR_INT64 , GxB_TIMES_LOR_INT64 , GxB_ANY_LOR_INT64 , - GxB_MIN_LOR_UINT8 , GxB_MAX_LOR_UINT8 , GxB_PLUS_LOR_UINT8 , GxB_TIMES_LOR_UINT8 , GxB_ANY_LOR_UINT8 , - GxB_MIN_LOR_UINT16 , GxB_MAX_LOR_UINT16 , GxB_PLUS_LOR_UINT16 , GxB_TIMES_LOR_UINT16 , GxB_ANY_LOR_UINT16 , - GxB_MIN_LOR_UINT32 , GxB_MAX_LOR_UINT32 , GxB_PLUS_LOR_UINT32 , GxB_TIMES_LOR_UINT32 , GxB_ANY_LOR_UINT32 , - GxB_MIN_LOR_UINT64 , GxB_MAX_LOR_UINT64 , GxB_PLUS_LOR_UINT64 , GxB_TIMES_LOR_UINT64 , GxB_ANY_LOR_UINT64 , - GxB_MIN_LOR_FP32 , GxB_MAX_LOR_FP32 , GxB_PLUS_LOR_FP32 , GxB_TIMES_LOR_FP32 , GxB_ANY_LOR_FP32 , - GxB_MIN_LOR_FP64 , GxB_MAX_LOR_FP64 , GxB_PLUS_LOR_FP64 , GxB_TIMES_LOR_FP64 , GxB_ANY_LOR_FP64 , +GrB_Info GrB_Matrix_select_FP32 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + float y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // semirings with multiply op: z = LAND (x,y), all types x,y,z the same: - GxB_MIN_LAND_INT8 , GxB_MAX_LAND_INT8 , GxB_PLUS_LAND_INT8 , GxB_TIMES_LAND_INT8 , GxB_ANY_LAND_INT8 , - GxB_MIN_LAND_INT16 , GxB_MAX_LAND_INT16 , GxB_PLUS_LAND_INT16 , GxB_TIMES_LAND_INT16 , GxB_ANY_LAND_INT16 , - GxB_MIN_LAND_INT32 , GxB_MAX_LAND_INT32 , GxB_PLUS_LAND_INT32 , GxB_TIMES_LAND_INT32 , GxB_ANY_LAND_INT32 , - GxB_MIN_LAND_INT64 , GxB_MAX_LAND_INT64 , GxB_PLUS_LAND_INT64 , GxB_TIMES_LAND_INT64 , GxB_ANY_LAND_INT64 , - GxB_MIN_LAND_UINT8 , GxB_MAX_LAND_UINT8 , GxB_PLUS_LAND_UINT8 , GxB_TIMES_LAND_UINT8 , GxB_ANY_LAND_UINT8 , - GxB_MIN_LAND_UINT16 , GxB_MAX_LAND_UINT16 , GxB_PLUS_LAND_UINT16 , GxB_TIMES_LAND_UINT16 , GxB_ANY_LAND_UINT16 , - GxB_MIN_LAND_UINT32 , GxB_MAX_LAND_UINT32 , GxB_PLUS_LAND_UINT32 , GxB_TIMES_LAND_UINT32 , GxB_ANY_LAND_UINT32 , - GxB_MIN_LAND_UINT64 , GxB_MAX_LAND_UINT64 , GxB_PLUS_LAND_UINT64 , GxB_TIMES_LAND_UINT64 , GxB_ANY_LAND_UINT64 , - GxB_MIN_LAND_FP32 , GxB_MAX_LAND_FP32 , GxB_PLUS_LAND_FP32 , GxB_TIMES_LAND_FP32 , GxB_ANY_LAND_FP32 , - GxB_MIN_LAND_FP64 , GxB_MAX_LAND_FP64 , GxB_PLUS_LAND_FP64 , GxB_TIMES_LAND_FP64 , GxB_ANY_LAND_FP64 , +GrB_Info GrB_Matrix_select_FP64 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + double y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // semirings with multiply op: z = LXOR (x,y), all types x,y,z the same: - GxB_MIN_LXOR_INT8 , GxB_MAX_LXOR_INT8 , GxB_PLUS_LXOR_INT8 , GxB_TIMES_LXOR_INT8 , GxB_ANY_LXOR_INT8 , - GxB_MIN_LXOR_INT16 , GxB_MAX_LXOR_INT16 , GxB_PLUS_LXOR_INT16 , GxB_TIMES_LXOR_INT16 , GxB_ANY_LXOR_INT16 , - GxB_MIN_LXOR_INT32 , GxB_MAX_LXOR_INT32 , GxB_PLUS_LXOR_INT32 , GxB_TIMES_LXOR_INT32 , GxB_ANY_LXOR_INT32 , - GxB_MIN_LXOR_INT64 , GxB_MAX_LXOR_INT64 , GxB_PLUS_LXOR_INT64 , GxB_TIMES_LXOR_INT64 , GxB_ANY_LXOR_INT64 , - GxB_MIN_LXOR_UINT8 , GxB_MAX_LXOR_UINT8 , GxB_PLUS_LXOR_UINT8 , GxB_TIMES_LXOR_UINT8 , GxB_ANY_LXOR_UINT8 , - GxB_MIN_LXOR_UINT16 , GxB_MAX_LXOR_UINT16 , GxB_PLUS_LXOR_UINT16 , GxB_TIMES_LXOR_UINT16 , GxB_ANY_LXOR_UINT16 , - GxB_MIN_LXOR_UINT32 , GxB_MAX_LXOR_UINT32 , GxB_PLUS_LXOR_UINT32 , GxB_TIMES_LXOR_UINT32 , GxB_ANY_LXOR_UINT32 , - GxB_MIN_LXOR_UINT64 , GxB_MAX_LXOR_UINT64 , GxB_PLUS_LXOR_UINT64 , GxB_TIMES_LXOR_UINT64 , GxB_ANY_LXOR_UINT64 , - GxB_MIN_LXOR_FP32 , GxB_MAX_LXOR_FP32 , GxB_PLUS_LXOR_FP32 , GxB_TIMES_LXOR_FP32 , GxB_ANY_LXOR_FP32 , - GxB_MIN_LXOR_FP64 , GxB_MAX_LXOR_FP64 , GxB_PLUS_LXOR_FP64 , GxB_TIMES_LXOR_FP64 , GxB_ANY_LXOR_FP64 , +GrB_Info GxB_Matrix_select_FC32 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + GxB_FC32_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; -//------------------------------------------------------------------------------ -// 300 semirings with a comparator TxT -> bool, where T is non-Boolean -//------------------------------------------------------------------------------ +GrB_Info GxB_Matrix_select_FC64 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + GxB_FC64_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // In the 4th column the GxB_EQ_*_* semirings could also be called - // GxB_LXNOR_*_*, since the EQ and LXNOR boolean operators are identical - // but those names are not included. +GrB_Info GrB_Matrix_select_UDT // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + const void *y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // semirings with multiply op: z = EQ (x,y), where z is boolean and x,y are given by the suffix: - GxB_LOR_EQ_INT8 , GxB_LAND_EQ_INT8 , GxB_LXOR_EQ_INT8 , GxB_EQ_EQ_INT8 , GxB_ANY_EQ_INT8 , - GxB_LOR_EQ_INT16 , GxB_LAND_EQ_INT16 , GxB_LXOR_EQ_INT16 , GxB_EQ_EQ_INT16 , GxB_ANY_EQ_INT16 , - GxB_LOR_EQ_INT32 , GxB_LAND_EQ_INT32 , GxB_LXOR_EQ_INT32 , GxB_EQ_EQ_INT32 , GxB_ANY_EQ_INT32 , - GxB_LOR_EQ_INT64 , GxB_LAND_EQ_INT64 , GxB_LXOR_EQ_INT64 , GxB_EQ_EQ_INT64 , GxB_ANY_EQ_INT64 , - GxB_LOR_EQ_UINT8 , GxB_LAND_EQ_UINT8 , GxB_LXOR_EQ_UINT8 , GxB_EQ_EQ_UINT8 , GxB_ANY_EQ_UINT8 , - GxB_LOR_EQ_UINT16 , GxB_LAND_EQ_UINT16 , GxB_LXOR_EQ_UINT16 , GxB_EQ_EQ_UINT16 , GxB_ANY_EQ_UINT16 , - GxB_LOR_EQ_UINT32 , GxB_LAND_EQ_UINT32 , GxB_LXOR_EQ_UINT32 , GxB_EQ_EQ_UINT32 , GxB_ANY_EQ_UINT32 , - GxB_LOR_EQ_UINT64 , GxB_LAND_EQ_UINT64 , GxB_LXOR_EQ_UINT64 , GxB_EQ_EQ_UINT64 , GxB_ANY_EQ_UINT64 , - GxB_LOR_EQ_FP32 , GxB_LAND_EQ_FP32 , GxB_LXOR_EQ_FP32 , GxB_EQ_EQ_FP32 , GxB_ANY_EQ_FP32 , - GxB_LOR_EQ_FP64 , GxB_LAND_EQ_FP64 , GxB_LXOR_EQ_FP64 , GxB_EQ_EQ_FP64 , GxB_ANY_EQ_FP64 , +// GrB_select is a generic method that applies an IndexUnaryOp to +// a matrix or vector, using any type of the scalar y. - // semirings with multiply op: z = NE (x,y), where z is boolean and x,y are given by the suffix: - GxB_LOR_NE_INT8 , GxB_LAND_NE_INT8 , GxB_LXOR_NE_INT8 , GxB_EQ_NE_INT8 , GxB_ANY_NE_INT8 , - GxB_LOR_NE_INT16 , GxB_LAND_NE_INT16 , GxB_LXOR_NE_INT16 , GxB_EQ_NE_INT16 , GxB_ANY_NE_INT16 , - GxB_LOR_NE_INT32 , GxB_LAND_NE_INT32 , GxB_LXOR_NE_INT32 , GxB_EQ_NE_INT32 , GxB_ANY_NE_INT32 , - GxB_LOR_NE_INT64 , GxB_LAND_NE_INT64 , GxB_LXOR_NE_INT64 , GxB_EQ_NE_INT64 , GxB_ANY_NE_INT64 , - GxB_LOR_NE_UINT8 , GxB_LAND_NE_UINT8 , GxB_LXOR_NE_UINT8 , GxB_EQ_NE_UINT8 , GxB_ANY_NE_UINT8 , - GxB_LOR_NE_UINT16 , GxB_LAND_NE_UINT16 , GxB_LXOR_NE_UINT16 , GxB_EQ_NE_UINT16 , GxB_ANY_NE_UINT16 , - GxB_LOR_NE_UINT32 , GxB_LAND_NE_UINT32 , GxB_LXOR_NE_UINT32 , GxB_EQ_NE_UINT32 , GxB_ANY_NE_UINT32 , - GxB_LOR_NE_UINT64 , GxB_LAND_NE_UINT64 , GxB_LXOR_NE_UINT64 , GxB_EQ_NE_UINT64 , GxB_ANY_NE_UINT64 , - GxB_LOR_NE_FP32 , GxB_LAND_NE_FP32 , GxB_LXOR_NE_FP32 , GxB_EQ_NE_FP32 , GxB_ANY_NE_FP32 , - GxB_LOR_NE_FP64 , GxB_LAND_NE_FP64 , GxB_LXOR_NE_FP64 , GxB_EQ_NE_FP64 , GxB_ANY_NE_FP64 , +// GrB_Vector_select_TYPE (w,m,acc,idxop,u,y,d) +// GrB_Matrix_select_TYPE (C,M,acc,idxop,A,y,d) - // semirings with multiply op: z = GT (x,y), where z is boolean and x,y are given by the suffix: - GxB_LOR_GT_INT8 , GxB_LAND_GT_INT8 , GxB_LXOR_GT_INT8 , GxB_EQ_GT_INT8 , GxB_ANY_GT_INT8 , - GxB_LOR_GT_INT16 , GxB_LAND_GT_INT16 , GxB_LXOR_GT_INT16 , GxB_EQ_GT_INT16 , GxB_ANY_GT_INT16 , - GxB_LOR_GT_INT32 , GxB_LAND_GT_INT32 , GxB_LXOR_GT_INT32 , GxB_EQ_GT_INT32 , GxB_ANY_GT_INT32 , - GxB_LOR_GT_INT64 , GxB_LAND_GT_INT64 , GxB_LXOR_GT_INT64 , GxB_EQ_GT_INT64 , GxB_ANY_GT_INT64 , - GxB_LOR_GT_UINT8 , GxB_LAND_GT_UINT8 , GxB_LXOR_GT_UINT8 , GxB_EQ_GT_UINT8 , GxB_ANY_GT_UINT8 , - GxB_LOR_GT_UINT16 , GxB_LAND_GT_UINT16 , GxB_LXOR_GT_UINT16 , GxB_EQ_GT_UINT16 , GxB_ANY_GT_UINT16 , - GxB_LOR_GT_UINT32 , GxB_LAND_GT_UINT32 , GxB_LXOR_GT_UINT32 , GxB_EQ_GT_UINT32 , GxB_ANY_GT_UINT32 , - GxB_LOR_GT_UINT64 , GxB_LAND_GT_UINT64 , GxB_LXOR_GT_UINT64 , GxB_EQ_GT_UINT64 , GxB_ANY_GT_UINT64 , - GxB_LOR_GT_FP32 , GxB_LAND_GT_FP32 , GxB_LXOR_GT_FP32 , GxB_EQ_GT_FP32 , GxB_ANY_GT_FP32 , - GxB_LOR_GT_FP64 , GxB_LAND_GT_FP64 , GxB_LXOR_GT_FP64 , GxB_EQ_GT_FP64 , GxB_ANY_GT_FP64 , +#if GxB_STDC_VERSION >= 201112L +#define GrB_select(C,Mask,accum,op,x,y,d) \ + _Generic \ + ( \ + (C), \ + GrB_Vector : \ + _Generic \ + ( \ + (y), \ + GB_CASES (GrB, Vector_select), \ + default: GrB_Vector_select_Scalar \ + ), \ + GrB_Matrix : \ + _Generic \ + ( \ + (y), \ + GB_CASES (GrB, Matrix_select), \ + default: GrB_Matrix_select_Scalar \ + ) \ + ) \ + (C, Mask, accum, op, x, y, d) +#endif - // semirings with multiply op: z = LT (x,y), where z is boolean and x,y are given by the suffix: - GxB_LOR_LT_INT8 , GxB_LAND_LT_INT8 , GxB_LXOR_LT_INT8 , GxB_EQ_LT_INT8 , GxB_ANY_LT_INT8 , - GxB_LOR_LT_INT16 , GxB_LAND_LT_INT16 , GxB_LXOR_LT_INT16 , GxB_EQ_LT_INT16 , GxB_ANY_LT_INT16 , - GxB_LOR_LT_INT32 , GxB_LAND_LT_INT32 , GxB_LXOR_LT_INT32 , GxB_EQ_LT_INT32 , GxB_ANY_LT_INT32 , - GxB_LOR_LT_INT64 , GxB_LAND_LT_INT64 , GxB_LXOR_LT_INT64 , GxB_EQ_LT_INT64 , GxB_ANY_LT_INT64 , - GxB_LOR_LT_UINT8 , GxB_LAND_LT_UINT8 , GxB_LXOR_LT_UINT8 , GxB_EQ_LT_UINT8 , GxB_ANY_LT_UINT8 , - GxB_LOR_LT_UINT16 , GxB_LAND_LT_UINT16 , GxB_LXOR_LT_UINT16 , GxB_EQ_LT_UINT16 , GxB_ANY_LT_UINT16 , - GxB_LOR_LT_UINT32 , GxB_LAND_LT_UINT32 , GxB_LXOR_LT_UINT32 , GxB_EQ_LT_UINT32 , GxB_ANY_LT_UINT32 , - GxB_LOR_LT_UINT64 , GxB_LAND_LT_UINT64 , GxB_LXOR_LT_UINT64 , GxB_EQ_LT_UINT64 , GxB_ANY_LT_UINT64 , - GxB_LOR_LT_FP32 , GxB_LAND_LT_FP32 , GxB_LXOR_LT_FP32 , GxB_EQ_LT_FP32 , GxB_ANY_LT_FP32 , - GxB_LOR_LT_FP64 , GxB_LAND_LT_FP64 , GxB_LXOR_LT_FP64 , GxB_EQ_LT_FP64 , GxB_ANY_LT_FP64 , +//============================================================================== +// GxB_select: matrix and vector selection (DEPRECATED: use GrB_select instead) +//============================================================================== - // semirings with multiply op: z = GE (x,y), where z is boolean and x,y are given by the suffix: - GxB_LOR_GE_INT8 , GxB_LAND_GE_INT8 , GxB_LXOR_GE_INT8 , GxB_EQ_GE_INT8 , GxB_ANY_GE_INT8 , - GxB_LOR_GE_INT16 , GxB_LAND_GE_INT16 , GxB_LXOR_GE_INT16 , GxB_EQ_GE_INT16 , GxB_ANY_GE_INT16 , - GxB_LOR_GE_INT32 , GxB_LAND_GE_INT32 , GxB_LXOR_GE_INT32 , GxB_EQ_GE_INT32 , GxB_ANY_GE_INT32 , - GxB_LOR_GE_INT64 , GxB_LAND_GE_INT64 , GxB_LXOR_GE_INT64 , GxB_EQ_GE_INT64 , GxB_ANY_GE_INT64 , - GxB_LOR_GE_UINT8 , GxB_LAND_GE_UINT8 , GxB_LXOR_GE_UINT8 , GxB_EQ_GE_UINT8 , GxB_ANY_GE_UINT8 , - GxB_LOR_GE_UINT16 , GxB_LAND_GE_UINT16 , GxB_LXOR_GE_UINT16 , GxB_EQ_GE_UINT16 , GxB_ANY_GE_UINT16 , - GxB_LOR_GE_UINT32 , GxB_LAND_GE_UINT32 , GxB_LXOR_GE_UINT32 , GxB_EQ_GE_UINT32 , GxB_ANY_GE_UINT32 , - GxB_LOR_GE_UINT64 , GxB_LAND_GE_UINT64 , GxB_LXOR_GE_UINT64 , GxB_EQ_GE_UINT64 , GxB_ANY_GE_UINT64 , - GxB_LOR_GE_FP32 , GxB_LAND_GE_FP32 , GxB_LXOR_GE_FP32 , GxB_EQ_GE_FP32 , GxB_ANY_GE_FP32 , - GxB_LOR_GE_FP64 , GxB_LAND_GE_FP64 , GxB_LXOR_GE_FP64 , GxB_EQ_GE_FP64 , GxB_ANY_GE_FP64 , +GrB_Info GxB_Vector_select (GrB_Vector w, const GrB_Vector mask, + const GrB_BinaryOp accum, const GxB_SelectOp op, const GrB_Vector u, + const GrB_Scalar Thunk, const GrB_Descriptor desc) ; +GrB_Info GxB_Matrix_select (GrB_Matrix C, const GrB_Matrix Mask, + const GrB_BinaryOp accum, const GxB_SelectOp op, const GrB_Matrix A, + const GrB_Scalar Thunk, const GrB_Descriptor desc) ; +#if GxB_STDC_VERSION >= 201112L +#define GxB_select(C,Mask,accum,op,A,Thunk,desc) _Generic \ +((C), GrB_Vector:GxB_Vector_select , GrB_Matrix:GxB_Matrix_select ) \ +(C, Mask, accum, op, A, Thunk, desc) +#endif - // semirings with multiply op: z = LE (x,y), where z is boolean and x,y are given by the suffix: - GxB_LOR_LE_INT8 , GxB_LAND_LE_INT8 , GxB_LXOR_LE_INT8 , GxB_EQ_LE_INT8 , GxB_ANY_LE_INT8 , - GxB_LOR_LE_INT16 , GxB_LAND_LE_INT16 , GxB_LXOR_LE_INT16 , GxB_EQ_LE_INT16 , GxB_ANY_LE_INT16 , - GxB_LOR_LE_INT32 , GxB_LAND_LE_INT32 , GxB_LXOR_LE_INT32 , GxB_EQ_LE_INT32 , GxB_ANY_LE_INT32 , - GxB_LOR_LE_INT64 , GxB_LAND_LE_INT64 , GxB_LXOR_LE_INT64 , GxB_EQ_LE_INT64 , GxB_ANY_LE_INT64 , - GxB_LOR_LE_UINT8 , GxB_LAND_LE_UINT8 , GxB_LXOR_LE_UINT8 , GxB_EQ_LE_UINT8 , GxB_ANY_LE_UINT8 , - GxB_LOR_LE_UINT16 , GxB_LAND_LE_UINT16 , GxB_LXOR_LE_UINT16 , GxB_EQ_LE_UINT16 , GxB_ANY_LE_UINT16 , - GxB_LOR_LE_UINT32 , GxB_LAND_LE_UINT32 , GxB_LXOR_LE_UINT32 , GxB_EQ_LE_UINT32 , GxB_ANY_LE_UINT32 , - GxB_LOR_LE_UINT64 , GxB_LAND_LE_UINT64 , GxB_LXOR_LE_UINT64 , GxB_EQ_LE_UINT64 , GxB_ANY_LE_UINT64 , - GxB_LOR_LE_FP32 , GxB_LAND_LE_FP32 , GxB_LXOR_LE_FP32 , GxB_EQ_LE_FP32 , GxB_ANY_LE_FP32 , - GxB_LOR_LE_FP64 , GxB_LAND_LE_FP64 , GxB_LXOR_LE_FP64 , GxB_EQ_LE_FP64 , GxB_ANY_LE_FP64 , +//============================================================================== +// GrB_reduce: matrix and vector reduction +//============================================================================== -//------------------------------------------------------------------------------ -// 55 semirings with purely Boolean types, bool x bool -> bool -//------------------------------------------------------------------------------ +// Reduce the entries in a matrix to a vector, a column vector t such that +// t(i) = sum (A (i,:)), and where "sum" is a commutative and associative +// monoid with an identity value. A can be transposed, which reduces down the +// columns instead of the rows. - // Note that lor_pair, land_pair, and eq_pair are all identical to any_pair. - // These 3 are marked below. GxB_EQ_*_BOOL could be called - // GxB_LXNOR_*_BOOL, and GxB_*_EQ_BOOL could be called GxB_*_LXNOR_BOOL, - // but those names are not included. +// For GrB_Matrix_reduce_BinaryOp, the GrB_BinaryOp op must correspond to a +// known built-in monoid: +// +// operator data-types (all built-in) +// ---------------------- --------------------------- +// MIN, MAX INT*, UINT*, FP* +// TIMES, PLUS INT*, UINT*, FP*, FC* +// ANY INT*, UINT*, FP*, FC*, BOOL +// LOR, LAND, LXOR, EQ BOOL +// BOR, BAND, BXOR, BXNOR UINT* - // purely boolean semirings in the form GxB_(add monoid)_(multiply operator)_BOOL: - GxB_LOR_FIRST_BOOL , GxB_LAND_FIRST_BOOL , GxB_LXOR_FIRST_BOOL , GxB_EQ_FIRST_BOOL , GxB_ANY_FIRST_BOOL , - GxB_LOR_SECOND_BOOL , GxB_LAND_SECOND_BOOL , GxB_LXOR_SECOND_BOOL , GxB_EQ_SECOND_BOOL , GxB_ANY_SECOND_BOOL , - GxB_LOR_PAIR_BOOL/**/ , GxB_LAND_PAIR_BOOL/**/ , GxB_LXOR_PAIR_BOOL , GxB_EQ_PAIR_BOOL/**/ , GxB_ANY_PAIR_BOOL , - GxB_LOR_LOR_BOOL , GxB_LAND_LOR_BOOL , GxB_LXOR_LOR_BOOL , GxB_EQ_LOR_BOOL , GxB_ANY_LOR_BOOL , - GxB_LOR_LAND_BOOL , GxB_LAND_LAND_BOOL , GxB_LXOR_LAND_BOOL , GxB_EQ_LAND_BOOL , GxB_ANY_LAND_BOOL , - GxB_LOR_LXOR_BOOL , GxB_LAND_LXOR_BOOL , GxB_LXOR_LXOR_BOOL , GxB_EQ_LXOR_BOOL , GxB_ANY_LXOR_BOOL , - GxB_LOR_EQ_BOOL , GxB_LAND_EQ_BOOL , GxB_LXOR_EQ_BOOL , GxB_EQ_EQ_BOOL , GxB_ANY_EQ_BOOL , - GxB_LOR_GT_BOOL , GxB_LAND_GT_BOOL , GxB_LXOR_GT_BOOL , GxB_EQ_GT_BOOL , GxB_ANY_GT_BOOL , - GxB_LOR_LT_BOOL , GxB_LAND_LT_BOOL , GxB_LXOR_LT_BOOL , GxB_EQ_LT_BOOL , GxB_ANY_LT_BOOL , - GxB_LOR_GE_BOOL , GxB_LAND_GE_BOOL , GxB_LXOR_GE_BOOL , GxB_EQ_GE_BOOL , GxB_ANY_GE_BOOL , - GxB_LOR_LE_BOOL , GxB_LAND_LE_BOOL , GxB_LXOR_LE_BOOL , GxB_EQ_LE_BOOL , GxB_ANY_LE_BOOL , +GrB_Info GrB_Matrix_reduce_Monoid // w = accum (w,reduce(A)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_Monoid monoid, // reduce operator for t=reduce(A) + const GrB_Matrix A, // first input: matrix A + const GrB_Descriptor desc // descriptor for w, mask, and A +) ; + +GrB_Info GrB_Matrix_reduce_BinaryOp // w = accum (w,reduce(A)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // reduce operator for t=reduce(A) + const GrB_Matrix A, // first input: matrix A + const GrB_Descriptor desc // descriptor for w, mask, and A +) ; //------------------------------------------------------------------------------ -// 54 complex semirings +// reduce a vector to a scalar //------------------------------------------------------------------------------ - // 3 monoids (plus, times, any), 2 types (FC32 and FC64), and 9 - // multiplicative operators. +// Reduce entries in a vector to a scalar, c = accum (c, reduce_to_scalar(u)) - // Note that times_pair is identical to any_pair. - // These 2 are marked below. +GrB_Info GrB_Vector_reduce_BOOL // c = accum (c, reduce_to_scalar (u)) +( + bool *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - GxB_PLUS_FIRST_FC32 , GxB_TIMES_FIRST_FC32 , GxB_ANY_FIRST_FC32 , - GxB_PLUS_FIRST_FC64 , GxB_TIMES_FIRST_FC64 , GxB_ANY_FIRST_FC64 , +GrB_Info GrB_Vector_reduce_INT8 // c = accum (c, reduce_to_scalar (u)) +( + int8_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - GxB_PLUS_SECOND_FC32 , GxB_TIMES_SECOND_FC32 , GxB_ANY_SECOND_FC32 , - GxB_PLUS_SECOND_FC64 , GxB_TIMES_SECOND_FC64 , GxB_ANY_SECOND_FC64 , +GrB_Info GrB_Vector_reduce_UINT8 // c = accum (c, reduce_to_scalar (u)) +( + uint8_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - GxB_PLUS_PAIR_FC32 , GxB_TIMES_PAIR_FC32/**/, GxB_ANY_PAIR_FC32 , - GxB_PLUS_PAIR_FC64 , GxB_TIMES_PAIR_FC64/**/, GxB_ANY_PAIR_FC64 , +GrB_Info GrB_Vector_reduce_INT16 // c = accum (c, reduce_to_scalar (u)) +( + int16_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - GxB_PLUS_PLUS_FC32 , GxB_TIMES_PLUS_FC32 , GxB_ANY_PLUS_FC32 , - GxB_PLUS_PLUS_FC64 , GxB_TIMES_PLUS_FC64 , GxB_ANY_PLUS_FC64 , +GrB_Info GrB_Vector_reduce_UINT16 // c = accum (c, reduce_to_scalar (u)) +( + uint16_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - GxB_PLUS_MINUS_FC32 , GxB_TIMES_MINUS_FC32 , GxB_ANY_MINUS_FC32 , - GxB_PLUS_MINUS_FC64 , GxB_TIMES_MINUS_FC64 , GxB_ANY_MINUS_FC64 , +GrB_Info GrB_Vector_reduce_INT32 // c = accum (c, reduce_to_scalar (u)) +( + int32_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - GxB_PLUS_TIMES_FC32 , GxB_TIMES_TIMES_FC32 , GxB_ANY_TIMES_FC32 , - GxB_PLUS_TIMES_FC64 , GxB_TIMES_TIMES_FC64 , GxB_ANY_TIMES_FC64 , +GrB_Info GrB_Vector_reduce_UINT32 // c = accum (c, reduce_to_scalar (u)) +( + uint32_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - GxB_PLUS_DIV_FC32 , GxB_TIMES_DIV_FC32 , GxB_ANY_DIV_FC32 , - GxB_PLUS_DIV_FC64 , GxB_TIMES_DIV_FC64 , GxB_ANY_DIV_FC64 , +GrB_Info GrB_Vector_reduce_INT64 // c = accum (c, reduce_to_scalar (u)) +( + int64_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - GxB_PLUS_RDIV_FC32 , GxB_TIMES_RDIV_FC32 , GxB_ANY_RDIV_FC32 , - GxB_PLUS_RDIV_FC64 , GxB_TIMES_RDIV_FC64 , GxB_ANY_RDIV_FC64 , +GrB_Info GrB_Vector_reduce_UINT64 // c = accum (c, reduce_to_scalar (u)) +( + uint64_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - GxB_PLUS_RMINUS_FC32 , GxB_TIMES_RMINUS_FC32 , GxB_ANY_RMINUS_FC32 , - GxB_PLUS_RMINUS_FC64 , GxB_TIMES_RMINUS_FC64 , GxB_ANY_RMINUS_FC64 , +GrB_Info GrB_Vector_reduce_FP32 // c = accum (c, reduce_to_scalar (u)) +( + float *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; -//------------------------------------------------------------------------------ -// 64 bitwise semirings -//------------------------------------------------------------------------------ +GrB_Info GrB_Vector_reduce_FP64 // c = accum (c, reduce_to_scalar (u)) +( + double *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - // monoids: (BOR, BAND, BXOR, BXNOR) x - // mult: (BOR, BAND, BXOR, BXNOR) x - // types: (UINT8, UINT16, UINT32, UINT64) +GrB_Info GxB_Vector_reduce_FC32 // c = accum (c, reduce_to_scalar (u)) +( + GxB_FC32_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - GxB_BOR_BOR_UINT8 , GxB_BOR_BOR_UINT16 , GxB_BOR_BOR_UINT32 , GxB_BOR_BOR_UINT64 , - GxB_BOR_BAND_UINT8 , GxB_BOR_BAND_UINT16 , GxB_BOR_BAND_UINT32 , GxB_BOR_BAND_UINT64 , - GxB_BOR_BXOR_UINT8 , GxB_BOR_BXOR_UINT16 , GxB_BOR_BXOR_UINT32 , GxB_BOR_BXOR_UINT64 , - GxB_BOR_BXNOR_UINT8 , GxB_BOR_BXNOR_UINT16 , GxB_BOR_BXNOR_UINT32 , GxB_BOR_BXNOR_UINT64 , +GrB_Info GxB_Vector_reduce_FC64 // c = accum (c, reduce_to_scalar (u)) +( + GxB_FC64_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - GxB_BAND_BOR_UINT8 , GxB_BAND_BOR_UINT16 , GxB_BAND_BOR_UINT32 , GxB_BAND_BOR_UINT64 , - GxB_BAND_BAND_UINT8 , GxB_BAND_BAND_UINT16 , GxB_BAND_BAND_UINT32 , GxB_BAND_BAND_UINT64 , - GxB_BAND_BXOR_UINT8 , GxB_BAND_BXOR_UINT16 , GxB_BAND_BXOR_UINT32 , GxB_BAND_BXOR_UINT64 , - GxB_BAND_BXNOR_UINT8 , GxB_BAND_BXNOR_UINT16 , GxB_BAND_BXNOR_UINT32 , GxB_BAND_BXNOR_UINT64 , +GrB_Info GrB_Vector_reduce_UDT // c = accum (c, reduce_to_scalar (u)) +( + void *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - GxB_BXOR_BOR_UINT8 , GxB_BXOR_BOR_UINT16 , GxB_BXOR_BOR_UINT32 , GxB_BXOR_BOR_UINT64 , - GxB_BXOR_BAND_UINT8 , GxB_BXOR_BAND_UINT16 , GxB_BXOR_BAND_UINT32 , GxB_BXOR_BAND_UINT64 , - GxB_BXOR_BXOR_UINT8 , GxB_BXOR_BXOR_UINT16 , GxB_BXOR_BXOR_UINT32 , GxB_BXOR_BXOR_UINT64 , - GxB_BXOR_BXNOR_UINT8 , GxB_BXOR_BXNOR_UINT16 , GxB_BXOR_BXNOR_UINT32 , GxB_BXOR_BXNOR_UINT64 , +GrB_Info GrB_Vector_reduce_Monoid_Scalar // c = accum(c,reduce_to_scalar(u)) +( + GrB_Scalar c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - GxB_BXNOR_BOR_UINT8 , GxB_BXNOR_BOR_UINT16 , GxB_BXNOR_BOR_UINT32 , GxB_BXNOR_BOR_UINT64 , - GxB_BXNOR_BAND_UINT8 , GxB_BXNOR_BAND_UINT16 , GxB_BXNOR_BAND_UINT32 , GxB_BXNOR_BAND_UINT64 , - GxB_BXNOR_BXOR_UINT8 , GxB_BXNOR_BXOR_UINT16 , GxB_BXNOR_BXOR_UINT32 , GxB_BXNOR_BXOR_UINT64 , - GxB_BXNOR_BXNOR_UINT8 , GxB_BXNOR_BXNOR_UINT16 , GxB_BXNOR_BXNOR_UINT32 , GxB_BXNOR_BXNOR_UINT64 , +GrB_Info GrB_Vector_reduce_BinaryOp_Scalar +( + GrB_Scalar c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_BinaryOp op, // binary op to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; //------------------------------------------------------------------------------ -// 80 positional semirings +// reduce a matrix to a scalar //------------------------------------------------------------------------------ - // monoids: (MIN, MAX, ANY, PLUS, TIMES) x - // mult: (FIRSTI, FIRSTI1, FIRSTJ, FIRSTJ1, SECONDI, SECONDI1, SECONDJ, SECONDJ1) - // types: (INT32, INT64) - - GxB_MIN_FIRSTI_INT32, GxB_MIN_FIRSTI_INT64, - GxB_MAX_FIRSTI_INT32, GxB_MAX_FIRSTI_INT64, - GxB_ANY_FIRSTI_INT32, GxB_ANY_FIRSTI_INT64, - GxB_PLUS_FIRSTI_INT32, GxB_PLUS_FIRSTI_INT64, - GxB_TIMES_FIRSTI_INT32, GxB_TIMES_FIRSTI_INT64, - - GxB_MIN_FIRSTI1_INT32, GxB_MIN_FIRSTI1_INT64, - GxB_MAX_FIRSTI1_INT32, GxB_MAX_FIRSTI1_INT64, - GxB_ANY_FIRSTI1_INT32, GxB_ANY_FIRSTI1_INT64, - GxB_PLUS_FIRSTI1_INT32, GxB_PLUS_FIRSTI1_INT64, - GxB_TIMES_FIRSTI1_INT32, GxB_TIMES_FIRSTI1_INT64, - - GxB_MIN_FIRSTJ_INT32, GxB_MIN_FIRSTJ_INT64, - GxB_MAX_FIRSTJ_INT32, GxB_MAX_FIRSTJ_INT64, - GxB_ANY_FIRSTJ_INT32, GxB_ANY_FIRSTJ_INT64, - GxB_PLUS_FIRSTJ_INT32, GxB_PLUS_FIRSTJ_INT64, - GxB_TIMES_FIRSTJ_INT32, GxB_TIMES_FIRSTJ_INT64, +// Reduce entries in a matrix to a scalar, c = accum (c, reduce_to_scalar(A)) - GxB_MIN_FIRSTJ1_INT32, GxB_MIN_FIRSTJ1_INT64, - GxB_MAX_FIRSTJ1_INT32, GxB_MAX_FIRSTJ1_INT64, - GxB_ANY_FIRSTJ1_INT32, GxB_ANY_FIRSTJ1_INT64, - GxB_PLUS_FIRSTJ1_INT32, GxB_PLUS_FIRSTJ1_INT64, - GxB_TIMES_FIRSTJ1_INT32, GxB_TIMES_FIRSTJ1_INT64, +GrB_Info GrB_Matrix_reduce_BOOL // c = accum (c, reduce_to_scalar (A)) +( + bool *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; - GxB_MIN_SECONDI_INT32, GxB_MIN_SECONDI_INT64, - GxB_MAX_SECONDI_INT32, GxB_MAX_SECONDI_INT64, - GxB_ANY_SECONDI_INT32, GxB_ANY_SECONDI_INT64, - GxB_PLUS_SECONDI_INT32, GxB_PLUS_SECONDI_INT64, - GxB_TIMES_SECONDI_INT32, GxB_TIMES_SECONDI_INT64, +GrB_Info GrB_Matrix_reduce_INT8 // c = accum (c, reduce_to_scalar (A)) +( + int8_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; - GxB_MIN_SECONDI1_INT32, GxB_MIN_SECONDI1_INT64, - GxB_MAX_SECONDI1_INT32, GxB_MAX_SECONDI1_INT64, - GxB_ANY_SECONDI1_INT32, GxB_ANY_SECONDI1_INT64, - GxB_PLUS_SECONDI1_INT32, GxB_PLUS_SECONDI1_INT64, - GxB_TIMES_SECONDI1_INT32, GxB_TIMES_SECONDI1_INT64, +GrB_Info GrB_Matrix_reduce_UINT8 // c = accum (c, reduce_to_scalar (A)) +( + uint8_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; - GxB_MIN_SECONDJ_INT32, GxB_MIN_SECONDJ_INT64, - GxB_MAX_SECONDJ_INT32, GxB_MAX_SECONDJ_INT64, - GxB_ANY_SECONDJ_INT32, GxB_ANY_SECONDJ_INT64, - GxB_PLUS_SECONDJ_INT32, GxB_PLUS_SECONDJ_INT64, - GxB_TIMES_SECONDJ_INT32, GxB_TIMES_SECONDJ_INT64, +GrB_Info GrB_Matrix_reduce_INT16 // c = accum (c, reduce_to_scalar (A)) +( + int16_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; - GxB_MIN_SECONDJ1_INT32, GxB_MIN_SECONDJ1_INT64, - GxB_MAX_SECONDJ1_INT32, GxB_MAX_SECONDJ1_INT64, - GxB_ANY_SECONDJ1_INT32, GxB_ANY_SECONDJ1_INT64, - GxB_PLUS_SECONDJ1_INT32, GxB_PLUS_SECONDJ1_INT64, - GxB_TIMES_SECONDJ1_INT32, GxB_TIMES_SECONDJ1_INT64 ; +GrB_Info GrB_Matrix_reduce_UINT16 // c = accum (c, reduce_to_scalar (A)) +( + uint16_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; -//------------------------------------------------------------------------------ -// GrB_* semirings -//------------------------------------------------------------------------------ +GrB_Info GrB_Matrix_reduce_INT32 // c = accum (c, reduce_to_scalar (A)) +( + int32_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; -// The v1.3 C API for GraphBLAS adds the following 124 predefined semirings, -// with GrB_* names. They are identical to 124 GxB_* semirings defined above, -// with the same name, except that GrB_LXNOR_LOR_SEMIRING_BOOL is identical to -// GxB_EQ_LOR_BOOL (since GrB_EQ_BOOL == GrB_LXNOR). The old names are listed -// below alongside each new name; the new GrB_* names are preferred. +GrB_Info GrB_Matrix_reduce_UINT32 // c = accum (c, reduce_to_scalar (A)) +( + uint32_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; -// 12 kinds of GrB_* semirings are available for all 10 real non-boolean types: +GrB_Info GrB_Matrix_reduce_INT64 // c = accum (c, reduce_to_scalar (A)) +( + int64_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; - // PLUS_TIMES, PLUS_MIN, - // MIN_PLUS, MIN_TIMES, MIN_FIRST, MIN_SECOND, MIN_MAX, - // MAX_PLUS, MAX_TIMES, MAX_FIRST, MAX_SECOND, MAX_MIN +GrB_Info GrB_Matrix_reduce_UINT64 // c = accum (c, reduce_to_scalar (A)) +( + uint64_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; -// and 4 semirings for boolean only: +GrB_Info GrB_Matrix_reduce_FP32 // c = accum (c, reduce_to_scalar (A)) +( + float *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; - // LOR_LAND, LAND_LOR, LXOR_LAND, LXNOR_LOR. +GrB_Info GrB_Matrix_reduce_FP64 // c = accum (c, reduce_to_scalar (A)) +( + double *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; -// GxB_* semirings corresponding to the equivalent GrB_* semiring are -// historical. +GrB_Info GxB_Matrix_reduce_FC32 // c = accum (c, reduce_to_scalar (A)) +( + GxB_FC32_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; -GB_GLOBAL GrB_Semiring +GrB_Info GxB_Matrix_reduce_FC64 // c = accum (c, reduce_to_scalar (A)) +( + GxB_FC64_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; - //-------------------------------------------------------------------------- - // 20 semirings with PLUS monoids - //-------------------------------------------------------------------------- +GrB_Info GrB_Matrix_reduce_UDT // c = accum (c, reduce_to_scalar (A)) +( + void *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; - // PLUS_TIMES semirings for all 10 real, non-boolean types: - GrB_PLUS_TIMES_SEMIRING_INT8, // GxB_PLUS_TIMES_INT8 - GrB_PLUS_TIMES_SEMIRING_INT16, // GxB_PLUS_TIMES_INT16 - GrB_PLUS_TIMES_SEMIRING_INT32, // GxB_PLUS_TIMES_INT32 - GrB_PLUS_TIMES_SEMIRING_INT64, // GxB_PLUS_TIMES_INT64 - GrB_PLUS_TIMES_SEMIRING_UINT8, // GxB_PLUS_TIMES_UINT8 - GrB_PLUS_TIMES_SEMIRING_UINT16, // GxB_PLUS_TIMES_UINT16 - GrB_PLUS_TIMES_SEMIRING_UINT32, // GxB_PLUS_TIMES_UINT32 - GrB_PLUS_TIMES_SEMIRING_UINT64, // GxB_PLUS_TIMES_UINT64 - GrB_PLUS_TIMES_SEMIRING_FP32, // GxB_PLUS_TIMES_FP32 - GrB_PLUS_TIMES_SEMIRING_FP64, // GxB_PLUS_TIMES_FP64 +GrB_Info GrB_Matrix_reduce_Monoid_Scalar // c = accum(c,reduce_to_scalar(A)) +( + GrB_Scalar c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; - // PLUS_MIN semirings for all 10 real, non-boolean types: - GrB_PLUS_MIN_SEMIRING_INT8, // GxB_PLUS_MIN_INT8 - GrB_PLUS_MIN_SEMIRING_INT16, // GxB_PLUS_MIN_INT16 - GrB_PLUS_MIN_SEMIRING_INT32, // GxB_PLUS_MIN_INT32 - GrB_PLUS_MIN_SEMIRING_INT64, // GxB_PLUS_MIN_INT64 - GrB_PLUS_MIN_SEMIRING_UINT8, // GxB_PLUS_MIN_UINT8 - GrB_PLUS_MIN_SEMIRING_UINT16, // GxB_PLUS_MIN_UINT16 - GrB_PLUS_MIN_SEMIRING_UINT32, // GxB_PLUS_MIN_UINT32 - GrB_PLUS_MIN_SEMIRING_UINT64, // GxB_PLUS_MIN_UINT64 - GrB_PLUS_MIN_SEMIRING_FP32, // GxB_PLUS_MIN_FP32 - GrB_PLUS_MIN_SEMIRING_FP64, // GxB_PLUS_MIN_FP64 +GrB_Info GrB_Matrix_reduce_BinaryOp_Scalar +( + GrB_Scalar S, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_BinaryOp op, // binary op to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; - //-------------------------------------------------------------------------- - // 50 semirings with MIN monoids - //-------------------------------------------------------------------------- +//------------------------------------------------------------------------------ +// GrB_reduce: generic matrix/vector reduction to a vector or scalar +//------------------------------------------------------------------------------ - // MIN_PLUS semirings for all 10 real, non-boolean types: - GrB_MIN_PLUS_SEMIRING_INT8, // GxB_MIN_PLUS_INT8 - GrB_MIN_PLUS_SEMIRING_INT16, // GxB_MIN_PLUS_INT16 - GrB_MIN_PLUS_SEMIRING_INT32, // GxB_MIN_PLUS_INT32 - GrB_MIN_PLUS_SEMIRING_INT64, // GxB_MIN_PLUS_INT64 - GrB_MIN_PLUS_SEMIRING_UINT8, // GxB_MIN_PLUS_UINT8 - GrB_MIN_PLUS_SEMIRING_UINT16, // GxB_MIN_PLUS_UINT16 - GrB_MIN_PLUS_SEMIRING_UINT32, // GxB_MIN_PLUS_UINT32 - GrB_MIN_PLUS_SEMIRING_UINT64, // GxB_MIN_PLUS_UINT64 - GrB_MIN_PLUS_SEMIRING_FP32, // GxB_MIN_PLUS_FP32 - GrB_MIN_PLUS_SEMIRING_FP64, // GxB_MIN_PLUS_FP64 +// GrB_reduce is a generic function that provides access to all GrB_*reduce* +// functions: - // MIN_TIMES semirings for all 10 real, non-boolean types: - GrB_MIN_TIMES_SEMIRING_INT8, // GxB_MIN_TIMES_INT8 - GrB_MIN_TIMES_SEMIRING_INT16, // GxB_MIN_TIMES_INT16 - GrB_MIN_TIMES_SEMIRING_INT32, // GxB_MIN_TIMES_INT32 - GrB_MIN_TIMES_SEMIRING_INT64, // GxB_MIN_TIMES_INT64 - GrB_MIN_TIMES_SEMIRING_UINT8, // GxB_MIN_TIMES_UINT8 - GrB_MIN_TIMES_SEMIRING_UINT16, // GxB_MIN_TIMES_UINT16 - GrB_MIN_TIMES_SEMIRING_UINT32, // GxB_MIN_TIMES_UINT32 - GrB_MIN_TIMES_SEMIRING_UINT64, // GxB_MIN_TIMES_UINT64 - GrB_MIN_TIMES_SEMIRING_FP32, // GxB_MIN_TIMES_FP32 - GrB_MIN_TIMES_SEMIRING_FP64, // GxB_MIN_TIMES_FP64 +// reduce matrix to vector: +// GrB_Matrix_reduce_Monoid (w,mask,acc,mo,A,d) // w = acc (w,reduce(A)) +// GrB_Matrix_reduce_BinaryOp (w,mask,acc,op,A,d) // w = acc (w,reduce(A)) - // MIN_FIRST semirings for all 10 real, non-boolean types: - GrB_MIN_FIRST_SEMIRING_INT8, // GxB_MIN_FIRST_INT8 - GrB_MIN_FIRST_SEMIRING_INT16, // GxB_MIN_FIRST_INT16 - GrB_MIN_FIRST_SEMIRING_INT32, // GxB_MIN_FIRST_INT32 - GrB_MIN_FIRST_SEMIRING_INT64, // GxB_MIN_FIRST_INT64 - GrB_MIN_FIRST_SEMIRING_UINT8, // GxB_MIN_FIRST_UINT8 - GrB_MIN_FIRST_SEMIRING_UINT16, // GxB_MIN_FIRST_UINT16 - GrB_MIN_FIRST_SEMIRING_UINT32, // GxB_MIN_FIRST_UINT32 - GrB_MIN_FIRST_SEMIRING_UINT64, // GxB_MIN_FIRST_UINT64 - GrB_MIN_FIRST_SEMIRING_FP32, // GxB_MIN_FIRST_FP32 - GrB_MIN_FIRST_SEMIRING_FP64, // GxB_MIN_FIRST_FP64 +// reduce matrix to scalar: +// GrB_Vector_reduce_[SCALAR] (c,acc,monoid,u,d) // c = acc (c,reduce(u)) +// GrB_Matrix_reduce_[SCALAR] (c,acc,monoid,A,d) // c = acc (c,reduce(A)) +// GrB_Vector_reduce_Monoid_Scalar (s,acc,monoid,u,d) // s = acc (s,reduce(u)) +// GrB_Matrix_reduce_Monoid_Scalar (s,acc,monoid,A,d) // s = acc (s,reduce(A)) +// GrB_Vector_reduce_BinaryOp_Scalar (s,acc,op,u,d) // s = acc (s,reduce(u)) +// GrB_Matrix_reduce_BinaryOp_Scalar (s,acc,op,A,d) // s = acc (s,reduce(A)) - // MIN_SECOND semirings for all 10 real, non-boolean types: - GrB_MIN_SECOND_SEMIRING_INT8, // GxB_MIN_SECOND_INT8 - GrB_MIN_SECOND_SEMIRING_INT16, // GxB_MIN_SECOND_INT16 - GrB_MIN_SECOND_SEMIRING_INT32, // GxB_MIN_SECOND_INT32 - GrB_MIN_SECOND_SEMIRING_INT64, // GxB_MIN_SECOND_INT64 - GrB_MIN_SECOND_SEMIRING_UINT8, // GxB_MIN_SECOND_UINT8 - GrB_MIN_SECOND_SEMIRING_UINT16, // GxB_MIN_SECOND_UINT16 - GrB_MIN_SECOND_SEMIRING_UINT32, // GxB_MIN_SECOND_UINT32 - GrB_MIN_SECOND_SEMIRING_UINT64, // GxB_MIN_SECOND_UINT64 - GrB_MIN_SECOND_SEMIRING_FP32, // GxB_MIN_SECOND_FP32 - GrB_MIN_SECOND_SEMIRING_FP64, // GxB_MIN_SECOND_FP64 +#if GxB_STDC_VERSION >= 201112L +#define GB_REDUCE_TO_SCALAR(kind,c,op) \ + _Generic \ + ( \ + (c), \ + GB_PCASES (GrB, GB_CONCAT ( kind, _reduce,, )), \ + default: \ + _Generic \ + ( \ + (op), \ + GrB_BinaryOp : \ + GB_CONCAT (GrB,_,kind,_reduce_BinaryOp_Scalar),\ + default: GB_CONCAT (GrB,_,kind,_reduce_Monoid_Scalar) \ + ) \ + ) - // MIN_MAX semirings for all 10 real, non-boolean types: - GrB_MIN_MAX_SEMIRING_INT8, // GxB_MIN_MAX_INT8 - GrB_MIN_MAX_SEMIRING_INT16, // GxB_MIN_MAX_INT16 - GrB_MIN_MAX_SEMIRING_INT32, // GxB_MIN_MAX_INT32 - GrB_MIN_MAX_SEMIRING_INT64, // GxB_MIN_MAX_INT64 - GrB_MIN_MAX_SEMIRING_UINT8, // GxB_MIN_MAX_UINT8 - GrB_MIN_MAX_SEMIRING_UINT16, // GxB_MIN_MAX_UINT16 - GrB_MIN_MAX_SEMIRING_UINT32, // GxB_MIN_MAX_UINT32 - GrB_MIN_MAX_SEMIRING_UINT64, // GxB_MIN_MAX_UINT64 - GrB_MIN_MAX_SEMIRING_FP32, // GxB_MIN_MAX_FP32 - GrB_MIN_MAX_SEMIRING_FP64, // GxB_MIN_MAX_FP64 +#define GrB_reduce(arg1,arg2,arg3,arg4,...) \ + _Generic \ + ( \ + (arg4), \ + GrB_Vector : GB_REDUCE_TO_SCALAR (Vector, arg1, arg3), \ + GrB_Matrix : GB_REDUCE_TO_SCALAR (Matrix, arg1, arg3), \ + GrB_Monoid : GrB_Matrix_reduce_Monoid , \ + GrB_BinaryOp : GrB_Matrix_reduce_BinaryOp \ + ) \ + (arg1, arg2, arg3, arg4, __VA_ARGS__) +#endif - //-------------------------------------------------------------------------- - // 50 semirings with MAX monoids - //-------------------------------------------------------------------------- +//============================================================================== +// GrB_transpose: matrix transpose +//============================================================================== - // MAX_PLUS semirings for all 10 real, non-boolean types - GrB_MAX_PLUS_SEMIRING_INT8, // GxB_MAX_PLUS_INT8 - GrB_MAX_PLUS_SEMIRING_INT16, // GxB_MAX_PLUS_INT16 - GrB_MAX_PLUS_SEMIRING_INT32, // GxB_MAX_PLUS_INT32 - GrB_MAX_PLUS_SEMIRING_INT64, // GxB_MAX_PLUS_INT64 - GrB_MAX_PLUS_SEMIRING_UINT8, // GxB_MAX_PLUS_UINT8 - GrB_MAX_PLUS_SEMIRING_UINT16, // GxB_MAX_PLUS_UINT16 - GrB_MAX_PLUS_SEMIRING_UINT32, // GxB_MAX_PLUS_UINT32 - GrB_MAX_PLUS_SEMIRING_UINT64, // GxB_MAX_PLUS_UINT64 - GrB_MAX_PLUS_SEMIRING_FP32, // GxB_MAX_PLUS_FP32 - GrB_MAX_PLUS_SEMIRING_FP64, // GxB_MAX_PLUS_FP64 +GrB_Info GrB_transpose // C = accum (C, A') +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_Matrix A, // first input: matrix A + const GrB_Descriptor desc // descriptor for C, Mask, and A +) ; - // MAX_TIMES semirings for all 10 real, non-boolean types: - GrB_MAX_TIMES_SEMIRING_INT8, // GxB_MAX_TIMES_INT8 - GrB_MAX_TIMES_SEMIRING_INT16, // GxB_MAX_TIMES_INT16 - GrB_MAX_TIMES_SEMIRING_INT32, // GxB_MAX_TIMES_INT32 - GrB_MAX_TIMES_SEMIRING_INT64, // GxB_MAX_TIMES_INT64 - GrB_MAX_TIMES_SEMIRING_UINT8, // GxB_MAX_TIMES_UINT8 - GrB_MAX_TIMES_SEMIRING_UINT16, // GxB_MAX_TIMES_UINT16 - GrB_MAX_TIMES_SEMIRING_UINT32, // GxB_MAX_TIMES_UINT32 - GrB_MAX_TIMES_SEMIRING_UINT64, // GxB_MAX_TIMES_UINT64 - GrB_MAX_TIMES_SEMIRING_FP32, // GxB_MAX_TIMES_FP32 - GrB_MAX_TIMES_SEMIRING_FP64, // GxB_MAX_TIMES_FP64 +//============================================================================== +// GrB_kronecker: Kronecker product +//============================================================================== - // MAX_FIRST semirings for all 10 real, non-boolean types: - GrB_MAX_FIRST_SEMIRING_INT8, // GxB_MAX_FIRST_INT8 - GrB_MAX_FIRST_SEMIRING_INT16, // GxB_MAX_FIRST_INT16 - GrB_MAX_FIRST_SEMIRING_INT32, // GxB_MAX_FIRST_INT32 - GrB_MAX_FIRST_SEMIRING_INT64, // GxB_MAX_FIRST_INT64 - GrB_MAX_FIRST_SEMIRING_UINT8, // GxB_MAX_FIRST_UINT8 - GrB_MAX_FIRST_SEMIRING_UINT16, // GxB_MAX_FIRST_UINT16 - GrB_MAX_FIRST_SEMIRING_UINT32, // GxB_MAX_FIRST_UINT32 - GrB_MAX_FIRST_SEMIRING_UINT64, // GxB_MAX_FIRST_UINT64 - GrB_MAX_FIRST_SEMIRING_FP32, // GxB_MAX_FIRST_FP32 - GrB_MAX_FIRST_SEMIRING_FP64, // GxB_MAX_FIRST_FP64 +// GxB_kron is historical; use GrB_kronecker instead +GrB_Info GxB_kron // C = accum(C,kron(A,B)) (historical) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // defines '*' for T=kron(A,B) + const GrB_Matrix A, // first input: matrix A + const GrB_Matrix B, // second input: matrix B + const GrB_Descriptor desc // descriptor for C, Mask, A, and B +) ; - // MAX_SECOND semirings for all 10 real, non-boolean types: - GrB_MAX_SECOND_SEMIRING_INT8, // GxB_MAX_SECOND_INT8 - GrB_MAX_SECOND_SEMIRING_INT16, // GxB_MAX_SECOND_INT16 - GrB_MAX_SECOND_SEMIRING_INT32, // GxB_MAX_SECOND_INT32 - GrB_MAX_SECOND_SEMIRING_INT64, // GxB_MAX_SECOND_INT64 - GrB_MAX_SECOND_SEMIRING_UINT8, // GxB_MAX_SECOND_UINT8 - GrB_MAX_SECOND_SEMIRING_UINT16, // GxB_MAX_SECOND_UINT16 - GrB_MAX_SECOND_SEMIRING_UINT32, // GxB_MAX_SECOND_UINT32 - GrB_MAX_SECOND_SEMIRING_UINT64, // GxB_MAX_SECOND_UINT64 - GrB_MAX_SECOND_SEMIRING_FP32, // GxB_MAX_SECOND_FP32 - GrB_MAX_SECOND_SEMIRING_FP64, // GxB_MAX_SECOND_FP64 +GrB_Info GrB_Matrix_kronecker_BinaryOp // C = accum (C, kron(A,B)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix M, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // defines '*' for T=kron(A,B) + const GrB_Matrix A, // first input: matrix A + const GrB_Matrix B, // second input: matrix B + const GrB_Descriptor desc // descriptor for C, M, A, and B +) ; - // MAX_MIN semirings for all 10 real, non-boolean types: - GrB_MAX_MIN_SEMIRING_INT8, // GxB_MAX_MIN_INT8 - GrB_MAX_MIN_SEMIRING_INT16, // GxB_MAX_MIN_INT16 - GrB_MAX_MIN_SEMIRING_INT32, // GxB_MAX_MIN_INT32 - GrB_MAX_MIN_SEMIRING_INT64, // GxB_MAX_MIN_INT64 - GrB_MAX_MIN_SEMIRING_UINT8, // GxB_MAX_MIN_UINT8 - GrB_MAX_MIN_SEMIRING_UINT16, // GxB_MAX_MIN_UINT16 - GrB_MAX_MIN_SEMIRING_UINT32, // GxB_MAX_MIN_UINT32 - GrB_MAX_MIN_SEMIRING_UINT64, // GxB_MAX_MIN_UINT64 - GrB_MAX_MIN_SEMIRING_FP32, // GxB_MAX_MIN_FP32 - GrB_MAX_MIN_SEMIRING_FP64, // GxB_MAX_MIN_FP64 +GrB_Info GrB_Matrix_kronecker_Monoid // C = accum (C, kron(A,B)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix M, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_Monoid monoid, // defines '*' for T=kron(A,B) + const GrB_Matrix A, // first input: matrix A + const GrB_Matrix B, // second input: matrix B + const GrB_Descriptor desc // descriptor for C, M, A, and B +) ; - //-------------------------------------------------------------------------- - // 4 boolean semirings: - //-------------------------------------------------------------------------- +GrB_Info GrB_Matrix_kronecker_Semiring // C = accum (C, kron(A,B)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix M, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_Semiring semiring, // defines '*' for T=kron(A,B) + const GrB_Matrix A, // first input: matrix A + const GrB_Matrix B, // second input: matrix B + const GrB_Descriptor desc // descriptor for C, M, A, and B +) ; - GrB_LOR_LAND_SEMIRING_BOOL, // GxB_LOR_LAND_BOOL - GrB_LAND_LOR_SEMIRING_BOOL, // GxB_LAND_LOR_BOOL - GrB_LXOR_LAND_SEMIRING_BOOL, // GxB_LXOR_LAND_BOOL - GrB_LXNOR_LOR_SEMIRING_BOOL ; // GxB_EQ_LOR_BOOL (note EQ == LXNOR) +#if GxB_STDC_VERSION >= 201112L +#define GrB_kronecker(C,Mask,accum,op,A,B,desc) \ + _Generic \ + ( \ + (op), \ + GrB_Semiring : GrB_Matrix_kronecker_Semiring , \ + GrB_Monoid : GrB_Matrix_kronecker_Monoid , \ + GrB_BinaryOp : GrB_Matrix_kronecker_BinaryOp \ + ) \ + (C, Mask, accum, op, A, B, desc) +#endif //============================================================================== // GrB_*_resize: change the size of a matrix or vector //============================================================================== -#ifndef GB_CUDA_FOLDER - // If the dimensions decrease, entries that fall outside the resized matrix or // vector are deleted. @@ -9136,8 +9143,6 @@ GrB_Info GxB_Vector_resize // change the size of a vector (historical) (arg1, __VA_ARGS__) #endif -#endif // GB_CUDA_FOLDER - //============================================================================== // GxB_fprint and GxB_print: print the contents of a GraphBLAS object //============================================================================== @@ -9183,19 +9188,6 @@ GrB_Info GxB_Vector_resize // change the size of a vector (historical) // resulting output via another program. The intent of these functions is to // produce a report of the object for visual inspection. -typedef enum -{ - GxB_SILENT = 0, // nothing is printed, just check the object - GxB_SUMMARY = 1, // print a terse summary - GxB_SHORT = 2, // short description, about 30 entries of a matrix - GxB_COMPLETE = 3, // print the entire contents of the object - GxB_SHORT_VERBOSE = 4, // GxB_SHORT but with "%.15g" for doubles - GxB_COMPLETE_VERBOSE = 5 // GxB_COMPLETE but with "%.15g" for doubles -} -GxB_Print_Level ; - -#ifndef GB_CUDA_FOLDER - GrB_Info GxB_Type_fprint // print and check a GrB_Type ( GrB_Type type, // object to print and check @@ -10330,8 +10322,6 @@ GrB_Info GxB_pack_HyperHash // move Y into A->Y const GrB_Descriptor desc // unused ) ; -#endif // GB_CUDA_FOLDER - //============================================================================== // GrB import/export //============================================================================== @@ -10350,18 +10340,6 @@ GrB_Info GxB_pack_HyperHash // move Y into A->Y // No typecasting of the values is done on import or export. -// The GrB C API specification supports 3 formats: - -typedef enum -{ - GrB_CSR_FORMAT = 0, // CSR format (equiv to GxB_SPARSE with GxB_BY_ROW) - GrB_CSC_FORMAT = 1, // CSC format (equiv to GxB_SPARSE with GxB_BY_COL) - GrB_COO_FORMAT = 2 // triplet format (like input to GrB*build) -} -GrB_Format ; - -#ifndef GB_CUDA_FOLDER - GrB_Info GrB_Matrix_import_BOOL // import a GrB_BOOL matrix ( GrB_Matrix *A, // handle of matrix to create @@ -10780,8 +10758,6 @@ GrB_Info GrB_Matrix_exportHint // suggest the best export format GrB_Matrix A // matrix to export ) ; -#endif // GB_CUDA_FOLDER - //============================================================================== // serialize/deserialize //============================================================================== @@ -10891,13 +10867,6 @@ GrB_Info GrB_Matrix_exportHint // suggest the best export format free (blob) ; */ -// Currently implemented: no compression, LZ4, LZ4HC, and ZSTD -#define GxB_COMPRESSION_NONE -1 // no compression -#define GxB_COMPRESSION_DEFAULT 0 // ZSTD (level 1) -#define GxB_COMPRESSION_LZ4 1000 // LZ4 -#define GxB_COMPRESSION_LZ4HC 2000 // LZ4HC, with default level 9 -#define GxB_COMPRESSION_ZSTD 3000 // ZSTD, with default level 1 - // Most of the above methods have a level parameter that controls the tradeoff // between run time and the amount of compression obtained. Higher levels // result in a more compact result, at the cost of higher run time: @@ -10915,8 +10884,6 @@ GrB_Info GrB_Matrix_exportHint // suggest the best export format // positive but unrecognized, the default is used (GxB_COMPRESSION_ZSTD, // level 1). -#ifndef GB_CUDA_FOLDER - GrB_Info GxB_Matrix_serialize // serialize a GrB_Matrix to a blob ( // output: @@ -12063,10 +12030,8 @@ void GxB_Iterator_get_UDT (GxB_Iterator iterator, ) #endif // GB_CUDA_FOLDER - #if defined ( __cplusplus ) } #endif - #endif diff --git a/Include/GraphBLAS.h b/Include/GraphBLAS.h index 829b451755..6db995b69e 100644 --- a/Include/GraphBLAS.h +++ b/Include/GraphBLAS.h @@ -40,15 +40,19 @@ #ifndef GRAPHBLAS_H #define GRAPHBLAS_H +#if defined ( __cplusplus ) +extern "C" +{ +#endif + //============================================================================== //=== GraphBLAS macros, typedefs, enums, and global variables ================= //============================================================================== // This GraphBLAS.h header file is split into two parts. The first part // defines macros, typedefs, enums, global variables, and pulls in standard C -// #include files. - -// The second part defines all of the user-callable GrB_* +// #include files. The second part defines all of the user-callable GrB_*, +// with access controlled by the internal definition, GB_CUDA_FOLDER. //------------------------------------------------------------------------------ // include files required by GraphBLAS @@ -70,6 +74,9 @@ // helper macros //------------------------------------------------------------------------------ +// These are required for internal use in GraphBLAS.h, but should not be used +// by the end user application. + #define GB_CAT2(x,y) x ## y #define GB_EVAL2(x,y) GB_CAT2 (x,y) @@ -329,10 +336,6 @@ typedef uint64_t GrB_Index ; // called, which returns a string that provides more information on the last // return value from GraphBLAS. -// The v1.3 C API did not specify the enum values, but they appear in v2.0. -// Changing them will require SuiteSparse:GraphBLAS to bump to v6.x. -// Error codes GrB_NOT_IMPLEMENTED and GrB_EMPTY_OBJECT are new to v2.0. - typedef enum { @@ -368,6 +371,10 @@ typedef enum } GrB_Info ; +// for null and invalid objects +#define GrB_NULL NULL +#define GrB_INVALID_HANDLE NULL + //============================================================================== // GrB_init / GrB_finalize //============================================================================== @@ -393,53 +400,6 @@ typedef enum } GrB_Mode ; -//============================================================================== -// GrB_init / GrB_finalize -//============================================================================== - -#if defined ( __cplusplus ) -extern "C" -{ -#endif - -#ifndef GB_CUDA_FOLDER - -GrB_Info GrB_init // start up GraphBLAS -( - GrB_Mode mode // blocking or non-blocking mode, no GPU -) ; - -GrB_Info GxB_init // start up GraphBLAS and also define malloc, etc -( - GrB_Mode mode, // blocking or non-blocking mode, - // with or without GPU - // pointers to memory management functions - void * (* user_malloc_function ) (size_t), - void * (* user_calloc_function ) (size_t, size_t), - void * (* user_realloc_function ) (void *, size_t), - void (* user_free_function ) (void *) -) ; - -GrB_Info GrB_finalize (void) ; // finish GraphBLAS - -//============================================================================== -// GrB_getVersion: GraphBLAS C API version -//============================================================================== - -// GrB_getVersion provides a runtime access of the C API Version. Can also be -// done with two calls to GrB_Global_get_INT32 with the v2.1 C API: -// -// GrB_get (GrB_GLOBAL, &version, GrB_API_VER_MAJOR) ; -// GrB_get (GrB_GLOBAL, &subversion, GrB_API_VER_MINOR) ; - -GrB_Info GrB_getVersion // runtime access to C API version number -( - unsigned int *version, // returns GRB_VERSION - unsigned int *subversion // returns GRB_SUBVERSION -) ; - -#endif // GB_CUDA_FOLDER - //============================================================================== // GrB_Descriptor: the GraphBLAS descriptor //============================================================================== @@ -568,30 +528,6 @@ GrB_Desc_Value ; typedef struct GB_Descriptor_opaque *GrB_Descriptor ; -#ifndef GB_CUDA_FOLDER - -GrB_Info GrB_Descriptor_new // create a new descriptor -( - GrB_Descriptor *descriptor // handle of descriptor to create -) ; - -// historical methods; use GrB_set and GrB_get instead: -GrB_Info GrB_Descriptor_set (GrB_Descriptor, GrB_Desc_Field, GrB_Desc_Value) ; -GrB_Info GxB_Descriptor_get (GrB_Desc_Value *, GrB_Descriptor, GrB_Desc_Field) ; -GrB_Info GxB_Desc_set (GrB_Descriptor, GrB_Desc_Field, ...) ; -GrB_Info GxB_Desc_set_INT32 (GrB_Descriptor, GrB_Desc_Field, int32_t) ; -GrB_Info GxB_Desc_set_FP64 (GrB_Descriptor, GrB_Desc_Field, double) ; -GrB_Info GxB_Desc_get (GrB_Descriptor, GrB_Desc_Field, ...) ; -GrB_Info GxB_Desc_get_INT32 (GrB_Descriptor, GrB_Desc_Field, int32_t *) ; -GrB_Info GxB_Desc_get_FP64 (GrB_Descriptor, GrB_Desc_Field, double *) ; - -GrB_Info GrB_Descriptor_free // free a descriptor -( - GrB_Descriptor *descriptor // handle of descriptor to free -) ; - -#endif // GB_CUDA_FOLDER - // Predefined descriptors and their values: GB_GLOBAL GrB_Descriptor @@ -672,123 +608,8 @@ GB_GLOBAL GrB_Type GxB_FC32 , // in C: float complex GxB_FC64 ; // in C: double complex -//------------------------------------------------------------------------------ -// helper macros for polymorphic functions -//------------------------------------------------------------------------------ - -#define GB_CAT(w,x,y,z) w ## x ## y ## z -#define GB_CONCAT(w,x,y,z) GB_CAT (w, x, y, z) - -// methods for C scalars of various types -#define GB_CASES(prefix,func) \ - bool : GB_CONCAT ( prefix, _, func, _BOOL ), \ - int8_t : GB_CONCAT ( prefix, _, func, _INT8 ), \ - int16_t : GB_CONCAT ( prefix, _, func, _INT16 ), \ - int32_t : GB_CONCAT ( prefix, _, func, _INT32 ), \ - int64_t : GB_CONCAT ( prefix, _, func, _INT64 ), \ - uint8_t : GB_CONCAT ( prefix, _, func, _UINT8 ), \ - uint16_t : GB_CONCAT ( prefix, _, func, _UINT16 ), \ - uint32_t : GB_CONCAT ( prefix, _, func, _UINT32 ), \ - uint64_t : GB_CONCAT ( prefix, _, func, _UINT64 ), \ - float : GB_CONCAT ( prefix, _, func, _FP32 ), \ - double : GB_CONCAT ( prefix, _, func, _FP64 ), \ - GxB_FC32_t : GB_CONCAT ( GxB , _, func, _FC32 ), \ - GxB_FC64_t : GB_CONCAT ( GxB , _, func, _FC64 ), \ - const void * : GB_CONCAT ( prefix, _, func, _UDT ), \ - void * : GB_CONCAT ( prefix, _, func, _UDT ) - -// methods for C arrays of various types -#define GB_PCASES(prefix,func) \ - const bool * : GB_CONCAT ( prefix, _, func, _BOOL ), \ - bool * : GB_CONCAT ( prefix, _, func, _BOOL ), \ - const int8_t * : GB_CONCAT ( prefix, _, func, _INT8 ), \ - int8_t * : GB_CONCAT ( prefix, _, func, _INT8 ), \ - const int16_t * : GB_CONCAT ( prefix, _, func, _INT16 ), \ - int16_t * : GB_CONCAT ( prefix, _, func, _INT16 ), \ - const int32_t * : GB_CONCAT ( prefix, _, func, _INT32 ), \ - int32_t * : GB_CONCAT ( prefix, _, func, _INT32 ), \ - const int64_t * : GB_CONCAT ( prefix, _, func, _INT64 ), \ - int64_t * : GB_CONCAT ( prefix, _, func, _INT64 ), \ - const uint8_t * : GB_CONCAT ( prefix, _, func, _UINT8 ), \ - uint8_t * : GB_CONCAT ( prefix, _, func, _UINT8 ), \ - const uint16_t * : GB_CONCAT ( prefix, _, func, _UINT16 ), \ - uint16_t * : GB_CONCAT ( prefix, _, func, _UINT16 ), \ - const uint32_t * : GB_CONCAT ( prefix, _, func, _UINT32 ), \ - uint32_t * : GB_CONCAT ( prefix, _, func, _UINT32 ), \ - const uint64_t * : GB_CONCAT ( prefix, _, func, _UINT64 ), \ - uint64_t * : GB_CONCAT ( prefix, _, func, _UINT64 ), \ - const float * : GB_CONCAT ( prefix, _, func, _FP32 ), \ - float * : GB_CONCAT ( prefix, _, func, _FP32 ), \ - const double * : GB_CONCAT ( prefix, _, func, _FP64 ), \ - double * : GB_CONCAT ( prefix, _, func, _FP64 ), \ - const GxB_FC32_t * : GB_CONCAT ( GxB , _, func, _FC32 ), \ - GxB_FC32_t * : GB_CONCAT ( GxB , _, func, _FC32 ), \ - const GxB_FC64_t * : GB_CONCAT ( GxB , _, func, _FC64 ), \ - GxB_FC64_t * : GB_CONCAT ( GxB , _, func, _FC64 ), \ - const void * : GB_CONCAT ( prefix, _, func, _UDT ), \ - void * : GB_CONCAT ( prefix, _, func, _UDT ) - -//------------------------------------------------------------------------------ -// GrB_Type_new: create a new type -//------------------------------------------------------------------------------ - #define GxB_MAX_NAME_LEN 128 -#ifndef GB_CUDA_FOLDER - -GrB_Info GrB_Type_new // create a new GraphBLAS type -( - GrB_Type *type, // handle of user type to create - size_t sizeof_ctype // size = sizeof (ctype) of the C type -) ; - -// GxB_Type_new creates a type with a name and definition that are known to -// GraphBLAS, as strings. The type_name is any valid string (max length of 128 -// characters, including the required null-terminating character) that may -// appear as the name of a C type created by a C "typedef" statement. It must -// not contain any white-space characters. Example, creating a type of size -// 16*4+4 = 68 bytes, with a 4-by-4 dense float array and a 32-bit integer: -// -// typedef struct { float x [4][4] ; int color ; } myquaternion ; -// GrB_Type MyQtype ; -// GxB_Type_new (&MyQtype, sizeof (myquaternion), "myquaternion", -// "typedef struct { float x [4][4] ; int color ; } myquaternion ;") ; -// -// The type_name and type_defn are both null-terminated strings. The two -// strings are required for best performance in the JIT (both on the CPU and -// GPU). User defined types created by GrB_Type_new will not work with a JIT. -// -// At most GxB_MAX_NAME_LEN characters are accessed in type_name; characters -// beyond that limit are silently ignored. - -GrB_Info GxB_Type_new // create a new named GraphBLAS type -( - GrB_Type *type, // handle of user type to create - size_t sizeof_ctype, // size = sizeof (ctype) of the C type - const char *type_name, // name of the type (max 128 characters) - const char *type_defn // typedef for the type (no max length) -) ; - -// historical; use GrB_get instead: -GrB_Info GxB_Type_name (char *type_name, const GrB_Type type) ; -GrB_Info GxB_Type_size (size_t *size, const GrB_Type type) ; - -GrB_Info GxB_Type_from_name // return the built-in GrB_Type from a name -( - GrB_Type *type, // built-in type, or NULL if user-defined. - // The name can be the underlying C type - // ("int8_t") or the GraphBLAS name - // ("GrB_INT8"). - const char *type_name // array of size at least GxB_MAX_NAME_LEN -) ; - -GrB_Info GrB_Type_free // free a user-defined type -( - GrB_Type *type // handle of user-defined type to free -) ; - -#endif // GB_CUDA_FOLDER - //============================================================================== // GrB_UnaryOp: unary operators //============================================================================== @@ -979,47 +800,8 @@ GB_GLOBAL GrB_UnaryOp GxB_ISFINITE_FC32, // isfinite (real (x)) && isfinite (cimag (x)) GxB_ISFINITE_FC64 ; // isfinite (real (x)) && isfinite (cimag (x)) -//------------------------------------------------------------------------------ -// methods for unary operators -//------------------------------------------------------------------------------ - typedef void (*GxB_unary_function) (void *, const void *) ; -#ifndef GB_CUDA_FOLDER - -// GrB_UnaryOp_new creates a user-defined unary op (with no name or defn) -GrB_Info GrB_UnaryOp_new // create a new user-defined unary operator -( - GrB_UnaryOp *unaryop, // handle for the new unary operator - GxB_unary_function function, // pointer to the unary function - GrB_Type ztype, // type of output z - GrB_Type xtype // type of input x -) ; - -// GxB_UnaryOp_new creates a named and defined user-defined unary op. -GrB_Info GxB_UnaryOp_new // create a new user-defined unary operator -( - GrB_UnaryOp *unaryop, // handle for the new unary operator - GxB_unary_function function, // pointer to the unary function - GrB_Type ztype, // type of output z - GrB_Type xtype, // type of input x - const char *unop_name, // name of the user function - const char *unop_defn // definition of the user function -) ; - -// historical; use GrB_get instead: -GrB_Info GxB_UnaryOp_ztype (GrB_Type *ztype, GrB_UnaryOp unaryop) ; -GrB_Info GxB_UnaryOp_ztype_name (char *type_name, const GrB_UnaryOp unaryop) ; -GrB_Info GxB_UnaryOp_xtype (GrB_Type *xtype, GrB_UnaryOp unaryop) ; -GrB_Info GxB_UnaryOp_xtype_name (char *type_name, const GrB_UnaryOp unaryop) ; - -GrB_Info GrB_UnaryOp_free // free a user-created unary operator -( - GrB_UnaryOp *unaryop // handle of unary operator to free -) ; - -#endif // GB_CUDA_FOLDER - //============================================================================== // GrB_BinaryOp: binary operators //============================================================================== @@ -1419,64 +1201,18 @@ GB_GLOBAL GrB_BinaryOp GxB_IGNORE_DUP ; // BXOR, and BXNOR. This assumes that the computations for each bit are // entirely independent (so BSHIFT would not fit in the table above). -//------------------------------------------------------------------------------ -// methods for binary operators -//------------------------------------------------------------------------------ - typedef void (*GxB_binary_function) (void *, const void *, const void *) ; -#ifndef GB_CUDA_FOLDER +//============================================================================== +// GxB_SelectOp: select operators (DEPRECATED: do not use) +//============================================================================== -// GrB_BinaryOp_new creates a user-defined binary op (no name or defn) -GrB_Info GrB_BinaryOp_new -( - GrB_BinaryOp *binaryop, // handle for the new binary operator - GxB_binary_function function, // pointer to the binary function - GrB_Type ztype, // type of output z - GrB_Type xtype, // type of input x - GrB_Type ytype // type of input y -) ; - -// GxB_BinaryOp_new creates a named and defined user-defined binary op. -GrB_Info GxB_BinaryOp_new -( - GrB_BinaryOp *op, // handle for the new binary operator - GxB_binary_function function, // pointer to the binary function - GrB_Type ztype, // type of output z - GrB_Type xtype, // type of input x - GrB_Type ytype, // type of input y - const char *binop_name, // name of the user function - const char *binop_defn // definition of the user function -) ; - -// historical; use GrB_get instead: -GrB_Info GxB_BinaryOp_ztype (GrB_Type *ztype, GrB_BinaryOp op) ; -GrB_Info GxB_BinaryOp_ztype_name (char *type_name, const GrB_BinaryOp op) ; -GrB_Info GxB_BinaryOp_xtype (GrB_Type *xtype, GrB_BinaryOp op) ; -GrB_Info GxB_BinaryOp_xtype_name (char *type_name, const GrB_BinaryOp op) ; -GrB_Info GxB_BinaryOp_ytype (GrB_Type *ytype, GrB_BinaryOp op) ; -GrB_Info GxB_BinaryOp_ytype_name (char *type_name, const GrB_BinaryOp op) ; - -GrB_Info GrB_BinaryOp_free // free a user-created binary operator -( - GrB_BinaryOp *binaryop // handle of binary operator to free -) ; - -#endif // GB_CUDA_FOLDER - -//============================================================================== -// GxB_SelectOp: select operators (DEPRECATED: do not use) -//============================================================================== - -// historical; use GrB_select and GrB_IndexUnaryOp instead: -typedef struct GB_SelectOp_opaque *GxB_SelectOp ; -GB_GLOBAL GxB_SelectOp GxB_TRIL, GxB_TRIU, GxB_DIAG, GxB_OFFDIAG, GxB_NONZERO, -GxB_EQ_ZERO, GxB_GT_ZERO, GxB_GE_ZERO, GxB_LT_ZERO, GxB_LE_ZERO, GxB_NE_THUNK, -GxB_EQ_THUNK, GxB_GT_THUNK, GxB_GE_THUNK, GxB_LT_THUNK, GxB_LE_THUNK ; -#ifndef GB_CUDA_FOLDER -GrB_Info GxB_SelectOp_xtype (GrB_Type *xtype, GxB_SelectOp selectop) ; -GrB_Info GxB_SelectOp_ttype (GrB_Type *ttype, GxB_SelectOp selectop) ; -#endif // GB_CUDA_FOLDER +// historical; use GrB_select and GrB_IndexUnaryOp instead: +typedef struct GB_SelectOp_opaque *GxB_SelectOp ; +GB_GLOBAL GxB_SelectOp GxB_TRIL, GxB_TRIU, GxB_DIAG, GxB_OFFDIAG, GxB_NONZERO, + GxB_EQ_ZERO, GxB_GT_ZERO, GxB_GE_ZERO, GxB_LT_ZERO, GxB_LE_ZERO, + GxB_NE_THUNK, GxB_EQ_THUNK, GxB_GT_THUNK, GxB_GE_THUNK, GxB_LT_THUNK, + GxB_LE_THUNK ; //============================================================================== // GrB_IndexUnaryOp: a unary operator that depends on the row/col indices @@ -1497,45 +1233,9 @@ typedef void (*GxB_index_unary_function) const void *y // input scalar y ) ; -#ifndef GB_CUDA_FOLDER - -// GrB_IndexUnaryOp_new creates a user-defined unary op (no name or defn) - -GrB_Info GrB_IndexUnaryOp_new // create a new user-defined IndexUnary op -( - GrB_IndexUnaryOp *op, // handle for the new IndexUnary operator - GxB_index_unary_function function, // pointer to IndexUnary function - GrB_Type ztype, // type of output z - GrB_Type xtype, // type of input x (the A(i,j) entry) - GrB_Type ytype // type of input y (the scalar) -) ; - -GrB_Info GxB_IndexUnaryOp_new // create a named user-created IndexUnaryOp -( - GrB_IndexUnaryOp *op, // handle for the new IndexUnary operator - GxB_index_unary_function function, // pointer to index_unary function - GrB_Type ztype, // type of output z - GrB_Type xtype, // type of input x (the A(i,j) entry) - GrB_Type ytype, // type of input y (the scalar) - const char *idxop_name, // name of the user function - const char *idxop_defn // definition of the user function -) ; - -// historical; use GrB_get instead: -GrB_Info GxB_IndexUnaryOp_ztype_name (char *, const GrB_IndexUnaryOp op) ; -GrB_Info GxB_IndexUnaryOp_xtype_name (char *, const GrB_IndexUnaryOp op) ; -GrB_Info GxB_IndexUnaryOp_ytype_name (char *, const GrB_IndexUnaryOp op) ; - -GrB_Info GrB_IndexUnaryOp_free // free a user-created IndexUnaryOp -( - GrB_IndexUnaryOp *op // handle of IndexUnary to free -) ; - -#endif // GB_CUDA_FOLDER - -//------------------------------------------------------------------------------ -// built-in IndexUnaryOps -//------------------------------------------------------------------------------ +//============================================================================== +// GrB_IndexUnaryOp: a unary operator that depends on the row/col indices +//============================================================================== // To facilitate computations with negative integers, the indices i and j are // of type int64_t. The scalar y has the type corresponding to the suffix @@ -1627,5681 +1327,6152 @@ GB_GLOBAL GrB_IndexUnaryOp typedef struct GB_Monoid_opaque *GrB_Monoid ; -#ifndef GB_CUDA_FOLDER - -GrB_Info GrB_Monoid_new_BOOL // create a new boolean monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - bool identity // identity value of the monoid -) ; +//============================================================================== +// GrB_Semiring +//============================================================================== -GrB_Info GrB_Monoid_new_INT8 // create a new int8 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - int8_t identity // identity value of the monoid -) ; +typedef struct GB_Semiring_opaque *GrB_Semiring ; -GrB_Info GrB_Monoid_new_UINT8 // create a new uint8 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - uint8_t identity // identity value of the monoid -) ; +//============================================================================== +// GrB_Scalar: a GraphBLAS scalar +//============================================================================== -GrB_Info GrB_Monoid_new_INT16 // create a new int16 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - int16_t identity // identity value of the monoid -) ; +typedef struct GB_Scalar_opaque *GxB_Scalar ; // historical: use GrB_Scalar +typedef struct GB_Scalar_opaque *GrB_Scalar ; // use this instead -GrB_Info GrB_Monoid_new_UINT16 // create a new uint16 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - uint16_t identity // identity value of the monoid -) ; +//============================================================================== +// GrB_Vector: a GraphBLAS vector +//============================================================================== -GrB_Info GrB_Monoid_new_INT32 // create a new int32 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - int32_t identity // identity value of the monoid -) ; +typedef struct GB_Vector_opaque *GrB_Vector ; -GrB_Info GrB_Monoid_new_UINT32 // create a new uint32 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - uint32_t identity // identity value of the monoid -) ; +//============================================================================== +// GrB_Matrix: a GraphBLAS matrix +//============================================================================== -GrB_Info GrB_Monoid_new_INT64 // create a new int64 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - int64_t identity // identity value of the monoid -) ; +typedef struct GB_Matrix_opaque *GrB_Matrix ; -GrB_Info GrB_Monoid_new_UINT64 // create a new uint64 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - uint64_t identity // identity value of the monoid -) ; +//============================================================================== +// SuiteSparse:GraphBLAS options +//============================================================================== -GrB_Info GrB_Monoid_new_FP32 // create a new float monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - float identity // identity value of the monoid -) ; +// The following options modify how SuiteSparse:GraphBLAS stores and operates +// on its matrices. The GrB_get/set methods allow the user to suggest how the +// internal representation of a matrix, or all matrices, should be held. These +// options have no effect on the result (except for minor roundoff differences +// for floating-point types). They only affect the time and memory usage of the +// computations. -GrB_Info GrB_Monoid_new_FP64 // create a new double monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - double identity // identity value of the monoid -) ; +typedef enum // for global options or matrix options +{ -GrB_Info GxB_Monoid_new_FC32 // create a new float complex monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - GxB_FC32_t identity // identity value of the monoid -) ; + //------------------------------------------------------------ + // GrB_get / GrB_set for GrB_Matrix and GrB_GLOBAL: + //------------------------------------------------------------ -GrB_Info GxB_Monoid_new_FC64 // create a new double complex monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - GxB_FC64_t identity // identity value of the monoid -) ; + GxB_HYPER_SWITCH = 7000, // switch to hypersparse (double value) + GxB_HYPER_HASH = 7048, // hyper_hash control (int64 value) + GxB_BITMAP_SWITCH = 7001, // switch to bitmap (double value) + GxB_FORMAT = 7002, // historical; use GrB_STORAGE_ORIENTATION_HINT -GrB_Info GrB_Monoid_new_UDT // create a monoid with a user-defined type -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - void *identity // identity value of the monoid -) ; + //------------------------------------------------------------ + // GrB_get for GrB_GLOBAL: + //------------------------------------------------------------ -// Type-generic method for creating a new monoid: + GxB_MODE = 7003, // historical; use GrB_BLOCKING_MODE + GxB_LIBRARY_NAME = 7004, // historical; use GrB_NAME + GxB_LIBRARY_VERSION = 7005, // historical; use GrB_LIBRARY_VER_* + GxB_LIBRARY_DATE = 7006, // date of the library (char *) + GxB_LIBRARY_ABOUT = 7007, // about the library (char *) + GxB_LIBRARY_URL = 7008, // URL for the library (char *) + GxB_LIBRARY_LICENSE = 7009, // license of the library (char *) + GxB_LIBRARY_COMPILE_DATE = 7010, // date library was compiled (char *) + GxB_LIBRARY_COMPILE_TIME = 7011, // time library was compiled (char *) + GxB_API_VERSION = 7012, // historical; use GrB_API_VER_* + GxB_API_DATE = 7013, // date of the API (char *) + GxB_API_ABOUT = 7014, // about the API (char *) + GxB_API_URL = 7015, // URL for the API (char *) + GxB_COMPILER_VERSION = 7016, // compiler version (3 int's) + GxB_COMPILER_NAME = 7017, // compiler name (char *) + GxB_LIBRARY_OPENMP = 7018, // library compiled with OpenMP + GxB_MALLOC_FUNCTION = 7037, // malloc function pointer + GxB_CALLOC_FUNCTION = 7038, // calloc function pointer + GxB_REALLOC_FUNCTION = 7039, // realloc function pointer + GxB_FREE_FUNCTION = 7040, // free function pointer -/* -GrB_Info GrB_Monoid_new // create a monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - identity // identity value of the monoid -) ; -*/ + //------------------------------------------------------------ + // GrB_get / GrB_set for GrB_GLOBAL: + //------------------------------------------------------------ -#if GxB_STDC_VERSION >= 201112L -#define GrB_Monoid_new(monoid,op,identity) \ - _Generic \ - ( \ - (identity), \ - GB_CASES (GrB, Monoid_new) \ - ) \ - (monoid, op, identity) -#endif + GxB_GLOBAL_NTHREADS = GxB_NTHREADS, // max number of threads to use + GxB_GLOBAL_CHUNK = GxB_CHUNK, // chunk size for small problems. + GxB_GLOBAL_GPU_ID = GxB_GPU_ID, // which GPU to use (DRAFT) -// GxB_Monoid_terminal_new is identical to GrB_Monoid_new, except that a -// terminal value can be specified. The terminal may be NULL, which indicates -// no terminal value (and in this case, it is identical to GrB_Monoid_new). -// The terminal value, if not NULL, must have the same type as the identity. + GxB_BURBLE = 7019, // diagnostic output + GxB_PRINTF = 7020, // printf function diagnostic output + GxB_FLUSH = 7021, // flush function diagnostic output + GxB_MEMORY_POOL = 7022, // no longer used + GxB_PRINT_1BASED = 7023, // print matrices as 0-based or 1-based -GrB_Info GxB_Monoid_terminal_new_BOOL // create a new boolean monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - bool identity, // identity value of the monoid - bool terminal // terminal value of the monoid -) ; - -GrB_Info GxB_Monoid_terminal_new_INT8 // create a new int8 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - int8_t identity, // identity value of the monoid - int8_t terminal // terminal value of the monoid -) ; - -GrB_Info GxB_Monoid_terminal_new_UINT8 // create a new uint8 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - uint8_t identity, // identity value of the monoid - uint8_t terminal // terminal value of the monoid -) ; + GxB_JIT_C_COMPILER_NAME = 7024, // CPU JIT C compiler name + GxB_JIT_C_COMPILER_FLAGS = 7025, // CPU JIT C compiler flags + GxB_JIT_C_LINKER_FLAGS = 7026, // CPU JIT C linker flags + GxB_JIT_C_LIBRARIES = 7027, // CPU JIT C libraries + GxB_JIT_C_PREFACE = 7028, // CPU JIT C preface + GxB_JIT_C_CONTROL = 7029, // CPU JIT C control + GxB_JIT_CACHE_PATH = 7030, // CPU/CUDA JIT path for compiled kernels + GxB_JIT_C_CMAKE_LIBS = 7031, // CPU JIT C libraries when using cmake + GxB_JIT_USE_CMAKE = 7032, // CPU JIT: use cmake or direct compile + GxB_JIT_ERROR_LOG = 7033, // CPU JIT: error log file -GrB_Info GxB_Monoid_terminal_new_INT16 // create a new int16 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - int16_t identity, // identity value of the monoid - int16_t terminal // terminal value of the monoid -) ; + GxB_JIT_CUDA_PREFACE = 7100, // CUDA JIT C++ preface -GrB_Info GxB_Monoid_terminal_new_UINT16 // create a new uint16 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - uint16_t identity, // identity value of the monoid - uint16_t terminal // terminal value of the monoid -) ; + //------------------------------------------------------------ + // GrB_get for GrB_Matrix: + //------------------------------------------------------------ -GrB_Info GxB_Monoid_terminal_new_INT32 // create a new int32 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - int32_t identity, // identity value of the monoid - int32_t terminal // terminal value of the monoid -) ; + GxB_SPARSITY_STATUS = 7034, // hyper, sparse, bitmap or full (1,2,4,8) + GxB_IS_HYPER = 7035, // historical; use GxB_SPARSITY_STATUS -GrB_Info GxB_Monoid_terminal_new_UINT32 // create a new uint32 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - uint32_t identity, // identity value of the monoid - uint32_t terminal // terminal value of the monoid -) ; + //------------------------------------------------------------ + // GrB_get/GrB_set for GrB_Matrix: + //------------------------------------------------------------ -GrB_Info GxB_Monoid_terminal_new_INT64 // create a new int64 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - int64_t identity, // identity value of the monoid - int64_t terminal // terminal value of the monoid -) ; + GxB_SPARSITY_CONTROL = 7036, // sparsity control: 0 to 15; see below -GrB_Info GxB_Monoid_terminal_new_UINT64 // create a new uint64 monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - uint64_t identity, // identity value of the monoid - uint64_t terminal // terminal value of the monoid -) ; +} GxB_Option_Field ; -GrB_Info GxB_Monoid_terminal_new_FP32 // create a new float monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - float identity, // identity value of the monoid - float terminal // terminal value of the monoid -) ; +// for GxB_JIT_C_CONTROL: +typedef enum +{ + GxB_JIT_OFF = 0, // do not use the JIT: free all JIT kernels if loaded + GxB_JIT_PAUSE = 1, // do not run JIT kernels but keep any loaded + GxB_JIT_RUN = 2, // run JIT kernels if already loaded; no load/compile + GxB_JIT_LOAD = 3, // able to load and run JIT kernels; may not compile + GxB_JIT_ON = 4, // full JIT: able to compile, load, and run +} +GxB_JIT_Control ; -GrB_Info GxB_Monoid_terminal_new_FP64 // create a new double monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - double identity, // identity value of the monoid - double terminal // terminal value of the monoid -) ; +// GxB_FORMAT is historical, but it can be by row or by column: +typedef enum +{ + GxB_BY_ROW = 0, // CSR: compressed sparse row format + GxB_BY_COL = 1, // CSC: compressed sparse column format + GxB_NO_FORMAT = -1 // format not defined +} +GxB_Format_Value ; -GrB_Info GxB_Monoid_terminal_new_FC32 // create a new float complex monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - GxB_FC32_t identity, // identity value of the monoid - GxB_FC32_t terminal // terminal value of the monoid -) ; +// The default format is by row. These constants are defined as GB_GLOBAL +// const, so that if SuiteSparse:GraphBLAS is recompiled with a different +// default format, and the application is relinked but not recompiled, it will +// acquire the new default values. +GB_GLOBAL const GxB_Format_Value GxB_FORMAT_DEFAULT ; -GrB_Info GxB_Monoid_terminal_new_FC64 // create a new double complex monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - GxB_FC64_t identity, // identity value of the monoid - GxB_FC64_t terminal // terminal value of the monoid -) ; +// the default hyper_switch parameter +GB_GLOBAL const double GxB_HYPER_DEFAULT ; -GrB_Info GxB_Monoid_terminal_new_UDT // create a monoid with a user type -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - void *identity, // identity value of the monoid - void *terminal // terminal value of the monoid -) ; +// GxB_SPARSITY_CONTROL can be any sum or bitwise OR of these 4 values: +#define GxB_HYPERSPARSE 1 // store matrix in hypersparse form +#define GxB_SPARSE 2 // store matrix as sparse form (compressed vector) +#define GxB_BITMAP 4 // store matrix as a bitmap +#define GxB_FULL 8 // store matrix as full; all entries must be present -// Type-generic method for creating a new monoid with a terminal value: +// size of b array for GxB_set/get (GxB_BITMAP_SWITCH, b) +#define GxB_NBITMAP_SWITCH 8 // size of bitmap_switch parameter array -/* -GrB_Info GxB_Monoid_terminal_new // create a monoid -( - GrB_Monoid *monoid, // handle of monoid to create - GrB_BinaryOp op, // binary operator of the monoid - identity, // identity value of the monoid - terminal // terminal value of the monoid -) ; -*/ +// any sparsity value: +#define GxB_ANY_SPARSITY (GxB_HYPERSPARSE + GxB_SPARSE + GxB_BITMAP + GxB_FULL) -#if GxB_STDC_VERSION >= 201112L -#define GxB_Monoid_terminal_new(monoid,op,identity,terminal) \ - _Generic \ - ( \ - (identity), \ - GB_CASES (GxB, Monoid_terminal_new) \ - ) \ - (monoid, op, identity, terminal) -#endif +// the default sparsity control is any format: +#define GxB_AUTO_SPARSITY GxB_ANY_SPARSITY -// historical; use GrB_get instead: -GrB_Info GxB_Monoid_operator (GrB_BinaryOp *op, GrB_Monoid monoid) ; -GrB_Info GxB_Monoid_identity (void *identity, GrB_Monoid monoid) ; -GrB_Info GxB_Monoid_terminal (bool *, void *terminal, GrB_Monoid monoid) ; +// GrB_set (A, scontrol, GxB_SPARSITY_CONTROL) provides hints +// about which data structure GraphBLAS should use for the matrix A: +// +// GxB_AUTO_SPARSITY: GraphBLAS selects automatically. +// GxB_HYPERSPARSE: always hypersparse, taking O(nvals(A)) space. +// GxB_SPARSE: always in a sparse struture: compressed-sparse row/column, +// taking O(nrows+nvals(A)) space if stored by row, or +// O(ncols+nvals(A)) if stored by column. +// GxB_BITMAP: always in a bitmap struture, taking O(nrows*ncols) space. +// GxB_FULL: always in a full structure, taking O(nrows*ncols) space, +// unless not all entries are present, in which case the bitmap +// storage is used. +// +// These options can be summed. For example, to allow a matrix to be sparse +// or hypersparse, but not bitmap or full, use GxB_SPARSE + GxB_HYPERSPARSE. +// Since GxB_FULL can only be used when all entries are present, matrices with +// the just GxB_FULL control setting are stored in bitmap form if any entries +// are not present. +// +// Only the least 4 bits of the sparsity control are considered, so the +// formats can be bitwise negated. For example, to allow for any format +// except full, use ~GxB_FULL. +// +// GrB_get (A, &sparsity, GxB_SPARSITY_STATUS) returns the +// current data structure currently used for the matrix A (either hypersparse, +// sparse, bitmap, or full). +// +// GrB_get (A, &scontrol, GxB_SPARSITY_CONTROL) returns the hint +// for how A should be stored (hypersparse, sparse, bitmap, or full, or any +// combination). -GrB_Info GrB_Monoid_free // free a user-created monoid -( - GrB_Monoid *monoid // handle of monoid to free -) ; +// GxB_HYPER_SWITCH: +// If the matrix or vector structure can be sparse or hypersparse, the +// GxB_HYPER_SWITCH parameter controls when each of these structures are +// used. The parameter is not used if the matrix or vector is full or +// bitmap. +// +// Let k be the actual number of non-empty vectors (with at least one +// entry). This value k is not dependent on whether or not the matrix is +// stored in hypersparse structure. Let n be the number of vectors (the # +// of columns if CSC, or rows if CSR). Let h be the value of the +// GxB_HYPER_SWITCH setting of the matrix. +// +// If a matrix is currently hypersparse, it can be converted to +// non-hypersparse if (n <= 1 || k > 2*n*h). Otherwise it stays +// hypersparse. If (n <= 1) the matrix is always stored as +// non-hypersparse. +// +// If currently non-hypersparse, it can be converted to hypersparse if (n +// > 1 && k <= n*h). Otherwise, it stays non-hypersparse. If (n <= 1) +// the matrix always remains non-hypersparse. +// +// Setting GxB_HYPER_SWITCH to GxB_ALWAYS_HYPER or GxB_NEVER_HYPER ensures +// a matrix always stays hypersparse, or always stays non-hypersparse, +// respectively. -#endif // GB_CUDA_FOLDER +GB_GLOBAL const double GxB_ALWAYS_HYPER, GxB_NEVER_HYPER ; //============================================================================== -// GrB_Semiring +// GxB_Context: for managing computational resources //============================================================================== -typedef struct GB_Semiring_opaque *GrB_Semiring ; - -#ifndef GB_CUDA_FOLDER +typedef struct GB_Context_opaque *GxB_Context ; -GrB_Info GrB_Semiring_new // create a semiring -( - GrB_Semiring *semiring, // handle of semiring to create - GrB_Monoid add, // add monoid of the semiring - GrB_BinaryOp multiply // multiply operator of the semiring -) ; +// GxB_CONTEXT_WORLD is the default Context for all user threads. +GB_GLOBAL GxB_Context GxB_CONTEXT_WORLD ; -// historical; use GrB_get instead: -GrB_Info GxB_Semiring_add (GrB_Monoid *add, GrB_Semiring semiring) ; -GrB_Info GxB_Semiring_multiply (GrB_BinaryOp *multiply, GrB_Semiring semiring) ; +typedef enum +{ + GxB_CONTEXT_NTHREADS = GxB_NTHREADS, // max number of threads to use. + // If <= 0, then one thread is used. -GrB_Info GrB_Semiring_free // free a user-created semiring -( - GrB_Semiring *semiring // handle of semiring to free -) ; + GxB_CONTEXT_CHUNK = GxB_CHUNK, // chunk size for small problems. + // If < 1, then the default is used. -#endif // GB_CUDA_FOLDER + // GPU control (DRAFT: in progress, do not use) + GxB_CONTEXT_GPU_ID = GxB_GPU_ID, +} +GxB_Context_Field ; //============================================================================== -// GrB_Scalar: a GraphBLAS scalar +// GrB_set and GrB_get //============================================================================== -typedef struct GB_Scalar_opaque *GxB_Scalar ; // historical: use GrB_Scalar -typedef struct GB_Scalar_opaque *GrB_Scalar ; // use this instead - -#ifndef GB_CUDA_FOLDER +typedef struct GB_Global_opaque *GrB_Global ; +GB_GLOBAL const GrB_Global GrB_GLOBAL ; -// These methods create, free, copy, and clear a GrB_Scalar. The nvals, -// and type methods return basic information about a GrB_Scalar. +typedef enum +{ -GrB_Info GrB_Scalar_new // create a new GrB_Scalar with no entry -( - GrB_Scalar *s, // handle of GrB_Scalar to create - GrB_Type type // type of GrB_Scalar to create -) ; + //-------------------------------------------------------------------------- + // GrB enums in the C API + //-------------------------------------------------------------------------- -GrB_Info GrB_Scalar_dup // make an exact copy of a GrB_Scalar -( - GrB_Scalar *s, // handle of output GrB_Scalar to create - const GrB_Scalar t // input GrB_Scalar to copy -) ; + // GrB_Descriptor only: + GrB_OUTP_FIELD = 0, // descriptor for output of a method + GrB_MASK_FIELD = 1, // descriptor for the mask input of a method + GrB_INP0_FIELD = 2, // descriptor for the first input of a method + GrB_INP1_FIELD = 3, // descriptor for the second input of a method -GrB_Info GrB_Scalar_clear // clear a GrB_Scalar of its entry -( // type remains unchanged. - GrB_Scalar s // GrB_Scalar to clear -) ; + // all objects, including GrB_GLOBAL: + GrB_NAME = 10, // name of the object, as a string -GrB_Info GrB_Scalar_nvals // get the number of entries in a GrB_Scalar -( - GrB_Index *nvals, // GrB_Scalar has nvals entries (0 or 1) - const GrB_Scalar s // GrB_Scalar to query -) ; + // GrB_GLOBAL only: + GrB_LIBRARY_VER_MAJOR = 11, // SuiteSparse:GraphBLAS version + GrB_LIBRARY_VER_MINOR = 12, + GrB_LIBRARY_VER_PATCH = 13, + GrB_API_VER_MAJOR = 14, // C API version + GrB_API_VER_MINOR = 15, + GrB_API_VER_PATCH = 16, + GrB_BLOCKING_MODE = 17, // GrB_Mode -// historical; use GrB_get instead: -GrB_Info GxB_Scalar_type (GrB_Type *type, const GrB_Scalar s) ; -GrB_Info GxB_Scalar_type_name (char *type_name, const GrB_Scalar s) ; + // GrB_GLOBAL, GrB_Matrix, GrB_Vector, GrB_Scalar: + GrB_STORAGE_ORIENTATION_HINT = 100, // GrB_Orientation -GrB_Info GxB_Scalar_memoryUsage // return # of bytes used for a scalar -( - size_t *size, // # of bytes used by the scalar s - const GrB_Scalar s // GrB_Scalar to query -) ; + // GrB_Matrix, GrB_Vector, GrB_Scalar (and void * serialize): + GrB_EL_TYPE_CODE = 102, // a GrB_Type_code (see below) + GrB_EL_TYPE_STRING = 106, // name of the type -GrB_Info GrB_Scalar_free // free a GrB_Scalar -( - GrB_Scalar *s // handle of GrB_Scalar to free -) ; + // GrB_*Op, GrB_Monoid, and GrB_Semiring: + GrB_INP0_TYPE_CODE = 103, // GrB_Type_code + GrB_INP1_TYPE_CODE = 104, + GrB_OUTP_TYPE_CODE = 105, + GrB_INP0_TYPE_STRING = 107, // name of the type, as a string + GrB_INP1_TYPE_STRING = 108, + GrB_OUTP_TYPE_STRING = 109, -// historical names identical to GrB_Scalar_methods above: -GrB_Info GxB_Scalar_new (GrB_Scalar *s, GrB_Type type) ; -GrB_Info GxB_Scalar_dup (GrB_Scalar *s, const GrB_Scalar t) ; -GrB_Info GxB_Scalar_clear (GrB_Scalar s) ; -GrB_Info GxB_Scalar_nvals (GrB_Index *nvals, const GrB_Scalar s) ; -GrB_Info GxB_Scalar_free (GrB_Scalar *s) ; + // GrB_Type (readable only): + GrB_SIZE = 110, // size of the type -//------------------------------------------------------------------------------ -// GrB_Scalar_setElement -//------------------------------------------------------------------------------ + //-------------------------------------------------------------------------- + // SuiteSparse extensions: + //-------------------------------------------------------------------------- -// Set a single GrB_Scalar s, from a user scalar x: s = x, typecasting from the -// type of x to the type of w as needed. + // GrB_Type, GrB_UnaryOp, GrB_BinaryOp, and GrB_IndexUnaryOp: + GxB_JIT_C_NAME = 7041, // C type or function name + GxB_JIT_C_DEFINITION = 7042, // C typedef or function definition -GrB_Info GrB_Scalar_setElement_BOOL // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - bool x // user scalar to assign to s -) ; + // GrB_Monoid and GrB_Semiring: + GxB_MONOID_IDENTITY = 7043, // monoid identity value + GxB_MONOID_TERMINAL = 7044, // monoid terminal value + GxB_MONOID_OPERATOR = 7045, // monoid binary operator -GrB_Info GrB_Scalar_setElement_INT8 // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - int8_t x // user scalar to assign to s -) ; + // GrB_Semiring only: + GxB_SEMIRING_MONOID = 7046, // semiring monoid + GxB_SEMIRING_MULTIPLY = 7047, // semiring multiplicative op +} +GrB_Field ; -GrB_Info GrB_Scalar_setElement_UINT8 // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - uint8_t x // user scalar to assign to s -) ; +typedef enum +{ + GrB_ROWMAJOR = 0, + GrB_COLMAJOR = 1, + GrB_BOTH = 2, + GrB_UNKNOWN = 3, +} +GrB_Orientation ; -GrB_Info GrB_Scalar_setElement_INT16 // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - int16_t x // user scalar to assign to s -) ; +typedef enum +{ + GrB_UDT_CODE = 0, // user-defined type + GrB_BOOL_CODE = 1, // GraphBLAS: GrB_BOOL C: bool + GrB_INT8_CODE = 2, // GraphBLAS: GrB_INT8 C: int8_t + GrB_UINT8_CODE = 3, // GraphBLAS: GrB_UINT8 C: uint8_t + GrB_INT16_CODE = 4, // GraphBLAS: GrB_INT16 C: int16_t + GrB_UINT16_CODE = 5, // GraphBLAS: GrB_UINT16 C: uint16_t + GrB_INT32_CODE = 6, // GraphBLAS: GrB_INT32 C: int32_t + GrB_UINT32_CODE = 7, // GraphBLAS: GrB_UINT32 C: uint32_t + GrB_INT64_CODE = 8, // GraphBLAS: GrB_INT64 C: int64_t + GrB_UINT64_CODE = 9, // GraphBLAS: GrB_UINT64 C: uint64_t + GrB_FP32_CODE = 10, // GraphBLAS: GrB_FP32 C: float + GrB_FP64_CODE = 11, // GraphBLAS: GrB_FP64 C: double + GxB_FC32_CODE = 7070, // GraphBLAS: GxB_FC32 C: float complex + GxB_FC64_CODE = 7071, // GraphBLAS: GxB_FC64 C: double complex +} +GrB_Type_Code ; -GrB_Info GrB_Scalar_setElement_UINT16 // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - uint16_t x // user scalar to assign to s -) ; +//============================================================================== +// GrB_wait: finish computations +//============================================================================== -GrB_Info GrB_Scalar_setElement_INT32 // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - int32_t x // user scalar to assign to s -) ; +typedef enum +{ + GrB_COMPLETE = 0, // establishes a happens-before relation + GrB_MATERIALIZE = 1 // object is complete +} +GrB_WaitMode ; -GrB_Info GrB_Scalar_setElement_UINT32 // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - uint32_t x // user scalar to assign to s -) ; +//============================================================================== +// GrB_extract: extract a submatrix or subvector +//============================================================================== -GrB_Info GrB_Scalar_setElement_INT64 // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - int64_t x // user scalar to assign to s -) ; +GB_GLOBAL const uint64_t *GrB_ALL ; -GrB_Info GrB_Scalar_setElement_UINT64 // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - uint64_t x // user scalar to assign to s -) ; +// These special values of ni and nj can be used for GrB_assign, +// GrB_extract, and GxB_subassign. +#define GxB_RANGE (INT64_MAX) +#define GxB_STRIDE (INT64_MAX-1) +#define GxB_BACKWARDS (INT64_MAX-2) -GrB_Info GrB_Scalar_setElement_FP32 // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - float x // user scalar to assign to s -) ; +// for the strided range begin:inc:end, I [GxB_BEGIN] is the value of begin, I +// [GxB_END] is the value end, I [GxB_INC] is the magnitude of the stride. If +// the stride is negative, use ni = GxB_BACKWARDS. +#define GxB_BEGIN (0) +#define GxB_END (1) +#define GxB_INC (2) -GrB_Info GrB_Scalar_setElement_FP64 // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - double x // user scalar to assign to s -) ; +//============================================================================== +// GrB_Monoid: built-in monoids +//============================================================================== -GrB_Info GxB_Scalar_setElement_FC32 // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - GxB_FC32_t x // user scalar to assign to s -) ; +GB_GLOBAL GrB_Monoid -GrB_Info GxB_Scalar_setElement_FC64 // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - GxB_FC64_t x // user scalar to assign to s -) ; + //-------------------------------------------------------------------------- + // 10 MIN monoids: (not for complex types) + //-------------------------------------------------------------------------- -GrB_Info GrB_Scalar_setElement_UDT // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - void *x // user scalar to assign to s -) ; + // GxB_MIN monoids, historical, use GrB_MIN_MONOID_* instead: + GxB_MIN_INT8_MONOID, // identity: INT8_MAX terminal: INT8_MIN + GxB_MIN_INT16_MONOID, // identity: INT16_MAX terminal: INT16_MIN + GxB_MIN_INT32_MONOID, // identity: INT32_MAX terminal: INT32_MIN + GxB_MIN_INT64_MONOID, // identity: INT64_MAX terminal: INT32_MIN + GxB_MIN_UINT8_MONOID, // identity: UINT8_MAX terminal: 0 + GxB_MIN_UINT16_MONOID, // identity: UINT16_MAX terminal: 0 + GxB_MIN_UINT32_MONOID, // identity: UINT32_MAX terminal: 0 + GxB_MIN_UINT64_MONOID, // identity: UINT64_MAX terminal: 0 + GxB_MIN_FP32_MONOID, // identity: INFINITY terminal: -INFINITY + GxB_MIN_FP64_MONOID, // identity: INFINITY terminal: -INFINITY -// historical names identical to GrB_Scalar_methods above: -GrB_Info GxB_Scalar_setElement_BOOL (GrB_Scalar s, bool x) ; -GrB_Info GxB_Scalar_setElement_INT8 (GrB_Scalar s, int8_t x) ; -GrB_Info GxB_Scalar_setElement_INT16 (GrB_Scalar s, int16_t x) ; -GrB_Info GxB_Scalar_setElement_INT32 (GrB_Scalar s, int32_t x) ; -GrB_Info GxB_Scalar_setElement_INT64 (GrB_Scalar s, int64_t x) ; -GrB_Info GxB_Scalar_setElement_UINT8 (GrB_Scalar s, uint8_t x) ; -GrB_Info GxB_Scalar_setElement_UINT16 (GrB_Scalar s, uint16_t x) ; -GrB_Info GxB_Scalar_setElement_UINT32 (GrB_Scalar s, uint32_t x) ; -GrB_Info GxB_Scalar_setElement_UINT64 (GrB_Scalar s, uint64_t x) ; -GrB_Info GxB_Scalar_setElement_FP32 (GrB_Scalar s, float x) ; -GrB_Info GxB_Scalar_setElement_FP64 (GrB_Scalar s, double x) ; -GrB_Info GxB_Scalar_setElement_UDT (GrB_Scalar s, void *x) ; + // preferred names from the v1.3 spec: + GrB_MIN_MONOID_INT8, // identity: INT8_MAX terminal: INT8_MIN + GrB_MIN_MONOID_INT16, // identity: INT16_MAX terminal: INT16_MIN + GrB_MIN_MONOID_INT32, // identity: INT32_MAX terminal: INT32_MIN + GrB_MIN_MONOID_INT64, // identity: INT64_MAX terminal: INT32_MIN + GrB_MIN_MONOID_UINT8, // identity: UINT8_MAX terminal: 0 + GrB_MIN_MONOID_UINT16, // identity: UINT16_MAX terminal: 0 + GrB_MIN_MONOID_UINT32, // identity: UINT32_MAX terminal: 0 + GrB_MIN_MONOID_UINT64, // identity: UINT64_MAX terminal: 0 + GrB_MIN_MONOID_FP32, // identity: INFINITY terminal: -INFINITY + GrB_MIN_MONOID_FP64, // identity: INFINITY terminal: -INFINITY -// Type-generic version: x can be any supported C type or void * for a -// user-defined type. + //-------------------------------------------------------------------------- + // 10 MAX monoids: + //-------------------------------------------------------------------------- -/* -GrB_Info GrB_Scalar_setElement // s = x -( - GrB_Scalar s, // GrB_Scalar to modify - x // user scalar to assign to s -) ; -*/ + // GxB_MAX monoids, historical, use GrB_MAX_MONOID_* instead: + GxB_MAX_INT8_MONOID, // identity: INT8_MIN terminal: INT8_MAX + GxB_MAX_INT16_MONOID, // identity: INT16_MIN terminal: INT16_MAX + GxB_MAX_INT32_MONOID, // identity: INT32_MIN terminal: INT32_MAX + GxB_MAX_INT64_MONOID, // identity: INT64_MIN terminal: INT64_MAX + GxB_MAX_UINT8_MONOID, // identity: 0 terminal: UINT8_MAX + GxB_MAX_UINT16_MONOID, // identity: 0 terminal: UINT16_MAX + GxB_MAX_UINT32_MONOID, // identity: 0 terminal: UINT32_MAX + GxB_MAX_UINT64_MONOID, // identity: 0 terminal: UINT64_MAX + GxB_MAX_FP32_MONOID, // identity: -INFINITY terminal: INFINITY + GxB_MAX_FP64_MONOID, // identity: -INFINITY terminal: INFINITY -#if GxB_STDC_VERSION >= 201112L -#define GrB_Scalar_setElement(s,x) \ - _Generic \ - ( \ - (x), \ - GB_CASES (GrB, Scalar_setElement) \ - ) \ - (s, x) + // preferred names from the v1.3 spec: + GrB_MAX_MONOID_INT8, // identity: INT8_MIN terminal: INT8_MAX + GrB_MAX_MONOID_INT16, // identity: INT16_MIN terminal: INT16_MAX + GrB_MAX_MONOID_INT32, // identity: INT32_MIN terminal: INT32_MAX + GrB_MAX_MONOID_INT64, // identity: INT64_MIN terminal: INT64_MAX + GrB_MAX_MONOID_UINT8, // identity: 0 terminal: UINT8_MAX + GrB_MAX_MONOID_UINT16, // identity: 0 terminal: UINT16_MAX + GrB_MAX_MONOID_UINT32, // identity: 0 terminal: UINT32_MAX + GrB_MAX_MONOID_UINT64, // identity: 0 terminal: UINT64_MAX + GrB_MAX_MONOID_FP32, // identity: -INFINITY terminal: INFINITY + GrB_MAX_MONOID_FP64, // identity: -INFINITY terminal: INFINITY -// historical; use GrB_Scalar_setElement instead: -#define GxB_Scalar_setElement(s,x) GrB_Scalar_setElement (s, x) -#endif + //-------------------------------------------------------------------------- + // 12 PLUS monoids: + //-------------------------------------------------------------------------- -//------------------------------------------------------------------------------ -// GrB_Scalar_extractElement -//------------------------------------------------------------------------------ + // GxB_PLUS monoids, historical, use GrB_PLUS_MONOID_* instead: + GxB_PLUS_INT8_MONOID, // identity: 0 + GxB_PLUS_INT16_MONOID, // identity: 0 + GxB_PLUS_INT32_MONOID, // identity: 0 + GxB_PLUS_INT64_MONOID, // identity: 0 + GxB_PLUS_UINT8_MONOID, // identity: 0 + GxB_PLUS_UINT16_MONOID, // identity: 0 + GxB_PLUS_UINT32_MONOID, // identity: 0 + GxB_PLUS_UINT64_MONOID, // identity: 0 + GxB_PLUS_FP32_MONOID, // identity: 0 + GxB_PLUS_FP64_MONOID, // identity: 0 -// Extract a single entry from a GrB_Scalar, x = s, typecasting from the type -// of s to the type of x as needed. + // preferred names from the v1.3 spec: + GrB_PLUS_MONOID_INT8, // identity: 0 + GrB_PLUS_MONOID_INT16, // identity: 0 + GrB_PLUS_MONOID_INT32, // identity: 0 + GrB_PLUS_MONOID_INT64, // identity: 0 + GrB_PLUS_MONOID_UINT8, // identity: 0 + GrB_PLUS_MONOID_UINT16, // identity: 0 + GrB_PLUS_MONOID_UINT32, // identity: 0 + GrB_PLUS_MONOID_UINT64, // identity: 0 + GrB_PLUS_MONOID_FP32, // identity: 0 + GrB_PLUS_MONOID_FP64, // identity: 0 -GrB_Info GrB_Scalar_extractElement_BOOL // x = s -( - bool *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + // complex monoids: + GxB_PLUS_FC32_MONOID, // identity: 0 + GxB_PLUS_FC64_MONOID, // identity: 0 -GrB_Info GrB_Scalar_extractElement_INT8 // x = s -( - int8_t *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + //-------------------------------------------------------------------------- + // 12 TIMES monoids: identity value is 1, int* and uint* are terminal + //-------------------------------------------------------------------------- -GrB_Info GrB_Scalar_extractElement_UINT8 // x = s -( - uint8_t *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + // GxB_TIMES monoids, historical, use GrB_TIMES_MONOID_* instead: + GxB_TIMES_INT8_MONOID, // identity: 1 terminal: 0 + GxB_TIMES_INT16_MONOID, // identity: 1 terminal: 0 + GxB_TIMES_INT32_MONOID, // identity: 1 terminal: 0 + GxB_TIMES_INT64_MONOID, // identity: 1 terminal: 0 + GxB_TIMES_UINT8_MONOID, // identity: 1 terminal: 0 + GxB_TIMES_UINT16_MONOID, // identity: 1 terminal: 0 + GxB_TIMES_UINT32_MONOID, // identity: 1 terminal: 0 + GxB_TIMES_UINT64_MONOID, // identity: 1 terminal: 0 + GxB_TIMES_FP32_MONOID, // identity: 1 + GxB_TIMES_FP64_MONOID, // identity: 1 -GrB_Info GrB_Scalar_extractElement_INT16 // x = s -( - int16_t *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + // preferred names from the v1.3 spec: + GrB_TIMES_MONOID_INT8, // identity: 1 terminal: 0 + GrB_TIMES_MONOID_INT16, // identity: 1 terminal: 0 + GrB_TIMES_MONOID_INT32, // identity: 1 terminal: 0 + GrB_TIMES_MONOID_INT64, // identity: 1 terminal: 0 + GrB_TIMES_MONOID_UINT8, // identity: 1 terminal: 0 + GrB_TIMES_MONOID_UINT16, // identity: 1 terminal: 0 + GrB_TIMES_MONOID_UINT32, // identity: 1 terminal: 0 + GrB_TIMES_MONOID_UINT64, // identity: 1 terminal: 0 + GrB_TIMES_MONOID_FP32, // identity: 1 + GrB_TIMES_MONOID_FP64, // identity: 1 -GrB_Info GrB_Scalar_extractElement_UINT16 // x = s -( - uint16_t *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + // complex monoids: + GxB_TIMES_FC32_MONOID, // identity: 1 + GxB_TIMES_FC64_MONOID, // identity: 1 -GrB_Info GrB_Scalar_extractElement_INT32 // x = s -( - int32_t *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + //-------------------------------------------------------------------------- + // 13 ANY monoids: + //-------------------------------------------------------------------------- -GrB_Info GrB_Scalar_extractElement_UINT32 // x = s -( - uint32_t *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + GxB_ANY_BOOL_MONOID, // identity: any value terminal: any value + GxB_ANY_INT8_MONOID, // identity: any value terminal: any value + GxB_ANY_INT16_MONOID, // identity: any value terminal: any value + GxB_ANY_INT32_MONOID, // identity: any value terminal: any value + GxB_ANY_INT64_MONOID, // identity: any value terminal: any value + GxB_ANY_UINT8_MONOID, // identity: any value terminal: any value + GxB_ANY_UINT16_MONOID, // identity: any value terminal: any value + GxB_ANY_UINT32_MONOID, // identity: any value terminal: any value + GxB_ANY_UINT64_MONOID, // identity: any value terminal: any value + GxB_ANY_FP32_MONOID, // identity: any value terminal: any value + GxB_ANY_FP64_MONOID, // identity: any value terminal: any value + GxB_ANY_FC32_MONOID, // identity: any value terminal: any value + GxB_ANY_FC64_MONOID, // identity: any value terminal: any value -GrB_Info GrB_Scalar_extractElement_INT64 // x = s -( - int64_t *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + //-------------------------------------------------------------------------- + // 4 Boolean monoids: (see also the GxB_ANY_BOOL_MONOID above) + //-------------------------------------------------------------------------- -GrB_Info GrB_Scalar_extractElement_UINT64 // x = s -( - uint64_t *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + // GxB_* boolean monoids, historical, use GrB_* instead: + GxB_LOR_BOOL_MONOID, // identity: false terminal: true + GxB_LAND_BOOL_MONOID, // identity: true terminal: false + GxB_LXOR_BOOL_MONOID, // identity: false + GxB_LXNOR_BOOL_MONOID, // identity: true + GxB_EQ_BOOL_MONOID, // (another name for GrB_LXNOR_MONOID_BOOL) -GrB_Info GrB_Scalar_extractElement_FP32 // x = s -( - float *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + // preferred names from the v1.3 spec: + GrB_LOR_MONOID_BOOL, // identity: false terminal: true + GrB_LAND_MONOID_BOOL, // identity: true terminal: false + GrB_LXOR_MONOID_BOOL, // identity: false + GrB_LXNOR_MONOID_BOOL, // identity: true -GrB_Info GrB_Scalar_extractElement_FP64 // x = s -( - double *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + //-------------------------------------------------------------------------- + // 16 Bitwise-or monoids: + //-------------------------------------------------------------------------- -GrB_Info GxB_Scalar_extractElement_FC32 // x = s -( - GxB_FC32_t *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + // BOR monoids (bitwise or): + GxB_BOR_UINT8_MONOID, // identity: 0 terminal: 0xFF + GxB_BOR_UINT16_MONOID, // identity: 0 terminal: 0xFFFF + GxB_BOR_UINT32_MONOID, // identity: 0 terminal: 0xFFFFFFFF + GxB_BOR_UINT64_MONOID, // identity: 0 terminal: 0xFFFFFFFFFFFFFFFF -GrB_Info GxB_Scalar_extractElement_FC64 // x = s -( - GxB_FC64_t *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + // BAND monoids (bitwise and): + GxB_BAND_UINT8_MONOID, // identity: 0xFF terminal: 0 + GxB_BAND_UINT16_MONOID, // identity: 0xFFFF terminal: 0 + GxB_BAND_UINT32_MONOID, // identity: 0xFFFFFFFF terminal: 0 + GxB_BAND_UINT64_MONOID, // identity: 0xFFFFFFFFFFFFFFFF terminal: 0 -GrB_Info GrB_Scalar_extractElement_UDT // x = s -( - void *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; + // BXOR monoids (bitwise xor): + GxB_BXOR_UINT8_MONOID, // identity: 0 + GxB_BXOR_UINT16_MONOID, // identity: 0 + GxB_BXOR_UINT32_MONOID, // identity: 0 + GxB_BXOR_UINT64_MONOID, // identity: 0 -// historical names identical to GrB_Scalar_methods above: -GrB_Info GxB_Scalar_extractElement_BOOL (bool *x, const GrB_Scalar s) ; -GrB_Info GxB_Scalar_extractElement_INT8 (int8_t *x, const GrB_Scalar s) ; -GrB_Info GxB_Scalar_extractElement_INT16 (int16_t *x, const GrB_Scalar s) ; -GrB_Info GxB_Scalar_extractElement_INT32 (int32_t *x, const GrB_Scalar s) ; -GrB_Info GxB_Scalar_extractElement_INT64 (int64_t *x, const GrB_Scalar s) ; -GrB_Info GxB_Scalar_extractElement_UINT8 (uint8_t *x, const GrB_Scalar s) ; -GrB_Info GxB_Scalar_extractElement_UINT16 (uint16_t *x, const GrB_Scalar s) ; -GrB_Info GxB_Scalar_extractElement_UINT32 (uint32_t *x, const GrB_Scalar s) ; -GrB_Info GxB_Scalar_extractElement_UINT64 (uint64_t *x, const GrB_Scalar s) ; -GrB_Info GxB_Scalar_extractElement_FP32 (float *x, const GrB_Scalar s) ; -GrB_Info GxB_Scalar_extractElement_FP64 (double *x, const GrB_Scalar s) ; -GrB_Info GxB_Scalar_extractElement_UDT (void *x, const GrB_Scalar s) ; - -// Type-generic version: x can be a pointer to any supported C type or void * -// for a user-defined type. + // BXNOR monoids (bitwise xnor): + GxB_BXNOR_UINT8_MONOID, // identity: 0xFF + GxB_BXNOR_UINT16_MONOID, // identity: 0xFFFF + GxB_BXNOR_UINT32_MONOID, // identity: 0xFFFFFFFF + GxB_BXNOR_UINT64_MONOID ; // identity: 0xFFFFFFFFFFFFFFFF -/* +//============================================================================== +// GrB_Semiring: built-in semirings +//============================================================================== -GrB_Info GrB_Scalar_extractElement // x = s -( - *x, // user scalar extracted - const GrB_Scalar s // GrB_Scalar to extract an entry from -) ; +// Using built-in types and operators, SuiteSparse:GraphBLAS provides +// 1553 pre-defined, built-in semirings: -*/ +// 1000 semirings with a multiply operator TxT -> T where T is non-Boolean, +// from the complete cross product of: -#if GxB_STDC_VERSION >= 201112L -#define GrB_Scalar_extractElement(x,s) \ - _Generic \ - ( \ - (x), \ - GB_PCASES (GrB, Scalar_extractElement) \ - ) \ - (x, s) +// 5 monoids: MIN, MAX, PLUS, TIMES, ANY +// 20 multiply operators: +// FIRST, SECOND, PAIR (=ONEB), MIN, MAX, PLUS, MINUS, TIMES, DIV, +// RDIV, RMINUS +// ISEQ, ISNE, ISGT, ISLT, ISGE, ISLE, +// LOR, LAND, LXOR +// 10 non-Boolean real types, T +// +// Note that min_pair, max_pair, times_pair are all identical to any_pair. +// These 30 semirings are named below, but are internally remapped to +// their corresponding any_pair semiring. -// historical; use GrB_Scalar_extractElement instead: -#define GxB_Scalar_extractElement(x,s) GrB_Scalar_extractElement (x, s) -#endif +// 300 semirings with a comparator TxT -> bool, where T is +// non-Boolean, from the complete cross product of: -#endif // GB_CUDA_FOLDER +// 5 Boolean monoids: LAND, LOR, LXOR, EQ (=LXNOR), ANY +// 6 multiply operators: EQ, NE, GT, LT, GE, LE +// 10 non-Boolean real types, T -//============================================================================== -// GrB_Vector: a GraphBLAS vector -//============================================================================== +// 55 semirings with purely Boolean types, bool x bool -> bool, from the +// complete cross product of: -typedef struct GB_Vector_opaque *GrB_Vector ; +// 5 Boolean monoids LAND, LOR, LXOR, EQ (=LXNOR), ANY +// 11 multiply operators: +// FIRST, SECOND, LOR, LAND, LXOR, EQ (=LXNOR), GT, LT, GE, LE, +// PAIR (=ONEB) +// +// Note that lor_pair, land_pair, and eq_pair are all identical to +// any_pair. These 3 semirings are named below, but are internally +// remapped to any_pair_bool semiring. -#ifndef GB_CUDA_FOLDER +// 54 complex semirings: TxT -> T where T is float complex or double complex: -// These methods create, free, copy, and clear a vector. The size, nvals, -// and type methods return basic information about a vector. +// 3 complex monoids: PLUS, TIMES, ANY +// 9 complex multiply operators: +// FIRST, SECOND, PAIR (=ONEB), PLUS, MINUS, TIMES, DIV, RDIV, RMINUS +// 2 complex types +// +// Note that times_pair is identical to any_pair. +// These 2 semirings are named below, but are internally remapped to +// their corresponding any_pair semiring. -GrB_Info GrB_Vector_new // create a new vector with no entries -( - GrB_Vector *v, // handle of vector to create - GrB_Type type, // type of vector to create - GrB_Index n // vector dimension is n-by-1 - // (n must be <= GrB_INDEX_MAX+1) -) ; +// 64 bitwise semirings: TxT -> T where T is an unsigned integer: -GrB_Info GrB_Vector_dup // make an exact copy of a vector -( - GrB_Vector *w, // handle of output vector to create - const GrB_Vector u // input vector to copy -) ; +// 4 bitwise monoids: BOR, BAND, BXOR, BXNOR +// 4 bitwise multiply operators: BOR, BAND, BXOR, BXNOR +// 4 unsigned integer types: UINT8, UINT16, UINT32, UINT64 -GrB_Info GrB_Vector_clear // clear a vector of all entries; -( // type and dimension remain unchanged. - GrB_Vector v // vector to clear -) ; +// 80 positional semirings: XxX -> T where T is int64 or int32, and the type of +// X is ignored: -GrB_Info GrB_Vector_size // get the dimension of a vector -( - GrB_Index *n, // vector dimension is n-by-1 - const GrB_Vector v // vector to query -) ; +// 5 monoids: MIN, MAX, PLUS, TIMES, ANY +// 8 multiply operators: +// FIRSTI, FIRSTI1, FIRSTJ, FIRSTJ1, +// SECONDI, SECONDI1, SECONDJ, SECONDJ1 +// 2 types: int32, int64 -GrB_Info GrB_Vector_nvals // get the number of entries in a vector -( - GrB_Index *nvals, // vector has nvals entries - const GrB_Vector v // vector to query -) ; +// The ANY operator is also valid to use as a multiplicative operator in a +// semiring, but serves no purpose in that case. The ANY operator is meant as +// a fast additive operator for a monoid, that terminates, or short-circuits, +// as soon as any value is found. A valid user semiring can be constructed +// with ANY as the multiply operator, but they are not predefined below. -// historical; use GrB_get instead: -GrB_Info GxB_Vector_type (GrB_Type *type, const GrB_Vector v) ; -GrB_Info GxB_Vector_type_name (char *type_name, const GrB_Vector v) ; +// Likewise, additional built-in operators can be used as multiplicative +// operators for floating-point semirings (POW, ATAN2, HYPOT, ...) and many +// more semirings can be constructed from bitwise monoids and many integer +// binary (non-bitwise) multiplicative operators, but these are not +// pre-defined. -GrB_Info GxB_Vector_memoryUsage // return # of bytes used for a vector -( - size_t *size, // # of bytes used by the vector v - const GrB_Vector v // vector to query -) ; +// In the names below, each semiring has a name of the form GxB_add_mult_T +// where add is the additive monoid, mult is the multiply operator, and T is +// the type. The type T is always the type of x and y for the z=mult(x,y) +// operator. The monoid's three types and the ztype of the mult operator are +// always the same. This is the type T for the first set, and Boolean for +// the second and third sets of semirngs. -GrB_Info GxB_Vector_iso // return iso status of a vector -( - bool *iso, // true if the vector is iso-valued - const GrB_Vector v // vector to query -) ; +// 1553 = 1000 + 300 + 55 + 54 + 64 + 80 semirings are named below, but 35 = 30 +// + 3 + 2 are identical to the corresponding any_pair semirings of the same +// type. For positional semirings, the mulitiply ops FIRSTJ and SECONDI are +// identical, as are FIRSTJ1 and SECONDI1. These semirings still appear as +// predefined, for convenience. -GrB_Info GrB_Vector_free // free a vector -( - GrB_Vector *v // handle of vector to free -) ; +GB_GLOBAL GrB_Semiring //------------------------------------------------------------------------------ -// GrB_Vector_build +// 1000 non-Boolean semirings where all types are the same, given by suffix _T //------------------------------------------------------------------------------ -// GrB_Vector_build: w = sparse (I,1,X), but using any -// associative operator to assemble duplicate entries. + // semirings with multiply op: z = FIRST (x,y), all types x,y,z the same: + GxB_MIN_FIRST_INT8 , GxB_MAX_FIRST_INT8 , GxB_PLUS_FIRST_INT8 , GxB_TIMES_FIRST_INT8 , GxB_ANY_FIRST_INT8 , + GxB_MIN_FIRST_INT16 , GxB_MAX_FIRST_INT16 , GxB_PLUS_FIRST_INT16 , GxB_TIMES_FIRST_INT16 , GxB_ANY_FIRST_INT16 , + GxB_MIN_FIRST_INT32 , GxB_MAX_FIRST_INT32 , GxB_PLUS_FIRST_INT32 , GxB_TIMES_FIRST_INT32 , GxB_ANY_FIRST_INT32 , + GxB_MIN_FIRST_INT64 , GxB_MAX_FIRST_INT64 , GxB_PLUS_FIRST_INT64 , GxB_TIMES_FIRST_INT64 , GxB_ANY_FIRST_INT64 , + GxB_MIN_FIRST_UINT8 , GxB_MAX_FIRST_UINT8 , GxB_PLUS_FIRST_UINT8 , GxB_TIMES_FIRST_UINT8 , GxB_ANY_FIRST_UINT8 , + GxB_MIN_FIRST_UINT16 , GxB_MAX_FIRST_UINT16 , GxB_PLUS_FIRST_UINT16 , GxB_TIMES_FIRST_UINT16 , GxB_ANY_FIRST_UINT16 , + GxB_MIN_FIRST_UINT32 , GxB_MAX_FIRST_UINT32 , GxB_PLUS_FIRST_UINT32 , GxB_TIMES_FIRST_UINT32 , GxB_ANY_FIRST_UINT32 , + GxB_MIN_FIRST_UINT64 , GxB_MAX_FIRST_UINT64 , GxB_PLUS_FIRST_UINT64 , GxB_TIMES_FIRST_UINT64 , GxB_ANY_FIRST_UINT64 , + GxB_MIN_FIRST_FP32 , GxB_MAX_FIRST_FP32 , GxB_PLUS_FIRST_FP32 , GxB_TIMES_FIRST_FP32 , GxB_ANY_FIRST_FP32 , + GxB_MIN_FIRST_FP64 , GxB_MAX_FIRST_FP64 , GxB_PLUS_FIRST_FP64 , GxB_TIMES_FIRST_FP64 , GxB_ANY_FIRST_FP64 , -GrB_Info GrB_Vector_build_BOOL // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const bool *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = SECOND (x,y), all types x,y,z the same: + GxB_MIN_SECOND_INT8 , GxB_MAX_SECOND_INT8 , GxB_PLUS_SECOND_INT8 , GxB_TIMES_SECOND_INT8 , GxB_ANY_SECOND_INT8 , + GxB_MIN_SECOND_INT16 , GxB_MAX_SECOND_INT16 , GxB_PLUS_SECOND_INT16 , GxB_TIMES_SECOND_INT16 , GxB_ANY_SECOND_INT16 , + GxB_MIN_SECOND_INT32 , GxB_MAX_SECOND_INT32 , GxB_PLUS_SECOND_INT32 , GxB_TIMES_SECOND_INT32 , GxB_ANY_SECOND_INT32 , + GxB_MIN_SECOND_INT64 , GxB_MAX_SECOND_INT64 , GxB_PLUS_SECOND_INT64 , GxB_TIMES_SECOND_INT64 , GxB_ANY_SECOND_INT64 , + GxB_MIN_SECOND_UINT8 , GxB_MAX_SECOND_UINT8 , GxB_PLUS_SECOND_UINT8 , GxB_TIMES_SECOND_UINT8 , GxB_ANY_SECOND_UINT8 , + GxB_MIN_SECOND_UINT16 , GxB_MAX_SECOND_UINT16 , GxB_PLUS_SECOND_UINT16 , GxB_TIMES_SECOND_UINT16, GxB_ANY_SECOND_UINT16 , + GxB_MIN_SECOND_UINT32 , GxB_MAX_SECOND_UINT32 , GxB_PLUS_SECOND_UINT32 , GxB_TIMES_SECOND_UINT32, GxB_ANY_SECOND_UINT32 , + GxB_MIN_SECOND_UINT64 , GxB_MAX_SECOND_UINT64 , GxB_PLUS_SECOND_UINT64 , GxB_TIMES_SECOND_UINT64, GxB_ANY_SECOND_UINT64 , + GxB_MIN_SECOND_FP32 , GxB_MAX_SECOND_FP32 , GxB_PLUS_SECOND_FP32 , GxB_TIMES_SECOND_FP32 , GxB_ANY_SECOND_FP32 , + GxB_MIN_SECOND_FP64 , GxB_MAX_SECOND_FP64 , GxB_PLUS_SECOND_FP64 , GxB_TIMES_SECOND_FP64 , GxB_ANY_SECOND_FP64 , -GrB_Info GrB_Vector_build_INT8 // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const int8_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = PAIR (x,y), all types x,y,z the same: + // (note that min_pair, max_pair, times_pair are all identical to any_pair, and are marked below) + GxB_MIN_PAIR_INT8 /**/, GxB_MAX_PAIR_INT8 /**/, GxB_PLUS_PAIR_INT8 , GxB_TIMES_PAIR_INT8 /**/, GxB_ANY_PAIR_INT8 , + GxB_MIN_PAIR_INT16 /**/, GxB_MAX_PAIR_INT16 /**/, GxB_PLUS_PAIR_INT16 , GxB_TIMES_PAIR_INT16 /**/, GxB_ANY_PAIR_INT16 , + GxB_MIN_PAIR_INT32 /**/, GxB_MAX_PAIR_INT32 /**/, GxB_PLUS_PAIR_INT32 , GxB_TIMES_PAIR_INT32 /**/, GxB_ANY_PAIR_INT32 , + GxB_MIN_PAIR_INT64 /**/, GxB_MAX_PAIR_INT64 /**/, GxB_PLUS_PAIR_INT64 , GxB_TIMES_PAIR_INT64 /**/, GxB_ANY_PAIR_INT64 , + GxB_MIN_PAIR_UINT8 /**/, GxB_MAX_PAIR_UINT8 /**/, GxB_PLUS_PAIR_UINT8 , GxB_TIMES_PAIR_UINT8 /**/, GxB_ANY_PAIR_UINT8 , + GxB_MIN_PAIR_UINT16/**/, GxB_MAX_PAIR_UINT16/**/, GxB_PLUS_PAIR_UINT16 , GxB_TIMES_PAIR_UINT16/**/, GxB_ANY_PAIR_UINT16 , + GxB_MIN_PAIR_UINT32/**/, GxB_MAX_PAIR_UINT32/**/, GxB_PLUS_PAIR_UINT32 , GxB_TIMES_PAIR_UINT32/**/, GxB_ANY_PAIR_UINT32 , + GxB_MIN_PAIR_UINT64/**/, GxB_MAX_PAIR_UINT64/**/, GxB_PLUS_PAIR_UINT64 , GxB_TIMES_PAIR_UINT64/**/, GxB_ANY_PAIR_UINT64 , + GxB_MIN_PAIR_FP32 /**/, GxB_MAX_PAIR_FP32 /**/, GxB_PLUS_PAIR_FP32 , GxB_TIMES_PAIR_FP32 /**/, GxB_ANY_PAIR_FP32 , + GxB_MIN_PAIR_FP64 /**/, GxB_MAX_PAIR_FP64 /**/, GxB_PLUS_PAIR_FP64 , GxB_TIMES_PAIR_FP64 /**/, GxB_ANY_PAIR_FP64 , -GrB_Info GrB_Vector_build_UINT8 // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const uint8_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = MIN (x,y), all types x,y,z the same: + GxB_MIN_MIN_INT8 , GxB_MAX_MIN_INT8 , GxB_PLUS_MIN_INT8 , GxB_TIMES_MIN_INT8 , GxB_ANY_MIN_INT8 , + GxB_MIN_MIN_INT16 , GxB_MAX_MIN_INT16 , GxB_PLUS_MIN_INT16 , GxB_TIMES_MIN_INT16 , GxB_ANY_MIN_INT16 , + GxB_MIN_MIN_INT32 , GxB_MAX_MIN_INT32 , GxB_PLUS_MIN_INT32 , GxB_TIMES_MIN_INT32 , GxB_ANY_MIN_INT32 , + GxB_MIN_MIN_INT64 , GxB_MAX_MIN_INT64 , GxB_PLUS_MIN_INT64 , GxB_TIMES_MIN_INT64 , GxB_ANY_MIN_INT64 , + GxB_MIN_MIN_UINT8 , GxB_MAX_MIN_UINT8 , GxB_PLUS_MIN_UINT8 , GxB_TIMES_MIN_UINT8 , GxB_ANY_MIN_UINT8 , + GxB_MIN_MIN_UINT16 , GxB_MAX_MIN_UINT16 , GxB_PLUS_MIN_UINT16 , GxB_TIMES_MIN_UINT16 , GxB_ANY_MIN_UINT16 , + GxB_MIN_MIN_UINT32 , GxB_MAX_MIN_UINT32 , GxB_PLUS_MIN_UINT32 , GxB_TIMES_MIN_UINT32 , GxB_ANY_MIN_UINT32 , + GxB_MIN_MIN_UINT64 , GxB_MAX_MIN_UINT64 , GxB_PLUS_MIN_UINT64 , GxB_TIMES_MIN_UINT64 , GxB_ANY_MIN_UINT64 , + GxB_MIN_MIN_FP32 , GxB_MAX_MIN_FP32 , GxB_PLUS_MIN_FP32 , GxB_TIMES_MIN_FP32 , GxB_ANY_MIN_FP32 , + GxB_MIN_MIN_FP64 , GxB_MAX_MIN_FP64 , GxB_PLUS_MIN_FP64 , GxB_TIMES_MIN_FP64 , GxB_ANY_MIN_FP64 , -GrB_Info GrB_Vector_build_INT16 // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const int16_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = MAX (x,y), all types x,y,z the same: + GxB_MIN_MAX_INT8 , GxB_MAX_MAX_INT8 , GxB_PLUS_MAX_INT8 , GxB_TIMES_MAX_INT8 , GxB_ANY_MAX_INT8 , + GxB_MIN_MAX_INT16 , GxB_MAX_MAX_INT16 , GxB_PLUS_MAX_INT16 , GxB_TIMES_MAX_INT16 , GxB_ANY_MAX_INT16 , + GxB_MIN_MAX_INT32 , GxB_MAX_MAX_INT32 , GxB_PLUS_MAX_INT32 , GxB_TIMES_MAX_INT32 , GxB_ANY_MAX_INT32 , + GxB_MIN_MAX_INT64 , GxB_MAX_MAX_INT64 , GxB_PLUS_MAX_INT64 , GxB_TIMES_MAX_INT64 , GxB_ANY_MAX_INT64 , + GxB_MIN_MAX_UINT8 , GxB_MAX_MAX_UINT8 , GxB_PLUS_MAX_UINT8 , GxB_TIMES_MAX_UINT8 , GxB_ANY_MAX_UINT8 , + GxB_MIN_MAX_UINT16 , GxB_MAX_MAX_UINT16 , GxB_PLUS_MAX_UINT16 , GxB_TIMES_MAX_UINT16 , GxB_ANY_MAX_UINT16 , + GxB_MIN_MAX_UINT32 , GxB_MAX_MAX_UINT32 , GxB_PLUS_MAX_UINT32 , GxB_TIMES_MAX_UINT32 , GxB_ANY_MAX_UINT32 , + GxB_MIN_MAX_UINT64 , GxB_MAX_MAX_UINT64 , GxB_PLUS_MAX_UINT64 , GxB_TIMES_MAX_UINT64 , GxB_ANY_MAX_UINT64 , + GxB_MIN_MAX_FP32 , GxB_MAX_MAX_FP32 , GxB_PLUS_MAX_FP32 , GxB_TIMES_MAX_FP32 , GxB_ANY_MAX_FP32 , + GxB_MIN_MAX_FP64 , GxB_MAX_MAX_FP64 , GxB_PLUS_MAX_FP64 , GxB_TIMES_MAX_FP64 , GxB_ANY_MAX_FP64 , -GrB_Info GrB_Vector_build_UINT16 // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const uint16_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = PLUS (x,y), all types x,y,z the same: + GxB_MIN_PLUS_INT8 , GxB_MAX_PLUS_INT8 , GxB_PLUS_PLUS_INT8 , GxB_TIMES_PLUS_INT8 , GxB_ANY_PLUS_INT8 , + GxB_MIN_PLUS_INT16 , GxB_MAX_PLUS_INT16 , GxB_PLUS_PLUS_INT16 , GxB_TIMES_PLUS_INT16 , GxB_ANY_PLUS_INT16 , + GxB_MIN_PLUS_INT32 , GxB_MAX_PLUS_INT32 , GxB_PLUS_PLUS_INT32 , GxB_TIMES_PLUS_INT32 , GxB_ANY_PLUS_INT32 , + GxB_MIN_PLUS_INT64 , GxB_MAX_PLUS_INT64 , GxB_PLUS_PLUS_INT64 , GxB_TIMES_PLUS_INT64 , GxB_ANY_PLUS_INT64 , + GxB_MIN_PLUS_UINT8 , GxB_MAX_PLUS_UINT8 , GxB_PLUS_PLUS_UINT8 , GxB_TIMES_PLUS_UINT8 , GxB_ANY_PLUS_UINT8 , + GxB_MIN_PLUS_UINT16 , GxB_MAX_PLUS_UINT16 , GxB_PLUS_PLUS_UINT16 , GxB_TIMES_PLUS_UINT16 , GxB_ANY_PLUS_UINT16 , + GxB_MIN_PLUS_UINT32 , GxB_MAX_PLUS_UINT32 , GxB_PLUS_PLUS_UINT32 , GxB_TIMES_PLUS_UINT32 , GxB_ANY_PLUS_UINT32 , + GxB_MIN_PLUS_UINT64 , GxB_MAX_PLUS_UINT64 , GxB_PLUS_PLUS_UINT64 , GxB_TIMES_PLUS_UINT64 , GxB_ANY_PLUS_UINT64 , + GxB_MIN_PLUS_FP32 , GxB_MAX_PLUS_FP32 , GxB_PLUS_PLUS_FP32 , GxB_TIMES_PLUS_FP32 , GxB_ANY_PLUS_FP32 , + GxB_MIN_PLUS_FP64 , GxB_MAX_PLUS_FP64 , GxB_PLUS_PLUS_FP64 , GxB_TIMES_PLUS_FP64 , GxB_ANY_PLUS_FP64 , -GrB_Info GrB_Vector_build_INT32 // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const int32_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = MINUS (x,y), all types x,y,z the same: + GxB_MIN_MINUS_INT8 , GxB_MAX_MINUS_INT8 , GxB_PLUS_MINUS_INT8 , GxB_TIMES_MINUS_INT8 , GxB_ANY_MINUS_INT8 , + GxB_MIN_MINUS_INT16 , GxB_MAX_MINUS_INT16 , GxB_PLUS_MINUS_INT16 , GxB_TIMES_MINUS_INT16 , GxB_ANY_MINUS_INT16 , + GxB_MIN_MINUS_INT32 , GxB_MAX_MINUS_INT32 , GxB_PLUS_MINUS_INT32 , GxB_TIMES_MINUS_INT32 , GxB_ANY_MINUS_INT32 , + GxB_MIN_MINUS_INT64 , GxB_MAX_MINUS_INT64 , GxB_PLUS_MINUS_INT64 , GxB_TIMES_MINUS_INT64 , GxB_ANY_MINUS_INT64 , + GxB_MIN_MINUS_UINT8 , GxB_MAX_MINUS_UINT8 , GxB_PLUS_MINUS_UINT8 , GxB_TIMES_MINUS_UINT8 , GxB_ANY_MINUS_UINT8 , + GxB_MIN_MINUS_UINT16 , GxB_MAX_MINUS_UINT16 , GxB_PLUS_MINUS_UINT16 , GxB_TIMES_MINUS_UINT16 , GxB_ANY_MINUS_UINT16 , + GxB_MIN_MINUS_UINT32 , GxB_MAX_MINUS_UINT32 , GxB_PLUS_MINUS_UINT32 , GxB_TIMES_MINUS_UINT32 , GxB_ANY_MINUS_UINT32 , + GxB_MIN_MINUS_UINT64 , GxB_MAX_MINUS_UINT64 , GxB_PLUS_MINUS_UINT64 , GxB_TIMES_MINUS_UINT64 , GxB_ANY_MINUS_UINT64 , + GxB_MIN_MINUS_FP32 , GxB_MAX_MINUS_FP32 , GxB_PLUS_MINUS_FP32 , GxB_TIMES_MINUS_FP32 , GxB_ANY_MINUS_FP32 , + GxB_MIN_MINUS_FP64 , GxB_MAX_MINUS_FP64 , GxB_PLUS_MINUS_FP64 , GxB_TIMES_MINUS_FP64 , GxB_ANY_MINUS_FP64 , -GrB_Info GrB_Vector_build_UINT32 // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const uint32_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = TIMES (x,y), all types x,y,z the same: + GxB_MIN_TIMES_INT8 , GxB_MAX_TIMES_INT8 , GxB_PLUS_TIMES_INT8 , GxB_TIMES_TIMES_INT8 , GxB_ANY_TIMES_INT8 , + GxB_MIN_TIMES_INT16 , GxB_MAX_TIMES_INT16 , GxB_PLUS_TIMES_INT16 , GxB_TIMES_TIMES_INT16 , GxB_ANY_TIMES_INT16 , + GxB_MIN_TIMES_INT32 , GxB_MAX_TIMES_INT32 , GxB_PLUS_TIMES_INT32 , GxB_TIMES_TIMES_INT32 , GxB_ANY_TIMES_INT32 , + GxB_MIN_TIMES_INT64 , GxB_MAX_TIMES_INT64 , GxB_PLUS_TIMES_INT64 , GxB_TIMES_TIMES_INT64 , GxB_ANY_TIMES_INT64 , + GxB_MIN_TIMES_UINT8 , GxB_MAX_TIMES_UINT8 , GxB_PLUS_TIMES_UINT8 , GxB_TIMES_TIMES_UINT8 , GxB_ANY_TIMES_UINT8 , + GxB_MIN_TIMES_UINT16 , GxB_MAX_TIMES_UINT16 , GxB_PLUS_TIMES_UINT16 , GxB_TIMES_TIMES_UINT16 , GxB_ANY_TIMES_UINT16 , + GxB_MIN_TIMES_UINT32 , GxB_MAX_TIMES_UINT32 , GxB_PLUS_TIMES_UINT32 , GxB_TIMES_TIMES_UINT32 , GxB_ANY_TIMES_UINT32 , + GxB_MIN_TIMES_UINT64 , GxB_MAX_TIMES_UINT64 , GxB_PLUS_TIMES_UINT64 , GxB_TIMES_TIMES_UINT64 , GxB_ANY_TIMES_UINT64 , + GxB_MIN_TIMES_FP32 , GxB_MAX_TIMES_FP32 , GxB_PLUS_TIMES_FP32 , GxB_TIMES_TIMES_FP32 , GxB_ANY_TIMES_FP32 , + GxB_MIN_TIMES_FP64 , GxB_MAX_TIMES_FP64 , GxB_PLUS_TIMES_FP64 , GxB_TIMES_TIMES_FP64 , GxB_ANY_TIMES_FP64 , -GrB_Info GrB_Vector_build_INT64 // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const int64_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = DIV (x,y), all types x,y,z the same: + GxB_MIN_DIV_INT8 , GxB_MAX_DIV_INT8 , GxB_PLUS_DIV_INT8 , GxB_TIMES_DIV_INT8 , GxB_ANY_DIV_INT8 , + GxB_MIN_DIV_INT16 , GxB_MAX_DIV_INT16 , GxB_PLUS_DIV_INT16 , GxB_TIMES_DIV_INT16 , GxB_ANY_DIV_INT16 , + GxB_MIN_DIV_INT32 , GxB_MAX_DIV_INT32 , GxB_PLUS_DIV_INT32 , GxB_TIMES_DIV_INT32 , GxB_ANY_DIV_INT32 , + GxB_MIN_DIV_INT64 , GxB_MAX_DIV_INT64 , GxB_PLUS_DIV_INT64 , GxB_TIMES_DIV_INT64 , GxB_ANY_DIV_INT64 , + GxB_MIN_DIV_UINT8 , GxB_MAX_DIV_UINT8 , GxB_PLUS_DIV_UINT8 , GxB_TIMES_DIV_UINT8 , GxB_ANY_DIV_UINT8 , + GxB_MIN_DIV_UINT16 , GxB_MAX_DIV_UINT16 , GxB_PLUS_DIV_UINT16 , GxB_TIMES_DIV_UINT16 , GxB_ANY_DIV_UINT16 , + GxB_MIN_DIV_UINT32 , GxB_MAX_DIV_UINT32 , GxB_PLUS_DIV_UINT32 , GxB_TIMES_DIV_UINT32 , GxB_ANY_DIV_UINT32 , + GxB_MIN_DIV_UINT64 , GxB_MAX_DIV_UINT64 , GxB_PLUS_DIV_UINT64 , GxB_TIMES_DIV_UINT64 , GxB_ANY_DIV_UINT64 , + GxB_MIN_DIV_FP32 , GxB_MAX_DIV_FP32 , GxB_PLUS_DIV_FP32 , GxB_TIMES_DIV_FP32 , GxB_ANY_DIV_FP32 , + GxB_MIN_DIV_FP64 , GxB_MAX_DIV_FP64 , GxB_PLUS_DIV_FP64 , GxB_TIMES_DIV_FP64 , GxB_ANY_DIV_FP64 , -GrB_Info GrB_Vector_build_UINT64 // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const uint64_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = RDIV (x,y), all types x,y,z the same: + GxB_MIN_RDIV_INT8 , GxB_MAX_RDIV_INT8 , GxB_PLUS_RDIV_INT8 , GxB_TIMES_RDIV_INT8 , GxB_ANY_RDIV_INT8 , + GxB_MIN_RDIV_INT16 , GxB_MAX_RDIV_INT16 , GxB_PLUS_RDIV_INT16 , GxB_TIMES_RDIV_INT16 , GxB_ANY_RDIV_INT16 , + GxB_MIN_RDIV_INT32 , GxB_MAX_RDIV_INT32 , GxB_PLUS_RDIV_INT32 , GxB_TIMES_RDIV_INT32 , GxB_ANY_RDIV_INT32 , + GxB_MIN_RDIV_INT64 , GxB_MAX_RDIV_INT64 , GxB_PLUS_RDIV_INT64 , GxB_TIMES_RDIV_INT64 , GxB_ANY_RDIV_INT64 , + GxB_MIN_RDIV_UINT8 , GxB_MAX_RDIV_UINT8 , GxB_PLUS_RDIV_UINT8 , GxB_TIMES_RDIV_UINT8 , GxB_ANY_RDIV_UINT8 , + GxB_MIN_RDIV_UINT16 , GxB_MAX_RDIV_UINT16 , GxB_PLUS_RDIV_UINT16 , GxB_TIMES_RDIV_UINT16 , GxB_ANY_RDIV_UINT16 , + GxB_MIN_RDIV_UINT32 , GxB_MAX_RDIV_UINT32 , GxB_PLUS_RDIV_UINT32 , GxB_TIMES_RDIV_UINT32 , GxB_ANY_RDIV_UINT32 , + GxB_MIN_RDIV_UINT64 , GxB_MAX_RDIV_UINT64 , GxB_PLUS_RDIV_UINT64 , GxB_TIMES_RDIV_UINT64 , GxB_ANY_RDIV_UINT64 , + GxB_MIN_RDIV_FP32 , GxB_MAX_RDIV_FP32 , GxB_PLUS_RDIV_FP32 , GxB_TIMES_RDIV_FP32 , GxB_ANY_RDIV_FP32 , + GxB_MIN_RDIV_FP64 , GxB_MAX_RDIV_FP64 , GxB_PLUS_RDIV_FP64 , GxB_TIMES_RDIV_FP64 , GxB_ANY_RDIV_FP64 , -GrB_Info GrB_Vector_build_FP32 // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const float *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = RMINUS (x,y), all types x,y,z the same: + GxB_MIN_RMINUS_INT8 , GxB_MAX_RMINUS_INT8 , GxB_PLUS_RMINUS_INT8 , GxB_TIMES_RMINUS_INT8 , GxB_ANY_RMINUS_INT8 , + GxB_MIN_RMINUS_INT16 , GxB_MAX_RMINUS_INT16 , GxB_PLUS_RMINUS_INT16 , GxB_TIMES_RMINUS_INT16 , GxB_ANY_RMINUS_INT16 , + GxB_MIN_RMINUS_INT32 , GxB_MAX_RMINUS_INT32 , GxB_PLUS_RMINUS_INT32 , GxB_TIMES_RMINUS_INT32 , GxB_ANY_RMINUS_INT32 , + GxB_MIN_RMINUS_INT64 , GxB_MAX_RMINUS_INT64 , GxB_PLUS_RMINUS_INT64 , GxB_TIMES_RMINUS_INT64 , GxB_ANY_RMINUS_INT64 , + GxB_MIN_RMINUS_UINT8 , GxB_MAX_RMINUS_UINT8 , GxB_PLUS_RMINUS_UINT8 , GxB_TIMES_RMINUS_UINT8 , GxB_ANY_RMINUS_UINT8 , + GxB_MIN_RMINUS_UINT16 , GxB_MAX_RMINUS_UINT16 , GxB_PLUS_RMINUS_UINT16 , GxB_TIMES_RMINUS_UINT16, GxB_ANY_RMINUS_UINT16 , + GxB_MIN_RMINUS_UINT32 , GxB_MAX_RMINUS_UINT32 , GxB_PLUS_RMINUS_UINT32 , GxB_TIMES_RMINUS_UINT32, GxB_ANY_RMINUS_UINT32 , + GxB_MIN_RMINUS_UINT64 , GxB_MAX_RMINUS_UINT64 , GxB_PLUS_RMINUS_UINT64 , GxB_TIMES_RMINUS_UINT64, GxB_ANY_RMINUS_UINT64 , + GxB_MIN_RMINUS_FP32 , GxB_MAX_RMINUS_FP32 , GxB_PLUS_RMINUS_FP32 , GxB_TIMES_RMINUS_FP32 , GxB_ANY_RMINUS_FP32 , + GxB_MIN_RMINUS_FP64 , GxB_MAX_RMINUS_FP64 , GxB_PLUS_RMINUS_FP64 , GxB_TIMES_RMINUS_FP64 , GxB_ANY_RMINUS_FP64 , -GrB_Info GrB_Vector_build_FP64 // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const double *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = ISEQ (x,y), all types x,y,z the same: + GxB_MIN_ISEQ_INT8 , GxB_MAX_ISEQ_INT8 , GxB_PLUS_ISEQ_INT8 , GxB_TIMES_ISEQ_INT8 , GxB_ANY_ISEQ_INT8 , + GxB_MIN_ISEQ_INT16 , GxB_MAX_ISEQ_INT16 , GxB_PLUS_ISEQ_INT16 , GxB_TIMES_ISEQ_INT16 , GxB_ANY_ISEQ_INT16 , + GxB_MIN_ISEQ_INT32 , GxB_MAX_ISEQ_INT32 , GxB_PLUS_ISEQ_INT32 , GxB_TIMES_ISEQ_INT32 , GxB_ANY_ISEQ_INT32 , + GxB_MIN_ISEQ_INT64 , GxB_MAX_ISEQ_INT64 , GxB_PLUS_ISEQ_INT64 , GxB_TIMES_ISEQ_INT64 , GxB_ANY_ISEQ_INT64 , + GxB_MIN_ISEQ_UINT8 , GxB_MAX_ISEQ_UINT8 , GxB_PLUS_ISEQ_UINT8 , GxB_TIMES_ISEQ_UINT8 , GxB_ANY_ISEQ_UINT8 , + GxB_MIN_ISEQ_UINT16 , GxB_MAX_ISEQ_UINT16 , GxB_PLUS_ISEQ_UINT16 , GxB_TIMES_ISEQ_UINT16 , GxB_ANY_ISEQ_UINT16 , + GxB_MIN_ISEQ_UINT32 , GxB_MAX_ISEQ_UINT32 , GxB_PLUS_ISEQ_UINT32 , GxB_TIMES_ISEQ_UINT32 , GxB_ANY_ISEQ_UINT32 , + GxB_MIN_ISEQ_UINT64 , GxB_MAX_ISEQ_UINT64 , GxB_PLUS_ISEQ_UINT64 , GxB_TIMES_ISEQ_UINT64 , GxB_ANY_ISEQ_UINT64 , + GxB_MIN_ISEQ_FP32 , GxB_MAX_ISEQ_FP32 , GxB_PLUS_ISEQ_FP32 , GxB_TIMES_ISEQ_FP32 , GxB_ANY_ISEQ_FP32 , + GxB_MIN_ISEQ_FP64 , GxB_MAX_ISEQ_FP64 , GxB_PLUS_ISEQ_FP64 , GxB_TIMES_ISEQ_FP64 , GxB_ANY_ISEQ_FP64 , -GrB_Info GxB_Vector_build_FC32 // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const GxB_FC32_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = ISNE (x,y), all types x,y,z the same: + GxB_MIN_ISNE_INT8 , GxB_MAX_ISNE_INT8 , GxB_PLUS_ISNE_INT8 , GxB_TIMES_ISNE_INT8 , GxB_ANY_ISNE_INT8 , + GxB_MIN_ISNE_INT16 , GxB_MAX_ISNE_INT16 , GxB_PLUS_ISNE_INT16 , GxB_TIMES_ISNE_INT16 , GxB_ANY_ISNE_INT16 , + GxB_MIN_ISNE_INT32 , GxB_MAX_ISNE_INT32 , GxB_PLUS_ISNE_INT32 , GxB_TIMES_ISNE_INT32 , GxB_ANY_ISNE_INT32 , + GxB_MIN_ISNE_INT64 , GxB_MAX_ISNE_INT64 , GxB_PLUS_ISNE_INT64 , GxB_TIMES_ISNE_INT64 , GxB_ANY_ISNE_INT64 , + GxB_MIN_ISNE_UINT8 , GxB_MAX_ISNE_UINT8 , GxB_PLUS_ISNE_UINT8 , GxB_TIMES_ISNE_UINT8 , GxB_ANY_ISNE_UINT8 , + GxB_MIN_ISNE_UINT16 , GxB_MAX_ISNE_UINT16 , GxB_PLUS_ISNE_UINT16 , GxB_TIMES_ISNE_UINT16 , GxB_ANY_ISNE_UINT16 , + GxB_MIN_ISNE_UINT32 , GxB_MAX_ISNE_UINT32 , GxB_PLUS_ISNE_UINT32 , GxB_TIMES_ISNE_UINT32 , GxB_ANY_ISNE_UINT32 , + GxB_MIN_ISNE_UINT64 , GxB_MAX_ISNE_UINT64 , GxB_PLUS_ISNE_UINT64 , GxB_TIMES_ISNE_UINT64 , GxB_ANY_ISNE_UINT64 , + GxB_MIN_ISNE_FP32 , GxB_MAX_ISNE_FP32 , GxB_PLUS_ISNE_FP32 , GxB_TIMES_ISNE_FP32 , GxB_ANY_ISNE_FP32 , + GxB_MIN_ISNE_FP64 , GxB_MAX_ISNE_FP64 , GxB_PLUS_ISNE_FP64 , GxB_TIMES_ISNE_FP64 , GxB_ANY_ISNE_FP64 , -GrB_Info GxB_Vector_build_FC64 // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const GxB_FC64_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = ISGT (x,y), all types x,y,z the same: + GxB_MIN_ISGT_INT8 , GxB_MAX_ISGT_INT8 , GxB_PLUS_ISGT_INT8 , GxB_TIMES_ISGT_INT8 , GxB_ANY_ISGT_INT8 , + GxB_MIN_ISGT_INT16 , GxB_MAX_ISGT_INT16 , GxB_PLUS_ISGT_INT16 , GxB_TIMES_ISGT_INT16 , GxB_ANY_ISGT_INT16 , + GxB_MIN_ISGT_INT32 , GxB_MAX_ISGT_INT32 , GxB_PLUS_ISGT_INT32 , GxB_TIMES_ISGT_INT32 , GxB_ANY_ISGT_INT32 , + GxB_MIN_ISGT_INT64 , GxB_MAX_ISGT_INT64 , GxB_PLUS_ISGT_INT64 , GxB_TIMES_ISGT_INT64 , GxB_ANY_ISGT_INT64 , + GxB_MIN_ISGT_UINT8 , GxB_MAX_ISGT_UINT8 , GxB_PLUS_ISGT_UINT8 , GxB_TIMES_ISGT_UINT8 , GxB_ANY_ISGT_UINT8 , + GxB_MIN_ISGT_UINT16 , GxB_MAX_ISGT_UINT16 , GxB_PLUS_ISGT_UINT16 , GxB_TIMES_ISGT_UINT16 , GxB_ANY_ISGT_UINT16 , + GxB_MIN_ISGT_UINT32 , GxB_MAX_ISGT_UINT32 , GxB_PLUS_ISGT_UINT32 , GxB_TIMES_ISGT_UINT32 , GxB_ANY_ISGT_UINT32 , + GxB_MIN_ISGT_UINT64 , GxB_MAX_ISGT_UINT64 , GxB_PLUS_ISGT_UINT64 , GxB_TIMES_ISGT_UINT64 , GxB_ANY_ISGT_UINT64 , + GxB_MIN_ISGT_FP32 , GxB_MAX_ISGT_FP32 , GxB_PLUS_ISGT_FP32 , GxB_TIMES_ISGT_FP32 , GxB_ANY_ISGT_FP32 , + GxB_MIN_ISGT_FP64 , GxB_MAX_ISGT_FP64 , GxB_PLUS_ISGT_FP64 , GxB_TIMES_ISGT_FP64 , GxB_ANY_ISGT_FP64 , -GrB_Info GrB_Vector_build_UDT // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const void *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; + // semirings with multiply op: z = ISLT (x,y), all types x,y,z the same: + GxB_MIN_ISLT_INT8 , GxB_MAX_ISLT_INT8 , GxB_PLUS_ISLT_INT8 , GxB_TIMES_ISLT_INT8 , GxB_ANY_ISLT_INT8 , + GxB_MIN_ISLT_INT16 , GxB_MAX_ISLT_INT16 , GxB_PLUS_ISLT_INT16 , GxB_TIMES_ISLT_INT16 , GxB_ANY_ISLT_INT16 , + GxB_MIN_ISLT_INT32 , GxB_MAX_ISLT_INT32 , GxB_PLUS_ISLT_INT32 , GxB_TIMES_ISLT_INT32 , GxB_ANY_ISLT_INT32 , + GxB_MIN_ISLT_INT64 , GxB_MAX_ISLT_INT64 , GxB_PLUS_ISLT_INT64 , GxB_TIMES_ISLT_INT64 , GxB_ANY_ISLT_INT64 , + GxB_MIN_ISLT_UINT8 , GxB_MAX_ISLT_UINT8 , GxB_PLUS_ISLT_UINT8 , GxB_TIMES_ISLT_UINT8 , GxB_ANY_ISLT_UINT8 , + GxB_MIN_ISLT_UINT16 , GxB_MAX_ISLT_UINT16 , GxB_PLUS_ISLT_UINT16 , GxB_TIMES_ISLT_UINT16 , GxB_ANY_ISLT_UINT16 , + GxB_MIN_ISLT_UINT32 , GxB_MAX_ISLT_UINT32 , GxB_PLUS_ISLT_UINT32 , GxB_TIMES_ISLT_UINT32 , GxB_ANY_ISLT_UINT32 , + GxB_MIN_ISLT_UINT64 , GxB_MAX_ISLT_UINT64 , GxB_PLUS_ISLT_UINT64 , GxB_TIMES_ISLT_UINT64 , GxB_ANY_ISLT_UINT64 , + GxB_MIN_ISLT_FP32 , GxB_MAX_ISLT_FP32 , GxB_PLUS_ISLT_FP32 , GxB_TIMES_ISLT_FP32 , GxB_ANY_ISLT_FP32 , + GxB_MIN_ISLT_FP64 , GxB_MAX_ISLT_FP64 , GxB_PLUS_ISLT_FP64 , GxB_TIMES_ISLT_FP64 , GxB_ANY_ISLT_FP64 , -GrB_Info GxB_Vector_build_Scalar // build a vector from (i,scalar) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - GrB_Scalar scalar, // value for all tuples - GrB_Index nvals // number of tuples -) ; + // semirings with multiply op: z = ISGE (x,y), all types x,y,z the same: + GxB_MIN_ISGE_INT8 , GxB_MAX_ISGE_INT8 , GxB_PLUS_ISGE_INT8 , GxB_TIMES_ISGE_INT8 , GxB_ANY_ISGE_INT8 , + GxB_MIN_ISGE_INT16 , GxB_MAX_ISGE_INT16 , GxB_PLUS_ISGE_INT16 , GxB_TIMES_ISGE_INT16 , GxB_ANY_ISGE_INT16 , + GxB_MIN_ISGE_INT32 , GxB_MAX_ISGE_INT32 , GxB_PLUS_ISGE_INT32 , GxB_TIMES_ISGE_INT32 , GxB_ANY_ISGE_INT32 , + GxB_MIN_ISGE_INT64 , GxB_MAX_ISGE_INT64 , GxB_PLUS_ISGE_INT64 , GxB_TIMES_ISGE_INT64 , GxB_ANY_ISGE_INT64 , + GxB_MIN_ISGE_UINT8 , GxB_MAX_ISGE_UINT8 , GxB_PLUS_ISGE_UINT8 , GxB_TIMES_ISGE_UINT8 , GxB_ANY_ISGE_UINT8 , + GxB_MIN_ISGE_UINT16 , GxB_MAX_ISGE_UINT16 , GxB_PLUS_ISGE_UINT16 , GxB_TIMES_ISGE_UINT16 , GxB_ANY_ISGE_UINT16 , + GxB_MIN_ISGE_UINT32 , GxB_MAX_ISGE_UINT32 , GxB_PLUS_ISGE_UINT32 , GxB_TIMES_ISGE_UINT32 , GxB_ANY_ISGE_UINT32 , + GxB_MIN_ISGE_UINT64 , GxB_MAX_ISGE_UINT64 , GxB_PLUS_ISGE_UINT64 , GxB_TIMES_ISGE_UINT64 , GxB_ANY_ISGE_UINT64 , + GxB_MIN_ISGE_FP32 , GxB_MAX_ISGE_FP32 , GxB_PLUS_ISGE_FP32 , GxB_TIMES_ISGE_FP32 , GxB_ANY_ISGE_FP32 , + GxB_MIN_ISGE_FP64 , GxB_MAX_ISGE_FP64 , GxB_PLUS_ISGE_FP64 , GxB_TIMES_ISGE_FP64 , GxB_ANY_ISGE_FP64 , -// Type-generic version: X can be a pointer to any supported C type or void * -// for a user-defined type. + // semirings with multiply op: z = ISLE (x,y), all types x,y,z the same: + GxB_MIN_ISLE_INT8 , GxB_MAX_ISLE_INT8 , GxB_PLUS_ISLE_INT8 , GxB_TIMES_ISLE_INT8 , GxB_ANY_ISLE_INT8 , + GxB_MIN_ISLE_INT16 , GxB_MAX_ISLE_INT16 , GxB_PLUS_ISLE_INT16 , GxB_TIMES_ISLE_INT16 , GxB_ANY_ISLE_INT16 , + GxB_MIN_ISLE_INT32 , GxB_MAX_ISLE_INT32 , GxB_PLUS_ISLE_INT32 , GxB_TIMES_ISLE_INT32 , GxB_ANY_ISLE_INT32 , + GxB_MIN_ISLE_INT64 , GxB_MAX_ISLE_INT64 , GxB_PLUS_ISLE_INT64 , GxB_TIMES_ISLE_INT64 , GxB_ANY_ISLE_INT64 , + GxB_MIN_ISLE_UINT8 , GxB_MAX_ISLE_UINT8 , GxB_PLUS_ISLE_UINT8 , GxB_TIMES_ISLE_UINT8 , GxB_ANY_ISLE_UINT8 , + GxB_MIN_ISLE_UINT16 , GxB_MAX_ISLE_UINT16 , GxB_PLUS_ISLE_UINT16 , GxB_TIMES_ISLE_UINT16 , GxB_ANY_ISLE_UINT16 , + GxB_MIN_ISLE_UINT32 , GxB_MAX_ISLE_UINT32 , GxB_PLUS_ISLE_UINT32 , GxB_TIMES_ISLE_UINT32 , GxB_ANY_ISLE_UINT32 , + GxB_MIN_ISLE_UINT64 , GxB_MAX_ISLE_UINT64 , GxB_PLUS_ISLE_UINT64 , GxB_TIMES_ISLE_UINT64 , GxB_ANY_ISLE_UINT64 , + GxB_MIN_ISLE_FP32 , GxB_MAX_ISLE_FP32 , GxB_PLUS_ISLE_FP32 , GxB_TIMES_ISLE_FP32 , GxB_ANY_ISLE_FP32 , + GxB_MIN_ISLE_FP64 , GxB_MAX_ISLE_FP64 , GxB_PLUS_ISLE_FP64 , GxB_TIMES_ISLE_FP64 , GxB_ANY_ISLE_FP64 , -/* -GrB_Info GrB_Vector_build // build a vector from (I,X) tuples -( - GrB_Vector w, // vector to build - const GrB_Index *Ilist, // array of row indices of tuples - const *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; -*/ + // semirings with multiply op: z = LOR (x,y), all types x,y,z the same: + GxB_MIN_LOR_INT8 , GxB_MAX_LOR_INT8 , GxB_PLUS_LOR_INT8 , GxB_TIMES_LOR_INT8 , GxB_ANY_LOR_INT8 , + GxB_MIN_LOR_INT16 , GxB_MAX_LOR_INT16 , GxB_PLUS_LOR_INT16 , GxB_TIMES_LOR_INT16 , GxB_ANY_LOR_INT16 , + GxB_MIN_LOR_INT32 , GxB_MAX_LOR_INT32 , GxB_PLUS_LOR_INT32 , GxB_TIMES_LOR_INT32 , GxB_ANY_LOR_INT32 , + GxB_MIN_LOR_INT64 , GxB_MAX_LOR_INT64 , GxB_PLUS_LOR_INT64 , GxB_TIMES_LOR_INT64 , GxB_ANY_LOR_INT64 , + GxB_MIN_LOR_UINT8 , GxB_MAX_LOR_UINT8 , GxB_PLUS_LOR_UINT8 , GxB_TIMES_LOR_UINT8 , GxB_ANY_LOR_UINT8 , + GxB_MIN_LOR_UINT16 , GxB_MAX_LOR_UINT16 , GxB_PLUS_LOR_UINT16 , GxB_TIMES_LOR_UINT16 , GxB_ANY_LOR_UINT16 , + GxB_MIN_LOR_UINT32 , GxB_MAX_LOR_UINT32 , GxB_PLUS_LOR_UINT32 , GxB_TIMES_LOR_UINT32 , GxB_ANY_LOR_UINT32 , + GxB_MIN_LOR_UINT64 , GxB_MAX_LOR_UINT64 , GxB_PLUS_LOR_UINT64 , GxB_TIMES_LOR_UINT64 , GxB_ANY_LOR_UINT64 , + GxB_MIN_LOR_FP32 , GxB_MAX_LOR_FP32 , GxB_PLUS_LOR_FP32 , GxB_TIMES_LOR_FP32 , GxB_ANY_LOR_FP32 , + GxB_MIN_LOR_FP64 , GxB_MAX_LOR_FP64 , GxB_PLUS_LOR_FP64 , GxB_TIMES_LOR_FP64 , GxB_ANY_LOR_FP64 , -#if GxB_STDC_VERSION >= 201112L -#define GrB_Vector_build(w,Ilist,X,nvals,dup) \ - _Generic \ - ( \ - (X), \ - GB_PCASES (GrB, Vector_build) \ - ) \ - (w, Ilist, ((const void *) (X)), nvals, dup) -#endif + // semirings with multiply op: z = LAND (x,y), all types x,y,z the same: + GxB_MIN_LAND_INT8 , GxB_MAX_LAND_INT8 , GxB_PLUS_LAND_INT8 , GxB_TIMES_LAND_INT8 , GxB_ANY_LAND_INT8 , + GxB_MIN_LAND_INT16 , GxB_MAX_LAND_INT16 , GxB_PLUS_LAND_INT16 , GxB_TIMES_LAND_INT16 , GxB_ANY_LAND_INT16 , + GxB_MIN_LAND_INT32 , GxB_MAX_LAND_INT32 , GxB_PLUS_LAND_INT32 , GxB_TIMES_LAND_INT32 , GxB_ANY_LAND_INT32 , + GxB_MIN_LAND_INT64 , GxB_MAX_LAND_INT64 , GxB_PLUS_LAND_INT64 , GxB_TIMES_LAND_INT64 , GxB_ANY_LAND_INT64 , + GxB_MIN_LAND_UINT8 , GxB_MAX_LAND_UINT8 , GxB_PLUS_LAND_UINT8 , GxB_TIMES_LAND_UINT8 , GxB_ANY_LAND_UINT8 , + GxB_MIN_LAND_UINT16 , GxB_MAX_LAND_UINT16 , GxB_PLUS_LAND_UINT16 , GxB_TIMES_LAND_UINT16 , GxB_ANY_LAND_UINT16 , + GxB_MIN_LAND_UINT32 , GxB_MAX_LAND_UINT32 , GxB_PLUS_LAND_UINT32 , GxB_TIMES_LAND_UINT32 , GxB_ANY_LAND_UINT32 , + GxB_MIN_LAND_UINT64 , GxB_MAX_LAND_UINT64 , GxB_PLUS_LAND_UINT64 , GxB_TIMES_LAND_UINT64 , GxB_ANY_LAND_UINT64 , + GxB_MIN_LAND_FP32 , GxB_MAX_LAND_FP32 , GxB_PLUS_LAND_FP32 , GxB_TIMES_LAND_FP32 , GxB_ANY_LAND_FP32 , + GxB_MIN_LAND_FP64 , GxB_MAX_LAND_FP64 , GxB_PLUS_LAND_FP64 , GxB_TIMES_LAND_FP64 , GxB_ANY_LAND_FP64 , + + // semirings with multiply op: z = LXOR (x,y), all types x,y,z the same: + GxB_MIN_LXOR_INT8 , GxB_MAX_LXOR_INT8 , GxB_PLUS_LXOR_INT8 , GxB_TIMES_LXOR_INT8 , GxB_ANY_LXOR_INT8 , + GxB_MIN_LXOR_INT16 , GxB_MAX_LXOR_INT16 , GxB_PLUS_LXOR_INT16 , GxB_TIMES_LXOR_INT16 , GxB_ANY_LXOR_INT16 , + GxB_MIN_LXOR_INT32 , GxB_MAX_LXOR_INT32 , GxB_PLUS_LXOR_INT32 , GxB_TIMES_LXOR_INT32 , GxB_ANY_LXOR_INT32 , + GxB_MIN_LXOR_INT64 , GxB_MAX_LXOR_INT64 , GxB_PLUS_LXOR_INT64 , GxB_TIMES_LXOR_INT64 , GxB_ANY_LXOR_INT64 , + GxB_MIN_LXOR_UINT8 , GxB_MAX_LXOR_UINT8 , GxB_PLUS_LXOR_UINT8 , GxB_TIMES_LXOR_UINT8 , GxB_ANY_LXOR_UINT8 , + GxB_MIN_LXOR_UINT16 , GxB_MAX_LXOR_UINT16 , GxB_PLUS_LXOR_UINT16 , GxB_TIMES_LXOR_UINT16 , GxB_ANY_LXOR_UINT16 , + GxB_MIN_LXOR_UINT32 , GxB_MAX_LXOR_UINT32 , GxB_PLUS_LXOR_UINT32 , GxB_TIMES_LXOR_UINT32 , GxB_ANY_LXOR_UINT32 , + GxB_MIN_LXOR_UINT64 , GxB_MAX_LXOR_UINT64 , GxB_PLUS_LXOR_UINT64 , GxB_TIMES_LXOR_UINT64 , GxB_ANY_LXOR_UINT64 , + GxB_MIN_LXOR_FP32 , GxB_MAX_LXOR_FP32 , GxB_PLUS_LXOR_FP32 , GxB_TIMES_LXOR_FP32 , GxB_ANY_LXOR_FP32 , + GxB_MIN_LXOR_FP64 , GxB_MAX_LXOR_FP64 , GxB_PLUS_LXOR_FP64 , GxB_TIMES_LXOR_FP64 , GxB_ANY_LXOR_FP64 , //------------------------------------------------------------------------------ -// GrB_Vector_setElement -//------------------------------------------------------------------------------ +// 300 semirings with a comparator TxT -> bool, where T is non-Boolean +//------------------------------------------------------------------------------ -// Set a single scalar in a vector, w(i) = x, typecasting from the type of x to -// the type of w as needed. + // In the 4th column the GxB_EQ_*_* semirings could also be called + // GxB_LXNOR_*_*, since the EQ and LXNOR boolean operators are identical + // but those names are not included. -GrB_Info GrB_Vector_setElement_BOOL // w(i) = x -( - GrB_Vector w, // vector to modify - bool x, // scalar to assign to w(i) - GrB_Index i // row index -) ; + // semirings with multiply op: z = EQ (x,y), where z is boolean and x,y are given by the suffix: + GxB_LOR_EQ_INT8 , GxB_LAND_EQ_INT8 , GxB_LXOR_EQ_INT8 , GxB_EQ_EQ_INT8 , GxB_ANY_EQ_INT8 , + GxB_LOR_EQ_INT16 , GxB_LAND_EQ_INT16 , GxB_LXOR_EQ_INT16 , GxB_EQ_EQ_INT16 , GxB_ANY_EQ_INT16 , + GxB_LOR_EQ_INT32 , GxB_LAND_EQ_INT32 , GxB_LXOR_EQ_INT32 , GxB_EQ_EQ_INT32 , GxB_ANY_EQ_INT32 , + GxB_LOR_EQ_INT64 , GxB_LAND_EQ_INT64 , GxB_LXOR_EQ_INT64 , GxB_EQ_EQ_INT64 , GxB_ANY_EQ_INT64 , + GxB_LOR_EQ_UINT8 , GxB_LAND_EQ_UINT8 , GxB_LXOR_EQ_UINT8 , GxB_EQ_EQ_UINT8 , GxB_ANY_EQ_UINT8 , + GxB_LOR_EQ_UINT16 , GxB_LAND_EQ_UINT16 , GxB_LXOR_EQ_UINT16 , GxB_EQ_EQ_UINT16 , GxB_ANY_EQ_UINT16 , + GxB_LOR_EQ_UINT32 , GxB_LAND_EQ_UINT32 , GxB_LXOR_EQ_UINT32 , GxB_EQ_EQ_UINT32 , GxB_ANY_EQ_UINT32 , + GxB_LOR_EQ_UINT64 , GxB_LAND_EQ_UINT64 , GxB_LXOR_EQ_UINT64 , GxB_EQ_EQ_UINT64 , GxB_ANY_EQ_UINT64 , + GxB_LOR_EQ_FP32 , GxB_LAND_EQ_FP32 , GxB_LXOR_EQ_FP32 , GxB_EQ_EQ_FP32 , GxB_ANY_EQ_FP32 , + GxB_LOR_EQ_FP64 , GxB_LAND_EQ_FP64 , GxB_LXOR_EQ_FP64 , GxB_EQ_EQ_FP64 , GxB_ANY_EQ_FP64 , -GrB_Info GrB_Vector_setElement_INT8 // w(i) = x -( - GrB_Vector w, // vector to modify - int8_t x, // scalar to assign to w(i) - GrB_Index i // row index -) ; + // semirings with multiply op: z = NE (x,y), where z is boolean and x,y are given by the suffix: + GxB_LOR_NE_INT8 , GxB_LAND_NE_INT8 , GxB_LXOR_NE_INT8 , GxB_EQ_NE_INT8 , GxB_ANY_NE_INT8 , + GxB_LOR_NE_INT16 , GxB_LAND_NE_INT16 , GxB_LXOR_NE_INT16 , GxB_EQ_NE_INT16 , GxB_ANY_NE_INT16 , + GxB_LOR_NE_INT32 , GxB_LAND_NE_INT32 , GxB_LXOR_NE_INT32 , GxB_EQ_NE_INT32 , GxB_ANY_NE_INT32 , + GxB_LOR_NE_INT64 , GxB_LAND_NE_INT64 , GxB_LXOR_NE_INT64 , GxB_EQ_NE_INT64 , GxB_ANY_NE_INT64 , + GxB_LOR_NE_UINT8 , GxB_LAND_NE_UINT8 , GxB_LXOR_NE_UINT8 , GxB_EQ_NE_UINT8 , GxB_ANY_NE_UINT8 , + GxB_LOR_NE_UINT16 , GxB_LAND_NE_UINT16 , GxB_LXOR_NE_UINT16 , GxB_EQ_NE_UINT16 , GxB_ANY_NE_UINT16 , + GxB_LOR_NE_UINT32 , GxB_LAND_NE_UINT32 , GxB_LXOR_NE_UINT32 , GxB_EQ_NE_UINT32 , GxB_ANY_NE_UINT32 , + GxB_LOR_NE_UINT64 , GxB_LAND_NE_UINT64 , GxB_LXOR_NE_UINT64 , GxB_EQ_NE_UINT64 , GxB_ANY_NE_UINT64 , + GxB_LOR_NE_FP32 , GxB_LAND_NE_FP32 , GxB_LXOR_NE_FP32 , GxB_EQ_NE_FP32 , GxB_ANY_NE_FP32 , + GxB_LOR_NE_FP64 , GxB_LAND_NE_FP64 , GxB_LXOR_NE_FP64 , GxB_EQ_NE_FP64 , GxB_ANY_NE_FP64 , -GrB_Info GrB_Vector_setElement_UINT8 // w(i) = x -( - GrB_Vector w, // vector to modify - uint8_t x, // scalar to assign to w(i) - GrB_Index i // row index -) ; + // semirings with multiply op: z = GT (x,y), where z is boolean and x,y are given by the suffix: + GxB_LOR_GT_INT8 , GxB_LAND_GT_INT8 , GxB_LXOR_GT_INT8 , GxB_EQ_GT_INT8 , GxB_ANY_GT_INT8 , + GxB_LOR_GT_INT16 , GxB_LAND_GT_INT16 , GxB_LXOR_GT_INT16 , GxB_EQ_GT_INT16 , GxB_ANY_GT_INT16 , + GxB_LOR_GT_INT32 , GxB_LAND_GT_INT32 , GxB_LXOR_GT_INT32 , GxB_EQ_GT_INT32 , GxB_ANY_GT_INT32 , + GxB_LOR_GT_INT64 , GxB_LAND_GT_INT64 , GxB_LXOR_GT_INT64 , GxB_EQ_GT_INT64 , GxB_ANY_GT_INT64 , + GxB_LOR_GT_UINT8 , GxB_LAND_GT_UINT8 , GxB_LXOR_GT_UINT8 , GxB_EQ_GT_UINT8 , GxB_ANY_GT_UINT8 , + GxB_LOR_GT_UINT16 , GxB_LAND_GT_UINT16 , GxB_LXOR_GT_UINT16 , GxB_EQ_GT_UINT16 , GxB_ANY_GT_UINT16 , + GxB_LOR_GT_UINT32 , GxB_LAND_GT_UINT32 , GxB_LXOR_GT_UINT32 , GxB_EQ_GT_UINT32 , GxB_ANY_GT_UINT32 , + GxB_LOR_GT_UINT64 , GxB_LAND_GT_UINT64 , GxB_LXOR_GT_UINT64 , GxB_EQ_GT_UINT64 , GxB_ANY_GT_UINT64 , + GxB_LOR_GT_FP32 , GxB_LAND_GT_FP32 , GxB_LXOR_GT_FP32 , GxB_EQ_GT_FP32 , GxB_ANY_GT_FP32 , + GxB_LOR_GT_FP64 , GxB_LAND_GT_FP64 , GxB_LXOR_GT_FP64 , GxB_EQ_GT_FP64 , GxB_ANY_GT_FP64 , -GrB_Info GrB_Vector_setElement_INT16 // w(i) = x -( - GrB_Vector w, // vector to modify - int16_t x, // scalar to assign to w(i) - GrB_Index i // row index -) ; + // semirings with multiply op: z = LT (x,y), where z is boolean and x,y are given by the suffix: + GxB_LOR_LT_INT8 , GxB_LAND_LT_INT8 , GxB_LXOR_LT_INT8 , GxB_EQ_LT_INT8 , GxB_ANY_LT_INT8 , + GxB_LOR_LT_INT16 , GxB_LAND_LT_INT16 , GxB_LXOR_LT_INT16 , GxB_EQ_LT_INT16 , GxB_ANY_LT_INT16 , + GxB_LOR_LT_INT32 , GxB_LAND_LT_INT32 , GxB_LXOR_LT_INT32 , GxB_EQ_LT_INT32 , GxB_ANY_LT_INT32 , + GxB_LOR_LT_INT64 , GxB_LAND_LT_INT64 , GxB_LXOR_LT_INT64 , GxB_EQ_LT_INT64 , GxB_ANY_LT_INT64 , + GxB_LOR_LT_UINT8 , GxB_LAND_LT_UINT8 , GxB_LXOR_LT_UINT8 , GxB_EQ_LT_UINT8 , GxB_ANY_LT_UINT8 , + GxB_LOR_LT_UINT16 , GxB_LAND_LT_UINT16 , GxB_LXOR_LT_UINT16 , GxB_EQ_LT_UINT16 , GxB_ANY_LT_UINT16 , + GxB_LOR_LT_UINT32 , GxB_LAND_LT_UINT32 , GxB_LXOR_LT_UINT32 , GxB_EQ_LT_UINT32 , GxB_ANY_LT_UINT32 , + GxB_LOR_LT_UINT64 , GxB_LAND_LT_UINT64 , GxB_LXOR_LT_UINT64 , GxB_EQ_LT_UINT64 , GxB_ANY_LT_UINT64 , + GxB_LOR_LT_FP32 , GxB_LAND_LT_FP32 , GxB_LXOR_LT_FP32 , GxB_EQ_LT_FP32 , GxB_ANY_LT_FP32 , + GxB_LOR_LT_FP64 , GxB_LAND_LT_FP64 , GxB_LXOR_LT_FP64 , GxB_EQ_LT_FP64 , GxB_ANY_LT_FP64 , -GrB_Info GrB_Vector_setElement_UINT16 // w(i) = x -( - GrB_Vector w, // vector to modify - uint16_t x, // scalar to assign to w(i) - GrB_Index i // row index -) ; + // semirings with multiply op: z = GE (x,y), where z is boolean and x,y are given by the suffix: + GxB_LOR_GE_INT8 , GxB_LAND_GE_INT8 , GxB_LXOR_GE_INT8 , GxB_EQ_GE_INT8 , GxB_ANY_GE_INT8 , + GxB_LOR_GE_INT16 , GxB_LAND_GE_INT16 , GxB_LXOR_GE_INT16 , GxB_EQ_GE_INT16 , GxB_ANY_GE_INT16 , + GxB_LOR_GE_INT32 , GxB_LAND_GE_INT32 , GxB_LXOR_GE_INT32 , GxB_EQ_GE_INT32 , GxB_ANY_GE_INT32 , + GxB_LOR_GE_INT64 , GxB_LAND_GE_INT64 , GxB_LXOR_GE_INT64 , GxB_EQ_GE_INT64 , GxB_ANY_GE_INT64 , + GxB_LOR_GE_UINT8 , GxB_LAND_GE_UINT8 , GxB_LXOR_GE_UINT8 , GxB_EQ_GE_UINT8 , GxB_ANY_GE_UINT8 , + GxB_LOR_GE_UINT16 , GxB_LAND_GE_UINT16 , GxB_LXOR_GE_UINT16 , GxB_EQ_GE_UINT16 , GxB_ANY_GE_UINT16 , + GxB_LOR_GE_UINT32 , GxB_LAND_GE_UINT32 , GxB_LXOR_GE_UINT32 , GxB_EQ_GE_UINT32 , GxB_ANY_GE_UINT32 , + GxB_LOR_GE_UINT64 , GxB_LAND_GE_UINT64 , GxB_LXOR_GE_UINT64 , GxB_EQ_GE_UINT64 , GxB_ANY_GE_UINT64 , + GxB_LOR_GE_FP32 , GxB_LAND_GE_FP32 , GxB_LXOR_GE_FP32 , GxB_EQ_GE_FP32 , GxB_ANY_GE_FP32 , + GxB_LOR_GE_FP64 , GxB_LAND_GE_FP64 , GxB_LXOR_GE_FP64 , GxB_EQ_GE_FP64 , GxB_ANY_GE_FP64 , -GrB_Info GrB_Vector_setElement_INT32 // w(i) = x -( - GrB_Vector w, // vector to modify - int32_t x, // scalar to assign to w(i) - GrB_Index i // row index -) ; + // semirings with multiply op: z = LE (x,y), where z is boolean and x,y are given by the suffix: + GxB_LOR_LE_INT8 , GxB_LAND_LE_INT8 , GxB_LXOR_LE_INT8 , GxB_EQ_LE_INT8 , GxB_ANY_LE_INT8 , + GxB_LOR_LE_INT16 , GxB_LAND_LE_INT16 , GxB_LXOR_LE_INT16 , GxB_EQ_LE_INT16 , GxB_ANY_LE_INT16 , + GxB_LOR_LE_INT32 , GxB_LAND_LE_INT32 , GxB_LXOR_LE_INT32 , GxB_EQ_LE_INT32 , GxB_ANY_LE_INT32 , + GxB_LOR_LE_INT64 , GxB_LAND_LE_INT64 , GxB_LXOR_LE_INT64 , GxB_EQ_LE_INT64 , GxB_ANY_LE_INT64 , + GxB_LOR_LE_UINT8 , GxB_LAND_LE_UINT8 , GxB_LXOR_LE_UINT8 , GxB_EQ_LE_UINT8 , GxB_ANY_LE_UINT8 , + GxB_LOR_LE_UINT16 , GxB_LAND_LE_UINT16 , GxB_LXOR_LE_UINT16 , GxB_EQ_LE_UINT16 , GxB_ANY_LE_UINT16 , + GxB_LOR_LE_UINT32 , GxB_LAND_LE_UINT32 , GxB_LXOR_LE_UINT32 , GxB_EQ_LE_UINT32 , GxB_ANY_LE_UINT32 , + GxB_LOR_LE_UINT64 , GxB_LAND_LE_UINT64 , GxB_LXOR_LE_UINT64 , GxB_EQ_LE_UINT64 , GxB_ANY_LE_UINT64 , + GxB_LOR_LE_FP32 , GxB_LAND_LE_FP32 , GxB_LXOR_LE_FP32 , GxB_EQ_LE_FP32 , GxB_ANY_LE_FP32 , + GxB_LOR_LE_FP64 , GxB_LAND_LE_FP64 , GxB_LXOR_LE_FP64 , GxB_EQ_LE_FP64 , GxB_ANY_LE_FP64 , -GrB_Info GrB_Vector_setElement_UINT32 // w(i) = x -( - GrB_Vector w, // vector to modify - uint32_t x, // scalar to assign to w(i) - GrB_Index i // row index -) ; +//------------------------------------------------------------------------------ +// 55 semirings with purely Boolean types, bool x bool -> bool +//------------------------------------------------------------------------------ -GrB_Info GrB_Vector_setElement_INT64 // w(i) = x -( - GrB_Vector w, // vector to modify - int64_t x, // scalar to assign to w(i) - GrB_Index i // row index -) ; + // Note that lor_pair, land_pair, and eq_pair are all identical to any_pair. + // These 3 are marked below. GxB_EQ_*_BOOL could be called + // GxB_LXNOR_*_BOOL, and GxB_*_EQ_BOOL could be called GxB_*_LXNOR_BOOL, + // but those names are not included. -GrB_Info GrB_Vector_setElement_UINT64 // w(i) = x -( - GrB_Vector w, // vector to modify - uint64_t x, // scalar to assign to w(i) - GrB_Index i // row index -) ; + // purely boolean semirings in the form GxB_(add monoid)_(multiply operator)_BOOL: + GxB_LOR_FIRST_BOOL , GxB_LAND_FIRST_BOOL , GxB_LXOR_FIRST_BOOL , GxB_EQ_FIRST_BOOL , GxB_ANY_FIRST_BOOL , + GxB_LOR_SECOND_BOOL , GxB_LAND_SECOND_BOOL , GxB_LXOR_SECOND_BOOL , GxB_EQ_SECOND_BOOL , GxB_ANY_SECOND_BOOL , + GxB_LOR_PAIR_BOOL/**/ , GxB_LAND_PAIR_BOOL/**/ , GxB_LXOR_PAIR_BOOL , GxB_EQ_PAIR_BOOL/**/ , GxB_ANY_PAIR_BOOL , + GxB_LOR_LOR_BOOL , GxB_LAND_LOR_BOOL , GxB_LXOR_LOR_BOOL , GxB_EQ_LOR_BOOL , GxB_ANY_LOR_BOOL , + GxB_LOR_LAND_BOOL , GxB_LAND_LAND_BOOL , GxB_LXOR_LAND_BOOL , GxB_EQ_LAND_BOOL , GxB_ANY_LAND_BOOL , + GxB_LOR_LXOR_BOOL , GxB_LAND_LXOR_BOOL , GxB_LXOR_LXOR_BOOL , GxB_EQ_LXOR_BOOL , GxB_ANY_LXOR_BOOL , + GxB_LOR_EQ_BOOL , GxB_LAND_EQ_BOOL , GxB_LXOR_EQ_BOOL , GxB_EQ_EQ_BOOL , GxB_ANY_EQ_BOOL , + GxB_LOR_GT_BOOL , GxB_LAND_GT_BOOL , GxB_LXOR_GT_BOOL , GxB_EQ_GT_BOOL , GxB_ANY_GT_BOOL , + GxB_LOR_LT_BOOL , GxB_LAND_LT_BOOL , GxB_LXOR_LT_BOOL , GxB_EQ_LT_BOOL , GxB_ANY_LT_BOOL , + GxB_LOR_GE_BOOL , GxB_LAND_GE_BOOL , GxB_LXOR_GE_BOOL , GxB_EQ_GE_BOOL , GxB_ANY_GE_BOOL , + GxB_LOR_LE_BOOL , GxB_LAND_LE_BOOL , GxB_LXOR_LE_BOOL , GxB_EQ_LE_BOOL , GxB_ANY_LE_BOOL , -GrB_Info GrB_Vector_setElement_FP32 // w(i) = x -( - GrB_Vector w, // vector to modify - float x, // scalar to assign to w(i) - GrB_Index i // row index -) ; +//------------------------------------------------------------------------------ +// 54 complex semirings +//------------------------------------------------------------------------------ -GrB_Info GrB_Vector_setElement_FP64 // w(i) = x -( - GrB_Vector w, // vector to modify - double x, // scalar to assign to w(i) - GrB_Index i // row index -) ; + // 3 monoids (plus, times, any), 2 types (FC32 and FC64), and 9 + // multiplicative operators. -GrB_Info GxB_Vector_setElement_FC32 // w(i) = x -( - GrB_Vector w, // vector to modify - GxB_FC32_t x, // scalar to assign to w(i) - GrB_Index i // row index -) ; + // Note that times_pair is identical to any_pair. + // These 2 are marked below. -GrB_Info GxB_Vector_setElement_FC64 // w(i) = x -( - GrB_Vector w, // vector to modify - GxB_FC64_t x, // scalar to assign to w(i) - GrB_Index i // row index -) ; + GxB_PLUS_FIRST_FC32 , GxB_TIMES_FIRST_FC32 , GxB_ANY_FIRST_FC32 , + GxB_PLUS_FIRST_FC64 , GxB_TIMES_FIRST_FC64 , GxB_ANY_FIRST_FC64 , -GrB_Info GrB_Vector_setElement_UDT // w(i) = x -( - GrB_Vector w, // vector to modify - void *x, // scalar to assign to w(i) - GrB_Index i // row index -) ; + GxB_PLUS_SECOND_FC32 , GxB_TIMES_SECOND_FC32 , GxB_ANY_SECOND_FC32 , + GxB_PLUS_SECOND_FC64 , GxB_TIMES_SECOND_FC64 , GxB_ANY_SECOND_FC64 , -GrB_Info GrB_Vector_setElement_Scalar // w(i) = x -( - GrB_Vector w, // vector to modify - GrB_Scalar x, // scalar to assign to w(i) - GrB_Index i // row index -) ; + GxB_PLUS_PAIR_FC32 , GxB_TIMES_PAIR_FC32/**/, GxB_ANY_PAIR_FC32 , + GxB_PLUS_PAIR_FC64 , GxB_TIMES_PAIR_FC64/**/, GxB_ANY_PAIR_FC64 , -// Type-generic version: x can be any supported C type or void * for a -// user-defined type. + GxB_PLUS_PLUS_FC32 , GxB_TIMES_PLUS_FC32 , GxB_ANY_PLUS_FC32 , + GxB_PLUS_PLUS_FC64 , GxB_TIMES_PLUS_FC64 , GxB_ANY_PLUS_FC64 , -/* -GrB_Info GrB_Vector_setElement // w(i) = x -( - GrB_Vector w, // vector to modify - x, // scalar to assign to w(i) - GrB_Index i // row index -) ; -*/ + GxB_PLUS_MINUS_FC32 , GxB_TIMES_MINUS_FC32 , GxB_ANY_MINUS_FC32 , + GxB_PLUS_MINUS_FC64 , GxB_TIMES_MINUS_FC64 , GxB_ANY_MINUS_FC64 , -#if GxB_STDC_VERSION >= 201112L -#define GrB_Vector_setElement(w,x,i) \ - _Generic \ - ( \ - (x), \ - GB_CASES (GrB, Vector_setElement), \ - default: GrB_Vector_setElement_Scalar \ - ) \ - (w, x, i) -#endif + GxB_PLUS_TIMES_FC32 , GxB_TIMES_TIMES_FC32 , GxB_ANY_TIMES_FC32 , + GxB_PLUS_TIMES_FC64 , GxB_TIMES_TIMES_FC64 , GxB_ANY_TIMES_FC64 , + + GxB_PLUS_DIV_FC32 , GxB_TIMES_DIV_FC32 , GxB_ANY_DIV_FC32 , + GxB_PLUS_DIV_FC64 , GxB_TIMES_DIV_FC64 , GxB_ANY_DIV_FC64 , + + GxB_PLUS_RDIV_FC32 , GxB_TIMES_RDIV_FC32 , GxB_ANY_RDIV_FC32 , + GxB_PLUS_RDIV_FC64 , GxB_TIMES_RDIV_FC64 , GxB_ANY_RDIV_FC64 , + + GxB_PLUS_RMINUS_FC32 , GxB_TIMES_RMINUS_FC32 , GxB_ANY_RMINUS_FC32 , + GxB_PLUS_RMINUS_FC64 , GxB_TIMES_RMINUS_FC64 , GxB_ANY_RMINUS_FC64 , //------------------------------------------------------------------------------ -// GrB_Vector_extractElement +// 64 bitwise semirings //------------------------------------------------------------------------------ -// Extract a single entry from a vector, x = v(i), typecasting from the type of -// v to the type of x as needed. - -GrB_Info GrB_Vector_extractElement_BOOL // x = v(i) -( - bool *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + // monoids: (BOR, BAND, BXOR, BXNOR) x + // mult: (BOR, BAND, BXOR, BXNOR) x + // types: (UINT8, UINT16, UINT32, UINT64) -GrB_Info GrB_Vector_extractElement_INT8 // x = v(i) -( - int8_t *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + GxB_BOR_BOR_UINT8 , GxB_BOR_BOR_UINT16 , GxB_BOR_BOR_UINT32 , GxB_BOR_BOR_UINT64 , + GxB_BOR_BAND_UINT8 , GxB_BOR_BAND_UINT16 , GxB_BOR_BAND_UINT32 , GxB_BOR_BAND_UINT64 , + GxB_BOR_BXOR_UINT8 , GxB_BOR_BXOR_UINT16 , GxB_BOR_BXOR_UINT32 , GxB_BOR_BXOR_UINT64 , + GxB_BOR_BXNOR_UINT8 , GxB_BOR_BXNOR_UINT16 , GxB_BOR_BXNOR_UINT32 , GxB_BOR_BXNOR_UINT64 , -GrB_Info GrB_Vector_extractElement_UINT8 // x = v(i) -( - uint8_t *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + GxB_BAND_BOR_UINT8 , GxB_BAND_BOR_UINT16 , GxB_BAND_BOR_UINT32 , GxB_BAND_BOR_UINT64 , + GxB_BAND_BAND_UINT8 , GxB_BAND_BAND_UINT16 , GxB_BAND_BAND_UINT32 , GxB_BAND_BAND_UINT64 , + GxB_BAND_BXOR_UINT8 , GxB_BAND_BXOR_UINT16 , GxB_BAND_BXOR_UINT32 , GxB_BAND_BXOR_UINT64 , + GxB_BAND_BXNOR_UINT8 , GxB_BAND_BXNOR_UINT16 , GxB_BAND_BXNOR_UINT32 , GxB_BAND_BXNOR_UINT64 , -GrB_Info GrB_Vector_extractElement_INT16 // x = v(i) -( - int16_t *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + GxB_BXOR_BOR_UINT8 , GxB_BXOR_BOR_UINT16 , GxB_BXOR_BOR_UINT32 , GxB_BXOR_BOR_UINT64 , + GxB_BXOR_BAND_UINT8 , GxB_BXOR_BAND_UINT16 , GxB_BXOR_BAND_UINT32 , GxB_BXOR_BAND_UINT64 , + GxB_BXOR_BXOR_UINT8 , GxB_BXOR_BXOR_UINT16 , GxB_BXOR_BXOR_UINT32 , GxB_BXOR_BXOR_UINT64 , + GxB_BXOR_BXNOR_UINT8 , GxB_BXOR_BXNOR_UINT16 , GxB_BXOR_BXNOR_UINT32 , GxB_BXOR_BXNOR_UINT64 , -GrB_Info GrB_Vector_extractElement_UINT16 // x = v(i) -( - uint16_t *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + GxB_BXNOR_BOR_UINT8 , GxB_BXNOR_BOR_UINT16 , GxB_BXNOR_BOR_UINT32 , GxB_BXNOR_BOR_UINT64 , + GxB_BXNOR_BAND_UINT8 , GxB_BXNOR_BAND_UINT16 , GxB_BXNOR_BAND_UINT32 , GxB_BXNOR_BAND_UINT64 , + GxB_BXNOR_BXOR_UINT8 , GxB_BXNOR_BXOR_UINT16 , GxB_BXNOR_BXOR_UINT32 , GxB_BXNOR_BXOR_UINT64 , + GxB_BXNOR_BXNOR_UINT8 , GxB_BXNOR_BXNOR_UINT16 , GxB_BXNOR_BXNOR_UINT32 , GxB_BXNOR_BXNOR_UINT64 , -GrB_Info GrB_Vector_extractElement_INT32 // x = v(i) -( - int32_t *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; +//------------------------------------------------------------------------------ +// 80 positional semirings +//------------------------------------------------------------------------------ -GrB_Info GrB_Vector_extractElement_UINT32 // x = v(i) -( - uint32_t *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + // monoids: (MIN, MAX, ANY, PLUS, TIMES) x + // mult: (FIRSTI, FIRSTI1, FIRSTJ, FIRSTJ1, SECONDI, SECONDI1, SECONDJ, SECONDJ1) + // types: (INT32, INT64) -GrB_Info GrB_Vector_extractElement_INT64 // x = v(i) -( - int64_t *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + GxB_MIN_FIRSTI_INT32, GxB_MIN_FIRSTI_INT64, + GxB_MAX_FIRSTI_INT32, GxB_MAX_FIRSTI_INT64, + GxB_ANY_FIRSTI_INT32, GxB_ANY_FIRSTI_INT64, + GxB_PLUS_FIRSTI_INT32, GxB_PLUS_FIRSTI_INT64, + GxB_TIMES_FIRSTI_INT32, GxB_TIMES_FIRSTI_INT64, -GrB_Info GrB_Vector_extractElement_UINT64 // x = v(i) -( - uint64_t *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + GxB_MIN_FIRSTI1_INT32, GxB_MIN_FIRSTI1_INT64, + GxB_MAX_FIRSTI1_INT32, GxB_MAX_FIRSTI1_INT64, + GxB_ANY_FIRSTI1_INT32, GxB_ANY_FIRSTI1_INT64, + GxB_PLUS_FIRSTI1_INT32, GxB_PLUS_FIRSTI1_INT64, + GxB_TIMES_FIRSTI1_INT32, GxB_TIMES_FIRSTI1_INT64, -GrB_Info GrB_Vector_extractElement_FP32 // x = v(i) -( - float *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + GxB_MIN_FIRSTJ_INT32, GxB_MIN_FIRSTJ_INT64, + GxB_MAX_FIRSTJ_INT32, GxB_MAX_FIRSTJ_INT64, + GxB_ANY_FIRSTJ_INT32, GxB_ANY_FIRSTJ_INT64, + GxB_PLUS_FIRSTJ_INT32, GxB_PLUS_FIRSTJ_INT64, + GxB_TIMES_FIRSTJ_INT32, GxB_TIMES_FIRSTJ_INT64, -GrB_Info GrB_Vector_extractElement_FP64 // x = v(i) -( - double *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + GxB_MIN_FIRSTJ1_INT32, GxB_MIN_FIRSTJ1_INT64, + GxB_MAX_FIRSTJ1_INT32, GxB_MAX_FIRSTJ1_INT64, + GxB_ANY_FIRSTJ1_INT32, GxB_ANY_FIRSTJ1_INT64, + GxB_PLUS_FIRSTJ1_INT32, GxB_PLUS_FIRSTJ1_INT64, + GxB_TIMES_FIRSTJ1_INT32, GxB_TIMES_FIRSTJ1_INT64, -GrB_Info GxB_Vector_extractElement_FC32 // x = v(i) -( - GxB_FC32_t *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + GxB_MIN_SECONDI_INT32, GxB_MIN_SECONDI_INT64, + GxB_MAX_SECONDI_INT32, GxB_MAX_SECONDI_INT64, + GxB_ANY_SECONDI_INT32, GxB_ANY_SECONDI_INT64, + GxB_PLUS_SECONDI_INT32, GxB_PLUS_SECONDI_INT64, + GxB_TIMES_SECONDI_INT32, GxB_TIMES_SECONDI_INT64, -GrB_Info GxB_Vector_extractElement_FC64 // x = v(i) -( - GxB_FC64_t *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + GxB_MIN_SECONDI1_INT32, GxB_MIN_SECONDI1_INT64, + GxB_MAX_SECONDI1_INT32, GxB_MAX_SECONDI1_INT64, + GxB_ANY_SECONDI1_INT32, GxB_ANY_SECONDI1_INT64, + GxB_PLUS_SECONDI1_INT32, GxB_PLUS_SECONDI1_INT64, + GxB_TIMES_SECONDI1_INT32, GxB_TIMES_SECONDI1_INT64, -GrB_Info GrB_Vector_extractElement_UDT // x = v(i) -( - void *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + GxB_MIN_SECONDJ_INT32, GxB_MIN_SECONDJ_INT64, + GxB_MAX_SECONDJ_INT32, GxB_MAX_SECONDJ_INT64, + GxB_ANY_SECONDJ_INT32, GxB_ANY_SECONDJ_INT64, + GxB_PLUS_SECONDJ_INT32, GxB_PLUS_SECONDJ_INT64, + GxB_TIMES_SECONDJ_INT32, GxB_TIMES_SECONDJ_INT64, -GrB_Info GrB_Vector_extractElement_Scalar // x = v(i) -( - GrB_Scalar x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; + GxB_MIN_SECONDJ1_INT32, GxB_MIN_SECONDJ1_INT64, + GxB_MAX_SECONDJ1_INT32, GxB_MAX_SECONDJ1_INT64, + GxB_ANY_SECONDJ1_INT32, GxB_ANY_SECONDJ1_INT64, + GxB_PLUS_SECONDJ1_INT32, GxB_PLUS_SECONDJ1_INT64, + GxB_TIMES_SECONDJ1_INT32, GxB_TIMES_SECONDJ1_INT64 ; -// Type-generic version: x can be a pointer to any supported C type or void * -// for a user-defined type. +//------------------------------------------------------------------------------ +// GrB_* semirings +//------------------------------------------------------------------------------ -/* -GrB_Info GrB_Vector_extractElement // x = v(i) -( - *x, // scalar extracted - const GrB_Vector v, // vector to extract an entry from - GrB_Index i // row index -) ; -*/ +// The v1.3 C API for GraphBLAS adds the following 124 predefined semirings, +// with GrB_* names. They are identical to 124 GxB_* semirings defined above, +// with the same name, except that GrB_LXNOR_LOR_SEMIRING_BOOL is identical to +// GxB_EQ_LOR_BOOL (since GrB_EQ_BOOL == GrB_LXNOR). The old names are listed +// below alongside each new name; the new GrB_* names are preferred. -#if GxB_STDC_VERSION >= 201112L -#define GrB_Vector_extractElement(x,v,i) \ - _Generic \ - ( \ - (x), \ - GB_PCASES (GrB, Vector_extractElement), \ - default: GrB_Vector_extractElement_Scalar \ - ) \ - (x, v, i) -#endif +// 12 kinds of GrB_* semirings are available for all 10 real non-boolean types: -// GxB_Vector_isStoredElement determines if v(i) is present in the structure -// of the vector v, as a stored element. It does not return the value. It -// returns GrB_SUCCESS if the element is present, or GrB_NO_VALUE otherwise. + // PLUS_TIMES, PLUS_MIN, + // MIN_PLUS, MIN_TIMES, MIN_FIRST, MIN_SECOND, MIN_MAX, + // MAX_PLUS, MAX_TIMES, MAX_FIRST, MAX_SECOND, MAX_MIN -GrB_Info GxB_Vector_isStoredElement // determine if v(i) is a stored element -( - const GrB_Vector v, // vector to check - GrB_Index i // row index -) ; +// and 4 semirings for boolean only: -//------------------------------------------------------------------------------ -// GrB_Vector_removeElement -//------------------------------------------------------------------------------ + // LOR_LAND, LAND_LOR, LXOR_LAND, LXNOR_LOR. -// GrB_Vector_removeElement (v,i) removes the element v(i) from the vector v. +// GxB_* semirings corresponding to the equivalent GrB_* semiring are +// historical. -GrB_Info GrB_Vector_removeElement -( - GrB_Vector v, // vector to remove an element from - GrB_Index i // index -) ; +GB_GLOBAL GrB_Semiring -//------------------------------------------------------------------------------ -// GrB_Vector_extractTuples -//------------------------------------------------------------------------------ + //-------------------------------------------------------------------------- + // 20 semirings with PLUS monoids + //-------------------------------------------------------------------------- -// Extracts all tuples from a vector, like [I,~,X] = find (v). If -// any parameter I and/or X is NULL, then that component is not extracted. For -// example, to extract just the row indices, pass I as non-NULL, and X as NULL. -// This is like [I,~,~] = find (v). + // PLUS_TIMES semirings for all 10 real, non-boolean types: + GrB_PLUS_TIMES_SEMIRING_INT8, // GxB_PLUS_TIMES_INT8 + GrB_PLUS_TIMES_SEMIRING_INT16, // GxB_PLUS_TIMES_INT16 + GrB_PLUS_TIMES_SEMIRING_INT32, // GxB_PLUS_TIMES_INT32 + GrB_PLUS_TIMES_SEMIRING_INT64, // GxB_PLUS_TIMES_INT64 + GrB_PLUS_TIMES_SEMIRING_UINT8, // GxB_PLUS_TIMES_UINT8 + GrB_PLUS_TIMES_SEMIRING_UINT16, // GxB_PLUS_TIMES_UINT16 + GrB_PLUS_TIMES_SEMIRING_UINT32, // GxB_PLUS_TIMES_UINT32 + GrB_PLUS_TIMES_SEMIRING_UINT64, // GxB_PLUS_TIMES_UINT64 + GrB_PLUS_TIMES_SEMIRING_FP32, // GxB_PLUS_TIMES_FP32 + GrB_PLUS_TIMES_SEMIRING_FP64, // GxB_PLUS_TIMES_FP64 -GrB_Info GrB_Vector_extractTuples_BOOL // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - bool *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + // PLUS_MIN semirings for all 10 real, non-boolean types: + GrB_PLUS_MIN_SEMIRING_INT8, // GxB_PLUS_MIN_INT8 + GrB_PLUS_MIN_SEMIRING_INT16, // GxB_PLUS_MIN_INT16 + GrB_PLUS_MIN_SEMIRING_INT32, // GxB_PLUS_MIN_INT32 + GrB_PLUS_MIN_SEMIRING_INT64, // GxB_PLUS_MIN_INT64 + GrB_PLUS_MIN_SEMIRING_UINT8, // GxB_PLUS_MIN_UINT8 + GrB_PLUS_MIN_SEMIRING_UINT16, // GxB_PLUS_MIN_UINT16 + GrB_PLUS_MIN_SEMIRING_UINT32, // GxB_PLUS_MIN_UINT32 + GrB_PLUS_MIN_SEMIRING_UINT64, // GxB_PLUS_MIN_UINT64 + GrB_PLUS_MIN_SEMIRING_FP32, // GxB_PLUS_MIN_FP32 + GrB_PLUS_MIN_SEMIRING_FP64, // GxB_PLUS_MIN_FP64 -GrB_Info GrB_Vector_extractTuples_INT8 // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - int8_t *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + //-------------------------------------------------------------------------- + // 50 semirings with MIN monoids + //-------------------------------------------------------------------------- -GrB_Info GrB_Vector_extractTuples_UINT8 // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - uint8_t *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + // MIN_PLUS semirings for all 10 real, non-boolean types: + GrB_MIN_PLUS_SEMIRING_INT8, // GxB_MIN_PLUS_INT8 + GrB_MIN_PLUS_SEMIRING_INT16, // GxB_MIN_PLUS_INT16 + GrB_MIN_PLUS_SEMIRING_INT32, // GxB_MIN_PLUS_INT32 + GrB_MIN_PLUS_SEMIRING_INT64, // GxB_MIN_PLUS_INT64 + GrB_MIN_PLUS_SEMIRING_UINT8, // GxB_MIN_PLUS_UINT8 + GrB_MIN_PLUS_SEMIRING_UINT16, // GxB_MIN_PLUS_UINT16 + GrB_MIN_PLUS_SEMIRING_UINT32, // GxB_MIN_PLUS_UINT32 + GrB_MIN_PLUS_SEMIRING_UINT64, // GxB_MIN_PLUS_UINT64 + GrB_MIN_PLUS_SEMIRING_FP32, // GxB_MIN_PLUS_FP32 + GrB_MIN_PLUS_SEMIRING_FP64, // GxB_MIN_PLUS_FP64 -GrB_Info GrB_Vector_extractTuples_INT16 // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - int16_t *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + // MIN_TIMES semirings for all 10 real, non-boolean types: + GrB_MIN_TIMES_SEMIRING_INT8, // GxB_MIN_TIMES_INT8 + GrB_MIN_TIMES_SEMIRING_INT16, // GxB_MIN_TIMES_INT16 + GrB_MIN_TIMES_SEMIRING_INT32, // GxB_MIN_TIMES_INT32 + GrB_MIN_TIMES_SEMIRING_INT64, // GxB_MIN_TIMES_INT64 + GrB_MIN_TIMES_SEMIRING_UINT8, // GxB_MIN_TIMES_UINT8 + GrB_MIN_TIMES_SEMIRING_UINT16, // GxB_MIN_TIMES_UINT16 + GrB_MIN_TIMES_SEMIRING_UINT32, // GxB_MIN_TIMES_UINT32 + GrB_MIN_TIMES_SEMIRING_UINT64, // GxB_MIN_TIMES_UINT64 + GrB_MIN_TIMES_SEMIRING_FP32, // GxB_MIN_TIMES_FP32 + GrB_MIN_TIMES_SEMIRING_FP64, // GxB_MIN_TIMES_FP64 -GrB_Info GrB_Vector_extractTuples_UINT16 // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - uint16_t *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + // MIN_FIRST semirings for all 10 real, non-boolean types: + GrB_MIN_FIRST_SEMIRING_INT8, // GxB_MIN_FIRST_INT8 + GrB_MIN_FIRST_SEMIRING_INT16, // GxB_MIN_FIRST_INT16 + GrB_MIN_FIRST_SEMIRING_INT32, // GxB_MIN_FIRST_INT32 + GrB_MIN_FIRST_SEMIRING_INT64, // GxB_MIN_FIRST_INT64 + GrB_MIN_FIRST_SEMIRING_UINT8, // GxB_MIN_FIRST_UINT8 + GrB_MIN_FIRST_SEMIRING_UINT16, // GxB_MIN_FIRST_UINT16 + GrB_MIN_FIRST_SEMIRING_UINT32, // GxB_MIN_FIRST_UINT32 + GrB_MIN_FIRST_SEMIRING_UINT64, // GxB_MIN_FIRST_UINT64 + GrB_MIN_FIRST_SEMIRING_FP32, // GxB_MIN_FIRST_FP32 + GrB_MIN_FIRST_SEMIRING_FP64, // GxB_MIN_FIRST_FP64 -GrB_Info GrB_Vector_extractTuples_INT32 // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - int32_t *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + // MIN_SECOND semirings for all 10 real, non-boolean types: + GrB_MIN_SECOND_SEMIRING_INT8, // GxB_MIN_SECOND_INT8 + GrB_MIN_SECOND_SEMIRING_INT16, // GxB_MIN_SECOND_INT16 + GrB_MIN_SECOND_SEMIRING_INT32, // GxB_MIN_SECOND_INT32 + GrB_MIN_SECOND_SEMIRING_INT64, // GxB_MIN_SECOND_INT64 + GrB_MIN_SECOND_SEMIRING_UINT8, // GxB_MIN_SECOND_UINT8 + GrB_MIN_SECOND_SEMIRING_UINT16, // GxB_MIN_SECOND_UINT16 + GrB_MIN_SECOND_SEMIRING_UINT32, // GxB_MIN_SECOND_UINT32 + GrB_MIN_SECOND_SEMIRING_UINT64, // GxB_MIN_SECOND_UINT64 + GrB_MIN_SECOND_SEMIRING_FP32, // GxB_MIN_SECOND_FP32 + GrB_MIN_SECOND_SEMIRING_FP64, // GxB_MIN_SECOND_FP64 -GrB_Info GrB_Vector_extractTuples_UINT32 // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - uint32_t *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + // MIN_MAX semirings for all 10 real, non-boolean types: + GrB_MIN_MAX_SEMIRING_INT8, // GxB_MIN_MAX_INT8 + GrB_MIN_MAX_SEMIRING_INT16, // GxB_MIN_MAX_INT16 + GrB_MIN_MAX_SEMIRING_INT32, // GxB_MIN_MAX_INT32 + GrB_MIN_MAX_SEMIRING_INT64, // GxB_MIN_MAX_INT64 + GrB_MIN_MAX_SEMIRING_UINT8, // GxB_MIN_MAX_UINT8 + GrB_MIN_MAX_SEMIRING_UINT16, // GxB_MIN_MAX_UINT16 + GrB_MIN_MAX_SEMIRING_UINT32, // GxB_MIN_MAX_UINT32 + GrB_MIN_MAX_SEMIRING_UINT64, // GxB_MIN_MAX_UINT64 + GrB_MIN_MAX_SEMIRING_FP32, // GxB_MIN_MAX_FP32 + GrB_MIN_MAX_SEMIRING_FP64, // GxB_MIN_MAX_FP64 -GrB_Info GrB_Vector_extractTuples_INT64 // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - int64_t *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + //-------------------------------------------------------------------------- + // 50 semirings with MAX monoids + //-------------------------------------------------------------------------- -GrB_Info GrB_Vector_extractTuples_UINT64 // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - uint64_t *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + // MAX_PLUS semirings for all 10 real, non-boolean types + GrB_MAX_PLUS_SEMIRING_INT8, // GxB_MAX_PLUS_INT8 + GrB_MAX_PLUS_SEMIRING_INT16, // GxB_MAX_PLUS_INT16 + GrB_MAX_PLUS_SEMIRING_INT32, // GxB_MAX_PLUS_INT32 + GrB_MAX_PLUS_SEMIRING_INT64, // GxB_MAX_PLUS_INT64 + GrB_MAX_PLUS_SEMIRING_UINT8, // GxB_MAX_PLUS_UINT8 + GrB_MAX_PLUS_SEMIRING_UINT16, // GxB_MAX_PLUS_UINT16 + GrB_MAX_PLUS_SEMIRING_UINT32, // GxB_MAX_PLUS_UINT32 + GrB_MAX_PLUS_SEMIRING_UINT64, // GxB_MAX_PLUS_UINT64 + GrB_MAX_PLUS_SEMIRING_FP32, // GxB_MAX_PLUS_FP32 + GrB_MAX_PLUS_SEMIRING_FP64, // GxB_MAX_PLUS_FP64 -GrB_Info GrB_Vector_extractTuples_FP32 // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - float *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + // MAX_TIMES semirings for all 10 real, non-boolean types: + GrB_MAX_TIMES_SEMIRING_INT8, // GxB_MAX_TIMES_INT8 + GrB_MAX_TIMES_SEMIRING_INT16, // GxB_MAX_TIMES_INT16 + GrB_MAX_TIMES_SEMIRING_INT32, // GxB_MAX_TIMES_INT32 + GrB_MAX_TIMES_SEMIRING_INT64, // GxB_MAX_TIMES_INT64 + GrB_MAX_TIMES_SEMIRING_UINT8, // GxB_MAX_TIMES_UINT8 + GrB_MAX_TIMES_SEMIRING_UINT16, // GxB_MAX_TIMES_UINT16 + GrB_MAX_TIMES_SEMIRING_UINT32, // GxB_MAX_TIMES_UINT32 + GrB_MAX_TIMES_SEMIRING_UINT64, // GxB_MAX_TIMES_UINT64 + GrB_MAX_TIMES_SEMIRING_FP32, // GxB_MAX_TIMES_FP32 + GrB_MAX_TIMES_SEMIRING_FP64, // GxB_MAX_TIMES_FP64 -GrB_Info GrB_Vector_extractTuples_FP64 // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - double *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + // MAX_FIRST semirings for all 10 real, non-boolean types: + GrB_MAX_FIRST_SEMIRING_INT8, // GxB_MAX_FIRST_INT8 + GrB_MAX_FIRST_SEMIRING_INT16, // GxB_MAX_FIRST_INT16 + GrB_MAX_FIRST_SEMIRING_INT32, // GxB_MAX_FIRST_INT32 + GrB_MAX_FIRST_SEMIRING_INT64, // GxB_MAX_FIRST_INT64 + GrB_MAX_FIRST_SEMIRING_UINT8, // GxB_MAX_FIRST_UINT8 + GrB_MAX_FIRST_SEMIRING_UINT16, // GxB_MAX_FIRST_UINT16 + GrB_MAX_FIRST_SEMIRING_UINT32, // GxB_MAX_FIRST_UINT32 + GrB_MAX_FIRST_SEMIRING_UINT64, // GxB_MAX_FIRST_UINT64 + GrB_MAX_FIRST_SEMIRING_FP32, // GxB_MAX_FIRST_FP32 + GrB_MAX_FIRST_SEMIRING_FP64, // GxB_MAX_FIRST_FP64 -GrB_Info GxB_Vector_extractTuples_FC32 // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - GxB_FC32_t *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + // MAX_SECOND semirings for all 10 real, non-boolean types: + GrB_MAX_SECOND_SEMIRING_INT8, // GxB_MAX_SECOND_INT8 + GrB_MAX_SECOND_SEMIRING_INT16, // GxB_MAX_SECOND_INT16 + GrB_MAX_SECOND_SEMIRING_INT32, // GxB_MAX_SECOND_INT32 + GrB_MAX_SECOND_SEMIRING_INT64, // GxB_MAX_SECOND_INT64 + GrB_MAX_SECOND_SEMIRING_UINT8, // GxB_MAX_SECOND_UINT8 + GrB_MAX_SECOND_SEMIRING_UINT16, // GxB_MAX_SECOND_UINT16 + GrB_MAX_SECOND_SEMIRING_UINT32, // GxB_MAX_SECOND_UINT32 + GrB_MAX_SECOND_SEMIRING_UINT64, // GxB_MAX_SECOND_UINT64 + GrB_MAX_SECOND_SEMIRING_FP32, // GxB_MAX_SECOND_FP32 + GrB_MAX_SECOND_SEMIRING_FP64, // GxB_MAX_SECOND_FP64 -GrB_Info GxB_Vector_extractTuples_FC64 // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - GxB_FC64_t *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + // MAX_MIN semirings for all 10 real, non-boolean types: + GrB_MAX_MIN_SEMIRING_INT8, // GxB_MAX_MIN_INT8 + GrB_MAX_MIN_SEMIRING_INT16, // GxB_MAX_MIN_INT16 + GrB_MAX_MIN_SEMIRING_INT32, // GxB_MAX_MIN_INT32 + GrB_MAX_MIN_SEMIRING_INT64, // GxB_MAX_MIN_INT64 + GrB_MAX_MIN_SEMIRING_UINT8, // GxB_MAX_MIN_UINT8 + GrB_MAX_MIN_SEMIRING_UINT16, // GxB_MAX_MIN_UINT16 + GrB_MAX_MIN_SEMIRING_UINT32, // GxB_MAX_MIN_UINT32 + GrB_MAX_MIN_SEMIRING_UINT64, // GxB_MAX_MIN_UINT64 + GrB_MAX_MIN_SEMIRING_FP32, // GxB_MAX_MIN_FP32 + GrB_MAX_MIN_SEMIRING_FP64, // GxB_MAX_MIN_FP64 -GrB_Info GrB_Vector_extractTuples_UDT // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - void *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; + //-------------------------------------------------------------------------- + // 4 boolean semirings: + //-------------------------------------------------------------------------- -// Type-generic version: X can be a pointer to any supported C type or void * -// for a user-defined type. + GrB_LOR_LAND_SEMIRING_BOOL, // GxB_LOR_LAND_BOOL + GrB_LAND_LOR_SEMIRING_BOOL, // GxB_LAND_LOR_BOOL + GrB_LXOR_LAND_SEMIRING_BOOL, // GxB_LXOR_LAND_BOOL + GrB_LXNOR_LOR_SEMIRING_BOOL ; // GxB_EQ_LOR_BOOL (note EQ == LXNOR) -/* -GrB_Info GrB_Vector_extractTuples // [I,~,X] = find (v) -( - GrB_Index *Ilist, // array for returning row indices of tuples - *X, // array for returning values of tuples - GrB_Index *nvals, // I, X size on input; # tuples on output - const GrB_Vector v // vector to extract tuples from -) ; -*/ +//============================================================================== +// GxB_fprint and GxB_print: print the contents of a GraphBLAS object +//============================================================================== -#if GxB_STDC_VERSION >= 201112L -#define GrB_Vector_extractTuples(Ilist,X,nvals,v) \ - _Generic \ - ( \ - (X), \ - GB_PCASES (GrB, Vector_extractTuples) \ - ) \ - (Ilist, X, nvals, v) -#endif +typedef enum +{ + GxB_SILENT = 0, // nothing is printed, just check the object + GxB_SUMMARY = 1, // print a terse summary + GxB_SHORT = 2, // short description, about 30 entries of a matrix + GxB_COMPLETE = 3, // print the entire contents of the object + GxB_SHORT_VERBOSE = 4, // GxB_SHORT but with "%.15g" for doubles + GxB_COMPLETE_VERBOSE = 5 // GxB_COMPLETE but with "%.15g" for doubles +} +GxB_Print_Level ; -#endif // GB_CUDA_FOLDER +//============================================================================== +// GrB import/export +//============================================================================== + +// The GrB C API specification supports 3 formats: +typedef enum +{ + GrB_CSR_FORMAT = 0, // CSR format (equiv to GxB_SPARSE with GxB_BY_ROW) + GrB_CSC_FORMAT = 1, // CSC format (equiv to GxB_SPARSE with GxB_BY_COL) + GrB_COO_FORMAT = 2 // triplet format (like input to GrB*build) +} +GrB_Format ; //============================================================================== -// GrB_Matrix: a GraphBLAS matrix +// serialize/deserialize compression levels //============================================================================== -typedef struct GB_Matrix_opaque *GrB_Matrix ; +// Currently implemented: no compression, LZ4, LZ4HC, and ZSTD +#define GxB_COMPRESSION_NONE -1 // no compression +#define GxB_COMPRESSION_DEFAULT 0 // ZSTD (level 1) +#define GxB_COMPRESSION_LZ4 1000 // LZ4 +#define GxB_COMPRESSION_LZ4HC 2000 // LZ4HC, with default level 9 +#define GxB_COMPRESSION_ZSTD 3000 // ZSTD, with default level 1 -#ifndef GB_CUDA_FOLDER +//============================================================================== +//=== GraphBLAS functions ====================================================== +//============================================================================== -// These methods create, free, copy, and clear a matrix. The nrows, ncols, -// nvals, and type methods return basic information about a matrix. +// All user-callable GrB* and GxB* functions in GraphBLAS are defined below. +// The GB_CUDA_FOLDER flag is only meant for use by the C++ functions in +// GraphBLAS/CUDA, since they do not need access these definitions. User +// applications have access to these methods. -GrB_Info GrB_Matrix_new // create a new matrix with no entries +#ifndef GB_CUDA_FOLDER + +//============================================================================== +// GrB_init / GrB_finalize +//============================================================================== + +GrB_Info GrB_init // start up GraphBLAS ( - GrB_Matrix *A, // handle of matrix to create - GrB_Type type, // type of matrix to create - GrB_Index nrows, // matrix dimension is nrows-by-ncols - GrB_Index ncols // (nrows and ncols must be <= GrB_INDEX_MAX+1) + GrB_Mode mode // blocking or non-blocking mode, no GPU ) ; -GrB_Info GrB_Matrix_dup // make an exact copy of a matrix +GrB_Info GxB_init // start up GraphBLAS and also define malloc, etc ( - GrB_Matrix *C, // handle of output matrix to create - const GrB_Matrix A // input matrix to copy + GrB_Mode mode, // blocking or non-blocking mode, + // with or without GPU + // pointers to memory management functions + void * (* user_malloc_function ) (size_t), + void * (* user_calloc_function ) (size_t, size_t), + void * (* user_realloc_function ) (void *, size_t), + void (* user_free_function ) (void *) ) ; -GrB_Info GrB_Matrix_clear // clear a matrix of all entries; -( // type and dimensions remain unchanged - GrB_Matrix A // matrix to clear -) ; +GrB_Info GrB_finalize (void) ; // finish GraphBLAS -GrB_Info GrB_Matrix_nrows // get the number of rows of a matrix -( - GrB_Index *nrows, // matrix has nrows rows - const GrB_Matrix A // matrix to query -) ; +//============================================================================== +// GrB_getVersion: GraphBLAS C API version +//============================================================================== -GrB_Info GrB_Matrix_ncols // get the number of columns of a matrix -( - GrB_Index *ncols, // matrix has ncols columns - const GrB_Matrix A // matrix to query -) ; +// GrB_getVersion provides a runtime access of the C API Version. Can also be +// done with two calls to GrB_Global_get_INT32 with the v2.1 C API: +// +// GrB_get (GrB_GLOBAL, &version, GrB_API_VER_MAJOR) ; +// GrB_get (GrB_GLOBAL, &subversion, GrB_API_VER_MINOR) ; -GrB_Info GrB_Matrix_nvals // get the number of entries in a matrix +GrB_Info GrB_getVersion // runtime access to C API version number ( - GrB_Index *nvals, // matrix has nvals entries - const GrB_Matrix A // matrix to query + unsigned int *version, // returns GRB_VERSION + unsigned int *subversion // returns GRB_SUBVERSION ) ; -// historical; use GrB_get instead: -GrB_Info GxB_Matrix_type (GrB_Type *type, const GrB_Matrix A) ; -GrB_Info GxB_Matrix_type_name (char *type_name, const GrB_Matrix A) ; +//============================================================================== +// GrB_Descriptor: the GraphBLAS descriptor +//============================================================================== -GrB_Info GxB_Matrix_memoryUsage // return # of bytes used for a matrix +GrB_Info GrB_Descriptor_new // create a new descriptor ( - size_t *size, // # of bytes used by the matrix A - const GrB_Matrix A // matrix to query + GrB_Descriptor *descriptor // handle of descriptor to create ) ; -GrB_Info GxB_Matrix_iso // return iso status of a matrix -( - bool *iso, // true if the matrix is iso-valued - const GrB_Matrix A // matrix to query -) ; +// historical methods; use GrB_set and GrB_get instead: +GrB_Info GrB_Descriptor_set (GrB_Descriptor, GrB_Desc_Field, GrB_Desc_Value) ; +GrB_Info GxB_Descriptor_get (GrB_Desc_Value *, GrB_Descriptor, GrB_Desc_Field) ; +GrB_Info GxB_Desc_set (GrB_Descriptor, GrB_Desc_Field, ...) ; +GrB_Info GxB_Desc_set_INT32 (GrB_Descriptor, GrB_Desc_Field, int32_t) ; +GrB_Info GxB_Desc_set_FP64 (GrB_Descriptor, GrB_Desc_Field, double) ; +GrB_Info GxB_Desc_get (GrB_Descriptor, GrB_Desc_Field, ...) ; +GrB_Info GxB_Desc_get_INT32 (GrB_Descriptor, GrB_Desc_Field, int32_t *) ; +GrB_Info GxB_Desc_get_FP64 (GrB_Descriptor, GrB_Desc_Field, double *) ; -GrB_Info GrB_Matrix_free // free a matrix +GrB_Info GrB_Descriptor_free // free a descriptor ( - GrB_Matrix *A // handle of matrix to free + GrB_Descriptor *descriptor // handle of descriptor to free ) ; +//============================================================================== +// helper macros for polymorphic functions +//============================================================================== + +#define GB_CAT(w,x,y,z) w ## x ## y ## z +#define GB_CONCAT(w,x,y,z) GB_CAT (w, x, y, z) + +// methods for C scalars of various types +#define GB_CASES(prefix,func) \ + bool : GB_CONCAT ( prefix, _, func, _BOOL ), \ + int8_t : GB_CONCAT ( prefix, _, func, _INT8 ), \ + int16_t : GB_CONCAT ( prefix, _, func, _INT16 ), \ + int32_t : GB_CONCAT ( prefix, _, func, _INT32 ), \ + int64_t : GB_CONCAT ( prefix, _, func, _INT64 ), \ + uint8_t : GB_CONCAT ( prefix, _, func, _UINT8 ), \ + uint16_t : GB_CONCAT ( prefix, _, func, _UINT16 ), \ + uint32_t : GB_CONCAT ( prefix, _, func, _UINT32 ), \ + uint64_t : GB_CONCAT ( prefix, _, func, _UINT64 ), \ + float : GB_CONCAT ( prefix, _, func, _FP32 ), \ + double : GB_CONCAT ( prefix, _, func, _FP64 ), \ + GxB_FC32_t : GB_CONCAT ( GxB , _, func, _FC32 ), \ + GxB_FC64_t : GB_CONCAT ( GxB , _, func, _FC64 ), \ + const void * : GB_CONCAT ( prefix, _, func, _UDT ), \ + void * : GB_CONCAT ( prefix, _, func, _UDT ) + +// methods for C arrays of various types +#define GB_PCASES(prefix,func) \ + const bool * : GB_CONCAT ( prefix, _, func, _BOOL ), \ + bool * : GB_CONCAT ( prefix, _, func, _BOOL ), \ + const int8_t * : GB_CONCAT ( prefix, _, func, _INT8 ), \ + int8_t * : GB_CONCAT ( prefix, _, func, _INT8 ), \ + const int16_t * : GB_CONCAT ( prefix, _, func, _INT16 ), \ + int16_t * : GB_CONCAT ( prefix, _, func, _INT16 ), \ + const int32_t * : GB_CONCAT ( prefix, _, func, _INT32 ), \ + int32_t * : GB_CONCAT ( prefix, _, func, _INT32 ), \ + const int64_t * : GB_CONCAT ( prefix, _, func, _INT64 ), \ + int64_t * : GB_CONCAT ( prefix, _, func, _INT64 ), \ + const uint8_t * : GB_CONCAT ( prefix, _, func, _UINT8 ), \ + uint8_t * : GB_CONCAT ( prefix, _, func, _UINT8 ), \ + const uint16_t * : GB_CONCAT ( prefix, _, func, _UINT16 ), \ + uint16_t * : GB_CONCAT ( prefix, _, func, _UINT16 ), \ + const uint32_t * : GB_CONCAT ( prefix, _, func, _UINT32 ), \ + uint32_t * : GB_CONCAT ( prefix, _, func, _UINT32 ), \ + const uint64_t * : GB_CONCAT ( prefix, _, func, _UINT64 ), \ + uint64_t * : GB_CONCAT ( prefix, _, func, _UINT64 ), \ + const float * : GB_CONCAT ( prefix, _, func, _FP32 ), \ + float * : GB_CONCAT ( prefix, _, func, _FP32 ), \ + const double * : GB_CONCAT ( prefix, _, func, _FP64 ), \ + double * : GB_CONCAT ( prefix, _, func, _FP64 ), \ + const GxB_FC32_t * : GB_CONCAT ( GxB , _, func, _FC32 ), \ + GxB_FC32_t * : GB_CONCAT ( GxB , _, func, _FC32 ), \ + const GxB_FC64_t * : GB_CONCAT ( GxB , _, func, _FC64 ), \ + GxB_FC64_t * : GB_CONCAT ( GxB , _, func, _FC64 ), \ + const void * : GB_CONCAT ( prefix, _, func, _UDT ), \ + void * : GB_CONCAT ( prefix, _, func, _UDT ) + +//============================================================================== +// GrB_Type: data types +//============================================================================== + //------------------------------------------------------------------------------ -// GrB_Matrix_build +// GrB_Type_new: create a new type //------------------------------------------------------------------------------ -// GrB_Matrix_build: C = sparse (I,J,X), but using any -// associative operator to assemble duplicate entries. - -GrB_Info GrB_Matrix_build_BOOL // build a matrix from (I,J,X) tuples +GrB_Info GrB_Type_new // create a new GraphBLAS type ( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const bool *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates + GrB_Type *type, // handle of user type to create + size_t sizeof_ctype // size = sizeof (ctype) of the C type ) ; -GrB_Info GrB_Matrix_build_INT8 // build a matrix from (I,J,X) tuples -( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const int8_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; +// GxB_Type_new creates a type with a name and definition that are known to +// GraphBLAS, as strings. The type_name is any valid string (max length of 128 +// characters, including the required null-terminating character) that may +// appear as the name of a C type created by a C "typedef" statement. It must +// not contain any white-space characters. Example, creating a type of size +// 16*4+4 = 68 bytes, with a 4-by-4 dense float array and a 32-bit integer: +// +// typedef struct { float x [4][4] ; int color ; } myquaternion ; +// GrB_Type MyQtype ; +// GxB_Type_new (&MyQtype, sizeof (myquaternion), "myquaternion", +// "typedef struct { float x [4][4] ; int color ; } myquaternion ;") ; +// +// The type_name and type_defn are both null-terminated strings. The two +// strings are required for best performance in the JIT (both on the CPU and +// GPU). User defined types created by GrB_Type_new will not work with a JIT. +// +// At most GxB_MAX_NAME_LEN characters are accessed in type_name; characters +// beyond that limit are silently ignored. -GrB_Info GrB_Matrix_build_UINT8 // build a matrix from (I,J,X) tuples +GrB_Info GxB_Type_new // create a new named GraphBLAS type ( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const uint8_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates + GrB_Type *type, // handle of user type to create + size_t sizeof_ctype, // size = sizeof (ctype) of the C type + const char *type_name, // name of the type (max 128 characters) + const char *type_defn // typedef for the type (no max length) ) ; -GrB_Info GrB_Matrix_build_INT16 // build a matrix from (I,J,X) tuples +// historical; use GrB_get instead: +GrB_Info GxB_Type_name (char *type_name, const GrB_Type type) ; +GrB_Info GxB_Type_size (size_t *size, const GrB_Type type) ; + +GrB_Info GxB_Type_from_name // return the built-in GrB_Type from a name ( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const int16_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates + GrB_Type *type, // built-in type, or NULL if user-defined. + // The name can be the underlying C type + // ("int8_t") or the GraphBLAS name + // ("GrB_INT8"). + const char *type_name // array of size at least GxB_MAX_NAME_LEN ) ; -GrB_Info GrB_Matrix_build_UINT16 // build a matrix from (I,J,X) tuples +GrB_Info GrB_Type_free // free a user-defined type ( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const uint16_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates + GrB_Type *type // handle of user-defined type to free ) ; -GrB_Info GrB_Matrix_build_INT32 // build a matrix from (I,J,X) tuples +//============================================================================== +// GrB_UnaryOp: unary operators +//============================================================================== + +// GrB_UnaryOp_new creates a user-defined unary op (with no name or defn) +GrB_Info GrB_UnaryOp_new // create a new user-defined unary operator ( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const int32_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates + GrB_UnaryOp *unaryop, // handle for the new unary operator + GxB_unary_function function, // pointer to the unary function + GrB_Type ztype, // type of output z + GrB_Type xtype // type of input x ) ; -GrB_Info GrB_Matrix_build_UINT32 // build a matrix from (I,J,X) tuples +// GxB_UnaryOp_new creates a named and defined user-defined unary op. +GrB_Info GxB_UnaryOp_new // create a new user-defined unary operator ( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const uint32_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates + GrB_UnaryOp *unaryop, // handle for the new unary operator + GxB_unary_function function, // pointer to the unary function + GrB_Type ztype, // type of output z + GrB_Type xtype, // type of input x + const char *unop_name, // name of the user function + const char *unop_defn // definition of the user function ) ; -GrB_Info GrB_Matrix_build_INT64 // build a matrix from (I,J,X) tuples -( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const int64_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; +// historical; use GrB_get instead: +GrB_Info GxB_UnaryOp_ztype (GrB_Type *ztype, GrB_UnaryOp unaryop) ; +GrB_Info GxB_UnaryOp_ztype_name (char *type_name, const GrB_UnaryOp unaryop) ; +GrB_Info GxB_UnaryOp_xtype (GrB_Type *xtype, GrB_UnaryOp unaryop) ; +GrB_Info GxB_UnaryOp_xtype_name (char *type_name, const GrB_UnaryOp unaryop) ; -GrB_Info GrB_Matrix_build_UINT64 // build a matrix from (I,J,X) tuples +GrB_Info GrB_UnaryOp_free // free a user-created unary operator ( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const uint64_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates + GrB_UnaryOp *unaryop // handle of unary operator to free ) ; -GrB_Info GrB_Matrix_build_FP32 // build a matrix from (I,J,X) tuples -( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const float *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates -) ; +//============================================================================== +// GrB_BinaryOp: binary operators +//============================================================================== -GrB_Info GrB_Matrix_build_FP64 // build a matrix from (I,J,X) tuples +// GrB_BinaryOp_new creates a user-defined binary op (no name or defn) +GrB_Info GrB_BinaryOp_new ( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const double *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates + GrB_BinaryOp *binaryop, // handle for the new binary operator + GxB_binary_function function, // pointer to the binary function + GrB_Type ztype, // type of output z + GrB_Type xtype, // type of input x + GrB_Type ytype // type of input y ) ; -GrB_Info GxB_Matrix_build_FC32 // build a matrix from (I,J,X) tuples +// GxB_BinaryOp_new creates a named and defined user-defined binary op. +GrB_Info GxB_BinaryOp_new ( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const GxB_FC32_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates + GrB_BinaryOp *op, // handle for the new binary operator + GxB_binary_function function, // pointer to the binary function + GrB_Type ztype, // type of output z + GrB_Type xtype, // type of input x + GrB_Type ytype, // type of input y + const char *binop_name, // name of the user function + const char *binop_defn // definition of the user function ) ; -GrB_Info GxB_Matrix_build_FC64 // build a matrix from (I,J,X) tuples +// historical; use GrB_get instead: +GrB_Info GxB_BinaryOp_ztype (GrB_Type *ztype, GrB_BinaryOp op) ; +GrB_Info GxB_BinaryOp_ztype_name (char *type_name, const GrB_BinaryOp op) ; +GrB_Info GxB_BinaryOp_xtype (GrB_Type *xtype, GrB_BinaryOp op) ; +GrB_Info GxB_BinaryOp_xtype_name (char *type_name, const GrB_BinaryOp op) ; +GrB_Info GxB_BinaryOp_ytype (GrB_Type *ytype, GrB_BinaryOp op) ; +GrB_Info GxB_BinaryOp_ytype_name (char *type_name, const GrB_BinaryOp op) ; + +GrB_Info GrB_BinaryOp_free // free a user-created binary operator ( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const GxB_FC64_t *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates + GrB_BinaryOp *binaryop // handle of binary operator to free ) ; -GrB_Info GrB_Matrix_build_UDT // build a matrix from (I,J,X) tuples +//============================================================================== +// GxB_SelectOp: select operators (DEPRECATED: do not use) +//============================================================================== + +// historical; use GrB_select and GrB_IndexUnaryOp instead: +GrB_Info GxB_SelectOp_xtype (GrB_Type *xtype, GxB_SelectOp selectop) ; +GrB_Info GxB_SelectOp_ttype (GrB_Type *ttype, GxB_SelectOp selectop) ; + +//============================================================================== +// GrB_IndexUnaryOp: a unary operator that depends on the row/col indices +//============================================================================== + +// GrB_IndexUnaryOp_new creates a user-defined unary op (no name or defn) + +GrB_Info GrB_IndexUnaryOp_new // create a new user-defined IndexUnary op ( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const void *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates + GrB_IndexUnaryOp *op, // handle for the new IndexUnary operator + GxB_index_unary_function function, // pointer to IndexUnary function + GrB_Type ztype, // type of output z + GrB_Type xtype, // type of input x (the A(i,j) entry) + GrB_Type ytype // type of input y (the scalar) ) ; -GrB_Info GxB_Matrix_build_Scalar // build a matrix from (I,J,scalar) tuples +GrB_Info GxB_IndexUnaryOp_new // create a named user-created IndexUnaryOp ( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - GrB_Scalar scalar, // value for all tuples - GrB_Index nvals // number of tuples + GrB_IndexUnaryOp *op, // handle for the new IndexUnary operator + GxB_index_unary_function function, // pointer to index_unary function + GrB_Type ztype, // type of output z + GrB_Type xtype, // type of input x (the A(i,j) entry) + GrB_Type ytype, // type of input y (the scalar) + const char *idxop_name, // name of the user function + const char *idxop_defn // definition of the user function ) ; -// Type-generic version: X can be a pointer to any supported C type or void * -// for a user-defined type. +// historical; use GrB_get instead: +GrB_Info GxB_IndexUnaryOp_ztype_name (char *, const GrB_IndexUnaryOp op) ; +GrB_Info GxB_IndexUnaryOp_xtype_name (char *, const GrB_IndexUnaryOp op) ; +GrB_Info GxB_IndexUnaryOp_ytype_name (char *, const GrB_IndexUnaryOp op) ; -/* -GrB_Info GrB_Matrix_build // build a matrix from (I,J,X) tuples +GrB_Info GrB_IndexUnaryOp_free // free a user-created IndexUnaryOp ( - GrB_Matrix C, // matrix to build - const GrB_Index *Ilist, // array of row indices of tuples - const GrB_Index *J, // array of column indices of tuples - const *X, // array of values of tuples - GrB_Index nvals, // number of tuples - const GrB_BinaryOp dup // binary function to assemble duplicates + GrB_IndexUnaryOp *op // handle of IndexUnary to free ) ; -*/ - -#if GxB_STDC_VERSION >= 201112L -#define GrB_Matrix_build(C,Ilist,J,X,nvals,dup) \ - _Generic \ - ( \ - (X), \ - GB_PCASES (GrB, Matrix_build) \ - ) \ - (C, Ilist, J, ((const void *) (X)), nvals, dup) -#endif - -//------------------------------------------------------------------------------ -// GrB_Matrix_setElement -//------------------------------------------------------------------------------ -// Set a single entry in a matrix, C(i,j) = x, typecasting -// from the type of x to the type of C, as needed. +//============================================================================== +// GrB_Monoid +//============================================================================== -GrB_Info GrB_Matrix_setElement_BOOL // C (i,j) = x +GrB_Info GrB_Monoid_new_BOOL // create a new boolean monoid ( - GrB_Matrix C, // matrix to modify - bool x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + bool identity // identity value of the monoid ) ; -GrB_Info GrB_Matrix_setElement_INT8 // C (i,j) = x +GrB_Info GrB_Monoid_new_INT8 // create a new int8 monoid ( - GrB_Matrix C, // matrix to modify - int8_t x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + int8_t identity // identity value of the monoid ) ; -GrB_Info GrB_Matrix_setElement_UINT8 // C (i,j) = x +GrB_Info GrB_Monoid_new_UINT8 // create a new uint8 monoid ( - GrB_Matrix C, // matrix to modify - uint8_t x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + uint8_t identity // identity value of the monoid ) ; -GrB_Info GrB_Matrix_setElement_INT16 // C (i,j) = x +GrB_Info GrB_Monoid_new_INT16 // create a new int16 monoid ( - GrB_Matrix C, // matrix to modify - int16_t x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + int16_t identity // identity value of the monoid ) ; -GrB_Info GrB_Matrix_setElement_UINT16 // C (i,j) = x +GrB_Info GrB_Monoid_new_UINT16 // create a new uint16 monoid ( - GrB_Matrix C, // matrix to modify - uint16_t x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + uint16_t identity // identity value of the monoid ) ; -GrB_Info GrB_Matrix_setElement_INT32 // C (i,j) = x +GrB_Info GrB_Monoid_new_INT32 // create a new int32 monoid ( - GrB_Matrix C, // matrix to modify - int32_t x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + int32_t identity // identity value of the monoid ) ; -GrB_Info GrB_Matrix_setElement_UINT32 // C (i,j) = x +GrB_Info GrB_Monoid_new_UINT32 // create a new uint32 monoid ( - GrB_Matrix C, // matrix to modify - uint32_t x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + uint32_t identity // identity value of the monoid ) ; -GrB_Info GrB_Matrix_setElement_INT64 // C (i,j) = x +GrB_Info GrB_Monoid_new_INT64 // create a new int64 monoid ( - GrB_Matrix C, // matrix to modify - int64_t x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + int64_t identity // identity value of the monoid ) ; -GrB_Info GrB_Matrix_setElement_UINT64 // C (i,j) = x +GrB_Info GrB_Monoid_new_UINT64 // create a new uint64 monoid ( - GrB_Matrix C, // matrix to modify - uint64_t x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + uint64_t identity // identity value of the monoid ) ; -GrB_Info GrB_Matrix_setElement_FP32 // C (i,j) = x +GrB_Info GrB_Monoid_new_FP32 // create a new float monoid ( - GrB_Matrix C, // matrix to modify - float x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + float identity // identity value of the monoid ) ; -GrB_Info GrB_Matrix_setElement_FP64 // C (i,j) = x +GrB_Info GrB_Monoid_new_FP64 // create a new double monoid ( - GrB_Matrix C, // matrix to modify - double x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + double identity // identity value of the monoid ) ; -GrB_Info GxB_Matrix_setElement_FC32 // C (i,j) = x -( - GrB_Matrix C, // matrix to modify - GxB_FC32_t x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index -) ; - -GrB_Info GxB_Matrix_setElement_FC64 // C (i,j) = x +GrB_Info GxB_Monoid_new_FC32 // create a new float complex monoid ( - GrB_Matrix C, // matrix to modify - GxB_FC64_t x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + GxB_FC32_t identity // identity value of the monoid ) ; -GrB_Info GrB_Matrix_setElement_UDT // C (i,j) = x +GrB_Info GxB_Monoid_new_FC64 // create a new double complex monoid ( - GrB_Matrix C, // matrix to modify - void *x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + GxB_FC64_t identity // identity value of the monoid ) ; -GrB_Info GrB_Matrix_setElement_Scalar // C (i,j) = x +GrB_Info GrB_Monoid_new_UDT // create a monoid with a user-defined type ( - GrB_Matrix C, // matrix to modify - GrB_Scalar x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + void *identity // identity value of the monoid ) ; -// Type-generic version: x can be any supported C type or void * for a -// user-defined type. +// Type-generic method for creating a new monoid: /* -GrB_Info GrB_Matrix_setElement // C (i,j) = x +GrB_Info GrB_Monoid_new // create a monoid ( - GrB_Matrix C, // matrix to modify - x, // scalar to assign to C(i,j) - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + identity // identity value of the monoid ) ; */ #if GxB_STDC_VERSION >= 201112L -#define GrB_Matrix_setElement(C,x,i,j) \ - _Generic \ - ( \ - (x), \ - GB_CASES (GrB, Matrix_setElement), \ - default: GrB_Matrix_setElement_Scalar \ - ) \ - (C, x, i, j) +#define GrB_Monoid_new(monoid,op,identity) \ + _Generic \ + ( \ + (identity), \ + GB_CASES (GrB, Monoid_new) \ + ) \ + (monoid, op, identity) #endif -//------------------------------------------------------------------------------ -// GrB_Matrix_extractElement -//------------------------------------------------------------------------------ - -// Extract a single entry from a matrix, x = A(i,j), typecasting from the type -// of A to the type of x, as needed. - -GrB_Info GrB_Matrix_extractElement_BOOL // x = A(i,j) -( - bool *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index -) ; +// GxB_Monoid_terminal_new is identical to GrB_Monoid_new, except that a +// terminal value can be specified. The terminal may be NULL, which indicates +// no terminal value (and in this case, it is identical to GrB_Monoid_new). +// The terminal value, if not NULL, must have the same type as the identity. -GrB_Info GrB_Matrix_extractElement_INT8 // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_BOOL // create a new boolean monoid ( - int8_t *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + bool identity, // identity value of the monoid + bool terminal // terminal value of the monoid ) ; -GrB_Info GrB_Matrix_extractElement_UINT8 // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_INT8 // create a new int8 monoid ( - uint8_t *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + int8_t identity, // identity value of the monoid + int8_t terminal // terminal value of the monoid ) ; -GrB_Info GrB_Matrix_extractElement_INT16 // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_UINT8 // create a new uint8 monoid ( - int16_t *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + uint8_t identity, // identity value of the monoid + uint8_t terminal // terminal value of the monoid ) ; -GrB_Info GrB_Matrix_extractElement_UINT16 // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_INT16 // create a new int16 monoid ( - uint16_t *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + int16_t identity, // identity value of the monoid + int16_t terminal // terminal value of the monoid ) ; -GrB_Info GrB_Matrix_extractElement_INT32 // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_UINT16 // create a new uint16 monoid ( - int32_t *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + uint16_t identity, // identity value of the monoid + uint16_t terminal // terminal value of the monoid ) ; -GrB_Info GrB_Matrix_extractElement_UINT32 // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_INT32 // create a new int32 monoid ( - uint32_t *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + int32_t identity, // identity value of the monoid + int32_t terminal // terminal value of the monoid ) ; -GrB_Info GrB_Matrix_extractElement_INT64 // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_UINT32 // create a new uint32 monoid ( - int64_t *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + uint32_t identity, // identity value of the monoid + uint32_t terminal // terminal value of the monoid ) ; -GrB_Info GrB_Matrix_extractElement_UINT64 // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_INT64 // create a new int64 monoid ( - uint64_t *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + int64_t identity, // identity value of the monoid + int64_t terminal // terminal value of the monoid ) ; -GrB_Info GrB_Matrix_extractElement_FP32 // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_UINT64 // create a new uint64 monoid ( - float *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + uint64_t identity, // identity value of the monoid + uint64_t terminal // terminal value of the monoid ) ; -GrB_Info GrB_Matrix_extractElement_FP64 // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_FP32 // create a new float monoid ( - double *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + float identity, // identity value of the monoid + float terminal // terminal value of the monoid ) ; -GrB_Info GxB_Matrix_extractElement_FC32 // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_FP64 // create a new double monoid ( - GxB_FC32_t *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + double identity, // identity value of the monoid + double terminal // terminal value of the monoid ) ; -GrB_Info GxB_Matrix_extractElement_FC64 // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_FC32 // create a new float complex monoid ( - GxB_FC64_t *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + GxB_FC32_t identity, // identity value of the monoid + GxB_FC32_t terminal // terminal value of the monoid ) ; -GrB_Info GrB_Matrix_extractElement_UDT // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_FC64 // create a new double complex monoid ( - void *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + GxB_FC64_t identity, // identity value of the monoid + GxB_FC64_t terminal // terminal value of the monoid ) ; -GrB_Info GrB_Matrix_extractElement_Scalar // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new_UDT // create a monoid with a user type ( - GrB_Scalar x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + void *identity, // identity value of the monoid + void *terminal // terminal value of the monoid ) ; -// Type-generic version: x can be a pointer to any supported C type or void * -// for a user-defined type. +// Type-generic method for creating a new monoid with a terminal value: /* -GrB_Info GrB_Matrix_extractElement // x = A(i,j) +GrB_Info GxB_Monoid_terminal_new // create a monoid ( - *x, // extracted scalar - const GrB_Matrix A, // matrix to extract a scalar from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid, // handle of monoid to create + GrB_BinaryOp op, // binary operator of the monoid + identity, // identity value of the monoid + terminal // terminal value of the monoid ) ; */ #if GxB_STDC_VERSION >= 201112L -#define GrB_Matrix_extractElement(x,A,i,j) \ +#define GxB_Monoid_terminal_new(monoid,op,identity,terminal) \ _Generic \ ( \ - (x), \ - GB_PCASES (GrB, Matrix_extractElement), \ - default: GrB_Matrix_extractElement_Scalar \ + (identity), \ + GB_CASES (GxB, Monoid_terminal_new) \ ) \ - (x, A, i, j) + (monoid, op, identity, terminal) #endif -// GxB_Matrix_isStoredElement determines if A(i,j) is present in the structure -// of the matrix A, as a stored element. It does not return the value. It -// returns GrB_SUCCESS if the element is present, or GrB_NO_VALUE otherwise. +// historical; use GrB_get instead: +GrB_Info GxB_Monoid_operator (GrB_BinaryOp *op, GrB_Monoid monoid) ; +GrB_Info GxB_Monoid_identity (void *identity, GrB_Monoid monoid) ; +GrB_Info GxB_Monoid_terminal (bool *, void *terminal, GrB_Monoid monoid) ; -GrB_Info GxB_Matrix_isStoredElement // determine if A(i,j) is a stored element +GrB_Info GrB_Monoid_free // free a user-created monoid ( - const GrB_Matrix A, // matrix to check - GrB_Index i, // row index - GrB_Index j // column index + GrB_Monoid *monoid // handle of monoid to free ) ; -//------------------------------------------------------------------------------ -// GrB_Matrix_removeElement -//------------------------------------------------------------------------------ +//============================================================================== +// GrB_Semiring +//============================================================================== -// GrB_Matrix_removeElement (A,i,j) removes the entry A(i,j) from the matrix A. +GrB_Info GrB_Semiring_new // create a semiring +( + GrB_Semiring *semiring, // handle of semiring to create + GrB_Monoid add, // add monoid of the semiring + GrB_BinaryOp multiply // multiply operator of the semiring +) ; -GrB_Info GrB_Matrix_removeElement +// historical; use GrB_get instead: +GrB_Info GxB_Semiring_add (GrB_Monoid *add, GrB_Semiring semiring) ; +GrB_Info GxB_Semiring_multiply (GrB_BinaryOp *multiply, GrB_Semiring semiring) ; + +GrB_Info GrB_Semiring_free // free a user-created semiring ( - GrB_Matrix C, // matrix to remove entry from - GrB_Index i, // row index - GrB_Index j // column index + GrB_Semiring *semiring // handle of semiring to free +) ; + +//============================================================================== +// GrB_Scalar: a GraphBLAS scalar +//============================================================================== + +// These methods create, free, copy, and clear a GrB_Scalar. The nvals, +// and type methods return basic information about a GrB_Scalar. + +GrB_Info GrB_Scalar_new // create a new GrB_Scalar with no entry +( + GrB_Scalar *s, // handle of GrB_Scalar to create + GrB_Type type // type of GrB_Scalar to create +) ; + +GrB_Info GrB_Scalar_dup // make an exact copy of a GrB_Scalar +( + GrB_Scalar *s, // handle of output GrB_Scalar to create + const GrB_Scalar t // input GrB_Scalar to copy +) ; + +GrB_Info GrB_Scalar_clear // clear a GrB_Scalar of its entry +( // type remains unchanged. + GrB_Scalar s // GrB_Scalar to clear +) ; + +GrB_Info GrB_Scalar_nvals // get the number of entries in a GrB_Scalar +( + GrB_Index *nvals, // GrB_Scalar has nvals entries (0 or 1) + const GrB_Scalar s // GrB_Scalar to query +) ; + +// historical; use GrB_get instead: +GrB_Info GxB_Scalar_type (GrB_Type *type, const GrB_Scalar s) ; +GrB_Info GxB_Scalar_type_name (char *type_name, const GrB_Scalar s) ; + +GrB_Info GxB_Scalar_memoryUsage // return # of bytes used for a scalar +( + size_t *size, // # of bytes used by the scalar s + const GrB_Scalar s // GrB_Scalar to query +) ; + +GrB_Info GrB_Scalar_free // free a GrB_Scalar +( + GrB_Scalar *s // handle of GrB_Scalar to free ) ; +// historical names identical to GrB_Scalar_methods above: +GrB_Info GxB_Scalar_new (GrB_Scalar *s, GrB_Type type) ; +GrB_Info GxB_Scalar_dup (GrB_Scalar *s, const GrB_Scalar t) ; +GrB_Info GxB_Scalar_clear (GrB_Scalar s) ; +GrB_Info GxB_Scalar_nvals (GrB_Index *nvals, const GrB_Scalar s) ; +GrB_Info GxB_Scalar_free (GrB_Scalar *s) ; + //------------------------------------------------------------------------------ -// GrB_Matrix_extractTuples +// GrB_Scalar_setElement //------------------------------------------------------------------------------ -// Extracts all tuples from a matrix, like [I,J,X] = find (A). If -// any parameter I, J and/or X is NULL, then that component is not extracted. -// For example, to extract just the row and col indices, pass I and J as -// non-NULL, and X as NULL. This is like [I,J,~] = find (A). +// Set a single GrB_Scalar s, from a user scalar x: s = x, typecasting from the +// type of x to the type of w as needed. -GrB_Info GrB_Matrix_extractTuples_BOOL // [I,J,X] = find (A) +GrB_Info GrB_Scalar_setElement_BOOL // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - bool *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + bool x // user scalar to assign to s ) ; -GrB_Info GrB_Matrix_extractTuples_INT8 // [I,J,X] = find (A) +GrB_Info GrB_Scalar_setElement_INT8 // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - int8_t *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + int8_t x // user scalar to assign to s ) ; -GrB_Info GrB_Matrix_extractTuples_UINT8 // [I,J,X] = find (A) +GrB_Info GrB_Scalar_setElement_UINT8 // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - uint8_t *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + uint8_t x // user scalar to assign to s ) ; -GrB_Info GrB_Matrix_extractTuples_INT16 // [I,J,X] = find (A) +GrB_Info GrB_Scalar_setElement_INT16 // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - int16_t *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + int16_t x // user scalar to assign to s ) ; -GrB_Info GrB_Matrix_extractTuples_UINT16 // [I,J,X] = find (A) +GrB_Info GrB_Scalar_setElement_UINT16 // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - uint16_t *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + uint16_t x // user scalar to assign to s ) ; -GrB_Info GrB_Matrix_extractTuples_INT32 // [I,J,X] = find (A) +GrB_Info GrB_Scalar_setElement_INT32 // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - int32_t *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + int32_t x // user scalar to assign to s ) ; -GrB_Info GrB_Matrix_extractTuples_UINT32 // [I,J,X] = find (A) +GrB_Info GrB_Scalar_setElement_UINT32 // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - uint32_t *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + uint32_t x // user scalar to assign to s ) ; -GrB_Info GrB_Matrix_extractTuples_INT64 // [I,J,X] = find (A) +GrB_Info GrB_Scalar_setElement_INT64 // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - int64_t *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + int64_t x // user scalar to assign to s ) ; -GrB_Info GrB_Matrix_extractTuples_UINT64 // [I,J,X] = find (A) +GrB_Info GrB_Scalar_setElement_UINT64 // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - uint64_t *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + uint64_t x // user scalar to assign to s ) ; -GrB_Info GrB_Matrix_extractTuples_FP32 // [I,J,X] = find (A) +GrB_Info GrB_Scalar_setElement_FP32 // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - float *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + float x // user scalar to assign to s ) ; -GrB_Info GrB_Matrix_extractTuples_FP64 // [I,J,X] = find (A) +GrB_Info GrB_Scalar_setElement_FP64 // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - double *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + double x // user scalar to assign to s ) ; -GrB_Info GxB_Matrix_extractTuples_FC32 // [I,J,X] = find (A) +GrB_Info GxB_Scalar_setElement_FC32 // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - GxB_FC32_t *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + GxB_FC32_t x // user scalar to assign to s ) ; -GrB_Info GxB_Matrix_extractTuples_FC64 // [I,J,X] = find (A) +GrB_Info GxB_Scalar_setElement_FC64 // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - GxB_FC64_t *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + GxB_FC64_t x // user scalar to assign to s ) ; -GrB_Info GrB_Matrix_extractTuples_UDT // [I,J,X] = find (A) +GrB_Info GrB_Scalar_setElement_UDT // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - void *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + void *x // user scalar to assign to s ) ; -// Type-generic version: X can be a pointer to any supported C type or void * -// for a user-defined type. +// historical names identical to GrB_Scalar_methods above: +GrB_Info GxB_Scalar_setElement_BOOL (GrB_Scalar s, bool x) ; +GrB_Info GxB_Scalar_setElement_INT8 (GrB_Scalar s, int8_t x) ; +GrB_Info GxB_Scalar_setElement_INT16 (GrB_Scalar s, int16_t x) ; +GrB_Info GxB_Scalar_setElement_INT32 (GrB_Scalar s, int32_t x) ; +GrB_Info GxB_Scalar_setElement_INT64 (GrB_Scalar s, int64_t x) ; +GrB_Info GxB_Scalar_setElement_UINT8 (GrB_Scalar s, uint8_t x) ; +GrB_Info GxB_Scalar_setElement_UINT16 (GrB_Scalar s, uint16_t x) ; +GrB_Info GxB_Scalar_setElement_UINT32 (GrB_Scalar s, uint32_t x) ; +GrB_Info GxB_Scalar_setElement_UINT64 (GrB_Scalar s, uint64_t x) ; +GrB_Info GxB_Scalar_setElement_FP32 (GrB_Scalar s, float x) ; +GrB_Info GxB_Scalar_setElement_FP64 (GrB_Scalar s, double x) ; +GrB_Info GxB_Scalar_setElement_UDT (GrB_Scalar s, void *x) ; + +// Type-generic version: x can be any supported C type or void * for a +// user-defined type. /* -GrB_Info GrB_Matrix_extractTuples // [I,J,X] = find (A) +GrB_Info GrB_Scalar_setElement // s = x ( - GrB_Index *Ilist, // array for returning row indices of tuples - GrB_Index *J, // array for returning col indices of tuples - *X, // array for returning values of tuples - GrB_Index *nvals, // I,J,X size on input; # tuples on output - const GrB_Matrix A // matrix to extract tuples from + GrB_Scalar s, // GrB_Scalar to modify + x // user scalar to assign to s ) ; */ #if GxB_STDC_VERSION >= 201112L -#define GrB_Matrix_extractTuples(Ilist,J,X,nvals,A) \ - _Generic \ - ( \ - (X), \ - GB_PCASES (GrB, Matrix_extractTuples) \ - ) \ - (Ilist, J, X, nvals, A) +#define GrB_Scalar_setElement(s,x) \ + _Generic \ + ( \ + (x), \ + GB_CASES (GrB, Scalar_setElement) \ + ) \ + (s, x) + +// historical; use GrB_Scalar_setElement instead: +#define GxB_Scalar_setElement(s,x) GrB_Scalar_setElement (s, x) #endif //------------------------------------------------------------------------------ -// GxB_Matrix_concat and GxB_Matrix_split +// GrB_Scalar_extractElement //------------------------------------------------------------------------------ -// GxB_Matrix_concat concatenates an array of matrices (Tiles) into a single -// GrB_Matrix C. - -// Tiles is an m-by-n dense array of matrices held in row-major format, where -// Tiles [i*n+j] is the (i,j)th tile, and where m > 0 and n > 0 must hold. Let -// A{i,j} denote the (i,j)th tile. The matrix C is constructed by -// concatenating these tiles together, as: +// Extract a single entry from a GrB_Scalar, x = s, typecasting from the type +// of s to the type of x as needed. -// C = [ A{0,0} A{0,1} A{0,2} ... A{0,n-1} -// A{1,0} A{1,1} A{1,2} ... A{1,n-1} -// ... -// A{m-1,0} A{m-1,1} A{m-1,2} ... A{m-1,n-1} ] +GrB_Info GrB_Scalar_extractElement_BOOL // x = s +( + bool *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from +) ; -// On input, the matrix C must already exist. Any existing entries in C are -// discarded. C must have dimensions nrows by ncols where nrows is the sum of -// # of rows in the matrices A{i,0} for all i, and ncols is the sum of the # of -// columns in the matrices A{0,j} for all j. All matrices in any given tile -// row i must have the same number of rows (that is, nrows(A{i,0}) must equal -// nrows(A{i,j}) for all j), and all matrices in any given tile column j must -// have the same number of columns (that is, ncols(A{0,j}) must equal -// ncols(A{i,j}) for all i). +GrB_Info GrB_Scalar_extractElement_INT8 // x = s +( + int8_t *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from +) ; -// The type of C is unchanged, and all matrices A{i,j} are typecasted into the -// type of C. Any settings made to C by GrB_set (format by row -// or by column, bitmap switch, hyper switch, and sparsity control) are -// unchanged. +GrB_Info GrB_Scalar_extractElement_UINT8 // x = s +( + uint8_t *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from +) ; -GrB_Info GxB_Matrix_concat // concatenate a 2D array of matrices +GrB_Info GrB_Scalar_extractElement_INT16 // x = s ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix *Tiles, // 2D row-major array of size m-by-n - const GrB_Index m, - const GrB_Index n, - const GrB_Descriptor desc // unused, except threading control + int16_t *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from ) ; -// GxB_Matrix_split does the opposite of GxB_Matrix_concat. It splits a single -// input matrix A into a 2D array of tiles. On input, the Tiles array must be -// a non-NULL pointer to a previously allocated array of size at least m*n -// where both m and n must be > 0. The Tiles_nrows array has size m, and -// Tiles_ncols has size n. The (i,j)th tile has dimension -// Tiles_nrows[i]-by-Tiles_ncols[j]. The sum of Tiles_nrows [0:m-1] must equal -// the number of rows of A, and the sum of Tiles_ncols [0:n-1] must equal the -// number of columns of A. The type of each tile is the same as the type of A; -// no typecasting is done. +GrB_Info GrB_Scalar_extractElement_UINT16 // x = s +( + uint16_t *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from +) ; -GrB_Info GxB_Matrix_split // split a matrix into 2D array of matrices +GrB_Info GrB_Scalar_extractElement_INT32 // x = s ( - GrB_Matrix *Tiles, // 2D row-major array of size m-by-n - const GrB_Index m, - const GrB_Index n, - const GrB_Index *Tile_nrows, // array of size m - const GrB_Index *Tile_ncols, // array of size n - const GrB_Matrix A, // input matrix to split - const GrB_Descriptor desc // unused, except threading control + int32_t *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from ) ; -//------------------------------------------------------------------------------ -// GxB_Matrix_diag, GxB_Vector_diag, GrB_Matrix_diag -//------------------------------------------------------------------------------ +GrB_Info GrB_Scalar_extractElement_UINT32 // x = s +( + uint32_t *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from +) ; -// GrB_Matrix_diag constructs a new matrix from a vector. Let n be the length -// of the v vector, from GrB_Vector_size (&n, v). If k = 0, then C is an -// n-by-n diagonal matrix with the entries from v along the main diagonal of C, -// with C(i,i) = v(i). If k is nonzero, C is square with dimension n+abs(k). -// If k is positive, it denotes diagonals above the main diagonal, with -// C(i,i+k) = v(i). If k is negative, it denotes diagonals below the main -// diagonal of C, with C(i-k,i) = v(i). C is constructed with the same type -// as v. +GrB_Info GrB_Scalar_extractElement_INT64 // x = s +( + int64_t *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from +) ; -GrB_Info GrB_Matrix_diag // build a diagonal matrix from a vector +GrB_Info GrB_Scalar_extractElement_UINT64 // x = s ( - GrB_Matrix *C, // output matrix - const GrB_Vector v, // input vector - int64_t k + uint64_t *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from ) ; -// GrB_Matrix_diag is like GxB_Matrix_diag (&C, v, k, NULL), except that C must -// already exist on input, of the correct size. Any existing entries in C are -// discarded. The type of C is preserved, so that if the type of C and v -// differ, the entries are typecasted into the type of C. Any settings made to -// C by GrB_set (format by row or by column, bitmap switch, hyper -// switch, and sparsity control) are unchanged. +GrB_Info GrB_Scalar_extractElement_FP32 // x = s +( + float *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from +) ; -GrB_Info GxB_Matrix_diag // construct a diagonal matrix from a vector +GrB_Info GrB_Scalar_extractElement_FP64 // x = s ( - GrB_Matrix C, // output matrix - const GrB_Vector v, // input vector - int64_t k, - const GrB_Descriptor desc // to specify # of threads + double *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from ) ; -// GxB_Vector_diag extracts a vector v from an input matrix A, which may be -// rectangular. If k = 0, the main diagonal of A is extracted; k > 0 denotes -// diagonals above the main diagonal of A, and k < 0 denotes diagonals below -// the main diagonal of A. Let A have dimension m-by-n. If k is in the range -// 0 to n-1, then v has length min(m,n-k). If k is negative and in the range -// -1 to -m+1, then v has length min(m+k,n). If k is outside these ranges, -// v has length 0 (this is not an error). +GrB_Info GxB_Scalar_extractElement_FC32 // x = s +( + GxB_FC32_t *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from +) ; -// v must already exist on input, of the correct length; that is -// GrB_Vector_size (&len,v) must return len = 0 if k >= n or k <= -m, len = -// min(m,n-k) if k is in the range 0 to n-1, and len = min(m+k,n) if k is in -// the range -1 to -m+1. Any existing entries in v are discarded. The type of -// v is preserved, so that if the type of A and v differ, the entries are -// typecasted into the type of v. Any settings made to v by -// GrB_set (bitmap switch and sparsity control) are unchanged. +GrB_Info GxB_Scalar_extractElement_FC64 // x = s +( + GxB_FC64_t *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from +) ; -GrB_Info GxB_Vector_diag // extract a diagonal from a matrix, as a vector +GrB_Info GrB_Scalar_extractElement_UDT // x = s ( - GrB_Vector v, // output vector - const GrB_Matrix A, // input matrix - int64_t k, - const GrB_Descriptor desc // unused, except threading control + void *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from ) ; -#endif // GB_CUDA_FOLDER +// historical names identical to GrB_Scalar_methods above: +GrB_Info GxB_Scalar_extractElement_BOOL (bool *x, const GrB_Scalar s) ; +GrB_Info GxB_Scalar_extractElement_INT8 (int8_t *x, const GrB_Scalar s) ; +GrB_Info GxB_Scalar_extractElement_INT16 (int16_t *x, const GrB_Scalar s) ; +GrB_Info GxB_Scalar_extractElement_INT32 (int32_t *x, const GrB_Scalar s) ; +GrB_Info GxB_Scalar_extractElement_INT64 (int64_t *x, const GrB_Scalar s) ; +GrB_Info GxB_Scalar_extractElement_UINT8 (uint8_t *x, const GrB_Scalar s) ; +GrB_Info GxB_Scalar_extractElement_UINT16 (uint16_t *x, const GrB_Scalar s) ; +GrB_Info GxB_Scalar_extractElement_UINT32 (uint32_t *x, const GrB_Scalar s) ; +GrB_Info GxB_Scalar_extractElement_UINT64 (uint64_t *x, const GrB_Scalar s) ; +GrB_Info GxB_Scalar_extractElement_FP32 (float *x, const GrB_Scalar s) ; +GrB_Info GxB_Scalar_extractElement_FP64 (double *x, const GrB_Scalar s) ; +GrB_Info GxB_Scalar_extractElement_UDT (void *x, const GrB_Scalar s) ; -//============================================================================== -// SuiteSparse:GraphBLAS options -//============================================================================== +// Type-generic version: x can be a pointer to any supported C type or void * +// for a user-defined type. -// The following options modify how SuiteSparse:GraphBLAS stores and operates -// on its matrices. The GrB_get/set methods allow the user to suggest how the -// internal representation of a matrix, or all matrices, should be held. These -// options have no effect on the result (except for minor roundoff differences -// for floating-point types). They only affect the time and memory usage of the -// computations. +/* -typedef enum // for global options or matrix options -{ +GrB_Info GrB_Scalar_extractElement // x = s +( + *x, // user scalar extracted + const GrB_Scalar s // GrB_Scalar to extract an entry from +) ; - //------------------------------------------------------------ - // GrB_get / GrB_set for GrB_Matrix and GrB_GLOBAL: - //------------------------------------------------------------ +*/ - GxB_HYPER_SWITCH = 7000, // switch to hypersparse (double value) - GxB_HYPER_HASH = 7048, // hyper_hash control (int64 value) - GxB_BITMAP_SWITCH = 7001, // switch to bitmap (double value) - GxB_FORMAT = 7002, // historical; use GrB_STORAGE_ORIENTATION_HINT +#if GxB_STDC_VERSION >= 201112L +#define GrB_Scalar_extractElement(x,s) \ + _Generic \ + ( \ + (x), \ + GB_PCASES (GrB, Scalar_extractElement) \ + ) \ + (x, s) - //------------------------------------------------------------ - // GrB_get for GrB_GLOBAL: - //------------------------------------------------------------ +// historical; use GrB_Scalar_extractElement instead: +#define GxB_Scalar_extractElement(x,s) GrB_Scalar_extractElement (x, s) +#endif - GxB_MODE = 7003, // historical; use GrB_BLOCKING_MODE - GxB_LIBRARY_NAME = 7004, // historical; use GrB_NAME - GxB_LIBRARY_VERSION = 7005, // historical; use GrB_LIBRARY_VER_* - GxB_LIBRARY_DATE = 7006, // date of the library (char *) - GxB_LIBRARY_ABOUT = 7007, // about the library (char *) - GxB_LIBRARY_URL = 7008, // URL for the library (char *) - GxB_LIBRARY_LICENSE = 7009, // license of the library (char *) - GxB_LIBRARY_COMPILE_DATE = 7010, // date library was compiled (char *) - GxB_LIBRARY_COMPILE_TIME = 7011, // time library was compiled (char *) - GxB_API_VERSION = 7012, // historical; use GrB_API_VER_* - GxB_API_DATE = 7013, // date of the API (char *) - GxB_API_ABOUT = 7014, // about the API (char *) - GxB_API_URL = 7015, // URL for the API (char *) - GxB_COMPILER_VERSION = 7016, // compiler version (3 int's) - GxB_COMPILER_NAME = 7017, // compiler name (char *) - GxB_LIBRARY_OPENMP = 7018, // library compiled with OpenMP - GxB_MALLOC_FUNCTION = 7037, // malloc function pointer - GxB_CALLOC_FUNCTION = 7038, // calloc function pointer - GxB_REALLOC_FUNCTION = 7039, // realloc function pointer - GxB_FREE_FUNCTION = 7040, // free function pointer +//============================================================================== +// GrB_Vector: a GraphBLAS vector +//============================================================================== - //------------------------------------------------------------ - // GrB_get / GrB_set for GrB_GLOBAL: - //------------------------------------------------------------ +// These methods create, free, copy, and clear a vector. The size, nvals, +// and type methods return basic information about a vector. - GxB_GLOBAL_NTHREADS = GxB_NTHREADS, // max number of threads to use - GxB_GLOBAL_CHUNK = GxB_CHUNK, // chunk size for small problems. - GxB_GLOBAL_GPU_ID = GxB_GPU_ID, // which GPU to use (DRAFT) +GrB_Info GrB_Vector_new // create a new vector with no entries +( + GrB_Vector *v, // handle of vector to create + GrB_Type type, // type of vector to create + GrB_Index n // vector dimension is n-by-1 + // (n must be <= GrB_INDEX_MAX+1) +) ; - GxB_BURBLE = 7019, // diagnostic output - GxB_PRINTF = 7020, // printf function diagnostic output - GxB_FLUSH = 7021, // flush function diagnostic output - GxB_MEMORY_POOL = 7022, // no longer used - GxB_PRINT_1BASED = 7023, // print matrices as 0-based or 1-based +GrB_Info GrB_Vector_dup // make an exact copy of a vector +( + GrB_Vector *w, // handle of output vector to create + const GrB_Vector u // input vector to copy +) ; - GxB_JIT_C_COMPILER_NAME = 7024, // CPU JIT C compiler name - GxB_JIT_C_COMPILER_FLAGS = 7025, // CPU JIT C compiler flags - GxB_JIT_C_LINKER_FLAGS = 7026, // CPU JIT C linker flags - GxB_JIT_C_LIBRARIES = 7027, // CPU JIT C libraries - GxB_JIT_C_PREFACE = 7028, // CPU JIT C preface - GxB_JIT_C_CONTROL = 7029, // CPU JIT C control - GxB_JIT_CACHE_PATH = 7030, // CPU/CUDA JIT path for compiled kernels - GxB_JIT_C_CMAKE_LIBS = 7031, // CPU JIT C libraries when using cmake - GxB_JIT_USE_CMAKE = 7032, // CPU JIT: use cmake or direct compile - GxB_JIT_ERROR_LOG = 7033, // CPU JIT: error log file - - GxB_JIT_CUDA_PREFACE = 7100, // CUDA JIT C++ preface - - //------------------------------------------------------------ - // GrB_get for GrB_Matrix: - //------------------------------------------------------------ - - GxB_SPARSITY_STATUS = 7034, // hyper, sparse, bitmap or full (1,2,4,8) - GxB_IS_HYPER = 7035, // historical; use GxB_SPARSITY_STATUS - - //------------------------------------------------------------ - // GrB_get/GrB_set for GrB_Matrix: - //------------------------------------------------------------ - - GxB_SPARSITY_CONTROL = 7036, // sparsity control: 0 to 15; see below - -} GxB_Option_Field ; - -// for GxB_JIT_C_CONTROL: -typedef enum -{ - GxB_JIT_OFF = 0, // do not use the JIT: free all JIT kernels if loaded - GxB_JIT_PAUSE = 1, // do not run JIT kernels but keep any loaded - GxB_JIT_RUN = 2, // run JIT kernels if already loaded; no load/compile - GxB_JIT_LOAD = 3, // able to load and run JIT kernels; may not compile - GxB_JIT_ON = 4, // full JIT: able to compile, load, and run -} -GxB_JIT_Control ; - -// GxB_FORMAT is historical, but it can be by row or by column: -typedef enum -{ - GxB_BY_ROW = 0, // CSR: compressed sparse row format - GxB_BY_COL = 1, // CSC: compressed sparse column format - GxB_NO_FORMAT = -1 // format not defined -} -GxB_Format_Value ; - -// The default format is by row. These constants are defined as GB_GLOBAL -// const, so that if SuiteSparse:GraphBLAS is recompiled with a different -// default format, and the application is relinked but not recompiled, it will -// acquire the new default values. -GB_GLOBAL const GxB_Format_Value GxB_FORMAT_DEFAULT ; - -// the default hyper_switch parameter -GB_GLOBAL const double GxB_HYPER_DEFAULT ; +GrB_Info GrB_Vector_clear // clear a vector of all entries; +( // type and dimension remain unchanged. + GrB_Vector v // vector to clear +) ; -// GxB_SPARSITY_CONTROL can be any sum or bitwise OR of these 4 values: -#define GxB_HYPERSPARSE 1 // store matrix in hypersparse form -#define GxB_SPARSE 2 // store matrix as sparse form (compressed vector) -#define GxB_BITMAP 4 // store matrix as a bitmap -#define GxB_FULL 8 // store matrix as full; all entries must be present +GrB_Info GrB_Vector_size // get the dimension of a vector +( + GrB_Index *n, // vector dimension is n-by-1 + const GrB_Vector v // vector to query +) ; -// size of b array for GxB_set/get (GxB_BITMAP_SWITCH, b) -#define GxB_NBITMAP_SWITCH 8 // size of bitmap_switch parameter array +GrB_Info GrB_Vector_nvals // get the number of entries in a vector +( + GrB_Index *nvals, // vector has nvals entries + const GrB_Vector v // vector to query +) ; -// any sparsity value: -#define GxB_ANY_SPARSITY (GxB_HYPERSPARSE + GxB_SPARSE + GxB_BITMAP + GxB_FULL) +// historical; use GrB_get instead: +GrB_Info GxB_Vector_type (GrB_Type *type, const GrB_Vector v) ; +GrB_Info GxB_Vector_type_name (char *type_name, const GrB_Vector v) ; -// the default sparsity control is any format: -#define GxB_AUTO_SPARSITY GxB_ANY_SPARSITY +GrB_Info GxB_Vector_memoryUsage // return # of bytes used for a vector +( + size_t *size, // # of bytes used by the vector v + const GrB_Vector v // vector to query +) ; -// GrB_set (A, scontrol, GxB_SPARSITY_CONTROL) provides hints -// about which data structure GraphBLAS should use for the matrix A: -// -// GxB_AUTO_SPARSITY: GraphBLAS selects automatically. -// GxB_HYPERSPARSE: always hypersparse, taking O(nvals(A)) space. -// GxB_SPARSE: always in a sparse struture: compressed-sparse row/column, -// taking O(nrows+nvals(A)) space if stored by row, or -// O(ncols+nvals(A)) if stored by column. -// GxB_BITMAP: always in a bitmap struture, taking O(nrows*ncols) space. -// GxB_FULL: always in a full structure, taking O(nrows*ncols) space, -// unless not all entries are present, in which case the bitmap -// storage is used. -// -// These options can be summed. For example, to allow a matrix to be sparse -// or hypersparse, but not bitmap or full, use GxB_SPARSE + GxB_HYPERSPARSE. -// Since GxB_FULL can only be used when all entries are present, matrices with -// the just GxB_FULL control setting are stored in bitmap form if any entries -// are not present. -// -// Only the least 4 bits of the sparsity control are considered, so the -// formats can be bitwise negated. For example, to allow for any format -// except full, use ~GxB_FULL. -// -// GrB_get (A, &sparsity, GxB_SPARSITY_STATUS) returns the -// current data structure currently used for the matrix A (either hypersparse, -// sparse, bitmap, or full). -// -// GrB_get (A, &scontrol, GxB_SPARSITY_CONTROL) returns the hint -// for how A should be stored (hypersparse, sparse, bitmap, or full, or any -// combination). +GrB_Info GxB_Vector_iso // return iso status of a vector +( + bool *iso, // true if the vector is iso-valued + const GrB_Vector v // vector to query +) ; -// GxB_HYPER_SWITCH: -// If the matrix or vector structure can be sparse or hypersparse, the -// GxB_HYPER_SWITCH parameter controls when each of these structures are -// used. The parameter is not used if the matrix or vector is full or -// bitmap. -// -// Let k be the actual number of non-empty vectors (with at least one -// entry). This value k is not dependent on whether or not the matrix is -// stored in hypersparse structure. Let n be the number of vectors (the # -// of columns if CSC, or rows if CSR). Let h be the value of the -// GxB_HYPER_SWITCH setting of the matrix. -// -// If a matrix is currently hypersparse, it can be converted to -// non-hypersparse if (n <= 1 || k > 2*n*h). Otherwise it stays -// hypersparse. If (n <= 1) the matrix is always stored as -// non-hypersparse. -// -// If currently non-hypersparse, it can be converted to hypersparse if (n -// > 1 && k <= n*h). Otherwise, it stays non-hypersparse. If (n <= 1) -// the matrix always remains non-hypersparse. -// -// Setting GxB_HYPER_SWITCH to GxB_ALWAYS_HYPER or GxB_NEVER_HYPER ensures -// a matrix always stays hypersparse, or always stays non-hypersparse, -// respectively. +GrB_Info GrB_Vector_free // free a vector +( + GrB_Vector *v // handle of vector to free +) ; -GB_GLOBAL const double GxB_ALWAYS_HYPER, GxB_NEVER_HYPER ; +//------------------------------------------------------------------------------ +// GrB_Vector_build +//------------------------------------------------------------------------------ -//============================================================================== -// GxB_Context: for managing computational resources -//============================================================================== +// GrB_Vector_build: w = sparse (I,1,X), but using any +// associative operator to assemble duplicate entries. -typedef struct GB_Context_opaque *GxB_Context ; +GrB_Info GrB_Vector_build_BOOL // build a vector from (I,X) tuples +( + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const bool *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates +) ; -// GxB_CONTEXT_WORLD is the default Context for all user threads. -GB_GLOBAL GxB_Context GxB_CONTEXT_WORLD ; +GrB_Info GrB_Vector_build_INT8 // build a vector from (I,X) tuples +( + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const int8_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates +) ; -typedef enum -{ - GxB_CONTEXT_NTHREADS = GxB_NTHREADS, // max number of threads to use. - // If <= 0, then one thread is used. +GrB_Info GrB_Vector_build_UINT8 // build a vector from (I,X) tuples +( + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const uint8_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates +) ; - GxB_CONTEXT_CHUNK = GxB_CHUNK, // chunk size for small problems. - // If < 1, then the default is used. +GrB_Info GrB_Vector_build_INT16 // build a vector from (I,X) tuples +( + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const int16_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates +) ; - // GPU control (DRAFT: in progress, do not use) - GxB_CONTEXT_GPU_ID = GxB_GPU_ID, -} -GxB_Context_Field ; +GrB_Info GrB_Vector_build_UINT16 // build a vector from (I,X) tuples +( + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const uint16_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates +) ; -#ifndef GB_CUDA_FOLDER +GrB_Info GrB_Vector_build_INT32 // build a vector from (I,X) tuples +( + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const int32_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates +) ; -GrB_Info GxB_Context_new // create a new Context +GrB_Info GrB_Vector_build_UINT32 // build a vector from (I,X) tuples ( - GxB_Context *Context // handle of Context to create + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const uint32_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -GrB_Info GxB_Context_free // free a Context +GrB_Info GrB_Vector_build_INT64 // build a vector from (I,X) tuples ( - GxB_Context *Context // handle of Context to free + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const int64_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -GrB_Info GxB_Context_engage // engage a Context +GrB_Info GrB_Vector_build_UINT64 // build a vector from (I,X) tuples ( - GxB_Context Context // Context to engage + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const uint64_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -GrB_Info GxB_Context_disengage // disengage a Context +GrB_Info GrB_Vector_build_FP32 // build a vector from (I,X) tuples ( - GxB_Context Context // Context to disengage + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const float *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -//============================================================================== -// GxB_set and GxB_get: historical; use GrB_set and GrB_get instead -//============================================================================== +GrB_Info GrB_Vector_build_FP64 // build a vector from (I,X) tuples +( + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const double *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates +) ; -// historical: use GrB_set and GrB_get instead of these methods: -GrB_Info GxB_Matrix_Option_set (GrB_Matrix, GxB_Option_Field, ...) ; -GrB_Info GxB_Matrix_Option_set_INT32 (GrB_Matrix, GxB_Option_Field, int32_t) ; -GrB_Info GxB_Matrix_Option_set_FP64 (GrB_Matrix, GxB_Option_Field, double) ; -GrB_Info GxB_Matrix_Option_get (GrB_Matrix, GxB_Option_Field, ...) ; -GrB_Info GxB_Matrix_Option_get_INT32 (GrB_Matrix, GxB_Option_Field, int32_t *) ; -GrB_Info GxB_Matrix_Option_get_FP64 (GrB_Matrix, GxB_Option_Field, double *) ; -GrB_Info GxB_Vector_Option_set (GrB_Vector, GxB_Option_Field, ...) ; -GrB_Info GxB_Vector_Option_set_INT32 (GrB_Vector, GxB_Option_Field, int32_t) ; -GrB_Info GxB_Vector_Option_set_FP64 (GrB_Vector, GxB_Option_Field, double) ; -GrB_Info GxB_Vector_Option_get (GrB_Vector, GxB_Option_Field, ...) ; -GrB_Info GxB_Vector_Option_get_INT32 (GrB_Vector, GxB_Option_Field, int32_t *) ; -GrB_Info GxB_Vector_Option_get_FP64 (GrB_Vector, GxB_Option_Field, double *) ; -GrB_Info GxB_Global_Option_set (GxB_Option_Field, ...) ; -GrB_Info GxB_Global_Option_set_INT32 (GxB_Option_Field, int32_t) ; -GrB_Info GxB_Global_Option_set_FP64 (GxB_Option_Field, double) ; -GrB_Info GxB_Global_Option_set_FP64_ARRAY (GxB_Option_Field, double *) ; -GrB_Info GxB_Global_Option_set_INT64_ARRAY (GxB_Option_Field, int64_t *) ; -GrB_Info GxB_Global_Option_set_CHAR (GxB_Option_Field, const char *) ; -GrB_Info GxB_Global_Option_set_FUNCTION (GxB_Option_Field, void *) ; -GrB_Info GxB_Global_Option_get (GxB_Option_Field, ...) ; -GrB_Info GxB_Global_Option_get_INT32 (GxB_Option_Field, int32_t *) ; -GrB_Info GxB_Global_Option_get_FP64 (GxB_Option_Field, double *) ; -GrB_Info GxB_Global_Option_get_INT64 (GxB_Option_Field, int64_t *) ; -GrB_Info GxB_Global_Option_get_CHAR (GxB_Option_Field, const char **) ; -GrB_Info GxB_Global_Option_get_FUNCTION (GxB_Option_Field, void **) ; -GrB_Info GxB_Context_set_INT32 (GxB_Context, GxB_Context_Field, int32_t) ; -GrB_Info GxB_Context_set_FP64 (GxB_Context, GxB_Context_Field, double) ; -GrB_Info GxB_Context_set (GxB_Context, GxB_Context_Field, ...) ; -GrB_Info GxB_Context_get_INT32 (GxB_Context, GxB_Context_Field, int32_t *) ; -GrB_Info GxB_Context_get_FP64 (GxB_Context, GxB_Context_Field, double *) ; -GrB_Info GxB_Context_get (GxB_Context, GxB_Context_Field, ...) ; +GrB_Info GxB_Vector_build_FC32 // build a vector from (I,X) tuples +( + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const GxB_FC32_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates +) ; -#if GxB_STDC_VERSION >= 201112L -#define GxB_set(arg1,...) \ - _Generic \ - ( \ - (arg1), \ - default: GxB_Global_Option_set , \ - GxB_Option_Field : GxB_Global_Option_set , \ - GrB_Vector : GxB_Vector_Option_set , \ - GrB_Matrix : GxB_Matrix_Option_set , \ - GrB_Descriptor : GxB_Desc_set , \ - GxB_Context : GxB_Context_set \ - ) \ - (arg1, __VA_ARGS__) +GrB_Info GxB_Vector_build_FC64 // build a vector from (I,X) tuples +( + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const GxB_FC64_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates +) ; -#define GxB_get(arg1,...) \ - _Generic \ - ( \ - (arg1), \ - default: GxB_Global_Option_get , \ - GxB_Option_Field : GxB_Global_Option_get , \ - GrB_Vector : GxB_Vector_Option_get , \ - GrB_Matrix : GxB_Matrix_Option_get , \ - GrB_Descriptor : GxB_Desc_get , \ - GxB_Context : GxB_Context_get \ - ) \ - (arg1, __VA_ARGS__) -#endif +GrB_Info GrB_Vector_build_UDT // build a vector from (I,X) tuples +( + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const void *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates +) ; -#endif // GB_CUDA_FOLDER +GrB_Info GxB_Vector_build_Scalar // build a vector from (i,scalar) tuples +( + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + GrB_Scalar scalar, // value for all tuples + GrB_Index nvals // number of tuples +) ; -//============================================================================== -// GrB_set and GrB_get -//============================================================================== +// Type-generic version: X can be a pointer to any supported C type or void * +// for a user-defined type. -typedef struct GB_Global_opaque *GrB_Global ; -GB_GLOBAL const GrB_Global GrB_GLOBAL ; +/* +GrB_Info GrB_Vector_build // build a vector from (I,X) tuples +( + GrB_Vector w, // vector to build + const GrB_Index *Ilist, // array of row indices of tuples + const *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates +) ; +*/ -typedef enum -{ +#if GxB_STDC_VERSION >= 201112L +#define GrB_Vector_build(w,Ilist,X,nvals,dup) \ + _Generic \ + ( \ + (X), \ + GB_PCASES (GrB, Vector_build) \ + ) \ + (w, Ilist, ((const void *) (X)), nvals, dup) +#endif - //-------------------------------------------------------------------------- - // GrB enums in the C API - //-------------------------------------------------------------------------- +//------------------------------------------------------------------------------ +// GrB_Vector_setElement +//------------------------------------------------------------------------------ - // GrB_Descriptor only: - GrB_OUTP_FIELD = 0, // descriptor for output of a method - GrB_MASK_FIELD = 1, // descriptor for the mask input of a method - GrB_INP0_FIELD = 2, // descriptor for the first input of a method - GrB_INP1_FIELD = 3, // descriptor for the second input of a method +// Set a single scalar in a vector, w(i) = x, typecasting from the type of x to +// the type of w as needed. - // all objects, including GrB_GLOBAL: - GrB_NAME = 10, // name of the object, as a string +GrB_Info GrB_Vector_setElement_BOOL // w(i) = x +( + GrB_Vector w, // vector to modify + bool x, // scalar to assign to w(i) + GrB_Index i // row index +) ; - // GrB_GLOBAL only: - GrB_LIBRARY_VER_MAJOR = 11, // SuiteSparse:GraphBLAS version - GrB_LIBRARY_VER_MINOR = 12, - GrB_LIBRARY_VER_PATCH = 13, - GrB_API_VER_MAJOR = 14, // C API version - GrB_API_VER_MINOR = 15, - GrB_API_VER_PATCH = 16, - GrB_BLOCKING_MODE = 17, // GrB_Mode +GrB_Info GrB_Vector_setElement_INT8 // w(i) = x +( + GrB_Vector w, // vector to modify + int8_t x, // scalar to assign to w(i) + GrB_Index i // row index +) ; - // GrB_GLOBAL, GrB_Matrix, GrB_Vector, GrB_Scalar: - GrB_STORAGE_ORIENTATION_HINT = 100, // GrB_Orientation +GrB_Info GrB_Vector_setElement_UINT8 // w(i) = x +( + GrB_Vector w, // vector to modify + uint8_t x, // scalar to assign to w(i) + GrB_Index i // row index +) ; - // GrB_Matrix, GrB_Vector, GrB_Scalar (and void * serialize): - GrB_EL_TYPE_CODE = 102, // a GrB_Type_code (see below) - GrB_EL_TYPE_STRING = 106, // name of the type +GrB_Info GrB_Vector_setElement_INT16 // w(i) = x +( + GrB_Vector w, // vector to modify + int16_t x, // scalar to assign to w(i) + GrB_Index i // row index +) ; - // GrB_*Op, GrB_Monoid, and GrB_Semiring: - GrB_INP0_TYPE_CODE = 103, // GrB_Type_code - GrB_INP1_TYPE_CODE = 104, - GrB_OUTP_TYPE_CODE = 105, - GrB_INP0_TYPE_STRING = 107, // name of the type, as a string - GrB_INP1_TYPE_STRING = 108, - GrB_OUTP_TYPE_STRING = 109, +GrB_Info GrB_Vector_setElement_UINT16 // w(i) = x +( + GrB_Vector w, // vector to modify + uint16_t x, // scalar to assign to w(i) + GrB_Index i // row index +) ; - // GrB_Type (readable only): - GrB_SIZE = 110, // size of the type +GrB_Info GrB_Vector_setElement_INT32 // w(i) = x +( + GrB_Vector w, // vector to modify + int32_t x, // scalar to assign to w(i) + GrB_Index i // row index +) ; - //-------------------------------------------------------------------------- - // SuiteSparse extensions: - //-------------------------------------------------------------------------- +GrB_Info GrB_Vector_setElement_UINT32 // w(i) = x +( + GrB_Vector w, // vector to modify + uint32_t x, // scalar to assign to w(i) + GrB_Index i // row index +) ; - // GrB_Type, GrB_UnaryOp, GrB_BinaryOp, and GrB_IndexUnaryOp: - GxB_JIT_C_NAME = 7041, // C type or function name - GxB_JIT_C_DEFINITION = 7042, // C typedef or function definition +GrB_Info GrB_Vector_setElement_INT64 // w(i) = x +( + GrB_Vector w, // vector to modify + int64_t x, // scalar to assign to w(i) + GrB_Index i // row index +) ; - // GrB_Monoid and GrB_Semiring: - GxB_MONOID_IDENTITY = 7043, // monoid identity value - GxB_MONOID_TERMINAL = 7044, // monoid terminal value - GxB_MONOID_OPERATOR = 7045, // monoid binary operator +GrB_Info GrB_Vector_setElement_UINT64 // w(i) = x +( + GrB_Vector w, // vector to modify + uint64_t x, // scalar to assign to w(i) + GrB_Index i // row index +) ; - // GrB_Semiring only: - GxB_SEMIRING_MONOID = 7046, // semiring monoid - GxB_SEMIRING_MULTIPLY = 7047, // semiring multiplicative op -} -GrB_Field ; +GrB_Info GrB_Vector_setElement_FP32 // w(i) = x +( + GrB_Vector w, // vector to modify + float x, // scalar to assign to w(i) + GrB_Index i // row index +) ; -typedef enum -{ - GrB_ROWMAJOR = 0, - GrB_COLMAJOR = 1, - GrB_BOTH = 2, - GrB_UNKNOWN = 3, -} -GrB_Orientation ; +GrB_Info GrB_Vector_setElement_FP64 // w(i) = x +( + GrB_Vector w, // vector to modify + double x, // scalar to assign to w(i) + GrB_Index i // row index +) ; -typedef enum -{ - GrB_UDT_CODE = 0, // user-defined type - GrB_BOOL_CODE = 1, // GraphBLAS: GrB_BOOL C: bool - GrB_INT8_CODE = 2, // GraphBLAS: GrB_INT8 C: int8_t - GrB_UINT8_CODE = 3, // GraphBLAS: GrB_UINT8 C: uint8_t - GrB_INT16_CODE = 4, // GraphBLAS: GrB_INT16 C: int16_t - GrB_UINT16_CODE = 5, // GraphBLAS: GrB_UINT16 C: uint16_t - GrB_INT32_CODE = 6, // GraphBLAS: GrB_INT32 C: int32_t - GrB_UINT32_CODE = 7, // GraphBLAS: GrB_UINT32 C: uint32_t - GrB_INT64_CODE = 8, // GraphBLAS: GrB_INT64 C: int64_t - GrB_UINT64_CODE = 9, // GraphBLAS: GrB_UINT64 C: uint64_t - GrB_FP32_CODE = 10, // GraphBLAS: GrB_FP32 C: float - GrB_FP64_CODE = 11, // GraphBLAS: GrB_FP64 C: double - GxB_FC32_CODE = 7070, // GraphBLAS: GxB_FC32 C: float complex - GxB_FC64_CODE = 7071, // GraphBLAS: GxB_FC64 C: double complex -} -GrB_Type_Code ; +GrB_Info GxB_Vector_setElement_FC32 // w(i) = x +( + GrB_Vector w, // vector to modify + GxB_FC32_t x, // scalar to assign to w(i) + GrB_Index i // row index +) ; + +GrB_Info GxB_Vector_setElement_FC64 // w(i) = x +( + GrB_Vector w, // vector to modify + GxB_FC64_t x, // scalar to assign to w(i) + GrB_Index i // row index +) ; + +GrB_Info GrB_Vector_setElement_UDT // w(i) = x +( + GrB_Vector w, // vector to modify + void *x, // scalar to assign to w(i) + GrB_Index i // row index +) ; + +GrB_Info GrB_Vector_setElement_Scalar // w(i) = x +( + GrB_Vector w, // vector to modify + GrB_Scalar x, // scalar to assign to w(i) + GrB_Index i // row index +) ; + +// Type-generic version: x can be any supported C type or void * for a +// user-defined type. + +/* +GrB_Info GrB_Vector_setElement // w(i) = x +( + GrB_Vector w, // vector to modify + x, // scalar to assign to w(i) + GrB_Index i // row index +) ; +*/ + +#if GxB_STDC_VERSION >= 201112L +#define GrB_Vector_setElement(w,x,i) \ + _Generic \ + ( \ + (x), \ + GB_CASES (GrB, Vector_setElement), \ + default: GrB_Vector_setElement_Scalar \ + ) \ + (w, x, i) +#endif //------------------------------------------------------------------------------ -// GrB_get: get a scalar, string, enum, size, or void * from an object +// GrB_Vector_extractElement //------------------------------------------------------------------------------ -#ifndef GB_CUDA_FOLDER -GrB_Info GrB_Scalar_get_Scalar (GrB_Scalar, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Scalar_get_String (GrB_Scalar, char * , GrB_Field) ; -GrB_Info GrB_Scalar_get_INT32 (GrB_Scalar, int32_t * , GrB_Field) ; -GrB_Info GrB_Scalar_get_SIZE (GrB_Scalar, size_t * , GrB_Field) ; -GrB_Info GrB_Scalar_get_VOID (GrB_Scalar, void * , GrB_Field) ; +// Extract a single entry from a vector, x = v(i), typecasting from the type of +// v to the type of x as needed. -GrB_Info GrB_Vector_get_Scalar (GrB_Vector, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Vector_get_String (GrB_Vector, char * , GrB_Field) ; -GrB_Info GrB_Vector_get_INT32 (GrB_Vector, int32_t * , GrB_Field) ; -GrB_Info GrB_Vector_get_SIZE (GrB_Vector, size_t * , GrB_Field) ; -GrB_Info GrB_Vector_get_VOID (GrB_Vector, void * , GrB_Field) ; +GrB_Info GrB_Vector_extractElement_BOOL // x = v(i) +( + bool *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; -GrB_Info GrB_Matrix_get_Scalar (GrB_Matrix, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Matrix_get_String (GrB_Matrix, char * , GrB_Field) ; -GrB_Info GrB_Matrix_get_INT32 (GrB_Matrix, int32_t * , GrB_Field) ; -GrB_Info GrB_Matrix_get_SIZE (GrB_Matrix, size_t * , GrB_Field) ; -GrB_Info GrB_Matrix_get_VOID (GrB_Matrix, void * , GrB_Field) ; +GrB_Info GrB_Vector_extractElement_INT8 // x = v(i) +( + int8_t *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; -GrB_Info GxB_Serialized_get_Scalar (const void *, GrB_Scalar, GrB_Field, size_t) ; -GrB_Info GxB_Serialized_get_String (const void *, char * , GrB_Field, size_t) ; -GrB_Info GxB_Serialized_get_INT32 (const void *, int32_t * , GrB_Field, size_t) ; -GrB_Info GxB_Serialized_get_SIZE (const void *, size_t * , GrB_Field, size_t) ; -GrB_Info GxB_Serialized_get_VOID (const void *, void * , GrB_Field, size_t) ; +GrB_Info GrB_Vector_extractElement_UINT8 // x = v(i) +( + uint8_t *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; -GrB_Info GrB_UnaryOp_get_Scalar (GrB_UnaryOp, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_UnaryOp_get_String (GrB_UnaryOp, char * , GrB_Field) ; -GrB_Info GrB_UnaryOp_get_INT32 (GrB_UnaryOp, int32_t * , GrB_Field) ; -GrB_Info GrB_UnaryOp_get_SIZE (GrB_UnaryOp, size_t * , GrB_Field) ; -GrB_Info GrB_UnaryOp_get_VOID (GrB_UnaryOp, void * , GrB_Field) ; +GrB_Info GrB_Vector_extractElement_INT16 // x = v(i) +( + int16_t *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; -GrB_Info GrB_IndexUnaryOp_get_Scalar (GrB_IndexUnaryOp, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_IndexUnaryOp_get_String (GrB_IndexUnaryOp, char * , GrB_Field) ; -GrB_Info GrB_IndexUnaryOp_get_INT32 (GrB_IndexUnaryOp, int32_t * , GrB_Field) ; -GrB_Info GrB_IndexUnaryOp_get_SIZE (GrB_IndexUnaryOp, size_t * , GrB_Field) ; -GrB_Info GrB_IndexUnaryOp_get_VOID (GrB_IndexUnaryOp, void * , GrB_Field) ; +GrB_Info GrB_Vector_extractElement_UINT16 // x = v(i) +( + uint16_t *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; -GrB_Info GrB_BinaryOp_get_Scalar (GrB_BinaryOp, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_BinaryOp_get_String (GrB_BinaryOp, char * , GrB_Field) ; -GrB_Info GrB_BinaryOp_get_INT32 (GrB_BinaryOp, int32_t * , GrB_Field) ; -GrB_Info GrB_BinaryOp_get_SIZE (GrB_BinaryOp, size_t * , GrB_Field) ; -GrB_Info GrB_BinaryOp_get_VOID (GrB_BinaryOp, void * , GrB_Field) ; +GrB_Info GrB_Vector_extractElement_INT32 // x = v(i) +( + int32_t *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; -GrB_Info GrB_Monoid_get_Scalar (GrB_Monoid, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Monoid_get_String (GrB_Monoid, char * , GrB_Field) ; -GrB_Info GrB_Monoid_get_INT32 (GrB_Monoid, int32_t * , GrB_Field) ; -GrB_Info GrB_Monoid_get_SIZE (GrB_Monoid, size_t * , GrB_Field) ; -GrB_Info GrB_Monoid_get_VOID (GrB_Monoid, void * , GrB_Field) ; +GrB_Info GrB_Vector_extractElement_UINT32 // x = v(i) +( + uint32_t *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; -GrB_Info GrB_Semiring_get_Scalar (GrB_Semiring, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Semiring_get_String (GrB_Semiring, char * , GrB_Field) ; -GrB_Info GrB_Semiring_get_INT32 (GrB_Semiring, int32_t * , GrB_Field) ; -GrB_Info GrB_Semiring_get_SIZE (GrB_Semiring, size_t * , GrB_Field) ; -GrB_Info GrB_Semiring_get_VOID (GrB_Semiring, void * , GrB_Field) ; +GrB_Info GrB_Vector_extractElement_INT64 // x = v(i) +( + int64_t *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; -GrB_Info GrB_Descriptor_get_Scalar (GrB_Descriptor, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Descriptor_get_String (GrB_Descriptor, char * , GrB_Field) ; -GrB_Info GrB_Descriptor_get_INT32 (GrB_Descriptor, int32_t * , GrB_Field) ; -GrB_Info GrB_Descriptor_get_SIZE (GrB_Descriptor, size_t * , GrB_Field) ; -GrB_Info GrB_Descriptor_get_VOID (GrB_Descriptor, void * , GrB_Field) ; +GrB_Info GrB_Vector_extractElement_UINT64 // x = v(i) +( + uint64_t *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; -GrB_Info GrB_Type_get_Scalar (GrB_Type, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Type_get_String (GrB_Type, char * , GrB_Field) ; -GrB_Info GrB_Type_get_INT32 (GrB_Type, int32_t * , GrB_Field) ; -GrB_Info GrB_Type_get_SIZE (GrB_Type, size_t * , GrB_Field) ; -GrB_Info GrB_Type_get_VOID (GrB_Type, void * , GrB_Field) ; +GrB_Info GrB_Vector_extractElement_FP32 // x = v(i) +( + float *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; -GrB_Info GrB_Global_get_Scalar (GrB_Global, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Global_get_String (GrB_Global, char * , GrB_Field) ; -GrB_Info GrB_Global_get_INT32 (GrB_Global, int32_t * , GrB_Field) ; -GrB_Info GrB_Global_get_SIZE (GrB_Global, size_t * , GrB_Field) ; -GrB_Info GrB_Global_get_VOID (GrB_Global, void * , GrB_Field) ; +GrB_Info GrB_Vector_extractElement_FP64 // x = v(i) +( + double *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; -GrB_Info GxB_Context_get_Scalar (GxB_Context, GrB_Scalar, GrB_Field) ; -GrB_Info GxB_Context_get_String (GxB_Context, char * , GrB_Field) ; -GrB_Info GxB_Context_get_INT (GxB_Context, int32_t * , GrB_Field) ; -GrB_Info GxB_Context_get_SIZE (GxB_Context, size_t * , GrB_Field) ; -GrB_Info GxB_Context_get_VOID (GxB_Context, void * , GrB_Field) ; +GrB_Info GxB_Vector_extractElement_FC32 // x = v(i) +( + GxB_FC32_t *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; + +GrB_Info GxB_Vector_extractElement_FC64 // x = v(i) +( + GxB_FC64_t *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; + +GrB_Info GrB_Vector_extractElement_UDT // x = v(i) +( + void *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; + +GrB_Info GrB_Vector_extractElement_Scalar // x = v(i) +( + GrB_Scalar x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; + +// Type-generic version: x can be a pointer to any supported C type or void * +// for a user-defined type. + +/* +GrB_Info GrB_Vector_extractElement // x = v(i) +( + *x, // scalar extracted + const GrB_Vector v, // vector to extract an entry from + GrB_Index i // row index +) ; +*/ -// GrB_get (object, value, field): #if GxB_STDC_VERSION >= 201112L -#define GrB_get(object,value,...) \ - _Generic \ - ( \ - (object), \ - GrB_Scalar : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Scalar_get_Scalar , \ - char * : GrB_Scalar_get_String , \ - int32_t * : GrB_Scalar_get_INT32 , \ - size_t * : GrB_Scalar_get_SIZE , \ - void * : GrB_Scalar_get_VOID \ - ) , \ - GrB_Vector : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Vector_get_Scalar , \ - char * : GrB_Vector_get_String , \ - int32_t * : GrB_Vector_get_INT32 , \ - size_t * : GrB_Vector_get_SIZE , \ - void * : GrB_Vector_get_VOID \ - ) , \ - GrB_Matrix : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Matrix_get_Scalar , \ - char * : GrB_Matrix_get_String , \ - int32_t * : GrB_Matrix_get_INT32 , \ - size_t * : GrB_Matrix_get_SIZE , \ - void * : GrB_Matrix_get_VOID \ - ) , \ - GrB_UnaryOp : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_UnaryOp_get_Scalar , \ - char * : GrB_UnaryOp_get_String , \ - int32_t * : GrB_UnaryOp_get_INT32 , \ - size_t * : GrB_UnaryOp_get_SIZE , \ - void * : GrB_UnaryOp_get_VOID \ - ) , \ - GrB_IndexUnaryOp : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_IndexUnaryOp_get_Scalar , \ - char * : GrB_IndexUnaryOp_get_String , \ - int32_t * : GrB_IndexUnaryOp_get_INT32 , \ - size_t * : GrB_IndexUnaryOp_get_SIZE , \ - void * : GrB_IndexUnaryOp_get_VOID \ - ) , \ - GrB_BinaryOp : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_BinaryOp_get_Scalar , \ - char * : GrB_BinaryOp_get_String , \ - int32_t * : GrB_BinaryOp_get_INT32 , \ - size_t * : GrB_BinaryOp_get_SIZE , \ - void * : GrB_BinaryOp_get_VOID \ - ) , \ - GrB_Monoid : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Monoid_get_Scalar , \ - char * : GrB_Monoid_get_String , \ - int32_t * : GrB_Monoid_get_INT32 , \ - size_t * : GrB_Monoid_get_SIZE , \ - void * : GrB_Monoid_get_VOID \ - ) , \ - GrB_Semiring : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Semiring_get_Scalar , \ - char * : GrB_Semiring_get_String , \ - int32_t * : GrB_Semiring_get_INT32 , \ - size_t * : GrB_Semiring_get_SIZE , \ - void * : GrB_Semiring_get_VOID \ - ) , \ - GrB_Type : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Type_get_Scalar , \ - char * : GrB_Type_get_String , \ - int32_t * : GrB_Type_get_INT32 , \ - size_t * : GrB_Type_get_SIZE , \ - void * : GrB_Type_get_VOID \ - ) , \ - GrB_Descriptor : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Descriptor_get_Scalar , \ - char * : GrB_Descriptor_get_String , \ - int32_t * : GrB_Descriptor_get_INT32 , \ - size_t * : GrB_Descriptor_get_SIZE , \ - void * : GrB_Descriptor_get_VOID \ - ) , \ - GrB_Global : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Global_get_Scalar , \ - char * : GrB_Global_get_String , \ - int32_t * : GrB_Global_get_INT32 , \ - size_t * : GrB_Global_get_SIZE , \ - void * : GrB_Global_get_VOID \ - ) , \ - GxB_Context : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GxB_Context_get_Scalar , \ - char * : GxB_Context_get_String , \ - int32_t * : GxB_Context_get_INT , \ - size_t * : GxB_Context_get_SIZE , \ - void * : GxB_Context_get_VOID \ - ) , \ - const void *: \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GxB_Serialized_get_Scalar , \ - char * : GxB_Serialized_get_String , \ - int32_t * : GxB_Serialized_get_INT32 , \ - size_t * : GxB_Serialized_get_SIZE , \ - void * : GxB_Serialized_get_VOID \ - ) , \ - void *: \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GxB_Serialized_get_Scalar , \ - char * : GxB_Serialized_get_String , \ - int32_t * : GxB_Serialized_get_INT32 , \ - size_t * : GxB_Serialized_get_SIZE , \ - void * : GxB_Serialized_get_VOID \ - ) \ - ) (object, value, __VA_ARGS__) +#define GrB_Vector_extractElement(x,v,i) \ + _Generic \ + ( \ + (x), \ + GB_PCASES (GrB, Vector_extractElement), \ + default: GrB_Vector_extractElement_Scalar \ + ) \ + (x, v, i) #endif -//------------------------------------------------------------------------------ -// GrB_set: set a scalar, string, enum, size, or void * of an object -//------------------------------------------------------------------------------ +// GxB_Vector_isStoredElement determines if v(i) is present in the structure +// of the vector v, as a stored element. It does not return the value. It +// returns GrB_SUCCESS if the element is present, or GrB_NO_VALUE otherwise. -GrB_Info GrB_Scalar_set_Scalar (GrB_Scalar, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Scalar_set_String (GrB_Scalar, char * , GrB_Field) ; -GrB_Info GrB_Scalar_set_INT32 (GrB_Scalar, int32_t , GrB_Field) ; -GrB_Info GrB_Scalar_set_VOID (GrB_Scalar, void * , GrB_Field, size_t) ; +GrB_Info GxB_Vector_isStoredElement // determine if v(i) is a stored element +( + const GrB_Vector v, // vector to check + GrB_Index i // row index +) ; -GrB_Info GrB_Vector_set_Scalar (GrB_Vector, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Vector_set_String (GrB_Vector, char * , GrB_Field) ; -GrB_Info GrB_Vector_set_INT32 (GrB_Vector, int32_t , GrB_Field) ; -GrB_Info GrB_Vector_set_VOID (GrB_Vector, void * , GrB_Field, size_t) ; +//------------------------------------------------------------------------------ +// GrB_Vector_removeElement +//------------------------------------------------------------------------------ -GrB_Info GrB_Matrix_set_Scalar (GrB_Matrix, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Matrix_set_String (GrB_Matrix, char * , GrB_Field) ; -GrB_Info GrB_Matrix_set_INT32 (GrB_Matrix, int32_t , GrB_Field) ; -GrB_Info GrB_Matrix_set_VOID (GrB_Matrix, void * , GrB_Field, size_t) ; +// GrB_Vector_removeElement (v,i) removes the element v(i) from the vector v. -GrB_Info GrB_UnaryOp_set_Scalar (GrB_UnaryOp, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_UnaryOp_set_String (GrB_UnaryOp, char * , GrB_Field) ; -GrB_Info GrB_UnaryOp_set_INT32 (GrB_UnaryOp, int32_t , GrB_Field) ; -GrB_Info GrB_UnaryOp_set_VOID (GrB_UnaryOp, void * , GrB_Field, size_t) ; +GrB_Info GrB_Vector_removeElement +( + GrB_Vector v, // vector to remove an element from + GrB_Index i // index +) ; -GrB_Info GrB_IndexUnaryOp_set_Scalar (GrB_IndexUnaryOp, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_IndexUnaryOp_set_String (GrB_IndexUnaryOp, char * , GrB_Field) ; -GrB_Info GrB_IndexUnaryOp_set_INT32 (GrB_IndexUnaryOp, int32_t , GrB_Field) ; -GrB_Info GrB_IndexUnaryOp_set_VOID (GrB_IndexUnaryOp, void * , GrB_Field, - size_t) ; +//------------------------------------------------------------------------------ +// GrB_Vector_extractTuples +//------------------------------------------------------------------------------ -GrB_Info GrB_BinaryOp_set_Scalar (GrB_BinaryOp, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_BinaryOp_set_String (GrB_BinaryOp, char * , GrB_Field) ; -GrB_Info GrB_BinaryOp_set_INT32 (GrB_BinaryOp, int32_t , GrB_Field) ; -GrB_Info GrB_BinaryOp_set_VOID (GrB_BinaryOp, void * , GrB_Field, size_t) ; +// Extracts all tuples from a vector, like [I,~,X] = find (v). If +// any parameter I and/or X is NULL, then that component is not extracted. For +// example, to extract just the row indices, pass I as non-NULL, and X as NULL. +// This is like [I,~,~] = find (v). -GrB_Info GrB_Monoid_set_Scalar (GrB_Monoid, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Monoid_set_String (GrB_Monoid, char * , GrB_Field) ; -GrB_Info GrB_Monoid_set_INT32 (GrB_Monoid, int32_t , GrB_Field) ; -GrB_Info GrB_Monoid_set_VOID (GrB_Monoid, void * , GrB_Field, size_t) ; +GrB_Info GrB_Vector_extractTuples_BOOL // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + bool *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; -GrB_Info GrB_Semiring_set_Scalar (GrB_Semiring, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Semiring_set_String (GrB_Semiring, char * , GrB_Field) ; -GrB_Info GrB_Semiring_set_INT32 (GrB_Semiring, int32_t , GrB_Field) ; -GrB_Info GrB_Semiring_set_VOID (GrB_Semiring, void * , GrB_Field, size_t) ; +GrB_Info GrB_Vector_extractTuples_INT8 // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + int8_t *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; -GrB_Info GrB_Descriptor_set_Scalar (GrB_Descriptor, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Descriptor_set_String (GrB_Descriptor, char * , GrB_Field) ; -GrB_Info GrB_Descriptor_set_INT32 (GrB_Descriptor, int32_t , GrB_Field) ; -GrB_Info GrB_Descriptor_set_VOID (GrB_Descriptor, void * , GrB_Field, - size_t) ; +GrB_Info GrB_Vector_extractTuples_UINT8 // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + uint8_t *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; -GrB_Info GrB_Type_set_Scalar (GrB_Type, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Type_set_String (GrB_Type, char * , GrB_Field) ; -GrB_Info GrB_Type_set_INT32 (GrB_Type, int32_t , GrB_Field) ; -GrB_Info GrB_Type_set_VOID (GrB_Type, void * , GrB_Field, size_t) ; +GrB_Info GrB_Vector_extractTuples_INT16 // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + int16_t *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; -GrB_Info GrB_Global_set_Scalar (GrB_Global, GrB_Scalar, GrB_Field) ; -GrB_Info GrB_Global_set_String (GrB_Global, char * , GrB_Field) ; -GrB_Info GrB_Global_set_INT32 (GrB_Global, int32_t , GrB_Field) ; -GrB_Info GrB_Global_set_VOID (GrB_Global, void * , GrB_Field, size_t) ; +GrB_Info GrB_Vector_extractTuples_UINT16 // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + uint16_t *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; -GrB_Info GxB_Context_set_Scalar (GxB_Context, GrB_Scalar, GrB_Field) ; -GrB_Info GxB_Context_set_String (GxB_Context, char * , GrB_Field) ; -GrB_Info GxB_Context_set_INT (GxB_Context, int32_t , GrB_Field) ; -GrB_Info GxB_Context_set_VOID (GxB_Context, void * , GrB_Field, size_t) ; +GrB_Info GrB_Vector_extractTuples_INT32 // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + int32_t *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; -// GrB_set (object, value, field) or (object, value, field, size) for _VOID -#if GxB_STDC_VERSION >= 201112L -#define GrB_set(object,value,...) \ - _Generic \ - ( \ - (object), \ - GrB_Scalar : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Scalar_set_Scalar , \ - char * : GrB_Scalar_set_String , \ - int32_t : GrB_Scalar_set_INT32 , \ - void * : GrB_Scalar_set_VOID \ - ) , \ - GrB_Vector : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Vector_set_Scalar , \ - char * : GrB_Vector_set_String , \ - int32_t : GrB_Vector_set_INT32 , \ - void * : GrB_Vector_set_VOID \ - ) , \ - GrB_Matrix : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Matrix_set_Scalar , \ - char * : GrB_Matrix_set_String , \ - int32_t : GrB_Matrix_set_INT32 , \ - void * : GrB_Matrix_set_VOID \ - ) , \ - GrB_UnaryOp : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_UnaryOp_set_Scalar , \ - char * : GrB_UnaryOp_set_String , \ - int32_t : GrB_UnaryOp_set_INT32 , \ - void * : GrB_UnaryOp_set_VOID \ - ) , \ - GrB_IndexUnaryOp : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_IndexUnaryOp_set_Scalar , \ - char * : GrB_IndexUnaryOp_set_String , \ - int32_t : GrB_IndexUnaryOp_set_INT32 , \ - void * : GrB_IndexUnaryOp_set_VOID \ - ) , \ - GrB_BinaryOp : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_BinaryOp_set_Scalar , \ - char * : GrB_BinaryOp_set_String , \ - int32_t : GrB_BinaryOp_set_INT32 , \ - void * : GrB_BinaryOp_set_VOID \ - ) , \ - GrB_Monoid : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Monoid_set_Scalar , \ - char * : GrB_Monoid_set_String , \ - int32_t : GrB_Monoid_set_INT32 , \ - void * : GrB_Monoid_set_VOID \ - ) , \ - GrB_Semiring : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Semiring_set_Scalar , \ - char * : GrB_Semiring_set_String , \ - int32_t : GrB_Semiring_set_INT32 , \ - void * : GrB_Semiring_set_VOID \ - ) , \ - GrB_Type : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Type_set_Scalar , \ - char * : GrB_Type_set_String , \ - int32_t : GrB_Type_set_INT32 , \ - void * : GrB_Type_set_VOID \ - ) , \ - GrB_Descriptor : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Descriptor_set_Scalar , \ - char * : GrB_Descriptor_set_String , \ - int32_t : GrB_Descriptor_set_INT32 , \ - void * : GrB_Descriptor_set_VOID \ - ) , \ - GrB_Global : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GrB_Global_set_Scalar , \ - char * : GrB_Global_set_String , \ - int32_t : GrB_Global_set_INT32 , \ - void * : GrB_Global_set_VOID \ - ) , \ - GxB_Context : \ - _Generic \ - ( \ - (value), \ - GrB_Scalar : GxB_Context_set_Scalar , \ - char * : GxB_Context_set_String , \ - int32_t : GxB_Context_set_INT , \ - void * : GxB_Context_set_VOID \ - ) \ - ) (object, value, __VA_ARGS__) -#endif +GrB_Info GrB_Vector_extractTuples_UINT32 // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + uint32_t *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; -#endif // GB_CUDA_FOLDER +GrB_Info GrB_Vector_extractTuples_INT64 // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + int64_t *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; -//============================================================================== -// GrB_free: free any GraphBLAS object -//============================================================================== +GrB_Info GrB_Vector_extractTuples_UINT64 // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + uint64_t *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; -// for null and invalid objects -#define GrB_NULL NULL -#define GrB_INVALID_HANDLE NULL +GrB_Info GrB_Vector_extractTuples_FP32 // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + float *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; -#ifndef GB_CUDA_FOLDER +GrB_Info GrB_Vector_extractTuples_FP64 // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + double *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; + +GrB_Info GxB_Vector_extractTuples_FC32 // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + GxB_FC32_t *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; + +GrB_Info GxB_Vector_extractTuples_FC64 // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + GxB_FC64_t *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; + +GrB_Info GrB_Vector_extractTuples_UDT // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + void *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; + +// Type-generic version: X can be a pointer to any supported C type or void * +// for a user-defined type. + +/* +GrB_Info GrB_Vector_extractTuples // [I,~,X] = find (v) +( + GrB_Index *Ilist, // array for returning row indices of tuples + *X, // array for returning values of tuples + GrB_Index *nvals, // I, X size on input; # tuples on output + const GrB_Vector v // vector to extract tuples from +) ; +*/ #if GxB_STDC_VERSION >= 201112L -#define GrB_free(object) \ +#define GrB_Vector_extractTuples(Ilist,X,nvals,v) \ _Generic \ ( \ - (object), \ - GrB_Type *: GrB_Type_free , \ - GrB_UnaryOp *: GrB_UnaryOp_free , \ - GrB_BinaryOp *: GrB_BinaryOp_free , \ - GrB_IndexUnaryOp *: GrB_IndexUnaryOp_free , \ - GrB_Monoid *: GrB_Monoid_free , \ - GrB_Semiring *: GrB_Semiring_free , \ - GrB_Scalar *: GrB_Scalar_free , \ - GrB_Vector *: GrB_Vector_free , \ - GrB_Matrix *: GrB_Matrix_free , \ - GrB_Descriptor *: GrB_Descriptor_free , \ - GxB_Context *: GxB_Context_free , \ - GxB_Iterator *: GxB_Iterator_free \ + (X), \ + GB_PCASES (GrB, Vector_extractTuples) \ ) \ - (object) -#endif - + (Ilist, X, nvals, v) #endif //============================================================================== -// GrB_wait: finish computations +// GrB_Matrix: a GraphBLAS matrix //============================================================================== -typedef enum -{ - GrB_COMPLETE = 0, // establishes a happens-before relation - GrB_MATERIALIZE = 1 // object is complete -} -GrB_WaitMode ; +// These methods create, free, copy, and clear a matrix. The nrows, ncols, +// nvals, and type methods return basic information about a matrix. -#ifndef GB_CUDA_FOLDER +GrB_Info GrB_Matrix_new // create a new matrix with no entries +( + GrB_Matrix *A, // handle of matrix to create + GrB_Type type, // type of matrix to create + GrB_Index nrows, // matrix dimension is nrows-by-ncols + GrB_Index ncols // (nrows and ncols must be <= GrB_INDEX_MAX+1) +) ; -// Finish all pending work in a specific object. +GrB_Info GrB_Matrix_dup // make an exact copy of a matrix +( + GrB_Matrix *C, // handle of output matrix to create + const GrB_Matrix A // input matrix to copy +) ; -GrB_Info GrB_Type_wait (GrB_Type type , GrB_WaitMode waitmode); -GrB_Info GrB_UnaryOp_wait (GrB_UnaryOp op , GrB_WaitMode waitmode); -GrB_Info GrB_BinaryOp_wait (GrB_BinaryOp op , GrB_WaitMode waitmode); -GrB_Info GrB_IndexUnaryOp_wait (GrB_IndexUnaryOp op , GrB_WaitMode waitmode); -GrB_Info GrB_Monoid_wait (GrB_Monoid monoid , GrB_WaitMode waitmode); -GrB_Info GrB_Semiring_wait (GrB_Semiring semiring, GrB_WaitMode waitmode); -GrB_Info GrB_Descriptor_wait (GrB_Descriptor desc , GrB_WaitMode waitmode); -GrB_Info GrB_Scalar_wait (GrB_Scalar s , GrB_WaitMode waitmode); -GrB_Info GrB_Vector_wait (GrB_Vector v , GrB_WaitMode waitmode); -GrB_Info GrB_Matrix_wait (GrB_Matrix A , GrB_WaitMode waitmode); -GrB_Info GxB_Context_wait (GxB_Context Context , GrB_WaitMode waitmode); +GrB_Info GrB_Matrix_clear // clear a matrix of all entries; +( // type and dimensions remain unchanged + GrB_Matrix A // matrix to clear +) ; -// GrB_wait (object,waitmode) polymorphic function: -#if GxB_STDC_VERSION >= 201112L -#define GrB_wait(object,waitmode) \ - _Generic \ - ( \ - (object), \ - GrB_Type : GrB_Type_wait , \ - GrB_UnaryOp : GrB_UnaryOp_wait , \ - GrB_BinaryOp : GrB_BinaryOp_wait , \ - GrB_IndexUnaryOp : GrB_IndexUnaryOp_wait , \ - GrB_Monoid : GrB_Monoid_wait , \ - GrB_Semiring : GrB_Semiring_wait , \ - GrB_Scalar : GrB_Scalar_wait , \ - GrB_Vector : GrB_Vector_wait , \ - GrB_Matrix : GrB_Matrix_wait , \ - GxB_Context : GxB_Context_wait , \ - GrB_Descriptor : GrB_Descriptor_wait \ - ) \ - (object, waitmode) -#endif - -// NOTE: GxB_Scalar_wait is historical; use GrB_Scalar_wait instead -GrB_Info GxB_Scalar_wait (GrB_Scalar *s) ; +GrB_Info GrB_Matrix_nrows // get the number of rows of a matrix +( + GrB_Index *nrows, // matrix has nrows rows + const GrB_Matrix A // matrix to query +) ; -//============================================================================== -// GrB_error: error handling -//============================================================================== +GrB_Info GrB_Matrix_ncols // get the number of columns of a matrix +( + GrB_Index *ncols, // matrix has ncols columns + const GrB_Matrix A // matrix to query +) ; -// Each GraphBLAS method and operation returns a GrB_Info error code. -// GrB_error returns additional information on the error in a thread-safe -// null-terminated string. The string returned by GrB_error is owned by -// the GraphBLAS library and must not be free'd. +GrB_Info GrB_Matrix_nvals // get the number of entries in a matrix +( + GrB_Index *nvals, // matrix has nvals entries + const GrB_Matrix A // matrix to query +) ; -GrB_Info GrB_Type_error (const char **error, const GrB_Type type) ; -GrB_Info GrB_UnaryOp_error (const char **error, const GrB_UnaryOp op) ; -GrB_Info GrB_BinaryOp_error (const char **error, const GrB_BinaryOp op) ; -GrB_Info GrB_IndexUnaryOp_error (const char **error, const GrB_IndexUnaryOp op) ; -GrB_Info GrB_Monoid_error (const char **error, const GrB_Monoid monoid) ; -GrB_Info GrB_Semiring_error (const char **error, const GrB_Semiring semiring) ; -GrB_Info GrB_Scalar_error (const char **error, const GrB_Scalar s) ; -GrB_Info GrB_Vector_error (const char **error, const GrB_Vector v) ; -GrB_Info GrB_Matrix_error (const char **error, const GrB_Matrix A) ; -GrB_Info GrB_Descriptor_error (const char **error, const GrB_Descriptor d) ; -// GxB_Scalar_error is historical: use GrB_Scalar_error instead -GrB_Info GxB_Scalar_error (const char **error, const GrB_Scalar s) ; -GrB_Info GxB_Context_error (const char **error, const GxB_Context Context); +// historical; use GrB_get instead: +GrB_Info GxB_Matrix_type (GrB_Type *type, const GrB_Matrix A) ; +GrB_Info GxB_Matrix_type_name (char *type_name, const GrB_Matrix A) ; -// GrB_error (error,object) polymorphic function: -#if GxB_STDC_VERSION >= 201112L -#define GrB_error(error,object) \ - _Generic \ - ( \ - (object), \ - GrB_Type : GrB_Type_error , \ - GrB_UnaryOp : GrB_UnaryOp_error , \ - GrB_BinaryOp : GrB_BinaryOp_error , \ - GrB_IndexUnaryOp : GrB_IndexUnaryOp_error , \ - GrB_Monoid : GrB_Monoid_error , \ - GrB_Semiring : GrB_Semiring_error , \ - GrB_Scalar : GrB_Scalar_error , \ - GrB_Vector : GrB_Vector_error , \ - GrB_Matrix : GrB_Matrix_error , \ - GxB_Context : GxB_Context_error , \ - GrB_Descriptor : GrB_Descriptor_error \ - ) \ - (error, object) -#endif +GrB_Info GxB_Matrix_memoryUsage // return # of bytes used for a matrix +( + size_t *size, // # of bytes used by the matrix A + const GrB_Matrix A // matrix to query +) ; -//============================================================================== -// GrB_mxm, vxm, mxv: matrix multiplication over a semiring -//============================================================================== +GrB_Info GxB_Matrix_iso // return iso status of a matrix +( + bool *iso, // true if the matrix is iso-valued + const GrB_Matrix A // matrix to query +) ; -GrB_Info GrB_mxm // C = accum (C, A*B) +GrB_Info GrB_Matrix_free // free a matrix ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_Semiring semiring, // defines '+' and '*' for A*B - const GrB_Matrix A, // first input: matrix A - const GrB_Matrix B, // second input: matrix B - const GrB_Descriptor desc // descriptor for C, Mask, A, and B + GrB_Matrix *A // handle of matrix to free ) ; -GrB_Info GrB_vxm // w' = accum (w, u'*A) +//------------------------------------------------------------------------------ +// GrB_Matrix_build +//------------------------------------------------------------------------------ + +// GrB_Matrix_build: C = sparse (I,J,X), but using any +// associative operator to assemble duplicate entries. + +GrB_Info GrB_Matrix_build_BOOL // build a matrix from (I,J,X) tuples ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_Semiring semiring, // defines '+' and '*' for u'*A - const GrB_Vector u, // first input: vector u - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for w, mask, and A + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const bool *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -GrB_Info GrB_mxv // w = accum (w, A*u) +GrB_Info GrB_Matrix_build_INT8 // build a matrix from (I,J,X) tuples ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_Semiring semiring, // defines '+' and '*' for A*B - const GrB_Matrix A, // first input: matrix A - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w, mask, and A + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const int8_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -//============================================================================== -// GrB_eWiseMult: element-wise matrix and vector operations, set intersection -//============================================================================== +GrB_Info GrB_Matrix_build_UINT8 // build a matrix from (I,J,X) tuples +( + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const uint8_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates +) ; -// GrB_eWiseMult computes C = accum (C, A.*B), where ".*" is the Hadamard -// product, and where pairs of elements in two matrices (or vectors) are -// pairwise "multiplied" with C(i,j) = mult (A(i,j),B(i,j)). +GrB_Info GrB_Matrix_build_INT16 // build a matrix from (I,J,X) tuples +( + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const int16_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates +) ; -GrB_Info GrB_Vector_eWiseMult_Semiring // w = accum (w, u.*v) +GrB_Info GrB_Matrix_build_UINT16 // build a matrix from (I,J,X) tuples ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_Semiring semiring, // defines '.*' for t=u.*v - const GrB_Vector u, // first input: vector u - const GrB_Vector v, // second input: vector v - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const uint16_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -GrB_Info GrB_Vector_eWiseMult_Monoid // w = accum (w, u.*v) +GrB_Info GrB_Matrix_build_INT32 // build a matrix from (I,J,X) tuples ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_Monoid monoid, // defines '.*' for t=u.*v - const GrB_Vector u, // first input: vector u - const GrB_Vector v, // second input: vector v - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const int32_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -GrB_Info GrB_Vector_eWiseMult_BinaryOp // w = accum (w, u.*v) +GrB_Info GrB_Matrix_build_UINT32 // build a matrix from (I,J,X) tuples ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp mult, // defines '.*' for t=u.*v - const GrB_Vector u, // first input: vector u - const GrB_Vector v, // second input: vector v - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const uint32_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -GrB_Info GrB_Matrix_eWiseMult_Semiring // C = accum (C, A.*B) +GrB_Info GrB_Matrix_build_INT64 // build a matrix from (I,J,X) tuples ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_Semiring semiring, // defines '.*' for T=A.*B - const GrB_Matrix A, // first input: matrix A - const GrB_Matrix B, // second input: matrix B - const GrB_Descriptor desc // descriptor for C, Mask, A, and B + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const int64_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -GrB_Info GrB_Matrix_eWiseMult_Monoid // C = accum (C, A.*B) +GrB_Info GrB_Matrix_build_UINT64 // build a matrix from (I,J,X) tuples ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_Monoid monoid, // defines '.*' for T=A.*B - const GrB_Matrix A, // first input: matrix A - const GrB_Matrix B, // second input: matrix B - const GrB_Descriptor desc // descriptor for C, Mask, A, and B + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const uint64_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -GrB_Info GrB_Matrix_eWiseMult_BinaryOp // C = accum (C, A.*B) +GrB_Info GrB_Matrix_build_FP32 // build a matrix from (I,J,X) tuples ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp mult, // defines '.*' for T=A.*B - const GrB_Matrix A, // first input: matrix A - const GrB_Matrix B, // second input: matrix B - const GrB_Descriptor desc // descriptor for C, Mask, A, and B + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const float *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -// All 6 of the above type-specific functions are captured in a single -// type-generic function, GrB_eWiseMult: - -#if GxB_STDC_VERSION >= 201112L -#define GrB_eWiseMult(C,Mask,accum,op,A,B,desc) \ - _Generic \ - ( \ - (C), \ - GrB_Matrix : \ - _Generic \ - ( \ - (op), \ - GrB_Semiring : GrB_Matrix_eWiseMult_Semiring , \ - GrB_Monoid : GrB_Matrix_eWiseMult_Monoid , \ - GrB_BinaryOp : GrB_Matrix_eWiseMult_BinaryOp \ - ), \ - GrB_Vector : \ - _Generic \ - ( \ - (op), \ - GrB_Semiring : GrB_Vector_eWiseMult_Semiring , \ - GrB_Monoid : GrB_Vector_eWiseMult_Monoid , \ - GrB_BinaryOp : GrB_Vector_eWiseMult_BinaryOp \ - ) \ - ) \ - (C, Mask, accum, op, A, B, desc) -#endif - -//============================================================================== -// GrB_eWiseAdd: element-wise matrix and vector operations, set union -//============================================================================== - -// GrB_eWiseAdd computes C = accum (C, A+B), where pairs of elements in -// two matrices (or two vectors) are pairwise "added". - -GrB_Info GrB_Vector_eWiseAdd_Semiring // w = accum (w, u+v) +GrB_Info GrB_Matrix_build_FP64 // build a matrix from (I,J,X) tuples ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_Semiring semiring, // defines '+' for t=u+v - const GrB_Vector u, // first input: vector u - const GrB_Vector v, // second input: vector v - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const double *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -GrB_Info GrB_Vector_eWiseAdd_Monoid // w = accum (w, u+v) +GrB_Info GxB_Matrix_build_FC32 // build a matrix from (I,J,X) tuples ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_Monoid monoid, // defines '+' for t=u+v - const GrB_Vector u, // first input: vector u - const GrB_Vector v, // second input: vector v - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const GxB_FC32_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -GrB_Info GrB_Vector_eWiseAdd_BinaryOp // w = accum (w, u+v) +GrB_Info GxB_Matrix_build_FC64 // build a matrix from (I,J,X) tuples ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp add, // defines '+' for t=u+v - const GrB_Vector u, // first input: vector u - const GrB_Vector v, // second input: vector v - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const GxB_FC64_t *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -GrB_Info GrB_Matrix_eWiseAdd_Semiring // C = accum (C, A+B) +GrB_Info GrB_Matrix_build_UDT // build a matrix from (I,J,X) tuples ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_Semiring semiring, // defines '+' for T=A+B - const GrB_Matrix A, // first input: matrix A - const GrB_Matrix B, // second input: matrix B - const GrB_Descriptor desc // descriptor for C, Mask, A, and B + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const void *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; -GrB_Info GrB_Matrix_eWiseAdd_Monoid // C = accum (C, A+B) +GrB_Info GxB_Matrix_build_Scalar // build a matrix from (I,J,scalar) tuples ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_Monoid monoid, // defines '+' for T=A+B - const GrB_Matrix A, // first input: matrix A - const GrB_Matrix B, // second input: matrix B - const GrB_Descriptor desc // descriptor for C, Mask, A, and B + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + GrB_Scalar scalar, // value for all tuples + GrB_Index nvals // number of tuples ) ; -GrB_Info GrB_Matrix_eWiseAdd_BinaryOp // C = accum (C, A+B) +// Type-generic version: X can be a pointer to any supported C type or void * +// for a user-defined type. + +/* +GrB_Info GrB_Matrix_build // build a matrix from (I,J,X) tuples ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp add, // defines '+' for T=A+B - const GrB_Matrix A, // first input: matrix A - const GrB_Matrix B, // second input: matrix B - const GrB_Descriptor desc // descriptor for C, Mask, A, and B + GrB_Matrix C, // matrix to build + const GrB_Index *Ilist, // array of row indices of tuples + const GrB_Index *J, // array of column indices of tuples + const *X, // array of values of tuples + GrB_Index nvals, // number of tuples + const GrB_BinaryOp dup // binary function to assemble duplicates ) ; +*/ #if GxB_STDC_VERSION >= 201112L -#define GrB_eWiseAdd(C,Mask,accum,op,A,B,desc) \ - _Generic \ - ( \ - (C), \ - GrB_Matrix : \ - _Generic \ - ( \ - (op), \ - GrB_Semiring : GrB_Matrix_eWiseAdd_Semiring , \ - GrB_Monoid : GrB_Matrix_eWiseAdd_Monoid , \ - GrB_BinaryOp : GrB_Matrix_eWiseAdd_BinaryOp \ - ), \ - GrB_Vector : \ - _Generic \ - ( \ - (op), \ - GrB_Semiring : GrB_Vector_eWiseAdd_Semiring , \ - GrB_Monoid : GrB_Vector_eWiseAdd_Monoid , \ - GrB_BinaryOp : GrB_Vector_eWiseAdd_BinaryOp \ - ) \ - ) \ - (C, Mask, accum, op, A, B, desc) +#define GrB_Matrix_build(C,Ilist,J,X,nvals,dup) \ + _Generic \ + ( \ + (X), \ + GB_PCASES (GrB, Matrix_build) \ + ) \ + (C, Ilist, J, ((const void *) (X)), nvals, dup) #endif -//============================================================================== -// GxB_eWiseUnion: a variant of GrB_eWiseAdd -//============================================================================== - -// GxB_eWiseUnion is a variant of eWiseAdd. The methods create a result with -// the same sparsity structure. They differ when an entry is present in A but -// not B, or in B but not A. - -// eWiseAdd does the following, for a matrix, where "+" is the add binary op: +//------------------------------------------------------------------------------ +// GrB_Matrix_setElement +//------------------------------------------------------------------------------ -// if A(i,j) and B(i,j) are both present: -// C(i,j) = A(i,j) + B(i,j) -// else if A(i,j) is present but not B(i,j) -// C(i,j) = A(i,j) -// else if B(i,j) is present but not A(i,j) -// C(i,j) = B(i,j) +// Set a single entry in a matrix, C(i,j) = x, typecasting +// from the type of x to the type of C, as needed. -// by contrast, eWiseUnion always applies the operator: +GrB_Info GrB_Matrix_setElement_BOOL // C (i,j) = x +( + GrB_Matrix C, // matrix to modify + bool x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index +) ; -// if A(i,j) and B(i,j) are both present: -// C(i,j) = A(i,j) + B(i,j) -// else if A(i,j) is present but not B(i,j) -// C(i,j) = A(i,j) + beta -// else if B(i,j) is present but not A(i,j) -// C(i,j) = alpha + B(i,j) +GrB_Info GrB_Matrix_setElement_INT8 // C (i,j) = x +( + GrB_Matrix C, // matrix to modify + int8_t x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index +) ; -GrB_Info GxB_Vector_eWiseUnion // w = accum (w, u+v) +GrB_Info GrB_Matrix_setElement_UINT8 // C (i,j) = x ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp add, // defines '+' for t=u+v - const GrB_Vector u, // first input: vector u - const GrB_Scalar alpha, - const GrB_Vector v, // second input: vector v - const GrB_Scalar beta, - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // matrix to modify + uint8_t x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Matrix_eWiseUnion // C = accum (C, A+B) +GrB_Info GrB_Matrix_setElement_INT16 // C (i,j) = x ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp add, // defines '+' for T=A+B - const GrB_Matrix A, // first input: matrix A - const GrB_Scalar alpha, - const GrB_Matrix B, // second input: matrix B - const GrB_Scalar beta, - const GrB_Descriptor desc // descriptor for C, M, A, and B + GrB_Matrix C, // matrix to modify + int16_t x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index ) ; -#if GxB_STDC_VERSION >= 201112L -#define GxB_eWiseUnion(C,Mask,accum,op,A,alpha,B,beta,desc) \ - _Generic \ - ( \ - (C), \ - GrB_Matrix : GxB_Matrix_eWiseUnion , \ - GrB_Vector : GxB_Vector_eWiseUnion \ - ) \ - (C, Mask, accum, op, A, alpha, B, beta, desc) -#endif +GrB_Info GrB_Matrix_setElement_UINT16 // C (i,j) = x +( + GrB_Matrix C, // matrix to modify + uint16_t x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index +) ; -#endif // GB_CUDA_FOLDER +GrB_Info GrB_Matrix_setElement_INT32 // C (i,j) = x +( + GrB_Matrix C, // matrix to modify + int32_t x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index +) ; -//============================================================================== -// GrB_extract: extract a submatrix or subvector -//============================================================================== - -// Extract entries from a matrix or vector; T = A(I,J). This (like most -// GraphBLAS methods) is then followed by C=accum(C,T). - -// To extract all rows of a matrix or vector, as in A (:,J), use I=GrB_ALL as -// the input argument. For all columns of a matrix, use J=GrB_ALL. - -GB_GLOBAL const uint64_t *GrB_ALL ; - -// To extract a range of rows and columns, I and J can be a list of 2 or 3 -// indices that defines a range (begin:end) or a strided range (begin:inc:end). -// To specify the colon syntax I = begin:end, the array I has size at least 2, -// where I [GxB_BEGIN] = begin and I [GxB_END] = end. The parameter ni is then -// passed as the special value GxB_RANGE. To specify the colon syntax I = -// begin:inc:end, the array I has size at least three, with the values begin, -// end, and inc (in that order), and then pass in the value ni = GxB_STRIDE. -// The same can be done for the list J and its size, nj. - -// These special values of ni and nj can be used for GrB_assign, -// GrB_extract, and GxB_subassign. -#define GxB_RANGE (INT64_MAX) -#define GxB_STRIDE (INT64_MAX-1) -#define GxB_BACKWARDS (INT64_MAX-2) +GrB_Info GrB_Matrix_setElement_UINT32 // C (i,j) = x +( + GrB_Matrix C, // matrix to modify + uint32_t x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index +) ; -// for the strided range begin:inc:end, I [GxB_BEGIN] is the value of begin, I -// [GxB_END] is the value end, I [GxB_INC] is the magnitude of the stride. If -// the stride is negative, use ni = GxB_BACKWARDS. -#define GxB_BEGIN (0) -#define GxB_END (1) -#define GxB_INC (2) +GrB_Info GrB_Matrix_setElement_INT64 // C (i,j) = x +( + GrB_Matrix C, // matrix to modify + int64_t x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index +) ; -// For example, the notation 10:-2:1 defines a sequence [10 8 6 4 2]. -// The end point of the sequence (1) need not appear in the sequence, if -// the last increment goes past it. To specify the same in GraphBLAS, -// use: +GrB_Info GrB_Matrix_setElement_UINT64 // C (i,j) = x +( + GrB_Matrix C, // matrix to modify + uint64_t x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index +) ; -// GrB_Index I [3], ni = GxB_BACKWARDS ; -// I [GxB_BEGIN ] = 10 ; // the start of the sequence -// I [GxB_INC ] = 2 ; // the magnitude of the increment -// I [GxB_END ] = 1 ; // the end of the sequence +GrB_Info GrB_Matrix_setElement_FP32 // C (i,j) = x +( + GrB_Matrix C, // matrix to modify + float x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index +) ; -#ifndef GB_CUDA_FOLDER +GrB_Info GrB_Matrix_setElement_FP64 // C (i,j) = x +( + GrB_Matrix C, // matrix to modify + double x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index +) ; -GrB_Info GrB_Vector_extract // w = accum (w, u(I)) +GrB_Info GxB_Matrix_setElement_FC32 // C (i,j) = x ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_Vector u, // first input: vector u - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // matrix to modify + GxB_FC32_t x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GrB_Matrix_extract // C = accum (C, A(I,J)) +GrB_Info GxB_Matrix_setElement_FC64 // C (i,j) = x ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_Matrix A, // first input: matrix A - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C, Mask, and A + GrB_Matrix C, // matrix to modify + GxB_FC64_t x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GrB_Col_extract // w = accum (w, A(I,j)) +GrB_Info GrB_Matrix_setElement_UDT // C (i,j) = x ( - GrB_Vector w, // input/output matrix for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_Matrix A, // first input: matrix A - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - GrB_Index j, // column index - const GrB_Descriptor desc // descriptor for w, mask, and A + GrB_Matrix C, // matrix to modify + void *x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index ) ; -//------------------------------------------------------------------------------ -// GrB_extract: generic matrix/vector extraction -//------------------------------------------------------------------------------ +GrB_Info GrB_Matrix_setElement_Scalar // C (i,j) = x +( + GrB_Matrix C, // matrix to modify + GrB_Scalar x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index +) ; -// GrB_extract is a generic interface to the following functions: +// Type-generic version: x can be any supported C type or void * for a +// user-defined type. -// GrB_Vector_extract (w,mask,acc,u,I,ni,d) // w = acc (w, u(I)) -// GrB_Col_extract (w,mask,acc,A,I,ni,j,d) // w = acc (w, A(I,j)) -// GrB_Matrix_extract (C,Mask,acc,A,I,ni,J,nj,d) // C = acc (C, A(I,J)) +/* +GrB_Info GrB_Matrix_setElement // C (i,j) = x +( + GrB_Matrix C, // matrix to modify + x, // scalar to assign to C(i,j) + GrB_Index i, // row index + GrB_Index j // column index +) ; +*/ #if GxB_STDC_VERSION >= 201112L -#define GrB_extract(arg1,Mask,accum,arg4,...) \ - _Generic \ - ( \ - (arg1), \ - GrB_Vector : \ - _Generic \ - ( \ - (arg4), \ - GrB_Vector : GrB_Vector_extract , \ - GrB_Matrix : GrB_Col_extract \ - ), \ - GrB_Matrix : GrB_Matrix_extract \ - ) \ - (arg1, Mask, accum, arg4, __VA_ARGS__) +#define GrB_Matrix_setElement(C,x,i,j) \ + _Generic \ + ( \ + (x), \ + GB_CASES (GrB, Matrix_setElement), \ + default: GrB_Matrix_setElement_Scalar \ + ) \ + (C, x, i, j) #endif -//============================================================================== -// GxB_subassign: matrix and vector subassign: C(I,J) = accum (C(I,J), A) -//============================================================================== - -// Assign entries in a matrix or vector; C(I,J) = A. - -// Each GxB_subassign function is very similar to its corresponding GrB_assign -// function in the spec, but they differ in two ways: (1) the mask in -// GxB_subassign has the same size as w(I) for vectors and C(I,J) for matrices, -// and (2) they differ in the GrB_REPLACE option. See the user guide for -// details. - -// In GraphBLAS notation, the two methods can be described as follows: +//------------------------------------------------------------------------------ +// GrB_Matrix_extractElement +//------------------------------------------------------------------------------ -// matrix and vector subassign: C(I,J) = accum (C(I,J), A) -// matrix and vector assign: C(I,J) = accum (C(I,J), A) +// Extract a single entry from a matrix, x = A(i,j), typecasting from the type +// of A to the type of x, as needed. -// --- assign ------------------------------------------------------------------ -// -// GrB_Matrix_assign C(I,J) += A M same size as matrix C. -// A is |I|-by-|J| -// -// GrB_Vector_assign w(I) += u m same size as column vector w. -// u is |I|-by-1 -// -// GrB_Row_assign C(i,J) += u' m is a column vector the same -// size as a row of C. -// u is |J|-by-1, i is a scalar. -// -// GrB_Col_assign C(I,j) += u m is a column vector the same -// size as a column of C. -// u is |I|-by-1, j is a scalar. -// -// --- subassign --------------------------------------------------------------- -// -// GxB_Matrix_subassign C(I,J) += A M same size as matrix A. -// A is |I|-by-|J| -// -// GxB_Vector_subassign w(I) += u m same size as column vector u. -// u is |I|-by-1 -// -// GxB_Row_subassign C(i,J) += u' m same size as column vector u. -// u is |J|-by-1, i is a scalar. -// -// GxB_Col_subassign C(I,j) += u m same size as column vector u. -// u is |I|-by-1, j is a scalar. +GrB_Info GrB_Matrix_extractElement_BOOL // x = A(i,j) +( + bool *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index +) ; -GrB_Info GxB_Vector_subassign // w(I) = accum (w(I),u) +GrB_Info GrB_Matrix_extractElement_INT8 // x = A(i,j) ( - GrB_Vector w, // input/output matrix for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w(I),t) - const GrB_Vector u, // first input: vector u - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask + int8_t *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Matrix_subassign // C(I,J) = accum (C(I,J),A) +GrB_Info GrB_Matrix_extractElement_UINT8 // x = A(i,j) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),T) - const GrB_Matrix A, // first input: matrix A - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J), Mask, and A + uint8_t *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Col_subassign // C(I,j) = accum (C(I,j),u) +GrB_Info GrB_Matrix_extractElement_INT16 // x = A(i,j) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Vector mask, // optional mask for C(I,j), unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(C(I,j),t) - const GrB_Vector u, // input vector - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - GrB_Index j, // column index - const GrB_Descriptor desc // descriptor for C(I,j) and mask + int16_t *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Row_subassign // C(i,J) = accum (C(i,J),u') +GrB_Info GrB_Matrix_extractElement_UINT16 // x = A(i,j) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Vector mask, // optional mask for C(i,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(C(i,J),t) - const GrB_Vector u, // input vector - GrB_Index i, // row index - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(i,J) and mask + uint16_t *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -//------------------------------------------------------------------------------ -// GxB_Vector_subassign_[SCALAR]: scalar expansion assignment to subvector -//------------------------------------------------------------------------------ - -// Assigns a single scalar to a subvector, w(I) = accum(w(I),x). The -// scalar x is implicitly expanded into a vector u of size ni-by-1, with each -// entry in u equal to x, and then w(I) = accum(w(I),u) is done. - -GrB_Info GxB_Vector_subassign_BOOL // w(I) = accum (w(I),x) +GrB_Info GrB_Matrix_extractElement_INT32 // x = A(i,j) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w(I),x) - bool x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask + int32_t *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Vector_subassign_INT8 // w(I) = accum (w(I),x) +GrB_Info GrB_Matrix_extractElement_UINT32 // x = A(i,j) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - int8_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask + uint32_t *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Vector_subassign_UINT8 // w(I) = accum (w(I),x) +GrB_Info GrB_Matrix_extractElement_INT64 // x = A(i,j) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - uint8_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask + int64_t *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Vector_subassign_INT16 // w(I) = accum (w(I),x) +GrB_Info GrB_Matrix_extractElement_UINT64 // x = A(i,j) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - int16_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask + uint64_t *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Vector_subassign_UINT16 // w(I) = accum (w(I),x) +GrB_Info GrB_Matrix_extractElement_FP32 // x = A(i,j) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - uint16_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask + float *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Vector_subassign_INT32 // w(I) = accum (w(I),x) +GrB_Info GrB_Matrix_extractElement_FP64 // x = A(i,j) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - int32_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask + double *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Vector_subassign_UINT32 // w(I) = accum (w(I),x) +GrB_Info GxB_Matrix_extractElement_FC32 // x = A(i,j) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - uint32_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask + GxB_FC32_t *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Vector_subassign_INT64 // w(I) = accum (w(I),x) +GrB_Info GxB_Matrix_extractElement_FC64 // x = A(i,j) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - int64_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask + GxB_FC64_t *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Vector_subassign_UINT64 // w(I) = accum (w(I),x) +GrB_Info GrB_Matrix_extractElement_UDT // x = A(i,j) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - uint64_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask + void *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Vector_subassign_FP32 // w(I) = accum (w(I),x) +GrB_Info GrB_Matrix_extractElement_Scalar // x = A(i,j) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - float x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask + GrB_Scalar x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Vector_subassign_FP64 // w(I) = accum (w(I),x) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - double x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask -) ; +// Type-generic version: x can be a pointer to any supported C type or void * +// for a user-defined type. -GrB_Info GxB_Vector_subassign_FC32 // w(I) = accum (w(I),x) +/* +GrB_Info GrB_Matrix_extractElement // x = A(i,j) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - GxB_FC32_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask + *x, // extracted scalar + const GrB_Matrix A, // matrix to extract a scalar from + GrB_Index i, // row index + GrB_Index j // column index ) ; +*/ -GrB_Info GxB_Vector_subassign_FC64 // w(I) = accum (w(I),x) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - GxB_FC64_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask -) ; +#if GxB_STDC_VERSION >= 201112L +#define GrB_Matrix_extractElement(x,A,i,j) \ + _Generic \ + ( \ + (x), \ + GB_PCASES (GrB, Matrix_extractElement), \ + default: GrB_Matrix_extractElement_Scalar \ + ) \ + (x, A, i, j) +#endif -GrB_Info GxB_Vector_subassign_UDT // w(I) = accum (w(I),x) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - void *x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask -) ; +// GxB_Matrix_isStoredElement determines if A(i,j) is present in the structure +// of the matrix A, as a stored element. It does not return the value. It +// returns GrB_SUCCESS if the element is present, or GrB_NO_VALUE otherwise. -GrB_Info GxB_Vector_subassign_Scalar // w(I) = accum (w(I),x) +GrB_Info GxB_Matrix_isStoredElement // determine if A(i,j) is a stored element ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w(I), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - GrB_Scalar x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w(I) and mask + const GrB_Matrix A, // matrix to check + GrB_Index i, // row index + GrB_Index j // column index ) ; //------------------------------------------------------------------------------ -// GxB_Matrix_subassign_[SCALAR]: scalar expansion assignment to submatrix +// GrB_Matrix_removeElement //------------------------------------------------------------------------------ -// Assigns a single scalar to a submatrix, C(I,J) = accum(C(I,J),x). The -// scalar x is implicitly expanded into a matrix A of size ni-by-nj, with each -// entry in A equal to x, and then C(I,J) = accum(C(I,J),A) is done. +// GrB_Matrix_removeElement (A,i,j) removes the entry A(i,j) from the matrix A. -GrB_Info GxB_Matrix_subassign_BOOL // C(I,J) = accum (C(I,J),x) +GrB_Info GrB_Matrix_removeElement ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - bool x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Matrix C, // matrix to remove entry from + GrB_Index i, // row index + GrB_Index j // column index ) ; -GrB_Info GxB_Matrix_subassign_INT8 // C(I,J) = accum (C(I,J),x) +//------------------------------------------------------------------------------ +// GrB_Matrix_extractTuples +//------------------------------------------------------------------------------ + +// Extracts all tuples from a matrix, like [I,J,X] = find (A). If +// any parameter I, J and/or X is NULL, then that component is not extracted. +// For example, to extract just the row and col indices, pass I and J as +// non-NULL, and X as NULL. This is like [I,J,~] = find (A). + +GrB_Info GrB_Matrix_extractTuples_BOOL // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - int8_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + bool *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; -GrB_Info GxB_Matrix_subassign_UINT8 // C(I,J) = accum (C(I,J),x) +GrB_Info GrB_Matrix_extractTuples_INT8 // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - uint8_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + int8_t *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; -GrB_Info GxB_Matrix_subassign_INT16 // C(I,J) = accum (C(I,J),x) +GrB_Info GrB_Matrix_extractTuples_UINT8 // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - int16_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + uint8_t *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; -GrB_Info GxB_Matrix_subassign_UINT16 // C(I,J) = accum (C(I,J),x) +GrB_Info GrB_Matrix_extractTuples_INT16 // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - uint16_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + int16_t *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; -GrB_Info GxB_Matrix_subassign_INT32 // C(I,J) = accum (C(I,J),x) +GrB_Info GrB_Matrix_extractTuples_UINT16 // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - int32_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + uint16_t *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; -GrB_Info GxB_Matrix_subassign_UINT32 // C(I,J) = accum (C(I,J),x) +GrB_Info GrB_Matrix_extractTuples_INT32 // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - uint32_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + int32_t *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; -GrB_Info GxB_Matrix_subassign_INT64 // C(I,J) = accum (C(I,J),x) +GrB_Info GrB_Matrix_extractTuples_UINT32 // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - int64_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + uint32_t *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; -GrB_Info GxB_Matrix_subassign_UINT64 // C(I,J) = accum (C(I,J),x) +GrB_Info GrB_Matrix_extractTuples_INT64 // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - uint64_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + int64_t *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; -GrB_Info GxB_Matrix_subassign_FP32 // C(I,J) = accum (C(I,J),x) +GrB_Info GrB_Matrix_extractTuples_UINT64 // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - float x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + uint64_t *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; -GrB_Info GxB_Matrix_subassign_FP64 // C(I,J) = accum (C(I,J),x) +GrB_Info GrB_Matrix_extractTuples_FP32 // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - double x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + float *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; -GrB_Info GxB_Matrix_subassign_FC32 // C(I,J) = accum (C(I,J),x) +GrB_Info GrB_Matrix_extractTuples_FP64 // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - GxB_FC32_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + double *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; -GrB_Info GxB_Matrix_subassign_FC64 // C(I,J) = accum (C(I,J),x) +GrB_Info GxB_Matrix_extractTuples_FC32 // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - GxB_FC64_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + GxB_FC32_t *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; -GrB_Info GxB_Matrix_subassign_UDT // C(I,J) = accum (C(I,J),x) +GrB_Info GxB_Matrix_extractTuples_FC64 // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - void *x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + GxB_FC64_t *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; -GrB_Info GxB_Matrix_subassign_Scalar // C(I,J) = accum (C(I,J),x) +GrB_Info GrB_Matrix_extractTuples_UDT // [I,J,X] = find (A) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - GrB_Scalar x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(I,J) and Mask + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + void *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from +) ; + +// Type-generic version: X can be a pointer to any supported C type or void * +// for a user-defined type. + +/* +GrB_Info GrB_Matrix_extractTuples // [I,J,X] = find (A) +( + GrB_Index *Ilist, // array for returning row indices of tuples + GrB_Index *J, // array for returning col indices of tuples + *X, // array for returning values of tuples + GrB_Index *nvals, // I,J,X size on input; # tuples on output + const GrB_Matrix A // matrix to extract tuples from ) ; +*/ + +#if GxB_STDC_VERSION >= 201112L +#define GrB_Matrix_extractTuples(Ilist,J,X,nvals,A) \ + _Generic \ + ( \ + (X), \ + GB_PCASES (GrB, Matrix_extractTuples) \ + ) \ + (Ilist, J, X, nvals, A) +#endif //------------------------------------------------------------------------------ -// GxB_subassign: generic submatrix/subvector assignment +// GxB_Matrix_concat and GxB_Matrix_split //------------------------------------------------------------------------------ -// GxB_subassign is a generic function that provides access to all specific -// GxB_*_subassign* functions: +// GxB_Matrix_concat concatenates an array of matrices (Tiles) into a single +// GrB_Matrix C. -// GxB_Vector_subassign (w,m,acc,u,I,ni,d) // w(I) = acc(w(I),u) -// GxB_Matrix_subassign (C,M,acc,A,I,ni,J,nj,d) // C(I,J) = acc(C(I,J),A) -// GxB_Col_subassign (C,m,acc,u,I,ni,j,d) // C(I,j) = acc(C(I,j),u) -// GxB_Row_subassign (C,m,acc,u,i,J,nj,d) // C(i,J) = acc(C(i,J),u') -// GxB_Vector_subassign_T (w,m,acc,x,I,ni,d) // w(I) = acc(w(I),x) -// GxB_Matrix_subassign_T (C,M,acc,x,I,ni,J,nj,d) // C(I,J) = acc(C(I,J),x) +// Tiles is an m-by-n dense array of matrices held in row-major format, where +// Tiles [i*n+j] is the (i,j)th tile, and where m > 0 and n > 0 must hold. Let +// A{i,j} denote the (i,j)th tile. The matrix C is constructed by +// concatenating these tiles together, as: -#if GxB_STDC_VERSION >= 201112L -#define GxB_subassign(arg1,Mask,accum,arg4,arg5,...) \ - _Generic \ - ( \ - (arg1), \ - GrB_Vector : \ - _Generic \ - ( \ - (arg4), \ - GB_CASES (GxB, Vector_subassign) , \ - GrB_Scalar : GxB_Vector_subassign_Scalar, \ - default: GxB_Vector_subassign \ - ), \ - default: \ - _Generic \ - ( \ - (arg4), \ - GB_CASES (GxB, Matrix_subassign) , \ - GrB_Scalar : GxB_Matrix_subassign_Scalar, \ - GrB_Vector : \ - _Generic \ - ( \ - (arg5), \ - const GrB_Index *: GxB_Col_subassign , \ - GrB_Index *: GxB_Col_subassign , \ - default: GxB_Row_subassign \ - ), \ - default: GxB_Matrix_subassign \ - ) \ - ) \ - (arg1, Mask, accum, arg4, arg5, __VA_ARGS__) -#endif - -//============================================================================== -// GrB_assign: matrix and vector assign: C(I,J) = accum (C(I,J), A) -//============================================================================== +// C = [ A{0,0} A{0,1} A{0,2} ... A{0,n-1} +// A{1,0} A{1,1} A{1,2} ... A{1,n-1} +// ... +// A{m-1,0} A{m-1,1} A{m-1,2} ... A{m-1,n-1} ] -// Assign entries in a matrix or vector; C(I,J) = A. -// Each of these can be used with their generic name, GrB_assign. +// On input, the matrix C must already exist. Any existing entries in C are +// discarded. C must have dimensions nrows by ncols where nrows is the sum of +// # of rows in the matrices A{i,0} for all i, and ncols is the sum of the # of +// columns in the matrices A{0,j} for all j. All matrices in any given tile +// row i must have the same number of rows (that is, nrows(A{i,0}) must equal +// nrows(A{i,j}) for all j), and all matrices in any given tile column j must +// have the same number of columns (that is, ncols(A{0,j}) must equal +// ncols(A{i,j}) for all i). -GrB_Info GrB_Vector_assign // w(I) = accum (w(I),u) -( - GrB_Vector w, // input/output matrix for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w(I),t) - const GrB_Vector u, // first input: vector u - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask -) ; +// The type of C is unchanged, and all matrices A{i,j} are typecasted into the +// type of C. Any settings made to C by GrB_set (format by row +// or by column, bitmap switch, hyper switch, and sparsity control) are +// unchanged. -GrB_Info GrB_Matrix_assign // C(I,J) = accum (C(I,J),A) +GrB_Info GxB_Matrix_concat // concatenate a 2D array of matrices ( GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),T) - const GrB_Matrix A, // first input: matrix A - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C, Mask, and A + const GrB_Matrix *Tiles, // 2D row-major array of size m-by-n + const GrB_Index m, + const GrB_Index n, + const GrB_Descriptor desc // unused, except threading control ) ; -GrB_Info GrB_Col_assign // C(I,j) = accum (C(I,j),u) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Vector mask, // optional mask for C(:,j), unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(C(I,j),t) - const GrB_Vector u, // input vector - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - GrB_Index j, // column index - const GrB_Descriptor desc // descriptor for C(:,j) and mask -) ; +// GxB_Matrix_split does the opposite of GxB_Matrix_concat. It splits a single +// input matrix A into a 2D array of tiles. On input, the Tiles array must be +// a non-NULL pointer to a previously allocated array of size at least m*n +// where both m and n must be > 0. The Tiles_nrows array has size m, and +// Tiles_ncols has size n. The (i,j)th tile has dimension +// Tiles_nrows[i]-by-Tiles_ncols[j]. The sum of Tiles_nrows [0:m-1] must equal +// the number of rows of A, and the sum of Tiles_ncols [0:n-1] must equal the +// number of columns of A. The type of each tile is the same as the type of A; +// no typecasting is done. -GrB_Info GrB_Row_assign // C(i,J) = accum (C(i,J),u') +GrB_Info GxB_Matrix_split // split a matrix into 2D array of matrices ( - GrB_Matrix C, // input/output matrix for results - const GrB_Vector mask, // optional mask for C(i,:), unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(C(i,J),t) - const GrB_Vector u, // input vector - GrB_Index i, // row index - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C(i,:) and mask + GrB_Matrix *Tiles, // 2D row-major array of size m-by-n + const GrB_Index m, + const GrB_Index n, + const GrB_Index *Tile_nrows, // array of size m + const GrB_Index *Tile_ncols, // array of size n + const GrB_Matrix A, // input matrix to split + const GrB_Descriptor desc // unused, except threading control ) ; //------------------------------------------------------------------------------ -// GrB_Vector_assign_[SCALAR]: scalar expansion assignment to subvector +// GxB_Matrix_diag, GxB_Vector_diag, GrB_Matrix_diag //------------------------------------------------------------------------------ -// Assigns a single scalar to a subvector, w(I) = accum(w(I),x). The -// scalar x is implicitly expanded into a vector u of size ni-by-1, with each -// entry in u equal to x, and then w(I) = accum(w(I),u) is done. +// GrB_Matrix_diag constructs a new matrix from a vector. Let n be the length +// of the v vector, from GrB_Vector_size (&n, v). If k = 0, then C is an +// n-by-n diagonal matrix with the entries from v along the main diagonal of C, +// with C(i,i) = v(i). If k is nonzero, C is square with dimension n+abs(k). +// If k is positive, it denotes diagonals above the main diagonal, with +// C(i,i+k) = v(i). If k is negative, it denotes diagonals below the main +// diagonal of C, with C(i-k,i) = v(i). C is constructed with the same type +// as v. -GrB_Info GrB_Vector_assign_BOOL // w(I) = accum (w(I),x) +GrB_Info GrB_Matrix_diag // build a diagonal matrix from a vector ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w(I),x) - bool x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix *C, // output matrix + const GrB_Vector v, // input vector + int64_t k ) ; -GrB_Info GrB_Vector_assign_INT8 // w(I) = accum (w(I),x) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - int8_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask -) ; +// GrB_Matrix_diag is like GxB_Matrix_diag (&C, v, k, NULL), except that C must +// already exist on input, of the correct size. Any existing entries in C are +// discarded. The type of C is preserved, so that if the type of C and v +// differ, the entries are typecasted into the type of C. Any settings made to +// C by GrB_set (format by row or by column, bitmap switch, hyper +// switch, and sparsity control) are unchanged. -GrB_Info GrB_Vector_assign_UINT8 // w(I) = accum (w(I),x) +GrB_Info GxB_Matrix_diag // construct a diagonal matrix from a vector ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - uint8_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // output matrix + const GrB_Vector v, // input vector + int64_t k, + const GrB_Descriptor desc // to specify # of threads ) ; -GrB_Info GrB_Vector_assign_INT16 // w(I) = accum (w(I),x) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - int16_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask -) ; +// GxB_Vector_diag extracts a vector v from an input matrix A, which may be +// rectangular. If k = 0, the main diagonal of A is extracted; k > 0 denotes +// diagonals above the main diagonal of A, and k < 0 denotes diagonals below +// the main diagonal of A. Let A have dimension m-by-n. If k is in the range +// 0 to n-1, then v has length min(m,n-k). If k is negative and in the range +// -1 to -m+1, then v has length min(m+k,n). If k is outside these ranges, +// v has length 0 (this is not an error). -GrB_Info GrB_Vector_assign_UINT16 // w(I) = accum (w(I),x) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - uint16_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask -) ; +// v must already exist on input, of the correct length; that is +// GrB_Vector_size (&len,v) must return len = 0 if k >= n or k <= -m, len = +// min(m,n-k) if k is in the range 0 to n-1, and len = min(m+k,n) if k is in +// the range -1 to -m+1. Any existing entries in v are discarded. The type of +// v is preserved, so that if the type of A and v differ, the entries are +// typecasted into the type of v. Any settings made to v by +// GrB_set (bitmap switch and sparsity control) are unchanged. -GrB_Info GrB_Vector_assign_INT32 // w(I) = accum (w(I),x) +GrB_Info GxB_Vector_diag // extract a diagonal from a matrix, as a vector ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - int32_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask + GrB_Vector v, // output vector + const GrB_Matrix A, // input matrix + int64_t k, + const GrB_Descriptor desc // unused, except threading control ) ; -GrB_Info GrB_Vector_assign_UINT32 // w(I) = accum (w(I),x) +//============================================================================== +// GxB_Context: for managing computational resources +//============================================================================== + +GrB_Info GxB_Context_new // create a new Context ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - uint32_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask + GxB_Context *Context // handle of Context to create ) ; -GrB_Info GrB_Vector_assign_INT64 // w(I) = accum (w(I),x) +GrB_Info GxB_Context_free // free a Context ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - int64_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask + GxB_Context *Context // handle of Context to free ) ; -GrB_Info GrB_Vector_assign_UINT64 // w(I) = accum (w(I),x) +GrB_Info GxB_Context_engage // engage a Context ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - uint64_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask + GxB_Context Context // Context to engage ) ; -GrB_Info GrB_Vector_assign_FP32 // w(I) = accum (w(I),x) +GrB_Info GxB_Context_disengage // disengage a Context ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - float x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask + GxB_Context Context // Context to disengage ) ; -GrB_Info GrB_Vector_assign_FP64 // w(I) = accum (w(I),x) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - double x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask -) ; +//============================================================================== +// GxB_set and GxB_get: historical; use GrB_set and GrB_get instead +//============================================================================== -GrB_Info GxB_Vector_assign_FC32 // w(I) = accum (w(I),x) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - GxB_FC32_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask -) ; +// historical: use GrB_set and GrB_get instead of these methods: +GrB_Info GxB_Matrix_Option_set (GrB_Matrix, GxB_Option_Field, ...) ; +GrB_Info GxB_Matrix_Option_set_INT32 (GrB_Matrix, GxB_Option_Field, int32_t) ; +GrB_Info GxB_Matrix_Option_set_FP64 (GrB_Matrix, GxB_Option_Field, double) ; +GrB_Info GxB_Matrix_Option_get (GrB_Matrix, GxB_Option_Field, ...) ; +GrB_Info GxB_Matrix_Option_get_INT32 (GrB_Matrix, GxB_Option_Field, int32_t *) ; +GrB_Info GxB_Matrix_Option_get_FP64 (GrB_Matrix, GxB_Option_Field, double *) ; +GrB_Info GxB_Vector_Option_set (GrB_Vector, GxB_Option_Field, ...) ; +GrB_Info GxB_Vector_Option_set_INT32 (GrB_Vector, GxB_Option_Field, int32_t) ; +GrB_Info GxB_Vector_Option_set_FP64 (GrB_Vector, GxB_Option_Field, double) ; +GrB_Info GxB_Vector_Option_get (GrB_Vector, GxB_Option_Field, ...) ; +GrB_Info GxB_Vector_Option_get_INT32 (GrB_Vector, GxB_Option_Field, int32_t *) ; +GrB_Info GxB_Vector_Option_get_FP64 (GrB_Vector, GxB_Option_Field, double *) ; +GrB_Info GxB_Global_Option_set (GxB_Option_Field, ...) ; +GrB_Info GxB_Global_Option_set_INT32 (GxB_Option_Field, int32_t) ; +GrB_Info GxB_Global_Option_set_FP64 (GxB_Option_Field, double) ; +GrB_Info GxB_Global_Option_set_FP64_ARRAY (GxB_Option_Field, double *) ; +GrB_Info GxB_Global_Option_set_INT64_ARRAY (GxB_Option_Field, int64_t *) ; +GrB_Info GxB_Global_Option_set_CHAR (GxB_Option_Field, const char *) ; +GrB_Info GxB_Global_Option_set_FUNCTION (GxB_Option_Field, void *) ; +GrB_Info GxB_Global_Option_get (GxB_Option_Field, ...) ; +GrB_Info GxB_Global_Option_get_INT32 (GxB_Option_Field, int32_t *) ; +GrB_Info GxB_Global_Option_get_FP64 (GxB_Option_Field, double *) ; +GrB_Info GxB_Global_Option_get_INT64 (GxB_Option_Field, int64_t *) ; +GrB_Info GxB_Global_Option_get_CHAR (GxB_Option_Field, const char **) ; +GrB_Info GxB_Global_Option_get_FUNCTION (GxB_Option_Field, void **) ; +GrB_Info GxB_Context_set_INT32 (GxB_Context, GxB_Context_Field, int32_t) ; +GrB_Info GxB_Context_set_FP64 (GxB_Context, GxB_Context_Field, double) ; +GrB_Info GxB_Context_set (GxB_Context, GxB_Context_Field, ...) ; +GrB_Info GxB_Context_get_INT32 (GxB_Context, GxB_Context_Field, int32_t *) ; +GrB_Info GxB_Context_get_FP64 (GxB_Context, GxB_Context_Field, double *) ; +GrB_Info GxB_Context_get (GxB_Context, GxB_Context_Field, ...) ; -GrB_Info GxB_Vector_assign_FC64 // w(I) = accum (w(I),x) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - GxB_FC64_t x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask -) ; +#if GxB_STDC_VERSION >= 201112L +#define GxB_set(arg1,...) \ + _Generic \ + ( \ + (arg1), \ + default: GxB_Global_Option_set , \ + GxB_Option_Field : GxB_Global_Option_set , \ + GrB_Vector : GxB_Vector_Option_set , \ + GrB_Matrix : GxB_Matrix_Option_set , \ + GrB_Descriptor : GxB_Desc_set , \ + GxB_Context : GxB_Context_set \ + ) \ + (arg1, __VA_ARGS__) -GrB_Info GrB_Vector_assign_UDT // w(I) = accum (w(I),x) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - void *x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask -) ; +#define GxB_get(arg1,...) \ + _Generic \ + ( \ + (arg1), \ + default: GxB_Global_Option_get , \ + GxB_Option_Field : GxB_Global_Option_get , \ + GrB_Vector : GxB_Vector_Option_get , \ + GrB_Matrix : GxB_Matrix_Option_get , \ + GrB_Descriptor : GxB_Desc_get , \ + GxB_Context : GxB_Context_get \ + ) \ + (arg1, __VA_ARGS__) +#endif -GrB_Info GrB_Vector_assign_Scalar // w(I) = accum (w(I),x) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) - GrB_Scalar x, // scalar to assign to w(I) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Descriptor desc // descriptor for w and mask -) ; +//============================================================================== +// GrB_set and GrB_get +//============================================================================== //------------------------------------------------------------------------------ -// GrB_Matrix_assign_[SCALAR]: scalar expansion assignment to submatrix +// GrB_get: get a scalar, string, enum, size, or void * from an object //------------------------------------------------------------------------------ -// Assigns a single scalar to a submatrix, C(I,J) = accum(C(I,J),x). The -// scalar x is implicitly expanded into a matrix A of size ni-by-nj, with each -// entry in A equal to x, and then C(I,J) = accum(C(I,J),A) is done. +GrB_Info GrB_Scalar_get_Scalar (GrB_Scalar, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Scalar_get_String (GrB_Scalar, char * , GrB_Field) ; +GrB_Info GrB_Scalar_get_INT32 (GrB_Scalar, int32_t * , GrB_Field) ; +GrB_Info GrB_Scalar_get_SIZE (GrB_Scalar, size_t * , GrB_Field) ; +GrB_Info GrB_Scalar_get_VOID (GrB_Scalar, void * , GrB_Field) ; -GrB_Info GrB_Matrix_assign_BOOL // C(I,J) = accum (C(I,J),x) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - bool x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask -) ; +GrB_Info GrB_Vector_get_Scalar (GrB_Vector, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Vector_get_String (GrB_Vector, char * , GrB_Field) ; +GrB_Info GrB_Vector_get_INT32 (GrB_Vector, int32_t * , GrB_Field) ; +GrB_Info GrB_Vector_get_SIZE (GrB_Vector, size_t * , GrB_Field) ; +GrB_Info GrB_Vector_get_VOID (GrB_Vector, void * , GrB_Field) ; -GrB_Info GrB_Matrix_assign_INT8 // C(I,J) = accum (C(I,J),x) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - int8_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask -) ; +GrB_Info GrB_Matrix_get_Scalar (GrB_Matrix, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Matrix_get_String (GrB_Matrix, char * , GrB_Field) ; +GrB_Info GrB_Matrix_get_INT32 (GrB_Matrix, int32_t * , GrB_Field) ; +GrB_Info GrB_Matrix_get_SIZE (GrB_Matrix, size_t * , GrB_Field) ; +GrB_Info GrB_Matrix_get_VOID (GrB_Matrix, void * , GrB_Field) ; -GrB_Info GrB_Matrix_assign_UINT8 // C(I,J) = accum (C(I,J),x) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - uint8_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask -) ; +GrB_Info GxB_Serialized_get_Scalar (const void *, GrB_Scalar, GrB_Field, size_t) ; +GrB_Info GxB_Serialized_get_String (const void *, char * , GrB_Field, size_t) ; +GrB_Info GxB_Serialized_get_INT32 (const void *, int32_t * , GrB_Field, size_t) ; +GrB_Info GxB_Serialized_get_SIZE (const void *, size_t * , GrB_Field, size_t) ; +GrB_Info GxB_Serialized_get_VOID (const void *, void * , GrB_Field, size_t) ; -GrB_Info GrB_Matrix_assign_INT16 // C(I,J) = accum (C(I,J),x) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - int16_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask -) ; +GrB_Info GrB_UnaryOp_get_Scalar (GrB_UnaryOp, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_UnaryOp_get_String (GrB_UnaryOp, char * , GrB_Field) ; +GrB_Info GrB_UnaryOp_get_INT32 (GrB_UnaryOp, int32_t * , GrB_Field) ; +GrB_Info GrB_UnaryOp_get_SIZE (GrB_UnaryOp, size_t * , GrB_Field) ; +GrB_Info GrB_UnaryOp_get_VOID (GrB_UnaryOp, void * , GrB_Field) ; -GrB_Info GrB_Matrix_assign_UINT16 // C(I,J) = accum (C(I,J),x) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - uint16_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask -) ; +GrB_Info GrB_IndexUnaryOp_get_Scalar (GrB_IndexUnaryOp, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_IndexUnaryOp_get_String (GrB_IndexUnaryOp, char * , GrB_Field) ; +GrB_Info GrB_IndexUnaryOp_get_INT32 (GrB_IndexUnaryOp, int32_t * , GrB_Field) ; +GrB_Info GrB_IndexUnaryOp_get_SIZE (GrB_IndexUnaryOp, size_t * , GrB_Field) ; +GrB_Info GrB_IndexUnaryOp_get_VOID (GrB_IndexUnaryOp, void * , GrB_Field) ; -GrB_Info GrB_Matrix_assign_INT32 // C(I,J) = accum (C(I,J),x) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - int32_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask -) ; +GrB_Info GrB_BinaryOp_get_Scalar (GrB_BinaryOp, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_BinaryOp_get_String (GrB_BinaryOp, char * , GrB_Field) ; +GrB_Info GrB_BinaryOp_get_INT32 (GrB_BinaryOp, int32_t * , GrB_Field) ; +GrB_Info GrB_BinaryOp_get_SIZE (GrB_BinaryOp, size_t * , GrB_Field) ; +GrB_Info GrB_BinaryOp_get_VOID (GrB_BinaryOp, void * , GrB_Field) ; -GrB_Info GrB_Matrix_assign_UINT32 // C(I,J) = accum (C(I,J),x) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - uint32_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask -) ; +GrB_Info GrB_Monoid_get_Scalar (GrB_Monoid, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Monoid_get_String (GrB_Monoid, char * , GrB_Field) ; +GrB_Info GrB_Monoid_get_INT32 (GrB_Monoid, int32_t * , GrB_Field) ; +GrB_Info GrB_Monoid_get_SIZE (GrB_Monoid, size_t * , GrB_Field) ; +GrB_Info GrB_Monoid_get_VOID (GrB_Monoid, void * , GrB_Field) ; -GrB_Info GrB_Matrix_assign_INT64 // C(I,J) = accum (C(I,J),x) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - int64_t x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask -) ; +GrB_Info GrB_Semiring_get_Scalar (GrB_Semiring, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Semiring_get_String (GrB_Semiring, char * , GrB_Field) ; +GrB_Info GrB_Semiring_get_INT32 (GrB_Semiring, int32_t * , GrB_Field) ; +GrB_Info GrB_Semiring_get_SIZE (GrB_Semiring, size_t * , GrB_Field) ; +GrB_Info GrB_Semiring_get_VOID (GrB_Semiring, void * , GrB_Field) ; -GrB_Info GrB_Matrix_assign_UINT64 // C(I,J) = accum (C(I,J),x) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - uint64_t x, // scalar to assign to C(I,J) +GrB_Info GrB_Descriptor_get_Scalar (GrB_Descriptor, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Descriptor_get_String (GrB_Descriptor, char * , GrB_Field) ; +GrB_Info GrB_Descriptor_get_INT32 (GrB_Descriptor, int32_t * , GrB_Field) ; +GrB_Info GrB_Descriptor_get_SIZE (GrB_Descriptor, size_t * , GrB_Field) ; +GrB_Info GrB_Descriptor_get_VOID (GrB_Descriptor, void * , GrB_Field) ; + +GrB_Info GrB_Type_get_Scalar (GrB_Type, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Type_get_String (GrB_Type, char * , GrB_Field) ; +GrB_Info GrB_Type_get_INT32 (GrB_Type, int32_t * , GrB_Field) ; +GrB_Info GrB_Type_get_SIZE (GrB_Type, size_t * , GrB_Field) ; +GrB_Info GrB_Type_get_VOID (GrB_Type, void * , GrB_Field) ; + +GrB_Info GrB_Global_get_Scalar (GrB_Global, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Global_get_String (GrB_Global, char * , GrB_Field) ; +GrB_Info GrB_Global_get_INT32 (GrB_Global, int32_t * , GrB_Field) ; +GrB_Info GrB_Global_get_SIZE (GrB_Global, size_t * , GrB_Field) ; +GrB_Info GrB_Global_get_VOID (GrB_Global, void * , GrB_Field) ; + +GrB_Info GxB_Context_get_Scalar (GxB_Context, GrB_Scalar, GrB_Field) ; +GrB_Info GxB_Context_get_String (GxB_Context, char * , GrB_Field) ; +GrB_Info GxB_Context_get_INT (GxB_Context, int32_t * , GrB_Field) ; +GrB_Info GxB_Context_get_SIZE (GxB_Context, size_t * , GrB_Field) ; +GrB_Info GxB_Context_get_VOID (GxB_Context, void * , GrB_Field) ; + +// GrB_get (object, value, field): +#if GxB_STDC_VERSION >= 201112L +#define GrB_get(object,value,...) \ + _Generic \ + ( \ + (object), \ + GrB_Scalar : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Scalar_get_Scalar , \ + char * : GrB_Scalar_get_String , \ + int32_t * : GrB_Scalar_get_INT32 , \ + size_t * : GrB_Scalar_get_SIZE , \ + void * : GrB_Scalar_get_VOID \ + ) , \ + GrB_Vector : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Vector_get_Scalar , \ + char * : GrB_Vector_get_String , \ + int32_t * : GrB_Vector_get_INT32 , \ + size_t * : GrB_Vector_get_SIZE , \ + void * : GrB_Vector_get_VOID \ + ) , \ + GrB_Matrix : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Matrix_get_Scalar , \ + char * : GrB_Matrix_get_String , \ + int32_t * : GrB_Matrix_get_INT32 , \ + size_t * : GrB_Matrix_get_SIZE , \ + void * : GrB_Matrix_get_VOID \ + ) , \ + GrB_UnaryOp : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_UnaryOp_get_Scalar , \ + char * : GrB_UnaryOp_get_String , \ + int32_t * : GrB_UnaryOp_get_INT32 , \ + size_t * : GrB_UnaryOp_get_SIZE , \ + void * : GrB_UnaryOp_get_VOID \ + ) , \ + GrB_IndexUnaryOp : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_IndexUnaryOp_get_Scalar , \ + char * : GrB_IndexUnaryOp_get_String , \ + int32_t * : GrB_IndexUnaryOp_get_INT32 , \ + size_t * : GrB_IndexUnaryOp_get_SIZE , \ + void * : GrB_IndexUnaryOp_get_VOID \ + ) , \ + GrB_BinaryOp : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_BinaryOp_get_Scalar , \ + char * : GrB_BinaryOp_get_String , \ + int32_t * : GrB_BinaryOp_get_INT32 , \ + size_t * : GrB_BinaryOp_get_SIZE , \ + void * : GrB_BinaryOp_get_VOID \ + ) , \ + GrB_Monoid : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Monoid_get_Scalar , \ + char * : GrB_Monoid_get_String , \ + int32_t * : GrB_Monoid_get_INT32 , \ + size_t * : GrB_Monoid_get_SIZE , \ + void * : GrB_Monoid_get_VOID \ + ) , \ + GrB_Semiring : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Semiring_get_Scalar , \ + char * : GrB_Semiring_get_String , \ + int32_t * : GrB_Semiring_get_INT32 , \ + size_t * : GrB_Semiring_get_SIZE , \ + void * : GrB_Semiring_get_VOID \ + ) , \ + GrB_Type : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Type_get_Scalar , \ + char * : GrB_Type_get_String , \ + int32_t * : GrB_Type_get_INT32 , \ + size_t * : GrB_Type_get_SIZE , \ + void * : GrB_Type_get_VOID \ + ) , \ + GrB_Descriptor : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Descriptor_get_Scalar , \ + char * : GrB_Descriptor_get_String , \ + int32_t * : GrB_Descriptor_get_INT32 , \ + size_t * : GrB_Descriptor_get_SIZE , \ + void * : GrB_Descriptor_get_VOID \ + ) , \ + GrB_Global : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Global_get_Scalar , \ + char * : GrB_Global_get_String , \ + int32_t * : GrB_Global_get_INT32 , \ + size_t * : GrB_Global_get_SIZE , \ + void * : GrB_Global_get_VOID \ + ) , \ + GxB_Context : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GxB_Context_get_Scalar , \ + char * : GxB_Context_get_String , \ + int32_t * : GxB_Context_get_INT , \ + size_t * : GxB_Context_get_SIZE , \ + void * : GxB_Context_get_VOID \ + ) , \ + const void *: \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GxB_Serialized_get_Scalar , \ + char * : GxB_Serialized_get_String , \ + int32_t * : GxB_Serialized_get_INT32 , \ + size_t * : GxB_Serialized_get_SIZE , \ + void * : GxB_Serialized_get_VOID \ + ) , \ + void *: \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GxB_Serialized_get_Scalar , \ + char * : GxB_Serialized_get_String , \ + int32_t * : GxB_Serialized_get_INT32 , \ + size_t * : GxB_Serialized_get_SIZE , \ + void * : GxB_Serialized_get_VOID \ + ) \ + ) (object, value, __VA_ARGS__) +#endif + +//------------------------------------------------------------------------------ +// GrB_set: set a scalar, string, enum, size, or void * of an object +//------------------------------------------------------------------------------ + +GrB_Info GrB_Scalar_set_Scalar (GrB_Scalar, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Scalar_set_String (GrB_Scalar, char * , GrB_Field) ; +GrB_Info GrB_Scalar_set_INT32 (GrB_Scalar, int32_t , GrB_Field) ; +GrB_Info GrB_Scalar_set_VOID (GrB_Scalar, void * , GrB_Field, size_t) ; + +GrB_Info GrB_Vector_set_Scalar (GrB_Vector, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Vector_set_String (GrB_Vector, char * , GrB_Field) ; +GrB_Info GrB_Vector_set_INT32 (GrB_Vector, int32_t , GrB_Field) ; +GrB_Info GrB_Vector_set_VOID (GrB_Vector, void * , GrB_Field, size_t) ; + +GrB_Info GrB_Matrix_set_Scalar (GrB_Matrix, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Matrix_set_String (GrB_Matrix, char * , GrB_Field) ; +GrB_Info GrB_Matrix_set_INT32 (GrB_Matrix, int32_t , GrB_Field) ; +GrB_Info GrB_Matrix_set_VOID (GrB_Matrix, void * , GrB_Field, size_t) ; + +GrB_Info GrB_UnaryOp_set_Scalar (GrB_UnaryOp, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_UnaryOp_set_String (GrB_UnaryOp, char * , GrB_Field) ; +GrB_Info GrB_UnaryOp_set_INT32 (GrB_UnaryOp, int32_t , GrB_Field) ; +GrB_Info GrB_UnaryOp_set_VOID (GrB_UnaryOp, void * , GrB_Field, size_t) ; + +GrB_Info GrB_IndexUnaryOp_set_Scalar (GrB_IndexUnaryOp, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_IndexUnaryOp_set_String (GrB_IndexUnaryOp, char * , GrB_Field) ; +GrB_Info GrB_IndexUnaryOp_set_INT32 (GrB_IndexUnaryOp, int32_t , GrB_Field) ; +GrB_Info GrB_IndexUnaryOp_set_VOID (GrB_IndexUnaryOp, void * , GrB_Field, + size_t) ; + +GrB_Info GrB_BinaryOp_set_Scalar (GrB_BinaryOp, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_BinaryOp_set_String (GrB_BinaryOp, char * , GrB_Field) ; +GrB_Info GrB_BinaryOp_set_INT32 (GrB_BinaryOp, int32_t , GrB_Field) ; +GrB_Info GrB_BinaryOp_set_VOID (GrB_BinaryOp, void * , GrB_Field, size_t) ; + +GrB_Info GrB_Monoid_set_Scalar (GrB_Monoid, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Monoid_set_String (GrB_Monoid, char * , GrB_Field) ; +GrB_Info GrB_Monoid_set_INT32 (GrB_Monoid, int32_t , GrB_Field) ; +GrB_Info GrB_Monoid_set_VOID (GrB_Monoid, void * , GrB_Field, size_t) ; + +GrB_Info GrB_Semiring_set_Scalar (GrB_Semiring, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Semiring_set_String (GrB_Semiring, char * , GrB_Field) ; +GrB_Info GrB_Semiring_set_INT32 (GrB_Semiring, int32_t , GrB_Field) ; +GrB_Info GrB_Semiring_set_VOID (GrB_Semiring, void * , GrB_Field, size_t) ; + +GrB_Info GrB_Descriptor_set_Scalar (GrB_Descriptor, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Descriptor_set_String (GrB_Descriptor, char * , GrB_Field) ; +GrB_Info GrB_Descriptor_set_INT32 (GrB_Descriptor, int32_t , GrB_Field) ; +GrB_Info GrB_Descriptor_set_VOID (GrB_Descriptor, void * , GrB_Field, + size_t) ; + +GrB_Info GrB_Type_set_Scalar (GrB_Type, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Type_set_String (GrB_Type, char * , GrB_Field) ; +GrB_Info GrB_Type_set_INT32 (GrB_Type, int32_t , GrB_Field) ; +GrB_Info GrB_Type_set_VOID (GrB_Type, void * , GrB_Field, size_t) ; + +GrB_Info GrB_Global_set_Scalar (GrB_Global, GrB_Scalar, GrB_Field) ; +GrB_Info GrB_Global_set_String (GrB_Global, char * , GrB_Field) ; +GrB_Info GrB_Global_set_INT32 (GrB_Global, int32_t , GrB_Field) ; +GrB_Info GrB_Global_set_VOID (GrB_Global, void * , GrB_Field, size_t) ; + +GrB_Info GxB_Context_set_Scalar (GxB_Context, GrB_Scalar, GrB_Field) ; +GrB_Info GxB_Context_set_String (GxB_Context, char * , GrB_Field) ; +GrB_Info GxB_Context_set_INT (GxB_Context, int32_t , GrB_Field) ; +GrB_Info GxB_Context_set_VOID (GxB_Context, void * , GrB_Field, size_t) ; + +// GrB_set (object, value, field) or (object, value, field, size) for _VOID +#if GxB_STDC_VERSION >= 201112L +#define GrB_set(object,value,...) \ + _Generic \ + ( \ + (object), \ + GrB_Scalar : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Scalar_set_Scalar , \ + char * : GrB_Scalar_set_String , \ + int32_t : GrB_Scalar_set_INT32 , \ + void * : GrB_Scalar_set_VOID \ + ) , \ + GrB_Vector : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Vector_set_Scalar , \ + char * : GrB_Vector_set_String , \ + int32_t : GrB_Vector_set_INT32 , \ + void * : GrB_Vector_set_VOID \ + ) , \ + GrB_Matrix : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Matrix_set_Scalar , \ + char * : GrB_Matrix_set_String , \ + int32_t : GrB_Matrix_set_INT32 , \ + void * : GrB_Matrix_set_VOID \ + ) , \ + GrB_UnaryOp : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_UnaryOp_set_Scalar , \ + char * : GrB_UnaryOp_set_String , \ + int32_t : GrB_UnaryOp_set_INT32 , \ + void * : GrB_UnaryOp_set_VOID \ + ) , \ + GrB_IndexUnaryOp : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_IndexUnaryOp_set_Scalar , \ + char * : GrB_IndexUnaryOp_set_String , \ + int32_t : GrB_IndexUnaryOp_set_INT32 , \ + void * : GrB_IndexUnaryOp_set_VOID \ + ) , \ + GrB_BinaryOp : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_BinaryOp_set_Scalar , \ + char * : GrB_BinaryOp_set_String , \ + int32_t : GrB_BinaryOp_set_INT32 , \ + void * : GrB_BinaryOp_set_VOID \ + ) , \ + GrB_Monoid : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Monoid_set_Scalar , \ + char * : GrB_Monoid_set_String , \ + int32_t : GrB_Monoid_set_INT32 , \ + void * : GrB_Monoid_set_VOID \ + ) , \ + GrB_Semiring : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Semiring_set_Scalar , \ + char * : GrB_Semiring_set_String , \ + int32_t : GrB_Semiring_set_INT32 , \ + void * : GrB_Semiring_set_VOID \ + ) , \ + GrB_Type : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Type_set_Scalar , \ + char * : GrB_Type_set_String , \ + int32_t : GrB_Type_set_INT32 , \ + void * : GrB_Type_set_VOID \ + ) , \ + GrB_Descriptor : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Descriptor_set_Scalar , \ + char * : GrB_Descriptor_set_String , \ + int32_t : GrB_Descriptor_set_INT32 , \ + void * : GrB_Descriptor_set_VOID \ + ) , \ + GrB_Global : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GrB_Global_set_Scalar , \ + char * : GrB_Global_set_String , \ + int32_t : GrB_Global_set_INT32 , \ + void * : GrB_Global_set_VOID \ + ) , \ + GxB_Context : \ + _Generic \ + ( \ + (value), \ + GrB_Scalar : GxB_Context_set_Scalar , \ + char * : GxB_Context_set_String , \ + int32_t : GxB_Context_set_INT , \ + void * : GxB_Context_set_VOID \ + ) \ + ) (object, value, __VA_ARGS__) +#endif + +//============================================================================== +// GrB_free: free any GraphBLAS object +//============================================================================== + +#if GxB_STDC_VERSION >= 201112L +#define GrB_free(object) \ + _Generic \ + ( \ + (object), \ + GrB_Type *: GrB_Type_free , \ + GrB_UnaryOp *: GrB_UnaryOp_free , \ + GrB_BinaryOp *: GrB_BinaryOp_free , \ + GrB_IndexUnaryOp *: GrB_IndexUnaryOp_free , \ + GrB_Monoid *: GrB_Monoid_free , \ + GrB_Semiring *: GrB_Semiring_free , \ + GrB_Scalar *: GrB_Scalar_free , \ + GrB_Vector *: GrB_Vector_free , \ + GrB_Matrix *: GrB_Matrix_free , \ + GrB_Descriptor *: GrB_Descriptor_free , \ + GxB_Context *: GxB_Context_free , \ + GxB_Iterator *: GxB_Iterator_free \ + ) \ + (object) +#endif + +//============================================================================== +// GrB_wait: finish computations +//============================================================================== + +// Finish all pending work in a specific object. + +GrB_Info GrB_Type_wait (GrB_Type type , GrB_WaitMode waitmode); +GrB_Info GrB_UnaryOp_wait (GrB_UnaryOp op , GrB_WaitMode waitmode); +GrB_Info GrB_BinaryOp_wait (GrB_BinaryOp op , GrB_WaitMode waitmode); +GrB_Info GrB_IndexUnaryOp_wait (GrB_IndexUnaryOp op , GrB_WaitMode waitmode); +GrB_Info GrB_Monoid_wait (GrB_Monoid monoid , GrB_WaitMode waitmode); +GrB_Info GrB_Semiring_wait (GrB_Semiring semiring, GrB_WaitMode waitmode); +GrB_Info GrB_Descriptor_wait (GrB_Descriptor desc , GrB_WaitMode waitmode); +GrB_Info GrB_Scalar_wait (GrB_Scalar s , GrB_WaitMode waitmode); +GrB_Info GrB_Vector_wait (GrB_Vector v , GrB_WaitMode waitmode); +GrB_Info GrB_Matrix_wait (GrB_Matrix A , GrB_WaitMode waitmode); +GrB_Info GxB_Context_wait (GxB_Context Context , GrB_WaitMode waitmode); + +// GrB_wait (object,waitmode) polymorphic function: +#if GxB_STDC_VERSION >= 201112L +#define GrB_wait(object,waitmode) \ + _Generic \ + ( \ + (object), \ + GrB_Type : GrB_Type_wait , \ + GrB_UnaryOp : GrB_UnaryOp_wait , \ + GrB_BinaryOp : GrB_BinaryOp_wait , \ + GrB_IndexUnaryOp : GrB_IndexUnaryOp_wait , \ + GrB_Monoid : GrB_Monoid_wait , \ + GrB_Semiring : GrB_Semiring_wait , \ + GrB_Scalar : GrB_Scalar_wait , \ + GrB_Vector : GrB_Vector_wait , \ + GrB_Matrix : GrB_Matrix_wait , \ + GxB_Context : GxB_Context_wait , \ + GrB_Descriptor : GrB_Descriptor_wait \ + ) \ + (object, waitmode) +#endif + +// NOTE: GxB_Scalar_wait is historical; use GrB_Scalar_wait instead +GrB_Info GxB_Scalar_wait (GrB_Scalar *s) ; + +//============================================================================== +// GrB_error: error handling +//============================================================================== + +// Each GraphBLAS method and operation returns a GrB_Info error code. +// GrB_error returns additional information on the error in a thread-safe +// null-terminated string. The string returned by GrB_error is owned by +// the GraphBLAS library and must not be free'd. + +GrB_Info GrB_Type_error (const char **error, const GrB_Type type) ; +GrB_Info GrB_UnaryOp_error (const char **error, const GrB_UnaryOp op) ; +GrB_Info GrB_BinaryOp_error (const char **error, const GrB_BinaryOp op) ; +GrB_Info GrB_IndexUnaryOp_error (const char **error, const GrB_IndexUnaryOp op) ; +GrB_Info GrB_Monoid_error (const char **error, const GrB_Monoid monoid) ; +GrB_Info GrB_Semiring_error (const char **error, const GrB_Semiring semiring) ; +GrB_Info GrB_Scalar_error (const char **error, const GrB_Scalar s) ; +GrB_Info GrB_Vector_error (const char **error, const GrB_Vector v) ; +GrB_Info GrB_Matrix_error (const char **error, const GrB_Matrix A) ; +GrB_Info GrB_Descriptor_error (const char **error, const GrB_Descriptor d) ; +// GxB_Scalar_error is historical: use GrB_Scalar_error instead +GrB_Info GxB_Scalar_error (const char **error, const GrB_Scalar s) ; +GrB_Info GxB_Context_error (const char **error, const GxB_Context Context); + +// GrB_error (error,object) polymorphic function: +#if GxB_STDC_VERSION >= 201112L +#define GrB_error(error,object) \ + _Generic \ + ( \ + (object), \ + GrB_Type : GrB_Type_error , \ + GrB_UnaryOp : GrB_UnaryOp_error , \ + GrB_BinaryOp : GrB_BinaryOp_error , \ + GrB_IndexUnaryOp : GrB_IndexUnaryOp_error , \ + GrB_Monoid : GrB_Monoid_error , \ + GrB_Semiring : GrB_Semiring_error , \ + GrB_Scalar : GrB_Scalar_error , \ + GrB_Vector : GrB_Vector_error , \ + GrB_Matrix : GrB_Matrix_error , \ + GxB_Context : GxB_Context_error , \ + GrB_Descriptor : GrB_Descriptor_error \ + ) \ + (error, object) +#endif + +//============================================================================== +// GrB_mxm, vxm, mxv: matrix multiplication over a semiring +//============================================================================== + +GrB_Info GrB_mxm // C = accum (C, A*B) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_Semiring semiring, // defines '+' and '*' for A*B + const GrB_Matrix A, // first input: matrix A + const GrB_Matrix B, // second input: matrix B + const GrB_Descriptor desc // descriptor for C, Mask, A, and B +) ; + +GrB_Info GrB_vxm // w' = accum (w, u'*A) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_Semiring semiring, // defines '+' and '*' for u'*A + const GrB_Vector u, // first input: vector u + const GrB_Matrix A, // second input: matrix A + const GrB_Descriptor desc // descriptor for w, mask, and A +) ; + +GrB_Info GrB_mxv // w = accum (w, A*u) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_Semiring semiring, // defines '+' and '*' for A*B + const GrB_Matrix A, // first input: matrix A + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w, mask, and A +) ; + +//============================================================================== +// GrB_eWiseMult: element-wise matrix and vector operations, set intersection +//============================================================================== + +// GrB_eWiseMult computes C = accum (C, A.*B), where ".*" is the Hadamard +// product, and where pairs of elements in two matrices (or vectors) are +// pairwise "multiplied" with C(i,j) = mult (A(i,j),B(i,j)). + +GrB_Info GrB_Vector_eWiseMult_Semiring // w = accum (w, u.*v) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_Semiring semiring, // defines '.*' for t=u.*v + const GrB_Vector u, // first input: vector u + const GrB_Vector v, // second input: vector v + const GrB_Descriptor desc // descriptor for w and mask +) ; + +GrB_Info GrB_Vector_eWiseMult_Monoid // w = accum (w, u.*v) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_Monoid monoid, // defines '.*' for t=u.*v + const GrB_Vector u, // first input: vector u + const GrB_Vector v, // second input: vector v + const GrB_Descriptor desc // descriptor for w and mask +) ; + +GrB_Info GrB_Vector_eWiseMult_BinaryOp // w = accum (w, u.*v) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp mult, // defines '.*' for t=u.*v + const GrB_Vector u, // first input: vector u + const GrB_Vector v, // second input: vector v + const GrB_Descriptor desc // descriptor for w and mask +) ; + +GrB_Info GrB_Matrix_eWiseMult_Semiring // C = accum (C, A.*B) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_Semiring semiring, // defines '.*' for T=A.*B + const GrB_Matrix A, // first input: matrix A + const GrB_Matrix B, // second input: matrix B + const GrB_Descriptor desc // descriptor for C, Mask, A, and B +) ; + +GrB_Info GrB_Matrix_eWiseMult_Monoid // C = accum (C, A.*B) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_Monoid monoid, // defines '.*' for T=A.*B + const GrB_Matrix A, // first input: matrix A + const GrB_Matrix B, // second input: matrix B + const GrB_Descriptor desc // descriptor for C, Mask, A, and B +) ; + +GrB_Info GrB_Matrix_eWiseMult_BinaryOp // C = accum (C, A.*B) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp mult, // defines '.*' for T=A.*B + const GrB_Matrix A, // first input: matrix A + const GrB_Matrix B, // second input: matrix B + const GrB_Descriptor desc // descriptor for C, Mask, A, and B +) ; + +// All 6 of the above type-specific functions are captured in a single +// type-generic function, GrB_eWiseMult: + +#if GxB_STDC_VERSION >= 201112L +#define GrB_eWiseMult(C,Mask,accum,op,A,B,desc) \ + _Generic \ + ( \ + (C), \ + GrB_Matrix : \ + _Generic \ + ( \ + (op), \ + GrB_Semiring : GrB_Matrix_eWiseMult_Semiring , \ + GrB_Monoid : GrB_Matrix_eWiseMult_Monoid , \ + GrB_BinaryOp : GrB_Matrix_eWiseMult_BinaryOp \ + ), \ + GrB_Vector : \ + _Generic \ + ( \ + (op), \ + GrB_Semiring : GrB_Vector_eWiseMult_Semiring , \ + GrB_Monoid : GrB_Vector_eWiseMult_Monoid , \ + GrB_BinaryOp : GrB_Vector_eWiseMult_BinaryOp \ + ) \ + ) \ + (C, Mask, accum, op, A, B, desc) +#endif + +//============================================================================== +// GrB_eWiseAdd: element-wise matrix and vector operations, set union +//============================================================================== + +// GrB_eWiseAdd computes C = accum (C, A+B), where pairs of elements in +// two matrices (or two vectors) are pairwise "added". + +GrB_Info GrB_Vector_eWiseAdd_Semiring // w = accum (w, u+v) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_Semiring semiring, // defines '+' for t=u+v + const GrB_Vector u, // first input: vector u + const GrB_Vector v, // second input: vector v + const GrB_Descriptor desc // descriptor for w and mask +) ; + +GrB_Info GrB_Vector_eWiseAdd_Monoid // w = accum (w, u+v) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_Monoid monoid, // defines '+' for t=u+v + const GrB_Vector u, // first input: vector u + const GrB_Vector v, // second input: vector v + const GrB_Descriptor desc // descriptor for w and mask +) ; + +GrB_Info GrB_Vector_eWiseAdd_BinaryOp // w = accum (w, u+v) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp add, // defines '+' for t=u+v + const GrB_Vector u, // first input: vector u + const GrB_Vector v, // second input: vector v + const GrB_Descriptor desc // descriptor for w and mask +) ; + +GrB_Info GrB_Matrix_eWiseAdd_Semiring // C = accum (C, A+B) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_Semiring semiring, // defines '+' for T=A+B + const GrB_Matrix A, // first input: matrix A + const GrB_Matrix B, // second input: matrix B + const GrB_Descriptor desc // descriptor for C, Mask, A, and B +) ; + +GrB_Info GrB_Matrix_eWiseAdd_Monoid // C = accum (C, A+B) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_Monoid monoid, // defines '+' for T=A+B + const GrB_Matrix A, // first input: matrix A + const GrB_Matrix B, // second input: matrix B + const GrB_Descriptor desc // descriptor for C, Mask, A, and B +) ; + +GrB_Info GrB_Matrix_eWiseAdd_BinaryOp // C = accum (C, A+B) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp add, // defines '+' for T=A+B + const GrB_Matrix A, // first input: matrix A + const GrB_Matrix B, // second input: matrix B + const GrB_Descriptor desc // descriptor for C, Mask, A, and B +) ; + +#if GxB_STDC_VERSION >= 201112L +#define GrB_eWiseAdd(C,Mask,accum,op,A,B,desc) \ + _Generic \ + ( \ + (C), \ + GrB_Matrix : \ + _Generic \ + ( \ + (op), \ + GrB_Semiring : GrB_Matrix_eWiseAdd_Semiring , \ + GrB_Monoid : GrB_Matrix_eWiseAdd_Monoid , \ + GrB_BinaryOp : GrB_Matrix_eWiseAdd_BinaryOp \ + ), \ + GrB_Vector : \ + _Generic \ + ( \ + (op), \ + GrB_Semiring : GrB_Vector_eWiseAdd_Semiring , \ + GrB_Monoid : GrB_Vector_eWiseAdd_Monoid , \ + GrB_BinaryOp : GrB_Vector_eWiseAdd_BinaryOp \ + ) \ + ) \ + (C, Mask, accum, op, A, B, desc) +#endif + +//============================================================================== +// GxB_eWiseUnion: a variant of GrB_eWiseAdd +//============================================================================== + +// GxB_eWiseUnion is a variant of eWiseAdd. The methods create a result with +// the same sparsity structure. They differ when an entry is present in A but +// not B, or in B but not A. + +// eWiseAdd does the following, for a matrix, where "+" is the add binary op: + +// if A(i,j) and B(i,j) are both present: +// C(i,j) = A(i,j) + B(i,j) +// else if A(i,j) is present but not B(i,j) +// C(i,j) = A(i,j) +// else if B(i,j) is present but not A(i,j) +// C(i,j) = B(i,j) + +// by contrast, eWiseUnion always applies the operator: + +// if A(i,j) and B(i,j) are both present: +// C(i,j) = A(i,j) + B(i,j) +// else if A(i,j) is present but not B(i,j) +// C(i,j) = A(i,j) + beta +// else if B(i,j) is present but not A(i,j) +// C(i,j) = alpha + B(i,j) + +GrB_Info GxB_Vector_eWiseUnion // w = accum (w, u+v) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp add, // defines '+' for t=u+v + const GrB_Vector u, // first input: vector u + const GrB_Scalar alpha, + const GrB_Vector v, // second input: vector v + const GrB_Scalar beta, + const GrB_Descriptor desc // descriptor for w and mask +) ; + +GrB_Info GxB_Matrix_eWiseUnion // C = accum (C, A+B) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp add, // defines '+' for T=A+B + const GrB_Matrix A, // first input: matrix A + const GrB_Scalar alpha, + const GrB_Matrix B, // second input: matrix B + const GrB_Scalar beta, + const GrB_Descriptor desc // descriptor for C, M, A, and B +) ; + +#if GxB_STDC_VERSION >= 201112L +#define GxB_eWiseUnion(C,Mask,accum,op,A,alpha,B,beta,desc) \ + _Generic \ + ( \ + (C), \ + GrB_Matrix : GxB_Matrix_eWiseUnion , \ + GrB_Vector : GxB_Vector_eWiseUnion \ + ) \ + (C, Mask, accum, op, A, alpha, B, beta, desc) +#endif + +//============================================================================== +// GrB_extract: extract a submatrix or subvector +//============================================================================== + +GrB_Info GrB_Vector_extract // w = accum (w, u(I)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_Vector u, // first input: vector u const GrB_Index *Ilist, // row indices GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_assign_FP32 // C(I,J) = accum (C(I,J),x) +GrB_Info GrB_Matrix_extract // C = accum (C, A(I,J)) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - float x, // scalar to assign to C(I,J) + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_Matrix A, // first input: matrix A const GrB_Index *Ilist, // row indices GrB_Index ni, // number of row indices const GrB_Index *J, // column indices GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask + const GrB_Descriptor desc // descriptor for C, Mask, and A ) ; -GrB_Info GrB_Matrix_assign_FP64 // C(I,J) = accum (C(I,J),x) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - double x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask -) ; +GrB_Info GrB_Col_extract // w = accum (w, A(I,j)) +( + GrB_Vector w, // input/output matrix for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_Matrix A, // first input: matrix A + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + GrB_Index j, // column index + const GrB_Descriptor desc // descriptor for w, mask, and A +) ; + +// GrB_extract is a generic interface to the following functions: + +// GrB_Vector_extract (w,mask,acc,u,I,ni,d) // w = acc (w, u(I)) +// GrB_Col_extract (w,mask,acc,A,I,ni,j,d) // w = acc (w, A(I,j)) +// GrB_Matrix_extract (C,Mask,acc,A,I,ni,J,nj,d) // C = acc (C, A(I,J)) + +#if GxB_STDC_VERSION >= 201112L +#define GrB_extract(arg1,Mask,accum,arg4,...) \ + _Generic \ + ( \ + (arg1), \ + GrB_Vector : \ + _Generic \ + ( \ + (arg4), \ + GrB_Vector : GrB_Vector_extract , \ + GrB_Matrix : GrB_Col_extract \ + ), \ + GrB_Matrix : GrB_Matrix_extract \ + ) \ + (arg1, Mask, accum, arg4, __VA_ARGS__) +#endif + +//============================================================================== +// GxB_subassign: matrix and vector subassign: C(I,J) = accum (C(I,J), A) +//============================================================================== + +// Assign entries in a matrix or vector; C(I,J) = A. + +// Each GxB_subassign function is very similar to its corresponding GrB_assign +// function in the spec, but they differ in two ways: (1) the mask in +// GxB_subassign has the same size as w(I) for vectors and C(I,J) for matrices, +// and (2) they differ in the GrB_REPLACE option. See the user guide for +// details. + +// In GraphBLAS notation, the two methods can be described as follows: + +// matrix and vector subassign: C(I,J) = accum (C(I,J), A) +// matrix and vector assign: C(I,J) = accum (C(I,J), A) -GrB_Info GxB_Matrix_assign_FC32 // C(I,J) = accum (C(I,J),x) +// --- assign ------------------------------------------------------------------ +// +// GrB_Matrix_assign C(I,J) += A M same size as matrix C. +// A is |I|-by-|J| +// +// GrB_Vector_assign w(I) += u m same size as column vector w. +// u is |I|-by-1 +// +// GrB_Row_assign C(i,J) += u' m is a column vector the same +// size as a row of C. +// u is |J|-by-1, i is a scalar. +// +// GrB_Col_assign C(I,j) += u m is a column vector the same +// size as a column of C. +// u is |I|-by-1, j is a scalar. +// +// --- subassign --------------------------------------------------------------- +// +// GxB_Matrix_subassign C(I,J) += A M same size as matrix A. +// A is |I|-by-|J| +// +// GxB_Vector_subassign w(I) += u m same size as column vector u. +// u is |I|-by-1 +// +// GxB_Row_subassign C(i,J) += u' m same size as column vector u. +// u is |J|-by-1, i is a scalar. +// +// GxB_Col_subassign C(I,j) += u m same size as column vector u. +// u is |I|-by-1, j is a scalar. + +GrB_Info GxB_Vector_subassign // w(I) = accum (w(I),u) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - GxB_FC32_t x, // scalar to assign to C(I,J) + GrB_Vector w, // input/output matrix for results + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w(I),t) + const GrB_Vector u, // first input: vector u const GrB_Index *Ilist, // row indices GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GxB_Matrix_assign_FC64 // C(I,J) = accum (C(I,J),x) +GrB_Info GxB_Matrix_subassign // C(I,J) = accum (C(I,J),A) ( GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - GxB_FC64_t x, // scalar to assign to C(I,J) + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),T) + const GrB_Matrix A, // first input: matrix A const GrB_Index *Ilist, // row indices GrB_Index ni, // number of row indices const GrB_Index *J, // column indices GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask + const GrB_Descriptor desc // descriptor for C(I,J), Mask, and A ) ; -GrB_Info GrB_Matrix_assign_UDT // C(I,J) = accum (C(I,J),x) +GrB_Info GxB_Col_subassign // C(I,j) = accum (C(I,j),u) ( GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - void *x, // scalar to assign to C(I,J) + const GrB_Vector mask, // optional mask for C(I,j), unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(C(I,j),t) + const GrB_Vector u, // input vector const GrB_Index *Ilist, // row indices GrB_Index ni, // number of row indices - const GrB_Index *J, // column indices - GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask + GrB_Index j, // column index + const GrB_Descriptor desc // descriptor for C(I,j) and mask ) ; -GrB_Info GrB_Matrix_assign_Scalar // C(I,J) = accum (C(I,J),x) +GrB_Info GxB_Row_subassign // C(i,J) = accum (C(i,J),u') ( GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) - GrB_Scalar x, // scalar to assign to C(I,J) - const GrB_Index *Ilist, // row indices - GrB_Index ni, // number of row indices + const GrB_Vector mask, // optional mask for C(i,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(C(i,J),t) + const GrB_Vector u, // input vector + GrB_Index i, // row index const GrB_Index *J, // column indices GrB_Index nj, // number of column indices - const GrB_Descriptor desc // descriptor for C and Mask + const GrB_Descriptor desc // descriptor for C(i,J) and mask ) ; //------------------------------------------------------------------------------ -// GrB_assign: generic submatrix/subvector assignment +// GxB_Vector_subassign_[SCALAR]: scalar expansion assignment to subvector //------------------------------------------------------------------------------ -// GrB_assign is a generic function that provides access to all specific -// GrB_*_assign* functions: - -// GrB_Vector_assign_T (w,m,acc,x,I,ni,d) // w(I) = acc(w(I),x) -// GrB_Vector_assign (w,m,acc,u,I,ni,d) // w(I) = acc(w(I),u) -// GrB_Matrix_assign_T (C,M,acc,x,I,ni,J,nj,d) // C(I,J) = acc(C(I,J),x) -// GrB_Col_assign (C,m,acc,u,I,ni,j,d) // C(I,j) = acc(C(I,j),u) -// GrB_Row_assign (C,m,acc,u,i,J,nj,d) // C(i,J) = acc(C(i,J),u') -// GrB_Matrix_assign (C,M,acc,A,I,ni,J,nj,d) // C(I,J) = acc(C(I,J),A) - -#if GxB_STDC_VERSION >= 201112L -#define GrB_assign(arg1,Mask,accum,arg4,arg5,...) \ - _Generic \ - ( \ - (arg1), \ - GrB_Vector : \ - _Generic \ - ( \ - (arg4), \ - GB_CASES (GrB, Vector_assign) , \ - GrB_Scalar : GrB_Vector_assign_Scalar , \ - default: GrB_Vector_assign \ - ), \ - default: \ - _Generic \ - ( \ - (arg4), \ - GB_CASES (GrB, Matrix_assign) , \ - GrB_Scalar : GrB_Matrix_assign_Scalar , \ - GrB_Vector : \ - _Generic \ - ( \ - (arg5), \ - const GrB_Index *: GrB_Col_assign , \ - GrB_Index *: GrB_Col_assign , \ - default: GrB_Row_assign \ - ), \ - default: GrB_Matrix_assign \ - ) \ - ) \ - (arg1, Mask, accum, arg4, arg5, __VA_ARGS__) -#endif - -//============================================================================== -// GrB_apply: matrix and vector apply -//============================================================================== - -// Apply a unary, index_unary, or binary operator to entries in a matrix or -// vector, C = accum (C, op (A)). - -GrB_Info GrB_Vector_apply // w = accum (w, op(u)) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_UnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - const GrB_Descriptor desc // descriptor for w and mask -) ; - -GrB_Info GrB_Matrix_apply // C = accum (C, op(A)) or op(A') -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_UnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A -) ; - -//------------------------------------------- -// vector apply: binaryop variants (bind 1st) -//------------------------------------------- - -// Apply a binary operator to the entries in a vector, binding the first -// input to a scalar x, w = accum (w, op (x,u)). +// Assigns a single scalar to a subvector, w(I) = accum(w(I),x). The +// scalar x is implicitly expanded into a vector u of size ni-by-1, with each +// entry in u equal to x, and then w(I) = accum(w(I),u) is done. -GrB_Info GrB_Vector_apply_BinaryOp1st_Scalar // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_BOOL // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Scalar x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w(I),x) + bool x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -// historical: identical to GxB_Vector_apply_BinaryOp1st -GrB_Info GxB_Vector_apply_BinaryOp1st // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_INT8 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Scalar x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + int8_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp1st_BOOL // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_UINT8 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - bool x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + uint8_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp1st_INT8 // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_INT16 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - int8_t x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + int16_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp1st_INT16 // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_UINT16 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - int16_t x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + uint16_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp1st_INT32 // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_INT32 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - int32_t x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + int32_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp1st_INT64 // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_UINT32 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - int64_t x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + uint32_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp1st_UINT8 // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_INT64 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - uint8_t x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + int64_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp1st_UINT16 // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_UINT64 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - uint16_t x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + uint64_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp1st_UINT32 // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_FP32 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - uint32_t x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + float x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp1st_UINT64 // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_FP64 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - uint64_t x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + double x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp1st_FP32 // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_FC32 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - float x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + GxB_FC32_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp1st_FP64 // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_FC64 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - double x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + GxB_FC64_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GxB_Vector_apply_BinaryOp1st_FC32 // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_UDT // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - GxB_FC32_t x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + void *x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GxB_Vector_apply_BinaryOp1st_FC64 // w = accum (w, op(x,u)) +GrB_Info GxB_Vector_subassign_Scalar // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - GxB_FC64_t x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + const GrB_Vector mask, // optional mask for w(I), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + GrB_Scalar x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Descriptor desc // descriptor for w(I) and mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp1st_UDT // w = accum (w, op(x,u)) +//------------------------------------------------------------------------------ +// GxB_Matrix_subassign_[SCALAR]: scalar expansion assignment to submatrix +//------------------------------------------------------------------------------ + +// Assigns a single scalar to a submatrix, C(I,J) = accum(C(I,J),x). The +// scalar x is implicitly expanded into a matrix A of size ni-by-nj, with each +// entry in A equal to x, and then C(I,J) = accum(C(I,J),A) is done. + +GrB_Info GxB_Matrix_subassign_BOOL // C(I,J) = accum (C(I,J),x) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const void *x, // first input: scalar x - const GrB_Vector u, // second input: vector u - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + bool x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask ) ; -//------------------------------------------- -// vector apply: binaryop variants (bind 2nd) -//------------------------------------------- +GrB_Info GxB_Matrix_subassign_INT8 // C(I,J) = accum (C(I,J),x) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + int8_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask +) ; -// Apply a binary operator to the entries in a vector, binding the second -// input to a scalar y, w = accum (w, op (u,y)). +GrB_Info GxB_Matrix_subassign_UINT8 // C(I,J) = accum (C(I,J),x) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + uint8_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask +) ; -GrB_Info GrB_Vector_apply_BinaryOp2nd_Scalar // w = accum (w, op(u,y)) +GrB_Info GxB_Matrix_subassign_INT16 // C(I,J) = accum (C(I,J),x) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - const GrB_Scalar y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + int16_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask ) ; -// historical: identical to GrB_Vector_apply_BinaryOp2nd_Scalar -GrB_Info GxB_Vector_apply_BinaryOp2nd // w = accum (w, op(u,y)) +GrB_Info GxB_Matrix_subassign_UINT16 // C(I,J) = accum (C(I,J),x) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - const GrB_Scalar y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + uint16_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp2nd_BOOL // w = accum (w, op(u,y)) +GrB_Info GxB_Matrix_subassign_INT32 // C(I,J) = accum (C(I,J),x) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - bool y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + int32_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp2nd_INT8 // w = accum (w, op(u,y)) +GrB_Info GxB_Matrix_subassign_UINT32 // C(I,J) = accum (C(I,J),x) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - int8_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + uint32_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp2nd_INT16 // w = accum (w, op(u,y)) +GrB_Info GxB_Matrix_subassign_INT64 // C(I,J) = accum (C(I,J),x) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - int16_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + int64_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp2nd_INT32 // w = accum (w, op(u,y)) +GrB_Info GxB_Matrix_subassign_UINT64 // C(I,J) = accum (C(I,J),x) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - int32_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + uint64_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp2nd_INT64 // w = accum (w, op(u,y)) +GrB_Info GxB_Matrix_subassign_FP32 // C(I,J) = accum (C(I,J),x) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - int64_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + float x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp2nd_UINT8 // w = accum (w, op(u,y)) +GrB_Info GxB_Matrix_subassign_FP64 // C(I,J) = accum (C(I,J),x) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - uint8_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + double x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp2nd_UINT16 // w = accum (w, op(u,y)) +GrB_Info GxB_Matrix_subassign_FC32 // C(I,J) = accum (C(I,J),x) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - uint16_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + GxB_FC32_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp2nd_UINT32 // w = accum (w, op(u,y)) +GrB_Info GxB_Matrix_subassign_FC64 // C(I,J) = accum (C(I,J),x) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - uint32_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + GxB_FC64_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp2nd_UINT64 // w = accum (w, op(u,y)) +GrB_Info GxB_Matrix_subassign_UDT // C(I,J) = accum (C(I,J),x) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - uint64_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + void *x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp2nd_FP32 // w = accum (w, op(u,y)) +GrB_Info GxB_Matrix_subassign_Scalar // C(I,J) = accum (C(I,J),x) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - float y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C(I,J), unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + GrB_Scalar x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(I,J) and Mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp2nd_FP64 // w = accum (w, op(u,y)) +//------------------------------------------------------------------------------ +// GxB_subassign: generic submatrix/subvector assignment +//------------------------------------------------------------------------------ + +// GxB_subassign is a generic function that provides access to all specific +// GxB_*_subassign* functions: + +// GxB_Vector_subassign (w,m,acc,u,I,ni,d) // w(I) = acc(w(I),u) +// GxB_Matrix_subassign (C,M,acc,A,I,ni,J,nj,d) // C(I,J) = acc(C(I,J),A) +// GxB_Col_subassign (C,m,acc,u,I,ni,j,d) // C(I,j) = acc(C(I,j),u) +// GxB_Row_subassign (C,m,acc,u,i,J,nj,d) // C(i,J) = acc(C(i,J),u') +// GxB_Vector_subassign_T (w,m,acc,x,I,ni,d) // w(I) = acc(w(I),x) +// GxB_Matrix_subassign_T (C,M,acc,x,I,ni,J,nj,d) // C(I,J) = acc(C(I,J),x) + +#if GxB_STDC_VERSION >= 201112L +#define GxB_subassign(arg1,Mask,accum,arg4,arg5,...) \ + _Generic \ + ( \ + (arg1), \ + GrB_Vector : \ + _Generic \ + ( \ + (arg4), \ + GB_CASES (GxB, Vector_subassign) , \ + GrB_Scalar : GxB_Vector_subassign_Scalar, \ + default: GxB_Vector_subassign \ + ), \ + default: \ + _Generic \ + ( \ + (arg4), \ + GB_CASES (GxB, Matrix_subassign) , \ + GrB_Scalar : GxB_Matrix_subassign_Scalar, \ + GrB_Vector : \ + _Generic \ + ( \ + (arg5), \ + const GrB_Index *: GxB_Col_subassign , \ + GrB_Index *: GxB_Col_subassign , \ + default: GxB_Row_subassign \ + ), \ + default: GxB_Matrix_subassign \ + ) \ + ) \ + (arg1, Mask, accum, arg4, arg5, __VA_ARGS__) +#endif + +//============================================================================== +// GrB_assign: matrix and vector assign: C(I,J) = accum (C(I,J), A) +//============================================================================== + +// Assign entries in a matrix or vector; C(I,J) = A. +// Each of these can be used with their generic name, GrB_assign. + +GrB_Info GrB_Vector_assign // w(I) = accum (w(I),u) ( - GrB_Vector w, // input/output vector for results + GrB_Vector w, // input/output matrix for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries + const GrB_BinaryOp accum, // optional accum for z=accum(w(I),t) const GrB_Vector u, // first input: vector u - double y, // second input: scalar y + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GxB_Vector_apply_BinaryOp2nd_FC32 // w = accum (w, op(u,y)) +GrB_Info GrB_Matrix_assign // C(I,J) = accum (C(I,J),A) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - GxB_FC32_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),T) + const GrB_Matrix A, // first input: matrix A + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C, Mask, and A ) ; -GrB_Info GxB_Vector_apply_BinaryOp2nd_FC64 // w = accum (w, op(u,y)) +GrB_Info GrB_Col_assign // C(I,j) = accum (C(I,j),u) ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - GxB_FC64_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Vector mask, // optional mask for C(:,j), unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(C(I,j),t) + const GrB_Vector u, // input vector + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + GrB_Index j, // column index + const GrB_Descriptor desc // descriptor for C(:,j) and mask ) ; -GrB_Info GrB_Vector_apply_BinaryOp2nd_UDT // w = accum (w, op(u,y)) +GrB_Info GrB_Row_assign // C(i,J) = accum (C(i,J),u') ( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - const void *y, // second input: scalar y - const GrB_Descriptor desc // descriptor for w and mask + GrB_Matrix C, // input/output matrix for results + const GrB_Vector mask, // optional mask for C(i,:), unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(C(i,J),t) + const GrB_Vector u, // input vector + GrB_Index i, // row index + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C(i,:) and mask ) ; -//------------------------------------------- -// vector apply: IndexUnaryOp variants -//------------------------------------------- +//------------------------------------------------------------------------------ +// GrB_Vector_assign_[SCALAR]: scalar expansion assignment to subvector +//------------------------------------------------------------------------------ -// Apply a GrB_IndexUnaryOp to the entries in a vector +// Assigns a single scalar to a subvector, w(I) = accum(w(I),x). The +// scalar x is implicitly expanded into a vector u of size ni-by-1, with each +// entry in u equal to x, and then w(I) = accum(w(I),u) is done. -GrB_Info GrB_Vector_apply_IndexOp_Scalar // w = accum (w, op(u)) +GrB_Info GrB_Vector_assign_BOOL // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - const GrB_Scalar y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for z=accum(w(I),x) + bool x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_apply_IndexOp_BOOL // w = accum (w, op(u)) +GrB_Info GrB_Vector_assign_INT8 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - bool y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + int8_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_apply_IndexOp_INT8 // w = accum (w, op(u)) +GrB_Info GrB_Vector_assign_UINT8 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - int8_t y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + uint8_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_apply_IndexOp_INT16 // w = accum (w, op(u)) +GrB_Info GrB_Vector_assign_INT16 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - int16_t y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + int16_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_apply_IndexOp_INT32 // w = accum (w, op(u)) +GrB_Info GrB_Vector_assign_UINT16 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - int32_t y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + uint16_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_apply_IndexOp_INT64 // w = accum (w, op(u)) +GrB_Info GrB_Vector_assign_INT32 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - int64_t y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + int32_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_apply_IndexOp_UINT8 // w = accum (w, op(u)) +GrB_Info GrB_Vector_assign_UINT32 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - uint8_t y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + uint32_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_apply_IndexOp_UINT16 // w = accum (w, op(u)) +GrB_Info GrB_Vector_assign_INT64 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - uint16_t y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + int64_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_apply_IndexOp_UINT32 // w = accum (w, op(u)) +GrB_Info GrB_Vector_assign_UINT64 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - uint32_t y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + uint64_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_apply_IndexOp_UINT64 // w = accum (w, op(u)) +GrB_Info GrB_Vector_assign_FP32 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - uint64_t y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + float x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_apply_IndexOp_FP32 // w = accum (w, op(u)) +GrB_Info GrB_Vector_assign_FP64 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - float y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + double x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_apply_IndexOp_FP64 // w = accum (w, op(u)) +GrB_Info GxB_Vector_assign_FC32 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - double y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + GxB_FC32_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GxB_Vector_apply_IndexOp_FC32 // w = accum (w, op(u)) +GrB_Info GxB_Vector_assign_FC64 // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - GxB_FC32_t y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + GxB_FC64_t x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GxB_Vector_apply_IndexOp_FC64 // w = accum (w, op(u)) +GrB_Info GrB_Vector_assign_UDT // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - GxB_FC64_t y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + void *x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_apply_IndexOp_UDT // w = accum (w, op(u)) +GrB_Info GrB_Vector_assign_Scalar // w(I) = accum (w(I),x) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Vector u, // first input: vector u - const void *y, // second input: scalar y + const GrB_BinaryOp accum, // optional accum for Z=accum(w(I),x) + GrB_Scalar x, // scalar to assign to w(I) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices const GrB_Descriptor desc // descriptor for w and mask ) ; -//------------------------------------------- -// matrix apply: binaryop variants (bind 1st) -//------------------------------------------- +//------------------------------------------------------------------------------ +// GrB_Matrix_assign_[SCALAR]: scalar expansion assignment to submatrix +//------------------------------------------------------------------------------ -// Apply a binary operator to the entries in a matrix, binding the first input -// to a scalar x, C = accum (C, op (x,A)), or op(x,A'). +// Assigns a single scalar to a submatrix, C(I,J) = accum(C(I,J),x). The +// scalar x is implicitly expanded into a matrix A of size ni-by-nj, with each +// entry in A equal to x, and then C(I,J) = accum(C(I,J),A) is done. -GrB_Info GrB_Matrix_apply_BinaryOp1st_Scalar // C=accum(C,op(x,A)) +GrB_Info GrB_Matrix_assign_BOOL // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Scalar x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + bool x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -// historical: identical to GrB_Matrix_apply_BinaryOp1st_Scalar -GrB_Info GxB_Matrix_apply_BinaryOp1st // C=accum(C,op(x,A)) +GrB_Info GrB_Matrix_assign_INT8 // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Scalar x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + int8_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp1st_BOOL // C=accum(C,op(x,A)) +GrB_Info GrB_Matrix_assign_UINT8 // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - bool x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + uint8_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp1st_INT8 // C=accum(C,op(x,A)) +GrB_Info GrB_Matrix_assign_INT16 // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - int8_t x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + int16_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp1st_INT16 // C=accum(C,op(x,A)) +GrB_Info GrB_Matrix_assign_UINT16 // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - int16_t x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + uint16_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask +) ; + +GrB_Info GrB_Matrix_assign_INT32 // C(I,J) = accum (C(I,J),x) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + int32_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp1st_INT32 // C=accum(C,op(x,A)) +GrB_Info GrB_Matrix_assign_UINT32 // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - int32_t x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + uint32_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp1st_INT64 // C=accum(C,op(x,A)) +GrB_Info GrB_Matrix_assign_INT64 // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - int64_t x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + int64_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp1st_UINT8 // C=accum(C,op(x,A)) +GrB_Info GrB_Matrix_assign_UINT64 // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - uint8_t x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + uint64_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp1st_UINT16 // C=accum(C,op(x,A)) +GrB_Info GrB_Matrix_assign_FP32 // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - uint16_t x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + float x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp1st_UINT32 // C=accum(C,op(x,A)) +GrB_Info GrB_Matrix_assign_FP64 // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - uint32_t x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + double x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp1st_UINT64 // C=accum(C,op(x,A)) +GrB_Info GxB_Matrix_assign_FC32 // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - uint64_t x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + GxB_FC32_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp1st_FP32 // C=accum(C,op(x,A)) +GrB_Info GxB_Matrix_assign_FC64 // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - float x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + GxB_FC64_t x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp1st_FP64 // C=accum(C,op(x,A)) +GrB_Info GrB_Matrix_assign_UDT // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - double x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + void *x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -GrB_Info GxB_Matrix_apply_BinaryOp1st_FC32 // C=accum(C,op(x,A)) +GrB_Info GrB_Matrix_assign_Scalar // C(I,J) = accum (C(I,J),x) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - GxB_FC32_t x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_BinaryOp accum, // optional accum for Z=accum(C(I,J),x) + GrB_Scalar x, // scalar to assign to C(I,J) + const GrB_Index *Ilist, // row indices + GrB_Index ni, // number of row indices + const GrB_Index *J, // column indices + GrB_Index nj, // number of column indices + const GrB_Descriptor desc // descriptor for C and Mask ) ; -GrB_Info GxB_Matrix_apply_BinaryOp1st_FC64 // C=accum(C,op(x,A)) +//------------------------------------------------------------------------------ +// GrB_assign: generic submatrix/subvector assignment +//------------------------------------------------------------------------------ + +// GrB_assign is a generic function that provides access to all specific +// GrB_*_assign* functions: + +// GrB_Vector_assign_T (w,m,acc,x,I,ni,d) // w(I) = acc(w(I),x) +// GrB_Vector_assign (w,m,acc,u,I,ni,d) // w(I) = acc(w(I),u) +// GrB_Matrix_assign_T (C,M,acc,x,I,ni,J,nj,d) // C(I,J) = acc(C(I,J),x) +// GrB_Col_assign (C,m,acc,u,I,ni,j,d) // C(I,j) = acc(C(I,j),u) +// GrB_Row_assign (C,m,acc,u,i,J,nj,d) // C(i,J) = acc(C(i,J),u') +// GrB_Matrix_assign (C,M,acc,A,I,ni,J,nj,d) // C(I,J) = acc(C(I,J),A) + +#if GxB_STDC_VERSION >= 201112L +#define GrB_assign(arg1,Mask,accum,arg4,arg5,...) \ + _Generic \ + ( \ + (arg1), \ + GrB_Vector : \ + _Generic \ + ( \ + (arg4), \ + GB_CASES (GrB, Vector_assign) , \ + GrB_Scalar : GrB_Vector_assign_Scalar , \ + default: GrB_Vector_assign \ + ), \ + default: \ + _Generic \ + ( \ + (arg4), \ + GB_CASES (GrB, Matrix_assign) , \ + GrB_Scalar : GrB_Matrix_assign_Scalar , \ + GrB_Vector : \ + _Generic \ + ( \ + (arg5), \ + const GrB_Index *: GrB_Col_assign , \ + GrB_Index *: GrB_Col_assign , \ + default: GrB_Row_assign \ + ), \ + default: GrB_Matrix_assign \ + ) \ + ) \ + (arg1, Mask, accum, arg4, arg5, __VA_ARGS__) +#endif + +//============================================================================== +// GrB_apply: matrix and vector apply +//============================================================================== + +// Apply a unary, index_unary, or binary operator to entries in a matrix or +// vector, C = accum (C, op (A)). + +GrB_Info GrB_Vector_apply // w = accum (w, op(u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - GxB_FC64_t x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A - const GrB_Descriptor desc // descriptor for C, mask, and A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_UnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp1st_UDT // C=accum(C,op(x,A)) +GrB_Info GrB_Matrix_apply // C = accum (C, op(A)) or op(A') ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - const void *x, // first input: scalar x - const GrB_Matrix A, // second input: matrix A + const GrB_UnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A const GrB_Descriptor desc // descriptor for C, mask, and A ) ; //------------------------------------------- -// matrix apply: binaryop variants (bind 2nd) +// vector apply: binaryop variants (bind 1st) //------------------------------------------- -// Apply a binary operator to the entries in a matrix, binding the second input -// to a scalar y, C = accum (C, op (A,y)), or op(A',y). +// Apply a binary operator to the entries in a vector, binding the first +// input to a scalar x, w = accum (w, op (x,u)). -GrB_Info GrB_Matrix_apply_BinaryOp2nd_Scalar // C=accum(C,op(A,y)) +GrB_Info GrB_Vector_apply_BinaryOp1st_Scalar // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - const GrB_Scalar y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Scalar x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -// historical: identical to GrB_Matrix_apply_BinaryOp2nd_Scalar -GrB_Info GxB_Matrix_apply_BinaryOp2nd // C=accum(C,op(A,y)) +// historical: identical to GxB_Vector_apply_BinaryOp1st +GrB_Info GxB_Vector_apply_BinaryOp1st // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - const GrB_Scalar y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Scalar x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp2nd_BOOL // C=accum(C,op(A,y)) +GrB_Info GrB_Vector_apply_BinaryOp1st_BOOL // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - bool y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + bool x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp2nd_INT8 // C=accum(C,op(A,y)) +GrB_Info GrB_Vector_apply_BinaryOp1st_INT8 // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - int8_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + int8_t x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp2nd_INT16 // C=accum(C,op(A,y)) +GrB_Info GrB_Vector_apply_BinaryOp1st_INT16 // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - int16_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + int16_t x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp2nd_INT32 // C=accum(C,op(A,y)) +GrB_Info GrB_Vector_apply_BinaryOp1st_INT32 // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - int32_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + int32_t x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp2nd_INT64 // C=accum(C,op(A,y)) +GrB_Info GrB_Vector_apply_BinaryOp1st_INT64 // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - int64_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + int64_t x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp2nd_UINT8 // C=accum(C,op(A,y)) +GrB_Info GrB_Vector_apply_BinaryOp1st_UINT8 // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - uint8_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + uint8_t x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp2nd_UINT16 // C=accum(C,op(A,y)) +GrB_Info GrB_Vector_apply_BinaryOp1st_UINT16 // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - uint16_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + uint16_t x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp2nd_UINT32 // C=accum(C,op(A,y)) +GrB_Info GrB_Vector_apply_BinaryOp1st_UINT32 // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - uint32_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + uint32_t x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp2nd_UINT64 // C=accum(C,op(A,y)) +GrB_Info GrB_Vector_apply_BinaryOp1st_UINT64 // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - uint64_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + uint64_t x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp2nd_FP32 // C=accum(C,op(A,y)) +GrB_Info GrB_Vector_apply_BinaryOp1st_FP32 // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - float y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + float x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp2nd_FP64 // C=accum(C,op(A,y)) +GrB_Info GrB_Vector_apply_BinaryOp1st_FP64 // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - double y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + double x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GxB_Matrix_apply_BinaryOp2nd_FC32 // C=accum(C,op(A,y)) +GrB_Info GxB_Vector_apply_BinaryOp1st_FC32 // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - GxB_FC32_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + GxB_FC32_t x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GxB_Matrix_apply_BinaryOp2nd_FC64 // C=accum(C,op(A,y)) +GrB_Info GxB_Vector_apply_BinaryOp1st_FC64 // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - GxB_FC64_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + GxB_FC64_t x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_BinaryOp2nd_UDT // C=accum(C,op(A,y)) +GrB_Info GrB_Vector_apply_BinaryOp1st_UDT // w = accum (w, op(x,u)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) const GrB_BinaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - const void *y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const void *x, // first input: scalar x + const GrB_Vector u, // second input: vector u + const GrB_Descriptor desc // descriptor for w and mask ) ; //------------------------------------------- -// matrix apply: IndexUnaryOp variants +// vector apply: binaryop variants (bind 2nd) //------------------------------------------- -// Apply a GrB_IndexUnaryOp to the entries in a matrix. +// Apply a binary operator to the entries in a vector, binding the second +// input to a scalar y, w = accum (w, op (u,y)). -GrB_Info GrB_Matrix_apply_IndexOp_Scalar // C=accum(C,op(A)) +GrB_Info GrB_Vector_apply_BinaryOp2nd_Scalar // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u const GrB_Scalar y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_IndexOp_BOOL // C=accum(C,op(A)) +// historical: identical to GrB_Vector_apply_BinaryOp2nd_Scalar +GrB_Info GxB_Vector_apply_BinaryOp2nd // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + const GrB_Scalar y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; + +GrB_Info GrB_Vector_apply_BinaryOp2nd_BOOL // w = accum (w, op(u,y)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u bool y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_IndexOp_INT8 // C=accum(C,op(A)) +GrB_Info GrB_Vector_apply_BinaryOp2nd_INT8 // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u int8_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_IndexOp_INT16 // C=accum(C,op(A)) +GrB_Info GrB_Vector_apply_BinaryOp2nd_INT16 // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u int16_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_IndexOp_INT32 // C=accum(C,op(A)) +GrB_Info GrB_Vector_apply_BinaryOp2nd_INT32 // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u int32_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_IndexOp_INT64 // C=accum(C,op(A)) +GrB_Info GrB_Vector_apply_BinaryOp2nd_INT64 // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u int64_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_IndexOp_UINT8 // C=accum(C,op(A)) +GrB_Info GrB_Vector_apply_BinaryOp2nd_UINT8 // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u uint8_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_IndexOp_UINT16 // C=accum(C,op(A)) +GrB_Info GrB_Vector_apply_BinaryOp2nd_UINT16 // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u uint16_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_IndexOp_UINT32 // C=accum(C,op(A)) +GrB_Info GrB_Vector_apply_BinaryOp2nd_UINT32 // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u uint32_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_IndexOp_UINT64 // C=accum(C,op(A)) +GrB_Info GrB_Vector_apply_BinaryOp2nd_UINT64 // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u uint64_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_IndexOp_FP32 // C=accum(C,op(A)) +GrB_Info GrB_Vector_apply_BinaryOp2nd_FP32 // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u float y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_IndexOp_FP64 // C=accum(C,op(A)) +GrB_Info GrB_Vector_apply_BinaryOp2nd_FP64 // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u double y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GxB_Matrix_apply_IndexOp_FC32 // C=accum(C,op(A)) +GrB_Info GxB_Vector_apply_BinaryOp2nd_FC32 // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u GxB_FC32_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GxB_Matrix_apply_IndexOp_FC64 // C=accum(C,op(A)) +GrB_Info GxB_Vector_apply_BinaryOp2nd_FC64 // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u GxB_FC64_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Matrix_apply_IndexOp_UDT // C=accum(C,op(A)) +GrB_Info GrB_Vector_apply_BinaryOp2nd_UDT // w = accum (w, op(u,y)) ( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u const void *y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A + const GrB_Descriptor desc // descriptor for w and mask ) ; -//------------------------------------------------------------------------------ -// GrB_apply: generic matrix/vector apply -//------------------------------------------------------------------------------ - -// GrB_apply is a generic function for applying a unary operator to a matrix -// or vector and provides access to these functions: - -// GrB_Vector_apply (w,mask,acc,op,u,d) // w = accum (w, op(u)) -// GrB_Matrix_apply (C,Mask,acc,op,A,d) // C = accum (C, op(A)) - -// GrB_Vector_apply (w,m,acc,unop ,u,d) -// GrB_Vector_apply_BinaryOp1st_TYPE (w,m,acc,binop,x,u,d) -// GrB_Vector_apply_BinaryOp2nd_TYPE (w,m,acc,binop,u,y,d) -// GrB_Vector_apply_IndexOp_TYPE (w,m,acc,idxop,u,y,d) - -// GrB_Matrix_apply (C,M,acc,unop ,A,d) -// GrB_Matrix_apply_BinaryOp1st_TYPE (C,M,acc,binop,x,A,d) -// GrB_Matrix_apply_BinaryOp2nd_TYPE (C,M,acc,binop,A,y,d) -// GrB_Matrix_apply_IndexOp_TYPE (C,M,acc,idxop,A,y,d) - -#if GxB_STDC_VERSION >= 201112L - -#define GB_BIND(kind,x,y,...) \ - _Generic \ - ( \ - (x), \ - GrB_Scalar: GB_CONCAT ( GrB,_,kind,_apply_BinaryOp1st_Scalar), \ - GB_CASES (GrB, GB_CONCAT ( kind, _apply_BinaryOp1st,, )) , \ - default: \ - _Generic \ - ( \ - (y), \ - GB_CASES (GrB, GB_CONCAT ( kind , _apply_BinaryOp2nd,, )), \ - default: GB_CONCAT ( GrB,_,kind,_apply_BinaryOp2nd_Scalar) \ - ) \ - ) - -#define GB_IDXOP(kind,A,y,...) \ - _Generic \ - ( \ - (y), \ - GB_CASES (GrB, GB_CONCAT ( kind, _apply_IndexOp,, )), \ - default: GB_CONCAT ( GrB, _, kind, _apply_IndexOp_Scalar) \ - ) - -#define GrB_apply(C,Mask,accum,op,...) \ - _Generic \ - ( \ - (C), \ - GrB_Vector : \ - _Generic \ - ( \ - (op), \ - GrB_UnaryOp : GrB_Vector_apply , \ - GrB_BinaryOp : GB_BIND (Vector, __VA_ARGS__), \ - GrB_IndexUnaryOp : GB_IDXOP (Vector, __VA_ARGS__) \ - ), \ - GrB_Matrix : \ - _Generic \ - ( \ - (op), \ - GrB_UnaryOp : GrB_Matrix_apply , \ - GrB_BinaryOp : GB_BIND (Matrix, __VA_ARGS__), \ - GrB_IndexUnaryOp : GB_IDXOP (Matrix, __VA_ARGS__) \ - ) \ - ) \ - (C, Mask, accum, op, __VA_ARGS__) -#endif - -//============================================================================== -// GrB_select: matrix and vector selection using an IndexUnaryOp -//============================================================================== - //------------------------------------------- -// vector select using an IndexUnaryOp +// vector apply: IndexUnaryOp variants //------------------------------------------- -GrB_Info GrB_Vector_select_Scalar // w = accum (w, op(u)) +// Apply a GrB_IndexUnaryOp to the entries in a vector + +GrB_Info GrB_Vector_apply_IndexOp_Scalar // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7312,7 +7483,7 @@ GrB_Info GrB_Vector_select_Scalar // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_select_BOOL // w = accum (w, op(u)) +GrB_Info GrB_Vector_apply_IndexOp_BOOL // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7323,7 +7494,7 @@ GrB_Info GrB_Vector_select_BOOL // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_select_INT8 // w = accum (w, op(u)) +GrB_Info GrB_Vector_apply_IndexOp_INT8 // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7334,7 +7505,7 @@ GrB_Info GrB_Vector_select_INT8 // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_select_INT16 // w = accum (w, op(u)) +GrB_Info GrB_Vector_apply_IndexOp_INT16 // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7345,7 +7516,7 @@ GrB_Info GrB_Vector_select_INT16 // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_select_INT32 // w = accum (w, op(u)) +GrB_Info GrB_Vector_apply_IndexOp_INT32 // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7356,7 +7527,7 @@ GrB_Info GrB_Vector_select_INT32 // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_select_INT64 // w = accum (w, op(u)) +GrB_Info GrB_Vector_apply_IndexOp_INT64 // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7367,7 +7538,7 @@ GrB_Info GrB_Vector_select_INT64 // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_select_UINT8 // w = accum (w, op(u)) +GrB_Info GrB_Vector_apply_IndexOp_UINT8 // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7378,7 +7549,7 @@ GrB_Info GrB_Vector_select_UINT8 // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_select_UINT16 // w = accum (w, op(u)) +GrB_Info GrB_Vector_apply_IndexOp_UINT16 // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7389,7 +7560,7 @@ GrB_Info GrB_Vector_select_UINT16 // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_select_UINT32 // w = accum (w, op(u)) +GrB_Info GrB_Vector_apply_IndexOp_UINT32 // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7400,7 +7571,7 @@ GrB_Info GrB_Vector_select_UINT32 // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_select_UINT64 // w = accum (w, op(u)) +GrB_Info GrB_Vector_apply_IndexOp_UINT64 // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7411,7 +7582,7 @@ GrB_Info GrB_Vector_select_UINT64 // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_select_FP32 // w = accum (w, op(u)) +GrB_Info GrB_Vector_apply_IndexOp_FP32 // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7422,7 +7593,7 @@ GrB_Info GrB_Vector_select_FP32 // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_select_FP64 // w = accum (w, op(u)) +GrB_Info GrB_Vector_apply_IndexOp_FP64 // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7433,7 +7604,7 @@ GrB_Info GrB_Vector_select_FP64 // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GxB_Vector_select_FC32 // w = accum (w, op(u)) +GrB_Info GxB_Vector_apply_IndexOp_FC32 // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7444,7 +7615,7 @@ GrB_Info GxB_Vector_select_FC32 // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GxB_Vector_select_FC64 // w = accum (w, op(u)) +GrB_Info GxB_Vector_apply_IndexOp_FC64 // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7455,7 +7626,7 @@ GrB_Info GxB_Vector_select_FC64 // w = accum (w, op(u)) const GrB_Descriptor desc // descriptor for w and mask ) ; -GrB_Info GrB_Vector_select_UDT // w = accum (w, op(u)) +GrB_Info GrB_Vector_apply_IndexOp_UDT // w = accum (w, op(u)) ( GrB_Vector w, // input/output vector for results const GrB_Vector mask, // optional mask for w, unused if NULL @@ -7467,1629 +7638,1465 @@ GrB_Info GrB_Vector_select_UDT // w = accum (w, op(u)) ) ; //------------------------------------------- -// matrix select using an IndexUnaryOp +// matrix apply: binaryop variants (bind 1st) //------------------------------------------- -GrB_Info GrB_Matrix_select_Scalar // C=accum(C,op(A)) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - const GrB_Scalar y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A -) ; - -GrB_Info GrB_Matrix_select_BOOL // C=accum(C,op(A)) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - bool y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A -) ; - -GrB_Info GrB_Matrix_select_INT8 // C=accum(C,op(A)) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - int8_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A -) ; - -GrB_Info GrB_Matrix_select_INT16 // C=accum(C,op(A)) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - int16_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A -) ; - -GrB_Info GrB_Matrix_select_INT32 // C=accum(C,op(A)) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - int32_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A -) ; - -GrB_Info GrB_Matrix_select_INT64 // C=accum(C,op(A)) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - int64_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A -) ; - -GrB_Info GrB_Matrix_select_UINT8 // C=accum(C,op(A)) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - uint8_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A -) ; - -GrB_Info GrB_Matrix_select_UINT16 // C=accum(C,op(A)) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - uint16_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A -) ; - -GrB_Info GrB_Matrix_select_UINT32 // C=accum(C,op(A)) -( - GrB_Matrix C, // input/output matrix for results - const GrB_Matrix Mask, // optional mask for C, unused if NULL - const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - uint32_t y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A -) ; +// Apply a binary operator to the entries in a matrix, binding the first input +// to a scalar x, C = accum (C, op (x,A)), or op(x,A'). -GrB_Info GrB_Matrix_select_UINT64 // C=accum(C,op(A)) +GrB_Info GrB_Matrix_apply_BinaryOp1st_Scalar // C=accum(C,op(x,A)) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - uint64_t y, // second input: scalar y + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Scalar x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_select_FP32 // C=accum(C,op(A)) +// historical: identical to GrB_Matrix_apply_BinaryOp1st_Scalar +GrB_Info GxB_Matrix_apply_BinaryOp1st // C=accum(C,op(x,A)) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - float y, // second input: scalar y + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Scalar x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_select_FP64 // C=accum(C,op(A)) +GrB_Info GrB_Matrix_apply_BinaryOp1st_BOOL // C=accum(C,op(x,A)) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - double y, // second input: scalar y + const GrB_BinaryOp op, // operator to apply to the entries + bool x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GxB_Matrix_select_FC32 // C=accum(C,op(A)) +GrB_Info GrB_Matrix_apply_BinaryOp1st_INT8 // C=accum(C,op(x,A)) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - GxB_FC32_t y, // second input: scalar y + const GrB_BinaryOp op, // operator to apply to the entries + int8_t x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GxB_Matrix_select_FC64 // C=accum(C,op(A)) +GrB_Info GrB_Matrix_apply_BinaryOp1st_INT16 // C=accum(C,op(x,A)) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - GxB_FC64_t y, // second input: scalar y + const GrB_BinaryOp op, // operator to apply to the entries + int16_t x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_select_UDT // C=accum(C,op(A)) +GrB_Info GrB_Matrix_apply_BinaryOp1st_INT32 // C=accum(C,op(x,A)) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_IndexUnaryOp op, // operator to apply to the entries - const GrB_Matrix A, // first input: matrix A - const void *y, // second input: scalar y - const GrB_Descriptor desc // descriptor for C, mask, and A -) ; - -// GrB_select is a generic method that applies an IndexUnaryOp to -// a matrix or vector, using any type of the scalar y. - -// GrB_Vector_select_TYPE (w,m,acc,idxop,u,y,d) -// GrB_Matrix_select_TYPE (C,M,acc,idxop,A,y,d) - -#if GxB_STDC_VERSION >= 201112L -#define GrB_select(C,Mask,accum,op,x,y,d) \ - _Generic \ - ( \ - (C), \ - GrB_Vector : \ - _Generic \ - ( \ - (y), \ - GB_CASES (GrB, Vector_select), \ - default: GrB_Vector_select_Scalar \ - ), \ - GrB_Matrix : \ - _Generic \ - ( \ - (y), \ - GB_CASES (GrB, Matrix_select), \ - default: GrB_Matrix_select_Scalar \ - ) \ - ) \ - (C, Mask, accum, op, x, y, d) -#endif - -//============================================================================== -// GxB_select: matrix and vector selection (DEPRECATED: use GrB_select instead) -//============================================================================== - -GrB_Info GxB_Vector_select (GrB_Vector w, const GrB_Vector mask, -const GrB_BinaryOp accum, const GxB_SelectOp op, const GrB_Vector u, -const GrB_Scalar Thunk, const GrB_Descriptor desc) ; -GrB_Info GxB_Matrix_select (GrB_Matrix C, const GrB_Matrix Mask, -const GrB_BinaryOp accum, const GxB_SelectOp op, const GrB_Matrix A, -const GrB_Scalar Thunk, const GrB_Descriptor desc) ; -#if GxB_STDC_VERSION >= 201112L -#define GxB_select(C,Mask,accum,op,A,Thunk,desc) _Generic \ -((C), GrB_Vector:GxB_Vector_select , GrB_Matrix:GxB_Matrix_select ) \ -(C, Mask, accum, op, A, Thunk, desc) -#endif - -//============================================================================== -// GrB_reduce: matrix and vector reduction -//============================================================================== - -// Reduce the entries in a matrix to a vector, a column vector t such that -// t(i) = sum (A (i,:)), and where "sum" is a commutative and associative -// monoid with an identity value. A can be transposed, which reduces down the -// columns instead of the rows. - -// For GrB_Matrix_reduce_BinaryOp, the GrB_BinaryOp op must correspond to a -// known built-in monoid: -// -// operator data-types (all built-in) -// ---------------------- --------------------------- -// MIN, MAX INT*, UINT*, FP* -// TIMES, PLUS INT*, UINT*, FP*, FC* -// ANY INT*, UINT*, FP*, FC*, BOOL -// LOR, LAND, LXOR, EQ BOOL -// BOR, BAND, BXOR, BXNOR UINT* - -GrB_Info GrB_Matrix_reduce_Monoid // w = accum (w,reduce(A)) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_Monoid monoid, // reduce operator for t=reduce(A) - const GrB_Matrix A, // first input: matrix A - const GrB_Descriptor desc // descriptor for w, mask, and A -) ; - -GrB_Info GrB_Matrix_reduce_BinaryOp // w = accum (w,reduce(A)) -( - GrB_Vector w, // input/output vector for results - const GrB_Vector mask, // optional mask for w, unused if NULL - const GrB_BinaryOp accum, // optional accum for z=accum(w,t) - const GrB_BinaryOp op, // reduce operator for t=reduce(A) - const GrB_Matrix A, // first input: matrix A - const GrB_Descriptor desc // descriptor for w, mask, and A -) ; - -//------------------------------------------------------------------------------ -// reduce a vector to a scalar -//------------------------------------------------------------------------------ - -// Reduce entries in a vector to a scalar, c = accum (c, reduce_to_scalar(u)) - -GrB_Info GrB_Vector_reduce_BOOL // c = accum (c, reduce_to_scalar (u)) -( - bool *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + const GrB_BinaryOp op, // operator to apply to the entries + int32_t x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Vector_reduce_INT8 // c = accum (c, reduce_to_scalar (u)) +GrB_Info GrB_Matrix_apply_BinaryOp1st_INT64 // C=accum(C,op(x,A)) ( - int8_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + int64_t x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Vector_reduce_UINT8 // c = accum (c, reduce_to_scalar (u)) +GrB_Info GrB_Matrix_apply_BinaryOp1st_UINT8 // C=accum(C,op(x,A)) ( - uint8_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + uint8_t x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Vector_reduce_INT16 // c = accum (c, reduce_to_scalar (u)) +GrB_Info GrB_Matrix_apply_BinaryOp1st_UINT16 // C=accum(C,op(x,A)) ( - int16_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + uint16_t x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Vector_reduce_UINT16 // c = accum (c, reduce_to_scalar (u)) +GrB_Info GrB_Matrix_apply_BinaryOp1st_UINT32 // C=accum(C,op(x,A)) ( - uint16_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + uint32_t x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Vector_reduce_INT32 // c = accum (c, reduce_to_scalar (u)) +GrB_Info GrB_Matrix_apply_BinaryOp1st_UINT64 // C=accum(C,op(x,A)) ( - int32_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + uint64_t x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Vector_reduce_UINT32 // c = accum (c, reduce_to_scalar (u)) +GrB_Info GrB_Matrix_apply_BinaryOp1st_FP32 // C=accum(C,op(x,A)) ( - uint32_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + float x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Vector_reduce_INT64 // c = accum (c, reduce_to_scalar (u)) +GrB_Info GrB_Matrix_apply_BinaryOp1st_FP64 // C=accum(C,op(x,A)) ( - int64_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + double x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Vector_reduce_UINT64 // c = accum (c, reduce_to_scalar (u)) +GrB_Info GxB_Matrix_apply_BinaryOp1st_FC32 // C=accum(C,op(x,A)) ( - uint64_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + GxB_FC32_t x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Vector_reduce_FP32 // c = accum (c, reduce_to_scalar (u)) +GrB_Info GxB_Matrix_apply_BinaryOp1st_FC64 // C=accum(C,op(x,A)) ( - float *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + GxB_FC64_t x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Vector_reduce_FP64 // c = accum (c, reduce_to_scalar (u)) +GrB_Info GrB_Matrix_apply_BinaryOp1st_UDT // C=accum(C,op(x,A)) ( - double *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const void *x, // first input: scalar x + const GrB_Matrix A, // second input: matrix A + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GxB_Vector_reduce_FC32 // c = accum (c, reduce_to_scalar (u)) -( - GxB_FC32_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc -) ; +//------------------------------------------- +// matrix apply: binaryop variants (bind 2nd) +//------------------------------------------- -GrB_Info GxB_Vector_reduce_FC64 // c = accum (c, reduce_to_scalar (u)) +// Apply a binary operator to the entries in a matrix, binding the second input +// to a scalar y, C = accum (C, op (A,y)), or op(A',y). + +GrB_Info GrB_Matrix_apply_BinaryOp2nd_Scalar // C=accum(C,op(A,y)) ( - GxB_FC64_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + const GrB_Scalar y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Vector_reduce_UDT // c = accum (c, reduce_to_scalar (u)) +// historical: identical to GrB_Matrix_apply_BinaryOp2nd_Scalar +GrB_Info GxB_Matrix_apply_BinaryOp2nd // C=accum(C,op(A,y)) ( - void *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + const GrB_Scalar y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Vector_reduce_Monoid_Scalar // c = accum(c,reduce_to_scalar(u)) +GrB_Info GrB_Matrix_apply_BinaryOp2nd_BOOL // C=accum(C,op(A,y)) ( - GrB_Scalar c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + bool y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Vector_reduce_BinaryOp_Scalar +GrB_Info GrB_Matrix_apply_BinaryOp2nd_INT8 // C=accum(C,op(A,y)) ( - GrB_Scalar c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_BinaryOp op, // binary op to do the reduction - const GrB_Vector u, // vector to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + int8_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -//------------------------------------------------------------------------------ -// reduce a matrix to a scalar -//------------------------------------------------------------------------------ - -// Reduce entries in a matrix to a scalar, c = accum (c, reduce_to_scalar(A)) - -GrB_Info GrB_Matrix_reduce_BOOL // c = accum (c, reduce_to_scalar (A)) +GrB_Info GrB_Matrix_apply_BinaryOp2nd_INT16 // C=accum(C,op(A,y)) ( - bool *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + int16_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_reduce_INT8 // c = accum (c, reduce_to_scalar (A)) +GrB_Info GrB_Matrix_apply_BinaryOp2nd_INT32 // C=accum(C,op(A,y)) ( - int8_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + int32_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_reduce_UINT8 // c = accum (c, reduce_to_scalar (A)) +GrB_Info GrB_Matrix_apply_BinaryOp2nd_INT64 // C=accum(C,op(A,y)) ( - uint8_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + int64_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_reduce_INT16 // c = accum (c, reduce_to_scalar (A)) +GrB_Info GrB_Matrix_apply_BinaryOp2nd_UINT8 // C=accum(C,op(A,y)) ( - int16_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + uint8_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_reduce_UINT16 // c = accum (c, reduce_to_scalar (A)) +GrB_Info GrB_Matrix_apply_BinaryOp2nd_UINT16 // C=accum(C,op(A,y)) ( - uint16_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + uint16_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_reduce_INT32 // c = accum (c, reduce_to_scalar (A)) +GrB_Info GrB_Matrix_apply_BinaryOp2nd_UINT32 // C=accum(C,op(A,y)) ( - int32_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + uint32_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_reduce_UINT32 // c = accum (c, reduce_to_scalar (A)) +GrB_Info GrB_Matrix_apply_BinaryOp2nd_UINT64 // C=accum(C,op(A,y)) ( - uint32_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + uint64_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_reduce_INT64 // c = accum (c, reduce_to_scalar (A)) +GrB_Info GrB_Matrix_apply_BinaryOp2nd_FP32 // C=accum(C,op(A,y)) ( - int64_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + float y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_reduce_UINT64 // c = accum (c, reduce_to_scalar (A)) +GrB_Info GrB_Matrix_apply_BinaryOp2nd_FP64 // C=accum(C,op(A,y)) ( - uint64_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + double y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_reduce_FP32 // c = accum (c, reduce_to_scalar (A)) +GrB_Info GxB_Matrix_apply_BinaryOp2nd_FC32 // C=accum(C,op(A,y)) ( - float *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + GxB_FC32_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_reduce_FP64 // c = accum (c, reduce_to_scalar (A)) +GrB_Info GxB_Matrix_apply_BinaryOp2nd_FC64 // C=accum(C,op(A,y)) ( - double *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + GxB_FC64_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GxB_Matrix_reduce_FC32 // c = accum (c, reduce_to_scalar (A)) +GrB_Info GrB_Matrix_apply_BinaryOp2nd_UDT // C=accum(C,op(A,y)) ( - GxB_FC32_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + const void *y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GxB_Matrix_reduce_FC64 // c = accum (c, reduce_to_scalar (A)) +//------------------------------------------- +// matrix apply: IndexUnaryOp variants +//------------------------------------------- + +// Apply a GrB_IndexUnaryOp to the entries in a matrix. + +GrB_Info GrB_Matrix_apply_IndexOp_Scalar // C=accum(C,op(A)) ( - GxB_FC64_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + const GrB_Scalar y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_reduce_UDT // c = accum (c, reduce_to_scalar (A)) +GrB_Info GrB_Matrix_apply_IndexOp_BOOL // C=accum(C,op(A)) ( - void *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + bool y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_reduce_Monoid_Scalar // c = accum(c,reduce_to_scalar(A)) +GrB_Info GrB_Matrix_apply_IndexOp_INT8 // C=accum(C,op(A)) ( - GrB_Scalar c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + int8_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_reduce_BinaryOp_Scalar +GrB_Info GrB_Matrix_apply_IndexOp_INT16 // C=accum(C,op(A)) ( - GrB_Scalar S, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_BinaryOp op, // binary op to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + int16_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -//------------------------------------------------------------------------------ -// GrB_reduce: generic matrix/vector reduction to a vector or scalar -//------------------------------------------------------------------------------ - -// GrB_reduce is a generic function that provides access to all GrB_*reduce* -// functions: - -// reduce matrix to vector: -// GrB_Matrix_reduce_Monoid (w,mask,acc,mo,A,d) // w = acc (w,reduce(A)) -// GrB_Matrix_reduce_BinaryOp (w,mask,acc,op,A,d) // w = acc (w,reduce(A)) - -// reduce matrix to scalar: -// GrB_Vector_reduce_[SCALAR] (c,acc,monoid,u,d) // c = acc (c,reduce(u)) -// GrB_Matrix_reduce_[SCALAR] (c,acc,monoid,A,d) // c = acc (c,reduce(A)) -// GrB_Vector_reduce_Monoid_Scalar (s,acc,monoid,u,d) // s = acc (s,reduce(u)) -// GrB_Matrix_reduce_Monoid_Scalar (s,acc,monoid,A,d) // s = acc (s,reduce(A)) -// GrB_Vector_reduce_BinaryOp_Scalar (s,acc,op,u,d) // s = acc (s,reduce(u)) -// GrB_Matrix_reduce_BinaryOp_Scalar (s,acc,op,A,d) // s = acc (s,reduce(A)) - -#if GxB_STDC_VERSION >= 201112L -#define GB_REDUCE_TO_SCALAR(kind,c,op) \ - _Generic \ - ( \ - (c), \ - GB_PCASES (GrB, GB_CONCAT ( kind, _reduce,, )), \ - default: \ - _Generic \ - ( \ - (op), \ - GrB_BinaryOp : \ - GB_CONCAT (GrB,_,kind,_reduce_BinaryOp_Scalar),\ - default: GB_CONCAT (GrB,_,kind,_reduce_Monoid_Scalar) \ - ) \ - ) - -#define GrB_reduce(arg1,arg2,arg3,arg4,...) \ - _Generic \ - ( \ - (arg4), \ - GrB_Vector : GB_REDUCE_TO_SCALAR (Vector, arg1, arg3), \ - GrB_Matrix : GB_REDUCE_TO_SCALAR (Matrix, arg1, arg3), \ - GrB_Monoid : GrB_Matrix_reduce_Monoid , \ - GrB_BinaryOp : GrB_Matrix_reduce_BinaryOp \ - ) \ - (arg1, arg2, arg3, arg4, __VA_ARGS__) -#endif +GrB_Info GrB_Matrix_apply_IndexOp_INT32 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + int32_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; -//============================================================================== -// GrB_transpose: matrix transpose -//============================================================================== +GrB_Info GrB_Matrix_apply_IndexOp_INT64 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + int64_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; -GrB_Info GrB_transpose // C = accum (C, A') +GrB_Info GrB_Matrix_apply_IndexOp_UINT8 // C=accum(C,op(A)) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries const GrB_Matrix A, // first input: matrix A - const GrB_Descriptor desc // descriptor for C, Mask, and A + uint8_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -//============================================================================== -// GrB_kronecker: Kronecker product -//============================================================================== - -// GxB_kron is historical; use GrB_kronecker instead -GrB_Info GxB_kron // C = accum(C,kron(A,B)) (historical) +GrB_Info GrB_Matrix_apply_IndexOp_UINT16 // C=accum(C,op(A)) ( GrB_Matrix C, // input/output matrix for results const GrB_Matrix Mask, // optional mask for C, unused if NULL const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // defines '*' for T=kron(A,B) + const GrB_IndexUnaryOp op, // operator to apply to the entries const GrB_Matrix A, // first input: matrix A - const GrB_Matrix B, // second input: matrix B - const GrB_Descriptor desc // descriptor for C, Mask, A, and B + uint16_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_kronecker_BinaryOp // C = accum (C, kron(A,B)) +GrB_Info GrB_Matrix_apply_IndexOp_UINT32 // C=accum(C,op(A)) ( GrB_Matrix C, // input/output matrix for results - const GrB_Matrix M, // optional mask for C, unused if NULL + const GrB_Matrix Mask, // optional mask for C, unused if NULL const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_BinaryOp op, // defines '*' for T=kron(A,B) + const GrB_IndexUnaryOp op, // operator to apply to the entries const GrB_Matrix A, // first input: matrix A - const GrB_Matrix B, // second input: matrix B - const GrB_Descriptor desc // descriptor for C, M, A, and B + uint32_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_kronecker_Monoid // C = accum (C, kron(A,B)) +GrB_Info GrB_Matrix_apply_IndexOp_UINT64 // C=accum(C,op(A)) ( GrB_Matrix C, // input/output matrix for results - const GrB_Matrix M, // optional mask for C, unused if NULL + const GrB_Matrix Mask, // optional mask for C, unused if NULL const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_Monoid monoid, // defines '*' for T=kron(A,B) + const GrB_IndexUnaryOp op, // operator to apply to the entries const GrB_Matrix A, // first input: matrix A - const GrB_Matrix B, // second input: matrix B - const GrB_Descriptor desc // descriptor for C, M, A, and B + uint64_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -GrB_Info GrB_Matrix_kronecker_Semiring // C = accum (C, kron(A,B)) +GrB_Info GrB_Matrix_apply_IndexOp_FP32 // C=accum(C,op(A)) ( GrB_Matrix C, // input/output matrix for results - const GrB_Matrix M, // optional mask for C, unused if NULL + const GrB_Matrix Mask, // optional mask for C, unused if NULL const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) - const GrB_Semiring semiring, // defines '*' for T=kron(A,B) + const GrB_IndexUnaryOp op, // operator to apply to the entries const GrB_Matrix A, // first input: matrix A - const GrB_Matrix B, // second input: matrix B - const GrB_Descriptor desc // descriptor for C, M, A, and B + float y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A ) ; -#if GxB_STDC_VERSION >= 201112L -#define GrB_kronecker(C,Mask,accum,op,A,B,desc) \ - _Generic \ - ( \ - (op), \ - GrB_Semiring : GrB_Matrix_kronecker_Semiring , \ - GrB_Monoid : GrB_Matrix_kronecker_Monoid , \ - GrB_BinaryOp : GrB_Matrix_kronecker_BinaryOp \ - ) \ - (C, Mask, accum, op, A, B, desc) -#endif - -#endif // GB_CUDA_FOLDER - -//============================================================================== -// GrB_Monoid: built-in monoids -//============================================================================== - -GB_GLOBAL GrB_Monoid - - //-------------------------------------------------------------------------- - // 10 MIN monoids: (not for complex types) - //-------------------------------------------------------------------------- - - // GxB_MIN monoids, historical, use GrB_MIN_MONOID_* instead: - GxB_MIN_INT8_MONOID, // identity: INT8_MAX terminal: INT8_MIN - GxB_MIN_INT16_MONOID, // identity: INT16_MAX terminal: INT16_MIN - GxB_MIN_INT32_MONOID, // identity: INT32_MAX terminal: INT32_MIN - GxB_MIN_INT64_MONOID, // identity: INT64_MAX terminal: INT32_MIN - GxB_MIN_UINT8_MONOID, // identity: UINT8_MAX terminal: 0 - GxB_MIN_UINT16_MONOID, // identity: UINT16_MAX terminal: 0 - GxB_MIN_UINT32_MONOID, // identity: UINT32_MAX terminal: 0 - GxB_MIN_UINT64_MONOID, // identity: UINT64_MAX terminal: 0 - GxB_MIN_FP32_MONOID, // identity: INFINITY terminal: -INFINITY - GxB_MIN_FP64_MONOID, // identity: INFINITY terminal: -INFINITY - - // preferred names from the v1.3 spec: - GrB_MIN_MONOID_INT8, // identity: INT8_MAX terminal: INT8_MIN - GrB_MIN_MONOID_INT16, // identity: INT16_MAX terminal: INT16_MIN - GrB_MIN_MONOID_INT32, // identity: INT32_MAX terminal: INT32_MIN - GrB_MIN_MONOID_INT64, // identity: INT64_MAX terminal: INT32_MIN - GrB_MIN_MONOID_UINT8, // identity: UINT8_MAX terminal: 0 - GrB_MIN_MONOID_UINT16, // identity: UINT16_MAX terminal: 0 - GrB_MIN_MONOID_UINT32, // identity: UINT32_MAX terminal: 0 - GrB_MIN_MONOID_UINT64, // identity: UINT64_MAX terminal: 0 - GrB_MIN_MONOID_FP32, // identity: INFINITY terminal: -INFINITY - GrB_MIN_MONOID_FP64, // identity: INFINITY terminal: -INFINITY - - //-------------------------------------------------------------------------- - // 10 MAX monoids: - //-------------------------------------------------------------------------- - - // GxB_MAX monoids, historical, use GrB_MAX_MONOID_* instead: - GxB_MAX_INT8_MONOID, // identity: INT8_MIN terminal: INT8_MAX - GxB_MAX_INT16_MONOID, // identity: INT16_MIN terminal: INT16_MAX - GxB_MAX_INT32_MONOID, // identity: INT32_MIN terminal: INT32_MAX - GxB_MAX_INT64_MONOID, // identity: INT64_MIN terminal: INT64_MAX - GxB_MAX_UINT8_MONOID, // identity: 0 terminal: UINT8_MAX - GxB_MAX_UINT16_MONOID, // identity: 0 terminal: UINT16_MAX - GxB_MAX_UINT32_MONOID, // identity: 0 terminal: UINT32_MAX - GxB_MAX_UINT64_MONOID, // identity: 0 terminal: UINT64_MAX - GxB_MAX_FP32_MONOID, // identity: -INFINITY terminal: INFINITY - GxB_MAX_FP64_MONOID, // identity: -INFINITY terminal: INFINITY - - // preferred names from the v1.3 spec: - GrB_MAX_MONOID_INT8, // identity: INT8_MIN terminal: INT8_MAX - GrB_MAX_MONOID_INT16, // identity: INT16_MIN terminal: INT16_MAX - GrB_MAX_MONOID_INT32, // identity: INT32_MIN terminal: INT32_MAX - GrB_MAX_MONOID_INT64, // identity: INT64_MIN terminal: INT64_MAX - GrB_MAX_MONOID_UINT8, // identity: 0 terminal: UINT8_MAX - GrB_MAX_MONOID_UINT16, // identity: 0 terminal: UINT16_MAX - GrB_MAX_MONOID_UINT32, // identity: 0 terminal: UINT32_MAX - GrB_MAX_MONOID_UINT64, // identity: 0 terminal: UINT64_MAX - GrB_MAX_MONOID_FP32, // identity: -INFINITY terminal: INFINITY - GrB_MAX_MONOID_FP64, // identity: -INFINITY terminal: INFINITY - - //-------------------------------------------------------------------------- - // 12 PLUS monoids: - //-------------------------------------------------------------------------- - - // GxB_PLUS monoids, historical, use GrB_PLUS_MONOID_* instead: - GxB_PLUS_INT8_MONOID, // identity: 0 - GxB_PLUS_INT16_MONOID, // identity: 0 - GxB_PLUS_INT32_MONOID, // identity: 0 - GxB_PLUS_INT64_MONOID, // identity: 0 - GxB_PLUS_UINT8_MONOID, // identity: 0 - GxB_PLUS_UINT16_MONOID, // identity: 0 - GxB_PLUS_UINT32_MONOID, // identity: 0 - GxB_PLUS_UINT64_MONOID, // identity: 0 - GxB_PLUS_FP32_MONOID, // identity: 0 - GxB_PLUS_FP64_MONOID, // identity: 0 - - // preferred names from the v1.3 spec: - GrB_PLUS_MONOID_INT8, // identity: 0 - GrB_PLUS_MONOID_INT16, // identity: 0 - GrB_PLUS_MONOID_INT32, // identity: 0 - GrB_PLUS_MONOID_INT64, // identity: 0 - GrB_PLUS_MONOID_UINT8, // identity: 0 - GrB_PLUS_MONOID_UINT16, // identity: 0 - GrB_PLUS_MONOID_UINT32, // identity: 0 - GrB_PLUS_MONOID_UINT64, // identity: 0 - GrB_PLUS_MONOID_FP32, // identity: 0 - GrB_PLUS_MONOID_FP64, // identity: 0 - - // complex monoids: - GxB_PLUS_FC32_MONOID, // identity: 0 - GxB_PLUS_FC64_MONOID, // identity: 0 - - //-------------------------------------------------------------------------- - // 12 TIMES monoids: identity value is 1, int* and uint* are terminal - //-------------------------------------------------------------------------- - - // GxB_TIMES monoids, historical, use GrB_TIMES_MONOID_* instead: - GxB_TIMES_INT8_MONOID, // identity: 1 terminal: 0 - GxB_TIMES_INT16_MONOID, // identity: 1 terminal: 0 - GxB_TIMES_INT32_MONOID, // identity: 1 terminal: 0 - GxB_TIMES_INT64_MONOID, // identity: 1 terminal: 0 - GxB_TIMES_UINT8_MONOID, // identity: 1 terminal: 0 - GxB_TIMES_UINT16_MONOID, // identity: 1 terminal: 0 - GxB_TIMES_UINT32_MONOID, // identity: 1 terminal: 0 - GxB_TIMES_UINT64_MONOID, // identity: 1 terminal: 0 - GxB_TIMES_FP32_MONOID, // identity: 1 - GxB_TIMES_FP64_MONOID, // identity: 1 - - // preferred names from the v1.3 spec: - GrB_TIMES_MONOID_INT8, // identity: 1 terminal: 0 - GrB_TIMES_MONOID_INT16, // identity: 1 terminal: 0 - GrB_TIMES_MONOID_INT32, // identity: 1 terminal: 0 - GrB_TIMES_MONOID_INT64, // identity: 1 terminal: 0 - GrB_TIMES_MONOID_UINT8, // identity: 1 terminal: 0 - GrB_TIMES_MONOID_UINT16, // identity: 1 terminal: 0 - GrB_TIMES_MONOID_UINT32, // identity: 1 terminal: 0 - GrB_TIMES_MONOID_UINT64, // identity: 1 terminal: 0 - GrB_TIMES_MONOID_FP32, // identity: 1 - GrB_TIMES_MONOID_FP64, // identity: 1 - - // complex monoids: - GxB_TIMES_FC32_MONOID, // identity: 1 - GxB_TIMES_FC64_MONOID, // identity: 1 - - //-------------------------------------------------------------------------- - // 13 ANY monoids: - //-------------------------------------------------------------------------- - - GxB_ANY_BOOL_MONOID, // identity: any value terminal: any value - GxB_ANY_INT8_MONOID, // identity: any value terminal: any value - GxB_ANY_INT16_MONOID, // identity: any value terminal: any value - GxB_ANY_INT32_MONOID, // identity: any value terminal: any value - GxB_ANY_INT64_MONOID, // identity: any value terminal: any value - GxB_ANY_UINT8_MONOID, // identity: any value terminal: any value - GxB_ANY_UINT16_MONOID, // identity: any value terminal: any value - GxB_ANY_UINT32_MONOID, // identity: any value terminal: any value - GxB_ANY_UINT64_MONOID, // identity: any value terminal: any value - GxB_ANY_FP32_MONOID, // identity: any value terminal: any value - GxB_ANY_FP64_MONOID, // identity: any value terminal: any value - GxB_ANY_FC32_MONOID, // identity: any value terminal: any value - GxB_ANY_FC64_MONOID, // identity: any value terminal: any value - - //-------------------------------------------------------------------------- - // 4 Boolean monoids: (see also the GxB_ANY_BOOL_MONOID above) - //-------------------------------------------------------------------------- - - // GxB_* boolean monoids, historical, use GrB_* instead: - GxB_LOR_BOOL_MONOID, // identity: false terminal: true - GxB_LAND_BOOL_MONOID, // identity: true terminal: false - GxB_LXOR_BOOL_MONOID, // identity: false - GxB_LXNOR_BOOL_MONOID, // identity: true - GxB_EQ_BOOL_MONOID, // (another name for GrB_LXNOR_MONOID_BOOL) - - // preferred names from the v1.3 spec: - GrB_LOR_MONOID_BOOL, // identity: false terminal: true - GrB_LAND_MONOID_BOOL, // identity: true terminal: false - GrB_LXOR_MONOID_BOOL, // identity: false - GrB_LXNOR_MONOID_BOOL, // identity: true - - //-------------------------------------------------------------------------- - // 16 Bitwise-or monoids: - //-------------------------------------------------------------------------- - - // BOR monoids (bitwise or): - GxB_BOR_UINT8_MONOID, // identity: 0 terminal: 0xFF - GxB_BOR_UINT16_MONOID, // identity: 0 terminal: 0xFFFF - GxB_BOR_UINT32_MONOID, // identity: 0 terminal: 0xFFFFFFFF - GxB_BOR_UINT64_MONOID, // identity: 0 terminal: 0xFFFFFFFFFFFFFFFF +GrB_Info GrB_Matrix_apply_IndexOp_FP64 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + double y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // BAND monoids (bitwise and): - GxB_BAND_UINT8_MONOID, // identity: 0xFF terminal: 0 - GxB_BAND_UINT16_MONOID, // identity: 0xFFFF terminal: 0 - GxB_BAND_UINT32_MONOID, // identity: 0xFFFFFFFF terminal: 0 - GxB_BAND_UINT64_MONOID, // identity: 0xFFFFFFFFFFFFFFFF terminal: 0 +GrB_Info GxB_Matrix_apply_IndexOp_FC32 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + GxB_FC32_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // BXOR monoids (bitwise xor): - GxB_BXOR_UINT8_MONOID, // identity: 0 - GxB_BXOR_UINT16_MONOID, // identity: 0 - GxB_BXOR_UINT32_MONOID, // identity: 0 - GxB_BXOR_UINT64_MONOID, // identity: 0 +GrB_Info GxB_Matrix_apply_IndexOp_FC64 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + GxB_FC64_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // BXNOR monoids (bitwise xnor): - GxB_BXNOR_UINT8_MONOID, // identity: 0xFF - GxB_BXNOR_UINT16_MONOID, // identity: 0xFFFF - GxB_BXNOR_UINT32_MONOID, // identity: 0xFFFFFFFF - GxB_BXNOR_UINT64_MONOID ; // identity: 0xFFFFFFFFFFFFFFFF +GrB_Info GrB_Matrix_apply_IndexOp_UDT // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + const void *y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; -//============================================================================== -// GrB_Semiring: built-in semirings -//============================================================================== +//------------------------------------------------------------------------------ +// GrB_apply: generic matrix/vector apply +//------------------------------------------------------------------------------ -// Using built-in types and operators, SuiteSparse:GraphBLAS provides -// 1553 pre-defined, built-in semirings: +// GrB_apply is a generic function for applying a unary operator to a matrix +// or vector and provides access to these functions: -// 1000 semirings with a multiply operator TxT -> T where T is non-Boolean, -// from the complete cross product of: +// GrB_Vector_apply (w,mask,acc,op,u,d) // w = accum (w, op(u)) +// GrB_Matrix_apply (C,Mask,acc,op,A,d) // C = accum (C, op(A)) -// 5 monoids: MIN, MAX, PLUS, TIMES, ANY -// 20 multiply operators: -// FIRST, SECOND, PAIR (=ONEB), MIN, MAX, PLUS, MINUS, TIMES, DIV, -// RDIV, RMINUS -// ISEQ, ISNE, ISGT, ISLT, ISGE, ISLE, -// LOR, LAND, LXOR -// 10 non-Boolean real types, T -// -// Note that min_pair, max_pair, times_pair are all identical to any_pair. -// These 30 semirings are named below, but are internally remapped to -// their corresponding any_pair semiring. +// GrB_Vector_apply (w,m,acc,unop ,u,d) +// GrB_Vector_apply_BinaryOp1st_TYPE (w,m,acc,binop,x,u,d) +// GrB_Vector_apply_BinaryOp2nd_TYPE (w,m,acc,binop,u,y,d) +// GrB_Vector_apply_IndexOp_TYPE (w,m,acc,idxop,u,y,d) -// 300 semirings with a comparator TxT -> bool, where T is -// non-Boolean, from the complete cross product of: +// GrB_Matrix_apply (C,M,acc,unop ,A,d) +// GrB_Matrix_apply_BinaryOp1st_TYPE (C,M,acc,binop,x,A,d) +// GrB_Matrix_apply_BinaryOp2nd_TYPE (C,M,acc,binop,A,y,d) +// GrB_Matrix_apply_IndexOp_TYPE (C,M,acc,idxop,A,y,d) -// 5 Boolean monoids: LAND, LOR, LXOR, EQ (=LXNOR), ANY -// 6 multiply operators: EQ, NE, GT, LT, GE, LE -// 10 non-Boolean real types, T +#if GxB_STDC_VERSION >= 201112L -// 55 semirings with purely Boolean types, bool x bool -> bool, from the -// complete cross product of: +#define GB_BIND(kind,x,y,...) \ + _Generic \ + ( \ + (x), \ + GrB_Scalar: GB_CONCAT ( GrB,_,kind,_apply_BinaryOp1st_Scalar), \ + GB_CASES (GrB, GB_CONCAT ( kind, _apply_BinaryOp1st,, )) , \ + default: \ + _Generic \ + ( \ + (y), \ + GB_CASES (GrB, GB_CONCAT ( kind , _apply_BinaryOp2nd,, )), \ + default: GB_CONCAT ( GrB,_,kind,_apply_BinaryOp2nd_Scalar) \ + ) \ + ) -// 5 Boolean monoids LAND, LOR, LXOR, EQ (=LXNOR), ANY -// 11 multiply operators: -// FIRST, SECOND, LOR, LAND, LXOR, EQ (=LXNOR), GT, LT, GE, LE, -// PAIR (=ONEB) -// -// Note that lor_pair, land_pair, and eq_pair are all identical to -// any_pair. These 3 semirings are named below, but are internally -// remapped to any_pair_bool semiring. +#define GB_IDXOP(kind,A,y,...) \ + _Generic \ + ( \ + (y), \ + GB_CASES (GrB, GB_CONCAT ( kind, _apply_IndexOp,, )), \ + default: GB_CONCAT ( GrB, _, kind, _apply_IndexOp_Scalar) \ + ) -// 54 complex semirings: TxT -> T where T is float complex or double complex: +#define GrB_apply(C,Mask,accum,op,...) \ + _Generic \ + ( \ + (C), \ + GrB_Vector : \ + _Generic \ + ( \ + (op), \ + GrB_UnaryOp : GrB_Vector_apply , \ + GrB_BinaryOp : GB_BIND (Vector, __VA_ARGS__), \ + GrB_IndexUnaryOp : GB_IDXOP (Vector, __VA_ARGS__) \ + ), \ + GrB_Matrix : \ + _Generic \ + ( \ + (op), \ + GrB_UnaryOp : GrB_Matrix_apply , \ + GrB_BinaryOp : GB_BIND (Matrix, __VA_ARGS__), \ + GrB_IndexUnaryOp : GB_IDXOP (Matrix, __VA_ARGS__) \ + ) \ + ) \ + (C, Mask, accum, op, __VA_ARGS__) +#endif -// 3 complex monoids: PLUS, TIMES, ANY -// 9 complex multiply operators: -// FIRST, SECOND, PAIR (=ONEB), PLUS, MINUS, TIMES, DIV, RDIV, RMINUS -// 2 complex types -// -// Note that times_pair is identical to any_pair. -// These 2 semirings are named below, but are internally remapped to -// their corresponding any_pair semiring. +//============================================================================== +// GrB_select: matrix and vector selection using an IndexUnaryOp +//============================================================================== -// 64 bitwise semirings: TxT -> T where T is an unsigned integer: +//------------------------------------------- +// vector select using an IndexUnaryOp +//------------------------------------------- -// 4 bitwise monoids: BOR, BAND, BXOR, BXNOR -// 4 bitwise multiply operators: BOR, BAND, BXOR, BXNOR -// 4 unsigned integer types: UINT8, UINT16, UINT32, UINT64 +GrB_Info GrB_Vector_select_Scalar // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + const GrB_Scalar y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; -// 80 positional semirings: XxX -> T where T is int64 or int32, and the type of -// X is ignored: +GrB_Info GrB_Vector_select_BOOL // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + bool y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; -// 5 monoids: MIN, MAX, PLUS, TIMES, ANY -// 8 multiply operators: -// FIRSTI, FIRSTI1, FIRSTJ, FIRSTJ1, -// SECONDI, SECONDI1, SECONDJ, SECONDJ1 -// 2 types: int32, int64 +GrB_Info GrB_Vector_select_INT8 // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + int8_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; -// The ANY operator is also valid to use as a multiplicative operator in a -// semiring, but serves no purpose in that case. The ANY operator is meant as -// a fast additive operator for a monoid, that terminates, or short-circuits, -// as soon as any value is found. A valid user semiring can be constructed -// with ANY as the multiply operator, but they are not predefined below. +GrB_Info GrB_Vector_select_INT16 // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + int16_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; -// Likewise, additional built-in operators can be used as multiplicative -// operators for floating-point semirings (POW, ATAN2, HYPOT, ...) and many -// more semirings can be constructed from bitwise monoids and many integer -// binary (non-bitwise) multiplicative operators, but these are not -// pre-defined. +GrB_Info GrB_Vector_select_INT32 // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + int32_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; -// In the names below, each semiring has a name of the form GxB_add_mult_T -// where add is the additive monoid, mult is the multiply operator, and T is -// the type. The type T is always the type of x and y for the z=mult(x,y) -// operator. The monoid's three types and the ztype of the mult operator are -// always the same. This is the type T for the first set, and Boolean for -// the second and third sets of semirngs. +GrB_Info GrB_Vector_select_INT64 // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + int64_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; -// 1553 = 1000 + 300 + 55 + 54 + 64 + 80 semirings are named below, but 35 = 30 -// + 3 + 2 are identical to the corresponding any_pair semirings of the same -// type. For positional semirings, the mulitiply ops FIRSTJ and SECONDI are -// identical, as are FIRSTJ1 and SECONDI1. These semirings still appear as -// predefined, for convenience. +GrB_Info GrB_Vector_select_UINT8 // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + uint8_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; -GB_GLOBAL GrB_Semiring +GrB_Info GrB_Vector_select_UINT16 // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + uint16_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; -//------------------------------------------------------------------------------ -// 1000 non-Boolean semirings where all types are the same, given by suffix _T -//------------------------------------------------------------------------------ +GrB_Info GrB_Vector_select_UINT32 // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + uint32_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; - // semirings with multiply op: z = FIRST (x,y), all types x,y,z the same: - GxB_MIN_FIRST_INT8 , GxB_MAX_FIRST_INT8 , GxB_PLUS_FIRST_INT8 , GxB_TIMES_FIRST_INT8 , GxB_ANY_FIRST_INT8 , - GxB_MIN_FIRST_INT16 , GxB_MAX_FIRST_INT16 , GxB_PLUS_FIRST_INT16 , GxB_TIMES_FIRST_INT16 , GxB_ANY_FIRST_INT16 , - GxB_MIN_FIRST_INT32 , GxB_MAX_FIRST_INT32 , GxB_PLUS_FIRST_INT32 , GxB_TIMES_FIRST_INT32 , GxB_ANY_FIRST_INT32 , - GxB_MIN_FIRST_INT64 , GxB_MAX_FIRST_INT64 , GxB_PLUS_FIRST_INT64 , GxB_TIMES_FIRST_INT64 , GxB_ANY_FIRST_INT64 , - GxB_MIN_FIRST_UINT8 , GxB_MAX_FIRST_UINT8 , GxB_PLUS_FIRST_UINT8 , GxB_TIMES_FIRST_UINT8 , GxB_ANY_FIRST_UINT8 , - GxB_MIN_FIRST_UINT16 , GxB_MAX_FIRST_UINT16 , GxB_PLUS_FIRST_UINT16 , GxB_TIMES_FIRST_UINT16 , GxB_ANY_FIRST_UINT16 , - GxB_MIN_FIRST_UINT32 , GxB_MAX_FIRST_UINT32 , GxB_PLUS_FIRST_UINT32 , GxB_TIMES_FIRST_UINT32 , GxB_ANY_FIRST_UINT32 , - GxB_MIN_FIRST_UINT64 , GxB_MAX_FIRST_UINT64 , GxB_PLUS_FIRST_UINT64 , GxB_TIMES_FIRST_UINT64 , GxB_ANY_FIRST_UINT64 , - GxB_MIN_FIRST_FP32 , GxB_MAX_FIRST_FP32 , GxB_PLUS_FIRST_FP32 , GxB_TIMES_FIRST_FP32 , GxB_ANY_FIRST_FP32 , - GxB_MIN_FIRST_FP64 , GxB_MAX_FIRST_FP64 , GxB_PLUS_FIRST_FP64 , GxB_TIMES_FIRST_FP64 , GxB_ANY_FIRST_FP64 , +GrB_Info GrB_Vector_select_UINT64 // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + uint64_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; - // semirings with multiply op: z = SECOND (x,y), all types x,y,z the same: - GxB_MIN_SECOND_INT8 , GxB_MAX_SECOND_INT8 , GxB_PLUS_SECOND_INT8 , GxB_TIMES_SECOND_INT8 , GxB_ANY_SECOND_INT8 , - GxB_MIN_SECOND_INT16 , GxB_MAX_SECOND_INT16 , GxB_PLUS_SECOND_INT16 , GxB_TIMES_SECOND_INT16 , GxB_ANY_SECOND_INT16 , - GxB_MIN_SECOND_INT32 , GxB_MAX_SECOND_INT32 , GxB_PLUS_SECOND_INT32 , GxB_TIMES_SECOND_INT32 , GxB_ANY_SECOND_INT32 , - GxB_MIN_SECOND_INT64 , GxB_MAX_SECOND_INT64 , GxB_PLUS_SECOND_INT64 , GxB_TIMES_SECOND_INT64 , GxB_ANY_SECOND_INT64 , - GxB_MIN_SECOND_UINT8 , GxB_MAX_SECOND_UINT8 , GxB_PLUS_SECOND_UINT8 , GxB_TIMES_SECOND_UINT8 , GxB_ANY_SECOND_UINT8 , - GxB_MIN_SECOND_UINT16 , GxB_MAX_SECOND_UINT16 , GxB_PLUS_SECOND_UINT16 , GxB_TIMES_SECOND_UINT16, GxB_ANY_SECOND_UINT16 , - GxB_MIN_SECOND_UINT32 , GxB_MAX_SECOND_UINT32 , GxB_PLUS_SECOND_UINT32 , GxB_TIMES_SECOND_UINT32, GxB_ANY_SECOND_UINT32 , - GxB_MIN_SECOND_UINT64 , GxB_MAX_SECOND_UINT64 , GxB_PLUS_SECOND_UINT64 , GxB_TIMES_SECOND_UINT64, GxB_ANY_SECOND_UINT64 , - GxB_MIN_SECOND_FP32 , GxB_MAX_SECOND_FP32 , GxB_PLUS_SECOND_FP32 , GxB_TIMES_SECOND_FP32 , GxB_ANY_SECOND_FP32 , - GxB_MIN_SECOND_FP64 , GxB_MAX_SECOND_FP64 , GxB_PLUS_SECOND_FP64 , GxB_TIMES_SECOND_FP64 , GxB_ANY_SECOND_FP64 , +GrB_Info GrB_Vector_select_FP32 // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + float y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; - // semirings with multiply op: z = PAIR (x,y), all types x,y,z the same: - // (note that min_pair, max_pair, times_pair are all identical to any_pair, and are marked below) - GxB_MIN_PAIR_INT8 /**/, GxB_MAX_PAIR_INT8 /**/, GxB_PLUS_PAIR_INT8 , GxB_TIMES_PAIR_INT8 /**/, GxB_ANY_PAIR_INT8 , - GxB_MIN_PAIR_INT16 /**/, GxB_MAX_PAIR_INT16 /**/, GxB_PLUS_PAIR_INT16 , GxB_TIMES_PAIR_INT16 /**/, GxB_ANY_PAIR_INT16 , - GxB_MIN_PAIR_INT32 /**/, GxB_MAX_PAIR_INT32 /**/, GxB_PLUS_PAIR_INT32 , GxB_TIMES_PAIR_INT32 /**/, GxB_ANY_PAIR_INT32 , - GxB_MIN_PAIR_INT64 /**/, GxB_MAX_PAIR_INT64 /**/, GxB_PLUS_PAIR_INT64 , GxB_TIMES_PAIR_INT64 /**/, GxB_ANY_PAIR_INT64 , - GxB_MIN_PAIR_UINT8 /**/, GxB_MAX_PAIR_UINT8 /**/, GxB_PLUS_PAIR_UINT8 , GxB_TIMES_PAIR_UINT8 /**/, GxB_ANY_PAIR_UINT8 , - GxB_MIN_PAIR_UINT16/**/, GxB_MAX_PAIR_UINT16/**/, GxB_PLUS_PAIR_UINT16 , GxB_TIMES_PAIR_UINT16/**/, GxB_ANY_PAIR_UINT16 , - GxB_MIN_PAIR_UINT32/**/, GxB_MAX_PAIR_UINT32/**/, GxB_PLUS_PAIR_UINT32 , GxB_TIMES_PAIR_UINT32/**/, GxB_ANY_PAIR_UINT32 , - GxB_MIN_PAIR_UINT64/**/, GxB_MAX_PAIR_UINT64/**/, GxB_PLUS_PAIR_UINT64 , GxB_TIMES_PAIR_UINT64/**/, GxB_ANY_PAIR_UINT64 , - GxB_MIN_PAIR_FP32 /**/, GxB_MAX_PAIR_FP32 /**/, GxB_PLUS_PAIR_FP32 , GxB_TIMES_PAIR_FP32 /**/, GxB_ANY_PAIR_FP32 , - GxB_MIN_PAIR_FP64 /**/, GxB_MAX_PAIR_FP64 /**/, GxB_PLUS_PAIR_FP64 , GxB_TIMES_PAIR_FP64 /**/, GxB_ANY_PAIR_FP64 , +GrB_Info GrB_Vector_select_FP64 // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + double y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; - // semirings with multiply op: z = MIN (x,y), all types x,y,z the same: - GxB_MIN_MIN_INT8 , GxB_MAX_MIN_INT8 , GxB_PLUS_MIN_INT8 , GxB_TIMES_MIN_INT8 , GxB_ANY_MIN_INT8 , - GxB_MIN_MIN_INT16 , GxB_MAX_MIN_INT16 , GxB_PLUS_MIN_INT16 , GxB_TIMES_MIN_INT16 , GxB_ANY_MIN_INT16 , - GxB_MIN_MIN_INT32 , GxB_MAX_MIN_INT32 , GxB_PLUS_MIN_INT32 , GxB_TIMES_MIN_INT32 , GxB_ANY_MIN_INT32 , - GxB_MIN_MIN_INT64 , GxB_MAX_MIN_INT64 , GxB_PLUS_MIN_INT64 , GxB_TIMES_MIN_INT64 , GxB_ANY_MIN_INT64 , - GxB_MIN_MIN_UINT8 , GxB_MAX_MIN_UINT8 , GxB_PLUS_MIN_UINT8 , GxB_TIMES_MIN_UINT8 , GxB_ANY_MIN_UINT8 , - GxB_MIN_MIN_UINT16 , GxB_MAX_MIN_UINT16 , GxB_PLUS_MIN_UINT16 , GxB_TIMES_MIN_UINT16 , GxB_ANY_MIN_UINT16 , - GxB_MIN_MIN_UINT32 , GxB_MAX_MIN_UINT32 , GxB_PLUS_MIN_UINT32 , GxB_TIMES_MIN_UINT32 , GxB_ANY_MIN_UINT32 , - GxB_MIN_MIN_UINT64 , GxB_MAX_MIN_UINT64 , GxB_PLUS_MIN_UINT64 , GxB_TIMES_MIN_UINT64 , GxB_ANY_MIN_UINT64 , - GxB_MIN_MIN_FP32 , GxB_MAX_MIN_FP32 , GxB_PLUS_MIN_FP32 , GxB_TIMES_MIN_FP32 , GxB_ANY_MIN_FP32 , - GxB_MIN_MIN_FP64 , GxB_MAX_MIN_FP64 , GxB_PLUS_MIN_FP64 , GxB_TIMES_MIN_FP64 , GxB_ANY_MIN_FP64 , +GrB_Info GxB_Vector_select_FC32 // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + GxB_FC32_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; - // semirings with multiply op: z = MAX (x,y), all types x,y,z the same: - GxB_MIN_MAX_INT8 , GxB_MAX_MAX_INT8 , GxB_PLUS_MAX_INT8 , GxB_TIMES_MAX_INT8 , GxB_ANY_MAX_INT8 , - GxB_MIN_MAX_INT16 , GxB_MAX_MAX_INT16 , GxB_PLUS_MAX_INT16 , GxB_TIMES_MAX_INT16 , GxB_ANY_MAX_INT16 , - GxB_MIN_MAX_INT32 , GxB_MAX_MAX_INT32 , GxB_PLUS_MAX_INT32 , GxB_TIMES_MAX_INT32 , GxB_ANY_MAX_INT32 , - GxB_MIN_MAX_INT64 , GxB_MAX_MAX_INT64 , GxB_PLUS_MAX_INT64 , GxB_TIMES_MAX_INT64 , GxB_ANY_MAX_INT64 , - GxB_MIN_MAX_UINT8 , GxB_MAX_MAX_UINT8 , GxB_PLUS_MAX_UINT8 , GxB_TIMES_MAX_UINT8 , GxB_ANY_MAX_UINT8 , - GxB_MIN_MAX_UINT16 , GxB_MAX_MAX_UINT16 , GxB_PLUS_MAX_UINT16 , GxB_TIMES_MAX_UINT16 , GxB_ANY_MAX_UINT16 , - GxB_MIN_MAX_UINT32 , GxB_MAX_MAX_UINT32 , GxB_PLUS_MAX_UINT32 , GxB_TIMES_MAX_UINT32 , GxB_ANY_MAX_UINT32 , - GxB_MIN_MAX_UINT64 , GxB_MAX_MAX_UINT64 , GxB_PLUS_MAX_UINT64 , GxB_TIMES_MAX_UINT64 , GxB_ANY_MAX_UINT64 , - GxB_MIN_MAX_FP32 , GxB_MAX_MAX_FP32 , GxB_PLUS_MAX_FP32 , GxB_TIMES_MAX_FP32 , GxB_ANY_MAX_FP32 , - GxB_MIN_MAX_FP64 , GxB_MAX_MAX_FP64 , GxB_PLUS_MAX_FP64 , GxB_TIMES_MAX_FP64 , GxB_ANY_MAX_FP64 , +GrB_Info GxB_Vector_select_FC64 // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + GxB_FC64_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; - // semirings with multiply op: z = PLUS (x,y), all types x,y,z the same: - GxB_MIN_PLUS_INT8 , GxB_MAX_PLUS_INT8 , GxB_PLUS_PLUS_INT8 , GxB_TIMES_PLUS_INT8 , GxB_ANY_PLUS_INT8 , - GxB_MIN_PLUS_INT16 , GxB_MAX_PLUS_INT16 , GxB_PLUS_PLUS_INT16 , GxB_TIMES_PLUS_INT16 , GxB_ANY_PLUS_INT16 , - GxB_MIN_PLUS_INT32 , GxB_MAX_PLUS_INT32 , GxB_PLUS_PLUS_INT32 , GxB_TIMES_PLUS_INT32 , GxB_ANY_PLUS_INT32 , - GxB_MIN_PLUS_INT64 , GxB_MAX_PLUS_INT64 , GxB_PLUS_PLUS_INT64 , GxB_TIMES_PLUS_INT64 , GxB_ANY_PLUS_INT64 , - GxB_MIN_PLUS_UINT8 , GxB_MAX_PLUS_UINT8 , GxB_PLUS_PLUS_UINT8 , GxB_TIMES_PLUS_UINT8 , GxB_ANY_PLUS_UINT8 , - GxB_MIN_PLUS_UINT16 , GxB_MAX_PLUS_UINT16 , GxB_PLUS_PLUS_UINT16 , GxB_TIMES_PLUS_UINT16 , GxB_ANY_PLUS_UINT16 , - GxB_MIN_PLUS_UINT32 , GxB_MAX_PLUS_UINT32 , GxB_PLUS_PLUS_UINT32 , GxB_TIMES_PLUS_UINT32 , GxB_ANY_PLUS_UINT32 , - GxB_MIN_PLUS_UINT64 , GxB_MAX_PLUS_UINT64 , GxB_PLUS_PLUS_UINT64 , GxB_TIMES_PLUS_UINT64 , GxB_ANY_PLUS_UINT64 , - GxB_MIN_PLUS_FP32 , GxB_MAX_PLUS_FP32 , GxB_PLUS_PLUS_FP32 , GxB_TIMES_PLUS_FP32 , GxB_ANY_PLUS_FP32 , - GxB_MIN_PLUS_FP64 , GxB_MAX_PLUS_FP64 , GxB_PLUS_PLUS_FP64 , GxB_TIMES_PLUS_FP64 , GxB_ANY_PLUS_FP64 , +GrB_Info GrB_Vector_select_UDT // w = accum (w, op(u)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Vector u, // first input: vector u + const void *y, // second input: scalar y + const GrB_Descriptor desc // descriptor for w and mask +) ; - // semirings with multiply op: z = MINUS (x,y), all types x,y,z the same: - GxB_MIN_MINUS_INT8 , GxB_MAX_MINUS_INT8 , GxB_PLUS_MINUS_INT8 , GxB_TIMES_MINUS_INT8 , GxB_ANY_MINUS_INT8 , - GxB_MIN_MINUS_INT16 , GxB_MAX_MINUS_INT16 , GxB_PLUS_MINUS_INT16 , GxB_TIMES_MINUS_INT16 , GxB_ANY_MINUS_INT16 , - GxB_MIN_MINUS_INT32 , GxB_MAX_MINUS_INT32 , GxB_PLUS_MINUS_INT32 , GxB_TIMES_MINUS_INT32 , GxB_ANY_MINUS_INT32 , - GxB_MIN_MINUS_INT64 , GxB_MAX_MINUS_INT64 , GxB_PLUS_MINUS_INT64 , GxB_TIMES_MINUS_INT64 , GxB_ANY_MINUS_INT64 , - GxB_MIN_MINUS_UINT8 , GxB_MAX_MINUS_UINT8 , GxB_PLUS_MINUS_UINT8 , GxB_TIMES_MINUS_UINT8 , GxB_ANY_MINUS_UINT8 , - GxB_MIN_MINUS_UINT16 , GxB_MAX_MINUS_UINT16 , GxB_PLUS_MINUS_UINT16 , GxB_TIMES_MINUS_UINT16 , GxB_ANY_MINUS_UINT16 , - GxB_MIN_MINUS_UINT32 , GxB_MAX_MINUS_UINT32 , GxB_PLUS_MINUS_UINT32 , GxB_TIMES_MINUS_UINT32 , GxB_ANY_MINUS_UINT32 , - GxB_MIN_MINUS_UINT64 , GxB_MAX_MINUS_UINT64 , GxB_PLUS_MINUS_UINT64 , GxB_TIMES_MINUS_UINT64 , GxB_ANY_MINUS_UINT64 , - GxB_MIN_MINUS_FP32 , GxB_MAX_MINUS_FP32 , GxB_PLUS_MINUS_FP32 , GxB_TIMES_MINUS_FP32 , GxB_ANY_MINUS_FP32 , - GxB_MIN_MINUS_FP64 , GxB_MAX_MINUS_FP64 , GxB_PLUS_MINUS_FP64 , GxB_TIMES_MINUS_FP64 , GxB_ANY_MINUS_FP64 , +//------------------------------------------- +// matrix select using an IndexUnaryOp +//------------------------------------------- - // semirings with multiply op: z = TIMES (x,y), all types x,y,z the same: - GxB_MIN_TIMES_INT8 , GxB_MAX_TIMES_INT8 , GxB_PLUS_TIMES_INT8 , GxB_TIMES_TIMES_INT8 , GxB_ANY_TIMES_INT8 , - GxB_MIN_TIMES_INT16 , GxB_MAX_TIMES_INT16 , GxB_PLUS_TIMES_INT16 , GxB_TIMES_TIMES_INT16 , GxB_ANY_TIMES_INT16 , - GxB_MIN_TIMES_INT32 , GxB_MAX_TIMES_INT32 , GxB_PLUS_TIMES_INT32 , GxB_TIMES_TIMES_INT32 , GxB_ANY_TIMES_INT32 , - GxB_MIN_TIMES_INT64 , GxB_MAX_TIMES_INT64 , GxB_PLUS_TIMES_INT64 , GxB_TIMES_TIMES_INT64 , GxB_ANY_TIMES_INT64 , - GxB_MIN_TIMES_UINT8 , GxB_MAX_TIMES_UINT8 , GxB_PLUS_TIMES_UINT8 , GxB_TIMES_TIMES_UINT8 , GxB_ANY_TIMES_UINT8 , - GxB_MIN_TIMES_UINT16 , GxB_MAX_TIMES_UINT16 , GxB_PLUS_TIMES_UINT16 , GxB_TIMES_TIMES_UINT16 , GxB_ANY_TIMES_UINT16 , - GxB_MIN_TIMES_UINT32 , GxB_MAX_TIMES_UINT32 , GxB_PLUS_TIMES_UINT32 , GxB_TIMES_TIMES_UINT32 , GxB_ANY_TIMES_UINT32 , - GxB_MIN_TIMES_UINT64 , GxB_MAX_TIMES_UINT64 , GxB_PLUS_TIMES_UINT64 , GxB_TIMES_TIMES_UINT64 , GxB_ANY_TIMES_UINT64 , - GxB_MIN_TIMES_FP32 , GxB_MAX_TIMES_FP32 , GxB_PLUS_TIMES_FP32 , GxB_TIMES_TIMES_FP32 , GxB_ANY_TIMES_FP32 , - GxB_MIN_TIMES_FP64 , GxB_MAX_TIMES_FP64 , GxB_PLUS_TIMES_FP64 , GxB_TIMES_TIMES_FP64 , GxB_ANY_TIMES_FP64 , +GrB_Info GrB_Matrix_select_Scalar // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + const GrB_Scalar y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // semirings with multiply op: z = DIV (x,y), all types x,y,z the same: - GxB_MIN_DIV_INT8 , GxB_MAX_DIV_INT8 , GxB_PLUS_DIV_INT8 , GxB_TIMES_DIV_INT8 , GxB_ANY_DIV_INT8 , - GxB_MIN_DIV_INT16 , GxB_MAX_DIV_INT16 , GxB_PLUS_DIV_INT16 , GxB_TIMES_DIV_INT16 , GxB_ANY_DIV_INT16 , - GxB_MIN_DIV_INT32 , GxB_MAX_DIV_INT32 , GxB_PLUS_DIV_INT32 , GxB_TIMES_DIV_INT32 , GxB_ANY_DIV_INT32 , - GxB_MIN_DIV_INT64 , GxB_MAX_DIV_INT64 , GxB_PLUS_DIV_INT64 , GxB_TIMES_DIV_INT64 , GxB_ANY_DIV_INT64 , - GxB_MIN_DIV_UINT8 , GxB_MAX_DIV_UINT8 , GxB_PLUS_DIV_UINT8 , GxB_TIMES_DIV_UINT8 , GxB_ANY_DIV_UINT8 , - GxB_MIN_DIV_UINT16 , GxB_MAX_DIV_UINT16 , GxB_PLUS_DIV_UINT16 , GxB_TIMES_DIV_UINT16 , GxB_ANY_DIV_UINT16 , - GxB_MIN_DIV_UINT32 , GxB_MAX_DIV_UINT32 , GxB_PLUS_DIV_UINT32 , GxB_TIMES_DIV_UINT32 , GxB_ANY_DIV_UINT32 , - GxB_MIN_DIV_UINT64 , GxB_MAX_DIV_UINT64 , GxB_PLUS_DIV_UINT64 , GxB_TIMES_DIV_UINT64 , GxB_ANY_DIV_UINT64 , - GxB_MIN_DIV_FP32 , GxB_MAX_DIV_FP32 , GxB_PLUS_DIV_FP32 , GxB_TIMES_DIV_FP32 , GxB_ANY_DIV_FP32 , - GxB_MIN_DIV_FP64 , GxB_MAX_DIV_FP64 , GxB_PLUS_DIV_FP64 , GxB_TIMES_DIV_FP64 , GxB_ANY_DIV_FP64 , +GrB_Info GrB_Matrix_select_BOOL // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + bool y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // semirings with multiply op: z = RDIV (x,y), all types x,y,z the same: - GxB_MIN_RDIV_INT8 , GxB_MAX_RDIV_INT8 , GxB_PLUS_RDIV_INT8 , GxB_TIMES_RDIV_INT8 , GxB_ANY_RDIV_INT8 , - GxB_MIN_RDIV_INT16 , GxB_MAX_RDIV_INT16 , GxB_PLUS_RDIV_INT16 , GxB_TIMES_RDIV_INT16 , GxB_ANY_RDIV_INT16 , - GxB_MIN_RDIV_INT32 , GxB_MAX_RDIV_INT32 , GxB_PLUS_RDIV_INT32 , GxB_TIMES_RDIV_INT32 , GxB_ANY_RDIV_INT32 , - GxB_MIN_RDIV_INT64 , GxB_MAX_RDIV_INT64 , GxB_PLUS_RDIV_INT64 , GxB_TIMES_RDIV_INT64 , GxB_ANY_RDIV_INT64 , - GxB_MIN_RDIV_UINT8 , GxB_MAX_RDIV_UINT8 , GxB_PLUS_RDIV_UINT8 , GxB_TIMES_RDIV_UINT8 , GxB_ANY_RDIV_UINT8 , - GxB_MIN_RDIV_UINT16 , GxB_MAX_RDIV_UINT16 , GxB_PLUS_RDIV_UINT16 , GxB_TIMES_RDIV_UINT16 , GxB_ANY_RDIV_UINT16 , - GxB_MIN_RDIV_UINT32 , GxB_MAX_RDIV_UINT32 , GxB_PLUS_RDIV_UINT32 , GxB_TIMES_RDIV_UINT32 , GxB_ANY_RDIV_UINT32 , - GxB_MIN_RDIV_UINT64 , GxB_MAX_RDIV_UINT64 , GxB_PLUS_RDIV_UINT64 , GxB_TIMES_RDIV_UINT64 , GxB_ANY_RDIV_UINT64 , - GxB_MIN_RDIV_FP32 , GxB_MAX_RDIV_FP32 , GxB_PLUS_RDIV_FP32 , GxB_TIMES_RDIV_FP32 , GxB_ANY_RDIV_FP32 , - GxB_MIN_RDIV_FP64 , GxB_MAX_RDIV_FP64 , GxB_PLUS_RDIV_FP64 , GxB_TIMES_RDIV_FP64 , GxB_ANY_RDIV_FP64 , +GrB_Info GrB_Matrix_select_INT8 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + int8_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // semirings with multiply op: z = RMINUS (x,y), all types x,y,z the same: - GxB_MIN_RMINUS_INT8 , GxB_MAX_RMINUS_INT8 , GxB_PLUS_RMINUS_INT8 , GxB_TIMES_RMINUS_INT8 , GxB_ANY_RMINUS_INT8 , - GxB_MIN_RMINUS_INT16 , GxB_MAX_RMINUS_INT16 , GxB_PLUS_RMINUS_INT16 , GxB_TIMES_RMINUS_INT16 , GxB_ANY_RMINUS_INT16 , - GxB_MIN_RMINUS_INT32 , GxB_MAX_RMINUS_INT32 , GxB_PLUS_RMINUS_INT32 , GxB_TIMES_RMINUS_INT32 , GxB_ANY_RMINUS_INT32 , - GxB_MIN_RMINUS_INT64 , GxB_MAX_RMINUS_INT64 , GxB_PLUS_RMINUS_INT64 , GxB_TIMES_RMINUS_INT64 , GxB_ANY_RMINUS_INT64 , - GxB_MIN_RMINUS_UINT8 , GxB_MAX_RMINUS_UINT8 , GxB_PLUS_RMINUS_UINT8 , GxB_TIMES_RMINUS_UINT8 , GxB_ANY_RMINUS_UINT8 , - GxB_MIN_RMINUS_UINT16 , GxB_MAX_RMINUS_UINT16 , GxB_PLUS_RMINUS_UINT16 , GxB_TIMES_RMINUS_UINT16, GxB_ANY_RMINUS_UINT16 , - GxB_MIN_RMINUS_UINT32 , GxB_MAX_RMINUS_UINT32 , GxB_PLUS_RMINUS_UINT32 , GxB_TIMES_RMINUS_UINT32, GxB_ANY_RMINUS_UINT32 , - GxB_MIN_RMINUS_UINT64 , GxB_MAX_RMINUS_UINT64 , GxB_PLUS_RMINUS_UINT64 , GxB_TIMES_RMINUS_UINT64, GxB_ANY_RMINUS_UINT64 , - GxB_MIN_RMINUS_FP32 , GxB_MAX_RMINUS_FP32 , GxB_PLUS_RMINUS_FP32 , GxB_TIMES_RMINUS_FP32 , GxB_ANY_RMINUS_FP32 , - GxB_MIN_RMINUS_FP64 , GxB_MAX_RMINUS_FP64 , GxB_PLUS_RMINUS_FP64 , GxB_TIMES_RMINUS_FP64 , GxB_ANY_RMINUS_FP64 , +GrB_Info GrB_Matrix_select_INT16 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + int16_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // semirings with multiply op: z = ISEQ (x,y), all types x,y,z the same: - GxB_MIN_ISEQ_INT8 , GxB_MAX_ISEQ_INT8 , GxB_PLUS_ISEQ_INT8 , GxB_TIMES_ISEQ_INT8 , GxB_ANY_ISEQ_INT8 , - GxB_MIN_ISEQ_INT16 , GxB_MAX_ISEQ_INT16 , GxB_PLUS_ISEQ_INT16 , GxB_TIMES_ISEQ_INT16 , GxB_ANY_ISEQ_INT16 , - GxB_MIN_ISEQ_INT32 , GxB_MAX_ISEQ_INT32 , GxB_PLUS_ISEQ_INT32 , GxB_TIMES_ISEQ_INT32 , GxB_ANY_ISEQ_INT32 , - GxB_MIN_ISEQ_INT64 , GxB_MAX_ISEQ_INT64 , GxB_PLUS_ISEQ_INT64 , GxB_TIMES_ISEQ_INT64 , GxB_ANY_ISEQ_INT64 , - GxB_MIN_ISEQ_UINT8 , GxB_MAX_ISEQ_UINT8 , GxB_PLUS_ISEQ_UINT8 , GxB_TIMES_ISEQ_UINT8 , GxB_ANY_ISEQ_UINT8 , - GxB_MIN_ISEQ_UINT16 , GxB_MAX_ISEQ_UINT16 , GxB_PLUS_ISEQ_UINT16 , GxB_TIMES_ISEQ_UINT16 , GxB_ANY_ISEQ_UINT16 , - GxB_MIN_ISEQ_UINT32 , GxB_MAX_ISEQ_UINT32 , GxB_PLUS_ISEQ_UINT32 , GxB_TIMES_ISEQ_UINT32 , GxB_ANY_ISEQ_UINT32 , - GxB_MIN_ISEQ_UINT64 , GxB_MAX_ISEQ_UINT64 , GxB_PLUS_ISEQ_UINT64 , GxB_TIMES_ISEQ_UINT64 , GxB_ANY_ISEQ_UINT64 , - GxB_MIN_ISEQ_FP32 , GxB_MAX_ISEQ_FP32 , GxB_PLUS_ISEQ_FP32 , GxB_TIMES_ISEQ_FP32 , GxB_ANY_ISEQ_FP32 , - GxB_MIN_ISEQ_FP64 , GxB_MAX_ISEQ_FP64 , GxB_PLUS_ISEQ_FP64 , GxB_TIMES_ISEQ_FP64 , GxB_ANY_ISEQ_FP64 , +GrB_Info GrB_Matrix_select_INT32 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + int32_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // semirings with multiply op: z = ISNE (x,y), all types x,y,z the same: - GxB_MIN_ISNE_INT8 , GxB_MAX_ISNE_INT8 , GxB_PLUS_ISNE_INT8 , GxB_TIMES_ISNE_INT8 , GxB_ANY_ISNE_INT8 , - GxB_MIN_ISNE_INT16 , GxB_MAX_ISNE_INT16 , GxB_PLUS_ISNE_INT16 , GxB_TIMES_ISNE_INT16 , GxB_ANY_ISNE_INT16 , - GxB_MIN_ISNE_INT32 , GxB_MAX_ISNE_INT32 , GxB_PLUS_ISNE_INT32 , GxB_TIMES_ISNE_INT32 , GxB_ANY_ISNE_INT32 , - GxB_MIN_ISNE_INT64 , GxB_MAX_ISNE_INT64 , GxB_PLUS_ISNE_INT64 , GxB_TIMES_ISNE_INT64 , GxB_ANY_ISNE_INT64 , - GxB_MIN_ISNE_UINT8 , GxB_MAX_ISNE_UINT8 , GxB_PLUS_ISNE_UINT8 , GxB_TIMES_ISNE_UINT8 , GxB_ANY_ISNE_UINT8 , - GxB_MIN_ISNE_UINT16 , GxB_MAX_ISNE_UINT16 , GxB_PLUS_ISNE_UINT16 , GxB_TIMES_ISNE_UINT16 , GxB_ANY_ISNE_UINT16 , - GxB_MIN_ISNE_UINT32 , GxB_MAX_ISNE_UINT32 , GxB_PLUS_ISNE_UINT32 , GxB_TIMES_ISNE_UINT32 , GxB_ANY_ISNE_UINT32 , - GxB_MIN_ISNE_UINT64 , GxB_MAX_ISNE_UINT64 , GxB_PLUS_ISNE_UINT64 , GxB_TIMES_ISNE_UINT64 , GxB_ANY_ISNE_UINT64 , - GxB_MIN_ISNE_FP32 , GxB_MAX_ISNE_FP32 , GxB_PLUS_ISNE_FP32 , GxB_TIMES_ISNE_FP32 , GxB_ANY_ISNE_FP32 , - GxB_MIN_ISNE_FP64 , GxB_MAX_ISNE_FP64 , GxB_PLUS_ISNE_FP64 , GxB_TIMES_ISNE_FP64 , GxB_ANY_ISNE_FP64 , +GrB_Info GrB_Matrix_select_INT64 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + int64_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // semirings with multiply op: z = ISGT (x,y), all types x,y,z the same: - GxB_MIN_ISGT_INT8 , GxB_MAX_ISGT_INT8 , GxB_PLUS_ISGT_INT8 , GxB_TIMES_ISGT_INT8 , GxB_ANY_ISGT_INT8 , - GxB_MIN_ISGT_INT16 , GxB_MAX_ISGT_INT16 , GxB_PLUS_ISGT_INT16 , GxB_TIMES_ISGT_INT16 , GxB_ANY_ISGT_INT16 , - GxB_MIN_ISGT_INT32 , GxB_MAX_ISGT_INT32 , GxB_PLUS_ISGT_INT32 , GxB_TIMES_ISGT_INT32 , GxB_ANY_ISGT_INT32 , - GxB_MIN_ISGT_INT64 , GxB_MAX_ISGT_INT64 , GxB_PLUS_ISGT_INT64 , GxB_TIMES_ISGT_INT64 , GxB_ANY_ISGT_INT64 , - GxB_MIN_ISGT_UINT8 , GxB_MAX_ISGT_UINT8 , GxB_PLUS_ISGT_UINT8 , GxB_TIMES_ISGT_UINT8 , GxB_ANY_ISGT_UINT8 , - GxB_MIN_ISGT_UINT16 , GxB_MAX_ISGT_UINT16 , GxB_PLUS_ISGT_UINT16 , GxB_TIMES_ISGT_UINT16 , GxB_ANY_ISGT_UINT16 , - GxB_MIN_ISGT_UINT32 , GxB_MAX_ISGT_UINT32 , GxB_PLUS_ISGT_UINT32 , GxB_TIMES_ISGT_UINT32 , GxB_ANY_ISGT_UINT32 , - GxB_MIN_ISGT_UINT64 , GxB_MAX_ISGT_UINT64 , GxB_PLUS_ISGT_UINT64 , GxB_TIMES_ISGT_UINT64 , GxB_ANY_ISGT_UINT64 , - GxB_MIN_ISGT_FP32 , GxB_MAX_ISGT_FP32 , GxB_PLUS_ISGT_FP32 , GxB_TIMES_ISGT_FP32 , GxB_ANY_ISGT_FP32 , - GxB_MIN_ISGT_FP64 , GxB_MAX_ISGT_FP64 , GxB_PLUS_ISGT_FP64 , GxB_TIMES_ISGT_FP64 , GxB_ANY_ISGT_FP64 , +GrB_Info GrB_Matrix_select_UINT8 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + uint8_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // semirings with multiply op: z = ISLT (x,y), all types x,y,z the same: - GxB_MIN_ISLT_INT8 , GxB_MAX_ISLT_INT8 , GxB_PLUS_ISLT_INT8 , GxB_TIMES_ISLT_INT8 , GxB_ANY_ISLT_INT8 , - GxB_MIN_ISLT_INT16 , GxB_MAX_ISLT_INT16 , GxB_PLUS_ISLT_INT16 , GxB_TIMES_ISLT_INT16 , GxB_ANY_ISLT_INT16 , - GxB_MIN_ISLT_INT32 , GxB_MAX_ISLT_INT32 , GxB_PLUS_ISLT_INT32 , GxB_TIMES_ISLT_INT32 , GxB_ANY_ISLT_INT32 , - GxB_MIN_ISLT_INT64 , GxB_MAX_ISLT_INT64 , GxB_PLUS_ISLT_INT64 , GxB_TIMES_ISLT_INT64 , GxB_ANY_ISLT_INT64 , - GxB_MIN_ISLT_UINT8 , GxB_MAX_ISLT_UINT8 , GxB_PLUS_ISLT_UINT8 , GxB_TIMES_ISLT_UINT8 , GxB_ANY_ISLT_UINT8 , - GxB_MIN_ISLT_UINT16 , GxB_MAX_ISLT_UINT16 , GxB_PLUS_ISLT_UINT16 , GxB_TIMES_ISLT_UINT16 , GxB_ANY_ISLT_UINT16 , - GxB_MIN_ISLT_UINT32 , GxB_MAX_ISLT_UINT32 , GxB_PLUS_ISLT_UINT32 , GxB_TIMES_ISLT_UINT32 , GxB_ANY_ISLT_UINT32 , - GxB_MIN_ISLT_UINT64 , GxB_MAX_ISLT_UINT64 , GxB_PLUS_ISLT_UINT64 , GxB_TIMES_ISLT_UINT64 , GxB_ANY_ISLT_UINT64 , - GxB_MIN_ISLT_FP32 , GxB_MAX_ISLT_FP32 , GxB_PLUS_ISLT_FP32 , GxB_TIMES_ISLT_FP32 , GxB_ANY_ISLT_FP32 , - GxB_MIN_ISLT_FP64 , GxB_MAX_ISLT_FP64 , GxB_PLUS_ISLT_FP64 , GxB_TIMES_ISLT_FP64 , GxB_ANY_ISLT_FP64 , +GrB_Info GrB_Matrix_select_UINT16 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + uint16_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // semirings with multiply op: z = ISGE (x,y), all types x,y,z the same: - GxB_MIN_ISGE_INT8 , GxB_MAX_ISGE_INT8 , GxB_PLUS_ISGE_INT8 , GxB_TIMES_ISGE_INT8 , GxB_ANY_ISGE_INT8 , - GxB_MIN_ISGE_INT16 , GxB_MAX_ISGE_INT16 , GxB_PLUS_ISGE_INT16 , GxB_TIMES_ISGE_INT16 , GxB_ANY_ISGE_INT16 , - GxB_MIN_ISGE_INT32 , GxB_MAX_ISGE_INT32 , GxB_PLUS_ISGE_INT32 , GxB_TIMES_ISGE_INT32 , GxB_ANY_ISGE_INT32 , - GxB_MIN_ISGE_INT64 , GxB_MAX_ISGE_INT64 , GxB_PLUS_ISGE_INT64 , GxB_TIMES_ISGE_INT64 , GxB_ANY_ISGE_INT64 , - GxB_MIN_ISGE_UINT8 , GxB_MAX_ISGE_UINT8 , GxB_PLUS_ISGE_UINT8 , GxB_TIMES_ISGE_UINT8 , GxB_ANY_ISGE_UINT8 , - GxB_MIN_ISGE_UINT16 , GxB_MAX_ISGE_UINT16 , GxB_PLUS_ISGE_UINT16 , GxB_TIMES_ISGE_UINT16 , GxB_ANY_ISGE_UINT16 , - GxB_MIN_ISGE_UINT32 , GxB_MAX_ISGE_UINT32 , GxB_PLUS_ISGE_UINT32 , GxB_TIMES_ISGE_UINT32 , GxB_ANY_ISGE_UINT32 , - GxB_MIN_ISGE_UINT64 , GxB_MAX_ISGE_UINT64 , GxB_PLUS_ISGE_UINT64 , GxB_TIMES_ISGE_UINT64 , GxB_ANY_ISGE_UINT64 , - GxB_MIN_ISGE_FP32 , GxB_MAX_ISGE_FP32 , GxB_PLUS_ISGE_FP32 , GxB_TIMES_ISGE_FP32 , GxB_ANY_ISGE_FP32 , - GxB_MIN_ISGE_FP64 , GxB_MAX_ISGE_FP64 , GxB_PLUS_ISGE_FP64 , GxB_TIMES_ISGE_FP64 , GxB_ANY_ISGE_FP64 , +GrB_Info GrB_Matrix_select_UINT32 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + uint32_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // semirings with multiply op: z = ISLE (x,y), all types x,y,z the same: - GxB_MIN_ISLE_INT8 , GxB_MAX_ISLE_INT8 , GxB_PLUS_ISLE_INT8 , GxB_TIMES_ISLE_INT8 , GxB_ANY_ISLE_INT8 , - GxB_MIN_ISLE_INT16 , GxB_MAX_ISLE_INT16 , GxB_PLUS_ISLE_INT16 , GxB_TIMES_ISLE_INT16 , GxB_ANY_ISLE_INT16 , - GxB_MIN_ISLE_INT32 , GxB_MAX_ISLE_INT32 , GxB_PLUS_ISLE_INT32 , GxB_TIMES_ISLE_INT32 , GxB_ANY_ISLE_INT32 , - GxB_MIN_ISLE_INT64 , GxB_MAX_ISLE_INT64 , GxB_PLUS_ISLE_INT64 , GxB_TIMES_ISLE_INT64 , GxB_ANY_ISLE_INT64 , - GxB_MIN_ISLE_UINT8 , GxB_MAX_ISLE_UINT8 , GxB_PLUS_ISLE_UINT8 , GxB_TIMES_ISLE_UINT8 , GxB_ANY_ISLE_UINT8 , - GxB_MIN_ISLE_UINT16 , GxB_MAX_ISLE_UINT16 , GxB_PLUS_ISLE_UINT16 , GxB_TIMES_ISLE_UINT16 , GxB_ANY_ISLE_UINT16 , - GxB_MIN_ISLE_UINT32 , GxB_MAX_ISLE_UINT32 , GxB_PLUS_ISLE_UINT32 , GxB_TIMES_ISLE_UINT32 , GxB_ANY_ISLE_UINT32 , - GxB_MIN_ISLE_UINT64 , GxB_MAX_ISLE_UINT64 , GxB_PLUS_ISLE_UINT64 , GxB_TIMES_ISLE_UINT64 , GxB_ANY_ISLE_UINT64 , - GxB_MIN_ISLE_FP32 , GxB_MAX_ISLE_FP32 , GxB_PLUS_ISLE_FP32 , GxB_TIMES_ISLE_FP32 , GxB_ANY_ISLE_FP32 , - GxB_MIN_ISLE_FP64 , GxB_MAX_ISLE_FP64 , GxB_PLUS_ISLE_FP64 , GxB_TIMES_ISLE_FP64 , GxB_ANY_ISLE_FP64 , +GrB_Info GrB_Matrix_select_UINT64 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + uint64_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // semirings with multiply op: z = LOR (x,y), all types x,y,z the same: - GxB_MIN_LOR_INT8 , GxB_MAX_LOR_INT8 , GxB_PLUS_LOR_INT8 , GxB_TIMES_LOR_INT8 , GxB_ANY_LOR_INT8 , - GxB_MIN_LOR_INT16 , GxB_MAX_LOR_INT16 , GxB_PLUS_LOR_INT16 , GxB_TIMES_LOR_INT16 , GxB_ANY_LOR_INT16 , - GxB_MIN_LOR_INT32 , GxB_MAX_LOR_INT32 , GxB_PLUS_LOR_INT32 , GxB_TIMES_LOR_INT32 , GxB_ANY_LOR_INT32 , - GxB_MIN_LOR_INT64 , GxB_MAX_LOR_INT64 , GxB_PLUS_LOR_INT64 , GxB_TIMES_LOR_INT64 , GxB_ANY_LOR_INT64 , - GxB_MIN_LOR_UINT8 , GxB_MAX_LOR_UINT8 , GxB_PLUS_LOR_UINT8 , GxB_TIMES_LOR_UINT8 , GxB_ANY_LOR_UINT8 , - GxB_MIN_LOR_UINT16 , GxB_MAX_LOR_UINT16 , GxB_PLUS_LOR_UINT16 , GxB_TIMES_LOR_UINT16 , GxB_ANY_LOR_UINT16 , - GxB_MIN_LOR_UINT32 , GxB_MAX_LOR_UINT32 , GxB_PLUS_LOR_UINT32 , GxB_TIMES_LOR_UINT32 , GxB_ANY_LOR_UINT32 , - GxB_MIN_LOR_UINT64 , GxB_MAX_LOR_UINT64 , GxB_PLUS_LOR_UINT64 , GxB_TIMES_LOR_UINT64 , GxB_ANY_LOR_UINT64 , - GxB_MIN_LOR_FP32 , GxB_MAX_LOR_FP32 , GxB_PLUS_LOR_FP32 , GxB_TIMES_LOR_FP32 , GxB_ANY_LOR_FP32 , - GxB_MIN_LOR_FP64 , GxB_MAX_LOR_FP64 , GxB_PLUS_LOR_FP64 , GxB_TIMES_LOR_FP64 , GxB_ANY_LOR_FP64 , +GrB_Info GrB_Matrix_select_FP32 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + float y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // semirings with multiply op: z = LAND (x,y), all types x,y,z the same: - GxB_MIN_LAND_INT8 , GxB_MAX_LAND_INT8 , GxB_PLUS_LAND_INT8 , GxB_TIMES_LAND_INT8 , GxB_ANY_LAND_INT8 , - GxB_MIN_LAND_INT16 , GxB_MAX_LAND_INT16 , GxB_PLUS_LAND_INT16 , GxB_TIMES_LAND_INT16 , GxB_ANY_LAND_INT16 , - GxB_MIN_LAND_INT32 , GxB_MAX_LAND_INT32 , GxB_PLUS_LAND_INT32 , GxB_TIMES_LAND_INT32 , GxB_ANY_LAND_INT32 , - GxB_MIN_LAND_INT64 , GxB_MAX_LAND_INT64 , GxB_PLUS_LAND_INT64 , GxB_TIMES_LAND_INT64 , GxB_ANY_LAND_INT64 , - GxB_MIN_LAND_UINT8 , GxB_MAX_LAND_UINT8 , GxB_PLUS_LAND_UINT8 , GxB_TIMES_LAND_UINT8 , GxB_ANY_LAND_UINT8 , - GxB_MIN_LAND_UINT16 , GxB_MAX_LAND_UINT16 , GxB_PLUS_LAND_UINT16 , GxB_TIMES_LAND_UINT16 , GxB_ANY_LAND_UINT16 , - GxB_MIN_LAND_UINT32 , GxB_MAX_LAND_UINT32 , GxB_PLUS_LAND_UINT32 , GxB_TIMES_LAND_UINT32 , GxB_ANY_LAND_UINT32 , - GxB_MIN_LAND_UINT64 , GxB_MAX_LAND_UINT64 , GxB_PLUS_LAND_UINT64 , GxB_TIMES_LAND_UINT64 , GxB_ANY_LAND_UINT64 , - GxB_MIN_LAND_FP32 , GxB_MAX_LAND_FP32 , GxB_PLUS_LAND_FP32 , GxB_TIMES_LAND_FP32 , GxB_ANY_LAND_FP32 , - GxB_MIN_LAND_FP64 , GxB_MAX_LAND_FP64 , GxB_PLUS_LAND_FP64 , GxB_TIMES_LAND_FP64 , GxB_ANY_LAND_FP64 , +GrB_Info GrB_Matrix_select_FP64 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + double y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // semirings with multiply op: z = LXOR (x,y), all types x,y,z the same: - GxB_MIN_LXOR_INT8 , GxB_MAX_LXOR_INT8 , GxB_PLUS_LXOR_INT8 , GxB_TIMES_LXOR_INT8 , GxB_ANY_LXOR_INT8 , - GxB_MIN_LXOR_INT16 , GxB_MAX_LXOR_INT16 , GxB_PLUS_LXOR_INT16 , GxB_TIMES_LXOR_INT16 , GxB_ANY_LXOR_INT16 , - GxB_MIN_LXOR_INT32 , GxB_MAX_LXOR_INT32 , GxB_PLUS_LXOR_INT32 , GxB_TIMES_LXOR_INT32 , GxB_ANY_LXOR_INT32 , - GxB_MIN_LXOR_INT64 , GxB_MAX_LXOR_INT64 , GxB_PLUS_LXOR_INT64 , GxB_TIMES_LXOR_INT64 , GxB_ANY_LXOR_INT64 , - GxB_MIN_LXOR_UINT8 , GxB_MAX_LXOR_UINT8 , GxB_PLUS_LXOR_UINT8 , GxB_TIMES_LXOR_UINT8 , GxB_ANY_LXOR_UINT8 , - GxB_MIN_LXOR_UINT16 , GxB_MAX_LXOR_UINT16 , GxB_PLUS_LXOR_UINT16 , GxB_TIMES_LXOR_UINT16 , GxB_ANY_LXOR_UINT16 , - GxB_MIN_LXOR_UINT32 , GxB_MAX_LXOR_UINT32 , GxB_PLUS_LXOR_UINT32 , GxB_TIMES_LXOR_UINT32 , GxB_ANY_LXOR_UINT32 , - GxB_MIN_LXOR_UINT64 , GxB_MAX_LXOR_UINT64 , GxB_PLUS_LXOR_UINT64 , GxB_TIMES_LXOR_UINT64 , GxB_ANY_LXOR_UINT64 , - GxB_MIN_LXOR_FP32 , GxB_MAX_LXOR_FP32 , GxB_PLUS_LXOR_FP32 , GxB_TIMES_LXOR_FP32 , GxB_ANY_LXOR_FP32 , - GxB_MIN_LXOR_FP64 , GxB_MAX_LXOR_FP64 , GxB_PLUS_LXOR_FP64 , GxB_TIMES_LXOR_FP64 , GxB_ANY_LXOR_FP64 , +GrB_Info GxB_Matrix_select_FC32 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + GxB_FC32_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; -//------------------------------------------------------------------------------ -// 300 semirings with a comparator TxT -> bool, where T is non-Boolean -//------------------------------------------------------------------------------ +GrB_Info GxB_Matrix_select_FC64 // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + GxB_FC64_t y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // In the 4th column the GxB_EQ_*_* semirings could also be called - // GxB_LXNOR_*_*, since the EQ and LXNOR boolean operators are identical - // but those names are not included. +GrB_Info GrB_Matrix_select_UDT // C=accum(C,op(A)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_IndexUnaryOp op, // operator to apply to the entries + const GrB_Matrix A, // first input: matrix A + const void *y, // second input: scalar y + const GrB_Descriptor desc // descriptor for C, mask, and A +) ; - // semirings with multiply op: z = EQ (x,y), where z is boolean and x,y are given by the suffix: - GxB_LOR_EQ_INT8 , GxB_LAND_EQ_INT8 , GxB_LXOR_EQ_INT8 , GxB_EQ_EQ_INT8 , GxB_ANY_EQ_INT8 , - GxB_LOR_EQ_INT16 , GxB_LAND_EQ_INT16 , GxB_LXOR_EQ_INT16 , GxB_EQ_EQ_INT16 , GxB_ANY_EQ_INT16 , - GxB_LOR_EQ_INT32 , GxB_LAND_EQ_INT32 , GxB_LXOR_EQ_INT32 , GxB_EQ_EQ_INT32 , GxB_ANY_EQ_INT32 , - GxB_LOR_EQ_INT64 , GxB_LAND_EQ_INT64 , GxB_LXOR_EQ_INT64 , GxB_EQ_EQ_INT64 , GxB_ANY_EQ_INT64 , - GxB_LOR_EQ_UINT8 , GxB_LAND_EQ_UINT8 , GxB_LXOR_EQ_UINT8 , GxB_EQ_EQ_UINT8 , GxB_ANY_EQ_UINT8 , - GxB_LOR_EQ_UINT16 , GxB_LAND_EQ_UINT16 , GxB_LXOR_EQ_UINT16 , GxB_EQ_EQ_UINT16 , GxB_ANY_EQ_UINT16 , - GxB_LOR_EQ_UINT32 , GxB_LAND_EQ_UINT32 , GxB_LXOR_EQ_UINT32 , GxB_EQ_EQ_UINT32 , GxB_ANY_EQ_UINT32 , - GxB_LOR_EQ_UINT64 , GxB_LAND_EQ_UINT64 , GxB_LXOR_EQ_UINT64 , GxB_EQ_EQ_UINT64 , GxB_ANY_EQ_UINT64 , - GxB_LOR_EQ_FP32 , GxB_LAND_EQ_FP32 , GxB_LXOR_EQ_FP32 , GxB_EQ_EQ_FP32 , GxB_ANY_EQ_FP32 , - GxB_LOR_EQ_FP64 , GxB_LAND_EQ_FP64 , GxB_LXOR_EQ_FP64 , GxB_EQ_EQ_FP64 , GxB_ANY_EQ_FP64 , +// GrB_select is a generic method that applies an IndexUnaryOp to +// a matrix or vector, using any type of the scalar y. - // semirings with multiply op: z = NE (x,y), where z is boolean and x,y are given by the suffix: - GxB_LOR_NE_INT8 , GxB_LAND_NE_INT8 , GxB_LXOR_NE_INT8 , GxB_EQ_NE_INT8 , GxB_ANY_NE_INT8 , - GxB_LOR_NE_INT16 , GxB_LAND_NE_INT16 , GxB_LXOR_NE_INT16 , GxB_EQ_NE_INT16 , GxB_ANY_NE_INT16 , - GxB_LOR_NE_INT32 , GxB_LAND_NE_INT32 , GxB_LXOR_NE_INT32 , GxB_EQ_NE_INT32 , GxB_ANY_NE_INT32 , - GxB_LOR_NE_INT64 , GxB_LAND_NE_INT64 , GxB_LXOR_NE_INT64 , GxB_EQ_NE_INT64 , GxB_ANY_NE_INT64 , - GxB_LOR_NE_UINT8 , GxB_LAND_NE_UINT8 , GxB_LXOR_NE_UINT8 , GxB_EQ_NE_UINT8 , GxB_ANY_NE_UINT8 , - GxB_LOR_NE_UINT16 , GxB_LAND_NE_UINT16 , GxB_LXOR_NE_UINT16 , GxB_EQ_NE_UINT16 , GxB_ANY_NE_UINT16 , - GxB_LOR_NE_UINT32 , GxB_LAND_NE_UINT32 , GxB_LXOR_NE_UINT32 , GxB_EQ_NE_UINT32 , GxB_ANY_NE_UINT32 , - GxB_LOR_NE_UINT64 , GxB_LAND_NE_UINT64 , GxB_LXOR_NE_UINT64 , GxB_EQ_NE_UINT64 , GxB_ANY_NE_UINT64 , - GxB_LOR_NE_FP32 , GxB_LAND_NE_FP32 , GxB_LXOR_NE_FP32 , GxB_EQ_NE_FP32 , GxB_ANY_NE_FP32 , - GxB_LOR_NE_FP64 , GxB_LAND_NE_FP64 , GxB_LXOR_NE_FP64 , GxB_EQ_NE_FP64 , GxB_ANY_NE_FP64 , +// GrB_Vector_select_TYPE (w,m,acc,idxop,u,y,d) +// GrB_Matrix_select_TYPE (C,M,acc,idxop,A,y,d) - // semirings with multiply op: z = GT (x,y), where z is boolean and x,y are given by the suffix: - GxB_LOR_GT_INT8 , GxB_LAND_GT_INT8 , GxB_LXOR_GT_INT8 , GxB_EQ_GT_INT8 , GxB_ANY_GT_INT8 , - GxB_LOR_GT_INT16 , GxB_LAND_GT_INT16 , GxB_LXOR_GT_INT16 , GxB_EQ_GT_INT16 , GxB_ANY_GT_INT16 , - GxB_LOR_GT_INT32 , GxB_LAND_GT_INT32 , GxB_LXOR_GT_INT32 , GxB_EQ_GT_INT32 , GxB_ANY_GT_INT32 , - GxB_LOR_GT_INT64 , GxB_LAND_GT_INT64 , GxB_LXOR_GT_INT64 , GxB_EQ_GT_INT64 , GxB_ANY_GT_INT64 , - GxB_LOR_GT_UINT8 , GxB_LAND_GT_UINT8 , GxB_LXOR_GT_UINT8 , GxB_EQ_GT_UINT8 , GxB_ANY_GT_UINT8 , - GxB_LOR_GT_UINT16 , GxB_LAND_GT_UINT16 , GxB_LXOR_GT_UINT16 , GxB_EQ_GT_UINT16 , GxB_ANY_GT_UINT16 , - GxB_LOR_GT_UINT32 , GxB_LAND_GT_UINT32 , GxB_LXOR_GT_UINT32 , GxB_EQ_GT_UINT32 , GxB_ANY_GT_UINT32 , - GxB_LOR_GT_UINT64 , GxB_LAND_GT_UINT64 , GxB_LXOR_GT_UINT64 , GxB_EQ_GT_UINT64 , GxB_ANY_GT_UINT64 , - GxB_LOR_GT_FP32 , GxB_LAND_GT_FP32 , GxB_LXOR_GT_FP32 , GxB_EQ_GT_FP32 , GxB_ANY_GT_FP32 , - GxB_LOR_GT_FP64 , GxB_LAND_GT_FP64 , GxB_LXOR_GT_FP64 , GxB_EQ_GT_FP64 , GxB_ANY_GT_FP64 , +#if GxB_STDC_VERSION >= 201112L +#define GrB_select(C,Mask,accum,op,x,y,d) \ + _Generic \ + ( \ + (C), \ + GrB_Vector : \ + _Generic \ + ( \ + (y), \ + GB_CASES (GrB, Vector_select), \ + default: GrB_Vector_select_Scalar \ + ), \ + GrB_Matrix : \ + _Generic \ + ( \ + (y), \ + GB_CASES (GrB, Matrix_select), \ + default: GrB_Matrix_select_Scalar \ + ) \ + ) \ + (C, Mask, accum, op, x, y, d) +#endif - // semirings with multiply op: z = LT (x,y), where z is boolean and x,y are given by the suffix: - GxB_LOR_LT_INT8 , GxB_LAND_LT_INT8 , GxB_LXOR_LT_INT8 , GxB_EQ_LT_INT8 , GxB_ANY_LT_INT8 , - GxB_LOR_LT_INT16 , GxB_LAND_LT_INT16 , GxB_LXOR_LT_INT16 , GxB_EQ_LT_INT16 , GxB_ANY_LT_INT16 , - GxB_LOR_LT_INT32 , GxB_LAND_LT_INT32 , GxB_LXOR_LT_INT32 , GxB_EQ_LT_INT32 , GxB_ANY_LT_INT32 , - GxB_LOR_LT_INT64 , GxB_LAND_LT_INT64 , GxB_LXOR_LT_INT64 , GxB_EQ_LT_INT64 , GxB_ANY_LT_INT64 , - GxB_LOR_LT_UINT8 , GxB_LAND_LT_UINT8 , GxB_LXOR_LT_UINT8 , GxB_EQ_LT_UINT8 , GxB_ANY_LT_UINT8 , - GxB_LOR_LT_UINT16 , GxB_LAND_LT_UINT16 , GxB_LXOR_LT_UINT16 , GxB_EQ_LT_UINT16 , GxB_ANY_LT_UINT16 , - GxB_LOR_LT_UINT32 , GxB_LAND_LT_UINT32 , GxB_LXOR_LT_UINT32 , GxB_EQ_LT_UINT32 , GxB_ANY_LT_UINT32 , - GxB_LOR_LT_UINT64 , GxB_LAND_LT_UINT64 , GxB_LXOR_LT_UINT64 , GxB_EQ_LT_UINT64 , GxB_ANY_LT_UINT64 , - GxB_LOR_LT_FP32 , GxB_LAND_LT_FP32 , GxB_LXOR_LT_FP32 , GxB_EQ_LT_FP32 , GxB_ANY_LT_FP32 , - GxB_LOR_LT_FP64 , GxB_LAND_LT_FP64 , GxB_LXOR_LT_FP64 , GxB_EQ_LT_FP64 , GxB_ANY_LT_FP64 , +//============================================================================== +// GxB_select: matrix and vector selection (DEPRECATED: use GrB_select instead) +//============================================================================== - // semirings with multiply op: z = GE (x,y), where z is boolean and x,y are given by the suffix: - GxB_LOR_GE_INT8 , GxB_LAND_GE_INT8 , GxB_LXOR_GE_INT8 , GxB_EQ_GE_INT8 , GxB_ANY_GE_INT8 , - GxB_LOR_GE_INT16 , GxB_LAND_GE_INT16 , GxB_LXOR_GE_INT16 , GxB_EQ_GE_INT16 , GxB_ANY_GE_INT16 , - GxB_LOR_GE_INT32 , GxB_LAND_GE_INT32 , GxB_LXOR_GE_INT32 , GxB_EQ_GE_INT32 , GxB_ANY_GE_INT32 , - GxB_LOR_GE_INT64 , GxB_LAND_GE_INT64 , GxB_LXOR_GE_INT64 , GxB_EQ_GE_INT64 , GxB_ANY_GE_INT64 , - GxB_LOR_GE_UINT8 , GxB_LAND_GE_UINT8 , GxB_LXOR_GE_UINT8 , GxB_EQ_GE_UINT8 , GxB_ANY_GE_UINT8 , - GxB_LOR_GE_UINT16 , GxB_LAND_GE_UINT16 , GxB_LXOR_GE_UINT16 , GxB_EQ_GE_UINT16 , GxB_ANY_GE_UINT16 , - GxB_LOR_GE_UINT32 , GxB_LAND_GE_UINT32 , GxB_LXOR_GE_UINT32 , GxB_EQ_GE_UINT32 , GxB_ANY_GE_UINT32 , - GxB_LOR_GE_UINT64 , GxB_LAND_GE_UINT64 , GxB_LXOR_GE_UINT64 , GxB_EQ_GE_UINT64 , GxB_ANY_GE_UINT64 , - GxB_LOR_GE_FP32 , GxB_LAND_GE_FP32 , GxB_LXOR_GE_FP32 , GxB_EQ_GE_FP32 , GxB_ANY_GE_FP32 , - GxB_LOR_GE_FP64 , GxB_LAND_GE_FP64 , GxB_LXOR_GE_FP64 , GxB_EQ_GE_FP64 , GxB_ANY_GE_FP64 , +GrB_Info GxB_Vector_select (GrB_Vector w, const GrB_Vector mask, + const GrB_BinaryOp accum, const GxB_SelectOp op, const GrB_Vector u, + const GrB_Scalar Thunk, const GrB_Descriptor desc) ; +GrB_Info GxB_Matrix_select (GrB_Matrix C, const GrB_Matrix Mask, + const GrB_BinaryOp accum, const GxB_SelectOp op, const GrB_Matrix A, + const GrB_Scalar Thunk, const GrB_Descriptor desc) ; +#if GxB_STDC_VERSION >= 201112L +#define GxB_select(C,Mask,accum,op,A,Thunk,desc) _Generic \ +((C), GrB_Vector:GxB_Vector_select , GrB_Matrix:GxB_Matrix_select ) \ +(C, Mask, accum, op, A, Thunk, desc) +#endif - // semirings with multiply op: z = LE (x,y), where z is boolean and x,y are given by the suffix: - GxB_LOR_LE_INT8 , GxB_LAND_LE_INT8 , GxB_LXOR_LE_INT8 , GxB_EQ_LE_INT8 , GxB_ANY_LE_INT8 , - GxB_LOR_LE_INT16 , GxB_LAND_LE_INT16 , GxB_LXOR_LE_INT16 , GxB_EQ_LE_INT16 , GxB_ANY_LE_INT16 , - GxB_LOR_LE_INT32 , GxB_LAND_LE_INT32 , GxB_LXOR_LE_INT32 , GxB_EQ_LE_INT32 , GxB_ANY_LE_INT32 , - GxB_LOR_LE_INT64 , GxB_LAND_LE_INT64 , GxB_LXOR_LE_INT64 , GxB_EQ_LE_INT64 , GxB_ANY_LE_INT64 , - GxB_LOR_LE_UINT8 , GxB_LAND_LE_UINT8 , GxB_LXOR_LE_UINT8 , GxB_EQ_LE_UINT8 , GxB_ANY_LE_UINT8 , - GxB_LOR_LE_UINT16 , GxB_LAND_LE_UINT16 , GxB_LXOR_LE_UINT16 , GxB_EQ_LE_UINT16 , GxB_ANY_LE_UINT16 , - GxB_LOR_LE_UINT32 , GxB_LAND_LE_UINT32 , GxB_LXOR_LE_UINT32 , GxB_EQ_LE_UINT32 , GxB_ANY_LE_UINT32 , - GxB_LOR_LE_UINT64 , GxB_LAND_LE_UINT64 , GxB_LXOR_LE_UINT64 , GxB_EQ_LE_UINT64 , GxB_ANY_LE_UINT64 , - GxB_LOR_LE_FP32 , GxB_LAND_LE_FP32 , GxB_LXOR_LE_FP32 , GxB_EQ_LE_FP32 , GxB_ANY_LE_FP32 , - GxB_LOR_LE_FP64 , GxB_LAND_LE_FP64 , GxB_LXOR_LE_FP64 , GxB_EQ_LE_FP64 , GxB_ANY_LE_FP64 , +//============================================================================== +// GrB_reduce: matrix and vector reduction +//============================================================================== -//------------------------------------------------------------------------------ -// 55 semirings with purely Boolean types, bool x bool -> bool -//------------------------------------------------------------------------------ +// Reduce the entries in a matrix to a vector, a column vector t such that +// t(i) = sum (A (i,:)), and where "sum" is a commutative and associative +// monoid with an identity value. A can be transposed, which reduces down the +// columns instead of the rows. - // Note that lor_pair, land_pair, and eq_pair are all identical to any_pair. - // These 3 are marked below. GxB_EQ_*_BOOL could be called - // GxB_LXNOR_*_BOOL, and GxB_*_EQ_BOOL could be called GxB_*_LXNOR_BOOL, - // but those names are not included. +// For GrB_Matrix_reduce_BinaryOp, the GrB_BinaryOp op must correspond to a +// known built-in monoid: +// +// operator data-types (all built-in) +// ---------------------- --------------------------- +// MIN, MAX INT*, UINT*, FP* +// TIMES, PLUS INT*, UINT*, FP*, FC* +// ANY INT*, UINT*, FP*, FC*, BOOL +// LOR, LAND, LXOR, EQ BOOL +// BOR, BAND, BXOR, BXNOR UINT* - // purely boolean semirings in the form GxB_(add monoid)_(multiply operator)_BOOL: - GxB_LOR_FIRST_BOOL , GxB_LAND_FIRST_BOOL , GxB_LXOR_FIRST_BOOL , GxB_EQ_FIRST_BOOL , GxB_ANY_FIRST_BOOL , - GxB_LOR_SECOND_BOOL , GxB_LAND_SECOND_BOOL , GxB_LXOR_SECOND_BOOL , GxB_EQ_SECOND_BOOL , GxB_ANY_SECOND_BOOL , - GxB_LOR_PAIR_BOOL/**/ , GxB_LAND_PAIR_BOOL/**/ , GxB_LXOR_PAIR_BOOL , GxB_EQ_PAIR_BOOL/**/ , GxB_ANY_PAIR_BOOL , - GxB_LOR_LOR_BOOL , GxB_LAND_LOR_BOOL , GxB_LXOR_LOR_BOOL , GxB_EQ_LOR_BOOL , GxB_ANY_LOR_BOOL , - GxB_LOR_LAND_BOOL , GxB_LAND_LAND_BOOL , GxB_LXOR_LAND_BOOL , GxB_EQ_LAND_BOOL , GxB_ANY_LAND_BOOL , - GxB_LOR_LXOR_BOOL , GxB_LAND_LXOR_BOOL , GxB_LXOR_LXOR_BOOL , GxB_EQ_LXOR_BOOL , GxB_ANY_LXOR_BOOL , - GxB_LOR_EQ_BOOL , GxB_LAND_EQ_BOOL , GxB_LXOR_EQ_BOOL , GxB_EQ_EQ_BOOL , GxB_ANY_EQ_BOOL , - GxB_LOR_GT_BOOL , GxB_LAND_GT_BOOL , GxB_LXOR_GT_BOOL , GxB_EQ_GT_BOOL , GxB_ANY_GT_BOOL , - GxB_LOR_LT_BOOL , GxB_LAND_LT_BOOL , GxB_LXOR_LT_BOOL , GxB_EQ_LT_BOOL , GxB_ANY_LT_BOOL , - GxB_LOR_GE_BOOL , GxB_LAND_GE_BOOL , GxB_LXOR_GE_BOOL , GxB_EQ_GE_BOOL , GxB_ANY_GE_BOOL , - GxB_LOR_LE_BOOL , GxB_LAND_LE_BOOL , GxB_LXOR_LE_BOOL , GxB_EQ_LE_BOOL , GxB_ANY_LE_BOOL , +GrB_Info GrB_Matrix_reduce_Monoid // w = accum (w,reduce(A)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_Monoid monoid, // reduce operator for t=reduce(A) + const GrB_Matrix A, // first input: matrix A + const GrB_Descriptor desc // descriptor for w, mask, and A +) ; + +GrB_Info GrB_Matrix_reduce_BinaryOp // w = accum (w,reduce(A)) +( + GrB_Vector w, // input/output vector for results + const GrB_Vector mask, // optional mask for w, unused if NULL + const GrB_BinaryOp accum, // optional accum for z=accum(w,t) + const GrB_BinaryOp op, // reduce operator for t=reduce(A) + const GrB_Matrix A, // first input: matrix A + const GrB_Descriptor desc // descriptor for w, mask, and A +) ; //------------------------------------------------------------------------------ -// 54 complex semirings +// reduce a vector to a scalar //------------------------------------------------------------------------------ - // 3 monoids (plus, times, any), 2 types (FC32 and FC64), and 9 - // multiplicative operators. +// Reduce entries in a vector to a scalar, c = accum (c, reduce_to_scalar(u)) - // Note that times_pair is identical to any_pair. - // These 2 are marked below. +GrB_Info GrB_Vector_reduce_BOOL // c = accum (c, reduce_to_scalar (u)) +( + bool *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - GxB_PLUS_FIRST_FC32 , GxB_TIMES_FIRST_FC32 , GxB_ANY_FIRST_FC32 , - GxB_PLUS_FIRST_FC64 , GxB_TIMES_FIRST_FC64 , GxB_ANY_FIRST_FC64 , +GrB_Info GrB_Vector_reduce_INT8 // c = accum (c, reduce_to_scalar (u)) +( + int8_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - GxB_PLUS_SECOND_FC32 , GxB_TIMES_SECOND_FC32 , GxB_ANY_SECOND_FC32 , - GxB_PLUS_SECOND_FC64 , GxB_TIMES_SECOND_FC64 , GxB_ANY_SECOND_FC64 , +GrB_Info GrB_Vector_reduce_UINT8 // c = accum (c, reduce_to_scalar (u)) +( + uint8_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - GxB_PLUS_PAIR_FC32 , GxB_TIMES_PAIR_FC32/**/, GxB_ANY_PAIR_FC32 , - GxB_PLUS_PAIR_FC64 , GxB_TIMES_PAIR_FC64/**/, GxB_ANY_PAIR_FC64 , +GrB_Info GrB_Vector_reduce_INT16 // c = accum (c, reduce_to_scalar (u)) +( + int16_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - GxB_PLUS_PLUS_FC32 , GxB_TIMES_PLUS_FC32 , GxB_ANY_PLUS_FC32 , - GxB_PLUS_PLUS_FC64 , GxB_TIMES_PLUS_FC64 , GxB_ANY_PLUS_FC64 , +GrB_Info GrB_Vector_reduce_UINT16 // c = accum (c, reduce_to_scalar (u)) +( + uint16_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - GxB_PLUS_MINUS_FC32 , GxB_TIMES_MINUS_FC32 , GxB_ANY_MINUS_FC32 , - GxB_PLUS_MINUS_FC64 , GxB_TIMES_MINUS_FC64 , GxB_ANY_MINUS_FC64 , +GrB_Info GrB_Vector_reduce_INT32 // c = accum (c, reduce_to_scalar (u)) +( + int32_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - GxB_PLUS_TIMES_FC32 , GxB_TIMES_TIMES_FC32 , GxB_ANY_TIMES_FC32 , - GxB_PLUS_TIMES_FC64 , GxB_TIMES_TIMES_FC64 , GxB_ANY_TIMES_FC64 , +GrB_Info GrB_Vector_reduce_UINT32 // c = accum (c, reduce_to_scalar (u)) +( + uint32_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - GxB_PLUS_DIV_FC32 , GxB_TIMES_DIV_FC32 , GxB_ANY_DIV_FC32 , - GxB_PLUS_DIV_FC64 , GxB_TIMES_DIV_FC64 , GxB_ANY_DIV_FC64 , +GrB_Info GrB_Vector_reduce_INT64 // c = accum (c, reduce_to_scalar (u)) +( + int64_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - GxB_PLUS_RDIV_FC32 , GxB_TIMES_RDIV_FC32 , GxB_ANY_RDIV_FC32 , - GxB_PLUS_RDIV_FC64 , GxB_TIMES_RDIV_FC64 , GxB_ANY_RDIV_FC64 , +GrB_Info GrB_Vector_reduce_UINT64 // c = accum (c, reduce_to_scalar (u)) +( + uint64_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - GxB_PLUS_RMINUS_FC32 , GxB_TIMES_RMINUS_FC32 , GxB_ANY_RMINUS_FC32 , - GxB_PLUS_RMINUS_FC64 , GxB_TIMES_RMINUS_FC64 , GxB_ANY_RMINUS_FC64 , +GrB_Info GrB_Vector_reduce_FP32 // c = accum (c, reduce_to_scalar (u)) +( + float *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; -//------------------------------------------------------------------------------ -// 64 bitwise semirings -//------------------------------------------------------------------------------ +GrB_Info GrB_Vector_reduce_FP64 // c = accum (c, reduce_to_scalar (u)) +( + double *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - // monoids: (BOR, BAND, BXOR, BXNOR) x - // mult: (BOR, BAND, BXOR, BXNOR) x - // types: (UINT8, UINT16, UINT32, UINT64) +GrB_Info GxB_Vector_reduce_FC32 // c = accum (c, reduce_to_scalar (u)) +( + GxB_FC32_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - GxB_BOR_BOR_UINT8 , GxB_BOR_BOR_UINT16 , GxB_BOR_BOR_UINT32 , GxB_BOR_BOR_UINT64 , - GxB_BOR_BAND_UINT8 , GxB_BOR_BAND_UINT16 , GxB_BOR_BAND_UINT32 , GxB_BOR_BAND_UINT64 , - GxB_BOR_BXOR_UINT8 , GxB_BOR_BXOR_UINT16 , GxB_BOR_BXOR_UINT32 , GxB_BOR_BXOR_UINT64 , - GxB_BOR_BXNOR_UINT8 , GxB_BOR_BXNOR_UINT16 , GxB_BOR_BXNOR_UINT32 , GxB_BOR_BXNOR_UINT64 , +GrB_Info GxB_Vector_reduce_FC64 // c = accum (c, reduce_to_scalar (u)) +( + GxB_FC64_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - GxB_BAND_BOR_UINT8 , GxB_BAND_BOR_UINT16 , GxB_BAND_BOR_UINT32 , GxB_BAND_BOR_UINT64 , - GxB_BAND_BAND_UINT8 , GxB_BAND_BAND_UINT16 , GxB_BAND_BAND_UINT32 , GxB_BAND_BAND_UINT64 , - GxB_BAND_BXOR_UINT8 , GxB_BAND_BXOR_UINT16 , GxB_BAND_BXOR_UINT32 , GxB_BAND_BXOR_UINT64 , - GxB_BAND_BXNOR_UINT8 , GxB_BAND_BXNOR_UINT16 , GxB_BAND_BXNOR_UINT32 , GxB_BAND_BXNOR_UINT64 , +GrB_Info GrB_Vector_reduce_UDT // c = accum (c, reduce_to_scalar (u)) +( + void *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - GxB_BXOR_BOR_UINT8 , GxB_BXOR_BOR_UINT16 , GxB_BXOR_BOR_UINT32 , GxB_BXOR_BOR_UINT64 , - GxB_BXOR_BAND_UINT8 , GxB_BXOR_BAND_UINT16 , GxB_BXOR_BAND_UINT32 , GxB_BXOR_BAND_UINT64 , - GxB_BXOR_BXOR_UINT8 , GxB_BXOR_BXOR_UINT16 , GxB_BXOR_BXOR_UINT32 , GxB_BXOR_BXOR_UINT64 , - GxB_BXOR_BXNOR_UINT8 , GxB_BXOR_BXNOR_UINT16 , GxB_BXOR_BXNOR_UINT32 , GxB_BXOR_BXNOR_UINT64 , +GrB_Info GrB_Vector_reduce_Monoid_Scalar // c = accum(c,reduce_to_scalar(u)) +( + GrB_Scalar c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; - GxB_BXNOR_BOR_UINT8 , GxB_BXNOR_BOR_UINT16 , GxB_BXNOR_BOR_UINT32 , GxB_BXNOR_BOR_UINT64 , - GxB_BXNOR_BAND_UINT8 , GxB_BXNOR_BAND_UINT16 , GxB_BXNOR_BAND_UINT32 , GxB_BXNOR_BAND_UINT64 , - GxB_BXNOR_BXOR_UINT8 , GxB_BXNOR_BXOR_UINT16 , GxB_BXNOR_BXOR_UINT32 , GxB_BXNOR_BXOR_UINT64 , - GxB_BXNOR_BXNOR_UINT8 , GxB_BXNOR_BXNOR_UINT16 , GxB_BXNOR_BXNOR_UINT32 , GxB_BXNOR_BXNOR_UINT64 , +GrB_Info GrB_Vector_reduce_BinaryOp_Scalar +( + GrB_Scalar c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_BinaryOp op, // binary op to do the reduction + const GrB_Vector u, // vector to reduce + const GrB_Descriptor desc +) ; //------------------------------------------------------------------------------ -// 80 positional semirings +// reduce a matrix to a scalar //------------------------------------------------------------------------------ - // monoids: (MIN, MAX, ANY, PLUS, TIMES) x - // mult: (FIRSTI, FIRSTI1, FIRSTJ, FIRSTJ1, SECONDI, SECONDI1, SECONDJ, SECONDJ1) - // types: (INT32, INT64) - - GxB_MIN_FIRSTI_INT32, GxB_MIN_FIRSTI_INT64, - GxB_MAX_FIRSTI_INT32, GxB_MAX_FIRSTI_INT64, - GxB_ANY_FIRSTI_INT32, GxB_ANY_FIRSTI_INT64, - GxB_PLUS_FIRSTI_INT32, GxB_PLUS_FIRSTI_INT64, - GxB_TIMES_FIRSTI_INT32, GxB_TIMES_FIRSTI_INT64, - - GxB_MIN_FIRSTI1_INT32, GxB_MIN_FIRSTI1_INT64, - GxB_MAX_FIRSTI1_INT32, GxB_MAX_FIRSTI1_INT64, - GxB_ANY_FIRSTI1_INT32, GxB_ANY_FIRSTI1_INT64, - GxB_PLUS_FIRSTI1_INT32, GxB_PLUS_FIRSTI1_INT64, - GxB_TIMES_FIRSTI1_INT32, GxB_TIMES_FIRSTI1_INT64, - - GxB_MIN_FIRSTJ_INT32, GxB_MIN_FIRSTJ_INT64, - GxB_MAX_FIRSTJ_INT32, GxB_MAX_FIRSTJ_INT64, - GxB_ANY_FIRSTJ_INT32, GxB_ANY_FIRSTJ_INT64, - GxB_PLUS_FIRSTJ_INT32, GxB_PLUS_FIRSTJ_INT64, - GxB_TIMES_FIRSTJ_INT32, GxB_TIMES_FIRSTJ_INT64, +// Reduce entries in a matrix to a scalar, c = accum (c, reduce_to_scalar(A)) - GxB_MIN_FIRSTJ1_INT32, GxB_MIN_FIRSTJ1_INT64, - GxB_MAX_FIRSTJ1_INT32, GxB_MAX_FIRSTJ1_INT64, - GxB_ANY_FIRSTJ1_INT32, GxB_ANY_FIRSTJ1_INT64, - GxB_PLUS_FIRSTJ1_INT32, GxB_PLUS_FIRSTJ1_INT64, - GxB_TIMES_FIRSTJ1_INT32, GxB_TIMES_FIRSTJ1_INT64, +GrB_Info GrB_Matrix_reduce_BOOL // c = accum (c, reduce_to_scalar (A)) +( + bool *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; - GxB_MIN_SECONDI_INT32, GxB_MIN_SECONDI_INT64, - GxB_MAX_SECONDI_INT32, GxB_MAX_SECONDI_INT64, - GxB_ANY_SECONDI_INT32, GxB_ANY_SECONDI_INT64, - GxB_PLUS_SECONDI_INT32, GxB_PLUS_SECONDI_INT64, - GxB_TIMES_SECONDI_INT32, GxB_TIMES_SECONDI_INT64, +GrB_Info GrB_Matrix_reduce_INT8 // c = accum (c, reduce_to_scalar (A)) +( + int8_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; - GxB_MIN_SECONDI1_INT32, GxB_MIN_SECONDI1_INT64, - GxB_MAX_SECONDI1_INT32, GxB_MAX_SECONDI1_INT64, - GxB_ANY_SECONDI1_INT32, GxB_ANY_SECONDI1_INT64, - GxB_PLUS_SECONDI1_INT32, GxB_PLUS_SECONDI1_INT64, - GxB_TIMES_SECONDI1_INT32, GxB_TIMES_SECONDI1_INT64, +GrB_Info GrB_Matrix_reduce_UINT8 // c = accum (c, reduce_to_scalar (A)) +( + uint8_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; - GxB_MIN_SECONDJ_INT32, GxB_MIN_SECONDJ_INT64, - GxB_MAX_SECONDJ_INT32, GxB_MAX_SECONDJ_INT64, - GxB_ANY_SECONDJ_INT32, GxB_ANY_SECONDJ_INT64, - GxB_PLUS_SECONDJ_INT32, GxB_PLUS_SECONDJ_INT64, - GxB_TIMES_SECONDJ_INT32, GxB_TIMES_SECONDJ_INT64, +GrB_Info GrB_Matrix_reduce_INT16 // c = accum (c, reduce_to_scalar (A)) +( + int16_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; - GxB_MIN_SECONDJ1_INT32, GxB_MIN_SECONDJ1_INT64, - GxB_MAX_SECONDJ1_INT32, GxB_MAX_SECONDJ1_INT64, - GxB_ANY_SECONDJ1_INT32, GxB_ANY_SECONDJ1_INT64, - GxB_PLUS_SECONDJ1_INT32, GxB_PLUS_SECONDJ1_INT64, - GxB_TIMES_SECONDJ1_INT32, GxB_TIMES_SECONDJ1_INT64 ; +GrB_Info GrB_Matrix_reduce_UINT16 // c = accum (c, reduce_to_scalar (A)) +( + uint16_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; -//------------------------------------------------------------------------------ -// GrB_* semirings -//------------------------------------------------------------------------------ +GrB_Info GrB_Matrix_reduce_INT32 // c = accum (c, reduce_to_scalar (A)) +( + int32_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; -// The v1.3 C API for GraphBLAS adds the following 124 predefined semirings, -// with GrB_* names. They are identical to 124 GxB_* semirings defined above, -// with the same name, except that GrB_LXNOR_LOR_SEMIRING_BOOL is identical to -// GxB_EQ_LOR_BOOL (since GrB_EQ_BOOL == GrB_LXNOR). The old names are listed -// below alongside each new name; the new GrB_* names are preferred. +GrB_Info GrB_Matrix_reduce_UINT32 // c = accum (c, reduce_to_scalar (A)) +( + uint32_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; -// 12 kinds of GrB_* semirings are available for all 10 real non-boolean types: +GrB_Info GrB_Matrix_reduce_INT64 // c = accum (c, reduce_to_scalar (A)) +( + int64_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; - // PLUS_TIMES, PLUS_MIN, - // MIN_PLUS, MIN_TIMES, MIN_FIRST, MIN_SECOND, MIN_MAX, - // MAX_PLUS, MAX_TIMES, MAX_FIRST, MAX_SECOND, MAX_MIN +GrB_Info GrB_Matrix_reduce_UINT64 // c = accum (c, reduce_to_scalar (A)) +( + uint64_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; -// and 4 semirings for boolean only: +GrB_Info GrB_Matrix_reduce_FP32 // c = accum (c, reduce_to_scalar (A)) +( + float *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; - // LOR_LAND, LAND_LOR, LXOR_LAND, LXNOR_LOR. +GrB_Info GrB_Matrix_reduce_FP64 // c = accum (c, reduce_to_scalar (A)) +( + double *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; -// GxB_* semirings corresponding to the equivalent GrB_* semiring are -// historical. +GrB_Info GxB_Matrix_reduce_FC32 // c = accum (c, reduce_to_scalar (A)) +( + GxB_FC32_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; -GB_GLOBAL GrB_Semiring +GrB_Info GxB_Matrix_reduce_FC64 // c = accum (c, reduce_to_scalar (A)) +( + GxB_FC64_t *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; - //-------------------------------------------------------------------------- - // 20 semirings with PLUS monoids - //-------------------------------------------------------------------------- +GrB_Info GrB_Matrix_reduce_UDT // c = accum (c, reduce_to_scalar (A)) +( + void *c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; - // PLUS_TIMES semirings for all 10 real, non-boolean types: - GrB_PLUS_TIMES_SEMIRING_INT8, // GxB_PLUS_TIMES_INT8 - GrB_PLUS_TIMES_SEMIRING_INT16, // GxB_PLUS_TIMES_INT16 - GrB_PLUS_TIMES_SEMIRING_INT32, // GxB_PLUS_TIMES_INT32 - GrB_PLUS_TIMES_SEMIRING_INT64, // GxB_PLUS_TIMES_INT64 - GrB_PLUS_TIMES_SEMIRING_UINT8, // GxB_PLUS_TIMES_UINT8 - GrB_PLUS_TIMES_SEMIRING_UINT16, // GxB_PLUS_TIMES_UINT16 - GrB_PLUS_TIMES_SEMIRING_UINT32, // GxB_PLUS_TIMES_UINT32 - GrB_PLUS_TIMES_SEMIRING_UINT64, // GxB_PLUS_TIMES_UINT64 - GrB_PLUS_TIMES_SEMIRING_FP32, // GxB_PLUS_TIMES_FP32 - GrB_PLUS_TIMES_SEMIRING_FP64, // GxB_PLUS_TIMES_FP64 +GrB_Info GrB_Matrix_reduce_Monoid_Scalar // c = accum(c,reduce_to_scalar(A)) +( + GrB_Scalar c, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; - // PLUS_MIN semirings for all 10 real, non-boolean types: - GrB_PLUS_MIN_SEMIRING_INT8, // GxB_PLUS_MIN_INT8 - GrB_PLUS_MIN_SEMIRING_INT16, // GxB_PLUS_MIN_INT16 - GrB_PLUS_MIN_SEMIRING_INT32, // GxB_PLUS_MIN_INT32 - GrB_PLUS_MIN_SEMIRING_INT64, // GxB_PLUS_MIN_INT64 - GrB_PLUS_MIN_SEMIRING_UINT8, // GxB_PLUS_MIN_UINT8 - GrB_PLUS_MIN_SEMIRING_UINT16, // GxB_PLUS_MIN_UINT16 - GrB_PLUS_MIN_SEMIRING_UINT32, // GxB_PLUS_MIN_UINT32 - GrB_PLUS_MIN_SEMIRING_UINT64, // GxB_PLUS_MIN_UINT64 - GrB_PLUS_MIN_SEMIRING_FP32, // GxB_PLUS_MIN_FP32 - GrB_PLUS_MIN_SEMIRING_FP64, // GxB_PLUS_MIN_FP64 +GrB_Info GrB_Matrix_reduce_BinaryOp_Scalar +( + GrB_Scalar S, // result scalar + const GrB_BinaryOp accum, // optional accum for c=accum(c,t) + const GrB_BinaryOp op, // binary op to do the reduction + const GrB_Matrix A, // matrix to reduce + const GrB_Descriptor desc +) ; - //-------------------------------------------------------------------------- - // 50 semirings with MIN monoids - //-------------------------------------------------------------------------- +//------------------------------------------------------------------------------ +// GrB_reduce: generic matrix/vector reduction to a vector or scalar +//------------------------------------------------------------------------------ - // MIN_PLUS semirings for all 10 real, non-boolean types: - GrB_MIN_PLUS_SEMIRING_INT8, // GxB_MIN_PLUS_INT8 - GrB_MIN_PLUS_SEMIRING_INT16, // GxB_MIN_PLUS_INT16 - GrB_MIN_PLUS_SEMIRING_INT32, // GxB_MIN_PLUS_INT32 - GrB_MIN_PLUS_SEMIRING_INT64, // GxB_MIN_PLUS_INT64 - GrB_MIN_PLUS_SEMIRING_UINT8, // GxB_MIN_PLUS_UINT8 - GrB_MIN_PLUS_SEMIRING_UINT16, // GxB_MIN_PLUS_UINT16 - GrB_MIN_PLUS_SEMIRING_UINT32, // GxB_MIN_PLUS_UINT32 - GrB_MIN_PLUS_SEMIRING_UINT64, // GxB_MIN_PLUS_UINT64 - GrB_MIN_PLUS_SEMIRING_FP32, // GxB_MIN_PLUS_FP32 - GrB_MIN_PLUS_SEMIRING_FP64, // GxB_MIN_PLUS_FP64 +// GrB_reduce is a generic function that provides access to all GrB_*reduce* +// functions: - // MIN_TIMES semirings for all 10 real, non-boolean types: - GrB_MIN_TIMES_SEMIRING_INT8, // GxB_MIN_TIMES_INT8 - GrB_MIN_TIMES_SEMIRING_INT16, // GxB_MIN_TIMES_INT16 - GrB_MIN_TIMES_SEMIRING_INT32, // GxB_MIN_TIMES_INT32 - GrB_MIN_TIMES_SEMIRING_INT64, // GxB_MIN_TIMES_INT64 - GrB_MIN_TIMES_SEMIRING_UINT8, // GxB_MIN_TIMES_UINT8 - GrB_MIN_TIMES_SEMIRING_UINT16, // GxB_MIN_TIMES_UINT16 - GrB_MIN_TIMES_SEMIRING_UINT32, // GxB_MIN_TIMES_UINT32 - GrB_MIN_TIMES_SEMIRING_UINT64, // GxB_MIN_TIMES_UINT64 - GrB_MIN_TIMES_SEMIRING_FP32, // GxB_MIN_TIMES_FP32 - GrB_MIN_TIMES_SEMIRING_FP64, // GxB_MIN_TIMES_FP64 +// reduce matrix to vector: +// GrB_Matrix_reduce_Monoid (w,mask,acc,mo,A,d) // w = acc (w,reduce(A)) +// GrB_Matrix_reduce_BinaryOp (w,mask,acc,op,A,d) // w = acc (w,reduce(A)) - // MIN_FIRST semirings for all 10 real, non-boolean types: - GrB_MIN_FIRST_SEMIRING_INT8, // GxB_MIN_FIRST_INT8 - GrB_MIN_FIRST_SEMIRING_INT16, // GxB_MIN_FIRST_INT16 - GrB_MIN_FIRST_SEMIRING_INT32, // GxB_MIN_FIRST_INT32 - GrB_MIN_FIRST_SEMIRING_INT64, // GxB_MIN_FIRST_INT64 - GrB_MIN_FIRST_SEMIRING_UINT8, // GxB_MIN_FIRST_UINT8 - GrB_MIN_FIRST_SEMIRING_UINT16, // GxB_MIN_FIRST_UINT16 - GrB_MIN_FIRST_SEMIRING_UINT32, // GxB_MIN_FIRST_UINT32 - GrB_MIN_FIRST_SEMIRING_UINT64, // GxB_MIN_FIRST_UINT64 - GrB_MIN_FIRST_SEMIRING_FP32, // GxB_MIN_FIRST_FP32 - GrB_MIN_FIRST_SEMIRING_FP64, // GxB_MIN_FIRST_FP64 +// reduce matrix to scalar: +// GrB_Vector_reduce_[SCALAR] (c,acc,monoid,u,d) // c = acc (c,reduce(u)) +// GrB_Matrix_reduce_[SCALAR] (c,acc,monoid,A,d) // c = acc (c,reduce(A)) +// GrB_Vector_reduce_Monoid_Scalar (s,acc,monoid,u,d) // s = acc (s,reduce(u)) +// GrB_Matrix_reduce_Monoid_Scalar (s,acc,monoid,A,d) // s = acc (s,reduce(A)) +// GrB_Vector_reduce_BinaryOp_Scalar (s,acc,op,u,d) // s = acc (s,reduce(u)) +// GrB_Matrix_reduce_BinaryOp_Scalar (s,acc,op,A,d) // s = acc (s,reduce(A)) - // MIN_SECOND semirings for all 10 real, non-boolean types: - GrB_MIN_SECOND_SEMIRING_INT8, // GxB_MIN_SECOND_INT8 - GrB_MIN_SECOND_SEMIRING_INT16, // GxB_MIN_SECOND_INT16 - GrB_MIN_SECOND_SEMIRING_INT32, // GxB_MIN_SECOND_INT32 - GrB_MIN_SECOND_SEMIRING_INT64, // GxB_MIN_SECOND_INT64 - GrB_MIN_SECOND_SEMIRING_UINT8, // GxB_MIN_SECOND_UINT8 - GrB_MIN_SECOND_SEMIRING_UINT16, // GxB_MIN_SECOND_UINT16 - GrB_MIN_SECOND_SEMIRING_UINT32, // GxB_MIN_SECOND_UINT32 - GrB_MIN_SECOND_SEMIRING_UINT64, // GxB_MIN_SECOND_UINT64 - GrB_MIN_SECOND_SEMIRING_FP32, // GxB_MIN_SECOND_FP32 - GrB_MIN_SECOND_SEMIRING_FP64, // GxB_MIN_SECOND_FP64 +#if GxB_STDC_VERSION >= 201112L +#define GB_REDUCE_TO_SCALAR(kind,c,op) \ + _Generic \ + ( \ + (c), \ + GB_PCASES (GrB, GB_CONCAT ( kind, _reduce,, )), \ + default: \ + _Generic \ + ( \ + (op), \ + GrB_BinaryOp : \ + GB_CONCAT (GrB,_,kind,_reduce_BinaryOp_Scalar),\ + default: GB_CONCAT (GrB,_,kind,_reduce_Monoid_Scalar) \ + ) \ + ) - // MIN_MAX semirings for all 10 real, non-boolean types: - GrB_MIN_MAX_SEMIRING_INT8, // GxB_MIN_MAX_INT8 - GrB_MIN_MAX_SEMIRING_INT16, // GxB_MIN_MAX_INT16 - GrB_MIN_MAX_SEMIRING_INT32, // GxB_MIN_MAX_INT32 - GrB_MIN_MAX_SEMIRING_INT64, // GxB_MIN_MAX_INT64 - GrB_MIN_MAX_SEMIRING_UINT8, // GxB_MIN_MAX_UINT8 - GrB_MIN_MAX_SEMIRING_UINT16, // GxB_MIN_MAX_UINT16 - GrB_MIN_MAX_SEMIRING_UINT32, // GxB_MIN_MAX_UINT32 - GrB_MIN_MAX_SEMIRING_UINT64, // GxB_MIN_MAX_UINT64 - GrB_MIN_MAX_SEMIRING_FP32, // GxB_MIN_MAX_FP32 - GrB_MIN_MAX_SEMIRING_FP64, // GxB_MIN_MAX_FP64 +#define GrB_reduce(arg1,arg2,arg3,arg4,...) \ + _Generic \ + ( \ + (arg4), \ + GrB_Vector : GB_REDUCE_TO_SCALAR (Vector, arg1, arg3), \ + GrB_Matrix : GB_REDUCE_TO_SCALAR (Matrix, arg1, arg3), \ + GrB_Monoid : GrB_Matrix_reduce_Monoid , \ + GrB_BinaryOp : GrB_Matrix_reduce_BinaryOp \ + ) \ + (arg1, arg2, arg3, arg4, __VA_ARGS__) +#endif - //-------------------------------------------------------------------------- - // 50 semirings with MAX monoids - //-------------------------------------------------------------------------- +//============================================================================== +// GrB_transpose: matrix transpose +//============================================================================== - // MAX_PLUS semirings for all 10 real, non-boolean types - GrB_MAX_PLUS_SEMIRING_INT8, // GxB_MAX_PLUS_INT8 - GrB_MAX_PLUS_SEMIRING_INT16, // GxB_MAX_PLUS_INT16 - GrB_MAX_PLUS_SEMIRING_INT32, // GxB_MAX_PLUS_INT32 - GrB_MAX_PLUS_SEMIRING_INT64, // GxB_MAX_PLUS_INT64 - GrB_MAX_PLUS_SEMIRING_UINT8, // GxB_MAX_PLUS_UINT8 - GrB_MAX_PLUS_SEMIRING_UINT16, // GxB_MAX_PLUS_UINT16 - GrB_MAX_PLUS_SEMIRING_UINT32, // GxB_MAX_PLUS_UINT32 - GrB_MAX_PLUS_SEMIRING_UINT64, // GxB_MAX_PLUS_UINT64 - GrB_MAX_PLUS_SEMIRING_FP32, // GxB_MAX_PLUS_FP32 - GrB_MAX_PLUS_SEMIRING_FP64, // GxB_MAX_PLUS_FP64 +GrB_Info GrB_transpose // C = accum (C, A') +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_Matrix A, // first input: matrix A + const GrB_Descriptor desc // descriptor for C, Mask, and A +) ; - // MAX_TIMES semirings for all 10 real, non-boolean types: - GrB_MAX_TIMES_SEMIRING_INT8, // GxB_MAX_TIMES_INT8 - GrB_MAX_TIMES_SEMIRING_INT16, // GxB_MAX_TIMES_INT16 - GrB_MAX_TIMES_SEMIRING_INT32, // GxB_MAX_TIMES_INT32 - GrB_MAX_TIMES_SEMIRING_INT64, // GxB_MAX_TIMES_INT64 - GrB_MAX_TIMES_SEMIRING_UINT8, // GxB_MAX_TIMES_UINT8 - GrB_MAX_TIMES_SEMIRING_UINT16, // GxB_MAX_TIMES_UINT16 - GrB_MAX_TIMES_SEMIRING_UINT32, // GxB_MAX_TIMES_UINT32 - GrB_MAX_TIMES_SEMIRING_UINT64, // GxB_MAX_TIMES_UINT64 - GrB_MAX_TIMES_SEMIRING_FP32, // GxB_MAX_TIMES_FP32 - GrB_MAX_TIMES_SEMIRING_FP64, // GxB_MAX_TIMES_FP64 +//============================================================================== +// GrB_kronecker: Kronecker product +//============================================================================== - // MAX_FIRST semirings for all 10 real, non-boolean types: - GrB_MAX_FIRST_SEMIRING_INT8, // GxB_MAX_FIRST_INT8 - GrB_MAX_FIRST_SEMIRING_INT16, // GxB_MAX_FIRST_INT16 - GrB_MAX_FIRST_SEMIRING_INT32, // GxB_MAX_FIRST_INT32 - GrB_MAX_FIRST_SEMIRING_INT64, // GxB_MAX_FIRST_INT64 - GrB_MAX_FIRST_SEMIRING_UINT8, // GxB_MAX_FIRST_UINT8 - GrB_MAX_FIRST_SEMIRING_UINT16, // GxB_MAX_FIRST_UINT16 - GrB_MAX_FIRST_SEMIRING_UINT32, // GxB_MAX_FIRST_UINT32 - GrB_MAX_FIRST_SEMIRING_UINT64, // GxB_MAX_FIRST_UINT64 - GrB_MAX_FIRST_SEMIRING_FP32, // GxB_MAX_FIRST_FP32 - GrB_MAX_FIRST_SEMIRING_FP64, // GxB_MAX_FIRST_FP64 +// GxB_kron is historical; use GrB_kronecker instead +GrB_Info GxB_kron // C = accum(C,kron(A,B)) (historical) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix Mask, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // defines '*' for T=kron(A,B) + const GrB_Matrix A, // first input: matrix A + const GrB_Matrix B, // second input: matrix B + const GrB_Descriptor desc // descriptor for C, Mask, A, and B +) ; - // MAX_SECOND semirings for all 10 real, non-boolean types: - GrB_MAX_SECOND_SEMIRING_INT8, // GxB_MAX_SECOND_INT8 - GrB_MAX_SECOND_SEMIRING_INT16, // GxB_MAX_SECOND_INT16 - GrB_MAX_SECOND_SEMIRING_INT32, // GxB_MAX_SECOND_INT32 - GrB_MAX_SECOND_SEMIRING_INT64, // GxB_MAX_SECOND_INT64 - GrB_MAX_SECOND_SEMIRING_UINT8, // GxB_MAX_SECOND_UINT8 - GrB_MAX_SECOND_SEMIRING_UINT16, // GxB_MAX_SECOND_UINT16 - GrB_MAX_SECOND_SEMIRING_UINT32, // GxB_MAX_SECOND_UINT32 - GrB_MAX_SECOND_SEMIRING_UINT64, // GxB_MAX_SECOND_UINT64 - GrB_MAX_SECOND_SEMIRING_FP32, // GxB_MAX_SECOND_FP32 - GrB_MAX_SECOND_SEMIRING_FP64, // GxB_MAX_SECOND_FP64 +GrB_Info GrB_Matrix_kronecker_BinaryOp // C = accum (C, kron(A,B)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix M, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_BinaryOp op, // defines '*' for T=kron(A,B) + const GrB_Matrix A, // first input: matrix A + const GrB_Matrix B, // second input: matrix B + const GrB_Descriptor desc // descriptor for C, M, A, and B +) ; - // MAX_MIN semirings for all 10 real, non-boolean types: - GrB_MAX_MIN_SEMIRING_INT8, // GxB_MAX_MIN_INT8 - GrB_MAX_MIN_SEMIRING_INT16, // GxB_MAX_MIN_INT16 - GrB_MAX_MIN_SEMIRING_INT32, // GxB_MAX_MIN_INT32 - GrB_MAX_MIN_SEMIRING_INT64, // GxB_MAX_MIN_INT64 - GrB_MAX_MIN_SEMIRING_UINT8, // GxB_MAX_MIN_UINT8 - GrB_MAX_MIN_SEMIRING_UINT16, // GxB_MAX_MIN_UINT16 - GrB_MAX_MIN_SEMIRING_UINT32, // GxB_MAX_MIN_UINT32 - GrB_MAX_MIN_SEMIRING_UINT64, // GxB_MAX_MIN_UINT64 - GrB_MAX_MIN_SEMIRING_FP32, // GxB_MAX_MIN_FP32 - GrB_MAX_MIN_SEMIRING_FP64, // GxB_MAX_MIN_FP64 +GrB_Info GrB_Matrix_kronecker_Monoid // C = accum (C, kron(A,B)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix M, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_Monoid monoid, // defines '*' for T=kron(A,B) + const GrB_Matrix A, // first input: matrix A + const GrB_Matrix B, // second input: matrix B + const GrB_Descriptor desc // descriptor for C, M, A, and B +) ; - //-------------------------------------------------------------------------- - // 4 boolean semirings: - //-------------------------------------------------------------------------- +GrB_Info GrB_Matrix_kronecker_Semiring // C = accum (C, kron(A,B)) +( + GrB_Matrix C, // input/output matrix for results + const GrB_Matrix M, // optional mask for C, unused if NULL + const GrB_BinaryOp accum, // optional accum for Z=accum(C,T) + const GrB_Semiring semiring, // defines '*' for T=kron(A,B) + const GrB_Matrix A, // first input: matrix A + const GrB_Matrix B, // second input: matrix B + const GrB_Descriptor desc // descriptor for C, M, A, and B +) ; - GrB_LOR_LAND_SEMIRING_BOOL, // GxB_LOR_LAND_BOOL - GrB_LAND_LOR_SEMIRING_BOOL, // GxB_LAND_LOR_BOOL - GrB_LXOR_LAND_SEMIRING_BOOL, // GxB_LXOR_LAND_BOOL - GrB_LXNOR_LOR_SEMIRING_BOOL ; // GxB_EQ_LOR_BOOL (note EQ == LXNOR) +#if GxB_STDC_VERSION >= 201112L +#define GrB_kronecker(C,Mask,accum,op,A,B,desc) \ + _Generic \ + ( \ + (op), \ + GrB_Semiring : GrB_Matrix_kronecker_Semiring , \ + GrB_Monoid : GrB_Matrix_kronecker_Monoid , \ + GrB_BinaryOp : GrB_Matrix_kronecker_BinaryOp \ + ) \ + (C, Mask, accum, op, A, B, desc) +#endif //============================================================================== // GrB_*_resize: change the size of a matrix or vector //============================================================================== -#ifndef GB_CUDA_FOLDER - // If the dimensions decrease, entries that fall outside the resized matrix or // vector are deleted. @@ -9136,8 +9143,6 @@ GrB_Info GxB_Vector_resize // change the size of a vector (historical) (arg1, __VA_ARGS__) #endif -#endif // GB_CUDA_FOLDER - //============================================================================== // GxB_fprint and GxB_print: print the contents of a GraphBLAS object //============================================================================== @@ -9183,19 +9188,6 @@ GrB_Info GxB_Vector_resize // change the size of a vector (historical) // resulting output via another program. The intent of these functions is to // produce a report of the object for visual inspection. -typedef enum -{ - GxB_SILENT = 0, // nothing is printed, just check the object - GxB_SUMMARY = 1, // print a terse summary - GxB_SHORT = 2, // short description, about 30 entries of a matrix - GxB_COMPLETE = 3, // print the entire contents of the object - GxB_SHORT_VERBOSE = 4, // GxB_SHORT but with "%.15g" for doubles - GxB_COMPLETE_VERBOSE = 5 // GxB_COMPLETE but with "%.15g" for doubles -} -GxB_Print_Level ; - -#ifndef GB_CUDA_FOLDER - GrB_Info GxB_Type_fprint // print and check a GrB_Type ( GrB_Type type, // object to print and check @@ -10330,8 +10322,6 @@ GrB_Info GxB_pack_HyperHash // move Y into A->Y const GrB_Descriptor desc // unused ) ; -#endif // GB_CUDA_FOLDER - //============================================================================== // GrB import/export //============================================================================== @@ -10350,18 +10340,6 @@ GrB_Info GxB_pack_HyperHash // move Y into A->Y // No typecasting of the values is done on import or export. -// The GrB C API specification supports 3 formats: - -typedef enum -{ - GrB_CSR_FORMAT = 0, // CSR format (equiv to GxB_SPARSE with GxB_BY_ROW) - GrB_CSC_FORMAT = 1, // CSC format (equiv to GxB_SPARSE with GxB_BY_COL) - GrB_COO_FORMAT = 2 // triplet format (like input to GrB*build) -} -GrB_Format ; - -#ifndef GB_CUDA_FOLDER - GrB_Info GrB_Matrix_import_BOOL // import a GrB_BOOL matrix ( GrB_Matrix *A, // handle of matrix to create @@ -10780,8 +10758,6 @@ GrB_Info GrB_Matrix_exportHint // suggest the best export format GrB_Matrix A // matrix to export ) ; -#endif // GB_CUDA_FOLDER - //============================================================================== // serialize/deserialize //============================================================================== @@ -10891,13 +10867,6 @@ GrB_Info GrB_Matrix_exportHint // suggest the best export format free (blob) ; */ -// Currently implemented: no compression, LZ4, LZ4HC, and ZSTD -#define GxB_COMPRESSION_NONE -1 // no compression -#define GxB_COMPRESSION_DEFAULT 0 // ZSTD (level 1) -#define GxB_COMPRESSION_LZ4 1000 // LZ4 -#define GxB_COMPRESSION_LZ4HC 2000 // LZ4HC, with default level 9 -#define GxB_COMPRESSION_ZSTD 3000 // ZSTD, with default level 1 - // Most of the above methods have a level parameter that controls the tradeoff // between run time and the amount of compression obtained. Higher levels // result in a more compact result, at the cost of higher run time: @@ -10915,8 +10884,6 @@ GrB_Info GrB_Matrix_exportHint // suggest the best export format // positive but unrecognized, the default is used (GxB_COMPRESSION_ZSTD, // level 1). -#ifndef GB_CUDA_FOLDER - GrB_Info GxB_Matrix_serialize // serialize a GrB_Matrix to a blob ( // output: @@ -12063,10 +12030,8 @@ void GxB_Iterator_get_UDT (GxB_Iterator iterator, ) #endif // GB_CUDA_FOLDER - #if defined ( __cplusplus ) } #endif - #endif diff --git a/Source/Template/GB_Template.h b/Source/Template/GB_Template.h index f89ae26041..7e6af4c505 100644 --- a/Source/Template/GB_Template.h +++ b/Source/Template/GB_Template.h @@ -18,7 +18,6 @@ #include "GB_compiler.h" #include "GB_warnings.h" #include "GB_coverage.h" -#define GB_LIBRARY //------------------------------------------------------------------------------ // user-visible GraphBLAS.h diff --git a/cmake_modules/GraphBLAS_JIT_paths.cmake b/cmake_modules/GraphBLAS_JIT_paths.cmake index a132e22c2e..cd59d17cd2 100644 --- a/cmake_modules/GraphBLAS_JIT_paths.cmake +++ b/cmake_modules/GraphBLAS_JIT_paths.cmake @@ -40,7 +40,7 @@ endif ( ) if ( SUITESPARSE_HAS_CUDA AND GRAPHBLAS_USE_CUDA ) # FOR NOW: do not compile FactoryKernels when developing the CUDA kernels - set ( GRAPHBLAS_COMPACT on ) +# set ( GRAPHBLAS_COMPACT on ) endif ( ) option ( GRAPHBLAS_COMPACT "ON: do not compile FactoryKernels. OFF (default): compile FactoryKernels" OFF ) From 60e6b48d8ad09aae508958ddb55f7f489e2231bb Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 9 Apr 2024 12:17:26 -0500 Subject: [PATCH 34/76] typo in comments --- Source/GB_jitifyer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/GB_jitifyer.c b/Source/GB_jitifyer.c index 7ea125fd3f..7568b3f68d 100644 --- a/Source/GB_jitifyer.c +++ b/Source/GB_jitifyer.c @@ -2294,7 +2294,7 @@ void GB_jitifyer_table_free (bool freeall) // NOTE: this call to system(...) *cannot* be sanitized; CodeQL flags calls to // GB_jitifyer_command as security issues, but this is intentional. The JIT -// allows the end user to create arbitary user-defined types and operators, +// allows the end user to create arbitrary user-defined types and operators, // which GraphBLAS then injects into C source code of a JIT kernel created at // run time. The end user can also specify an arbitrary compiler to compile // JIT kernels. This code injection is intentional, and required for the JIT. From 8d5c7d274556d9a1f7a06bf1bd9d1fd28d4d3c19 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 9 Apr 2024 12:25:38 -0500 Subject: [PATCH 35/76] 9.1.1.beta2 --- CMakeLists.txt | 6 +++--- Doc/GraphBLAS_UserGuide.pdf | Bin 1128984 -> 1128984 bytes Doc/GraphBLAS_version.tex | 4 ++-- Include/GraphBLAS.h | 8 ++++---- README.md | 2 +- cmake_modules/GraphBLAS_JIT_paths.cmake | 2 +- cmake_modules/GraphBLAS_version.cmake | 4 ++-- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f09ea1fd91..8229506f9d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,8 +41,8 @@ if ( NOT BUILD_SHARED_LIBS ) endif ( ) # CUDA is under development for now, and not deployed in production: -# set ( GRAPHBLAS_USE_CUDA OFF ) - set ( GRAPHBLAS_USE_CUDA ON ) + set ( GRAPHBLAS_USE_CUDA OFF ) +# set ( GRAPHBLAS_USE_CUDA ON ) include ( SuiteSparsePolicy ) @@ -60,7 +60,7 @@ endif ( ) if ( SUITESPARSE_HAS_CUDA AND GRAPHBLAS_USE_CUDA ) # FOR NOW: do not compile FactoryKernels when developing the CUDA kernels -# set ( GRAPHBLAS_COMPACT ON ) + set ( GRAPHBLAS_COMPACT ON ) message ( STATUS "GraphBLAS CUDA JIT: enabled") enable_language ( CUDA ) set ( GRAPHBLAS_HAS_CUDA ON ) diff --git a/Doc/GraphBLAS_UserGuide.pdf b/Doc/GraphBLAS_UserGuide.pdf index b5a7413035eb4cdcb0d3b7608a04ea381b1f1561..9413d2712453ed23119a21ad6b7b2c914cb8a262 100644 GIT binary patch delta 1662 zcmajVdpr}00>E+RwPD`x*Dwmn8Dr*^t09lJJlC{1#L1%@aXezOY%#eW30)0qUL7SO zbEh<~F;Sd6mUJj8m94|D)?BAK`{(|B|M>p#`+R5RNQAkG%snoIG(~$>AGRJf*}Ze=7PwnU@?$d6pO{}hRkN< zc>bdmk~Gg)y^hUEvgr8de9pD4t)wD)1q$7*J>YM;!nH)l>YhBLaBnqDo^R0cB&b|h zK+4rJEc%`me(n%)A>c-Ftpr+HjWKRMO+(||vzgFQ7G)K?)RQate5}m>w;p}K{g#y3 z$6?BlF_i$Lj)9=ljBpBT&~&9w(s|YS$wkiHKaAg)frn{N>tDZlizBL5^3~8P=f5BK ze$cAQeVuft5PmTqxrVlU{`tS(p`S7o5nt@w84><;1I;R8VVI@t0Un&1p_5{uR!)0H zICB{9M&hMK^1AX{JK@pyruo)#OJ_U~w@+eaPmN$bnU7iwT^f1BN-#^j%BBb~5c6v~ zCKcH;r9DMDgfb}mR?Tg{E{$AdnU^j*$avJ|ta74}0C|Q-}#mDnsy_8@L zKikVRf=cDfF~BP?30Y1M^WoEdF$(|;buNUJQz#E!{g`Qi0llBO^B5z3UKlu=t(=oF z=GkumzJW)7!Tv!lP5%Wr zpJ~P04N}%O95>ZZzH9<4O#h??TtQIC9Wk2^k{x3;o`!SY%U^Z=50)mQJCUkf4yhrc zC#aU=)ys?8zD2QaS+Eg$M*FKoTCT87DBFvuTvdDVsmYcbHx-@%7Cs%(7%;l`%#ygA z$-orpuZ3n2)ORSkuk@QrF#6oQz!Ns(qKMUGU{&IuzW(<5pl-LFG)YNH;Gd_YmzoyP&Z&uJ??%07KeD4Ah|ND`FRRn36}W zxS31JLLG65wGZgSWMG*{Csc;W_SLI$#MLN~bm#DuKSkGes}}ctD^vZ`&&R$$!4N}9 zOrPr)+%N$nc-GTajGcg(_Uye;(uB5Oe1Lh8xr`~tP}Hhdh(8Tk`FP|?pNtVi;boI& z&iqk7Uwd<_VYTo8dt14O*S06aVK)&!z3o04d1Cl!?9E#GNf?duucaDd<0IR~?;7sS zbL10;Q|gL?36tWQVkB)n_cDQz>EyL%IhrBJZy-92-u(SKY`fWbWOjTqgHkYLWqk`c zXv6VK5uOuI<_fnhvw~1ee3-}idp43g^844`V&IGFvERJp=vvgfK7hnb z>gTFa$xQjaGjVK`;49I?0r#9V>FK5JuHPESxzfJTmLC8IVkJwuTB*5t&Gil;$7ZO8 zWh*ITVHE}jsi|?IyXg7ZJQT+g)s^jY--*6!Ei6#8h~@mLEHx9py_=62vOK zs}1htdmU38N{SY-7xOmzVFq?4RvJ!&$(3C!Kr?xJMm7gFZF<5aFOI)&NB6lrLq;&1mC$mCy)BNZp?K${OIT} zYnt-rM<9!S1&e{^2mw0BSxExq1fcmDN4 zDM3Kyr$AhdLMCR5xR`@4FAhda;?$~yixE>jPe?6MG=lYec*R!sLy24$Yu&iof~-wu z*-}`xvQhvkIVpK51t~=-B`Kg3NJ?2sMM_l)ETtx;&ScqY9DS$c=IG=EbAngW zzhLTsG!sB5xGNmxf`TKCqfo9$S7(1;B+L))>;{MXAQ31hKj&lSp8s!Q4rpmcAO0J^ C#tJV0 delta 1662 zcmajVZ9LNn0Kjn!*|1F>(?yNQ^Tx2r$HOprXu6y8Fq(&)40RKE%KY=tQDMka9+oxF za!7g1<3dJdb{-DP(}huybCQd@y}8%-;``$F`TUA@?TdEpo3=E7)G;!TqrvbEvF2;E zbTku3Dqi({f#W-Xfz_#*@ALOG#0(#6t%6_!uNiO_%g3 z>sb0O=vuLoC3gdA5R`xIAZz>ZR0I6Ch#GKo;B*bEi&O!Ak~~szTJc+^|EViKde%0J zk&$i))^^Wz=P@8v6+F>20oX@OQ0#U&EfkmGPto@6U*Pk)=gnY8^J(05^d8RUrn`ZK zr}I)utf~tzec$v+UUo<;;7BQGAOPb_&YFuregDNQoGhEkm5+1V z4AOJFblBj`&!<1TS*7#ZKjp%aSWd&C!KVA?@xnL$NzLBsB65p?zx=-qJBC6JXG0ZL(EiE;Csbf3;)npnBV39hrge5{& zk@hpX2L!{2Tyvo&+&Q0Q+N$+!PPX+SA8;!Po9#`}RnfZ;2Q@;`>cRX_A0p~knSkOf zdm7nk3BhV#LCDfUXOM5^MVWJ}RO;ktnW=%KOmYmzt5hU=Xo@3WzC3f0`8j2$QQ$?a zh|T>wKDh?2Uk%k#afePGjG54T@~r%)R^{fCez!zdTDZnJ|C+=wR|)jgQ1k{;OR}bF zw-J_g*SBnskZ%tV3S7Zsl952Fa)tr1ls&War0iAtdxWT&(@DM3kc zdIa9x;&9DeVzYu%qLMbdzZ^VKmh-uR|sRt`#UyGxcJS_mG#F9`kPuAIn3^J=@NzdY{9lZ zK~-5Tm(`E&u6UU0p*A8tY3S#*9s4*$23!FbFK1)ejNcH{%?(ybLS>_p%?eAzB5&<_ zXJvZ2M5_2q0Oao3pBD3xR&fyg#OmP5*2)d3B4yX7$Me8LyjWBT@RVp)`KKDr(LH{9 z-CmYQr5K%fGyxxOv4s6hFCbKD``LRz8T3Eh@LoGuIW2OO2Bs6^{b_uwu;S(Me&xaT z3z=jYYb@Q0TtT3$N4ta$>njfa^T7Yn_#9>RK=et^RS|a_4}IY_G(-IPUs%CyP$V(_ z#<`CLBW%)v0odEy?aKnu&^G;uvl9huNv*C?}HdSM`T!qEEuvBd}&9;EfdlPN40f7tW-Z8 z@AAD(Tds{KoedCxcDa_1q^rWLb{dk5RjtGJW6CW#?m*u)$sZqw6#b03zrHP^_F=K> zM(xe+;o(K)hS9`*(%VzYl6H4e#BoFBAGyyxZK9Cxu#3>Dj+Jyfqi~v^1Uf|a`$%!? zY*&YMbzmmW>>$j>-$q|X%c}a9RhvU7T2r20W>ro=&iiXF_s4#iDoUuaJ#*+^%*)48 zI^AiJ`#|Tdx(0LDG(h9UDE0U$)jJI>e{j!_r#88=dnr-r?1^RSrEO}x>E+JJN@TsXterp|eF^wShi^Z4o#^-xiO#g_v z9o}73_nmd-qmBL7v4_)SBUQtsJ=#VU`S9vQpo3&qiL}Y+KzXm?c-i1!pVi4*y`{m| zFGj!;sh2;l;6WRh&Zb#`df8V$71Y?7+@oS=tcNERJsR0)pD^^9|7jA)^m$*1+Jnod zywFK|p(83JCIk`^7m^T?6gnm(B?K0N2uTac2+0aTgy$4pRWrf4L#@UxWM zcmGA30$45xY=<;Oq0Q}(I6FMX7-Nsaqik_lV+RLgoGsoKi^kxrPFw!p($;lc?y~m3 D% Date: Tue, 9 Apr 2024 12:30:42 -0500 Subject: [PATCH 36/76] 9.1.1 user guide and changelog: Apr 9 --- Doc/ChangeLog | 2 +- Doc/GraphBLAS_UserGuide.pdf | Bin 1128984 -> 1128977 bytes Doc/GraphBLAS_UserGuide.tex | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/ChangeLog b/Doc/ChangeLog index 3ba9af37d8..5908d015cc 100644 --- a/Doc/ChangeLog +++ b/Doc/ChangeLog @@ -1,4 +1,4 @@ -Apr 7, 2024: version 9.1.1 +Apr 9, 2024: version 9.1.1 * JIT: sanitizing the JIT cache path, better burble for compiler errors * GrB_get/GrB_set: better handling of concurrent get/set between different diff --git a/Doc/GraphBLAS_UserGuide.pdf b/Doc/GraphBLAS_UserGuide.pdf index 9413d2712453ed23119a21ad6b7b2c914cb8a262..327ab43bce5b05a53927a6c9d87f3eea52682dad 100644 GIT binary patch delta 10956 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 delta 10969 zcmcI|XIPU#@Fz(KEf54G^dbTR5Wq#cHVtw=bhbmW`8rY`*>G9XIDMuKHxs^KIlIAeeivX z`;_;o?o;DwRz7BL>re?dG4;?;l4E-HC=%k>FCIOM^Gz}syeR}V1>9dI`Xlab`omp; zZj`1575U=ldw6+WbsdL$Gv^4cSy&D~v3j7L@jKd3^@hb9gT0k2?xma-cSGm`U5?I+q!ortdd$Pgw%*0P z-U^N}?%8_3^&Q0x=BBr?4=$ZM(s>v1VrHwYXQe1k`aU+kdi>{3v0`n)FXPKxYa7c7 zH}{2Jy%7x_SM%4_Uth_;bw#W(wMs$S=KZ~+)GrCO;6Mn|k1M+8Ts|k{?fot4W%Chpl>EadMp( zv5Vbtx_SggPE(0pHu+&kfzsEY0Z}tAu=mtX-4w^|I;UhSs$P-0@R@tDscB{3ZepN} z3UqLxEVP>C6j#x}R z)=9m|-Og2c_UPv88dYJ3{!Z4V2`B$8Z;5LT!c1V>r*EDp!)UiDI9#LaOO_R{YC?>l zNp2%W&&zWCaHNNy99)@-aLc^{R7eyCm>H@y^@oDL#Qt>S5`_JE}kE zUe`{J8+)p1d*=J8?MG3w><51vMyl;REN>^d%q%cmaGZH2V)wxWaE2U%X6;wqZt%4kzwW@$aev`23}i;G_P z02UmsHmgh>4g@whl+==`K=?>hFtLGTf1GhY{7@%side0(+T`YD50 z{+;(Lr{O=9pMSYSC={IWIculRF8w|;qJ2yD=j&IjjpRa&S6oF|U)E5KV8!EEC@TgR z#LodATkz^MZa%I7f&Okz-q{>)D5(=U2WUtQLTa?6Mn`H;QloF;9Jn;30Ft;Nk-bI5 z!27q;#6->DN^K$~Bc*mzO-lNfnwpHP3_?>~RzgDxAtxoJDl4rfsew@DRs27S*wKjV zyZN{WqIl)xWV2(3fWjDoyof-Xh_Ld#<>Zf!ksMeRh`B%-|rel)cms+f=230JgF4^zazQ!#O65%xx34jFL( z@d*%~601zqvbkkbN*hx+#>7rr2schZvchA73nYQXD9WJ?lO80~gcJTf){l@93|xo0 zK~NeB4})|4IkXE?OQwn^p%Vl_f{$rqJQs>(XhAq64vP1{b70?h_#i0P<=w6=-FlxE zoce}iP1Qyf^IrD{D13;!c)(->e8N5vPQFevA5BPvY2=nEl0l0biU*AMA zaeol9@xcJ^Jpapi8Y6W^W@)hjs2!AW-wqKt!G*^_u-4io@Int3r6uwSz6m*9r6L^! zSABd0_E|mt8?zbty zOqg}nd799q@}n%UMJGFM;ecwsgrYCii9YhxjkVe8x|qa1+K3;?3mOXgy|vkAC`pO) z>r!j;yg1s(q$f_|i9^9fvs04Y_G!h-jy$EV<6jI=^5chX{k7S-L*YZmLTvk_Z9&`L zk0o`02G`P~u(T0x>1udV!~Uw_LSZDs#Raz?yPzWee#U}>N(b1( z_6w&pR*OeLyQB$LKka@wC|Y*hEFWdsR2%6vZ8sG^=A96+rYwVwU%}r*DA{qXX|i-N z^GrZ>Z>~_`cnrj|471aVDtWxI&83R>VQM2zT~6~%sGkHzY;%2{`Ur-&bZKtwk1&26 zRfE;nIHH{}L^LEm6e-Xc>3#9+iHB%`+6eJQgTDU}&|1ctiL_M1l6BQgIP3l&avTMp zF3Bj@h6457gcDl(Yb^s$yZ-*)jkU*4M^?ckYe=E~1Z0rx3BNW_|Iz=-tG z>yigU2nyN=Oc*yjZJ~@L+C&I^@}26&+Pne^2c{=Y)Ry>NLR-&T>T_*23t=lDJe8zJ z1=;=8W1)#;-s~Z0k!%U7ww!4EtSehl(|F zJ5B%_nCvm^0S4c@ij@Gcy@0X5|X+C+XQ~GESt(a+A zj2VhmNl7(~Jx_IxJcGM}6YM@D3n(4Ix)3?p)$$BY@+nyeuDkz0);l_(K`$RGofMpA zYJ_4mp!nXs`VnJ$YvhKKUL~lrc5L2V=_Z$YLhGx!$OKb5$MMxa_4ZG3pK8Z~){IPE zZqr8CMSs8Y*n@TdSOCvoMoSuSCj`p6StPVZ)2)-2r3}`Ng@qVaF|#w0I1uk7Q&3Os z*k(y(D!XAq>!7*uF$roUtvIliBeTR>(6q#`mJo)cd&AC?He$7=r&epMc}<7Dm~E@L zGAvP;$vC_$n>HZ2RwUO8P#$(mO^-9()}?sV0E!DM@0duiChP_V)zX*v zy)Bqlt<>aFotu)Y$qv8Fsph5SRiX$@AdEV2l{=wsyfv|YI2Ofc2TZ&;rgb8WOL0%PlXuHnKp_x zaqRY)jiRA+?A((t%sU-^`^=v zDHu_#QbEa>zkZr~q7;<*hHDMk&087P_q-64nyJ4+F)vojkt&5*`IoUsV11|ggKodj zPg2*eYz@$g$_q6Oz(#Z`<2g{4LI?562t&zAt3D8sm)(7Hl-5l}_I|m`yfHMU8$%{PQ{)>T|C7@3iHBhDFQc zM#lLR?gSE=dW5w|?n+R~D(3_(5?uQ)&y&0be;6EV3h^Mt4zqu->S1 z4bj@@g1t_>f@=|kRL9*!D94qj8B4A;^wfsjjJQKc?oqp$(7K>8SMRYRK?L@l4z8Bc;2Ks;R|zSO!&UQ)h|gdW1xx;OI(w+~FP*Vxmsdh{xoXu=>{NgA zSvN}FY_sro3G2QHPlIWAW#GG>TFbA+4JN;ykY>o54a`B`A+2$RyrA&IbJCyoWvdHw zIp^8Aj8{ooUKcPkA$8`Xg*2NzIhn+`yGeHj+Id z7?f?6;20_2Pk<1wbTj*XNsEO4jV+OXUBF%J$EWvlbkGac@{m7Un4|skMP*NI!P0(h zM~7fGfi`sL=@7T^aSTuD6+p`7ZzB-`Wu| zUGqdnC?s|Ybu#qIEI3Y#6peemuv3oo>%No_XsM34R3D@s0?^ju@817#?!urTa)$b>!s_NT#It zy9A(hr*thBJ~p@(v_{V5NWb*U10#xaC)S6vzgN8`?u4x&A9u_5O154Hv^t89QyzB! z(3f`O)rbp$q(%P{IR!Sx!Uk0y`-zEHBK9g=qd z^qnGiK!+XkM{f^1K2nM)qqk#|>1`v4zd$TJ&Ht69H)nU`IH8!SGB)>dU`O|LBl^Cc zn%%uwX9$Z;^LW=sm{=n^1Q1Ci?GpmsR&p}fR+Q)rV1YDq8veIxzW4>-i2u?V?5A@- z`Km4SeKOqkzt>UsfW(R=+Sk&rQAQCj86S-G@4QhN zU6t*4`@1}BTA|FJjFTdsNF_^?7W+SV2IJl#Bn#>3kVA9Zk_k&d#o~m~Y_g6pTR;F& zq?y7ej-zl!(O0qZS~OQ_CwUHeb_XH{(A43Lrkn&HbVSvX!8$>;Qa(nxI|}@7`;WEk{Me?XHyyJ;6nt{3B`*& zTr{j5TdPZ5^`D6bskZPXuA{X5T%yi|`k!QR*o56Q1PcGgMp z>!cd{y!U6R_nb~ohg)ATfi5^sdS|p?G+JSNUfSl-SYRAf>LSh}1TgOr9%G95aF^nJ zf0y`(SOlQ%S!Zz0(IxZ8oXS~+My zKb!G;ULz;rC7t=Lix~~Fz4^XQbe+AK+6TZTuhjk@h*mAZOdVM4x61W-?(nX)_08;rfbYw@$I$u%`=<$d-?zUU`_v!M>x?|OE{^7ss=lt=@M l5pj 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 Date: Tue, 9 Apr 2024 16:46:51 -0500 Subject: [PATCH 37/76] full test coverage --- Tcov/log_Apr9.txt | 205 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 Tcov/log_Apr9.txt diff --git a/Tcov/log_Apr9.txt b/Tcov/log_Apr9.txt new file mode 100644 index 0000000000..c10784201a --- /dev/null +++ b/Tcov/log_Apr9.txt @@ -0,0 +1,205 @@ + +---------------------------------------------- [malloc] [cover] +09-Apr 12:37:53 test169 17.6 sec 550: 24393 of 25108 2.8% 31.20/s +09-Apr 12:37:55 test250 1.4 sec 374: 24019 of 25108 4.3% 263.66/s +09-Apr 12:37:57 test250 2.1 sec 57: 23962 of 25108 4.6% 26.83/s +09-Apr 12:37:57 test279 0.1 sec 119: 23843 of 25108 5.0% 1944.64/s +09-Apr 12:37:57 test278 0.1 sec 48: 23795 of 25108 5.2% 801.24/s +09-Apr 12:37:57 test277 0.1 sec 38: 23757 of 25108 5.4% 714.34/s +09-Apr 12:37:57 test276 0.1 sec 1626: 22131 of 25108 11.9% 32257.42/s +09-Apr 12:37:57 test275 0.0 sec 117: 22014 of 25108 12.3% 2491.64/s +09-Apr 12:37:57 test274 0.0 sec 129: 21885 of 25108 12.8% 2795.78/s +09-Apr 12:37:58 test273 0.1 sec 114: 21771 of 25108 13.3% 764.89/s +09-Apr 12:37:58 test272 0.0 sec 11: 21760 of 25108 13.3% 236.49/s +09-Apr 12:37:58 test271 0.0 sec 497: 21263 of 25108 15.3% 10313.56/s +09-Apr 12:37:58 test270 0.0 sec 286: 20977 of 25108 16.5% 6094.70/s +09-Apr 12:37:58 test269 0.0 sec 83: 20894 of 25108 16.8% 1711.09/s +09-Apr 12:37:58 test268 0.1 sec 5: 20889 of 25108 16.8% 68.85/s +09-Apr 12:38:00 test145 2.1 sec 210: 20679 of 25108 17.6% 100.02/s +09-Apr 12:38:00 test145 0.0 sec 1: 20678 of 25108 17.6% 26.99/s +09-Apr 12:38:00 test145 0.0 sec 18: 20660 of 25108 17.7% 883.31/s +09-Apr 12:38:01 test145 0.0 sec 4: 20656 of 25108 17.7% 245.64/s +09-Apr 12:38:02 test145 1.5 sec 34: 20622 of 25108 17.9% 22.25/s +09-Apr 12:38:02 test145 0.0 sec 3: 20619 of 25108 17.9% 169.97/s +09-Apr 12:38:03 test240 1.1 sec 74: 20542 of 25108 18.2% 68.86/s +09-Apr 12:38:04 test240 0.3 sec 1: 20541 of 25108 18.2% 3.45/s +09-Apr 12:38:05 test237 0.9 sec 40: 20501 of 25108 18.3% 42.56/s +09-Apr 12:38:07 test237 2.6 sec 2: 20499 of 25108 18.4% 0.77/s +09-Apr 12:38:08 test237 0.1 sec 18: 20481 of 25108 18.4% 144.19/s +09-Apr 12:38:08 test237 0.0 sec 6: 20475 of 25108 18.5% 186.32/s +09-Apr 12:38:08 test237 0.1 sec 4: 20471 of 25108 18.5% 42.23/s +09-Apr 12:38:09 test267 0.7 sec 8: 20463 of 25108 18.5% 12.22/s +09-Apr 12:38:09 test267 0.0 sec 1: 20462 of 25108 18.5% 1336.90/s +09-Apr 12:38:09 test265 0.5 sec 36: 20426 of 25108 18.6% 76.37/s +09-Apr 12:38:09 test264 0.0 sec 173: 20253 of 25108 19.3% 3523.49/s +09-Apr 12:38:10 test263 0.8 sec 13: 20240 of 25108 19.4% 16.60/s +09-Apr 12:38:10 test262 0.0 sec 22: 20218 of 25108 19.5% 445.50/s +09-Apr 12:38:11 test261 0.1 sec 22: 20196 of 25108 19.6% 379.15/s +09-Apr 12:38:11 test260 0.1 sec 3: 20193 of 25108 19.6% 59.66/s +09-Apr 12:38:13 test259 2.4 sec 4: 20189 of 25108 19.6% 1.70/s +09-Apr 12:38:14 test258 0.3 sec 20: 20169 of 25108 19.7% 62.60/s +09-Apr 12:38:14 test257 0.2 sec 41: 20128 of 25108 19.8% 170.14/s +09-Apr 12:38:14 test255 0.0 sec 8: 20120 of 25108 19.9% 167.92/s +09-Apr 12:38:14 test254 0.1 sec 14: 20106 of 25108 19.9% 231.67/s +09-Apr 12:38:19 test254 4.9 sec 20: 20086 of 25108 20.0% 4.05/s +09-Apr 12:38:20 test254 0.1 sec 1: 20085 of 25108 20.0% 8.79/s +09-Apr 12:38:20 test253 0.1 sec 9: 20076 of 25108 20.0% 64.46/s +09-Apr 12:38:20 test252 0.1 sec 7: 20069 of 25108 20.1% 131.43/s +09-Apr 12:39:49 test251 88.6 sec 434: 19635 of 25108 21.8% 4.90/s +09-Apr 12:43:19 test251 209.7 sec 76: 19559 of 25108 22.1% 0.36/s +09-Apr 12:43:20 test249 1.2 sec 24: 19535 of 25108 22.2% 19.22/s +09-Apr 12:43:20 test247 0.0 sec 24: 19511 of 25108 22.3% 1393.32/s +09-Apr 12:43:32 test246 11.2 sec 69: 19442 of 25108 22.6% 6.19/s +09-Apr 12:43:50 test01 18.2 sec 1340: 18102 of 25108 27.9% 73.70/s +09-Apr 12:43:51 test245 1.0 sec 34: 18068 of 25108 28.0% 33.66/s +09-Apr 12:43:51 test245 0.0 sec 8: 18060 of 25108 28.1% 169.07/s +09-Apr 12:43:52 test199 0.0 sec 1: 18059 of 25108 28.1% 216.68/s +09-Apr 12:43:52 test83 0.1 sec 10: 18049 of 25108 28.1% 197.60/s +09-Apr 12:43:52 test210 0.0 sec 7: 18042 of 25108 28.1% 2393.16/s +09-Apr 12:43:52 test165 0.0 sec 1: 18041 of 25108 28.1% 213.54/s +09-Apr 12:43:52 test219 0.1 sec 9: 18032 of 25108 28.2% 178.94/s +09-Apr 12:43:53 test219 0.3 sec 3: 18029 of 25108 28.2% 10.67/s +09-Apr 12:43:53 test241 0.1 sec 10: 18019 of 25108 28.2% 94.25/s +09-Apr 12:43:53 test220 0.1 sec 10: 18009 of 25108 28.3% 119.33/s +09-Apr 12:43:53 test211 0.0 sec 15: 17994 of 25108 28.3% 505.31/s +09-Apr 12:43:54 test202 0.1 sec 67: 17927 of 25108 28.6% 719.83/s +09-Apr 12:43:54 test202 0.0 sec 1: 17926 of 25108 28.6% 22.82/s +09-Apr 12:43:57 test152 3.1 sec 827: 17099 of 25108 31.9% 269.85/s +09-Apr 12:44:02 test152 4.5 sec 13: 17086 of 25108 31.9% 2.92/s +09-Apr 12:45:20 test152 77.9 sec 245: 16841 of 25108 32.9% 3.15/s +09-Apr 12:45:20 test222 0.1 sec 18: 16823 of 25108 33.0% 159.94/s +09-Apr 12:45:21 test256 0.6 sec 58: 16765 of 25108 33.2% 93.02/s +09-Apr 12:45:24 test186 2.9 sec 44: 16721 of 25108 33.4% 15.06/s +09-Apr 12:45:25 test186 0.5 sec 3: 16718 of 25108 33.4% 6.16/s +09-Apr 12:45:25 test186(0) 0.4 sec 5: 16713 of 25108 33.4% 12.01/s +09-Apr 12:45:26 test150 0.2 sec 36: 16677 of 25108 33.6% 160.28/s +09-Apr 12:45:26 test239 0.1 sec 15: 16662 of 25108 33.6% 177.97/s +09-Apr 12:45:27 test239 0.9 sec 2: 16660 of 25108 33.6% 2.15/s +09-Apr 12:45:27 test235 0.0 sec 4: 16656 of 25108 33.7% 99.39/s +09-Apr 12:45:28 test226 0.0 sec 8: 16648 of 25108 33.7% 640.97/s +09-Apr 12:45:28 test223 0.0 sec 2: 16646 of 25108 33.7% 63.34/s +09-Apr 12:45:28 test204 0.1 sec 14: 16632 of 25108 33.8% 144.60/s +09-Apr 12:45:29 test203 0.0 sec 9: 16623 of 25108 33.8% 181.43/s +09-Apr 12:45:29 test183 0.0 sec 12: 16611 of 25108 33.8% 439.09/s +09-Apr 12:45:29 test179 0.1 sec 15: 16596 of 25108 33.9% 162.45/s +09-Apr 12:45:31 test179 1.9 sec 4: 16592 of 25108 33.9% 2.08/s +09-Apr 12:45:32 test174 0.0 sec 10: 16582 of 25108 34.0% 235.24/s +09-Apr 12:45:32 test155 0.1 sec 41: 16541 of 25108 34.1% 373.30/s +09-Apr 12:45:32 test136 0.1 sec 55: 16486 of 25108 34.3% 378.89/s +09-Apr 12:45:33 test02 0.7 sec 247: 16239 of 25108 35.3% 366.39/s +09-Apr 12:45:34 test109 0.4 sec 10: 16229 of 25108 35.4% 23.00/s +09-Apr 12:45:34 test109 0.0 sec 4: 16225 of 25108 35.4% 1133.14/s +09-Apr 12:45:35 test109 0.4 sec 8: 16217 of 25108 35.4% 21.55/s +09-Apr 12:45:35 test04 0.1 sec 15: 16202 of 25108 35.5% 190.06/s +09-Apr 12:45:35 test207 0.0 sec 2: 16200 of 25108 35.5% 598.27/s +09-Apr 12:45:36 test221 0.0 sec 2: 16198 of 25108 35.5% 296.60/s +09-Apr 12:45:36 test162 0.1 sec 3: 16195 of 25108 35.5% 54.87/s +09-Apr 12:45:39 test159 2.7 sec 72: 16123 of 25108 35.8% 26.90/s +09-Apr 12:45:39 test09 0.0 sec 5: 16118 of 25108 35.8% 619.58/s +09-Apr 12:45:40 test132 0.1 sec 8: 16110 of 25108 35.8% 113.36/s +09-Apr 12:45:53 test141 13.4 sec 549: 15561 of 25108 38.0% 40.83/s +09-Apr 12:45:55 testc2(1,1) 1.3 sec 20: 15541 of 25108 38.1% 15.48/s +09-Apr 12:46:02 testc2(1,1) 6.7 sec 4: 15537 of 25108 38.1% 0.60/s +09-Apr 12:46:02 test214 0.0 sec 3: 15534 of 25108 38.1% 335.76/s +09-Apr 12:46:02 test213 0.0 sec 2: 15532 of 25108 38.1% 200.40/s +09-Apr 12:46:05 test206 2.7 sec 221: 15311 of 25108 39.0% 82.52/s +09-Apr 12:46:23 test206 17.3 sec 24: 15287 of 25108 39.1% 1.39/s +09-Apr 12:46:23 test212 0.0 sec 8: 15279 of 25108 39.1% 416.71/s +09-Apr 12:46:24 test212 0.2 sec 2: 15277 of 25108 39.2% 10.47/s +09-Apr 12:46:25 test128 0.3 sec 41: 15236 of 25108 39.3% 125.92/s +09-Apr 12:46:25 test82 0.1 sec 16: 15220 of 25108 39.4% 179.99/s +09-Apr 12:46:29 test229 3.2 sec 9: 15211 of 25108 39.4% 2.84/s +09-Apr 12:46:30 test229 1.1 sec 1: 15210 of 25108 39.4% 0.92/s +09-Apr 12:46:31 test144 0.6 sec 2: 15208 of 25108 39.4% 3.62/s +09-Apr 12:47:55 test14 83.4 sec 662: 14546 of 25108 42.1% 7.93/s +09-Apr 12:52:23 test14 267.6 sec 118: 14428 of 25108 42.5% 0.44/s +09-Apr 12:52:32 test180 8.8 sec 128: 14300 of 25108 43.0% 14.50/s +09-Apr 12:52:36 test236 3.6 sec 74: 14226 of 25108 43.3% 20.67/s +09-Apr 12:52:39 test232 2.4 sec 22: 14204 of 25108 43.4% 9.03/s +09-Apr 12:52:59 test228 20.1 sec 27: 14177 of 25108 43.5% 1.34/s +09-Apr 12:55:04 test154 124.6 sec 1506: 12671 of 25108 49.5% 12.09/s +09-Apr 13:01:50 test154 405.3 sec 2: 12669 of 25108 49.5% 0.00/s +09-Apr 13:02:05 test238 14.7 sec 54: 12615 of 25108 49.8% 3.67/s +09-Apr 13:03:16 test238 70.8 sec 9: 12606 of 25108 49.8% 0.13/s +09-Apr 13:05:00 test151b 103.0 sec 126: 12480 of 25108 50.3% 1.22/s +09-Apr 13:05:03 test184 3.1 sec 38: 12442 of 25108 50.4% 12.32/s +09-Apr 13:05:17 test191 13.4 sec 21: 12421 of 25108 50.5% 1.56/s +09-Apr 13:05:48 test191 30.1 sec 3: 12418 of 25108 50.5% 0.10/s +09-Apr 13:13:21 test188 453.5 sec 212: 12206 of 25108 51.4% 0.47/s +09-Apr 13:15:59 test188 156.2 sec 3: 12203 of 25108 51.4% 0.02/s +09-Apr 13:16:05 test224 5.2 sec 24: 12179 of 25108 51.5% 4.62/s +09-Apr 13:16:08 test196 2.5 sec 11: 12168 of 25108 51.5% 4.36/s +09-Apr 13:16:13 test209 5.5 sec 20: 12148 of 25108 51.6% 3.64/s +09-Apr 13:16:33 test104 18.9 sec 40: 12108 of 25108 51.8% 2.12/s +09-Apr 13:16:41 test189 8.0 sec 1: 12107 of 25108 51.8% 0.13/s +09-Apr 13:17:54 test194 72.0 sec 5: 12102 of 25108 51.8% 0.07/s +09-Apr 13:18:10 test76 16.0 sec 15: 12087 of 25108 51.9% 0.94/s +09-Apr 13:18:53 test244 42.5 sec 17: 12070 of 25108 51.9% 0.40/s +[malloc debugging turned off] +09-Apr 13:18:53 test201 0.0 sec 3: 12067 of 25108 51.9% 631.05/s +09-Apr 13:18:54 test225 0.2 sec 1: 12066 of 25108 51.9% 6.62/s +09-Apr 13:18:55 test176 0.1 sec 5: 12061 of 25108 52.0% 65.53/s +09-Apr 13:18:55 test208 0.0 sec 5: 12056 of 25108 52.0% 312.32/s +09-Apr 13:18:56 test216 0.1 sec 3: 12053 of 25108 52.0% 47.38/s +09-Apr 13:19:22 test142 25.7 sec 631: 11422 of 25108 54.5% 24.55/s +09-Apr 13:24:03 test142 281.1 sec 10: 11412 of 25108 54.5% 0.04/s +09-Apr 13:24:30 test142 25.5 sec 2: 11410 of 25108 54.6% 0.08/s +09-Apr 13:24:31 test137 0.3 sec 3: 11407 of 25108 54.6% 8.92/s +09-Apr 13:24:31 test137 0.0 sec 2: 11405 of 25108 54.6% 251.51/s +09-Apr 13:24:32 test139 0.4 sec 2: 11403 of 25108 54.6% 5.44/s +09-Apr 13:24:33 test172 0.1 sec 3: 11400 of 25108 54.6% 35.11/s +09-Apr 13:24:34 test148 0.7 sec 4: 11396 of 25108 54.6% 6.12/s +09-Apr 13:24:35 test157 0.6 sec 12: 11384 of 25108 54.7% 19.05/s +09-Apr 13:24:36 test182 1.0 sec 5: 11379 of 25108 54.7% 5.19/s +09-Apr 13:24:38 test108 0.6 sec 2: 11377 of 25108 54.7% 3.35/s +09-Apr 13:24:38 test108 0.4 sec 2: 11375 of 25108 54.7% 5.38/s +09-Apr 13:24:40 test130 0.8 sec 22: 11353 of 25108 54.8% 26.56/s +09-Apr 13:24:41 test124 0.2 sec 3: 11350 of 25108 54.8% 13.94/s +09-Apr 13:24:41 test138 0.1 sec 1: 11349 of 25108 54.8% 10.47/s +09-Apr 13:24:47 test227 5.0 sec 27: 11322 of 25108 54.9% 5.43/s +09-Apr 13:25:17 test125 30.1 sec 618: 10704 of 25108 57.4% 20.55/s +09-Apr 13:28:38 test234 200.6 sec 385: 10319 of 25108 58.9% 1.92/s +09-Apr 13:34:31 test234 351.7 sec 3: 10316 of 25108 58.9% 0.01/s +09-Apr 13:35:20 test242 48.4 sec 77: 10239 of 25108 59.2% 1.59/s +09-Apr 13:35:22 test173 1.6 sec 11: 10228 of 25108 59.3% 7.09/s +09-Apr 13:35:26 test200 3.3 sec 10: 10218 of 25108 59.3% 3.05/s +09-Apr 13:35:27 test197 0.2 sec 1: 10217 of 25108 59.3% 5.63/s +09-Apr 13:35:29 test84 1.3 sec 18: 10199 of 25108 59.4% 13.37/s +09-Apr 13:35:35 test19b 5.9 sec 59: 10140 of 25108 59.6% 9.92/s +09-Apr 13:35:36 test133 0.4 sec 2: 10138 of 25108 59.6% 4.73/s +09-Apr 13:35:41 test80 4.0 sec 12: 10126 of 25108 59.7% 3.02/s +09-Apr 13:36:50 test23 68.3 sec 148: 9978 of 25108 60.3% 2.17/s +09-Apr 13:36:52 test135 1.9 sec 7: 9971 of 25108 60.3% 3.61/s +09-Apr 13:38:10 test160 77.6 sec 24: 9947 of 25108 60.4% 0.31/s +09-Apr 13:38:16 test54 5.4 sec 20: 9927 of 25108 60.5% 3.73/s +09-Apr 13:38:18 test129 1.2 sec 4: 9923 of 25108 60.5% 3.34/s +09-Apr 13:38:21 test69 2.0 sec 6: 9917 of 25108 60.5% 3.05/s +09-Apr 13:39:56 test230 94.8 sec 114: 9803 of 25108 61.0% 1.20/s +09-Apr 14:14:51 test74 2094.0 sec 6637: 3166 of 25108 87.4% 3.17/s +09-Apr 14:27:42 test127 770.4 sec 1703: 1463 of 25108 94.2% 2.21/s +09-Apr 14:27:46 test19 3.3 sec 12: 1451 of 25108 94.2% 3.67/s +09-Apr 14:27:50 test11 3.7 sec 3: 1448 of 25108 94.2% 0.81/s +09-Apr 14:27:54 test215 3.0 sec 1: 1447 of 25108 94.2% 0.33/s +09-Apr 14:28:12 test193 17.5 sec 5: 1442 of 25108 94.3% 0.29/s +09-Apr 14:30:56 test195 163.6 sec 39: 1403 of 25108 94.4% 0.24/s +09-Apr 14:31:22 test243 25.4 sec 7: 1396 of 25108 94.4% 0.28/s +09-Apr 14:31:34 test29 11.0 sec 3: 1393 of 25108 94.5% 0.27/s +09-Apr 14:31:36 testc2(0,0) 1.3 sec 7: 1386 of 25108 94.5% 5.37/s +09-Apr 14:31:56 testc2(0,0) 19.6 sec 1: 1385 of 25108 94.5% 0.05/s +09-Apr 14:31:57 testc4(0) 0.5 sec 4: 1381 of 25108 94.5% 8.25/s +09-Apr 14:32:13 testc7(0) 14.9 sec 3: 1378 of 25108 94.5% 0.20/s +09-Apr 14:32:19 testcc(1) 5.1 sec 1: 1377 of 25108 94.5% 0.20/s +09-Apr 14:32:28 test187 8.7 sec 3: 1374 of 25108 94.5% 0.35/s +09-Apr 14:32:35 test192 5.8 sec 1: 1373 of 25108 94.5% 0.17/s +09-Apr 14:32:54 test181 18.8 sec 4: 1369 of 25108 94.5% 0.21/s +09-Apr 14:34:47 test185 112.5 sec 6: 1363 of 25108 94.6% 0.05/s +09-Apr 14:35:32 test53 44.3 sec 4: 1359 of 25108 94.6% 0.09/s +09-Apr 14:36:24 test17 50.7 sec 27: 1332 of 25108 94.7% 0.53/s +09-Apr 14:43:58 test231 452.8 sec 162: 1170 of 25108 95.3% 0.36/s +09-Apr 15:34:01 test10 3002.5 sec 970: 200 of 25108 99.2% 0.32/s +09-Apr 15:52:36 test75b 1089.8 sec 155: 45 of 25108 99.8% 0.14/s +09-Apr 15:54:08 test21b 90.9 sec 26: 19 of 25108 99.9% 0.29/s +09-Apr 15:55:02 testca(1) 53.0 sec 5: 14 of 25108 99.9% 0.09/s +09-Apr 15:56:59 test81 115.9 sec 1: 13 of 25108 99.9% 0.01/s +09-Apr 16:03:14 test18 374.8 sec 13: all 25108 full 100% 0.03/s +[malloc debugging turned back on] From a44b5cfbf26c13f5378c1db40e6e0b9a56f4d192 Mon Sep 17 00:00:00 2001 From: Vidith Madhu Date: Thu, 11 Apr 2024 01:57:57 -0500 Subject: [PATCH 38/76] progress on unop apply kernel; small nit fixes in rowscale/colscale --- CUDA/GB_cuda_apply.hpp | 60 +++++++++++ CUDA/GB_cuda_apply_unop.cpp | 30 ++++++ CUDA/GB_cuda_apply_unop_jit.cpp | 0 .../GB_jit_kernel_cuda_apply_bind1st.cu | 4 +- .../GB_jit_kernel_cuda_apply_unop.cu | 79 ++++++++++++--- .../JitKernels/GB_jit_kernel_cuda_colscale.cu | 99 +++++++++---------- .../JitKernels/GB_jit_kernel_cuda_rowscale.cu | 1 + Source/GB_apply_op.c | 13 ++- Source/GB_jitifyer.h | 7 +- 9 files changed, 225 insertions(+), 68 deletions(-) create mode 100644 CUDA/GB_cuda_apply.hpp create mode 100644 CUDA/GB_cuda_apply_unop.cpp create mode 100644 CUDA/GB_cuda_apply_unop_jit.cpp diff --git a/CUDA/GB_cuda_apply.hpp b/CUDA/GB_cuda_apply.hpp new file mode 100644 index 0000000000..6445196c1a --- /dev/null +++ b/CUDA/GB_cuda_apply.hpp @@ -0,0 +1,60 @@ +//------------------------------------------------------------------------------ +// GB_cuda_apply.hpp: CPU definitions for CUDA apply operations +//------------------------------------------------------------------------------ + +// SPDX-License-Identifier: Apache-2.0 + +//------------------------------------------------------------------------------ + +#ifndef GB_CUDA_EWISE_H +#define GB_CUDA_EWISE_H + +#include "GB_cuda.hpp" + +GrB_Info GB_cuda_apply_unop_jit +( + // output: + GrB_Matrix C, + // input: + GrB_Matrix D, + GrB_Matrix B, + GrB_BinaryOp binaryop, + bool flipxy, + // CUDA stream and launch parameters: + cudaStream_t stream, + int32_t gridsz, + int32_t blocksz +) ; + +GrB_Info GB_cuda_apply_bind1st_jit +( + // output: + GrB_Matrix C, + // input: + GrB_Matrix A, + GrB_Matrix D, + GrB_BinaryOp binaryop, + bool flipxy, + // CUDA stream and launch parameters: + cudaStream_t stream, + int32_t gridsz, + int32_t blocksz +) ; + +GrB_Info GB_cuda_apply_bind2nd_jit +( + // output: + GrB_Matrix C, + // input: + GrB_Matrix A, + GrB_Matrix D, + GrB_BinaryOp binaryop, + bool flipxy, + // CUDA stream and launch parameters: + cudaStream_t stream, + int32_t gridsz, + int32_t blocksz +) ; + +#endif + diff --git a/CUDA/GB_cuda_apply_unop.cpp b/CUDA/GB_cuda_apply_unop.cpp new file mode 100644 index 0000000000..3710fb9a67 --- /dev/null +++ b/CUDA/GB_cuda_apply_unop.cpp @@ -0,0 +1,30 @@ +#include "GB_cuda_apply.hpp" + +#undef GB_FREE_WORKSPACE +#define GB_FREE_WORKSPACE ; + +#undef GB_FREE_ALL +#define GB_FREE_ALL ; + +#define BLOCK_SIZE 512 +#define LOG2_BLOCK_SIZE 9 + +GrB_Info GB_cuda_apply +( + GB_void *Cx, + const GrB_Matrix D, + const GrB_Matrix B, + const GrB_Semiring semiring, + const bool flipxy +) +{ + // FIXME: use the stream pool + cudaStream_t stream ; + CUDA_OK (cudaStreamCreate (&stream)) ; + + + CUDA_OK (cudaStreamSynchronize (stream)) ; + CUDA_OK (cudaStreamDestroy (stream)) ; + return GrB_SUCCESS ; + +} \ No newline at end of file diff --git a/CUDA/GB_cuda_apply_unop_jit.cpp b/CUDA/GB_cuda_apply_unop_jit.cpp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind1st.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind1st.cu index 9948c516a5..ee98dcdb46 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind1st.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind1st.cu @@ -2,14 +2,14 @@ using namespace cooperative_groups ; __global__ void GB_cuda_apply_bind1st_kernel ( - GB_void *Cx, + GB_void *Cx_out, GB_void *scalarx, GrB_Matrix B, ) { const GB_X_TYPE x = * ((GB_X_TYPE *) scalarx) ; // gets scalarx [0] const GB_B_TYPE *__restrict__ Bx = (GB_B_TYPE *) B->x ; - GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *) Cx ; + GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *) Cx_out ; const int8_t *__restrict__ Bb = B->b ; diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_unop.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_unop.cu index 7b287feb62..cbc4f83319 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_unop.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_unop.cu @@ -1,32 +1,82 @@ using namespace cooperative_groups ; +#define log2_chunk_size 10 +#define chunk_size 1024 + __global__ void GB_cuda_apply_unop_kernel ( - GB_void *Cx, + GB_void *Cx_out, GB_void *thunk_value, GrB_Matrix A ) { - GB_A_NHELD (nvals) ; - GB_Y_TYPE thunk ; // uninitialized if no thunk, not used by macro + GB_A_NHELD (anz) ; + GB_Y_TYPE thunk ; + + const GB_A_TYPE *__restrict__ Ax = (GB_A_TYPE *) A->x ; + const int64_t *__restrict__ Ai = (int64_t *) A->i ; + const int64_t *__restrict__ Ah = (int64_t *) A->h ; + const int64_t *__restrict__ Ap = (int64_t *) A->p ; + const int8_t *__restrict__ Ab = (int8_t *) A->b ; + + GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *) Cx_out; + + #define A_iso GB_A_ISO - #if defined ( GB_DEPENDS_ON_Y ) + int tid = blockDim.x * blockIdx.x + threadIdx.x ; + int nthreads = blockDim.x * gridDim.x ; + + const int64_t anvec = A->nvec ; + const int64_t avlen = A->vlen ; + + #if ( GB_DEPENDS_ON_Y ) // get thunk value (of type GB_Y_TYPE) + // if there is no thunk, will remain uninitialized; ok since ignored + // by macros thunk = * ((GB_Y_TYPE *) thunk_value) ; #endif - #if defined ( GB_DEPENDS_ON_J ) - // need to do ek_slice method - #else - // can do normal method - int tid = blockDim.x * blockIdx.x + threadIdx.x ; - int nthreads = blockDim.x * gridDim.x ; - - for (int p = tid ; p < nvals ; p += nthreads) + #if ( GB_A_IS_BITMAP || GB_A_IS_FULL ) + // bitmap/full case + for (int p = tid ; p < anz ; p += nthreads) { + if (!GBB_A (Ab, p)) { continue ; } + int64_t col_idx = p / avlen ; + int64_t row_idx = p % avlen ; + GB_UNOP (Cx, p, Ax, p, A_iso, row_idx, col_idx, thunk) ; } + #else + + // sparse/hypersparse case + #if ( GB_DEPENDS_ON_J ) + // need to do ek_slice method + for (int64_t pfirst = blockIdx << log2_chunk_size ; + pfirst < anz ; + pfirst += girdDim.x << log2_chunk_size ) + { + int64_t my_chunk_size, anvec_sub1 ; + float slope ; + int64_t kfirst = GB_cuda_ek_slice_setup (Ap, anvec, anz, pfirst, + chunk_size, &my_chunk_size, &anvec_sub1, &slope) ; + + for (int64_t curr_p = threadIdx.x ; curr_p < my_chunk_size ; curr_p += blockDim.x) + { + int64_t k = GB_cuda_ek_slice_entry (curr_p, pfirst, Ap, anvec_sub1, kfirst, slope) ; + int64_t col_idx = GBH_A (Ah, k) ; + int64_t row_idx = GBI_A (Ai, pfirst + curr_p, avlen) ; + GB_UNOP (Cx, p, Ax, p, A_iso, row_idx, col_idx, thunk) ; + } + } + #else + // can do normal method + for (int p = tid ; p < anz ; p += nthreads) + { + int64_t row_idx = GBI_A (Ai, p, avlen) ; + GB_UNOP (Cx, p, Ax, p, A_iso, row_idx, /* col_idx */, thunk) ; + } + #endif #endif } @@ -36,5 +86,10 @@ extern "C" { GB_JIT_CUDA_KERNEL_APPLY_UNOP_PROTO (GB_jit_kernel) { + dim3 grid (gridsz) ; + dim3 block (blocksz) ; + + GB_cuda_apply_unop_kernel <<>> (Cx, thunk, A) ; + return (GrB_SUCCESS) ; } \ No newline at end of file diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu index b7254e8a2d..27ab3dc694 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu @@ -26,61 +26,60 @@ __global__ void GB_cuda_colscale_kernel const int64_t anvec = A->nvec ; const int64_t avlen = A->vlen ; - #if defined(GB_A_IS_BITMAP) || defined(GB_A_IS_FULL) - // bitmap/full case - int ntasks = blockDim.x * gridDim.x ; - int tid = blockIdx.x * blockDim.x + threadIdx.x ; - for (int64_t p = tid ; p < anz ; p += ntasks) - { - // ask Joe: - #ifdef GB_A_IS_BITMAP - if (!GBB_A (Ab, p)) { continue ; } - #endif - - // the pth entry in A is A(i,j) where i = p%avlen and j = p/avlen - int64_t col_idx = p / avlen ; -// int64_t row_idx = p % avlen ; - GB_DECLAREB (dii) ; - GB_GETB (dii, Dx, col_idx, ) ; - GB_DECLAREA (aij) ; - GB_GETA (aij, Ax, p, ) ; - // C has same sparsity as A; ewise op code does not change - GB_EWISEOP (Cx, p, aij, dii, 0, 0) ; - } - #else - // sparse/hypersparse case (cuda_ek_slice only works for sparse/hypersparse) - for (int64_t pfirst = blockIdx.x << log2_chunk_size ; - pfirst < anz ; - pfirst += gridDim.x << log2_chunk_size ) + #if (GB_A_IS_BITMAP || GB_A_IS_FULL) + // bitmap/full case + int ntasks = blockDim.x * gridDim.x ; + int tid = blockIdx.x * blockDim.x + threadIdx.x ; + for (int64_t p = tid ; p < anz ; p += ntasks) { - int64_t my_chunk_size, anvec_sub1 ; - float slope ; - int64_t kfirst = GB_cuda_ek_slice_setup (Ap, anvec, anz, pfirst, - chunk_size, &my_chunk_size, &anvec_sub1, &slope) ; - - // alternate: - // why not just do ek_slice_setup for one thread per block then this_thread_block.sync()? - // answer: - // better than having a syncrhonization barrier - - // question: why chunks are necessary? why not just do ek_slice_setup across all entries in one go? - // answer: the slope method is only useful for a small range of entries; non-uniform entry distributions - // can distort the usefulness of the slope (will require an exhaustive linear search) - // for a large range of entries + // ask Joe: + #ifdef GB_A_IS_BITMAP + if (!GBB_A (Ab, p)) { continue ; } + #endif - for (int64_t curr_p = threadIdx.x ; curr_p < my_chunk_size ; curr_p += blockDim.x) + // the pth entry in A is A(i,j) where i = p%avlen and j = p/avlen + int64_t col_idx = p / avlen ; + // int64_t row_idx = p % avlen ; + GB_DECLAREB (dii) ; + GB_GETB (dii, Dx, col_idx, ) ; + GB_DECLAREA (aij) ; + GB_GETA (aij, Ax, p, ) ; + // C has same sparsity as A; ewise op code does not change + GB_EWISEOP (Cx, p, aij, dii, 0, 0) ; + } + #else + // sparse/hypersparse case (cuda_ek_slice only works for sparse/hypersparse) + for (int64_t pfirst = blockIdx.x << log2_chunk_size ; + pfirst < anz ; + pfirst += gridDim.x << log2_chunk_size ) { - int64_t k = GB_cuda_ek_slice_entry (curr_p, pfirst, Ap, anvec_sub1, kfirst, slope) ; - k = GBH_A (Ah, k) ; + int64_t my_chunk_size, anvec_sub1 ; + float slope ; + int64_t kfirst = GB_cuda_ek_slice_setup (Ap, anvec, anz, pfirst, + chunk_size, &my_chunk_size, &anvec_sub1, &slope) ; + + // alternate: + // why not just do ek_slice_setup for one thread per block then this_thread_block.sync()? + // answer: + // better than having a syncrhonization barrier + + // question: why chunks are necessary? why not just do ek_slice_setup across all entries in one go? + // answer: the slope method is only useful for a small range of entries; non-uniform entry distributions + // can distort the usefulness of the slope (will require an exhaustive linear search) + // for a large range of entries - GB_DECLAREB (dii) ; - GB_GETB (dii, Dx, k, ) ; - GB_DECLAREA (aij) ; - GB_GETA (aij, Ax, pfirst + curr_p, ) ; - GB_EWISEOP (Cx, pfirst + curr_p, aij, dii, 0, 0) ; - } - } + for (int64_t curr_p = threadIdx.x ; curr_p < my_chunk_size ; curr_p += blockDim.x) + { + int64_t k = GB_cuda_ek_slice_entry (curr_p, pfirst, Ap, anvec_sub1, kfirst, slope) ; + k = GBH_A (Ah, k) ; + GB_DECLAREB (dii) ; + GB_GETB (dii, Dx, k, ) ; + GB_DECLAREA (aij) ; + GB_GETA (aij, Ax, pfirst + curr_p, ) ; + GB_EWISEOP (Cx, pfirst + curr_p, aij, dii, 0, 0) ; + } + } #endif } diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu index 3080e6fd6e..0dd05a15de 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu @@ -9,6 +9,7 @@ __global__ void GB_cuda_rowscale_kernel { const GB_A_TYPE *__restrict__ Dx = (GB_A_TYPE *) D->x ; const GB_B_TYPE *__restrict__ Bx = (GB_B_TYPE *) B->x ; + GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *) C->x ; #define D_iso GB_A_ISO diff --git a/Source/GB_apply_op.c b/Source/GB_apply_op.c index d77644f5a7..3e008f5237 100644 --- a/Source/GB_apply_op.c +++ b/Source/GB_apply_op.c @@ -180,7 +180,16 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) // via the positional kernel //---------------------------------------------------------------------- - ASSERT_OP_OK (op, "positional unop/idxunop/binop: GB_apply_op", GB0) ; + ASSERT_OP_OK (op, "positional unop/idxunop: GB_apply_op", GB0) ; + + /* + TODO: Need to put in GB_cuda_gateway.h + #if defined ( GRAPHBLAS_HAS_CUDA ) + if (GB_cuda_apply_unop_branch (ctype, A)) { + info = GB_cuda_apply_unop_jit (Cx, op, A) ; + } + #endif + */ // get A and C const int64_t *restrict Ah = A->h ; @@ -523,7 +532,7 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) // #if defined ( GRAPHBLAS_HAS_CUDA ) // if (GB_cuda_apply_binop_branch (ctype, (GrB_BinaryOp) op, A, true)) { - // info = GB_cuda_apply_bind1st_jit (Cx, scalarx, A) ; + // info = GB_cuda_apply_bind1st_jit (Cx, (GrB_BinaryOp) op, scalarx, A) ; // } // #endif diff --git a/Source/GB_jitifyer.h b/Source/GB_jitifyer.h index e4bb463cb0..5bcd37bd0e 100644 --- a/Source/GB_jitifyer.h +++ b/Source/GB_jitifyer.h @@ -184,10 +184,13 @@ typedef enum GB_JIT_CUDA_KERNEL_AXB_DOT3 = 1004, // GB_cuda_AxB_dot3 // ewise methods: - // ... GB_JIT_CUDA_KERNEL_COLSCALE = 1011, GB_JIT_CUDA_KERNEL_ROWSCALE = 1012, - // ... + GB_JIT_CUDA_KERNEL_APPLYBIND1 = 1013, + GB_JIT_CUDA_KERNEL_APPLYBIND2 = 1014, + //... (up to 15 ewise methods?) + // apply methods: + GB_JIT_CUDA_KERNEL_APPLYUNOP = 1026 } GB_jit_kcode ; From bf35d8aeff004dc61a808a2003a4d22419e4d3ea Mon Sep 17 00:00:00 2001 From: Vidith Madhu Date: Fri, 12 Apr 2024 05:08:05 -0500 Subject: [PATCH 39/76] progress on apply unop kernel; passing most LAGraph tests --- CUDA/GB_cuda_apply.hpp | 11 +- CUDA/GB_cuda_apply_unop.cpp | 20 +- CUDA/GB_cuda_apply_unop_jit.cpp | 51 +++ .../GB_jit_kernel_cuda_apply_unop.cu | 20 +- Source/GB_apply_op.c | 391 +++++++++--------- Source/GB_cuda_gateway.h | 10 + Source/Template/GB_jit_kernel_proto.h | 10 +- 7 files changed, 300 insertions(+), 213 deletions(-) diff --git a/CUDA/GB_cuda_apply.hpp b/CUDA/GB_cuda_apply.hpp index 6445196c1a..72a7717837 100644 --- a/CUDA/GB_cuda_apply.hpp +++ b/CUDA/GB_cuda_apply.hpp @@ -14,12 +14,13 @@ GrB_Info GB_cuda_apply_unop_jit ( // output: - GrB_Matrix C, + GB_void *Cx, // input: - GrB_Matrix D, - GrB_Matrix B, - GrB_BinaryOp binaryop, - bool flipxy, + const GrB_Type ctype, + const GB_Operator op, + const bool flipij, + const GrB_Matrix A, + const GB_void *ythunk, // CUDA stream and launch parameters: cudaStream_t stream, int32_t gridsz, diff --git a/CUDA/GB_cuda_apply_unop.cpp b/CUDA/GB_cuda_apply_unop.cpp index 3710fb9a67..d64b124661 100644 --- a/CUDA/GB_cuda_apply_unop.cpp +++ b/CUDA/GB_cuda_apply_unop.cpp @@ -9,19 +9,29 @@ #define BLOCK_SIZE 512 #define LOG2_BLOCK_SIZE 9 -GrB_Info GB_cuda_apply +GrB_Info GB_cuda_apply_unop ( GB_void *Cx, - const GrB_Matrix D, - const GrB_Matrix B, - const GrB_Semiring semiring, - const bool flipxy + const GrB_Type ctype, + const GB_Operator op, + const bool flipij, + const GrB_Matrix A, + const GB_void *ythunk ) { // FIXME: use the stream pool cudaStream_t stream ; CUDA_OK (cudaStreamCreate (&stream)) ; + GrB_Index anz = GB_nnz_held (A) ; + + int32_t gridsz = 1 + (anz >> LOG2_BLOCK_SIZE) ; + + GrB_Info info = GB_cuda_apply_unop_jit (Cx, ctype, op, flipij, A, + ythunk, stream, gridsz, BLOCK_SIZE) ; + + if (info == GrB_NO_VALUE) info = GrB_PANIC ; + GB_OK (info) ; CUDA_OK (cudaStreamSynchronize (stream)) ; CUDA_OK (cudaStreamDestroy (stream)) ; diff --git a/CUDA/GB_cuda_apply_unop_jit.cpp b/CUDA/GB_cuda_apply_unop_jit.cpp index e69de29bb2..8817d8e275 100644 --- a/CUDA/GB_cuda_apply_unop_jit.cpp +++ b/CUDA/GB_cuda_apply_unop_jit.cpp @@ -0,0 +1,51 @@ +#include "GB_cuda_apply.hpp" + +extern "C" +{ + typedef GB_JIT_CUDA_KERNEL_APPLY_UNOP_PROTO ((*GB_jit_dl_function)) ; +} + + +GrB_Info GB_cuda_apply_unop_jit +( + // output: + GB_void *Cx, + // input: + const GrB_Type ctype, + const GB_Operator op, + const bool flipij, + const GrB_Matrix A, + const GB_void *ythunk, + // CUDA stream and launch parameters: + cudaStream_t stream, + int32_t gridsz, + int32_t blocksz +) +{ + //-------------------------------------------------------------------------- + // encodify the problem + //-------------------------------------------------------------------------- + + GB_jit_encoding encoding ; + char *suffix ; + uint64_t hash = GB_encodify_apply (&encoding, &suffix, + GB_JIT_CUDA_KERNEL_APPLYUNOP, GxB_FULL, false, ctype, op, flipij, A) ; + + //-------------------------------------------------------------------------- + // get the kernel function pointer, loading or compiling it if needed + //-------------------------------------------------------------------------- + + void *dl_function ; + GrB_Info info = GB_jitifyer_load (&dl_function, + GB_jit_apply_family, "cuda_apply_unop", + hash, &encoding, suffix, NULL, NULL, + op, ctype, A->type, NULL) ; + if (info != GrB_SUCCESS) return (info) ; + + //-------------------------------------------------------------------------- + // call the jit kernel and return result + //-------------------------------------------------------------------------- + + GB_jit_dl_function GB_jit_kernel = (GB_jit_dl_function) dl_function ; + return (GB_jit_kernel (Cx, A, ythunk, stream, gridsz, blocksz)) ; +} \ No newline at end of file diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_unop.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_unop.cu index cbc4f83319..d9f0110b15 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_unop.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_unop.cu @@ -6,15 +6,14 @@ using namespace cooperative_groups ; __global__ void GB_cuda_apply_unop_kernel ( GB_void *Cx_out, - GB_void *thunk_value, + const GB_void *thunk, GrB_Matrix A ) { GB_A_NHELD (anz) ; - GB_Y_TYPE thunk ; - const GB_A_TYPE *__restrict__ Ax = (GB_A_TYPE *) A->x ; + const GB_A_TYPE *Ax = (GB_A_TYPE *) A->x ; const int64_t *__restrict__ Ai = (int64_t *) A->i ; const int64_t *__restrict__ Ah = (int64_t *) A->h ; const int64_t *__restrict__ Ap = (int64_t *) A->p ; @@ -32,9 +31,10 @@ __global__ void GB_cuda_apply_unop_kernel #if ( GB_DEPENDS_ON_Y ) // get thunk value (of type GB_Y_TYPE) - // if there is no thunk, will remain uninitialized; ok since ignored - // by macros - thunk = * ((GB_Y_TYPE *) thunk_value) ; + GB_Y_TYPE thunk_value = * ((GB_Y_TYPE *) thunk) ; + #else + // replace uses of thunk_value (not used) + #define thunk_value _ #endif #if ( GB_A_IS_BITMAP || GB_A_IS_FULL ) @@ -45,7 +45,7 @@ __global__ void GB_cuda_apply_unop_kernel int64_t col_idx = p / avlen ; int64_t row_idx = p % avlen ; - GB_UNOP (Cx, p, Ax, p, A_iso, row_idx, col_idx, thunk) ; + GB_UNOP (Cx, p, Ax, p, A_iso, row_idx, col_idx, thunk_value) ; } #else @@ -66,7 +66,7 @@ __global__ void GB_cuda_apply_unop_kernel int64_t k = GB_cuda_ek_slice_entry (curr_p, pfirst, Ap, anvec_sub1, kfirst, slope) ; int64_t col_idx = GBH_A (Ah, k) ; int64_t row_idx = GBI_A (Ai, pfirst + curr_p, avlen) ; - GB_UNOP (Cx, p, Ax, p, A_iso, row_idx, col_idx, thunk) ; + GB_UNOP (Cx, p, Ax, p, A_iso, row_idx, col_idx, thunk_value) ; } } #else @@ -74,7 +74,7 @@ __global__ void GB_cuda_apply_unop_kernel for (int p = tid ; p < anz ; p += nthreads) { int64_t row_idx = GBI_A (Ai, p, avlen) ; - GB_UNOP (Cx, p, Ax, p, A_iso, row_idx, /* col_idx */, thunk) ; + GB_UNOP (Cx, p, Ax, p, A_iso, row_idx, /* col_idx */, thunk_value) ; } #endif #endif @@ -89,7 +89,7 @@ GB_JIT_CUDA_KERNEL_APPLY_UNOP_PROTO (GB_jit_kernel) dim3 grid (gridsz) ; dim3 block (blocksz) ; - GB_cuda_apply_unop_kernel <<>> (Cx, thunk, A) ; + GB_cuda_apply_unop_kernel <<>> (Cx, ythunk, A) ; return (GrB_SUCCESS) ; } \ No newline at end of file diff --git a/Source/GB_apply_op.c b/Source/GB_apply_op.c index 3e008f5237..19fad68a19 100644 --- a/Source/GB_apply_op.c +++ b/Source/GB_apply_op.c @@ -182,189 +182,187 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) ASSERT_OP_OK (op, "positional unop/idxunop: GB_apply_op", GB0) ; - /* - TODO: Need to put in GB_cuda_gateway.h #if defined ( GRAPHBLAS_HAS_CUDA ) if (GB_cuda_apply_unop_branch (ctype, A)) { - info = GB_cuda_apply_unop_jit (Cx, op, A) ; + info = GB_cuda_apply_unop (Cx, ctype, op, flipij, A, (GB_void *) &thunk) ; } #endif - */ - - // get A and C - const int64_t *restrict Ah = A->h ; - const int64_t *restrict Ap = A->p ; - const int64_t *restrict Ai = A->i ; - int64_t avlen = A->vlen ; - - //---------------------------------------------------------------------- - // Cx = positional_op (A) - //---------------------------------------------------------------------- - - if (is64) - { - - //------------------------------------------------------------------ - // int64 Cx = positional_op (A) - //------------------------------------------------------------------ - - int64_t *restrict Cz = (int64_t *) Cx ; - switch (opcode) - { - - case GB_POSITIONI_unop_code : // z = position_i(A(i,j)) == i - case GB_POSITIONI1_unop_code : // z = position_i1(A(i,j)) == i+1 - case GB_ROWINDEX_idxunop_code : // z = i+thunk - #define GB_APPLY_OP(p) \ - int64_t i = GBI_A (Ai, p, avlen) ; \ - Cz [p] = (i + thunk) ; - #include "GB_apply_unop_ip.c" - break ; + + if (info == GrB_NO_VALUE) + { + // get A and C + const int64_t *restrict Ah = A->h ; + const int64_t *restrict Ap = A->p ; + const int64_t *restrict Ai = A->i ; + int64_t avlen = A->vlen ; - case GB_POSITIONJ_unop_code : // z = position_j(A(i,j)) == j - case GB_POSITIONJ1_unop_code : // z = position_j1(A(i,j)) == j+1 - case GB_COLINDEX_idxunop_code : // z = j+thunk - #define GB_APPLY_OP(p) \ - Cz [p] = (j + thunk) ; - #include "GB_apply_unop_ijp.c" - break ; + //---------------------------------------------------------------------- + // Cx = positional_op (A) + //---------------------------------------------------------------------- - case GB_DIAGINDEX_idxunop_code : // z = (j-(i+thunk) - #define GB_APPLY_OP(p) \ - int64_t i = GBI_A (Ai, p, avlen) ; \ - Cz [p] = (j - (i+thunk)) ; - #include "GB_apply_unop_ijp.c" - break ; + if (is64) + { - case GB_FLIPDIAGINDEX_idxunop_code : // z = (i-(j+thunk) - #define GB_APPLY_OP(p) \ - int64_t i = GBI_A (Ai, p, avlen) ; \ - Cz [p] = (i - (j+thunk)) ; - #include "GB_apply_unop_ijp.c" - break ; + //------------------------------------------------------------------ + // int64 Cx = positional_op (A) + //------------------------------------------------------------------ + + int64_t *restrict Cz = (int64_t *) Cx ; + switch (opcode) + { + + case GB_POSITIONI_unop_code : // z = position_i(A(i,j)) == i + case GB_POSITIONI1_unop_code : // z = position_i1(A(i,j)) == i+1 + case GB_ROWINDEX_idxunop_code : // z = i+thunk + #define GB_APPLY_OP(p) \ + int64_t i = GBI_A (Ai, p, avlen) ; \ + Cz [p] = (i + thunk) ; + #include "GB_apply_unop_ip.c" + break ; + + case GB_POSITIONJ_unop_code : // z = position_j(A(i,j)) == j + case GB_POSITIONJ1_unop_code : // z = position_j1(A(i,j)) == j+1 + case GB_COLINDEX_idxunop_code : // z = j+thunk + #define GB_APPLY_OP(p) \ + Cz [p] = (j + thunk) ; + #include "GB_apply_unop_ijp.c" + break ; + + case GB_DIAGINDEX_idxunop_code : // z = (j-(i+thunk) + #define GB_APPLY_OP(p) \ + int64_t i = GBI_A (Ai, p, avlen) ; \ + Cz [p] = (j - (i+thunk)) ; + #include "GB_apply_unop_ijp.c" + break ; + + case GB_FLIPDIAGINDEX_idxunop_code : // z = (i-(j+thunk) + #define GB_APPLY_OP(p) \ + int64_t i = GBI_A (Ai, p, avlen) ; \ + Cz [p] = (i - (j+thunk)) ; + #include "GB_apply_unop_ijp.c" + break ; + + default: ; + } - default: ; } + else if (is32) + { - } - else if (is32) - { - - //------------------------------------------------------------------ - // int32 Cx = positional_op (A) - //------------------------------------------------------------------ - - int32_t *restrict Cz = (int32_t *) Cx ; - switch (opcode) - { - - case GB_POSITIONI_unop_code : // z = position_i(A(i,j)) == i - case GB_POSITIONI1_unop_code : // z = position_i1(A(i,j)) == i+1 - case GB_ROWINDEX_idxunop_code : // z = i+thunk - #define GB_APPLY_OP(p) \ - int64_t i = GBI_A (Ai, p, avlen) ; \ - Cz [p] = (int32_t) (i + thunk) ; - #include "GB_apply_unop_ip.c" - break ; - - case GB_POSITIONJ_unop_code : // z = position_j(A(i,j)) == j - case GB_POSITIONJ1_unop_code : // z = position_j1(A(i,j)) == j+1 - case GB_COLINDEX_idxunop_code : // z = j+thunk - #define GB_APPLY_OP(p) \ - Cz [p] = (int32_t) (j + thunk) ; - #include "GB_apply_unop_ijp.c" - break ; - - case GB_DIAGINDEX_idxunop_code : // z = (j-(i+thunk) - #define GB_APPLY_OP(p) \ - int64_t i = GBI_A (Ai, p, avlen) ; \ - Cz [p] = (int32_t) (j - (i+thunk)) ; - #include "GB_apply_unop_ijp.c" - break ; - - case GB_FLIPDIAGINDEX_idxunop_code : // z = (i-(j+thunk) - #define GB_APPLY_OP(p) \ - int64_t i = GBI_A (Ai, p, avlen) ; \ - Cz [p] = (int32_t) (i - (j+thunk)) ; - #include "GB_apply_unop_ijp.c" - break ; + //------------------------------------------------------------------ + // int32 Cx = positional_op (A) + //------------------------------------------------------------------ + + int32_t *restrict Cz = (int32_t *) Cx ; + switch (opcode) + { + + case GB_POSITIONI_unop_code : // z = position_i(A(i,j)) == i + case GB_POSITIONI1_unop_code : // z = position_i1(A(i,j)) == i+1 + case GB_ROWINDEX_idxunop_code : // z = i+thunk + #define GB_APPLY_OP(p) \ + int64_t i = GBI_A (Ai, p, avlen) ; \ + Cz [p] = (int32_t) (i + thunk) ; + #include "GB_apply_unop_ip.c" + break ; + + case GB_POSITIONJ_unop_code : // z = position_j(A(i,j)) == j + case GB_POSITIONJ1_unop_code : // z = position_j1(A(i,j)) == j+1 + case GB_COLINDEX_idxunop_code : // z = j+thunk + #define GB_APPLY_OP(p) \ + Cz [p] = (int32_t) (j + thunk) ; + #include "GB_apply_unop_ijp.c" + break ; + + case GB_DIAGINDEX_idxunop_code : // z = (j-(i+thunk) + #define GB_APPLY_OP(p) \ + int64_t i = GBI_A (Ai, p, avlen) ; \ + Cz [p] = (int32_t) (j - (i+thunk)) ; + #include "GB_apply_unop_ijp.c" + break ; + + case GB_FLIPDIAGINDEX_idxunop_code : // z = (i-(j+thunk) + #define GB_APPLY_OP(p) \ + int64_t i = GBI_A (Ai, p, avlen) ; \ + Cz [p] = (int32_t) (i - (j+thunk)) ; + #include "GB_apply_unop_ijp.c" + break ; + + default: ; + } - default: ; } + else + { - } - else - { - - //------------------------------------------------------------------ - // bool Cx = positional_op (A) - //------------------------------------------------------------------ - - ASSERT (op->ztype == GrB_BOOL) ; - bool *restrict Cz = (bool *) Cx ; - switch (opcode) - { - - case GB_TRIL_idxunop_code : // z = (j <= (i+thunk)) - #define GB_APPLY_OP(p) \ - int64_t i = GBI_A (Ai, p, avlen) ; \ - Cz [p] = (j <= (i + thunk)) ; - #include "GB_apply_unop_ijp.c" - break ; ; - - case GB_TRIU_idxunop_code : // z = (j >= (i+thunk)) - #define GB_APPLY_OP(p) \ - int64_t i = GBI_A (Ai, p, avlen) ; \ - Cz [p] = (j >= (i + thunk)) ; - #include "GB_apply_unop_ijp.c" - break ; ; - - case GB_DIAG_idxunop_code : // z = (j == (i+thunk)) - #define GB_APPLY_OP(p) \ - int64_t i = GBI_A (Ai, p, avlen) ; \ - Cz [p] = (j == (i + thunk)) ; - #include "GB_apply_unop_ijp.c" - break ; ; - - case GB_OFFDIAG_idxunop_code : // z = (j != (i+thunk)) - #define GB_APPLY_OP(p) \ - int64_t i = GBI_A (Ai, p, avlen) ; \ - Cz [p] = (j != (i + thunk)) ; - #include "GB_apply_unop_ijp.c" - break ; ; - - case GB_COLLE_idxunop_code : // z = (j <= thunk) - #define GB_APPLY_OP(p) \ - Cz [p] = (j <= thunk) ; - #include "GB_apply_unop_ijp.c" - break ; ; - - case GB_COLGT_idxunop_code : // z = (j > thunk) - #define GB_APPLY_OP(p) \ - Cz [p] = (j > thunk) ; - #include "GB_apply_unop_ijp.c" - break ; ; - - case GB_ROWLE_idxunop_code : // z = (i <= thunk) - #define GB_APPLY_OP(p) \ - int64_t i = GBI_A (Ai, p, avlen) ; \ - Cz [p] = (i <= thunk) ; - #include "GB_apply_unop_ip.c" - break ; ; - - case GB_ROWGT_idxunop_code : // z = (i > thunk) - #define GB_APPLY_OP(p) \ - int64_t i = GBI_A (Ai, p, avlen) ; \ - Cz [p] = (i > thunk) ; - #include "GB_apply_unop_ip.c" - break ; ; - - default: ; + //------------------------------------------------------------------ + // bool Cx = positional_op (A) + //------------------------------------------------------------------ + + ASSERT (op->ztype == GrB_BOOL) ; + bool *restrict Cz = (bool *) Cx ; + switch (opcode) + { + + case GB_TRIL_idxunop_code : // z = (j <= (i+thunk)) + #define GB_APPLY_OP(p) \ + int64_t i = GBI_A (Ai, p, avlen) ; \ + Cz [p] = (j <= (i + thunk)) ; + #include "GB_apply_unop_ijp.c" + break ; ; + + case GB_TRIU_idxunop_code : // z = (j >= (i+thunk)) + #define GB_APPLY_OP(p) \ + int64_t i = GBI_A (Ai, p, avlen) ; \ + Cz [p] = (j >= (i + thunk)) ; + #include "GB_apply_unop_ijp.c" + break ; ; + + case GB_DIAG_idxunop_code : // z = (j == (i+thunk)) + #define GB_APPLY_OP(p) \ + int64_t i = GBI_A (Ai, p, avlen) ; \ + Cz [p] = (j == (i + thunk)) ; + #include "GB_apply_unop_ijp.c" + break ; ; + + case GB_OFFDIAG_idxunop_code : // z = (j != (i+thunk)) + #define GB_APPLY_OP(p) \ + int64_t i = GBI_A (Ai, p, avlen) ; \ + Cz [p] = (j != (i + thunk)) ; + #include "GB_apply_unop_ijp.c" + break ; ; + + case GB_COLLE_idxunop_code : // z = (j <= thunk) + #define GB_APPLY_OP(p) \ + Cz [p] = (j <= thunk) ; + #include "GB_apply_unop_ijp.c" + break ; ; + + case GB_COLGT_idxunop_code : // z = (j > thunk) + #define GB_APPLY_OP(p) \ + Cz [p] = (j > thunk) ; + #include "GB_apply_unop_ijp.c" + break ; ; + + case GB_ROWLE_idxunop_code : // z = (i <= thunk) + #define GB_APPLY_OP(p) \ + int64_t i = GBI_A (Ai, p, avlen) ; \ + Cz [p] = (i <= thunk) ; + #include "GB_apply_unop_ip.c" + break ; ; + + case GB_ROWGT_idxunop_code : // z = (i > thunk) + #define GB_APPLY_OP(p) \ + int64_t i = GBI_A (Ai, p, avlen) ; \ + Cz [p] = (i > thunk) ; + #include "GB_apply_unop_ip.c" + break ; ; + + default: ; + } } + info = GrB_SUCCESS ; } - - info = GrB_SUCCESS ; - } else if (C_code_iso != GB_NON_ISO) { @@ -395,38 +393,45 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) ASSERT_OP_OK (op, "unop for GB_apply_op", GB0) ; ASSERT (!A->iso) ; - // TODO: CUDA JIT unop entry point here + #if defined ( GRAPHBLAS_HAS_CUDA ) + if (GB_cuda_apply_unop_branch (ctype, A)) { + info = GB_cuda_apply_unop (Cx, ctype, op, flipij, A, NULL) ; + } + #endif // determine number of threads to use #ifndef GBCOMPACT - GB_IF_FACTORY_KERNELS_ENABLED - { - if (Atype == op->xtype || opcode == GB_IDENTITY_unop_code) + if (info == GrB_NO_VALUE) + { + GB_IF_FACTORY_KERNELS_ENABLED { + if (Atype == op->xtype || opcode == GB_IDENTITY_unop_code) + { - // The switch factory is used if the op is IDENTITY, or if no - // typecasting. IDENTITY operator can do arbitrary typecasting - // (it is not used if no typecasting is done). + // The switch factory is used if the op is IDENTITY, or if no + // typecasting. IDENTITY operator can do arbitrary typecasting + // (it is not used if no typecasting is done). - //-------------------------------------------------------------- - // define the worker for the switch factory - //-------------------------------------------------------------- + //-------------------------------------------------------------- + // define the worker for the switch factory + //-------------------------------------------------------------- - #define GB_unop_apply(unop,zname,aname) \ - GB (_unop_apply_ ## unop ## zname ## aname) + #define GB_unop_apply(unop,zname,aname) \ + GB (_unop_apply_ ## unop ## zname ## aname) - #define GB_WORKER(unop,zname,ztype,aname,atype) \ - { \ - info = GB_unop_apply (unop,zname,aname) (Cx, Ax, Ab, \ - anz, A_nthreads) ; \ - } \ - break ; + #define GB_WORKER(unop,zname,ztype,aname,atype) \ + { \ + info = GB_unop_apply (unop,zname,aname) (Cx, Ax, Ab, \ + anz, A_nthreads) ; \ + } \ + break ; - //-------------------------------------------------------------- - // launch the switch factory - //-------------------------------------------------------------- + //-------------------------------------------------------------- + // launch the switch factory + //-------------------------------------------------------------- - #include "GB_unop_factory.c" + #include "GB_unop_factory.c" + } } } #endif @@ -704,7 +709,11 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) ythunk = ywork ; } - // TODO: CUDA JIT unop entry point here + #if defined ( GRAPHBLAS_HAS_CUDA ) + if (GB_cuda_apply_unop_branch (ctype, A)) { + info = GB_cuda_apply_unop (Cx, ctype, op, flipij, A, ythunk) ; + } + #endif //---------------------------------------------------------------------- // via the JIT or PreJIT kernel diff --git a/Source/GB_cuda_gateway.h b/Source/GB_cuda_gateway.h index cfef994188..b7c026a8ce 100644 --- a/Source/GB_cuda_gateway.h +++ b/Source/GB_cuda_gateway.h @@ -182,6 +182,16 @@ bool GB_cuda_apply_unop_branch const GrB_Matrix A ) ; +GrB_Info GB_cuda_apply_unop +( + GB_void *Cx, + const GrB_Type ctype, + const GB_Operator op, + const bool flipij, + const GrB_Matrix A, + const GB_void *ythunk +) ; + bool GB_cuda_type_branch // return true if the type is OK on GPU ( diff --git a/Source/Template/GB_jit_kernel_proto.h b/Source/Template/GB_jit_kernel_proto.h index a94a242eb9..145c63edf7 100644 --- a/Source/Template/GB_jit_kernel_proto.h +++ b/Source/Template/GB_jit_kernel_proto.h @@ -600,14 +600,20 @@ GrB_Info GB_jit_kernel_apply_bind1st \ GB_void *Cx, \ GB_void *scalarx, \ GrB_Matrix B \ + cudaStream_t stream, \ + int32_t gridsz, \ + int32_t blocksz \ ) \ #define GB_JIT_CUDA_KERNEL_APPLY_UNOP_PROTO(GB_jit_kernel_apply_unop) \ GrB_Info GB_jit_kernel_apply_unop \ ( \ GB_void *Cx, \ - GB_void *thunk_value, \ - GrB_Matrix A \ + GrB_Matrix A, \ + const GB_void *ythunk, \ + cudaStream_t stream, \ + int32_t gridsz, \ + int32_t blocksz \ ) \ #define GB_JIT_CUDA_KERNEL_DOT3_PROTO(GB_jit_kernel_AxB_dot3) \ From 233cda5cf39e51060393d06063ed5106ab5814cd Mon Sep 17 00:00:00 2001 From: Vidith Madhu Date: Fri, 12 Apr 2024 05:54:16 -0500 Subject: [PATCH 40/76] fixes --- CUDA/GB_cuda_apply_unop_branch.cpp | 4 ++-- CUDA/JitKernels/GB_jit_kernel_cuda_apply_unop.cu | 16 ++++++++++------ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/CUDA/GB_cuda_apply_unop_branch.cpp b/CUDA/GB_cuda_apply_unop_branch.cpp index fe4d518890..13447dd681 100644 --- a/CUDA/GB_cuda_apply_unop_branch.cpp +++ b/CUDA/GB_cuda_apply_unop_branch.cpp @@ -11,7 +11,7 @@ bool GB_cuda_apply_unop_branch if (!ok) { - return false; + return false ; } - return true; + return true ; } \ No newline at end of file diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_unop.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_unop.cu index d9f0110b15..8f6f7f0988 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_unop.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_unop.cu @@ -1,5 +1,7 @@ using namespace cooperative_groups ; +#include "GB_cuda_ek_slice.cuh" + #define log2_chunk_size 10 #define chunk_size 1024 @@ -13,7 +15,7 @@ __global__ void GB_cuda_apply_unop_kernel GB_A_NHELD (anz) ; - const GB_A_TYPE *Ax = (GB_A_TYPE *) A->x ; + const GB_A_TYPE *__restrict__ Ax = (GB_A_TYPE *) A->x ; const int64_t *__restrict__ Ai = (int64_t *) A->i ; const int64_t *__restrict__ Ah = (int64_t *) A->h ; const int64_t *__restrict__ Ap = (int64_t *) A->p ; @@ -39,7 +41,7 @@ __global__ void GB_cuda_apply_unop_kernel #if ( GB_A_IS_BITMAP || GB_A_IS_FULL ) // bitmap/full case - for (int p = tid ; p < anz ; p += nthreads) + for (int64_t p = tid ; p < anz ; p += nthreads) { if (!GBB_A (Ab, p)) { continue ; } @@ -52,9 +54,9 @@ __global__ void GB_cuda_apply_unop_kernel // sparse/hypersparse case #if ( GB_DEPENDS_ON_J ) // need to do ek_slice method - for (int64_t pfirst = blockIdx << log2_chunk_size ; + for (int64_t pfirst = blockIdx.x << log2_chunk_size ; pfirst < anz ; - pfirst += girdDim.x << log2_chunk_size ) + pfirst += gridDim.x << log2_chunk_size ) { int64_t my_chunk_size, anvec_sub1 ; float slope ; @@ -66,12 +68,14 @@ __global__ void GB_cuda_apply_unop_kernel int64_t k = GB_cuda_ek_slice_entry (curr_p, pfirst, Ap, anvec_sub1, kfirst, slope) ; int64_t col_idx = GBH_A (Ah, k) ; int64_t row_idx = GBI_A (Ai, pfirst + curr_p, avlen) ; - GB_UNOP (Cx, p, Ax, p, A_iso, row_idx, col_idx, thunk_value) ; + + GB_UNOP (Cx, pfirst + curr_p, Ax, pfirst + curr_p, + A_iso, row_idx, col_idx, thunk_value) ; } } #else // can do normal method - for (int p = tid ; p < anz ; p += nthreads) + for (int64_t p = tid ; p < anz ; p += nthreads) { int64_t row_idx = GBI_A (Ai, p, avlen) ; GB_UNOP (Cx, p, Ax, p, A_iso, row_idx, /* col_idx */, thunk_value) ; From 4fcc526244ed020ece4e8208126c987a79854888 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Fri, 12 Apr 2024 09:07:01 -0500 Subject: [PATCH 41/76] renable CUDA --- CMakeLists.txt | 4 ++-- Doc/GraphBLAS_version.tex | 4 ++-- Include/GraphBLAS.h | 8 ++++---- README.md | 2 +- Source/GB_init.c | 1 + cmake_modules/GraphBLAS_version.cmake | 4 ++-- 6 files changed, 12 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8229506f9d..ad6e01c173 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,8 +41,8 @@ if ( NOT BUILD_SHARED_LIBS ) endif ( ) # CUDA is under development for now, and not deployed in production: - set ( GRAPHBLAS_USE_CUDA OFF ) -# set ( GRAPHBLAS_USE_CUDA ON ) +# set ( GRAPHBLAS_USE_CUDA OFF ) + set ( GRAPHBLAS_USE_CUDA ON ) include ( SuiteSparsePolicy ) diff --git a/Doc/GraphBLAS_version.tex b/Doc/GraphBLAS_version.tex index 8682df482e..41f4bb825e 100644 --- a/Doc/GraphBLAS_version.tex +++ b/Doc/GraphBLAS_version.tex @@ -1,5 +1,5 @@ % version of SuiteSparse:GraphBLAS \date{VERSION -9.1.1, -Apr 9, 2024} +9.1.2, +Apr XX, 2024} diff --git a/Include/GraphBLAS.h b/Include/GraphBLAS.h index 8f91a1124a..6db995b69e 100644 --- a/Include/GraphBLAS.h +++ b/Include/GraphBLAS.h @@ -1,4 +1,4 @@ -// SuiteSparse:GraphBLAS 9.1.1 +// SuiteSparse:GraphBLAS 9.1.2 //------------------------------------------------------------------------------ // GraphBLAS.h: definitions for the GraphBLAS package //------------------------------------------------------------------------------ @@ -158,7 +158,7 @@ extern "C" //------------------------------------------------------------------------------ #ifndef GRAPHBLAS_HAS_CUDA -/* #undef GRAPHBLAS_HAS_CUDA */ +#define GRAPHBLAS_HAS_CUDA #endif //------------------------------------------------------------------------------ @@ -259,10 +259,10 @@ extern "C" // The version of this implementation, and the GraphBLAS API version: #define GxB_IMPLEMENTATION_NAME "SuiteSparse:GraphBLAS" -#define GxB_IMPLEMENTATION_DATE "Apr 9, 2024" +#define GxB_IMPLEMENTATION_DATE "Apr XX, 2024" #define GxB_IMPLEMENTATION_MAJOR 9 #define GxB_IMPLEMENTATION_MINOR 1 -#define GxB_IMPLEMENTATION_SUB 1 +#define GxB_IMPLEMENTATION_SUB 2 #define GxB_SPEC_DATE "Dec 22, 2023" #define GxB_SPEC_MAJOR 2 #define GxB_SPEC_MINOR 1 diff --git a/README.md b/README.md index 000af95318..083413c33c 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. SPDX-License-Identifier: Apache-2.0 -VERSION 9.1.1, Apr 9, 2024 +VERSION 9.1.2, Apr XX, 2024 SuiteSparse:GraphBLAS is a complete implementation of the GraphBLAS standard, which defines a set of sparse matrix operations on an extended algebra of diff --git a/Source/GB_init.c b/Source/GB_init.c index a25f47d2ce..00c76222f1 100644 --- a/Source/GB_init.c +++ b/Source/GB_init.c @@ -150,6 +150,7 @@ GrB_Info GB_init // start up GraphBLAS //-------------------------------------------------------------------------- #if defined ( GRAPHBLAS_HAS_CUDA ) + mode = GxB_NONBLOCKING_GPU ; // HACK FIXME: force GPU to be used if (mode == GxB_BLOCKING_GPU || mode == GxB_NONBLOCKING_GPU) { // initialize the GPUs diff --git a/cmake_modules/GraphBLAS_version.cmake b/cmake_modules/GraphBLAS_version.cmake index 387e4310f0..5ab05a5dd1 100644 --- a/cmake_modules/GraphBLAS_version.cmake +++ b/cmake_modules/GraphBLAS_version.cmake @@ -8,10 +8,10 @@ #------------------------------------------------------------------------------- # version of SuiteSparse:GraphBLAS -set ( GraphBLAS_DATE "Apr 9, 2024" ) +set ( GraphBLAS_DATE "Apr XX, 2024" ) set ( GraphBLAS_VERSION_MAJOR 9 CACHE STRING "" FORCE ) set ( GraphBLAS_VERSION_MINOR 1 CACHE STRING "" FORCE ) -set ( GraphBLAS_VERSION_SUB 1 CACHE STRING "" FORCE ) +set ( GraphBLAS_VERSION_SUB 2 CACHE STRING "" FORCE ) # GraphBLAS C API Specification version, at graphblas.org set ( GraphBLAS_API_DATE "Dec 22, 2023" ) From 3e60bc1a8da8b5ec7219cb04bab7533c938da35a Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Fri, 12 Apr 2024 09:26:42 -0500 Subject: [PATCH 42/76] limit # of threadblocks for reduce --- CUDA/GB_cuda_reduce_to_scalar.cpp | 18 +++++++++--------- CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu | 1 + 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/CUDA/GB_cuda_reduce_to_scalar.cpp b/CUDA/GB_cuda_reduce_to_scalar.cpp index e1da05383c..f1e4e80333 100644 --- a/CUDA/GB_cuda_reduce_to_scalar.cpp +++ b/CUDA/GB_cuda_reduce_to_scalar.cpp @@ -60,21 +60,21 @@ GrB_Info GB_cuda_reduce_to_scalar // determine problem characteristics and allocate worksbace //-------------------------------------------------------------------------- - int threads_per_block = 320 ; - int work_per_thread = 256; -// int number_of_sms = GB_Global_gpu_sm_get (0) ; + int blocksz = 320 ; // # threads in each block + int work_per_thread = 256 ; // work each thread does in a single block + int number_of_sms = GB_Global_gpu_sm_get (0) ; + printf ("# of sm: %d\n", number_of_sms) ; GrB_Type ztype = monoid->op->ztype ; size_t zsize = ztype->size ; // determine kernel launch geometry int64_t anvals = GB_nnz_held (A) ; - int blocksz = threads_per_block ; - int gridsz = - // FIXME: this is a lot of blocks. Use a smaller number (cap at, - // say, 64K), to simplify the non-atomic reductions - (anvals + work_per_thread*threads_per_block - 1) / - (work_per_thread*threads_per_block) ; + int64_t work_per_block = work_per_thread*blocksz ; + // gridsz = ceil (anvals / work_per_block) + int64_t raw_gridsz = GB_ICEIL (anvals, work_per_block) ; + raw_gridsz = std::min (raw_gridsz, (int64_t) (number_of_sms * 256)) ; + int gridsz = (int) raw_gridsz ; // FIXME: GB_enumify_reduce is called twice: here (to get has_cheeseburger) // and in GB_cuda_reduce_to_scalar_jit. Can we just call it once? One diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu index 210793148a..13402637ea 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu @@ -111,6 +111,7 @@ __global__ void GB_cuda_reduce_kernel { // check for zombies during the reduction const int64_t *__restrict__ Ai = A->i ; + // grid-stride loop: for (int64_t p = blockIdx.x * blockDim.x + threadIdx.x ; p < anz ; p += blockDim.x * gridDim.x) From 5e042fa1d75fc70ec26f97fb6606f0e9ef6770cd Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Fri, 12 Apr 2024 12:28:48 -0500 Subject: [PATCH 43/76] shfl_down for large ztype (not yet working...) --- CUDA/GB_cuda_reduce_to_scalar.cpp | 1 - CUDA/GB_cuda_type_branch.cpp | 16 +- CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu | 4 +- CUDA/TODO.txt | 9 +- CUDA/Template/GB_cuda_jit_AxB_dot3_phase1.cuh | 4 +- .../GB_cuda_jit_AxB_dot3_phase3_vsvs.cuh | 3 +- CUDA/Template/GB_cuda_shfl_down.cuh | 214 ++---------------- 7 files changed, 43 insertions(+), 208 deletions(-) diff --git a/CUDA/GB_cuda_reduce_to_scalar.cpp b/CUDA/GB_cuda_reduce_to_scalar.cpp index f1e4e80333..cbf7868a27 100644 --- a/CUDA/GB_cuda_reduce_to_scalar.cpp +++ b/CUDA/GB_cuda_reduce_to_scalar.cpp @@ -63,7 +63,6 @@ GrB_Info GB_cuda_reduce_to_scalar int blocksz = 320 ; // # threads in each block int work_per_thread = 256 ; // work each thread does in a single block int number_of_sms = GB_Global_gpu_sm_get (0) ; - printf ("# of sm: %d\n", number_of_sms) ; GrB_Type ztype = monoid->op->ztype ; size_t zsize = ztype->size ; diff --git a/CUDA/GB_cuda_type_branch.cpp b/CUDA/GB_cuda_type_branch.cpp index 57e779afff..82680a6c64 100644 --- a/CUDA/GB_cuda_type_branch.cpp +++ b/CUDA/GB_cuda_type_branch.cpp @@ -8,13 +8,7 @@ //------------------------------------------------------------------------------ // The CUDA kernels require that the type sizes are 1, 2, or a multiple of 4 -// bytes. In addition, the shfl_down primitives require the type to be 32 -// bytes or less. If user-defined type has a different size, it cannot be done -// on the GPU. - -// FIXME: get the CUDA kernels to work on large types - -// All built-in types pass this rule. +// bytes. All built-in types pass this rule. #include "GB_cuda.hpp" @@ -38,10 +32,12 @@ bool GB_cuda_type_branch // return true if the type is OK on GPU return (true) ; } - if (size % sizeof (uint32_t) == 0 && - size <= 32) // FIXME: Joe + if (size % sizeof (uint32_t) == 0) { - // size is 4, 16, 20, 24, 28, or 32 + // size is 4, 16, 20, 24, 28, or 32: small ztypes. + // If the size is larger than 32 bytes, it still must be a multiple of + // 4 bytes. The only difference will be warp-level reductions, which + // will use GB_cuda_shfl_down_large_ztype instead of tile.shfl_down. return (true) ; } diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu index 13402637ea..09cb85f626 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu @@ -197,8 +197,8 @@ __global__ void GB_cuda_reduce_kernel #else // save my result in V - GB_Z_TYPE *Vx = (GB_Z_TYPE) V->x ; - Vx [blockIdx.x] = zscalar ; + GB_Z_TYPE *Vx = (GB_Z_TYPE *) V->x ; + Vx [blockIdx.x] = *((GB_Z_TYPE *) zscalar) ; #endif } diff --git a/CUDA/TODO.txt b/CUDA/TODO.txt index 00a8860627..3a1c40927f 100644 --- a/CUDA/TODO.txt +++ b/CUDA/TODO.txt @@ -7,12 +7,15 @@ TODO (Mar 2024): dot3: allow iso use a stream pool (from RMM) can rmm_wrap be thread safe? - # of threadblocks in reduce : Joe - reduce calls GB_enumify_reduce twice set/get which GPU(s) to use - data types > 32 bytes : Joe (wildtype demo, type branch) handling nvcc compiler errors + Tim: + reduce calls GB_enumify_reduce twice + + Joe: + data types > 32 bytes : Joe (wildtype demo, type branch) + -------------------------------------------------------------------------------- all the FIXMEs diff --git a/CUDA/Template/GB_cuda_jit_AxB_dot3_phase1.cuh b/CUDA/Template/GB_cuda_jit_AxB_dot3_phase1.cuh index ef6d2e12fb..b612e74d02 100644 --- a/CUDA/Template/GB_cuda_jit_AxB_dot3_phase1.cuh +++ b/CUDA/Template/GB_cuda_jit_AxB_dot3_phase1.cuh @@ -101,6 +101,8 @@ __global__ void GB_jit_AxB_dot3_phase1_kernel // int64_t *restrict Ch = C->h ; // copy of Mh int64_t *__restrict__ Ci = C->i ; // for zombies, or bucket assignment + // FIXME: use (k << 2) not (k << 4) + // Ci [p] for an entry C(i,j) contains either GB_FLIP(i) if C(i,j) is a // zombie, or (k << 4) + bucket otherwise, where C(:,j) is the kth vector // of C (j = Ch [k] if hypersparse or j = k if standard sparse), and @@ -250,7 +252,7 @@ __global__ void GB_jit_AxB_dot3_phase1_kernel // encode the bucket or zombie status in the row index of C(i,j) Ci [pM] = (bucket == GB_BUCKET_ZOMBIE) * ( GB_FLIP(i) << 4) - + (bucket != GB_BUCKET_ZOMBIE) * ((k<<4) + bucket) ; + + (bucket != GB_BUCKET_ZOMBIE) * ((k << 4) + bucket) ; // each thread counts its own bucket sizes my_bucket [bucket]++ ; diff --git a/CUDA/Template/GB_cuda_jit_AxB_dot3_phase3_vsvs.cuh b/CUDA/Template/GB_cuda_jit_AxB_dot3_phase3_vsvs.cuh index edf539634d..3a298986a0 100644 --- a/CUDA/Template/GB_cuda_jit_AxB_dot3_phase3_vsvs.cuh +++ b/CUDA/Template/GB_cuda_jit_AxB_dot3_phase3_vsvs.cuh @@ -34,8 +34,7 @@ __inline__ __device__ uint64_t GB_block_ReduceSum_uint64 ( - thread_block g, // FIXME: g is used for thread_block_tile elsewhere; - // be consistent. + thread_block g, uint64_t val ) { diff --git a/CUDA/Template/GB_cuda_shfl_down.cuh b/CUDA/Template/GB_cuda_shfl_down.cuh index 13b5c505f0..163298c6af 100644 --- a/CUDA/Template/GB_cuda_shfl_down.cuh +++ b/CUDA/Template/GB_cuda_shfl_down.cuh @@ -21,18 +21,18 @@ // Suppose each thread has two scalars dest and src of type T. Then: // // T dest, src ; -// dest = tile.shfl_down (src, delta) ; +// dest = tile.shfl_down (src, offset) ; // -// performs the following computation for each thread i: +// performs the following computation for each thread tid: // -// if (i+delta < tile_sz) +// if (tid+offset < tile_sz) // { -// dest = (the value of src on thread i+delta) +// dest = (the value of src on thread tid+offset) // } // -// Where i ranges from 0 to the tile_size-1, which is the warp size of 32 (the +// Where tid ranges from 0 to the tile_size-1, which is the warp size of 32 (the // size of the tile, given by tile.num_threads() and also the #define'd value -// tile_sz), minus one. If i+delta >= tile_sz for the ith thread, then nothing +// tile_sz), minus one. If tid+offset >= tile_sz for the ith thread, then nothing // happens for that thread, and the thread is inactive. // // Restrictions: tile_sz must be a power of 2, and it must be 32 or less for @@ -42,9 +42,6 @@ // is handled by GB_cuda_shfl_down_large_ztype, which uses repeated calls to // tile.shfl_down on 32-byte chunks. -// FIXME for tile.shfl_down(...), delta is an int, so can it be negative? -// For the __shfl_down warp shuffle function, delta is an unsigned int. - //------------------------------------------------------------------------------ // GB_cuda_warp_sum_uint64: reduce a uint64_t value across a single warp //------------------------------------------------------------------------------ @@ -75,9 +72,9 @@ __device__ __inline__ uint64_t GB_cuda_warp_sum_uint64 #else { #pragma unroll - for (int i = tile_sz >> 1 ; i > 0 ; i >>= 1) + for (int offset = tile_sz >> 1 ; offset > 0 ; offset >>= 1) { - value += tile.shfl_down (value, i) ; + value += tile.shfl_down (value, offset) ; } } #endif @@ -94,81 +91,11 @@ __device__ __inline__ uint64_t GB_cuda_warp_sum_uint64 return (value) ; } -#if 0 - -//------------------------------------------------------------------------------ -// warp_ReduceSumPlus_uint64: for dot3_phase2 -//------------------------------------------------------------------------------ - -__inline__ __device__ uint64_t warp_ReduceSumPlus_uint64 -( - thread_block_tile tile, - uint64_t val -) -{ - // Each iteration halves the number of active threads - // Each thread adds its partial sum[i] to sum[lane+i] - for (int i = tile.num_threads() / 2; i > 0; i /= 2) - { - val += tile.shfl_down (val, i) ; - } - return val; // note: only thread 0 will return full sum -} - -//------------------------------------------------------------------------------ -// GB_warp_ReduceSumPlus_uint64_vsvs: for vsvs kernel -//------------------------------------------------------------------------------ - -__inline__ __device__ uint64_t GB_warp_ReduceSumPlus_uint64_vsvs -( - thread_block_tile g, - uint64_t val -) -{ - // Each iteration halves the number of active threads - // Each thread adds its partial sum[i] to sum[lane+i] - /* - #pragma unroll - for (int i = tile_sz >> 1; i > 0; i >>= 1) { - val += g.shfl_down( val, i); - } - */ - // assuming tile_sz is 32: - val += g.shfl_down( val, 16); - val += g.shfl_down( val, 8); - val += g.shfl_down( val, 4); - val += g.shfl_down( val, 2); - val += g.shfl_down( val, 1); - return val; // note: only thread 0 will return full sum -} - -//------------------------------------------------------------------------------ -// reduce_sum_int64: for vsdn -//------------------------------------------------------------------------------ - -// for counting zombies only (always int64_t) -__device__ int64_t reduce_sum_int64 -( - thread_block_tile g, - int64_t val -) -{ - // Each iteration halves the number of active threads - // Each thread adds its partial sum[i] to sum[lane+i] - for (int64_t i = g.num_threads() / 2; i > 0; i /= 2) - { - val += g.shfl_down(val,i) ; - } - return val; // note: only thread 0 will return full sum -} - -#endif - //------------------------------------------------------------------------------ // GB_cuda_shfl_down_large_ztype: shfl_down a type larger than 32 bytes //------------------------------------------------------------------------------ -// This returns result = tile.shfl_down (value, delta), where value has type +// This returns result = tile.shfl_down (value, offset), where value has type // GB_Z_TYPE, and sizeof (GB_Z_TYPE) > 32. #if ( GB_Z_SIZE > 32 ) @@ -193,26 +120,26 @@ __device__ int64_t reduce_sum_int64 GB_Z_TYPE *result, thread_block_tile tile, GB_Z_TYPE *value, - int delta + int offset ) { // get pointers to value and result, as chunks of size 32 bytes - struct ztype_chunk *v = (struct ztype_chunk *) value ; - struct ztype_chunk *r = (struct ztype_chunk *) result ; + ztype_chunk *v = (ztype_chunk *) value ; + ztype_chunk *r = (ztype_chunk *) result ; // shfl_down value into result, one chunk at a time #pragma unroll for (int chunk = 0 ; chunk < GB_Z_NCHUNKS ; chunk++, r++, v++) { - (*r) = tile.shfl_down (*v, delta) ; + (*r) = tile.shfl_down (*v, offset) ; } #if ( GB_Z_LEFTOVER > 0 ) // handle the leftover chunk, if it has nonzero size - struct ztype_leftover *v_leftover = (struct ztype_leftover *) v ; - struct ztype_leftover *r_leftover = (struct ztype_leftover *) r ; - (*r_leftover) = tile.shfl_down (*v_leftover, delta) ; + ztype_leftover *v_leftover = (ztype_leftover *) v ; + ztype_leftover *r_leftover = (ztype_leftover *) r ; + (*r_leftover) = tile.shfl_down (*v_leftover, offset) ; #endif } @@ -222,8 +149,6 @@ __device__ int64_t reduce_sum_int64 // GB_cuda_warp_reduce_ztype: reduce a ztype to a scalar, on a single warp //------------------------------------------------------------------------------ -// FIXME: make value parameter *value, and return type void? - __device__ __inline__ GB_Z_TYPE GB_cuda_warp_reduce_ztype ( thread_block_tile tile, @@ -242,24 +167,19 @@ __device__ __inline__ GB_Z_TYPE GB_cuda_warp_reduce_ztype { // this is the typical case GB_Z_TYPE next ; - next = tile.shfl_down (value, 16) ; - GB_ADD (value, value, next) ; - next = tile.shfl_down (value, 8) ; - GB_ADD (value, value, next) ; - next = tile.shfl_down (value, 4) ; - GB_ADD (value, value, next) ; - next = tile.shfl_down (value, 2) ; - GB_ADD (value, value, next) ; - next = tile.shfl_down (value, 1) ; - GB_ADD (value, value, next) ; + next = tile.shfl_down (value, 16) ; GB_ADD (value, value, next) ; + next = tile.shfl_down (value, 8) ; GB_ADD (value, value, next) ; + next = tile.shfl_down (value, 4) ; GB_ADD (value, value, next) ; + next = tile.shfl_down (value, 2) ; GB_ADD (value, value, next) ; + next = tile.shfl_down (value, 1) ; GB_ADD (value, value, next) ; } #else { #pragma unroll - for (int i = tile_sz >> 1 ; i > 0 ; i >>= 1) + for (int offset = tile_sz >> 1 ; offset > 0 ; offset >>= 1) { - GB_Z_TYPE next = tile.shfl_down (value, i) ; + GB_Z_TYPE next = tile.shfl_down (value, offset) ; GB_ADD (value, value, next) ; } @@ -274,10 +194,10 @@ __device__ __inline__ GB_Z_TYPE GB_cuda_warp_reduce_ztype //---------------------------------------------------------------------- #pragma unroll - for (int i = tile_sz >> 1 ; i > 0 ; i >>= 1) + for (int offset = tile_sz >> 1 ; offset > 0 ; offset >>= 1) { GB_Z_TYPE next ; - GB_cuda_shfl_down_large_ztype (&next, tile, &value, i) ; + GB_cuda_shfl_down_large_ztype (&next, tile, &value, offset) ; GB_ADD (value, value, next) ; } } @@ -298,87 +218,3 @@ __device__ __inline__ GB_Z_TYPE GB_cuda_warp_reduce_ztype return (value) ; } -#if 0 - -//------------------------------------------------------------------------------ -// warp_ReduceSum_dndn: for dndn kernel -//------------------------------------------------------------------------------ - -__inline__ __device__ GB_Z_TYPE warp_ReduceSum_dndn -( - thread_block_tile<32> g, - GB_Z_TYPE val -) -{ - // Each iteration halves the number of active threads - // Each thread adds its partial sum[i] to sum[lane+i] - // FIXME: only works if sizeof(GB_Z_TYPE) <= 32 bytes - // FIXME: the ANY monoid needs the cij_exists for each thread - for (int i = g.num_threads() / 2; i > 0; i /= 2) - { - GB_Z_TYPE next = g.shfl_down( val, i) ; - GB_ADD( val, val, next ); - } - return val; // note: only thread 0 will return full sum -} - -//------------------------------------------------------------------------------ -// GB_reduce_sum: for dot3 mp and spdn -//------------------------------------------------------------------------------ - -__device__ __inline__ GB_Z_TYPE GB_reduce_sum -( - thread_block_tile g, - GB_Z_TYPE val -) -{ - // Each iteration halves the number of active threads - // Each thread adds its partial sum[i] to sum[lane+i] - // Temporary GB_Z_TYPE is necessary to handle arbirary ops - // FIXME: only works if sizeof(GB_Z_TYPE) <= 32 bytes - // FIXME: the ANY monoid needs the cij_exists for each thread - #pragma unroll - for (int i = tile_sz >> 1 ; i > 0 ; i >>= 1) - { - GB_Z_TYPE next = g.shfl_down (val, i) ; - GB_ADD (val, val, next) ; - } - return val; -} - -//------------------------------------------------------------------------------ -// GB_warp_Reduce: for cuda_reduce -//------------------------------------------------------------------------------ - -__device__ __inline__ GB_Z_TYPE GB_warp_Reduce -( - thread_block_tile g, - GB_Z_TYPE val -) -{ - // Each iteration halves the number of active threads - // Each thread adds its partial val[k] to val[lane+k] - - // FIXME: doesn't work unless sizeof(GB_Z_TYPE) <= 32 bytes - -#if ( GB_Z_SIZE <= 32 ) - // assumes tile_sz is 32: - GB_Z_TYPE fold = g.shfl_down ( val, 16) ; - GB_ADD ( val, val, fold ) ; - fold = g.shfl_down ( val, 8) ; - GB_ADD ( val, val, fold ) ; - fold = g.shfl_down ( val, 4) ; - GB_ADD ( val, val, fold ) ; - fold = g.shfl_down ( val, 2) ; - GB_ADD ( val, val, fold ) ; - fold = g.shfl_down ( val, 1) ; - GB_ADD ( val, val, fold ) ; -#else - // use shared memory and do not use shfl_down? - // or use repeated calls to shfl_down, on chunks of 32 bytes each? - #error "not implemented yet" -#endif - - return (val) ; // note: only thread 0 will return full val -} -#endif From 68b1933b490af985757eddae98e9c6b25a4cb564 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Fri, 12 Apr 2024 15:20:35 -0500 Subject: [PATCH 44/76] copy ythunk for cuda --- CUDA/GB_cuda_apply_unop.cpp | 26 +++++++++++++++++++++++--- Source/GB_init.c | 1 + 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/CUDA/GB_cuda_apply_unop.cpp b/CUDA/GB_cuda_apply_unop.cpp index d64b124661..ec40497ac0 100644 --- a/CUDA/GB_cuda_apply_unop.cpp +++ b/CUDA/GB_cuda_apply_unop.cpp @@ -1,7 +1,10 @@ #include "GB_cuda_apply.hpp" #undef GB_FREE_WORKSPACE -#define GB_FREE_WORKSPACE ; +#define GB_FREE_WORKSPACE \ +{ \ + GB_FREE_WORK (&ythunk_cuda, ythunk_cuda_size) ; \ +} #undef GB_FREE_ALL #define GB_FREE_ALL ; @@ -19,6 +22,21 @@ GrB_Info GB_cuda_apply_unop const GB_void *ythunk ) { + + GB_void *ythunk_cuda = NULL ; + size_t ythunk_cuda_size = 0 ; + if (ythunk != NULL) + { + // make a copy of ythunk, since ythunk might be allocated on + // the CPU stack and thus not accessible to the CUDA kernel. + ythunk_cuda = GB_MALLOC_WORK (op->ytype->size, GB_void, &ythunk_cuda_size) ; + if (ythunk_cuda == NULL) + { + return (GrB_OUT_OF_MEMORY) ; + } + memcpy (ythunk_cuda, ythunk, op->ytype->size) ; + } + // FIXME: use the stream pool cudaStream_t stream ; CUDA_OK (cudaStreamCreate (&stream)) ; @@ -28,13 +46,15 @@ GrB_Info GB_cuda_apply_unop int32_t gridsz = 1 + (anz >> LOG2_BLOCK_SIZE) ; GrB_Info info = GB_cuda_apply_unop_jit (Cx, ctype, op, flipij, A, - ythunk, stream, gridsz, BLOCK_SIZE) ; + ythunk_cuda, stream, gridsz, BLOCK_SIZE) ; if (info == GrB_NO_VALUE) info = GrB_PANIC ; GB_OK (info) ; CUDA_OK (cudaStreamSynchronize (stream)) ; CUDA_OK (cudaStreamDestroy (stream)) ; + + GB_FREE_WORKSPACE ; return GrB_SUCCESS ; -} \ No newline at end of file +} diff --git a/Source/GB_init.c b/Source/GB_init.c index a25f47d2ce..00c76222f1 100644 --- a/Source/GB_init.c +++ b/Source/GB_init.c @@ -150,6 +150,7 @@ GrB_Info GB_init // start up GraphBLAS //-------------------------------------------------------------------------- #if defined ( GRAPHBLAS_HAS_CUDA ) + mode = GxB_NONBLOCKING_GPU ; // HACK FIXME: force GPU to be used if (mode == GxB_BLOCKING_GPU || mode == GxB_NONBLOCKING_GPU) { // initialize the GPUs From 762ed36d3540aa51480bf9187e1e93d4a987033d Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Fri, 12 Apr 2024 15:36:41 -0500 Subject: [PATCH 45/76] cuda branch for binary op --- CUDA/GB_cuda_apply_binop_branch.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/CUDA/GB_cuda_apply_binop_branch.cpp b/CUDA/GB_cuda_apply_binop_branch.cpp index e79fb8ed4d..b5e01326e9 100644 --- a/CUDA/GB_cuda_apply_binop_branch.cpp +++ b/CUDA/GB_cuda_apply_binop_branch.cpp @@ -10,18 +10,20 @@ bool GB_cuda_apply_binop_branch ) { bool ok = GB_cuda_type_branch (ctype) && GB_cuda_type_branch (A->type) ; - if (bind1st) + + if (op->xtype != NULL) { ok = ok && GB_cuda_type_branch (op->xtype) ; } - else + if (op->ytype != NULL) { ok = ok && GB_cuda_type_branch (op->ytype) ; } - - if (!ok) + if (op->ztype != NULL) { - return false; + ok = ok && GB_cuda_type_branch (op->ztype) ; } - return true; + + return (ok) ; } + From 43a0fbbde716c7b7298b5039d423f1060c39e074 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 16 Apr 2024 08:56:56 -0500 Subject: [PATCH 46/76] put back size<=32 check in cuda type branch, for now --- CUDA/GB_cuda_type_branch.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CUDA/GB_cuda_type_branch.cpp b/CUDA/GB_cuda_type_branch.cpp index 82680a6c64..1050ac72b4 100644 --- a/CUDA/GB_cuda_type_branch.cpp +++ b/CUDA/GB_cuda_type_branch.cpp @@ -32,7 +32,8 @@ bool GB_cuda_type_branch // return true if the type is OK on GPU return (true) ; } - if (size % sizeof (uint32_t) == 0) + if (size % sizeof (uint32_t) == 0 + && size <= 32) // FIXME { // size is 4, 16, 20, 24, 28, or 32: small ztypes. // If the size is larger than 32 bytes, it still must be a multiple of From b1344962432cdc8825f9212670456311c7aa59b7 Mon Sep 17 00:00:00 2001 From: Vidith Madhu Date: Fri, 19 Apr 2024 04:08:19 -0500 Subject: [PATCH 47/76] check for un-jittable user defined op for cuda unop apply --- CUDA/GB_cuda_apply_unop_branch.cpp | 6 ++++-- Source/GB_apply_op.c | 6 +++--- Source/GB_cuda_gateway.h | 3 ++- notes.txt | 3 +++ 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/CUDA/GB_cuda_apply_unop_branch.cpp b/CUDA/GB_cuda_apply_unop_branch.cpp index 13447dd681..c7b6a8457a 100644 --- a/CUDA/GB_cuda_apply_unop_branch.cpp +++ b/CUDA/GB_cuda_apply_unop_branch.cpp @@ -4,10 +4,12 @@ bool GB_cuda_apply_unop_branch ( const GrB_Type ctype, - const GrB_Matrix A + const GrB_Matrix A, + const GB_Operator op ) { - bool ok = GB_cuda_type_branch (ctype) && GB_cuda_type_branch (A->type) ; + bool ok = (GB_cuda_type_branch (ctype) && GB_cuda_type_branch (A->type)) + && (op != NULL && op->hash != UINT64_MAX); if (!ok) { diff --git a/Source/GB_apply_op.c b/Source/GB_apply_op.c index 19fad68a19..33f2caac11 100644 --- a/Source/GB_apply_op.c +++ b/Source/GB_apply_op.c @@ -183,7 +183,7 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) ASSERT_OP_OK (op, "positional unop/idxunop: GB_apply_op", GB0) ; #if defined ( GRAPHBLAS_HAS_CUDA ) - if (GB_cuda_apply_unop_branch (ctype, A)) { + if (GB_cuda_apply_unop_branch (ctype, A, op)) { info = GB_cuda_apply_unop (Cx, ctype, op, flipij, A, (GB_void *) &thunk) ; } #endif @@ -394,7 +394,7 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) ASSERT (!A->iso) ; #if defined ( GRAPHBLAS_HAS_CUDA ) - if (GB_cuda_apply_unop_branch (ctype, A)) { + if (GB_cuda_apply_unop_branch (ctype, A, op)) { info = GB_cuda_apply_unop (Cx, ctype, op, flipij, A, NULL) ; } #endif @@ -710,7 +710,7 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) } #if defined ( GRAPHBLAS_HAS_CUDA ) - if (GB_cuda_apply_unop_branch (ctype, A)) { + if (GB_cuda_apply_unop_branch (ctype, A, op)) { info = GB_cuda_apply_unop (Cx, ctype, op, flipij, A, ythunk) ; } #endif diff --git a/Source/GB_cuda_gateway.h b/Source/GB_cuda_gateway.h index b7c026a8ce..0375e38a1d 100644 --- a/Source/GB_cuda_gateway.h +++ b/Source/GB_cuda_gateway.h @@ -179,7 +179,8 @@ bool GB_cuda_apply_binop_branch bool GB_cuda_apply_unop_branch ( const GrB_Type ctype, - const GrB_Matrix A + const GrB_Matrix A, + const GB_Operator op ) ; GrB_Info GB_cuda_apply_unop diff --git a/notes.txt b/notes.txt index dc6e8f3760..d6e9031b88 100644 --- a/notes.txt +++ b/notes.txt @@ -121,6 +121,9 @@ Progress notes: Kernel development notes: - Useful guide: https://docs.nvidia.com/cuda/cuda-c-best-practices-guide/index.html - Good tips: https://on-demand.gputechconf.com/gtc/2017/presentation/s7122-stephen-jones-cuda-optimization-tips-tricks-and-techniques.pdf +- Resources for warp-level primitives/reduction techniques: + - https://developer.nvidia.com/blog/using-cuda-warp-level-primitives/ + - https://developer.download.nvidia.com/assets/cuda/files/reduction.pdf - Fork GraphBLAS, establish personal branch - Start with rowscale - Understand how rowscale works on CPU From 5c01e1b6a7fac905d93a4b3b0e15432380ecbba8 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Fri, 19 Apr 2024 10:50:39 -0500 Subject: [PATCH 48/76] fix reduce when "has_cheeseburger" is false --- CUDA/GB_cuda_type_branch.cpp | 3 +-- CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu | 12 +++++++---- CUDA/TODO.txt | 3 +++ Source/GB_init.c | 3 +-- Source/GB_jitifyer.c | 22 ++++++++++++++++---- 5 files changed, 31 insertions(+), 12 deletions(-) diff --git a/CUDA/GB_cuda_type_branch.cpp b/CUDA/GB_cuda_type_branch.cpp index 1050ac72b4..82680a6c64 100644 --- a/CUDA/GB_cuda_type_branch.cpp +++ b/CUDA/GB_cuda_type_branch.cpp @@ -32,8 +32,7 @@ bool GB_cuda_type_branch // return true if the type is OK on GPU return (true) ; } - if (size % sizeof (uint32_t) == 0 - && size <= 32) // FIXME + if (size % sizeof (uint32_t) == 0) { // size is 4, 16, 20, 24, 28, or 32: small ztypes. // If the size is larger than 32 bytes, it still must be a multiple of diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu index 09cb85f626..1513340219 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu @@ -183,22 +183,26 @@ __global__ void GB_cuda_reduce_kernel { #if GB_Z_HAS_CUDA_ATOMIC_USER - // user-defined monoid can be done automically + // user-defined monoid can be done automically: + // zscalar "+=" zmine using a CUDA atomic directly GB_cuda_atomic_user (zscalar, zmine) ; #elif GB_Z_HAS_CUDA_ATOMIC_BUILTIN - // cast the result to the CUDA atomic type, and reduce + // cast the zmine result to the CUDA atomic type, and reduce // atomically to the global zscalar + // zscalar "+=" zmine using a CUDA atomic pun GB_Z_CUDA_ATOMIC_TYPE *z = (GB_Z_CUDA_ATOMIC_TYPE *) zscalar ; GB_Z_CUDA_ATOMIC_TYPE zsum = (GB_Z_CUDA_ATOMIC_TYPE) zmine ; GB_Z_CUDA_ATOMIC (z, zsum) ; #else - // save my result in V + // save my zmine result in V GB_Z_TYPE *Vx = (GB_Z_TYPE *) V->x ; - Vx [blockIdx.x] = *((GB_Z_TYPE *) zscalar) ; +// printf ("zmine pointer: %p\n", &zmine) ; +// printf ("z size : %d %d %d\n", GB_Z_SIZE, (int) sizeof (GB_Z_TYPE)) ; + Vx [blockIdx.x] = zmine ; #endif } diff --git a/CUDA/TODO.txt b/CUDA/TODO.txt index 3a1c40927f..4da6a74b62 100644 --- a/CUDA/TODO.txt +++ b/CUDA/TODO.txt @@ -1,5 +1,8 @@ TODO (Mar 2024): + GB_CUDA_FLAGS: get from GB_config.h, allow user to modify them, etc + and pass to nvcc. Also GB_CUDA_COMPILER (default to nvcc) + complex data types set/get cuda archictures CUDA PreJIT kernels diff --git a/Source/GB_init.c b/Source/GB_init.c index 00c76222f1..331fde19c5 100644 --- a/Source/GB_init.c +++ b/Source/GB_init.c @@ -82,7 +82,7 @@ GrB_Info GB_init // start up GraphBLAS bool malloc_is_thread_safe = true ; #if defined ( GRAPHBLAS_HAS_CUDA ) - mode = GxB_NONBLOCKING_GPU ; // HACK FIXME + mode = GxB_NONBLOCKING_GPU ; // HACK FIXME: force GPU to be used if (mode == GxB_NONBLOCKING_GPU || mode == GxB_BLOCKING_GPU) { // ignore the memory management function pointers and use rmm_wrap_* @@ -150,7 +150,6 @@ GrB_Info GB_init // start up GraphBLAS //-------------------------------------------------------------------------- #if defined ( GRAPHBLAS_HAS_CUDA ) - mode = GxB_NONBLOCKING_GPU ; // HACK FIXME: force GPU to be used if (mode == GxB_BLOCKING_GPU || mode == GxB_NONBLOCKING_GPU) { // initialize the GPUs diff --git a/Source/GB_jitifyer.c b/Source/GB_jitifyer.c index 7568b3f68d..cceb8874df 100644 --- a/Source/GB_jitifyer.c +++ b/Source/GB_jitifyer.c @@ -1854,6 +1854,7 @@ GrB_Info GB_jitifyer_load_worker snprintf (GB_jit_temp, GB_jit_temp_allocated, "%s/lib/%02x/%s%s%s", GB_jit_cache_path, bucket, GB_LIB_PREFIX, kernel_name, GB_LIB_SUFFIX) ; void *dl_handle = GB_file_dlopen (GB_jit_temp) ; + GB_jit_kcode kcode = encoding->kcode ; //-------------------------------------------------------------------------- // check if the kernel was found, but needs to be compiled anyway @@ -1903,7 +1904,6 @@ GrB_Info GB_jitifyer_load_worker //---------------------------------------------------------------------- GBURBLE ("(jit: compile and load) ") ; - GB_jit_kcode kcode = encoding->kcode ; const char *kernel_filetype = (kcode < GB_JIT_CUDA_KERNEL) ? "c" : "cu" ; @@ -1979,7 +1979,14 @@ GrB_Info GB_jitifyer_load_worker } else { - GBURBLE ("(jit: load) ") ; + if (kcode >= GB_JIT_CUDA_KERNEL) + { + GBURBLE ("(jit: cuda load) ") ; + } + else + { + GBURBLE ("(jit: cpu load) ") ; + } } //-------------------------------------------------------------------------- @@ -2434,7 +2441,7 @@ void GB_jitifyer_cmake_compile (char *kernel_name, uint64_t hash) } //------------------------------------------------------------------------------ -// GB_jitifyer_nvcc_compile: compile a CUDA kernel with NVRTC +// GB_jitifyer_nvcc_compile: compile a CUDA kernel with nvcc //------------------------------------------------------------------------------ // Compiles a CUDA JIT kernel in a *.cu file, containing host code that @@ -2466,10 +2473,17 @@ void GB_jitifyer_nvcc_compile (char *kernel_name, uint32_t bucket) // compile: "sh -c \"" // execute with POSIX shell + // FIXME: use GB_CUDA_COMPILER here: "nvcc " // compiler command "-forward-unknown-to-host-compiler " "-DGB_JIT_RUNTIME=1 " // nvcc flags - "-I/usr/local/cuda/include -std=c++17 -arch=sm_60 -fPIC " + // FIXME: add GB_CUDA_INC here: + "-I/usr/local/cuda/include -std=c++17 " + // FIXME: use GB_CUDA_ARCHITECTURES here: + " -arch=sm_60 " + " -fPIC " + // FIXME: add GB_CUDA_FLAGS here: + " -G " // HACK FIXME "-I%s/src " // include source directory "-o %s/c/%02x/%s%s " // *.o output file "-c %s/c/%02x/%s.cu " // *.cu input file From ac824a38bb1d765075f4f4f25d6c20a45f68a342 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Fri, 19 Apr 2024 11:56:39 -0500 Subject: [PATCH 49/76] ek_slice: also return p = pfirst+pdelta --- CUDA/Template/GB_cuda_ek_slice.cuh | 93 +++++++++++++++---- .../GB_cuda_jit_AxB_dot3_dense_phase1.cuh | 10 +- CUDA/Template/GB_cuda_jit_AxB_dot3_phase1.cuh | 10 +- 3 files changed, 86 insertions(+), 27 deletions(-) diff --git a/CUDA/Template/GB_cuda_ek_slice.cuh b/CUDA/Template/GB_cuda_ek_slice.cuh index b92e7181a3..cf3f4c4f30 100644 --- a/CUDA/Template/GB_cuda_ek_slice.cuh +++ b/CUDA/Template/GB_cuda_ek_slice.cuh @@ -6,6 +6,53 @@ // This file: Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. // SPDX-License-Identifier: Apache-2.0 +//------------------------------------------------------------------------------ + +// The GB_cuda_ek_slice* methods provide an efficient method for the +// threadblocks to work in parallel on a single sparse or hypersparse matrix A. +// Let Ap = A->p be an array of "pointers" of size anvec+1. +// Let Ai = A->i be the array of row indices of the sparse/hypersparse matrix. +// Let Ax = A->x be the array of values of the sparse/hypersparse matrix. +// Let anz be the # of entries in the Ai and Ax arrays. +// +// Then matrix of A can be traversed as follows (suppose it is stored by col): +// +// for (k = 0 ; k < anvec ; k++) +// j = k if A is sparse, or j = Ah [k] if A is hypersparse +// for (p = Ap [k] ; p < Ap [k+1] ; p++) +// i = Ai [p] ; +// atype aij = Ax [p] ; +// the entry A(i,j) has value aij, row index i, column index j, and +// column j is the kth column in the data structure of A, +// ... +// +// However, parallelizing that loop across the GPU threadblocks is difficult. +// Instead, consider a single loop: +// +// for (p = 0 ; p < anz ; p++) +// find k so that Ap [k] <= p < Ap [k+1] +// j = k if A is sparse, or j = Ah [k] if A is hypersparse +// i = Ai [p] +// aij = Ax [p] +// ... +// +// The above loop can be easily parallelized on the GPU, and the +// GB_cuda_ek_slice* methods provide a way for each thread to find k for each +// entry at position p. The methods assume a single threadblock is given the +// task to compute iterations p = pfirst : plast=1 where plast = min (anz, +// pfirst + max_pchunk) for the loop above. +// +// First, all threads call GB_cuda_ek_slice_setup, and do two binary searches. +// This determines the slope, and gives a way to estimate the vector k that +// contains any entry p in the given range pfirst:plast-1. This estimate is +// then used in GB_cuda_ek_slice_entry to determine the k for any given p in +// that range. +// +// If the thread that computes k for a given p is also the thread that uses k, +// then there is no need for the threadblock to share that computation. +// Otherwise, the set of k values can be computed in a shared array ks, using +// the single method GB_cuda_ek_slice. + //------------------------------------------------------------------------------ // GB_cuda_ek_slice_setup //------------------------------------------------------------------------------ @@ -79,24 +126,27 @@ static __device__ __inline__ int64_t GB_cuda_ek_slice_setup // GB_cuda_ek_slice_entry //------------------------------------------------------------------------------ -// Let p = kk + pfirst, where kk ranges from 0:my_chunk_size-1, and so p ranges -// from kk:(kk+my_chunk_size-1), and where my_chunk_size is normally of size -// max_pchunk, unless this is the last chunk in the entire matrix. -// GB_cuda_ek_slice_entry computes k for this entry, so that the kth vector -// contains the entry aij with row index i = Ai [p] and value aij = Ax [p] -// (assuming that A is a sparse or hypersparse matrix held by column). That -// is, Ap [k] <= p < Ap [k+1] will hold. If A is sparse and held by column, -// then aij is in column j = k. If A is hypersparse, then aij is in column j = -// Ah [k]. +// Let p = pfirst + pdelta, where pdelta ranges from 0:my_chunk_size-1, and so +// p ranges from pdelta:(pdelta+my_chunk_size-1), and where my_chunk_size is +// normally of size max_pchunk, unless this is the last chunk in the entire +// matrix. GB_cuda_ek_slice_entry computes k for this entry, so that the kth +// vector contains the entry aij with row index i = Ai [p] and value aij = Ax +// [p] (assuming that A is a sparse or hypersparse matrix held by column). +// That is, Ap [k] <= p < Ap [k+1] will hold. If A is sparse and held by +// column, then aij is in column j = k. If A is hypersparse, then aij is in +// column j = Ah [k]. // The method returns the index k of the vector in A that contains the pth -// entry in A, at position p = kk + pfirst. +// entry in A, at position p = pfirst + pdelta. static __device__ __inline__ int64_t GB_cuda_ek_slice_entry ( + // output: + int64_t *p_handle, // p = pfirst + pdelta // inputs, not modified: - const int64_t kk, // find the k value of the kkth entry - const int64_t pfirst, // first entry in A to find k (for which kk=0) + const int64_t pdelta, // find the k value of the pfirst+pdelta entry + const int64_t pfirst, // first entry in A to find k (for which + // pdelta=0) const int64_t *Ap, // array of size anvec+1 const int64_t anvec1, // anvec-1 const int64_t kfirst, // estimate of first vector in the chunk @@ -104,8 +154,8 @@ static __device__ __inline__ int64_t GB_cuda_ek_slice_entry ) { - // get a rough estimate of k for the kkth entry - int64_t k = kfirst + (int64_t) (slope * ((float) kk)) ; + // get a rough estimate of k for the pfirst + pdelta entry + int64_t k = kfirst + (int64_t) (slope * ((float) pdelta)) ; // The estimate of k cannot be smaller than kfirst, but it might be bigger // than anvec-1, so ensure it is in the valid range, kfirst to anvec-1. @@ -113,7 +163,8 @@ static __device__ __inline__ int64_t GB_cuda_ek_slice_entry // look for p in Ap, where p is in range pfirst:plast-1 // where pfirst >= 0 and plast < anz - int64_t p = kk + pfirst ; + int64_t p = pfirst + pdelta ; + (*p_handle) = p ; // linear-time search for the k value of the pth entry while (Ap [k+1] <= p) k++ ; @@ -165,21 +216,25 @@ static __device__ __inline__ int64_t GB_cuda_ek_slice // returns my_chunk_size // find the kth vector that contains each entry p = pfirst:plast-1 //-------------------------------------------------------------------------- - for (int64_t kk = threadIdx.x ; kk < my_chunk_size ; kk += blockDim.x) + for (int64_t pdelta = threadIdx.x ; + pdelta < my_chunk_size ; + pdelta += blockDim.x) { //---------------------------------------------------------------------- // determine the kth vector that contains the pth entry //---------------------------------------------------------------------- - int64_t k = GB_cuda_ek_slice_entry (kk, pfirst, Ap, anvec1, kfirst, - slope) ; + int64_t p ; // unused, p = pfirst + pdelta + int64_t k = GB_cuda_ek_slice_entry (&p, pdelta, pfirst, Ap, anvec1, + kfirst, slope) ; //---------------------------------------------------------------------- // save the result in ks //---------------------------------------------------------------------- - ks [kk] = k ; + // the pth entry of the matrix is in vector k + ks [pdelta] = k ; } //-------------------------------------------------------------------------- diff --git a/CUDA/Template/GB_cuda_jit_AxB_dot3_dense_phase1.cuh b/CUDA/Template/GB_cuda_jit_AxB_dot3_dense_phase1.cuh index 2c343deb12..5fce319bf1 100644 --- a/CUDA/Template/GB_cuda_jit_AxB_dot3_dense_phase1.cuh +++ b/CUDA/Template/GB_cuda_jit_AxB_dot3_dense_phase1.cuh @@ -75,13 +75,15 @@ __global__ void GB_cuda_AxB_dot3_dense_phase1_kernel // assign entries in C(i,j): either its vector k or its zombie status //---------------------------------------------------------------------- - for (int64_t kk = threadIdx.x ; kk < my_chunk_size ; kk += blockDim.x) + for (int64_t pdelta = threadIdx.x ; + pdelta < my_chunk_size ; + pdelta += blockDim.x) { // get the pM and k value of Mi,Mx [pM]: - int64_t k = GB_cuda_ek_slice_entry (kk, pfirst, Mp, mnvec1, kfirst, - slope) ; - int64_t pM = kk + pfirst ; + int64_t pM ; // = pfirst + pdelta + int64_t k = GB_cuda_ek_slice_entry (&pM, pdelta, pfirst, Mp, mnvec1, + kfirst, slope) ; #if GB_MASK_STRUCT { diff --git a/CUDA/Template/GB_cuda_jit_AxB_dot3_phase1.cuh b/CUDA/Template/GB_cuda_jit_AxB_dot3_phase1.cuh index b612e74d02..5be6c2a03c 100644 --- a/CUDA/Template/GB_cuda_jit_AxB_dot3_phase1.cuh +++ b/CUDA/Template/GB_cuda_jit_AxB_dot3_phase1.cuh @@ -149,7 +149,9 @@ __global__ void GB_jit_AxB_dot3_phase1_kernel // assign entries in C(i,j) to the buckets //---------------------------------------------------------------------- - for (int64_t kk = threadIdx.x ; kk < my_chunk_size ; kk += blockDim.x) + for (int64_t pdelta = threadIdx.x ; + pdelta < my_chunk_size ; + pdelta += blockDim.x) { //------------------------------------------------------------------ @@ -157,9 +159,9 @@ __global__ void GB_jit_AxB_dot3_phase1_kernel //------------------------------------------------------------------ // get the pM and k value of Mi,Mx [pM] - int64_t k = GB_cuda_ek_slice_entry (kk, pfirst, Mp, mnvec1, kfirst, - slope) ; - int64_t pM = kk + pfirst ; + int64_t pM ; // = pfirst + pdelta + int64_t k = GB_cuda_ek_slice_entry (&pM, pdelta, pfirst, Mp, mnvec1, + kfirst, slope) ; //------------------------------------------------------------------ // get C(i,j): zombie if A(:,i) and B(:,j) are empty or M(i,j) false From 37d0abf14ba9796c2ded0a3a2283a4d43f1a3247 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Fri, 19 Apr 2024 14:30:41 -0500 Subject: [PATCH 50/76] comments --- CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu | 2 -- Source/GB_jitifyer.c | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu index 1513340219..a2bcf5ba6a 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu @@ -200,8 +200,6 @@ __global__ void GB_cuda_reduce_kernel // save my zmine result in V GB_Z_TYPE *Vx = (GB_Z_TYPE *) V->x ; -// printf ("zmine pointer: %p\n", &zmine) ; -// printf ("z size : %d %d %d\n", GB_Z_SIZE, (int) sizeof (GB_Z_TYPE)) ; Vx [blockIdx.x] = zmine ; #endif diff --git a/Source/GB_jitifyer.c b/Source/GB_jitifyer.c index cceb8874df..30a25cfa06 100644 --- a/Source/GB_jitifyer.c +++ b/Source/GB_jitifyer.c @@ -223,6 +223,9 @@ void GB_jitifyer_finalize (void) // Replace invalid characters in a string with underscore. +// FIXME: allow spaces in the string, but fix the use of the string so +// that a path can include spaces. + void GB_jitifyer_sanitize (char *string, size_t len) { for (int k = 0 ; k < len ; k++) From 0dc3fc99a2cbd82e4e47b8d64922b85423e62243 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Fri, 26 Apr 2024 08:59:46 -0500 Subject: [PATCH 51/76] note about JIT return values --- Source/GB_jitifyer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/GB_jitifyer.c b/Source/GB_jitifyer.c index 30a25cfa06..bd114920bf 100644 --- a/Source/GB_jitifyer.c +++ b/Source/GB_jitifyer.c @@ -1976,7 +1976,7 @@ GrB_Info GB_jitifyer_load_worker GB_jit_control = GxB_JIT_LOAD ; // remove the compiled library remove (GB_jit_temp) ; - return (GrB_NO_VALUE) ; + return (GrB_NO_VALUE) ; // FIXME: use another error code? } } @@ -2006,7 +2006,7 @@ GrB_Info GB_jitifyer_load_worker GB_jit_control = GxB_JIT_RUN ; // remove the compiled library remove (GB_jit_temp) ; - return (GrB_NO_VALUE) ; + return (GrB_NO_VALUE) ; // FIXME: use another error code? } // insert the new kernel into the hash table From e29c9e1f28cf4d8f88215e5c77bb5867a584d0c2 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Fri, 26 Apr 2024 11:13:25 -0500 Subject: [PATCH 52/76] CUDA TODO. Add GB_[XY]_TYPE to mxm macrofy --- CUDA/TODO.txt | 3 --- Source/GB_macrofy_mxm.c | 2 ++ 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/CUDA/TODO.txt b/CUDA/TODO.txt index 4da6a74b62..cfc5ea8ae8 100644 --- a/CUDA/TODO.txt +++ b/CUDA/TODO.txt @@ -16,9 +16,6 @@ TODO (Mar 2024): Tim: reduce calls GB_enumify_reduce twice - Joe: - data types > 32 bytes : Joe (wildtype demo, type branch) - -------------------------------------------------------------------------------- all the FIXMEs diff --git a/Source/GB_macrofy_mxm.c b/Source/GB_macrofy_mxm.c index 919025e27c..34dadf959f 100644 --- a/Source/GB_macrofy_mxm.c +++ b/Source/GB_macrofy_mxm.c @@ -125,6 +125,8 @@ void GB_macrofy_mxm // construct all macros for GrB_mxm fprintf (fp, "\n// multiplicative operator%s:\n", flipxy ? " (flipped)" : "") ; const char *f_expr ; + GB_macrofy_type (fp, "X", "_", (xcode == 0) ? "GB_void" : xtype->name) ; + GB_macrofy_type (fp, "Y", "_", (ycode == 0) ? "GB_void" : ytype->name) ; GB_macrofy_binop (fp, "GB_MULT", flipxy, false, false, mult_ecode, C_iso, mult, &f_expr, NULL, NULL) ; From 4cdd703f35c1bf64c360deb28c728c0e246b7634 Mon Sep 17 00:00:00 2001 From: Vidith Madhu Date: Tue, 30 Apr 2024 18:27:10 -0500 Subject: [PATCH 53/76] progress on cuda bind1st/bind2nd --- CUDA/GB_cuda_apply.hpp | 20 +++--- CUDA/GB_cuda_apply_bind1st_jit.cpp | 56 +++++++++++++++ CUDA/GB_cuda_apply_bind2nd_jit.cpp | 55 +++++++++++++++ CUDA/GB_cuda_apply_binop.cpp | 51 ++++++++++++++ CUDA/GB_cuda_apply_binop_branch.cpp | 5 +- CUDA/GB_cuda_apply_unop.cpp | 2 +- .../GB_jit_kernel_cuda_apply_bind1st.cu | 4 +- .../GB_jit_kernel_cuda_apply_bind2nd.cu | 44 ++++++++++++ Source/GB_apply_op.c | 68 +++++++++++-------- Source/GB_cuda_gateway.h | 13 +++- Source/Template/GB_jit_kernel_proto.h | 15 +++- notes.txt | 4 +- 12 files changed, 287 insertions(+), 50 deletions(-) create mode 100644 CUDA/GB_cuda_apply_bind1st_jit.cpp create mode 100644 CUDA/GB_cuda_apply_bind2nd_jit.cpp create mode 100644 CUDA/GB_cuda_apply_binop.cpp create mode 100644 CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind2nd.cu diff --git a/CUDA/GB_cuda_apply.hpp b/CUDA/GB_cuda_apply.hpp index 72a7717837..a90899b2b3 100644 --- a/CUDA/GB_cuda_apply.hpp +++ b/CUDA/GB_cuda_apply.hpp @@ -30,12 +30,12 @@ GrB_Info GB_cuda_apply_unop_jit GrB_Info GB_cuda_apply_bind1st_jit ( // output: - GrB_Matrix C, + GB_void *Cx, // input: - GrB_Matrix A, - GrB_Matrix D, - GrB_BinaryOp binaryop, - bool flipxy, + const GrB_Type ctype, + const GrB_BinaryOp op, + const GrB_Matrix A, + const GB_void *xscalar, // CUDA stream and launch parameters: cudaStream_t stream, int32_t gridsz, @@ -45,12 +45,12 @@ GrB_Info GB_cuda_apply_bind1st_jit GrB_Info GB_cuda_apply_bind2nd_jit ( // output: - GrB_Matrix C, + GB_void *Cx, // input: - GrB_Matrix A, - GrB_Matrix D, - GrB_BinaryOp binaryop, - bool flipxy, + const GrB_Type ctype, + const GrB_BinaryOp op, + const GrB_Matrix A, + const GB_void *xscalar, // CUDA stream and launch parameters: cudaStream_t stream, int32_t gridsz, diff --git a/CUDA/GB_cuda_apply_bind1st_jit.cpp b/CUDA/GB_cuda_apply_bind1st_jit.cpp new file mode 100644 index 0000000000..feb3dea847 --- /dev/null +++ b/CUDA/GB_cuda_apply_bind1st_jit.cpp @@ -0,0 +1,56 @@ +#include "GB_cuda_apply.hpp" + +extern "C" +{ + typedef GB_JIT_CUDA_KERNEL_APPLY_BIND1ST_PROTO ((*GB_jit_dl_function)) ; +} + + +GrB_Info GB_cuda_apply_bind1st_jit +( + // output: + GB_void *Cx, + // input: + const GrB_Type ctype, + const GrB_BinaryOp op, + const GrB_Matrix A, + const GB_void *scalarx, + // CUDA stream and launch parameters: + cudaStream_t stream, + int32_t gridsz, + int32_t blocksz +) +{ + //-------------------------------------------------------------------------- + // encodify the problem + //-------------------------------------------------------------------------- + + GB_jit_encoding encoding ; + char *suffix ; + uint64_t hash = GB_encodify_ewise (&encoding, &suffix, + GB_JIT_CUDA_KERNEL_APPLYBIND1, false, false, false, GxB_FULL, ctype, + NULL, false, false, op, false, NULL, A) ; + + //-------------------------------------------------------------------------- + // get the kernel function pointer, loading or compiling it if needed + //-------------------------------------------------------------------------- + + void *dl_function ; + GrB_Info info = GB_jitifyer_load (&dl_function, + GB_jit_ewise_family, "cuda_apply_bind1st", + hash, &encoding, suffix, NULL, NULL, + (GB_Operator) op, ctype, NULL, A->type) ; + if (info != GrB_SUCCESS) { + printf ("oopsies\n") ; + return (info) ; + } + + printf ("did pass here in bind1st_jit\n") ; + + //-------------------------------------------------------------------------- + // call the jit kernel and return result + //-------------------------------------------------------------------------- + + GB_jit_dl_function GB_jit_kernel = (GB_jit_dl_function) dl_function ; + return (GB_jit_kernel (Cx, scalarx, A, stream, gridsz, blocksz)) ; +} diff --git a/CUDA/GB_cuda_apply_bind2nd_jit.cpp b/CUDA/GB_cuda_apply_bind2nd_jit.cpp new file mode 100644 index 0000000000..9cb2619f28 --- /dev/null +++ b/CUDA/GB_cuda_apply_bind2nd_jit.cpp @@ -0,0 +1,55 @@ +#include "GB_cuda_apply.hpp" + +extern "C" +{ + typedef GB_JIT_CUDA_KERNEL_APPLY_BIND2ND_PROTO ((*GB_jit_dl_function)) ; +} + + +GrB_Info GB_cuda_apply_bind2nd_jit +( + // output: + GB_void *Cx, + // input: + const GrB_Type ctype, + const GrB_BinaryOp op, + const GrB_Matrix A, + const GB_void *scalarx, + // CUDA stream and launch parameters: + cudaStream_t stream, + int32_t gridsz, + int32_t blocksz +) +{ + //-------------------------------------------------------------------------- + // encodify the problem + //-------------------------------------------------------------------------- + + GB_jit_encoding encoding ; + char *suffix ; + uint64_t hash = GB_encodify_ewise (&encoding, &suffix, + GB_JIT_CUDA_KERNEL_APPLYBIND2, false, false, false, GxB_FULL, ctype, + NULL, false, false, op, false, A, NULL) ; + + //-------------------------------------------------------------------------- + // get the kernel function pointer, loading or compiling it if needed + //-------------------------------------------------------------------------- + + void *dl_function ; + GrB_Info info = GB_jitifyer_load (&dl_function, + GB_jit_ewise_family, "cuda_apply_bind2nd", + hash, &encoding, suffix, NULL, NULL, + (GB_Operator) op, ctype, A->type, NULL) ; + if (info != GrB_SUCCESS){ + printf ("oopsies\n") ; + return (info) ; + } + printf ("passed here in bind2nd jit\n") ; + + //-------------------------------------------------------------------------- + // call the jit kernel and return result + //-------------------------------------------------------------------------- + + GB_jit_dl_function GB_jit_kernel = (GB_jit_dl_function) dl_function ; + return (GB_jit_kernel (Cx, A, scalarx, stream, gridsz, blocksz)) ; +} diff --git a/CUDA/GB_cuda_apply_binop.cpp b/CUDA/GB_cuda_apply_binop.cpp new file mode 100644 index 0000000000..04194f7cb8 --- /dev/null +++ b/CUDA/GB_cuda_apply_binop.cpp @@ -0,0 +1,51 @@ +#include "GB_cuda_apply.hpp" + +#undef GB_FREE_WORKSPACE +#define GB_FREE_WORKSPACE ; + +#undef GB_FREE_ALL +#define GB_FREE_ALL ; + +#define BLOCK_SIZE 512 +#define LOG2_BLOCK_SIZE 9 + +GrB_Info GB_cuda_apply_binop +( + GB_void *Cx, + const GrB_Type ctype, + const GrB_BinaryOp op, + const GrB_Matrix A, + const GB_void *scalarx, + const bool bind1st +) +{ + + // FIXME: use the stream pool + cudaStream_t stream ; + CUDA_OK (cudaStreamCreate (&stream)) ; + + GrB_Index anz = GB_nnz_held (A) ; + + int32_t gridsz = GB_ICEIL (anz, BLOCK_SIZE) ; + + printf ("passed here, is bind1st? %d\n", bind1st) ; + GrB_Info info ; + if (bind1st) { + info = GB_cuda_apply_bind1st_jit (Cx, ctype, op, A, + scalarx, stream, gridsz, BLOCK_SIZE) ; + } else { + info = GB_cuda_apply_bind2nd_jit (Cx, ctype, op, A, + scalarx, stream, gridsz, BLOCK_SIZE) ; + } + + if (info == GrB_NO_VALUE) info = GrB_PANIC ; + printf ("info is: %d\n", info) ; + GB_OK (info) ; + + CUDA_OK (cudaStreamSynchronize (stream)) ; + CUDA_OK (cudaStreamDestroy (stream)) ; + + GB_FREE_WORKSPACE ; + return GrB_SUCCESS ; + +} diff --git a/CUDA/GB_cuda_apply_binop_branch.cpp b/CUDA/GB_cuda_apply_binop_branch.cpp index b5e01326e9..ccc58de024 100644 --- a/CUDA/GB_cuda_apply_binop_branch.cpp +++ b/CUDA/GB_cuda_apply_binop_branch.cpp @@ -5,8 +5,7 @@ bool GB_cuda_apply_binop_branch ( const GrB_Type ctype, const GrB_BinaryOp op, - const GrB_Matrix A, - const bool bind1st + const GrB_Matrix A ) { bool ok = GB_cuda_type_branch (ctype) && GB_cuda_type_branch (A->type) ; @@ -24,6 +23,8 @@ bool GB_cuda_apply_binop_branch ok = ok && GB_cuda_type_branch (op->ztype) ; } + ok = ok && (op != NULL && op->hash != UINT64_MAX) ; + return (ok) ; } diff --git a/CUDA/GB_cuda_apply_unop.cpp b/CUDA/GB_cuda_apply_unop.cpp index ec40497ac0..1651d66b9c 100644 --- a/CUDA/GB_cuda_apply_unop.cpp +++ b/CUDA/GB_cuda_apply_unop.cpp @@ -43,7 +43,7 @@ GrB_Info GB_cuda_apply_unop GrB_Index anz = GB_nnz_held (A) ; - int32_t gridsz = 1 + (anz >> LOG2_BLOCK_SIZE) ; + int32_t gridsz = GB_ICEIL (anz, BLOCK_SIZE) ; GrB_Info info = GB_cuda_apply_unop_jit (Cx, ctype, op, flipij, A, ythunk_cuda, stream, gridsz, BLOCK_SIZE) ; diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind1st.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind1st.cu index ee98dcdb46..ca7ef6f775 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind1st.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind1st.cu @@ -23,7 +23,7 @@ __global__ void GB_cuda_apply_bind1st_kernel if (!GBB_B (Bb, p)) { continue ; } GB_DECLAREB (bij) ; GB_GETB (bij, Bx, p, false) ; - GB_EWISEOP (Cx, p, x, bij, 0, 0) ; + GB_EWISEOP (Cx, p, x, bij, /* i */, /* j */) ; } } @@ -41,4 +41,4 @@ GB_JIT_CUDA_KERNEL_APPLY_BIND1ST_PROTO (GB_jit_kernel) GB_cuda_apply_bind1st_kernel <<>> (Cx, scalarx, B) ; return (GrB_SUCCESS) ; -} \ No newline at end of file +} diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind2nd.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind2nd.cu new file mode 100644 index 0000000000..a9513879ad --- /dev/null +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind2nd.cu @@ -0,0 +1,44 @@ +using namespace cooperative_groups ; + +__global__ void GB_cuda_apply_bind2nd_kernel +( + GB_void *Cx_out, + GrB_Matrix A, + GB_void *scalarx, +) +{ + const GB_X_TYPE x = * ((GB_X_TYPE *) scalarx) ; // gets scalarx [0] + const GB_A_TYPE *__restrict__ Ax = (GB_B_TYPE *) A->x ; + GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *) Cx_out ; + + const int8_t *__restrict__ Ab = A->b ; + + GB_A_NHELD (nvals) ; + + int tid = blockDim.x * blockIdx.x + threadIdx.x; + int nthreads = blockDim.x * gridDim.x ; + + for (int p = tid ; p < nvals ; p += nthreads) + { + if (!GBB_A (Ab, p)) { continue ; } + GB_DECLAREA (aij) ; + GB_GETA (aij, ax, p, false) ; + GB_EWISEOP (Cx, p, aij, x, /* i */, /* j */) ; + } +} + +extern "C" { + GB_JIT_CUDA_KERNEL_APPLY_BIND1ST_PROTO (GB_jit_kernel) ; +} + +GB_JIT_CUDA_KERNEL_APPLY_BIND1ST_PROTO (GB_jit_kernel) +{ + ASSERT (Cx != NULL) ; + + dim3 grid (gridsz) ; + dim3 block (blocksz) ; + + GB_cuda_apply_bind1st_kernel <<>> (Cx, scalarx, B) ; + + return (GrB_SUCCESS) ; +} diff --git a/Source/GB_apply_op.c b/Source/GB_apply_op.c index 33f2caac11..88a5808b11 100644 --- a/Source/GB_apply_op.c +++ b/Source/GB_apply_op.c @@ -535,40 +535,43 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) // z = binop (scalar,Ax) //------------------------------------------------------------------ - // #if defined ( GRAPHBLAS_HAS_CUDA ) - // if (GB_cuda_apply_binop_branch (ctype, (GrB_BinaryOp) op, A, true)) { - // info = GB_cuda_apply_bind1st_jit (Cx, (GrB_BinaryOp) op, scalarx, A) ; - // } - // #endif + #if defined ( GRAPHBLAS_HAS_CUDA ) + if (GB_cuda_apply_binop_branch (ctype, (GrB_BinaryOp) op, A)) { + info = GB_cuda_apply_binop (Cx, ctype, (GrB_BinaryOp) op, A, scalarx, true) ; + } + #endif #ifndef GBCOMPACT - GB_IF_FACTORY_KERNELS_ENABLED - { - if (GB_binop_builtin (op->xtype, false, Atype, false, - (GrB_BinaryOp) op, false, &opcode, &xcode, &ycode, &zcode)) + if (info == GrB_NO_VALUE) + { + GB_IF_FACTORY_KERNELS_ENABLED { + if (GB_binop_builtin (op->xtype, false, Atype, false, + (GrB_BinaryOp) op, false, &opcode, &xcode, &ycode, &zcode)) + { + + //---------------------------------------------------------- + // define the worker for the switch factory + //---------------------------------------------------------- + + #define GB_bind1st(binop,xname) \ + GB (_bind1st_ ## binop ## xname) + #define GB_BINOP_WORKER(binop,xname) \ + { \ + info = GB_bind1st (binop, xname) (Cx, scalarx, Ax, \ + Ab, anz, A_nthreads) ; \ + } \ + break ; - //---------------------------------------------------------- - // define the worker for the switch factory - //---------------------------------------------------------- - - #define GB_bind1st(binop,xname) \ - GB (_bind1st_ ## binop ## xname) - #define GB_BINOP_WORKER(binop,xname) \ - { \ - info = GB_bind1st (binop, xname) (Cx, scalarx, Ax, \ - Ab, anz, A_nthreads) ; \ - } \ - break ; - - //---------------------------------------------------------- - // launch the switch factory - //---------------------------------------------------------- + //---------------------------------------------------------- + // launch the switch factory + //---------------------------------------------------------- - #define GB_NO_FIRST - #define GB_NO_SECOND - #define GB_NO_PAIR - #include "GB_binop_factory.c" + #define GB_NO_FIRST + #define GB_NO_SECOND + #define GB_NO_PAIR + #include "GB_binop_factory.c" + } } } #endif @@ -591,7 +594,12 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) // z = binop (Ax,scalar) //------------------------------------------------------------------ - // TODO: binop bind2nd CUDA JIT entry point here + #if defined ( GRAPHBLAS_HAS_CUDA ) + if (GB_cuda_apply_binop_branch (ctype, (GrB_BinaryOp) op, A)) { + info = GB_cuda_apply_binop (Cx, ctype, (GrB_BinaryOp) op, A, scalarx, false) ; + } + #endif + #ifndef GBCOMPACT GB_IF_FACTORY_KERNELS_ENABLED diff --git a/Source/GB_cuda_gateway.h b/Source/GB_cuda_gateway.h index 0375e38a1d..b2d074e215 100644 --- a/Source/GB_cuda_gateway.h +++ b/Source/GB_cuda_gateway.h @@ -172,8 +172,7 @@ bool GB_cuda_apply_binop_branch ( const GrB_Type ctype, const GrB_BinaryOp op, - const GrB_Matrix A, - const bool bind1st + const GrB_Matrix A ) ; bool GB_cuda_apply_unop_branch @@ -193,6 +192,16 @@ GrB_Info GB_cuda_apply_unop const GB_void *ythunk ) ; +GrB_Info GB_cuda_apply_binop +( + GB_void *Cx, + const GrB_Type ctype, + const GrB_BinaryOp op, + const GrB_Matrix A, + const GB_void *scalarx, + const bool bind1st +) ; + bool GB_cuda_type_branch // return true if the type is OK on GPU ( diff --git a/Source/Template/GB_jit_kernel_proto.h b/Source/Template/GB_jit_kernel_proto.h index 145c63edf7..2a47a7a695 100644 --- a/Source/Template/GB_jit_kernel_proto.h +++ b/Source/Template/GB_jit_kernel_proto.h @@ -598,8 +598,19 @@ GrB_Info GB_jit_kernel_colscale \ GrB_Info GB_jit_kernel_apply_bind1st \ ( \ GB_void *Cx, \ - GB_void *scalarx, \ - GrB_Matrix B \ + const GB_void *scalarx, \ + GrB_Matrix B, \ + cudaStream_t stream, \ + int32_t gridsz, \ + int32_t blocksz \ +) \ + +#define GB_JIT_CUDA_KERNEL_APPLY_BIND2ND_PROTO(GB_jit_kernel_apply_bind2nd) \ +GrB_Info GB_jit_kernel_apply_bind2nd \ +( \ + GB_void *Cx, \ + GrB_Matrix A, \ + const GB_void *scalarx, \ cudaStream_t stream, \ int32_t gridsz, \ int32_t blocksz \ diff --git a/notes.txt b/notes.txt index d6e9031b88..c1d6c32e14 100644 --- a/notes.txt +++ b/notes.txt @@ -195,7 +195,8 @@ Kernel development notes: 1. Positional op (not user-defined, but can still be an indexunaryop) - Handles all 3 of above ops, positional variants, not user-defined - Handled by templates (NOT JIT) - - Ideally, should be handled by JIT. Problem: positional binops not jitted + - Ideally, should be handled by JIT. Problem: positional binops not handled by + GB_macrofy_apply. - Solution: Convert positional binops to positional unops 2. Iso op - When C is iso. Handled by iso kernel (NOT JIT) @@ -232,6 +233,7 @@ Kernel development notes: - A matrix b. Needed for branch input: - Requirements for non-positional branch input + - IMPORTANT: Make sure the op is jittable, else will fail due to error handling From a566ab8250db8e2684b718a1a899e3641735391f Mon Sep 17 00:00:00 2001 From: Vidith Madhu Date: Thu, 2 May 2024 23:27:00 -0500 Subject: [PATCH 54/76] cuda bind1st/bind2nd working --- CUDA/GB_cuda_apply_binop.cpp | 30 ++++++++--- .../GB_jit_kernel_cuda_apply_bind1st.cu | 4 +- .../GB_jit_kernel_cuda_apply_bind2nd.cu | 12 ++--- .../GB_jit_kernel_cuda_apply_unop.cu | 11 ++-- .../JitKernels/GB_jit_kernel_cuda_colscale.cu | 9 ++-- Source/GB_apply_op.c | 53 ++++++++++--------- 6 files changed, 71 insertions(+), 48 deletions(-) diff --git a/CUDA/GB_cuda_apply_binop.cpp b/CUDA/GB_cuda_apply_binop.cpp index 04194f7cb8..f669bd6212 100644 --- a/CUDA/GB_cuda_apply_binop.cpp +++ b/CUDA/GB_cuda_apply_binop.cpp @@ -1,7 +1,10 @@ #include "GB_cuda_apply.hpp" #undef GB_FREE_WORKSPACE -#define GB_FREE_WORKSPACE ; +#define GB_FREE_WORKSPACE \ +{ \ + GB_FREE_WORK (&scalarx_cuda, scalarx_cuda_size) ; \ +} #undef GB_FREE_ALL #define GB_FREE_ALL ; @@ -19,7 +22,24 @@ GrB_Info GB_cuda_apply_binop const bool bind1st ) { - + ASSERT (scalarx != NULL) ; + // make a copy of scalarx to ensure it's not on the CPU stack + GB_void *scalarx_cuda = NULL ; + size_t scalarx_cuda_size = 0 ; + if (bind1st) + { + scalarx_cuda = GB_MALLOC_WORK (op->xtype->size, GB_void, &scalarx_cuda_size) ; + } + else + { + scalarx_cuda = GB_MALLOC_WORK (op->ytype->size, GB_void, &scalarx_cuda_size) ; + } + if (scalarx_cuda == NULL) + { + return (GrB_OUT_OF_MEMORY) ; + } + memcpy (scalarx_cuda, scalarx, scalarx_cuda_size) ; + // FIXME: use the stream pool cudaStream_t stream ; CUDA_OK (cudaStreamCreate (&stream)) ; @@ -28,18 +48,16 @@ GrB_Info GB_cuda_apply_binop int32_t gridsz = GB_ICEIL (anz, BLOCK_SIZE) ; - printf ("passed here, is bind1st? %d\n", bind1st) ; GrB_Info info ; if (bind1st) { info = GB_cuda_apply_bind1st_jit (Cx, ctype, op, A, - scalarx, stream, gridsz, BLOCK_SIZE) ; + scalarx_cuda, stream, gridsz, BLOCK_SIZE) ; } else { info = GB_cuda_apply_bind2nd_jit (Cx, ctype, op, A, - scalarx, stream, gridsz, BLOCK_SIZE) ; + scalarx_cuda, stream, gridsz, BLOCK_SIZE) ; } if (info == GrB_NO_VALUE) info = GrB_PANIC ; - printf ("info is: %d\n", info) ; GB_OK (info) ; CUDA_OK (cudaStreamSynchronize (stream)) ; diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind1st.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind1st.cu index ca7ef6f775..d1018ce76f 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind1st.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind1st.cu @@ -3,8 +3,8 @@ using namespace cooperative_groups ; __global__ void GB_cuda_apply_bind1st_kernel ( GB_void *Cx_out, - GB_void *scalarx, - GrB_Matrix B, + const GB_void *scalarx, + GrB_Matrix B ) { const GB_X_TYPE x = * ((GB_X_TYPE *) scalarx) ; // gets scalarx [0] diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind2nd.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind2nd.cu index a9513879ad..eb91055e45 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind2nd.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind2nd.cu @@ -4,11 +4,11 @@ __global__ void GB_cuda_apply_bind2nd_kernel ( GB_void *Cx_out, GrB_Matrix A, - GB_void *scalarx, + const GB_void *scalarx ) { const GB_X_TYPE x = * ((GB_X_TYPE *) scalarx) ; // gets scalarx [0] - const GB_A_TYPE *__restrict__ Ax = (GB_B_TYPE *) A->x ; + const GB_A_TYPE *__restrict__ Ax = (GB_A_TYPE *) A->x ; GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *) Cx_out ; const int8_t *__restrict__ Ab = A->b ; @@ -22,23 +22,23 @@ __global__ void GB_cuda_apply_bind2nd_kernel { if (!GBB_A (Ab, p)) { continue ; } GB_DECLAREA (aij) ; - GB_GETA (aij, ax, p, false) ; + GB_GETA (aij, Ax, p, false) ; GB_EWISEOP (Cx, p, aij, x, /* i */, /* j */) ; } } extern "C" { - GB_JIT_CUDA_KERNEL_APPLY_BIND1ST_PROTO (GB_jit_kernel) ; + GB_JIT_CUDA_KERNEL_APPLY_BIND2ND_PROTO (GB_jit_kernel) ; } -GB_JIT_CUDA_KERNEL_APPLY_BIND1ST_PROTO (GB_jit_kernel) +GB_JIT_CUDA_KERNEL_APPLY_BIND2ND_PROTO (GB_jit_kernel) { ASSERT (Cx != NULL) ; dim3 grid (gridsz) ; dim3 block (blocksz) ; - GB_cuda_apply_bind1st_kernel <<>> (Cx, scalarx, B) ; + GB_cuda_apply_bind2nd_kernel <<>> (Cx, A, scalarx) ; return (GrB_SUCCESS) ; } diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_unop.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_unop.cu index 8f6f7f0988..f75ddb8571 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_unop.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_unop.cu @@ -63,13 +63,14 @@ __global__ void GB_cuda_apply_unop_kernel int64_t kfirst = GB_cuda_ek_slice_setup (Ap, anvec, anz, pfirst, chunk_size, &my_chunk_size, &anvec_sub1, &slope) ; - for (int64_t curr_p = threadIdx.x ; curr_p < my_chunk_size ; curr_p += blockDim.x) + for (int64_t pdelta = threadIdx.x ; pdelta < my_chunk_size ; pdelta += blockDim.x) { - int64_t k = GB_cuda_ek_slice_entry (curr_p, pfirst, Ap, anvec_sub1, kfirst, slope) ; + int64_t p_final ; + int64_t k = GB_cuda_ek_slice_entry (&p_final, pdelta, pfirst, Ap, anvec_sub1, kfirst, slope) ; int64_t col_idx = GBH_A (Ah, k) ; - int64_t row_idx = GBI_A (Ai, pfirst + curr_p, avlen) ; + int64_t row_idx = GBI_A (Ai, p_final, avlen) ; - GB_UNOP (Cx, pfirst + curr_p, Ax, pfirst + curr_p, + GB_UNOP (Cx, p_final, Ax, p_final, A_iso, row_idx, col_idx, thunk_value) ; } } @@ -96,4 +97,4 @@ GB_JIT_CUDA_KERNEL_APPLY_UNOP_PROTO (GB_jit_kernel) GB_cuda_apply_unop_kernel <<>> (Cx, ythunk, A) ; return (GrB_SUCCESS) ; -} \ No newline at end of file +} diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu index 27ab3dc694..d1077cd377 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu @@ -68,16 +68,17 @@ __global__ void GB_cuda_colscale_kernel // can distort the usefulness of the slope (will require an exhaustive linear search) // for a large range of entries - for (int64_t curr_p = threadIdx.x ; curr_p < my_chunk_size ; curr_p += blockDim.x) + for (int64_t pdelta = threadIdx.x ; pdelta < my_chunk_size ; pdelta += blockDim.x) { - int64_t k = GB_cuda_ek_slice_entry (curr_p, pfirst, Ap, anvec_sub1, kfirst, slope) ; + int64_t p_final ; + int64_t k = GB_cuda_ek_slice_entry (&p_final, pdelta, pfirst, Ap, anvec_sub1, kfirst, slope) ; k = GBH_A (Ah, k) ; GB_DECLAREB (dii) ; GB_GETB (dii, Dx, k, ) ; GB_DECLAREA (aij) ; - GB_GETA (aij, Ax, pfirst + curr_p, ) ; - GB_EWISEOP (Cx, pfirst + curr_p, aij, dii, 0, 0) ; + GB_GETA (aij, Ax, p_final, ) ; + GB_EWISEOP (Cx, p_final, aij, dii, 0, 0) ; } } #endif diff --git a/Source/GB_apply_op.c b/Source/GB_apply_op.c index 88a5808b11..d810f644e1 100644 --- a/Source/GB_apply_op.c +++ b/Source/GB_apply_op.c @@ -602,34 +602,37 @@ GrB_Info GB_apply_op // apply a unary op, idxunop, or binop, Cx = op (A) #ifndef GBCOMPACT - GB_IF_FACTORY_KERNELS_ENABLED - { - if (GB_binop_builtin (Atype, false, op->ytype, false, - (GrB_BinaryOp) op, false, &opcode, &xcode, &ycode, &zcode)) - { + if (info == GrB_NO_VALUE) + { + GB_IF_FACTORY_KERNELS_ENABLED + { + if (GB_binop_builtin (Atype, false, op->ytype, false, + (GrB_BinaryOp) op, false, &opcode, &xcode, &ycode, &zcode)) + { - //---------------------------------------------------------- - // define the worker for the switch factory - //---------------------------------------------------------- - - #define GB_bind2nd(binop,xname) \ - GB (_bind2nd_ ## binop ## xname) - #undef GB_BINOP_WORKER - #define GB_BINOP_WORKER(binop,xname) \ - { \ - info = GB_bind2nd (binop, xname) (Cx, Ax, scalarx, \ - Ab, anz, A_nthreads) ; \ - } \ - break ; + //---------------------------------------------------------- + // define the worker for the switch factory + //---------------------------------------------------------- - //---------------------------------------------------------- - // launch the switch factory - //---------------------------------------------------------- + #define GB_bind2nd(binop,xname) \ + GB (_bind2nd_ ## binop ## xname) + #undef GB_BINOP_WORKER + #define GB_BINOP_WORKER(binop,xname) \ + { \ + info = GB_bind2nd (binop, xname) (Cx, Ax, scalarx, \ + Ab, anz, A_nthreads) ; \ + } \ + break ; + + //---------------------------------------------------------- + // launch the switch factory + //---------------------------------------------------------- - #define GB_NO_FIRST - #define GB_NO_SECOND - #define GB_NO_PAIR - #include "GB_binop_factory.c" + #define GB_NO_FIRST + #define GB_NO_SECOND + #define GB_NO_PAIR + #include "GB_binop_factory.c" + } } } #endif From 4bc95fca8bfd107440dce7012dfc32ae6fe46085 Mon Sep 17 00:00:00 2001 From: Vidith Madhu Date: Thu, 2 May 2024 23:49:46 -0500 Subject: [PATCH 55/76] removed progress notes --- notes.txt | 239 ------------------------------------------------------ 1 file changed, 239 deletions(-) delete mode 100644 notes.txt diff --git a/notes.txt b/notes.txt deleted file mode 100644 index c1d6c32e14..0000000000 --- a/notes.txt +++ /dev/null @@ -1,239 +0,0 @@ -Structure of JIT kernel source (CPU): - -Enums: -GB_jit_family - - Enum mapping family name (i.e. GB_jit_ewise_family) - - Family of methods supported by the JIT - - Branches off into individual kernels/kcodes -GB_jit_kcode: - - Enum mapping kcode names (i.e. GB_JIT_KERNEL_ROWSCALE) to a kcode number - - CUDA kcodes: >= 1000 - -Structs: -GB_jit_encoding - - Tracks code, kcode, and suffix_len of a problem instance - - code: pinpoints specific instance of problem - - kcode: pinpoints which kernel - - suffix_len: length of kname suffix (may be needed for user-defined types/operators) - -Process: -1. Encodifying: - - Happens in the jit entry point (*_jit functions) - - Calls GB_encodify_{family_name} - - Encodify takes the objects needed for encodifying that family, and the kcode - - For reduce, the input objects would be a monoid and input matrix - - For select, right now needs output characteristics, indexunaryop used for selecting, input matrix, and some other things - - The actual output matrix is not always needed, but may be in certain cases to determine if e.g. atomics are available - - Encodify gives a GB_jit_encoding, the kname suffix, and returns a hash of the entire encoding - - The hash will be invalid (UINT64_MAX) if the encoding is invalid - - a. Enumifying: - - Happens as a step during encodifying - - enumify function exists for all jit families, but extra enumifies may exist where - needed in order to compute family-level enumifies (for example, enumify_sparsity) - - Enumify takes the objects needed to be enumified - - Enumify gives the rcode. Some enumifies don't use too many bits for their rcodes. - Others (like mxm) use a lot. - -2. GB_jitifyer_load - - Main entry point to the JIT - - Takes the family, kname, encoding hash, encoding, kname suffix - - Also takes 5 objects: A semiring, monoid, operator, and 3 types - - These are optional, and depend on the kernel being jitifyed. - - Gives the function to be called - - a. Preliminary steps - - Determines if JIT is enabled (GB_jit_control) - - JIT can be in 5 modes: GxB_JIT_{OFF | PAUSE | RUN | LOAD | ON} - - If in RUN mode and not jitting a user type/op, attempts to lookup in table and run - - Load vs. looking up: Load means dlopen the library - - b. Goes to GB_jitifyer_worker - -3. GB_jitifyer_worker - - Worker function that does hash table lookup, followed by kernel load/compile - - Takes same input as GB_jitifyer_load - - Guarded by critical section: only one thread per process may invoke at a time - - Further, since load/compile alters the filesystem, mutual exclusion must be - enforced across processes. For this reason, a file lock is used. - - a. Performs hash table lookup for function - - Quits early if succeeds - b. Calls macrofy_name to get full kernel_name - c. File locking - d. Calls GB_jitifyer_load_worker, which finishes the load/compile step - - -4. GB_jitifyer_load_worker - - Does main load/compile work, inside both intra-process (critical section) and inter-process (file lock) - guards - a. Checks if kernel is already compiled - b. - -Macrofying: - 1. macrofy_preface - - Prints version, date, dislaimer header - - Includes GB_jit_kernel.h - - Setup for kernels - - Includes GB_Template.h which includes all main GraphBLAS headers - - undef's structure access macros to be redefined below - 2. macrofy_family - - Main part of macrofy - - Prints the family-relevant macros - - Starts by switching over kernel family (apply, reduce, mxm, ...) - - Low-level macrofy extracts problem characteristics from - encoding code - - Uses macrofy_input to print macros for matrix access - 3. Handle pre-jit case: - #ifndef GB_JIT_RUNTIME ... - #endif - - 4. #include kernel source (named GB_jit_kernel_{kname}.c) - - Will include templates within - - In Source/JitKernels and Source/Template respectively - 5. macrofy_query - - Writes the query function that returns the problem characteristics - using the given encoding - -Old GPU JIT notes: -- Entry point: cpp file like GB_AxB_dot3_cuda_jit.cpp. This is analogous to a *_jit.c file for the CPU jit - - Uses a problem factory to store problem details (i.e. *reduce_factory, *mxm_factory). This is a FileDesc. - - More specifically, the {reduce_factory, mxm_factory, ...} etc. function is called with the problem args to "build" the details - - Uses enumify internally to build the sr_code, source filename with the format "GB_{family}_{sr_code}.h" - - Exposes a macrofy function, that given a FILE* fp, will use the CPU macrofy to dump the family macros (does NOT include the preface, query, etc.) - - Uses a jit factory for things like checking for the function in cache and launching the function - - *cuda_common_jitFactory.hpp: Has compiler flags -- Unlike CPU side, the main code is not in the Templates folder but JitKernels - - - -New GPU JIT notes: -- Moving away from NVIDIA jitifyer, integrating with GraphBLAS JIT -- 3-stage structure: - 1. Entry point (GB_cuda_{problem}.cpp): decides initial things (such as if atomics are available (has_cheeseburger)) - 2. JIT entry (GB_cuda_{problem}_jit.cpp): similar in structure to the CPU jit entries. Computes encoding, calls jitifyer_load, calls returned - function - 3. JitKernel code (JitKernels/GB_jit_kernel_cuda_{problem}.cu): What gets run by the jit. Unlike NVIDIA jitifyer, has host code in it (proto function) - that gets returned by the jitifyer. Advantage of the host proto function: can manage multiple kernel launches in a single run - - -Progress notes: -Kernel development notes: -- Useful guide: https://docs.nvidia.com/cuda/cuda-c-best-practices-guide/index.html -- Good tips: https://on-demand.gputechconf.com/gtc/2017/presentation/s7122-stephen-jones-cuda-optimization-tips-tricks-and-techniques.pdf -- Resources for warp-level primitives/reduction techniques: - - https://developer.nvidia.com/blog/using-cuda-warp-level-primitives/ - - https://developer.download.nvidia.com/assets/cuda/files/reduction.pdf -- Fork GraphBLAS, establish personal branch -- Start with rowscale - - Understand how rowscale works on CPU - - Mainly need to analyze rowscale template code - - Understand structure of CUDA kernel (entry point, jit point, etc.) - -- Overall plan: - - Start working on template code - - Work backwards to entry point/jit entry - -- Rowscale notes: - - Do NOT use GB_PARTITION to divide work for threads - - Do not want consecutive threads operating on blocks of data - with large separation between them, since they will reside on the - same warp and cause locality issues. This means that each thread should - "jump" through the data by the grid/block size. - -- Colscale notes: - - Key idea: At the kernel level, generally all matrices are viewed as being stored by column - - Issue with colscale: Cannot easily identify the column that an entry belongs to - - cuda_ek_slice: slices e entries among ntasks tasks - - Applies only for sparse/hypersparse formats - - Example: CUDA/Template/GB_cuda_jit_AxB_dot3_dense_phase1 - - Core idea: - - Divide work into chunks (size of chunk given by max_pchunk) - - One threadblock may own multiple chunks; staggered - - blk 0 will start at chunk 0, then chunk gridDim, then gridDim * 2, ... - - hybrid approach for work distribution; thread allocation contiguous within chunks but jumps across chunks - - - 3 components: - 1. cuda_ek_slice - - Takes Ap, anvec, anz, pfirst (first entry of work for this threadblock), - max_pchunk - - Computes ks for all entries in the given chunk [pfirst, min(pfirst + max_pchunk - 1, anz - 1)] - 2. cuda_ek_slice_setup - - Gives the kfirst/klast estimates, slope - - slope: rate at which k changes w.r.t one step of p - - sparser matrices -> bigger slope (intuition) - 3. cuda_ek_slice_entry - - Uses estimates + slope from ek_slice_setup to get an exact - k-value for a p-value - -- Apply notes: - - Can use a unary op, index unary op, or binary op - - Entry point: GB_apply - - Main work: GB_apply_op - - Overview of all ops: - 1. unops (GrB_UnaryOp): - - Have both positional/non-positional - - Non-positional are plain z = f(x), and can be user-defined - - Positional: GxB_POSITION* (does NOT depend on x). CANNOT be user-defined, non-spec - - f(x) = i/j - 2. binops (GrB_BinaryOp): - - Like unop, has positional/non-positional - - Non-positional: are plain z = f(x, y), can be user-defined - - Positional: GxB_{FIRST | SECOND}* (does NOT depend on x, y). CANNOT be user-defined, non-spec - - Always gives row/col, based on I or J name - 3. indexunaryops (GrB_IndexUnaryOp) - - Part of spec, fulfill the role of positional unops - - Only positional op that can be user-defined - - While positional unops do NOT consider the input, - IndexUnaryOps can (the "thunk") - - thunk can be used for comparisons, add a constant offset, etc - - - Positional ops always return int64, int32, or bool - - Non-positional return type can be based on type of matrix - - - 5 cases for apply_op: - 1. Positional op (not user-defined, but can still be an indexunaryop) - - Handles all 3 of above ops, positional variants, not user-defined - - Handled by templates (NOT JIT) - - Ideally, should be handled by JIT. Problem: positional binops not handled by - GB_macrofy_apply. - - Solution: Convert positional binops to positional unops - 2. Iso op - - When C is iso. Handled by iso kernel (NOT JIT) - 3. Unary op (not positional) - - Tries factory kernel, then CUDA JIT, then JIT then generic - 4. Binary op (not positional) - - bind1st/bind2nd: is the scalar on left or right - - Same process as (3) - 5. User-defined indexunaryop - - Need to handle all "depends on" cases (i, j, y) since - user-defined - - - Progress notes: - - binops (bind1st/bind2nd) -> straightforward - - unops: - 1. Positional ops: needs to handle positional unops and idxunops - a. Needed for input: - - Cx (of type int64_t, int32_t, or bool respectively, can get by GB_C_TYPE) - - thunk - - A matrix - b. Needed for branch input: - - None for now? (should always be true?) - 2. Non-positional ops - a. Needed for input: - - Cx (could be whatever type) - - A matrix - b. Needed for branch input: - - Ctype - - A matrix (for checking A->type) - 3. Consolidated kernel: - a. Needed for input: - - Cx (whatever type) - - thunk - - A matrix - b. Needed for branch input: - - Requirements for non-positional branch input - - IMPORTANT: Make sure the op is jittable, else will fail due to error handling - - - From 3f54d14f9fea97abc083ce5c1f09117bb63e9ff7 Mon Sep 17 00:00:00 2001 From: Vidith Madhu Date: Fri, 3 May 2024 11:56:58 -0500 Subject: [PATCH 56/76] small bug fixes; remove debug printing; eliminate unecessary jit compiler warnings --- CUDA/GB_cuda_apply_bind1st_jit.cpp | 3 -- CUDA/GB_cuda_apply_bind2nd_jit.cpp | 2 - .../GB_jit_kernel_cuda_apply_bind1st.cu | 4 +- .../GB_jit_kernel_cuda_apply_bind2nd.cu | 6 ++- .../GB_jit_kernel_cuda_apply_unop.cu | 33 ++++++++---- .../JitKernels/GB_jit_kernel_cuda_colscale.cu | 23 ++++++--- .../JitKernels/GB_jit_kernel_cuda_rowscale.cu | 9 ++++ Source/GB_colscale.c | 1 + Source/GB_rowscale.c | 51 +++++++++---------- Source/Template/GB_jit_kernel_proto.h | 2 +- 10 files changed, 82 insertions(+), 52 deletions(-) diff --git a/CUDA/GB_cuda_apply_bind1st_jit.cpp b/CUDA/GB_cuda_apply_bind1st_jit.cpp index feb3dea847..977a1919c6 100644 --- a/CUDA/GB_cuda_apply_bind1st_jit.cpp +++ b/CUDA/GB_cuda_apply_bind1st_jit.cpp @@ -41,11 +41,8 @@ GrB_Info GB_cuda_apply_bind1st_jit hash, &encoding, suffix, NULL, NULL, (GB_Operator) op, ctype, NULL, A->type) ; if (info != GrB_SUCCESS) { - printf ("oopsies\n") ; return (info) ; } - - printf ("did pass here in bind1st_jit\n") ; //-------------------------------------------------------------------------- // call the jit kernel and return result diff --git a/CUDA/GB_cuda_apply_bind2nd_jit.cpp b/CUDA/GB_cuda_apply_bind2nd_jit.cpp index 9cb2619f28..fa330cbaef 100644 --- a/CUDA/GB_cuda_apply_bind2nd_jit.cpp +++ b/CUDA/GB_cuda_apply_bind2nd_jit.cpp @@ -41,10 +41,8 @@ GrB_Info GB_cuda_apply_bind2nd_jit hash, &encoding, suffix, NULL, NULL, (GB_Operator) op, ctype, A->type, NULL) ; if (info != GrB_SUCCESS){ - printf ("oopsies\n") ; return (info) ; } - printf ("passed here in bind2nd jit\n") ; //-------------------------------------------------------------------------- // call the jit kernel and return result diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind1st.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind1st.cu index d1018ce76f..b373dda3d8 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind1st.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind1st.cu @@ -11,8 +11,10 @@ __global__ void GB_cuda_apply_bind1st_kernel const GB_B_TYPE *__restrict__ Bx = (GB_B_TYPE *) B->x ; GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *) Cx_out ; + #if ( GB_B_IS_BITMAP ) const int8_t *__restrict__ Bb = B->b ; - + #endif + GB_B_NHELD (nvals) ; int tid = blockDim.x * blockIdx.x + threadIdx.x; diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind2nd.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind2nd.cu index eb91055e45..a4c2407e81 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind2nd.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_bind2nd.cu @@ -7,12 +7,14 @@ __global__ void GB_cuda_apply_bind2nd_kernel const GB_void *scalarx ) { - const GB_X_TYPE x = * ((GB_X_TYPE *) scalarx) ; // gets scalarx [0] + const GB_Y_TYPE x = * ((GB_Y_TYPE *) scalarx) ; // gets scalarx [0] const GB_A_TYPE *__restrict__ Ax = (GB_A_TYPE *) A->x ; GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *) Cx_out ; + #if ( GB_A_IS_BITMAP ) const int8_t *__restrict__ Ab = A->b ; - + #endif + GB_A_NHELD (nvals) ; int tid = blockDim.x * blockIdx.x + threadIdx.x; diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_unop.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_unop.cu index f75ddb8571..1603417a2f 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_apply_unop.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_apply_unop.cu @@ -16,11 +16,19 @@ __global__ void GB_cuda_apply_unop_kernel GB_A_NHELD (anz) ; const GB_A_TYPE *__restrict__ Ax = (GB_A_TYPE *) A->x ; + + #if ( GB_A_IS_SPARSE || GB_A_IS_HYPER ) const int64_t *__restrict__ Ai = (int64_t *) A->i ; const int64_t *__restrict__ Ah = (int64_t *) A->h ; - const int64_t *__restrict__ Ap = (int64_t *) A->p ; - const int8_t *__restrict__ Ab = (int8_t *) A->b ; + #if ( GB_DEPENDS_ON_J ) + const int64_t *__restrict__ Ap = (int64_t *) A->p ; + #endif + #endif + #if ( GB_A_IS_BITMAP ) + const int8_t *__restrict__ Ab = (int8_t *) A->b ; + #endif + GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *) Cx_out; #define A_iso GB_A_ISO @@ -28,9 +36,6 @@ __global__ void GB_cuda_apply_unop_kernel int tid = blockDim.x * blockIdx.x + threadIdx.x ; int nthreads = blockDim.x * gridDim.x ; - const int64_t anvec = A->nvec ; - const int64_t avlen = A->vlen ; - #if ( GB_DEPENDS_ON_Y ) // get thunk value (of type GB_Y_TYPE) GB_Y_TYPE thunk_value = * ((GB_Y_TYPE *) thunk) ; @@ -45,14 +50,20 @@ __global__ void GB_cuda_apply_unop_kernel { if (!GBB_A (Ab, p)) { continue ; } - int64_t col_idx = p / avlen ; - int64_t row_idx = p % avlen ; + #if ( GB_DEPENDS_ON_I ) + int64_t row_idx = p % A->vlen ; + #endif + + #if ( GB_DEPENDS_ON_J ) + int64_t col_idx = p / A->vlen ; + #endif + GB_UNOP (Cx, p, Ax, p, A_iso, row_idx, col_idx, thunk_value) ; } #else - // sparse/hypersparse case #if ( GB_DEPENDS_ON_J ) + const int64_t anvec = A->nvec ; // need to do ek_slice method for (int64_t pfirst = blockIdx.x << log2_chunk_size ; pfirst < anz ; @@ -68,13 +79,17 @@ __global__ void GB_cuda_apply_unop_kernel int64_t p_final ; int64_t k = GB_cuda_ek_slice_entry (&p_final, pdelta, pfirst, Ap, anvec_sub1, kfirst, slope) ; int64_t col_idx = GBH_A (Ah, k) ; - int64_t row_idx = GBI_A (Ai, p_final, avlen) ; + + #if ( GB_DEPENDS_ON_I ) + int64_t row_idx = GBI_A (Ai, p_final, A->vlen) ; + #endif GB_UNOP (Cx, p_final, Ax, p_final, A_iso, row_idx, col_idx, thunk_value) ; } } #else + const int64_t avlen = A->vlen ; // can do normal method for (int64_t p = tid ; p < anz ; p += nthreads) { diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu index d1077cd377..904b159590 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_colscale.cu @@ -9,32 +9,38 @@ using namespace cooperative_groups ; __global__ void GB_cuda_colscale_kernel ( GrB_Matrix C, - GrB_Matirx A, + GrB_Matrix A, GrB_Matrix D ) { const GB_A_TYPE *__restrict__ Ax = (GB_A_TYPE *) A->x ; - const GB_B_TYPE *__restrict__ Dx = (GB_B_TYPE *) B->x ; + const GB_B_TYPE *__restrict__ Dx = (GB_B_TYPE *) D->x ; GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *) C->x ; -// const int64_t *__restrict__ Ai = A->i ; + #if ( GB_A_IS_SPARSE || GB_A_IS_HYPER ) const int64_t *__restrict__ Ap = A->p ; - const int64_t *__restrict__ Ah = A->h ; + #if ( GB_A_IS_HYPER ) + const int64_t *__restrict__ Ah = A->h ; + #endif + #endif + + #if ( GB_A_IS_BITMAP ) const int8_t *__restrict__ Ab = A->b ; + #endif + GB_A_NHELD (anz) ; - const int64_t anvec = A->nvec ; - const int64_t avlen = A->vlen ; #if (GB_A_IS_BITMAP || GB_A_IS_FULL) + const int64_t avlen = A->vlen ; // bitmap/full case int ntasks = blockDim.x * gridDim.x ; int tid = blockIdx.x * blockDim.x + threadIdx.x ; for (int64_t p = tid ; p < anz ; p += ntasks) { // ask Joe: - #ifdef GB_A_IS_BITMAP - if (!GBB_A (Ab, p)) { continue ; } + #if ( GB_A_IS_BITMAP ) + if (!GBB_A (Ab, p)) { continue ; } #endif // the pth entry in A is A(i,j) where i = p%avlen and j = p/avlen @@ -48,6 +54,7 @@ __global__ void GB_cuda_colscale_kernel GB_EWISEOP (Cx, p, aij, dii, 0, 0) ; } #else + const int64_t anvec = A->nvec ; // sparse/hypersparse case (cuda_ek_slice only works for sparse/hypersparse) for (int64_t pfirst = blockIdx.x << log2_chunk_size ; pfirst < anz ; diff --git a/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu b/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu index 0dd05a15de..8d3d9ee363 100644 --- a/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu +++ b/CUDA/JitKernels/GB_jit_kernel_cuda_rowscale.cu @@ -15,10 +15,19 @@ __global__ void GB_cuda_rowscale_kernel #define D_iso GB_A_ISO #define B_iso GB_B_ISO + #if ( GB_B_IS_SPARSE || GB_B_IS_HYPER ) const int64_t *__restrict__ Bi = B->i ; + #endif + + #if ( GB_B_IS_BITMAP ) const int8_t *__restrict__ Bb = B->b ; + #endif + GB_B_NHELD (bnz) ; + + #if ( GB_A_IS_BITMAP || GB_A_IS_FULL ) const int64_t bvlen = B->vlen ; + #endif int ntasks = gridDim.x * blockDim.x; int tid = blockIdx.x * blockDim.x + threadIdx.x; diff --git a/Source/GB_colscale.c b/Source/GB_colscale.c index 024c1477e4..c0b69ee679 100644 --- a/Source/GB_colscale.c +++ b/Source/GB_colscale.c @@ -234,6 +234,7 @@ GrB_Info GB_colscale // C = A*D, column scale with diagonal D #ifndef GBCOMPACT GB_IF_FACTORY_KERNELS_ENABLED + if (info == GrB_NO_VALUE) { //------------------------------------------------------------------ diff --git a/Source/GB_rowscale.c b/Source/GB_rowscale.c index ae52a5a375..f43eabb3b1 100644 --- a/Source/GB_rowscale.c +++ b/Source/GB_rowscale.c @@ -216,35 +216,34 @@ GrB_Info GB_rowscale // C = D*B, row scale with diagonal D #ifndef GBCOMPACT GB_IF_FACTORY_KERNELS_ENABLED - if (info == GrB_NO_VALUE){ - { + if (info == GrB_NO_VALUE) + { - //------------------------------------------------------------------ - // define the worker for the switch factory - //------------------------------------------------------------------ + //------------------------------------------------------------------ + // define the worker for the switch factory + //------------------------------------------------------------------ - #define GB_DxB(mult,xname) GB (_DxB_ ## mult ## xname) + #define GB_DxB(mult,xname) GB (_DxB_ ## mult ## xname) - #define GB_BINOP_WORKER(mult,xname) \ - { \ - info = GB_DxB(mult,xname) (C, D, B, nthreads) ; \ - } \ - break ; - - //------------------------------------------------------------------ - // launch the switch factory - //------------------------------------------------------------------ - - GB_Type_code xcode, ycode, zcode ; - if (GB_binop_builtin (D->type, D_is_pattern, B->type, B_is_pattern, - mult, flipxy, &opcode, &xcode, &ycode, &zcode)) - { - // C=D*B, rowscale with built-in operator - #define GB_BINOP_IS_SEMIRING_MULTIPLIER - #define GB_NO_PAIR - #include "GB_binop_factory.c" - #undef GB_BINOP_IS_SEMIRING_MULTIPLIER - } + #define GB_BINOP_WORKER(mult,xname) \ + { \ + info = GB_DxB(mult,xname) (C, D, B, nthreads) ; \ + } \ + break ; + + //------------------------------------------------------------------ + // launch the switch factory + //------------------------------------------------------------------ + + GB_Type_code xcode, ycode, zcode ; + if (GB_binop_builtin (D->type, D_is_pattern, B->type, B_is_pattern, + mult, flipxy, &opcode, &xcode, &ycode, &zcode)) + { + // C=D*B, rowscale with built-in operator + #define GB_BINOP_IS_SEMIRING_MULTIPLIER + #define GB_NO_PAIR + #include "GB_binop_factory.c" + #undef GB_BINOP_IS_SEMIRING_MULTIPLIER } } #endif diff --git a/Source/Template/GB_jit_kernel_proto.h b/Source/Template/GB_jit_kernel_proto.h index 2a47a7a695..a0ebfe0100 100644 --- a/Source/Template/GB_jit_kernel_proto.h +++ b/Source/Template/GB_jit_kernel_proto.h @@ -588,7 +588,7 @@ GrB_Info GB_jit_kernel_colscale \ ( \ GrB_Matrix C, \ GrB_Matrix A, \ - GrB_Matrix B, \ + GrB_Matrix D, \ cudaStream_t stream, \ int32_t gridsz, \ int32_t blocksz \ From a7ee08ff1d5de8145d9f8e35c80d0aaaffc2f832 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Fri, 10 May 2024 09:03:15 -0500 Subject: [PATCH 57/76] fpclassify does not work in CUDA --- Source/GB_math.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Source/GB_math.h b/Source/GB_math.h index 8720efd778..756a392784 100644 --- a/Source/GB_math.h +++ b/Source/GB_math.h @@ -431,6 +431,7 @@ inline float GB_powf (float x, float y) #define GJ_powf_DEFN \ "float GJ_powf (float x, float y) \n" \ "{ \n" \ +" #ifndef GB_CUDA_KERNEL \n" \ " int xr_class = fpclassify (x) ; \n" \ " int yr_class = fpclassify (y) ; \n" \ " if (xr_class == FP_NAN || yr_class == FP_NAN) \n" \ @@ -441,6 +442,7 @@ inline float GB_powf (float x, float y) " { \n" \ " return (1) ; \n" \ " } \n" \ +" #endif \n" \ " return (powf (x, y)) ; \n" \ "}" @@ -465,6 +467,7 @@ inline double GB_pow (double x, double y) #define GJ_pow_DEFN \ "double GJ_pow (double x, double y) \n" \ "{ \n" \ +" #ifndef GB_CUDA_KERNEL \n" \ " int xr_class = fpclassify (x) ; \n" \ " int yr_class = fpclassify (y) ; \n" \ " if (xr_class == FP_NAN || yr_class == FP_NAN) \n" \ @@ -478,6 +481,7 @@ inline double GB_pow (double x, double y) " return (1) ; \n" \ " } \n" \ " // otherwise, z = pow (x,y) \n" \ +" #endif \n" \ " return (pow (x, y)) ; \n" \ "}" From 55562eac93c4d46bbd60756da975d2fe57c19e2e Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Fri, 10 May 2024 13:00:34 -0500 Subject: [PATCH 58/76] fix apply CUDA kernel for positioni/j operators --- CUDA/GB_cuda_apply_unop.cpp | 2 +- Source/GB_jitifyer.c | 27 +++++++++++++++------------ Source/GB_jitifyer.h | 3 ++- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/CUDA/GB_cuda_apply_unop.cpp b/CUDA/GB_cuda_apply_unop.cpp index 1651d66b9c..cc575b1fdb 100644 --- a/CUDA/GB_cuda_apply_unop.cpp +++ b/CUDA/GB_cuda_apply_unop.cpp @@ -25,7 +25,7 @@ GrB_Info GB_cuda_apply_unop GB_void *ythunk_cuda = NULL ; size_t ythunk_cuda_size = 0 ; - if (ythunk != NULL) + if (ythunk != NULL && op != NULL && op->ytype != NULL) { // make a copy of ythunk, since ythunk might be allocated on // the CPU stack and thus not accessible to the CUDA kernel. diff --git a/Source/GB_jitifyer.c b/Source/GB_jitifyer.c index bd114920bf..e0e66cf95d 100644 --- a/Source/GB_jitifyer.c +++ b/Source/GB_jitifyer.c @@ -1400,6 +1400,7 @@ GrB_Info GB_jitifyer_set_CUDA_preface_worker (const char *new_CUDA_preface) bool GB_jitifyer_query ( GB_jit_query_func dl_query, + const bool builtin, // true if method is all builtin uint64_t hash, // hash code for the kernel // operator and type definitions GrB_Semiring semiring, @@ -1464,11 +1465,11 @@ bool GB_jitifyer_query //-------------------------------------------------------------------------- char *defn [5] ; - defn [0] = (op1 == NULL) ? NULL : op1->defn ; - defn [1] = (op2 == NULL) ? NULL : op2->defn ; - defn [2] = (type1 == NULL) ? NULL : type1->defn ; - defn [3] = (type2 == NULL) ? NULL : type2->defn ; - defn [4] = (type3 == NULL) ? NULL : type3->defn ; + defn [0] = (builtin || op1 == NULL) ? NULL : op1->defn ; + defn [1] = (builtin || op2 == NULL) ? NULL : op2->defn ; + defn [2] = (builtin || type1 == NULL) ? NULL : type1->defn ; + defn [3] = (builtin || type2 == NULL) ? NULL : type2->defn ; + defn [4] = (builtin || type3 == NULL) ? NULL : type3->defn ; for (int k = 0 ; k < 5 ; k++) { @@ -1587,7 +1588,7 @@ GrB_Info GB_jitifyer_load #pragma omp critical (GB_jitifyer_worker) { - info = GB_jitifyer_worker (dl_function, family, kname, hash, + info = GB_jitifyer_load2_worker (dl_function, family, kname, hash, encoding, suffix, semiring, monoid, op, type1, type2, type3) ; } @@ -1595,10 +1596,10 @@ GrB_Info GB_jitifyer_load } //------------------------------------------------------------------------------ -// GB_jitifyer_worker: do the work for GB_jitifyer_load in a critical section +// GB_jitifyer_load2_worker: do the work for GB_jitifyer_load in a critical section //------------------------------------------------------------------------------ -GrB_Info GB_jitifyer_worker +GrB_Info GB_jitifyer_load2_worker ( // output: void **dl_function, // pointer to JIT kernel @@ -1637,8 +1638,9 @@ GrB_Info GB_jitifyer_worker int32_t nkernels = 0 ; GB_prejit (&nkernels, &Kernels, &Queries, &Names) ; GB_jit_query_func dl_query = (GB_jit_query_func) Queries [k1] ; - bool ok = GB_jitifyer_query (dl_query, hash, semiring, monoid, op, - type1, type2, type3) ; + bool builtin = (encoding->suffix_len == 0) ; + bool ok = GB_jitifyer_query (dl_query, builtin, hash, semiring, + monoid, op, type1, type2, type3) ; if (ok) { // PreJIT kernel is fine; flag it as checked by flipping @@ -1871,8 +1873,9 @@ GrB_Info GB_jitifyer_load_worker bool ok = (dl_query != NULL) ; if (ok) { - ok = GB_jitifyer_query (dl_query, hash, semiring, monoid, op, - type1, type2, type3) ; + bool builtin = (encoding->suffix_len == 0) ; + ok = GB_jitifyer_query (dl_query, builtin, hash, semiring, + monoid, op, type1, type2, type3) ; } if (!ok) { diff --git a/Source/GB_jitifyer.h b/Source/GB_jitifyer.h index 5bcd37bd0e..82da326310 100644 --- a/Source/GB_jitifyer.h +++ b/Source/GB_jitifyer.h @@ -253,7 +253,7 @@ GrB_Info GB_jitifyer_load GrB_Type type3 ) ; -GrB_Info GB_jitifyer_worker +GrB_Info GB_jitifyer_load2_worker ( // output: void **dl_function, // pointer to JIT kernel @@ -336,6 +336,7 @@ typedef GB_JIT_QUERY_PROTO ((*GB_jit_query_func)) ; bool GB_jitifyer_query ( GB_jit_query_func dl_query, + const bool builtin, // true if method is all builtin uint64_t hash, // hash code for the kernel // operator and type definitions GrB_Semiring semiring, From cf52db7eb48672d82219a5c9a3eae9a22d67704b Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 14 May 2024 10:24:34 -0500 Subject: [PATCH 59/76] complex types not yet supported in CUDA --- CUDA/GB_cuda_type_branch.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CUDA/GB_cuda_type_branch.cpp b/CUDA/GB_cuda_type_branch.cpp index 82680a6c64..2bebebc800 100644 --- a/CUDA/GB_cuda_type_branch.cpp +++ b/CUDA/GB_cuda_type_branch.cpp @@ -24,6 +24,12 @@ bool GB_cuda_type_branch // return true if the type is OK on GPU return (true) ; } + if (type == GxB_FC32 || type == GxB_FC64) + { + // FIXME: complex types not yet supported in CUDA + return (false) ; + } + size_t size = type->size ; if (size == sizeof (uint8_t) || size == sizeof (uint16_t)) From d68b7ff1ea662998c16a6510c8295f1b52340e5c Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Sun, 19 May 2024 09:30:59 -0500 Subject: [PATCH 60/76] MATLAB interface: graphblas_install --- GraphBLAS/.gitignore | 2 + GraphBLAS/@GrB/private/gbmake.m | 114 ++++++++++++++++++-------------- GraphBLAS/CMakeLists.txt | 3 +- GraphBLAS/graphblas_install.m | 105 +++++++++++++++++++++++++++++ GraphBLAS/test/gbtest51.m | 2 +- 5 files changed, 176 insertions(+), 50 deletions(-) create mode 100644 GraphBLAS/.gitignore create mode 100644 GraphBLAS/graphblas_install.m diff --git a/GraphBLAS/.gitignore b/GraphBLAS/.gitignore new file mode 100644 index 0000000000..4a8f695ad4 --- /dev/null +++ b/GraphBLAS/.gitignore @@ -0,0 +1,2 @@ +# Ignore the configured file for cmake: +GraphBLAS_MATLAB_OpenMP.cmake diff --git a/GraphBLAS/@GrB/private/gbmake.m b/GraphBLAS/@GrB/private/gbmake.m index 490bed66a1..e862613046 100644 --- a/GraphBLAS/@GrB/private/gbmake.m +++ b/GraphBLAS/@GrB/private/gbmake.m @@ -47,17 +47,55 @@ function gbmake (what) make_all = (isequal (what, 'all')) ; +% use -R2018a for the new interleaved complex API flags = '-O -R2018a -DGBNCPUFEAT' ; -% use -R2018a for the new interleaved complex API +if ispc + % First do the following in GraphBLAS/build, in the Windows console: + % + % cmake .. + % devenv graphblas.sln /build "release|x64" /project graphblas + % + % The above commands require MS Visual Studio. The graphblas.lib is + % compiled and placed in GraphBLAS/build/Release. Then in the + % Command Window do: + % + % gbmake + % + if (need_rename) + library = sprintf ('%s/../../build/Release', pwd) ; + else + library = sprintf ('%s/../../../build/Release', pwd) ; + end +else + % First do one the following in GraphBLAS (use JOBS=n for a parallel + % build, which is faster): + % + % make + % make JOBS=8 + % sudo make install + % + % If you can't do "sudo make install" then add the GraphBLAS/build + % folder to your LD_LIBRARY_PATH. Then in this folder in the + % Command Window do: + % + % gbmake + % + if (need_rename) + library = sprintf ('%s/../../build', pwd) ; + else + library = sprintf ('%s/../../../build', pwd) ; + end +end + if (have_octave) % Octave does not have the new MEX classdef object and as of version 7, the % mex command doesn't handle compiler options the same way. flags = [flags ' -std=c11 -fopenmp -fPIC -Wno-pragmas' ] ; else + % remove -ansi from CFLAGS and replace it with -std=c11 try if (strncmp (computer, 'GLNX', 4)) - % remove -ansi from CFLAGS and replace it with -std=c11 cc = mex.getCompilerConfigurations ('C', 'Selected') ; env = cc.Details.SetEnv ; c1 = strfind (env, 'CFLAGS=') ; @@ -76,10 +114,21 @@ function gbmake (what) end catch end - if (~ismac && isunix) - flags = [ flags ' CFLAGS="$CXXFLAGS -fopenmp -fPIC -Wno-pragmas" '] ; - flags = [ flags ' CXXFLAGS="$CXXFLAGS -fopenmp -fPIC -Wno-pragmas" '] ; - flags = [ flags ' LDFLAGS="$LDFLAGS -fopenmp -fPIC" '] ; + % revise compiler flags for MATLAB + if (ismac) + cflags = '' ; + ldflags = '-fPIC' ; + rpath = '-rpath ' ; + elseif (isunix) + cflags = '-fopenmp' ; + ldflags = '-fopenmp -fPIC' ; + rpath = '-rpath=' ; + end + if (ismac || isunix) + rpath = sprintf (' -Wl,%s''''%s'''' ', rpath, library) ; + flags = [ flags ' CFLAGS=''$CFLAGS ' cflags ' -Wno-pragmas'' '] ; + flags = [ flags ' CXXFLAGS=''$CXXFLAGS ' cflags ' -Wno-pragmas'' '] ; + flags = [ flags ' LDFLAGS=''$LDFLAGS ' ldflags rpath ' '' '] ; end end @@ -93,51 +142,21 @@ function gbmake (what) inc = '-Iutil -I../../../Include -I../../../Source -I../../../Source/Shared -I../../../Source/Template -I../../../Source/Factories ' ; -if ispc - % First do the following in GraphBLAS/build, in the Windows console: - % - % cmake .. - % devenv graphblas.sln /build "release|x64" /project graphblas - % - % The above commands require MS Visual Studio. The graphblas.lib is - % compiled and placed in GraphBLAS/build/Release. Then in the - % Command Window do: - % - % gbmake - if (need_rename) - library = sprintf ('%s/../../build/Release', pwd) ; - else - library = sprintf ('%s/../../../build/Release', pwd) ; - end -else - % First do one the following in GraphBLAS (use JOBS=n for a parallel - % build, which is faster): - % - % make - % make JOBS=8 - % sudo make install - % - % If you can't do "sudo make install" then add the GraphBLAS/build - % folder to your LD_LIBRARY_PATH. Then in this folder in the - % Command Window do: - % - % gbmake - if (need_rename) - library = sprintf ('%s/../../build', pwd) ; - else - library = sprintf ('%s/../../../build', pwd) ; - end -end - if (need_rename) + % use the renamed library for MATLAB flags = [flags ' -DGBMATLAB=1 ' ] ; inc = [inc ' -I../../rename ' ] ; libgraphblas = '-lgraphblas_matlab' ; else + % use the regular library for Octave libgraphblas = '-lgraphblas' ; end -ldflags = sprintf ('-L''%s''', library) ; +Lflags = sprintf ('-L''%s''', library) ; + +fprintf ('compiler flags: %s\n', flags) ; +fprintf ('compiler incs: %s\n', inc) ; +fprintf ('library: %s\n', libgraphblas) ; hfiles = [ dir('*.h') ; dir('util/*.h') ] ; @@ -180,6 +199,7 @@ function gbmake (what) % fprintf ('%s\n', cfile) ; fprintf ('.') ; mexcmd = sprintf ('mex -c %s -silent %s ''%s''', flags, inc, cfile) ; + % fprintf ('%s\n', mexcmd) ; eval (mexcmd) ; any_c_compiled = true ; end @@ -209,7 +229,7 @@ function gbmake (what) if (make_all || tc > tobj || any_c_compiled) % compile the mexFunction mexcmd = sprintf ('mex %s -silent %s %s ''%s'' %s %s', ... - ldflags, flags, inc, mexfunction, objlist, libgraphblas) ; + Lflags, flags, inc, mexfunction, objlist, libgraphblas) ; % fprintf ('%s\n', mexcmd) ; fprintf (':') ; eval (mexcmd) ; @@ -229,11 +249,9 @@ function gbmake (what) end if ispc lib_path = sprintf ('%s/build/Release', pwd) ; -else - lib_path = sprintf ('%s/build', pwd) ; + fprintf (' addpath (''%s'') ;\n', lib_path) ; + addpath (lib_path) ; end -fprintf (' addpath (''%s'') ;\n', lib_path) ; -addpath (lib_path) ; cd (here1) ; fprintf ('\nFor a quick demo of GraphBLAS, type the following commands:\n\n') ; diff --git a/GraphBLAS/CMakeLists.txt b/GraphBLAS/CMakeLists.txt index b62e2120f4..2ac95ae73f 100644 --- a/GraphBLAS/CMakeLists.txt +++ b/GraphBLAS/CMakeLists.txt @@ -223,7 +223,8 @@ endif ( ) if ( GRAPHBLAS_HAS_OPENMP ) message ( STATUS "CMAKE OpenMP libraries: " ${OpenMP_C_LIBRARIES} ) message ( STATUS "CMAKE OpenMP include: " ${OpenMP_C_INCLUDE_DIRS} ) - target_link_libraries ( graphblas_matlab PUBLIC ${OpenMP_C_LIBRARIES} ) +# target_link_libraries ( graphblas_matlab PUBLIC ${OpenMP_C_LIBRARIES} ) + include ( GraphBLAS_MATLAB_OpenMP.cmake ) set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS} " ) include_directories ( ${OpenMP_C_INCLUDE_DIRS} ) else ( ) diff --git a/GraphBLAS/graphblas_install.m b/GraphBLAS/graphblas_install.m new file mode 100644 index 0000000000..8df1c42702 --- /dev/null +++ b/GraphBLAS/graphblas_install.m @@ -0,0 +1,105 @@ +function graphblas_install (cmake_options) +%GRAPHBLAS_INSTALL compile SuiteSparse:GraphBLAS for MATLAB or Octave +% +% Usage: +% graphblas_install +% +% MATLAB 9.4 (R2018a) or Octave 7 later is required. +% +% See also mex. +% +% SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +% SPDX-License-Identifier: Apache-2.0 + +have_octave = (exist ('OCTAVE_VERSION', 'builtin') == 5) ; + +if (have_octave) + % Octave can use the normal libgraphblas.so + need_rename = false ; + if verLessThan ('octave', '7') + error ('GrB:mex', 'Octave 7 or later is required') ; + end +else + if verLessThan ('matlab', '9.4') + error ('GrB:mex', 'MATLAB 9.4 (R2018a) or later is required') ; + end + % MATLAB 9.10 (R2021a) and following include a built-in GraphBLAS library + % that conflicts with this version, so rename this version. + % Earlier versions of MATLAB can use this renamed version too, so + % for simplicity, use libgraphblas_matlab.so for all MATLAB versions. + need_rename = true ; +end + +if (nargin < 1) + cmake_options = '' ; +end + +% by default, use OpenMP as found by cmake +openmp_library = '${OpenMP_C_LIBRARIES}' ; +if (ismac) + % use the OpenMP library inside MATLAB + o = [matlabroot '/bin/maca64/libomp.dylib'] ; + if (isfile (o)) + openmp_library = ['''' o ''''] ; + end +end + +% write the configuration file for cmake +f = fopen ('GraphBLAS_MATLAB_OpenMP.cmake', 'w') ; +fprintf (f, 'target_link_libraries ( graphblas_matlab PRIVATE %s )\n', ... + openmp_library) ; +fclose (f) ; + +% build the GraphBLAS library +threads = maxNumCompThreads * 2 ; +here = pwd ; + +try + + % cd to the build directory + if (need_rename) + % building libgraphblas_matlab for MATLAB + cd build + else + % building libgraphblas for Octave + cd ../build + end + + % configure with cmake + cmd = sprintf ('cmake %s ..', cmake_options) ; + fprintf ('\n================================\n%s\n', cmd) ; + [status, result] = system (cmd, '-echo') ; + if (status ~= 0) + cd (here) ; + error ('GrB:mex', 'GraphBLAS library not compiled') ; + end + + % build the GraphBLAS library + if (ispc) + if (need_rename) + library = 'graphblas_matlab' ; + else + library = 'graphblas' ; + end + cmd = sprintf ('devenv %s.sln /build "release|x64" /project %s', ... + library, library) ; + else + cmd = sprintf ('cmake --build . --config Release -j%d', threads) ; + end + fprintf ('\n================================\n%s\n', cmd) ; + [status, result] = system (cmd, '-echo') ; + cd (here) ; + if (status ~= 0) + error ('GrB:mex', 'GraphBLAS library not compiled') ; + end + + % build the GraphBLAS MATLAB interface + cd '@GrB/private' + gbmake + +catch me + me +end + +cd (here) ; + diff --git a/GraphBLAS/test/gbtest51.m b/GraphBLAS/test/gbtest51.m index f0f7353f6a..f47c42988c 100644 --- a/GraphBLAS/test/gbtest51.m +++ b/GraphBLAS/test/gbtest51.m @@ -43,7 +43,7 @@ for k = 1:nfiles % fprintf ('--------------------------load file:\n') ; filename = files {k} ; - T = load (fullfile (filepath, filename)) ; + T = load ('-ascii', fullfile (filepath, filename)) ; nz = size (T, 1) ; X = ones (nz,1) ; G = GrB.build (int64 (T (:,1)), int64 (T (:,2)), X, desc) ; From fa1e732bbbe54a1b1d54bb43e1ee676a326fe10d Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Mon, 20 May 2024 08:05:32 -0500 Subject: [PATCH 61/76] port MATLAB interface to Apple Silicon --- GraphBLAS/graphblas_install.m | 2 +- Source/GB_jitifyer.c | 4 +- Test/GB_mex_test26.c | 76 ++++---- Test/GB_mex_test27.c | 16 +- Test/GB_mex_test28.c | 19 +- Test/GB_mex_test29.c | 238 ++++++++++++------------ Test/GB_mex_test30.c | 54 +++--- Test/GB_mex_test31.c | 3 +- Test/GB_mex_test32.c | 12 +- Test/GB_mex_test33.c | 2 +- Test/GB_mex_test34.c | 40 ++-- Test/GB_mex_test35.c | 41 ++-- Test/GB_mx_get_global.c | 2 +- Test/README.txt | 12 +- cmake_modules/GraphBLAS_JIT_paths.cmake | 2 +- 15 files changed, 266 insertions(+), 257 deletions(-) diff --git a/GraphBLAS/graphblas_install.m b/GraphBLAS/graphblas_install.m index 8df1c42702..d720631d14 100644 --- a/GraphBLAS/graphblas_install.m +++ b/GraphBLAS/graphblas_install.m @@ -40,7 +40,7 @@ function graphblas_install (cmake_options) % use the OpenMP library inside MATLAB o = [matlabroot '/bin/maca64/libomp.dylib'] ; if (isfile (o)) - openmp_library = ['''' o ''''] ; + openmp_library = o ; end end diff --git a/Source/GB_jitifyer.c b/Source/GB_jitifyer.c index e0e66cf95d..fc46ef2bfb 100644 --- a/Source/GB_jitifyer.c +++ b/Source/GB_jitifyer.c @@ -515,7 +515,7 @@ GrB_Info GB_jitifyer_init (void) // time the kernel is run. uint64_t hash = 0 ; - char *ignored [5] ; + const char *ignored [5] ; int version [3] ; (void) dl_query (&hash, version, ignored, NULL, NULL, 0, 0) ; @@ -1417,7 +1417,7 @@ bool GB_jitifyer_query //-------------------------------------------------------------------------- int version [3] ; - char *library_defn [5] ; + const char *library_defn [5] ; size_t zsize = 0 ; size_t tsize = 0 ; void *id = NULL ; diff --git a/Test/GB_mex_test26.c b/Test/GB_mex_test26.c index f85142470d..f53aa4cb12 100644 --- a/Test/GB_mex_test26.c +++ b/Test/GB_mex_test26.c @@ -346,9 +346,9 @@ void mexFunction CHECK (i == sizeof (mytype)) ; expected = GrB_INVALID_VALUE ; - ERR (GrB_Type_get_Scalar_(type, s_int32, GrB_OUTP)) ; - ERR (GrB_Type_get_String_(type, name, GrB_OUTP)) ; - ERR (GrB_Type_get_SIZE_(type, &size, GrB_OUTP)) ; + ERR (GrB_Type_get_Scalar_(type, s_int32, (GrB_Field) GrB_OUTP)) ; + ERR (GrB_Type_get_String_(type, name, (GrB_Field) GrB_OUTP)) ; + ERR (GrB_Type_get_SIZE_(type, &size, (GrB_Field) GrB_OUTP)) ; ERR (GrB_Type_get_SIZE_(GrB_FP32, &i, GrB_SIZE)) ; @@ -389,16 +389,16 @@ void mexFunction printf ("scalar storage: %d\n", i) ; CHECK (i == GrB_COLMAJOR) ; - OK (GrB_Scalar_get_INT32_(s, &i, GxB_FORMAT)) ; + OK (GrB_Scalar_get_INT32_(s, &i, (GrB_Field) GxB_FORMAT)) ; printf ("scalar storage: %d\n", i) ; CHECK (i == GxB_BY_COL) ; - OK (GrB_Scalar_get_INT32_(s, &i, GxB_SPARSITY_CONTROL)) ; + OK (GrB_Scalar_get_INT32_(s, &i, (GrB_Field) GxB_SPARSITY_CONTROL)) ; printf ("sparsity control: %d\n", i) ; CHECK (i == GxB_AUTO_SPARSITY) ; GxB_print (s_int32, 3) ; - OK (GrB_Scalar_get_INT32_(s_int32, &i, GxB_SPARSITY_STATUS)) ; + OK (GrB_Scalar_get_INT32_(s_int32, &i, (GrB_Field) GxB_SPARSITY_STATUS)) ; printf ("sparsity status: %d\n", i) ; CHECK (i == GxB_FULL) ; @@ -458,7 +458,7 @@ void mexFunction printf ("vector storage: %d\n", i) ; CHECK (i == GrB_COLMAJOR) ; - OK (GrB_Vector_get_INT32_(v, &i, GxB_FORMAT)) ; + OK (GrB_Vector_get_INT32_(v, &i, (GrB_Field) GxB_FORMAT)) ; printf ("vector storage: %d\n", i) ; CHECK (i == GxB_BY_COL) ; @@ -466,14 +466,14 @@ void mexFunction OK (GrB_Vector_get_INT32_(v, &i, GrB_STORAGE_ORIENTATION_HINT)) ; CHECK (i == GrB_COLMAJOR) ; - OK (GrB_Vector_get_INT32_(v, &i, GxB_SPARSITY_CONTROL)) ; + OK (GrB_Vector_get_INT32_(v, &i, (GrB_Field) GxB_SPARSITY_CONTROL)) ; printf ("sparsity control: %d\n", i) ; CHECK (i == GxB_AUTO_SPARSITY) ; OK (GrB_assign (v, NULL, NULL, 1, GrB_ALL, 10, NULL)) ; GxB_print (v, 3) ; - OK (GrB_Vector_get_INT32_(v, &i, GxB_SPARSITY_STATUS)) ; + OK (GrB_Vector_get_INT32_(v, &i, (GrB_Field) GxB_SPARSITY_STATUS)) ; printf ("sparsity status: %d\n", i) ; CHECK (i == GxB_FULL) ; @@ -482,33 +482,33 @@ void mexFunction ERR (GrB_Vector_get_SIZE_(v, &size, 0)) ; fvalue = -1 ; - OK (GrB_Vector_get_Scalar_(v, s_fp32, GxB_BITMAP_SWITCH)) ; + OK (GrB_Vector_get_Scalar_(v, s_fp32, (GrB_Field) GxB_BITMAP_SWITCH)) ; OK (GrB_Scalar_extractElement_FP32_(&fvalue, s_fp32)) ; printf ("bitmap switch: %g\n", fvalue) ; - CHECK (abs (fvalue - 0.04) < 1e-6) ; + CHECK (fabs (fvalue - 0.04) < 1e-6) ; OK (GrB_Scalar_setElement_FP32_(s_fp32, 0.5)) ; - OK (GrB_Vector_set_Scalar_(v, s_fp32, GxB_BITMAP_SWITCH)) ; - OK (GrB_Vector_get_Scalar_(v, s_fp64, GxB_BITMAP_SWITCH)) ; + OK (GrB_Vector_set_Scalar_(v, s_fp32, (GrB_Field) GxB_BITMAP_SWITCH)) ; + OK (GrB_Vector_get_Scalar_(v, s_fp64, (GrB_Field) GxB_BITMAP_SWITCH)) ; OK (GrB_Scalar_extractElement_FP64_(&dvalue, s_fp64)) ; printf ("bitmap switch: %g\n", dvalue) ; - CHECK (abs (dvalue - 0.5) < 1e-6) ; + CHECK (fabs (dvalue - 0.5) < 1e-6) ; OK (GrB_Scalar_setElement_INT32_(s_int32, GxB_BITMAP)) ; - OK (GrB_Vector_set_Scalar_(v, s_int32, GxB_SPARSITY_CONTROL)) ; + OK (GrB_Vector_set_Scalar_(v, s_int32, (GrB_Field) GxB_SPARSITY_CONTROL)) ; GxB_print (v, 3) ; - OK (GrB_Vector_get_INT32_(v, &i, GxB_SPARSITY_STATUS)) ; + OK (GrB_Vector_get_INT32_(v, &i, (GrB_Field) GxB_SPARSITY_STATUS)) ; printf ("sparsity status: %d\n", i) ; CHECK (i == GxB_BITMAP) ; - OK (GrB_Vector_set_INT32_(v, GxB_SPARSE, GxB_SPARSITY_CONTROL)) ; - OK (GrB_Vector_get_INT32_(v, &i, GxB_SPARSITY_STATUS)) ; + OK (GrB_Vector_set_INT32_(v, GxB_SPARSE, (GrB_Field) GxB_SPARSITY_CONTROL)) ; + OK (GrB_Vector_get_INT32_(v, &i, (GrB_Field) GxB_SPARSITY_STATUS)) ; printf ("sparsity status: %d\n", i) ; CHECK (i == GxB_SPARSE) ; - ERR (GrB_Vector_set_Scalar_(v, s_int32, GxB_HYPER_SWITCH)) ; - ERR (GrB_Vector_get_Scalar_(v, s_int32, GxB_HYPER_SWITCH)) ; + ERR (GrB_Vector_set_Scalar_(v, s_int32, (GrB_Field) GxB_HYPER_SWITCH)) ; + ERR (GrB_Vector_get_Scalar_(v, s_int32, (GrB_Field) GxB_HYPER_SWITCH)) ; OK (GrB_Vector_set_String_(v, "vector name", GrB_NAME)) ; OK (GrB_Vector_get_String_(v, name, GrB_NAME)) ; @@ -527,7 +527,7 @@ void mexFunction expected = GrB_EMPTY_OBJECT ; OK (GrB_Scalar_clear (s_int32)) ; - ERR (GrB_Vector_set_Scalar_(v, s_int32, GxB_FORMAT)) ; + ERR (GrB_Vector_set_Scalar_(v, s_int32, (GrB_Field) GxB_FORMAT)) ; //-------------------------------------------------------------------------- // GrB_Matrix get/set @@ -560,18 +560,18 @@ void mexFunction printf ("matrix storage: %d\n", i) ; CHECK (i == GrB_COLMAJOR) ; - OK (GrB_Matrix_get_INT32_(A, &i, GxB_FORMAT)) ; + OK (GrB_Matrix_get_INT32_(A, &i, (GrB_Field) GxB_FORMAT)) ; printf ("matrix storage: %d\n", i) ; CHECK (i == GxB_BY_COL) ; - OK (GrB_Matrix_get_INT32_(A, &i, GxB_SPARSITY_CONTROL)) ; + OK (GrB_Matrix_get_INT32_(A, &i, (GrB_Field) GxB_SPARSITY_CONTROL)) ; printf ("sparsity control: %d\n", i) ; CHECK (i == GxB_AUTO_SPARSITY) ; OK (GrB_assign (A, NULL, NULL, 1, GrB_ALL, 5, GrB_ALL, 5, NULL)) ; GxB_print (A, 3) ; - OK (GrB_Matrix_get_INT32_(A, &i, GxB_SPARSITY_STATUS)) ; + OK (GrB_Matrix_get_INT32_(A, &i, (GrB_Field) GxB_SPARSITY_STATUS)) ; printf ("sparsity status: %d\n", i) ; CHECK (i == GxB_FULL) ; @@ -580,32 +580,32 @@ void mexFunction ERR (GrB_Matrix_get_SIZE_(A, &size, 0)) ; fvalue = -1 ; - OK (GrB_Matrix_get_Scalar_(A, s_fp32, GxB_BITMAP_SWITCH)) ; + OK (GrB_Matrix_get_Scalar_(A, s_fp32, (GrB_Field) GxB_BITMAP_SWITCH)) ; OK (GrB_Scalar_extractElement_FP32_(&fvalue, s_fp32)) ; printf ("bitmap switch: %g\n", fvalue) ; - CHECK (abs (fvalue - 0.04) < 1e-6) ; + CHECK (fabs (fvalue - 0.08) < 1e-6) ; OK (GrB_Scalar_setElement_FP32_(s_fp32, 0.5)) ; - OK (GrB_Matrix_set_Scalar_(A, s_fp32, GxB_BITMAP_SWITCH)) ; - OK (GrB_Matrix_get_Scalar_(A, s_fp64, GxB_BITMAP_SWITCH)) ; + OK (GrB_Matrix_set_Scalar_(A, s_fp32, (GrB_Field) GxB_BITMAP_SWITCH)) ; + OK (GrB_Matrix_get_Scalar_(A, s_fp64, (GrB_Field) GxB_BITMAP_SWITCH)) ; OK (GrB_Scalar_extractElement_FP64_(&dvalue, s_fp64)) ; printf ("bitmap switch: %g\n", dvalue) ; - CHECK (abs (dvalue - 0.5) < 1e-6) ; + CHECK (fabs (dvalue - 0.5) < 1e-6) ; OK (GrB_Scalar_setElement_INT32_(s_int32, GxB_BITMAP)) ; - OK (GrB_Matrix_set_Scalar_(A, s_int32, GxB_SPARSITY_CONTROL)) ; + OK (GrB_Matrix_set_Scalar_(A, s_int32, (GrB_Field) GxB_SPARSITY_CONTROL)) ; GxB_print (A, 3) ; - OK (GrB_Matrix_get_INT32_(A, &i, GxB_SPARSITY_STATUS)) ; + OK (GrB_Matrix_get_INT32_(A, &i, (GrB_Field) GxB_SPARSITY_STATUS)) ; printf ("sparsity status: %d\n", i) ; CHECK (i == GxB_BITMAP) ; OK (GrB_Scalar_setElement_FP32_(s_fp32, 0.25)) ; - OK (GrB_Matrix_set_Scalar_(A, s_fp32, GxB_HYPER_SWITCH)) ; - OK (GrB_Matrix_get_Scalar_(A, s_fp64, GxB_HYPER_SWITCH)) ; + OK (GrB_Matrix_set_Scalar_(A, s_fp32, (GrB_Field) GxB_HYPER_SWITCH)) ; + OK (GrB_Matrix_get_Scalar_(A, s_fp64, (GrB_Field) GxB_HYPER_SWITCH)) ; OK (GrB_Scalar_extractElement_FP64_(&dvalue, s_fp64)) ; printf ("hyper switch: %g\n", dvalue) ; - CHECK (abs (dvalue - 0.25) < 1e-6) ; + CHECK (fabs (dvalue - 0.25) < 1e-6) ; OK (GrB_Matrix_get_SIZE_(A, &size, GrB_NAME)) ; CHECK (size == 1) ; @@ -635,26 +635,26 @@ void mexFunction OK (GrB_Matrix_set_INT32_(A, GrB_ROWMAJOR, GrB_STORAGE_ORIENTATION_HINT)) ; OK (GrB_Matrix_get_INT32_(A, &i, GrB_STORAGE_ORIENTATION_HINT)) ; CHECK (i == GrB_ROWMAJOR) ; - OK (GrB_Matrix_get_INT32_(A, &i, GxB_FORMAT)) ; + OK (GrB_Matrix_get_INT32_(A, &i, (GrB_Field) GxB_FORMAT)) ; CHECK (i == GxB_BY_ROW) ; GxB_print (A, 3) ; OK (GrB_Matrix_set_INT32_(A, GrB_COLMAJOR, GrB_STORAGE_ORIENTATION_HINT)) ; OK (GrB_Matrix_get_INT32_(A, &i, GrB_STORAGE_ORIENTATION_HINT)) ; CHECK (i == GrB_COLMAJOR) ; - OK (GrB_Matrix_get_INT32_(A, &i, GxB_FORMAT)) ; + OK (GrB_Matrix_get_INT32_(A, &i, (GrB_Field) GxB_FORMAT)) ; CHECK (i == GxB_BY_COL) ; GxB_print (A, 3) ; expected = GrB_INVALID_VALUE ; - ERR (GrB_Matrix_set_INT32_(A, 99, GxB_FORMAT)) ; + ERR (GrB_Matrix_set_INT32_(A, 99, (GrB_Field) GxB_FORMAT)) ; ERR (GrB_Matrix_set_INT32_(A, 99, 999)) ; ERR (GrB_Matrix_get_String_(A, defn, 999)) ; ERR (GrB_Matrix_get_Scalar(A, s_int32, 999)) ; expected = GrB_EMPTY_OBJECT ; OK (GrB_Scalar_clear (s_int32)) ; - ERR (GrB_Matrix_set_Scalar_(A, s_int32, GxB_FORMAT)) ; + ERR (GrB_Matrix_set_Scalar_(A, s_int32, (GrB_Field) GxB_FORMAT)) ; //-------------------------------------------------------------------------- // finalize GraphBLAS diff --git a/Test/GB_mex_test27.c b/Test/GB_mex_test27.c index 8a57ea678f..7df6838a33 100644 --- a/Test/GB_mex_test27.c +++ b/Test/GB_mex_test27.c @@ -21,22 +21,22 @@ OK (GrB_UnaryOp_get_String (op, name, GrB_NAME)) ; \ CHECK (MATCH (name, opname)) ; \ OK (GrB_UnaryOp_get_String (op, cname, GxB_JIT_C_NAME)) ; \ - printf ("%s: %s\n", name, cname) ; \ + printf ("%s: %s\n", name, cname) ; \ OK (GrB_UnaryOp_get_SIZE (op, &size, GrB_NAME)) ; \ CHECK (size == strlen (name) + 1) ; \ GrB_Info info2, info3 ; \ - info2 = GrB_UnaryOp_get_SIZE (op, &size, GrB_INP0_TYPE_STRING) ; \ - info3 = GrB_UnaryOp_get_String (op, name, GrB_INP0_TYPE_STRING) ; \ + info2 = GrB_UnaryOp_get_SIZE (op, &size, GrB_INP0_TYPE_STRING) ; \ + info3 = GrB_UnaryOp_get_String (op, name, GrB_INP0_TYPE_STRING) ; \ CHECK (info2 == info3) ; \ CHECK (size == strlen (name) + 1) ; \ if (info2 == GrB_NO_VALUE) { CHECK (size == 1) ; } \ - info2 = GrB_UnaryOp_get_SIZE (op, &size, GrB_INP1_TYPE_STRING) ; \ - info3 = GrB_UnaryOp_get_String (op, name, GrB_INP1_TYPE_STRING) ; \ + info2 = GrB_UnaryOp_get_SIZE (op, &size, GrB_INP1_TYPE_STRING) ; \ + info3 = GrB_UnaryOp_get_String (op, name, GrB_INP1_TYPE_STRING) ; \ CHECK (info2 == info3) ; \ CHECK (size == 1) ; \ CHECK (info2 == GrB_NO_VALUE) ; \ - info2 = GrB_UnaryOp_get_SIZE (op, &size, GrB_OUTP_TYPE_STRING) ; \ - info3 = GrB_UnaryOp_get_String (op, name, GrB_OUTP_TYPE_STRING) ; \ + info2 = GrB_UnaryOp_get_SIZE (op, &size, GrB_OUTP_TYPE_STRING) ; \ + info3 = GrB_UnaryOp_get_String (op, name, GrB_OUTP_TYPE_STRING) ; \ CHECK (info2 == info3) ; \ CHECK (size == strlen (name) + 1) ; \ if (info2 == GrB_NO_VALUE) { CHECK (size == 1) ; } \ @@ -417,7 +417,7 @@ void mexFunction expected = GrB_INVALID_VALUE ; ERR (GrB_UnaryOp_get_VOID_(GrB_LNOT, nothing, 0)) ; - OK (GrB_UnaryOp_new (&unop, myfunc, GrB_FP32, GrB_FP32)) ; + OK (GrB_UnaryOp_new (&unop, (GxB_unary_function) myfunc, GrB_FP32, GrB_FP32)) ; OK (GrB_UnaryOp_get_SIZE_(unop, &size, GrB_NAME)) ; CHECK (size == 1) ; OK (GrB_UnaryOp_get_SIZE_(unop, &size, GxB_JIT_C_NAME)) ; diff --git a/Test/GB_mex_test28.c b/Test/GB_mex_test28.c index cd7899b959..99de723d4f 100644 --- a/Test/GB_mex_test28.c +++ b/Test/GB_mex_test28.c @@ -21,23 +21,23 @@ size_t siz1, siz2, siz3 ; \ OK (GrB_BinaryOp_get_String (op, name, GrB_NAME)) ; \ CHECK (MATCH (name, opname)) ; \ - OK (GrB_BinaryOp_get_String (op, cname, GxB_JIT_C_NAME)) ; \ - printf ("%s: %s\n", name, cname) ; \ + OK (GrB_BinaryOp_get_String (op, cname, GxB_JIT_C_NAME)) ; \ + printf ("%s: %s\n", name, cname) ; \ OK (GrB_BinaryOp_get_SIZE (op, &size, GrB_NAME)) ; \ CHECK (size == strlen (name) + 1) ; \ GrB_Info info2, info3 ; \ - info2 = GrB_BinaryOp_get_SIZE (op, &siz1, GrB_INP0_TYPE_STRING) ; \ - info3 = GrB_BinaryOp_get_String (op, name, GrB_INP0_TYPE_STRING) ; \ + info2 = GrB_BinaryOp_get_SIZE (op, &siz1, GrB_INP0_TYPE_STRING) ; \ + info3 = GrB_BinaryOp_get_String (op, name, GrB_INP0_TYPE_STRING) ; \ CHECK (info2 == info3) ; \ CHECK (siz1 == strlen (name) + 1) ; \ if (info2 == GrB_NO_VALUE) { CHECK (siz1 == 1) ; } \ - info2 = GrB_BinaryOp_get_SIZE (op, &siz2, GrB_INP1_TYPE_STRING) ; \ - info3 = GrB_BinaryOp_get_String (op, name, GrB_INP1_TYPE_STRING) ; \ + info2 = GrB_BinaryOp_get_SIZE (op, &siz2, GrB_INP1_TYPE_STRING) ; \ + info3 = GrB_BinaryOp_get_String (op, name, GrB_INP1_TYPE_STRING) ; \ CHECK (info2 == info3) ; \ CHECK (siz2 == strlen (name) + 1) ; \ if (info2 == GrB_NO_VALUE) { CHECK (siz2 == 1) ; } \ - info2 = GrB_BinaryOp_get_SIZE (op, &siz3, GrB_OUTP_TYPE_STRING) ; \ - info3 = GrB_BinaryOp_get_String (op, name, GrB_OUTP_TYPE_STRING) ; \ + info2 = GrB_BinaryOp_get_SIZE (op, &siz3, GrB_OUTP_TYPE_STRING) ; \ + info3 = GrB_BinaryOp_get_String (op, name, GrB_OUTP_TYPE_STRING) ; \ CHECK (info2 == info3) ; \ CHECK (siz3 == strlen (name) + 1) ; \ if (info2 == GrB_NO_VALUE) { CHECK (siz3 == 1) ; } \ @@ -634,7 +634,8 @@ void mexFunction expected = GrB_INVALID_VALUE ; ERR (GrB_BinaryOp_get_VOID_(GrB_LAND, nothing, 0)) ; - OK (GrB_BinaryOp_new (&binop, myfunc, GrB_FP32, GrB_FP32, GrB_FP32)) ; + OK (GrB_BinaryOp_new (&binop, (GxB_binary_function) myfunc, + GrB_FP32, GrB_FP32, GrB_FP32)) ; OK (GrB_BinaryOp_get_SIZE_(binop, &size, GrB_NAME)) ; CHECK (size == 1) ; OK (GrB_BinaryOp_get_SIZE_(binop, &size, GxB_JIT_C_NAME)) ; diff --git a/Test/GB_mex_test29.c b/Test/GB_mex_test29.c index 14a5b748e5..2dd2742697 100644 --- a/Test/GB_mex_test29.c +++ b/Test/GB_mex_test29.c @@ -94,7 +94,7 @@ void mexFunction CHECK (i == GrB_NONBLOCKING) ; i = -1 ; - OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &i, GxB_MODE)) ; + OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &i, (GrB_Field) GxB_MODE)) ; CHECK (i == GrB_NONBLOCKING) ; OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &i, GrB_STORAGE_ORIENTATION_HINT)) ; @@ -140,66 +140,66 @@ void mexFunction ERR (GrB_Global_set_INT32_ (GrB_GLOBAL, 999, GrB_STORAGE_ORIENTATION_HINT)) ; - OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &i, GxB_FORMAT)) ; - ERR (GrB_Global_set_INT32_ (GrB_GLOBAL, 999, GxB_FORMAT)) ; + OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &i, (GrB_Field) GxB_FORMAT)) ; + ERR (GrB_Global_set_INT32_ (GrB_GLOBAL, 999, (GrB_Field) GxB_FORMAT)) ; CHECK (i == GxB_BY_COL) ; int32_t nth ; - OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &nth, GxB_GLOBAL_NTHREADS)) ; + OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &nth, (GrB_Field) GxB_GLOBAL_NTHREADS)) ; printf ("nthreads: %d\n", nth) ; - OK (GrB_Global_set_INT32_ (GrB_GLOBAL, 2, GxB_GLOBAL_NTHREADS)) ; - OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &i, GxB_GLOBAL_NTHREADS)) ; + OK (GrB_Global_set_INT32_ (GrB_GLOBAL, 2, (GrB_Field) GxB_GLOBAL_NTHREADS)) ; + OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &i, (GrB_Field) GxB_GLOBAL_NTHREADS)) ; CHECK (i == 2) ; - OK (GrB_Global_set_INT32_ (GrB_GLOBAL, nth, GxB_GLOBAL_NTHREADS)) ; + OK (GrB_Global_set_INT32_ (GrB_GLOBAL, nth, (GrB_Field) GxB_GLOBAL_NTHREADS)) ; int32_t gpu ; - OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &gpu, GxB_GLOBAL_GPU_ID)) ; + OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &gpu, (GrB_Field) GxB_GLOBAL_GPU_ID)) ; printf ("gpu id: %d\n", gpu) ; - OK (GrB_Global_set_INT32_ (GrB_GLOBAL, 2, GxB_GLOBAL_GPU_ID)) ; - OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &i, GxB_GLOBAL_GPU_ID)) ; + OK (GrB_Global_set_INT32_ (GrB_GLOBAL, 2, (GrB_Field) GxB_GLOBAL_GPU_ID)) ; + OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &i, (GrB_Field) GxB_GLOBAL_GPU_ID)) ; CHECK (i == -1) ; - OK (GrB_Global_set_INT32_ (GrB_GLOBAL, gpu, GxB_GLOBAL_GPU_ID)) ; + OK (GrB_Global_set_INT32_ (GrB_GLOBAL, gpu, (GrB_Field) GxB_GLOBAL_GPU_ID)) ; - OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &i, GxB_BURBLE)) ; + OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &i, (GrB_Field) GxB_BURBLE)) ; printf ("burble: %d\n", i) ; - OK (GrB_Global_set_INT32_ (GrB_GLOBAL, 1, GxB_BURBLE)) ; + OK (GrB_Global_set_INT32_ (GrB_GLOBAL, 1, (GrB_Field) GxB_BURBLE)) ; OK (GrB_Matrix_new (&A, GrB_FP32, 3, 3)) ; OK (GrB_assign (A, NULL, NULL, 3, GrB_ALL, 3, GrB_ALL, 3, NULL)) ; - OK (GrB_Global_set_INT32_ (GrB_GLOBAL, 0, GxB_BURBLE)) ; + OK (GrB_Global_set_INT32_ (GrB_GLOBAL, 0, (GrB_Field) GxB_BURBLE)) ; OK (GrB_assign (A, NULL, NULL, 4, GrB_ALL, 3, GrB_ALL, 3, NULL)) ; OK (GxB_print (A, 2)) ; - OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &i, GxB_LIBRARY_OPENMP)) ; + OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &i, (GrB_Field) GxB_LIBRARY_OPENMP)) ; CHECK (i == 1) ; int32_t onebase ; - OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &onebase, GxB_PRINT_1BASED)) ; + OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &onebase, (GrB_Field) GxB_PRINT_1BASED)) ; printf ("1based: %d\n", i) ; - OK (GrB_Global_set_INT32_ (GrB_GLOBAL, 1, GxB_PRINT_1BASED)) ; + OK (GrB_Global_set_INT32_ (GrB_GLOBAL, 1, (GrB_Field) GxB_PRINT_1BASED)) ; OK (GxB_print (A, 2)) ; - OK (GrB_Global_set_INT32_ (GrB_GLOBAL, onebase, GxB_PRINT_1BASED)) ; - OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &i, GxB_PRINT_1BASED)) ; + OK (GrB_Global_set_INT32_ (GrB_GLOBAL, onebase, (GrB_Field) GxB_PRINT_1BASED)) ; + OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &i, (GrB_Field) GxB_PRINT_1BASED)) ; CHECK (i == onebase) ; int32_t control ; - OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &control, GxB_JIT_C_CONTROL)) ; + OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &control, (GrB_Field) GxB_JIT_C_CONTROL)) ; printf ("jit ctrl: %d\n", control) ; for (int c = 0 ; c <= GxB_JIT_ON ; c++) { int32_t b ; - OK (GrB_Global_set_INT32_ (GrB_GLOBAL, c, GxB_JIT_C_CONTROL)) ; - OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &b, GxB_JIT_C_CONTROL)) ; + OK (GrB_Global_set_INT32_ (GrB_GLOBAL, c, (GrB_Field) GxB_JIT_C_CONTROL)) ; + OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &b, (GrB_Field) GxB_JIT_C_CONTROL)) ; CHECK (c == b) ; } - OK (GrB_Global_set_INT32_ (GrB_GLOBAL, control, GxB_JIT_C_CONTROL)) ; + OK (GrB_Global_set_INT32_ (GrB_GLOBAL, control, (GrB_Field) GxB_JIT_C_CONTROL)) ; int32_t use_cmake ; - OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &use_cmake, GxB_JIT_USE_CMAKE)) ; + OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &use_cmake, (GrB_Field) GxB_JIT_USE_CMAKE)) ; printf ("jit cmake %d\n", use_cmake) ; - OK (GrB_Global_set_INT32_ (GrB_GLOBAL, 1, GxB_JIT_USE_CMAKE)) ; - OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &i, GxB_JIT_USE_CMAKE)) ; + OK (GrB_Global_set_INT32_ (GrB_GLOBAL, 1, (GrB_Field) GxB_JIT_USE_CMAKE)) ; + OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &i,(GrB_Field) GxB_JIT_USE_CMAKE)) ; CHECK (i == 1) ; - OK (GrB_Global_set_INT32_ (GrB_GLOBAL, use_cmake, GxB_JIT_USE_CMAKE)) ; + OK (GrB_Global_set_INT32_ (GrB_GLOBAL, use_cmake, (GrB_Field) GxB_JIT_USE_CMAKE)) ; expected = GrB_INVALID_VALUE ; ERR (GrB_Global_set_INT32_ (GrB_GLOBAL, 1, GrB_BLOCKING_MODE)) ; @@ -210,36 +210,36 @@ void mexFunction OK (GrB_Scalar_setElement_INT32 (s_int32, 1)) ; ERR (GrB_Global_set_Scalar_ (GrB_GLOBAL, s_int32, GrB_BLOCKING_MODE)) ; - OK (GrB_Global_set_Scalar_ (GrB_GLOBAL, s_int32, GxB_JIT_C_CONTROL)) ; + OK (GrB_Global_set_Scalar_ (GrB_GLOBAL, s_int32, (GrB_Field) GxB_JIT_C_CONTROL)) ; OK (GrB_Scalar_setElement_INT32 (s_int32, 2)) ; - OK (GrB_Global_get_Scalar_ (GrB_GLOBAL, s_int32, GxB_JIT_C_CONTROL)) ; + OK (GrB_Global_get_Scalar_ (GrB_GLOBAL, s_int32, (GrB_Field) GxB_JIT_C_CONTROL)) ; OK (GrB_Scalar_extractElement (&i, s_int32)) ; CHECK (i == 1) ; - OK (GrB_Global_set_INT32_ (GrB_GLOBAL, control, GxB_JIT_C_CONTROL)) ; - OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &i, GxB_JIT_C_CONTROL)) ; + OK (GrB_Global_set_INT32_ (GrB_GLOBAL, control, (GrB_Field) GxB_JIT_C_CONTROL)) ; + OK (GrB_Global_get_INT32_ (GrB_GLOBAL, &i, (GrB_Field) GxB_JIT_C_CONTROL)) ; CHECK (i == control) ; - OK (GrB_Global_get_Scalar_ (GrB_GLOBAL, s_fp64, GxB_HYPER_SWITCH)) ; + OK (GrB_Global_get_Scalar_ (GrB_GLOBAL, s_fp64, (GrB_Field) GxB_HYPER_SWITCH)) ; OK (GrB_Scalar_extractElement (&dvalue, s_fp64)) ; printf ("hyper switch: %g\n", dvalue) ; OK (GrB_Scalar_setElement (s_fp64, 0.75)) ; - OK (GrB_Global_set_Scalar_ (GrB_GLOBAL, s_fp64, GxB_HYPER_SWITCH)) ; + OK (GrB_Global_set_Scalar_ (GrB_GLOBAL, s_fp64, (GrB_Field) GxB_HYPER_SWITCH)) ; OK (GrB_Scalar_clear (s_fp64)) ; - OK (GrB_Global_get_Scalar_ (GrB_GLOBAL, s_fp64, GxB_HYPER_SWITCH)) ; + OK (GrB_Global_get_Scalar_ (GrB_GLOBAL, s_fp64, (GrB_Field) GxB_HYPER_SWITCH)) ; OK (GrB_Scalar_extractElement (&dvalue, s_fp64)) ; CHECK (dvalue == 0.75) ; OK (GrB_Scalar_setElement_FP64 (s_fp64, 0.75)) ; - OK (GrB_Global_set_Scalar_ (GrB_GLOBAL, s_fp64, GxB_HYPER_SWITCH)) ; + OK (GrB_Global_set_Scalar_ (GrB_GLOBAL, s_fp64, (GrB_Field) GxB_HYPER_SWITCH)) ; OK (GrB_Scalar_clear (s_fp64)) ; - OK (GrB_Global_get_Scalar_ (GrB_GLOBAL, s_fp64, GxB_CHUNK)) ; + OK (GrB_Global_get_Scalar_ (GrB_GLOBAL, s_fp64, (GrB_Field) GxB_CHUNK)) ; OK (GrB_Scalar_extractElement (&dvalue, s_fp64)) ; printf ("chunk: %g\n", dvalue) ; OK (GrB_Scalar_setElement (s_fp64, 8901)) ; - OK (GrB_Global_set_Scalar_ (GrB_GLOBAL, s_fp64, GxB_CHUNK)) ; + OK (GrB_Global_set_Scalar_ (GrB_GLOBAL, s_fp64, (GrB_Field) GxB_CHUNK)) ; OK (GrB_Scalar_clear (s_fp64)) ; - OK (GrB_Global_get_Scalar_ (GrB_GLOBAL, s_fp64, GxB_CHUNK)) ; + OK (GrB_Global_get_Scalar_ (GrB_GLOBAL, s_fp64, (GrB_Field) GxB_CHUNK)) ; OK (GrB_Scalar_extractElement (&dvalue, s_fp64)) ; CHECK (dvalue == 8901) ; @@ -256,182 +256,182 @@ void mexFunction CHECK (MATCH (name, GxB_IMPLEMENTATION_NAME)) ; name [0] = 0 ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, name, GxB_LIBRARY_NAME)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, name, (GrB_Field) GxB_LIBRARY_NAME)) ; printf ("library name: [%s]\n", name) ; CHECK (MATCH (name, GxB_IMPLEMENTATION_NAME)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, name, GxB_LIBRARY_DATE)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, name, (GrB_Field) GxB_LIBRARY_DATE)) ; printf ("library date: [%s]\n", name) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, GxB_LIBRARY_ABOUT)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, (GrB_Field) GxB_LIBRARY_ABOUT)) ; printf ("library about: [%s]\n", defn) ; CHECK (MATCH (defn, GxB_IMPLEMENTATION_ABOUT)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, GxB_LIBRARY_LICENSE)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, (GrB_Field) GxB_LIBRARY_LICENSE)) ; printf ("library license: [%s]\n", defn) ; CHECK (MATCH (defn, GxB_IMPLEMENTATION_LICENSE)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, name, GxB_LIBRARY_COMPILE_DATE)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, name, (GrB_Field) GxB_LIBRARY_COMPILE_DATE)) ; printf ("library compile date: [%s]\n", name) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, name, GxB_LIBRARY_COMPILE_TIME)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, name, (GrB_Field) GxB_LIBRARY_COMPILE_TIME)) ; printf ("library compile time: [%s]\n", name) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, name, GxB_LIBRARY_URL)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, name, (GrB_Field) GxB_LIBRARY_URL)) ; printf ("library url: [%s]\n", name) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, name, GxB_API_DATE)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, name, (GrB_Field) GxB_API_DATE)) ; printf ("api date: [%s]\n", name) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, GxB_API_ABOUT)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, (GrB_Field) GxB_API_ABOUT)) ; printf ("api about: [%s]\n", defn) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, name, GxB_API_URL)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, name, (GrB_Field) GxB_API_URL)) ; printf ("api url: [%s]\n", name) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, GxB_COMPILER_NAME)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, (GrB_Field) GxB_COMPILER_NAME)) ; printf ("compiler: [%s]\n", defn) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, GxB_JIT_C_COMPILER_NAME)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, (GrB_Field) GxB_JIT_C_COMPILER_NAME)) ; printf ("JIT C compiler: [%s]\n", defn) ; - OK (GrB_Global_set_String_ (GrB_GLOBAL, "cc", GxB_JIT_C_COMPILER_NAME)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, GxB_JIT_C_COMPILER_NAME)) ; + OK (GrB_Global_set_String_ (GrB_GLOBAL, "cc", (GrB_Field) GxB_JIT_C_COMPILER_NAME)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, (GrB_Field) GxB_JIT_C_COMPILER_NAME)) ; CHECK (MATCH (defn2, "cc")) ; - OK (GrB_Global_set_String_ (GrB_GLOBAL, defn, GxB_JIT_C_COMPILER_NAME)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, GxB_JIT_C_COMPILER_NAME)) ; + OK (GrB_Global_set_String_ (GrB_GLOBAL, defn, (GrB_Field) GxB_JIT_C_COMPILER_NAME)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, (GrB_Field) GxB_JIT_C_COMPILER_NAME)) ; CHECK (MATCH (defn2, defn)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, GxB_JIT_C_COMPILER_FLAGS)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, (GrB_Field) GxB_JIT_C_COMPILER_FLAGS)) ; printf ("JIT C compiler flags: [%s]\n", defn) ; - OK (GrB_Global_set_String_ (GrB_GLOBAL, "-O", GxB_JIT_C_COMPILER_FLAGS)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, GxB_JIT_C_COMPILER_FLAGS)) ; + OK (GrB_Global_set_String_ (GrB_GLOBAL, "-O", (GrB_Field) GxB_JIT_C_COMPILER_FLAGS)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, (GrB_Field) GxB_JIT_C_COMPILER_FLAGS)) ; CHECK (MATCH (defn2, "-O")) ; - OK (GrB_Global_set_String_ (GrB_GLOBAL, defn, GxB_JIT_C_COMPILER_FLAGS)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, GxB_JIT_C_COMPILER_FLAGS)) ; + OK (GrB_Global_set_String_ (GrB_GLOBAL, defn, (GrB_Field) GxB_JIT_C_COMPILER_FLAGS)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, (GrB_Field) GxB_JIT_C_COMPILER_FLAGS)) ; CHECK (MATCH (defn2, defn)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, GxB_JIT_C_LINKER_FLAGS)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, (GrB_Field) GxB_JIT_C_LINKER_FLAGS)) ; printf ("JIT C link flags: [%s]\n", defn) ; - OK (GrB_Global_set_String_ (GrB_GLOBAL, "-stuff", GxB_JIT_C_LINKER_FLAGS)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, GxB_JIT_C_LINKER_FLAGS)) ; + OK (GrB_Global_set_String_ (GrB_GLOBAL, "-stuff", (GrB_Field) GxB_JIT_C_LINKER_FLAGS)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, (GrB_Field) GxB_JIT_C_LINKER_FLAGS)) ; CHECK (MATCH (defn2, "-stuff")) ; - OK (GrB_Global_set_String_ (GrB_GLOBAL, defn, GxB_JIT_C_LINKER_FLAGS)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, GxB_JIT_C_LINKER_FLAGS)) ; + OK (GrB_Global_set_String_ (GrB_GLOBAL, defn, (GrB_Field) GxB_JIT_C_LINKER_FLAGS)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, (GrB_Field) GxB_JIT_C_LINKER_FLAGS)) ; CHECK (MATCH (defn2, defn)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, GxB_JIT_C_LIBRARIES)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, (GrB_Field) GxB_JIT_C_LIBRARIES)) ; printf ("JIT C libraries: [%s]\n", defn) ; - OK (GrB_Global_set_String_ (GrB_GLOBAL, "-lm", GxB_JIT_C_LIBRARIES)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, GxB_JIT_C_LIBRARIES)) ; + OK (GrB_Global_set_String_ (GrB_GLOBAL, "-lm", (GrB_Field) GxB_JIT_C_LIBRARIES)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, (GrB_Field) GxB_JIT_C_LIBRARIES)) ; CHECK (MATCH (defn2, "-lm")) ; - OK (GrB_Global_set_String_ (GrB_GLOBAL, defn, GxB_JIT_C_LIBRARIES)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, GxB_JIT_C_LIBRARIES)) ; + OK (GrB_Global_set_String_ (GrB_GLOBAL, defn, (GrB_Field) GxB_JIT_C_LIBRARIES)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, (GrB_Field) GxB_JIT_C_LIBRARIES)) ; CHECK (MATCH (defn2, defn)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, GxB_JIT_C_CMAKE_LIBS)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, (GrB_Field) GxB_JIT_C_CMAKE_LIBS)) ; printf ("JIT C cmake libs: [%s]\n", defn) ; - OK (GrB_Global_set_String_ (GrB_GLOBAL, "m;dl", GxB_JIT_C_CMAKE_LIBS)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, GxB_JIT_C_CMAKE_LIBS)) ; + OK (GrB_Global_set_String_ (GrB_GLOBAL, "m;dl", (GrB_Field) GxB_JIT_C_CMAKE_LIBS)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, (GrB_Field) GxB_JIT_C_CMAKE_LIBS)) ; CHECK (MATCH (defn2, "m;dl")) ; - OK (GrB_Global_set_String_ (GrB_GLOBAL, defn, GxB_JIT_C_CMAKE_LIBS)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, GxB_JIT_C_CMAKE_LIBS)) ; + OK (GrB_Global_set_String_ (GrB_GLOBAL, defn, (GrB_Field) GxB_JIT_C_CMAKE_LIBS)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, (GrB_Field) GxB_JIT_C_CMAKE_LIBS)) ; CHECK (MATCH (defn2, defn)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, GxB_JIT_C_PREFACE)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, (GrB_Field) GxB_JIT_C_PREFACE)) ; printf ("JIT C preface: [%s]\n", defn) ; - OK (GrB_Global_set_String_ (GrB_GLOBAL, "// stuff", GxB_JIT_C_PREFACE)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, GxB_JIT_C_PREFACE)) ; + OK (GrB_Global_set_String_ (GrB_GLOBAL, "// stuff", (GrB_Field) GxB_JIT_C_PREFACE)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, (GrB_Field) GxB_JIT_C_PREFACE)) ; CHECK (MATCH (defn2, "// stuff")) ; - OK (GrB_Global_set_String_ (GrB_GLOBAL, defn, GxB_JIT_C_PREFACE)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, GxB_JIT_C_PREFACE)) ; + OK (GrB_Global_set_String_ (GrB_GLOBAL, defn, (GrB_Field) GxB_JIT_C_PREFACE)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, (GrB_Field) GxB_JIT_C_PREFACE)) ; CHECK (MATCH (defn2, defn)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, GxB_JIT_CUDA_PREFACE)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, (GrB_Field) GxB_JIT_CUDA_PREFACE)) ; printf ("JIT CUDA preface: [%s]\n", defn) ; - OK (GrB_Global_set_String_ (GrB_GLOBAL, "// cu", GxB_JIT_CUDA_PREFACE)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, GxB_JIT_CUDA_PREFACE)) ; + OK (GrB_Global_set_String_ (GrB_GLOBAL, "// cu", (GrB_Field) GxB_JIT_CUDA_PREFACE)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, (GrB_Field) GxB_JIT_CUDA_PREFACE)) ; CHECK (MATCH (defn2, "// cu")) ; - OK (GrB_Global_set_String_ (GrB_GLOBAL, defn, GxB_JIT_CUDA_PREFACE)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, GxB_JIT_CUDA_PREFACE)) ; + OK (GrB_Global_set_String_ (GrB_GLOBAL, defn, (GrB_Field) GxB_JIT_CUDA_PREFACE)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, (GrB_Field) GxB_JIT_CUDA_PREFACE)) ; CHECK (MATCH (defn2, defn)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, GxB_JIT_ERROR_LOG)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, (GrB_Field) GxB_JIT_ERROR_LOG)) ; printf ("JIT error log: [%s]\n", defn) ; - OK (GrB_Global_set_String_ (GrB_GLOBAL, "errlog.txt", GxB_JIT_ERROR_LOG)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, GxB_JIT_ERROR_LOG)) ; + OK (GrB_Global_set_String_ (GrB_GLOBAL, "errlog.txt", (GrB_Field) GxB_JIT_ERROR_LOG)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, (GrB_Field) GxB_JIT_ERROR_LOG)) ; CHECK (MATCH (defn2, "errlog.txt")) ; - OK (GrB_Global_set_String_ (GrB_GLOBAL, defn, GxB_JIT_ERROR_LOG)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, GxB_JIT_ERROR_LOG)) ; + OK (GrB_Global_set_String_ (GrB_GLOBAL, defn, (GrB_Field) GxB_JIT_ERROR_LOG)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, (GrB_Field) GxB_JIT_ERROR_LOG)) ; CHECK (MATCH (defn2, defn)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, GxB_JIT_CACHE_PATH)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, (GrB_Field) GxB_JIT_CACHE_PATH)) ; printf ("JIT cache: [%s]\n", defn) ; - OK (GrB_Global_set_String_ (GrB_GLOBAL, "/tmp/stuff", GxB_JIT_CACHE_PATH)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, GxB_JIT_CACHE_PATH)) ; + OK (GrB_Global_set_String_ (GrB_GLOBAL, "/tmp/stuff", (GrB_Field) GxB_JIT_CACHE_PATH)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, (GrB_Field) GxB_JIT_CACHE_PATH)) ; CHECK (MATCH (defn2, "/tmp/stuff")) ; - OK (GrB_Global_set_String_ (GrB_GLOBAL, defn, GxB_JIT_CACHE_PATH)) ; - OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, GxB_JIT_CACHE_PATH)) ; + OK (GrB_Global_set_String_ (GrB_GLOBAL, defn, (GrB_Field) GxB_JIT_CACHE_PATH)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, (GrB_Field) GxB_JIT_CACHE_PATH)) ; CHECK (MATCH (defn2, defn)) ; system ("ls /tmp/stuff ; rm -rf /tmp/stuff") ; ERR (GrB_Global_set_String_ (GrB_GLOBAL, defn, GrB_NAME)) ; - OK (GrB_Global_get_SIZE_ (GrB_GLOBAL, &size, GxB_JIT_CACHE_PATH)) ; + OK (GrB_Global_get_SIZE_ (GrB_GLOBAL, &size, (GrB_Field) GxB_JIT_CACHE_PATH)) ; CHECK (size == strlen (defn) + 1) ; double sw [GxB_NBITMAP_SWITCH] ; double s2 [GxB_NBITMAP_SWITCH] ; - OK (GrB_Global_get_SIZE_ (GrB_GLOBAL, &size, GxB_BITMAP_SWITCH)) ; + OK (GrB_Global_get_SIZE_ (GrB_GLOBAL, &size, (GrB_Field) GxB_BITMAP_SWITCH)) ; CHECK (size == sizeof (double) * GxB_NBITMAP_SWITCH) ; - OK (GrB_Global_get_VOID_ (GrB_GLOBAL, (void *) sw, GxB_BITMAP_SWITCH)) ; - OK (GrB_Global_get_VOID_ (GrB_GLOBAL, (void *) s2, GxB_BITMAP_SWITCH)) ; + OK (GrB_Global_get_VOID_ (GrB_GLOBAL, (void *) sw, (GrB_Field) GxB_BITMAP_SWITCH)) ; + OK (GrB_Global_get_VOID_ (GrB_GLOBAL, (void *) s2, (GrB_Field) GxB_BITMAP_SWITCH)) ; for (int k = 0 ; k < GxB_NBITMAP_SWITCH ; k++) { printf ("bitmap switch [%d] = %g\n", k, sw [k]) ; sw [k] = ((double) k) / 8. ; } - OK (GrB_Global_set_VOID_ (GrB_GLOBAL, (void *) sw, GxB_BITMAP_SWITCH, + OK (GrB_Global_set_VOID_ (GrB_GLOBAL, (void *) sw, (GrB_Field) GxB_BITMAP_SWITCH, size)) ; memset (sw, 0, size) ; - OK (GrB_Global_get_VOID_ (GrB_GLOBAL, (void *) sw, GxB_BITMAP_SWITCH)) ; + OK (GrB_Global_get_VOID_ (GrB_GLOBAL, (void *) sw, (GrB_Field) GxB_BITMAP_SWITCH)) ; for (int k = 0 ; k < GxB_NBITMAP_SWITCH ; k++) { CHECK (sw [k] == ((double) k) / 8.) ; } - OK (GrB_Global_set_VOID_ (GrB_GLOBAL, (void *) NULL, GxB_BITMAP_SWITCH, + OK (GrB_Global_set_VOID_ (GrB_GLOBAL, (void *) NULL, (GrB_Field) GxB_BITMAP_SWITCH, 0)) ; - OK (GrB_Global_get_VOID_ (GrB_GLOBAL, (void *) sw, GxB_BITMAP_SWITCH)) ; + OK (GrB_Global_get_VOID_ (GrB_GLOBAL, (void *) sw, (GrB_Field) GxB_BITMAP_SWITCH)) ; for (int k = 0 ; k < GxB_NBITMAP_SWITCH ; k++) { CHECK (sw [k] == s2 [k]) ; } - ERR (GrB_Global_set_VOID_ (GrB_GLOBAL, (void *) s2, GxB_BITMAP_SWITCH, + ERR (GrB_Global_set_VOID_ (GrB_GLOBAL, (void *) s2, (GrB_Field) GxB_BITMAP_SWITCH, 1)) ; ERR (GrB_Global_set_VOID_ (GrB_GLOBAL, (void *) NULL, 0, 0)) ; - ERR (GrB_Global_set_VOID_ (GrB_GLOBAL, (void *) NULL, GxB_PRINTF, 0)) ; - ERR (GrB_Global_set_VOID_ (GrB_GLOBAL, (void *) NULL, GxB_FLUSH, 0)) ; - OK (GrB_Global_set_VOID_ (GrB_GLOBAL, (void *) myprintf, GxB_PRINTF, + ERR (GrB_Global_set_VOID_ (GrB_GLOBAL, (void *) NULL, (GrB_Field) GxB_PRINTF, 0)) ; + ERR (GrB_Global_set_VOID_ (GrB_GLOBAL, (void *) NULL, (GrB_Field) GxB_FLUSH, 0)) ; + OK (GrB_Global_set_VOID_ (GrB_GLOBAL, (void *) myprintf, (GrB_Field) GxB_PRINTF, sizeof (GB_printf_function_t))) ; - OK (GrB_Global_set_VOID_ (GrB_GLOBAL, (void *) myflush, GxB_FLUSH, + OK (GrB_Global_set_VOID_ (GrB_GLOBAL, (void *) myflush, (GrB_Field) GxB_FLUSH, sizeof (GB_flush_function_t))) ; OK (GxB_print (s_int32, 3)) ; - OK (GrB_Global_set_VOID_ (GrB_GLOBAL, (void *) mexPrintf, GxB_PRINTF, + OK (GrB_Global_set_VOID_ (GrB_GLOBAL, (void *) mexPrintf, (GrB_Field) GxB_PRINTF, sizeof (GB_printf_function_t))) ; - OK (GrB_Global_set_VOID_ (GrB_GLOBAL, (void *) NULL, GxB_FLUSH, + OK (GrB_Global_set_VOID_ (GrB_GLOBAL, (void *) NULL, (GrB_Field) GxB_FLUSH, sizeof (GB_flush_function_t))) ; OK (GxB_print (s_int32, 3)) ; int32_t cv [3] ; - OK (GrB_Global_get_SIZE_ (GrB_GLOBAL, &size, GxB_COMPILER_VERSION)) ; + OK (GrB_Global_get_SIZE_ (GrB_GLOBAL, &size, (GrB_Field) GxB_COMPILER_VERSION)) ; CHECK (size == sizeof (int32_t) * 3) ; OK (GrB_Global_get_VOID_ (GrB_GLOBAL, (void *) cv, - GxB_COMPILER_VERSION)) ; + (GrB_Field) GxB_COMPILER_VERSION)) ; for (int k = 0 ; k < 3 ; k++) { @@ -439,22 +439,22 @@ void mexFunction } void *f = NULL ; - OK (GrB_Global_get_VOID_(GrB_GLOBAL, (void *) &f, GxB_MALLOC_FUNCTION)) ; + OK (GrB_Global_get_VOID_(GrB_GLOBAL, (void *) &f, (GrB_Field) GxB_MALLOC_FUNCTION)) ; CHECK (f == mxMalloc) ; - OK (GrB_Global_get_VOID_(GrB_GLOBAL, (void *) &f, GxB_REALLOC_FUNCTION)) ; + OK (GrB_Global_get_VOID_(GrB_GLOBAL, (void *) &f, (GrB_Field) GxB_REALLOC_FUNCTION)) ; CHECK (f == mxRealloc) ; - OK (GrB_Global_get_VOID (GrB_GLOBAL, (void *) &f, GxB_CALLOC_FUNCTION)) ; + OK (GrB_Global_get_VOID (GrB_GLOBAL, (void *) &f, (GrB_Field) GxB_CALLOC_FUNCTION)) ; CHECK (f == mxCalloc) ; - OK (GrB_Global_get_VOID (GrB_GLOBAL, (void *) &f, GxB_FREE_FUNCTION)) ; + OK (GrB_Global_get_VOID (GrB_GLOBAL, (void *) &f, (GrB_Field) GxB_FREE_FUNCTION)) ; CHECK (f == mxFree) ; - OK (GrB_Global_get_SIZE_ (GrB_GLOBAL, &size, GxB_MALLOC_FUNCTION)) ; + OK (GrB_Global_get_SIZE_ (GrB_GLOBAL, &size, (GrB_Field) GxB_MALLOC_FUNCTION)) ; CHECK (size == sizeof (void *)) ; - OK (GrB_Global_get_SIZE_ (GrB_GLOBAL, &size, GxB_REALLOC_FUNCTION)) ; + OK (GrB_Global_get_SIZE_ (GrB_GLOBAL, &size, (GrB_Field) GxB_REALLOC_FUNCTION)) ; CHECK (size == sizeof (void *)) ; - OK (GrB_Global_get_SIZE_ (GrB_GLOBAL, &size, GxB_CALLOC_FUNCTION)) ; + OK (GrB_Global_get_SIZE_ (GrB_GLOBAL, &size, (GrB_Field) GxB_CALLOC_FUNCTION)) ; CHECK (size == sizeof (void *)) ; - OK (GrB_Global_get_SIZE_ (GrB_GLOBAL, &size, GxB_FREE_FUNCTION)) ; + OK (GrB_Global_get_SIZE_ (GrB_GLOBAL, &size, (GrB_Field) GxB_FREE_FUNCTION)) ; CHECK (size == sizeof (void *)) ; //-------------------------------------------------------------------------- diff --git a/Test/GB_mex_test30.c b/Test/GB_mex_test30.c index 2ca9209a69..6e60f60a39 100644 --- a/Test/GB_mex_test30.c +++ b/Test/GB_mex_test30.c @@ -16,31 +16,32 @@ #define GET_DEEP_COPY ; #define FREE_DEEP_COPY ; -#define GETOP(op,opname) \ -{ \ - size_t siz1, siz2, siz3 ; \ - OK (GrB_IndexUnaryOp_get_String (op, name, GrB_NAME)) ; \ - CHECK (MATCH (name, opname)) ; \ - OK (GrB_IndexUnaryOp_get_String (op, cname, GxB_JIT_C_NAME)) ; \ - printf ("%s: %s\n", name, cname) ; \ - OK (GrB_IndexUnaryOp_get_SIZE (op, &size, GrB_NAME)) ; \ - CHECK (size == strlen (name) + 1) ; \ - GrB_Info info2, info3 ; \ - info2 = GrB_IndexUnaryOp_get_SIZE (op, &siz1, GrB_INP0_TYPE_STRING) ; \ - info3 = GrB_IndexUnaryOp_get_String (op, name, GrB_INP0_TYPE_STRING) ; \ - CHECK (info2 == info3) ; \ - CHECK (siz1 == strlen (name) + 1) ; \ - if (info2 == GrB_NO_VALUE) { CHECK (siz1 == 1) ; } \ - info2 = GrB_IndexUnaryOp_get_SIZE (op, &siz2, GrB_INP1_TYPE_STRING) ; \ - info3 = GrB_IndexUnaryOp_get_String (op, name, GrB_INP1_TYPE_STRING) ; \ - CHECK (info2 == info3) ; \ - CHECK (siz2 == strlen (name) + 1) ; \ - if (info2 == GrB_NO_VALUE) { CHECK (siz2 == 1) ; } \ - info2 = GrB_IndexUnaryOp_get_SIZE (op, &siz3, GrB_OUTP_TYPE_STRING) ; \ - info3 = GrB_IndexUnaryOp_get_String (op, name, GrB_OUTP_TYPE_STRING) ; \ - CHECK (info2 == info3) ; \ - CHECK (siz3 == strlen (name) + 1) ; \ - if (info2 == GrB_NO_VALUE) { CHECK (siz3 == 1) ; } \ +#define GETOP(op,opname) \ +{ \ + size_t siz1, siz2, siz3 ; \ + OK (GrB_IndexUnaryOp_get_String (op, name, GrB_NAME)) ; \ + CHECK (MATCH (name, opname)) ; \ + OK (GrB_IndexUnaryOp_get_String (op, cname, \ + (GrB_Field) GxB_JIT_C_NAME)); \ + printf ("%s: %s\n", name, cname) ; \ + OK (GrB_IndexUnaryOp_get_SIZE (op, &size, GrB_NAME)) ; \ + CHECK (size == strlen (name) + 1) ; \ + GrB_Info info2, info3 ; \ + info2 = GrB_IndexUnaryOp_get_SIZE (op, &siz1, GrB_INP0_TYPE_STRING) ; \ + info3 = GrB_IndexUnaryOp_get_String (op, name, GrB_INP0_TYPE_STRING) ; \ + CHECK (info2 == info3) ; \ + CHECK (siz1 == strlen (name) + 1) ; \ + if (info2 == GrB_NO_VALUE) { CHECK (siz1 == 1) ; } \ + info2 = GrB_IndexUnaryOp_get_SIZE (op, &siz2, GrB_INP1_TYPE_STRING) ; \ + info3 = GrB_IndexUnaryOp_get_String (op, name, GrB_INP1_TYPE_STRING) ; \ + CHECK (info2 == info3) ; \ + CHECK (siz2 == strlen (name) + 1) ; \ + if (info2 == GrB_NO_VALUE) { CHECK (siz2 == 1) ; } \ + info2 = GrB_IndexUnaryOp_get_SIZE (op, &siz3, GrB_OUTP_TYPE_STRING) ; \ + info3 = GrB_IndexUnaryOp_get_String (op, name, GrB_OUTP_TYPE_STRING) ; \ + CHECK (info2 == info3) ; \ + CHECK (siz3 == strlen (name) + 1) ; \ + if (info2 == GrB_NO_VALUE) { CHECK (siz3 == 1) ; } \ } #define GETNAME(op) \ @@ -231,7 +232,8 @@ void mexFunction expected = GrB_INVALID_VALUE ; ERR (GrB_IndexUnaryOp_get_VOID_(GrB_TRIL, nothing, 0)) ; - OK (GrB_IndexUnaryOp_new (&op, myfunc, GrB_BOOL, GrB_FP32, GrB_FP32)) ; + OK (GrB_IndexUnaryOp_new (&op, (GxB_index_unary_function) myfunc, + GrB_BOOL, GrB_FP32, GrB_FP32)) ; OK (GrB_IndexUnaryOp_get_SIZE_(op, &size, GrB_NAME)) ; CHECK (size == 1) ; OK (GrB_IndexUnaryOp_get_SIZE_(op, &size, GxB_JIT_C_NAME)) ; diff --git a/Test/GB_mex_test31.c b/Test/GB_mex_test31.c index 53754b679c..bdb37871f2 100644 --- a/Test/GB_mex_test31.c +++ b/Test/GB_mex_test31.c @@ -277,7 +277,8 @@ void mexFunction ERR (GrB_Monoid_get_String_(GrB_MAX_MONOID_INT32, name, 999)) ; ERR (GrB_Monoid_get_VOID_(GrB_LAND_MONOID_BOOL, nothing, 0)) ; - OK (GrB_BinaryOp_new (&binop, myfunc, GrB_FP32, GrB_FP32, GrB_FP32)) ; + OK (GrB_BinaryOp_new (&binop, (GxB_binary_function) myfunc, + GrB_FP32, GrB_FP32, GrB_FP32)) ; OK (GrB_BinaryOp_set_String_(binop, "myfunc", GrB_NAME)) ; METHOD (GrB_BinaryOp_set_String (binop, MYFUNC_DEFN, GxB_JIT_C_DEFINITION)) ; diff --git a/Test/GB_mex_test32.c b/Test/GB_mex_test32.c index c35963840b..fd6f7075bf 100644 --- a/Test/GB_mex_test32.c +++ b/Test/GB_mex_test32.c @@ -2167,13 +2167,17 @@ void mexFunction ERR (GrB_Semiring_get_VOID_(GrB_LOR_LAND_SEMIRING_BOOL, nothing, 0)) ; - OK (GrB_BinaryOp_new (×, mytimes, GrB_FP32, GrB_FP32, GrB_FP32)) ; + OK (GrB_BinaryOp_new (×, + (GxB_binary_function) mytimes, GrB_FP32, GrB_FP32, GrB_FP32)) ; OK (GrB_BinaryOp_set_String_(times, "mytimes", GrB_NAME)) ; - METHOD (GrB_BinaryOp_set_String (times, MYTIMES_DEFN, GxB_JIT_C_DEFINITION)) ; + METHOD (GrB_BinaryOp_set_String (times, MYTIMES_DEFN, + (GrB_Field) GxB_JIT_C_DEFINITION)) ; - OK (GrB_BinaryOp_new (&add, myadd, GrB_FP32, GrB_FP32, GrB_FP32)) ; + OK (GrB_BinaryOp_new (&add, + (GxB_binary_function) myadd, GrB_FP32, GrB_FP32, GrB_FP32)) ; OK (GrB_BinaryOp_set_String_(add, "myadd", GrB_NAME)) ; - METHOD (GrB_BinaryOp_set_String (add, MYADD_DEFN, GxB_JIT_C_DEFINITION)) ; + METHOD (GrB_BinaryOp_set_String (add, MYADD_DEFN, + (GrB_Field) GxB_JIT_C_DEFINITION)) ; OK (GrB_Monoid_new_FP32 (&monoid, add, (float) 0.0)) ; OK (GrB_Monoid_get_SIZE_(monoid, &size, GrB_NAME)) ; diff --git a/Test/GB_mex_test33.c b/Test/GB_mex_test33.c index 74ef826d17..565fe7cc8c 100644 --- a/Test/GB_mex_test33.c +++ b/Test/GB_mex_test33.c @@ -112,7 +112,7 @@ void mexFunction OK (GxB_Context_get_String_ (GxB_CONTEXT_WORLD, name, GrB_NAME)) ; CHECK (MATCH (name, "GxB_CONTEXT_WORLD")) ; - ERR (GxB_Context_get_SIZE_ (GxB_CONTEXT_WORLD, &size, GxB_FORMAT)) ; + ERR (GxB_Context_get_SIZE_ (GxB_CONTEXT_WORLD, &size, (GrB_Field) GxB_FORMAT)) ; expected = GrB_INVALID_VALUE ; ERR (GxB_Context_get_VOID_ (GxB_CONTEXT_WORLD, nothing, 0)) ; diff --git a/Test/GB_mex_test34.c b/Test/GB_mex_test34.c index 4ec290378b..88b2bc1d7a 100644 --- a/Test/GB_mex_test34.c +++ b/Test/GB_mex_test34.c @@ -18,10 +18,10 @@ #define DGET(desc,value,field) \ { \ - OK (GrB_Descriptor_get_INT32 (desc, &i, field)) ; \ + OK (GrB_Descriptor_get_INT32 (desc, &i, (GrB_Field) (field))) ; \ CHECK (i == value) ; \ OK (GrB_Scalar_clear (s_int32)) ; \ - OK (GrB_Descriptor_get_Scalar (desc, s_int32, field)) ; \ + OK (GrB_Descriptor_get_Scalar (desc, s_int32, (GrB_Field) (field))) ; \ int32_t iscalar = -1 ; \ OK (GrB_Scalar_extractElement_INT32 (&iscalar, s_int32)) ; \ CHECK (iscalar == value) ; \ @@ -33,16 +33,16 @@ #define DSET(desc,value,field) \ { \ - OK (GrB_Descriptor_set_INT32 (desc, GrB_DEFAULT, field)) ; \ - OK (GrB_Descriptor_set_INT32 (desc, value, field)) ; \ + OK (GrB_Descriptor_set_INT32 (desc, GrB_DEFAULT, (GrB_Field) (field))) ; \ + OK (GrB_Descriptor_set_INT32 (desc, value, (GrB_Field) (field))) ; \ int32_t i2 ; \ - OK (GrB_Descriptor_get_INT32 (desc, &i2, field)) ; \ + OK (GrB_Descriptor_get_INT32 (desc, &i2, (GrB_Field) (field))) ; \ CHECK (i2 == value) ; \ - OK (GrB_Descriptor_set_INT32 (desc, GrB_DEFAULT, field)) ; \ + OK (GrB_Descriptor_set_INT32 (desc, GrB_DEFAULT, (GrB_Field) (field))) ; \ OK (GrB_Scalar_setElement_INT32 (s_int32, value)) ; \ - OK (GrB_Descriptor_set_Scalar (desc, s_int32, field)) ; \ + OK (GrB_Descriptor_set_Scalar (desc, s_int32, (GrB_Field) (field))) ; \ int32_t i3 ; \ - OK (GrB_Descriptor_get_INT32 (desc, &i2, field)) ; \ + OK (GrB_Descriptor_get_INT32 (desc, &i2, (GrB_Field) (field))) ; \ CHECK (i2 == value) ; \ } @@ -412,38 +412,38 @@ GrB_DESC_RSCT0T1 ; // GrB_REPLACE GrB_STRUCTURE GrB_COMP GrB_TRAN GrB_TRAN expected = GrB_INVALID_VALUE ; ERR (GrB_Descriptor_get_INT32_ (GrB_DESC_T1, &i, GrB_NAME)) ; - ERR (GrB_Descriptor_set_INT32_ (GrB_DESC_T1, GrB_REPLACE, GrB_OUTP)) ; - ERR (GrB_Descriptor_set_INT32 (NULL, GrB_REPLACE, GrB_OUTP)) ; - ERR (GrB_Descriptor_get_SIZE_ (GrB_DESC_T1, &size, GrB_OUTP)) ; - ERR (GrB_Descriptor_set_Scalar_ (GrB_DESC_T1, s_int32, GrB_MASK)) ; - ERR (GrB_Descriptor_set_Scalar (NULL, s_int32, GrB_MASK)) ; + ERR (GrB_Descriptor_set_INT32_ (GrB_DESC_T1, GrB_REPLACE, (GrB_Field) GrB_OUTP)) ; + ERR (GrB_Descriptor_set_INT32 (NULL, GrB_REPLACE, (GrB_Field) GrB_OUTP)) ; + ERR (GrB_Descriptor_get_SIZE_ (GrB_DESC_T1, &size, (GrB_Field) GrB_OUTP)) ; + ERR (GrB_Descriptor_set_Scalar_ (GrB_DESC_T1, s_int32, (GrB_Field) GrB_MASK)) ; + ERR (GrB_Descriptor_set_Scalar (NULL, s_int32, (GrB_Field) GrB_MASK)) ; ERR (GrB_Descriptor_set_INT32_ (desc, GrB_DEFAULT, GrB_NAME)) ; ERR (GrB_Descriptor_set_String_ (GrB_DESC_T1, "newname", GrB_NAME)) ; - char *err ; - ERR (GrB_Descriptor_set_INT32_ (desc, 999, GrB_OUTP)) ; + const char *err ; + ERR (GrB_Descriptor_set_INT32_ (desc, 999, (GrB_Field) GrB_OUTP)) ; OK (GrB_Descriptor_error (&err, desc)) ; printf ("error: %s\n\n", err) ; - ERR (GrB_Descriptor_set_INT32_ (desc, 998, GrB_MASK)) ; + ERR (GrB_Descriptor_set_INT32_ (desc, 998, (GrB_Field) GrB_MASK)) ; OK (GrB_Descriptor_error (&err, desc)) ; printf ("error: %s\n\n", err) ; - ERR (GrB_Descriptor_set_INT32_ (desc, 997, GrB_INP0)) ; + ERR (GrB_Descriptor_set_INT32_ (desc, 997, (GrB_Field) GrB_INP0)) ; OK (GrB_Descriptor_error (&err, desc)) ; printf ("error: %s\n\n", err) ; - ERR (GrB_Descriptor_set_INT32_ (desc, 996, GrB_INP1)) ; + ERR (GrB_Descriptor_set_INT32_ (desc, 996, (GrB_Field) GrB_INP1)) ; OK (GrB_Descriptor_error (&err, desc)) ; printf ("error: %s\n\n", err) ; - ERR (GrB_Descriptor_set_INT32_ (desc, 995, GxB_AxB_METHOD)) ; + ERR (GrB_Descriptor_set_INT32_ (desc, 995, (GrB_Field) GxB_AxB_METHOD)) ; OK (GrB_Descriptor_error (&err, desc)) ; printf ("error: %s\n\n", err) ; expected = GrB_EMPTY_OBJECT ; OK (GrB_Scalar_clear (s_int32)) ; - ERR (GrB_Descriptor_set_Scalar_ (desc, s_int32, GrB_MASK)) ; + ERR (GrB_Descriptor_set_Scalar_ (desc, s_int32, (GrB_Field) GrB_MASK)) ; expected = GrB_INVALID_VALUE ; ERR (GrB_Descriptor_set_VOID_ (desc, nothing, 0, 0)) ; diff --git a/Test/GB_mex_test35.c b/Test/GB_mex_test35.c index 76ede3b340..0708008f95 100644 --- a/Test/GB_mex_test35.c +++ b/Test/GB_mex_test35.c @@ -40,7 +40,8 @@ void mexFunction GrB_Type type = NULL ; uint8_t stuff [256] ; void *nothing = stuff ; - size_t size, blob_size = 0 ; + size_t size ; + GrB_Index blob_size = 0 ; char name [256] ; char defn [2048] ; int32_t code, i ; @@ -96,11 +97,11 @@ void mexFunction printf ("blob storage: %d\n", i) ; CHECK (i == GrB_COLMAJOR) ; - OK (GxB_Serialized_get_INT32_(blob, &i, GxB_FORMAT, blob_size)) ; + OK (GxB_Serialized_get_INT32_(blob, &i, (GrB_Field) GxB_FORMAT, blob_size)) ; printf ("blob storage: %d\n", i) ; CHECK (i == GxB_BY_COL) ; - OK (GxB_Serialized_get_INT32_(blob, &i, GxB_SPARSITY_CONTROL, blob_size)) ; + OK (GxB_Serialized_get_INT32_(blob, &i, (GrB_Field) GxB_SPARSITY_CONTROL, blob_size)) ; printf ("blob sparsity control: %d\n", i) ; CHECK (i == GxB_AUTO_SPARSITY) ; @@ -123,7 +124,7 @@ void mexFunction mxFree (blob) ; blob = NULL ; blob_size = 0 ; OK (GxB_Matrix_serialize (&blob, &blob_size, A, NULL)) ; - OK (GxB_Serialized_get_INT32_(blob, &i, GxB_SPARSITY_STATUS, blob_size)) ; + OK (GxB_Serialized_get_INT32_(blob, &i, (GrB_Field) GxB_SPARSITY_STATUS, blob_size)) ; printf ("blob sparsity status: %d\n", i) ; CHECK (i == GxB_FULL) ; @@ -148,13 +149,13 @@ void mexFunction ERR (GxB_Serialized_get_SIZE_(blob, &size, 0, blob_size)) ; fvalue = -1 ; - OK (GxB_Serialized_get_Scalar_(blob, s_fp32, GxB_BITMAP_SWITCH, + OK (GxB_Serialized_get_Scalar_(blob, s_fp32, (GrB_Field) GxB_BITMAP_SWITCH, blob_size)) ; OK (GrB_Scalar_extractElement_FP32_(&fvalue, s_fp32)) ; printf ("blob bitmap switch: %g\n", fvalue) ; - CHECK (abs (fvalue - 0.04) < 1e-6) ; + CHECK (fabs (fvalue - 0.08) < 1e-6) ; - OK (GrB_Matrix_set_INT32_(A, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; + OK (GrB_Matrix_set_INT32_(A, GxB_BITMAP, (GrB_Field) GxB_SPARSITY_CONTROL)) ; // free the blob and recreate it mxFree (blob) ; blob = NULL ; blob_size = 0 ; @@ -162,26 +163,26 @@ void mexFunction OK (GxB_Serialized_get_String_(A, name, GxB_JIT_C_NAME)) ; - OK (GxB_Serialized_get_INT32_(blob, &i, GxB_SPARSITY_STATUS, blob_size)) ; + OK (GxB_Serialized_get_INT32_(blob, &i, (GrB_Field) GxB_SPARSITY_STATUS, blob_size)) ; printf ("blob sparsity status: %d\n", i) ; CHECK (i == GxB_BITMAP) ; OK (GrB_Scalar_setElement_FP32_(s_fp32, 0.25)) ; - OK (GrB_Matrix_set_Scalar_(A, s_fp32, GxB_HYPER_SWITCH)) ; + OK (GrB_Matrix_set_Scalar_(A, s_fp32, (GrB_Field) GxB_HYPER_SWITCH)) ; // free the blob and recreate it mxFree (blob) ; blob = NULL ; blob_size = 0 ; OK (GxB_Matrix_serialize (&blob, &blob_size, A, NULL)) ; - OK (GxB_Serialized_get_Scalar_(blob, s_fp64, GxB_HYPER_SWITCH, blob_size)) ; + OK (GxB_Serialized_get_Scalar_(blob, s_fp64, (GrB_Field) GxB_HYPER_SWITCH, blob_size)) ; OK (GrB_Scalar_extractElement_FP64_(&dvalue, s_fp64)) ; printf ("blob hyper switch: %g\n", dvalue) ; - CHECK (abs (dvalue - 0.25) < 1e-6) ; + CHECK (fabs (dvalue - 0.25) < 1e-6) ; OK (GrB_Matrix_set_INT32_(A, GrB_ROWMAJOR, GrB_STORAGE_ORIENTATION_HINT)) ; OK (GrB_Matrix_get_INT32_(A, &i, GrB_STORAGE_ORIENTATION_HINT)) ; CHECK (i == GrB_ROWMAJOR) ; - OK (GrB_Matrix_get_INT32_(A, &i, GxB_FORMAT)) ; + OK (GrB_Matrix_get_INT32_(A, &i, (GrB_Field) GxB_FORMAT)) ; CHECK (i == GxB_BY_ROW) ; // GxB_print (A, 3) ; @@ -192,7 +193,7 @@ void mexFunction OK (GxB_Serialized_get_INT32_(blob, &i, GrB_STORAGE_ORIENTATION_HINT, blob_size)) ; CHECK (i == GrB_ROWMAJOR) ; - OK (GxB_Serialized_get_INT32_(blob, &i, GxB_FORMAT, blob_size)) ; + OK (GxB_Serialized_get_INT32_(blob, &i, (GrB_Field) GxB_FORMAT, blob_size)) ; CHECK (i == GxB_BY_ROW) ; // GxB_print (A, 3) ; @@ -205,11 +206,11 @@ void mexFunction expected = GrB_INVALID_OBJECT ; uint8_t *b = (uint8_t *) blob ; - ERR (GxB_Serialized_get_INT32_(blob, &i, GxB_FORMAT, 20)) ; + ERR (GxB_Serialized_get_INT32_(blob, &i, (GrB_Field) GxB_FORMAT, 20)) ; b [0]++ ; - ERR (GxB_Serialized_get_INT32_(blob, &i, GxB_FORMAT, blob_size)) ; + ERR (GxB_Serialized_get_INT32_(blob, &i, (GrB_Field) GxB_FORMAT, blob_size)) ; b [0]-- ; - OK (GxB_Serialized_get_INT32_(blob, &i, GxB_FORMAT, blob_size)) ; + OK (GxB_Serialized_get_INT32_(blob, &i, (GrB_Field) GxB_FORMAT, blob_size)) ; CHECK (i == GxB_BY_ROW) ; OK (GxB_Serialized_get_Scalar_(blob, s_int32, GrB_STORAGE_ORIENTATION_HINT, @@ -217,16 +218,16 @@ void mexFunction OK (GrB_Scalar_extractElement_INT32_(&i, s_int32)) ; CHECK (i == GrB_ROWMAJOR) ; - OK (GxB_Serialized_get_Scalar_(blob, s_int32, GxB_FORMAT, blob_size)) ; + OK (GxB_Serialized_get_Scalar_(blob, s_int32, (GrB_Field) GxB_FORMAT, blob_size)) ; OK (GrB_Scalar_extractElement_INT32_(&i, s_int32)) ; CHECK (i == GxB_BY_ROW) ; - OK (GxB_Serialized_get_Scalar_(blob, s_int32, GxB_SPARSITY_CONTROL, + OK (GxB_Serialized_get_Scalar_(blob, s_int32, (GrB_Field) GxB_SPARSITY_CONTROL, blob_size)) ; OK (GrB_Scalar_extractElement_INT32_(&i, s_int32)) ; CHECK (i == GxB_BITMAP) ; - OK (GxB_Serialized_get_Scalar_(blob, s_int32, GxB_SPARSITY_STATUS, + OK (GxB_Serialized_get_Scalar_(blob, s_int32, (GrB_Field) GxB_SPARSITY_STATUS, blob_size)) ; OK (GrB_Scalar_extractElement_INT32_(&i, s_int32)) ; CHECK (i == GxB_BITMAP) ; @@ -266,7 +267,7 @@ void mexFunction OK (GrB_Matrix_new (&A, type, 50, 50)) ; OK (GrB_Matrix_setElement (A, (void *) &one, 0, 0)) ; OK (GrB_Matrix_wait (A, GrB_MATERIALIZE)) ; - OK (GrB_Matrix_set_INT32_(A, GxB_HYPERSPARSE, GxB_SPARSITY_CONTROL)) ; + OK (GrB_Matrix_set_INT32_(A, GxB_HYPERSPARSE, (GrB_Field) GxB_SPARSITY_CONTROL)) ; OK (GrB_Matrix_set_String_(A, "A hyper", GrB_NAME)) ; OK (GrB_Matrix_get_String_(A, name, GrB_NAME)) ; diff --git a/Test/GB_mx_get_global.c b/Test/GB_mx_get_global.c index 2293698d51..31adcb6fe4 100644 --- a/Test/GB_mx_get_global.c +++ b/Test/GB_mx_get_global.c @@ -169,7 +169,7 @@ bool GB_mx_get_global // true if doing malloc_debug GrB_Scalar s ; GrB_Scalar_new (&s, GrB_INT64) ; GrB_Scalar_setElement_INT64 (s, 8) ; - GrB_Global_set_Scalar (GrB_GLOBAL, s, GxB_HYPER_HASH) ; + GrB_Global_set_Scalar (GrB_GLOBAL, s, (GrB_Field) GxB_HYPER_HASH) ; GrB_Scalar_free (&s) ; //-------------------------------------------------------------------------- diff --git a/Test/README.txt b/Test/README.txt index 9fa56d5242..d3702aca6f 100644 --- a/Test/README.txt +++ b/Test/README.txt @@ -19,14 +19,16 @@ Requirements: the mex command must use a C compiler supporting C11. Microft Visual Studio does not support C11 so this test is not available on Windows unless you use another compiler. +First compile and install the libgraphblas or libgraphblas_matlab library. +For Linux or Mac, in the GraphBLAS/GraphBLAS folder, type + + make ; sudo make install + To run the tests, use the following command in this directory, in the -Octave Command Window: +MATLAB/Octave Command Window: make ; testall -If you get a linking problem on linux, add this directory to your -LD_LIBRARY_PATH, so that the libgraphblas.so can be found by the mexFunctions. - Longer tests can be done as well (this can take a whole day): testall (1) @@ -98,8 +100,6 @@ README.txt this file Contents.m list of m-files in this folder -GB_define.m create #defines for GraphBLAS.h - GB_user_*.m test user-defined complex type and operators Makefile only 'make clean' and 'make distclean' diff --git a/cmake_modules/GraphBLAS_JIT_paths.cmake b/cmake_modules/GraphBLAS_JIT_paths.cmake index c8b90c4fa0..a132e22c2e 100644 --- a/cmake_modules/GraphBLAS_JIT_paths.cmake +++ b/cmake_modules/GraphBLAS_JIT_paths.cmake @@ -43,7 +43,7 @@ if ( SUITESPARSE_HAS_CUDA AND GRAPHBLAS_USE_CUDA ) set ( GRAPHBLAS_COMPACT on ) endif ( ) -option ( GRAPHBLAS_COMPACT "ON: do not compile FactoryKernels. OFF (default): compile FactoryKernels" ON ) +option ( GRAPHBLAS_COMPACT "ON: do not compile FactoryKernels. OFF (default): compile FactoryKernels" OFF ) option ( GRAPHBLAS_USE_JIT "ON (default): use the CPU JIT. OFF: do not use the CPU JIT" ON ) if ( GRAPHBLAS_USE_JIT ) From 4adbfac2d7f813650370cbe0c926a1d806a7b6a8 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Mon, 20 May 2024 08:58:45 -0500 Subject: [PATCH 62/76] user guide for 9.2.0 --- CMakeLists.txt | 2 +- Doc/ChangeLog | 4 +- Doc/GraphBLAS_UserGuide.pdf | Bin 1128977 -> 1147889 bytes Doc/GraphBLAS_UserGuide.tex | 413 +++++--------------------- Doc/GraphBLAS_version.tex | 4 +- GraphBLAS/Contents.m | 4 + Include/GraphBLAS.h | 10 +- README.md | 2 +- Source/GB_jitifyer.c | 4 +- cmake_modules/GraphBLAS_version.cmake | 6 +- 10 files changed, 100 insertions(+), 349 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ad6e01c173..2b7a00994b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,7 +41,7 @@ if ( NOT BUILD_SHARED_LIBS ) endif ( ) # CUDA is under development for now, and not deployed in production: -# set ( GRAPHBLAS_USE_CUDA OFF ) +# set ( GRAPHBLAS_USE_CUDA OFF ) % FIXME NOW set ( GRAPHBLAS_USE_CUDA ON ) include ( SuiteSparsePolicy ) diff --git a/Doc/ChangeLog b/Doc/ChangeLog index 5908d015cc..0f0d861f2c 100644 --- a/Doc/ChangeLog +++ b/Doc/ChangeLog @@ -1,5 +1,7 @@ -Apr 9, 2024: version 9.1.1 +May XX, 2024: version 9.2.0 FIXME + * Added graphblas_install.m: for a simpler method of compiling + the MATLAB/Octave interface for GraphBLAS. * JIT: sanitizing the JIT cache path, better burble for compiler errors * GrB_get/GrB_set: better handling of concurrent get/set between different user threads diff --git a/Doc/GraphBLAS_UserGuide.pdf b/Doc/GraphBLAS_UserGuide.pdf index 327ab43bce5b05a53927a6c9d87f3eea52682dad..43af8548985db28770570bd476261069579afab0 100644 GIT binary patch delta 829413 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%0A2t&=hH$XmiBY* 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

    v6=*{`w zq-hu<)qXa2UkBm^+nj*5y~$whvHhS~R{=YHfTWd8+gdnsZPZ-_s(2*(01iddPUAFY z)8_swn4Z%k0IZtZ7?@#v#@K_J=aIxH1e(e;iAMG{$IT7f{5yDs(_J6!l(hMG@k!=t zX8)F^@*7+!A%PjCw{~jw?2?+M~+kcx5%J`VOD3CXeUsdD1c^JU_SRRpj>-aZNoX;)*#ozp{og4@GY)VWMuj zEdJ-+gd?RMDpbweR6&hVzccCCF0|47SZ%thEUdQOqL9R0>>(L4 zNEbSL?I^!GJAU1Do9TI~`u}Qs�z?E?hW;qI5(9gsKRFbO_QRNbgPQUD41%n$#0O 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 diff --git a/Doc/GraphBLAS_UserGuide.tex b/Doc/GraphBLAS_UserGuide.tex index 598b4c7484..7b234f2088 100644 --- a/Doc/GraphBLAS_UserGuide.tex +++ b/Doc/GraphBLAS_UserGuide.tex @@ -8147,6 +8147,8 @@ \subsection{Using the JIT} is not set, then JIT compilation is disabled and only PreJIT kernels can be used. The optional environment variable, \verb'GRAPHBLAS_CACHE_PATH', is also read by \verb'GrB_init' when the user application runs. +See Section~\ref{cache_path} for a description of the valid characters +that can appear in the cache path. When the user application starts, it can modify the location of the cache folder after calling \verb'GrB_init'. It can also modify the C compiler and @@ -8395,6 +8397,7 @@ \subsubsection{\sf GxB\_JIT\_ERROR\_LOG} %---------------------------------------- \subsubsection{\sf GxB\_JIT\_CACHE\_PATH} +\label{cache_path} %---------------------------------------- The \verb'GxB_JIT_CACHE_PATH' string is the full path to the user's cache @@ -8406,6 +8409,20 @@ \subsubsection{\sf GxB\_JIT\_CACHE\_PATH} exists, and initializes the cache path with that value instead of using the default. +{\bf Restrictions:} the cache path is santized for security reasons. No spaces +are permitted. Backslashes are converted into forward slashes. It can contain +only charactors in the following list: + +\begin{verbatim} + abcdefghijklmnopqrstuvwxyz + ABCDEFGHIJKLMNOPQRSTUVWXYZ + 0123456789.-_/ +\end{verbatim} + +In addition, the second character in the string is allowed to be the colon +character (\verb':') to allow for the use of Windows drive letters. Any +character outside of these rules is converted into an underscore (\verb'_'). + %------------------------------------------------------------------------------- \subsection{Compilation options: {\sf GRAPHBLAS\_USE\_JIT} and {\sf GRAPHBLAS\_COMPACT}} %------------------------------------------------------------------------------- @@ -14768,6 +14785,12 @@ \section{Release Notes} \begin{itemize} +\item Apr 7, 2024: version 9.1.1 + + \begin{itemize} + \item JIT: sanitizing the JIT cache path, better burble for compiler errors. + \end{itemize} + \item Mar 22, 2024: version 9.1.0 \begin{itemize} diff --git a/Doc/GraphBLAS_version.tex b/Doc/GraphBLAS_version.tex index 4531864a8c..60e7d991fc 100644 --- a/Doc/GraphBLAS_version.tex +++ b/Doc/GraphBLAS_version.tex @@ -1,5 +1,5 @@ % version of SuiteSparse:GraphBLAS \date{VERSION 9.1.1, -Apr XX, 2024} +Apr 7, 2024} diff --git a/Include/GraphBLAS.h b/Include/GraphBLAS.h index 1f870d0801..2a63e283b6 100644 --- a/Include/GraphBLAS.h +++ b/Include/GraphBLAS.h @@ -133,7 +133,7 @@ //------------------------------------------------------------------------------ #ifndef GRAPHBLAS_HAS_CUDA -#define GRAPHBLAS_HAS_CUDA +/* #undef GRAPHBLAS_HAS_CUDA */ #endif //------------------------------------------------------------------------------ @@ -234,7 +234,7 @@ // The version of this implementation, and the GraphBLAS API version: #define GxB_IMPLEMENTATION_NAME "SuiteSparse:GraphBLAS" -#define GxB_IMPLEMENTATION_DATE "Apr XX, 2024" +#define GxB_IMPLEMENTATION_DATE "Apr 7, 2024" #define GxB_IMPLEMENTATION_MAJOR 9 #define GxB_IMPLEMENTATION_MINOR 1 #define GxB_IMPLEMENTATION_SUB 1 diff --git a/README.md b/README.md index 1e7e26b9b7..61c6570cbd 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. SPDX-License-Identifier: Apache-2.0 -VERSION 9.1.1, Apr XX, 2024 +VERSION 9.1.1, Apr 7, 2024 SuiteSparse:GraphBLAS is a complete implementation of the GraphBLAS standard, which defines a set of sparse matrix operations on an extended algebra of diff --git a/Source/GB_jitifyer.c b/Source/GB_jitifyer.c index e70b79db7a..5ec1e205c7 100644 --- a/Source/GB_jitifyer.c +++ b/Source/GB_jitifyer.c @@ -216,6 +216,50 @@ void GB_jitifyer_finalize (void) GB_FREE_STUFF (GB_jit_temp) ; } +//------------------------------------------------------------------------------ +// GB_jitifyer_sanitize +//------------------------------------------------------------------------------ + +// Replace invalid characters in a string with underscore. + +void GB_jitifyer_sanitize (char *string, size_t len) +{ + for (int k = 0 ; k < len ; k++) + { + // check for the end of the string + if (string [k] == '\0') break ; + #ifdef _WIN32 + // check the colon for "C:...", only in the second character + if (k == 1 && string [k] == ':') continue ; + #endif + // replace backslash with forward slash + if (string [k] == '\\') + { + string [k] = '/' ; + continue ; + } + // replace other invalid characters with "_" + static char valid_character_set [ ] = + "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789.-_/" ; + bool ok = false ; + for (char *s = valid_character_set ; *s != '\0' ; s++) + { + if (string [k] == *s) + { + ok = true ; + break ; + } + } + if (!ok) + { + // replace a bad character with an underscore + string [k] = '_' ; + } + } +} + //------------------------------------------------------------------------------ // GB_jitifyer_init: initialize the JIT folders, flags, etc //------------------------------------------------------------------------------ @@ -296,11 +340,8 @@ GrB_Info GB_jitifyer_init (void) GB_COPY_STUFF (GB_jit_cache_path, "") ; } - // replace backslash with forward slash - for (char *p = GB_jit_cache_path ; *p != '\0' ; p++) - { - if ((*p) == '\\') (*p) = '/' ; - } + // sanitize the cache path + GB_jitifyer_sanitize (GB_jit_cache_path, GB_jit_cache_path_allocated) ; //-------------------------------------------------------------------------- // initialize the remaining strings @@ -862,6 +903,8 @@ GrB_Info GB_jitifyer_set_cache_path_worker (const char *new_cache_path) GB_FREE_STUFF (GB_jit_cache_path) ; // allocate the new GB_jit_cache_path GB_COPY_STUFF (GB_jit_cache_path, new_cache_path) ; + // sanitize the cache path + GB_jitifyer_sanitize (GB_jit_cache_path, GB_jit_cache_path_allocated) ; // allocate workspace OK (GB_jitifyer_alloc_space ( )) ; // set the src path and make sure cache and src paths are accessible diff --git a/Source/GB_jitifyer.h b/Source/GB_jitifyer.h index 9fe587c6c6..0c9555771b 100644 --- a/Source/GB_jitifyer.h +++ b/Source/GB_jitifyer.h @@ -403,5 +403,7 @@ GrB_Info GB_jitifyer_set_error_log_worker (const char *new_error_log) ; bool GB_jitifyer_get_use_cmake (void) ; void GB_jitifyer_set_use_cmake (bool use_cmake) ; +void GB_jitifyer_sanitize (char *string, size_t len) ; + #endif diff --git a/Test/GB_mex_test11.c b/Test/GB_mex_test11.c index cd33b115c3..dbfe878dca 100644 --- a/Test/GB_mex_test11.c +++ b/Test/GB_mex_test11.c @@ -308,7 +308,11 @@ if (jit_enabled) OK (GxB_get (GxB_JIT_CACHE_PATH, &s)) ; printf ("new cache path: [%s]\n", s) ; CHECK (MATCH (s, "/tmp/grb_cache")) ; - printf ("\nat %d cache path: [%s]\n", __LINE__, save_cache) ; + + OK (GxB_set (GxB_JIT_CACHE_PATH, "/tmp/::tmp/grb_@cache \\gunk??")) ; + OK (GxB_get (GxB_JIT_CACHE_PATH, &s)) ; + printf ("\nfixed cache path: [%s]\n", s) ; + CHECK (MATCH (s, "/tmp/__tmp/grb__cache_/gunk__")) ; expected = GrB_INVALID_VALUE ; ERR (GxB_Global_Option_set_CHAR (999, "gunk")) ; diff --git a/Test/GB_mex_test12.c b/Test/GB_mex_test12.c index 7e68a3a4d7..85519ae8ce 100644 --- a/Test/GB_mex_test12.c +++ b/Test/GB_mex_test12.c @@ -82,18 +82,6 @@ void mexFunction CHECK (!GB_as_if_full (NULL)) ; -#if 0 - //-------------------------------------------------------------------------- - // GRAPHBLAS_CACHE_PATH - //-------------------------------------------------------------------------- - - if (getenv ("GRAPHBLAS_CACHE_PATH") != NULL) - { - setenv ("GRAPHBLAS_CACHE_PATH", "/tmp/grbcache3", 0) ; - unsetenv ("GRAPHBLAS_CACHE_PATH") ; - } -#endif - //-------------------------------------------------------------------------- // finalize GraphBLAS //-------------------------------------------------------------------------- diff --git a/cmake_modules/GraphBLAS_version.cmake b/cmake_modules/GraphBLAS_version.cmake index e2268f41c0..7c8f75e6fc 100644 --- a/cmake_modules/GraphBLAS_version.cmake +++ b/cmake_modules/GraphBLAS_version.cmake @@ -8,7 +8,7 @@ #------------------------------------------------------------------------------- # version of SuiteSparse:GraphBLAS -set ( GraphBLAS_DATE "Apr XX, 2024" ) # FIXME for next release +set ( GraphBLAS_DATE "Apr 7, 2024" ) set ( GraphBLAS_VERSION_MAJOR 9 CACHE STRING "" FORCE ) set ( GraphBLAS_VERSION_MINOR 1 CACHE STRING "" FORCE ) set ( GraphBLAS_VERSION_SUB 1 CACHE STRING "" FORCE ) From 6c9a24e64b6b0042a2b9789c3a9e29dce455d981 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 3 Apr 2024 10:24:51 -0500 Subject: [PATCH 20/76] sync with dev3 --- Doc/ChangeLog | 4 ++++ Doc/GraphBLAS_UserGuide.pdf | Bin 1127926 -> 1128664 bytes Doc/GraphBLAS_UserGuide.tex | 23 +++++++++++++++++++++++ Doc/GraphBLAS_version.tex | 4 ++-- Include/GraphBLAS.h | 6 +++--- README.md | 2 +- Source/GB_init.c | 7 +++++++ cmake_modules/GraphBLAS_version.cmake | 4 ++-- 8 files changed, 42 insertions(+), 8 deletions(-) diff --git a/Doc/ChangeLog b/Doc/ChangeLog index 1ad36b0e6c..26431376bc 100644 --- a/Doc/ChangeLog +++ b/Doc/ChangeLog @@ -1,3 +1,7 @@ +Apr 7, 2024: version 9.1.1 + + * JIT: sanitizing the JIT cache path, better burble for compiler errors + Mar 22, 2024: version 9.1.0 * minor updates to build system diff --git a/Doc/GraphBLAS_UserGuide.pdf b/Doc/GraphBLAS_UserGuide.pdf index 15a176c9603b4c7af1310e97c9c4d5adf90f238a..5f009929b02de4cb68297228f5f39a0fbc23c713 100644 GIT binary patch delta 92941 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 delta 92147 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