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;