lib/maths/common/unittest/CMathsFuncsTest.cc (98 lines of code) (raw):

/* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License * 2.0 and the following additional limitation. Functionality enabled by the * files subject to the Elastic License 2.0 may only be used in production when * invoked by an Elasticsearch process with a license key installed that permits * use of machine learning features. You may not use this file except in * compliance with the Elastic License 2.0 and the foregoing additional * limitation. */ #include <maths/common/CMathsFuncs.h> #include <boost/test/unit_test.hpp> #include <cmath> #include <limits> #include <vector> using TDoubleVec = std::vector<double>; BOOST_TEST_DONT_PRINT_LOG_VALUE(ml::maths::common::CMathsFuncs::CFiniteIterator<TDoubleVec::iterator>) BOOST_AUTO_TEST_SUITE(CMathsFuncsTest) using namespace ml; namespace { double zero() { return 0.0; } } BOOST_AUTO_TEST_CASE(testIsNan) { BOOST_TEST_REQUIRE(!maths::common::CMathsFuncs::isNan(0.0)); BOOST_TEST_REQUIRE(!maths::common::CMathsFuncs::isNan(1e7)); BOOST_TEST_REQUIRE(!maths::common::CMathsFuncs::isNan(-1e17)); BOOST_TEST_REQUIRE( !maths::common::CMathsFuncs::isNan(std::numeric_limits<double>::max())); BOOST_TEST_REQUIRE( !maths::common::CMathsFuncs::isNan(-std::numeric_limits<double>::max())); BOOST_TEST_REQUIRE( !maths::common::CMathsFuncs::isNan(std::numeric_limits<double>::min())); BOOST_TEST_REQUIRE( !maths::common::CMathsFuncs::isNan(-std::numeric_limits<double>::min())); BOOST_TEST_REQUIRE(maths::common::CMathsFuncs::isNan(zero() / zero())); BOOST_TEST_REQUIRE(maths::common::CMathsFuncs::isNan(1.0 / zero() - 2.0 / zero())); } BOOST_AUTO_TEST_CASE(testIsInf) { BOOST_TEST_REQUIRE(!maths::common::CMathsFuncs::isInf(0.0)); BOOST_TEST_REQUIRE(!maths::common::CMathsFuncs::isInf(1.8738e7)); BOOST_TEST_REQUIRE(!maths::common::CMathsFuncs::isInf(-1.376e17)); BOOST_TEST_REQUIRE( !maths::common::CMathsFuncs::isInf(std::numeric_limits<double>::max())); BOOST_TEST_REQUIRE( !maths::common::CMathsFuncs::isInf(-std::numeric_limits<double>::max())); BOOST_TEST_REQUIRE( !maths::common::CMathsFuncs::isInf(std::numeric_limits<double>::min())); BOOST_TEST_REQUIRE( !maths::common::CMathsFuncs::isInf(-std::numeric_limits<double>::min())); BOOST_TEST_REQUIRE(maths::common::CMathsFuncs::isInf(1.0 / zero())); BOOST_TEST_REQUIRE(maths::common::CMathsFuncs::isInf(2.0 / zero())); BOOST_TEST_REQUIRE(maths::common::CMathsFuncs::isInf(std::log(zero()))); BOOST_TEST_REQUIRE(maths::common::CMathsFuncs::isInf(std::exp(1.0 / zero()))); } BOOST_AUTO_TEST_CASE(testIsFinite) { BOOST_TEST_REQUIRE(maths::common::CMathsFuncs::isFinite(0.0)); BOOST_TEST_REQUIRE(maths::common::CMathsFuncs::isFinite(1.3e7)); BOOST_TEST_REQUIRE(maths::common::CMathsFuncs::isFinite(-1.5368e17)); BOOST_TEST_REQUIRE( maths::common::CMathsFuncs::isFinite(std::numeric_limits<double>::max())); BOOST_TEST_REQUIRE( maths::common::CMathsFuncs::isFinite(-std::numeric_limits<double>::max())); BOOST_TEST_REQUIRE( maths::common::CMathsFuncs::isFinite(std::numeric_limits<double>::min())); BOOST_TEST_REQUIRE( maths::common::CMathsFuncs::isFinite(-std::numeric_limits<double>::min())); BOOST_TEST_REQUIRE(!maths::common::CMathsFuncs::isFinite(1.0 / zero())); BOOST_TEST_REQUIRE(!maths::common::CMathsFuncs::isFinite(2.0 / zero())); BOOST_TEST_REQUIRE(!maths::common::CMathsFuncs::isFinite(std::log(zero()))); BOOST_TEST_REQUIRE(!maths::common::CMathsFuncs::isFinite(zero() / zero())); BOOST_TEST_REQUIRE(!maths::common::CMathsFuncs::isFinite(1.0 / zero() - 2.0 / zero())); TDoubleVec test1; test1.push_back(2.0); test1.push_back(25.0); test1.push_back(-1e6); BOOST_TEST_REQUIRE(std::equal(test1.begin(), test1.end(), maths::common::CMathsFuncs::beginFinite(test1))); TDoubleVec test2; test2.push_back(zero() / zero()); test2.push_back(2.0); test2.push_back(1.0 / zero()); test2.push_back(zero() / zero()); test2.push_back(3.0 / zero()); test2.push_back(25.0); test2.push_back(-1e6); test2.push_back(zero() / zero()); BOOST_TEST_REQUIRE(std::equal(test1.begin(), test1.end(), maths::common::CMathsFuncs::beginFinite(test2))); TDoubleVec test3; BOOST_TEST_REQUIRE(maths::common::CMathsFuncs::beginFinite(test3) == maths::common::CMathsFuncs::endFinite(test3)); TDoubleVec test4; test4.push_back(zero() / zero()); test4.push_back(1.0 / zero()); test4.push_back(zero() / zero()); BOOST_TEST_REQUIRE(maths::common::CMathsFuncs::beginFinite(test4) == maths::common::CMathsFuncs::endFinite(test4)); } BOOST_AUTO_TEST_CASE(testFpStatus) { BOOST_REQUIRE_EQUAL(maths_t::E_FpNoErrors, maths::common::CMathsFuncs::fpStatus(3.8)); BOOST_REQUIRE_EQUAL(maths_t::E_FpOverflowed, maths::common::CMathsFuncs::fpStatus(1.0 / zero())); BOOST_REQUIRE_EQUAL(maths_t::E_FpFailed, maths::common::CMathsFuncs::fpStatus(zero() / zero())); } BOOST_AUTO_TEST_SUITE_END()