24 #ifndef MXNET_NDARRAY_H_ 25 #define MXNET_NDARRAY_H_ 27 #include <dmlc/base.h> 28 #include <dmlc/logging.h> 30 #include <dmlc/type_traits.h> 31 #include <dmlc/registry.h> 32 #include <nnvm/node.h> 40 #if MKL_EXPERIMENTAL == 1 41 #include <mkl_memory.h> 44 #if DMLC_USE_CXX11 == 0 45 #error "cxx11 was required for ndarray module" 73 #if MKL_EXPERIMENTAL == 1 74 Mkl_mem_ = MKLMemHolder::create();
85 bool delay_alloc =
false,
int dtype = mshadow::default_type_flag)
86 : ptr_(std::make_shared<Chunk>(shape, ctx, delay_alloc, dtype)),
88 entry_({
nullptr, 0, 0}) {
89 #if MKL_EXPERIMENTAL == 1 90 Mkl_mem_ = std::make_shared<MKLMemHolder>();
96 bool delay_alloc =
true,
int dtype = mshadow::default_type_flag,
97 std::vector<int> aux_types = {}, std::vector<TShape> aux_shapes = {},
99 : shape_(shape), dtype_(dtype), storage_type_(stype),
100 entry_({
nullptr, 0, 0}) {
102 if (aux_types.size() == 0) {
104 aux_types = {mshadow::kInt64};
106 aux_types = {mshadow::kInt64, mshadow::kInt64};
108 LOG(FATAL) <<
"Unknown storage type " << stype;
113 if (aux_shapes.size() == 0) {
115 aux_shapes = {
TShape(mshadow::Shape1(0))};
118 aux_shapes = {
TShape(mshadow::Shape1(0)),
TShape(mshadow::Shape1(0))};
120 LOG(FATAL) <<
"Unknown storage type " << stype;
123 if (storage_shape.Size() == 0) {
125 storage_shape = shape;
130 LOG(FATAL) <<
"Unknown storage type " << stype;
133 ptr_ = std::make_shared<Chunk>(stype, storage_shape, ctx, delay_alloc,
134 dtype, aux_types, aux_shapes);
135 #if MKL_EXPERIMENTAL == 1 136 Mkl_mem_ = std::make_shared<MKLMemHolder>();
147 : ptr_(std::make_shared<Chunk>(data, dev_id)), shape_(data.shape_),
149 entry_({
nullptr, 0, 0}) {
150 #if MKL_EXPERIMENTAL == 1 151 Mkl_mem_ = std::make_shared<MKLMemHolder>();
166 const TBlob &data,
const std::vector<TBlob> &aux_data,
int dev_id)
167 : ptr_(std::make_shared<Chunk>(stype, data, aux_data, dev_id)), shape_(shape),
168 dtype_(data.type_flag_), storage_type_(stype), entry_({
nullptr, 0, 0}) {
169 #if MKL_EXPERIMENTAL == 1 170 Mkl_mem_ = std::make_shared<MKLMemHolder>();
187 CHECK(ptr_ !=
nullptr);
189 <<
"storage_shape() is not intended for kDefaultStorage.";
190 return ptr_->storage_shape;
200 <<
"aux_shape() is not intended for kDefaultStorage.";
201 return ptr_->aux_shapes[index];
207 <<
"aux_shapes() is not intended for kDefaultStorage.";
208 return ptr_->aux_shapes;
214 <<
"aux_types() is not intended for kDefaultStorage.";
215 return ptr_->aux_types;
226 ptr_->set_aux_shape(index, shape);
246 auto stype = storage_type();
248 auto shape = aux_shape(i);
249 auto type = aux_type(i);
250 MSHADOW_TYPE_SWITCH(type, DType, {
251 auto dptr =
static_cast<DType*
>(ptr_->aux_handles[i].dptr);
253 <<
"Unexpected storage type: " << stype;
254 res =
TBlob(dptr, shape, ptr_->aux_handles[i].ctx.dev_mask(), type);
256 #if MKL_EXPERIMENTAL == 1 257 res.Mkl_mem_ = Mkl_mem_;
266 return ptr_->shandle.ctx;
276 return ptr_->aux_types[i];
280 return storage_type_;
284 return ptr_.get() ==
nullptr;
287 bool fresh_out_grad()
const;
289 void set_fresh_out_grad(
bool state)
const;
292 if (is_none())
return false;
293 auto stype = storage_type();
295 <<
"storage_initialized() is not intended for kDefaultStorage.";
298 <<
"inconsistent storage shape " << storage_shape()
300 return aux_shape(0).Size() != 0;
302 CHECK_EQ(aux_shape(
csr::kIdx)[0], storage_shape()[0])
303 <<
"inconsistent storage shape " << storage_shape()
304 <<
" vs. aux shape " << aux_shape(
csr::kIdx);
305 return aux_shape(0).Size() != 0;
307 LOG(FATAL) <<
"Unknown storage type";
316 if (is_none())
return;
324 if (is_none())
return;
340 void Save(dmlc::Stream *strm)
const;
346 bool LegacyLoad(dmlc::Stream *strm,
const uint32_t magic);
352 bool Load(dmlc::Stream *strm);
431 void SyncCopyFromCPU(
const void *data,
size_t size)
const;
436 void SyncCopyFromNDArray(
const NDArray &src,
int i = -1,
int j = -1);
448 void SyncCopyToCPU(
void *data,
size_t size)
const;
479 NDArray aux_ndarray(
size_t i)
const;
496 <<
"AsArray is intended only for kDefaultStorage.";
497 CHECK_GE(ptr_->shandle.size,
498 shape.Size() * mshadow::mshadow_sizeof(dtype))
499 <<
"NDArray.AsArray: target memory size is bigger";
500 #if MKL_EXPERIMENTAL == 1 501 if (Mkl_mem_ !=
nullptr) {
503 Mkl_mem_->check_and_prv_to_cpu(ptr_->shandle.dptr);
528 ret.entry_ = nnvm::NodeEntry{
nullptr, 0, 0};
532 nnvm::Symbol get_autograd_symbol()
const;
539 ptr_->CheckAndAlloc();
555 ptr_->CheckAndAlloc(shape.Size() * mshadow::mshadow_sizeof(dtype_));
564 <<
"CheckAndAlloc(aux_shapes) is not intended for kDefaultStorage";
565 ptr_->CheckAndAlloc(shape_, aux_shapes, dtype_);
569 <<
"CheckAndAllocData is not intended for kDefaultStorage";
570 ptr_->CheckAndAllocData(storage_shape, dtype_);
574 <<
"CheckAndAllocAuxData is not intended for kDefaultStorage";
575 ptr_->CheckAndAllocAuxData(i, aux_shape);
583 static void Save(dmlc::Stream* fo,
584 const std::vector<NDArray>& data,
585 const std::vector<std::string>& names);
592 static void Load(dmlc::Stream* fi,
593 std::vector<NDArray>* data,
594 std::vector<std::string>* keys);
610 std::vector<Storage::Handle> aux_handles;
626 std::vector<int> aux_types;
635 std::vector<TShape> aux_shapes;
638 Chunk() : static_data(true), delay_alloc(false) {}
641 Chunk(
TShape shape,
Context ctx_,
bool delay_alloc_,
int dtype)
642 : static_data(false), delay_alloc(true), ctx(ctx_) {
643 auto size = shape.Size();
644 storage_shape = shape;
646 shandle.
size = size * mshadow::mshadow_sizeof(dtype);
648 if (!delay_alloc_) this->CheckAndAlloc();
651 Chunk(
const TBlob &data,
int dev_id)
652 : static_data(true), delay_alloc(false) {
655 if (data.
dev_mask() == cpu::kDevMask) {
658 CHECK_EQ(data.
dev_mask(), gpu::kDevMask);
665 storage_shape = data.
shape_;
669 bool delay_alloc_,
int dtype,
const std::vector<int> &aux_types_,
670 const std::vector<TShape> &aux_shapes_)
671 : static_data(false), delay_alloc(delay_alloc_), storage_type(storage_type_),
672 aux_types(aux_types_), ctx(ctx_), storage_shape(storage_shape_),
673 aux_shapes(aux_shapes_) {
677 for (
size_t i = 0; i < aux_shapes.size(); i++) {
678 CheckAndAllocAuxData(i, aux_shapes[i]);
681 aux_handles[i].ctx = ctx;
684 CheckAndAllocData(storage_shape, dtype);
689 const std::vector<TBlob> &aux_data,
int dev_id)
690 : static_data(true), delay_alloc(false), storage_type(storage_type_) {
691 using namespace mshadow;
696 if (data.
dev_mask() == cpu::kDevMask) {
699 CHECK_EQ(data.
dev_mask(), gpu::kDevMask);
706 storage_shape = data.
shape_;
708 for (
const auto &aux : aux_data) {
710 aux_handle.
ctx = ctx;
711 aux_handle.
dptr = aux.dptr_;
712 aux_handle.
size = aux.shape_.Size() * mshadow_sizeof(aux.type_flag_);
713 aux_handles.push_back(aux_handle);
714 aux_types.emplace_back(aux.type_flag_);
715 aux_shapes.emplace_back(aux.shape_);
720 inline void set_aux_shape(
const size_t i,
const TShape& shape) {
721 aux_shapes[i] = shape;
722 if (storage_shape.ndim() > 0) {
724 storage_shape[0] = shape[0];
726 storage_shape[0] = shape[0];
732 inline void CheckAndAlloc(
void) {
741 void CheckAndAlloc(uint64_t dbytes) {
743 <<
"CheckAndAlloc(dbytes) is not intended for kDefaultStorage";
747 }
else if (shandle.
size < dbytes) {
755 inline void CheckAndAlloc(
const TShape &shape,
const std::vector<TShape> &aux_shapes,
762 TShape storage_shape(shape);
763 storage_shape[0] = aux_shape[0];
764 CheckAndAllocData(storage_shape, dtype);
768 CheckAndAllocData(aux_shapes[
csr::kIdx], dtype);
770 LOG(FATAL) <<
"Storage type " << storage_type <<
" not implemented for CheckAndAlloc";
777 inline void CheckAndAllocData(
const TShape &shape,
int dtype) {
778 CHECK_NE(aux_shapes.size(), 0) <<
"data is expected to be allocated after aux_data";
779 auto dbytes = shape.Size() * mshadow::mshadow_sizeof(dtype);
780 if (shandle.
size < dbytes) {
787 storage_shape = shape;
796 inline void CheckAndAllocAuxData(
size_t i,
const TShape &shape) {
797 CHECK_EQ(shape.ndim(), 1) <<
"shape must be 1D in CheckAndAllocAuxData";
799 <<
"storage type cannot be kUndefinedStorage in CheckAndAllocAuxData";
801 <<
"storage type cannot be kDefaultStorage in CheckAndAllocAuxData";
802 if (aux_handles.size() <= i) {
803 aux_handles.resize(i + 1);
805 size_t aux_bytes = shape.Size() * mshadow::mshadow_sizeof(aux_types[i]);
806 if (aux_handles[i].size < aux_bytes) {
813 set_aux_shape(i, shape);
817 bool skip_free = static_data || delay_alloc;
819 std::vector<Storage::Handle> aux_h = this->aux_handles;
821 if (skip_free ==
false) {
823 for (
size_t i = 0; i < aux_h.size(); i++) {
827 }, shandle.
ctx, var);
831 void SetTBlob()
const {
832 CHECK(ptr_ !=
nullptr);
834 char *dptr =
static_cast<char*
>(ptr_->shandle.dptr);
835 auto stype = storage_type();
837 dptr += byte_offset_;
839 shape = storage_shape();
841 LOG(FATAL) <<
"unknown storage type " << stype;
844 tblob_.shape_ = shape;
845 tblob_.type_flag_ = dtype_;
846 tblob_.SetDLTensor(ptr_->shandle.ctx.dev_mask(), ptr_->shandle.ctx.dev_id);
847 #if MKL_EXPERIMENTAL == 1 848 tblob_.Mkl_mem_ = Mkl_mem_;
852 #if MKL_EXPERIMENTAL == 1 853 std::shared_ptr<MKLMemHolder> Mkl_mem_;
856 std::shared_ptr<Chunk> ptr_{
nullptr};
860 size_t byte_offset_ = 0;
866 nnvm::NodeEntry entry_;
874 mutable TBlob tblob_;
1032 typedef std::function<void (
NDArray **used_vars,
1056 :
public dmlc::FunctionRegEntryBase<NDArrayFunctionReg,
1057 NDArrayAPIFunction> {
1083 int num_params,
char **param_keys,
char **param_vals) {
1084 (*fsetvalue)(s[0], mutate_vars[0]);
1086 num_mutate_vars = 1; num_scalars = 1;
1087 this->add_argument(
"src",
"real_t",
"Source input to the function.");
1100 body = [fternary](
NDArray **used_vars,
1102 int num_params,
char **param_keys,
char **param_vals) {
1103 (*fternary)(*used_vars[0], *used_vars[1], *used_vars[2], mutate_vars[0]);
1105 num_use_vars = 3; num_mutate_vars = 1;
1107 this->add_argument(
"lhs",
"NDArray",
"Left operand to the function.");
1108 this->add_argument(
"mhs",
"NDArray",
"Middle operand to the function.");
1109 this->add_argument(
"rhs",
"NDArray",
"Right operand to the function.");
1122 int num_params,
char **param_keys,
char **param_vals) {
1123 (*fbinary)(*used_vars[0], *used_vars[1], mutate_vars[0]);
1125 num_use_vars = 2; num_mutate_vars = 1;
1127 this->add_argument(
"lhs",
"NDArray",
"Left operand to the function.");
1128 this->add_argument(
"rhs",
"NDArray",
"Right operand to the function.");
1141 int num_params,
char **param_keys,
char **param_vals) {
1142 (*fscalar)(*used_vars[0], s[0], mutate_vars[0]);
1144 num_use_vars = 1; num_mutate_vars = 1; num_scalars = 1;
1146 this->add_argument(
"lhs",
"NDArray",
"Left operand to the function.");
1147 this->add_argument(
"rhs",
"real_t",
"Right operand to the function.");
1159 int num_params,
char **param_keys,
char **param_vals) {
1160 (*funary)(*used_vars[0], mutate_vars[0]);
1162 num_use_vars = 1; num_mutate_vars = 1;
1164 this->add_argument(
"src",
"NDArray",
"Source input to the function.");
1174 void (*fgeneric)(
NDArray **used_vars,
1177 const std::map<std::string, std::string>& param)) {
1179 int num_params,
char **param_keys,
char **param_vals) {
1180 std::map<std::string, std::string> param;
1181 for (
int i = 0; i < num_params; ++i) {
1182 param[param_keys[i]] = param_vals[i];
1184 fgeneric(used_vars, s, mutate_vars, param);
1194 num_use_vars = n;
return *
this;
1202 num_mutate_vars = n;
return *
this;
1210 num_scalars = n;
return *
this;
1218 type_mask = tmask;
return *
this;
1233 #define MXNET_REGISTER_NDARRAY_FUN(name) \ 1234 DMLC_REGISTRY_REGISTER(::mxnet::NDArrayFunctionReg, NDArrayFunctionReg, name) 1242 #endif // MXNET_NDARRAY_H_
NDArrayStorageType
Definition: ndarray.h:58
NDArrayFunctionReg & set_num_mutate_vars(unsigned n)
set the number of mutate variables
Definition: ndarray.h:1201
Engine::VarHandle var() const
Definition: ndarray.h:333
void RandomSeed(uint32_t seed)
Seed the random number generator.
NDArrayStorageType storage_type() const
Definition: ndarray.h:279
Engine that schedules all the operations according to dependency.
TShape shape_
shape of the tensor
Definition: tensor_blob.h:64
const TShape & storage_shape() const
Definition: ndarray.h:186
NDArrayFunctionReg()
constructor
Definition: ndarray.h:1069
namespace of mxnet
Definition: base.h:126
void ReshapeAndAlloc(const TShape &shape)
Allocate the space if the allocation has been delayed or the requested size is bigger than the availa...
Definition: ndarray.h:551
NDArray operator*(const NDArray &lhs, const NDArray &rhs)
elementwise multiplication
virtual void Free(Handle handle)=0
Free storage.
NDArrayFunctionReg & set_num_use_vars(unsigned n)
set the number of mutate variables
Definition: ndarray.h:1193
DMLC_DECLARE_TRAITS(has_saveload, mxnet::NDArray, true)
traits
mshadow::default_real_t real_t
data type that will be used to store ndarray
Definition: base.h:134
static Context GPU(int32_t dev_id=-1)
int type_mask
information on how function should be called from API
Definition: ndarray.h:1065
NDArrayFunctionReg & set_function(void(*funary)(const NDArray &src, NDArray *out))
set the function body to a unary NDArray function this will also auto set the parameters correctly ...
Definition: ndarray.h:1156
NDArray Detach() const
Return a copy of this NDArray without autograd history.
Definition: ndarray.h:526
int type_flag_
type flag of the tensor blob
Definition: tensor_blob.h:66
NDArrayFunctionReg & set_num_scalars(unsigned n)
set the number of scalar arguments
Definition: ndarray.h:1209
nnvm::TShape TShape
Shape data structure used to record shape information.
Definition: base.h:136
unsigned num_mutate_vars
number of variable mutated by this function
Definition: ndarray.h:1061
execution time context. The information needed in runtime for actual execution.
Definition: base.h:238
void * dptr
Pointer to the data.
Definition: storage.h:44
NDArrayFunctionReg & set_function(void(*fscalar)(const NDArray &lhs, const real_t &rhs, NDArray *out))
set the function body to a binary NDArray function this will also auto set the parameters correctly ...
Definition: ndarray.h:1137
Symbol Reshape(const std::string &symbol_name, Symbol data, Shape shape=Shape(), bool reverse=0, Shape target_shape=Shape(), bool keep_highest=0)
Definition: op.h:301
Context ctx
Context information about device and ID.
Definition: storage.h:52
NDArray()
default constructor
Definition: ndarray.h:72
unsigned num_use_vars
number of variable used by this function
Definition: ndarray.h:1059
NDArrayFunctionReg & set_function(void(*fternary)(const NDArray &lhs, const NDArray &mhs, const NDArray &rhs, NDArray *out))
set the function body to a ternary NDArray function this will also auto set the parameters correctly ...
Definition: ndarray.h:1096
virtual Handle Alloc(size_t size, Context ctx)=0
Allocate a new contiguous memory for a given size.
RowSparseAuxType
Definition: ndarray.h:55
bool is_none() const
Definition: ndarray.h:283
all the scalar should go before use_vars
Definition: ndarray.h:1043
void SampleExponential(real_t lambda, NDArray *out)
Sample exponential distribution for each elements of out.
void * dptr_
pointer to the data
Definition: tensor_blob.h:62
virtual VarHandle NewVariable()=0
Allocate a new variable, the variable can then be used to schedule the operation concurrently via dep...
whether this function allows the handles in the target to be empty NDArray that are not yet initializ...
Definition: ndarray.h:1052
const TShape & shape() const
Definition: ndarray.h:178
Definition: ndarray.h:1238
virtual void WaitForVar(VarHandle var)=0
Wait for a variable.
const std::vector< TShape > & aux_shapes() const
Definition: ndarray.h:205
Context ctx() const
Definition: ndarray.h:264
CSRAuxType
Definition: ndarray.h:51
void SampleGaussian(real_t mu, real_t sigma, NDArray *out)
Sample gaussian distribution for each elements of out.
Storage manager across multiple devices.
void WaitToRead() const
Block until all the pending write operations with respect to current NDArray are finished, and read can be performed.
Definition: ndarray.h:315
int dtype() const
Definition: ndarray.h:271
bool storage_initialized() const
Definition: ndarray.h:291
Storage handle.
Definition: storage.h:40
void set_aux_shape(size_t index, const TShape &shape) const
For a sparse operation on a csr matrix for example, the size of the column index array is an estimate...
Definition: ndarray.h:225
virtual void DeleteVariable(SyncFn delete_fn, Context exec_ctx, VarHandle var)=0
Schedule the deletion of a variable.
void CheckAndAllocData(const TShape &storage_shape) const
Definition: ndarray.h:567
size_t num_aux_data(NDArrayStorageType stype)
NDArrayFunctionReg & set_type_mask(int tmask)
set type mask
Definition: ndarray.h:1217
engine::VarHandle VarHandle
Variable pointer.
Definition: engine.h:104
void WaitToWrite() const
Block until all the pending read/write operations with respect to current NDArray are finished...
Definition: ndarray.h:323
NDArray operator-(const NDArray &lhs, const NDArray &rhs)
elementwise subtraction
NDArray(const NDArrayStorageType stype, const TShape &shape, Context ctx, bool delay_alloc=true, int dtype=mshadow::default_type_flag, std::vector< int > aux_types={}, std::vector< TShape > aux_shapes={}, TShape storage_shape=TShape(mshadow::Shape1(0)))
constructor for NDArray with storage type
Definition: ndarray.h:95
NDArrayFunctionReg & set_function(void(*fsetvalue)(const real_t &rhs, NDArray *out))
set the function body to a NDArray setvalue function this will also auto set the parameters correctly...
Definition: ndarray.h:1080
NDArray operator+(const NDArray &lhs, const NDArray &rhs)
elementwise add
void SampleUniform(real_t begin, real_t end, NDArray *out)
Sample uniform distribution for each elements of out.
Registry entry for NDArrayFunction.
Definition: ndarray.h:1055
void PushSync(SyncFn exec_fn, Context exec_ctx, std::vector< VarHandle > const &const_vars, std::vector< VarHandle > const &mutable_vars, FnProperty prop=FnProperty::kNormal, int priority=0, const char *opr_name=nullptr)
Push an synchronous operation to the engine.
Definition: engine.h:224
NDArrayFunctionReg & set_function(void(*fbinary)(const NDArray &lhs, const NDArray &rhs, NDArray *out))
set the function body to a binary NDArray function this will also auto set the parameters correctly ...
Definition: ndarray.h:1118
static Context CPU(int32_t dev_id=0)
runtime functions for NDArray
Definition: imperative.h:37
int aux_type(size_t i) const
Definition: ndarray.h:274
all the use_vars should go before scalar
Definition: ndarray.h:1041
NDArray AsArray(const TShape &shape, int dtype) const
Create a NDArray that shares memory with current one The new array must have smaller memory size than...
Definition: ndarray.h:494
void CheckAndAlloc(const std::vector< TShape > &aux_shapes) const
Definition: ndarray.h:562
unsigned num_scalars
number of scalars used by this function
Definition: ndarray.h:1063
const TBlob & data() const
Definition: ndarray.h:232
void CheckAndAllocAuxData(size_t i, const TShape &aux_shape) const
Definition: ndarray.h:572
NDArray(const NDArrayStorageType stype, const TShape &shape, const TBlob &data, const std::vector< TBlob > &aux_data, int dev_id)
constructing a static NDArray of non-default storage that shares data with TBlob Use with caution: al...
Definition: ndarray.h:165
void CheckAndAlloc() const
Allocate the space if it is delayed allocated. This is an internal function used by system that norma...
Definition: ndarray.h:537
mshadow::index_t index_t
index type usually use unsigned
Definition: base.h:132
size_t size
Size of the storage.
Definition: storage.h:48
TBlob aux_data(size_t i) const
Definition: ndarray.h:245
void SampleGenNegBinomial(real_t mu, real_t alpha, NDArray *out)
Sample generalized negative binomial distribution for each elements of out.
Context information about the execution environment.
Definition: base.h:141
void SamplePoisson(real_t lambda, NDArray *out)
Sample Poisson distribution for each elements of out.
const TShape & aux_shape(size_t index) const
get the shape of aux_data(index)
Definition: ndarray.h:198
ndarray interface
Definition: ndarray.h:69
void CopyFromTo(const NDArray &from, NDArray *to, int priority=0)
issue an copy operation from one NDArray to another the two ndarray can sit on different devices this...
NDArray(const TBlob &data, int dev_id)
constructing a static NDArray that shares data with TBlob Use with caution: allocate ONLY ONE NDArray...
Definition: ndarray.h:146
int dev_mask() const
device mask of the corresponding device
Definition: tensor_blob.h:227
void ElementwiseSum(const std::vector< NDArray > &source, NDArray *out, int priority=0)
Perform elementwise sum over each data from source, store result into out.
std::function< void(NDArray **used_vars, real_t *scalars, NDArray **mutate_vars, int num_params, char **param_keys, char **param_vals)> NDArrayAPIFunction
definition of NDArray function
Definition: ndarray.h:1037
void SampleNegBinomial(int32_t k, real_t p, NDArray *out)
Sample negative binomial distribution for each elements of out.
NDArrayFunctionReg & set_function(void(*fgeneric)(NDArray **used_vars, real_t *s, NDArray **mutate_vars, const std::map< std::string, std::string > ¶m))
set the function body to a unary NDArray function this will also auto set the parameters correctly ...
Definition: ndarray.h:1173
tensor blob class that can be used to hold tensor of any dimension, any device and any data type...
Definition: tensor_blob.h:58
const std::vector< int > & aux_types() const
Definition: ndarray.h:212
void SampleGamma(real_t alpha, real_t beta, NDArray *out)
Sample gamma distribution for each elements of out.
NDArray(const TShape &shape, Context ctx, bool delay_alloc=false, int dtype=mshadow::default_type_flag)
constructs a new dynamic NDArray
Definition: ndarray.h:84
NDArray operator/(const NDArray &lhs, const NDArray &rhs)
elementwise division
NDArrayFunctionTypeMask
mask information on how functions can be exposed
Definition: ndarray.h:1039