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 ) {
 
Defines all ALP/GraphBLAS descriptors.
 
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
 
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
 
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 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
 
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
 
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_operation
Indicates no additional pre- or post-processing on any of the GraphBLAS function arguments.
Definition: descriptors.hpp:63
 
The ALP/GraphBLAS namespace.
Definition: graphblas.hpp:452
 
RC
Return codes of ALP primitives.
Definition: rc.hpp:47
 
@ SUCCESS
Indicates the primitive has executed successfully.
Definition: rc.hpp:54
 
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
 
Defines the ALP error codes.
 
Used to inspect whether a given type is an ALP/GraphBLAS object.
Definition: type_traits.hpp:130
 
Used to inspect whether a given type is an ALP operator.
Definition: type_traits.hpp:104
 
Specifies the ALP algebraic type traits.