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