File Coverage

blib/lib/Algorithm/MarkovChain.pm
Criterion Covered Total %
statement 49 51 96.0
branch 2 6 33.3
condition 1 3 33.3
subroutine 11 11 100.0
pod 3 6 50.0
total 66 77 85.7


line stmt bran cond sub pod time code
1             package Algorithm::MarkovChain;
2 1     1   824 use strict;
  1         2  
  1         41  
3 1     1   6 use warnings;
  1         2  
  1         36  
4 1     1   14 use Carp;
  1         2  
  1         92  
5              
6             require v5.6;
7             our $VERSION = '0.06';
8              
9 1     1   6 use base 'Algorithm::MarkovChain::Base';
  1         2  
  1         618  
10 1     1   8 use fields qw( chains totals );
  1         2  
  1         6  
11              
12             sub new {
13 1     1 1 408 my $invocant = shift;
14 1         3 my %args = @_;
15              
16 1   33     12 my $class = ref $invocant || $invocant;
17 1         10 my Algorithm::MarkovChain $self = $class->SUPER::new(@_);
18              
19 1         3 $self->{chains} = {};
20 1         2 $self->{totals} = {};
21 1 50       4 if ($args{chains}) {
22 0 0       0 croak "can't use non-hashref as storage"
23             unless ref $args{chains} eq 'HASH';
24              
25 0         0 $self->{chains} = $args{chains};
26             }
27              
28 1         3 return $self;
29             }
30              
31              
32             sub increment_seen {
33 1     1 1 2 my Algorithm::MarkovChain $self = shift;
34 1         1 my ($sequence, $symbol) = @_;
35              
36 1         3 $self->{totals}{$sequence}++;
37 1         7 $self->{chains}{$sequence}{$symbol}++;
38             }
39              
40              
41             sub get_options {
42 2     2 1 6 my Algorithm::MarkovChain $self = shift;
43 2         3 my ($sequence) = @_;
44              
45 2         41 my %res = map {
46 2         13 $_ => $self->{chains}{$sequence}{$_} / $self->{totals}{$sequence}
47 2         1145 } keys %{ $self->{chains}{$sequence} };
48              
49 2         17 return %res;
50             }
51              
52              
53             sub longest_sequence {
54 2     2 0 4 my Algorithm::MarkovChain $self = shift;
55              
56 2         4 local $; = $self->{seperator};
57              
58 2         3 my $l = 0;
59 2         2 for (keys %{ $self->{chains} }) {
  2         7  
60 2         26 my @tmp = split $;, $_;
61 2         3 my $length = scalar @tmp;
62 2 50       10 $l = $length if $length > $l;
63             }
64 2         11 return $l;
65             }
66              
67              
68             sub sequence_known {
69 4     4 0 5 my Algorithm::MarkovChain $self = shift;
70 4         7 my ($sequence) = @_;
71              
72 4         26 return $self->{chains}{$sequence};
73             }
74              
75              
76             sub random_sequence {
77 1     1 0 2 my Algorithm::MarkovChain $self = shift;
78              
79 1         2 my @h = keys %{ $self->{chains} };
  1         3  
80 1         55 return $h[ rand @h ];
81             }
82              
83              
84             1;
85             __END__