25 #ifndef MXNET_NDARRAY_H_ 26 #define MXNET_NDARRAY_H_ 28 #include <dmlc/base.h> 29 #include <dmlc/logging.h> 31 #include <dmlc/type_traits.h> 32 #include <dmlc/registry.h> 33 #include <nnvm/node.h> 40 #if MXNET_USE_MKLDNN == 1 47 #if DMLC_USE_CXX11 == 0 48 #error "cxx11 was required for ndarray module" 95 bool delay_alloc =
false,
int dtype = mshadow::default_type_flag)
96 : ptr_(std::make_shared<Chunk>(shape, ctx, delay_alloc, dtype)),
98 entry_({
nullptr, 0, 0}) {
103 bool delay_alloc =
true,
int dtype = mshadow::default_type_flag,
104 std::vector<int> aux_types = {}, std::vector<TShape> aux_shapes = {},
115 : ptr_(std::make_shared<Chunk>(data, dev_id)), shape_(data.shape_),
117 entry_({
nullptr, 0, 0}) {
121 : ptr_(std::make_shared<Chunk>(shared_pid, shared_id, shape, dtype)), shape_(shape),
122 dtype_(dtype), storage_type_(
kDefaultStorage), entry_({
nullptr, 0, 0}) {
136 const TBlob &data,
const std::vector<TBlob> &aux_data,
int dev_id)
137 : ptr_(std::make_shared<Chunk>(stype, data, aux_data, dev_id)), shape_(shape),
138 dtype_(data.type_flag_), storage_type_(stype), entry_({
nullptr, 0, 0}) {
155 return byte_offset_ > 0 || shape() != ptr_->storage_shape;
170 CHECK(ptr_ !=
nullptr);
172 <<
"storage_shape() is not intended for kDefaultStorage.";
173 return ptr_->storage_shape;
183 <<
"aux_shape() is not intended for kDefaultStorage.";
184 return ptr_->aux_shapes[index];
190 <<
"aux_shapes() is not intended for kDefaultStorage.";
191 return ptr_->aux_shapes;
197 <<
"aux_types() is not intended for kDefaultStorage.";
198 return ptr_->aux_types;
209 ptr_->set_aux_shape(index, shape);
229 auto stype = storage_type();
231 auto shape = aux_shape(i);
232 auto type = aux_type(i);
233 MSHADOW_TYPE_SWITCH(type, DType, {
234 auto dptr =
static_cast<DType*
>(ptr_->aux_handles[i].dptr);
236 <<
"Unexpected storage type: " << stype;
237 res =
TBlob(dptr, shape, ptr_->aux_handles[i].ctx.dev_mask(), type);
246 return ptr_->shandle.ctx;
256 return ptr_->aux_types[i];
260 return storage_type_;
264 return ptr_.get() ==
nullptr;
267 bool fresh_out_grad()
const;
269 void set_fresh_out_grad(
bool state)
const;
275 if (is_none())
return false;
276 auto stype = storage_type();
278 <<
"storage_initialized() is not intended for kDefaultStorage.";
281 <<
"inconsistent storage shape " << storage_shape()
285 CHECK_EQ(aux_shape(
csr::kIdx)[0], storage_shape()[0])
286 <<
"inconsistent storage shape " << storage_shape()
287 <<
" vs. aux shape " << aux_shape(
csr::kIdx);
290 LOG(FATAL) <<
"Unknown storage type";
299 return ptr_->shandle;
306 if (is_none())
return;
314 if (is_none())
return;
322 },
Context{}, {}, {ptr_->var});
337 void Save(dmlc::Stream *strm)
const;
343 bool LegacyLoad(dmlc::Stream *strm,
const uint32_t magic);
349 bool Load(dmlc::Stream *strm);
428 void SyncCopyFromCPU(
const void *data,
size_t size)
const;
433 void SyncCopyFromNDArray(
const NDArray &src,
int i = -1,
int j = -1);
445 void SyncCopyToCPU(
void *data,
size_t size)
const;
451 void SyncCheckFormat(
const bool full_check)
const;
482 NDArray aux_ndarray(
size_t i)
const;
499 <<
"AsArray is intended only for kDefaultStorage.";
500 CHECK_GE(ptr_->shandle.size,
501 shape.Size() * mshadow::mshadow_sizeof(dtype))
502 <<
"NDArray.AsArray: target memory size is bigger";
520 CHECK(shape_ == arr.shape_) <<
"ndarray shape is different from the target";
521 CHECK(dtype_ == arr.dtype_) <<
"ndarray dtype is different from the target";
524 <<
"Only to be used with CSR and RSP storage types";
527 arr.ptr_->shandle = ptr_->shandle;
528 ptr_->shandle = shandle_dst;
530 ptr_->storage_shape = arr.ptr_->storage_shape;
531 ptr_->storage_type = arr.ptr_->storage_type;
532 ptr_->ctx = arr.ptr_->ctx;
536 CHECK(ptr_->aux_handles.size() == arr.ptr_->aux_handles.size())
537 <<
"ndarray number of aux_handles is different from target";
538 for (
auto &aux_handle : arr.ptr_->aux_handles) {
540 ptr_->aux_handles[aux_idx] = aux_handle;
541 aux_handle = aux_dst;
544 ptr_->aux_types = arr.ptr_->aux_types;
545 ptr_->aux_shapes = arr.ptr_->aux_shapes;
565 ret.entry_ = nnvm::NodeEntry{
nullptr, 0, 0};
569 nnvm::Symbol get_autograd_symbol()
const;
576 ptr_->CheckAndAlloc();
592 ptr_->CheckAndAlloc(shape.Size() * mshadow::mshadow_sizeof(dtype_));
601 <<
"CheckAndAlloc(aux_shapes) is not intended for kDefaultStorage";
602 ptr_->CheckAndAlloc(shape_, aux_shapes, dtype_);
606 <<
"CheckAndAllocData is not intended for kDefaultStorage";
607 ptr_->CheckAndAllocData(storage_shape, dtype_);
611 <<
"CheckAndAllocAuxData is not intended for kDefaultStorage";
612 ptr_->CheckAndAllocAuxData(i, aux_shape);
615 #if MXNET_USE_MKLDNN == 1 619 bool IsMKLDNNData()
const {
620 return ptr_->IsMKLDNN();
625 bool IsDefaultData()
const {
626 return ptr_->IsDefault();
638 const mkldnn::memory *GetMKLDNNData()
const;
643 const mkldnn::memory *GetMKLDNNData(
644 const mkldnn::memory::primitive_desc &desc)
const;
650 const mkldnn::memory *GetMKLDNNDataReorder(
651 const mkldnn::memory::primitive_desc &desc)
const;
656 void CopyFrom(
const mkldnn::memory &mem);
661 mkldnn::memory *CreateMKLDNNData(
662 const mkldnn::memory::primitive_desc &desc);
669 void Reorder2DefaultAsync();
670 void MKLDNNDataReorderAsync(
const mkldnn::memory::primitive_desc &desc);
676 NDArray Reorder2Default()
const;
678 void InvalidateMKLDNNData() {
680 ptr_->mkl_mem_ =
nullptr;
702 static void Save(dmlc::Stream* fo,
703 const std::vector<NDArray>& data,
704 const std::vector<std::string>& names);
711 static void Load(dmlc::Stream* fi,
712 std::vector<NDArray>* data,
713 std::vector<std::string>* keys);
729 std::vector<Storage::Handle> aux_handles;
731 #if MXNET_USE_MKLDNN == 1 734 std::shared_ptr<MKLDNNMemory> mkl_mem_;
751 std::vector<int> aux_types;
760 std::vector<TShape> aux_shapes;
763 Chunk() : static_data(true), delay_alloc(false) {}
766 Chunk(
TShape shape,
Context ctx_,
bool delay_alloc_,
int dtype)
767 : static_data(false), delay_alloc(true), ctx(ctx_) {
768 auto size = shape.Size();
769 storage_shape = shape;
771 shandle.
size = size * mshadow::mshadow_sizeof(dtype);
773 if (!delay_alloc_) this->CheckAndAlloc();
776 Chunk(
const TBlob &data,
int dev_id)
777 : static_data(true), delay_alloc(false) {
780 if (data.
dev_mask() == cpu::kDevMask) {
783 CHECK_EQ(data.
dev_mask(), gpu::kDevMask);
790 storage_shape = data.
shape_;
793 Chunk(
int shared_pid,
int shared_id,
const TShape& shape,
int dtype)
794 : static_data(false), delay_alloc(false) {
797 shandle.
size = shape.Size() * mshadow::mshadow_sizeof(dtype);
802 storage_shape = shape;
806 bool delay_alloc_,
int dtype,
const std::vector<int> &aux_types_,
807 const std::vector<TShape> &aux_shapes_)
808 : static_data(false), delay_alloc(delay_alloc_), storage_type(storage_type_),
809 aux_types(aux_types_), ctx(ctx_), storage_shape(storage_shape_),
810 aux_shapes(aux_shapes_) {
814 for (
size_t i = 0; i < aux_shapes.size(); i++) {
815 CheckAndAllocAuxData(i, aux_shapes[i]);
818 aux_handles[i].ctx = ctx;
821 CheckAndAllocData(storage_shape, dtype);
826 const std::vector<TBlob> &aux_data,
int dev_id)
827 : static_data(true), delay_alloc(false), storage_type(storage_type_) {
828 using namespace mshadow;
833 if (data.
dev_mask() == cpu::kDevMask) {
836 CHECK_EQ(data.
dev_mask(), gpu::kDevMask);
843 storage_shape = data.
shape_;
845 for (
const auto &aux : aux_data) {
847 aux_handle.
ctx = ctx;
848 aux_handle.
dptr = aux.dptr_;
849 aux_handle.
size = aux.shape_.Size() * mshadow_sizeof(aux.type_flag_);
850 aux_handles.push_back(aux_handle);
851 aux_types.emplace_back(aux.type_flag_);
852 aux_shapes.emplace_back(aux.shape_);
857 inline void set_aux_shape(
const size_t i,
const TShape& shape) {
858 aux_shapes[i] = shape;
859 if (storage_shape.ndim() > 0) {
861 storage_shape[0] = shape[0];
863 storage_shape[0] = shape[0];
869 inline void CheckAndAlloc(
void) {
872 #if MXNET_USE_MKLDNN == 1 881 void CheckAndAlloc(uint64_t dbytes) {
883 <<
"CheckAndAlloc(dbytes) is only intended for kDefaultStorage";
884 dbytes =
std::max(dbytes, static_cast<uint64_t>(shandle.
size));
887 #if MXNET_USE_MKLDNN == 1 891 }
else if (shandle.
size < dbytes) {
896 #if MXNET_USE_MKLDNN == 1 902 inline void CheckAndAlloc(
const TShape &shape,
const std::vector<TShape> &aux_shapes,
909 TShape storage_shape(shape);
910 storage_shape[0] = aux_shape[0];
911 CheckAndAllocData(storage_shape, dtype);
915 CheckAndAllocData(aux_shapes[
csr::kIdx], dtype);
917 LOG(FATAL) <<
"Storage type " << storage_type <<
" not implemented for CheckAndAlloc";
924 void CheckAndAllocData(
const TShape &shape,
int dtype);
926 #if MXNET_USE_MKLDNN == 1 929 void SetMKLMem(
const TShape &shape,
int dtype);
932 void Reorder2Default();
934 void MKLDNNDataReorder(
const mkldnn::memory::primitive_desc &desc);
935 bool IsMKLDNN()
const;
936 bool IsDefault()
const;
944 inline void CheckAndAllocAuxData(
size_t i,
const TShape &shape) {
945 CHECK_EQ(shape.ndim(), 1) <<
"shape must be 1D in CheckAndAllocAuxData";
947 <<
"storage type cannot be kUndefinedStorage in CheckAndAllocAuxData";
949 <<
"storage type cannot be kDefaultStorage in CheckAndAllocAuxData";
950 if (aux_handles.size() <= i) {
951 aux_handles.resize(i + 1);
953 size_t aux_bytes = shape.Size() * mshadow::mshadow_sizeof(aux_types[i]);
954 if (aux_handles[i].size < aux_bytes) {
961 set_aux_shape(i, shape);
967 void SetTBlob()
const;
970 std::shared_ptr<Chunk> ptr_{
nullptr};
974 size_t byte_offset_ = 0;
982 nnvm::NodeEntry entry_;
990 mutable TBlob tblob_;
1153 typedef std::function<void (
NDArray **used_vars,
1177 :
public dmlc::FunctionRegEntryBase<NDArrayFunctionReg,
1178 NDArrayAPIFunction> {
1204 int num_params,
char **param_keys,
char **param_vals) {
1205 (*fsetvalue)(s[0], mutate_vars[0]);
1207 num_mutate_vars = 1; num_scalars = 1;
1208 this->add_argument(
"src",
"real_t",
"Source input to the function.");
1221 body = [fternary](
NDArray **used_vars,
1223 int num_params,
char **param_keys,
char **param_vals) {
1224 (*fternary)(*used_vars[0], *used_vars[1], *used_vars[2], mutate_vars[0]);
1226 num_use_vars = 3; num_mutate_vars = 1;
1228 this->add_argument(
"lhs",
"NDArray",
"Left operand to the function.");
1229 this->add_argument(
"mhs",
"NDArray",
"Middle operand to the function.");
1230 this->add_argument(
"rhs",
"NDArray",
"Right operand to the function.");
1243 int num_params,
char **param_keys,
char **param_vals) {
1244 (*fbinary)(*used_vars[0], *used_vars[1], mutate_vars[0]);
1246 num_use_vars = 2; num_mutate_vars = 1;
1248 this->add_argument(
"lhs",
"NDArray",
"Left operand to the function.");
1249 this->add_argument(
"rhs",
"NDArray",
"Right operand to the function.");
1262 int num_params,
char **param_keys,
char **param_vals) {
1263 (*fscalar)(*used_vars[0], s[0], mutate_vars[0]);
1265 num_use_vars = 1; num_mutate_vars = 1; num_scalars = 1;
1267 this->add_argument(
"lhs",
"NDArray",
"Left operand to the function.");
1268 this->add_argument(
"rhs",
"real_t",
"Right operand to the function.");
1280 int num_params,
char **param_keys,
char **param_vals) {
1281 (*funary)(*used_vars[0], mutate_vars[0]);
1283 num_use_vars = 1; num_mutate_vars = 1;
1285 this->add_argument(
"src",
"NDArray",
"Source input to the function.");
1295 void (*fgeneric)(
NDArray **used_vars,
1298 const std::map<std::string, std::string>& param)) {
1300 int num_params,
char **param_keys,
char **param_vals) {
1301 std::map<std::string, std::string> param;
1302 for (
int i = 0; i < num_params; ++i) {
1303 param[param_keys[i]] = param_vals[i];
1305 fgeneric(used_vars, s, mutate_vars, param);
1315 num_use_vars = n;
return *
this;
1323 num_mutate_vars = n;
return *
this;
1331 num_scalars = n;
return *
this;
1339 type_mask = tmask;
return *
this;
1354 #define MXNET_REGISTER_NDARRAY_FUN(name) \ 1355 DMLC_REGISTRY_REGISTER(::mxnet::NDArrayFunctionReg, NDArrayFunctionReg, name) 1363 #endif // MXNET_NDARRAY_H_
NDArrayStorageType
Definition: ndarray.h:61
NDArrayFunctionReg & set_num_mutate_vars(unsigned n)
set the number of mutate variables
Definition: ndarray.h:1322
NDArrayFormatErr
Definition: ndarray.h:68
Engine::VarHandle var() const
Definition: ndarray.h:326
void RandomSeed(uint32_t seed)
Seed all random number generator in mxnet.
NDArrayStorageType storage_type() const
Definition: ndarray.h:259
Engine that schedules all the operations according to dependency.
TShape shape_
shape of the tensor
Definition: tensor_blob.h:72
const TShape & storage_shape() const
Definition: ndarray.h:169
NDArrayFunctionReg()
constructor
Definition: ndarray.h:1190
namespace of mxnet
Definition: base.h:118
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:588
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:1314
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:126
static Context GPU(int32_t dev_id=-1)
int type_mask
information on how function should be called from API
Definition: ndarray.h:1186
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:1277
NDArray Detach() const
Return a copy of this NDArray without autograd history.
Definition: ndarray.h:563
int type_flag_
type flag of the tensor blob
Definition: tensor_blob.h:74
NDArrayFunctionReg & set_num_scalars(unsigned n)
set the number of scalar arguments
Definition: ndarray.h:1330
nnvm::TShape TShape
Shape data structure used to record shape information.
Definition: base.h:128
unsigned num_mutate_vars
number of variable mutated by this function
Definition: ndarray.h:1182
execution time context. The information needed in runtime for actual execution.
Definition: base.h:244
void * dptr
Pointer to the data.
Definition: storage.h:45
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:1258
Context ctx
Context information about device and ID.
Definition: storage.h:53
Storage::Handle storage_handle() const
get storage handle
Definition: ndarray.h:295
NDArray()
default constructor
Definition: ndarray.h:85
unsigned num_use_vars
number of variable used by this function
Definition: ndarray.h:1180
int shared_id
Definition: storage.h:58
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:1217
Symbol max(const std::string &symbol_name, Symbol data, dmlc::optional< Shape > axis=dmlc::optional< Shape >(), bool keepdims=false, bool exclude=false)
Definition: op.h:2391
RowSparseAuxType
Definition: ndarray.h:58
bool is_none() const
Definition: ndarray.h:263
all the scalar should go before use_vars
Definition: ndarray.h:1164
void SampleExponential(real_t lambda, NDArray *out)
Sample exponential distribution for each elements of out.
void SparseUpdateChunk(const NDArray &arr) const
Update ndarray chunk storage handles using existing ndarray storage handles Also update the aux_handl...
Definition: ndarray.h:519
void * dptr_
pointer to the data
Definition: tensor_blob.h:70
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:1173
const TShape & shape() const
Definition: ndarray.h:161
Definition: ndarray.h:1359
virtual void WaitForVar(VarHandle var)=0
Wait for a variable.
const std::vector< TShape > & aux_shapes() const
Definition: ndarray.h:188
bool IsView() const
Definition: ndarray.h:147
Context ctx() const
Definition: ndarray.h:244
void CopyFromTo(const NDArray &from, const NDArray *to, int priority=0)
issue an copy operation from one NDArray to another the two ndarray can sit on different devices this...
CSRAuxType
Definition: ndarray.h:54
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:305
virtual void PushAsync(AsyncFn exec_fun, 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, bool wait=false)=0
Push an asynchronous operation to the engine.
int dtype() const
Definition: ndarray.h:251
bool storage_initialized() const
Returns true if a sparse ndarray's aux_data and storage are initialized Throws an exception if the in...
Definition: ndarray.h:274
Storage handle.
Definition: storage.h:41
static Context CPUShared(int32_t dev_id=0)
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:208
void CheckAndAllocData(const TShape &storage_shape) const
Definition: ndarray.h:604
size_t num_aux_data(NDArrayStorageType stype)
NDArrayFunctionReg & set_type_mask(int tmask)
set type mask
Definition: ndarray.h:1338
engine::VarHandle VarHandle
Variable pointer.
Definition: engine.h:105
void WaitToWrite() const
Block until all the pending read/write operations with respect to current NDArray are finished...
Definition: ndarray.h:313
Handle Alloc(size_t size, Context ctx)
Allocate a new contiguous memory for a given size.
Definition: storage.h:66
NDArray operator-(const NDArray &lhs, const NDArray &rhs)
elementwise subtraction
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:1201
NDArray(int shared_pid, int shared_id, const TShape &shape, int dtype)
create ndarray from shared memory
Definition: ndarray.h:120
NDArray operator+(const NDArray &lhs, const NDArray &rhs)
elementwise add
size_t byte_offset() const
Definition: ndarray.h:330
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:1176
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:1239
static Context CPU(int32_t dev_id=0)
runtime functions for NDArray
Definition: imperative.h:56
int aux_type(size_t i) const
Definition: ndarray.h:254
OnComplete Callback to the engine, called by AsyncFn when action completes.
Definition: engine.h:56
all the use_vars should go before scalar
Definition: ndarray.h:1162
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:497
void CheckAndAlloc(const std::vector< TShape > &aux_shapes) const
Definition: ndarray.h:599
unsigned num_scalars
number of scalars used by this function
Definition: ndarray.h:1184
const TBlob & data() const
Definition: ndarray.h:215
void CheckAndAllocAuxData(size_t i, const TShape &aux_shape) const
Definition: ndarray.h:609
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:135
void CheckAndAlloc() const
Allocate the space if it is delayed allocated. This is an internal function used by system that norma...
Definition: ndarray.h:574
mshadow::index_t index_t
index type usually use unsigned
Definition: base.h:124
size_t size
Size of the storage.
Definition: storage.h:49
TBlob aux_data(size_t i) const
Definition: ndarray.h:228
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:133
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:181
ndarray interface
Definition: ndarray.h:82
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:114
int dev_mask() const
device mask of the corresponding device
Definition: tensor_blob.h:209
Symbol Reshape(const std::string &symbol_name, Symbol data, Shape shape=Shape(), bool reverse=false, Shape target_shape=Shape(), bool keep_highest=false)
Definition: op.h:302
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:1158
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:1294
int shared_pid
Id for IPC shared memory.
Definition: storage.h:57
tensor blob class that can be used to hold tensor of any dimension, any device and any data type...
Definition: tensor_blob.h:66
const std::vector< int > & aux_types() const
Definition: ndarray.h:195
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:94
NDArray operator/(const NDArray &lhs, const NDArray &rhs)
elementwise division
NDArrayFunctionTypeMask
mask information on how functions can be exposed
Definition: ndarray.h:1160