25 #ifndef __HOMOGEN_TENSOR_H__
26 #define __HOMOGEN_TENSOR_H__
28 #include "services/daal_defines.h"
29 #include "data_management/data/tensor.h"
30 #include "data_management/data/data_serialize.h"
34 namespace data_management
49 template<
typename DataType = DAAL_DATA_TYPE>
50 class DAAL_EXPORT HomogenTensor :
public Tensor
53 DECLARE_SERIALIZABLE_TAG();
54 DECLARE_SERIALIZABLE_IMPL();
56 DAAL_CAST_OPERATOR(HomogenTensor<DataType>);
63 Tensor(&_layout), _allocatedSize(0), _layout(services::Collection<size_t>(0, 0))
71 static services::SharedPtr<HomogenTensor<DataType> > create(services::Status *stat = NULL)
73 DAAL_DEFAULT_CREATE_TEMPLATE_IMPL(HomogenTensor, DataType);
83 HomogenTensor(
size_t nDim,
const size_t *dimSizes, DataType *data) : Tensor(&_layout), _layout(services::Collection<size_t>(nDim, dimSizes))
85 _ptr = services::SharedPtr<byte>((byte*)data, services::EmptyDeleter());
90 _allocatedSize = getSize();
91 _memStatus = userAllocated;
96 this->_status |= services::ErrorNullParameterNotSupported;
109 static services::SharedPtr<HomogenTensor<DataType> > create(
size_t nDim,
const size_t *dimSizes, DataType *data,
110 services::Status *stat = NULL)
112 return create(nDim, dimSizes, services::SharedPtr<DataType>(data, services::EmptyDeleter()), stat);
122 HomogenTensor(
size_t nDim,
const size_t *dimSizes,
const services::SharedPtr<DataType>& data) : Tensor(&_layout), _layout(services::Collection<size_t>(nDim, dimSizes))
124 _ptr = services::reinterpretPointerCast<byte, DataType>(data);
129 _allocatedSize = getSize();
130 _memStatus = userAllocated;
135 this->_status |= services::ErrorNullParameterNotSupported;
148 static services::SharedPtr<HomogenTensor<DataType> > create(
size_t nDim,
const size_t *dimSizes,
149 const services::SharedPtr<DataType>& data,
150 services::Status *stat = NULL)
152 DAAL_DEFAULT_CREATE_TEMPLATE_IMPL_EX(HomogenTensor, DataType, nDim, dimSizes, data);
161 HomogenTensor(
const services::Collection<size_t> &dims, DataType *data);
170 static services::SharedPtr<HomogenTensor<DataType> > create(
const services::Collection<size_t> &dims, DataType *data,
171 services::Status *stat = NULL)
173 return create(dims, services::SharedPtr<DataType>(data, services::EmptyDeleter()), stat);
182 HomogenTensor(
const services::Collection<size_t> &dims,
const services::SharedPtr<DataType> &data);
191 static services::SharedPtr<HomogenTensor<DataType> > create(
const services::Collection<size_t> &dims,
192 const services::SharedPtr<DataType> &data,
193 services::Status *stat = NULL)
195 DAAL_DEFAULT_CREATE_TEMPLATE_IMPL_EX(HomogenTensor, DataType, dims, data);
204 HomogenTensor(
const TensorOffsetLayout &layout, DataType *data) : Tensor(&_layout), _layout(layout)
206 const services::Collection<size_t>& dims = layout.getDimensions();
207 _ptr = services::SharedPtr<byte>((byte*)data, services::EmptyDeleter());
212 _allocatedSize = getSize();
213 _memStatus = userAllocated;
216 size_t nDim = dims.size();
220 this->_status |= services::ErrorNullParameterNotSupported;
232 static services::SharedPtr<HomogenTensor<DataType> > create(
const TensorOffsetLayout &layout, DataType *data,
233 services::Status *stat = NULL)
235 return create(layout, services::SharedPtr<DataType>(data, services::EmptyDeleter()), stat);
244 HomogenTensor(
const TensorOffsetLayout &layout,
const services::SharedPtr<DataType> &data) : Tensor(&_layout), _layout(layout)
246 const services::Collection<size_t>& dims = layout.getDimensions();
247 _ptr = services::reinterpretPointerCast<byte, DataType>(data);
252 _allocatedSize = getSize();
253 _memStatus = userAllocated;
256 size_t nDim = dims.size();
260 this->_status |= services::ErrorNullParameterNotSupported;
272 static services::SharedPtr<HomogenTensor<DataType> > create(
const TensorOffsetLayout &layout,
const services::SharedPtr<DataType> &data,
273 services::Status *stat = NULL)
275 DAAL_DEFAULT_CREATE_TEMPLATE_IMPL_EX(HomogenTensor, DataType, layout, data);
284 HomogenTensor(
const services::Collection<size_t> &dims, AllocationFlag memoryAllocationFlag) : Tensor(&_layout),
285 _allocatedSize(0), _layout(dims)
287 if( memoryAllocationFlag == doAllocate )
289 this->_status |= allocateDataMemoryImpl();
300 static services::SharedPtr<HomogenTensor<DataType> > create(
const services::Collection<size_t> &dims, AllocationFlag memoryAllocationFlag,
301 services::Status *stat = NULL)
303 DAAL_DEFAULT_CREATE_TEMPLATE_IMPL_EX(HomogenTensor, DataType, dims, memoryAllocationFlag);
313 HomogenTensor(
const services::Collection<size_t> &dims, AllocationFlag memoryAllocationFlag,
const DataType initValue):
314 Tensor(&_layout), _allocatedSize(0), _layout(dims)
316 if( memoryAllocationFlag == doAllocate )
318 this->_status |= allocateDataMemoryImpl();
319 this->_status |= assign(initValue);
331 static services::SharedPtr<HomogenTensor<DataType> > create(
const services::Collection<size_t> &dims, AllocationFlag memoryAllocationFlag,
332 const DataType initValue, services::Status *stat = NULL)
334 DAAL_DEFAULT_CREATE_TEMPLATE_IMPL_EX(HomogenTensor, DataType, dims, memoryAllocationFlag, initValue);
341 virtual ~HomogenTensor()
343 freeDataMemoryImpl();
351 DataType *getArray()
const
353 return (DataType*)_ptr.get();
360 services::SharedPtr<DataType> getArraySharedPtr()
const
362 return services::reinterpretPointerCast<DataType, byte>(_ptr);
369 services::Status setArray( DataType *
const ptr )
372 DAAL_CHECK_STATUS(s, freeDataMemoryImpl());
375 return services::Status(services::ErrorNullParameterNotSupported);
377 _ptr = services::SharedPtr<byte>((byte*)ptr, services::EmptyDeleter());
378 _memStatus = userAllocated;
386 services::Status setArray(
const services::SharedPtr<DataType>& ptr )
389 DAAL_CHECK_STATUS(s, freeDataMemoryImpl());
392 return services::Status(services::ErrorNullParameterNotSupported);
395 _memStatus = userAllocated;
403 TensorOffsetLayout& getTensorLayout()
412 virtual TensorOffsetLayout createDefaultSubtensorLayout() const DAAL_C11_OVERRIDE
414 return TensorOffsetLayout(_layout);
421 virtual TensorOffsetLayout createRawSubtensorLayout() const DAAL_C11_OVERRIDE
423 TensorOffsetLayout layout(_layout);
424 layout.sortOffsets();
429 virtual services::Status setDimensions(
size_t nDim,
const size_t *dimSizes) DAAL_C11_OVERRIDE
433 return services::Status(services::ErrorNullParameterNotSupported);
436 _layout = TensorOffsetLayout(services::Collection<size_t>(nDim, dimSizes));
437 return services::Status();
440 virtual services::Status setDimensions(
const services::Collection<size_t>& dimensions) DAAL_C11_OVERRIDE
442 if(!dimensions.size())
444 return services::Status(services::ErrorNullParameterNotSupported);
447 _layout = TensorOffsetLayout(dimensions);
448 return services::Status();
455 services::Status assign(
const DataType initValue)
457 size_t size = getSize();
459 DataType * ptr = (DataType*)_ptr.get();
460 for(
size_t i = 0; i < size; i++)
464 return services::Status();
467 services::Status getSubtensorEx(
size_t fixedDims,
const size_t *fixedDimNums,
size_t rangeDimIdx,
size_t rangeDimNum,
468 ReadWriteMode rwflag, SubtensorDescriptor<double> &block,
469 const TensorOffsetLayout& layout) DAAL_C11_OVERRIDE;
470 services::Status getSubtensorEx(
size_t fixedDims,
const size_t *fixedDimNums,
size_t rangeDimIdx,
size_t rangeDimNum,
471 ReadWriteMode rwflag, SubtensorDescriptor<float> &block,
472 const TensorOffsetLayout& layout) DAAL_C11_OVERRIDE;
473 services::Status getSubtensorEx(
size_t fixedDims,
const size_t *fixedDimNums,
size_t rangeDimIdx,
size_t rangeDimNum,
474 ReadWriteMode rwflag, SubtensorDescriptor<int> &block,
475 const TensorOffsetLayout& layout) DAAL_C11_OVERRIDE;
477 services::Status getSubtensor(
size_t fixedDims,
const size_t* fixedDimNums,
size_t rangeDimIdx,
size_t rangeDimNum,
478 ReadWriteMode rwflag, SubtensorDescriptor<double>& 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<float>& subtensor ) DAAL_C11_OVERRIDE
486 return getSubtensorEx(fixedDims, fixedDimNums, rangeDimIdx, rangeDimNum, rwflag, subtensor, _layout );
489 services::Status getSubtensor(
size_t fixedDims,
const size_t* fixedDimNums,
size_t rangeDimIdx,
size_t rangeDimNum,
490 ReadWriteMode rwflag, SubtensorDescriptor<int>& subtensor ) DAAL_C11_OVERRIDE
492 return getSubtensorEx(fixedDims, fixedDimNums, rangeDimIdx, rangeDimNum, rwflag, subtensor, _layout );
495 services::Status releaseSubtensor(SubtensorDescriptor<double> &block) DAAL_C11_OVERRIDE;
496 services::Status releaseSubtensor(SubtensorDescriptor<float> &block) DAAL_C11_OVERRIDE;
497 services::Status releaseSubtensor(SubtensorDescriptor<int> &block) DAAL_C11_OVERRIDE;
499 DAAL_DEPRECATED_VIRTUAL
virtual services::SharedPtr<Tensor> getSampleTensor(
size_t firstDimIndex) DAAL_C11_OVERRIDE
501 services::Collection<size_t> newDims = getDimensions();
502 if(!_ptr || newDims.size() == 0 || newDims[0] <= firstDimIndex) {
return services::SharedPtr<Tensor>(); }
504 const size_t *_dimOffsets = &((_layout.getOffsets())[0]);
505 services::SharedPtr<DataType> shiftedPtr(services::reinterpretPointerCast<DataType, byte>(_ptr), (DataType*)_ptr.get() + _dimOffsets[0] * firstDimIndex);
507 return HomogenTensor<DataType>::create(newDims, shiftedPtr, &st);
514 HomogenTensor(services::Status &st) :
515 Tensor(&_layout, st), _allocatedSize(0), _layout(services::Collection<size_t>(0, 0))
521 HomogenTensor(
size_t nDim,
const size_t *dimSizes,
const services::SharedPtr<DataType>& data, services::Status &st) :
522 Tensor(&_layout, st), _layout(services::Collection<size_t>(nDim, dimSizes))
524 _ptr = services::reinterpretPointerCast<byte, DataType>(data);
529 _allocatedSize = getSize();
530 _memStatus = userAllocated;
535 st |= services::ErrorNullParameterNotSupported;
543 HomogenTensor(
const services::Collection<size_t> &dims,
const services::SharedPtr<DataType> &data, services::Status &st);
548 HomogenTensor(
const TensorOffsetLayout &layout,
const services::SharedPtr<DataType> &data,
549 services::Status &st) :
550 Tensor(&_layout, st), _layout(layout)
552 const services::Collection<size_t>& dims = layout.getDimensions();
553 _ptr = services::reinterpretPointerCast<byte, DataType>(data);
558 _allocatedSize = getSize();
559 _memStatus = userAllocated;
562 size_t nDim = dims.size();
566 st |= services::ErrorNullParameterNotSupported;
574 HomogenTensor(
const services::Collection<size_t> &dims, AllocationFlag memoryAllocationFlag,
575 services::Status &st) :
576 Tensor(&_layout, st), _allocatedSize(0), _layout(dims)
578 if( memoryAllocationFlag == doAllocate )
580 st |= allocateDataMemoryImpl();
587 HomogenTensor(
const services::Collection<size_t> &dims, AllocationFlag memoryAllocationFlag,
const DataType initValue,
588 services::Status &st):
589 Tensor(&_layout, st), _allocatedSize(0), _layout(dims)
591 if(memoryAllocationFlag == doAllocate)
593 st |= allocateDataMemoryImpl();
596 st |= assign(initValue);
600 template<
typename Archive,
bool onDeserialize>
601 services::Status serialImpl( Archive *archive )
603 Tensor::serialImpl<Archive, onDeserialize>( archive );
605 archive->setObj( &_layout );
607 bool isAllocated = (_memStatus != notAllocated);
608 archive->set( isAllocated );
612 freeDataMemoryImpl();
616 allocateDataMemoryImpl();
620 if(_memStatus != notAllocated)
622 archive->set( (DataType*)_ptr.get(), getSize() );
625 return services::Status();
628 virtual services::Status allocateDataMemoryImpl(daal::MemType type = daal::dram) DAAL_C11_OVERRIDE
631 DAAL_CHECK_STATUS(s, freeDataMemoryImpl());
633 size_t size = getSize();
637 return services::Status();
640 _ptr = services::SharedPtr<byte>((byte *)daal::services::daal_malloc(size *
sizeof(DataType)), services::ServiceDeleter());
644 return services::Status(services::ErrorMemoryAllocationFailed);
647 _allocatedSize = getSize();
648 _memStatus = internallyAllocated;
649 return services::Status();
653 virtual services::Status freeDataMemoryImpl() DAAL_C11_OVERRIDE
656 _ptr = services::SharedPtr<byte>();
658 _memStatus = notAllocated;
659 return services::Status();
663 template <
typename T>
664 services::Status getTSubtensor(
size_t fixedDims,
const size_t *fixedDimNums,
size_t rangeDimIdx,
size_t rangeDimNum,
int rwFlag,
665 SubtensorDescriptor<T> &block,
const TensorOffsetLayout& layout );
666 template <
typename T>
667 services::Status releaseTSubtensor( SubtensorDescriptor<T> &block );
670 services::SharedPtr<byte> _ptr;
671 size_t _allocatedSize;
672 TensorOffsetLayout _layout;
677 using interface1::HomogenTensor;
daal::data_management::interface1::HomogenTensor::setArray
services::Status setArray(const services::SharedPtr< DataType > &ptr)
Definition: homogen_tensor.h:386
daal::data_management::interface1::TensorLayout::getDimensions
const services::Collection< size_t > & getDimensions() const
Definition: tensor.h:177
daal::data_management::interface1::HomogenTensor::getTensorLayout
TensorOffsetLayout & getTensorLayout()
Definition: homogen_tensor.h:403
daal::data_management::interface1::HomogenTensor::HomogenTensor
HomogenTensor(size_t nDim, const size_t *dimSizes, const services::SharedPtr< DataType > &data)
Definition: homogen_tensor.h:122
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:483
daal::data_management::interface1::HomogenTensor::getSampleTensor
virtual DAAL_DEPRECATED_VIRTUAL services::SharedPtr< Tensor > getSampleTensor(size_t firstDimIndex) DAAL_C11_OVERRIDE
Definition: homogen_tensor.h:499
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:50
daal::data_management::interface1::HomogenTensor::assign
services::Status assign(const DataType initValue)
Definition: homogen_tensor.h:455
daal::algorithms::association_rules::data
Definition: apriori_types.h:83
daal::services::ErrorNullParameterNotSupported
Definition: error_indexes.h:75
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:148
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:331
daal::data_management::interface1::HomogenTensor::setArray
services::Status setArray(DataType *const ptr)
Definition: homogen_tensor.h:369
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:272
daal::data_management::interface1::HomogenTensor::getArraySharedPtr
services::SharedPtr< DataType > getArraySharedPtr() const
Definition: homogen_tensor.h:360
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:489
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:477
daal::data_management::interface1::TensorIface::AllocationFlag
AllocationFlag
Enumeration to specify whether the Numeric Table must allocate memory.
Definition: tensor.h:81
daal::data_management::interface1::HomogenTensor::getArray
DataType * getArray() const
Definition: homogen_tensor.h:351
daal::MemType
MemType
Definition: daal_defines.h:147
daal::data_management::interface1::HomogenTensor::setDimensions
virtual services::Status setDimensions(size_t nDim, const size_t *dimSizes) DAAL_C11_OVERRIDE
Definition: homogen_tensor.h:429
daal::data_management::interface1::HomogenTensor::HomogenTensor
HomogenTensor(const services::Collection< size_t > &dims, AllocationFlag memoryAllocationFlag)
Definition: homogen_tensor.h:284
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:300
daal::data_management::interface1::TensorOffsetLayout
Class for a data management component responsible for representation of data layout in the HomogenTen...
Definition: tensor.h:205
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:109
daal::data_management::interface1::HomogenTensor::HomogenTensor
HomogenTensor(const TensorOffsetLayout &layout, DataType *data)
Definition: homogen_tensor.h:204
daal::dram
Definition: daal_defines.h:149
daal::services::daal_malloc
DAAL_EXPORT void * daal_malloc(size_t size, size_t alignment=DAAL_MALLOC_DEFAULT_ALIGNMENT)
daal::data_management::interface1::SubtensorDescriptor
Class with descriptor of the subtensor retrieved from Tensor getSubTensor function.
Definition: subtensor.h:49
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:170
daal::services::ErrorMemoryAllocationFailed
Definition: error_indexes.h:150
daal::data_management::interface1::HomogenTensor::createRawSubtensorLayout
virtual TensorOffsetLayout createRawSubtensorLayout() const DAAL_C11_OVERRIDE
Definition: homogen_tensor.h:421
daal::data_management::interface1::HomogenTensor::setDimensions
virtual services::Status setDimensions(const services::Collection< size_t > &dimensions) DAAL_C11_OVERRIDE
Definition: homogen_tensor.h:440
daal::data_management::interface1::Tensor
Class for a data management component responsible for representation of data in the n-dimensions nume...
Definition: tensor.h:484
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:232
daal::data_management::interface1::HomogenTensor::HomogenTensor
HomogenTensor(size_t nDim, const size_t *dimSizes, DataType *data)
Definition: homogen_tensor.h:83
daal::data_management::interface1::HomogenTensor::createDefaultSubtensorLayout
virtual TensorOffsetLayout createDefaultSubtensorLayout() const DAAL_C11_OVERRIDE
Definition: homogen_tensor.h:412
daal::data_management::interface1::HomogenTensor::HomogenTensor
HomogenTensor(const services::Collection< size_t > &dims, AllocationFlag memoryAllocationFlag, const DataType initValue)
Definition: homogen_tensor.h:313
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:191
daal::data_management::interface1::HomogenTensor::create
static services::SharedPtr< HomogenTensor< DataType > > create(services::Status *stat=NULL)
Definition: homogen_tensor.h:71
daal::data_management::interface1::HomogenTensor::HomogenTensor
HomogenTensor(const TensorOffsetLayout &layout, const services::SharedPtr< DataType > &data)
Definition: homogen_tensor.h:244
daal::data_management::interface1::HomogenTensor::HomogenTensor
HomogenTensor()
Definition: homogen_tensor.h:62