#define LG_FREE_ALL \
{ \
GrB_free(&d) ; \
GrB_free(&dtmp) ; \
}
#include "LG_internal.h"
#include <LAGraphX.h>
GrB_Info LAGraph_BF_basic
(
GrB_Vector *pd_output, const GrB_Matrix A, const GrB_Index s )
{
GrB_Info info;
char *msg = NULL ;
GrB_Index nrows, ncols;
GrB_Vector d = NULL, dtmp = NULL;
LG_ASSERT (A != NULL && pd_output != NULL, GrB_NULL_POINTER) ;
*pd_output = NULL;
GRB_TRY (GrB_Matrix_nrows (&nrows, A)) ;
GRB_TRY (GrB_Matrix_ncols (&ncols, A)) ;
LG_ASSERT_MSG (nrows == ncols, -1002, "A must be square") ;
GrB_Index n = nrows; LG_ASSERT_MSG (s < n, GrB_INVALID_INDEX, "invalid source node") ;
GRB_TRY (GrB_Vector_new(&d, GrB_FP64, n));
GRB_TRY (GrB_Vector_setElement_FP64(d, 0, s));
GRB_TRY (GrB_Vector_dup(&dtmp, d));
int64_t iter = 0; bool same = false;
while (!same && iter < n - 1)
{
GRB_TRY (GrB_vxm(dtmp, GrB_NULL, GrB_NULL, GrB_MIN_PLUS_SEMIRING_FP64, d, A,
GrB_NULL));
LG_TRY (LAGraph_Vector_IsEqual (&same, dtmp, d, NULL));
if (!same)
{
GrB_Vector ttmp = dtmp;
dtmp = d;
d = ttmp;
}
iter++;
}
if (!same)
{
GRB_TRY (GrB_vxm(dtmp, GrB_NULL, GrB_NULL, GrB_MIN_PLUS_SEMIRING_FP64, d, A,
GrB_NULL));
LG_TRY (LAGraph_Vector_IsEqual (&same, dtmp, d, NULL));
if (!same)
{
LG_FREE_ALL;
return (GrB_NO_VALUE) ;
}
}
(*pd_output) = d;
d = NULL;
LG_FREE_ALL;
return (GrB_SUCCESS) ;
}