Program Listing for File eigen_checks.h

Return to documentation for file (library/cpp/include/wavemap/core/utils/data/eigen_checks.h)

#ifndef WAVEMAP_CORE_UTILS_DATA_EIGEN_CHECKS_H_
#define WAVEMAP_CORE_UTILS_DATA_EIGEN_CHECKS_H_

#include <functional>

#include <glog/logging.h>

#include "wavemap/core/common.h"
#include "wavemap/core/utils/data/comparisons.h"
#include "wavemap/core/utils/print/eigen.h"

// Define regular checks
#define CHECK_EIGEN_EQ(MatrixA, MatrixB)                              \
  CHECK(wavemap::data::EigenCwise<std::equal_to<>>(MatrixA, MatrixB)) \
      << "Expected" << print::eigen::oneLine(MatrixA)                 \
      << " ==" << print::eigen::oneLine(MatrixB)

#define CHECK_EIGEN_NE(MatrixA, MatrixB)                                  \
  CHECK(wavemap::data::EigenCwise<std::not_equal_to<>>(MatrixA, MatrixB)) \
      << "Expected" << print::eigen::oneLine(MatrixA)                     \
      << " !=" << print::eigen::oneLine(MatrixB)

#define CHECK_EIGEN_LE(MatrixA, MatrixB)                                \
  CHECK(wavemap::data::EigenCwise<std::less_equal<>>(MatrixA, MatrixB)) \
      << "Expected" << print::eigen::oneLine(MatrixA)                   \
      << " <=" << print::eigen::oneLine(MatrixB)

#define CHECK_EIGEN_LT(MatrixA, MatrixB)                          \
  CHECK(wavemap::data::EigenCwise<std::less<>>(MatrixA, MatrixB)) \
      << "Expected" << print::eigen::oneLine(MatrixA) << " <"     \
      << print::eigen::oneLine(MatrixB)

#define CHECK_EIGEN_GE(MatrixA, MatrixB)                                   \
  CHECK(wavemap::data::EigenCwise<std::greater_equal<>>(MatrixA, MatrixB)) \
      << "Expected" << print::eigen::oneLine(MatrixA)                      \
      << " >=" << print::eigen::oneLine(MatrixB)

#define CHECK_EIGEN_GT(MatrixA, MatrixB)                             \
  CHECK(wavemap::data::EigenCwise<std::greater<>>(MatrixA, MatrixB)) \
      << "Expected" << print::eigen::oneLine(MatrixA) << " >"        \
      << print::eigen::oneLine(MatrixB)

#define CHECK_EIGEN_NEAR(MatrixA, MatrixB, Tolerance)               \
  CHECK(wavemap::data::EigenCwiseNear(MatrixA, MatrixB, Tolerance)) \
      << "Expected" << print::eigen::oneLine(MatrixA) << " near"    \
      << print::eigen::oneLine(MatrixB) << " with tolerance " << Tolerance

// Define debug checks
#if DCHECK_IS_ON()

#define DCHECK_EIGEN_EQ(MatrixA, MatrixB) CHECK_EIGEN_EQ(MatrixA, MatrixB)
#define DCHECK_EIGEN_NE(MatrixA, MatrixB) CHECK_EIGEN_NE(MatrixA, MatrixB)
#define DCHECK_EIGEN_LE(MatrixA, MatrixB) CHECK_EIGEN_LE(MatrixA, MatrixB)
#define DCHECK_EIGEN_LT(MatrixA, MatrixB) CHECK_EIGEN_LT(MatrixA, MatrixB)
#define DCHECK_EIGEN_GE(MatrixA, MatrixB) CHECK_EIGEN_GE(MatrixA, MatrixB)
#define DCHECK_EIGEN_GT(MatrixA, MatrixB) CHECK_EIGEN_GT(MatrixA, MatrixB)
#define DCHECK_EIGEN_NEAR(MatrixA, MatrixB, Tolerance) \
  CHECK_EIGEN_NEAR(MatrixA, MatrixB, Tolerance)

// When debug checking is disabled, replace the DCHECKs with empty macros
#else

#define DCHECK_EIGEN_EQ(MatrixA, MatrixB) \
  GLOG_MSVC_PUSH_DISABLE_WARNING(4127)    \
  while (false) GLOG_MSVC_POP_WARNING() CHECK_EIGEN_EQ(MatrixA, MatrixB)

#define DCHECK_EIGEN_NE(MatrixA, MatrixB) \
  GLOG_MSVC_PUSH_DISABLE_WARNING(4127)    \
  while (false) GLOG_MSVC_POP_WARNING() CHECK_EIGEN_NE(MatrixA, MatrixB)

#define DCHECK_EIGEN_LE(MatrixA, MatrixB) \
  GLOG_MSVC_PUSH_DISABLE_WARNING(4127)    \
  while (false) GLOG_MSVC_POP_WARNING() CHECK_EIGEN_LE(MatrixA, MatrixB)

#define DCHECK_EIGEN_LT(MatrixA, MatrixB) \
  GLOG_MSVC_PUSH_DISABLE_WARNING(4127)    \
  while (false) GLOG_MSVC_POP_WARNING() CHECK_EIGEN_LT(MatrixA, MatrixB)

#define DCHECK_EIGEN_GE(MatrixA, MatrixB) \
  GLOG_MSVC_PUSH_DISABLE_WARNING(4127)    \
  while (false) GLOG_MSVC_POP_WARNING() CHECK_EIGEN_GE(MatrixA, MatrixB)

#define DCHECK_EIGEN_GT(MatrixA, MatrixB) \
  GLOG_MSVC_PUSH_DISABLE_WARNING(4127)    \
  while (false) GLOG_MSVC_POP_WARNING() CHECK_EIGEN_GT(MatrixA, MatrixB)

#define DCHECK_EIGEN_NEAR(MatrixA, MatrixB, Tolerance) \
  GLOG_MSVC_PUSH_DISABLE_WARNING(4127)                 \
  while (false)                                        \
  GLOG_MSVC_POP_WARNING() CHECK_EIGEN_NEAR(MatrixA, MatrixB, Tolerance)

#endif

#endif  // WAVEMAP_CORE_UTILS_DATA_EIGEN_CHECKS_H_