Bivio::Math::EMA
# Copyright (c) 2001 bivio Software, Inc. All Rights reserved.
# $Id$
package Bivio::Math::EMA;
use strict;
# NAME
#
# Bivio::Math::EMA - exponential moving average
#
# RELEASE SCOPE
#
# bOP
#
# SYNOPSIS
#
# use Bivio::Math::EMA;
#
use Bivio::UNIVERSAL;
@Bivio::Math::EMA::ISA = ('Bivio::UNIVERSAL');
# DESCRIPTION
#
#
Bivio::Math::EMA
is an exponential moving average.
#
#=IMPORTS
use Bivio::Type::Integer;
#=VARIABLES
my($_IDI) = __PACKAGE__->instance_data_index;
my($_LENGTH_RANGE) = Bivio::Type::Integer->new(
1, Bivio::Type::Integer->get_max);
# FACTORIES
#
#
# static new(int length) : Bivio::Math::EMA
#
# Creates a moving average with length iterations.
#
sub new {
my($proto, $length) = @_;
my($self) = $proto->SUPER::new;
$self->[$_IDI] = {
alpha => 2.0 / ($_LENGTH_RANGE->from_literal_or_die($length) + 1.0),
avg => undef,
};
return $self;
}
# METHODS
#
#
# compute(float value) : float
#
# Adds value to moving average and returns new average.
#
sub compute {
my($self, $value) = @_;
my($fields) = $self->[$_IDI];
return $fields->{avg} += defined($fields->{avg})
? $fields->{alpha} * ($value - $fields->{avg})
: $value;
}
#
# value() : float
#
# Returns the current value.
#
# Dies if compute hasn't been called.
#
sub value {
my($res) = shift->[$_IDI]->{avg};
die('not defined; must call compute at least once')
unless defined($res);
return $res;
}
#=PRIVATE METHODS
# COPYRIGHT
#
# Copyright (c) 2001 bivio Software, Inc. All Rights reserved.
#
# VERSION
#
# $Id$
#
1;