80 lines
1.6 KiB
C++
80 lines
1.6 KiB
C++
/*++
|
|
|
|
Copyright (c) 1998 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
decayacc.cpp
|
|
|
|
Abstract:
|
|
|
|
SIS Groveler decaying accumulator
|
|
|
|
Authors:
|
|
|
|
John Douceur, 1998
|
|
|
|
Environment:
|
|
|
|
User Mode
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
#include "all.hxx"
|
|
|
|
DecayingAccumulator::DecayingAccumulator(
|
|
unsigned int time_constant)
|
|
{
|
|
ASSERT(this != 0);
|
|
this->time_constant = double(time_constant);
|
|
ASSERT(this->time_constant >= 0.0);
|
|
decaying_accumulation = 0.0;
|
|
update_time = GET_TICK_COUNT();
|
|
}
|
|
|
|
void
|
|
DecayingAccumulator::increment(
|
|
int increase)
|
|
{
|
|
ASSERT(this != 0);
|
|
ASSERT(time_constant >= 0.0);
|
|
ASSERT(decaying_accumulation >= 0.0);
|
|
ASSERT(increase >= 0);
|
|
unsigned int current_time = GET_TICK_COUNT();
|
|
unsigned int elapsed_time = current_time - update_time;
|
|
ASSERT(signed(elapsed_time) >= 0);
|
|
double coefficient = 0.0;
|
|
if (time_constant > 0.0)
|
|
{
|
|
coefficient = exp(-double(elapsed_time)/time_constant);
|
|
}
|
|
ASSERT(coefficient >= 0.0);
|
|
ASSERT(coefficient <= 1.0);
|
|
decaying_accumulation =
|
|
coefficient * decaying_accumulation + double(increase);
|
|
ASSERT(decaying_accumulation >= 0.0);
|
|
update_time = current_time;
|
|
}
|
|
|
|
double
|
|
DecayingAccumulator::retrieve_value() const
|
|
{
|
|
ASSERT(this != 0);
|
|
ASSERT(time_constant >= 0.0);
|
|
ASSERT(decaying_accumulation >= 0.0);
|
|
unsigned int current_time = GET_TICK_COUNT();
|
|
unsigned int elapsed_time = current_time - update_time;
|
|
ASSERT(signed(elapsed_time) >= 0);
|
|
double coefficient = 0.0;
|
|
if (time_constant > 0.0)
|
|
{
|
|
coefficient = exp(-double(elapsed_time)/time_constant);
|
|
}
|
|
ASSERT(coefficient >= 0.0);
|
|
ASSERT(coefficient <= 1.0);
|
|
return coefficient * decaying_accumulation;
|
|
}
|