AI-MXNet
view release on metacpan or search on metacpan
t/test_random.t view on Meta::CPAN
use strict;
use warnings;
use Test::More tests => 8;
use AI::MXNet qw(mx);
use AI::MXNet::TestUtils qw(same);
sub check_with_device
{
my ($device) = @_;
my ($a, $b) = (-10, 10);
my ($mu, $sigma) = (10, 2);
my $shape = [100, 100];
mx->random->seed(128);
my $ret1 = mx->random->normal($mu, $sigma, $shape, { ctx => $device });
my $un1 = mx->random->uniform($a, $b, $shape, { ctx => $device });
mx->random->seed(128);
my $ret2 = mx->random->normal($mu, $sigma, $shape, { ctx => $device });
my $un2 = mx->random->uniform($a, $b, $shape, { ctx => $device });
ok(same($ret1->aspdl, $ret2->aspdl));
ok(same($un1->aspdl, $un2->aspdl));
ok(abs($ret1->aspdl->avg - $mu) < 0.1);
ok(abs(($ret1->aspdl->stats)[6] - $sigma) < 0.1);
ok(abs($un1->aspdl->avg - ($a+$b)/2) < 0.1);
}
sub check_symbolic_random
{
my ($dev) = @_;
my ($a, $b) = (-10, 10);
my ($mu, $sigma) = (10, 2);
my $shape = [100, 100];
my $X = mx->sym->Variable("X");
my $Y = mx->sym->uniform(low=>$a, high=>$b, shape=>$shape) + $X;
my $x = mx->nd->zeros($shape, ctx=>$dev);
my $xgrad = mx->nd->zeros($shape, ctx=>$dev);
my $yexec = $Y->bind(ctx => $dev, args => {X => $x}, args_grad => {X => $xgrad});
mx->random->seed(128);
$yexec->forward(1);
$yexec->backward($yexec->outputs->[0]);
my $un1 = ($yexec->outputs->[0] - $x)->copyto($dev);
ok(same($xgrad->aspdl, $un1->aspdl));
mx->random->seed(128);
$yexec->forward;
my $un2 = ($yexec->outputs->[0] - $x)->copyto($dev);
ok(same($un1->aspdl, $un2->aspdl));
ok(abs($un1->aspdl->avg - ($a+$b)/2) < 0.1);
}
sub test_random
{
check_with_device(mx->cpu);
check_symbolic_random(mx->cpu);
}
test_random();
( run in 0.475 second using v1.01-cache-2.11-cpan-39bf76dae61 )