diff --git a/tests/test_probabilist.cpp b/tests/test_probabilist.cpp index ae694f1fb39ac3e1270bda5e4bd560d964416532..9343093faebfb4cab62bb6fae3f2e4f9d075a02c 100644 --- a/tests/test_probabilist.cpp +++ b/tests/test_probabilist.cpp @@ -7,6 +7,8 @@ #include "evalhyd/evalp.hpp" +using namespace xt::placeholders; // required for `_` to work + TEST(ProbabilistTests, TestBrier) { // read in data std::ifstream ifs; @@ -58,3 +60,49 @@ TEST(ProbabilistTests, TestBrier) { {0.017191279, 0.1048221, 0.1743227}}}}}; EXPECT_TRUE(xt::allclose(metrics[3], bs_lbd)); } + +TEST(ProbabilistTests, TestMasks) { + // read in data + std::ifstream ifs; + ifs.open("./data/q_obs.csv"); + xt::xtensor<double, 1> observed = xt::squeeze(xt::load_csv<int>(ifs)); + ifs.close(); + + ifs.open("./data/q_prd.csv"); + xt::xtensor<double, 2> predicted = xt::load_csv<double>(ifs); + ifs.close(); + + // generate temporal subset by dropping 20 first time steps + xt::xtensor<double, 2> masks = + xt::ones<bool>({std::size_t {1}, std::size_t {observed.size()}}); + xt::view(masks, 0, xt::range(0, 20)) = 0; + + // compute scores using masks to subset whole record + xt::xtensor<double, 1> thresholds = {690, 534, 445}; + std::vector<std::string> metrics = {"BS", "BSS", "BS_CRD", "BS_LBD"}; + + std::vector<xt::xarray<double>> metrics_masked = + evalhyd::evalp( + xt::view(observed, xt::newaxis(), xt::all()), + xt::view(predicted, xt::newaxis(), xt::newaxis(), xt::all(), xt::all()), + metrics, + thresholds, + masks + ); + + // compute scores on pre-computed subset of whole record + std::vector<xt::xarray<double>> metrics_subset = + evalhyd::evalp( + xt::view(observed, xt::newaxis(), xt::range(20, _)), + xt::view(predicted, xt::newaxis(), xt::newaxis(), xt::all(), xt::range(20, _)), + metrics, + thresholds + ); + + // check results are identical + for (int m = 0; m < metrics.size(); m++) + { + EXPECT_TRUE(xt::allclose(metrics_masked[0], metrics_subset[0])); + } + +} \ No newline at end of file