Program Listing for File inspect.hpp
↰ Return to documentation for file (src/navtk/inspect.hpp)
#pragma once
#include <navtk/tensors.hpp>
namespace navtk {
template <typename T>
bool has_zero_size(const T& expression) {
return expression.begin() == expression.end();
}
bool is_symmetric(const Matrix& mat, double rtol = 1e-5, double atol = 1e-8);
bool is_diagonal(const Matrix& mat);
bool is_identity(const Matrix& mat);
std::vector<std::pair<Size, Size>> non_symmetric_elements(const Matrix& mat,
double rtol = 1e-5,
double atol = 1e-8);
template <typename T, class = void>
struct TensorMeta {
static constexpr bool FIXED_DIMS = false;
};
template <typename T>
struct TensorMeta<T, std::enable_if_t<xt::is_xexpression<T>::value>> {
static constexpr bool FIXED_DIMS = true;
static constexpr auto dimCount =
std::tuple_size<typename std::remove_reference<T>::type::shape_type>::value;
};
template <typename T, std::size_t Dim>
using IfTensorOfDim = std::enable_if_t<TensorMeta<T>::dimCount == Dim>;
template <typename A, typename B, std::size_t Dim>
using IfBothTensorsOfDim =
std::enable_if_t<TensorMeta<A>::dimCount == Dim && TensorMeta<B>::dimCount == Dim>;
template <typename A, typename B, std::size_t Dim>
using IfFirstTensorOfDim =
std::enable_if_t<TensorMeta<A>::dimCount == Dim && TensorMeta<B>::dimCount != Dim>;
template <typename A, typename B, std::size_t Dim>
using IfSecondTensorOfDim =
std::enable_if_t<TensorMeta<A>::dimCount != Dim && TensorMeta<B>::dimCount == Dim>;
template <typename T>
using IfEigenInterface =
std::enable_if_t<std::is_member_function_pointer<decltype(&T::rows)>::value &&
std::is_member_function_pointer<decltype(&T::cols)>::value>;
Size num_rows(const Matrix& m);
Size num_rows(const Vector& c);
Size num_cols(const Matrix& m);
Size num_cols(const Vector& r);
} // namespace navtk