@@ -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
0 commit comments