Skip to content

Commit

Permalink
Implementation in hyperdags
Browse files Browse the repository at this point in the history
  • Loading branch information
byjtew committed Jun 27, 2023
1 parent fa8f2ff commit 7a97acb
Show file tree
Hide file tree
Showing 3 changed files with 195 additions and 3 deletions.
168 changes: 168 additions & 0 deletions include/graphblas/hyperdags/blas3.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,174 @@ namespace grb {
return ret;
}

template<
Descriptor descr = descriptors::no_operation,
class Operator,
typename IOType, typename MaskType, typename InputType,
typename RIT_A, typename CIT_A, typename NIT_A,
typename RIT_M, typename CIT_M, typename NIT_M
>
RC foldl(
Matrix< IOType, hyperdags, RIT_A, CIT_A, NIT_A > &A,
const Matrix< MaskType, hyperdags, RIT_M, CIT_M, NIT_M > &mask,
const InputType &x,
const Operator &op = Operator(),
const typename std::enable_if<
!grb::is_object< IOType >::value &&
!grb::is_object< InputType >::value &&
!grb::is_object< MaskType >::value &&
grb::is_operator< Operator >::value, void
>::type * const = nullptr
) {
const RC ret = foldl< descr >(
internal::getMatrix( A ),
internal::getMatrix( mask ),
x,
op
);
if( ret != SUCCESS ) { return ret; }
if( nrows( A ) == 0 || ncols( A ) == 0 ) { return ret; }
if( nrows( mask ) == 0 || ncols( mask ) == 0 ) { return ret; }
std::array< const void *, 0 > sourcesP{};
std::array< uintptr_t, 2 > sourcesC{
getID( internal::getMatrix(A) ),
getID( internal::getMatrix(mask) )
};
std::array< uintptr_t, 1 > destinations{
getID( internal::getMatrix(A) )
};
internal::hyperdags::generator.addOperation(
internal::hyperdags::FOLDL_MATRIX_MATRIX_BETA_OP,
sourcesP.begin(), sourcesP.end(),
sourcesC.begin(), sourcesC.end(),
destinations.begin(), destinations.end()
);
return ret;
}

template<
Descriptor descr = descriptors::no_operation,
class Operator,
typename IOType, typename InputType,
typename RIT, typename CIT, typename NIT
>
RC foldl(
Matrix< IOType, hyperdags, RIT, CIT, NIT > &A,
const InputType &x,
const Operator &op = Operator(),
const typename std::enable_if<
!grb::is_object< IOType >::value &&
!grb::is_object< InputType >::value &&
grb::is_operator< Operator >::value, void
>::type * const = nullptr
) {
const RC ret = foldl< descr >(
internal::getMatrix( A ),
x,
op
);
if( ret != SUCCESS ) { return ret; }
if( nrows( A ) == 0 || ncols( A ) == 0 ) { return ret; }
std::array< const void *, 0 > sourcesP{};
std::array< uintptr_t, 1 > sourcesC{
getID( internal::getMatrix(A) )
};
std::array< uintptr_t, 1 > destinations{
getID( internal::getMatrix(A) )
};
internal::hyperdags::generator.addOperation(
internal::hyperdags::FOLDL_MATRIX_BETA_OP,
sourcesP.begin(), sourcesP.end(),
sourcesC.begin(), sourcesC.end(),
destinations.begin(), destinations.end()
);
return ret;
}

template<
Descriptor descr = descriptors::no_operation,
class Operator,
typename IOType, typename MaskType, typename InputType,
typename RIT_A, typename CIT_A, typename NIT_A,
typename RIT_M, typename CIT_M, typename NIT_M
>
RC foldr(
Matrix< IOType, hyperdags, RIT_A, CIT_A, NIT_A > &A,
const Matrix< MaskType, hyperdags, RIT_M, CIT_M, NIT_M > &mask,
const InputType &x,
const Operator &op = Operator(),
const typename std::enable_if<
!grb::is_object< IOType >::value &&
!grb::is_object< InputType >::value &&
!grb::is_object< MaskType >::value &&
grb::is_operator< Operator >::value, void
>::type * const = nullptr
) {
const RC ret = foldr< descr >(
internal::getMatrix( A ),
internal::getMatrix( mask ),
x,
op
);
if( ret != SUCCESS ) { return ret; }
if( nrows( A ) == 0 || ncols( A ) == 0 ) { return ret; }
if( nrows( mask ) == 0 || ncols( mask ) == 0 ) { return ret; }
std::array< const void *, 0 > sourcesP{};
std::array< uintptr_t, 2 > sourcesC{
getID( internal::getMatrix(A) ),
getID( internal::getMatrix(mask) )
};
std::array< uintptr_t, 1 > destinations{
getID( internal::getMatrix(A) )
};
internal::hyperdags::generator.addOperation(
internal::hyperdags::FOLDR_MATRIX_MATRIX_BETA_OP,
sourcesP.begin(), sourcesP.end(),
sourcesC.begin(), sourcesC.end(),
destinations.begin(), destinations.end()
);
return ret;
}

template<
Descriptor descr = descriptors::no_operation,
class Operator,
typename IOType, typename InputType,
typename RIT, typename CIT, typename NIT
>
RC foldr(
Matrix< IOType, hyperdags, RIT, CIT, NIT > &A,
const InputType &x,
const Operator &op = Operator(),
const typename std::enable_if<
!grb::is_object< IOType >::value &&
!grb::is_object< InputType >::value &&
grb::is_operator< Operator >::value, void
>::type * const = nullptr
) {
const RC ret = foldr< descr >(
internal::getMatrix( A ),
x,
op
);
if( ret != SUCCESS ) { return ret; }
if( nrows( A ) == 0 || ncols( A ) == 0 ) { return ret; }
std::array< const void *, 0 > sourcesP{};
std::array< uintptr_t, 1 > sourcesC{
getID( internal::getMatrix(A) )
};
std::array< uintptr_t, 1 > destinations{
getID( internal::getMatrix(A) )
};
internal::hyperdags::generator.addOperation(
internal::hyperdags::FOLDR_MATRIX_BETA_OP,
sourcesP.begin(), sourcesP.end(),
sourcesC.begin(), sourcesC.end(),
destinations.begin(), destinations.end()
);
return ret;
}

} // end namespace grb

#endif
Expand Down
18 changes: 15 additions & 3 deletions include/graphblas/hyperdags/hyperdags.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -488,12 +488,20 @@ namespace grb {

EWISEMUL_VECTOR_VECTOR_ALPHA_BETA_RING,

EWISELAMBDA_FUNC_VECTOR
EWISELAMBDA_FUNC_VECTOR,

FOLDL_MATRIX_MATRIX_BETA_OP,

FOLDL_MATRIX_BETA_OP,

FOLDR_MATRIX_MATRIX_BETA_OP,

FOLDR_MATRIX_BETA_OP

};

/** \internal How many operation vertex types exist. */
const constexpr size_t numOperationVertexTypes = 106;
const constexpr size_t numOperationVertexTypes = 110;

/** \internal An array of all operation vertex types. */
const constexpr enum OperationVertexType
Expand Down Expand Up @@ -604,7 +612,11 @@ namespace grb {
EWISEMUL_VECTOR_VECTOR_ALPHA_VECTOR_RING,
EWISEMUL_VECTOR_VECTOR_VECTOR_BETA_RING,
EWISEMUL_VECTOR_VECTOR_ALPHA_BETA_RING,
EWISELAMBDA_FUNC_VECTOR
EWISELAMBDA_FUNC_VECTOR,
FOLDL_MATRIX_MATRIX_BETA_OP,
FOLDL_MATRIX_BETA_OP,
FOLDR_MATRIX_MATRIX_BETA_OP,
FOLDR_MATRIX_BETA_OP
};

/** \internal @returns The operation vertex type as a string. */
Expand Down
12 changes: 12 additions & 0 deletions src/graphblas/hyperdags/hyperdags.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -379,6 +379,18 @@ std::string grb::internal::hyperdags::toString(

case GETID_MATRIX:
return "getID( matrix )";

case FOLDL_MATRIX_MATRIX_BETA_OP:
return "foldl( matrix, matrix, scalar )";

case FOLDL_MATRIX_BETA_OP:
return "foldl( matrix, scalar )";

case FOLDR_MATRIX_MATRIX_BETA_OP:
return "foldr( matrix, matrix, scalar )";

case FOLDR_MATRIX_BETA_OP:
return "foldr( matrix, scalar )";

}
assert( false );
Expand Down

0 comments on commit 7a97acb

Please sign in to comment.