23 #ifndef __HOMOGEN_TENSOR_H__
24 #define __HOMOGEN_TENSOR_H__
26 #include "services/daal_defines.h"
27 #include "data_management/data/tensor.h"
28 #include "data_management/data/data_serialize.h"
32 namespace data_management
46 template<
typename DataType = DAAL_DATA_TYPE>
47 class DAAL_EXPORT HomogenTensor :
public Tensor
50 DECLARE_SERIALIZABLE_TAG();
51 DECLARE_SERIALIZABLE_IMPL();
53 DAAL_CAST_OPERATOR(HomogenTensor<DataType>);
60 Tensor(&_layout), _allocatedSize(0), _layout(services::Collection<size_t>(0, 0))
68 static services::SharedPtr<HomogenTensor<DataType> > create(services::Status *stat = NULL)
70 DAAL_DEFAULT_CREATE_TEMPLATE_IMPL(HomogenTensor, DataType);
80 HomogenTensor(
size_t nDim,
const size_t *dimSizes, DataType *data) : Tensor(&_layout), _layout(services::Collection<size_t>(nDim, dimSizes))
82 _ptr = services::SharedPtr<byte>((byte*)data, services::EmptyDeleter());
87 _allocatedSize = getSize();
88 _memStatus = userAllocated;
93 this->_status |= services::ErrorNullParameterNotSupported;
106 static services::SharedPtr<HomogenTensor<DataType> > create(
size_t nDim,
const size_t *dimSizes, DataType *data,
107 services::Status *stat = NULL)
109 return create(nDim, dimSizes, services::SharedPtr<DataType>(data, services::EmptyDeleter()), stat);
119 HomogenTensor(
size_t nDim,
const size_t *dimSizes,
const services::SharedPtr<DataType>& data) : Tensor(&_layout), _layout(services::Collection<size_t>(nDim, dimSizes))
121 _ptr = services::reinterpretPointerCast<byte, DataType>(data);
126 _allocatedSize = getSize();
127 _memStatus = userAllocated;
132 this->_status |= services::ErrorNullParameterNotSupported;
145 static services::SharedPtr<HomogenTensor<DataType> > create(
size_t nDim,
const size_t *dimSizes,
146 const services::SharedPtr<DataType>& data,
147 services::Status *stat = NULL)
149 DAAL_DEFAULT_CREATE_TEMPLATE_IMPL_EX(HomogenTensor, DataType, nDim, dimSizes, data);
158 HomogenTensor(
const services::Collection<size_t> &dims, DataType *data);
167 static services::SharedPtr<HomogenTensor<DataType> > create(
const services::Collection<size_t> &dims, DataType *data,
168 services::Status *stat = NULL)
170 return create(dims, services::SharedPtr<DataType>(data, services::EmptyDeleter()), stat);
179 HomogenTensor(
const services::Collection<size_t> &dims,
const services::SharedPtr<DataType> &data);
188 static services::SharedPtr<HomogenTensor<DataType> > create(
const services::Collection<size_t> &dims,
189 const services::SharedPtr<DataType> &data,
190 services::Status *stat = NULL)
192 DAAL_DEFAULT_CREATE_TEMPLATE_IMPL_EX(HomogenTensor, DataType, dims, data);
201 HomogenTensor(
const TensorOffsetLayout &layout, DataType *data) : Tensor(&_layout), _layout(layout)
203 const services::Collection<size_t>& dims = layout.getDimensions();
204 _ptr = services::SharedPtr<byte>((byte*)data, services::EmptyDeleter());
209 _allocatedSize = getSize();
210 _memStatus = userAllocated;
213 size_t nDim = dims.size();
217 this->_status |= services::ErrorNullParameterNotSupported;
229 static services::SharedPtr<HomogenTensor<DataType> > create(
const TensorOffsetLayout &layout, DataType *data,
230 services::Status *stat = NULL)
232 return create(layout, services::SharedPtr<DataType>(data, services::EmptyDeleter()), stat);
241 HomogenTensor(
const TensorOffsetLayout &layout,
const services::SharedPtr<DataType> &data) : Tensor(&_layout), _layout(layout)
243 const services::Collection<size_t>& dims = layout.getDimensions();
244 _ptr = services::reinterpretPointerCast<byte, DataType>(data);
249 _allocatedSize = getSize();
250 _memStatus = userAllocated;
253 size_t nDim = dims.size();
257 this->_status |= services::ErrorNullParameterNotSupported;
269 static services::SharedPtr<HomogenTensor<DataType> > create(
const TensorOffsetLayout &layout,
const services::SharedPtr<DataType> &data,
270 services::Status *stat = NULL)
272 DAAL_DEFAULT_CREATE_TEMPLATE_IMPL_EX(HomogenTensor, DataType, layout, data);
281 HomogenTensor(
const services::Collection<size_t> &dims, AllocationFlag memoryAllocationFlag) : Tensor(&_layout),
282 _allocatedSize(0), _layout(dims)
284 if( memoryAllocationFlag == doAllocate )
286 this->_status |= allocateDataMemoryImpl();
297 static services::SharedPtr<HomogenTensor<DataType> > create(
const services::Collection<size_t> &dims, AllocationFlag memoryAllocationFlag,
298 services::Status *stat = NULL)
300 DAAL_DEFAULT_CREATE_TEMPLATE_IMPL_EX(HomogenTensor, DataType, dims, memoryAllocationFlag);
310 HomogenTensor(
const services::Collection<size_t> &dims, AllocationFlag memoryAllocationFlag,
const DataType initValue):
311 Tensor(&_layout), _allocatedSize(0), _layout(dims)
313 if( memoryAllocationFlag == doAllocate )
315 this->_status |= allocateDataMemoryImpl();
316 this->_status |= assign(initValue);
328 static services::SharedPtr<HomogenTensor<DataType> > create(
const services::Collection<size_t> &dims, AllocationFlag memoryAllocationFlag,
329 const DataType initValue, services::Status *stat = NULL)
331 DAAL_DEFAULT_CREATE_TEMPLATE_IMPL_EX(HomogenTensor, DataType, dims, memoryAllocationFlag, initValue);
335 virtual ~HomogenTensor()
337 freeDataMemoryImpl();
345 DataType *getArray()
const
347 return (DataType*)_ptr.get();
354 services::SharedPtr<DataType> getArraySharedPtr()
const
356 return services::reinterpretPointerCast<DataType, byte>(_ptr);
363 services::Status setArray( DataType *
const ptr )
366 DAAL_CHECK_STATUS(s, freeDataMemoryImpl());
369 return services::Status(services::ErrorNullParameterNotSupported);
371 _ptr = services::SharedPtr<byte>((byte*)ptr, services::EmptyDeleter());
372 _memStatus = userAllocated;
380 services::Status setArray(
const services::SharedPtr<DataType>& ptr )
383 DAAL_CHECK_STATUS(s, freeDataMemoryImpl());
386 return services::Status(services::ErrorNullParameterNotSupported);
389 _memStatus = userAllocated;
397 TensorOffsetLayout& getTensorLayout()
406 virtual TensorOffsetLayout createDefaultSubtensorLayout() const DAAL_C11_OVERRIDE
408 return TensorOffsetLayout(_layout);
415 virtual TensorOffsetLayout createRawSubtensorLayout() const DAAL_C11_OVERRIDE
417 TensorOffsetLayout layout(_layout);
418 layout.sortOffsets();
423 virtual services::Status setDimensions(
size_t nDim,
const size_t *dimSizes) DAAL_C11_OVERRIDE
427 return services::Status(services::ErrorNullParameterNotSupported);
430 _layout = TensorOffsetLayout(services::Collection<size_t>(nDim, dimSizes));
431 return services::Status();
434 virtual services::Status setDimensions(
const services::Collection<size_t>& dimensions) DAAL_C11_OVERRIDE
436 if(!dimensions.size())
438 return services::Status(services::ErrorNullParameterNotSupported);
441 _layout = TensorOffsetLayout(dimensions);
442 return services::Status();
449 services::Status assign(
const DataType initValue)
451 size_t size = getSize();
453 DataType * ptr = (DataType*)_ptr.get();
454 for(
size_t i = 0; i < size; i++)
458 return services::Status();
461 services::Status getSubtensorEx(
size_t fixedDims,
const size_t *fixedDimNums,
size_t rangeDimIdx,
size_t rangeDimNum,
462 ReadWriteMode rwflag, SubtensorDescriptor<double> &block,
463 const TensorOffsetLayout& layout) DAAL_C11_OVERRIDE;
464 services::Status getSubtensorEx(
size_t fixedDims,
const size_t *fixedDimNums,
size_t rangeDimIdx,
size_t rangeDimNum,
465 ReadWriteMode rwflag, SubtensorDescriptor<float> &block,
466 const TensorOffsetLayout& layout) DAAL_C11_OVERRIDE;
467 services::Status getSubtensorEx(
size_t fixedDims,
const size_t *fixedDimNums,
size_t rangeDimIdx,
size_t rangeDimNum,
468 ReadWriteMode rwflag, SubtensorDescriptor<int> &block,
469 const TensorOffsetLayout& layout) DAAL_C11_OVERRIDE;
471 services::Status getSubtensor(
size_t fixedDims,
const size_t* fixedDimNums,
size_t rangeDimIdx,
size_t rangeDimNum,
472 ReadWriteMode rwflag, SubtensorDescriptor<double>& subtensor ) DAAL_C11_OVERRIDE
474 return getSubtensorEx(fixedDims, fixedDimNums, rangeDimIdx, rangeDimNum, rwflag, subtensor, _layout );
477 services::Status getSubtensor(
size_t fixedDims,
const size_t* fixedDimNums,
size_t rangeDimIdx,
size_t rangeDimNum,
478 ReadWriteMode rwflag, SubtensorDescriptor<float>& subtensor ) DAAL_C11_OVERRIDE
480 return getSubtensorEx(fixedDims, fixedDimNums, rangeDimIdx, rangeDimNum, rwflag, subtensor, _layout );
483 services::Status getSubtensor(
size_t fixedDims,
const size_t* fixedDimNums,
size_t rangeDimIdx,
size_t rangeDimNum,
484 ReadWriteMode rwflag, SubtensorDescriptor<int>& subtensor ) DAAL_C11_OVERRIDE
486 return getSubtensorEx(fixedDims, fixedDimNums, rangeDimIdx, rangeDimNum, rwflag, subtensor, _layout );
489 services::Status releaseSubtensor(SubtensorDescriptor<double> &block) DAAL_C11_OVERRIDE;
490 services::Status releaseSubtensor(SubtensorDescriptor<float> &block) DAAL_C11_OVERRIDE;
491 services::Status releaseSubtensor(SubtensorDescriptor<int> &block) DAAL_C11_OVERRIDE;
493 DAAL_DEPRECATED_VIRTUAL
virtual services::SharedPtr<Tensor> getSampleTensor(
size_t firstDimIndex) DAAL_C11_OVERRIDE
495 services::Collection<size_t> newDims = getDimensions();
496 if(!_ptr || newDims.size() == 0 || newDims[0] <= firstDimIndex) {
return services::SharedPtr<Tensor>(); }
498 const size_t *_dimOffsets = &((_layout.getOffsets())[0]);
499 services::SharedPtr<DataType> shiftedPtr(services::reinterpretPointerCast<DataType, byte>(_ptr), (DataType*)_ptr.get() + _dimOffsets[0] * firstDimIndex);
501 return HomogenTensor<DataType>::create(newDims, shiftedPtr, &st);
506 HomogenTensor(services::Status &st) :
507 Tensor(&_layout, st), _allocatedSize(0), _layout(services::Collection<size_t>(0, 0))
510 HomogenTensor(
size_t nDim,
const size_t *dimSizes,
const services::SharedPtr<DataType>& data, services::Status &st) :
511 Tensor(&_layout, st), _layout(services::Collection<size_t>(nDim, dimSizes))
513 _ptr = services::reinterpretPointerCast<byte, DataType>(data);
518 _allocatedSize = getSize();
519 _memStatus = userAllocated;
524 st |= services::ErrorNullParameterNotSupported;
529 HomogenTensor(
const services::Collection<size_t> &dims,
const services::SharedPtr<DataType> &data, services::Status &st);
531 HomogenTensor(
const TensorOffsetLayout &layout,
const services::SharedPtr<DataType> &data,
532 services::Status &st) :
533 Tensor(&_layout, st), _layout(layout)
535 const services::Collection<size_t>& dims = layout.getDimensions();
536 _ptr = services::reinterpretPointerCast<byte, DataType>(data);
541 _allocatedSize = getSize();
542 _memStatus = userAllocated;
545 size_t nDim = dims.size();
549 st |= services::ErrorNullParameterNotSupported;
554 HomogenTensor(
const services::Collection<size_t> &dims, AllocationFlag memoryAllocationFlag,
555 services::Status &st) :
556 Tensor(&_layout, st), _allocatedSize(0), _layout(dims)
558 if( memoryAllocationFlag == doAllocate )
560 st |= allocateDataMemoryImpl();
564 HomogenTensor(
const services::Collection<size_t> &dims, AllocationFlag memoryAllocationFlag,
const DataType initValue,
565 services::Status &st):
566 Tensor(&_layout, st), _allocatedSize(0), _layout(dims)
568 if(memoryAllocationFlag == doAllocate)
570 st |= allocateDataMemoryImpl();
573 st |= assign(initValue);
577 template<
typename Archive,
bool onDeserialize>
578 services::Status serialImpl( Archive *archive )
580 Tensor::serialImpl<Archive, onDeserialize>( archive );
582 archive->setObj( &_layout );
584 bool isAllocated = (_memStatus != notAllocated);
585 archive->set( isAllocated );
589 freeDataMemoryImpl();
593 allocateDataMemoryImpl();
597 if(_memStatus != notAllocated)
599 archive->set( (DataType*)_ptr.get(), getSize() );
602 return services::Status();
605 virtual services::Status allocateDataMemoryImpl(daal::MemType type = daal::dram) DAAL_C11_OVERRIDE
608 DAAL_CHECK_STATUS(s, freeDataMemoryImpl());
610 size_t size = getSize();
614 return services::Status();
617 _ptr = services::SharedPtr<byte>((byte *)daal::services::daal_malloc(size *
sizeof(DataType)), services::ServiceDeleter());
621 return services::Status(services::ErrorMemoryAllocationFailed);
624 _allocatedSize = getSize();
625 _memStatus = internallyAllocated;
626 return services::Status();
630 virtual services::Status freeDataMemoryImpl() DAAL_C11_OVERRIDE
633 _ptr = services::SharedPtr<byte>();
635 _memStatus = notAllocated;
636 return services::Status();
640 template <
typename T>
641 services::Status getTSubtensor(
size_t fixedDims,
const size_t *fixedDimNums,
size_t rangeDimIdx,
size_t rangeDimNum,
int rwFlag,
642 SubtensorDescriptor<T> &block,
const TensorOffsetLayout& layout );
643 template <
typename T>
644 services::Status releaseTSubtensor( SubtensorDescriptor<T> &block );
647 services::SharedPtr<byte> _ptr;
648 size_t _allocatedSize;
649 TensorOffsetLayout _layout;
654 using interface1::HomogenTensor;
daal::data_management::interface1::HomogenTensor::createDefaultSubtensorLayout
virtual TensorOffsetLayout createDefaultSubtensorLayout() const DAAL_C11_OVERRIDE
Definition: homogen_tensor.h:406
daal::data_management::interface1::HomogenTensor::HomogenTensor
HomogenTensor(const TensorOffsetLayout &layout, const services::SharedPtr< DataType > &data)
Definition: homogen_tensor.h:241
daal
Definition: algorithm_base_common.h:31
daal::data_management::interface1::Tensor
Class for a data management component responsible for representation of data in the n-dimensions nume...
Definition: tensor.h:455
daal::data_management::interface1::HomogenTensor::create
static services::SharedPtr< HomogenTensor< DataType > > create(size_t nDim, const size_t *dimSizes, const services::SharedPtr< DataType > &data, services::Status *stat=NULL)
Definition: homogen_tensor.h:145
daal::data_management::interface1::HomogenTensor::createRawSubtensorLayout
virtual TensorOffsetLayout createRawSubtensorLayout() const DAAL_C11_OVERRIDE
Definition: homogen_tensor.h:415
daal::data_management::interface1::HomogenTensor::setDimensions
virtual services::Status setDimensions(size_t nDim, const size_t *dimSizes) DAAL_C11_OVERRIDE
Definition: homogen_tensor.h:423
daal::data_management::interface1::HomogenTensor::getTensorLayout
TensorOffsetLayout & getTensorLayout()
Definition: homogen_tensor.h:397
daal::data_management::interface1::HomogenTensor::assign
services::Status assign(const DataType initValue)
Definition: homogen_tensor.h:449
daal::data_management::interface1::HomogenTensor::HomogenTensor
HomogenTensor()
Definition: homogen_tensor.h:59
daal::services::ErrorMemoryAllocationFailed
Definition: error_indexes.h:146
daal::dram
Definition: daal_defines.h:133
daal::data_management::interface1::HomogenTensor::getSubtensor
services::Status getSubtensor(size_t fixedDims, const size_t *fixedDimNums, size_t rangeDimIdx, size_t rangeDimNum, ReadWriteMode rwflag, SubtensorDescriptor< int > &subtensor) DAAL_C11_OVERRIDE
Definition: homogen_tensor.h:483
daal::data_management::interface1::HomogenTensor::create
static services::SharedPtr< HomogenTensor< DataType > > create(const services::Collection< size_t > &dims, AllocationFlag memoryAllocationFlag, services::Status *stat=NULL)
Definition: homogen_tensor.h:297
daal::data_management::interface1::HomogenTensor::getArraySharedPtr
services::SharedPtr< DataType > getArraySharedPtr() const
Definition: homogen_tensor.h:354
daal::data_management::interface1::HomogenTensor::HomogenTensor
HomogenTensor(size_t nDim, const size_t *dimSizes, DataType *data)
Definition: homogen_tensor.h:80
daal::data_management::interface1::HomogenTensor::setArray
services::Status setArray(const services::SharedPtr< DataType > &ptr)
Definition: homogen_tensor.h:380
daal::data_management::interface1::HomogenTensor::create
static services::SharedPtr< HomogenTensor< DataType > > create(const services::Collection< size_t > &dims, AllocationFlag memoryAllocationFlag, const DataType initValue, services::Status *stat=NULL)
Definition: homogen_tensor.h:328
daal::data_management::interface1::HomogenTensor::getArray
DataType * getArray() const
Definition: homogen_tensor.h:345
daal::data_management::interface1::HomogenTensor::HomogenTensor
HomogenTensor(const services::Collection< size_t > &dims, AllocationFlag memoryAllocationFlag, const DataType initValue)
Definition: homogen_tensor.h:310
daal::data_management::interface1::HomogenTensor::create
static services::SharedPtr< HomogenTensor< DataType > > create(const TensorOffsetLayout &layout, DataType *data, services::Status *stat=NULL)
Definition: homogen_tensor.h:229
daal::services::ErrorNullParameterNotSupported
Definition: error_indexes.h:73
daal::data_management::interface1::HomogenTensor::setArray
services::Status setArray(DataType *const ptr)
Definition: homogen_tensor.h:363
daal::services::daal_malloc
DAAL_EXPORT void * daal_malloc(size_t size, size_t alignment=DAAL_MALLOC_DEFAULT_ALIGNMENT)
daal::data_management::interface1::HomogenTensor::getSampleTensor
virtual DAAL_DEPRECATED_VIRTUAL services::SharedPtr< Tensor > getSampleTensor(size_t firstDimIndex) DAAL_C11_OVERRIDE
Definition: homogen_tensor.h:493
daal::algorithms::association_rules::data
Definition: apriori_types.h:81
daal::data_management::interface1::HomogenTensor::getSubtensor
services::Status getSubtensor(size_t fixedDims, const size_t *fixedDimNums, size_t rangeDimIdx, size_t rangeDimNum, ReadWriteMode rwflag, SubtensorDescriptor< float > &subtensor) DAAL_C11_OVERRIDE
Definition: homogen_tensor.h:477
daal::data_management::interface1::TensorIface::AllocationFlag
AllocationFlag
Enumeration to specify whether the Numeric Table must allocate memory.
Definition: tensor.h:77
daal::data_management::interface1::TensorOffsetLayout
Class for a data management component responsible for representation of data layout in the HomogenTen...
Definition: tensor.h:189
daal::data_management::interface1::HomogenTensor::HomogenTensor
HomogenTensor(const TensorOffsetLayout &layout, DataType *data)
Definition: homogen_tensor.h:201
daal::data_management::interface1::HomogenTensor::getSubtensor
services::Status getSubtensor(size_t fixedDims, const size_t *fixedDimNums, size_t rangeDimIdx, size_t rangeDimNum, ReadWriteMode rwflag, SubtensorDescriptor< double > &subtensor) DAAL_C11_OVERRIDE
Definition: homogen_tensor.h:471
daal::data_management::interface1::HomogenTensor::HomogenTensor
HomogenTensor(size_t nDim, const size_t *dimSizes, const services::SharedPtr< DataType > &data)
Definition: homogen_tensor.h:119
daal::data_management::interface1::HomogenTensor::setDimensions
virtual services::Status setDimensions(const services::Collection< size_t > &dimensions) DAAL_C11_OVERRIDE
Definition: homogen_tensor.h:434
daal::data_management::interface1::HomogenTensor
Class that provides methods to access data stored as a contiguous array of homogeneous data in rows-m...
Definition: homogen_tensor.h:47
daal::data_management::interface1::HomogenTensor::HomogenTensor
HomogenTensor(const services::Collection< size_t > &dims, AllocationFlag memoryAllocationFlag)
Definition: homogen_tensor.h:281
daal::data_management::interface1::SubtensorDescriptor
Class with descriptor of the subtensor retrieved from Tensor getSubTensor function.
Definition: subtensor.h:47
daal::data_management::interface1::HomogenTensor::create
static services::SharedPtr< HomogenTensor< DataType > > create(const services::Collection< size_t > &dims, DataType *data, services::Status *stat=NULL)
Definition: homogen_tensor.h:167
daal::data_management::interface1::HomogenTensor::create
static services::SharedPtr< HomogenTensor< DataType > > create(services::Status *stat=NULL)
Definition: homogen_tensor.h:68
daal::data_management::interface1::TensorLayout::getDimensions
const services::Collection< size_t > & getDimensions() const
Definition: tensor.h:162
daal::MemType
MemType
Definition: daal_defines.h:131
daal::data_management::interface1::HomogenTensor::create
static services::SharedPtr< HomogenTensor< DataType > > create(size_t nDim, const size_t *dimSizes, DataType *data, services::Status *stat=NULL)
Definition: homogen_tensor.h:106
daal::data_management::interface1::HomogenTensor::create
static services::SharedPtr< HomogenTensor< DataType > > create(const TensorOffsetLayout &layout, const services::SharedPtr< DataType > &data, services::Status *stat=NULL)
Definition: homogen_tensor.h:269
daal::data_management::interface1::HomogenTensor::create
static services::SharedPtr< HomogenTensor< DataType > > create(const services::Collection< size_t > &dims, const services::SharedPtr< DataType > &data, services::Status *stat=NULL)
Definition: homogen_tensor.h:188