-
Thibault Hallouin authored
Since the metrics are typically summary statistics, their size is not very big, so that using xtensor instead of xarray as a data structure is not as critical as for input data. In turn, using xarray allows for metrics of different sizes to be returned without unnecessary size 1 dimensions (e.g. when only one threshold is given, or when no temporal masking is performed). So all output metrics are now returned in their "natural" shape (e.g. 1D for mono-component metrics, 2D for multi-component metrics), plus any additional dimension linked to multi-thresholds, multi-masking, etc.
91aec5e1
#include <istream>#include <fstream>#include <vector>#include <gtest/gtest.h>#include <xtensor/xtensor.hpp>#include <xtensor/xarray.hpp>#include <xtensor/xview.hpp>#include <xtensor/xmanipulation.hpp>#include <xtensor/xcsv.hpp>#include "evalhyd/determinist.hpp"TEST(DeterministTests, TestNSE) { // read in data std::ifstream ifs; ifs.open("./data/q_obs.csv"); xt::xtensor<double, 2> observed_2d =xt::load_csv<int>(ifs); ifs.close(); xt::xtensor<double, 1> observed_1d = xt::squeeze(observed_2d); ifs.open("./data/q_prd.csv"); xt::xtensor<double, 2> predicted_2d = xt::view( xt::load_csv<double>(ifs), xt::range(0, 5), xt::all() ); ifs.close(); xt::xtensor<double, 1> predicted_1d = xt::row(predicted_2d, 0); // compute scores (both with 2D and 1D tensors) std::vector<xt::xarray<double>> metrics_2d = evalhyd::evald<xt::xtensor<double, 2>>( observed_2d, predicted_2d, {"NSE"} ); std::vector<xt::xarray<double>> metrics_1d = evalhyd::evald<xt::xtensor<double, 1>>( observed_1d, predicted_1d, {"NSE"} ); // check results (both with 2D and 1D tensors) xt::xtensor<double, 1> nse_2d = {0.71891219, 0.7190249, 0.71835777, 0.71810361, 0.71776748}; EXPECT_TRUE(xt::allclose(metrics_2d[0], nse_2d)); xt::xtensor<double, 1> nse_1d = {0.71891219}; EXPECT_TRUE(xt::allclose(metrics_1d[0], nse_1d));}