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 )