class Foo {
## Object initializer:
sub Foo (%args) {
$this->{bar} = $arg{baz} ;
}
## a Perl function:
sub bar($x , $y) {
$this->add($x , $y) ;
}
## a C function that will be turned into XS:
sub[C] int add( int x , int y ) {
int res = x + y ;
return res ;
}
}
####
AI::NNEasy::NN::tanh
AI::NNEasy::NN::feedforward::run
AI::NNEasy::NN::backprop::hiddenToOutput
AI::NNEasy::NN::backprop::hiddenOrInputToHidden
##
##
class AI::NNEasy::NN[0.01] {
...
*tanh = \&tanh_c ;
sub tanh_pl ($value) {
if ($value > 20) { return 1 ;}
elsif ($value < -20) { return -1 ;}
else {
my $x = exp($value) ;
my $y = exp(-$value) ;
return ($x-$y)/($x+$y) ;
}
}
sub[C] double tanh_c ( SV* self , double value ) {
if ( value > 20 ) { return 1 ;}
else if ( value < -20 ) { return -1 ;}
else {
double x = Perl_exp(value) ;
double y = Perl_exp(-value) ;
double ret = (x-y)/(x+y) ;
return ret ;
}
}
...
}
##
##
use AI::NNEasy ;
my $nn = AI::NNEasy->new(
'xor.nne' , ## file to save the NN.
[0,1] , ## Output types of the NN.
0.1 , ## Maximal error for output.
2 , ## Number of inputs.
1 , ## Number of outputs.
) ;
## Our set of inputs and outputs to learn:
my @set = (
[0,0] => [0],
[0,1] => [1],
[1,0] => [1],
[1,1] => [0],
);
## learn the inputs:
$nn->learn_set( \@set ) ;
## Save the NN:
$nn->save ;
## Use the NN:
my $out = $nn->run_get_winner([0,0]) ;
print "0 0 => @$out\n" ; ## 0 0 => 0
my $out = $nn->run_get_winner([0,1]) ;
print "0 1 => @$out\n" ; ## 0 1 => 1