From: oetiker Date: Tue, 11 Sep 2007 06:28:15 +0000 (+0000) Subject: Allow to the the smoothing window size other thatn the default 5%. X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=893a239ec615b6d0c3c35f1f6673b1ef56dce87e;p=rrdtool-all.git Allow to the the smoothing window size other thatn the default 5%. -- Evan Miller emiller imvu.com git-svn-id: svn://svn.oetiker.ch/rrdtool/trunk@1203 a5681a0c-68f1-0310-ab6d-d61299d08faa --- diff --git a/program/doc/rrdcreate.pod b/program/doc/rrdcreate.pod index 49db70ec..37eacbef 100644 --- a/program/doc/rrdcreate.pod +++ b/program/doc/rrdcreate.pod @@ -238,11 +238,11 @@ BIB<:>IB<:>IB<:>IB<:>I[B<: =item * -BIB<:>IB<:>IB<:>I +BIB<:>IB<:>IB<:>I[B<:smoothing-window=>I] =item * -BIB<:>IB<:>IB<:>I +BIB<:>IB<:>IB<:>I[B<:smoothing-window=>I] =item * @@ -342,6 +342,13 @@ If SEASONAL and DEVSEASONAL B are created explicitly, I need not be the same for both. Note that I can also be changed via the B I command. +I specifies the fraction of a season that should be +averaged around each point. By default, the value of I is +0.05, which means each value in SEASONAL and DEVSEASONAL will be occasionally +replaced by averaging it with its (I*0.05) nearest neighbors. +Setting I to zero will disable the running-average smoother +altogether. + I provides the links between related B. If HWPREDICT is specified alone and the other B are created implicitly, then there is no need to worry about this argument. If B are created diff --git a/program/doc/rrdtune.pod b/program/doc/rrdtune.pod index 5a08394f..859c1434 100644 --- a/program/doc/rrdtune.pod +++ b/program/doc/rrdtune.pod @@ -18,6 +18,8 @@ S<[B<--alpha> I]> S<[B<--beta> I]> S<[B<--gamma> I]> S<[B<--gamma-deviation> I]> +S<[B<--smoothing-window> I]> +S<[B<--smoothing-window-deviation> I]> S<[B<--aberrant-reset> I]> =head1 DESCRIPTION @@ -117,6 +119,16 @@ B. This parameter must be between 0 and 1. Alter the seasonal deviation adaptation parameter for the DEVSEASONAL B. This parameter must be between 0 and 1. +=item S I> + +Alter the size of the smoothing window for the SEASONAL B. This must +be between 0 and 1. + +=item S I> + +Alter the size of the smoothing window for the DEVSEASONAL B. This must +be between 0 and 1. + =item S I> This option causes the aberrant behavior detection algorithm to reset diff --git a/program/src/rrd_create.c b/program/src/rrd_create.c index 47d34cb4..b6dd08f8 100644 --- a/program/src/rrd_create.c +++ b/program/src/rrd_create.c @@ -264,6 +264,8 @@ int rrd_create_r( /* initialize some parameters */ rrd.rra_def[rrd.stat_head->rra_cnt]. par[RRA_seasonal_gamma].u_val = 0.1; + rrd.rra_def[rrd.stat_head->rra_cnt]. + par[RRA_seasonal_smoothing_window].u_val = 0.05; /* fall through */ case CF_DEVPREDICT: rrd.rra_def[rrd.stat_head->rra_cnt]. @@ -420,6 +422,25 @@ int rrd_create_r( par[RRA_dependent_rra_idx].u_cnt = atoi(token) - 1; break; + case CF_DEVSEASONAL: + case CF_SEASONAL: + /* optional smoothing window */ + if (sscanf(token, "smoothing-window=%lf", + &(rrd.rra_def[rrd.stat_head->rra_cnt]. + par[RRA_seasonal_smoothing_window].u_val))) { + strcpy(rrd.stat_head->version, RRD_VERSION); /* smoothing-window causes Version 4 */ + if (rrd.rra_def[rrd.stat_head->rra_cnt]. + par[RRA_seasonal_smoothing_window].u_val < 0.0 + || rrd.rra_def[rrd.stat_head->rra_cnt]. + par[RRA_seasonal_smoothing_window].u_val > 1.0) { + rrd_set_error("Invalid smoothing-window %f: must be between 0 and 1", + rrd.rra_def[rrd.stat_head->rra_cnt]. + par[RRA_seasonal_smoothing_window].u_val); + } + } else { + rrd_set_error("Invalid option %s", token); + } + break; case CF_HWPREDICT: case CF_MHWPREDICT: /* length of the associated CF_SEASONAL and CF_DEVSEASONAL arrays. */ diff --git a/program/src/rrd_dump.c b/program/src/rrd_dump.c index dadd34d3..6343e1d0 100644 --- a/program/src/rrd_dump.c +++ b/program/src/rrd_dump.c @@ -197,6 +197,11 @@ int rrd_dump_r( fprintf(out_file, "\t\t %lu \n", rrd.rra_def[i].par[RRA_seasonal_smooth_idx].u_cnt); + if (atoi(rrd.stat_head->version) >= 4) { + fprintf(out_file, + "\t\t %0.10e \n", + rrd.rra_def[i].par[RRA_seasonal_smoothing_window].u_val); + } fprintf(out_file, "\t\t %lu \n", rrd.rra_def[i].par[RRA_dependent_rra_idx].u_cnt); diff --git a/program/src/rrd_format.h b/program/src/rrd_format.h index 0d8a9dc3..3eb46ae2 100644 --- a/program/src/rrd_format.h +++ b/program/src/rrd_format.h @@ -194,13 +194,15 @@ enum cf_en { CF_AVERAGE = 0, /* data consolidation functions */ enum rra_par_en { RRA_cdp_xff_val = 0, /* what part of the consolidated * datapoint must be known, to produce a * valid entry in the rra */ - RRA_hw_alpha, + /* CF_HWPREDICT: */ + RRA_hw_alpha = 1, /* exponential smoothing parameter for the intercept in * the Holt-Winters prediction algorithm. */ - RRA_hw_beta, + RRA_hw_beta = 2, /* exponential smoothing parameter for the slope in * the Holt-Winters prediction algorithm. */ - RRA_dependent_rra_idx, + + RRA_dependent_rra_idx = 3, /* For CF_HWPREDICT: index of the RRA with the seasonal * effects of the Holt-Winters algorithm (of type * CF_SEASONAL). @@ -212,22 +214,30 @@ enum rra_par_en { RRA_cdp_xff_val = 0, /* what part of the consolidated * Holt-Winters prediction (of type CF_HWPREDICT). * For CF_FAILURES: index of the CF_DEVSEASONAL array. * */ - RRA_seasonal_smooth_idx, - /* For CF_SEASONAL and CF_DEVSEASONAL: - * an integer between 0 and row_count - 1 which + + /* CF_SEASONAL and CF_DEVSEASONAL: */ + RRA_seasonal_gamma = 1, + /* exponential smoothing parameter for seasonal effects. */ + + RRA_seasonal_smoothing_window = 2, + /* fraction of the season to include in the running average + * smoother */ + + /* RRA_dependent_rra_idx = 3, */ + + RRA_seasonal_smooth_idx = 4, + /* an integer between 0 and row_count - 1 which * is index in the seasonal cycle for applying * the period smoother. */ - RRA_failure_threshold, + + /* CF_FAILURES: */ + RRA_delta_pos = 1, /* confidence bound scaling parameters */ + RRA_delta_neg = 2, + /* RRA_dependent_rra_idx = 3, */ + RRA_window_len = 4, + RRA_failure_threshold = 5, /* For CF_FAILURES, number of violations within the last * window required to mark a failure. */ - RRA_seasonal_gamma = RRA_hw_alpha, - /* exponential smoothing parameter for seasonal effects. - * */ - RRA_delta_pos = RRA_hw_alpha, - RRA_delta_neg = RRA_hw_beta, - /* confidence bound scaling parameters for the - * the FAILURES RRA. */ - RRA_window_len = RRA_seasonal_smooth_idx }; /* For CF_FAILURES, the length of the window for measuring diff --git a/program/src/rrd_hw.c b/program/src/rrd_hw.c index 98333e27..e8024121 100644 --- a/program/src/rrd_hw.c +++ b/program/src/rrd_hw.c @@ -139,7 +139,14 @@ int apply_smoother( rrd_value_t *working_average; rrd_value_t *baseline; - offset = floor(0.025 * row_count); + if (atoi(rrd->stat_head->version) >= 4) { + offset = floor(rrd->rra_def[rra_idx]. + par[RRA_seasonal_smoothing_window]. + u_val / 2 * row_count); + } else { + offset = floor(0.05 / 2 * row_count); + } + if (offset == 0) return 0; /* no smoothing */ diff --git a/program/src/rrd_info.c b/program/src/rrd_info.c index 3a35d485..8f88d689 100644 --- a/program/src/rrd_info.c +++ b/program/src/rrd_info.c @@ -205,6 +205,11 @@ info_t *rrd_info_r( info.u_val = rrd.rra_def[i].par[RRA_seasonal_gamma].u_val; cd = info_push(cd, sprintf_alloc("rra[%d].gamma", i), RD_I_VAL, info); + if (atoi(rrd.stat_head->version) >= 4) { + info.u_val = rrd.rra_def[i].par[RRA_seasonal_smoothing_window].u_val; + cd = info_push(cd, sprintf_alloc("rra[%d].smoothing_window", i), RD_I_VAL, + info); + } break; case CF_FAILURES: info.u_val = rrd.rra_def[i].par[RRA_delta_pos].u_val; diff --git a/program/src/rrd_restore.c b/program/src/rrd_restore.c index 3dc8931a..c301736e 100644 --- a/program/src/rrd_restore.c +++ b/program/src/rrd_restore.c @@ -383,6 +383,11 @@ int xml2rrd( read_tag(&ptr2, "seasonal_smooth_idx", "%lu", &(rrd->rra_def[rra_index]. par[RRA_seasonal_smooth_idx].u_cnt)); + if (atoi(rrd->stat_head->version) >= 4) { + read_tag(&ptr2, "smoothing_window", "%lf", + &(rrd->rra_def[rra_index]. + par[RRA_seasonal_smoothing_window].u_val)); + } read_tag(&ptr2, "dependent_rra_idx", "%lu", &(rrd->rra_def[rra_index]. par[RRA_dependent_rra_idx].u_cnt)); diff --git a/program/src/rrd_tune.c b/program/src/rrd_tune.c index 1c72db7d..36b2bb0b 100644 --- a/program/src/rrd_tune.c +++ b/program/src/rrd_tune.c @@ -88,6 +88,8 @@ int rrd_tune( {"beta", required_argument, 0, 'y'}, {"gamma", required_argument, 0, 'z'}, {"gamma-deviation", required_argument, 0, 'v'}, + {"smoothing-window", required_argument, 0, 's'}, + {"smoothing-window-deviation", required_argument, 0, 'S'}, {"aberrant-reset", required_argument, 0, 'b'}, {0, 0, 0, 0} }; @@ -296,6 +298,20 @@ int rrd_tune( return -1; } break; + case 's': + strcpy(rrd.stat_head->version, RRD_VERSION); /* smoothing_window causes Version 4 */ + if (set_hwarg(&rrd, CF_SEASONAL, RRA_seasonal_smoothing_window, optarg)) { + rrd_free(&rrd); + return -1; + } + break; + case 'S': + strcpy(rrd.stat_head->version, RRD_VERSION); /* smoothing_window causes Version 4 */ + if (set_hwarg(&rrd, CF_DEVSEASONAL, RRA_seasonal_smoothing_window, optarg)) { + rrd_free(&rrd); + return -1; + } + break; case '?': if (optopt != 0) rrd_set_error("unknown option '%c'", optopt);