File Coverage

blib/lib/StupidMarkov.pm
Criterion Covered Total %
statement 6 47 12.7
branch 0 12 0.0
condition 0 3 0.0
subroutine 2 9 22.2
pod 6 6 100.0
total 14 77 18.1


line stmt bran cond sub pod time code
1             #!/usr/bin/perl
2              
3             package StupidMarkov;
4              
5 1     1   22247 use strict;
  1         2  
  1         33  
6 1     1   5 use warnings;
  1         2  
  1         6377  
7              
8             our $VERSION = "0.002";
9              
10              
11             sub new {
12 0     0 1   my $proto = shift;
13 0   0       my $class = ref($proto) || $proto;
14 0           my $self = {
15             "_probabilities" => {},
16             "_prev_item" => undef,
17             "_first_item" => undef,
18             "_item_count" => 0,
19             "_state" => undef,
20             };
21              
22 0           bless $self, $class;
23             }
24              
25             sub get_item_count {
26 0     0 1   my $self = shift;
27 0           return $self->{"_item_count"};
28             }
29              
30             sub get_probabilities {
31 0     0 1   my $self = shift;
32 0           return $self->{"_probabilities"};
33             }
34              
35             sub get_state {
36 0     0 1   my $self = shift;
37 0           return $self->{"_state"};
38             }
39              
40             sub add_item {
41 0     0 1   my $self = shift;
42 0           my $item = shift;
43 0           my $prev_item = $self->{"_prev_item"};
44 0           my $probabilities = $self->{"_probabilities"};
45              
46 0 0         if (defined($prev_item)) {
47 0 0         if (!defined($probabilities->{$prev_item})) {
48 0           $probabilities->{$prev_item} = { $item => 1 };
49             } else {
50 0           $probabilities->{$prev_item}->{$item}++;
51             }
52             } else {
53 0           $self->{"_first_item"} = $item;
54             }
55              
56 0           $self->{"_prev_item"} = $item;
57 0           $self->{"_item_count"}++;
58             }
59              
60             sub _get_probable_next_item {
61 0     0     my $self = shift;
62 0           my $state = $self->{"_state"};
63 0           my $probabilities = $self->{"_probabilities"};
64 0           my $items = [];
65              
66 0           foreach my $next_state (keys(%{$probabilities->{$state}})) {
  0            
67 0           foreach (0 .. $probabilities->{$state}->{$next_state}) {
68 0           push(@{$items}, $next_state);
  0            
69             }
70             }
71              
72 0           return $items->[int(rand(@{$items}))];
  0            
73             }
74              
75             sub get_next_item {
76 0     0 1   my $self = shift;
77 0           my $ext_state = shift;
78 0           my $probabilities = $self->{"_probabilities"};
79              
80 0 0         if (defined($ext_state)) {
    0          
81 0 0         return undef if (!defined($probabilities->{$ext_state}));
82 0 0         $self->{"_state"} = $ext_state if (!defined($self->{"_state"}));
83             } elsif (!defined($self->{"_state"})) {
84 0           $self->{"_state"} = $self->{"_first_item"};
85             }
86              
87 0           $self->{"_state"} = $self->_get_probable_next_item();
88 0           return $self->{"_state"};
89             }
90              
91              
92             1;
93             __END__