28 #include "services/error_handling.h"
29 #include "services/daal_memory.h"
30 #include "services/collection.h"
31 #include "data_management/data/data_archive.h"
32 #include "data_management/data/numeric_types.h"
36 namespace data_management
52 template<
typename DataType>
class SubtensorDescriptor;
55 typedef services::SharedPtr<Tensor> TensorPtr;
74 internallyAllocated = 2
91 virtual ~TensorIface()
99 virtual services::Status setDimensions(
size_t ndim,
const size_t* dimSizes) = 0;
106 virtual services::Status setDimensions(
const services::Collection<size_t>& dimensions) = 0;
112 DAAL_DEPRECATED_VIRTUAL
virtual services::Status allocateDataMemory(daal::MemType type = daal::dram) = 0;
118 DAAL_DEPRECATED_VIRTUAL
virtual services::Status freeDataMemory() = 0;
120 virtual services::Status resize(
const services::Collection<size_t>& dimensions) = 0;
127 virtual services::Status check(
const char *description)
const = 0;
134 DAAL_DEPRECATED_VIRTUAL
virtual TensorPtr getSampleTensor(
size_t firstDimIndex) = 0;
143 class DAAL_EXPORT TensorLayoutIface
149 virtual ~TensorLayoutIface() {}
156 virtual services::Status shuffleDimensions(
const services::Collection<size_t>& dimsOrder) = 0;
165 class DAAL_EXPORT TensorLayout :
public SerializationIface,
public TensorLayoutIface
171 virtual ~TensorLayout() {}
177 const services::Collection<size_t>& getDimensions()
const
183 TensorLayout(
const services::Collection<size_t>& dims) : _dims(dims), _nDims(dims.size()) {}
186 services::Collection<size_t> _dims;
188 template<
typename Archive,
bool onDeserialize>
189 services::Status serialImpl( Archive *arch )
192 _nDims = _dims.size();
194 return services::Status();
198 typedef services::SharedPtr<TensorLayout> TensorLayoutPtr;
205 class DAAL_EXPORT TensorOffsetLayout :
public TensorLayout
211 TensorOffsetLayout(
const TensorOffsetLayout& inLayout) : TensorLayout(inLayout.getDimensions()),
212 _offsets(inLayout.getOffsets()), _indices(inLayout.getIndices()), _isDefaultLayout(inLayout._isDefaultLayout),
213 _isRawLayout(inLayout._isRawLayout)
221 TensorOffsetLayout(
const services::Collection<size_t>& dims) : TensorLayout(dims), _offsets(dims.size()), _indices(dims.size()),
222 _isDefaultLayout(true), _isRawLayout(true)
224 if(_nDims==0)
return;
226 size_t lastIndex = _nDims-1;
228 _offsets[lastIndex]=1;
230 for(
size_t i=1; i<_nDims; i++)
232 _offsets[lastIndex-i] = _offsets[lastIndex-i+1]*_dims[lastIndex-i+1];
236 _isDefaultLayout =
true;
247 DAAL_DEPRECATED TensorOffsetLayout(
const services::Collection<size_t>& dims,
const services::Collection<size_t>& offsets,
248 const services::Collection<size_t>& indices) : TensorLayout(dims)
250 if(_nDims==0)
return;
251 if(dims.size()==offsets.size())
return;
262 virtual ~TensorOffsetLayout() {}
269 const services::Collection<size_t>& getOffsets()
const
279 const services::Collection<size_t>& getIndices()
const
291 bool isLayout(
const TensorOffsetLayout & layout)
const
293 if( !(_nDims == layout.getDimensions().size()) )
return false;
295 const services::Collection<size_t> & dims = layout.getDimensions();
296 const services::Collection<size_t> & offsets = layout.getOffsets();
299 int offsetsMatch = 0;
300 for(
size_t i = 0; i < _nDims; i++)
302 dimsMatch += _dims[i] == dims[i];
303 offsetsMatch += _offsets[i] == offsets[i];
305 return (dimsMatch == _nDims) && (offsetsMatch == _nDims);
308 bool isDefaultLayout()
const
310 return _isDefaultLayout;
313 bool isRawLayout()
const
318 virtual services::Status shuffleDimensions(
const services::Collection<size_t>& dimsOrder) DAAL_C11_OVERRIDE;
320 services::Status sortOffsets();
322 virtual int getSerializationTag() const DAAL_C11_OVERRIDE
324 return SERIALIZATION_TENSOR_OFFSET_LAYOUT_ID;
327 DECLARE_SERIALIZABLE_IMPL();
330 services::Collection<size_t> _offsets;
331 services::Collection<size_t> _indices;
333 bool _isDefaultLayout;
336 template<
typename Archive,
bool onDeserialize>
337 services::Status serialImpl( Archive *arch )
339 TensorLayout::serialImpl<Archive,onDeserialize>(arch);
343 arch->set(_isDefaultLayout);
344 arch->set(_isRawLayout);
346 return services::Status();
350 services::Status checkLayout();
359 class DenseTensorIface
365 virtual ~DenseTensorIface()
378 virtual services::Status getSubtensorEx(
size_t fixedDims,
const size_t* fixedDimNums,
size_t rangeDimIdx,
size_t rangeDimNum,
379 ReadWriteMode rwflag, SubtensorDescriptor<double>& subtensor,
const TensorOffsetLayout& layout ) = 0;
391 virtual services::Status getSubtensorEx(
size_t fixedDims,
const size_t* fixedDimNums,
size_t rangeDimIdx,
size_t rangeDimNum,
392 ReadWriteMode rwflag, SubtensorDescriptor<float>& subtensor,
const TensorOffsetLayout& layout ) = 0;
404 virtual services::Status getSubtensorEx(
size_t fixedDims,
const size_t* fixedDimNums,
size_t rangeDimIdx,
size_t rangeDimNum,
405 ReadWriteMode rwflag, SubtensorDescriptor<int>& subtensor,
const TensorOffsetLayout& layout ) = 0;
412 virtual services::Status releaseSubtensor(SubtensorDescriptor<double>& subtensor) = 0;
418 virtual services::Status releaseSubtensor(SubtensorDescriptor<float>& subtensor) = 0;
424 virtual services::Status releaseSubtensor(SubtensorDescriptor<int>& subtensor) = 0;
436 virtual services::Status getSubtensor(
size_t fixedDims,
const size_t* fixedDimNums,
size_t rangeDimIdx,
size_t rangeDimNum,
437 ReadWriteMode rwflag, SubtensorDescriptor<double>& subtensor )
439 return getSubtensorEx(fixedDims, fixedDimNums, rangeDimIdx, rangeDimNum, rwflag, subtensor, createDefaultSubtensorLayout() );
452 virtual services::Status getSubtensor(
size_t fixedDims,
const size_t* fixedDimNums,
size_t rangeDimIdx,
size_t rangeDimNum,
453 ReadWriteMode rwflag, SubtensorDescriptor<float>& subtensor )
455 return getSubtensorEx(fixedDims, fixedDimNums, rangeDimIdx, rangeDimNum, rwflag, subtensor, createDefaultSubtensorLayout() );
468 virtual services::Status getSubtensor(
size_t fixedDims,
const size_t* fixedDimNums,
size_t rangeDimIdx,
size_t rangeDimNum,
469 ReadWriteMode rwflag, SubtensorDescriptor<int>& subtensor )
471 return getSubtensorEx(fixedDims, fixedDimNums, rangeDimIdx, rangeDimNum, rwflag, subtensor, createDefaultSubtensorLayout() );
474 virtual TensorOffsetLayout createDefaultSubtensorLayout()
const = 0;
475 virtual TensorOffsetLayout createRawSubtensorLayout()
const = 0;
484 class DAAL_EXPORT Tensor :
public SerializationIface,
public TensorIface,
public DenseTensorIface
487 DAAL_CAST_OPERATOR(Tensor)
494 Tensor(TensorLayout *layoutPtr) : _layoutPtr(layoutPtr), _memStatus(notAllocated) {}
500 DAAL_DEPRECATED Tensor() : _layoutPtr(0), _memStatus(notAllocated) {}
511 MemoryStatus getDataMemoryStatus()
const {
return _memStatus; }
518 size_t getNumberOfDimensions()
const
520 return _layoutPtr->getDimensions().size();
530 size_t getDimensionSize(
size_t dimIdx)
const
532 if(getNumberOfDimensions() > dimIdx)
return (_layoutPtr->getDimensions())[dimIdx];
541 const services::Collection<size_t>& getDimensions()
const
543 return _layoutPtr->getDimensions();
551 DAAL_DEPRECATED services::SharedPtr<services::KernelErrorCollection> getErrors()
553 return _status.getCollection()->getErrors();
560 size_t getSize()
const;
568 size_t getSize(
size_t startingIdx,
size_t rangeSize)
const;
575 virtual services::Status check(
const char *description)
const DAAL_C11_OVERRIDE
577 if(_memStatus == notAllocated)
579 return services::Status(services::ErrorNullTensor);
582 size_t nDims = getNumberOfDimensions();
585 return services::Status(services::ErrorIncorrectNumberOfDimensionsInTensor);
590 return services::Status(services::ErrorIncorrectSizeOfDimensionInTensor);
593 return services::Status();
596 const TensorLayout* getLayoutPtr()
const
601 DAAL_DEPRECATED_VIRTUAL services::Status allocateDataMemory(daal::MemType type = daal::dram) DAAL_C11_OVERRIDE
603 return allocateDataMemoryImpl(type);
606 DAAL_DEPRECATED_VIRTUAL services::Status freeDataMemory() DAAL_C11_OVERRIDE
608 return freeDataMemoryImpl();
611 virtual services::Status resize(
const services::Collection<size_t>& dimensions) DAAL_C11_OVERRIDE
613 freeDataMemoryImpl();
614 services::Status s = setDimensions(dimensions);
617 s = allocateDataMemoryImpl();
622 MemoryStatus _memStatus;
623 services::Status _status;
625 Tensor(TensorLayout *layoutPtr, services::Status &st) : _layoutPtr(layoutPtr), _memStatus(notAllocated) {}
627 template<
typename Archive,
bool onDeserialize>
628 services::Status serialImpl( Archive *arch )
632 _memStatus = notAllocated;
635 return services::Status();
638 virtual services::Status allocateDataMemoryImpl(daal::MemType type = daal::dram) = 0;
640 virtual services::Status freeDataMemoryImpl() = 0;
643 TensorLayout *_layoutPtr;
648 using interface1::Tensor;
649 using interface1::TensorIface;
650 using interface1::TensorPtr;
651 using interface1::TensorOffsetLayout;
652 using interface1::TensorLayout;
653 using interface1::TensorLayoutPtr;
662 DAAL_EXPORT services::Status checkTensor(
const Tensor *tensor,
const char *description,
const services::Collection<size_t> *dims = NULL);
666 #include "data_management/data/subtensor.h"
daal::data_management::interface1::DenseTensorIface::getSubtensorEx
virtual services::Status getSubtensorEx(size_t fixedDims, const size_t *fixedDimNums, size_t rangeDimIdx, size_t rangeDimNum, ReadWriteMode rwflag, SubtensorDescriptor< double > &subtensor, const TensorOffsetLayout &layout)=0
daal::data_management::interface1::TensorLayout::getDimensions
const services::Collection< size_t > & getDimensions() const
Definition: tensor.h:177
daal::data_management::interface1::TensorOffsetLayout::getSerializationTag
virtual int getSerializationTag() const DAAL_C11_OVERRIDE
Definition: tensor.h:322
daal::data_management::interface1::TensorIface::setDimensions
virtual services::Status setDimensions(size_t ndim, const size_t *dimSizes)=0
daal::data_management::interface1::Tensor::getDataMemoryStatus
MemoryStatus getDataMemoryStatus() const
Definition: tensor.h:511
daal::data_management::interface1::Tensor::getDimensions
const services::Collection< size_t > & getDimensions() const
Definition: tensor.h:541
daal::data_management::interface1::TensorIface::allocateDataMemory
virtual DAAL_DEPRECATED_VIRTUAL services::Status allocateDataMemory(daal::MemType type=daal::dram)=0
daal::data_management::interface1::DenseTensorIface::getSubtensor
virtual services::Status getSubtensor(size_t fixedDims, const size_t *fixedDimNums, size_t rangeDimIdx, size_t rangeDimNum, ReadWriteMode rwflag, SubtensorDescriptor< int > &subtensor)
Definition: tensor.h:468
daal::data_management::interface1::Tensor::Tensor
DAAL_DEPRECATED Tensor()
Definition: tensor.h:500
daal::data_management::interface1::TensorIface::internallyAllocated
Definition: tensor.h:74
daal::data_management::interface1::TensorIface::doAllocate
Definition: tensor.h:85
daal::data_management::interface1::TensorLayoutIface
Abstract interface class for a data management component responsible for representation of data layou...
Definition: tensor.h:143
daal::data_management::interface1::TensorIface::check
virtual services::Status check(const char *description) const =0
daal::services::ErrorNullTensor
Definition: error_indexes.h:110
daal::data_management::interface1::TensorIface::doNotAllocate
Definition: tensor.h:83
daal::data_management::interface1::TensorIface
Abstract interface class for a data management component responsible for representation of data in th...
Definition: tensor.h:63
daal::data_management::interface1::TensorOffsetLayout::getIndices
const services::Collection< size_t > & getIndices() const
Definition: tensor.h:279
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::Tensor::allocateDataMemory
DAAL_DEPRECATED_VIRTUAL services::Status allocateDataMemory(daal::MemType type=daal::dram) DAAL_C11_OVERRIDE
Definition: tensor.h:601
daal::MemType
MemType
Definition: daal_defines.h:147
daal::data_management::interface1::Tensor::getDimensionSize
size_t getDimensionSize(size_t dimIdx) const
Definition: tensor.h:530
daal::data_management::interface1::TensorIface::MemoryStatus
MemoryStatus
Enumeration to specify the status of memory related to the Numeric Table.
Definition: tensor.h:70
daal::data_management::interface1::Tensor::getNumberOfDimensions
size_t getNumberOfDimensions() const
Definition: tensor.h:518
daal::data_management::interface1::DenseTensorIface
Abstract interface class for a data management component responsible for accessing data in the numeri...
Definition: tensor.h:359
daal::data_management::interface1::TensorOffsetLayout::isLayout
bool isLayout(const TensorOffsetLayout &layout) const
Definition: tensor.h:291
daal::data_management::interface1::SerializationIface
Abstract interface class that defines the interface for serialization and deserialization.
Definition: data_serialize.h:52
daal::data_management::interface1::DenseTensorIface::releaseSubtensor
virtual services::Status releaseSubtensor(SubtensorDescriptor< double > &subtensor)=0
daal::data_management::interface1::Tensor::getErrors
DAAL_DEPRECATED services::SharedPtr< services::KernelErrorCollection > getErrors()
Definition: tensor.h:551
daal::services::ErrorIncorrectSizeOfDimensionInTensor
Definition: error_indexes.h:112
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::TensorOffsetLayout::TensorOffsetLayout
TensorOffsetLayout(const services::Collection< size_t > &dims)
Definition: tensor.h:221
daal::data_management::interface1::DenseTensorIface::getSubtensor
virtual services::Status getSubtensor(size_t fixedDims, const size_t *fixedDimNums, size_t rangeDimIdx, size_t rangeDimNum, ReadWriteMode rwflag, SubtensorDescriptor< double > &subtensor)
Definition: tensor.h:436
daal::dram
Definition: daal_defines.h:149
daal::data_management::interface1::DenseTensorIface::getSubtensor
virtual services::Status getSubtensor(size_t fixedDims, const size_t *fixedDimNums, size_t rangeDimIdx, size_t rangeDimNum, ReadWriteMode rwflag, SubtensorDescriptor< float > &subtensor)
Definition: tensor.h:452
daal::data_management::interface1::SubtensorDescriptor
Class with descriptor of the subtensor retrieved from Tensor getSubTensor function.
Definition: subtensor.h:49
daal::data_management::interface1::TensorIface::notAllocated
Definition: tensor.h:72
daal::data_management::interface1::TensorLayout
Class for a data management component responsible for representation of data layout in the tensor...
Definition: tensor.h:165
daal::data_management::interface1::TensorIface::freeDataMemory
virtual DAAL_DEPRECATED_VIRTUAL services::Status freeDataMemory()=0
daal::data_management::interface1::TensorOffsetLayout::getOffsets
const services::Collection< size_t > & getOffsets() const
Definition: tensor.h:269
daal::data_management::checkTensor
DAAL_EXPORT services::Status checkTensor(const Tensor *tensor, const char *description, const services::Collection< size_t > *dims=NULL)
daal::data_management::interface1::TensorOffsetLayout::TensorOffsetLayout
DAAL_DEPRECATED TensorOffsetLayout(const services::Collection< size_t > &dims, const services::Collection< size_t > &offsets, const services::Collection< size_t > &indices)
Definition: tensor.h:247
daal::data_management::interface1::Tensor::check
virtual services::Status check(const char *description) const DAAL_C11_OVERRIDE
Definition: tensor.h:575
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::services::ErrorIncorrectNumberOfDimensionsInTensor
Definition: error_indexes.h:111
daal::data_management::interface1::Tensor::freeDataMemory
DAAL_DEPRECATED_VIRTUAL services::Status freeDataMemory() DAAL_C11_OVERRIDE
Definition: tensor.h:606
daal::data_management::interface1::TensorIface::notAllocate
Definition: tensor.h:84
daal::data_management::interface1::TensorIface::userAllocated
Definition: tensor.h:73
daal::data_management::interface1::TensorIface::getSampleTensor
virtual DAAL_DEPRECATED_VIRTUAL TensorPtr getSampleTensor(size_t firstDimIndex)=0