diff --git a/deps/evalhyd-cpp b/deps/evalhyd-cpp index 6f17c3e0f32f935c0a4f34dc1d3c6a9ee780497b..8e78a67e961001b479f65879119f7abe752b87d1 160000 --- a/deps/evalhyd-cpp +++ b/deps/evalhyd-cpp @@ -1 +1 @@ -Subproject commit 6f17c3e0f32f935c0a4f34dc1d3c6a9ee780497b +Subproject commit 8e78a67e961001b479f65879119f7abe752b87d1 diff --git a/evalhyd/evalp.py b/evalhyd/evalp.py index 4639bea84656b00b49dd3766a53443a058a5443c..8c4dd1c5af27ccc83857cfa9549fb9d12448ba29 100644 --- a/evalhyd/evalp.py +++ b/evalhyd/evalp.py @@ -14,6 +14,7 @@ def evalp(q_obs: NDArray[dtype('float64')], q_thr: NDArray[dtype('float64')] = None, events: str = None, c_lvl: NDArray[dtype('float64')] = None, + q_lvl: NDArray[dtype('float64')] = None, t_msk: NDArray[dtype('bool')] = None, m_cdt: NDArray[dtype('|S32')] = None, bootstrap: Dict[str, int] = None, @@ -36,6 +37,8 @@ def evalp(q_obs: NDArray[dtype('float64')], kwargs['events'] = events if c_lvl is not None: kwargs['c_lvl'] = c_lvl + if q_lvl is not None: + kwargs['q_lvl'] = q_lvl if t_msk is not None: kwargs['t_msk'] = t_msk if m_cdt is not None: @@ -55,6 +58,7 @@ def evalp(q_obs: NDArray[dtype('float64')], 'q_prd': 4, 'q_thr': 2, 'c_lvl': 1, + 'q_lvl': 1, 't_msk': 4, 'm_cdt': 2, 'dts': 1 diff --git a/evalhyd/src/evalhyd.cpp b/evalhyd/src/evalhyd.cpp index 47c424d932c41b4dced0ad4bf248039701b64bad..2c2b16ae4e11c8875d2d522aeba7c63f37543df2 100644 --- a/evalhyd/src/evalhyd.cpp +++ b/evalhyd/src/evalhyd.cpp @@ -63,6 +63,7 @@ auto evalp( const xt::pytensor<double, 2>& q_thr, std::optional<std::string> events, const std::vector<double>& c_lvl, + const std::vector<double>& q_lvl, const xt::pytensor<bool, 4>& t_msk, const xt::pytensor<std::array<char, 32>, 2>& m_cdt, std::optional<std::unordered_map<std::string, int>> bootstrap, @@ -78,6 +79,7 @@ auto evalp( q_thr, (events.has_value()) ? events.value() : xtl::missing<std::string>(), c_lvl, + q_lvl, t_msk, m_cdt, (bootstrap.has_value()) @@ -130,6 +132,7 @@ PYBIND11_MODULE(_evalhyd, m) py::arg("q_thr") = xt::pytensor<double, 2>({0}), py::arg("events") = py::none(), py::arg("c_lvl") = py::list(), + py::arg("q_lvl") = py::list(), py::arg("t_msk") = xt::pytensor<bool, 4>({0}), py::arg("m_cdt") = xt::pytensor<std::array<char, 32>, 2>({0}), py::arg("bootstrap") = py::none(), diff --git a/tests/expected/evalp/CR_QLVL.csv b/tests/expected/evalp/CR_QLVL.csv new file mode 100644 index 0000000000000000000000000000000000000000..dfefd7e9ae92a09448178e081d471ade3fe9cc3f --- /dev/null +++ b/tests/expected/evalp/CR_QLVL.csv @@ -0,0 +1 @@ +0.00643087,0.0514469 diff --git a/tests/test_probabilist.py b/tests/test_probabilist.py index 0c14b7aa3f14f08df60e8825a7cafcb34948f187..a846984c8e419e2717055d2bc79290e9a22e5134 100644 --- a/tests/test_probabilist.py +++ b/tests/test_probabilist.py @@ -90,6 +90,13 @@ class TestMetrics(unittest.TestCase): ) for metric in ('CR', 'AW', 'AWN', 'WS') } + expected_itv_qlvl = { + metric: ( + numpy.genfromtxt(f"./expected/evalp/{metric}_QLVL.csv", delimiter=',') + [numpy.newaxis, numpy.newaxis, numpy.newaxis, numpy.newaxis, ...] + ) for metric in ('CR',) + } + expected_mvr = { metric: ( numpy.genfromtxt(f"./expected/evalp/{metric}.csv", delimiter=',') @@ -153,6 +160,21 @@ class TestMetrics(unittest.TestCase): self.expected_itv[metric] ) + def test_intervals_qlvl_metrics(self): + lvl = numpy.array([50., 80.]) + qlvl = numpy.array([10., 25., 75., 90]) + for metric in self.expected_itv_qlvl.keys(): + + numpy.set_printoptions(precision=13) + m = evalhyd.evalp(_obs, _prd[:, :, [0, 15, 30, 50], :], [metric], c_lvl=lvl, q_lvl=qlvl)[0][0, 0, 0] + numpy.savetxt(f"./expected/evalp/{metric}_QLVL.csv", m, delimiter=',', fmt="%.13f") + + with self.subTest(metric=metric): + numpy.testing.assert_almost_equal( + evalhyd.evalp(_obs, _prd[:, :, [0, 15, 30, 50], :], [metric], c_lvl=lvl, q_lvl=qlvl)[0], + self.expected_itv_qlvl[metric] + ) + def test_multivariate_metrics(self): n_sit = 5