use strict;
use warnings;
use AI::MXNet qw(mx);
# specify which context we want this dataflow to be executed in
# for CPU use mx->cpu(0); (note, (0) does not mean cpuid or something, it is not used)
# for GPU use mx->gpu(0); (0 denotes gpu device id)
my $ctx = mx->cpu(0);
# create 1D arrays with values: 1, 2, 3, 4 for a b c d respectively
# these are DATA
my $a_data = mx->nd->array([1], ctx => $ctx);
my $b_data = mx->nd->array([2], ctx => $ctx);
my $c_data = mx->nd->array([3], ctx => $ctx);
my $d_data = mx->nd->array([4], ctx => $ctx);
# these are SYMBOLS
my $a = mx->symbol->Variable('A');
my $b = mx->symbol->Variable('B');
my $c = mx->symbol->Variable('C');
my $d = mx->symbol->Variable('D');
# these is the EXPRESSION to evaluate
# basically our dataflow graph (but still no data on it, just description)
my $e = ($a*$b) + ($c*$d);
print "e=".$e."\n";
# this is how we associate data with symbols and specify
# whether we want to run this on CPU or GPU
my $exe = $e->bind(
ctx => $ctx,
# this is how we bind data to symbols so our dataflow graph can be "executed"
# and a result comes out
# Note: create the arrays on the same device as executing them, i.e. context, ctx,
# must be the same here and above in creating the arrays.
args => {'A'=>$a_data, 'B'=>$b_data, 'C'=>$c_data, 'D'=>$d_data}
);
# propage inputs to the output(s)
$exe->forward(1);
# we need the first (and only one at this case) output as PDL array
print "output: ".$exe->outputs->[0]->aspdl."\n";
####
# 2d array data, initialised to these rows (edit: updated to specify ctx too)
my $a_data = mx->nd->array([[1,2],[3,4]], ctx => $ctx);
my $b_data = mx->nd->array([[5,6],[7,8]], ctx => $ctx);
my $c_data = mx->nd->array([[9,10],[11,12]], ctx => $ctx);
my $d_data = mx->nd->array([[13,14],[15,16]], ctx => $ctx);
##
##
[
[286 308]
[366 396]
]