File: GB_mex_test36.c

package info (click to toggle)
suitesparse 1%3A7.10.1%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 254,920 kB
  • sloc: ansic: 1,134,743; cpp: 46,133; makefile: 4,875; fortran: 2,087; java: 1,826; sh: 996; ruby: 725; python: 495; asm: 371; sed: 166; awk: 44
file content (78 lines) | stat: -rw-r--r-- 2,588 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//------------------------------------------------------------------------------
// GB_mex_test36: reduce a huge iso full matrix to a scalar
//------------------------------------------------------------------------------

// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2025, All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

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

/*
    m = 2^40 ;
    n = 2^48 ;
    H = pi * GrB.ones (m, n) ;
    H
    s = sum (H, 'all') ;
*/

#include "GB_mex.h"
#include "GB_mex_errors.h"

#define FREE_ALL ;
#define GET_DEEP_COPY ;
#define FREE_DEEP_COPY ;

void mexFunction
(
    int nargout,
    mxArray *pargout [ ],
    int nargin,
    const mxArray *pargin [ ]
)
{

    GrB_Info info ;
    GrB_Matrix H = NULL ;

    //--------------------------------------------------------------------------
    // startup GraphBLAS
    //--------------------------------------------------------------------------

    bool malloc_debug = GB_mx_get_global (true) ;
    int expected = GrB_SUCCESS ;

    //--------------------------------------------------------------------------
    // create and reduce a huge iso full matrix
    //--------------------------------------------------------------------------

    uint64_t nrows = 1UL << 40 ;
    uint64_t ncols = 1UL << 48 ;
    double pi = 3.141592653589793 ;
    double sum = 0 ;
    mexPrintf (
      "\nCreating huge iso-valued full matrix,\n"
        "size m=2^40 by n=2^48, with all entries equal to pi:\n") ;
    OK (GrB_Matrix_new (&H, GrB_FP64, nrows, ncols)) ;
    OK (GrB_Matrix_assign_FP64 (H, NULL, NULL, pi, GrB_ALL, nrows,
        GrB_ALL, ncols, NULL)) ;
    OK (GrB_Matrix_wait (H, GrB_MATERIALIZE)) ;
    OK (GxB_Matrix_fprint (H, "H", GxB_COMPLETE_VERBOSE, NULL)) ;
    OK (GrB_Matrix_reduce_FP64 (&sum, NULL, GrB_PLUS_MONOID_FP64, H, NULL)) ;
    OK (GrB_Matrix_free (&H)) ;
    double truth = pi * ((double) nrows) * ((double) ncols) ;
    mexPrintf ("\npi*m*n:             %g\n", truth) ;
    mexPrintf ("sum of all entries: %g\n", sum) ;
    mexPrintf ("absolute error:     %g\n", sum - truth) ;
    double relerr = fabs (sum - truth) / truth ;
    mexPrintf ("relative error:     %g\n", relerr) ;
    CHECK (relerr < 1e-14) ;
    pargout [0] = mxCreateDoubleScalar (sum) ;

    //--------------------------------------------------------------------------
    // wrapup
    //--------------------------------------------------------------------------

    GB_mx_put_global (true) ;
    printf ("\nGB_mex_test36: all tests passed\n\n") ;
}