1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
//------------------------------------------------------------------------------
// LAGraph/expirimental/test/test_SquareClustering.c: test cases for
// square clustering
// -----------------------------------------------------------------------------
// LAGraph, (c) 2019-2022 by The LAGraph Contributors, All Rights Reserved.
// SPDX-License-Identifier: BSD-2-Clause
//
// For additional details (including references to third party source code and
// other files) see the LICENSE file or contact permission@sei.cmu.edu. See
// Contributors.txt for a full list of contributors. Created, in part, with
// funding and support from the U.S. Government (see Acknowledgments.txt file).
// DM22-0790
// Contributed by Erik Welch, NVIDIA
//------------------------------------------------------------------------------
#include <stdio.h>
#include <acutest.h>
#include <LAGraphX.h>
#include <LAGraph_test.h>
#include "LG_Xtest.h"
char msg [LAGRAPH_MSG_LEN] ;
// Data from NetworkX, test_lind_square_clustering: https://github.com/networkx\
// /networkx/blob/main/networkx/algorithms/tests/test_cluster.py
GrB_Index rows[19] = {1, 1, 1, 1, 2, 2, 3, 3, 6, 7, 6, 7, 7, 6, 6, 2, 2, 3, 3} ;
GrB_Index cols[19] = {2, 3, 6, 7, 4, 5, 4, 5, 7, 8, 8, 9, 10, 11, 12, 13, 14,
15, 16} ;
int64_t vals[19] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} ;
GrB_Index soln_indices[8] = {1, 2, 3, 4, 5, 6, 7, 8} ;
double soln_values[8] = {
3.0 / 43.0,
3.0 / 17.0,
3.0 / 17.0,
1.0 / 3.0,
1.0 / 3.0,
1.0 / 27.0,
1.0 / 27.0,
1.0 / 5.0
};
//------------------------------------------------------------------------------
// is_close: check whether two floats are close
//------------------------------------------------------------------------------
bool is_close (double a, double b)
{
double abs_diff = fabs(a - b) ;
return abs_diff < 1e-6 ;
}
void test_SquareClustering (void)
{
LAGraph_Init (msg) ;
GrB_Matrix A = NULL ;
LAGraph_Graph G = NULL ;
GrB_Index n = 17;
OK (GrB_Matrix_new (&A, GrB_INT64, n, n)) ;
OK (GrB_Matrix_build_INT64 (A, rows, cols, vals, 19, GrB_PLUS_INT64)) ;
// Symmetrize A
OK (GrB_Matrix_eWiseAdd_BinaryOp(A, NULL, NULL, GrB_FIRST_INT64, A, A,
GrB_DESC_T1));
OK (LAGraph_New (&G, &A, LAGraph_ADJACENCY_UNDIRECTED, msg)) ;
TEST_CHECK (A == NULL) ;
// check for self-edges
OK (LAGraph_Cached_NSelfEdges (G, msg)) ;
bool sanitize = (G->nself_edges != 0) ;
OK (LAGraph_Cached_OutDegree (G, msg)) ;
GrB_Vector c = NULL ;
OK (LAGraph_SquareClustering (&c, G, msg)) ;
GrB_Index nvals;
OK (GrB_Vector_nvals(&nvals, c)) ;
TEST_CHECK (nvals == 8) ;
// OK (GrB_Vector_new(&soln, GrB_FP64, n)) ;
// OK (GrB_Vector_build_FP64(soln, soln_indices, soln_values, 8,
// GrB_PLUS_FP64)) ;
double val;
for (GrB_Index i = 0 ; i < 8 ; ++i)
{
GrB_Vector_extractElement_FP64(&val, c, soln_indices[i]) ;
TEST_CHECK (is_close(val, soln_values[i])) ;
}
// OK (GrB_free (&soln)) ;
OK (GrB_free (&c)) ;
OK (LAGraph_Delete (&G, msg)) ;
LAGraph_Finalize (msg) ;
};
TEST_LIST = {
{"SquareClustering", test_SquareClustering},
// {"SquareClustering_errors", test_errors},
{NULL, NULL}
};
|