#define LG_FREE_ALL GrB_free (&C) ;
#include "LG_internal.h"
#include "LAGraphX.h"
int LAGraph_KTruss (
GrB_Matrix *C_handle, LAGraph_Graph G, uint32_t k, char *msg
)
{
LG_CLEAR_MSG ;
GrB_Matrix C = NULL ;
LG_ASSERT (C_handle != NULL, GrB_NULL_POINTER) ;
(*C_handle) = NULL ;
LG_ASSERT_MSG (k >= 3, GrB_INVALID_VALUE, "k invalid") ;
LG_TRY (LAGraph_CheckGraph (G, msg)) ;
if (G->kind == LAGraph_ADJACENCY_UNDIRECTED ||
(G->kind == LAGraph_ADJACENCY_DIRECTED &&
G->is_symmetric_structure == LAGraph_TRUE))
{
;
}
else
{
LG_ASSERT_MSG (false, -1005, "G->A must be symmetric") ;
}
LG_ASSERT_MSG (G->nself_edges == 0, -1004, "G->nself_edges must be zero") ;
GrB_Index n ;
GrB_Matrix S = G->A ;
GRB_TRY (GrB_Matrix_nrows (&n, S)) ;
GRB_TRY (GrB_Matrix_new (&C, GrB_UINT32, n, n)) ;
GrB_Index nvals, nvals_last ;
GRB_TRY (GrB_Matrix_nvals (&nvals_last, S)) ;
while (true)
{
GRB_TRY (GrB_mxm (C, S, NULL, LAGraph_plus_one_uint32, S, S,
GrB_DESC_RST1)) ;
GRB_TRY (GrB_select (C, NULL, NULL, GrB_VALUEGE_UINT32, C, k-2, NULL)) ;
GRB_TRY (GrB_Matrix_nvals (&nvals, C)) ;
if (nvals == nvals_last)
{
(*C_handle) = C ;
return (GrB_SUCCESS) ;
}
nvals_last = nvals ;
S = C ;
}
}