This is an automated email from the ASF dual-hosted git repository.

sergeykolychev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-mxnet.git


The following commit(s) were added to refs/heads/master by this push:
     new 658bad6  MXNET-295 [Perl] Added support for linalg operators. (#10460)
658bad6 is described below

commit 658bad6521c0c32738908abd57b99cc265605b4d
Author: Sergey Kolychev <sergeykolychev.git...@gmail.com>
AuthorDate: Sun Apr 8 17:33:04 2018 -0700

    MXNET-295 [Perl] Added support for linalg operators. (#10460)
---
 docs/api/perl/index.md                             |  3 ++-
 perl-package/AI-MXNet/Changes                      |  3 +++
 perl-package/AI-MXNet/MANIFEST                     |  3 +++
 perl-package/AI-MXNet/META.json                    |  2 +-
 perl-package/AI-MXNet/META.yml                     |  2 +-
 perl-package/AI-MXNet/Makefile.PL                  |  2 +-
 perl-package/AI-MXNet/README                       |  2 +-
 perl-package/AI-MXNet/lib/AI/MXNet.pm              |  5 +++-
 perl-package/AI-MXNet/lib/AI/MXNet/Contrib.pm      |  1 +
 .../AI-MXNet/lib/AI/MXNet/Gluon/NN/BasicLayers.pm  |  4 +--
 .../AI-MXNet/lib/AI/MXNet/Gluon/NN/ConvLayers.pm   |  2 ++
 .../AI-MXNet/lib/AI/MXNet/Gluon/Parameter.pm       |  2 +-
 .../lib/AI/MXNet/{Contrib.pm => LinAlg.pm}         | 13 ++++-----
 .../lib/AI/MXNet/{Contrib.pm => LinAlg/NDArray.pm} | 14 +++++-----
 .../lib/AI/MXNet/{Contrib.pm => LinAlg/Symbol.pm}  | 14 +++++-----
 perl-package/AI-MXNet/lib/AI/MXNet/NDArray.pm      |  1 +
 perl-package/AI-MXNet/lib/AI/MXNet/Symbol.pm       |  1 +
 perl-package/AI-MXNet/lib/AI/MXNet/TestUtils.pm    |  2 +-
 perl-package/AI-MXNet/t/test_ndarray.t             | 25 +++++++++++++++--
 perl-package/AI-MXNet/t/test_symbol.t              | 31 ++++++++++++++++++++--
 20 files changed, 100 insertions(+), 32 deletions(-)

diff --git a/docs/api/perl/index.md b/docs/api/perl/index.md
index 1669d22..6408b52 100644
--- a/docs/api/perl/index.md
+++ b/docs/api/perl/index.md
@@ -60,10 +60,11 @@ pdl> print mx->nd->array(sequence(2,3))->aspdl ## 3 rows, 2 
columns
  [2 3]
  [4 5]
 ]
+```
 
 Export/import to/from sparse MXNet tensors are supported via 
[PDL::CCS](https://metacpan.org/release/PDL-CCS).
 Please check out the examples directory for the examples on how to use the 
sparse matrices.
-```
+
  ## Perl API Reference
  * [Module API is a flexible high-level interface for training neural 
networks.](module.md)
  * [Symbolic API performs operations on NDArrays to assemble neural networks 
from layers.](symbol.md)
diff --git a/perl-package/AI-MXNet/Changes b/perl-package/AI-MXNet/Changes
index ddf6b3a..4234ea5 100644
--- a/perl-package/AI-MXNet/Changes
+++ b/perl-package/AI-MXNet/Changes
@@ -1,5 +1,8 @@
 Revision history for Perl extension AI::MXNet
 
+1.21    Sun Apr  8 12:08:44 PDT 2018
+        - Support for linear algebra operations on symbols and ndarrays.
+
 1.2     Sun Mar  4 16:29:19 PST 2018
         - Support for sparse tensors
 
diff --git a/perl-package/AI-MXNet/MANIFEST b/perl-package/AI-MXNet/MANIFEST
index 690df1e..09e8305 100644
--- a/perl-package/AI-MXNet/MANIFEST
+++ b/perl-package/AI-MXNet/MANIFEST
@@ -50,6 +50,9 @@ lib/AI/MXNet/Initializer.pm
 lib/AI/MXNet/IO.pm
 lib/AI/MXNet/KVStore.pm
 lib/AI/MXNet/KVStoreServer.pm
+lib/AI/MXNet/LinAlg.pm
+lib/AI/MXNet/LinAlg/NDArray.pm
+lib/AI/MXNet/LinAlg/Symbol.pm
 lib/AI/MXNet/Logging.pm
 lib/AI/MXNet/LRScheduler.pm
 lib/AI/MXNet/Metric.pm
diff --git a/perl-package/AI-MXNet/META.json b/perl-package/AI-MXNet/META.json
index a37d407..d6987cb 100644
--- a/perl-package/AI-MXNet/META.json
+++ b/perl-package/AI-MXNet/META.json
@@ -45,5 +45,5 @@
       }
    },
    "release_status" : "stable",
-   "version" : "1.2"
+   "version" : "1.21"
 }
diff --git a/perl-package/AI-MXNet/META.yml b/perl-package/AI-MXNet/META.yml
index 8505cef..30192de 100644
--- a/perl-package/AI-MXNet/META.yml
+++ b/perl-package/AI-MXNet/META.yml
@@ -25,4 +25,4 @@ requires:
   Mouse: v2.1.0
   PDL: '2.007'
   PDL::CCS: '1.23.4'
-version: '1.2'
+version: '1.21'
diff --git a/perl-package/AI-MXNet/Makefile.PL 
b/perl-package/AI-MXNet/Makefile.PL
index 731b693..63e0391 100644
--- a/perl-package/AI-MXNet/Makefile.PL
+++ b/perl-package/AI-MXNet/Makefile.PL
@@ -46,7 +46,7 @@ my %WriteMakefileArgs = (
     "GraphViz" => "2.14"
   },
   "TEST_REQUIRES" => {},
-  "VERSION" => "1.2",
+  "VERSION" => "1.21",
   "test" => {
     "TESTS" => "t/*.t"
   }
diff --git a/perl-package/AI-MXNet/README b/perl-package/AI-MXNet/README
index 59d1dd0..ff757c1 100644
--- a/perl-package/AI-MXNet/README
+++ b/perl-package/AI-MXNet/README
@@ -1,5 +1,5 @@
 This archive contains the distribution AI-MXNet,
-version 1.2:
+version 1.21:
 
   Perl interface to MXNet machine learning library
 
diff --git a/perl-package/AI-MXNet/lib/AI/MXNet.pm 
b/perl-package/AI-MXNet/lib/AI/MXNet.pm
index 87d0b6d..c7322a9 100644
--- a/perl-package/AI-MXNet/lib/AI/MXNet.pm
+++ b/perl-package/AI-MXNet/lib/AI/MXNet.pm
@@ -44,12 +44,13 @@ use AI::MXNet::Visualization;
 use AI::MXNet::RecordIO;
 use AI::MXNet::Image;
 use AI::MXNet::Contrib;
+use AI::MXNet::LinAlg;
 use AI::MXNet::CachedOp;
 use AI::MXNet::AutoGrad;
 use AI::MXNet::Gluon;
 use AI::MXNet::NDArray::Sparse;
 use AI::MXNet::Symbol::Sparse;
-our $VERSION = '1.2';
+our $VERSION = '1.21';
 
 sub import
 {
@@ -63,6 +64,7 @@ sub import
             package $short_name;
             no warnings 'redefine';
             sub nd { 'AI::MXNet::NDArray' }
+            sub ndarray { 'AI::MXNet::NDArray' }
             sub sym { 'AI::MXNet::Symbol' }
             sub symbol { 'AI::MXNet::Symbol' }
             sub init { 'AI::MXNet::Initializer' }
@@ -88,6 +90,7 @@ sub import
             sub img { 'AI::MXNet::Image' }
             sub image { 'AI::MXNet::Image' }
             sub contrib { 'AI::MXNet::Contrib' }
+            sub linalg { 'AI::MXNet::LinAlg' }
             sub autograd { 'AI::MXNet::AutoGrad' }
             sub name { '$short_name' }
             sub rtc { '$short_name' }
diff --git a/perl-package/AI-MXNet/lib/AI/MXNet/Contrib.pm 
b/perl-package/AI-MXNet/lib/AI/MXNet/Contrib.pm
index 2a6e18e..9f6a0ab 100644
--- a/perl-package/AI-MXNet/lib/AI/MXNet/Contrib.pm
+++ b/perl-package/AI-MXNet/lib/AI/MXNet/Contrib.pm
@@ -24,5 +24,6 @@ use AI::MXNet::Contrib::NDArray;
 sub sym    { 'AI::MXNet::Contrib::Symbol'  }
 sub symbol { 'AI::MXNet::Contrib::Symbol'  }
 sub nd     { 'AI::MXNet::Contrib::NDArray' }
+sub ndarray { 'AI::MXNet::Contrib::NDArray' }
 
 1;
diff --git a/perl-package/AI-MXNet/lib/AI/MXNet/Gluon/NN/BasicLayers.pm 
b/perl-package/AI-MXNet/lib/AI/MXNet/Gluon/NN/BasicLayers.pm
index 6d85c9a..6ef4714 100644
--- a/perl-package/AI-MXNet/lib/AI/MXNet/Gluon/NN/BasicLayers.pm
+++ b/perl-package/AI-MXNet/lib/AI/MXNet/Gluon/NN/BasicLayers.pm
@@ -42,7 +42,7 @@ use AI::MXNet::Function::Parameters;
 use AI::MXNet::Gluon::Mouse;
 extends 'AI::MXNet::Gluon::Block';
 
-=head
+=head2
 
     Adds block on top of the stack.
 =cut
@@ -104,7 +104,7 @@ package AI::MXNet::Gluon::NN::HybridSequential;
 use AI::MXNet::Gluon::Mouse;
 extends 'AI::MXNet::Gluon::HybridBlock';
 
-=head
+=head2
 
     Adds block on top of the stack.
 =cut
diff --git a/perl-package/AI-MXNet/lib/AI/MXNet/Gluon/NN/ConvLayers.pm 
b/perl-package/AI-MXNet/lib/AI/MXNet/Gluon/NN/ConvLayers.pm
index f56f8f5..502f522 100644
--- a/perl-package/AI-MXNet/lib/AI/MXNet/Gluon/NN/ConvLayers.pm
+++ b/perl-package/AI-MXNet/lib/AI/MXNet/Gluon/NN/ConvLayers.pm
@@ -15,6 +15,8 @@
 # specific language governing permissions and limitations
 # under the License.
 
+use strict;
+use warnings;
 package AI::MXNet::Gluon::NN::Conv;
 use AI::MXNet::Function::Parameters;
 use AI::MXNet::Symbol;
diff --git a/perl-package/AI-MXNet/lib/AI/MXNet/Gluon/Parameter.pm 
b/perl-package/AI-MXNet/lib/AI/MXNet/Gluon/Parameter.pm
index d241aa1..131a6ab 100644
--- a/perl-package/AI-MXNet/lib/AI/MXNet/Gluon/Parameter.pm
+++ b/perl-package/AI-MXNet/lib/AI/MXNet/Gluon/Parameter.pm
@@ -665,7 +665,7 @@ method _get_impl($name)
     return undef;
 }
 
-=head get
+=head2 get
 
         Retrieves a 'AI::MXNet::Gluon::Parameter' with name 
'$self->prefix.$name'. If not found,
         'get' will first try to retrieve it from 'shared' dict. If still not
diff --git a/perl-package/AI-MXNet/lib/AI/MXNet/Contrib.pm 
b/perl-package/AI-MXNet/lib/AI/MXNet/LinAlg.pm
similarity index 75%
copy from perl-package/AI-MXNet/lib/AI/MXNet/Contrib.pm
copy to perl-package/AI-MXNet/lib/AI/MXNet/LinAlg.pm
index 2a6e18e..9290e68 100644
--- a/perl-package/AI-MXNet/lib/AI/MXNet/Contrib.pm
+++ b/perl-package/AI-MXNet/lib/AI/MXNet/LinAlg.pm
@@ -15,14 +15,15 @@
 # specific language governing permissions and limitations
 # under the License.
 
-package AI::MXNet::Contrib;
+package AI::MXNet::LinAlg;
 use strict;
 use warnings;
-use AI::MXNet::Contrib::Symbol;
-use AI::MXNet::Contrib::NDArray;
+use AI::MXNet::LinAlg::Symbol;
+use AI::MXNet::LinAlg::NDArray;
 
-sub sym    { 'AI::MXNet::Contrib::Symbol'  }
-sub symbol { 'AI::MXNet::Contrib::Symbol'  }
-sub nd     { 'AI::MXNet::Contrib::NDArray' }
+sub sym    { 'AI::MXNet::LinAlg::Symbol'  }
+sub symbol { 'AI::MXNet::LinAlg::Symbol'  }
+sub nd     { 'AI::MXNet::LinAlg::NDArray' }
+sub ndarray { 'AI::MXNet::LinAlg::NDArray' }
 
 1;
diff --git a/perl-package/AI-MXNet/lib/AI/MXNet/Contrib.pm 
b/perl-package/AI-MXNet/lib/AI/MXNet/LinAlg/NDArray.pm
similarity index 78%
copy from perl-package/AI-MXNet/lib/AI/MXNet/Contrib.pm
copy to perl-package/AI-MXNet/lib/AI/MXNet/LinAlg/NDArray.pm
index 2a6e18e..0cc7f7f 100644
--- a/perl-package/AI-MXNet/lib/AI/MXNet/Contrib.pm
+++ b/perl-package/AI-MXNet/lib/AI/MXNet/LinAlg/NDArray.pm
@@ -15,14 +15,16 @@
 # specific language governing permissions and limitations
 # under the License.
 
-package AI::MXNet::Contrib;
+package AI::MXNet::LinAlg::NDArray;
 use strict;
 use warnings;
-use AI::MXNet::Contrib::Symbol;
-use AI::MXNet::Contrib::NDArray;
 
-sub sym    { 'AI::MXNet::Contrib::Symbol'  }
-sub symbol { 'AI::MXNet::Contrib::Symbol'  }
-sub nd     { 'AI::MXNet::Contrib::NDArray' }
+sub AUTOLOAD {
+    my $sub = $AI::MXNet::LinAlg::NDArray::AUTOLOAD;
+    $sub =~ s/.*:://;
+    $sub = "_linalg_$sub";
+    shift;
+    return AI::MXNet::NDArray->$sub(@_);
+}
 
 1;
diff --git a/perl-package/AI-MXNet/lib/AI/MXNet/Contrib.pm 
b/perl-package/AI-MXNet/lib/AI/MXNet/LinAlg/Symbol.pm
similarity index 78%
copy from perl-package/AI-MXNet/lib/AI/MXNet/Contrib.pm
copy to perl-package/AI-MXNet/lib/AI/MXNet/LinAlg/Symbol.pm
index 2a6e18e..377f393 100644
--- a/perl-package/AI-MXNet/lib/AI/MXNet/Contrib.pm
+++ b/perl-package/AI-MXNet/lib/AI/MXNet/LinAlg/Symbol.pm
@@ -15,14 +15,16 @@
 # specific language governing permissions and limitations
 # under the License.
 
-package AI::MXNet::Contrib;
+package AI::MXNet::LinAlg::Symbol;
 use strict;
 use warnings;
-use AI::MXNet::Contrib::Symbol;
-use AI::MXNet::Contrib::NDArray;
 
-sub sym    { 'AI::MXNet::Contrib::Symbol'  }
-sub symbol { 'AI::MXNet::Contrib::Symbol'  }
-sub nd     { 'AI::MXNet::Contrib::NDArray' }
+sub AUTOLOAD {
+    my $sub = $AI::MXNet::LinAlg::Symbol::AUTOLOAD;
+    $sub =~ s/.*:://;
+    $sub = "_linalg_$sub";
+    shift;
+    return AI::MXNet::Symbol->$sub(@_);
+}
 
 1;
diff --git a/perl-package/AI-MXNet/lib/AI/MXNet/NDArray.pm 
b/perl-package/AI-MXNet/lib/AI/MXNet/NDArray.pm
index 62e64d2..d5c874b 100644
--- a/perl-package/AI-MXNet/lib/AI/MXNet/NDArray.pm
+++ b/perl-package/AI-MXNet/lib/AI/MXNet/NDArray.pm
@@ -1599,5 +1599,6 @@ EOV
 sub contrib { 'AI::MXNet::Contrib::NDArray' }
 sub random  { 'AI::MXNet::Random' }
 sub sparse  { 'AI::MXNet::NDArray::Sparse' }
+sub linalg  { 'AI::MXNet::LinAlg::NDArray' }
 
 __PACKAGE__->meta->make_immutable;
diff --git a/perl-package/AI-MXNet/lib/AI/MXNet/Symbol.pm 
b/perl-package/AI-MXNet/lib/AI/MXNet/Symbol.pm
index 299aed7..61bf2cb 100644
--- a/perl-package/AI-MXNet/lib/AI/MXNet/Symbol.pm
+++ b/perl-package/AI-MXNet/lib/AI/MXNet/Symbol.pm
@@ -1498,5 +1498,6 @@ sub  _ufunc_helper
 sub contrib { 'AI::MXNet::Contrib::Symbol' }
 sub random  { 'AI::MXNet::Symbol::Random' }
 sub sparse  { 'AI::MXNet::Symbol::Sparse' }
+sub linalg  { 'AI::MXNet::LinAlg::Symbol' }
 
 1;
diff --git a/perl-package/AI-MXNet/lib/AI/MXNet/TestUtils.pm 
b/perl-package/AI-MXNet/lib/AI/MXNet/TestUtils.pm
index 37ef5b6..c04b79c 100644
--- a/perl-package/AI-MXNet/lib/AI/MXNet/TestUtils.pm
+++ b/perl-package/AI-MXNet/lib/AI/MXNet/TestUtils.pm
@@ -29,7 +29,7 @@ use base qw(Exporter);
 @AI::MXNet::TestUtils::EXPORT_OK = qw(same reldiff almost_equal GetMNIST_ubyte
                                       GetCifar10 pdl_maximum pdl_minimum mlp2 
conv dies_ok
                                       check_consistency zip assert enumerate 
same_array dies_like allclose rand_shape_2d
-                                      rand_shape_3d rand_sparse_ndarray 
random_arrays rand_ndarray randint);
+                                      rand_shape_3d rand_sparse_ndarray 
random_arrays rand_ndarray randint pdl);
 use constant default_numerical_threshold => 1e-6;
 =head1 NAME
 
diff --git a/perl-package/AI-MXNet/t/test_ndarray.t 
b/perl-package/AI-MXNet/t/test_ndarray.t
index a3d7b6e..4e394f5 100644
--- a/perl-package/AI-MXNet/t/test_ndarray.t
+++ b/perl-package/AI-MXNet/t/test_ndarray.t
@@ -18,8 +18,8 @@
 use strict;
 use warnings;
 use AI::MXNet qw(mx);
-use AI::MXNet::TestUtils qw(almost_equal same);
-use Test::More tests => 17;
+use AI::MXNet::TestUtils qw(almost_equal same pdl);
+use Test::More tests => 19;
 
 sub test_ndarray_reshape
 {
@@ -139,8 +139,29 @@ sub test_ndarray_slice
     ok(($a->slice([mx->nd->array([1, 1, 0]), mx->nd->array([0, 1, 0])])->aspdl 
== mx->nd->array([2, 3, 0])->aspdl)->all);
 }
 
+sub test_linalg_gemm2
+{
+    # Single matrix multiply
+    my $A = mx->nd->array([[1.0, 1.0], [1.0, 1.0]]);
+    my $B = mx->nd->array([[1.0, 1.0], [1.0, 1.0], [1.0, 1.0]]);
+    ok(almost_equal(
+        mx->nd->linalg->gemm2($A, $B, transpose_b=>1, alpha=>2.0)->aspdl,
+        pdl([[4.0, 4.0, 4.0], [4.0, 4.0, 4.0]])
+    ));
+
+    # Batch matrix multiply
+    $A = mx->nd->array([[[1.0, 1.0]], [[0.1, 0.1]]]);
+    $B = mx->nd->array([[[1.0, 1.0]], [[0.1, 0.1]]]);
+    ok(almost_equal(
+        mx->nd->linalg->gemm2($A, $B, transpose_b=>1, alpha=>2.0)->aspdl,
+        pdl([[[4.0]], [[0.04]]])
+    ));
+}
+
 test_ndarray_slice();
 test_ndarray_reshape();
 test_moveaxis();
 test_output();
 test_cached();
+test_linalg_gemm2();
+
diff --git a/perl-package/AI-MXNet/t/test_symbol.t 
b/perl-package/AI-MXNet/t/test_symbol.t
index 0788241..db010e8 100644
--- a/perl-package/AI-MXNet/t/test_symbol.t
+++ b/perl-package/AI-MXNet/t/test_symbol.t
@@ -17,9 +17,9 @@
 
 use strict;
 use warnings;
-use Test::More tests => 98;
+use Test::More tests => 100;
 use AI::MXNet qw(mx);
-use AI::MXNet::TestUtils qw(mlp2 conv check_consistency zip assert enumerate);
+use AI::MXNet::TestUtils qw(mlp2 conv check_consistency zip assert enumerate 
almost_equal);
 use Storable qw(freeze thaw);
 use PDL;
 
@@ -238,6 +238,33 @@ sub test_load_000800
 
 test_load_000800();
 
+sub test_linalg_gemm2
+{
+    # Single matrix multiply
+    my $sym_gemm2 = mx->sym->linalg->gemm2(
+        mx->sym->var('A'),
+        mx->sym->var('B'),
+        transpose_b => 1,
+        alpha => 2.0
+    );
+    my $A = mx->nd->array([[1.0, 1.0], [1.0, 1.0]]);
+    my $B = mx->nd->array([[1.0, 1.0], [1.0, 1.0], [1.0, 1.0]]);
+    ok(almost_equal(
+        $sym_gemm2->eval(args => { A => $A, B => $B })->[0]->aspdl,
+        pdl([[4.0, 4.0, 4.0], [4.0, 4.0, 4.0]])
+    ));
+
+    # Batch matrix multiply
+    $A = mx->nd->array([[[1.0, 1.0]], [[0.1, 0.1]]]);
+    $B = mx->nd->array([[[1.0, 1.0]], [[0.1, 0.1]]]);
+    ok(almost_equal(
+        $sym_gemm2->eval(args => { A => $A, B => $B })->[0]->aspdl,
+        pdl([[[4.0]], [[0.04]]])
+    ));
+}
+
+test_linalg_gemm2();
+
 __DATA__
 {
   "nodes": [

-- 
To stop receiving notification emails like this one, please contact
sergeykolyc...@apache.org.

Reply via email to