8#ifndef INCLUDED_BDLSTA_MOMENT
9#define INCLUDED_BDLSTA_MOMENT
107#include <bdlscm_version.h>
109#include <bsl_cmath.h>
133template <MomentLevel::Enum ML>
221template <MomentLevel::Enum ML>
231 Moment_Data_t d_data;
349 d_data.d_sum += value;
357 const double delta = value - d_data.d_mean;
358 d_data.d_sum += value;
360 d_data.d_mean = d_data.d_sum /
static_cast<double>(d_data.d_count);
361 const double delta2 = value - d_data.d_mean;
362 d_data.d_M2 += delta * delta2;
370 const double delta = value - d_data.d_mean;
371 const double nm1 = d_data.d_count;
372 d_data.d_sum += value;
374 const double n = d_data.d_count;
375 const double deltaN = delta / n;
376 d_data.d_mean = d_data.d_sum / n;
377 const double term1 = delta * deltaN * nm1;
378 d_data.d_M3 += term1 * deltaN * (n - 2.0) - 3.0 * deltaN * d_data.d_M2;
379 d_data.d_M2 += term1;
388 const double delta = value - d_data.d_mean;
389 const double nm1 = d_data.d_count;
390 d_data.d_sum += value;
392 const double n = d_data.d_count;
393 const double n2 = n * n;
394 const double deltaN = delta / n;
395 d_data.d_mean = d_data.d_sum / n;
396 const double term1 = delta * deltaN * nm1;
397 const double deltaN2 = deltaN * deltaN;
398 d_data.d_M4 += term1 * deltaN2 * (n2 - 3.0 * n + 3.0) +
399 6 * deltaN2 * d_data.d_M2 - 4.0 * deltaN * d_data.d_M3;
400 d_data.d_M3 += term1 * deltaN * (n - 2.0) - 3.0 * deltaN * d_data.d_M2;
401 d_data.d_M2 += term1;
405template <MomentLevel::Enum ML>
409 return d_data.d_count;
416 BSLS_ASSERT(4 <= d_data.d_count && 0.0 != d_data.d_M2);
418 const double n =
static_cast<double>(d_data.d_count);
419 const double n1 = (n - 1.0);
420 const double n2n3 = (n - 2.0) * (n - 3.0);
421 return n * (n + 1.0) * n1 / n2n3 * d_data.d_M4 / d_data.d_M2 / d_data.d_M2
422 - 3.0 * n1 * n1 / n2n3;
429 if (4 > d_data.d_count || 0.0 == d_data.d_M2) {
430 return e_INADEQUATE_DATA;
432 *result = kurtosis();
436template <MomentLevel::Enum ML>
442 return d_data.d_sum /
static_cast<double>(d_data.d_count);
445template <MomentLevel::Enum ML>
449 if (1 > d_data.d_count) {
450 return e_INADEQUATE_DATA;
456template <MomentLevel::Enum ML>
460 BSLS_ASSERT(3 <= d_data.d_count && 0.0 != d_data.d_M2);
462 const double n =
static_cast<double>(d_data.d_count);
463 return bsl::sqrt(n - 1.0) * n / (n- 2.0) * d_data.d_M3
464 / bsl::pow(d_data.d_M2, 1.5);
467template <MomentLevel::Enum ML>
470 if (3 > d_data.d_count || 0.0 == d_data.d_M2) {
471 return e_INADEQUATE_DATA;
477template <MomentLevel::Enum ML>
483 return d_data.d_M2 / (d_data.d_count - 1);
486template <MomentLevel::Enum ML>
490 if (2 > d_data.d_count) {
491 return e_INADEQUATE_DATA;
493 *result = variance();
Definition bdlsta_moment.h:222
double variance() const
Definition bdlsta_moment.h:479
double skew() const
Definition bdlsta_moment.h:458
int count() const
Returns the number of elements in the data set.
Definition bdlsta_moment.h:407
int kurtosisIfValid(double *result) const
@ e_INADEQUATE_DATA
Definition bdlsta_moment.h:237
@ e_SUCCESS
Definition bdlsta_moment.h:236
int varianceIfValid(double *result) const
Definition bdlsta_moment.h:488
double mean() const
Definition bdlsta_moment.h:438
int skewIfValid(double *result) const
Definition bdlsta_moment.h:468
int meanIfValid(double *result) const
Definition bdlsta_moment.h:447
void add(double value)
Add the specified value to the data set.
#define BSLS_ASSERT(X)
Definition bsls_assert.h:1976
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
Definition bdlsta_linefit.h:110
Definition bdlsta_moment.h:117
Enum
Definition bdlsta_moment.h:119
@ e_M4
Definition bdlsta_moment.h:125
@ e_M3
Definition bdlsta_moment.h:124
@ e_M1
Definition bdlsta_moment.h:122
@ e_M2
Definition bdlsta_moment.h:123
int d_count
Definition bdlsta_moment.h:141
double d_sum
Definition bdlsta_moment.h:142
double d_sum
Definition bdlsta_moment.h:156
double d_mean
Definition bdlsta_moment.h:157
int d_count
Definition bdlsta_moment.h:155
double d_M2
Definition bdlsta_moment.h:158
double d_mean
Definition bdlsta_moment.h:173
double d_M2
Definition bdlsta_moment.h:174
int d_count
Definition bdlsta_moment.h:171
double d_M3
Definition bdlsta_moment.h:175
double d_sum
Definition bdlsta_moment.h:172
int d_count
Definition bdlsta_moment.h:188
double d_M2
Definition bdlsta_moment.h:191
double d_mean
Definition bdlsta_moment.h:190
double d_M3
Definition bdlsta_moment.h:192
double d_M4
Definition bdlsta_moment.h:193
double d_sum
Definition bdlsta_moment.h:189
Definition bdlsta_moment.h:134