/usr/include/boost/numeric/ublas/tensor
Edit: /usr/include/boost/numeric/ublas/tensor/operators_comparison.hpp (7222B)
//
// Copyright (c) 2018-2019, Cem Bassoy, cem.bassoy@gmail.com
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
// The authors gratefully acknowledge the support of
// Fraunhofer IOSB, Ettlingen, Germany
//
#ifndef BOOST_UBLAS_TENSOR_OPERATORS_COMPARISON_HPP
#define BOOST_UBLAS_TENSOR_OPERATORS_COMPARISON_HPP
#include
#include
#include
#include
namespace boost::numeric::ublas {
template
class tensor;
}
namespace boost::numeric::ublas::detail {
template
bool compare(tensor const& lhs, tensor const& rhs, BinaryPred pred)
{
if(lhs.extents() != rhs.extents()){
if constexpr(!std::is_same>::value && !std::is_same>::value)
throw std::runtime_error("Error in boost::numeric::ublas::detail::compare: cannot compare tensors with different shapes.");
else
return false;
}
if constexpr(std::is_same>::value || std::is_same>::value)
if(lhs.empty())
return false;
for(auto i = 0u; i < lhs.size(); ++i)
if(!pred(lhs(i), rhs(i)))
return false;
return true;
}
template
bool compare(tensor const& rhs, UnaryPred pred)
{
for(auto i = 0u; i < rhs.size(); ++i)
if(!pred(rhs(i)))
return false;
return true;
}
template
bool compare(tensor_expression const& lhs, tensor_expression const& rhs, BinaryPred pred)
{
constexpr bool lhs_is_tensor = std::is_same::value;
constexpr bool rhs_is_tensor = std::is_same::value;
if constexpr (lhs_is_tensor && rhs_is_tensor)
return compare(static_cast( lhs ), static_cast( rhs ), pred);
else if constexpr (lhs_is_tensor && !rhs_is_tensor)
return compare(static_cast( lhs ), T( rhs ), pred);
else if constexpr (!lhs_is_tensor && rhs_is_tensor)
return compare(T( lhs ), static_cast( rhs ), pred);
else
return compare(T( lhs ), T( rhs ), pred);
}
template
bool compare(tensor_expression const& expr, UnaryPred pred)
{
if constexpr (std::is_same::value)
return compare(static_cast( expr ), pred);
else
return compare(T( expr ), pred);
}
}
template
bool operator==( boost::numeric::ublas::detail::tensor_expression const& lhs,
boost::numeric::ublas::detail::tensor_expression const& rhs) {
return boost::numeric::ublas::detail::compare( lhs, rhs, std::equal_to<>{} );
}
template
auto operator!=(boost::numeric::ublas::detail::tensor_expression const& lhs,
boost::numeric::ublas::detail::tensor_expression const& rhs) {
return boost::numeric::ublas::detail::compare( lhs, rhs, std::not_equal_to<>{} );
}
template
auto operator< ( boost::numeric::ublas::detail::tensor_expression const& lhs,
boost::numeric::ublas::detail::tensor_expression const& rhs) {
return boost::numeric::ublas::detail::compare( lhs, rhs, std::less<>{} );
}
template
auto operator<=( boost::numeric::ublas::detail::tensor_expression const& lhs,
boost::numeric::ublas::detail::tensor_expression const& rhs) {
return boost::numeric::ublas::detail::compare( lhs, rhs, std::less_equal<>{} );
}
template
auto operator> ( boost::numeric::ublas::detail::tensor_expression const& lhs,
boost::numeric::ublas::detail::tensor_expression const& rhs) {
return boost::numeric::ublas::detail::compare( lhs, rhs, std::greater<>{} );
}
template
auto operator>=( boost::numeric::ublas::detail::tensor_expression const& lhs,
boost::numeric::ublas::detail::tensor_expression const& rhs) {
return boost::numeric::ublas::detail::compare( lhs, rhs, std::greater_equal<>{} );
}
template
bool operator==( typename T::const_reference lhs, boost::numeric::ublas::detail::tensor_expression const& rhs) {
return boost::numeric::ublas::detail::compare( rhs, [lhs](auto const& r){ return lhs == r; } );
}
template
auto operator!=( typename T::const_reference lhs, boost::numeric::ublas::detail::tensor_expression const& rhs) {
return boost::numeric::ublas::detail::compare( rhs, [lhs](auto const& r){ return lhs != r; } );
}
template
auto operator< ( typename T::const_reference lhs, boost::numeric::ublas::detail::tensor_expression const& rhs) {
return boost::numeric::ublas::detail::compare( rhs, [lhs](auto const& r){ return lhs < r; } );
}
template
auto operator<=( typename T::const_reference lhs, boost::numeric::ublas::detail::tensor_expression const& rhs) {
return boost::numeric::ublas::detail::compare( rhs, [lhs](auto const& r){ return lhs <= r; } );
}
template
auto operator> ( typename T::const_reference lhs, boost::numeric::ublas::detail::tensor_expression const& rhs) {
return boost::numeric::ublas::detail::compare( rhs, [lhs](auto const& r){ return lhs > r; } );
}
template
auto operator>=( typename T::const_reference lhs, boost::numeric::ublas::detail::tensor_expression const& rhs) {
return boost::numeric::ublas::detail::compare( rhs, [lhs](auto const& r){ return lhs >= r; } );
}
template
bool operator==( boost::numeric::ublas::detail::tensor_expression const& lhs, typename T::const_reference rhs) {
return boost::numeric::ublas::detail::compare( lhs, [rhs](auto const& l){ return l == rhs; } );
}
template
auto operator!=( boost::numeric::ublas::detail::tensor_expression const& lhs, typename T::const_reference rhs) {
return boost::numeric::ublas::detail::compare( lhs, [rhs](auto const& l){ return l != rhs; } );
}
template
auto operator< ( boost::numeric::ublas::detail::tensor_expression const& lhs, typename T::const_reference rhs) {
return boost::numeric::ublas::detail::compare( lhs, [rhs](auto const& l){ return l < rhs; } );
}
template
auto operator<=( boost::numeric::ublas::detail::tensor_expression const& lhs, typename T::const_reference rhs) {
return boost::numeric::ublas::detail::compare( lhs, [rhs](auto const& l){ return l <= rhs; } );
}
template
auto operator> ( boost::numeric::ublas::detail::tensor_expression const& lhs, typename T::const_reference rhs) {
return boost::numeric::ublas::detail::compare( lhs, [rhs](auto const& l){ return l > rhs; } );
}
template
auto operator>=( boost::numeric::ublas::detail::tensor_expression const& lhs, typename T::const_reference rhs) {
return boost::numeric::ublas::detail::compare( lhs, [rhs](auto const& l){ return l >= rhs; } );
}
#endif