Skip to content

Commit 1a48c65

Browse files
committed
Implementation in hyperdags
1 parent e6a42ed commit 1a48c65

File tree

3 files changed

+206
-3
lines changed

3 files changed

+206
-3
lines changed

include/graphblas/hyperdags/blas3.hpp

Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,186 @@ namespace grb {
332332
return ret;
333333
}
334334

335+
template<
336+
Descriptor descr = descriptors::no_operation,
337+
class Monoid,
338+
typename IOType, typename MaskType, typename InputType,
339+
typename RIT_A, typename CIT_A, typename NIT_A,
340+
typename RIT_M, typename CIT_M, typename NIT_M,
341+
typename RIT_B, typename CIT_B, typename NIT_B
342+
>
343+
RC foldl(
344+
Matrix< IOType, hyperdags, RIT_A, CIT_A, NIT_A > &A,
345+
const Matrix< MaskType, hyperdags, RIT_M, CIT_M, NIT_M > &mask,
346+
const Matrix< InputType, hyperdags, RIT_B, CIT_B, NIT_B > &B,
347+
const Monoid &monoid = Monoid(),
348+
const typename std::enable_if<
349+
!grb::is_object< IOType >::value &&
350+
!grb::is_object< InputType >::value &&
351+
!grb::is_object< MaskType >::value &&
352+
grb::is_monoid< Monoid >::value, void
353+
>::type * const = nullptr
354+
) {
355+
const RC ret = foldl< descr >(
356+
internal::getMatrix( A ),
357+
internal::getMatrix( mask ),
358+
internal::getMatrix( B ),
359+
monoid
360+
);
361+
if( ret != SUCCESS ) { return ret; }
362+
if( nrows( A ) == 0 || ncols( A ) == 0 ) { return ret; }
363+
if( nrows( mask ) == 0 || ncols( mask ) == 0 ) { return ret; }
364+
if( nrows( B ) == 0 || ncols( B ) == 0 ) { return ret; }
365+
std::array< const void *, 0 > sourcesP{};
366+
std::array< uintptr_t, 3 > sourcesC{
367+
getID( internal::getMatrix(A) ),
368+
getID( internal::getMatrix(mask) ),
369+
getID( internal::getMatrix(B) )
370+
};
371+
std::array< uintptr_t, 1 > destinations{
372+
getID( internal::getMatrix(A) )
373+
};
374+
internal::hyperdags::generator.addOperation(
375+
internal::hyperdags::FOLDL_MATRIX_MASK_MATRIX_MONOID,
376+
sourcesP.begin(), sourcesP.end(),
377+
sourcesC.begin(), sourcesC.end(),
378+
destinations.begin(), destinations.end()
379+
);
380+
return ret;
381+
}
382+
383+
template<
384+
Descriptor descr = descriptors::no_operation,
385+
class Monoid,
386+
typename IOType, typename InputType,
387+
typename RIT_A, typename CIT_A, typename NIT_A,
388+
typename RIT_B, typename CIT_B, typename NIT_B
389+
>
390+
RC foldl(
391+
Matrix< IOType, hyperdags, RIT_A, CIT_A, NIT_A > &A,
392+
const Matrix< InputType, hyperdags, RIT_B, CIT_B, NIT_B > &B,
393+
const Monoid &monoid = Monoid(),
394+
const typename std::enable_if<
395+
!grb::is_object< IOType >::value &&
396+
!grb::is_object< InputType >::value &&
397+
grb::is_monoid< Monoid >::value, void
398+
>::type * const = nullptr
399+
) {
400+
const RC ret = foldl< descr >(
401+
internal::getMatrix( A ),
402+
internal::getMatrix( B ),
403+
monoid
404+
);
405+
if( ret != SUCCESS ) { return ret; }
406+
if( nrows( A ) == 0 || ncols( A ) == 0 ) { return ret; }
407+
if( nrows( B ) == 0 || ncols( B ) == 0 ) { return ret; }
408+
std::array< const void *, 0 > sourcesP{};
409+
std::array< uintptr_t, 2 > sourcesC{
410+
getID( internal::getMatrix(A) ),
411+
getID( internal::getMatrix(B) )
412+
};
413+
std::array< uintptr_t, 1 > destinations{
414+
getID( internal::getMatrix(A) )
415+
};
416+
internal::hyperdags::generator.addOperation(
417+
internal::hyperdags::FOLDR_MATRIX_MATRIX_MONOID,
418+
sourcesP.begin(), sourcesP.end(),
419+
sourcesC.begin(), sourcesC.end(),
420+
destinations.begin(), destinations.end()
421+
);
422+
return ret;
423+
}
424+
425+
template<
426+
Descriptor descr = descriptors::no_operation,
427+
class Monoid,
428+
typename IOType, typename MaskType, typename InputType,
429+
typename RIT_A, typename CIT_A, typename NIT_A,
430+
typename RIT_M, typename CIT_M, typename NIT_M,
431+
typename RIT_B, typename CIT_B, typename NIT_B
432+
>
433+
RC foldr(
434+
Matrix< IOType, hyperdags, RIT_A, CIT_A, NIT_A > &A,
435+
const Matrix< MaskType, hyperdags, RIT_M, CIT_M, NIT_M > &mask,
436+
const Matrix< InputType, hyperdags, RIT_B, CIT_B, NIT_B > &B,
437+
const Monoid &monoid = Monoid(),
438+
const typename std::enable_if<
439+
!grb::is_object< IOType >::value &&
440+
!grb::is_object< InputType >::value &&
441+
!grb::is_object< MaskType >::value &&
442+
grb::is_monoid< Monoid >::value, void
443+
>::type * const = nullptr
444+
) {
445+
const RC ret = foldr< descr >(
446+
internal::getMatrix( A ),
447+
internal::getMatrix( mask ),
448+
internal::getMatrix( B ),
449+
monoid
450+
);
451+
if( ret != SUCCESS ) { return ret; }
452+
if( nrows( A ) == 0 || ncols( A ) == 0 ) { return ret; }
453+
if( nrows( mask ) == 0 || ncols( mask ) == 0 ) { return ret; }
454+
if( nrows( B ) == 0 || ncols( B ) == 0 ) { return ret; }
455+
std::array< const void *, 0 > sourcesP{};
456+
std::array< uintptr_t, 3 > sourcesC{
457+
getID( internal::getMatrix(A) ),
458+
getID( internal::getMatrix(mask) ),
459+
getID( internal::getMatrix(B) )
460+
};
461+
std::array< uintptr_t, 1 > destinations{
462+
getID( internal::getMatrix(A) )
463+
};
464+
internal::hyperdags::generator.addOperation(
465+
internal::hyperdags::FOLDR_MATRIX_MASK_MATRIX_MONOID,
466+
sourcesP.begin(), sourcesP.end(),
467+
sourcesC.begin(), sourcesC.end(),
468+
destinations.begin(), destinations.end()
469+
);
470+
return ret;
471+
}
472+
473+
template<
474+
Descriptor descr = descriptors::no_operation,
475+
class Monoid,
476+
typename IOType, typename InputType,
477+
typename RIT_A, typename CIT_A, typename NIT_A,
478+
typename RIT_B, typename CIT_B, typename NIT_B
479+
>
480+
RC foldr(
481+
Matrix< IOType, hyperdags, RIT_A, CIT_A, NIT_A > &A,
482+
const Matrix< InputType, hyperdags, RIT_B, CIT_B, NIT_B > &B,
483+
const Monoid &monoid = Monoid(),
484+
const typename std::enable_if<
485+
!grb::is_object< IOType >::value &&
486+
!grb::is_object< InputType >::value &&
487+
grb::is_monoid< Monoid >::value, void
488+
>::type * const = nullptr
489+
) {
490+
const RC ret = foldr< descr >(
491+
internal::getMatrix( A ),
492+
internal::getMatrix( B ),
493+
monoid
494+
);
495+
if( ret != SUCCESS ) { return ret; }
496+
if( nrows( A ) == 0 || ncols( A ) == 0 ) { return ret; }
497+
if( nrows( B ) == 0 || ncols( B ) == 0 ) { return ret; }
498+
std::array< const void *, 0 > sourcesP{};
499+
std::array< uintptr_t, 2 > sourcesC{
500+
getID( internal::getMatrix(A) ),
501+
getID( internal::getMatrix(B) )
502+
};
503+
std::array< uintptr_t, 1 > destinations{
504+
getID( internal::getMatrix(A) )
505+
};
506+
internal::hyperdags::generator.addOperation(
507+
internal::hyperdags::FOLDR_MATRIX_MATRIX_MONOID,
508+
sourcesP.begin(), sourcesP.end(),
509+
sourcesC.begin(), sourcesC.end(),
510+
destinations.begin(), destinations.end()
511+
);
512+
return ret;
513+
}
514+
335515
} // end namespace grb
336516

337517
#endif

include/graphblas/hyperdags/hyperdags.hpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -488,12 +488,19 @@ namespace grb {
488488

489489
EWISEMUL_VECTOR_VECTOR_ALPHA_BETA_RING,
490490

491-
EWISELAMBDA_FUNC_VECTOR
491+
EWISELAMBDA_FUNC_VECTOR,
492492

493+
FOLDL_MATRIX_MASK_MATRIX_MONOID,
494+
495+
FOLDL_MATRIX_MATRIX_MONOID,
496+
497+
FOLDR_MATRIX_MASK_MATRIX_MONOID,
498+
499+
FOLDR_MATRIX_MATRIX_MONOID
493500
};
494501

495502
/** \internal How many operation vertex types exist. */
496-
const constexpr size_t numOperationVertexTypes = 106;
503+
const constexpr size_t numOperationVertexTypes = 110;
497504

498505
/** \internal An array of all operation vertex types. */
499506
const constexpr enum OperationVertexType
@@ -604,7 +611,11 @@ namespace grb {
604611
EWISEMUL_VECTOR_VECTOR_ALPHA_VECTOR_RING,
605612
EWISEMUL_VECTOR_VECTOR_VECTOR_BETA_RING,
606613
EWISEMUL_VECTOR_VECTOR_ALPHA_BETA_RING,
607-
EWISELAMBDA_FUNC_VECTOR
614+
EWISELAMBDA_FUNC_VECTOR,
615+
FOLDL_MATRIX_MASK_MATRIX_MONOID,
616+
FOLDL_MATRIX_MATRIX_MONOID,
617+
FOLDR_MATRIX_MASK_MATRIX_MONOID,
618+
FOLDR_MATRIX_MATRIX_MONOID
608619
};
609620

610621
/** \internal @returns The operation vertex type as a string. */

src/graphblas/hyperdags/hyperdags.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,18 @@ std::string grb::internal::hyperdags::toString(
379379

380380
case GETID_MATRIX:
381381
return "getID( matrix )";
382+
383+
case FOLDL_MATRIX_MASK_MATRIX_MONOID:
384+
return "foldl( matrix, mask, matrix, monoid )";
385+
386+
case FOLDL_MATRIX_MATRIX_MONOID:
387+
return "foldl( matrix, matrix, monoid )";
388+
389+
case FOLDR_MATRIX_MASK_MATRIX_MONOID:
390+
return "foldr( matrix, mask, matrix, monoid )";
391+
392+
case FOLDR_MATRIX_MATRIX_MONOID:
393+
return "foldr( matrix, matrix, monoid )";
382394

383395
}
384396
assert( false );

0 commit comments

Comments
 (0)