From ce94cd9ce3cea05e30a2dcbd193e8bd9804cd3a4 Mon Sep 17 00:00:00 2001 From: Karan Bhalla Date: Tue, 17 Mar 2026 16:36:40 -0500 Subject: [PATCH 01/12] init katz centrality --- experimental/algorithm/LAGr_KatzCentrality.c | 139 +++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 experimental/algorithm/LAGr_KatzCentrality.c diff --git a/experimental/algorithm/LAGr_KatzCentrality.c b/experimental/algorithm/LAGr_KatzCentrality.c new file mode 100644 index 0000000000..a56676d27a --- /dev/null +++ b/experimental/algorithm/LAGr_KatzCentrality.c @@ -0,0 +1,139 @@ +//------------------------------------------------------------------------------ +// LAGr_KatzCentrality: Katz centrality algorithm +//------------------------------------------------------------------------------ + +// 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 Karan Bhalla and Timothy A. Davis, Texas A&M University; +// Adapted and revised from GraphBLAS C API Spec, Appendix B.4. + +//------------------------------------------------------------------------------ + +#define LG_FREE_WORK \ +{ \ + GrB_free(&x_prev); \ + GrB_free(&b); \ + GrB_free(&t); \ +} + +#define LG_FREE_ALL \ +{ \ + LG_FREE_WORK; \ + GrB_free(&x); \ +} + +#include "LG_internal.h" +#include + +int LAGr_KatzCentrality +( + // output: + GrB_Vector *centrality, + // input: + LAGraph_Graph G, + double alpha, + double beta, + int max_iter, + double tol, + bool normalize, + char* msg +) +{ + //-------------------------------------------------------------------------- + // check inputs + //-------------------------------------------------------------------------- + + LG_CLEAR_MSG; + GrB_Index n = 0; + GrB_Vector x = NULL, x_prev = NULL, b = NULL, t = NULL; + + LG_ASSERT(centrality != NULL, GrB_NULL_POINTER); + (*centrality) = NULL; + LG_TRY(LAGraph_CheckGraph(G, msg)); + + GrB_Matrix AT; + if (G->kind == LAGraph_ADJACENCY_UNDIRECTED || + G->is_symmetric_structure == LAGraph_TRUE) + { + AT = G->A ; + } + else + { + AT = G->AT ; + LG_ASSERT_MSG (AT != NULL, LAGRAPH_NOT_CACHED, "G->AT is required") ; + } + + //-------------------------------------------------------------------------- + // initializations + //-------------------------------------------------------------------------- + + GRB_TRY (GrB_Matrix_nrows (&n, AT)) ; + + GRB_TRY(GrB_Vector_new(&x, GrB_FP64, n)); + GRB_TRY(GrB_Vector_new(&x_prev, GrB_FP64, n)); + GRB_TRY(GrB_Vector_new(&b, GrB_FP64, n)); + GRB_TRY(GrB_Vector_new(&t, GrB_FP64, n)); + + GRB_TRY(GrB_assign(x, NULL, NULL, 0.0, GrB_ALL, n, NULL)); + GRB_TRY(GrB_assign(x_prev, NULL, NULL, 0.0, GrB_ALL, n, NULL)); + GRB_TRY(GrB_assign(b, NULL, NULL, beta, GrB_ALL, n, NULL)); + + // first iteration is always done + double rdiff = 1 ; + + for (int iter = 0 ; rdiff >= n * tol ; iter++) + { + // check for convergence failure + LG_ASSERT_MSGF (iter < max_iter, LAGRAPH_CONVERGENCE_FAILURE, + "katz centrality failed to converge in %d iterations", max_iter) ; + + // swap x and x_prev + GrB_Vector temp = x_prev ; x_prev = x ; x = temp ; + + // x = A' * x_prev + GRB_TRY (GrB_mxv (x, NULL, NULL, GxB_PLUS_TIMES_FP64, AT, x_prev, NULL)) ; + + // x = alpha * x + beta + GRB_TRY (GrB_apply (x, NULL, NULL, GrB_TIMES_FP64, alpha, x, NULL)) ; + GRB_TRY (GrB_eWiseAdd (x, NULL, NULL, GrB_PLUS_FP64, x, b, NULL)) ; + + // t = x - x_prev + GRB_TRY (GrB_eWiseAdd (t, NULL, NULL, GrB_MINUS_FP64, x, x_prev, NULL)) ; + // t = abs (t) + GRB_TRY (GrB_apply (t, NULL, NULL, GrB_ABS_FP64, t, NULL)) ; + // rdiff = sum (t) + GRB_TRY (GrB_reduce (&rdiff, NULL, GrB_PLUS_MONOID_FP64, t, NULL)) ; + } + + // normalize using the L2 norm if flag is set + if (normalize) + { + double sumsq = 0 ; + + // sumsq = x' * x = sum (x .* x) + GRB_TRY (GrB_eWiseMult (t, NULL, NULL, GrB_TIMES_FP64, x, x, NULL)) ; + GRB_TRY (GrB_reduce (&sumsq, NULL, GrB_PLUS_MONOID_FP64, t, NULL)) ; + + if (sumsq > 0) + { + double scale = 1.0 / sqrt (sumsq) ; + GRB_TRY (GrB_apply (x, NULL, NULL, GrB_TIMES_FP64, x, scale, NULL)) ; + } + } + + //-------------------------------------------------------------------------- + // free workspace and return result + //-------------------------------------------------------------------------- + + (*centrality) = x; + LG_FREE_WORK; + + return GrB_SUCCESS; +} From a92856e431e7d20f777b7ce48a80300a8e104263 Mon Sep 17 00:00:00 2001 From: Karan Bhalla Date: Tue, 17 Mar 2026 22:24:11 -0500 Subject: [PATCH 02/12] add basic testing for katz --- experimental/test/test_KatzCentrality.c | 196 ++++++++++++++++++++++++ include/LAGraphX.h | 19 +++ 2 files changed, 215 insertions(+) create mode 100644 experimental/test/test_KatzCentrality.c diff --git a/experimental/test/test_KatzCentrality.c b/experimental/test/test_KatzCentrality.c new file mode 100644 index 0000000000..b387c7b422 --- /dev/null +++ b/experimental/test/test_KatzCentrality.c @@ -0,0 +1,196 @@ +//------------------------------------------------------------------------------ +// LAGraph/src/test/test_KatzCentrality.c: testing for Katz centrality +// ----------------------------------------------------------------------------- + +// LAGraph, (c) 2019-2025 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 Karan Bhalla and Timothy A. Davis, Texas A&M University + +//------------------------------------------------------------------------------ + +#include +#include +#include + +#include "LAGraphX.h" +#include "LAGraph_test.h" +#include "LG_internal.h" + +#define LEN 512 +char msg [LAGRAPH_MSG_LEN] ; +char filename [LEN+1] ; + +//------------------------------------------------------------------------------ +// reference results from NetworkX +//------------------------------------------------------------------------------ + +double karate_katz [34] = { + 4.9829901679, 3.6518079520, 4.1214049703, 3.0226461989, 1.8904511529, + 2.0310725862, 2.0310725862, 2.5778843937, 3.1126620496, 1.9260736983, + 1.8904511529, 1.4982988513, 1.8005633729, 3.0918177427, 1.9405256847, + 1.9405256847, 1.4062144433, 1.8634795227, 1.9405256847, 2.3774128717, + 1.9405256847, 1.8634795227, 1.9405256847, 2.5865313998, 1.7091149570, + 1.7301052384, 1.7513648061, 2.3556382376, 2.2266143974, 2.3743152002, + 2.6169724552, 3.0054078802, 4.2659247944, 5.1393352269 +} ; + +double diamonds_katz [8] = { + 1.0000000000, 1.1000000000, 1.3200000000, 1.1000000000, 1.3520000000, + 1.1352000000, 1.1352000000, 1.2270400000 +} ; + +//------------------------------------------------------------------------------ +// difference: compare Katz vector result with reference values +//------------------------------------------------------------------------------ + +double difference (GrB_Vector c, double *reference_c, GrB_Index n) ; + +double difference (GrB_Vector c, double *reference_c, GrB_Index n) +{ + GrB_Vector diff = NULL, reference_c_vector = NULL ; + OK (GrB_Vector_new (&reference_c_vector, GrB_FP64, n)) ; + + for (GrB_Index i = 0 ; i < n ; i++) + { + OK (GrB_Vector_setElement_FP64 (reference_c_vector, reference_c [i], i)) ; + } + + OK (GrB_Vector_new (&diff, GrB_FP64, n)) ; + OK (GrB_eWiseAdd (diff, NULL, NULL, GrB_MINUS_FP64, reference_c_vector, c, + NULL)) ; + OK (GrB_apply (diff, NULL, NULL, GrB_ABS_FP64, diff, NULL)) ; + + double err = 0 ; + OK (GrB_reduce (&err, NULL, GrB_MAX_MONOID_FP64, diff, NULL)) ; + + OK (GrB_free (&diff)) ; + OK (GrB_free (&reference_c_vector)) ; + + return err ; +} + + +void test_katz_diamonds (void) +{ +#if LAGRAPH_SUITESPARSE + LAGraph_Graph G = NULL ; + OK (LAGraph_Init (msg)) ; + GrB_Matrix A = NULL ; + GrB_Vector centrality = NULL ; + + // Create diamonds graph + snprintf (filename, LEN, LG_DATA_DIR "%s", "diamonds.mtx") ; + FILE *f = fopen (filename, "r") ; + TEST_CHECK (f != NULL) ; + OK (LAGraph_MMRead (&A, f, msg)) ; + OK (fclose (f)) ; + OK (LAGraph_New (&G, &A, LAGraph_ADJACENCY_DIRECTED, msg)) ; + TEST_CHECK (A == NULL) ; + + // Check that AT is cached + int result = LAGraph_Cached_AT (G, msg) ; + TEST_CHECK (result == GrB_SUCCESS || result == LAGRAPH_CACHE_NOT_NEEDED) ; + + // Print graph stats + uint64_t n, nedges ; + OK (GrB_Matrix_nrows(&n, G->A)) ; + OK (GrB_Matrix_nvals(&nedges, G->A)) ; + printf ("\n\nDiamonds graph (%" PRIu64 " nodes, %" PRIu64 " edges):\n", n, nedges) ; + + double alpha = 0.1 ; + + // Compute katz centrality + double t = LAGraph_WallClockTime() ; + OK (LAGr_KatzCentrality (¢rality, G, alpha, 1.0, 1000, 1e-6, false, msg)) ; + t = LAGraph_WallClockTime() - t ; + printf (" Time for LAGr_KatzCentrality: %g sec\n", t) ; + + // Compare with reference values. + GrB_Index cn = 0, cnvals = 0 ; + OK (GrB_Vector_size (&cn, centrality)) ; + OK (GrB_Vector_nvals (&cnvals, centrality)) ; + TEST_CHECK (cn == n) ; + TEST_CHECK (cnvals == n) ; + + double err = difference (centrality, diamonds_katz, 8) ; + printf (" diamonds: err: %e\n", err) ; + TEST_CHECK (err < 1e-4) ; + + OK (GrB_free (¢rality)) ; + OK (LAGraph_Delete (&G, msg)) ; + OK (LAGraph_Finalize (msg)) ; + +#endif +} + +void test_katz_karate (void) +{ +#if LAGRAPH_SUITESPARSE + LAGraph_Graph G = NULL ; + OK (LAGraph_Init (msg)) ; + GrB_Matrix A = NULL ; + GrB_Vector centrality = NULL ; + + // Create karate graph + snprintf (filename, LEN, LG_DATA_DIR "%s", "karate.mtx") ; + FILE *f = fopen (filename, "r") ; + TEST_CHECK (f != NULL) ; + OK (LAGraph_MMRead (&A, f, msg)) ; + OK (fclose (f)) ; + OK (LAGraph_New (&G, &A, LAGraph_ADJACENCY_UNDIRECTED, msg)) ; + TEST_CHECK (A == NULL) ; + + // Check that AT is cached + int result = LAGraph_Cached_AT (G, msg) ; + TEST_CHECK (result == GrB_SUCCESS || result == LAGRAPH_CACHE_NOT_NEEDED) ; + + // Print graph stats + uint64_t n, nedges ; + OK (GrB_Matrix_nrows(&n, G->A)) ; + OK (GrB_Matrix_nvals(&nedges, G->A)) ; + printf ("\n\nKarate graph (%" PRIu64 " nodes, %" PRIu64 " edges):\n", n, nedges) ; + + // alpha must be less than 1/lambda_max, where lambda_max is 6.725697727631724 for karate graph + double alpha = 0.1 ; + + // Compute katz centrality + double t = LAGraph_WallClockTime() ; + OK (LAGr_KatzCentrality (¢rality, G, alpha, 1.0, 1000, 1e-6, false, msg)) ; + t = LAGraph_WallClockTime() - t ; + printf (" Time for LAGr_KatzCentrality: %g sec\n", t) ; + + // Compare with reference values. + GrB_Index cn = 0, cnvals = 0 ; + OK (GrB_Vector_size (&cn, centrality)) ; + OK (GrB_Vector_nvals (&cnvals, centrality)) ; + TEST_CHECK (cn == n) ; + TEST_CHECK (cnvals == n) ; + + double err = difference (centrality, karate_katz, 34) ; + printf (" karate: err: %e\n", err) ; + TEST_CHECK (err < 1e-4) ; + + OK (GrB_free (¢rality)) ; + OK (LAGraph_Delete (&G, msg)) ; + OK (LAGraph_Finalize (msg)) ; + +#endif +} + + +//------------------------------------------------------------------------------ +// list of tests +//------------------------------------------------------------------------------ + +TEST_LIST = { + {"test_katz_diamonds", test_katz_diamonds}, + {"test_katz_karate", test_katz_karate}, + {NULL, NULL} +} ; diff --git a/include/LAGraphX.h b/include/LAGraphX.h index 3355addb2e..fea69e082f 100644 --- a/include/LAGraphX.h +++ b/include/LAGraphX.h @@ -1317,6 +1317,25 @@ int LAGr_EdgeBetweennessCentrality char *msg ) ; +//------------------------------------------------------------------------------ +// Katz centrality +//------------------------------------------------------------------------------ + +LAGRAPHX_PUBLIC +int LAGr_KatzCentrality +( + // output: + GrB_Vector *centrality, + // input: + LAGraph_Graph G, + double alpha, + double beta, + int max_iter, + double tol, + bool normalize, + char *msg +) ; + //------------------------------------------------------------------------------ // graph clustering with quality metrics //------------------------------------------------------------------------------ From 55cee34f6d60837cf7fed7b020941a4b17da1197 Mon Sep 17 00:00:00 2001 From: Karan Bhalla Date: Wed, 18 Mar 2026 10:38:50 -0500 Subject: [PATCH 03/12] add katz demo + init FW and closeness --- .../algorithm/LAGr_ClosenessCentrality.c | 196 ++++++++++++++++++ experimental/algorithm/LAGraph_FW.c | 105 ++++++++++ experimental/benchmark/katzCentrality_demo.c | 127 ++++++++++++ 3 files changed, 428 insertions(+) create mode 100644 experimental/algorithm/LAGr_ClosenessCentrality.c create mode 100644 experimental/algorithm/LAGraph_FW.c create mode 100644 experimental/benchmark/katzCentrality_demo.c diff --git a/experimental/algorithm/LAGr_ClosenessCentrality.c b/experimental/algorithm/LAGr_ClosenessCentrality.c new file mode 100644 index 0000000000..fcd57f0d0c --- /dev/null +++ b/experimental/algorithm/LAGr_ClosenessCentrality.c @@ -0,0 +1,196 @@ +//------------------------------------------------------------------------------ +// LAGr_ClosenessCentrality: Closeness centrality algorithm +//------------------------------------------------------------------------------ + +// 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 Karan Bhalla and Timothy A. Davis, Texas A&M University; +// Adapted and revised from GraphBLAS C API Spec, Appendix B.4. + +//------------------------------------------------------------------------------ + +#define LG_FREE_WORK \ + { \ + GrB_free(&distance_vector); \ + if (incoming_adjacency != NULL && \ + incoming_adjacency != G->A && incoming_adjacency != G->AT) \ + { \ + GrB_free(&incoming_adjacency); \ + } \ + LAGraph_Free((void **)&source_indices, NULL); \ + } + +#define LG_FREE_ALL \ + { \ + LG_FREE_WORK; \ + GrB_free(¢rality_vector); \ + } + +#include "LG_internal.h" +#include + +int LAGr_ClosenessCentrality( + // output: + GrB_Vector *centrality, + // input: + LAGraph_Graph G, + GrB_Vector sources, // target vertices to score; NULL/empty => all + const GrB_Matrix D, // optional APSP matrix, D(i,j)=dist(i->j), or NULL + char *msg) +{ + //-------------------------------------------------------------------------- + // check inputs + //-------------------------------------------------------------------------- + + LG_CLEAR_MSG; + + GrB_Info info; + + // centrality_vector(v) will store the final closeness score for v. + GrB_Vector centrality_vector = NULL; + + // distance_vector(u) stores shortest path length from the current target + // node to u in the incoming-edge view of the graph. + GrB_Vector distance_vector = NULL; + + // incoming_adjacency is A' for directed graphs and A for undirected ones. + GrB_Matrix incoming_adjacency = NULL; + + GrB_Index n = 0; + GrB_Index source_count = 0; + + // If a subset of nodes is requested, source_indices holds those node ids. + // We treat 'sources' as a set/mask vector and use tuple indices as IDs. + GrB_Index *source_indices = NULL; + + LG_ASSERT(centrality != NULL, GrB_NULL_POINTER); + (*centrality) = NULL; + LG_TRY(LAGraph_CheckGraph(G, msg)); + + GRB_TRY(GrB_Matrix_nrows(&n, G->A)); + + if (D != NULL) + { + GrB_Index nrows, ncols; + GRB_TRY(GrB_Matrix_nrows(&nrows, D)); + GRB_TRY(GrB_Matrix_ncols(&ncols, D)); + LG_ASSERT(nrows == n && ncols == n, GrB_DIMENSION_MISMATCH); + } + + bool use_all_nodes = (sources == NULL); + if (!use_all_nodes) + { + GRB_TRY(GrB_Vector_nvals(&source_count, sources)); + use_all_nodes = (source_count == 0); + } + + //-------------------------------------------------------------------------- + // initializations + //-------------------------------------------------------------------------- + + GRB_TRY(GrB_Vector_new(¢rality_vector, GrB_FP64, n)); + if (use_all_nodes) + { + // dense output: every node gets an entry + GRB_TRY(GrB_assign(centrality_vector, NULL, NULL, + 0.0, GrB_ALL, n, NULL)); + source_count = n; + } + + // Uuses Bellman-Ford + // Does not consume an externally-provided all-pairs shortest path matrix yet. + LG_ASSERT_MSG(D == NULL, GrB_NOT_IMPLEMENTED, + "D input is not supported in this simplified version"); + + // incoming-edge closeness: for directed graphs we need distances TO each + // node, so we compute shortest paths on A'. + if (G->kind == LAGraph_ADJACENCY_UNDIRECTED || + G->is_symmetric_structure == LAGraph_TRUE) + { + incoming_adjacency = G->A; + } + else if (G->AT != NULL) + { + incoming_adjacency = G->AT; + } + else + { + GrB_Type edge_type; + GRB_TRY(GxB_Matrix_type(&edge_type, G->A)); + GRB_TRY(GrB_Matrix_new(&incoming_adjacency, edge_type, n, n)); + GRB_TRY(GrB_transpose(incoming_adjacency, NULL, NULL, G->A, NULL)); + } + + // Build list of requested target nodes from tuple indices in 'sources'. + if (!use_all_nodes) + { + LG_TRY(LAGraph_Malloc((void **)&source_indices, + source_count, sizeof(GrB_Index), msg)); + GRB_TRY(GrB_Vector_extractTuples(source_indices, NULL, + &source_count, sources)); + for (GrB_Index k = 0; k < source_count; k++) + { + LG_ASSERT(source_indices[k] < n, GrB_INVALID_INDEX); + } + } + + //-------------------------------------------------------------------------- + // compute centrality values + //-------------------------------------------------------------------------- + + for (GrB_Index k = 0; k < source_count; k++) + { + // node_to_score is the vertex whose incoming closeness we compute. + GrB_Index node_to_score = use_all_nodes ? k : source_indices[k]; + + // Compute shortest distances from node_to_score in the incoming-edge + // graph. This equals distances TO node_to_score in the original graph. + info = LAGraph_BF_basic(&distance_vector, incoming_adjacency, + node_to_score); + if (info == GrB_NO_VALUE) + { + LG_FREE_ALL; + return (info); + } + if (info < GrB_SUCCESS) + { + GRB_CATCH(info); + } + + // Do not include distance(node_to_score, node_to_score)=0 in the sum. + GRB_TRY(GrB_Vector_removeElement(distance_vector, node_to_score)); + + // Count how many nodes can reach node_to_score. + GrB_Index reachable_count = 0; + GRB_TRY(GrB_Vector_nvals(&reachable_count, distance_vector)); + + if (reachable_count > 0) + { + // Sum all finite shortest-path distances to node_to_score. + double distance_sum = 0; + GRB_TRY(GrB_reduce(&distance_sum, NULL, GrB_PLUS_MONOID_FP64, + distance_vector, NULL)); + if (distance_sum > 0) + { + // Closeness = (# reachable nodes) / (sum of distances). + double closeness_value = ((double)reachable_count) / distance_sum; + GRB_TRY(GrB_Vector_setElement(centrality_vector, + closeness_value, node_to_score)); + } + } + + GRB_TRY(GrB_free(&distance_vector)); + } + + (*centrality) = centrality_vector; + LG_FREE_WORK; + + return GrB_SUCCESS; +} diff --git a/experimental/algorithm/LAGraph_FW.c b/experimental/algorithm/LAGraph_FW.c new file mode 100644 index 0000000000..05f971a048 --- /dev/null +++ b/experimental/algorithm/LAGraph_FW.c @@ -0,0 +1,105 @@ +//------------------------------------------------------------------------------ +// LAGraph_FW: Floyd-Warshall method: all pairs shortest paths +//------------------------------------------------------------------------------ + +// The input is a square unsymmetric matrix G, for a directed graph. G can be +// of any type. If it is real (float or double), a 64-bit integer, or an +// unsigned 32-bit integer, then the output is of type GrB_FP64. Otherwise, +// the output is of type GrB_INT32. + +// TODO consider giving the user control over the data type of D to use. + +// G(i,j) is the edge weight for edge (i,j). D(i,j) on output is the length of +// the shortest path from node i to j, if the entry is present. If D(i,j) is +// not present then there is no path from i to j. The shortest path itself +// is not returned. + +// Negative weights are OK, unless there is a negative weight cycle. In +// that case, the output is undefined. + +#define LG_FREE_WORK \ +{ \ + GrB_free (&A) ; \ + GrB_free (&B) ; \ +} + +#define LG_FREE_ALL \ +{ \ + LG_FREE_WORK ; \ + GrB_free (&D_matrix) ; \ +} + +#include "LG_internal.h" +#include "LAGraphX.h" + +GrB_Info LAGraph_FW +( + const GrB_Matrix G, // input graph, with edge weights + GrB_Matrix *D, // output graph, created on output + GrB_Type *D_type // type of D +) +{ + GrB_Info info ; + char *msg = NULL ; + GrB_Matrix D_matrix = NULL, A = NULL, B = NULL ; + + // make sure outputs and input are valid + LG_ASSERT (G != NULL, GrB_NULL_POINTER) ; + LG_ASSERT (D != NULL, GrB_NULL_POINTER) ; + LG_ASSERT (D_type != NULL, GrB_NULL_POINTER) ; + (*D) = NULL ; + (*D_type) = NULL ; + + // determine the type of the input and output graphs + GrB_Type gtype, otype ; + GrB_BinaryOp op ; + GrB_UnaryOp idop ; + GrB_Semiring semiring ; + GRB_TRY (GxB_Matrix_type (>ype, G)) ; + + if (gtype == GrB_FP64 || gtype == GrB_FP32 || + gtype == GrB_INT64 || gtype == GrB_UINT64 || + gtype == GrB_UINT32) + { + otype = GrB_FP64 ; + semiring = GxB_MIN_PLUS_FP64 ; + op = GrB_MIN_FP64 ; + idop = GrB_IDENTITY_FP64 ; + } + else + { + otype = GrB_INT32 ; + semiring = GxB_MIN_PLUS_INT32 ; + op = GrB_MIN_INT32 ; + idop = GrB_IDENTITY_INT32 ; + } + + GrB_Index n, ncols ; + GRB_TRY (GrB_Matrix_nrows (&n, G)) ; + GRB_TRY (GrB_Matrix_ncols (&ncols, G)) ; + LG_ASSERT (n == ncols, GrB_INVALID_VALUE) ; + + (*D_type) = otype ; + GRB_TRY (GrB_Matrix_new (&D_matrix, otype, n, n)) ; + GRB_TRY (LG_SET_FORMAT_HINT (D_matrix, LG_BITMAP)) ; + GRB_TRY (GrB_Matrix_new (&A, otype, n, 1)) ; + GRB_TRY (GrB_Matrix_new (&B, otype, 1, n)) ; + + GRB_TRY (GrB_apply (D_matrix, GrB_NULL, GrB_NULL, idop, G, GrB_NULL)) ; + + for (GrB_Index k = 0 ; k < n ; k++) + { + // A = D(:,k), the kth column + GRB_TRY (GrB_extract (A, GrB_NULL, GrB_NULL, D_matrix, + GrB_ALL, n, &k, 1, GrB_NULL)) ; + // B = D(k,:), the kth row + GRB_TRY (GrB_extract (B, GrB_NULL, GrB_NULL, D_matrix, + &k, 1, GrB_ALL, n, GrB_NULL)) ; + // D = min (D,A*B) with "*" being the min-plus semiring + GRB_TRY (GrB_mxm (D_matrix, GrB_NULL, op, semiring, A, B, GrB_NULL)) ; + } + + LG_FREE_WORK ; + (*D) = D_matrix ; + return (GrB_SUCCESS) ; +} \ No newline at end of file diff --git a/experimental/benchmark/katzCentrality_demo.c b/experimental/benchmark/katzCentrality_demo.c new file mode 100644 index 0000000000..2ebad10b5b --- /dev/null +++ b/experimental/benchmark/katzCentrality_demo.c @@ -0,0 +1,127 @@ +//------------------------------------------------------------------------------ +// LAGraph/experimental/benchmark/katzCentrality_demo.c: benchmark for Katz +//------------------------------------------------------------------------------ + +#include "../../src/benchmark/LAGraph_demo.h" +#include "LAGraphX.h" + +#define NTHREAD_LIST 1 +#define THREAD_LIST 0 + +#define LG_FREE_ALL \ + { \ + LAGraph_Delete(&G, NULL); \ + GrB_free(&c); \ + } + +int main(int argc, char **argv) +{ + //-------------------------------------------------------------------------- + // initialize LAGraph and GraphBLAS + //-------------------------------------------------------------------------- + + char msg[LAGRAPH_MSG_LEN]; + LAGraph_Graph G = NULL; + GrB_Vector c = NULL; + + // start GraphBLAS and LAGraph + bool burble = false; + demo_init(burble); + + int ntrials = 3; + printf("# of trials: %d\n", ntrials); + + int nt = NTHREAD_LIST; + int Nthreads[20] = {0, THREAD_LIST}; + + int nthreads_max, nthreads_outer, nthreads_inner; + LAGRAPH_TRY(LAGraph_GetNumThreads(&nthreads_outer, &nthreads_inner, msg)); + nthreads_max = nthreads_outer * nthreads_inner; + + if (Nthreads[1] == 0) + { + Nthreads[1] = nthreads_max; + for (int t = 2; t <= nt; t++) + { + Nthreads[t] = Nthreads[t - 1] / 2; + if (Nthreads[t] == 0) + nt = t - 1; + } + } + + printf("threads to test:"); + for (int t = 1; t <= nt; t++) + { + int nthreads = Nthreads[t]; + if (nthreads > nthreads_max) + continue; + printf(" %d", nthreads); + } + printf("\n"); + + //-------------------------------------------------------------------------- + // read in the graph + //-------------------------------------------------------------------------- + + char *matrix_name = (argc > 1) ? argv[1] : "stdin"; + LAGRAPH_TRY(readproblem(&G, NULL, + true, true, true, NULL, false, argc, argv)); + + // Katz uses incoming edges; AT is required for directed graphs. + int cache_result = LAGraph_Cached_AT(G, msg); + LG_ASSERT_MSG(cache_result == GrB_SUCCESS || + cache_result == LAGRAPH_CACHE_NOT_NEEDED, + cache_result, "LAGraph_Cached_AT failed"); + + //-------------------------------------------------------------------------- + // benchmark Katz centrality + //-------------------------------------------------------------------------- + + double alpha = 0.01; + double beta = 1.00; + int max_iter = 1000; + double tol = 1e-6; + bool normalize = false; + + // warmup for more accurate timing + double tt = LAGraph_WallClockTime(); + LAGRAPH_TRY(LAGr_KatzCentrality(&c, G, alpha, beta, + max_iter, tol, normalize, msg)); + tt = LAGraph_WallClockTime() - tt; + GRB_TRY(GrB_free(&c)); + printf("warmup time %g sec\n", tt); + + for (int t = 1; t <= nt; t++) + { + int nthreads = Nthreads[t]; + if (nthreads > nthreads_max) + continue; + LAGRAPH_TRY(LAGraph_SetNumThreads(1, nthreads, msg)); + + double ttot = 0, ttrial[100]; + for (int trial = 0; trial < ntrials; trial++) + { + double t1 = LAGraph_WallClockTime(); + LAGRAPH_TRY(LAGr_KatzCentrality(&c, G, alpha, beta, + max_iter, tol, normalize, msg)); + GRB_TRY(GrB_free(&c)); + ttrial[trial] = LAGraph_WallClockTime() - t1; + ttot += ttrial[trial]; + + printf("threads %2d trial %2d: %12.6f sec\n", + nthreads, trial, ttrial[trial]); + fprintf(stderr, "threads %2d trial %2d: %12.6f sec\n", + nthreads, trial, ttrial[trial]); + } + + ttot = ttot / ntrials; + printf("Avg: KatzCentrality nthreads: %3d time: %12.6f matrix: %s\n", + nthreads, ttot, matrix_name); + fprintf(stderr, "Avg: KatzCentrality nthreads: %3d time: %12.6f matrix: %s\n", + nthreads, ttot, matrix_name); + } + + LG_FREE_ALL; + LAGRAPH_TRY(LAGraph_Finalize(msg)); + return (GrB_SUCCESS); +} From cf804ca07d3a2932c6f55018e96a3edbb4460f1f Mon Sep 17 00:00:00 2001 From: Karan Bhalla Date: Wed, 18 Mar 2026 18:14:16 -0500 Subject: [PATCH 04/12] katz update: return iterations + account for weights correctly --- experimental/algorithm/LAGr_KatzCentrality.c | 40 ++++++++++++++---- experimental/benchmark/katzCentrality_demo.c | 44 +++++++++++++++----- experimental/test/test_KatzCentrality.c | 8 +++- include/LAGraphX.h | 20 ++++++++- 4 files changed, 90 insertions(+), 22 deletions(-) diff --git a/experimental/algorithm/LAGr_KatzCentrality.c b/experimental/algorithm/LAGr_KatzCentrality.c index a56676d27a..25d547abe0 100644 --- a/experimental/algorithm/LAGr_KatzCentrality.c +++ b/experimental/algorithm/LAGr_KatzCentrality.c @@ -35,14 +35,16 @@ int LAGr_KatzCentrality ( // output: - GrB_Vector *centrality, + GrB_Vector *centrality, + int64_t *iters, // input: LAGraph_Graph G, double alpha, double beta, - int max_iter, + int64_t max_iter, double tol, bool normalize, + bool use_weights, // uses edge weights if true, otherwise treats all edges as weight 1 char* msg ) { @@ -54,7 +56,7 @@ int LAGr_KatzCentrality GrB_Index n = 0; GrB_Vector x = NULL, x_prev = NULL, b = NULL, t = NULL; - LG_ASSERT(centrality != NULL, GrB_NULL_POINTER); + LG_ASSERT (centrality != NULL && iters != NULL, GrB_NULL_POINTER) ; (*centrality) = NULL; LG_TRY(LAGraph_CheckGraph(G, msg)); @@ -70,6 +72,24 @@ int LAGr_KatzCentrality LG_ASSERT_MSG (AT != NULL, LAGRAPH_NOT_CACHED, "G->AT is required") ; } + // compute correct semiring based on whether edge weights are used + GrB_Semiring semiring = use_weights ? GrB_PLUS_TIMES_SEMIRING_FP64 : GxB_PLUS_SECOND_FP64; + + if (use_weights) + { + // ensure min edge weight is available and nonnegative + LG_TRY (LAGraph_Cached_EMin (G, msg)) ; + LG_ASSERT_MSG (G->emin != NULL && + (G->emin_state == LAGraph_VALUE || + G->emin_state == LAGraph_BOUND), + LAGRAPH_NOT_CACHED, "G->emin is required") ; + + double emin = 0 ; + GRB_TRY (GrB_Scalar_extractElement_FP64 (&emin, G->emin)) ; + LG_ASSERT_MSG (emin >= 0, GrB_INVALID_VALUE, + "use_weights=true requires nonnegative edge weights") ; + } + //-------------------------------------------------------------------------- // initializations //-------------------------------------------------------------------------- @@ -86,19 +106,20 @@ int LAGr_KatzCentrality GRB_TRY(GrB_assign(b, NULL, NULL, beta, GrB_ALL, n, NULL)); // first iteration is always done - double rdiff = 1 ; + double rdiff = 1 ; - for (int iter = 0 ; rdiff >= n * tol ; iter++) + // TODO: determine best way to stop + for ((*iters) = 0 ; ; (*iters)++) { // check for convergence failure - LG_ASSERT_MSGF (iter < max_iter, LAGRAPH_CONVERGENCE_FAILURE, + LG_ASSERT_MSGF ((*iters) < max_iter, LAGRAPH_CONVERGENCE_FAILURE, "katz centrality failed to converge in %d iterations", max_iter) ; // swap x and x_prev GrB_Vector temp = x_prev ; x_prev = x ; x = temp ; // x = A' * x_prev - GRB_TRY (GrB_mxv (x, NULL, NULL, GxB_PLUS_TIMES_FP64, AT, x_prev, NULL)) ; + GRB_TRY (GrB_mxv (x, NULL, NULL, semiring, AT, x_prev, NULL)) ; // x = alpha * x + beta GRB_TRY (GrB_apply (x, NULL, NULL, GrB_TIMES_FP64, alpha, x, NULL)) ; @@ -110,6 +131,8 @@ int LAGr_KatzCentrality GRB_TRY (GrB_apply (t, NULL, NULL, GrB_ABS_FP64, t, NULL)) ; // rdiff = sum (t) GRB_TRY (GrB_reduce (&rdiff, NULL, GrB_PLUS_MONOID_FP64, t, NULL)) ; + + if (rdiff < tol) break ; // TODO: revisit } // normalize using the L2 norm if flag is set @@ -123,8 +146,7 @@ int LAGr_KatzCentrality if (sumsq > 0) { - double scale = 1.0 / sqrt (sumsq) ; - GRB_TRY (GrB_apply (x, NULL, NULL, GrB_TIMES_FP64, x, scale, NULL)) ; + GRB_TRY (GrB_apply (x, NULL, NULL, GrB_DIV_FP64, x, sqrt(sumsq), NULL)) ; } } diff --git a/experimental/benchmark/katzCentrality_demo.c b/experimental/benchmark/katzCentrality_demo.c index 2ebad10b5b..acf9d4e589 100644 --- a/experimental/benchmark/katzCentrality_demo.c +++ b/experimental/benchmark/katzCentrality_demo.c @@ -4,6 +4,7 @@ #include "../../src/benchmark/LAGraph_demo.h" #include "LAGraphX.h" +#include #define NTHREAD_LIST 1 #define THREAD_LIST 0 @@ -60,10 +61,36 @@ int main(int argc, char **argv) printf("\n"); //-------------------------------------------------------------------------- - // read in the graph + // read in the graph and parse optional Katz parameters //-------------------------------------------------------------------------- + // Usage: + // katzCentrality_demo + // [beta] [max_iters] [tol] [normalize] [use_weights] + // where normalize and use_weights are 0/1. + if (argc != 1 && (argc < 3 || argc > 8)) + { + printf("Usage: %s [beta] [max_iters] [tol] [normalize] [use_weights]\n", argv[0]); + return (GrB_INVALID_VALUE); + } + char *matrix_name = (argc > 1) ? argv[1] : "stdin"; + + double alpha = 0.01; + double beta = 1.00; + int64_t iters = 0; + int64_t max_iter = 1000; + double tol = 1e-6; + bool normalize = false; + bool use_weights = false; + + if (argc > 2) alpha = strtod(argv[2], NULL); + if (argc > 3) beta = strtod(argv[3], NULL); + if (argc > 4) max_iter = (int64_t) strtoll(argv[4], NULL, 10); + if (argc > 5) tol = strtod(argv[5], NULL); + if (argc > 6) normalize = (atoi(argv[6]) != 0); + if (argc > 7) use_weights = (atoi(argv[7]) != 0); + LAGRAPH_TRY(readproblem(&G, NULL, true, true, true, NULL, false, argc, argv)); @@ -77,16 +104,13 @@ int main(int argc, char **argv) // benchmark Katz centrality //-------------------------------------------------------------------------- - double alpha = 0.01; - double beta = 1.00; - int max_iter = 1000; - double tol = 1e-6; - bool normalize = false; + printf("\nKatz params: alpha=%g beta=%g max_iter=%lld tol=%g normalize=%d use_weights=%d\n\n", + alpha, beta, (long long) max_iter, tol, (int) normalize, (int) use_weights); // warmup for more accurate timing double tt = LAGraph_WallClockTime(); - LAGRAPH_TRY(LAGr_KatzCentrality(&c, G, alpha, beta, - max_iter, tol, normalize, msg)); + LAGRAPH_TRY(LAGr_KatzCentrality(&c, &iters, G, alpha, beta, + max_iter, tol, normalize, use_weights, msg)); tt = LAGraph_WallClockTime() - tt; GRB_TRY(GrB_free(&c)); printf("warmup time %g sec\n", tt); @@ -102,8 +126,8 @@ int main(int argc, char **argv) for (int trial = 0; trial < ntrials; trial++) { double t1 = LAGraph_WallClockTime(); - LAGRAPH_TRY(LAGr_KatzCentrality(&c, G, alpha, beta, - max_iter, tol, normalize, msg)); + LAGRAPH_TRY(LAGr_KatzCentrality(&c, &iters, G, alpha, beta, + max_iter, tol, normalize, use_weights, msg)); GRB_TRY(GrB_free(&c)); ttrial[trial] = LAGraph_WallClockTime() - t1; ttot += ttrial[trial]; diff --git a/experimental/test/test_KatzCentrality.c b/experimental/test/test_KatzCentrality.c index b387c7b422..3db09d8c4b 100644 --- a/experimental/test/test_KatzCentrality.c +++ b/experimental/test/test_KatzCentrality.c @@ -84,6 +84,7 @@ void test_katz_diamonds (void) OK (LAGraph_Init (msg)) ; GrB_Matrix A = NULL ; GrB_Vector centrality = NULL ; + int64_t niters = 0 ; // Create diamonds graph snprintf (filename, LEN, LG_DATA_DIR "%s", "diamonds.mtx") ; @@ -108,9 +109,10 @@ void test_katz_diamonds (void) // Compute katz centrality double t = LAGraph_WallClockTime() ; - OK (LAGr_KatzCentrality (¢rality, G, alpha, 1.0, 1000, 1e-6, false, msg)) ; + OK (LAGr_KatzCentrality (¢rality, &niters, G, alpha, 1.0, 1000, 1e-6, false, false, msg)) ; t = LAGraph_WallClockTime() - t ; printf (" Time for LAGr_KatzCentrality: %g sec\n", t) ; + printf (" Iterations for LAGr_KatzCentrality: %" PRId64 "\n", niters) ; // Compare with reference values. GrB_Index cn = 0, cnvals = 0 ; @@ -137,6 +139,7 @@ void test_katz_karate (void) OK (LAGraph_Init (msg)) ; GrB_Matrix A = NULL ; GrB_Vector centrality = NULL ; + int64_t niters = 0 ; // Create karate graph snprintf (filename, LEN, LG_DATA_DIR "%s", "karate.mtx") ; @@ -162,9 +165,10 @@ void test_katz_karate (void) // Compute katz centrality double t = LAGraph_WallClockTime() ; - OK (LAGr_KatzCentrality (¢rality, G, alpha, 1.0, 1000, 1e-6, false, msg)) ; + OK (LAGr_KatzCentrality (¢rality, &niters, G, alpha, 1.0, 1000, 1e-6, false, false, msg)) ; t = LAGraph_WallClockTime() - t ; printf (" Time for LAGr_KatzCentrality: %g sec\n", t) ; + printf (" Iterations for LAGr_KatzCentrality: %" PRId64 "\n", niters) ; // Compare with reference values. GrB_Index cn = 0, cnvals = 0 ; diff --git a/include/LAGraphX.h b/include/LAGraphX.h index fea69e082f..6b88afc9c2 100644 --- a/include/LAGraphX.h +++ b/include/LAGraphX.h @@ -1317,6 +1317,22 @@ int LAGr_EdgeBetweennessCentrality char *msg ) ; +//------------------------------------------------------------------------------ +// Closeness centrality +//------------------------------------------------------------------------------ + +LAGRAPHX_PUBLIC +int LAGr_ClosenessCentrality +( + // output: + GrB_Vector *centrality, + // input: + LAGraph_Graph G, + GrB_Vector sources, // target vertices to score; NULL/empty => all + const GrB_Matrix D, // optional APSP matrix, D(i,j)=dist(i->j), or NULL + char *msg +) ; + //------------------------------------------------------------------------------ // Katz centrality //------------------------------------------------------------------------------ @@ -1326,13 +1342,15 @@ int LAGr_KatzCentrality ( // output: GrB_Vector *centrality, + int64_t *iters, // input: LAGraph_Graph G, double alpha, double beta, - int max_iter, + int64_t max_iter, double tol, bool normalize, + bool use_weights, char *msg ) ; From 72cb231fe4a3c13622c7f3641ebc584d36c8e0ff Mon Sep 17 00:00:00 2001 From: Karan Bhalla Date: Tue, 24 Mar 2026 23:45:44 -0500 Subject: [PATCH 05/12] init closeness --- .../algorithm/LAGr_ClosenessCentrality.c | 355 +++++++++++++----- experimental/algorithm/LAGr_KatzCentrality.c | 1 - include/LAGraphX.h | 5 +- 3 files changed, 265 insertions(+), 96 deletions(-) diff --git a/experimental/algorithm/LAGr_ClosenessCentrality.c b/experimental/algorithm/LAGr_ClosenessCentrality.c index fcd57f0d0c..ea2acdc42b 100644 --- a/experimental/algorithm/LAGr_ClosenessCentrality.c +++ b/experimental/algorithm/LAGr_ClosenessCentrality.c @@ -11,20 +11,23 @@ // funding and support from the U.S. Government (see Acknowledgments.txt file). // DM22-0790 -// Contributed by Karan Bhalla and Timothy A. Davis, Texas A&M University; -// Adapted and revised from GraphBLAS C API Spec, Appendix B.4. +// Contributed by Karan Bhalla and Timothy A. Davis, Texas A&M University //------------------------------------------------------------------------------ -#define LG_FREE_WORK \ - { \ - GrB_free(&distance_vector); \ - if (incoming_adjacency != NULL && \ - incoming_adjacency != G->A && incoming_adjacency != G->AT) \ - { \ - GrB_free(&incoming_adjacency); \ - } \ - LAGraph_Free((void **)&source_indices, NULL); \ +#define LG_FREE_WORK \ + { \ + GrB_free(&distance_vector); \ + GrB_free(&bfs_level); \ + GrB_free(&inf_scalar); \ + GrB_free(&dist_sums); \ + GrB_free(&reachable_counts); \ + GrB_free(&D_APSP); \ + GrB_free(&A_work); \ + GrB_free(&x); \ + GrB_free(&Delta); \ + LAGraph_Delete(&G_AT, NULL); \ + LAGraph_Free((void **)&source_indices, NULL); \ } #define LG_FREE_ALL \ @@ -36,54 +39,56 @@ #include "LG_internal.h" #include +typedef enum +{ + CC_BFS, // unweighted BFS (unit edge weights) + CC_SSSP, // delta-stepping SSSP (non-negative weights) + CC_BELLMAN_FORD, // Bellman-Ford (general weights, negative-cycle check) + CC_FLOYD_WARSHALL // Floyd-Warshall (FW) APSP +} cc_algo_t; + +//------------------------------------------------------------------------------ +// LAGr_ClosenessCentrality +//------------------------------------------------------------------------------ + int LAGr_ClosenessCentrality( // output: GrB_Vector *centrality, // input: LAGraph_Graph G, - GrB_Vector sources, // target vertices to score; NULL/empty => all - const GrB_Matrix D, // optional APSP matrix, D(i,j)=dist(i->j), or NULL + GrB_Vector sources, // nodes to score; NULL or empty => all nodes + bool use_weights, // if true, use edge weights in shortest paths + bool use_floyd_warshall, // if true and sources==NULL, use APSP via FW char *msg) { + //-------------------------------------------------------------------------- // check inputs //-------------------------------------------------------------------------- LG_CLEAR_MSG; - GrB_Info info; - - // centrality_vector(v) will store the final closeness score for v. GrB_Vector centrality_vector = NULL; - - // distance_vector(u) stores shortest path length from the current target - // node to u in the incoming-edge view of the graph. - GrB_Vector distance_vector = NULL; - - // incoming_adjacency is A' for directed graphs and A for undirected ones. - GrB_Matrix incoming_adjacency = NULL; - + GrB_Vector distance_vector = NULL; // per-node BF / SSSP result + GrB_Vector bfs_level = NULL; // BFS: level (distance) of each node + GrB_Scalar inf_scalar = NULL; // INFINITY threshold for SSSP pruning + GrB_Vector dist_sums = NULL; // FW: row sums of D + GrB_Vector reachable_counts = NULL; // FW: row non-zero counts of D + GrB_Matrix D_APSP = NULL; // FW: APSP result + GrB_Matrix A_work = NULL; // AT copy for G_AT + LAGraph_Graph G_AT = NULL; // temporary graph wrapping AT (directed only) + GrB_Vector x = NULL; // FW: dense all-zeros vector for row counting + GrB_Scalar Delta = NULL; // delta-stepping step size + GrB_Index *source_indices = NULL; GrB_Index n = 0; GrB_Index source_count = 0; - // If a subset of nodes is requested, source_indices holds those node ids. - // We treat 'sources' as a set/mask vector and use tuple indices as IDs. - GrB_Index *source_indices = NULL; - LG_ASSERT(centrality != NULL, GrB_NULL_POINTER); (*centrality) = NULL; LG_TRY(LAGraph_CheckGraph(G, msg)); GRB_TRY(GrB_Matrix_nrows(&n, G->A)); - if (D != NULL) - { - GrB_Index nrows, ncols; - GRB_TRY(GrB_Matrix_nrows(&nrows, D)); - GRB_TRY(GrB_Matrix_ncols(&ncols, D)); - LG_ASSERT(nrows == n && ncols == n, GrB_DIMENSION_MISMATCH); - } - bool use_all_nodes = (sources == NULL); if (!use_all_nodes) { @@ -92,43 +97,84 @@ int LAGr_ClosenessCentrality( } //-------------------------------------------------------------------------- - // initializations + // select shortest-path algorithm //-------------------------------------------------------------------------- - GRB_TRY(GrB_Vector_new(¢rality_vector, GrB_FP64, n)); - if (use_all_nodes) - { - // dense output: every node gets an entry - GRB_TRY(GrB_assign(centrality_vector, NULL, NULL, - 0.0, GrB_ALL, n, NULL)); - source_count = n; - } - - // Uuses Bellman-Ford - // Does not consume an externally-provided all-pairs shortest path matrix yet. - LG_ASSERT_MSG(D == NULL, GrB_NOT_IMPLEMENTED, - "D input is not supported in this simplified version"); + cc_algo_t algo; + double emin = -1; - // incoming-edge closeness: for directed graphs we need distances TO each - // node, so we compute shortest paths on A'. - if (G->kind == LAGraph_ADJACENCY_UNDIRECTED || - G->is_symmetric_structure == LAGraph_TRUE) + if (use_floyd_warshall) { - incoming_adjacency = G->A; + LG_ASSERT_MSG(use_all_nodes, GrB_INVALID_VALUE, + "use_floyd_warshall requires sources to be NULL or empty"); + + if (!use_weights) + { + // Silently downgrade to BFS for unweighted graphs + // TODO: revisit this? make it more explicit to user? + algo = CC_BFS; + } + else + { + // Reject graphs with known or possible negative edges. + if (G->emin != NULL) + { + double fw_emin = 0; + GRB_TRY(GrB_Scalar_extractElement_FP64(&fw_emin, + G->emin)); + LG_ASSERT_MSG(fw_emin >= 0, GrB_INVALID_VALUE, + "Floyd-Warshall does not support negative edge" + " weights"); + } + algo = CC_FLOYD_WARSHALL; + } } - else if (G->AT != NULL) + else if (!use_weights) { - incoming_adjacency = G->AT; + // Unweighted: BFS is the most efficient choice. + algo = CC_BFS; } else { - GrB_Type edge_type; - GRB_TRY(GxB_Matrix_type(&edge_type, G->A)); - GRB_TRY(GrB_Matrix_new(&incoming_adjacency, edge_type, n, n)); - GRB_TRY(GrB_transpose(incoming_adjacency, NULL, NULL, G->A, NULL)); + LG_ASSERT_MSG(G->emin != NULL && + (G->emin_state == LAGraph_VALUE || + G->emin_state == LAGraph_BOUND), + LAGRAPH_NOT_CACHED, "G->emin is required"); + GRB_TRY(GrB_Scalar_extractElement_FP64(&emin, G->emin)); + + // Use SSSP if no negative edges, Bellman-Ford otherwise + algo = (emin >= 0 && G->emin_state == LAGraph_VALUE) + ? CC_SSSP + : CC_BELLMAN_FORD; } - // Build list of requested target nodes from tuple indices in 'sources'. + // set up G_AT: graph over the incoming adjacency. Running any shortest-path + // algorithm from v on G_AT traverses incoming edges, giving distances to v in G. + + bool is_directed = (G->kind != LAGraph_ADJACENCY_UNDIRECTED && + G->is_symmetric_structure != LAGraph_TRUE); + + if (is_directed) + { + LG_ASSERT_MSG(G->AT != NULL, LAGRAPH_NOT_CACHED, "G->AT is required"); + GRB_TRY(GrB_Matrix_dup(&A_work, G->AT)); + LG_TRY(LAGraph_New(&G_AT, &A_work, + LAGraph_ADJACENCY_DIRECTED, msg)); + + if (G->emin != NULL) + { + GRB_TRY(GrB_Scalar_dup(&G_AT->emin, G->emin)); + G_AT->emin_state = G->emin_state; + } + } + + // G_trav->A is the incoming adjacency used by all algorithm paths. + LAGraph_Graph G_trav = (G_AT != NULL) ? G_AT : G; + + //-------------------------------------------------------------------------- + // build source node list + //-------------------------------------------------------------------------- + if (!use_all_nodes) { LG_TRY(LAGraph_Malloc((void **)&source_indices, @@ -140,57 +186,180 @@ int LAGr_ClosenessCentrality( LG_ASSERT(source_indices[k] < n, GrB_INVALID_INDEX); } } + else + { + source_count = n; + } //-------------------------------------------------------------------------- - // compute centrality values + // allocate output vector //-------------------------------------------------------------------------- + GRB_TRY(GrB_Vector_new(¢rality_vector, GrB_FP64, n)); + if (use_all_nodes) + { + // Dense output: isolated nodes keep score 0. + GRB_TRY(GrB_assign(centrality_vector, NULL, NULL, + 0.0, GrB_ALL, n, NULL)); + } + + //========================================================================== + // Floyd-Warshall path + //========================================================================== + + if (algo == CC_FLOYD_WARSHALL) + { + GrB_Type D_type; + GRB_TRY(LAGraph_FW(G_trav->A, &D_APSP, &D_type)); + + // Remove self-loops so they do not bias sums or counts. + GRB_TRY(GrB_select(D_APSP, NULL, NULL, + GrB_OFFDIAG, D_APSP, (int64_t)0, NULL)); + + // dist_sums[v] = sum of row v + GRB_TRY(GrB_Vector_new(&dist_sums, GrB_FP64, n)); + GRB_TRY(GrB_reduce(dist_sums, NULL, NULL, + GrB_PLUS_MONOID_FP64, D_APSP, NULL)); + + // reachable_counts[v] = number of non-zeros in row v of D_APSP. + // Multiply D_APSP by a dense all-zeros vector with LAGraph_plus_one_fp64: + // TODO: revisit? + GRB_TRY(GrB_Vector_new(&x, GrB_FP64, n)); + GRB_TRY(GrB_assign(x, NULL, NULL, (double)0, GrB_ALL, n, NULL)); + GRB_TRY(GrB_Vector_new(&reachable_counts, GrB_FP64, n)); + GRB_TRY(GrB_mxv(reachable_counts, NULL, NULL, LAGraph_plus_one_fp64, + D_APSP, x, NULL)); + GRB_TRY(GrB_free(&D_APSP)); + + // centrality[v] = R(v) / dist_sums[v]. + GRB_TRY(GrB_eWiseMult(centrality_vector, NULL, NULL, GrB_DIV_FP64, + reachable_counts, dist_sums, NULL)); + + (*centrality) = centrality_vector; + LG_FREE_WORK; + return GrB_SUCCESS; + } + + if (algo == CC_SSSP) + { + GRB_TRY(GrB_Scalar_new(&Delta, GrB_FP64)); + GRB_TRY(GrB_Scalar_setElement_FP64(Delta, emin > 0 ? emin : 1.0)); // TODO: how to set delta properly? + GRB_TRY(GrB_Scalar_new(&inf_scalar, GrB_FP64)); + GRB_TRY(GrB_Scalar_setElement_FP64(inf_scalar, (double)INFINITY)); + } + + //========================================================================== + // per-node shortest-path loop + //========================================================================== + for (GrB_Index k = 0; k < source_count; k++) { - // node_to_score is the vertex whose incoming closeness we compute. - GrB_Index node_to_score = use_all_nodes ? k : source_indices[k]; - - // Compute shortest distances from node_to_score in the incoming-edge - // graph. This equals distances TO node_to_score in the original graph. - info = LAGraph_BF_basic(&distance_vector, incoming_adjacency, - node_to_score); - if (info == GrB_NO_VALUE) + GrB_Index node_to_score = + use_all_nodes ? k : source_indices[k]; + + double distance_sum = 0; + GrB_Index reachable_count = 0; + + //---------------------------------------------------------------------- + // BFS (unweighted shortest paths) + //---------------------------------------------------------------------- + + if (algo == CC_BFS) { - LG_FREE_ALL; - return (info); + // IMPORTANT: LAGr_BreadthFirstSearch sets *level = NULL without + // freeing the prior handle. We must free bfs_level before every + // call to avoid a memory leak. + GRB_TRY(GrB_free(&bfs_level)); + LG_TRY(LAGr_BreadthFirstSearch(&bfs_level, NULL, + G_trav, node_to_score, msg)); + + GRB_TRY(GrB_Vector_removeElement(bfs_level, node_to_score)); + GRB_TRY(GrB_Vector_nvals(&reachable_count, bfs_level)); + if (reachable_count > 0) + { + GRB_TRY(GrB_reduce(&distance_sum, NULL, + GrB_PLUS_MONOID_FP64, bfs_level, NULL)); + } } - if (info < GrB_SUCCESS) + + //---------------------------------------------------------------------- + // Delta-stepping SSSP (Dijkstra-like, non-negative weights) + //---------------------------------------------------------------------- + + else if (algo == CC_SSSP) { - GRB_CATCH(info); + GRB_TRY(GrB_free(&distance_vector)); + LG_TRY(LAGr_SingleSourceShortestPath(&distance_vector, + G_trav, + node_to_score, + Delta, msg)); + + // Prune unreachable nodes (value == INFINITY). + GRB_TRY(GrB_select(distance_vector, NULL, NULL, + GrB_VALUELT_FP64, + distance_vector, inf_scalar, NULL)); + + // Exclude self (distance = 0). + GRB_TRY(GrB_Vector_removeElement(distance_vector, + node_to_score)); + GRB_TRY(GrB_Vector_nvals(&reachable_count, distance_vector)); + + if (reachable_count > 0) + { + GRB_TRY(GrB_reduce(&distance_sum, NULL, + GrB_PLUS_MONOID_FP64, + distance_vector, NULL)); + } } - // Do not include distance(node_to_score, node_to_score)=0 in the sum. - GRB_TRY(GrB_Vector_removeElement(distance_vector, node_to_score)); + //---------------------------------------------------------------------- + // Bellman-Ford + //---------------------------------------------------------------------- - // Count how many nodes can reach node_to_score. - GrB_Index reachable_count = 0; - GRB_TRY(GrB_Vector_nvals(&reachable_count, distance_vector)); - - if (reachable_count > 0) + else // CC_BELLMAN_FORD { - // Sum all finite shortest-path distances to node_to_score. - double distance_sum = 0; - GRB_TRY(GrB_reduce(&distance_sum, NULL, GrB_PLUS_MONOID_FP64, - distance_vector, NULL)); - if (distance_sum > 0) + GRB_TRY(GrB_free(&distance_vector)); + + info = LAGraph_BF_basic(&distance_vector, + G_trav->A, node_to_score); + if (info == GrB_NO_VALUE) { - // Closeness = (# reachable nodes) / (sum of distances). - double closeness_value = ((double)reachable_count) / distance_sum; + // Negative-weight cycle reachable from this node; + // TODO: how to deal with this? + // For now, set centrality to NaN to indicate an invalid score, and continue. GRB_TRY(GrB_Vector_setElement(centrality_vector, - closeness_value, node_to_score)); + (double)NAN, node_to_score)); + continue; + } + GRB_TRY(info); + + // Exclude self (distance = 0). + GRB_TRY(GrB_Vector_removeElement(distance_vector, + node_to_score)); + GRB_TRY(GrB_Vector_nvals(&reachable_count, distance_vector)); + + if (reachable_count > 0) + { + GRB_TRY(GrB_reduce(&distance_sum, NULL, + GrB_PLUS_MONOID_FP64, + distance_vector, NULL)); } } - GRB_TRY(GrB_free(&distance_vector)); + // closeness(v) = R(v) / sum_{u->v} d(u, v) + if (reachable_count > 0 && distance_sum > 0) + { + double closeness = ((double)reachable_count) / distance_sum; + GRB_TRY(GrB_Vector_setElement(centrality_vector, + closeness, node_to_score)); + } } + //-------------------------------------------------------------------------- + // free workspace and return result + //-------------------------------------------------------------------------- + (*centrality) = centrality_vector; LG_FREE_WORK; - return GrB_SUCCESS; -} +} \ No newline at end of file diff --git a/experimental/algorithm/LAGr_KatzCentrality.c b/experimental/algorithm/LAGr_KatzCentrality.c index 25d547abe0..d3f20e6e45 100644 --- a/experimental/algorithm/LAGr_KatzCentrality.c +++ b/experimental/algorithm/LAGr_KatzCentrality.c @@ -12,7 +12,6 @@ // DM22-0790 // Contributed by Karan Bhalla and Timothy A. Davis, Texas A&M University; -// Adapted and revised from GraphBLAS C API Spec, Appendix B.4. //------------------------------------------------------------------------------ diff --git a/include/LAGraphX.h b/include/LAGraphX.h index 6b88afc9c2..c01d220754 100644 --- a/include/LAGraphX.h +++ b/include/LAGraphX.h @@ -1328,8 +1328,9 @@ int LAGr_ClosenessCentrality GrB_Vector *centrality, // input: LAGraph_Graph G, - GrB_Vector sources, // target vertices to score; NULL/empty => all - const GrB_Matrix D, // optional APSP matrix, D(i,j)=dist(i->j), or NULL + GrB_Vector sources, // nodes to score; NULL or empty => all nodes + bool use_weights, // if true, use edge weights in shortest paths + bool use_floyd_warshall, // if true and sources==NULL, use FW APSP char *msg ) ; From 75398d045c0f2c025ebef24b0ebc8bba8d3a63b6 Mon Sep 17 00:00:00 2001 From: Karan Bhalla Date: Wed, 25 Mar 2026 11:15:36 -0500 Subject: [PATCH 06/12] add test + demo for closeness centrality --- .../benchmark/closenessCentrality_demo.c | 199 ++++++++++++++++++ experimental/test/test_ClosenessCentrality.c | 191 +++++++++++++++++ 2 files changed, 390 insertions(+) create mode 100644 experimental/benchmark/closenessCentrality_demo.c create mode 100644 experimental/test/test_ClosenessCentrality.c diff --git a/experimental/benchmark/closenessCentrality_demo.c b/experimental/benchmark/closenessCentrality_demo.c new file mode 100644 index 0000000000..ff1ffcb9f8 --- /dev/null +++ b/experimental/benchmark/closenessCentrality_demo.c @@ -0,0 +1,199 @@ +//------------------------------------------------------------------------------ +// LAGraph/experimental/benchmark/closenessCentrality_demo.c: demo for Closeness +//------------------------------------------------------------------------------ + +// 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 Karan Bhalla and Timothy A. Davis, Texas A&M University + +//------------------------------------------------------------------------------ + +#define LG_FREE_ALL \ + { \ + GrB_free (¢rality) ; \ + GrB_free (&A) ; \ + GrB_free (&sources) ; \ + LAGraph_Delete (&G, msg) ; \ + } + +#include "LAGraphX.h" +#include "LG_internal.h" +#include "LG_Xtest.h" +#include +#include + +int main (int argc, char **argv) +{ + //-------------------------------------------------------------------------- + // startup LAGraph and GraphBLAS + //-------------------------------------------------------------------------- + + char msg [LAGRAPH_MSG_LEN] ; + LAGraph_Graph G = NULL ; + GrB_Matrix A = NULL ; + GrB_Vector centrality = NULL, sources = NULL ; + + LAGRAPH_TRY (LAGraph_Init (msg)) ; + + //-------------------------------------------------------------------------- + // parse command-line arguments + //-------------------------------------------------------------------------- + + // Usage: + // closenessCentrality_demo + // [num_sources] [use_weights] [use_floyd_warshall] + // + // : required; path to .mtx file + // [num_sources] : optional; number of random source nodes to score + // (0 or omitted => score all nodes) + // [use_weights] : optional 0/1 (default 0); use edge weights + // [use_floyd_warshall] : optional 0/1 (default 0); use Floyd-Warshall APSP + // (only valid when num_sources is 0/omitted) + + if (argc < 2 || argc > 5) + { + printf ("Usage: %s " + " [num_sources] [use_weights] [use_floyd_warshall]\n", + argv [0]) ; + return (GrB_INVALID_VALUE) ; + } + + bool use_weights = false ; + bool use_floyd_warshall = false ; + int num_sources = 0 ; + + if (argc > 2) num_sources = atoi (argv [2]) ; + if (argc > 3) use_weights = (atoi (argv [3]) != 0) ; + if (argc > 4) use_floyd_warshall = (atoi (argv [4]) != 0) ; + + //-------------------------------------------------------------------------- + // read in the graph + //-------------------------------------------------------------------------- + + FILE *f = fopen (argv [1], "r") ; + if (f == NULL) + { + printf ("Error: unable to open file %s\n", argv [1]) ; + LG_FREE_ALL ; + return (GrB_INVALID_VALUE) ; + } + + double t = LAGraph_WallClockTime () ; + LAGRAPH_TRY (LAGraph_MMRead (&A, f, msg)) ; + fclose (f) ; + + uint64_t n ; + GRB_TRY (GrB_Matrix_nrows (&n, A)) ; + + LAGRAPH_TRY (LAGraph_New (&G, &A, LAGraph_ADJACENCY_DIRECTED, msg)) ; + LAGRAPH_TRY (LAGraph_DeleteSelfEdges (G, msg)) ; + LAGRAPH_TRY (LAGraph_Cached_AT (G, msg)) ; + + if (use_weights) + { + LAGRAPH_TRY (LAGraph_Cached_EMin (G, msg)) ; + } + + t = LAGraph_WallClockTime () - t ; + printf ("Time to read the graph: %g sec\n", t) ; + + printf ("\n==========================The input graph matrix G:\n") ; + LAGRAPH_TRY (LAGraph_Graph_Print (G, LAGraph_SHORT, stdout, msg)) ; + + //-------------------------------------------------------------------------- + // build optional source-node vector + //-------------------------------------------------------------------------- + + if (num_sources > 0) + { + if (use_floyd_warshall) + { + printf ("Warning: use_floyd_warshall ignored when num_sources > 0;" + " falling back to per-node shortest paths.\n") ; + use_floyd_warshall = false ; + } + + if ((uint64_t) num_sources >= n) + { + printf ("Error: num_sources (%" PRId32 ") must be less than" + " n (%" PRIu64 ").\n", num_sources, n) ; + LG_FREE_ALL ; + return (GrB_INVALID_VALUE) ; + } + + GRB_TRY (GrB_Vector_new (&sources, GrB_UINT64, num_sources)) ; + + double t_seed = LAGraph_WallClockTime () ; + srand ((int) t_seed) ; + + bool *used = NULL ; + LAGRAPH_TRY (LAGraph_Calloc ((void **) &used, n, sizeof (bool), msg)) ; + + for (int i = 0 ; i < num_sources ; i++) + { + GrB_Index idx ; + do { idx = rand () % n ; } while (used [idx]) ; + used [idx] = true ; + GRB_TRY (GrB_Vector_setElement (sources, idx, i)) ; + } + LAGRAPH_TRY (LAGraph_Free ((void **) &used, msg)) ; + + printf ("Using %d random source nodes.\n", num_sources) ; + } + + //-------------------------------------------------------------------------- + // compute closeness centrality + //-------------------------------------------------------------------------- + + printf ("\nCloseness params: use_weights=%d use_floyd_warshall=%d" + " num_sources=%d\n\n", + (int) use_weights, (int) use_floyd_warshall, num_sources) ; + + t = LAGraph_WallClockTime () ; + LAGRAPH_TRY (LAGr_ClosenessCentrality (¢rality, G, sources, + use_weights, use_floyd_warshall, + msg)) ; + t = LAGraph_WallClockTime () - t ; + printf ("Time for LAGr_ClosenessCentrality: %g sec\n", t) ; + + //-------------------------------------------------------------------------- + // print results + //-------------------------------------------------------------------------- + + GrB_Index nvals = 0 ; + GRB_TRY (GrB_Vector_nvals (&nvals, centrality)) ; + printf ("Number of scored nodes: %" PRIu64 "\n", (uint64_t) nvals) ; + + // print first few scores + GrB_Index print_limit = (n < 20) ? n : 20 ; + printf ("Closeness centrality (first %" PRIu64 " nodes):\n", + (uint64_t) print_limit) ; + for (GrB_Index i = 0 ; i < print_limit ; i++) + { + double score = 0 ; + GrB_Info info = GrB_Vector_extractElement_FP64 (&score, centrality, i) ; + if (info == GrB_SUCCESS) + { + printf (" node %" PRIu64 ": %g\n", (uint64_t) i, score) ; + } + else + { + printf (" node %" PRIu64 ": (unreachable)\n", (uint64_t) i) ; + } + } + + //-------------------------------------------------------------------------- + // free everything and finish + //-------------------------------------------------------------------------- + + LG_FREE_ALL ; + LAGRAPH_TRY (LAGraph_Finalize (msg)) ; + return (GrB_SUCCESS) ; +} diff --git a/experimental/test/test_ClosenessCentrality.c b/experimental/test/test_ClosenessCentrality.c new file mode 100644 index 0000000000..4dfe15fc70 --- /dev/null +++ b/experimental/test/test_ClosenessCentrality.c @@ -0,0 +1,191 @@ +//------------------------------------------------------------------------------ +// LAGraph/experimental/test/test_ClosenessCentrality.c: tests for Closeness +//------------------------------------------------------------------------------ + +// LAGraph, (c) 2019-2025 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 Karan Bhalla and Timothy A. Davis, Texas A&M University + +//------------------------------------------------------------------------------ + +#include +#include +#include + +#include "LAGraphX.h" +#include "LAGraph_test.h" +#include "LG_internal.h" + +#define LEN 512 +char msg [LAGRAPH_MSG_LEN] ; +char filename [LEN+1] ; + +//------------------------------------------------------------------------------ +// reference results from NetworkX +// note: WF_improved is set to FALSE for all tests +//------------------------------------------------------------------------------ + +// closeness_centrality(G) from NetworkX for diamonds.mtx (directed) +double diamonds_closeness[8] = { + 0.0, 1.0, 1.0, 1.0, 0.8, 0.5, 0.5, 0.4117647058823529 +} ; + +// closeness_centrality(G) from NetworkX for karate.mtx (undirected) +double karate_closeness[34] = { + 0.5689655172413793, 0.4852941176470588, 0.559322033898305, 0.4647887323943662, + 0.3793103448275862, 0.38372093023255816, 0.38372093023255816, 0.44, + 0.515625, 0.4342105263157895, 0.3793103448275862, 0.36666666666666664, + 0.3707865168539326, 0.515625, 0.3707865168539326, 0.3707865168539326, + 0.28448275862068967, 0.375, 0.3707865168539326, 0.5, + 0.3707865168539326, 0.375, 0.3707865168539326, 0.39285714285714285, + 0.375, 0.375, 0.3626373626373626, 0.4583333333333333, + 0.4520547945205479, 0.38372093023255816, 0.4583333333333333, 0.5409836065573771, + 0.515625, 0.55 +} ; + +//------------------------------------------------------------------------------ +// difference: compare closeness vector result with reference values +//------------------------------------------------------------------------------ + +double difference (GrB_Vector c, double *reference_c, GrB_Index n) ; + +double difference (GrB_Vector c, double *reference_c, GrB_Index n) +{ + GrB_Vector diff = NULL, reference_c_vector = NULL ; + OK (GrB_Vector_new (&reference_c_vector, GrB_FP64, n)) ; + + for (GrB_Index i = 0 ; i < n ; i++) + { + OK (GrB_Vector_setElement_FP64 (reference_c_vector, reference_c [i], i)) ; + } + + OK (GrB_Vector_new (&diff, GrB_FP64, n)) ; + OK (GrB_eWiseAdd (diff, NULL, NULL, GrB_MINUS_FP64, reference_c_vector, c, + NULL)) ; + OK (GrB_apply (diff, NULL, NULL, GrB_ABS_FP64, diff, NULL)) ; + + double err = 0 ; + OK (GrB_reduce (&err, NULL, GrB_MAX_MONOID_FP64, diff, NULL)) ; + + OK (GrB_free (&diff)) ; + OK (GrB_free (&reference_c_vector)) ; + + return err ; +} + +//------------------------------------------------------------------------------ +// test_closeness_diamonds: directed graph, unweighted (BFS), all sources +//------------------------------------------------------------------------------ + +void test_closeness_diamonds (void) +{ +#if LAGRAPH_SUITESPARSE + LAGraph_Graph G = NULL ; + OK (LAGraph_Init (msg)) ; + GrB_Matrix A = NULL ; + GrB_Vector centrality = NULL ; + + snprintf (filename, LEN, LG_DATA_DIR "%s", "diamonds.mtx") ; + FILE *f = fopen (filename, "r") ; + TEST_CHECK (f != NULL) ; + OK (LAGraph_MMRead (&A, f, msg)) ; + OK (fclose (f)) ; + OK (LAGraph_New (&G, &A, LAGraph_ADJACENCY_DIRECTED, msg)) ; + TEST_CHECK (A == NULL) ; + + int result = LAGraph_Cached_AT (G, msg) ; + TEST_CHECK (result == GrB_SUCCESS || result == LAGRAPH_CACHE_NOT_NEEDED) ; + + uint64_t n, nedges ; + OK (GrB_Matrix_nrows (&n, G->A)) ; + OK (GrB_Matrix_nvals (&nedges, G->A)) ; + printf ("\n\nDiamonds graph (%" PRIu64 " nodes, %" PRIu64 " edges):\n", + n, nedges) ; + + double t = LAGraph_WallClockTime () ; + OK (LAGr_ClosenessCentrality (¢rality, G, NULL, + false, false, msg)) ; + t = LAGraph_WallClockTime () - t ; + printf (" Time for LAGr_ClosenessCentrality: %g sec\n", t) ; + + GrB_Index cn = 0, cnvals = 0 ; + OK (GrB_Vector_size (&cn, centrality)) ; + OK (GrB_Vector_nvals (&cnvals, centrality)) ; + TEST_CHECK (cn == n) ; + + double err = difference (centrality, diamonds_closeness, 8) ; + printf (" diamonds: err: %e\n", err) ; + TEST_CHECK (err < 1e-4) ; + + OK (GrB_free (¢rality)) ; + OK (LAGraph_Delete (&G, msg)) ; + OK (LAGraph_Finalize (msg)) ; +#endif +} + +//------------------------------------------------------------------------------ +// test_closeness_karate: undirected graph, unweighted (BFS), all sources +//------------------------------------------------------------------------------ + +void test_closeness_karate (void) +{ +#if LAGRAPH_SUITESPARSE + LAGraph_Graph G = NULL ; + OK (LAGraph_Init (msg)) ; + GrB_Matrix A = NULL ; + GrB_Vector centrality = NULL ; + + snprintf (filename, LEN, LG_DATA_DIR "%s", "karate.mtx") ; + FILE *f = fopen (filename, "r") ; + TEST_CHECK (f != NULL) ; + OK (LAGraph_MMRead (&A, f, msg)) ; + OK (fclose (f)) ; + OK (LAGraph_New (&G, &A, LAGraph_ADJACENCY_UNDIRECTED, msg)) ; + TEST_CHECK (A == NULL) ; + + int result = LAGraph_Cached_AT (G, msg) ; + TEST_CHECK (result == GrB_SUCCESS || result == LAGRAPH_CACHE_NOT_NEEDED) ; + + uint64_t n, nedges ; + OK (GrB_Matrix_nrows (&n, G->A)) ; + OK (GrB_Matrix_nvals (&nedges, G->A)) ; + printf ("\n\nKarate graph (%" PRIu64 " nodes, %" PRIu64 " edges):\n", + n, nedges) ; + + double t = LAGraph_WallClockTime () ; + OK (LAGr_ClosenessCentrality (¢rality, G, NULL, + false, false, msg)) ; + t = LAGraph_WallClockTime () - t ; + printf (" Time for LAGr_ClosenessCentrality: %g sec\n", t) ; + + GrB_Index cn = 0, cnvals = 0 ; + OK (GrB_Vector_size (&cn, centrality)) ; + OK (GrB_Vector_nvals (&cnvals, centrality)) ; + TEST_CHECK (cn == n) ; + + double err = difference (centrality, karate_closeness, 34) ; + printf (" karate: err: %e\n", err) ; + TEST_CHECK (err < 1e-4) ; + + OK (GrB_free (¢rality)) ; + OK (LAGraph_Delete (&G, msg)) ; + OK (LAGraph_Finalize (msg)) ; +#endif +} + +//------------------------------------------------------------------------------ +// list of tests +//------------------------------------------------------------------------------ + +TEST_LIST = { + {"test_closeness_diamonds", test_closeness_diamonds}, + {"test_closeness_karate", test_closeness_karate}, + {NULL, NULL} +} ; From 658cad45bac4711b2ce01d4a5992845c21843c77 Mon Sep 17 00:00:00 2001 From: Karan Bhalla Date: Sat, 28 Mar 2026 23:19:55 -0500 Subject: [PATCH 07/12] add fixes to demo file --- .../algorithm/LAGr_ClosenessCentrality.c | 2 +- experimental/algorithm/LAGr_KatzCentrality.c | 3 +- .../benchmark/closenessCentrality_demo.c | 37 ++-- experimental/benchmark/katzCentrality_demo.c | 178 +++++++++--------- 4 files changed, 108 insertions(+), 112 deletions(-) diff --git a/experimental/algorithm/LAGr_ClosenessCentrality.c b/experimental/algorithm/LAGr_ClosenessCentrality.c index ea2acdc42b..37fce08087 100644 --- a/experimental/algorithm/LAGr_ClosenessCentrality.c +++ b/experimental/algorithm/LAGr_ClosenessCentrality.c @@ -179,7 +179,7 @@ int LAGr_ClosenessCentrality( { LG_TRY(LAGraph_Malloc((void **)&source_indices, source_count, sizeof(GrB_Index), msg)); - GRB_TRY(GrB_Vector_extractTuples(source_indices, NULL, + GRB_TRY(GrB_Vector_extractTuples_UINT64(source_indices, NULL, &source_count, sources)); for (GrB_Index k = 0; k < source_count; k++) { diff --git a/experimental/algorithm/LAGr_KatzCentrality.c b/experimental/algorithm/LAGr_KatzCentrality.c index d3f20e6e45..d306eb74f2 100644 --- a/experimental/algorithm/LAGr_KatzCentrality.c +++ b/experimental/algorithm/LAGr_KatzCentrality.c @@ -72,6 +72,7 @@ int LAGr_KatzCentrality } // compute correct semiring based on whether edge weights are used + // TODO: add FP32 support GrB_Semiring semiring = use_weights ? GrB_PLUS_TIMES_SEMIRING_FP64 : GxB_PLUS_SECOND_FP64; if (use_weights) @@ -112,7 +113,7 @@ int LAGr_KatzCentrality { // check for convergence failure LG_ASSERT_MSGF ((*iters) < max_iter, LAGRAPH_CONVERGENCE_FAILURE, - "katz centrality failed to converge in %d iterations", max_iter) ; + "katz centrality failed to converge in %" PRId64 " iterations", max_iter) ; // swap x and x_prev GrB_Vector temp = x_prev ; x_prev = x ; x = temp ; diff --git a/experimental/benchmark/closenessCentrality_demo.c b/experimental/benchmark/closenessCentrality_demo.c index ff1ffcb9f8..669cffb695 100644 --- a/experimental/benchmark/closenessCentrality_demo.c +++ b/experimental/benchmark/closenessCentrality_demo.c @@ -15,20 +15,18 @@ //------------------------------------------------------------------------------ +#include "../../src/benchmark/LAGraph_demo.h" +#include "LAGraphX.h" +#include +#include + #define LG_FREE_ALL \ { \ GrB_free (¢rality) ; \ - GrB_free (&A) ; \ GrB_free (&sources) ; \ LAGraph_Delete (&G, msg) ; \ } -#include "LAGraphX.h" -#include "LG_internal.h" -#include "LG_Xtest.h" -#include -#include - int main (int argc, char **argv) { //-------------------------------------------------------------------------- @@ -37,10 +35,10 @@ int main (int argc, char **argv) char msg [LAGRAPH_MSG_LEN] ; LAGraph_Graph G = NULL ; - GrB_Matrix A = NULL ; GrB_Vector centrality = NULL, sources = NULL ; - LAGRAPH_TRY (LAGraph_Init (msg)) ; + bool burble = false ; + demo_init (burble) ; //-------------------------------------------------------------------------- // parse command-line arguments @@ -77,23 +75,14 @@ int main (int argc, char **argv) // read in the graph //-------------------------------------------------------------------------- - FILE *f = fopen (argv [1], "r") ; - if (f == NULL) - { - printf ("Error: unable to open file %s\n", argv [1]) ; - LG_FREE_ALL ; - return (GrB_INVALID_VALUE) ; - } - + // char *matrix_name = (argc > 1) ? argv [1] : "stdin" ; double t = LAGraph_WallClockTime () ; - LAGRAPH_TRY (LAGraph_MMRead (&A, f, msg)) ; - fclose (f) ; + LAGRAPH_TRY( + readproblem(&G, NULL, false, false, false, NULL, false, argc, argv)) ; - uint64_t n ; - GRB_TRY (GrB_Matrix_nrows (&n, A)) ; + GrB_Index n ; + GRB_TRY (GrB_Matrix_nrows (&n, G->A)) ; - LAGRAPH_TRY (LAGraph_New (&G, &A, LAGraph_ADJACENCY_DIRECTED, msg)) ; - LAGRAPH_TRY (LAGraph_DeleteSelfEdges (G, msg)) ; LAGRAPH_TRY (LAGraph_Cached_AT (G, msg)) ; if (use_weights) @@ -104,7 +93,7 @@ int main (int argc, char **argv) t = LAGraph_WallClockTime () - t ; printf ("Time to read the graph: %g sec\n", t) ; - printf ("\n==========================The input graph matrix G:\n") ; + printf ("\n==========================\nThe input graph matrix G:\n") ; LAGRAPH_TRY (LAGraph_Graph_Print (G, LAGraph_SHORT, stdout, msg)) ; //-------------------------------------------------------------------------- diff --git a/experimental/benchmark/katzCentrality_demo.c b/experimental/benchmark/katzCentrality_demo.c index acf9d4e589..d021bdca84 100644 --- a/experimental/benchmark/katzCentrality_demo.c +++ b/experimental/benchmark/katzCentrality_demo.c @@ -9,56 +9,56 @@ #define NTHREAD_LIST 1 #define THREAD_LIST 0 -#define LG_FREE_ALL \ - { \ - LAGraph_Delete(&G, NULL); \ - GrB_free(&c); \ - } +#define LG_FREE_ALL \ +{ \ + LAGraph_Delete (&G, NULL) ; \ + GrB_free (&c) ; \ +} -int main(int argc, char **argv) +int main (int argc, char **argv) { //-------------------------------------------------------------------------- // initialize LAGraph and GraphBLAS //-------------------------------------------------------------------------- - char msg[LAGRAPH_MSG_LEN]; - LAGraph_Graph G = NULL; - GrB_Vector c = NULL; + char msg [LAGRAPH_MSG_LEN] ; + LAGraph_Graph G = NULL ; + GrB_Vector c = NULL ; // start GraphBLAS and LAGraph - bool burble = false; - demo_init(burble); + bool burble = false ; + demo_init (burble) ; - int ntrials = 3; - printf("# of trials: %d\n", ntrials); + int ntrials = 3 ; + printf ("# of trials: %d\n", ntrials) ; - int nt = NTHREAD_LIST; - int Nthreads[20] = {0, THREAD_LIST}; + int nt = NTHREAD_LIST ; + int Nthreads [20] = { 0, THREAD_LIST } ; - int nthreads_max, nthreads_outer, nthreads_inner; - LAGRAPH_TRY(LAGraph_GetNumThreads(&nthreads_outer, &nthreads_inner, msg)); - nthreads_max = nthreads_outer * nthreads_inner; + int nthreads_max, nthreads_outer, nthreads_inner ; + LAGRAPH_TRY (LAGraph_GetNumThreads (&nthreads_outer, &nthreads_inner, msg)) ; + nthreads_max = nthreads_outer * nthreads_inner ; - if (Nthreads[1] == 0) + if (Nthreads [1] == 0) { - Nthreads[1] = nthreads_max; - for (int t = 2; t <= nt; t++) + Nthreads [1] = nthreads_max ; + for (int t = 2 ; t <= nt ; t++) { - Nthreads[t] = Nthreads[t - 1] / 2; - if (Nthreads[t] == 0) - nt = t - 1; + Nthreads [t] = Nthreads [t-1] / 2 ; + if (Nthreads [t] == 0) + nt = t-1 ; } } - printf("threads to test:"); - for (int t = 1; t <= nt; t++) + printf ("threads to test:") ; + for (int t = 1 ; t <= nt ; t++) { - int nthreads = Nthreads[t]; + int nthreads = Nthreads [t] ; if (nthreads > nthreads_max) - continue; - printf(" %d", nthreads); + continue ; + printf (" %d", nthreads) ; } - printf("\n"); + printf ("\n") ; //-------------------------------------------------------------------------- // read in the graph and parse optional Katz parameters @@ -70,82 +70,88 @@ int main(int argc, char **argv) // where normalize and use_weights are 0/1. if (argc != 1 && (argc < 3 || argc > 8)) { - printf("Usage: %s [beta] [max_iters] [tol] [normalize] [use_weights]\n", argv[0]); - return (GrB_INVALID_VALUE); + printf ("Usage: %s " + " [beta] [max_iters] [tol] [normalize] [use_weights]\n", + argv [0]) ; + return (GrB_INVALID_VALUE) ; } - char *matrix_name = (argc > 1) ? argv[1] : "stdin"; + char *matrix_name = (argc > 1) ? argv [1] : "stdin" ; - double alpha = 0.01; - double beta = 1.00; - int64_t iters = 0; - int64_t max_iter = 1000; - double tol = 1e-6; - bool normalize = false; - bool use_weights = false; + double alpha = 0.01 ; + double beta = 1.00 ; + int64_t iters = 0 ; + int64_t max_iter = 1000 ; + double tol = 1e-6 ; + bool normalize = false ; + bool use_weights = false ; - if (argc > 2) alpha = strtod(argv[2], NULL); - if (argc > 3) beta = strtod(argv[3], NULL); - if (argc > 4) max_iter = (int64_t) strtoll(argv[4], NULL, 10); - if (argc > 5) tol = strtod(argv[5], NULL); - if (argc > 6) normalize = (atoi(argv[6]) != 0); - if (argc > 7) use_weights = (atoi(argv[7]) != 0); + if (argc > 2) alpha = strtod (argv [2], NULL) ; + if (argc > 3) beta = strtod (argv [3], NULL) ; + if (argc > 4) max_iter = (int64_t) strtoll (argv [4], NULL, 10) ; + if (argc > 5) tol = strtod (argv [5], NULL) ; + if (argc > 6) normalize = (atoi (argv [6]) != 0) ; + if (argc > 7) use_weights = (atoi (argv [7]) != 0) ; - LAGRAPH_TRY(readproblem(&G, NULL, - true, true, true, NULL, false, argc, argv)); + LAGRAPH_TRY( + readproblem(&G, NULL, false, false, false, NULL, false, argc, argv)); // Katz uses incoming edges; AT is required for directed graphs. - int cache_result = LAGraph_Cached_AT(G, msg); - LG_ASSERT_MSG(cache_result == GrB_SUCCESS || - cache_result == LAGRAPH_CACHE_NOT_NEEDED, - cache_result, "LAGraph_Cached_AT failed"); + int cache_result = LAGraph_Cached_AT (G, msg) ; + LG_ASSERT_MSG (cache_result == GrB_SUCCESS || + cache_result == LAGRAPH_CACHE_NOT_NEEDED, + cache_result, "LAGraph_Cached_AT failed") ; //-------------------------------------------------------------------------- // benchmark Katz centrality //-------------------------------------------------------------------------- - printf("\nKatz params: alpha=%g beta=%g max_iter=%lld tol=%g normalize=%d use_weights=%d\n\n", - alpha, beta, (long long) max_iter, tol, (int) normalize, (int) use_weights); + printf ("\nKatz params: alpha=%g beta=%g max_iter=%lld tol=%g" + " normalize=%d use_weights=%d\n\n", + alpha, beta, (long long) max_iter, tol, + (int) normalize, (int) use_weights) ; // warmup for more accurate timing - double tt = LAGraph_WallClockTime(); - LAGRAPH_TRY(LAGr_KatzCentrality(&c, &iters, G, alpha, beta, - max_iter, tol, normalize, use_weights, msg)); - tt = LAGraph_WallClockTime() - tt; - GRB_TRY(GrB_free(&c)); - printf("warmup time %g sec\n", tt); - - for (int t = 1; t <= nt; t++) + double tt = LAGraph_WallClockTime () ; + LAGRAPH_TRY (LAGr_KatzCentrality (&c, &iters, G, alpha, beta, + max_iter, tol, normalize, use_weights, msg)) ; + tt = LAGraph_WallClockTime () - tt ; + GRB_TRY (GrB_free (&c)) ; + printf ("warmup time %g sec\n", tt) ; + + for (int t = 1 ; t <= nt ; t++) { - int nthreads = Nthreads[t]; + int nthreads = Nthreads [t] ; if (nthreads > nthreads_max) - continue; - LAGRAPH_TRY(LAGraph_SetNumThreads(1, nthreads, msg)); + continue ; + LAGRAPH_TRY (LAGraph_SetNumThreads (1, nthreads, msg)) ; - double ttot = 0, ttrial[100]; - for (int trial = 0; trial < ntrials; trial++) + double ttot = 0, ttrial [100] ; + for (int trial = 0 ; trial < ntrials ; trial++) { - double t1 = LAGraph_WallClockTime(); - LAGRAPH_TRY(LAGr_KatzCentrality(&c, &iters, G, alpha, beta, - max_iter, tol, normalize, use_weights, msg)); - GRB_TRY(GrB_free(&c)); - ttrial[trial] = LAGraph_WallClockTime() - t1; - ttot += ttrial[trial]; - - printf("threads %2d trial %2d: %12.6f sec\n", - nthreads, trial, ttrial[trial]); - fprintf(stderr, "threads %2d trial %2d: %12.6f sec\n", - nthreads, trial, ttrial[trial]); + double t1 = LAGraph_WallClockTime () ; + LAGRAPH_TRY (LAGr_KatzCentrality (&c, &iters, G, alpha, beta, + max_iter, tol, normalize, use_weights, msg)) ; + GRB_TRY (GrB_free (&c)) ; + ttrial [trial] = LAGraph_WallClockTime () - t1 ; + ttot += ttrial [trial] ; + + printf ("threads %2d trial %2d: %12.6f sec\n", + nthreads, trial, ttrial [trial]) ; + fprintf (stderr, "threads %2d trial %2d: %12.6f sec\n", + nthreads, trial, ttrial [trial]) ; } - ttot = ttot / ntrials; - printf("Avg: KatzCentrality nthreads: %3d time: %12.6f matrix: %s\n", - nthreads, ttot, matrix_name); - fprintf(stderr, "Avg: KatzCentrality nthreads: %3d time: %12.6f matrix: %s\n", - nthreads, ttot, matrix_name); + ttot = ttot / ntrials ; + printf ( "Avg: KatzCentrality nthreads: %3d time: %12.6f sec" + " (%" PRId64 " iterations) matrix: %s\n", + nthreads, ttot, iters, matrix_name) ; + fprintf (stderr, "Avg: KatzCentrality nthreads: %3d time: %12.6f sec" + " (%" PRId64 " iterations) matrix: %s\n", + nthreads, ttot, iters, matrix_name) ; } - LG_FREE_ALL; - LAGRAPH_TRY(LAGraph_Finalize(msg)); - return (GrB_SUCCESS); + LG_FREE_ALL ; + LAGRAPH_TRY (LAGraph_Finalize (msg)) ; + return (GrB_SUCCESS) ; } From a50f3ccec6f6688c7c0836b651e4aec763deee09 Mon Sep 17 00:00:00 2001 From: Karan Bhalla Date: Sat, 4 Apr 2026 15:50:43 -0500 Subject: [PATCH 08/12] rework closeness centrality --- .../algorithm/LAGr_ClosenessCentrality.c | 114 +++++------------- .../benchmark/closenessCentrality_demo.c | 100 ++++++++------- experimental/test/test_ClosenessCentrality.c | 4 +- include/LAGraphX.h | 16 ++- 4 files changed, 101 insertions(+), 133 deletions(-) diff --git a/experimental/algorithm/LAGr_ClosenessCentrality.c b/experimental/algorithm/LAGr_ClosenessCentrality.c index 37fce08087..8637cb5c51 100644 --- a/experimental/algorithm/LAGr_ClosenessCentrality.c +++ b/experimental/algorithm/LAGr_ClosenessCentrality.c @@ -25,7 +25,6 @@ GrB_free(&D_APSP); \ GrB_free(&A_work); \ GrB_free(&x); \ - GrB_free(&Delta); \ LAGraph_Delete(&G_AT, NULL); \ LAGraph_Free((void **)&source_indices, NULL); \ } @@ -36,30 +35,25 @@ GrB_free(¢rality_vector); \ } -#include "LG_internal.h" #include - -typedef enum -{ - CC_BFS, // unweighted BFS (unit edge weights) - CC_SSSP, // delta-stepping SSSP (non-negative weights) - CC_BELLMAN_FORD, // Bellman-Ford (general weights, negative-cycle check) - CC_FLOYD_WARSHALL // Floyd-Warshall (FW) APSP -} cc_algo_t; +#include "LG_internal.h" //------------------------------------------------------------------------------ // LAGr_ClosenessCentrality //------------------------------------------------------------------------------ -int LAGr_ClosenessCentrality( +int LAGr_ClosenessCentrality +( // output: GrB_Vector *centrality, // input: LAGraph_Graph G, - GrB_Vector sources, // nodes to score; NULL or empty => all nodes - bool use_weights, // if true, use edge weights in shortest paths - bool use_floyd_warshall, // if true and sources==NULL, use APSP via FW - char *msg) + GrB_Vector sources, // nodes to score; NULL or empty => all nodes + bool use_weights, // if true, use edge weights in shortest paths + cc_algo_t algorithm, // shortest-path algorithm to use + GrB_Scalar Delta, // delta for SSSP; if NULL, derived from G->emin + char *msg +) { //-------------------------------------------------------------------------- @@ -78,7 +72,6 @@ int LAGr_ClosenessCentrality( GrB_Matrix A_work = NULL; // AT copy for G_AT LAGraph_Graph G_AT = NULL; // temporary graph wrapping AT (directed only) GrB_Vector x = NULL; // FW: dense all-zeros vector for row counting - GrB_Scalar Delta = NULL; // delta-stepping step size GrB_Index *source_indices = NULL; GrB_Index n = 0; GrB_Index source_count = 0; @@ -96,60 +89,11 @@ int LAGr_ClosenessCentrality( use_all_nodes = (source_count == 0); } - //-------------------------------------------------------------------------- - // select shortest-path algorithm - //-------------------------------------------------------------------------- - - cc_algo_t algo; - double emin = -1; - - if (use_floyd_warshall) - { - LG_ASSERT_MSG(use_all_nodes, GrB_INVALID_VALUE, - "use_floyd_warshall requires sources to be NULL or empty"); - - if (!use_weights) - { - // Silently downgrade to BFS for unweighted graphs - // TODO: revisit this? make it more explicit to user? - algo = CC_BFS; - } - else - { - // Reject graphs with known or possible negative edges. - if (G->emin != NULL) - { - double fw_emin = 0; - GRB_TRY(GrB_Scalar_extractElement_FP64(&fw_emin, - G->emin)); - LG_ASSERT_MSG(fw_emin >= 0, GrB_INVALID_VALUE, - "Floyd-Warshall does not support negative edge" - " weights"); - } - algo = CC_FLOYD_WARSHALL; - } - } - else if (!use_weights) - { - // Unweighted: BFS is the most efficient choice. - algo = CC_BFS; - } - else - { - LG_ASSERT_MSG(G->emin != NULL && - (G->emin_state == LAGraph_VALUE || - G->emin_state == LAGraph_BOUND), - LAGRAPH_NOT_CACHED, "G->emin is required"); - GRB_TRY(GrB_Scalar_extractElement_FP64(&emin, G->emin)); - - // Use SSSP if no negative edges, Bellman-Ford otherwise - algo = (emin >= 0 && G->emin_state == LAGraph_VALUE) - ? CC_SSSP - : CC_BELLMAN_FORD; - } + cc_algo_t algo = algorithm; // set up G_AT: graph over the incoming adjacency. Running any shortest-path - // algorithm from v on G_AT traverses incoming edges, giving distances to v in G. + // algorithm from v on G_AT traverses incoming edges, giving distances to + // v in G. bool is_directed = (G->kind != LAGraph_ADJACENCY_UNDIRECTED && G->is_symmetric_structure != LAGraph_TRUE); @@ -179,7 +123,7 @@ int LAGr_ClosenessCentrality( { LG_TRY(LAGraph_Malloc((void **)&source_indices, source_count, sizeof(GrB_Index), msg)); - GRB_TRY(GrB_Vector_extractTuples_UINT64(source_indices, NULL, + GRB_TRY(GrB_Vector_extractTuples_UINT64 (source_indices, NULL, &source_count, sources)); for (GrB_Index k = 0; k < source_count; k++) { @@ -222,18 +166,19 @@ int LAGr_ClosenessCentrality( GrB_PLUS_MONOID_FP64, D_APSP, NULL)); // reachable_counts[v] = number of non-zeros in row v of D_APSP. - // Multiply D_APSP by a dense all-zeros vector with LAGraph_plus_one_fp64: - // TODO: revisit? - GRB_TRY(GrB_Vector_new(&x, GrB_FP64, n)); - GRB_TRY(GrB_assign(x, NULL, NULL, (double)0, GrB_ALL, n, NULL)); - GRB_TRY(GrB_Vector_new(&reachable_counts, GrB_FP64, n)); + // Multiply D_APSP by a dense all-zeros vector with + // LAGraph_plus_one_fp64: + // TODO: revisit + GRB_TRY(GrB_Vector_new(&x, GrB_FP64, n)); + GRB_TRY(GrB_assign(x, NULL, NULL, (double)0, GrB_ALL, n, NULL)); + GRB_TRY(GrB_Vector_new(&reachable_counts, GrB_FP64, n)); GRB_TRY(GrB_mxv(reachable_counts, NULL, NULL, LAGraph_plus_one_fp64, - D_APSP, x, NULL)); - GRB_TRY(GrB_free(&D_APSP)); - - // centrality[v] = R(v) / dist_sums[v]. + D_APSP, x, NULL)); + GRB_TRY(GrB_free(&D_APSP)); + + // centrality[v] = R(v) / dist_sums[v]. GRB_TRY(GrB_eWiseMult(centrality_vector, NULL, NULL, GrB_DIV_FP64, - reachable_counts, dist_sums, NULL)); + reachable_counts, dist_sums, NULL)); (*centrality) = centrality_vector; LG_FREE_WORK; @@ -242,8 +187,6 @@ int LAGr_ClosenessCentrality( if (algo == CC_SSSP) { - GRB_TRY(GrB_Scalar_new(&Delta, GrB_FP64)); - GRB_TRY(GrB_Scalar_setElement_FP64(Delta, emin > 0 ? emin : 1.0)); // TODO: how to set delta properly? GRB_TRY(GrB_Scalar_new(&inf_scalar, GrB_FP64)); GRB_TRY(GrB_Scalar_setElement_FP64(inf_scalar, (double)INFINITY)); } @@ -268,7 +211,7 @@ int LAGr_ClosenessCentrality( { // IMPORTANT: LAGr_BreadthFirstSearch sets *level = NULL without // freeing the prior handle. We must free bfs_level before every - // call to avoid a memory leak. + // call to avoid a memory leak. GRB_TRY(GrB_free(&bfs_level)); LG_TRY(LAGr_BreadthFirstSearch(&bfs_level, NULL, G_trav, node_to_score, msg)); @@ -313,7 +256,7 @@ int LAGr_ClosenessCentrality( } //---------------------------------------------------------------------- - // Bellman-Ford + // Bellman-Ford //---------------------------------------------------------------------- else // CC_BELLMAN_FORD @@ -324,9 +267,10 @@ int LAGr_ClosenessCentrality( G_trav->A, node_to_score); if (info == GrB_NO_VALUE) { + // TODO: revisit // Negative-weight cycle reachable from this node; - // TODO: how to deal with this? - // For now, set centrality to NaN to indicate an invalid score, and continue. + // For now, set centrality to NaN to indicate an invalid + // score, and continue. GRB_TRY(GrB_Vector_setElement(centrality_vector, (double)NAN, node_to_score)); continue; diff --git a/experimental/benchmark/closenessCentrality_demo.c b/experimental/benchmark/closenessCentrality_demo.c index 669cffb695..403f757339 100644 --- a/experimental/benchmark/closenessCentrality_demo.c +++ b/experimental/benchmark/closenessCentrality_demo.c @@ -24,6 +24,7 @@ { \ GrB_free (¢rality) ; \ GrB_free (&sources) ; \ + GrB_free (&Delta) ; \ LAGraph_Delete (&G, msg) ; \ } @@ -36,6 +37,7 @@ int main (int argc, char **argv) char msg [LAGRAPH_MSG_LEN] ; LAGraph_Graph G = NULL ; GrB_Vector centrality = NULL, sources = NULL ; + GrB_Scalar Delta = NULL ; bool burble = false ; demo_init (burble) ; @@ -45,31 +47,39 @@ int main (int argc, char **argv) //-------------------------------------------------------------------------- // Usage: - // closenessCentrality_demo - // [num_sources] [use_weights] [use_floyd_warshall] + // closenessCentrality_demo + // [num_sources] [use_weights] [delta] // // : required; path to .mtx file + // : required int; shortest-path algorithm: + // 0 = CC_BFS (unweighted BFS) + // 1 = CC_SSSP (delta-stepping SSSP) + // 2 = CC_BELLMAN_FORD (Bellman-Ford) + // 3 = CC_FLOYD_WARSHALL (all-pairs, no sources) // [num_sources] : optional; number of random source nodes to score // (0 or omitted => score all nodes) // [use_weights] : optional 0/1 (default 0); use edge weights - // [use_floyd_warshall] : optional 0/1 (default 0); use Floyd-Warshall APSP - // (only valid when num_sources is 0/omitted) + // [delta] : optional float; delta for CC_SSSP + // (ignored for other algorithms) - if (argc < 2 || argc > 5) + if (argc < 3 || argc > 6) { - printf ("Usage: %s " - " [num_sources] [use_weights] [use_floyd_warshall]\n", + printf ("Usage: %s " + " [num_sources] [use_weights] [delta]\n" + " algorithm: 0=CC_BFS 1=CC_SSSP 2=CC_BELLMAN_FORD" + " 3=CC_FLOYD_WARSHALL\n", argv [0]) ; return (GrB_INVALID_VALUE) ; } - bool use_weights = false ; - bool use_floyd_warshall = false ; - int num_sources = 0 ; + cc_algo_t algorithm = (cc_algo_t) atoi (argv [2]) ; + bool use_weights = false ; + double delta_val = -1 ; + int num_sources = 0 ; - if (argc > 2) num_sources = atoi (argv [2]) ; - if (argc > 3) use_weights = (atoi (argv [3]) != 0) ; - if (argc > 4) use_floyd_warshall = (atoi (argv [4]) != 0) ; + if (argc > 3) num_sources = atoi (argv [3]) ; + if (argc > 4) use_weights = (atoi (argv [4]) != 0) ; + if (argc > 5) delta_val = strtod (argv [5], NULL) ; //-------------------------------------------------------------------------- // read in the graph @@ -90,11 +100,16 @@ int main (int argc, char **argv) LAGRAPH_TRY (LAGraph_Cached_EMin (G, msg)) ; } + GrB_Index nvals ; + GRB_TRY (GrB_Matrix_nvals (&nvals, G->A)) ; + t = LAGraph_WallClockTime () - t ; printf ("Time to read the graph: %g sec\n", t) ; + printf ("Nodes: %" PRIu64 " Edges: %" PRIu64 "\n", + (uint64_t) n, (uint64_t) nvals) ; printf ("\n==========================\nThe input graph matrix G:\n") ; - LAGRAPH_TRY (LAGraph_Graph_Print (G, LAGraph_SHORT, stdout, msg)) ; + // LAGRAPH_TRY (LAGraph_Graph_Print (G, LAGraph_SHORT, stdout, msg)) ; //-------------------------------------------------------------------------- // build optional source-node vector @@ -102,13 +117,6 @@ int main (int argc, char **argv) if (num_sources > 0) { - if (use_floyd_warshall) - { - printf ("Warning: use_floyd_warshall ignored when num_sources > 0;" - " falling back to per-node shortest paths.\n") ; - use_floyd_warshall = false ; - } - if ((uint64_t) num_sources >= n) { printf ("Error: num_sources (%" PRId32 ") must be less than" @@ -141,13 +149,19 @@ int main (int argc, char **argv) // compute closeness centrality //-------------------------------------------------------------------------- - printf ("\nCloseness params: use_weights=%d use_floyd_warshall=%d" + printf ("\nCloseness params: use_weights=%d algorithm=%d" " num_sources=%d\n\n", - (int) use_weights, (int) use_floyd_warshall, num_sources) ; + (int) use_weights, (int) algorithm, num_sources) ; + + if (algorithm == CC_SSSP && delta_val > 0) + { + GRB_TRY (GrB_Scalar_new (&Delta, GrB_FP64)) ; + GRB_TRY (GrB_Scalar_setElement_FP64 (Delta, delta_val)) ; + } t = LAGraph_WallClockTime () ; LAGRAPH_TRY (LAGr_ClosenessCentrality (¢rality, G, sources, - use_weights, use_floyd_warshall, + use_weights, algorithm, Delta, msg)) ; t = LAGraph_WallClockTime () - t ; printf ("Time for LAGr_ClosenessCentrality: %g sec\n", t) ; @@ -156,27 +170,27 @@ int main (int argc, char **argv) // print results //-------------------------------------------------------------------------- - GrB_Index nvals = 0 ; - GRB_TRY (GrB_Vector_nvals (&nvals, centrality)) ; - printf ("Number of scored nodes: %" PRIu64 "\n", (uint64_t) nvals) ; + GrB_Index scoredvals = 0 ; + GRB_TRY (GrB_Vector_nvals (&scoredvals, centrality)) ; + printf ("Number of scored nodes: %" PRIu64 "\n", (uint64_t) scoredvals) ; // print first few scores - GrB_Index print_limit = (n < 20) ? n : 20 ; - printf ("Closeness centrality (first %" PRIu64 " nodes):\n", - (uint64_t) print_limit) ; - for (GrB_Index i = 0 ; i < print_limit ; i++) - { - double score = 0 ; - GrB_Info info = GrB_Vector_extractElement_FP64 (&score, centrality, i) ; - if (info == GrB_SUCCESS) - { - printf (" node %" PRIu64 ": %g\n", (uint64_t) i, score) ; - } - else - { - printf (" node %" PRIu64 ": (unreachable)\n", (uint64_t) i) ; - } - } + // GrB_Index print_limit = (n < 20) ? n : 20 ; + // printf ("Closeness centrality (first %" PRIu64 " nodes):\n", + // (uint64_t) print_limit) ; + // for (GrB_Index i = 0 ; i < print_limit ; i++) + // { + // double score = 0 ; + // GrB_Info info = GrB_Vector_extractElement_FP64 (&score, centrality, i) ; + // if (info == GrB_SUCCESS) + // { + // printf (" node %" PRIu64 ": %g\n", (uint64_t) i, score) ; + // } + // else + // { + // printf (" node %" PRIu64 ": (unreachable)\n", (uint64_t) i) ; + // } + // } //-------------------------------------------------------------------------- // free everything and finish diff --git a/experimental/test/test_ClosenessCentrality.c b/experimental/test/test_ClosenessCentrality.c index 4dfe15fc70..f9d715b71f 100644 --- a/experimental/test/test_ClosenessCentrality.c +++ b/experimental/test/test_ClosenessCentrality.c @@ -111,7 +111,7 @@ void test_closeness_diamonds (void) double t = LAGraph_WallClockTime () ; OK (LAGr_ClosenessCentrality (¢rality, G, NULL, - false, false, msg)) ; + false, false, NULL, msg)) ; t = LAGraph_WallClockTime () - t ; printf (" Time for LAGr_ClosenessCentrality: %g sec\n", t) ; @@ -161,7 +161,7 @@ void test_closeness_karate (void) double t = LAGraph_WallClockTime () ; OK (LAGr_ClosenessCentrality (¢rality, G, NULL, - false, false, msg)) ; + false, false, NULL, msg)) ; t = LAGraph_WallClockTime () - t ; printf (" Time for LAGr_ClosenessCentrality: %g sec\n", t) ; diff --git a/include/LAGraphX.h b/include/LAGraphX.h index c01d220754..2f70a99236 100644 --- a/include/LAGraphX.h +++ b/include/LAGraphX.h @@ -1321,6 +1321,15 @@ int LAGr_EdgeBetweennessCentrality // Closeness centrality //------------------------------------------------------------------------------ +typedef enum +{ + CC_BFS, // unweighted BFS (unit edge weights) + CC_SSSP, // delta-stepping SSSP (non-negative weights) + CC_BELLMAN_FORD, // Bellman-Ford (general weights, negative-cycle check) + CC_FLOYD_WARSHALL // Floyd-Warshall (FW) APSP + // CC_DEFAULT, select algorithm automatically +} cc_algo_t ; + LAGRAPHX_PUBLIC int LAGr_ClosenessCentrality ( @@ -1328,9 +1337,10 @@ int LAGr_ClosenessCentrality GrB_Vector *centrality, // input: LAGraph_Graph G, - GrB_Vector sources, // nodes to score; NULL or empty => all nodes - bool use_weights, // if true, use edge weights in shortest paths - bool use_floyd_warshall, // if true and sources==NULL, use FW APSP + GrB_Vector sources, // nodes to score; NULL or empty => all nodes + bool use_weights, // if true, use edge weights in shortest paths + cc_algo_t algorithm, // shortest-path algorithm to use + GrB_Scalar Delta, // delta for SSSP; if NULL, derived from G->emin char *msg ) ; From 102604b3b8b313cd50a4f507186324119dc7048a Mon Sep 17 00:00:00 2001 From: Karan Bhalla Date: Sat, 13 Jun 2026 17:51:08 -0500 Subject: [PATCH 09/12] add paper --- papers/BHALLA-PRIMARY-2026.pdf | Bin 0 -> 266638 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 papers/BHALLA-PRIMARY-2026.pdf diff --git a/papers/BHALLA-PRIMARY-2026.pdf b/papers/BHALLA-PRIMARY-2026.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9ce36e3a5ac9496fe18c9044f618febc513eee7c GIT binary patch literal 266638 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 literal 0 HcmV?d00001 From aee765b1d29d06686b0814924206e6ca038015ec Mon Sep 17 00:00:00 2001 From: Karan Bhalla Date: Sat, 13 Jun 2026 22:11:37 -0500 Subject: [PATCH 10/12] add more testing for katz centrality --- experimental/algorithm/LAGr_KatzCentrality.c | 60 +++++---- experimental/test/test_KatzCentrality.c | 128 ++++++++++++++++++- 2 files changed, 159 insertions(+), 29 deletions(-) diff --git a/experimental/algorithm/LAGr_KatzCentrality.c b/experimental/algorithm/LAGr_KatzCentrality.c index d306eb74f2..b4a1f64466 100644 --- a/experimental/algorithm/LAGr_KatzCentrality.c +++ b/experimental/algorithm/LAGr_KatzCentrality.c @@ -34,17 +34,17 @@ int LAGr_KatzCentrality ( // output: - GrB_Vector *centrality, - int64_t *iters, + GrB_Vector *centrality, + int64_t *iters, // input: - LAGraph_Graph G, - double alpha, - double beta, - int64_t max_iter, + LAGraph_Graph G, + double alpha, + double beta, + int64_t max_iter, double tol, bool normalize, - bool use_weights, // uses edge weights if true, otherwise treats all edges as weight 1 - char* msg + bool use_weights, // uses weights if true, else treats all weights as 1 + char *msg ) { //-------------------------------------------------------------------------- @@ -57,7 +57,7 @@ int LAGr_KatzCentrality LG_ASSERT (centrality != NULL && iters != NULL, GrB_NULL_POINTER) ; (*centrality) = NULL; - LG_TRY(LAGraph_CheckGraph(G, msg)); + LG_TRY (LAGraph_CheckGraph (G, msg)) ; GrB_Matrix AT; if (G->kind == LAGraph_ADJACENCY_UNDIRECTED || @@ -73,15 +73,17 @@ int LAGr_KatzCentrality // compute correct semiring based on whether edge weights are used // TODO: add FP32 support - GrB_Semiring semiring = use_weights ? GrB_PLUS_TIMES_SEMIRING_FP64 : GxB_PLUS_SECOND_FP64; + GrB_Semiring semiring = use_weights ? GrB_PLUS_TIMES_SEMIRING_FP64 + : GxB_PLUS_SECOND_FP64 ; if (use_weights) { // ensure min edge weight is available and nonnegative LG_TRY (LAGraph_Cached_EMin (G, msg)) ; - LG_ASSERT_MSG (G->emin != NULL && - (G->emin_state == LAGraph_VALUE || - G->emin_state == LAGraph_BOUND), + LG_ASSERT_MSG ( + G->emin != NULL && + (G->emin_state == LAGraph_VALUE || + G->emin_state == LAGraph_BOUND), LAGRAPH_NOT_CACHED, "G->emin is required") ; double emin = 0 ; @@ -93,22 +95,22 @@ int LAGr_KatzCentrality //-------------------------------------------------------------------------- // initializations //-------------------------------------------------------------------------- - + GRB_TRY (GrB_Matrix_nrows (&n, AT)) ; - GRB_TRY(GrB_Vector_new(&x, GrB_FP64, n)); - GRB_TRY(GrB_Vector_new(&x_prev, GrB_FP64, n)); - GRB_TRY(GrB_Vector_new(&b, GrB_FP64, n)); - GRB_TRY(GrB_Vector_new(&t, GrB_FP64, n)); + GRB_TRY (GrB_Vector_new (&x, GrB_FP64, n)) ; + GRB_TRY (GrB_Vector_new (&x_prev, GrB_FP64, n)) ; + GRB_TRY (GrB_Vector_new (&b, GrB_FP64, n)) ; + GRB_TRY (GrB_Vector_new (&t, GrB_FP64, n)) ; - GRB_TRY(GrB_assign(x, NULL, NULL, 0.0, GrB_ALL, n, NULL)); - GRB_TRY(GrB_assign(x_prev, NULL, NULL, 0.0, GrB_ALL, n, NULL)); - GRB_TRY(GrB_assign(b, NULL, NULL, beta, GrB_ALL, n, NULL)); + GRB_TRY (GrB_assign (x, NULL, NULL, 0.0, GrB_ALL, n, NULL)) ; + GRB_TRY (GrB_assign (x_prev, NULL, NULL, 0.0, GrB_ALL, n, NULL)) ; + GRB_TRY (GrB_assign (b, NULL, NULL, beta, GrB_ALL, n, NULL)) ; // first iteration is always done - double rdiff = 1 ; + double rdiff = 1 ; - // TODO: determine best way to stop + // TODO: determine best way to stop for ((*iters) = 0 ; ; (*iters)++) { // check for convergence failure @@ -116,7 +118,9 @@ int LAGr_KatzCentrality "katz centrality failed to converge in %" PRId64 " iterations", max_iter) ; // swap x and x_prev - GrB_Vector temp = x_prev ; x_prev = x ; x = temp ; + GrB_Vector temp = x_prev ; + x_prev = x ; + x = temp ; // x = A' * x_prev GRB_TRY (GrB_mxv (x, NULL, NULL, semiring, AT, x_prev, NULL)) ; @@ -126,13 +130,14 @@ int LAGr_KatzCentrality GRB_TRY (GrB_eWiseAdd (x, NULL, NULL, GrB_PLUS_FP64, x, b, NULL)) ; // t = x - x_prev - GRB_TRY (GrB_eWiseAdd (t, NULL, NULL, GrB_MINUS_FP64, x, x_prev, NULL)) ; + GRB_TRY (GrB_eWiseAdd (t, NULL, NULL, GrB_MINUS_FP64, x, x_prev, + NULL)) ; // t = abs (t) GRB_TRY (GrB_apply (t, NULL, NULL, GrB_ABS_FP64, t, NULL)) ; // rdiff = sum (t) GRB_TRY (GrB_reduce (&rdiff, NULL, GrB_PLUS_MONOID_FP64, t, NULL)) ; - if (rdiff < tol) break ; // TODO: revisit + if (rdiff < tol) break ; // TODO: revisit } // normalize using the L2 norm if flag is set @@ -146,7 +151,8 @@ int LAGr_KatzCentrality if (sumsq > 0) { - GRB_TRY (GrB_apply (x, NULL, NULL, GrB_DIV_FP64, x, sqrt(sumsq), NULL)) ; + GRB_TRY (GrB_apply (x, NULL, NULL, GrB_DIV_FP64, x, sqrt (sumsq), + NULL)) ; } } diff --git a/experimental/test/test_KatzCentrality.c b/experimental/test/test_KatzCentrality.c index 3db09d8c4b..c76d71868a 100644 --- a/experimental/test/test_KatzCentrality.c +++ b/experimental/test/test_KatzCentrality.c @@ -46,6 +46,18 @@ double diamonds_katz [8] = { 1.1352000000, 1.1352000000, 1.2270400000 } ; +double ldbc_directed_example_katz [10] = { + 1.1016778324, 1.0000000000, 1.1563813542, 1.2611415319, 1.1347459707, + 1.0000000000, 1.0000000000, 1.0356314652, 1.0000000000, 1.0721318253 +} ; + +double rand_katz [20] = { + 0.1835353701, 0.2018889071, 0.2018889071, 0.2018889071, 0.2018889071, + 0.2239131515, 0.2239131515, 0.2239131515, 0.2283180003, 0.2283180003, + 0.2283180003, 0.2291989701, 0.2291989701, 0.2291989701, 0.2293751641, + 0.2293751641, 0.2293751641, 0.2294104029, 0.2294104029, 0.2752924834 +} ; + //------------------------------------------------------------------------------ // difference: compare Katz vector result with reference values //------------------------------------------------------------------------------ @@ -86,7 +98,7 @@ void test_katz_diamonds (void) GrB_Vector centrality = NULL ; int64_t niters = 0 ; - // Create diamonds graph + // Create diamonds graph (directed) snprintf (filename, LEN, LG_DATA_DIR "%s", "diamonds.mtx") ; FILE *f = fopen (filename, "r") ; TEST_CHECK (f != NULL) ; @@ -141,7 +153,7 @@ void test_katz_karate (void) GrB_Vector centrality = NULL ; int64_t niters = 0 ; - // Create karate graph + // Create karate graph (undirected), treated as unweighted snprintf (filename, LEN, LG_DATA_DIR "%s", "karate.mtx") ; FILE *f = fopen (filename, "r") ; TEST_CHECK (f != NULL) ; @@ -188,6 +200,116 @@ void test_katz_karate (void) #endif } +void test_katz_ldbc_directed_example (void) +{ +#if LAGRAPH_SUITESPARSE + LAGraph_Graph G = NULL ; + OK (LAGraph_Init (msg)) ; + GrB_Matrix A = NULL ; + GrB_Vector centrality = NULL ; + int64_t niters = 0 ; + + // Create ldbc-directed-example graph (weighted and directed) + snprintf (filename, LEN, LG_DATA_DIR "%s", "ldbc-directed-example.mtx") ; + FILE *f = fopen (filename, "r") ; + TEST_CHECK (f != NULL) ; + OK (LAGraph_MMRead (&A, f, msg)) ; + OK (fclose (f)) ; + OK (LAGraph_New (&G, &A, LAGraph_ADJACENCY_DIRECTED, msg)) ; + TEST_CHECK (A == NULL) ; + + // Check that AT is cached + int result = LAGraph_Cached_AT (G, msg) ; + TEST_CHECK (result == GrB_SUCCESS || result == LAGRAPH_CACHE_NOT_NEEDED) ; + + // Print graph stats + uint64_t n, nedges ; + OK (GrB_Matrix_nrows(&n, G->A)) ; + OK (GrB_Matrix_nvals(&nedges, G->A)) ; + printf ("\n\nldbc directed example graph (%" PRIu64 " nodes, %" PRIu64 " edges):\n", n, nedges) ; + + double alpha = 0.1 ; + + // Compute katz centrality with edge weights considered + double t = LAGraph_WallClockTime() ; + OK (LAGr_KatzCentrality (¢rality, &niters, G, alpha, 1.0, 1000, 1e-6, false, true, msg)) ; + t = LAGraph_WallClockTime() - t ; + printf (" Time for LAGr_KatzCentrality: %g sec\n", t) ; + printf (" Iterations for LAGr_KatzCentrality: %" PRId64 "\n", niters) ; + + // Compare with reference values. + GrB_Index cn = 0, cnvals = 0 ; + OK (GrB_Vector_size (&cn, centrality)) ; + OK (GrB_Vector_nvals (&cnvals, centrality)) ; + TEST_CHECK (cn == n) ; + TEST_CHECK (cnvals == n) ; + + double err = difference (centrality, ldbc_directed_example_katz, 10) ; + printf (" ldbc-directed-example: err: %e\n", err) ; + TEST_CHECK (err < 1e-4) ; + + OK (GrB_free (¢rality)) ; + OK (LAGraph_Delete (&G, msg)) ; + OK (LAGraph_Finalize (msg)) ; + +#endif +} + +void test_katz_rand (void) +{ +#if LAGRAPH_SUITESPARSE + LAGraph_Graph G = NULL ; + OK (LAGraph_Init (msg)) ; + GrB_Matrix A = NULL ; + GrB_Vector centrality = NULL ; + int64_t niters = 0 ; + + // Create rand graph (directed), treated as unweighted + snprintf (filename, LEN, LG_DATA_DIR "%s", "rand.mtx") ; + FILE *f = fopen (filename, "r") ; + TEST_CHECK (f != NULL) ; + OK (LAGraph_MMRead (&A, f, msg)) ; + OK (fclose (f)) ; + OK (LAGraph_New (&G, &A, LAGraph_ADJACENCY_DIRECTED, msg)) ; + TEST_CHECK (A == NULL) ; + + // Check that AT is cached + int result = LAGraph_Cached_AT (G, msg) ; + TEST_CHECK (result == GrB_SUCCESS || result == LAGRAPH_CACHE_NOT_NEEDED) ; + + // Print graph stats + uint64_t n, nedges ; + OK (GrB_Matrix_nrows(&n, G->A)) ; + OK (GrB_Matrix_nvals(&nedges, G->A)) ; + printf ("\n\nrand graph (%" PRIu64 " nodes, %" PRIu64 " edges):\n", n, nedges) ; + + double alpha = 0.1 ; + + // normalize results + double t = LAGraph_WallClockTime() ; + OK (LAGr_KatzCentrality (¢rality, &niters, G, alpha, 1.0, 1000, 1e-6, true, false, msg)) ; + t = LAGraph_WallClockTime() - t ; + printf (" Time for LAGr_KatzCentrality: %g sec\n", t) ; + printf (" Iterations for LAGr_KatzCentrality: %" PRId64 "\n", niters) ; + + // Compare with reference values. + GrB_Index cn = 0, cnvals = 0 ; + OK (GrB_Vector_size (&cn, centrality)) ; + OK (GrB_Vector_nvals (&cnvals, centrality)) ; + TEST_CHECK (cn == n) ; + TEST_CHECK (cnvals == n) ; + + double err = difference (centrality, rand_katz, 20) ; + printf (" rand: err: %e\n", err) ; + TEST_CHECK (err < 1e-4) ; + + OK (GrB_free (¢rality)) ; + OK (LAGraph_Delete (&G, msg)) ; + OK (LAGraph_Finalize (msg)) ; + +#endif +} + //------------------------------------------------------------------------------ // list of tests @@ -196,5 +318,7 @@ void test_katz_karate (void) TEST_LIST = { {"test_katz_diamonds", test_katz_diamonds}, {"test_katz_karate", test_katz_karate}, + {"test_katz_ldbc_directed_example", test_katz_ldbc_directed_example}, + {"test_katz_rand", test_katz_rand}, {NULL, NULL} } ; From 83622cbebdad095e4a8be839a0b9e73b149aac1f Mon Sep 17 00:00:00 2001 From: Karan Bhalla Date: Sun, 14 Jun 2026 21:45:28 -0500 Subject: [PATCH 11/12] add more testing for closeness --- .../algorithm/LAGr_ClosenessCentrality.c | 49 ++-- experimental/algorithm/LAGraph_FW.c | 55 ++--- experimental/test/test_ClosenessCentrality.c | 233 +++++++++++++++++- 3 files changed, 262 insertions(+), 75 deletions(-) diff --git a/experimental/algorithm/LAGr_ClosenessCentrality.c b/experimental/algorithm/LAGr_ClosenessCentrality.c index 8637cb5c51..409a977ca3 100644 --- a/experimental/algorithm/LAGr_ClosenessCentrality.c +++ b/experimental/algorithm/LAGr_ClosenessCentrality.c @@ -42,18 +42,16 @@ // LAGr_ClosenessCentrality //------------------------------------------------------------------------------ -int LAGr_ClosenessCentrality -( +int LAGr_ClosenessCentrality( // output: GrB_Vector *centrality, // input: LAGraph_Graph G, - GrB_Vector sources, // nodes to score; NULL or empty => all nodes - bool use_weights, // if true, use edge weights in shortest paths - cc_algo_t algorithm, // shortest-path algorithm to use - GrB_Scalar Delta, // delta for SSSP; if NULL, derived from G->emin - char *msg -) + GrB_Vector sources, // nodes to score; NULL or empty => all nodes + bool use_weights, // if true, use edge weights in shortest paths + cc_algo_t algorithm, // shortest-path algorithm to use + GrB_Scalar Delta, // delta for SSSP; if NULL, derived from G->emin + char *msg) { //-------------------------------------------------------------------------- @@ -123,8 +121,8 @@ int LAGr_ClosenessCentrality { LG_TRY(LAGraph_Malloc((void **)&source_indices, source_count, sizeof(GrB_Index), msg)); - GRB_TRY(GrB_Vector_extractTuples_UINT64 (source_indices, NULL, - &source_count, sources)); + GRB_TRY(GrB_Vector_extractTuples_UINT64(source_indices, NULL, + &source_count, sources)); for (GrB_Index k = 0; k < source_count; k++) { LG_ASSERT(source_indices[k] < n, GrB_INVALID_INDEX); @@ -135,17 +133,7 @@ int LAGr_ClosenessCentrality source_count = n; } - //-------------------------------------------------------------------------- - // allocate output vector - //-------------------------------------------------------------------------- - GRB_TRY(GrB_Vector_new(¢rality_vector, GrB_FP64, n)); - if (use_all_nodes) - { - // Dense output: isolated nodes keep score 0. - GRB_TRY(GrB_assign(centrality_vector, NULL, NULL, - 0.0, GrB_ALL, n, NULL)); - } //========================================================================== // Floyd-Warshall path @@ -165,26 +153,32 @@ int LAGr_ClosenessCentrality GRB_TRY(GrB_reduce(dist_sums, NULL, NULL, GrB_PLUS_MONOID_FP64, D_APSP, NULL)); - // reachable_counts[v] = number of non-zeros in row v of D_APSP. - // Multiply D_APSP by a dense all-zeros vector with - // LAGraph_plus_one_fp64: - // TODO: revisit + // reachable_counts[v] = number of reachable nodes from v (excluding self). + // Uses plus-one semiring to count structural non-zeros per row. GRB_TRY(GrB_Vector_new(&x, GrB_FP64, n)); GRB_TRY(GrB_assign(x, NULL, NULL, (double)0, GrB_ALL, n, NULL)); GRB_TRY(GrB_Vector_new(&reachable_counts, GrB_FP64, n)); GRB_TRY(GrB_mxv(reachable_counts, NULL, NULL, LAGraph_plus_one_fp64, - D_APSP, x, NULL)); + D_APSP, x, NULL)); GRB_TRY(GrB_free(&D_APSP)); // centrality[v] = R(v) / dist_sums[v]. GRB_TRY(GrB_eWiseMult(centrality_vector, NULL, NULL, GrB_DIV_FP64, - reachable_counts, dist_sums, NULL)); + reachable_counts, dist_sums, NULL)); (*centrality) = centrality_vector; LG_FREE_WORK; return GrB_SUCCESS; } + // allocate output vector + if (use_all_nodes) + { + // Dense output: isolated nodes keep score 0. + GRB_TRY(GrB_assign(centrality_vector, NULL, NULL, + 0.0, GrB_ALL, n, NULL)); + } + if (algo == CC_SSSP) { GRB_TRY(GrB_Scalar_new(&inf_scalar, GrB_FP64)); @@ -269,8 +263,7 @@ int LAGr_ClosenessCentrality { // TODO: revisit // Negative-weight cycle reachable from this node; - // For now, set centrality to NaN to indicate an invalid - // score, and continue. + // Set centrality to NaN to indicate an invalid score, and continue. GRB_TRY(GrB_Vector_setElement(centrality_vector, (double)NAN, node_to_score)); continue; diff --git a/experimental/algorithm/LAGraph_FW.c b/experimental/algorithm/LAGraph_FW.c index 05f971a048..2e20151b28 100644 --- a/experimental/algorithm/LAGraph_FW.c +++ b/experimental/algorithm/LAGraph_FW.c @@ -3,11 +3,10 @@ //------------------------------------------------------------------------------ // The input is a square unsymmetric matrix G, for a directed graph. G can be -// of any type. If it is real (float or double), a 64-bit integer, or an -// unsigned 32-bit integer, then the output is of type GrB_FP64. Otherwise, -// the output is of type GrB_INT32. - -// TODO consider giving the user control over the data type of D to use. +// of any type. The output is always of type GrB_FP64, regardless of the input +// type, since shortest path distances are naturally floating point and callers +// such as LAGr_ClosenessCentrality require FP64 output. +// TODO: revisit in future; consider giving the user control over the data type of D to use. // G(i,j) is the edge weight for edge (i,j). D(i,j) on output is the length of // the shortest path from node i to j, if the entry is present. If D(i,j) is @@ -36,7 +35,7 @@ GrB_Info LAGraph_FW ( const GrB_Matrix G, // input graph, with edge weights GrB_Matrix *D, // output graph, created on output - GrB_Type *D_type // type of D + GrB_Type *D_type // type of D (always GrB_FP64) ) { GrB_Info info ; @@ -50,43 +49,31 @@ GrB_Info LAGraph_FW (*D) = NULL ; (*D_type) = NULL ; - // determine the type of the input and output graphs - GrB_Type gtype, otype ; - GrB_BinaryOp op ; - GrB_UnaryOp idop ; - GrB_Semiring semiring ; - GRB_TRY (GxB_Matrix_type (>ype, G)) ; - - if (gtype == GrB_FP64 || gtype == GrB_FP32 || - gtype == GrB_INT64 || gtype == GrB_UINT64 || - gtype == GrB_UINT32) - { - otype = GrB_FP64 ; - semiring = GxB_MIN_PLUS_FP64 ; - op = GrB_MIN_FP64 ; - idop = GrB_IDENTITY_FP64 ; - } - else - { - otype = GrB_INT32 ; - semiring = GxB_MIN_PLUS_INT32 ; - op = GrB_MIN_INT32 ; - idop = GrB_IDENTITY_INT32 ; - } + // output is always FP64 + GrB_BinaryOp op = GrB_MIN_FP64 ; + GrB_UnaryOp idop = GrB_IDENTITY_FP64 ; + GrB_Semiring semiring = GxB_MIN_PLUS_FP64 ; GrB_Index n, ncols ; GRB_TRY (GrB_Matrix_nrows (&n, G)) ; GRB_TRY (GrB_Matrix_ncols (&ncols, G)) ; LG_ASSERT (n == ncols, GrB_INVALID_VALUE) ; - (*D_type) = otype ; - GRB_TRY (GrB_Matrix_new (&D_matrix, otype, n, n)) ; + (*D_type) = GrB_FP64 ; + GRB_TRY (GrB_Matrix_new (&D_matrix, GrB_FP64, n, n)) ; GRB_TRY (LG_SET_FORMAT_HINT (D_matrix, LG_BITMAP)) ; - GRB_TRY (GrB_Matrix_new (&A, otype, n, 1)) ; - GRB_TRY (GrB_Matrix_new (&B, otype, 1, n)) ; + GRB_TRY (GrB_Matrix_new (&A, GrB_FP64, n, 1)) ; + GRB_TRY (GrB_Matrix_new (&B, GrB_FP64, 1, n)) ; + // copy G into D, casting to FP64 GRB_TRY (GrB_apply (D_matrix, GrB_NULL, GrB_NULL, idop, G, GrB_NULL)) ; + // Set D(i,i) = 0 for all i. This overrides any self-edge weights in G + for (GrB_Index i = 0 ; i < n ; i++) + { + GRB_TRY (GrB_Matrix_setElement_FP64 (D_matrix, 0.0, i, i)) ; + } + for (GrB_Index k = 0 ; k < n ; k++) { // A = D(:,k), the kth column @@ -95,7 +82,7 @@ GrB_Info LAGraph_FW // B = D(k,:), the kth row GRB_TRY (GrB_extract (B, GrB_NULL, GrB_NULL, D_matrix, &k, 1, GrB_ALL, n, GrB_NULL)) ; - // D = min (D,A*B) with "*" being the min-plus semiring + // D = min (D, A*B) using the min-plus semiring GRB_TRY (GrB_mxm (D_matrix, GrB_NULL, op, semiring, A, B, GrB_NULL)) ; } diff --git a/experimental/test/test_ClosenessCentrality.c b/experimental/test/test_ClosenessCentrality.c index f9d715b71f..0d8df400b2 100644 --- a/experimental/test/test_ClosenessCentrality.c +++ b/experimental/test/test_ClosenessCentrality.c @@ -32,12 +32,10 @@ char filename [LEN+1] ; // note: WF_improved is set to FALSE for all tests //------------------------------------------------------------------------------ -// closeness_centrality(G) from NetworkX for diamonds.mtx (directed) double diamonds_closeness[8] = { 0.0, 1.0, 1.0, 1.0, 0.8, 0.5, 0.5, 0.4117647058823529 } ; -// closeness_centrality(G) from NetworkX for karate.mtx (undirected) double karate_closeness[34] = { 0.5689655172413793, 0.4852941176470588, 0.559322033898305, 0.4647887323943662, 0.3793103448275862, 0.38372093023255816, 0.38372093023255816, 0.44, @@ -50,6 +48,12 @@ double karate_closeness[34] = { 0.515625, 0.55 } ; +double ldbc_directed_example_closeness[10] = { + 1.6891891892, 0.0000000000, 1.5151515152, 1.3937282230, + 1.8115942029, 0.0000000000, 0.0000000000, 3.2258064516, + 0.0000000000, 1.1928429423 +} ; + //------------------------------------------------------------------------------ // difference: compare closeness vector result with reference values //------------------------------------------------------------------------------ @@ -81,10 +85,9 @@ double difference (GrB_Vector c, double *reference_c, GrB_Index n) } //------------------------------------------------------------------------------ -// test_closeness_diamonds: directed graph, unweighted (BFS), all sources +// directed and unweighted graph, BFS, all sources //------------------------------------------------------------------------------ - -void test_closeness_diamonds (void) +void test_closeness_diamonds_bfs (void) { #if LAGRAPH_SUITESPARSE LAGraph_Graph G = NULL ; @@ -111,7 +114,7 @@ void test_closeness_diamonds (void) double t = LAGraph_WallClockTime () ; OK (LAGr_ClosenessCentrality (¢rality, G, NULL, - false, false, NULL, msg)) ; + false, CC_BFS, NULL, msg)) ; t = LAGraph_WallClockTime () - t ; printf (" Time for LAGr_ClosenessCentrality: %g sec\n", t) ; @@ -131,10 +134,9 @@ void test_closeness_diamonds (void) } //------------------------------------------------------------------------------ -// test_closeness_karate: undirected graph, unweighted (BFS), all sources +// undirected and unweighted graph, BFS, all sources //------------------------------------------------------------------------------ - -void test_closeness_karate (void) +void test_closeness_karate_bfs (void) { #if LAGRAPH_SUITESPARSE LAGraph_Graph G = NULL ; @@ -161,7 +163,7 @@ void test_closeness_karate (void) double t = LAGraph_WallClockTime () ; OK (LAGr_ClosenessCentrality (¢rality, G, NULL, - false, false, NULL, msg)) ; + false, CC_BFS, NULL, msg)) ; t = LAGraph_WallClockTime () - t ; printf (" Time for LAGr_ClosenessCentrality: %g sec\n", t) ; @@ -181,11 +183,216 @@ void test_closeness_karate (void) } //------------------------------------------------------------------------------ -// list of tests +// undirected and unweighted graph, Floyd-Warshall, all sources +//------------------------------------------------------------------------------ +void test_closeness_karate_fw (void) +{ +#if LAGRAPH_SUITESPARSE + LAGraph_Graph G = NULL ; + OK (LAGraph_Init (msg)) ; + GrB_Matrix A = NULL ; + GrB_Vector centrality = NULL ; + + snprintf (filename, LEN, LG_DATA_DIR "%s", "karate.mtx") ; + FILE *f = fopen (filename, "r") ; + TEST_CHECK (f != NULL) ; + OK (LAGraph_MMRead (&A, f, msg)) ; + OK (fclose (f)) ; + OK (LAGraph_New (&G, &A, LAGraph_ADJACENCY_UNDIRECTED, msg)) ; + TEST_CHECK (A == NULL) ; + + int result = LAGraph_Cached_AT (G, msg) ; + TEST_CHECK (result == GrB_SUCCESS || result == LAGRAPH_CACHE_NOT_NEEDED) ; + + uint64_t n, nedges ; + OK (GrB_Matrix_nrows (&n, G->A)) ; + OK (GrB_Matrix_nvals (&nedges, G->A)) ; + printf ("\n\nKarate graph (%" PRIu64 " nodes, %" PRIu64 " edges):\n", + n, nedges) ; + + double t = LAGraph_WallClockTime () ; + OK (LAGr_ClosenessCentrality (¢rality, G, NULL, + false, CC_FLOYD_WARSHALL, NULL, msg)) ; + t = LAGraph_WallClockTime () - t ; + printf (" Time for LAGr_ClosenessCentrality: %g sec\n", t) ; + + GrB_Index cn = 0, cnvals = 0 ; + OK (GrB_Vector_size (&cn, centrality)) ; + OK (GrB_Vector_nvals (&cnvals, centrality)) ; + TEST_CHECK (cn == n) ; + + double err = difference (centrality, karate_closeness, 34) ; + printf (" karate: err: %e\n", err) ; + TEST_CHECK (err < 1e-4) ; + + OK (GrB_free (¢rality)) ; + OK (LAGraph_Delete (&G, msg)) ; + OK (LAGraph_Finalize (msg)) ; +#endif +} + +//------------------------------------------------------------------------------ +// directed and weighted graph, Floyd-Warshall, all sources +//------------------------------------------------------------------------------ +void test_closeness_ldbc_directed_example_fw (void) +{ +#if LAGRAPH_SUITESPARSE + LAGraph_Graph G = NULL ; + OK (LAGraph_Init (msg)) ; + GrB_Matrix A = NULL ; + GrB_Vector centrality = NULL ; + + snprintf (filename, LEN, LG_DATA_DIR "%s", "ldbc-directed-example.mtx") ; + FILE *f = fopen (filename, "r") ; + TEST_CHECK (f != NULL) ; + OK (LAGraph_MMRead (&A, f, msg)) ; + OK (fclose (f)) ; + OK (LAGraph_New (&G, &A, LAGraph_ADJACENCY_DIRECTED, msg)) ; + TEST_CHECK (A == NULL) ; + + int result = LAGraph_Cached_AT (G, msg) ; + TEST_CHECK (result == GrB_SUCCESS || result == LAGRAPH_CACHE_NOT_NEEDED) ; + + uint64_t n, nedges ; + OK (GrB_Matrix_nrows (&n, G->A)) ; + OK (GrB_Matrix_nvals (&nedges, G->A)) ; + printf ("\n\nldbc directed example graph (%" PRIu64 " nodes, %" PRIu64 " edges):\n", + n, nedges) ; + + double t = LAGraph_WallClockTime () ; + OK (LAGr_ClosenessCentrality (¢rality, G, NULL, + true, CC_FLOYD_WARSHALL, NULL, msg)) ; + t = LAGraph_WallClockTime () - t ; + printf (" Time for LAGr_ClosenessCentrality: %g sec\n", t) ; + + GrB_Index cn = 0, cnvals = 0 ; + OK (GrB_Vector_size (&cn, centrality)) ; + OK (GrB_Vector_nvals (&cnvals, centrality)) ; + TEST_CHECK (cn == n) ; + + double err = difference (centrality, ldbc_directed_example_closeness, 10) ; + printf (" ldbc directed example: err: %e\n", err) ; + TEST_CHECK (err < 1e-4) ; + + OK (GrB_free (¢rality)) ; + OK (LAGraph_Delete (&G, msg)) ; + OK (LAGraph_Finalize (msg)) ; +#endif +} + +//------------------------------------------------------------------------------ +// directed and weighted graph, Bellman-Ford, all sources +//------------------------------------------------------------------------------ +void test_closeness_ldbc_directed_example_bf (void) +{ +#if LAGRAPH_SUITESPARSE + LAGraph_Graph G = NULL ; + OK (LAGraph_Init (msg)) ; + GrB_Matrix A = NULL ; + GrB_Vector centrality = NULL ; + + snprintf (filename, LEN, LG_DATA_DIR "%s", "ldbc-directed-example.mtx") ; + FILE *f = fopen (filename, "r") ; + TEST_CHECK (f != NULL) ; + OK (LAGraph_MMRead (&A, f, msg)) ; + OK (fclose (f)) ; + OK (LAGraph_New (&G, &A, LAGraph_ADJACENCY_DIRECTED, msg)) ; + TEST_CHECK (A == NULL) ; + + int result = LAGraph_Cached_AT (G, msg) ; + TEST_CHECK (result == GrB_SUCCESS || result == LAGRAPH_CACHE_NOT_NEEDED) ; + + uint64_t n, nedges ; + OK (GrB_Matrix_nrows (&n, G->A)) ; + OK (GrB_Matrix_nvals (&nedges, G->A)) ; + printf ("\n\nldbc directed example graph (%" PRIu64 " nodes, %" PRIu64 " edges):\n", + n, nedges) ; + + double t = LAGraph_WallClockTime () ; + OK (LAGr_ClosenessCentrality (¢rality, G, NULL, + true, CC_BELLMAN_FORD, NULL, msg)) ; + t = LAGraph_WallClockTime () - t ; + printf (" Time for LAGr_ClosenessCentrality: %g sec\n", t) ; + + GrB_Index cn = 0, cnvals = 0 ; + OK (GrB_Vector_size (&cn, centrality)) ; + OK (GrB_Vector_nvals (&cnvals, centrality)) ; + TEST_CHECK (cn == n) ; + + double err = difference (centrality, ldbc_directed_example_closeness, 10) ; + printf (" ldbc directed example: err: %e\n", err) ; + TEST_CHECK (err < 1e-4) ; + + OK (GrB_free (¢rality)) ; + OK (LAGraph_Delete (&G, msg)) ; + OK (LAGraph_Finalize (msg)) ; +#endif +} + +//------------------------------------------------------------------------------ +// directed and weighted graph, SSSP, all sources +//------------------------------------------------------------------------------ +void test_closeness_ldbc_directed_example_sssp (void) +{ +#if LAGRAPH_SUITESPARSE + LAGraph_Graph G = NULL ; + OK (LAGraph_Init (msg)) ; + GrB_Matrix A = NULL ; + GrB_Vector centrality = NULL ; + + snprintf (filename, LEN, LG_DATA_DIR "%s", "ldbc-directed-example.mtx") ; + FILE *f = fopen (filename, "r") ; + TEST_CHECK (f != NULL) ; + OK (LAGraph_MMRead (&A, f, msg)) ; + OK (fclose (f)) ; + OK (LAGraph_New (&G, &A, LAGraph_ADJACENCY_DIRECTED, msg)) ; + TEST_CHECK (A == NULL) ; + + int result = LAGraph_Cached_AT (G, msg) ; + TEST_CHECK (result == GrB_SUCCESS || result == LAGRAPH_CACHE_NOT_NEEDED) ; + + uint64_t n, nedges ; + OK (GrB_Matrix_nrows (&n, G->A)) ; + OK (GrB_Matrix_nvals (&nedges, G->A)) ; + printf ("\n\nldbc directed example graph (%" PRIu64 " nodes, %" PRIu64 " edges):\n", + n, nedges) ; + + GrB_Scalar Delta = NULL ; + OK (GrB_Scalar_new (&Delta, GrB_FP64)) ; + OK (GrB_Scalar_setElement_FP64 (Delta, 1.6)) ; + + double t = LAGraph_WallClockTime () ; + OK (LAGr_ClosenessCentrality (¢rality, G, NULL, + true, CC_SSSP, Delta, msg)) ; + t = LAGraph_WallClockTime () - t ; + printf (" Time for LAGr_ClosenessCentrality: %g sec\n", t) ; + + GrB_Index cn = 0, cnvals = 0 ; + OK (GrB_Vector_size (&cn, centrality)) ; + OK (GrB_Vector_nvals (&cnvals, centrality)) ; + TEST_CHECK (cn == n) ; + + double err = difference (centrality, ldbc_directed_example_closeness, 10) ; + printf (" ldbc directed example: err: %e\n", err) ; + TEST_CHECK (err < 1e-4) ; + + OK (GrB_free (&Delta)) ; + OK (GrB_free (¢rality)) ; + OK (LAGraph_Delete (&G, msg)) ; + OK (LAGraph_Finalize (msg)) ; +#endif +} + +//------------------------------------------------------------------------------ +// list of tests //------------------------------------------------------------------------------ TEST_LIST = { - {"test_closeness_diamonds", test_closeness_diamonds}, - {"test_closeness_karate", test_closeness_karate}, + {"test_closeness_diamonds_bfs", test_closeness_diamonds_bfs}, + {"test_closeness_karate_bfs", test_closeness_karate_bfs}, + {"test_closeness_karate_fw", test_closeness_karate_fw}, + {"test_closeness_ldbc_directed_example_fw", test_closeness_ldbc_directed_example_fw}, + {"test_closeness_ldbc_directed_example_bf", test_closeness_ldbc_directed_example_bf}, + {"test_closeness_ldbc_directed_example_sssp", test_closeness_ldbc_directed_example_sssp}, {NULL, NULL} } ; From 78b99c39e3d7d9e4a43c32c8ea2189f479db9ad3 Mon Sep 17 00:00:00 2001 From: Karan Bhalla Date: Sun, 14 Jun 2026 22:13:37 -0500 Subject: [PATCH 12/12] fix header declaration --- include/LAGraphX.h | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/include/LAGraphX.h b/include/LAGraphX.h index e574d9a659..5251699387 100644 --- a/include/LAGraphX.h +++ b/include/LAGraphX.h @@ -1341,21 +1341,8 @@ int LAGr_ClosenessCentrality bool use_weights, // if true, use edge weights in shortest paths cc_algo_t algorithm, // shortest-path algorithm to use GrB_Scalar Delta, // delta for SSSP; if NULL, derived from G->emin -// harmonic centrality (approximate via HLL sketches) -//------------------------------------------------------------------------------ - -LAGRAPHX_PUBLIC -int LAGr_HarmonicCentrality -( - // outputs: - GrB_Vector *scores, // FP64 harmonic centrality scores - GrB_Vector *reachable_nodes, // [optional] estimated reachable node count - // (pass NULL, not yet implemented) - // inputs: - const LAGraph_Graph G, // input graph - const GrB_Vector node_weights, // participating nodes and their weights char *msg -) ; +) ; //------------------------------------------------------------------------------ // Katz centrality @@ -1375,6 +1362,27 @@ int LAGr_KatzCentrality double tol, bool normalize, bool use_weights, + char *msg +) ; + +//------------------------------------------------------------------------------ +// harmonic centrality (approximate via HLL sketches) +//------------------------------------------------------------------------------ + +LAGRAPHX_PUBLIC +int LAGr_HarmonicCentrality +( + // outputs: + GrB_Vector *scores, // FP64 harmonic centrality scores + GrB_Vector *reachable_nodes, // [optional] estimated reachable node count + // (pass NULL, not yet implemented) + // inputs: + const LAGraph_Graph G, // input graph + const GrB_Vector node_weights, // participating nodes and their weights + char *msg +) ; + +//------------------------------------------------------------------------------ // harmonic centrality (exact via BFS) //------------------------------------------------------------------------------