Skip to content
This repository has been archived by the owner on Nov 17, 2023. It is now read-only.

Commit

Permalink
[Perl] - simplify aliasing strategy
Browse files Browse the repository at this point in the history
 * alternate support for emulation of Python "import mxnet.someclass as sc"
   moving responsibility to the imported class instead of the importer.
 * simpler dispatch for constructor aliases to have fewer anonymous
   subroutines in stack traces on errors.
  • Loading branch information
tlby committed Jun 28, 2019
1 parent 7fe478a commit f933bd3
Show file tree
Hide file tree
Showing 44 changed files with 210 additions and 216 deletions.
116 changes: 31 additions & 85 deletions perl-package/AI-MXNet/lib/AI/MXNet.pm
Original file line number Diff line number Diff line change
Expand Up @@ -19,105 +19,51 @@ package AI::MXNet;
use v5.14.0;
use strict;
use warnings;
use AI::MXNet::NS 'global';
use AI::MXNet::Base;
use AI::MXNet::Callback;
use AI::MXNet::NDArray;
use AI::MXNet::Symbol;
use AI::MXNet::Callback 'callback';
use AI::MXNet::NDArray qw(nd ndarray);
use AI::MXNet::Context 'context';
use AI::MXNet::Symbol qw(sym symbol);
use AI::MXNet::Executor;
use AI::MXNet::Executor::Group;
use AI::MXNet::CudaModule;
use AI::MXNet::Random;
use AI::MXNet::Initializer;
use AI::MXNet::Optimizer;
use AI::MXNet::KVStore;
use AI::MXNet::Random qw(rnd random);
use AI::MXNet::Initializer qw(init initializer);
use AI::MXNet::Optimizer qw(optimizer opt);
use AI::MXNet::KVStore 'kv';
use AI::MXNet::KVStoreServer;
use AI::MXNet::IO;
use AI::MXNet::Metric;
use AI::MXNet::IO 'io';
use AI::MXNet::Metric 'metric';
use AI::MXNet::LRScheduler;
use AI::MXNet::Monitor;
use AI::MXNet::Monitor 'mon';
use AI::MXNet::Profiler;
use AI::MXNet::Module::Base;
use AI::MXNet::Module;
use AI::MXNet::Module qw(mod module);
use AI::MXNet::Module::Bucketing;
use AI::MXNet::RNN;
use AI::MXNet::Visualization;
use AI::MXNet::RecordIO;
use AI::MXNet::Image;
use AI::MXNet::Contrib;
use AI::MXNet::LinAlg;
use AI::MXNet::RNN 'rnn';
use AI::MXNet::Visualization 'viz';
use AI::MXNet::RecordIO 'recordio';
use AI::MXNet::Image qw(img image);
use AI::MXNet::Contrib 'contrib';
use AI::MXNet::LinAlg 'linalg';
use AI::MXNet::CachedOp;
use AI::MXNet::AutoGrad;
use AI::MXNet::Gluon;
use AI::MXNet::AutoGrad 'autograd';
use AI::MXNet::Gluon 'gluon';
use AI::MXNet::NDArray::Sparse;
use AI::MXNet::Symbol::Sparse;
use AI::MXNet::Engine;
use AI::MXNet::Engine 'engine';
our $VERSION = '1.4';

sub import
{
my ($class, $short_name) = @_;
if($short_name)
{
$short_name =~ s/[^\w:]//g;
if(length $short_name)
{
my $short_name_package =<<"EOP";
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' }
sub initializer { 'AI::MXNet::Initializer' }
sub optimizer { 'AI::MXNet::Optimizer' }
sub opt { 'AI::MXNet::Optimizer' }
sub rnd { 'AI::MXNet::Random' }
sub random { 'AI::MXNet::Random' }
sub Context { shift; AI::MXNet::Context->new(\@_) }
sub context { 'AI::MXNet::Context' }
sub cpu { AI::MXNet::Context->cpu(\$_[1]//0) }
sub cpu_pinned { AI::MXNet::Context->cpu_pinned(\$_[1]//0) }
sub gpu { AI::MXNet::Context->gpu(\$_[1]//0) }
sub kv { 'AI::MXNet::KVStore' }
sub recordio { 'AI::MXNet::RecordIO' }
sub io { 'AI::MXNet::IO' }
sub metric { 'AI::MXNet::Metric' }
sub mod { 'AI::MXNet::Module' }
sub module { 'AI::MXNet::Module' }
sub mon { 'AI::MXNet::Monitor' }
sub viz { 'AI::MXNet::Visualization' }
sub rnn { 'AI::MXNet::RNN' }
sub callback { 'AI::MXNet::Callback' }
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 engine { 'AI::MXNet::Engine' }
sub name { '$short_name' }
sub rtc { '$short_name' }
sub gluon { 'AI::MXNet::Gluon' }
sub CudaModule { shift; AI::MXNet::CudaModule->new(\@_) }
sub AttrScope { shift; AI::MXNet::Symbol::AttrScope->new(\@_) }
*AI::MXNet::Symbol::AttrScope::current = sub { \$${short_name}::AttrScope; };
\$${short_name}::AttrScope = AI::MXNet::Symbol::AttrScope->new;
sub Prefix { AI::MXNet::Symbol::Prefix->new(prefix => \$_[1]) }
*AI::MXNet::Symbol::NameManager::current = sub { \$${short_name}::NameManager; };
*AI::MXNet::Symbol::NameManager::set_current = sub { \$${short_name}::NameManager = \$_[1]; };
\$${short_name}::NameManager = AI::MXNet::Symbol::NameManager->new;
*AI::MXNet::Context::current_ctx = sub { \$${short_name}::Context; };
*AI::MXNet::Context::current_context = sub { \$${short_name}::Context; };
*AI::MXNet::Context::set_current = sub { \$${short_name}::Context = \$_[1]; };
\$${short_name}::Context = AI::MXNet::Context->new(device_type => 'cpu', device_id => 0);
package nd;
\@nd::ISA = ('AI::MXNet::NDArray');
1;
EOP
eval $short_name_package;
}
}
}
sub cpu { AI::MXNet::Context->cpu($_[1]//0) }
sub cpu_pinned { AI::MXNet::Context->cpu_pinned($_[1]//0) }
sub gpu { AI::MXNet::Context->gpu($_[1]//0) }
sub name { __PACKAGE__ }
sub rtc { __PACKAGE__ }
sub Prefix { AI::MXNet::Symbol::Prefix->new(prefix => $_[1]) }
our $AttrScope = AI::MXNet::Symbol::AttrScope->new;
our $NameManager = AI::MXNet::Symbol::NameManager->new;
our $Context = AI::MXNet::Context->new(device_type => 'cpu', device_id => 0);

1;
__END__
Expand Down
19 changes: 1 addition & 18 deletions perl-package/AI-MXNet/lib/AI/MXNet/AutoGrad.pm
Original file line number Diff line number Diff line change
Expand Up @@ -18,29 +18,12 @@
package AI::MXNet::AutoGrad;
use strict;
use warnings;
use AI::MXNet::NS 'global';
use AI::MXNet::Base;
use AI::MXNet::Function::Parameters;
use Scalar::Util qw(blessed);
use Carp qw(confess);

sub import
{
my ($class, $short_name) = @_;
if($short_name)
{
$short_name =~ s/[^\w:]//g;
if(length $short_name)
{
my $short_name_package =<<"EOP";
package $short_name;
use parent 'AI::MXNet::AutoGrad';
1;
EOP
eval $short_name_package;
}
}
}

=head1 NAME
AI::MXNet::AutoGrad - Autograd for NDArray.
Expand Down
16 changes: 8 additions & 8 deletions perl-package/AI-MXNet/lib/AI/MXNet/Base.pm
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,14 @@ use base qw(Exporter);
use List::Util qw(shuffle);
use Data::Dumper;

@AI::MXNet::Base::EXPORT = qw(product enumerate assert zip check_call build_param_doc
pdl cat dog svd bisect_left pdl_shuffle as_array ascsr rand_sparse
DTYPE_STR_TO_MX DTYPE_MX_TO_STR DTYPE_MX_TO_PDL
DTYPE_PDL_TO_MX DTYPE_MX_TO_PERL GRAD_REQ_MAP
STORAGE_TYPE_UNDEFINED STORAGE_TYPE_DEFAULT
STORAGE_TYPE_ROW_SPARSE STORAGE_TYPE_CSR
STORAGE_TYPE_STR_TO_ID STORAGE_TYPE_ID_TO_STR STORAGE_AUX_TYPES);
@AI::MXNet::Base::EXPORT_OK = qw(pzeros pceil pones digitize hash array_index range);
our @EXPORT = qw(product enumerate assert zip check_call build_param_doc
pdl cat dog svd bisect_left pdl_shuffle as_array ascsr rand_sparse
DTYPE_STR_TO_MX DTYPE_MX_TO_STR DTYPE_MX_TO_PDL
DTYPE_PDL_TO_MX DTYPE_MX_TO_PERL GRAD_REQ_MAP
STORAGE_TYPE_UNDEFINED STORAGE_TYPE_DEFAULT
STORAGE_TYPE_ROW_SPARSE STORAGE_TYPE_CSR
STORAGE_TYPE_STR_TO_ID STORAGE_TYPE_ID_TO_STR STORAGE_AUX_TYPES);
our @EXPORT_OK = qw(pzeros pceil pones digitize hash array_index range);

use constant DTYPE_STR_TO_MX => {
float32 => 0,
Expand Down
1 change: 1 addition & 0 deletions perl-package/AI-MXNet/lib/AI/MXNet/Callback.pm
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package AI::MXNet::Callback;
use strict;
use warnings;
use List::Util qw/max/;
use AI::MXNet::NS;
use AI::MXNet::Function::Parameters;
use Mouse;
use overload "&{}" => sub { my $self = shift; sub { $self->call(@_) } };
Expand Down
8 changes: 5 additions & 3 deletions perl-package/AI-MXNet/lib/AI/MXNet/Context.pm
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package AI::MXNet::Context;
use strict;
use warnings;
use Mouse;
use AI::MXNet::NS;
use AI::MXNet::Base;
use AI::MXNet::Types;
use AI::MXNet::Function::Parameters;
Expand Down Expand Up @@ -216,12 +217,12 @@ method gpu_memory_info($device_id=0)

method current_ctx()
{
return $AI::MXNet::current_ctx;
return $AI::MXNet::Context;
}

method set_current(AI::MXNet::Context $current)
{
$AI::MXNet::current_ctx = $current;
$AI::MXNet::Context = $current;
}

*current_context = \&current_ctx;
Expand All @@ -234,5 +235,6 @@ method deepcopy()
);
}

$AI::MXNet::current_ctx = __PACKAGE__->new(device_type => 'cpu', device_id => 0);
__PACKAGE__->AI::MXNet::NS::register('AI::MXNet');

1;
10 changes: 3 additions & 7 deletions perl-package/AI-MXNet/lib/AI/MXNet/Contrib.pm
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@
package AI::MXNet::Contrib;
use strict;
use warnings;
use AI::MXNet::Contrib::Symbol;
use AI::MXNet::Contrib::NDArray;
use AI::MXNet::NS;
use AI::MXNet::Contrib::Symbol qw(sym symbol);
use AI::MXNet::Contrib::NDArray qw(nd ndarray);

=head1 NAME
Expand Down Expand Up @@ -47,9 +48,4 @@ use AI::MXNet::Contrib::NDArray;
}
=cut

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;
1 change: 1 addition & 0 deletions perl-package/AI-MXNet/lib/AI/MXNet/Contrib/NDArray.pm
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
package AI::MXNet::Contrib::NDArray;
use strict;
use warnings;
use AI::MXNet::NS;
use parent 'AI::MXNet::AutoLoad';
sub config { ('contrib', 'AI::MXNet::NDArray') }

Expand Down
1 change: 1 addition & 0 deletions perl-package/AI-MXNet/lib/AI/MXNet/Contrib/Symbol.pm
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
package AI::MXNet::Contrib::Symbol;
use strict;
use warnings;
use AI::MXNet::NS;
use parent 'AI::MXNet::AutoLoad';
sub config { ('contrib', 'AI::MXNet::Symbol') }

Expand Down
5 changes: 4 additions & 1 deletion perl-package/AI-MXNet/lib/AI/MXNet/CudaModule.pm
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
package AI::MXNet::CudaModule;
use strict;
use warnings;
use AI::MXNet::NS;
use AI::MXNet::Base;
use Mouse;
use AI::MXNet::Function::Parameters;
Expand Down Expand Up @@ -195,6 +196,8 @@ method get_kernel(Str $name, Str $signature)
return AI::MXNet::CudaKernel->new($handle, $name, \@is_ndarray, \@dtypes);
}

__PACKAGE__->AI::MXNet::NS::register('AI::MXNet');

package AI::MXNet::CudaKernel;
use Mouse;
use AI::MXNet::Base;
Expand Down Expand Up @@ -296,4 +299,4 @@ method launch(
);
}

1;
1;
3 changes: 2 additions & 1 deletion perl-package/AI-MXNet/lib/AI/MXNet/Engine.pm
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ use strict;
use warnings;
use AI::MXNet::Function::Parameters;
use AI::MXNet::Base;
use AI::MXNet::NS;

=head1 NAME
Expand Down Expand Up @@ -100,4 +101,4 @@ method bulk(Int $size, CodeRef $sub)
Carp::confess($err) if $err;
}

1;
1;
38 changes: 5 additions & 33 deletions perl-package/AI-MXNet/lib/AI/MXNet/Gluon.pm
Original file line number Diff line number Diff line change
Expand Up @@ -18,42 +18,14 @@
package AI::MXNet::Gluon;
use strict;
use warnings;
use AI::MXNet::Gluon::Loss;
use AI::MXNet::NS 'global';
use AI::MXNet::Gluon::Loss 'loss';
use AI::MXNet::Gluon::Trainer;
use AI::MXNet::Gluon::Utils;
use AI::MXNet::Gluon::Data;
use AI::MXNet::Gluon::NN;
use AI::MXNet::Gluon::RNN;

sub import
{
my ($class, $short_name) = @_;
if($short_name)
{
$short_name =~ s/[^\w:]//g;
if(length $short_name)
{
my $short_name_package =<<"EOP";
package $short_name;
no warnings 'redefine';
sub data { 'AI::MXNet::Gluon::Data' }
sub nn { 'AI::MXNet::Gluon::NN_' }
sub rnn { 'AI::MXNet::Gluon::RNN_' }
sub loss { 'AI::MXNet::Gluon::Loss_' }
sub utils { 'AI::MXNet::Gluon::Utils' }
sub model_zoo { require AI::MXNet::Gluon::ModelZoo; 'AI::MXNet::Gluon::ModelZoo' }
sub Trainer { shift; AI::MXNet::Gluon::Trainer->new(\@_); }
sub Parameter { shift; AI::MXNet::Gluon::Parameter->new(\@_); }
sub ParameterDict { shift; AI::MXNet::Gluon::ParameterDict->new(\@_); }
\@${short_name}::ISA = ('AI::MXNet::Gluon_');
1;
EOP
eval $short_name_package;
}
}
}
use AI::MXNet::Gluon::Data 'data';
use AI::MXNet::Gluon::NN 'nn';
use AI::MXNet::Gluon::RNN 'rnn';

sub data { 'AI::MXNet::Gluon::Data' }
sub utils { 'AI::MXNet::Gluon::Utils' }
sub model_zoo { require AI::MXNet::Gluon::ModelZoo; 'AI::MXNet::Gluon::ModelZoo' }

Expand Down
7 changes: 6 additions & 1 deletion perl-package/AI-MXNet/lib/AI/MXNet/Gluon/Block.pm
Original file line number Diff line number Diff line change
Expand Up @@ -731,8 +731,13 @@ method forward(@args)
method register(Str $container)
{
my $sub_name = $self->_class_name;
my $dest = $self->can('new');
my $func = sub {
splice @_, 0, 1, $self;
goto $dest;
};
no strict 'refs';
*{$container.'_::'.$sub_name} = sub { shift; $self->new(@_) };
*{"$container\::$sub_name"} = $func;
}

=head2 summary
Expand Down
4 changes: 2 additions & 2 deletions perl-package/AI-MXNet/lib/AI/MXNet/Gluon/Data.pm
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@
package AI::MXNet::Gluon::Data;
use strict;
use warnings;
use AI::MXNet::NS;
use AI::MXNet::Gluon::Data::Set;
use AI::MXNet::Gluon::Data::Sampler;
use AI::MXNet::Gluon::Data::Loader;
use AI::MXNet::Gluon::Data::Vision;
sub vision { 'AI::MXNet::Gluon::Data::Vision' }
use AI::MXNet::Gluon::Data::Vision 'vision';

1;

Expand Down
3 changes: 3 additions & 0 deletions perl-package/AI-MXNet/lib/AI/MXNet/Gluon/Data/Vision.pm
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
# specific language governing permissions and limitations
# under the License.

package AI::MXNet::Gluon::Data::Vision;
use AI::MXNet::NS;

package AI::MXNet::Gluon::Data::Vision::DownloadedDataSet;
use strict;
use warnings;
Expand Down
Loading

0 comments on commit f933bd3

Please sign in to comment.