# [rrd-developers] Re: Implementing TOTAL

Mark Mills mark at xodiax.com
Thu Jul 26 21:57:31 MEST 2001

```> -----Original Message-----
> From: Alex van den Bogaerdt [mailto:alex at slot.hollandcasino.nl]
> Subject: Re: [rrd-developers] Re: Implementing TOTAL
> > > 1) average(all rates)*timespan(graph)
> > > 2) sum(for each defined interval:(rate*stepsize))
> > > The difference would be the unknown intervals.  In the first case
> > > unknown intervals are assumed to be at the average rate, in the
> > > second case unknown intervals are assumed to be zero.
> >
> > Do both? TOTALSUM, TOTALAVG are really ugly suggestions for
> names. =)
>
> They're not clear to me and this is within context :)

Ouch. I did say they were ugly names. ;) In any case, TOTAL
should be "TOTAL" and leave unknown treated as zero. If you
want to make up data it isn't a TOTAL but an adjusted total
and your next problem will be what KIND of adjustments to
make. Some people might want an interpreted adjustment rather
than presuming a raw average for the unknowns.

If nothing else, maybe TOTAL and ADJUSTED would do?

Would thse work for TOTAL and ADJUSTED? (No dev box yet *sniff*)

case VDEF_TOTAL: {
double sum=DNAN;
for (step=0;step<steps;step++) {
if (finite(data[step*src->ds_cnt]) &&
!isnan(data[step*src->ds_cnt]))
sum += data[step*src->ds_cnt];
}
if (!isnan(sum)) {
dst->vf.val  = sum*src->step;
dst->vf.when = 0;	/* no time component */
} else {
dst->vf.val  = DNAN;
dst->vf.when = 0;
}
}
break;
int cnt=0;
double sum=0.0;
for (step=0;step<steps;step++) {
if (finite(data[step*src->ds_cnt]) &&
!isnan(data[step*src->ds_cnt])) {
sum += data[step*src->ds_cnt];
cnt ++;
}
}
if (cnt) {
dst->vf.val  = sum/cnt*steps*src->step;
dst->vf.when = 0;	/* no time component */
} else {
dst->vf.val  = DNAN;
dst->vf.when = 0;
}
}
break;

Hey, since I'm cut-n-pasting your code around, why does AVERAGE
have step++ in it twice??? I took it outta mine because it looked
like a holdover from the while(){} loop style you had in much of
the other VDEF_ cases.

case VDEF_AVERAGE: {
int cnt=0;
double sum=0.0;
for (step=0;step<steps;step++) { /* ++ here ? */
if (finite(data[step*src->ds_cnt])) {
sum += data[step*src->ds_cnt];
cnt ++;
}
step++;   /* and ++ here too? */
}
if (cnt) {
dst->vf.val  = sum/cnt;
dst->vf.when = 0;	/* no time component */
} else {
dst->vf.val  = DNAN;
dst->vf.when = 0;
}
}
break;

> > Or alternately make TOTAL a raw sum and supply a COUNT and
> STEPS so we
> > can calculate it manually?
>
> We could have "preset" VDEFs such as timespan (number of
> seconds graphed).
> This could then be multiplied by the calculated average and
> thus provide
> the total as calculated using option 1 above.
>     VDEF:total=ds,AVERAGE,timespan,*
> This requires being able to use real RPN in VDEF commands, something
> that needs to be done anyway but it is currently not implemented.
>
> Option 2 could be implemented by doing
>    VDEF:total=ds,TOTAL
>
> Apart from calculating the total, is there any other need to know how
> many intervals were unknown or not?
>
> Thanks for the input, I really appreciate it.
> --
>    __________________________________________________________________
>  / alex at slot.hollandcasino.nl
> alex at ergens.op.het.net \
> | work
>  private |
> | My employer is capable of speaking therefore I speak only
> for myself |
> +-------------------------------------------------------------
> ---------+
> | Technical questions sent directly to me will be nuked. Use
> the list. |
> +-------------------------------------------------------------
> ---------+
> | http://faq.mrtg.org/
>          |
> | http://rrdtool.eu.org  --> tutorial
>          |
> +-------------------------------------------------------------
> ---------+
>

--
Unsubscribe mailto:rrd-developers-request at list.ee.ethz.ch?subject=unsubscribe
Help        mailto:rrd-developers-request at list.ee.ethz.ch?subject=help
Archive     http://www.ee.ethz.ch/~slist/rrd-developers