Linear trend slope across a span.
302{
303 if (samples.size() < 2)
304 return 0.0;
305
306 const auto n = static_cast<double>(samples.size());
307
308 double sum_x = 0.0;
309 double sum_y = 0.0;
310 double sum_xy = 0.0;
311 double sum_xx = 0.0;
312
313 for (size_t i = 0; i < samples.size(); ++i) {
314 const auto x = static_cast<double>(i);
315 const double y = samples[i];
316 sum_x += x;
317 sum_y += y;
318 sum_xy += x * y;
319 sum_xx += x * x;
320 }
321
322 const double denom = (n * sum_xx) - (sum_x * sum_x);
323 if (std::abs(denom) < 1e-12)
324 return 0.0;
325
326 return ((n * sum_xy) - (sum_x * sum_y)) / denom;
327}