37 namespace algorithms {
40 constexpr size_t MaxPrinting = 20;
41 constexpr size_t MaxAnyPrinting = 100;
44 static void printVector(
45 const Vector< double > &v,
const std::string message
50 if(
size > MaxAnyPrinting ) {
53 std::cerr <<
"\t " << message <<
": ";
54 for( Vector< double >::const_iterator it = v.begin(); it != v.end(); ++it ) {
55 const std::pair< size_t, double > iter = *it;
56 const double val = iter.second;
57 if( val < INFINITY ) {
58 if(
size > MaxPrinting ) {
59 zeros += ( val == 0 ) ? 1 : 0;
60 ones += ( val == 1 ) ? 1 : 0;
62 std::cerr << val <<
" ";
66 if(
size > MaxPrinting ) {
67 std::cerr << zeros <<
" zeros; " << ones <<
" ones.";
122 template<
typename IOType >
126 const size_t n,
const size_t l,
127 const size_t maxIterations = 1000
139 const IOType zero = reals.template getZero< IOType >();
163 RC ret =
set( multiplier,
static_cast< IOType
>(1) );
166 ret = ret ? ret :
set( diagonals, zero );
167 ret = ret ? ret : mxv< descriptors::dense >(
168 diagonals, W, multiplier, reals
171 printVector( diagonals,
"diagonals matrix in vector form" );
184 ret = ret ? ret :
eWiseLambda( [ &diagonals ](
const size_t i ) {
185 diagonals[ i ] = 1.0 / diagonals[ i ];
193 for(
size_t i = 0; ret ==
SUCCESS && i < l; ++i ) {
198 ret = ret ? ret :
set( f, y );
202 bool different =
true;
206 while( ret ==
SUCCESS && different && iter < maxIterations ) {
209 if( n < MaxAnyPrinting ) {
210 std::cerr <<
"\t iteration " << iter <<
"\n";
214 std::cerr <<
"\t pre- set/mxv nnz( f ) = " <<
nnz( f ) <<
", "
215 <<
"fNext = " <<
nnz( fNext ) <<
"\n";
217 ret = ret ? ret :
set( fNext, zero );
218 ret = ret ? ret :
mxv( fNext, W, f, reals );
220 std::cerr <<
"\t post-set/mxv nnz( f ) = " <<
nnz( f ) <<
", "
221 <<
"nnz( fNext ) = " <<
nnz( fNext ) <<
"\n";
222 printVector( f,
"Previous iteration solution" );
223 printVector( fNext,
"New iteration solution" );
228 ret = ret ? ret :
eWiseLambda( [ &fNext, &diagonals ](
const size_t i ) {
229 fNext[ i ] = ( fNext[ i ] * diagonals[ i ] < 0.5 ? 0 : 1 );
233 printVector( fNext,
"New iteration solution after threshold cutoff" );
234 std::cerr <<
"\t pre-set nnz( fNext ) = " <<
nnz( fNext ) <<
", "
235 <<
"nnz( mask ) = " <<
nnz( mask ) <<
"\n";
238 ret = ret ? ret :
foldl(
245 std::cerr <<
"\t post-set nnz( fNext ) = " <<
nnz( fNext ) <<
"\n";
248 "New iteration solution after threshold cutoff and clamping"
253 ret = ret ? ret :
dot( different, f, fNext, orMonoid, notEqualOp );
257 std::cerr <<
"\t pre-set nnz(f) = " <<
nnz( f ) <<
"\n";
259 std::swap( f, fNext );
261 std::cerr <<
"\t post-set nnz(f) = " <<
nnz( f ) <<
"\n";
270 std::cerr <<
"Info: label propagation did not converge after "
271 << (iter-1) <<
" iterations\n";
276 std::cerr <<
"Info: label propagation converged in "
277 << (iter-1) <<
" iterations\n";
286 std::cerr <<
"Warning: label propagation exiting with " <<
toString(ret)
An ALP/GraphBLAS matrix.
Definition: matrix.hpp:71
A generalised monoid.
Definition: monoid.hpp:54
A generalised semiring.
Definition: semiring.hpp:186
A GraphBLAS vector.
Definition: vector.hpp:64
Standard identitity for the logical or operator.
Definition: identities.hpp:151
Standard identity for numerical multiplication.
Definition: identities.hpp:79
Standard identity for numerical addition.
Definition: identities.hpp:57
This operator takes the sum of the two input parameters and writes it to the output variable.
Definition: ops.hpp:174
The logical or.
Definition: ops.hpp:462
This operator multiplies the two input parameters and writes the result to the output variable.
Definition: ops.hpp:208
Operator that returns false whenever its inputs compare equal, and true otherwise.
Definition: ops.hpp:405
This operator discards all left-hand side input and simply copies the right-hand side input to the ou...
Definition: ops.hpp:116
static size_t pid() noexcept
Definition: spmd.hpp:61
The main header to include in order to use the ALP/GraphBLAS API.
RC foldl(IOType &x, const Vector< InputType, backend, Coords > &y, const Vector< MaskType, backend, Coords > &mask, const Monoid &monoid=Monoid(), const typename std::enable_if< !grb::is_object< IOType >::value &&!grb::is_object< InputType >::value &&!grb::is_object< MaskType >::value &&grb::is_monoid< Monoid >::value, void >::type *const =nullptr)
Reduces, or folds, a vector into a scalar.
Definition: blas1.hpp:3618
RC dot(OutputType &z, const Vector< InputType1, backend, Coords > &x, const Vector< InputType2, backend, Coords > &y, const AddMonoid &addMonoid=AddMonoid(), const AnyOp &anyOp=AnyOp(), const Phase &phase=EXECUTE, const typename std::enable_if< !grb::is_object< OutputType >::value &&!grb::is_object< InputType1 >::value &&!grb::is_object< InputType2 >::value &&grb::is_monoid< AddMonoid >::value &&grb::is_operator< AnyOp >::value, void >::type *const =nullptr)
Calculates the dot product, , under a given additive monoid and multiplicative operator.
Definition: blas1.hpp:3834
RC eWiseLambda(const Func f, const Vector< DataType, backend, Coords > &x, Args...)
Executes an arbitrary element-wise user-defined function f using any number of vectors of equal lengt...
Definition: blas1.hpp:3524
RC mxv(Vector< IOType, backend, Coords > &u, const Vector< InputType3, backend, Coords > &u_mask, const Matrix< InputType2, backend, RIT, CIT, NIT > &A, const Vector< InputType1, backend, Coords > &v, const Vector< InputType4, backend, Coords > &v_mask, const Semiring &semiring=Semiring(), const Phase &phase=EXECUTE, const typename std::enable_if< grb::is_semiring< Semiring >::value &&!grb::is_object< IOType >::value &&!grb::is_object< InputType1 >::value &&!grb::is_object< InputType2 >::value &&!grb::is_object< InputType3 >::value &&!grb::is_object< InputType4 >::value, void >::type *const =nullptr)
Right-handed in-place doubly-masked sparse matrix times vector multiplication, .
Definition: blas2.hpp:243
size_t capacity(const Vector< InputType, backend, Coords > &x) noexcept
Queries the capacity of the given ALP/GraphBLAS container.
Definition: io.hpp:388
RC set(Vector< DataType, backend, Coords > &x, const T val, const Phase &phase=EXECUTE, const typename std::enable_if< !grb::is_object< DataType >::value &&!grb::is_object< T >::value, void >::type *const =nullptr) noexcept
Sets all elements of a vector to the given value.
Definition: io.hpp:857
RC setElement(Vector< DataType, backend, Coords > &x, const T val, const size_t i, const Phase &phase=EXECUTE, const typename std::enable_if< !grb::is_object< DataType >::value &&!grb::is_object< T >::value, void >::type *const =nullptr)
Sets the element of a given vector at a given position to a given value.
Definition: io.hpp:1128
size_t nrows(const Matrix< InputType, backend, RIT, CIT, NIT > &A) noexcept
Requests the row size of a given matrix.
Definition: io.hpp:286
size_t nnz(const Vector< DataType, backend, Coords > &x) noexcept
Request the number of nonzeroes in a given vector.
Definition: io.hpp:479
size_t ncols(const Matrix< InputType, backend, RIT, CIT, NIT > &A) noexcept
Requests the column size of a given matrix.
Definition: io.hpp:339
size_t size(const Vector< DataType, backend, Coords > &x) noexcept
Request the size of a given vector.
Definition: io.hpp:235
RC label(Vector< IOType > &out, const Vector< IOType > &y, const Matrix< IOType > &W, const size_t n, const size_t l, const size_t maxIterations=1000)
The label propagation algorithm.
Definition: label.hpp:123
The ALP/GraphBLAS namespace.
Definition: graphblas.hpp:450
std::string toString(const RC code)
RC
Return codes of ALP primitives.
Definition: rc.hpp:47
@ ILLEGAL
A call to a primitive has determined that one of its arguments was illegal as per the specification o...
Definition: rc.hpp:143
@ SUCCESS
Indicates the primitive has executed successfully.
Definition: rc.hpp:54
@ FAILED
Indicates when one of the grb::algorithms has failed to achieve its intended result,...
Definition: rc.hpp:154