• Thibault Hallouin's avatar
    return squeezed xarray · 91aec5e1
    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
test_determinist.cpp 1.46 KiB
#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));