diff --git a/.ci/ci.yaml b/.ci/ci.yaml index ee2c8e308d..925bc2dc80 100644 --- a/.ci/ci.yaml +++ b/.ci/ci.yaml @@ -27,10 +27,6 @@ jobs: binding: 'go' go.version: '1.11.0' CMakeArgs: '-DDEBUG=OFF -DPROFILE=OFF -DBUILD_PYTHON_BINDINGS=OFF -DBUILD_JULIA_BINDINGS=OFF -DBUILD_GO_BINDINGS=ON -DBUILD_R_BINDINGS=OFF' - R: - binding: 'R' - R.version: '4.0.0' - CMakeArgs: '-DDEBUG=OFF -DPROFILE=OFF -DBUILD_PYTHON_BINDINGS=OFF -DBUILD_JULIA_BINDINGS=OFF -DBUILD_GO_BINDINGS=OFF -DBUILD_R_BINDINGS=ON' Markdown: CMakeArgs: '-DDEBUG=OFF -DPROFILE=OFF -DBUILD_MARKDOWN_BINDINGS=ON -DBUILD_PYTHON_BINDINGS=OFF -DBUILD_GO_BINDINGS=OFF -DBUILD_JULIA_BINDINGS=OFF -DBUILD_R_BINDINGS=OFF' @@ -59,11 +55,6 @@ jobs: python.version: '2.7' go.version: '1.11.0' CMakeArgs: '-DDEBUG=OFF -DPROFILE=OFF -DBUILD_PYTHON_BINDINGS=OFF -DBUILD_JULIA_BINDINGS=OFF -DBUILD_GO_BINDINGS=ON -DBUILD_R_BINDINGS=OFF' - R: - binding: 'R' - python.version: '2.7' - R.version: '4.0.0' - CMakeArgs: '-DDEBUG=OFF -DPROFILE=OFF -DBUILD_PYTHON_BINDINGS=OFF -DBUILD_JULIA_BINDINGS=OFF -DBUILD_GO_BINDINGS=OFF -DBUILD_R_BINDINGS=ON' steps: - template: macos-steps.yaml diff --git a/.ci/linux-steps.yaml b/.ci/linux-steps.yaml index a69396bc76..8056a05b0c 100644 --- a/.ci/linux-steps.yaml +++ b/.ci/linux-steps.yaml @@ -34,15 +34,6 @@ steps: sudo tar -C /opt/ -xvpf julia-1.3.0-linux-x86_64.tar.gz fi - if [ "$(binding)" == "R" ]; then - if [ "a$(R.version)" != "a" ]; then - sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu xenial-cran40/' - sudo apt-get -y update - sudo apt-get install -y r-base-core - fi - sudo Rscript -e "install.packages(c('Rcpp', 'RcppArmadillo', 'RcppEnsmallen', 'BH', 'roxygen2', 'testthat', 'Rcereal'))" - fi - # Install armadillo. curl https://data.kurg.org/armadillo-8.400.0.tar.xz | tar -xvJ && cd armadillo* cmake . && make && sudo make install && cd .. diff --git a/.ci/macos-steps.yaml b/.ci/macos-steps.yaml index bdd2eaedb6..81214cfc6e 100644 --- a/.ci/macos-steps.yaml +++ b/.ci/macos-steps.yaml @@ -25,14 +25,6 @@ steps: brew cask install julia fi - if [ "$(binding)" == "R" ]; then - if [ "a$(R.version)" != "a" ]; then - brew cask install r - fi - brew cask install gfortran - Rscript -e "install.packages(c('Rcpp', 'RcppArmadillo', 'RcppEnsmallen', 'BH', 'roxygen2', 'testthat', 'Rcereal'), repos = 'http://cran.us.r-project.org')" - fi - git clone --depth 1 https://github.com/mlpack/jenkins-conf.git conf displayName: 'Install Build Dependencies' diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index dc08e75205..d21ed170da 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -8,7 +8,7 @@ on: - master release: types: [published, created, edited] -name: R CMD check mlpack +name: mlpack.mlpack jobs: cancel: @@ -26,7 +26,7 @@ jobs: access_token: ${{ secrets.GITHUB_TOKEN }} jobR: - name: Build mlpack_r_tarball + name: mlpack R tarball if: ${{ github.repository == 'mlpack/mlpack' }} runs-on: ubuntu-20.04 @@ -78,11 +78,15 @@ jobs: - name: CMake run: | mkdir build - cd build && cmake -DDEBUG=OFF -DPROFILE=OFF -DBUILD_PYTHON_BINDINGS=OFF -DBUILD_JULIA_BINDINGS=OFF -DBUILD_GO_BINDINGS=OFF -DBUILD_R_BINDINGS=ON .. + cd build && cmake -DDEBUG=OFF -DPROFILE=OFF -DBUILD_CLI_EXECUTABLES=OFF -DBUILD_PYTHON_BINDINGS=OFF -DBUILD_JULIA_BINDINGS=OFF -DBUILD_GO_BINDINGS=OFF -DBUILD_R_BINDINGS=ON .. - name: Build run: | - cd build && make R -j2 + cd build && make -j2 + + - name: Run tests via ctest + run: | + cd build && CTEST_OUTPUT_ON_FAILURE=1 ctest -T Test . - name: Upload R packages uses: actions/upload-artifact@v2 @@ -94,16 +98,16 @@ jobs: needs: jobR runs-on: ${{ matrix.config.os }} - name: ${{ matrix.config.os }} (${{ matrix.config.r }}) + name: ${{ matrix.config.name }} if: ${{ github.repository == 'mlpack/mlpack' }} strategy: fail-fast: false matrix: config: - - {os: windows-latest, r: '4.0'} - - {os: macOS-latest, r: 'release'} - - {os: ubuntu-20.04, r: 'devel', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} + - {os: windows-latest, r: '4.0', name: 'Windows R'} + - {os: macOS-latest, r: 'release', name: 'macOS R'} + - {os: ubuntu-20.04, r: 'devel', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest", name: 'Linux R'} env: @@ -151,4 +155,6 @@ jobs: uses: actions/upload-artifact@master with: name: ${{ runner.os }}-r${{ matrix.config.r }}-results - path: check + path: | + check/mlpack.Rcheck/00check.log + check/mlpack.Rcheck/00install.out diff --git a/CMakeLists.txt b/CMakeLists.txt index 2658097f0a..c3a101885d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -569,6 +569,7 @@ add_custom_target(mlpack_arma_config ALL COMMAND ${CMAKE_COMMAND} -D ARMADILLO_INCLUDE_DIR="${ARMADILLO_INCLUDE_DIR}" -D OPENMP_FOUND="${OPENMP_FOUND}" + -D CMAKE_SIZEOF_VOID_P="${CMAKE_SIZEOF_VOID_P}" -P CMake/CreateArmaConfigInfo.cmake WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMENT "Updating arma_config.hpp (if necessary)") diff --git a/HISTORY.md b/HISTORY.md index 5acdedcb4f..b839c8dc9e 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -4,6 +4,8 @@ * Added Softmin activation function as layer in ann/layer. + * Fix spurious ARMA_64BIT_WORD compilation warnings on 32-bit systems (#2665). + ### mlpack 3.4.1 ###### 2020-09-07 * Fix incorrect parsing of required matrix/model parameters for command-line diff --git a/src/mlpack/methods/ann/layer/softmax_impl.hpp b/src/mlpack/methods/ann/layer/softmax_impl.hpp index 34ac648c1c..500e0e108e 100644 --- a/src/mlpack/methods/ann/layer/softmax_impl.hpp +++ b/src/mlpack/methods/ann/layer/softmax_impl.hpp @@ -28,12 +28,12 @@ Softmax::Softmax() template template void Softmax::Forward( - const InputType& input, OutputType& output) + const InputType& input, + OutputType& output) { - InputType inputMax = arma::repmat(arma::max(input, 0), input.n_rows, 1); - output = inputMax + arma::log(arma::repmat( - arma::sum(arma::exp(input - inputMax), 0), input.n_rows, 1)); - output = arma::exp(input - output); + InputType softmaxInput = arma::exp(input.each_row() - + arma::max(input, 0)); + output = softmaxInput.each_row() / sum(softmaxInput, 0); } template diff --git a/src/mlpack/methods/ann/layer/softmin_impl.hpp b/src/mlpack/methods/ann/layer/softmin_impl.hpp index e10f73c5ab..e2389f5856 100644 --- a/src/mlpack/methods/ann/layer/softmin_impl.hpp +++ b/src/mlpack/methods/ann/layer/softmin_impl.hpp @@ -30,10 +30,9 @@ void Softmin::Forward( const InputType& input, OutputType& output) { - InputType inputMin = arma::repmat(arma::min(input,0), input.n_rows, 1); - output = arma::repmat(arma::log(arma::sum( - arma::exp(-(input - inputMin)),0)), input.n_rows, 1); - output = arma::exp(-(input - inputMin) - output); + InputType softminInput = arma::exp(-(input.each_row() - + arma::min(input, 0))); + output = softminInput.each_row() / sum(softminInput, 0); } template diff --git a/src/mlpack/tests/CMakeLists.txt b/src/mlpack/tests/CMakeLists.txt index 33ef72cdc5..cd00059808 100644 --- a/src/mlpack/tests/CMakeLists.txt +++ b/src/mlpack/tests/CMakeLists.txt @@ -20,9 +20,6 @@ add_executable(mlpack_test kde_test.cpp krann_search_test.cpp ksinit_test.cpp - lars_test.cpp - layer_names_test.cpp - lin_alg_test.cpp linear_svm_test.cpp lmnn_test.cpp local_coordinate_coding_test.cpp @@ -32,7 +29,6 @@ add_executable(mlpack_test math_test.cpp matrix_completion_test.cpp maximal_inputs_test.cpp - metric_test.cpp mlpack_test.cpp mock_categorical_data.hpp nbc_test.cpp @@ -46,17 +42,13 @@ add_executable(mlpack_test qdafn_test.cpp radical_test.cpp random_test.cpp - range_search_test.cpp rectangle_tree_test.cpp reward_clipping_test.cpp rl_components_test.cpp serialization.cpp serialization.hpp serialization_test.cpp - sfinae_test.cpp - sort_policy_test.cpp spill_tree_test.cpp - string_encoding_test.cpp sumtree_test.cpp termination_policy_test.cpp test_function_tools.hpp @@ -93,7 +85,6 @@ add_executable(mlpack_test main_tests/nmf_test.cpp main_tests/perceptron_test.cpp main_tests/radical_test.cpp - main_tests/range_search_test.cpp main_tests/test_helper.hpp ) @@ -133,10 +124,14 @@ add_executable(mlpack_catch_test kfn_test.cpp kmeans_test.cpp knn_test.cpp + lars_test.cpp + layer_names_test.cpp + lin_alg_test.cpp linear_regression_test.cpp load_save_test.cpp loss_functions_test.cpp main.cpp + metric_test.cpp mean_shift_test.cpp nca_test.cpp one_hot_encoding_test.cpp @@ -144,6 +139,7 @@ add_executable(mlpack_catch_test quic_svd_test.cpp random_forest_test.cpp randomized_svd_test.cpp + range_search_test.cpp rbm_network_test.cpp recurrent_network_test.cpp rnn_reber_test.cpp @@ -151,10 +147,13 @@ add_executable(mlpack_catch_test scaling_test.cpp serialization_catch.cpp serialization_catch.hpp + sfinae_test.cpp softmax_regression_test.cpp + sort_policy_test.cpp sparse_autoencoder_test.cpp sparse_coding_test.cpp split_data_test.cpp + string_encoding_test.cpp svd_batch_test.cpp svd_incremental_test.cpp svdplusplus_test.cpp @@ -182,6 +181,7 @@ add_executable(mlpack_catch_test main_tests/random_forest_test.cpp main_tests/softmax_regression_test.cpp main_tests/sparse_coding_test.cpp + main_tests/range_search_test.cpp main_tests/test_helper.hpp ) @@ -235,7 +235,6 @@ set(parallel_tests "GMMTest;" "CFTest;" "HMMTest;" - "LARSTest;" "LogisticRegressionTest;" "GmmTrainMainTest;" "LinearSVMTest") diff --git a/src/mlpack/tests/lars_test.cpp b/src/mlpack/tests/lars_test.cpp index cbbe5687a3..68f89db8fc 100644 --- a/src/mlpack/tests/lars_test.cpp +++ b/src/mlpack/tests/lars_test.cpp @@ -10,19 +10,15 @@ * http://www.opensource.org/licenses/BSD-3-Clause for more information. */ -// Note: We don't use BOOST_REQUIRE_CLOSE in the code below because we need -// to use FPC_WEAK, and it's not at all intuitive how to do that. #include #include -#include -#include "test_tools.hpp" +#include "catch.hpp" +#include "test_catch_tools.hpp" using namespace mlpack; using namespace mlpack::regression; -BOOST_AUTO_TEST_SUITE(LARSTest); - void GenerateProblem( arma::mat& X, arma::rowvec& y, size_t nPoints, size_t nDims) { @@ -40,17 +36,18 @@ void LARSVerifyCorrectness(arma::vec beta, arma::vec errCorr, double lambda) if (beta(j) == 0) { // Make sure that |errCorr(j)| <= lambda. - BOOST_REQUIRE_SMALL(std::max(fabs(errCorr(j)) - lambda, 0.0), tol); + REQUIRE(std::max(fabs(errCorr(j)) - lambda, 0.0) == + Approx(0.0).margin(tol)); } else if (beta(j) < 0) { // Make sure that errCorr(j) == lambda. - BOOST_REQUIRE_SMALL(errCorr(j) - lambda, tol); + REQUIRE(errCorr(j) - lambda == Approx(0.0).margin(tol)); } else // beta(j) > 0 { // Make sure that errCorr(j) == -lambda. - BOOST_REQUIRE_SMALL(errCorr(j) + lambda, tol); + REQUIRE(errCorr(j) + lambda == Approx(0.0).margin(tol)); } } } @@ -85,23 +82,23 @@ void LassoTest(size_t nPoints, size_t nDims, bool elasticNet, bool useCholesky) } } -BOOST_AUTO_TEST_CASE(LARSTestLassoCholesky) +TEST_CASE("LARSTestLassoCholesky", "[LARSTest]") { LassoTest(100, 10, false, true); } -BOOST_AUTO_TEST_CASE(LARSTestLassoGram) +TEST_CASE("LARSTestLassoGram", "[LARSTest]") { LassoTest(100, 10, false, false); } -BOOST_AUTO_TEST_CASE(LARSTestElasticNetCholesky) +TEST_CASE("LARSTestElasticNetCholesky", "[LARSTest]") { LassoTest(100, 10, true, true); } -BOOST_AUTO_TEST_CASE(LARSTestElasticNetGram) +TEST_CASE("LARSTestElasticNetGram", "[LARSTest]") { LassoTest(100, 10, true, false); } @@ -109,7 +106,7 @@ BOOST_AUTO_TEST_CASE(LARSTestElasticNetGram) // Ensure that LARS doesn't crash when the data has linearly dependent features // (meaning that there is a singularity). This test uses the Cholesky // factorization. -BOOST_AUTO_TEST_CASE(CholeskySingularityTest) +TEST_CASE("CholeskySingularityTest", "[LARSTest]") { arma::mat X; arma::mat Y; @@ -133,7 +130,7 @@ BOOST_AUTO_TEST_CASE(CholeskySingularityTest) } // Same as the above test but with no cholesky factorization. -BOOST_AUTO_TEST_CASE(NoCholeskySingularityTest) +TEST_CASE("NoCholeskySingularityTest", "[LARSTest]") { arma::mat X; arma::mat Y; @@ -158,7 +155,7 @@ BOOST_AUTO_TEST_CASE(NoCholeskySingularityTest) } // Make sure that Predict() provides reasonable enough solutions. -BOOST_AUTO_TEST_CASE(PredictTest) +TEST_CASE("PredictTest", "[LARSTest]") { for (size_t i = 0; i < 2; ++i) { @@ -185,20 +182,20 @@ BOOST_AUTO_TEST_CASE(PredictTest) lars.Predict(X, predictions); arma::vec adjPred = X * predictions.t(); - BOOST_REQUIRE_EQUAL(predictions.n_elem, 1000); + REQUIRE(predictions.n_elem == 1000); for (size_t i = 0; i < betaOptPred.n_elem; ++i) { if (std::abs(betaOptPred[i]) < 1e-5) - BOOST_REQUIRE_SMALL(adjPred[i], 1e-5); + REQUIRE(adjPred[i] == Approx(0.0).margin(1e-5)); else - BOOST_REQUIRE_CLOSE(adjPred[i], betaOptPred[i], 1e-5); + REQUIRE(adjPred[i] == Approx(betaOptPred[i]).epsilon(1e-7)); } } } } } -BOOST_AUTO_TEST_CASE(PredictRowMajorTest) +TEST_CASE("PredictRowMajorTest", "[LARSTest]") { arma::mat X; arma::rowvec y; @@ -217,20 +214,20 @@ BOOST_AUTO_TEST_CASE(PredictRowMajorTest) lars.Predict(X, colMajorPred); lars.Predict(X.t(), rowMajorPred, true); - BOOST_REQUIRE_EQUAL(colMajorPred.n_elem, rowMajorPred.n_elem); + REQUIRE(colMajorPred.n_elem == rowMajorPred.n_elem); for (size_t i = 0; i < colMajorPred.n_elem; ++i) { if (std::abs(colMajorPred[i]) < 1e-5) - BOOST_REQUIRE_SMALL(rowMajorPred[i], 1e-5); + REQUIRE(rowMajorPred[i] == Approx(0.0).margin(1e-5)); else - BOOST_REQUIRE_CLOSE(colMajorPred[i], rowMajorPred[i], 1e-5); + REQUIRE(colMajorPred[i] == Approx(rowMajorPred[i]).epsilon(1e-7)); } } /** * Make sure that if we train twice, there is no issue. */ -BOOST_AUTO_TEST_CASE(RetrainTest) +TEST_CASE("RetrainTest", "[LARSTest]") { arma::mat origX; arma::rowvec origY; @@ -257,7 +254,7 @@ BOOST_AUTO_TEST_CASE(RetrainTest) * Make sure if we train twice using the Cholesky decomposition, there is no * issue. */ -BOOST_AUTO_TEST_CASE(RetrainCholeskyTest) +TEST_CASE("RetrainCholeskyTest", "[LARSTest]") { arma::mat origX; arma::rowvec origY; @@ -284,7 +281,7 @@ BOOST_AUTO_TEST_CASE(RetrainCholeskyTest) * Make sure that we get correct solution coefficients when running training * and accessing solution coefficients separately. */ -BOOST_AUTO_TEST_CASE(TrainingAndAccessingBetaTest) +TEST_CASE("TrainingAndAccessingBetaTest", "[LARSTest]") { arma::mat X; arma::rowvec y; @@ -298,16 +295,16 @@ BOOST_AUTO_TEST_CASE(TrainingAndAccessingBetaTest) LARS lars2; lars2.Train(X, y); - BOOST_REQUIRE_EQUAL(beta.n_elem, lars2.Beta().n_elem); + REQUIRE(beta.n_elem == lars2.Beta().n_elem); for (size_t i = 0; i < beta.n_elem; ++i) - BOOST_REQUIRE_CLOSE(beta[i], lars2.Beta()[i], 1e-5); + REQUIRE(beta[i] == Approx(lars2.Beta()[i]).epsilon(1e-7)); } /** * Make sure that we learn the same when running training separately and through * constructor. Test it with default parameters. */ -BOOST_AUTO_TEST_CASE(TrainingConstructorWithDefaultsTest) +TEST_CASE("TrainingConstructorWithDefaultsTest", "[LARSTest]") { arma::mat X; arma::rowvec y; @@ -320,16 +317,16 @@ BOOST_AUTO_TEST_CASE(TrainingConstructorWithDefaultsTest) LARS lars2(X, y); - BOOST_REQUIRE_EQUAL(beta.n_elem, lars2.Beta().n_elem); + REQUIRE(beta.n_elem == lars2.Beta().n_elem); for (size_t i = 0; i < beta.n_elem; ++i) - BOOST_REQUIRE_CLOSE(beta[i], lars2.Beta()[i], 1e-5); + REQUIRE(beta[i] == Approx(lars2.Beta()[i]).epsilon(1e-7)); } /** * Make sure that we learn the same when running training separately and through * constructor. Test it with non default parameters. */ -BOOST_AUTO_TEST_CASE(TrainingConstructorWithNonDefaultsTest) +TEST_CASE("TrainingConstructorWithNonDefaultsTest", "[LARSTest]") { arma::mat X; arma::rowvec y; @@ -347,15 +344,15 @@ BOOST_AUTO_TEST_CASE(TrainingConstructorWithNonDefaultsTest) LARS lars2(X, y, transposeData, useCholesky, lambda1, lambda2); - BOOST_REQUIRE_EQUAL(beta.n_elem, lars2.Beta().n_elem); + REQUIRE(beta.n_elem == lars2.Beta().n_elem); for (size_t i = 0; i < beta.n_elem; ++i) - BOOST_REQUIRE_CLOSE(beta[i], lars2.Beta()[i], 1e-5); + REQUIRE(beta[i] == Approx(lars2.Beta()[i]).epsilon(1e-7)); } /** * Test that LARS::Train() returns finite error value. */ -BOOST_AUTO_TEST_CASE(LARSTrainReturnCorrelation) +TEST_CASE("LARSTrainReturnCorrelation", "[LARSTest]") { arma::mat X; arma::mat Y; @@ -373,35 +370,35 @@ BOOST_AUTO_TEST_CASE(LARSTrainReturnCorrelation) arma::vec betaOpt1; double error = lars1.Train(X, y, betaOpt1); - BOOST_REQUIRE_EQUAL(std::isfinite(error), true); + REQUIRE(std::isfinite(error) == true); // Test without Cholesky decomposition and with lasso. LARS lars2(false, lambda1, 0.0); arma::vec betaOpt2; error = lars2.Train(X, y, betaOpt2); - BOOST_REQUIRE_EQUAL(std::isfinite(error), true); + REQUIRE(std::isfinite(error) == true); // Test with Cholesky decomposition and with elasticnet. LARS lars3(true, lambda1, lambda2); arma::vec betaOpt3; error = lars3.Train(X, y, betaOpt3); - BOOST_REQUIRE_EQUAL(std::isfinite(error), true); + REQUIRE(std::isfinite(error) == true); // Test without Cholesky decomposition and with elasticnet. LARS lars4(false, lambda1, lambda2); arma::vec betaOpt4; error = lars4.Train(X, y, betaOpt4); - BOOST_REQUIRE_EQUAL(std::isfinite(error), true); + REQUIRE(std::isfinite(error) == true); } /** * Test that LARS::ComputeError() returns error value less than 1 * and greater than 0. */ -BOOST_AUTO_TEST_CASE(LARSTestComputeError) +TEST_CASE("LARSTestComputeError", "[LARSTest]") { arma::mat X; arma::mat Y; @@ -416,15 +413,15 @@ BOOST_AUTO_TEST_CASE(LARSTestComputeError) double train1 = lars1.Train(X, y, betaOpt1); double cost = lars1.ComputeError(X, y); - BOOST_REQUIRE_EQUAL(cost <= 1, true); - BOOST_REQUIRE_EQUAL(cost >= 0, true); - BOOST_REQUIRE_EQUAL(cost == train1, true); + REQUIRE(cost <= 1); + REQUIRE(cost >= 0); + REQUIRE(cost == train1); } /** * Simple test for LARS copy constructor. */ -BOOST_AUTO_TEST_CASE(LARSCopyConstructorTest) +TEST_CASE("LARSCopyConstructorTest", "[LARSTest]") { arma::mat features, Y; arma::rowvec targets; @@ -447,13 +444,13 @@ BOOST_AUTO_TEST_CASE(LARSCopyConstructorTest) // The output of both models should be the same. CheckMatrices(predictions, predictionsFromCopiedModel); // Check if we can train the model again. - BOOST_REQUIRE_NO_THROW(models[0].Train(features, targets)); + REQUIRE_NOTHROW(models[0].Train(features, targets)); // Check if we can train the copied model. mlpack::regression::LARS glm2(false, 0.1, 0.1); models.emplace_back(glm2); // Call the copy constructor. - BOOST_REQUIRE_NO_THROW(glm2.Train(features, targets)); - BOOST_REQUIRE_NO_THROW(models[1].Train(features, targets)); + REQUIRE_NOTHROW(glm2.Train(features, targets)); + REQUIRE_NOTHROW(models[1].Train(features, targets)); // Create a copy using assignment operator. mlpack::regression::LARS glm3 = glm2; @@ -462,5 +459,3 @@ BOOST_AUTO_TEST_CASE(LARSCopyConstructorTest) // The output of both models should be the same. CheckMatrices(predictions, predictionsFromCopiedModel); } - -BOOST_AUTO_TEST_SUITE_END(); diff --git a/src/mlpack/tests/layer_names_test.cpp b/src/mlpack/tests/layer_names_test.cpp index 23722e2b75..9d94f0ff67 100644 --- a/src/mlpack/tests/layer_names_test.cpp +++ b/src/mlpack/tests/layer_names_test.cpp @@ -15,18 +15,15 @@ #include #include -#include -#include "test_tools.hpp" +#include "catch.hpp" using namespace mlpack; using namespace ann; -BOOST_AUTO_TEST_SUITE(LayerNamesTest); - /** * Test if the LayerNameVisitor works properly. */ -BOOST_AUTO_TEST_CASE(LayerNameVisitorTest) +TEST_CASE("LayerNameVisitorTest", "[LayerNamesTest]") { LayerTypes<> atrousConvolution = new AtrousConvolution<>(); LayerTypes<> alphaDropout = new AlphaDropout<>(); @@ -63,70 +60,70 @@ BOOST_AUTO_TEST_CASE(LayerNameVisitorTest) // Bilinear interpolation is not yet supported by the string converter. LayerTypes<> unsupportedLayer = new BilinearInterpolation<>(); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - atrousConvolution) == "atrousconvolution"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - alphaDropout) == "alphadropout"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - batchNorm) == "batchnorm"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - constant) == "constant"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - convolution) == "convolution"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - dropConnect) == "dropconnect"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - dropout) == "dropout"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - flexibleReLU) == "flexiblerelu"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - layerNorm) == "layernorm"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - linear) == "linear"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - linearNoBias) == "linearnobias"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - maxPooling) == "maxpooling"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - meanPooling) == "meanpooling"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - multiplyConstant) == "multiplyconstant"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - reLULayer) == "relu"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - transposedConvolution) == "transposedconvolution"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - identityLayer) == "identity"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - tanHLayer) == "tanh"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - eLU) == "elu"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - hardTanH) == "hardtanh"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - leakyReLU) == "leakyrelu"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - pReLU) == "prelu"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - sigmoidLayer) == "sigmoid"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - logSoftMax) == "logsoftmax"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - unsupportedLayer) == "unsupported"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - lstmLayer) == "lstm"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - creluLayer) == "crelu"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - highwayLayer) == "highway"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - gruLayer) == "gru"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - glimpseLayer) == "glimpse"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - fastlstmLayer) == "fastlstm"); - BOOST_REQUIRE(boost::apply_visitor(LayerNameVisitor(), - weightnormLayer) == "weightnorm"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + atrousConvolution) == "atrousconvolution"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + alphaDropout) == "alphadropout"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + batchNorm) == "batchnorm"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + constant) == "constant"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + convolution) == "convolution"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + dropConnect) == "dropconnect"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + dropout) == "dropout"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + flexibleReLU) == "flexiblerelu"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + layerNorm) == "layernorm"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + linear) == "linear"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + linearNoBias) == "linearnobias"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + maxPooling) == "maxpooling"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + meanPooling) == "meanpooling"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + multiplyConstant) == "multiplyconstant"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + reLULayer) == "relu"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + transposedConvolution) == "transposedconvolution"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + identityLayer) == "identity"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + tanHLayer) == "tanh"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + eLU) == "elu"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + hardTanH) == "hardtanh"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + leakyReLU) == "leakyrelu"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + pReLU) == "prelu"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + sigmoidLayer) == "sigmoid"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + logSoftMax) == "logsoftmax"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + unsupportedLayer) == "unsupported"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + lstmLayer) == "lstm"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + creluLayer) == "crelu"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + highwayLayer) == "highway"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + gruLayer) == "gru"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + glimpseLayer) == "glimpse"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + fastlstmLayer) == "fastlstm"); + REQUIRE(boost::apply_visitor(LayerNameVisitor(), + weightnormLayer) == "weightnorm"); // Delete all instances. boost::apply_visitor(DeleteVisitor(), atrousConvolution); boost::apply_visitor(DeleteVisitor(), alphaDropout); @@ -161,5 +158,3 @@ BOOST_AUTO_TEST_CASE(LayerNameVisitorTest) boost::apply_visitor(DeleteVisitor(), fastlstmLayer); boost::apply_visitor(DeleteVisitor(), weightnormLayer); } - -BOOST_AUTO_TEST_SUITE_END(); diff --git a/src/mlpack/tests/lin_alg_test.cpp b/src/mlpack/tests/lin_alg_test.cpp index 47a4448804..7454564c20 100644 --- a/src/mlpack/tests/lin_alg_test.cpp +++ b/src/mlpack/tests/lin_alg_test.cpp @@ -14,20 +14,18 @@ #include #include -#include -#include "test_tools.hpp" +#include "catch.hpp" +#include "test_catch_tools.hpp" using namespace arma; using namespace mlpack; using namespace mlpack::math; -BOOST_AUTO_TEST_SUITE(LinAlgTest); - /** * Test for linalg__private::Center(). There are no edge cases here, so we'll * just try it once for now. */ -BOOST_AUTO_TEST_CASE(TestCenterA) +TEST_CASE("TestCenterA", "[LinAlgTest]") { mat tmp(5, 5); // [[0 0 0 0 0] @@ -51,11 +49,16 @@ BOOST_AUTO_TEST_CASE(TestCenterA) // [-6 -3 0 3 6 ] // [-8 -4 0 4 8]] for (int row = 0; row < 5; row++) + { for (int col = 0; col < 5; col++) - BOOST_REQUIRE_CLOSE(tmp_out(row, col), (double) (col - 2) * row, 1e-5); + { + REQUIRE(tmp_out(row, col) == + Approx((double) (col - 2) * row).epsilon(1e-7)); + } + } } -BOOST_AUTO_TEST_CASE(TestCenterB) +TEST_CASE("TestCenterB", "[LinAlgTest]") { mat tmp(5, 6); for (int row = 0; row < 5; row++) @@ -74,11 +77,16 @@ BOOST_AUTO_TEST_CASE(TestCenterB) // [-7.5 -4.5 -1.5 1.5 1.5 4.5] // [-10 -6 -2 2 6 10 ]] for (int row = 0; row < 5; row++) + { for (int col = 0; col < 6; col++) - BOOST_REQUIRE_CLOSE(tmp_out(row, col), (double) (col - 2.5) * row, 1e-5); + { + REQUIRE(tmp_out(row, col) == + Approx((double) (col - 2.5) * row).epsilon(1e-7)); + } + } } -BOOST_AUTO_TEST_CASE(TestOrthogonalize) +TEST_CASE("TestOrthogonalize", "[LinAlgTest]") { // Generate a random matrix; then, orthogonalize it and test if it's // orthogonal. @@ -96,18 +104,18 @@ BOOST_AUTO_TEST_CASE(TestOrthogonalize) if (row == col) { if (std::abs(test(row, col)) > 1e-10) - BOOST_REQUIRE_CLOSE(test(row, col), ival, 1e-10); + REQUIRE(test(row, col) == Approx(ival).epsilon(1e-11)); } else { - BOOST_REQUIRE_SMALL(test(row, col), 1e-10); + REQUIRE(test(row, col) == Approx(0.0).margin(1e-10)); } } } } // Test RemoveRows(). -BOOST_AUTO_TEST_CASE(TestRemoveRows) +TEST_CASE("TestRemoveRows", "[LinAlgTest]") { // Run this test several times. for (size_t run = 0; run < 10; ++run) @@ -150,7 +158,7 @@ BOOST_AUTO_TEST_CASE(TestRemoveRows) else { // Compare. - BOOST_REQUIRE_EQUAL(accu(input.row(row) == output.row(outputRow)), 200); + REQUIRE(accu(input.row(row) == output.row(outputRow)) == 200); // Increment output row counter. ++outputRow; @@ -159,7 +167,7 @@ BOOST_AUTO_TEST_CASE(TestRemoveRows) } } -BOOST_AUTO_TEST_CASE(TestSvecSmat) +TEST_CASE("TestSvecSmat", "[LinAlgTest]") { arma::mat X(3, 3); X(0, 0) = 0; X(0, 1) = 1, X(0, 2) = 2; @@ -168,23 +176,24 @@ BOOST_AUTO_TEST_CASE(TestSvecSmat) arma::vec sx; Svec(X, sx); - BOOST_REQUIRE_CLOSE(sx(0), 0, 1e-7); - BOOST_REQUIRE_CLOSE(sx(1), M_SQRT2 * 1., 1e-7); - BOOST_REQUIRE_CLOSE(sx(2), M_SQRT2 * 2., 1e-7); - BOOST_REQUIRE_CLOSE(sx(3), 3., 1e-7); - BOOST_REQUIRE_CLOSE(sx(4), M_SQRT2 * 4., 1e-7); - BOOST_REQUIRE_CLOSE(sx(5), 5., 1e-7); + REQUIRE(sx(0) == Approx(0).epsilon(1e-9)); + REQUIRE(sx(1) == Approx(M_SQRT2 * 1.).epsilon(1e-9)); + REQUIRE(sx(2) == Approx(M_SQRT2 * 2.).epsilon(1e-9)); + REQUIRE(sx(3) == Approx(3.).epsilon(1e-9)); + REQUIRE(sx(4) == Approx(M_SQRT2 * 4.).epsilon(1e-9)); + REQUIRE(sx(5) == Approx(5.).epsilon(1e-9)); arma::mat Xtest; Smat(sx, Xtest); - BOOST_REQUIRE_EQUAL(Xtest.n_rows, 3); - BOOST_REQUIRE_EQUAL(Xtest.n_cols, 3); + REQUIRE(Xtest.n_rows == 3); + REQUIRE(Xtest.n_cols == 3); for (size_t i = 0; i < 3; ++i) for (size_t j = 0; j < 3; ++j) - BOOST_REQUIRE_CLOSE(X(i, j), Xtest(i, j), 1e-7); + REQUIRE(X(i, j) == Approx(Xtest(i, j)).epsilon(1e-9)); + } -BOOST_AUTO_TEST_CASE(TestSparseSvec) +TEST_CASE("TestSparseSvec", "[LinAlgTest]") { arma::sp_mat X; X.zeros(3, 3); @@ -200,15 +209,15 @@ BOOST_AUTO_TEST_CASE(TestSparseSvec) const double v4 = sx(4); const double v5 = sx(5); - BOOST_REQUIRE_CLOSE(v0, 0, 1e-7); - BOOST_REQUIRE_CLOSE(v1, M_SQRT2 * 1., 1e-7); - BOOST_REQUIRE_CLOSE(v2, 0, 1e-7); - BOOST_REQUIRE_CLOSE(v3, 0, 1e-7); - BOOST_REQUIRE_CLOSE(v4, 0, 1e-7); - BOOST_REQUIRE_CLOSE(v5, 0, 1e-7); + REQUIRE(v0 == Approx(0).epsilon(1e-9)); + REQUIRE(v1 == Approx(M_SQRT2 * 1.).epsilon(1e-9)); + REQUIRE(v2 == Approx(0).epsilon(1e-9)); + REQUIRE(v3 == Approx(0).epsilon(1e-9)); + REQUIRE(v4 == Approx(0).epsilon(1e-9)); + REQUIRE(v5 == Approx(0).epsilon(1e-9)); } -BOOST_AUTO_TEST_CASE(TestSymKronIdSimple) +TEST_CASE("TestSymKronIdSimple", "[LinAlgTest]") { arma::mat A(3, 3); A(0, 0) = 1; A(0, 1) = 2, A(0, 2) = 3; @@ -226,12 +235,12 @@ BOOST_AUTO_TEST_CASE(TestSymKronIdSimple) arma::vec rhs; Svec(Rhs, rhs); - BOOST_REQUIRE_EQUAL(lhs.n_elem, rhs.n_elem); + REQUIRE(lhs.n_elem == rhs.n_elem); for (size_t j = 0; j < lhs.n_elem; ++j) - BOOST_REQUIRE_CLOSE(lhs(j), rhs(j), 1e-5); + REQUIRE(lhs(j) == Approx(rhs(j)).epsilon(1e-7)); } -BOOST_AUTO_TEST_CASE(TestSymKronId) +TEST_CASE("TestSymKronId", "[LinAlgTest]") { const size_t n = 10; arma::mat A = arma::randu(n, n); @@ -252,10 +261,8 @@ BOOST_AUTO_TEST_CASE(TestSymKronId) arma::vec rhs; Svec(Rhs, rhs); - BOOST_REQUIRE_EQUAL(lhs.n_elem, rhs.n_elem); + REQUIRE(lhs.n_elem == rhs.n_elem); for (size_t j = 0; j < lhs.n_elem; ++j) - BOOST_REQUIRE_CLOSE(lhs(j), rhs(j), 1e-5); + REQUIRE(lhs(j) == Approx(rhs(j)).epsilon(1e-7)); } } - -BOOST_AUTO_TEST_SUITE_END(); diff --git a/src/mlpack/tests/main_tests/range_search_test.cpp b/src/mlpack/tests/main_tests/range_search_test.cpp index 8102aae4e9..3d9fd08bb5 100644 --- a/src/mlpack/tests/main_tests/range_search_test.cpp +++ b/src/mlpack/tests/main_tests/range_search_test.cpp @@ -17,7 +17,7 @@ static const std::string testName = "RangeSearchMain"; #include "test_helper.hpp" #include #include "range_search_utils.hpp" -#include +#include "../catch.hpp" using namespace mlpack; @@ -37,34 +37,35 @@ struct RangeSearchTestFixture } }; -BOOST_FIXTURE_TEST_SUITE(RangeSearchMainTest, RangeSearchTestFixture); - /** * Check that we have to specify a reference set or input model. */ -BOOST_AUTO_TEST_CASE(RangeSearchNoReference) +TEST_CASE_METHOD(RangeSearchTestFixture, "RangeSearchNoReference", + "[RangeSearchMainTest][BindingTests]") { Log::Fatal.ignoreInput = true; - BOOST_REQUIRE_THROW(mlpackMain(), std::runtime_error); + REQUIRE_THROWS_AS(mlpackMain(), std::runtime_error); Log::Fatal.ignoreInput = false; } /** * Check that we cannot pass an incorrect parameter. */ -BOOST_AUTO_TEST_CASE(RangeSearchWrongParameter) +TEST_CASE_METHOD(RangeSearchTestFixture, "RangeSearchWrongParameter", + "[RangeSearchMainTest][BindingTests]") { string wrongString = "abc"; Log::Fatal.ignoreInput = true; - BOOST_REQUIRE_THROW(SetInputParam("RST", wrongString), std::runtime_error); + REQUIRE_THROWS_AS(SetInputParam("RST", wrongString), std::runtime_error); Log::Fatal.ignoreInput = false; } /** * Check that we have to specify a query if an input model is specified. */ -BOOST_AUTO_TEST_CASE(RangeSearchInputModelNoQuery) +TEST_CASE_METHOD(RangeSearchTestFixture, "RangeSearchInputModelNoQuery", + "[RangeSearchMainTest][BindingTests]") { arma::mat inputData; double minVal = 0, maxVal = 3; @@ -72,7 +73,7 @@ BOOST_AUTO_TEST_CASE(RangeSearchInputModelNoQuery) string neighborsFile = "neighbors.csv"; if (!data::Load("iris.csv", inputData)) - BOOST_FAIL("Unable to load dataset iris.csv!"); + FAIL("Unable to load dataset iris.csv!"); SetInputParam("reference", move(inputData)); SetInputParam("min", minVal); @@ -86,7 +87,7 @@ BOOST_AUTO_TEST_CASE(RangeSearchInputModelNoQuery) SetInputParam("input_model", move(IO::GetParam("output_model"))); Log::Fatal.ignoreInput = true; - BOOST_REQUIRE_THROW(mlpackMain(), std::runtime_error); + REQUIRE_THROWS_AS(mlpackMain(), std::runtime_error); Log::Fatal.ignoreInput = false; remove(neighborsFile.c_str()); @@ -96,7 +97,8 @@ BOOST_AUTO_TEST_CASE(RangeSearchInputModelNoQuery) /** * Check that we cannot specify a tree type which is not available or wrong. */ -BOOST_AUTO_TEST_CASE(RangeSearchDifferentTree) +TEST_CASE_METHOD(RangeSearchTestFixture, "RangeSearchDifferentTree", + "[RangeSearchMainTest][BindingTests]") { arma::mat inputData; double minVal = 0, maxVal = 3; @@ -104,7 +106,7 @@ BOOST_AUTO_TEST_CASE(RangeSearchDifferentTree) string neighborsFile = "neighbors.csv"; string wrongTreeType = "RST"; if (!data::Load("iris.csv", inputData)) - BOOST_FAIL("Unable to load dataset iris.csv!"); + FAIL("Unable to load dataset iris.csv!"); SetInputParam("reference", move(inputData)); SetInputParam("min", minVal); @@ -114,7 +116,7 @@ BOOST_AUTO_TEST_CASE(RangeSearchDifferentTree) SetInputParam("tree_type", wrongTreeType); Log::Fatal.ignoreInput = true; - BOOST_REQUIRE_THROW(mlpackMain(), std::runtime_error); + REQUIRE_THROWS_AS(mlpackMain(), std::runtime_error); Log::Fatal.ignoreInput = false; remove(neighborsFile.c_str()); @@ -124,7 +126,8 @@ BOOST_AUTO_TEST_CASE(RangeSearchDifferentTree) /** * Check that we cannot specify both a reference set and input model. */ -BOOST_AUTO_TEST_CASE(RangeSearchBothReferenceAndModel) +TEST_CASE_METHOD(RangeSearchTestFixture, "RangeSearchBothReferenceAndModel", + "[RangeSearchMainTest][BindingTests]") { arma::mat inputData, queryData; double minVal = 0, maxVal = 3; @@ -132,9 +135,9 @@ BOOST_AUTO_TEST_CASE(RangeSearchBothReferenceAndModel) string neighborsFile = "neighbors.csv"; if (!data::Load("iris.csv", inputData)) - BOOST_FAIL("Unable to load dataset iris.csv!"); + FAIL("Unable to load dataset iris.csv!"); if (!data::Load("iris_test.csv", queryData)) - BOOST_FAIL("Unable to load dataset iris_test.csv!"); + FAIL("Unable to load dataset iris_test.csv!"); SetInputParam("reference", move(inputData)); SetInputParam("min", minVal); @@ -149,7 +152,7 @@ BOOST_AUTO_TEST_CASE(RangeSearchBothReferenceAndModel) SetInputParam("query", move(queryData)); Log::Fatal.ignoreInput = true; - BOOST_REQUIRE_THROW(mlpackMain(), std::runtime_error); + REQUIRE_THROWS_AS(mlpackMain(), std::runtime_error); Log::Fatal.ignoreInput = false; remove(neighborsFile.c_str()); @@ -161,7 +164,8 @@ BOOST_AUTO_TEST_CASE(RangeSearchBothReferenceAndModel) * by comparing with pre-calculated neighbor and distance values, when no query * set is specified. */ -BOOST_AUTO_TEST_CASE(RangeSearchTest) +TEST_CASE_METHOD(RangeSearchTestFixture, "RangeSearchTest", + "[RangeSearchMainTest][BindingTests]") { arma::mat x = {{0, 3, 3, 4, 3, 1}, {4, 4, 4, 5, 5, 2}, @@ -208,7 +212,8 @@ BOOST_AUTO_TEST_CASE(RangeSearchTest) * Check that the correct output is returned for a small synthetic input case, * when a query set is provided. */ -BOOST_AUTO_TEST_CASE(RangeSeachTestwithQuery) +TEST_CASE_METHOD(RangeSearchTestFixture, "RangeSeachTestwithQuery", + "[RangeSearchMainTest][BindingTests]") { arma::mat queryData = {{5, 3, 1}, {4, 2, 4}, {3, 1, 7}}; arma::mat x = {{0, 3, 3, 4, 3, 1}, @@ -252,7 +257,8 @@ BOOST_AUTO_TEST_CASE(RangeSeachTestwithQuery) * Train a model using a synthetic dataset and then output the model, and ensure * it can be used again. */ -BOOST_AUTO_TEST_CASE(ModelCheck) +TEST_CASE_METHOD(RangeSearchTestFixture, "ModelCheck", + "[RangeSearchMainTest][BindingTests]") { arma::mat inputData, queryData; double minVal = 0, maxVal = 3; @@ -262,9 +268,9 @@ BOOST_AUTO_TEST_CASE(ModelCheck) vector> distances, distancetemp; if (!data::Load("iris.csv", inputData)) - BOOST_FAIL("Unable to load dataset iris.csv!"); + FAIL("Unable to load dataset iris.csv!"); if (!data::Load("iris_test.csv", queryData)) - BOOST_FAIL("Unable to load dataset iris_test.csv!"); + FAIL("Unable to load dataset iris_test.csv!"); SetInputParam("reference", move(inputData)); SetInputParam("min", minVal); @@ -292,8 +298,8 @@ BOOST_AUTO_TEST_CASE(ModelCheck) CheckMatrices(neighbors, neighborsTemp); CheckMatrices(distances, distancetemp); - BOOST_REQUIRE_EQUAL(ModelToString(outputModel), - ModelToString(IO::GetParam("output_model"))); + REQUIRE(ModelToString(outputModel) == + ModelToString(IO::GetParam("output_model"))); remove(neighborsFile.c_str()); remove(distanceFile.c_str()); @@ -303,11 +309,12 @@ BOOST_AUTO_TEST_CASE(ModelCheck) * Check that the models are different but the results are the same for three * different leaf size parameters. */ -BOOST_AUTO_TEST_CASE(LeafValueTesting) +TEST_CASE_METHOD(RangeSearchTestFixture, "LeafValueTesting", + "[RangeSearchMainTest][BindingTests]") { arma::mat inputData; if (!data::Load("iris.csv", inputData)) - BOOST_FAIL("Unable to load dataset iris.csv!"); + FAIL("Unable to load dataset iris.csv!"); string distanceFile = "distances.csv"; string neighborsFile = "neighbors.csv"; @@ -349,8 +356,8 @@ BOOST_AUTO_TEST_CASE(LeafValueTesting) CheckMatrices(neighbors, neighborsTemp); CheckMatrices(distances, distancestemp); - BOOST_REQUIRE_NE(ModelToString(outputModel1), - ModelToString(IO::GetParam("output_model"))); + REQUIRE(ModelToString(outputModel1) != + ModelToString(IO::GetParam("output_model"))); if (i != leafSizes.size() - 1) delete IO::GetParam("output_model"); @@ -367,7 +374,8 @@ BOOST_AUTO_TEST_CASE(LeafValueTesting) * different tree types. We use the default kd-tree as the base model to * compare against. */ -BOOST_AUTO_TEST_CASE(TreeTypeTesting) +TEST_CASE_METHOD(RangeSearchTestFixture, "TreeTypeTesting", + "[RangeSearchMainTest][BindingTests]") { string distanceFile = "distances.csv"; string neighborsFile = "neighbors.csv"; @@ -381,9 +389,9 @@ BOOST_AUTO_TEST_CASE(TreeTypeTesting) "max-rp", "ub", "oct"}; if (!data::Load("iris.csv", inputData)) - BOOST_FAIL("Unable to load dataset iris.csv!"); + FAIL("Unable to load dataset iris.csv!"); if (!data::Load("iris_test.csv", queryData)) - BOOST_FAIL("Unable to load dataset iris_test.csv!"); + FAIL("Unable to load dataset iris_test.csv!"); // Define base parameters with the kd-tree. SetInputParam("tree_type", trees[0]); @@ -403,9 +411,9 @@ BOOST_AUTO_TEST_CASE(TreeTypeTesting) for (size_t i = 1; i < trees.size(); ++i) { if (!data::Load("iris.csv", inputData)) - BOOST_FAIL("Unable to load dataset iris.csv!"); + FAIL("Unable to load dataset iris.csv!"); if (!data::Load("iris_test.csv", queryData)) - BOOST_FAIL("Unable to load dataset iris_test.csv!"); + FAIL("Unable to load dataset iris_test.csv!"); SetInputParam("min", minVal); SetInputParam("max", maxVal); @@ -422,8 +430,8 @@ BOOST_AUTO_TEST_CASE(TreeTypeTesting) CheckMatrices(neighbors, neighborsTemp); CheckMatrices(distances, distancestemp); - BOOST_REQUIRE_NE(ModelToString(outputModel1), - ModelToString(IO::GetParam("output_model"))); + REQUIRE(ModelToString(outputModel1) != + ModelToString(IO::GetParam("output_model"))); if (i != trees.size() - 1) delete IO::GetParam("output_model"); @@ -439,7 +447,8 @@ BOOST_AUTO_TEST_CASE(TreeTypeTesting) * Project the data onto a random basis and ensure that this gives identical * results to non-projected data but different models. */ -BOOST_AUTO_TEST_CASE(RandomBasisTesting) +TEST_CASE_METHOD(RangeSearchTestFixture, "RandomBasisTesting", + "[RangeSearchMainTest][BindingTests]") { string distanceFile = "distances.csv"; string neighborsFile = "neighbors.csv"; @@ -447,9 +456,9 @@ BOOST_AUTO_TEST_CASE(RandomBasisTesting) arma::mat queryData, inputData; if (!data::Load("iris.csv", inputData)) - BOOST_FAIL("Unable to load dataset iris.csv!"); + FAIL("Unable to load dataset iris.csv!"); if (!data::Load("iris_test.csv", queryData)) - BOOST_FAIL("Unable to load dataset iris_test.csv!"); + FAIL("Unable to load dataset iris_test.csv!"); SetInputParam("min", minVal); SetInputParam("max", maxVal); @@ -470,8 +479,8 @@ BOOST_AUTO_TEST_CASE(RandomBasisTesting) mlpackMain(); - BOOST_REQUIRE_NE(ModelToString(outputModel), - ModelToString(IO::GetParam("output_model"))); + REQUIRE(ModelToString(outputModel) != + ModelToString(IO::GetParam("output_model"))); delete outputModel; @@ -482,7 +491,8 @@ BOOST_AUTO_TEST_CASE(RandomBasisTesting) /** * Ensure that naive mode gives the same result, but different models. */ -BOOST_AUTO_TEST_CASE(NaiveModeTest) +TEST_CASE_METHOD(RangeSearchTestFixture, "NaiveModeTest", + "[RangeSearchMainTest][BindingTests]") { string distanceFile = "distances.csv"; string neighborsFile = "neighbors.csv"; @@ -493,9 +503,9 @@ BOOST_AUTO_TEST_CASE(NaiveModeTest) vector> distances, distancestemp; if (!data::Load("iris.csv", inputData)) - BOOST_FAIL("Unable to load dataset iris.csv!"); + FAIL("Unable to load dataset iris.csv!"); if (!data::Load("iris_test.csv", queryData)) - BOOST_FAIL("Unable to load dataset iris_test.csv!"); + FAIL("Unable to load dataset iris_test.csv!"); SetInputParam("min", minVal); SetInputParam("max", maxVal); @@ -524,8 +534,8 @@ BOOST_AUTO_TEST_CASE(NaiveModeTest) CheckMatrices(neighbors, neighborsTemp); CheckMatrices(distances, distancestemp); - BOOST_REQUIRE_NE(ModelToString(outputModel), - ModelToString(IO::GetParam("output_model"))); + REQUIRE(ModelToString(outputModel) != + ModelToString(IO::GetParam("output_model"))); delete outputModel; @@ -536,7 +546,8 @@ BOOST_AUTO_TEST_CASE(NaiveModeTest) /** * Ensure that single-tree mode gives the same result but different models. */ -BOOST_AUTO_TEST_CASE(SingleModeTest) +TEST_CASE_METHOD(RangeSearchTestFixture, "SingleModeTest", + "[RangeSearchMainTest][BindingTests]") { string distanceFile = "distances.csv"; string neighborsFile = "neighbors.csv"; @@ -547,9 +558,9 @@ BOOST_AUTO_TEST_CASE(SingleModeTest) vector> distances, distancestemp; if (!data::Load("iris.csv", inputData)) - BOOST_FAIL("Unable to load dataset iris.csv!"); + FAIL("Unable to load dataset iris.csv!"); if (!data::Load("iris_test.csv", queryData)) - BOOST_FAIL("Unable to load dataset iris_test.csv!"); + FAIL("Unable to load dataset iris_test.csv!"); SetInputParam("min", minVal); SetInputParam("max", maxVal); @@ -577,13 +588,11 @@ BOOST_AUTO_TEST_CASE(SingleModeTest) CheckMatrices(neighbors, neighborsTemp); CheckMatrices(distances, distancestemp); - BOOST_REQUIRE_NE(ModelToString(outputModel), - ModelToString(IO::GetParam("output_model"))); + REQUIRE(ModelToString(outputModel) != + ModelToString(IO::GetParam("output_model"))); delete outputModel; remove(neighborsFile.c_str()); remove(distanceFile.c_str()); } - -BOOST_AUTO_TEST_SUITE_END(); diff --git a/src/mlpack/tests/main_tests/range_search_utils.hpp b/src/mlpack/tests/main_tests/range_search_utils.hpp index ae0ed52262..b53963ef03 100644 --- a/src/mlpack/tests/main_tests/range_search_utils.hpp +++ b/src/mlpack/tests/main_tests/range_search_utils.hpp @@ -12,10 +12,10 @@ #ifndef MLPACK_TESTS_MAIN_TESTS_RANGE_SEARCH_TEST_UTILS_HPP #define MLPACK_TESTS_MAIN_TESTS_RANGE_SEARCH_TEST_UTILS_HPP -#include #include #include #include +#include "../catch.hpp" /** * Convert a model to a string using the text_oarchive of cereal. @@ -42,15 +42,15 @@ inline void CheckMatrices(std::vector>& vec1, std::vector>& vec2, const double tolerance = 1e-3) { - BOOST_REQUIRE_EQUAL(vec1.size() , vec2.size()); + REQUIRE(vec1.size() == vec2.size()); for (size_t i = 0; i < vec1.size(); ++i) { - BOOST_REQUIRE_EQUAL(vec1[i].size(), vec2[i].size()); + REQUIRE(vec1[i].size() == vec2[i].size()); std::sort(vec1[i].begin(), vec1[i].end()); std::sort(vec2[i].begin(), vec2[i].end()); for (size_t j = 0 ; j < vec1[i].size(); ++j) { - BOOST_REQUIRE_CLOSE(vec1[i][j], vec2[i][j], tolerance); + REQUIRE(vec1[i][j] == Approx(vec2[i][j]).epsilon(tolerance)); } } } @@ -64,15 +64,15 @@ inline void CheckMatrices(std::vector>& vec1, inline void CheckMatrices(std::vector>& vec1, std::vector>& vec2) { - BOOST_REQUIRE_EQUAL(vec1.size() , vec2.size()); + REQUIRE(vec1.size() == vec2.size()); for (size_t i = 0; i < vec1.size(); ++i) { - BOOST_REQUIRE_EQUAL(vec1[i].size(), vec2[i].size()); + REQUIRE(vec1[i].size() == vec2[i].size()); std::sort(vec1[i].begin(), vec1[i].end()); std::sort(vec2[i].begin(), vec2[i].end()); for (size_t j = 0; j < vec1[i].size(); ++j) { - BOOST_REQUIRE_EQUAL(vec1[i][j], vec2[i][j]); + REQUIRE(vec1[i][j] == vec2[i][j]); } } } diff --git a/src/mlpack/tests/metric_test.cpp b/src/mlpack/tests/metric_test.cpp index dffe3211fc..db3f164650 100644 --- a/src/mlpack/tests/metric_test.cpp +++ b/src/mlpack/tests/metric_test.cpp @@ -10,21 +10,19 @@ */ #include #include -#include +#include "catch.hpp" #include #include #include -#include "test_tools.hpp" +#include "test_catch_tools.hpp" using namespace std; using namespace mlpack::metric; -BOOST_AUTO_TEST_SUITE(MetricTest); - /** * Simple test for L-1 metric. */ -BOOST_AUTO_TEST_CASE(L1MetricTest) +TEST_CASE("L1MetricTest", "[MetricTest]") { arma::vec a1(5); a1.randn(); @@ -40,17 +38,17 @@ BOOST_AUTO_TEST_CASE(L1MetricTest) ManhattanDistance lMetric; - BOOST_REQUIRE_CLOSE((double) arma::accu(arma::abs(a1 - b1)), - lMetric.Evaluate(a1, b1), 1e-5); + REQUIRE((double) arma::accu(arma::abs(a1 - b1)) == + Approx(lMetric.Evaluate(a1, b1)).epsilon(1e-7)); - BOOST_REQUIRE_CLOSE((double) arma::accu(arma::abs(a2 - b2)), - lMetric.Evaluate(a2, b2), 1e-5); + REQUIRE((double) arma::accu(arma::abs(a2 - b2)) == + Approx(lMetric.Evaluate(a2, b2)).epsilon(1e-7)); } /** * Simple test for L-2 metric. */ -BOOST_AUTO_TEST_CASE(L2MetricTest) +TEST_CASE("L2MetricTest", "[MetricTest]") { arma::vec a1(5); a1.randn(); @@ -66,17 +64,17 @@ BOOST_AUTO_TEST_CASE(L2MetricTest) EuclideanDistance lMetric; - BOOST_REQUIRE_CLOSE((double) sqrt(arma::accu(arma::square(a1 - b1))), - lMetric.Evaluate(a1, b1), 1e-5); + REQUIRE((double) sqrt(arma::accu(arma::square(a1 - b1))) == + Approx(lMetric.Evaluate(a1, b1)).epsilon(1e-7)); - BOOST_REQUIRE_CLOSE((double) sqrt(arma::accu(arma::square(a2 - b2))), - lMetric.Evaluate(a2, b2), 1e-5); + REQUIRE((double) sqrt(arma::accu(arma::square(a2 - b2))) == + Approx(lMetric.Evaluate(a2, b2)).epsilon(1e-7)); } /** * Simple test for L-Infinity metric. */ -BOOST_AUTO_TEST_CASE(LINFMetricTest) +TEST_CASE("LINFMetricTest", "[MetricTest]") { arma::vec a1(5); a1.randn(); @@ -92,50 +90,52 @@ BOOST_AUTO_TEST_CASE(LINFMetricTest) ChebyshevDistance lMetric; - BOOST_REQUIRE_CLOSE((double) arma::as_scalar(arma::max(arma::abs(a1 - b1))), - lMetric.Evaluate(a1, b1), 1e-5); + REQUIRE((double) arma::as_scalar(arma::max(arma::abs(a1 - b1))) == + Approx(lMetric.Evaluate(a1, b1)).epsilon(1e-7)); - BOOST_REQUIRE_CLOSE((double) arma::as_scalar(arma::max(arma::abs(a2 - b2))), - lMetric.Evaluate(a2, b2), 1e-5); + REQUIRE((double) arma::as_scalar(arma::max(arma::abs(a2 - b2))) == + Approx(lMetric.Evaluate(a2, b2)).epsilon(1e-7)); } /** * Simple test for IoU metric. */ -BOOST_AUTO_TEST_CASE(IoUMetricTest) +TEST_CASE("IoUMetricTest", "[MetricTest]") { arma::vec bbox1(4), bbox2(4); bbox1 << 1 << 2 << 100 << 200; bbox2 << 1 << 2 << 100 << 200; // IoU of same bounding boxes equals 1.0. - BOOST_REQUIRE_CLOSE(1.0, IoU<>::Evaluate(bbox1, bbox2), 1e-4); + REQUIRE(1.0 == Approx(IoU<>::Evaluate(bbox1, bbox2)).epsilon(1e-6)); // Use coordinate system to represent bounding boxes. // Bounding boxes represent {x0, y0, x1, y1}. bbox1 << 39 << 63 << 203 << 112; bbox2 << 54 << 66 << 198 << 114; // Value calculated using Python interpreter. - BOOST_REQUIRE_CLOSE(IoU::Evaluate(bbox1, bbox2), 0.7980093, 1e-4); + REQUIRE(IoU::Evaluate(bbox1, bbox2) == + Approx(0.7980093).epsilon(1e-6)); bbox1 << 31 << 69 << 201 << 125; bbox2 << 18 << 63 << 235 << 135; // Value calculated using Python interpreter. - BOOST_REQUIRE_CLOSE(IoU::Evaluate(bbox1, bbox2), 0.612479577, 1e-4); + REQUIRE(IoU::Evaluate(bbox1, bbox2) == + Approx(0.612479577).epsilon(1e-6)); // Use hieght - width representation of bounding boxes. // Bounding boxes represent {x0, y0, h, w}. bbox1 << 49 << 75 << 154 << 50; bbox2 << 42 << 78 << 144 << 48; // Value calculated using Python interpreter. - BOOST_REQUIRE_CLOSE(IoU<>::Evaluate(bbox1, bbox2), 0.7898879, 1e-4); + REQUIRE(IoU<>::Evaluate(bbox1, bbox2) == Approx(0.7898879).epsilon(1e-6)); bbox1 << 35 << 51 << 161 << 59; bbox2 << 36 << 60 << 144 << 48; // Value calculated using Python interpreter. - BOOST_REQUIRE_CLOSE(IoU<>::Evaluate(bbox1, bbox2), 0.7309670, 1e-4); + REQUIRE(IoU<>::Evaluate(bbox1, bbox2) == Approx(0.7309670).epsilon(1e-6)); } -BOOST_AUTO_TEST_CASE(NMSMetricTest) +TEST_CASE("NMSMetricTest", "[MetricTest]") { arma::mat bbox, selectedBoundingBox, desiredBoundingBox; arma::vec bbox1(4), bbox2(4), bbox3(4); @@ -172,13 +172,13 @@ BOOST_AUTO_TEST_CASE(NMSMetricTest) selectedBoundingBox = bbox.cols(selectedIndices); - BOOST_REQUIRE_EQUAL(selectedBoundingBox.n_cols, 2); - BOOST_REQUIRE_EQUAL(selectedBoundingBox.n_rows, 4); + REQUIRE(selectedBoundingBox.n_cols == 2); + REQUIRE(selectedBoundingBox.n_rows == 4); CheckMatrices(desiredBoundingBox, selectedBoundingBox); for (size_t i = 0; i < desiredIndices.n_elem; i++) { - BOOST_REQUIRE_EQUAL(desiredIndices[i], selectedIndices[i]); + REQUIRE(desiredIndices[i] == selectedIndices[i]); } // Clean up. @@ -201,8 +201,8 @@ BOOST_AUTO_TEST_CASE(NMSMetricTest) selectedBoundingBox = bbox.cols(selectedIndices); - BOOST_REQUIRE_EQUAL(selectedBoundingBox.n_cols, 2); - BOOST_REQUIRE_EQUAL(selectedBoundingBox.n_rows, 4); + REQUIRE(selectedBoundingBox.n_cols == 2); + REQUIRE(selectedBoundingBox.n_rows == 4); CheckMatrices(desiredBoundingBox, selectedBoundingBox); // Clean up. @@ -233,8 +233,8 @@ BOOST_AUTO_TEST_CASE(NMSMetricTest) selectedBoundingBox = bbox.cols(selectedIndices); - BOOST_REQUIRE_EQUAL(selectedBoundingBox.n_cols, 2); - BOOST_REQUIRE_EQUAL(selectedBoundingBox.n_rows, 4); + REQUIRE(selectedBoundingBox.n_cols == 2); + REQUIRE(selectedBoundingBox.n_rows == 4); CheckMatrices(desiredBoundingBox, selectedBoundingBox); // Clean up. @@ -266,8 +266,8 @@ BOOST_AUTO_TEST_CASE(NMSMetricTest) selectedIndices); selectedBoundingBox = bbox.cols(selectedIndices); - BOOST_REQUIRE_EQUAL(selectedBoundingBox.n_cols, 2); - BOOST_REQUIRE_EQUAL(selectedBoundingBox.n_rows, 4); + REQUIRE(selectedBoundingBox.n_cols == 2); + REQUIRE(selectedBoundingBox.n_rows == 4); CheckMatrices(desiredBoundingBox, selectedBoundingBox); // Clean up. @@ -297,15 +297,15 @@ BOOST_AUTO_TEST_CASE(NMSMetricTest) selectedIndices, 0.7); selectedBoundingBox = bbox.cols(selectedIndices); - BOOST_REQUIRE_EQUAL(selectedBoundingBox.n_cols, 2); - BOOST_REQUIRE_EQUAL(selectedBoundingBox.n_rows, 4); + REQUIRE(selectedBoundingBox.n_cols == 2); + REQUIRE(selectedBoundingBox.n_rows == 4); CheckMatrices(desiredBoundingBox, selectedBoundingBox); } /** * */ -BOOST_AUTO_TEST_CASE(BLEUScoreTest) +TEST_CASE("BLEUScoreTest", "[MetricTest]") { typedef typename std::vector WordVector; std::vector> referenceCorpus @@ -330,34 +330,32 @@ BOOST_AUTO_TEST_CASE(BLEUScoreTest) //! We are not using smoothing function here. bleu.Evaluate(referenceCorpus, translationCorpus); - BOOST_REQUIRE_CLOSE_FRACTION(bleu.BLEUScore(), 0.0, 1e-05); - BOOST_REQUIRE_EQUAL(bleu.BrevityPenalty(), 1.0); - BOOST_REQUIRE_EQUAL(bleu.Ratio(), 1.0); - BOOST_REQUIRE_EQUAL(bleu.TranslationLength(), 12); - BOOST_REQUIRE_EQUAL(bleu.ReferenceLength(), 12); + REQUIRE(bleu.BLEUScore() == Approx(0.0).epsilon(1e-5)); + REQUIRE(bleu.BrevityPenalty() == 1.0); + REQUIRE(bleu.Ratio() == 1.0); + REQUIRE(bleu.TranslationLength() == 12); + REQUIRE(bleu.ReferenceLength() == 12); std::vector expectedPrecision = {0.666666f, 0.5555555f, 0.3333333f, 0.0f}; for (size_t i = 0; i < bleu.Precisions().size(); ++i) { - BOOST_REQUIRE_CLOSE_FRACTION(bleu.Precisions()[i], - expectedPrecision[i], 1e-04); + REQUIRE(bleu.Precisions()[i] == + Approx((double)expectedPrecision[i]).epsilon(1e-4)); } //! We will use smoothing function here by setting smooth to true. bleu.Evaluate(referenceCorpus, translationCorpus, true); - BOOST_REQUIRE_CLOSE_FRACTION(bleu.BLEUScore(), 0.459307, 1e-05); - BOOST_REQUIRE_EQUAL(bleu.BrevityPenalty(), 1.0); - BOOST_REQUIRE_EQUAL(bleu.Ratio(), 1.0); - BOOST_REQUIRE_EQUAL(bleu.TranslationLength(), 12); - BOOST_REQUIRE_EQUAL(bleu.ReferenceLength(), 12); + REQUIRE(bleu.BLEUScore() == Approx(0.459307).epsilon(1e-5)); + REQUIRE(bleu.BrevityPenalty() == 1.0); + REQUIRE(bleu.Ratio() == 1.0); + REQUIRE(bleu.TranslationLength() == 12); + REQUIRE(bleu.ReferenceLength() == 12); expectedPrecision = {0.692308f, 0.6f, 0.428571f, 0.25f}; for (size_t i = 0; i < bleu.Precisions().size(); ++i) { - BOOST_REQUIRE_CLOSE_FRACTION(bleu.Precisions()[i], - expectedPrecision[i], 1e-04); + REQUIRE(bleu.Precisions()[i] == + Approx(expectedPrecision[i]).epsilon(1e-4)); } } - -BOOST_AUTO_TEST_SUITE_END(); diff --git a/src/mlpack/tests/range_search_test.cpp b/src/mlpack/tests/range_search_test.cpp index 33dd5c56ca..7bd714beaf 100644 --- a/src/mlpack/tests/range_search_test.cpp +++ b/src/mlpack/tests/range_search_test.cpp @@ -13,8 +13,9 @@ #include #include #include -#include -#include "test_tools.hpp" + +#include "catch.hpp" +#include "test_catch_tools.hpp" using namespace mlpack; using namespace mlpack::range; @@ -24,8 +25,6 @@ using namespace mlpack::bound; using namespace mlpack::metric; using namespace std; -BOOST_AUTO_TEST_SUITE(RangeSearchTest); - // Get our results into a sorted format, so we can actually then test for // correctness. void SortResults(const vector>& neighbors, @@ -62,7 +61,7 @@ void CleanTree(TreeType& node) * dataset is in one dimension for simplicity -- the correct functionality of * distance functions is not tested here. */ -BOOST_AUTO_TEST_CASE(ExhaustiveSyntheticTest) +TEST_CASE("ExhaustiveSyntheticTest", "[RangeSearchTest]") { // Set up our data. arma::mat data(1, 11); @@ -111,109 +110,109 @@ BOOST_AUTO_TEST_CASE(ExhaustiveSyntheticTest) vector>> sortedOutput; SortResults(neighbors, distances, sortedOutput); - BOOST_REQUIRE(sortedOutput[newFromOld[0]].size() == 4); - BOOST_REQUIRE(sortedOutput[newFromOld[0]][0].second == newFromOld[2]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[0]][0].first, 0.10, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[0]][1].second == newFromOld[5]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[0]][1].first, 0.27, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[0]][2].second == newFromOld[1]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[0]][2].first, 0.30, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[0]][3].second == newFromOld[8]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[0]][3].first, 0.40, 1e-5); + REQUIRE(sortedOutput[newFromOld[0]].size() == 4); + REQUIRE(sortedOutput[newFromOld[0]][0].second == newFromOld[2]); + REQUIRE(sortedOutput[newFromOld[0]][0].first == Approx(0.10).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[0]][1].second == newFromOld[5]); + REQUIRE(sortedOutput[newFromOld[0]][1].first == Approx(0.27).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[0]][2].second == newFromOld[1]); + REQUIRE(sortedOutput[newFromOld[0]][2].first == Approx(0.30).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[0]][3].second == newFromOld[8]); + REQUIRE(sortedOutput[newFromOld[0]][3].first == Approx(0.40).epsilon(1e-7)); // Neighbors of point 1. - BOOST_REQUIRE(sortedOutput[newFromOld[1]].size() == 6); - BOOST_REQUIRE(sortedOutput[newFromOld[1]][0].second == newFromOld[8]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[1]][0].first, 0.10, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[1]][1].second == newFromOld[2]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[1]][1].first, 0.20, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[1]][2].second == newFromOld[0]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[1]][2].first, 0.30, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[1]][3].second == newFromOld[9]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[1]][3].first, 0.55, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[1]][4].second == newFromOld[5]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[1]][4].first, 0.57, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[1]][5].second == newFromOld[10]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[1]][5].first, 0.65, 1e-5); + REQUIRE(sortedOutput[newFromOld[1]].size() == 6); + REQUIRE(sortedOutput[newFromOld[1]][0].second == newFromOld[8]); + REQUIRE(sortedOutput[newFromOld[1]][0].first == Approx(0.10).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[1]][1].second == newFromOld[2]); + REQUIRE(sortedOutput[newFromOld[1]][1].first == Approx(0.20).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[1]][2].second == newFromOld[0]); + REQUIRE(sortedOutput[newFromOld[1]][2].first == Approx(0.30).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[1]][3].second == newFromOld[9]); + REQUIRE(sortedOutput[newFromOld[1]][3].first == Approx(0.55).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[1]][4].second == newFromOld[5]); + REQUIRE(sortedOutput[newFromOld[1]][4].first == Approx(0.57).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[1]][5].second == newFromOld[10]); + REQUIRE(sortedOutput[newFromOld[1]][5].first == Approx(0.65).epsilon(1e-7)); // Neighbors of point 2. - BOOST_REQUIRE(sortedOutput[newFromOld[2]].size() == 4); - BOOST_REQUIRE(sortedOutput[newFromOld[2]][0].second == newFromOld[0]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[2]][0].first, 0.10, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[2]][1].second == newFromOld[1]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[2]][1].first, 0.20, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[2]][2].second == newFromOld[8]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[2]][2].first, 0.30, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[2]][3].second == newFromOld[5]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[2]][3].first, 0.37, 1e-5); + REQUIRE(sortedOutput[newFromOld[2]].size() == 4); + REQUIRE(sortedOutput[newFromOld[2]][0].second == newFromOld[0]); + REQUIRE(sortedOutput[newFromOld[2]][0].first == Approx(0.10).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[2]][1].second == newFromOld[1]); + REQUIRE(sortedOutput[newFromOld[2]][1].first == Approx(0.20).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[2]][2].second == newFromOld[8]); + REQUIRE(sortedOutput[newFromOld[2]][2].first == Approx(0.30).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[2]][3].second == newFromOld[5]); + REQUIRE(sortedOutput[newFromOld[2]][3].first == Approx(0.37).epsilon(1e-7)); // Neighbors of point 3. - BOOST_REQUIRE(sortedOutput[newFromOld[3]].size() == 2); - BOOST_REQUIRE(sortedOutput[newFromOld[3]][0].second == newFromOld[10]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[3]][0].first, 0.25, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[3]][1].second == newFromOld[9]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[3]][1].first, 0.35, 1e-5); + REQUIRE(sortedOutput[newFromOld[3]].size() == 2); + REQUIRE(sortedOutput[newFromOld[3]][0].second == newFromOld[10]); + REQUIRE(sortedOutput[newFromOld[3]][0].first == Approx(0.25).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[3]][1].second == newFromOld[9]); + REQUIRE(sortedOutput[newFromOld[3]][1].first == Approx(0.35).epsilon(1e-7)); // Neighbors of point 4. - BOOST_REQUIRE(sortedOutput[newFromOld[4]].size() == 0); + REQUIRE(sortedOutput[newFromOld[4]].size() == 0); // Neighbors of point 5. - BOOST_REQUIRE(sortedOutput[newFromOld[5]].size() == 4); - BOOST_REQUIRE(sortedOutput[newFromOld[5]][0].second == newFromOld[0]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[5]][0].first, 0.27, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[5]][1].second == newFromOld[2]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[5]][1].first, 0.37, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[5]][2].second == newFromOld[1]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[5]][2].first, 0.57, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[5]][3].second == newFromOld[8]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[5]][3].first, 0.67, 1e-5); + REQUIRE(sortedOutput[newFromOld[5]].size() == 4); + REQUIRE(sortedOutput[newFromOld[5]][0].second == newFromOld[0]); + REQUIRE(sortedOutput[newFromOld[5]][0].first == Approx(0.27).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[5]][1].second == newFromOld[2]); + REQUIRE(sortedOutput[newFromOld[5]][1].first == Approx(0.37).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[5]][2].second == newFromOld[1]); + REQUIRE(sortedOutput[newFromOld[5]][2].first == Approx(0.57).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[5]][3].second == newFromOld[8]); + REQUIRE(sortedOutput[newFromOld[5]][3].first == Approx(0.67).epsilon(1e-7)); // Neighbors of point 6. - BOOST_REQUIRE(sortedOutput[newFromOld[6]].size() == 1); - BOOST_REQUIRE(sortedOutput[newFromOld[6]][0].second == newFromOld[7]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[6]][0].first, 0.70, 1e-5); + REQUIRE(sortedOutput[newFromOld[6]].size() == 1); + REQUIRE(sortedOutput[newFromOld[6]][0].second == newFromOld[7]); + REQUIRE(sortedOutput[newFromOld[6]][0].first == Approx(0.70).epsilon(1e-7)); // Neighbors of point 7. - BOOST_REQUIRE(sortedOutput[newFromOld[7]].size() == 1); - BOOST_REQUIRE(sortedOutput[newFromOld[7]][0].second == newFromOld[6]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[7]][0].first, 0.70, 1e-5); + REQUIRE(sortedOutput[newFromOld[7]].size() == 1); + REQUIRE(sortedOutput[newFromOld[7]][0].second == newFromOld[6]); + REQUIRE(sortedOutput[newFromOld[7]][0].first == Approx(0.70).epsilon(1e-7)); // Neighbors of point 8. - BOOST_REQUIRE(sortedOutput[newFromOld[8]].size() == 6); - BOOST_REQUIRE(sortedOutput[newFromOld[8]][0].second == newFromOld[1]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[8]][0].first, 0.10, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[8]][1].second == newFromOld[2]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[8]][1].first, 0.30, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[8]][2].second == newFromOld[0]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[8]][2].first, 0.40, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[8]][3].second == newFromOld[9]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[8]][3].first, 0.45, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[8]][4].second == newFromOld[10]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[8]][4].first, 0.55, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[8]][5].second == newFromOld[5]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[8]][5].first, 0.67, 1e-5); + REQUIRE(sortedOutput[newFromOld[8]].size() == 6); + REQUIRE(sortedOutput[newFromOld[8]][0].second == newFromOld[1]); + REQUIRE(sortedOutput[newFromOld[8]][0].first == Approx(0.10).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[8]][1].second == newFromOld[2]); + REQUIRE(sortedOutput[newFromOld[8]][1].first == Approx(0.30).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[8]][2].second == newFromOld[0]); + REQUIRE(sortedOutput[newFromOld[8]][2].first == Approx(0.40).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[8]][3].second == newFromOld[9]); + REQUIRE(sortedOutput[newFromOld[8]][3].first == Approx(0.45).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[8]][4].second == newFromOld[10]); + REQUIRE(sortedOutput[newFromOld[8]][4].first == Approx(0.55).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[8]][5].second == newFromOld[5]); + REQUIRE(sortedOutput[newFromOld[8]][5].first == Approx(0.67).epsilon(1e-7)); // Neighbors of point 9. - BOOST_REQUIRE(sortedOutput[newFromOld[9]].size() == 4); - BOOST_REQUIRE(sortedOutput[newFromOld[9]][0].second == newFromOld[10]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[9]][0].first, 0.10, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[9]][1].second == newFromOld[3]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[9]][1].first, 0.35, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[9]][2].second == newFromOld[8]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[9]][2].first, 0.45, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[9]][3].second == newFromOld[1]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[9]][3].first, 0.55, 1e-5); + REQUIRE(sortedOutput[newFromOld[9]].size() == 4); + REQUIRE(sortedOutput[newFromOld[9]][0].second == newFromOld[10]); + REQUIRE(sortedOutput[newFromOld[9]][0].first == Approx(0.10).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[9]][1].second == newFromOld[3]); + REQUIRE(sortedOutput[newFromOld[9]][1].first == Approx(0.35).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[9]][2].second == newFromOld[8]); + REQUIRE(sortedOutput[newFromOld[9]][2].first == Approx(0.45).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[9]][3].second == newFromOld[1]); + REQUIRE(sortedOutput[newFromOld[9]][3].first == Approx(0.55).epsilon(1e-7)); // Neighbors of point 10. - BOOST_REQUIRE(sortedOutput[newFromOld[10]].size() == 4); - BOOST_REQUIRE(sortedOutput[newFromOld[10]][0].second == newFromOld[9]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[10]][0].first, 0.10, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[10]][1].second == newFromOld[3]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[10]][1].first, 0.25, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[10]][2].second == newFromOld[8]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[10]][2].first, 0.55, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[10]][3].second == newFromOld[1]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[10]][3].first, 0.65, 1e-5); + REQUIRE(sortedOutput[newFromOld[10]].size() == 4); + REQUIRE(sortedOutput[newFromOld[10]][0].second == newFromOld[9]); + REQUIRE(sortedOutput[newFromOld[10]][0].first == Approx(0.10).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[10]][1].second == newFromOld[3]); + REQUIRE(sortedOutput[newFromOld[10]][1].first == Approx(0.25).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[10]][2].second == newFromOld[8]); + REQUIRE(sortedOutput[newFromOld[10]][2].first == Approx(0.55).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[10]][3].second == newFromOld[1]); + REQUIRE(sortedOutput[newFromOld[10]][3].first == Approx(0.65).epsilon(1e-7)); // Now do it again with a different range: [sqrt(0.5) 1.0]. if (rs->ReferenceTree()) @@ -222,61 +221,61 @@ BOOST_AUTO_TEST_CASE(ExhaustiveSyntheticTest) SortResults(neighbors, distances, sortedOutput); // Neighbors of point 0. - BOOST_REQUIRE(sortedOutput[newFromOld[0]].size() == 2); - BOOST_REQUIRE(sortedOutput[newFromOld[0]][0].second == newFromOld[9]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[0]][0].first, 0.85, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[0]][1].second == newFromOld[10]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[0]][1].first, 0.95, 1e-5); + REQUIRE(sortedOutput[newFromOld[0]].size() == 2); + REQUIRE(sortedOutput[newFromOld[0]][0].second == newFromOld[9]); + REQUIRE(sortedOutput[newFromOld[0]][0].first == Approx(0.85).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[0]][1].second == newFromOld[10]); + REQUIRE(sortedOutput[newFromOld[0]][1].first == Approx(0.95).epsilon(1e-7)); // Neighbors of point 1. - BOOST_REQUIRE(sortedOutput[newFromOld[1]].size() == 1); - BOOST_REQUIRE(sortedOutput[newFromOld[1]][0].second == newFromOld[3]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[1]][0].first, 0.90, 1e-5); + REQUIRE(sortedOutput[newFromOld[1]].size() == 1); + REQUIRE(sortedOutput[newFromOld[1]][0].second == newFromOld[3]); + REQUIRE(sortedOutput[newFromOld[1]][0].first == Approx(0.90).epsilon(1e-7)); // Neighbors of point 2. - BOOST_REQUIRE(sortedOutput[newFromOld[2]].size() == 2); - BOOST_REQUIRE(sortedOutput[newFromOld[2]][0].second == newFromOld[9]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[2]][0].first, 0.75, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[2]][1].second == newFromOld[10]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[2]][1].first, 0.85, 1e-5); + REQUIRE(sortedOutput[newFromOld[2]].size() == 2); + REQUIRE(sortedOutput[newFromOld[2]][0].second == newFromOld[9]); + REQUIRE(sortedOutput[newFromOld[2]][0].first == Approx(0.75).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[2]][1].second == newFromOld[10]); + REQUIRE(sortedOutput[newFromOld[2]][1].first == Approx(0.85).epsilon(1e-7)); // Neighbors of point 3. - BOOST_REQUIRE(sortedOutput[newFromOld[3]].size() == 2); - BOOST_REQUIRE(sortedOutput[newFromOld[3]][0].second == newFromOld[8]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[3]][0].first, 0.80, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[3]][1].second == newFromOld[1]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[3]][1].first, 0.90, 1e-5); + REQUIRE(sortedOutput[newFromOld[3]].size() == 2); + REQUIRE(sortedOutput[newFromOld[3]][0].second == newFromOld[8]); + REQUIRE(sortedOutput[newFromOld[3]][0].first == Approx(0.80).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[3]][1].second == newFromOld[1]); + REQUIRE(sortedOutput[newFromOld[3]][1].first == Approx(0.90).epsilon(1e-7)); // Neighbors of point 4. - BOOST_REQUIRE(sortedOutput[newFromOld[4]].size() == 0); + REQUIRE(sortedOutput[newFromOld[4]].size() == 0); // Neighbors of point 5. - BOOST_REQUIRE(sortedOutput[newFromOld[5]].size() == 0); + REQUIRE(sortedOutput[newFromOld[5]].size() == 0); // Neighbors of point 6. - BOOST_REQUIRE(sortedOutput[newFromOld[6]].size() == 0); + REQUIRE(sortedOutput[newFromOld[6]].size() == 0); // Neighbors of point 7. - BOOST_REQUIRE(sortedOutput[newFromOld[7]].size() == 0); + REQUIRE(sortedOutput[newFromOld[7]].size() == 0); // Neighbors of point 8. - BOOST_REQUIRE(sortedOutput[newFromOld[8]].size() == 1); - BOOST_REQUIRE(sortedOutput[newFromOld[8]][0].second == newFromOld[3]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[8]][0].first, 0.80, 1e-5); + REQUIRE(sortedOutput[newFromOld[8]].size() == 1); + REQUIRE(sortedOutput[newFromOld[8]][0].second == newFromOld[3]); + REQUIRE(sortedOutput[newFromOld[8]][0].first == Approx(0.80).epsilon(1e-7)); // Neighbors of point 9. - BOOST_REQUIRE(sortedOutput[newFromOld[9]].size() == 2); - BOOST_REQUIRE(sortedOutput[newFromOld[9]][0].second == newFromOld[2]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[9]][0].first, 0.75, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[9]][1].second == newFromOld[0]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[9]][1].first, 0.85, 1e-5); + REQUIRE(sortedOutput[newFromOld[9]].size() == 2); + REQUIRE(sortedOutput[newFromOld[9]][0].second == newFromOld[2]); + REQUIRE(sortedOutput[newFromOld[9]][0].first == Approx(0.75).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[9]][1].second == newFromOld[0]); + REQUIRE(sortedOutput[newFromOld[9]][1].first == Approx(0.85).epsilon(1e-7)); // Neighbors of point 10. - BOOST_REQUIRE(sortedOutput[newFromOld[10]].size() == 2); - BOOST_REQUIRE(sortedOutput[newFromOld[10]][0].second == newFromOld[2]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[10]][0].first, 0.85, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[10]][1].second == newFromOld[0]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[10]][1].first, 0.95, 1e-5); + REQUIRE(sortedOutput[newFromOld[10]].size() == 2); + REQUIRE(sortedOutput[newFromOld[10]][0].second == newFromOld[2]); + REQUIRE(sortedOutput[newFromOld[10]][0].first == Approx(0.85).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[10]][1].second == newFromOld[0]); + REQUIRE(sortedOutput[newFromOld[10]][1].first == Approx(0.95).epsilon(1e-7)); // Now do it again with a different range: [1.0 inf]. if (rs->ReferenceTree()) @@ -286,161 +285,161 @@ BOOST_AUTO_TEST_CASE(ExhaustiveSyntheticTest) SortResults(neighbors, distances, sortedOutput); // Neighbors of point 0. - BOOST_REQUIRE(sortedOutput[newFromOld[0]].size() == 4); - BOOST_REQUIRE(sortedOutput[newFromOld[0]][0].second == newFromOld[3]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[0]][0].first, 1.20, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[0]][1].second == newFromOld[7]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[0]][1].first, 1.35, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[0]][2].second == newFromOld[6]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[0]][2].first, 2.05, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[0]][3].second == newFromOld[4]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[0]][3].first, 5.00, 1e-5); + REQUIRE(sortedOutput[newFromOld[0]].size() == 4); + REQUIRE(sortedOutput[newFromOld[0]][0].second == newFromOld[3]); + REQUIRE(sortedOutput[newFromOld[0]][0].first == Approx(1.20).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[0]][1].second == newFromOld[7]); + REQUIRE(sortedOutput[newFromOld[0]][1].first == Approx(1.35).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[0]][2].second == newFromOld[6]); + REQUIRE(sortedOutput[newFromOld[0]][2].first == Approx(2.05).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[0]][3].second == newFromOld[4]); + REQUIRE(sortedOutput[newFromOld[0]][3].first == Approx(5.00).epsilon(1e-7)); // Neighbors of point 1. - BOOST_REQUIRE(sortedOutput[newFromOld[1]].size() == 3); - BOOST_REQUIRE(sortedOutput[newFromOld[1]][0].second == newFromOld[7]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[1]][0].first, 1.65, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[1]][1].second == newFromOld[6]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[1]][1].first, 2.35, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[1]][2].second == newFromOld[4]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[1]][2].first, 4.70, 1e-5); + REQUIRE(sortedOutput[newFromOld[1]].size() == 3); + REQUIRE(sortedOutput[newFromOld[1]][0].second == newFromOld[7]); + REQUIRE(sortedOutput[newFromOld[1]][0].first == Approx(1.65).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[1]][1].second == newFromOld[6]); + REQUIRE(sortedOutput[newFromOld[1]][1].first == Approx(2.35).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[1]][2].second == newFromOld[4]); + REQUIRE(sortedOutput[newFromOld[1]][2].first == Approx(4.70).epsilon(1e-7)); // Neighbors of point 2. - BOOST_REQUIRE(sortedOutput[newFromOld[2]].size() == 4); - BOOST_REQUIRE(sortedOutput[newFromOld[2]][0].second == newFromOld[3]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[2]][0].first, 1.10, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[2]][1].second == newFromOld[7]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[2]][1].first, 1.45, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[2]][2].second == newFromOld[6]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[2]][2].first, 2.15, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[2]][3].second == newFromOld[4]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[2]][3].first, 4.90, 1e-5); + REQUIRE(sortedOutput[newFromOld[2]].size() == 4); + REQUIRE(sortedOutput[newFromOld[2]][0].second == newFromOld[3]); + REQUIRE(sortedOutput[newFromOld[2]][0].first == Approx(1.10).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[2]][1].second == newFromOld[7]); + REQUIRE(sortedOutput[newFromOld[2]][1].first == Approx(1.45).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[2]][2].second == newFromOld[6]); + REQUIRE(sortedOutput[newFromOld[2]][2].first == Approx(2.15).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[2]][3].second == newFromOld[4]); + REQUIRE(sortedOutput[newFromOld[2]][3].first == Approx(4.90).epsilon(1e-7)); // Neighbors of point 3. - BOOST_REQUIRE(sortedOutput[newFromOld[3]].size() == 6); - BOOST_REQUIRE(sortedOutput[newFromOld[3]][0].second == newFromOld[2]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[3]][0].first, 1.10, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[3]][1].second == newFromOld[0]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[3]][1].first, 1.20, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[3]][2].second == newFromOld[5]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[3]][2].first, 1.47, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[3]][3].second == newFromOld[7]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[3]][3].first, 2.55, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[3]][4].second == newFromOld[6]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[3]][4].first, 3.25, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[3]][5].second == newFromOld[4]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[3]][5].first, 3.80, 1e-5); + REQUIRE(sortedOutput[newFromOld[3]].size() == 6); + REQUIRE(sortedOutput[newFromOld[3]][0].second == newFromOld[2]); + REQUIRE(sortedOutput[newFromOld[3]][0].first == Approx(1.10).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[3]][1].second == newFromOld[0]); + REQUIRE(sortedOutput[newFromOld[3]][1].first == Approx(1.20).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[3]][2].second == newFromOld[5]); + REQUIRE(sortedOutput[newFromOld[3]][2].first == Approx(1.47).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[3]][3].second == newFromOld[7]); + REQUIRE(sortedOutput[newFromOld[3]][3].first == Approx(2.55).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[3]][4].second == newFromOld[6]); + REQUIRE(sortedOutput[newFromOld[3]][4].first == Approx(3.25).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[3]][5].second == newFromOld[4]); + REQUIRE(sortedOutput[newFromOld[3]][5].first == Approx(3.80).epsilon(1e-7)); // Neighbors of point 4. - BOOST_REQUIRE(sortedOutput[newFromOld[4]].size() == 10); - BOOST_REQUIRE(sortedOutput[newFromOld[4]][0].second == newFromOld[3]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[4]][0].first, 3.80, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[4]][1].second == newFromOld[10]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[4]][1].first, 4.05, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[4]][2].second == newFromOld[9]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[4]][2].first, 4.15, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[4]][3].second == newFromOld[8]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[4]][3].first, 4.60, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[4]][4].second == newFromOld[1]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[4]][4].first, 4.70, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[4]][5].second == newFromOld[2]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[4]][5].first, 4.90, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[4]][6].second == newFromOld[0]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[4]][6].first, 5.00, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[4]][7].second == newFromOld[5]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[4]][7].first, 5.27, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[4]][8].second == newFromOld[7]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[4]][8].first, 6.35, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[4]][9].second == newFromOld[6]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[4]][9].first, 7.05, 1e-5); + REQUIRE(sortedOutput[newFromOld[4]].size() == 10); + REQUIRE(sortedOutput[newFromOld[4]][0].second == newFromOld[3]); + REQUIRE(sortedOutput[newFromOld[4]][0].first == Approx(3.80).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[4]][1].second == newFromOld[10]); + REQUIRE(sortedOutput[newFromOld[4]][1].first == Approx(4.05).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[4]][2].second == newFromOld[9]); + REQUIRE(sortedOutput[newFromOld[4]][2].first == Approx(4.15).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[4]][3].second == newFromOld[8]); + REQUIRE(sortedOutput[newFromOld[4]][3].first == Approx(4.60).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[4]][4].second == newFromOld[1]); + REQUIRE(sortedOutput[newFromOld[4]][4].first == Approx(4.70).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[4]][5].second == newFromOld[2]); + REQUIRE(sortedOutput[newFromOld[4]][5].first == Approx(4.90).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[4]][6].second == newFromOld[0]); + REQUIRE(sortedOutput[newFromOld[4]][6].first == Approx(5.00).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[4]][7].second == newFromOld[5]); + REQUIRE(sortedOutput[newFromOld[4]][7].first == Approx(5.27).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[4]][8].second == newFromOld[7]); + REQUIRE(sortedOutput[newFromOld[4]][8].first == Approx(6.35).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[4]][9].second == newFromOld[6]); + REQUIRE(sortedOutput[newFromOld[4]][9].first == Approx(7.05).epsilon(1e-7)); // Neighbors of point 5. - BOOST_REQUIRE(sortedOutput[newFromOld[5]].size() == 6); - BOOST_REQUIRE(sortedOutput[newFromOld[5]][0].second == newFromOld[7]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[5]][0].first, 1.08, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[5]][1].second == newFromOld[9]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[5]][1].first, 1.12, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[5]][2].second == newFromOld[10]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[5]][2].first, 1.22, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[5]][3].second == newFromOld[3]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[5]][3].first, 1.47, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[5]][4].second == newFromOld[6]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[5]][4].first, 1.78, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[5]][5].second == newFromOld[4]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[5]][5].first, 5.27, 1e-5); + REQUIRE(sortedOutput[newFromOld[5]].size() == 6); + REQUIRE(sortedOutput[newFromOld[5]][0].second == newFromOld[7]); + REQUIRE(sortedOutput[newFromOld[5]][0].first == Approx(1.08).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[5]][1].second == newFromOld[9]); + REQUIRE(sortedOutput[newFromOld[5]][1].first == Approx(1.12).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[5]][2].second == newFromOld[10]); + REQUIRE(sortedOutput[newFromOld[5]][2].first == Approx(1.22).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[5]][3].second == newFromOld[3]); + REQUIRE(sortedOutput[newFromOld[5]][3].first == Approx(1.47).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[5]][4].second == newFromOld[6]); + REQUIRE(sortedOutput[newFromOld[5]][4].first == Approx(1.78).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[5]][5].second == newFromOld[4]); + REQUIRE(sortedOutput[newFromOld[5]][5].first == Approx(5.27).epsilon(1e-7)); // Neighbors of point 6. - BOOST_REQUIRE(sortedOutput[newFromOld[6]].size() == 9); - BOOST_REQUIRE(sortedOutput[newFromOld[6]][0].second == newFromOld[5]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[6]][0].first, 1.78, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[6]][1].second == newFromOld[0]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[6]][1].first, 2.05, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[6]][2].second == newFromOld[2]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[6]][2].first, 2.15, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[6]][3].second == newFromOld[1]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[6]][3].first, 2.35, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[6]][4].second == newFromOld[8]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[6]][4].first, 2.45, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[6]][5].second == newFromOld[9]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[6]][5].first, 2.90, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[6]][6].second == newFromOld[10]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[6]][6].first, 3.00, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[6]][7].second == newFromOld[3]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[6]][7].first, 3.25, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[6]][8].second == newFromOld[4]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[6]][8].first, 7.05, 1e-5); + REQUIRE(sortedOutput[newFromOld[6]].size() == 9); + REQUIRE(sortedOutput[newFromOld[6]][0].second == newFromOld[5]); + REQUIRE(sortedOutput[newFromOld[6]][0].first == Approx(1.78).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[6]][1].second == newFromOld[0]); + REQUIRE(sortedOutput[newFromOld[6]][1].first == Approx(2.05).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[6]][2].second == newFromOld[2]); + REQUIRE(sortedOutput[newFromOld[6]][2].first == Approx(2.15).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[6]][3].second == newFromOld[1]); + REQUIRE(sortedOutput[newFromOld[6]][3].first == Approx(2.35).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[6]][4].second == newFromOld[8]); + REQUIRE(sortedOutput[newFromOld[6]][4].first == Approx(2.45).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[6]][5].second == newFromOld[9]); + REQUIRE(sortedOutput[newFromOld[6]][5].first == Approx(2.90).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[6]][6].second == newFromOld[10]); + REQUIRE(sortedOutput[newFromOld[6]][6].first == Approx(3.00).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[6]][7].second == newFromOld[3]); + REQUIRE(sortedOutput[newFromOld[6]][7].first == Approx(3.25).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[6]][8].second == newFromOld[4]); + REQUIRE(sortedOutput[newFromOld[6]][8].first == Approx(7.05).epsilon(1e-7)); // Neighbors of point 7. - BOOST_REQUIRE(sortedOutput[newFromOld[7]].size() == 9); - BOOST_REQUIRE(sortedOutput[newFromOld[7]][0].second == newFromOld[5]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[7]][0].first, 1.08, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[7]][1].second == newFromOld[0]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[7]][1].first, 1.35, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[7]][2].second == newFromOld[2]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[7]][2].first, 1.45, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[7]][3].second == newFromOld[1]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[7]][3].first, 1.65, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[7]][4].second == newFromOld[8]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[7]][4].first, 1.75, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[7]][5].second == newFromOld[9]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[7]][5].first, 2.20, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[7]][6].second == newFromOld[10]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[7]][6].first, 2.30, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[7]][7].second == newFromOld[3]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[7]][7].first, 2.55, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[7]][8].second == newFromOld[4]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[7]][8].first, 6.35, 1e-5); + REQUIRE(sortedOutput[newFromOld[7]].size() == 9); + REQUIRE(sortedOutput[newFromOld[7]][0].second == newFromOld[5]); + REQUIRE(sortedOutput[newFromOld[7]][0].first == Approx(1.08).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[7]][1].second == newFromOld[0]); + REQUIRE(sortedOutput[newFromOld[7]][1].first == Approx(1.35).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[7]][2].second == newFromOld[2]); + REQUIRE(sortedOutput[newFromOld[7]][2].first == Approx(1.45).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[7]][3].second == newFromOld[1]); + REQUIRE(sortedOutput[newFromOld[7]][3].first == Approx(1.65).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[7]][4].second == newFromOld[8]); + REQUIRE(sortedOutput[newFromOld[7]][4].first == Approx(1.75).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[7]][5].second == newFromOld[9]); + REQUIRE(sortedOutput[newFromOld[7]][5].first == Approx(2.20).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[7]][6].second == newFromOld[10]); + REQUIRE(sortedOutput[newFromOld[7]][6].first == Approx(2.30).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[7]][7].second == newFromOld[3]); + REQUIRE(sortedOutput[newFromOld[7]][7].first == Approx(2.55).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[7]][8].second == newFromOld[4]); + REQUIRE(sortedOutput[newFromOld[7]][8].first == Approx(6.35).epsilon(1e-7)); // Neighbors of point 8. - BOOST_REQUIRE(sortedOutput[newFromOld[8]].size() == 3); - BOOST_REQUIRE(sortedOutput[newFromOld[8]][0].second == newFromOld[7]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[8]][0].first, 1.75, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[8]][1].second == newFromOld[6]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[8]][1].first, 2.45, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[8]][2].second == newFromOld[4]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[8]][2].first, 4.60, 1e-5); + REQUIRE(sortedOutput[newFromOld[8]].size() == 3); + REQUIRE(sortedOutput[newFromOld[8]][0].second == newFromOld[7]); + REQUIRE(sortedOutput[newFromOld[8]][0].first == Approx(1.75).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[8]][1].second == newFromOld[6]); + REQUIRE(sortedOutput[newFromOld[8]][1].first == Approx(2.45).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[8]][2].second == newFromOld[4]); + REQUIRE(sortedOutput[newFromOld[8]][2].first == Approx(4.60).epsilon(1e-7)); // Neighbors of point 9. - BOOST_REQUIRE(sortedOutput[newFromOld[9]].size() == 4); - BOOST_REQUIRE(sortedOutput[newFromOld[9]][0].second == newFromOld[5]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[9]][0].first, 1.12, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[9]][1].second == newFromOld[7]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[9]][1].first, 2.20, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[9]][2].second == newFromOld[6]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[9]][2].first, 2.90, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[9]][3].second == newFromOld[4]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[9]][3].first, 4.15, 1e-5); + REQUIRE(sortedOutput[newFromOld[9]].size() == 4); + REQUIRE(sortedOutput[newFromOld[9]][0].second == newFromOld[5]); + REQUIRE(sortedOutput[newFromOld[9]][0].first == Approx(1.12).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[9]][1].second == newFromOld[7]); + REQUIRE(sortedOutput[newFromOld[9]][1].first == Approx(2.20).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[9]][2].second == newFromOld[6]); + REQUIRE(sortedOutput[newFromOld[9]][2].first == Approx(2.90).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[9]][3].second == newFromOld[4]); + REQUIRE(sortedOutput[newFromOld[9]][3].first == Approx(4.15).epsilon(1e-7)); // Neighbors of point 10. - BOOST_REQUIRE(sortedOutput[newFromOld[10]].size() == 4); - BOOST_REQUIRE(sortedOutput[newFromOld[10]][0].second == newFromOld[5]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[10]][0].first, 1.22, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[10]][1].second == newFromOld[7]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[10]][1].first, 2.30, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[10]][2].second == newFromOld[6]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[10]][2].first, 3.00, 1e-5); - BOOST_REQUIRE(sortedOutput[newFromOld[10]][3].second == newFromOld[4]); - BOOST_REQUIRE_CLOSE(sortedOutput[newFromOld[10]][3].first, 4.05, 1e-5); + REQUIRE(sortedOutput[newFromOld[10]].size() == 4); + REQUIRE(sortedOutput[newFromOld[10]][0].second == newFromOld[5]); + REQUIRE(sortedOutput[newFromOld[10]][0].first == Approx(1.22).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[10]][1].second == newFromOld[7]); + REQUIRE(sortedOutput[newFromOld[10]][1].first == Approx(2.30).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[10]][2].second == newFromOld[6]); + REQUIRE(sortedOutput[newFromOld[10]][2].first == Approx(3.00).epsilon(1e-7)); + REQUIRE(sortedOutput[newFromOld[10]][3].second == newFromOld[4]); + REQUIRE(sortedOutput[newFromOld[10]][3].first == Approx(4.05).epsilon(1e-7)); // Clean the memory. delete rs; @@ -455,13 +454,13 @@ BOOST_AUTO_TEST_CASE(ExhaustiveSyntheticTest) * * Errors are produced if the results are not identical. */ -BOOST_AUTO_TEST_CASE(DualTreeVsNaive1) +TEST_CASE("DualTreeVsNaive1", "[RangeSearchTest]") { arma::mat dataForTree; // Hard-coded filename: bad! if (!data::Load("test_data_3_1000.csv", dataForTree)) - BOOST_FAIL("Cannot load test dataset test_data_3_1000.csv!"); + FAIL("Cannot load test dataset test_data_3_1000.csv!"); // Set up matrices to work with. arma::mat dualQuery(dataForTree); @@ -487,13 +486,13 @@ BOOST_AUTO_TEST_CASE(DualTreeVsNaive1) for (size_t i = 0; i < sortedTree.size(); ++i) { - BOOST_REQUIRE(sortedTree[i].size() == sortedNaive[i].size()); + REQUIRE(sortedTree[i].size() == sortedNaive[i].size()); for (size_t j = 0; j < sortedTree[i].size(); ++j) { - BOOST_REQUIRE(sortedTree[i][j].second == sortedNaive[i][j].second); - BOOST_REQUIRE_CLOSE(sortedTree[i][j].first, sortedNaive[i][j].first, - 1e-5); + REQUIRE(sortedTree[i][j].second == sortedNaive[i][j].second); + REQUIRE(sortedTree[i][j].first == + Approx(sortedNaive[i][j].first).epsilon(1e-7)); } } } @@ -504,14 +503,14 @@ BOOST_AUTO_TEST_CASE(DualTreeVsNaive1) * * Errors are produced if the results are not identical. */ -BOOST_AUTO_TEST_CASE(DualTreeVsNaive2) +TEST_CASE("DualTreeVsNaive2", "[RangeSearchTest]") { arma::mat dataForTree; // Hard-coded filename: bad! // Code duplication: also bad! if (!data::Load("test_data_3_1000.csv", dataForTree)) - BOOST_FAIL("Cannot load test dataset test_data_3_1000.csv!"); + FAIL("Cannot load test dataset test_data_3_1000.csv!"); // Set up matrices to work with. arma::mat dualQuery(dataForTree); @@ -536,13 +535,13 @@ BOOST_AUTO_TEST_CASE(DualTreeVsNaive2) for (size_t i = 0; i < sortedTree.size(); ++i) { - BOOST_REQUIRE(sortedTree[i].size() == sortedNaive[i].size()); + REQUIRE(sortedTree[i].size() == sortedNaive[i].size()); for (size_t j = 0; j < sortedTree[i].size(); ++j) { - BOOST_REQUIRE(sortedTree[i][j].second == sortedNaive[i][j].second); - BOOST_REQUIRE_CLOSE(sortedTree[i][j].first, sortedNaive[i][j].first, - 1e-5); + REQUIRE(sortedTree[i][j].second == sortedNaive[i][j].second); + REQUIRE(sortedTree[i][j].first == + Approx(sortedNaive[i][j].first).epsilon(1e-7)); } } } @@ -553,14 +552,14 @@ BOOST_AUTO_TEST_CASE(DualTreeVsNaive2) * * Errors are produced if the results are not identical. */ -BOOST_AUTO_TEST_CASE(SingleTreeVsNaive) +TEST_CASE("SingleTreeVsNaive", "[RangeSearchTest]") { arma::mat dataForTree; // Hard-coded filename: bad! // Code duplication: also bad! if (!data::Load("test_data_3_1000.csv", dataForTree)) - BOOST_FAIL("Cannot load test dataset test_data_3_1000.csv!"); + FAIL("Cannot load test dataset test_data_3_1000.csv!"); // Set up matrices to work with (may not be necessary with no ALIAS_MATRIX?). arma::mat singleQuery(dataForTree); @@ -585,13 +584,13 @@ BOOST_AUTO_TEST_CASE(SingleTreeVsNaive) for (size_t i = 0; i < sortedTree.size(); ++i) { - BOOST_REQUIRE(sortedTree[i].size() == sortedNaive[i].size()); + REQUIRE(sortedTree[i].size() == sortedNaive[i].size()); for (size_t j = 0; j < sortedTree[i].size(); ++j) { - BOOST_REQUIRE(sortedTree[i][j].second == sortedNaive[i][j].second); - BOOST_REQUIRE_CLOSE(sortedTree[i][j].first, sortedNaive[i][j].first, - 1e-5); + REQUIRE(sortedTree[i][j].second == sortedNaive[i][j].second); + REQUIRE(sortedTree[i][j].first == + Approx(sortedNaive[i][j].first).epsilon(1e-7)); } } } @@ -600,7 +599,7 @@ BOOST_AUTO_TEST_CASE(SingleTreeVsNaive) * Ensure that dual tree range search with cover trees works by comparing * with the kd-tree implementation. */ -BOOST_AUTO_TEST_CASE(CoverTreeTest) +TEST_CASE("CoverTreeTest", "[RangeSearchTest]") { arma::mat data; data.randu(8, 1000); // 1000 points in 8 dimensions. @@ -662,11 +661,11 @@ BOOST_AUTO_TEST_CASE(CoverTreeTest) { for (size_t j = 0; j < kdSorted[i].size(); ++j) { - BOOST_REQUIRE_EQUAL(kdSorted[i][j].second, coverSorted[i][j].second); - BOOST_REQUIRE_CLOSE(kdSorted[i][j].first, coverSorted[i][j].first, - 1e-5); + REQUIRE(kdSorted[i][j].second == coverSorted[i][j].second); + REQUIRE(kdSorted[i][j].first == + Approx(coverSorted[i][j].first).epsilon(1e-7)); } - BOOST_REQUIRE_EQUAL(kdSorted[i].size(), coverSorted[i].size()); + REQUIRE(kdSorted[i].size() == coverSorted[i].size()); } } } @@ -675,7 +674,7 @@ BOOST_AUTO_TEST_CASE(CoverTreeTest) * Ensure that dual tree range search with cover trees works when using * two datasets. */ -BOOST_AUTO_TEST_CASE(CoverTreeTwoDatasetsTest) +TEST_CASE("CoverTreeTwoDatasetsTest", "[RangeSearchTest]") { arma::mat data; data.randu(8, 1000); // 1000 points in 8 dimensions. @@ -740,11 +739,11 @@ BOOST_AUTO_TEST_CASE(CoverTreeTwoDatasetsTest) { for (size_t j = 0; j < kdSorted[i].size(); ++j) { - BOOST_REQUIRE_EQUAL(kdSorted[i][j].second, coverSorted[i][j].second); - BOOST_REQUIRE_CLOSE(kdSorted[i][j].first, coverSorted[i][j].first, - 1e-5); + REQUIRE(kdSorted[i][j].second == coverSorted[i][j].second); + REQUIRE(kdSorted[i][j].first == + Approx(coverSorted[i][j].first).epsilon(1e-7)); } - BOOST_REQUIRE_EQUAL(kdSorted[i].size(), coverSorted[i].size()); + REQUIRE(kdSorted[i].size() == coverSorted[i].size()); } } } @@ -752,7 +751,7 @@ BOOST_AUTO_TEST_CASE(CoverTreeTwoDatasetsTest) /** * Ensure that single-tree cover tree range search works. */ -BOOST_AUTO_TEST_CASE(CoverTreeSingleTreeTest) +TEST_CASE("CoverTreeSingleTreeTest", "[RangeSearchTest]") { arma::mat data; data.randu(8, 1000); // 1000 points in 8 dimensions. @@ -814,11 +813,11 @@ BOOST_AUTO_TEST_CASE(CoverTreeSingleTreeTest) { for (size_t j = 0; j < kdSorted[i].size(); ++j) { - BOOST_REQUIRE_EQUAL(kdSorted[i][j].second, coverSorted[i][j].second); - BOOST_REQUIRE_CLOSE(kdSorted[i][j].first, coverSorted[i][j].first, - 1e-5); + REQUIRE(kdSorted[i][j].second == coverSorted[i][j].second); + REQUIRE(kdSorted[i][j].first == + Approx(coverSorted[i][j].first).epsilon(1e-7)); } - BOOST_REQUIRE_EQUAL(kdSorted[i].size(), coverSorted[i].size()); + REQUIRE(kdSorted[i].size() == coverSorted[i].size()); } } } @@ -826,7 +825,7 @@ BOOST_AUTO_TEST_CASE(CoverTreeSingleTreeTest) /** * Ensure that single-tree ball tree range search works. */ -BOOST_AUTO_TEST_CASE(SingleBallTreeTest) +TEST_CASE("SingleBallTreeTest", "[RangeSearchTest]") { arma::mat data; data.randu(8, 1000); // 1000 points in 8 dimensions. @@ -888,11 +887,11 @@ BOOST_AUTO_TEST_CASE(SingleBallTreeTest) { for (size_t j = 0; j < kdSorted[i].size(); ++j) { - BOOST_REQUIRE_EQUAL(kdSorted[i][j].second, ballSorted[i][j].second); - BOOST_REQUIRE_CLOSE(kdSorted[i][j].first, ballSorted[i][j].first, - 1e-5); + REQUIRE(kdSorted[i][j].second == ballSorted[i][j].second); + REQUIRE(kdSorted[i][j].first == + Approx(ballSorted[i][j].first).epsilon(1e-7)); } - BOOST_REQUIRE_EQUAL(kdSorted[i].size(), ballSorted[i].size()); + REQUIRE(kdSorted[i].size() == ballSorted[i].size()); } } } @@ -901,7 +900,7 @@ BOOST_AUTO_TEST_CASE(SingleBallTreeTest) * Ensure that dual tree range search with ball trees works by comparing * with the kd-tree implementation. */ -BOOST_AUTO_TEST_CASE(DualBallTreeTest) +TEST_CASE("DualBallTreeTest", "[RangeSearchTest]") { arma::mat data; data.randu(8, 1000); // 1000 points in 8 dimensions. @@ -962,11 +961,11 @@ BOOST_AUTO_TEST_CASE(DualBallTreeTest) { for (size_t j = 0; j < kdSorted[i].size(); ++j) { - BOOST_REQUIRE_EQUAL(kdSorted[i][j].second, ballSorted[i][j].second); - BOOST_REQUIRE_CLOSE(kdSorted[i][j].first, ballSorted[i][j].first, - 1e-5); + REQUIRE(kdSorted[i][j].second == ballSorted[i][j].second); + REQUIRE(kdSorted[i][j].first == + Approx(ballSorted[i][j].first).epsilon(1e-7)); } - BOOST_REQUIRE_EQUAL(kdSorted[i].size(), ballSorted[i].size()); + REQUIRE(kdSorted[i].size() == ballSorted[i].size()); } } } @@ -975,7 +974,7 @@ BOOST_AUTO_TEST_CASE(DualBallTreeTest) * Ensure that dual tree range search with ball trees works when using * two datasets. */ -BOOST_AUTO_TEST_CASE(DualBallTreeTest2) +TEST_CASE("DualBallTreeTest2", "[RangeSearchTest]") { arma::mat data; data.randu(8, 1000); // 1000 points in 8 dimensions. @@ -1038,12 +1037,12 @@ BOOST_AUTO_TEST_CASE(DualBallTreeTest2) // Now compare the results. for (size_t i = 0; i < kdSorted.size(); ++i) { - BOOST_REQUIRE_EQUAL(kdSorted[i].size(), ballSorted[i].size()); + REQUIRE(kdSorted[i].size() == ballSorted[i].size()); for (size_t j = 0; j < kdSorted[i].size(); ++j) { - BOOST_REQUIRE_EQUAL(kdSorted[i][j].second, ballSorted[i][j].second); - BOOST_REQUIRE_CLOSE(kdSorted[i][j].first, ballSorted[i][j].first, - 1e-5); + REQUIRE(kdSorted[i][j].second == ballSorted[i][j].second); + REQUIRE(kdSorted[i][j].first == + Approx(ballSorted[i][j].first).epsilon (1e-7)); } } } @@ -1053,7 +1052,7 @@ BOOST_AUTO_TEST_CASE(DualBallTreeTest2) * Make sure that no results are returned when we build a range search object * with no reference set. */ -BOOST_AUTO_TEST_CASE(EmptySearchTest) +TEST_CASE("EmptySearchTest", "[RangeSearchTest]") { RangeSearch rs; @@ -1062,20 +1061,20 @@ BOOST_AUTO_TEST_CASE(EmptySearchTest) rs.Search(math::Range(0.0, 10.0), neighbors, distances); - BOOST_REQUIRE_EQUAL(neighbors.size(), 0); - BOOST_REQUIRE_EQUAL(distances.size(), 0); + REQUIRE(neighbors.size() == 0); + REQUIRE(distances.size() == 0); // Now check with a query set. arma::mat querySet = arma::randu(3, 100); - BOOST_REQUIRE_THROW(rs.Search(querySet, math::Range(0.0, 10.0), neighbors, + REQUIRE_THROWS_AS(rs.Search(querySet, math::Range(0.0, 10.0), neighbors, distances), std::invalid_argument); } /** * Make sure things work right after Train() is called. */ -BOOST_AUTO_TEST_CASE(TrainTest) +TEST_CASE("RangeSearchTrainTest", "[RangeSearchTest]") { RangeSearch<> empty; @@ -1090,8 +1089,8 @@ BOOST_AUTO_TEST_CASE(TrainTest) empty.Search(math::Range(0.5, 0.7), neighbors, distances); baseline.Search(math::Range(0.5, 0.7), baselineNeighbors, baselineDistances); - BOOST_REQUIRE_EQUAL(neighbors.size(), baselineNeighbors.size()); - BOOST_REQUIRE_EQUAL(distances.size(), baselineDistances.size()); + REQUIRE(neighbors.size() == baselineNeighbors.size()); + REQUIRE(distances.size() == baselineDistances.size()); // Sort the results before comparing. vector>> sorted; @@ -1101,11 +1100,12 @@ BOOST_AUTO_TEST_CASE(TrainTest) for (size_t i = 0; i < sorted.size(); ++i) { - BOOST_REQUIRE_EQUAL(sorted[i].size(), baselineSorted[i].size()); + REQUIRE(sorted[i].size() == baselineSorted[i].size()); for (size_t j = 0; j < sorted[i].size(); ++j) { - BOOST_REQUIRE_EQUAL(sorted[i][j].second, baselineSorted[i][j].second); - BOOST_REQUIRE_CLOSE(sorted[i][j].first, baselineSorted[i][j].first, 1e-5); + REQUIRE(sorted[i][j].second == baselineSorted[i][j].second); + REQUIRE(sorted[i][j].first == + Approx(baselineSorted[i][j].first).epsilon(1e-7)); } } } @@ -1113,7 +1113,7 @@ BOOST_AUTO_TEST_CASE(TrainTest) /** * Test training when a tree is given. */ -BOOST_AUTO_TEST_CASE(TrainTreeTest) +TEST_CASE("TrainTreeTest", "[RangeSearchTest]") { // Avoid mappings by using the cover tree. typedef RangeSearch RSType; @@ -1131,8 +1131,8 @@ BOOST_AUTO_TEST_CASE(TrainTreeTest) empty.Search(math::Range(0.5, 0.7), neighbors, distances); baseline.Search(math::Range(0.5, 0.7), baselineNeighbors, baselineDistances); - BOOST_REQUIRE_EQUAL(neighbors.size(), baselineNeighbors.size()); - BOOST_REQUIRE_EQUAL(distances.size(), baselineDistances.size()); + REQUIRE(neighbors.size() == baselineNeighbors.size()); + REQUIRE(distances.size() == baselineDistances.size()); // Sort the results before comparing. vector>> sorted; @@ -1142,11 +1142,12 @@ BOOST_AUTO_TEST_CASE(TrainTreeTest) for (size_t i = 0; i < sorted.size(); ++i) { - BOOST_REQUIRE_EQUAL(sorted[i].size(), baselineSorted[i].size()); + REQUIRE(sorted[i].size() == baselineSorted[i].size()); for (size_t j = 0; j < sorted[i].size(); ++j) { - BOOST_REQUIRE_EQUAL(sorted[i][j].second, baselineSorted[i][j].second); - BOOST_REQUIRE_CLOSE(sorted[i][j].first, baselineSorted[i][j].first, 1e-5); + REQUIRE(sorted[i][j].second == baselineSorted[i][j].second); + REQUIRE(sorted[i][j].first == + Approx(baselineSorted[i][j].first).epsilon(1e-7)); } } } @@ -1154,20 +1155,20 @@ BOOST_AUTO_TEST_CASE(TrainTreeTest) /** * Test that training with a tree throws an exception when in naive mode. */ -BOOST_AUTO_TEST_CASE(NaiveTrainTreeTest) +TEST_CASE("NaiveTrainTreeTest", "[RangeSearchTest]") { RangeSearch<> empty(true); arma::mat dataset = arma::randu(5, 100); RangeSearch<>::Tree tree(dataset); - BOOST_REQUIRE_THROW(empty.Train(&tree), std::invalid_argument); + REQUIRE_THROWS_AS(empty.Train(&tree), std::invalid_argument); } /** * Test that the move constructor works. */ -BOOST_AUTO_TEST_CASE(MoveConstructorMatrixTest) +TEST_CASE("MoveConstructorMatrixTest", "[RangeSearchTest]") { arma::mat dataset = arma::randu(3, 100); arma::mat copy(dataset); @@ -1175,9 +1176,9 @@ BOOST_AUTO_TEST_CASE(MoveConstructorMatrixTest) RangeSearch<> movers(std::move(copy)); RangeSearch<> rs(dataset); - BOOST_REQUIRE_EQUAL(copy.n_elem, 0); - BOOST_REQUIRE_EQUAL(movers.ReferenceSet().n_rows, 3); - BOOST_REQUIRE_EQUAL(movers.ReferenceSet().n_cols, 100); + REQUIRE(copy.n_elem == 0); + REQUIRE(movers.ReferenceSet().n_rows == 3); + REQUIRE(movers.ReferenceSet().n_cols == 100); vector> moveNeighbors, neighbors; vector> moveDistances, distances; @@ -1185,8 +1186,8 @@ BOOST_AUTO_TEST_CASE(MoveConstructorMatrixTest) movers.Search(math::Range(0.5, 0.7), moveNeighbors, moveDistances); rs.Search(math::Range(0.5, 0.7), neighbors, distances); - BOOST_REQUIRE_EQUAL(neighbors.size(), moveNeighbors.size()); - BOOST_REQUIRE_EQUAL(distances.size(), moveDistances.size()); + REQUIRE(neighbors.size() == moveNeighbors.size()); + REQUIRE(distances.size() == moveDistances.size()); // Sort the results before comparing. vector>> sorted; @@ -1196,11 +1197,12 @@ BOOST_AUTO_TEST_CASE(MoveConstructorMatrixTest) for (size_t i = 0; i < sorted.size(); ++i) { - BOOST_REQUIRE_EQUAL(sorted[i].size(), moveSorted[i].size()); + REQUIRE(sorted[i].size() == moveSorted[i].size()); for (size_t j = 0; j < sorted[i].size(); ++j) { - BOOST_REQUIRE_EQUAL(sorted[i][j].second, moveSorted[i][j].second); - BOOST_REQUIRE_CLOSE(sorted[i][j].first, moveSorted[i][j].first, 1e-5); + REQUIRE(sorted[i][j].second == moveSorted[i][j].second); + REQUIRE(sorted[i][j].first == + Approx(moveSorted[i][j].first).epsilon(1e-7)); } } } @@ -1208,7 +1210,7 @@ BOOST_AUTO_TEST_CASE(MoveConstructorMatrixTest) /** * Test that the std::move() Train() function works. */ -BOOST_AUTO_TEST_CASE(MoveTrainTest) +TEST_CASE("MoveTrainTest", "[RangeSearchTest]") { arma::mat dataset = arma::randu(3, 100); arma::mat copy(dataset); @@ -1217,9 +1219,9 @@ BOOST_AUTO_TEST_CASE(MoveTrainTest) movers.Train(std::move(copy)); RangeSearch<> rs(dataset); - BOOST_REQUIRE_EQUAL(copy.n_elem, 0); - BOOST_REQUIRE_EQUAL(movers.ReferenceSet().n_rows, 3); - BOOST_REQUIRE_EQUAL(movers.ReferenceSet().n_cols, 100); + REQUIRE(copy.n_elem == 0); + REQUIRE(movers.ReferenceSet().n_rows == 3); + REQUIRE(movers.ReferenceSet().n_cols == 100); vector> moveNeighbors, neighbors; vector> moveDistances, distances; @@ -1227,8 +1229,8 @@ BOOST_AUTO_TEST_CASE(MoveTrainTest) movers.Search(math::Range(0.5, 0.7), moveNeighbors, moveDistances); rs.Search(math::Range(0.5, 0.7), neighbors, distances); - BOOST_REQUIRE_EQUAL(neighbors.size(), moveNeighbors.size()); - BOOST_REQUIRE_EQUAL(distances.size(), moveDistances.size()); + REQUIRE(neighbors.size() == moveNeighbors.size()); + REQUIRE(distances.size() == moveDistances.size()); // Sort the results before comparing. vector>> sorted; @@ -1238,16 +1240,17 @@ BOOST_AUTO_TEST_CASE(MoveTrainTest) for (size_t i = 0; i < sorted.size(); ++i) { - BOOST_REQUIRE_EQUAL(sorted[i].size(), moveSorted[i].size()); + REQUIRE(sorted[i].size() == moveSorted[i].size()); for (size_t j = 0; j < sorted[i].size(); ++j) { - BOOST_REQUIRE_EQUAL(sorted[i][j].second, moveSorted[i][j].second); - BOOST_REQUIRE_CLOSE(sorted[i][j].first, moveSorted[i][j].first, 1e-5); + REQUIRE(sorted[i][j].second == moveSorted[i][j].second); + REQUIRE(sorted[i][j].first == + Approx(moveSorted[i][j].first).epsilon(1e-7)); } } } -BOOST_AUTO_TEST_CASE(RSModelTest) +TEST_CASE("RSModelTest", "[RangeSearchTest]") { // Ensure that we can build an RSModel and get correct results. arma::mat queryData = arma::randu(10, 50); @@ -1284,7 +1287,7 @@ BOOST_AUTO_TEST_CASE(RSModelTest) models[26] = RSModel(RSModel::TreeTypes::OCTREE, true); models[27] = RSModel(RSModel::TreeTypes::OCTREE, false); - for (size_t j = 0; j < 2; ++j) + for (size_t j = 0; j < 3; ++j) { // Get a baseline. RangeSearch<> rs(referenceData); @@ -1314,27 +1317,27 @@ BOOST_AUTO_TEST_CASE(RSModelTest) models[i].Search(std::move(queryCopy), math::Range(0.25, 0.75), neighbors, distances); - BOOST_REQUIRE_EQUAL(neighbors.size(), baselineNeighbors.size()); - BOOST_REQUIRE_EQUAL(distances.size(), baselineDistances.size()); + REQUIRE(neighbors.size() == baselineNeighbors.size()); + REQUIRE(distances.size() == baselineDistances.size()); vector>> sorted; SortResults(neighbors, distances, sorted); for (size_t k = 0; k < sorted.size(); ++k) { - BOOST_REQUIRE_EQUAL(sorted[k].size(), baselineSorted[k].size()); + REQUIRE(sorted[k].size() == baselineSorted[k].size()); for (size_t l = 0; l < sorted[k].size(); ++l) { - BOOST_REQUIRE_EQUAL(sorted[k][l].second, baselineSorted[k][l].second); - BOOST_REQUIRE_CLOSE(sorted[k][l].first, baselineSorted[k][l].first, - 1e-5); + REQUIRE(sorted[k][l].second == baselineSorted[k][l].second); + REQUIRE(sorted[k][l].first == + Approx(baselineSorted[k][l].first).epsilon(1e-7)); } } } } } -BOOST_AUTO_TEST_CASE(RSModelMonochromaticTest) +TEST_CASE("RSModelMonochromaticTest", "[RangeSearchTest]") { // Ensure that we can build an RSModel and get correct results. arma::mat referenceData = arma::randu(10, 200); @@ -1370,7 +1373,7 @@ BOOST_AUTO_TEST_CASE(RSModelMonochromaticTest) models[26] = RSModel(RSModel::TreeTypes::OCTREE, true); models[27] = RSModel(RSModel::TreeTypes::OCTREE, false); - for (size_t j = 0; j < 2; ++j) + for (size_t j = 0; j < 3; ++j) { // Get a baseline. RangeSearch<> rs(referenceData); @@ -1397,20 +1400,20 @@ BOOST_AUTO_TEST_CASE(RSModelMonochromaticTest) models[i].Search(math::Range(0.25, 0.5), neighbors, distances); - BOOST_REQUIRE_EQUAL(neighbors.size(), baselineNeighbors.size()); - BOOST_REQUIRE_EQUAL(distances.size(), baselineDistances.size()); + REQUIRE(neighbors.size() == baselineNeighbors.size()); + REQUIRE(distances.size() == baselineDistances.size()); vector>> sorted; SortResults(neighbors, distances, sorted); for (size_t k = 0; k < sorted.size(); ++k) { - BOOST_REQUIRE_EQUAL(sorted[k].size(), baselineSorted[k].size()); + REQUIRE(sorted[k].size() == baselineSorted[k].size()); for (size_t l = 0; l < sorted[k].size(); ++l) { - BOOST_REQUIRE_EQUAL(sorted[k][l].second, baselineSorted[k][l].second); - BOOST_REQUIRE_CLOSE(sorted[k][l].first, baselineSorted[k][l].first, - 1e-5); + REQUIRE(sorted[k][l].second == baselineSorted[k][l].second); + REQUIRE(sorted[k][l].first == + Approx(baselineSorted[k][l].first).epsilon(1e-7)); } } } @@ -1421,7 +1424,7 @@ BOOST_AUTO_TEST_CASE(RSModelMonochromaticTest) * Make sure that the neighborPtr matrix isn't accidentally deleted. * See issue #478. */ -BOOST_AUTO_TEST_CASE(NeighborPtrDeleteTest) +TEST_CASE("NeighborPtrDeleteTest", "[RangeSearchTest]") { arma::mat dataset = arma::randu(5, 100); @@ -1438,14 +1441,14 @@ BOOST_AUTO_TEST_CASE(NeighborPtrDeleteTest) // These will (hopefully) fail is either the neighbors or the distances matrix // has been accidentally deleted. - BOOST_REQUIRE_EQUAL(neighbors.size(), 50); - BOOST_REQUIRE_EQUAL(distances.size(), 50); + REQUIRE(neighbors.size() == 50); + REQUIRE(distances.size() == 50); } /** * Test copy constructor and copy operator. */ -BOOST_AUTO_TEST_CASE(CopyConstructorAndOperatorTest) +TEST_CASE("RangeSearchCopyConstructorAndOperatorTest", "[RangeSearchTest]") { arma::mat dataset = arma::randu(5, 500); RangeSearch<> rs(std::move(dataset)); @@ -1463,26 +1466,26 @@ BOOST_AUTO_TEST_CASE(CopyConstructorAndOperatorTest) rs3.Search(math::Range(0.2, 0.3), neighbors3, distances3); // Check results. - BOOST_REQUIRE_EQUAL(distances.size(), distances2.size()); - BOOST_REQUIRE_EQUAL(distances.size(), distances3.size()); - BOOST_REQUIRE_EQUAL(neighbors.size(), neighbors2.size()); - BOOST_REQUIRE_EQUAL(neighbors.size(), neighbors3.size()); + REQUIRE(distances.size() == distances2.size()); + REQUIRE(distances.size() == distances3.size()); + REQUIRE(neighbors.size() == neighbors2.size()); + REQUIRE(neighbors.size() == neighbors3.size()); for (size_t i = 0; i < neighbors.size(); ++i) { - BOOST_REQUIRE_EQUAL(distances[i].size(), distances2[i].size()); - BOOST_REQUIRE_EQUAL(distances[i].size(), distances3[i].size()); - BOOST_REQUIRE_EQUAL(neighbors[i].size(), neighbors2[i].size()); - BOOST_REQUIRE_EQUAL(neighbors[i].size(), neighbors3[i].size()); + REQUIRE(distances[i].size() == distances2[i].size()); + REQUIRE(distances[i].size() == distances3[i].size()); + REQUIRE(neighbors[i].size() == neighbors2[i].size()); + REQUIRE(neighbors[i].size() == neighbors3[i].size()); for (size_t j = 0; j < neighbors[i].size(); ++j) { - BOOST_REQUIRE_EQUAL(neighbors[i][j], neighbors2[i][j]); - BOOST_REQUIRE_EQUAL(neighbors[i][j], neighbors3[i][j]); + REQUIRE(neighbors[i][j] == neighbors2[i][j]); + REQUIRE(neighbors[i][j] == neighbors3[i][j]); // Distances will always be between 0.2 and 0.3. - BOOST_REQUIRE_CLOSE(distances[i][j], distances2[i][j], 1e-5); - BOOST_REQUIRE_CLOSE(distances[i][j], distances3[i][j], 1e-5); + REQUIRE(distances[i][j] == Approx(distances2[i][j]).epsilon(1e-7)); + REQUIRE(distances[i][j] == Approx(distances3[i][j]).epsilon(1e-7)); } } } @@ -1490,7 +1493,7 @@ BOOST_AUTO_TEST_CASE(CopyConstructorAndOperatorTest) /** * Test move constructor. */ -BOOST_AUTO_TEST_CASE(MoveConstructorTest) +TEST_CASE("RangeSearchMoveConstructorTest", "[RangeSearchTest]") { arma::mat dataset = arma::randu(5, 500); RangeSearch<>* rs = new RangeSearch<>(std::move(dataset)); @@ -1508,20 +1511,20 @@ BOOST_AUTO_TEST_CASE(MoveConstructorTest) rs2.Search(math::Range(0.2, 0.3), neighbors2, distances2); // Check results. - BOOST_REQUIRE_EQUAL(distances.size(), distances2.size()); - BOOST_REQUIRE_EQUAL(neighbors.size(), neighbors2.size()); + REQUIRE(distances.size() == distances2.size()); + REQUIRE(neighbors.size() == neighbors2.size()); for (size_t i = 0; i < neighbors.size(); ++i) { - BOOST_REQUIRE_EQUAL(distances[i].size(), distances2[i].size()); - BOOST_REQUIRE_EQUAL(neighbors[i].size(), neighbors2[i].size()); + REQUIRE(distances[i].size() == distances2[i].size()); + REQUIRE(neighbors[i].size() == neighbors2[i].size()); for (size_t j = 0; j < neighbors[i].size(); ++j) { - BOOST_REQUIRE_EQUAL(neighbors[i][j], neighbors2[i][j]); + REQUIRE(neighbors[i][j] == neighbors2[i][j]); // Distances will always be between 0.2 and 0.3. - BOOST_REQUIRE_CLOSE(distances[i][j], distances2[i][j], 1e-5); + REQUIRE(distances[i][j] == Approx(distances2[i][j]).epsilon(1e-7)); } } } @@ -1529,7 +1532,7 @@ BOOST_AUTO_TEST_CASE(MoveConstructorTest) /** * Test move operator. */ -BOOST_AUTO_TEST_CASE(MoveOperatorTest) +TEST_CASE("RangeSearchMoveOperatorTest", "[RangeSearchTest]") { arma::mat dataset = arma::randu(5, 500); RangeSearch<>* rs = new RangeSearch<>(std::move(dataset)); @@ -1547,20 +1550,20 @@ BOOST_AUTO_TEST_CASE(MoveOperatorTest) rs2.Search(math::Range(0.2, 0.3), neighbors2, distances2); // Check results. - BOOST_REQUIRE_EQUAL(distances.size(), distances2.size()); - BOOST_REQUIRE_EQUAL(neighbors.size(), neighbors2.size()); + REQUIRE(distances.size() == distances2.size()); + REQUIRE(neighbors.size() == neighbors2.size()); for (size_t i = 0; i < neighbors.size(); ++i) { - BOOST_REQUIRE_EQUAL(distances[i].size(), distances2[i].size()); - BOOST_REQUIRE_EQUAL(neighbors[i].size(), neighbors2[i].size()); + REQUIRE(distances[i].size() == distances2[i].size()); + REQUIRE(neighbors[i].size() == neighbors2[i].size()); for (size_t j = 0; j < neighbors[i].size(); ++j) { - BOOST_REQUIRE_EQUAL(neighbors[i][j], neighbors2[i][j]); + REQUIRE(neighbors[i][j] == neighbors2[i][j]); // Distances will always be between 0.2 and 0.3. - BOOST_REQUIRE_CLOSE(distances[i][j], distances2[i][j], 1e-5); + REQUIRE(distances[i][j] == Approx(distances2[i][j]).epsilon(1e-7)); } } } @@ -1569,7 +1572,7 @@ BOOST_AUTO_TEST_CASE(MoveOperatorTest) * Test copy constructor and copy operator in naive mode (so there are no * trees). */ -BOOST_AUTO_TEST_CASE(CopyConstructorAndOperatorNaiveTest) +TEST_CASE("CopyConstructorAndOperatorNaiveTest", "[RangeSearchTest]") { arma::mat dataset = arma::randu(5, 500); RangeSearch<> rs(std::move(dataset), true); @@ -1578,8 +1581,8 @@ BOOST_AUTO_TEST_CASE(CopyConstructorAndOperatorNaiveTest) RangeSearch<> rs2(rs); RangeSearch<> rs3 = rs; - BOOST_REQUIRE_EQUAL(rs2.Naive(), true); - BOOST_REQUIRE_EQUAL(rs3.Naive(), true); + REQUIRE(rs2.Naive() == true); + REQUIRE(rs3.Naive() == true); // Get results. vector> distances, distances2, distances3; @@ -1590,26 +1593,26 @@ BOOST_AUTO_TEST_CASE(CopyConstructorAndOperatorNaiveTest) rs3.Search(math::Range(0.2, 0.3), neighbors3, distances3); // Check results. - BOOST_REQUIRE_EQUAL(distances.size(), distances2.size()); - BOOST_REQUIRE_EQUAL(distances.size(), distances3.size()); - BOOST_REQUIRE_EQUAL(neighbors.size(), neighbors2.size()); - BOOST_REQUIRE_EQUAL(neighbors.size(), neighbors3.size()); + REQUIRE(distances.size() == distances2.size()); + REQUIRE(distances.size() == distances3.size()); + REQUIRE(neighbors.size() == neighbors2.size()); + REQUIRE(neighbors.size() == neighbors3.size()); for (size_t i = 0; i < neighbors.size(); ++i) { - BOOST_REQUIRE_EQUAL(distances[i].size(), distances2[i].size()); - BOOST_REQUIRE_EQUAL(distances[i].size(), distances3[i].size()); - BOOST_REQUIRE_EQUAL(neighbors[i].size(), neighbors2[i].size()); - BOOST_REQUIRE_EQUAL(neighbors[i].size(), neighbors3[i].size()); + REQUIRE(distances[i].size() == distances2[i].size()); + REQUIRE(distances[i].size() == distances3[i].size()); + REQUIRE(neighbors[i].size() == neighbors2[i].size()); + REQUIRE(neighbors[i].size() == neighbors3[i].size()); for (size_t j = 0; j < neighbors[i].size(); ++j) { - BOOST_REQUIRE_EQUAL(neighbors[i][j], neighbors2[i][j]); - BOOST_REQUIRE_EQUAL(neighbors[i][j], neighbors3[i][j]); + REQUIRE(neighbors[i][j] == neighbors2[i][j]); + REQUIRE(neighbors[i][j] == neighbors3[i][j]); // Distances will always be between 0.2 and 0.3. - BOOST_REQUIRE_CLOSE(distances[i][j], distances2[i][j], 1e-5); - BOOST_REQUIRE_CLOSE(distances[i][j], distances3[i][j], 1e-5); + REQUIRE(distances[i][j] == Approx(distances2[i][j]).epsilon(1e-7)); + REQUIRE(distances[i][j] == Approx(distances3[i][j]).epsilon(1e-7)); } } } @@ -1617,7 +1620,7 @@ BOOST_AUTO_TEST_CASE(CopyConstructorAndOperatorNaiveTest) /** * Test move constructor. */ -BOOST_AUTO_TEST_CASE(MoveConstructorNaiveTest) +TEST_CASE("MoveConstructorNaiveTest", "[RangeSearchTest]") { arma::mat dataset = arma::randu(5, 500); RangeSearch<>* rs = new RangeSearch<>(std::move(dataset), true); @@ -1630,27 +1633,27 @@ BOOST_AUTO_TEST_CASE(MoveConstructorNaiveTest) RangeSearch<> rs2(std::move(*rs)); - BOOST_REQUIRE_EQUAL(rs2.Naive(), true); + REQUIRE(rs2.Naive() == true); delete rs; rs2.Search(math::Range(0.2, 0.3), neighbors2, distances2); // Check results. - BOOST_REQUIRE_EQUAL(distances.size(), distances2.size()); - BOOST_REQUIRE_EQUAL(neighbors.size(), neighbors2.size()); + REQUIRE(distances.size() == distances2.size()); + REQUIRE(neighbors.size() == neighbors2.size()); for (size_t i = 0; i < neighbors.size(); ++i) { - BOOST_REQUIRE_EQUAL(distances[i].size(), distances2[i].size()); - BOOST_REQUIRE_EQUAL(neighbors[i].size(), neighbors2[i].size()); + REQUIRE(distances[i].size() == distances2[i].size()); + REQUIRE(neighbors[i].size() == neighbors2[i].size()); for (size_t j = 0; j < neighbors[i].size(); ++j) { - BOOST_REQUIRE_EQUAL(neighbors[i][j], neighbors2[i][j]); + REQUIRE(neighbors[i][j] == neighbors2[i][j]); // Distances will always be between 0.2 and 0.3. - BOOST_REQUIRE_CLOSE(distances[i][j], distances2[i][j], 1e-5); + REQUIRE(distances[i][j] == Approx(distances2[i][j]).epsilon(1e-7)); } } } @@ -1658,7 +1661,7 @@ BOOST_AUTO_TEST_CASE(MoveConstructorNaiveTest) /** * Test move operator. */ -BOOST_AUTO_TEST_CASE(MoveOperatorNaiveTest) +TEST_CASE("MoveOperatorNaiveTest", "[RangeSearchTest]") { arma::mat dataset = arma::randu(5, 500); RangeSearch<>* rs = new RangeSearch<>(std::move(dataset), true); @@ -1671,29 +1674,27 @@ BOOST_AUTO_TEST_CASE(MoveOperatorNaiveTest) RangeSearch<> rs2 = std::move(*rs); - BOOST_REQUIRE_EQUAL(rs2.Naive(), true); + REQUIRE(rs2.Naive() == true); delete rs; rs2.Search(math::Range(0.2, 0.3), neighbors2, distances2); // Check results. - BOOST_REQUIRE_EQUAL(distances.size(), distances2.size()); - BOOST_REQUIRE_EQUAL(neighbors.size(), neighbors2.size()); + REQUIRE(distances.size() == distances2.size()); + REQUIRE(neighbors.size() == neighbors2.size()); for (size_t i = 0; i < neighbors.size(); ++i) { - BOOST_REQUIRE_EQUAL(distances[i].size(), distances2[i].size()); - BOOST_REQUIRE_EQUAL(neighbors[i].size(), neighbors2[i].size()); + REQUIRE(distances[i].size() == distances2[i].size()); + REQUIRE(neighbors[i].size() == neighbors2[i].size()); for (size_t j = 0; j < neighbors[i].size(); ++j) { - BOOST_REQUIRE_EQUAL(neighbors[i][j], neighbors2[i][j]); + REQUIRE(neighbors[i][j] == neighbors2[i][j]); // Distances will always be between 0.2 and 0.3. - BOOST_REQUIRE_CLOSE(distances[i][j], distances2[i][j], 1e-5); + REQUIRE(distances[i][j] == Approx(distances2[i][j]).epsilon(1e-7)); } } } - -BOOST_AUTO_TEST_SUITE_END(); diff --git a/src/mlpack/tests/sfinae_test.cpp b/src/mlpack/tests/sfinae_test.cpp index 10a3aafadb..fce327996d 100644 --- a/src/mlpack/tests/sfinae_test.cpp +++ b/src/mlpack/tests/sfinae_test.cpp @@ -13,9 +13,7 @@ #include #include -#include - -BOOST_AUTO_TEST_SUITE(SFINAETest); +#include "catch.hpp" class A { @@ -97,7 +95,7 @@ HAS_ANY_METHOD_FORM(Model, HasModel); * Test at compile time the presence of methods of the specified forms with the * stated number of additional arguments. */ -BOOST_AUTO_TEST_CASE(HasMethodFormWithNAdditionalArgsTest) +TEST_CASE("HasMethodFormWithNAdditionalArgsTest", "[SFINAETest]") { static_assert(!HasM::WithNAdditionalArgs<0>::value, "value should be false"); @@ -145,7 +143,7 @@ BOOST_AUTO_TEST_CASE(HasMethodFormWithNAdditionalArgsTest) /* * Test at compile time the presence of methods of the specified forms. */ -BOOST_AUTO_TEST_CASE(HasMethodFormTest) +TEST_CASE("HasMethodFormTest", "[SFINAETest]") { static_assert(HasM::value, "value should be true"); @@ -168,7 +166,7 @@ BOOST_AUTO_TEST_CASE(HasMethodFormTest) * Test at compile time, for the presence/absence of a specific member * function in a class. */ -BOOST_AUTO_TEST_CASE(HasMethodNameTest) +TEST_CASE("HasMethodNameTest", "[SFINAETest]") { static_assert(!HasModel::value, "value should be false"); @@ -176,5 +174,3 @@ BOOST_AUTO_TEST_CASE(HasMethodNameTest) static_assert(HasModel::value, "value should be true"); static_assert(HasModel::value, "value should be true"); } - -BOOST_AUTO_TEST_SUITE_END(); diff --git a/src/mlpack/tests/sort_policy_test.cpp b/src/mlpack/tests/sort_policy_test.cpp index 403903a68d..6418135f8e 100644 --- a/src/mlpack/tests/sort_policy_test.cpp +++ b/src/mlpack/tests/sort_policy_test.cpp @@ -16,8 +16,7 @@ #include #include -#include -#include "test_tools.hpp" +#include "catch.hpp" using namespace mlpack; using namespace mlpack::neighbor; @@ -25,47 +24,45 @@ using namespace mlpack::bound; using namespace mlpack::tree; using namespace mlpack::metric; -BOOST_AUTO_TEST_SUITE(SortPolicyTest); - // Tests for NearestNeighborSort /** * Ensure the best distance for nearest neighbors is 0. */ -BOOST_AUTO_TEST_CASE(NnsBestDistance) +TEST_CASE("NnsBestDistance", "[SortPolicyTest]") { - BOOST_REQUIRE(NearestNeighborSort::BestDistance() == 0); + REQUIRE(NearestNeighborSort::BestDistance() == 0); } /** * Ensure the worst distance for nearest neighbors is DBL_MAX. */ -BOOST_AUTO_TEST_CASE(NnsWorstDistance) +TEST_CASE("NnsWorstDistance", "[SortPolicyTest]") { - BOOST_REQUIRE(NearestNeighborSort::WorstDistance() == DBL_MAX); + REQUIRE(NearestNeighborSort::WorstDistance() == DBL_MAX); } /** * Make sure the comparison works for values strictly less than the reference. */ -BOOST_AUTO_TEST_CASE(NnsIsBetterStrict) +TEST_CASE("NnsIsBetterStrict", "[SortPolicyTest]") { - BOOST_REQUIRE(NearestNeighborSort::IsBetter(5.0, 6.0) == true); + REQUIRE(NearestNeighborSort::IsBetter(5.0, 6.0) == true); } /** * Warn in case the comparison is not strict. */ -BOOST_AUTO_TEST_CASE(NnsIsBetterNotStrict) +TEST_CASE("NnsIsBetterNotStrict", "[SortPolicyTest]") { - BOOST_WARN(NearestNeighborSort::IsBetter(6.0, 6.0) == true); + CHECK(NearestNeighborSort::IsBetter(6.0, 6.0) == true); } /** * Very simple sanity check to ensure that bounds are working alright. We will * use a one-dimensional bound for simplicity. */ -BOOST_AUTO_TEST_CASE(NnsNodeToNodeDistance) +TEST_CASE("NnsNodeToNodeDistance", "[SortPolicyTest]") { // Well, there's no easy way to make HRectBounds the way we want, so we have // to make them and then expand the region to include new points. @@ -89,8 +86,8 @@ BOOST_AUTO_TEST_CASE(NnsNodeToNodeDistance) nodeTwo.Bound() |= utility; // This should use the L2 distance. - BOOST_REQUIRE_CLOSE(NearestNeighborSort::BestNodeToNodeDistance(&nodeOne, - &nodeTwo), 4.0, 1e-5); + REQUIRE(NearestNeighborSort::BestNodeToNodeDistance(&nodeOne, &nodeTwo) == + Approx(4.0).epsilon(1e-7)); // And another just to be sure, from the other side. nodeTwo.Bound().Clear(); @@ -100,8 +97,8 @@ BOOST_AUTO_TEST_CASE(NnsNodeToNodeDistance) nodeTwo.Bound() |= utility; // Again, the distance is the L2 distance. - BOOST_REQUIRE_CLOSE(NearestNeighborSort::BestNodeToNodeDistance(&nodeOne, - &nodeTwo), 1.0, 1e-5); + REQUIRE(NearestNeighborSort::BestNodeToNodeDistance(&nodeOne, &nodeTwo) == + Approx(1.0).epsilon(1e-7)); // Now, when the bounds overlap. nodeTwo.Bound().Clear(); @@ -110,15 +107,15 @@ BOOST_AUTO_TEST_CASE(NnsNodeToNodeDistance) utility[0] = 0.5; nodeTwo.Bound() |= utility; - BOOST_REQUIRE_SMALL(NearestNeighborSort::BestNodeToNodeDistance(&nodeOne, - &nodeTwo), 1e-5); + REQUIRE(NearestNeighborSort::BestNodeToNodeDistance(&nodeOne, &nodeTwo) == + Approx(0.0).margin(1e-5)); } /** * Another very simple sanity check for the point-to-node case, again in one * dimension. */ -BOOST_AUTO_TEST_CASE(NnsPointToNodeDistance) +TEST_CASE("NnsPointToNodeDistance", "[SortPolicyTest]") { // Well, there's no easy way to make HRectBounds the way we want, so we have // to make them and then expand the region to include new points. @@ -137,20 +134,20 @@ BOOST_AUTO_TEST_CASE(NnsPointToNodeDistance) point[0] = -0.5; // The distance is the L2 distance. - BOOST_REQUIRE_CLOSE(NearestNeighborSort::BestPointToNodeDistance(point, - &node), 0.5, 1e-5); + REQUIRE(NearestNeighborSort::BestPointToNodeDistance(point, &node) == + Approx(0.5).epsilon(1e-7)); // Now from the other side of the bound. point[0] = 1.5; - BOOST_REQUIRE_CLOSE(NearestNeighborSort::BestPointToNodeDistance(point, - &node), 0.5, 1e-5); + REQUIRE(NearestNeighborSort::BestPointToNodeDistance(point, &node) == + Approx(0.5).epsilon(1e-7)); // And now when the point is inside the bound. point[0] = 0.5; - BOOST_REQUIRE_SMALL(NearestNeighborSort::BestPointToNodeDistance(point, - &node), 1e-5); + REQUIRE(NearestNeighborSort::BestPointToNodeDistance(point, &node) == + Approx(0.0).margin(1e-5)); } // Tests for FurthestNeighborSort @@ -158,40 +155,40 @@ BOOST_AUTO_TEST_CASE(NnsPointToNodeDistance) /** * Ensure the best distance for furthest neighbors is DBL_MAX. */ -BOOST_AUTO_TEST_CASE(FnsBestDistance) +TEST_CASE("FnsBestDistance", "[SortPolicyTest]") { - BOOST_REQUIRE(FurthestNeighborSort::BestDistance() == DBL_MAX); + REQUIRE(FurthestNeighborSort::BestDistance() == DBL_MAX); } /** * Ensure the worst distance for furthest neighbors is 0. */ -BOOST_AUTO_TEST_CASE(FnsWorstDistance) +TEST_CASE("FnsWorstDistance", "[SortPolicyTest]") { - BOOST_REQUIRE(FurthestNeighborSort::WorstDistance() == 0); + REQUIRE(FurthestNeighborSort::WorstDistance() == 0); } /** * Make sure the comparison works for values strictly less than the reference. */ -BOOST_AUTO_TEST_CASE(FnsIsBetterStrict) +TEST_CASE("FnsIsBetterStrict", "[SortPolicyTest]") { - BOOST_REQUIRE(FurthestNeighborSort::IsBetter(5.0, 4.0) == true); + REQUIRE(FurthestNeighborSort::IsBetter(5.0, 4.0) == true); } /** * Warn in case the comparison is not strict. */ -BOOST_AUTO_TEST_CASE(FnsIsBetterNotStrict) +TEST_CASE("FnsIsBetterNotStrict", "[SortPolicyTest]") { - BOOST_WARN(FurthestNeighborSort::IsBetter(6.0, 6.0) == true); + CHECK(FurthestNeighborSort::IsBetter(6.0, 6.0) == true); } /** * Very simple sanity check to ensure that bounds are working alright. We will * use a one-dimensional bound for simplicity. */ -BOOST_AUTO_TEST_CASE(FnsNodeToNodeDistance) +TEST_CASE("FnsNodeToNodeDistance", "[SortPolicyTest]") { // Well, there's no easy way to make HRectBounds the way we want, so we have // to make them and then expand the region to include new points. @@ -214,8 +211,8 @@ BOOST_AUTO_TEST_CASE(FnsNodeToNodeDistance) nodeTwo.Bound() |= utility; // This should use the L2 distance. - BOOST_REQUIRE_CLOSE(FurthestNeighborSort::BestNodeToNodeDistance(&nodeOne, - &nodeTwo), 6.0, 1e-5); + REQUIRE(FurthestNeighborSort::BestNodeToNodeDistance(&nodeOne, &nodeTwo) == + Approx(6.0).epsilon(1e-7)); // And another just to be sure, from the other side. nodeTwo.Bound().Clear(); @@ -225,8 +222,8 @@ BOOST_AUTO_TEST_CASE(FnsNodeToNodeDistance) nodeTwo.Bound() |= utility; // Again, the distance is the L2 distance. - BOOST_REQUIRE_CLOSE(FurthestNeighborSort::BestNodeToNodeDistance(&nodeOne, - &nodeTwo), 3.0, 1e-5); + REQUIRE(FurthestNeighborSort::BestNodeToNodeDistance(&nodeOne, &nodeTwo) == + Approx(3.0).epsilon(1e-7)); // Now, when the bounds overlap. nodeTwo.Bound().Clear(); @@ -235,15 +232,15 @@ BOOST_AUTO_TEST_CASE(FnsNodeToNodeDistance) utility[0] = 0.5; nodeTwo.Bound() |= utility; - BOOST_REQUIRE_CLOSE(FurthestNeighborSort::BestNodeToNodeDistance(&nodeOne, - &nodeTwo), 1.5, 1e-5); + REQUIRE(FurthestNeighborSort::BestNodeToNodeDistance(&nodeOne, &nodeTwo) == + Approx(1.5).epsilon(1e-7)); } /** * Another very simple sanity check for the point-to-node case, again in one * dimension. */ -BOOST_AUTO_TEST_CASE(FnsPointToNodeDistance) +TEST_CASE("FnsPointToNodeDistance", "[SortPolicyTest]") { // Well, there's no easy way to make HRectBounds the way we want, so we have // to make them and then expand the region to include new points. @@ -262,20 +259,18 @@ BOOST_AUTO_TEST_CASE(FnsPointToNodeDistance) point[0] = -0.5; // The distance is the L2 distance. - BOOST_REQUIRE_CLOSE(FurthestNeighborSort::BestPointToNodeDistance(point, - &node), 1.5, 1e-5); + REQUIRE(FurthestNeighborSort::BestPointToNodeDistance(point, &node) == + Approx(1.5).epsilon(1e-7)); // Now from the other side of the bound. point[0] = 1.5; - BOOST_REQUIRE_CLOSE(FurthestNeighborSort::BestPointToNodeDistance(point, - &node), 1.5, 1e-5); + REQUIRE(FurthestNeighborSort::BestPointToNodeDistance(point, &node) == + Approx(1.5).epsilon(1e-7)); // And now when the point is inside the bound. point[0] = 0.5; - BOOST_REQUIRE_CLOSE(FurthestNeighborSort::BestPointToNodeDistance(point, - &node), 0.5, 1e-5); + REQUIRE(FurthestNeighborSort::BestPointToNodeDistance(point, &node) == + Approx(0.5).epsilon(1e-7)); } - -BOOST_AUTO_TEST_SUITE_END(); diff --git a/src/mlpack/tests/string_encoding_test.cpp b/src/mlpack/tests/string_encoding_test.cpp index 8098be2e7b..81af48f843 100644 --- a/src/mlpack/tests/string_encoding_test.cpp +++ b/src/mlpack/tests/string_encoding_test.cpp @@ -20,15 +20,14 @@ #include #include #include -#include "test_tools.hpp" -#include "serialization.hpp" +#include "test_catch_tools.hpp" +#include "catch.hpp" +#include "serialization_catch.hpp" using namespace mlpack; using namespace mlpack::data; using namespace std; -BOOST_AUTO_TEST_SUITE(StringEncodingTest); - //! Common input for some tests. static vector stringEncodingInput = { "mlpack is an intuitive, fast, and flexible C++ machine learning library " @@ -64,21 +63,21 @@ void CheckVectors(const vector>& a, const vector>& b, const ValueType tolerance = 1e-5) { - BOOST_REQUIRE_EQUAL(a.size(), b.size()); + REQUIRE(a.size() == b.size()); for (size_t i = 0; i < a.size(); ++i) { - BOOST_REQUIRE_EQUAL(a[i].size(), b[i].size()); + REQUIRE(a[i].size() == b[i].size()); for (size_t j = 0; j < a[i].size(); ++j) - BOOST_REQUIRE_CLOSE(a[i][j], b[i][j], tolerance); + REQUIRE(a[i][j] == Approx(b[i][j]).epsilon(tolerance / 100)); } } /** * Test the dictionary encoding algorithm. */ -BOOST_AUTO_TEST_CASE(DictionaryEncodingTest) +TEST_CASE("DictionaryEncodingTest", "[StringEncodingTest]") { using DictionaryType = StringEncodingDictionary; @@ -97,7 +96,7 @@ BOOST_AUTO_TEST_CASE(DictionaryEncodingTest) { keysCount[keyValue.second]++; - BOOST_REQUIRE_EQUAL(keysCount[keyValue.second], 1); + REQUIRE(keysCount[keyValue.second] == 1); } arma::mat expected = { @@ -115,7 +114,7 @@ BOOST_AUTO_TEST_CASE(DictionaryEncodingTest) /** * Test the dictionary encoding algorithm with unicode characters. */ -BOOST_AUTO_TEST_CASE(UnicodeDictionaryEncodingTest) +TEST_CASE("UnicodeDictionaryEncodingTest", "[StringEncodingTest]") { using DictionaryType = StringEncodingDictionary; @@ -134,7 +133,7 @@ BOOST_AUTO_TEST_CASE(UnicodeDictionaryEncodingTest) { keysCount[keyValue.second]++; - BOOST_REQUIRE_EQUAL(keysCount[keyValue.second], 1); + REQUIRE(keysCount[keyValue.second] == 1); } arma::mat expected = { @@ -149,7 +148,7 @@ BOOST_AUTO_TEST_CASE(UnicodeDictionaryEncodingTest) /** * Test the one pass modification of the dictionary encoding algorithm. */ -BOOST_AUTO_TEST_CASE(OnePassDictionaryEncodingTest) +TEST_CASE("OnePassDictionaryEncodingTest", "[StringEncodingTest]") { using DictionaryType = StringEncodingDictionary; @@ -169,7 +168,7 @@ BOOST_AUTO_TEST_CASE(OnePassDictionaryEncodingTest) { keysCount[keyValue.second]++; - BOOST_REQUIRE_EQUAL(keysCount[keyValue.second], 1); + REQUIRE(keysCount[keyValue.second] == 1); } vector> expected = { @@ -179,14 +178,14 @@ BOOST_AUTO_TEST_CASE(OnePassDictionaryEncodingTest) { 36, 37, 14, 38, 39, 8, 40, 1, 41, 42, 43, 44, 6, 45, 13 } }; - BOOST_REQUIRE(output == expected); + REQUIRE(output == expected); } /** * Test the SplitByAnyOf tokenizer. */ -BOOST_AUTO_TEST_CASE(SplitByAnyOfTokenizerTest) +TEST_CASE("SplitByAnyOfTokenizerTest", "[StringEncodingTest]") { std::vector tokens; boost::string_view line(stringEncodingInput[0]); @@ -204,16 +203,16 @@ BOOST_AUTO_TEST_CASE(SplitByAnyOfTokenizerTest) "bindings", "to", "other", "languages" }; - BOOST_REQUIRE_EQUAL(tokens.size(), expected.size()); + REQUIRE(tokens.size() == expected.size()); for (size_t i = 0; i < tokens.size(); ++i) - BOOST_REQUIRE_EQUAL(tokens[i], expected[i]); + REQUIRE(tokens[i] == expected[i]); } /** * Test the SplitByAnyOf tokenizer in case of unicode characters. */ -BOOST_AUTO_TEST_CASE(SplitByAnyOfTokenizerUnicodeTest) +TEST_CASE("SplitByAnyOfTokenizerUnicodeTest", "[StringEncodingTest]") { vector expectedUtf8Tokens = { "\xF0\x9F\x84\xBC\xF0\x9F\x84\xBB\xF0\x9F\x84\xBF\xF0\x9F\x84\xB0" @@ -236,16 +235,16 @@ BOOST_AUTO_TEST_CASE(SplitByAnyOfTokenizerUnicodeTest) token = tokenizer(line); } - BOOST_REQUIRE_EQUAL(tokens.size(), expectedUtf8Tokens.size()); + REQUIRE(tokens.size() == expectedUtf8Tokens.size()); for (size_t i = 0; i < tokens.size(); ++i) - BOOST_REQUIRE_EQUAL(tokens[i], expectedUtf8Tokens[i]); + REQUIRE(tokens[i] == expectedUtf8Tokens[i]); } /** * Test the CharExtract tokenizer. */ -BOOST_AUTO_TEST_CASE(DictionaryEncodingIndividualCharactersTest) +TEST_CASE("DictionaryEncodingIndividualCharactersTest", "[StringEncodingTest]") { vector input = { "GACCA", @@ -270,7 +269,7 @@ BOOST_AUTO_TEST_CASE(DictionaryEncodingIndividualCharactersTest) * Test the one pass modification of the dictionary encoding algorithm * in case of individual character encoding. */ -BOOST_AUTO_TEST_CASE(OnePassDictionaryEncodingIndividualCharactersTest) +TEST_CASE("OnePassDictionaryEncodingIndividualCharactersTest", "[StringEncodingTest]") { std::vector input = { "GACCA", @@ -289,13 +288,13 @@ BOOST_AUTO_TEST_CASE(OnePassDictionaryEncodingIndividualCharactersTest) { 1, 2, 4 } }; - BOOST_REQUIRE(output == expected); + REQUIRE(output == expected); } /** * Test the functionality of copy constructor. */ -BOOST_AUTO_TEST_CASE(StringEncodingCopyTest) +TEST_CASE("StringEncodingCopyTest", "[StringEncodingTest]") { using DictionaryType = StringEncodingDictionary; arma::sp_mat output; @@ -318,12 +317,12 @@ BOOST_AUTO_TEST_CASE(StringEncodingCopyTest) const DictionaryType& copiedDictionary = encoderCopy.Dictionary(); - BOOST_REQUIRE_EQUAL(naiveDictionary.size(), copiedDictionary.Size()); + REQUIRE(naiveDictionary.size() == copiedDictionary.Size()); for (const pair& keyValue : naiveDictionary) { - BOOST_REQUIRE(copiedDictionary.HasToken(keyValue.first)); - BOOST_REQUIRE_EQUAL(copiedDictionary.Value(keyValue.first), + REQUIRE(copiedDictionary.HasToken(keyValue.first)); + REQUIRE(copiedDictionary.Value(keyValue.first) == keyValue.second); } } @@ -331,7 +330,7 @@ BOOST_AUTO_TEST_CASE(StringEncodingCopyTest) /** * Test the move assignment operator. */ -BOOST_AUTO_TEST_CASE(StringEncodingMoveTest) +TEST_CASE("StringEncodingMoveTest", "[StringEncodingTest]") { using DictionaryType = StringEncodingDictionary; arma::sp_mat output; @@ -354,12 +353,12 @@ BOOST_AUTO_TEST_CASE(StringEncodingMoveTest) const DictionaryType& copiedDictionary = encoderCopy.Dictionary(); - BOOST_REQUIRE_EQUAL(naiveDictionary.size(), copiedDictionary.Size()); + REQUIRE(naiveDictionary.size() == copiedDictionary.Size()); for (const pair& keyValue : naiveDictionary) { - BOOST_REQUIRE(copiedDictionary.HasToken(keyValue.first)); - BOOST_REQUIRE_EQUAL(copiedDictionary.Value(keyValue.first), + REQUIRE(copiedDictionary.HasToken(keyValue.first)); + REQUIRE(copiedDictionary.Value(keyValue.first) == keyValue.second); } } @@ -377,16 +376,16 @@ void CheckDictionaries(const StringEncodingDictionary& expected, const MapType& mapping = obtained.Mapping(); const MapType& expectedMapping = expected.Mapping(); - BOOST_REQUIRE_EQUAL(mapping.size(), expectedMapping.size()); + REQUIRE(mapping.size() == expectedMapping.size()); for (auto& keyVal : expectedMapping) { - BOOST_REQUIRE_EQUAL(mapping.at(keyVal.first), keyVal.second); + REQUIRE(mapping.at(keyVal.first) == keyVal.second); } for (auto& keyVal : mapping) { - BOOST_REQUIRE_EQUAL(expectedMapping.at(keyVal.first), keyVal.second); + REQUIRE(expectedMapping.at(keyVal.first) == keyVal.second); } } @@ -413,14 +412,14 @@ void CheckDictionaries( const MapType& expectedMapping = expected.Mapping(); const MapType& mapping = obtained.Mapping(); - BOOST_REQUIRE_EQUAL(tokens.size(), expectedTokens.size()); - BOOST_REQUIRE_EQUAL(mapping.size(), expectedMapping.size()); - BOOST_REQUIRE_EQUAL(mapping.size(), tokens.size()); + REQUIRE(tokens.size() == expectedTokens.size()); + REQUIRE(mapping.size() == expectedMapping.size()); + REQUIRE(mapping.size() == tokens.size()); for (size_t i = 0; i < tokens.size(); ++i) { - BOOST_REQUIRE_EQUAL(tokens[i], expectedTokens[i]); - BOOST_REQUIRE_EQUAL(expectedMapping.at(tokens[i]), mapping.at(tokens[i])); + REQUIRE(tokens[i] == expectedTokens[i]); + REQUIRE(expectedMapping.at(tokens[i]) == mapping.at(tokens[i])); } } @@ -438,11 +437,11 @@ void CheckDictionaries(const StringEncodingDictionary& expected, const MapType& expectedMapping = expected.Mapping(); const MapType& mapping = obtained.Mapping(); - BOOST_REQUIRE_EQUAL(expected.Size(), obtained.Size()); + REQUIRE(expected.Size() == obtained.Size()); for (size_t i = 0; i < mapping.size(); ++i) { - BOOST_REQUIRE_EQUAL(mapping[i], expectedMapping[i]); + REQUIRE(mapping[i] == expectedMapping[i]); } } @@ -450,7 +449,7 @@ void CheckDictionaries(const StringEncodingDictionary& expected, * Serialization test for the general template of the StringEncodingDictionary * class. */ -BOOST_AUTO_TEST_CASE(StringEncodingDictionarySerialization) +TEST_CASE("StringEncodingDictionarySerialization", "[StringEncodingTest]") { using DictionaryType = StringEncodingDictionary; @@ -485,7 +484,7 @@ BOOST_AUTO_TEST_CASE(StringEncodingDictionarySerialization) * Serialization test for the dictionary encoding algorithm with * the SplitByAnyOf tokenizer. */ -BOOST_AUTO_TEST_CASE(SplitByAnyOfDictionaryEncodingSerialization) +TEST_CASE("SplitByAnyOfDictionaryEncodingSerialization", "[StringEncodingTest]") { using EncoderType = DictionaryEncoding; @@ -515,7 +514,7 @@ BOOST_AUTO_TEST_CASE(SplitByAnyOfDictionaryEncodingSerialization) * Serialization test for the dictionary encoding algorithm with * the CharExtract tokenizer. */ -BOOST_AUTO_TEST_CASE(CharExtractDictionaryEncodingSerialization) +TEST_CASE("CharExtractDictionaryEncodingSerialization", "[StringEncodingTest]") { using EncoderType = DictionaryEncoding; @@ -544,7 +543,7 @@ BOOST_AUTO_TEST_CASE(CharExtractDictionaryEncodingSerialization) /** * Test the Bag of Words encoding algorithm. */ -BOOST_AUTO_TEST_CASE(BagOfWordsEncodingTest) +TEST_CASE("BagOfWordsEncodingTest", "[StringEncodingTest]") { using DictionaryType = StringEncodingDictionary; @@ -563,7 +562,7 @@ BOOST_AUTO_TEST_CASE(BagOfWordsEncodingTest) { keysCount[keyValue.second]++; - BOOST_REQUIRE_EQUAL(keysCount[keyValue.second], 1); + REQUIRE(keysCount[keyValue.second] == 1); } /* The expected values were obtained by the following Python script: @@ -619,7 +618,7 @@ BOOST_AUTO_TEST_CASE(BagOfWordsEncodingTest) /** * Test the Bag of Words encoding algorithm. The output is saved into a vector. */ -BOOST_AUTO_TEST_CASE(VectorBagOfWordsEncodingTest) +TEST_CASE("VectorBagOfWordsEncodingTest", "[StringEncodingTest]") { using DictionaryType = StringEncodingDictionary; @@ -639,7 +638,7 @@ BOOST_AUTO_TEST_CASE(VectorBagOfWordsEncodingTest) { keysCount[keyValue.second]++; - BOOST_REQUIRE_EQUAL(keysCount[keyValue.second], 1); + REQUIRE(keysCount[keyValue.second] == 1); } /* The expected values were obtained by the same script as in @@ -653,13 +652,13 @@ BOOST_AUTO_TEST_CASE(VectorBagOfWordsEncodingTest) 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } }; - BOOST_REQUIRE(output == expected); + REQUIRE(output == expected); } /** * Test the Bag of Words algorithm for individual characters. */ -BOOST_AUTO_TEST_CASE(BagOfWordsEncodingIndividualCharactersTest) +TEST_CASE("BagOfWordsEncodingIndividualCharactersTest", "[StringEncodingTest]") { vector input = { "GACCA", @@ -685,7 +684,7 @@ BOOST_AUTO_TEST_CASE(BagOfWordsEncodingIndividualCharactersTest) * Test the Bag of Words encoding algorithm in case of individual * characters encoding. The output type is vector>. */ -BOOST_AUTO_TEST_CASE(VectorBagOfWordsEncodingIndividualCharactersTest) +TEST_CASE("VectorBagOfWordsEncodingIndividualCharactersTest", "[StringEncodingTest]") { std::vector input = { "GACCA", @@ -704,7 +703,7 @@ BOOST_AUTO_TEST_CASE(VectorBagOfWordsEncodingIndividualCharactersTest) { 1, 1, 0, 1, 0 } }; - BOOST_REQUIRE(output == expected); + REQUIRE(output == expected); } /** @@ -712,7 +711,7 @@ BOOST_AUTO_TEST_CASE(VectorBagOfWordsEncodingIndividualCharactersTest) * and the smooth inverse document frequency type. These parameters are * the default ones. */ -BOOST_AUTO_TEST_CASE(RawCountSmoothIdfEncodingTest) +TEST_CASE("RawCountSmoothIdfEncodingTest", "[StringEncodingTest]") { using DictionaryType = StringEncodingDictionary; @@ -730,7 +729,7 @@ BOOST_AUTO_TEST_CASE(RawCountSmoothIdfEncodingTest) { keysCount[keyValue.second]++; - BOOST_REQUIRE_EQUAL(keysCount[keyValue.second], 1); + REQUIRE(keysCount[keyValue.second] == 1); } /* The expected values were obtained by the following Python script: @@ -814,7 +813,7 @@ BOOST_AUTO_TEST_CASE(RawCountSmoothIdfEncodingTest) * and the smooth inverse document frequency type. These parameters are * the default ones. The output type is vector>. */ -BOOST_AUTO_TEST_CASE(VectorRawCountSmoothIdfEncodingTest) +TEST_CASE("VectorRawCountSmoothIdfEncodingTest", "[StringEncodingTest]") { using DictionaryType = StringEncodingDictionary; @@ -834,7 +833,7 @@ BOOST_AUTO_TEST_CASE(VectorRawCountSmoothIdfEncodingTest) { keysCount[keyValue.second]++; - BOOST_REQUIRE_EQUAL(keysCount[keyValue.second], 1); + REQUIRE(keysCount[keyValue.second] == 1); } /* The expected values were obtained by the same script as in @@ -862,7 +861,7 @@ BOOST_AUTO_TEST_CASE(VectorRawCountSmoothIdfEncodingTest) * raw count term frequency type and the smooth inverse document frequency type. * These parameters are the default ones. */ -BOOST_AUTO_TEST_CASE(RawCountSmoothIdfEncodingIndividualCharactersTest) +TEST_CASE("RawCountSmoothIdfEncodingIndividualCharactersTest", "[StringEncodingTest]") { vector input = { "GACCA", @@ -943,7 +942,7 @@ BOOST_AUTO_TEST_CASE(RawCountSmoothIdfEncodingIndividualCharactersTest) * These parameters are the default ones. The output type is * vector>. */ -BOOST_AUTO_TEST_CASE(VectorRawCountSmoothIdfEncodingIndividualCharactersTest) +TEST_CASE("VectorRawCountSmoothIdfEncodingIndividualCharactersTest", "[StringEncodingTest]") { std::vector input = { "GACCA", @@ -971,7 +970,7 @@ BOOST_AUTO_TEST_CASE(VectorRawCountSmoothIdfEncodingIndividualCharactersTest) * Test the Tf-Idf encoding algorithm with the raw count term frequency type * and the non-smooth inverse document frequency type. */ -BOOST_AUTO_TEST_CASE(TfIdfRawCountEncodingTest) +TEST_CASE("TfIdfRawCountEncodingTest", "[StringEncodingTest]") { using DictionaryType = StringEncodingDictionary; @@ -991,7 +990,7 @@ BOOST_AUTO_TEST_CASE(TfIdfRawCountEncodingTest) { keysCount[keyValue.second]++; - BOOST_REQUIRE_EQUAL(keysCount[keyValue.second], 1); + REQUIRE(keysCount[keyValue.second] == 1); } /* The expected values were obtained by almost the same script as in @@ -1021,7 +1020,7 @@ BOOST_AUTO_TEST_CASE(TfIdfRawCountEncodingTest) * and the non-smooth inverse document frequency type. The output type is * vector>. */ -BOOST_AUTO_TEST_CASE(VectorTfIdfRawCountEncodingTest) +TEST_CASE("VectorTfIdfRawCountEncodingTest", "[StringEncodingTest]") { using DictionaryType = StringEncodingDictionary; @@ -1040,7 +1039,7 @@ BOOST_AUTO_TEST_CASE(VectorTfIdfRawCountEncodingTest) { keysCount[keyValue.second]++; - BOOST_REQUIRE_EQUAL(keysCount[keyValue.second], 1); + REQUIRE(keysCount[keyValue.second] == 1); } /* The expected values were obtained by almost the same script as in @@ -1069,7 +1068,7 @@ BOOST_AUTO_TEST_CASE(VectorTfIdfRawCountEncodingTest) * raw count term frequency type and the non-smooth inverse document frequency * type. */ -BOOST_AUTO_TEST_CASE(RawCountTfIdfEncodingIndividualCharactersTest) +TEST_CASE("RawCountTfIdfEncodingIndividualCharactersTest", "[StringEncodingTest]") { vector input = { "GACCA", @@ -1100,7 +1099,7 @@ BOOST_AUTO_TEST_CASE(RawCountTfIdfEncodingIndividualCharactersTest) * raw count term frequency type and the non-smooth inverse document frequency * type. The output type is vector>. */ -BOOST_AUTO_TEST_CASE(VectorRawCountTfIdfEncodingIndividualCharactersTest) +TEST_CASE("VectorRawCountTfIdfEncodingIndividualCharactersTest", "[StringEncodingTest]") { std::vector input = { "GACCA", @@ -1130,7 +1129,7 @@ BOOST_AUTO_TEST_CASE(VectorRawCountTfIdfEncodingIndividualCharactersTest) * Test the Tf-Idf encoding algorithm for individual characters with the * binary term frequency type and the smooth inverse document frequency type. */ -BOOST_AUTO_TEST_CASE(BinarySmoothIdfEncodingIndividualCharactersTest) +TEST_CASE("BinarySmoothIdfEncodingIndividualCharactersTest", "[StringEncodingTest]") { vector input = { "GACCA", @@ -1161,7 +1160,7 @@ BOOST_AUTO_TEST_CASE(BinarySmoothIdfEncodingIndividualCharactersTest) * binary term frequency type and the smooth inverse document frequency type. * The output type is vector>. */ -BOOST_AUTO_TEST_CASE(VectorBinarySmoothIdfEncodingIndividualCharactersTest) +TEST_CASE("VectorBinarySmoothIdfEncodingIndividualCharactersTest", "[StringEncodingTest]") { std::vector input = { "GACCA", @@ -1192,7 +1191,7 @@ BOOST_AUTO_TEST_CASE(VectorBinarySmoothIdfEncodingIndividualCharactersTest) * binary term frequency type and the non-smooth inverse document frequency * type. */ -BOOST_AUTO_TEST_CASE(BinaryTfIdfEncodingIndividualCharactersTest) +TEST_CASE("BinaryTfIdfEncodingIndividualCharactersTest", "[StringEncodingTest]") { vector input = { "GACCA", @@ -1223,7 +1222,7 @@ BOOST_AUTO_TEST_CASE(BinaryTfIdfEncodingIndividualCharactersTest) * sublinear term frequency type and the smooth inverse document frequency * type. */ -BOOST_AUTO_TEST_CASE(SublinearSmoothIdfEncodingIndividualCharactersTest) +TEST_CASE("SublinearSmoothIdfEncodingIndividualCharactersTest", "[StringEncodingTest]") { vector input = { "GACCA", @@ -1255,7 +1254,7 @@ BOOST_AUTO_TEST_CASE(SublinearSmoothIdfEncodingIndividualCharactersTest) * sublinear term frequency type and the non-smooth inverse document frequency * type. */ -BOOST_AUTO_TEST_CASE(SublinearTfIdfEncodingIndividualCharactersTest) +TEST_CASE("SublinearTfIdfEncodingIndividualCharactersTest", "[StringEncodingTest]") { vector input = { "GACCA", @@ -1287,7 +1286,7 @@ BOOST_AUTO_TEST_CASE(SublinearTfIdfEncodingIndividualCharactersTest) * standard term frequency type and the smooth inverse document frequency * type. */ -BOOST_AUTO_TEST_CASE(TermFrequencySmoothIdfEncodingIndividualCharactersTest) +TEST_CASE("TermFrequencySmoothIdfEncodingIndividualCharactersTest", "[StringEncodingTest]") { vector input = { "GACCA", @@ -1368,7 +1367,7 @@ BOOST_AUTO_TEST_CASE(TermFrequencySmoothIdfEncodingIndividualCharactersTest) * standard term frequency type and the non-smooth inverse document frequency * type. */ -BOOST_AUTO_TEST_CASE(TermFrequencyTfIdfEncodingIndividualCharactersTest) +TEST_CASE("TermFrequencyTfIdfEncodingIndividualCharactersTest", "[StringEncodingTest]") { vector input = { "GACCA", @@ -1399,7 +1398,7 @@ BOOST_AUTO_TEST_CASE(TermFrequencyTfIdfEncodingIndividualCharactersTest) * Serialization test for the Tf-Idf encoding algorithm with * the SplitByAnyOf tokenizer. */ -BOOST_AUTO_TEST_CASE(SplitByAnyOfTfIdfEncodingSerialization) +TEST_CASE("SplitByAnyOfTfIdfEncodingSerialization", "[StringEncodingTest]") { using EncoderType = TfIdfEncoding; @@ -1424,6 +1423,3 @@ BOOST_AUTO_TEST_CASE(SplitByAnyOfTfIdfEncodingSerialization) CheckMatrices(output, xmlOutput, jsonOutput, binaryOutput); } - -BOOST_AUTO_TEST_SUITE_END(); -