diff --git a/include/evalhyd/detail/determinist/evaluator.hpp b/include/evalhyd/detail/determinist/evaluator.hpp
index 6295a20130e5cc34ad993185203cc8a9a34597ef..bd2b7457ef6ef4f4e64fbe2a050730360622acfd 100644
--- a/include/evalhyd/detail/determinist/evaluator.hpp
+++ b/include/evalhyd/detail/determinist/evaluator.hpp
@@ -74,7 +74,7 @@ namespace evalhyd
                 t_msk = xt::ones<bool>({n_msk, n_srs, n_tim});
                 xt::view(t_msk, xt::all()) =
                         xt::view(msk, xt::all(), xt::newaxis(), xt::all());
-                for (int m = 0; m < n_msk; m++) {
+                for (std::size_t m = 0; m < n_msk; m++) {
                     xt::view(t_msk, m) =
                             xt::where(obs_nan | prd_nan,
                                       false, xt::view(t_msk, m));
@@ -116,13 +116,13 @@ namespace evalhyd
         void Evaluator<D2, B2>::calc_mean_obs()
         {
             mean_obs = xt::zeros<double>(mean_dims);
-            for (int m = 0; m < n_msk; m++) {
+            for (std::size_t m = 0; m < n_msk; m++) {
                 // apply the mask
                 // (using NaN workaround until reducers work on masked_view)
                 auto obs_masked = xt::where(xt::view(t_msk, m), q_obs, NAN);
 
                 // compute variable one sample at a time
-                for (int e = 0; e < n_exp; e++) {
+                for (std::size_t e = 0; e < n_exp; e++) {
                     // apply the bootstrap sampling
                     auto obs = xt::view(obs_masked, xt::all(), b_exp[e]);
                     xt::view(mean_obs, m, e) =
@@ -143,13 +143,13 @@ namespace evalhyd
         void Evaluator<D2, B2>::calc_mean_prd()
         {
             mean_prd = xt::zeros<double>(mean_dims);
-            for (int m = 0; m < n_msk; m++) {
+            for (std::size_t m = 0; m < n_msk; m++) {
                 // apply the mask
                 // (using NaN workaround until reducers work on masked_view)
                 auto prd_masked = xt::where(xt::view(t_msk, m), q_prd, NAN);
 
                 // compute variable one sample at a time
-                for (int e = 0; e < n_exp; e++) {
+                for (std::size_t e = 0; e < n_exp; e++) {
                     // apply the bootstrap sampling
                     auto prd = xt::view(prd_masked, xt::all(), b_exp[e]);
                     xt::view(mean_prd, m, e) =
@@ -190,12 +190,12 @@ namespace evalhyd
         void Evaluator<D2, B2>::calc_quad_obs()
         {
             quad_obs = xt::zeros<double>(inter_dims);
-            for (int m = 0; m < n_msk; m++) {
+            for (std::size_t m = 0; m < n_msk; m++) {
                 // apply the mask
                 // (using NaN workaround until reducers work on masked_view)
                 auto obs_masked = xt::where(xt::view(t_msk, m), q_obs, NAN);
 
-                for (int e = 0; e < n_exp; e++) {
+                for (std::size_t e = 0; e < n_exp; e++) {
                     xt::view(quad_obs, m, e) = xt::square(
                             obs_masked - xt::view(mean_obs, m, e)
                     );
@@ -218,12 +218,12 @@ namespace evalhyd
         void Evaluator<D2, B2>::calc_quad_prd()
         {
             quad_prd = xt::zeros<double>(inter_dims);
-            for (int m = 0; m < n_msk; m++) {
+            for (std::size_t m = 0; m < n_msk; m++) {
                 // apply the mask
                 // (using NaN workaround until reducers work on masked_view)
                 auto prd_masked = xt::where(xt::view(t_msk, m), q_prd, NAN);
 
-                for (int e = 0; e < n_exp; e++) {
+                for (std::size_t e = 0; e < n_exp; e++) {
                     xt::view(quad_prd, m, e) = xt::square(
                             prd_masked - xt::view(mean_prd, m, e)
                     );
@@ -260,14 +260,14 @@ namespace evalhyd
             // calculate error in timing and dynamics $r_{pearson}$
             // (Pearson's correlation coefficient)
             r_pearson = xt::zeros<double>(inner_dims);
-            for (int m = 0; m < n_msk; m++) {
+            for (std::size_t m = 0; m < n_msk; m++) {
                 // apply the mask
                 // (using NaN workaround until reducers work on masked_view)
                 auto prd_masked = xt::where(xt::view(t_msk, m), q_prd, NAN);
                 auto obs_masked = xt::where(xt::view(t_msk, m), q_obs, NAN);
 
                 // compute variable one sample at a time
-                for (int e = 0; e < n_exp; e++) {
+                for (std::size_t e = 0; e < n_exp; e++) {
                     auto prd = xt::view(prd_masked, xt::all(), b_exp[e]);
                     auto obs = xt::view(obs_masked, xt::all(), b_exp[e]);
                     auto r_num = xt::nansum(
@@ -309,14 +309,14 @@ namespace evalhyd
         {
             // calculate error in spread of flow $alpha$
             alpha = xt::zeros<double>(inner_dims);
-            for (int m = 0; m < n_msk; m++) {
+            for (std::size_t m = 0; m < n_msk; m++) {
                 // apply the mask
                 // (using NaN workaround until reducers work on masked_view)
                 auto prd_masked = xt::where(xt::view(t_msk, m), q_prd, NAN);
                 auto obs_masked = xt::where(xt::view(t_msk, m), q_obs, NAN);
 
                 // compute variable one sample at a time
-                for (int e = 0; e < n_exp; e++) {
+                for (std::size_t e = 0; e < n_exp; e++) {
                     auto prd = xt::view(prd_masked, xt::all(), b_exp[e]);
                     auto obs = xt::view(obs_masked, xt::all(), b_exp[e]);
                     xt::view(alpha, m, e) =
@@ -342,14 +342,14 @@ namespace evalhyd
         {
             // calculate $bias$
             bias = xt::zeros<double>(inner_dims);
-            for (int m = 0; m < n_msk; m++) {
+            for (std::size_t m = 0; m < n_msk; m++) {
                 // apply the mask
                 // (using NaN workaround until reducers work on masked_view)
                 auto prd_masked = xt::where(xt::view(t_msk, m), q_prd, NAN);
                 auto obs_masked = xt::where(xt::view(t_msk, m), q_obs, NAN);
 
                 // compute variable one sample at a time
-                for (int e = 0; e < n_exp; e++) {
+                for (std::size_t e = 0; e < n_exp; e++) {
                     auto prd = xt::view(prd_masked, xt::all(), b_exp[e]);
                     auto obs = xt::view(obs_masked, xt::all(), b_exp[e]);
                     xt::view(bias, m, e) =
@@ -371,13 +371,13 @@ namespace evalhyd
         {
             // compute RMSE
             RMSE = xt::zeros<double>(final_dims);
-            for (int m = 0; m < n_msk; m++) {
+            for (std::size_t m = 0; m < n_msk; m++) {
                 // apply the mask
                 // (using NaN workaround until reducers work on masked_view)
                 auto quad_err_masked = xt::where(xt::view(t_msk, m), quad_err, NAN);
 
                 // compute variable one sample at a time
-                for (int e = 0; e < n_exp; e++) {
+                for (std::size_t e = 0; e < n_exp; e++) {
                     auto err2 = xt::view(quad_err_masked, xt::all(), b_exp[e]);
                     xt::view(RMSE, xt::all(), m, e) = xt::sqrt(xt::nanmean(err2, -1));
                 }
@@ -399,13 +399,13 @@ namespace evalhyd
         void Evaluator<D2, B2>::calc_NSE()
         {
             NSE = xt::zeros<double>(final_dims);
-            for (int m = 0; m < n_msk; m++) {
+            for (std::size_t m = 0; m < n_msk; m++) {
                 // apply the mask
                 // (using NaN workaround until reducers work on masked_view)
                 auto quad_err_masked = xt::where(xt::view(t_msk, m), quad_err, NAN);
 
                 // compute variable one sample at a time
-                for (int e = 0; e < n_exp; e++) {
+                for (std::size_t e = 0; e < n_exp; e++) {
                     // compute squared errors operands
                     auto err2 = xt::view(quad_err_masked, xt::all(), b_exp[e]);
                     xt::xtensor<double, 1> f_num =
@@ -438,8 +438,8 @@ namespace evalhyd
         void Evaluator<D2, B2>::calc_KGE()
         {
             KGE = xt::zeros<double>(final_dims);
-            for (int m = 0; m < n_msk; m++) {
-                for (int e = 0; e < n_exp; e++) {
+            for (std::size_t m = 0; m < n_msk; m++) {
+                for (std::size_t e = 0; e < n_exp; e++) {
                     // compute KGE
                     xt::view(KGE, xt::all(), m, e) = 1 - xt::sqrt(
                             xt::square(xt::view(r_pearson, m, e) - 1)
@@ -474,8 +474,8 @@ namespace evalhyd
         void Evaluator<D2, B2>::calc_KGEPRIME()
         {
             KGEPRIME = xt::zeros<double>(final_dims);
-            for (int m = 0; m < n_msk; m++) {
-                for (int e = 0; e < n_exp; e++) {
+            for (std::size_t m = 0; m < n_msk; m++) {
+                for (std::size_t e = 0; e < n_exp; e++) {
                     // calculate error in spread of flow $gamma$
                     auto gamma = xt::view(alpha, m, e)
                                  * (xt::view(mean_obs, m, e, xt::all(), 0)
diff --git a/include/evalhyd/detail/probabilist/evaluator.hpp b/include/evalhyd/detail/probabilist/evaluator.hpp
index 07bd764574e4dbfc4937fc7c46c6fd85559883f9..7574b197d5d9098f034838b9c3e32b77d868b54c 100644
--- a/include/evalhyd/detail/probabilist/evaluator.hpp
+++ b/include/evalhyd/detail/probabilist/evaluator.hpp
@@ -24,7 +24,7 @@ namespace evalhyd
             using view1d_xtensor2d_double_type = decltype(
             xt::view(
                     std::declval<const D2&>(),
-                    std::declval<int>(),
+                    std::declval<std::size_t>(),
                     xt::all()
             )
             );
@@ -32,8 +32,8 @@ namespace evalhyd
             using view2d_xtensor4d_double_type = decltype(
             xt::view(
                     std::declval<const D4&>(),
-                    std::declval<int>(),
-                    std::declval<int>(),
+                    std::declval<std::size_t>(),
+                    std::declval<std::size_t>(),
                     xt::all(),
                     xt::all()
             )
@@ -42,8 +42,8 @@ namespace evalhyd
             using view2d_xtensor4d_bool_type = decltype(
             xt::view(
                     std::declval<const B4&>(),
-                    std::declval<int>(),
-                    std::declval<int>(),
+                    std::declval<std::size_t>(),
+                    std::declval<std::size_t>(),
                     xt::all(),
                     xt::all()
             )
@@ -187,7 +187,7 @@ namespace evalhyd
             // compute variable one sample at a time
             bar_o = xt::zeros<double>({n_msk, n_exp, n_thr});
 
-            for (int e = 0; e < n_exp; e++)
+            for (std::size_t e = 0; e < n_exp; e++)
             {
                 // apply the bootstrap sampling
                 auto o_k_masked_sampled =
@@ -284,14 +284,14 @@ namespace evalhyd
             BS = xt::zeros<double>({n_msk, n_exp, n_thr});
 
             // compute variable one mask at a time to minimise memory imprint
-            for (int m = 0; m < n_msk; m++)
+            for (std::size_t m = 0; m < n_msk; m++)
             {
                 // apply the mask
                 // (using NaN workaround until reducers work on masked_view)
                 auto bs_masked = xt::where(xt::row(t_msk, m), bs, NAN);
 
                 // compute variable one sample at a time
-                for (int e = 0; e < n_exp; e++)
+                for (std::size_t e = 0; e < n_exp; e++)
                 {
                     // apply the bootstrap sampling
                     auto bs_masked_sampled =
@@ -354,7 +354,7 @@ namespace evalhyd
             BS_CRD = xt::zeros<double>({n_msk, n_exp, n_thr, std::size_t {3}});
 
             // compute variable one mask at a time to minimise memory imprint
-            for (int m = 0; m < n_msk; m++)
+            for (std::size_t m = 0; m < n_msk; m++)
             {
                 // apply the mask
                 // (using NaN workaround until reducers work on masked_view)
@@ -362,7 +362,7 @@ namespace evalhyd
                 auto y_k_masked = xt::where(xt::row(t_msk, m), y_k, NAN);
 
                 // compute variable one sample at a time
-                for (int e = 0; e < n_exp; e++)
+                for (std::size_t e = 0; e < n_exp; e++)
                 {
                     // apply the bootstrap sampling
                     auto o_k_masked_sampled =
@@ -479,7 +479,7 @@ namespace evalhyd
             BS_LBD = xt::zeros<double>({n_msk, n_exp, n_thr, std::size_t {3}});
 
             // compute variable one mask at a time to minimise memory imprint
-            for (int m = 0; m < n_msk; m++)
+            for (std::size_t m = 0; m < n_msk; m++)
             {
                 // apply the mask
                 // (using NaN workaround until reducers work on masked_view)
@@ -487,7 +487,7 @@ namespace evalhyd
                 auto y_k_masked = xt::where(xt::row(t_msk, m), y_k, NAN);
 
                 // compute variable one sample at a time
-                for (int e = 0; e < n_exp; e++)
+                for (std::size_t e = 0; e < n_exp; e++)
                 {
                     // apply the bootstrap sampling
                     auto o_k_masked_sampled =
@@ -601,7 +601,7 @@ namespace evalhyd
             BSS = xt::zeros<double>({n_msk, n_exp, n_thr});
 
             // compute variable one mask at a time to minimise memory imprint
-            for (int m = 0; m < n_msk; m++)
+            for (std::size_t m = 0; m < n_msk; m++)
             {
                 // apply the mask
                 // (using NaN workaround until reducers work on masked_view)
@@ -609,7 +609,7 @@ namespace evalhyd
                 auto bs_masked = xt::where(xt::row(t_msk, m), bs, NAN);
 
                 // compute variable one sample at a time
-                for (int e = 0; e < n_exp; e++)
+                for (std::size_t e = 0; e < n_exp; e++)
                 {
                     // apply the bootstrap sampling
                     auto o_k_masked_sampled =
@@ -707,14 +707,14 @@ namespace evalhyd
             QS = xt::zeros<double>({n_msk, n_exp, n_mbr});
 
             // compute variable one mask at a time to minimise memory imprint
-            for (int m = 0; m < n_msk; m++)
+            for (std::size_t m = 0; m < n_msk; m++)
             {
                 // apply the mask
                 // (using NaN workaround until reducers work on masked_view)
                 auto qs_masked = xt::where(xt::row(t_msk, m), qs, NAN);
 
                 // compute variable one sample at a time
-                for (int e = 0; e < n_exp; e++)
+                for (std::size_t e = 0; e < n_exp; e++)
                 {
                     // apply the bootstrap sampling
                     auto qs_masked_sampled =
@@ -773,14 +773,14 @@ namespace evalhyd
             CRPS = xt::zeros<double>({n_msk, n_exp});
 
             // compute variable one mask at a time to minimise memory imprint
-            for (int m = 0; m < n_msk; m++)
+            for (std::size_t m = 0; m < n_msk; m++)
             {
                 // apply the mask
                 // (using NaN workaround until reducers work on masked_view)
                 auto crps_masked = xt::where(xt::row(t_msk, m), crps, NAN);
 
                 // compute variable one sample at a time
-                for (int e = 0; e < n_exp; e++)
+                for (std::size_t e = 0; e < n_exp; e++)
                 {
                     // apply the bootstrap sampling
                     auto crps_masked_sampled =
diff --git a/include/evalhyd/detail/uncertainty.hpp b/include/evalhyd/detail/uncertainty.hpp
index fd26b45e17c868d9ad49b0498862a283522a5aa1..e55d04638e6d8aa42021b3e36bedad7cddf7c973 100644
--- a/include/evalhyd/detail/uncertainty.hpp
+++ b/include/evalhyd/detail/uncertainty.hpp
@@ -58,7 +58,7 @@ namespace evalhyd
 
             // check constant time interval
             auto ti = x_timepoints[1] - x_timepoints[0];
-            for (int t = 1; t < x_timepoints.size() - 1; t++)
+            for (std::size_t t = 1; t < x_timepoints.size() - 1; t++)
                 if (x_timepoints[t + 1] - x_timepoints[t] != ti) {
                     throw std::runtime_error(
                             "time interval not constant across datetimes"
@@ -128,7 +128,7 @@ namespace evalhyd
                 );
                 xt::xtensor<int, 1> idx = xt::concatenate(xt::xtuple(i0, i1), 0);
 
-                for (int p = 2; p < exp.size(); p++) {
+                for (std::size_t p = 2; p < exp.size(); p++) {
                     auto i = xt::flatten_indices(
                             xt::argwhere(xt::equal(year_blocks, exp(p)))
                     );
diff --git a/include/evalhyd/evald.hpp b/include/evalhyd/evald.hpp
index 32e9c161506d9b0bfb69d633eb21470bc3381aba..625ae232477215c3a62fc58e56463f11ba58a4f9 100644
--- a/include/evalhyd/evald.hpp
+++ b/include/evalhyd/evald.hpp
@@ -213,12 +213,12 @@ namespace evalhyd
             // if t_msk provided, it takes priority
             if (t_msk_.size() > 0)
                 return t_msk_;
-                // else if m_cdt provided, use them to generate t_msk
+            // else if m_cdt provided, use them to generate t_msk
             else if (m_cdt.size() > 0)
             {
                 B2 c_msk = xt::zeros<bool>({n_msk, n_tim});
 
-                for (int m = 0; m < n_msk; m++)
+                for (std::size_t m = 0; m < n_msk; m++)
                     xt::view(c_msk, m) =
                             masks::generate_mask_from_conditions(
                                     m_cdt[0], xt::view(q_obs_, 0), q_prd_
@@ -226,7 +226,7 @@ namespace evalhyd
 
                 return c_msk;
             }
-                // if neither t_msk nor m_cdt provided, generate dummy mask
+            // if neither t_msk nor m_cdt provided, generate dummy mask
             else
                 return B2({xt::ones<bool>({std::size_t{1}, n_tim})});
         };
diff --git a/include/evalhyd/evalp.hpp b/include/evalhyd/evalp.hpp
index 0103ab3c01e3349b49a55e7b8534ead22d178f1e..7a044c3eccc50dc431c07d353dfedb2755eddcfc 100644
--- a/include/evalhyd/evalp.hpp
+++ b/include/evalhyd/evalp.hpp
@@ -249,9 +249,9 @@ namespace evalhyd
         auto gen_msk = [&]() {
             B4 c_msk = xt::zeros<bool>({n_sit, n_ltm, n_msk, n_tim});
             if (m_cdt.size() > 0)
-                for (int s = 0; s < n_sit; s++)
-                    for (int l = 0; l < n_ltm; l++)
-                        for (int m = 0; m < n_msk; m++)
+                for (std::size_t s = 0; s < n_sit; s++)
+                    for (std::size_t l = 0; l < n_ltm; l++)
+                        for (std::size_t m = 0; m < n_msk; m++)
                             xt::view(c_msk, s, l, m) =
                                     masks::generate_mask_from_conditions(
                                             xt::view(m_cdt, s, m),
@@ -291,9 +291,9 @@ namespace evalhyd
         auto summary = bootstrap.find("summary")->second;
 
         // compute variables one site at a time to minimise memory imprint
-        for (int s = 0; s < n_sit; s++)
+        for (std::size_t s = 0; s < n_sit; s++)
             // compute variables one lead time at a time to minimise memory imprint
-            for (int l = 0; l < n_ltm; l++)
+            for (std::size_t l = 0; l < n_ltm; l++)
             {
                 // instantiate probabilist evaluator
                 const auto q_obs_v = xt::view(q_obs_, s, xt::all());
@@ -335,7 +335,7 @@ namespace evalhyd
                 }
 
                 // retrieve or compute requested metrics
-                for (int m = 0; m < metrics.size(); m++)
+                for (std::size_t m = 0; m < metrics.size(); m++)
                 {
                     const auto& metric = metrics[m];