Algorithm-MarkovChain
view release on metacpan or search on metacpan
lib/Algorithm/MarkovChain.pm view on Meta::CPAN
package Algorithm::MarkovChain;
use strict;
use warnings;
use Carp;
require v5.6;
our $VERSION = '0.06';
use base 'Algorithm::MarkovChain::Base';
use fields qw( chains totals );
sub new {
my $invocant = shift;
my %args = @_;
my $class = ref $invocant || $invocant;
my Algorithm::MarkovChain $self = $class->SUPER::new(@_);
$self->{chains} = {};
$self->{totals} = {};
if ($args{chains}) {
croak "can't use non-hashref as storage"
unless ref $args{chains} eq 'HASH';
$self->{chains} = $args{chains};
}
return $self;
}
sub increment_seen {
my Algorithm::MarkovChain $self = shift;
my ($sequence, $symbol) = @_;
$self->{totals}{$sequence}++;
$self->{chains}{$sequence}{$symbol}++;
}
sub get_options {
my Algorithm::MarkovChain $self = shift;
my ($sequence) = @_;
my %res = map {
$_ => $self->{chains}{$sequence}{$_} / $self->{totals}{$sequence}
} keys %{ $self->{chains}{$sequence} };
return %res;
}
sub longest_sequence {
my Algorithm::MarkovChain $self = shift;
local $; = $self->{seperator};
my $l = 0;
for (keys %{ $self->{chains} }) {
my @tmp = split $;, $_;
my $length = scalar @tmp;
$l = $length if $length > $l;
}
return $l;
}
sub sequence_known {
my Algorithm::MarkovChain $self = shift;
my ($sequence) = @_;
return $self->{chains}{$sequence};
}
sub random_sequence {
my Algorithm::MarkovChain $self = shift;
( run in 0.875 second using v1.01-cache-2.11-cpan-39bf76dae61 )