32 #include <type_traits> 38 #define NO_CAST_ASSERT( x, y, z ) \ 41 "************************************************************************" \ 42 "************************************************************************" \ 43 "**********************\n" \ 44 "* ERROR | " y " " z ".\n" \ 45 "************************************************************************" \ 46 "************************************************************************" \ 47 "**********************\n" \ 48 "* Possible fix 1 | Remove no_casting from the template parameters in " \ 49 "this call to " y ".\n" \ 50 "* Possible fix 2 | Provide a left-hand side input value of the same " \ 51 "type as the first domain of the given operator.\n" \ 52 "* Possible fix 3 | Provide a right-hand side input value of the same " \ 53 "type as the second domain of the given operator.\n" \ 54 "* Possible fix 4 | Provide an output value of the same type as the " \ 55 "third domain of the given operator.\n" \ 56 "* Note that in case of in-place operators the left-hand side input or " \ 57 "right-hand side input also play the role of the output value.\n" \ 58 "************************************************************************" \ 59 "************************************************************************" \ 60 "**********************\n" ); 177 typename InputType1,
typename InputType2,
typename OutputType
184 const typename std::enable_if<
189 void >::type * =
nullptr 193 std::is_same< InputType1, typename OP::D1 >::value &&
194 std::is_same< InputType2, typename OP::D2 >::value &&
195 std::is_same< OutputType, typename OP::D3 >::value
197 "grb::apply (BLAS level 0)",
198 "Argument value types do not match operator domains while no_casting " 203 const typename OP::D1 left = static_cast< typename OP::D1 >( x );
204 const typename OP::D2 right = static_cast< typename OP::D2 >( y );
205 typename OP::D3 output = static_cast< typename OP::D3 >( out );
206 op.apply( left, right, output );
207 out = static_cast< OutputType >( output );
285 class OP,
typename InputType,
typename IOType
291 const typename std::enable_if<
299 std::is_same< InputType, typename OP::D1 >::value &&
300 std::is_same< IOType, typename OP::D2 >::value &&
301 std::is_same< IOType, typename OP::D3 >::value
302 ) ),
"grb::foldr (BLAS level 0)",
303 "Argument value types do not match operator domains while no_casting " 304 "descriptor was set" );
307 const typename OP::D1 left = static_cast< typename OP::D1 >( x );
308 typename OP::D3 right = static_cast< typename OP::D3 >( y );
309 op.foldr( left, right );
310 y = static_cast< IOType >( right );
389 typename InputType,
typename IOType
402 std::is_same< IOType, typename OP::D1 >::value &&
403 std::is_same< InputType, typename OP::D2 >::value &&
404 std::is_same< IOType, typename OP::D3 >::value
405 ) ),
"grb::foldl (BLAS level 0)",
406 "Argument value types do not match operator domains while no_casting " 407 "descriptor was set" );
410 typename OP::D1 left = static_cast< typename OP::D1 >( x );
411 const typename OP::D3 right = static_cast< typename OP::D3 >( y );
412 op.foldl( left, right );
413 x = static_cast< IOType >( left );
439 typename OutputType,
typename D,
440 typename Enabled =
void 445 template< grb::Descriptor descr,
typename OutputType,
typename D >
449 typename std::enable_if<
450 std::is_arithmetic< OutputType >::value &&
451 !std::is_same< D, void >::value
459 static_assert(
use_index || std::is_convertible< D, OutputType >::value,
460 "Cannot convert to the requested output type" );
465 static OutputType getFromArray(
466 const D * __restrict__
const x,
467 const std::function<
size_t(
size_t ) > &src_local_to_global,
471 return static_cast< OutputType >( src_local_to_global( index ) );
473 return static_cast< OutputType >( x[ index ] );
477 static OutputType getFromScalar(
const D &x,
const size_t index ) noexcept {
479 return static_cast< OutputType >( index );
481 return static_cast< OutputType >( x );
488 template< grb::Descriptor descr,
typename OutputType,
typename D >
492 typename std::enable_if<
493 !std::is_arithmetic< OutputType >::value &&
494 !std::is_same< OutputType, void >::value
499 "use_index descriptor given while output type is not numeric" );
501 static_assert( std::is_convertible< D, OutputType >::value,
502 "Cannot convert input to the given output type" );
506 static OutputType getFromArray(
507 const D * __restrict__
const x,
508 const std::function<
size_t(
size_t ) > &,
511 return static_cast< OutputType >( x[ index ] );
514 static OutputType getFromScalar(
515 const D &x,
const size_t 517 return static_cast< OutputType >( x );
544 typename OutputType,
typename InputType,
545 template<
typename >
class Identity,
546 typename Enabled =
void 548 class CopyOrApplyWithIdentity;
553 typename OutputType,
typename InputType,
554 template<
typename >
class Identity
556 class CopyOrApplyWithIdentity<
558 OutputType, InputType,
560 typename std::enable_if<
561 std::is_convertible< InputType, OutputType >::value
567 template<
typename Operator >
568 static void set( OutputType &out,
const InputType &in,
const Operator & ) {
569 out = static_cast< OutputType >( in );
577 typename OutputType,
typename InputType,
578 template<
typename >
class Identity
580 class CopyOrApplyWithIdentity<
582 OutputType, InputType,
584 typename std::enable_if<
585 !std::is_convertible< InputType, OutputType >::value
591 template<
typename Operator >
593 OutputType &out,
const InputType &in,
const Operator &op
595 const auto identity = identity_left ?
596 Identity< typename Operator::D1 >::value() :
597 Identity< typename Operator::D2 >::value();
598 if( identity_left ) {
611 #undef NO_CAST_ASSERT 613 #endif // end ``_H_GRB_BLAS0'' Defines the ALP error codes.
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:858
RC
Return codes of ALP primitives.
Definition: rc.hpp:47
static constexpr Descriptor use_index
Instead of using input vector elements, use the index of those elements.
Definition: descriptors.hpp:167
static constexpr Descriptor no_casting
Disallows the standard casting of input parameters to a compatible domain in case they did not match ...
Definition: descriptors.hpp:196
Used to inspect whether a given type is an ALP/GraphBLAS object.
Definition: type_traits.hpp:130
static constexpr Descriptor no_operation
Indicates no additional pre- or post-processing on any of the GraphBLAS function arguments.
Definition: descriptors.hpp:63
unsigned int Descriptor
Descriptors indicate pre- or post-processing for some or all of the arguments to an ALP/GraphBLAS cal...
Definition: descriptors.hpp:54
static enum RC apply(OutputType &out, const InputType1 &x, const InputType2 &y, const OP &op=OP(), const typename std::enable_if< grb::is_operator< OP >::value &&!grb::is_object< InputType1 >::value &&!grb::is_object< InputType2 >::value &&!grb::is_object< OutputType >::value, void >::type *=nullptr)
Out-of-place application of the operator OP on two data elements.
Definition: blas0.hpp:179
Defines all ALP/GraphBLAS descriptors.
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:3840
RC foldr(const Vector< InputType, backend, Coords > &x, const Vector< MaskType, backend, Coords > &mask, IOType &y, 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)
Folds a vector into a scalar, right-to-left.
Definition: blas1.hpp:3943
Specifies the ALP algebraic type traits.
The ALP/GraphBLAS namespace.
Definition: graphblas.hpp:477
Indicates the primitive has executed successfully.
Definition: rc.hpp:54
Used to inspect whether a given type is an ALP operator.
Definition: type_traits.hpp:104