diff --git a/include/evalhyd/detail/probabilist/ranks.hpp b/include/evalhyd/detail/probabilist/ranks.hpp index 376a80cc837b92cde453f99cac2424fad5df6a06..a03f4d00604ee9e8e939aacaa58ed81a7374f536 100644 --- a/include/evalhyd/detail/probabilist/ranks.hpp +++ b/include/evalhyd/detail/probabilist/ranks.hpp @@ -107,7 +107,8 @@ namespace evalhyd return ranks; } - /// Compute the number of observations for all possible rank values. + /// Compute the number of observations in each interval of the + /// rank diagram. /// /// \param r_k /// Ranks of streamflow observations. @@ -129,7 +130,7 @@ namespace evalhyd /// \param n_exp /// Number of bootstrap samples. /// \return - /// Tallies of streamflow observations for all possible ranks. + /// Tallies of streamflow observations in each rank interval. /// shape: (sites, lead times, subsets, samples, ranks) inline xt::xtensor<double, 5> calc_o_j( const xt::xtensor<double, 3>& r_k, @@ -235,7 +236,9 @@ namespace evalhyd m, b_exp[e]); // calculate length of subset - auto l = xt::sum(t_msk_sampled, -1); + auto l = xt::eval( + xt::sum(t_msk_sampled, -1, xt::keep_dims) + ); // compute the rank diagram xt::view(REL_DIAG, xt::all(), xt::all(), m, e, xt::all()) = @@ -300,20 +303,29 @@ namespace evalhyd m, b_exp[e]); // calculate length of subset - auto l = xt::sum(t_msk_sampled, -1); + auto l = xt::eval( + xt::sum(t_msk_sampled, -1, xt::keep_dims) + ); // compute the Delta score // \Delta = \sum_{k=1}^{N+1} (r_k - \frac{M}{N+1})^2 + auto delta = xt::nansum( + xt::square( + xt::view(o_j, xt::all(), xt::all(), m, e, xt::all()) + - (l / (n_mbr + 1)) + ), + -1 + ); + // \Delta_o = \frac{MN}{N+1} + auto delta_o = ( + xt::view(l, xt::all(), xt::all(), 0) + * n_mbr / (n_mbr + 1) + ); + // \delta = $\frac{\Delta}{\Delta_o} xt::view(DS, xt::all(), xt::all(), m, e) = - xt::nansum( - xt::square( - xt::view(o_j, xt::all(), xt::all(), m, e, xt::all()) - - (l / (n_mbr + 1)) - ), - -1 - ) / (l * n_mbr / (n_mbr + 1)); + delta / delta_o; } }