NAME
Math::StochasticProcess::Event - Base class for events.
VERSION
Version 0.04
SYNOPSIS
One uses this module by deriving from it and defining the virtual functions listed below. For example see Math::StochasticProcess::Tuple.
FUNCTIONS
new
Uneventful constructor for Event class. The Event instance so created must have probability() == 1. The set of all possible Events constitutes the probability space.
probability
The probability of having arrived at this event. Must return a number between 0 and 1 inclusive.
isResolved
A boolean. If 1 it means that this is a terminal event, and further iterations of this event are not required.
iterate
This is the key function. It must return a list of new Event objects, that are the possible iterands of the current event. The current Event object should not be modified. Obviously the probabilities must add up to the probability of the parent event.
randomVariable
This function must be overridden if you wish to use randomVariables as well as probabilities. If only the object argument is presented, it must return a hash keyed by all the random variable names in play, with their current values as the hash value. If given an argument it must return the current value of the so named random variable.
signature
A string that uniquely identifies the event. This is used to merge up events that have been arrived at by different routes.
merge
This method merges the second Event into the object. It is a requirement that the two Events have identical signatures. The probability of the combined Event should equal the sum of the two original Events.
debug
A string that provides full debug information.
EXAMPLE
Suppose you roll a six-sided die and keep a running total of the results. You stop rolling when the running total reaches a predetermined goal. What is the expected number of times that you roll the die, and what is the probability distribution?
#!/usr/bin/perl -w
use strict;
use warnings;
use Math::StochasticProcess;
use Math::StochasticProcess::Event;
use FileHandle;
my $goal = $ARGV[0];
my $seed_event = Math::StochasticProcess::Event::d6->new($goal);
my $logfh = undef;
my $analysis = undef;
if (defined($ARGV[1])) {
$logfh = FileHandle->new;
open($logfh, ">$ARGV[1].log") or croak "could not open log file";
$analysis = Math::StochasticProcess->new
(
seed_event=>$seed_event,
tolerance=>0.0000000000000001,
hard_sanity_level=>0.0000001,
log_file_handle=>$logfh
);
}
else {
$analysis = Math::StochasticProcess->new
(
seed_event=>$seed_event,
tolerance=>0.0000000000000001,
hard_sanity_level=>0.0000001
);
}
$analysis->run();
my %event = $analysis->event();
my $expectedValue = $analysis->expectedValue('rounds');
print "Goal: $goal\n";
print "Expected number of rounds: $expectedValue\n";
my @keys = sort {(split(/\|/,$a))[0] <=> (split(/\|/,$b))[0]} keys %event;
foreach my $d (@keys) {
my $rounds = $event{$d}->randomVariable('rounds');
my $probability = $event{$d}->probability();
print "Rounds: $rounds; Probability: $probability\n";
}
exit(0);
package Math::StochasticProcess::Event::d6;
use base qw(Math::StochasticProcess::Event);
sub new {
my $class = shift;
my $self = Math::StochasticProcess::Event->new();
$self->{d6_goal} = shift;
$self->{d6_probability} = 1.0;
$self->{d6_value} = 0;
$self->{d6_rounds} = 0;
bless $self, $class;
return $self;
}
sub probability {
my $self = shift;
return $self->{d6_probability};
}
sub signature {
my $self = shift;
if ($self->isResolved()) {
return "$self->{d6_rounds}|T";
}
return "$self->{d6_rounds}|$self->{d6_value}";
}
sub iterate {
my $self = shift;
my @new_events;
for(my $i =1; $i <= 6; $i++) {
my $e = Math::StochasticProcess::Event->new();
$e->{d6_probability} = $self->{d6_probability}/6;
$e->{d6_value} = $self->{d6_value}+$i;
$e->{d6_rounds} = $self->{d6_rounds}+1;
$e->{d6_goal} = $self->{d6_goal};
bless $e, ref($self);
push @new_events, $e;
}
return @new_events;
}
sub isResolved {
my $self = shift;
return $self->{d6_value} >= $self->{d6_goal} ? 1 : 0;
}
sub merge {
my $self = shift;
my $other = shift;
$self->{d6_probability} += $other->{d6_probability};
}
sub debug {
my $self = shift;
my $status = $self->isResolved();
return "Status: $status Round: $self->{d6_rounds}; \
Value: $self->{d6_value};\
Probability: $self->{d6_probability}\n";
}
sub randomVariable {
my $self = shift;
my %rv = (rounds=>$self->{d6_rounds});
if (scalar(@_) > 0) {
return $rv{$_[0]};
}
else {
return %rv;
}
}
1
AUTHOR
Nicholas Bamber, <theabbot at silasthemonk.org.uk>
BUGS
Please report any bugs or feature requests to bug-math-stochasticprocess-event at rt.cpan.org
, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Math-StochasticProcess. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.
SUPPORT
You can find documentation for this module with the perldoc command.
perldoc Math::StochasticProcess
You can also look for information at:
AnnoCPAN: Annotated CPAN documentation
CPAN Ratings
RT: CPAN's request tracker
http://rt.cpan.org/NoAuth/Bugs.html?Dist=Math-StochasticProcess
Search CPAN
ACKNOWLEDGEMENTS
COPYRIGHT & LICENSE
Copyright 2008 Nicholas Bamber, all rights reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.