diff --git a/tests/test_probabilist.cpp b/tests/test_probabilist.cpp index 8c1f04065ab02a5c2f4bcc77fe89b3f80729f73f..be6cb4fb7c7015d979656698932aee8e6349258f 100644 --- a/tests/test_probabilist.cpp +++ b/tests/test_probabilist.cpp @@ -136,6 +136,274 @@ TEST(ProbabilistTests, TestQuantiles) EXPECT_TRUE(xt::allclose(metrics[1], crps)); } +TEST(ProbabilistTests, TestContingency) +{ + // read in data + xt::xtensor<double, 1> observed; + xt::xtensor<double, 2> predicted; + std::tie(observed, predicted) = load_data_p(); + + // compute scores + xt::xtensor<double, 2> thresholds = {{690, 534, 445, NAN}}; + + std::vector<xt::xarray<double>> metrics = + evalhyd::evalp( + // shape: (sites [1], time [t]) + xt::eval(xt::view(observed, xt::newaxis(), xt::all())), + // shape: (sites [1], lead times [1], members [m], time [t]) + xt::eval(xt::view(predicted, xt::newaxis(), xt::newaxis(), xt::all(), xt::all())), + {"POD", "POFD", "FAR", "CSI", "ROCSS"}, + thresholds, + "low" + ); + + // check results + // POD + xt::xtensor<double, 6> pod = + {{{{{{ 1. , 1. , 1. , NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.863309, 0.854369, 0.752941, NAN}, + { 0.848921, 0.854369, 0.752941, NAN}, + { 0.848921, 0.854369, 0.752941, NAN}, + { 0.848921, 0.84466 , 0.752941, NAN}}}}}}; + EXPECT_TRUE( + xt::sum(xt::isclose(metrics[0], pod, 1e-05, 1e-08, true)) + == xt::xscalar<double>(208) + ); + + // POFD + xt::xtensor<double, 6> pofd = + {{{{{{ 1. , 1. , 1. , NAN}, + { 0.087209, 0.038462, 0.026549, NAN}, + { 0.087209, 0.038462, 0.026549, NAN}, + { 0.087209, 0.038462, 0.026549, NAN}, + { 0.087209, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.026549, NAN}, + { 0.081395, 0.038462, 0.022124, NAN}}}}}}; + EXPECT_TRUE( + xt::sum(xt::isclose(metrics[1], pofd, 1e-04, 1e-07, true)) + == xt::xscalar<double>(208) + ); + + // FAR + xt::xtensor<double, 6> far = + {{{{{{ 0.553055, 0.66881 , 0.726688, NAN}, + { 0.111111, 0.083333, 0.085714, NAN}, + { 0.111111, 0.083333, 0.085714, NAN}, + { 0.111111, 0.083333, 0.085714, NAN}, + { 0.111111, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.104478, 0.083333, 0.085714, NAN}, + { 0.106061, 0.083333, 0.085714, NAN}, + { 0.106061, 0.083333, 0.085714, NAN}, + { 0.106061, 0.084211, 0.072464, NAN}}}}}}; + EXPECT_TRUE( + xt::sum(xt::isclose(metrics[2], far, 1e-05, 1e-08, true)) + == xt::xscalar<double>(208) + ); + + // CSI + xt::xtensor<double, 6> csi = + {{{{{{ 0.446945, 0.33119 , 0.273312, NAN}, + { 0.779221, 0.792793, 0.703297, NAN}, + { 0.779221, 0.792793, 0.703297, NAN}, + { 0.779221, 0.792793, 0.703297, NAN}, + { 0.779221, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.784314, 0.792793, 0.703297, NAN}, + { 0.771242, 0.792793, 0.703297, NAN}, + { 0.771242, 0.792793, 0.703297, NAN}, + { 0.771242, 0.783784, 0.711111, NAN}}}}}} + ; + EXPECT_TRUE( + xt::sum(xt::isclose(metrics[3], csi, 1e-05, 1e-08, true)) + == xt::xscalar<double>(208) + ); + + // ROC skill scores + xt::xtensor<double, 5> rocss = + {{{{{ 0.71085 , 0.783047, 0.713066, NAN}}}}}; + EXPECT_TRUE( + xt::sum(xt::isclose(metrics[4], rocss, 1e-05, 1e-08, true)) + == xt::xscalar<double>(4) + ); +} + TEST(ProbabilistTests, TestMasks) { // read in data