AI-ANN
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/AI/ANN.pm view on Meta::CPAN
#!/usr/bin/perl
package AI::ANN;
BEGIN {
$AI::ANN::VERSION = '0.008';
}
use strict;
use warnings;
# ABSTRACT: an artificial neural network simulator
use Moose;
use AI::ANN::Neuron;
use Storable qw(dclone);
has 'input_count' => (is => 'ro', isa => 'Int', required => 1);
has 'outputneurons' => (is => 'ro', isa => 'ArrayRef[Int]', required => 1);
has 'network' => (is => 'ro', isa => 'ArrayRef[HashRef]', required => 1);
# network is an arrayref of hashrefs. Each hashref is:
# object => AI::ANN::Neuron
# and has several other elements
has 'inputs' => (is => 'ro', isa => 'ArrayRef[Int]');
has 'rawpotentials' => (is => 'ro', isa => 'ArrayRef[Int]');
has 'minvalue' => (is => 'rw', isa => 'Int', default => 0);
has 'maxvalue' => (is => 'rw', isa => 'Int', default => 1);
has 'afunc' => (is => 'rw', isa => 'CodeRef', default => sub {sub {shift}});
has 'dafunc' => (is => 'rw', isa => 'CodeRef', default => sub {sub {1}});
has 'backprop_eta' => (is => 'rw', isa => 'Num', default => 0.1);
around BUILDARGS => sub {
my $orig = shift;
my $class = shift;
my %data;
if ( @_ == 1 && ref $_[0] eq 'HASH' ) {
%data = %{$_[0]};
} else {
%data = @_;
}
if (exists $data{'inputs'} && not exists $data{'input_count'}) {
$data{'input_count'} = $data{'inputs'};
delete $data{'inputs'}; # inputs is used later for the actual
# values of the inputs.
}
my $neuronlist = $data{'data'};
$data{'outputneurons'} = [];
$data{'network'} = [];
for (my $i = 0; $i <= $#{$neuronlist} ; $i++) {
push @{$data{'outputneurons'}}, $i
if $neuronlist->[$i]->{'iamanoutput'};
my @pass = (
$i,
$neuronlist->[$i]->{'inputs'},
$neuronlist->[$i]->{'neurons'} );
push @pass, $neuronlist->[$i]->{'eta_inputs'},
$neuronlist->[$i]->{'eta_neurons'}
if defined $neuronlist->[$i]->{'eta_neurons'};
$data{'network'}->[$i]->{'object'} =
new AI::ANN::Neuron( @pass );
}
delete $data{'data'};
return $class->$orig(%data);
};
sub execute {
my $self = shift;
my $inputs = $self->{'inputs'} = shift;
# Don't bother dereferencing $inputs only to rereference a lot
my $net = $self->{'network'}; # For less typing
my $lastneuron = $#{$net};
my @neurons = ();
foreach my $i (0..$lastneuron) {
$neurons[$i] = 0;
}
foreach my $i (0..$lastneuron) {
delete $net->[$i]->{'done'};
delete $net->[$i]->{'state'};
}
my $progress = 0;
do {
$progress = 0;
foreach my $i (0..$lastneuron) {
if ($net->[$i]->{'done'}) {next}
view all matches for this distributionview release on metacpan - search on metacpan
( run in 1.725 second using v1.00-cache-2.02-grep-82fe00e-cpan-72ae3ad1e6da )