# unused # Copyright 2008, 2009, 2010 Kevin Ryde # This file is part of Chart. # # Chart is free software; you can redistribute it and/or modify it under the # terms of the GNU General Public License as published by the Free Software # Foundation; either version 3, or (at your option) any later version. # # Chart is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more # details. # # You should have received a copy of the GNU General Public License along # with Chart. If not, see . package App::Chart::Delayer; use strict; use warnings; use Carp; sub new { my ($class, %self) = @_; my $n = $self{'N'}; ($n > 0) or croak "App::Chart::Delayer: bad N: \"$n\""; $self{'array'} = [ ($self{'fill'}) x $n ]; $self{'pos'} = 0; return bless \%self, $class; } sub next { my ($self, $x) = @_; my $array = $self->{'array'}; my $pos = $self->{'pos'}; my $ret = $array->[$pos]; $array->[$pos] = $x; $pos++; if ($pos >= $self->{'N'}) { $pos = 0; } $self->{'pos'} = $pos; return $ret; } sub warmup_count { my ($self) = @_; return $self->{'N'} - 1; } package App::Chart::Average::SMA; use strict; use warnings; use Carp; sub new { my ($class, %self) = @_; my $n = $self{'N'}; ($n > 0) or croak "App::Chart::Average::SMA bad N: $n"; $self{'delayer'} = App::Chart::Delayer->new (N => $n, fill => 0); $self{'total'} = 0; use Data::Dumper; print Dumper (\%self); return bless \%self, $class; } sub next { my ($self, $x) = @_; my $total = ($self->{'total'} += $x - $self->{'delayer'}->next ($x)); return $total / $self->{'N'}; } sub warmup_count { my ($self) = @_; return $self->{'N'} - 1; } package App::Chart::Average::Median; use strict; use warnings; use Carp; use List::Util qw(min max); use Locale::TextDomain ('App-Chart'); use constant { name => __('Moving Median'), shortname => __('Median'), manual => __p('manual-node','Moving Median'), parameter_info => [ { key => 'N', name => __('Days'), type => 'integer', minimum => 1, maximum => 20 }, { key => 'fractile', name => __('Fractile'), type => 'percentage', default => 50, minimum => 0, maximum => 100 } ]; }; sub new { my ($class, %self) = @_; my $n = $self{'N'}; ($n > 0) or croak "App::Chart::Average::Median bad N: $n"; if (! exists $self{'fractile'}) { $self{'fractile'} = 50; } $self{'array'} = [ ]; return bless \%self, $class; } sub next { my ($self, $x) = @_; my $n = $self->{'N'}; my $array = $self->{'array'}; push @$array, $x; if (@$array > $n) { shift @$array; } my @s = sort {$a<=>$b} @$array; my $pos = int (scalar(@s) * $self->{'fractile'} / 100); return $s[min ($pos, scalar(@s))]; } sub warmup_count { my ($self) = @_; return $self->{'N'} - 1; } 1; __END__