52 #include "services/error_handling.h" 53 #include "services/daal_memory.h" 54 #include "services/collection.h" 55 #include "data_management/data/data_archive.h" 56 #include "data_management/data/numeric_types.h" 60 namespace data_management
75 template<
typename DataType>
class SubtensorDescriptor;
78 typedef services::SharedPtr<Tensor> TensorPtr;
96 internallyAllocated = 2
110 virtual ~TensorIface()
118 virtual services::Status setDimensions(
size_t ndim,
const size_t* dimSizes) = 0;
125 virtual services::Status setDimensions(
const services::Collection<size_t>& dimensions) = 0;
131 DAAL_DEPRECATED_VIRTUAL
virtual services::Status allocateDataMemory(daal::MemType type = daal::dram) = 0;
137 DAAL_DEPRECATED_VIRTUAL
virtual services::Status freeDataMemory() = 0;
139 virtual services::Status resize(
const services::Collection<size_t>& dimensions) = 0;
146 virtual services::Status check(
const char *description)
const = 0;
153 DAAL_DEPRECATED_VIRTUAL
virtual TensorPtr getSampleTensor(
size_t firstDimIndex) = 0;
161 class DAAL_EXPORT TensorLayoutIface
164 virtual ~TensorLayoutIface() {}
171 virtual services::Status shuffleDimensions(
const services::Collection<size_t>& dimsOrder) = 0;
179 class DAAL_EXPORT TensorLayout :
public SerializationIface,
public TensorLayoutIface
182 virtual ~TensorLayout() {}
188 const services::Collection<size_t>& getDimensions()
const 194 TensorLayout(
const services::Collection<size_t>& dims) : _dims(dims), _nDims(dims.size()) {}
197 services::Collection<size_t> _dims;
199 template<
typename Archive,
bool onDeserialize>
200 services::Status serialImpl( Archive *arch )
203 _nDims = _dims.size();
205 return services::Status();
209 typedef services::SharedPtr<TensorLayout> TensorLayoutPtr;
215 class DAAL_EXPORT TensorOffsetLayout :
public TensorLayout
218 TensorOffsetLayout(
const TensorOffsetLayout& inLayout) : TensorLayout(inLayout.getDimensions()),
219 _offsets(inLayout.getOffsets()), _indices(inLayout.getIndices()), _isDefaultLayout(inLayout._isDefaultLayout),
220 _isRawLayout(inLayout._isRawLayout)
227 TensorOffsetLayout(
const services::Collection<size_t>& dims) : TensorLayout(dims), _offsets(dims.size()), _indices(dims.size()),
228 _isDefaultLayout(true), _isRawLayout(true)
230 if(_nDims==0)
return;
232 size_t lastIndex = _nDims-1;
234 _offsets[lastIndex]=1;
236 for(
size_t i=1; i<_nDims; i++)
238 _offsets[lastIndex-i] = _offsets[lastIndex-i+1]*_dims[lastIndex-i+1];
242 _isDefaultLayout =
true;
252 TensorOffsetLayout(
const services::Collection<size_t>& dims,
const services::Collection<size_t>& offsets,
253 const services::Collection<size_t>& indices) : TensorLayout(dims)
255 if(_nDims==0)
return;
256 if(dims.size()==offsets.size())
return;
264 virtual ~TensorOffsetLayout() {}
271 const services::Collection<size_t>& getOffsets()
const 281 const services::Collection<size_t>& getIndices()
const 293 bool isLayout(
const TensorOffsetLayout & layout)
const 295 if( !(_nDims == layout.getDimensions().size()) )
return false;
297 const services::Collection<size_t> & dims = layout.getDimensions();
298 const services::Collection<size_t> & offsets = layout.getOffsets();
301 int offsetsMatch = 0;
302 for(
size_t i = 0; i < _nDims; i++)
304 dimsMatch += _dims[i] == dims[i];
305 offsetsMatch += _offsets[i] == offsets[i];
307 return (dimsMatch == _nDims) && (offsetsMatch == _nDims);
310 bool isDefaultLayout()
const 312 return _isDefaultLayout;
315 bool isRawLayout()
const 320 virtual services::Status shuffleDimensions(
const services::Collection<size_t>& dimsOrder) DAAL_C11_OVERRIDE;
322 services::Status sortOffsets();
324 virtual int getSerializationTag() const DAAL_C11_OVERRIDE
326 return SERIALIZATION_TENSOR_OFFSET_LAYOUT_ID;
329 DECLARE_SERIALIZABLE_IMPL();
332 services::Collection<size_t> _offsets;
333 services::Collection<size_t> _indices;
335 bool _isDefaultLayout;
338 template<
typename Archive,
bool onDeserialize>
339 services::Status serialImpl( Archive *arch )
341 TensorLayout::serialImpl<Archive,onDeserialize>(arch);
345 arch->set(_isDefaultLayout);
346 arch->set(_isRawLayout);
348 return services::Status();
352 services::Status checkLayout();
360 class DenseTensorIface
363 virtual ~DenseTensorIface()
376 virtual services::Status getSubtensorEx(
size_t fixedDims,
const size_t* fixedDimNums,
size_t rangeDimIdx,
size_t rangeDimNum,
377 ReadWriteMode rwflag, SubtensorDescriptor<double>& subtensor,
const TensorOffsetLayout& layout ) = 0;
389 virtual services::Status getSubtensorEx(
size_t fixedDims,
const size_t* fixedDimNums,
size_t rangeDimIdx,
size_t rangeDimNum,
390 ReadWriteMode rwflag, SubtensorDescriptor<float>& subtensor,
const TensorOffsetLayout& layout ) = 0;
402 virtual services::Status getSubtensorEx(
size_t fixedDims,
const size_t* fixedDimNums,
size_t rangeDimIdx,
size_t rangeDimNum,
403 ReadWriteMode rwflag, SubtensorDescriptor<int>& subtensor,
const TensorOffsetLayout& layout ) = 0;
410 virtual services::Status releaseSubtensor(SubtensorDescriptor<double>& subtensor) = 0;
416 virtual services::Status releaseSubtensor(SubtensorDescriptor<float>& subtensor) = 0;
422 virtual services::Status releaseSubtensor(SubtensorDescriptor<int>& subtensor) = 0;
434 virtual services::Status getSubtensor(
size_t fixedDims,
const size_t* fixedDimNums,
size_t rangeDimIdx,
size_t rangeDimNum,
435 ReadWriteMode rwflag, SubtensorDescriptor<double>& subtensor )
437 return getSubtensorEx(fixedDims, fixedDimNums, rangeDimIdx, rangeDimNum, rwflag, subtensor, createDefaultSubtensorLayout() );
450 virtual services::Status getSubtensor(
size_t fixedDims,
const size_t* fixedDimNums,
size_t rangeDimIdx,
size_t rangeDimNum,
451 ReadWriteMode rwflag, SubtensorDescriptor<float>& subtensor )
453 return getSubtensorEx(fixedDims, fixedDimNums, rangeDimIdx, rangeDimNum, rwflag, subtensor, createDefaultSubtensorLayout() );
466 virtual services::Status getSubtensor(
size_t fixedDims,
const size_t* fixedDimNums,
size_t rangeDimIdx,
size_t rangeDimNum,
467 ReadWriteMode rwflag, SubtensorDescriptor<int>& subtensor )
469 return getSubtensorEx(fixedDims, fixedDimNums, rangeDimIdx, rangeDimNum, rwflag, subtensor, createDefaultSubtensorLayout() );
472 virtual TensorOffsetLayout createDefaultSubtensorLayout()
const = 0;
473 virtual TensorOffsetLayout createRawSubtensorLayout()
const = 0;
481 class DAAL_EXPORT Tensor :
public SerializationIface,
public TensorIface,
public DenseTensorIface
484 DAAL_CAST_OPERATOR(Tensor)
491 Tensor(TensorLayout *layoutPtr) : _layoutPtr(layoutPtr), _memStatus(notAllocated) {}
496 Tensor() : _layoutPtr(0), _memStatus(notAllocated) {}
504 MemoryStatus getDataMemoryStatus()
const {
return _memStatus; }
511 size_t getNumberOfDimensions()
const 513 return _layoutPtr->getDimensions().size();
523 size_t getDimensionSize(
size_t dimIdx)
const 525 if(getNumberOfDimensions() > dimIdx)
return (_layoutPtr->getDimensions())[dimIdx];
534 const services::Collection<size_t>& getDimensions()
const 536 return _layoutPtr->getDimensions();
544 DAAL_DEPRECATED services::SharedPtr<services::KernelErrorCollection> getErrors()
546 return _status.getCollection()->getErrors();
553 size_t getSize()
const;
561 size_t getSize(
size_t startingIdx,
size_t rangeSize)
const;
568 virtual services::Status check(
const char *description)
const DAAL_C11_OVERRIDE
570 if(_memStatus == notAllocated)
572 return services::Status(services::ErrorNullTensor);
575 size_t nDims = getNumberOfDimensions();
578 return services::Status(services::ErrorIncorrectNumberOfDimensionsInTensor);
583 return services::Status(services::ErrorIncorrectSizeOfDimensionInTensor);
586 return services::Status();
589 const TensorLayout* getLayoutPtr()
const 594 DAAL_DEPRECATED_VIRTUAL services::Status allocateDataMemory(daal::MemType type = daal::dram) DAAL_C11_OVERRIDE
596 return allocateDataMemoryImpl(type);
599 DAAL_DEPRECATED_VIRTUAL services::Status freeDataMemory() DAAL_C11_OVERRIDE
601 return freeDataMemoryImpl();
604 virtual services::Status resize(
const services::Collection<size_t>& dimensions) DAAL_C11_OVERRIDE
606 freeDataMemoryImpl();
607 services::Status s = setDimensions(dimensions);
610 s = allocateDataMemoryImpl();
615 MemoryStatus _memStatus;
616 services::Status _status;
618 Tensor(TensorLayout *layoutPtr, services::Status &st) : _layoutPtr(layoutPtr), _memStatus(notAllocated) {}
620 template<
typename Archive,
bool onDeserialize>
621 services::Status serialImpl( Archive *arch )
625 _memStatus = notAllocated;
628 return services::Status();
631 virtual services::Status allocateDataMemoryImpl(daal::MemType type = daal::dram) = 0;
633 virtual services::Status freeDataMemoryImpl() = 0;
636 TensorLayout *_layoutPtr;
641 using interface1::Tensor;
642 using interface1::TensorIface;
643 using interface1::TensorPtr;
644 using interface1::TensorOffsetLayout;
645 using interface1::TensorLayout;
646 using interface1::TensorLayoutPtr;
655 DAAL_EXPORT services::Status checkTensor(
const Tensor *tensor,
const char *description,
const services::Collection<size_t> *dims = NULL);
659 #include "data_management/data/subtensor.h" daal::data_management::interface1::Tensor::getNumberOfDimensions
size_t getNumberOfDimensions() const
Definition: tensor.h:511
daal::data_management::interface1::TensorIface::freeDataMemory
virtual DAAL_DEPRECATED_VIRTUAL services::Status freeDataMemory()=0
daal::data_management::interface1::Tensor::getDataMemoryStatus
MemoryStatus getDataMemoryStatus() const
Definition: tensor.h:504
daal::services::ErrorIncorrectNumberOfDimensionsInTensor
Definition: error_indexes.h:135
daal::data_management::interface1::TensorLayoutIface
Abstract interface class for a data management component responsible for representation of data layou...
Definition: tensor.h:161
daal::services::interface1::Status
Class that holds the results of API calls. In case of API routine failure it contains the list of err...
Definition: error_handling.h:491
daal
Definition: algorithm_base_common.h:57
daal::data_management::interface1::TensorIface::MemoryStatus
MemoryStatus
Enumeration to specify the status of memory related to the Numeric Table.
Definition: tensor.h:92
daal::data_management::interface1::Tensor
Class for a data management component responsible for representation of data in the n-dimensions nume...
Definition: tensor.h:481
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:434
daal::data_management::interface1::TensorIface::AllocationFlag
AllocationFlag
Enumeration to specify whether the Numeric Table must allocate memory.
Definition: tensor.h:103
daal::data_management::interface1::TensorOffsetLayout::isLayout
bool isLayout(const TensorOffsetLayout &layout) const
Definition: tensor.h:293
daal::services::ErrorNullTensor
Definition: error_indexes.h:134
daal::data_management::interface1::Tensor::getDimensionSize
size_t getDimensionSize(size_t dimIdx) const
Definition: tensor.h:523
daal::data_management::interface1::TensorOffsetLayout::TensorOffsetLayout
TensorOffsetLayout(const services::Collection< size_t > &dims, const services::Collection< size_t > &offsets, const services::Collection< size_t > &indices)
Definition: tensor.h:252
daal::data_management::interface1::TensorIface::internallyAllocated
Definition: tensor.h:96
daal::data_management::interface1::TensorIface::setDimensions
virtual services::Status setDimensions(size_t ndim, const size_t *dimSizes)=0
daal::data_management::interface1::TensorIface::check
virtual services::Status check(const char *description) const =0
daal::dram
Definition: daal_defines.h:159
daal::data_management::interface1::TensorOffsetLayout::getIndices
const services::Collection< size_t > & getIndices() const
Definition: tensor.h:281
daal::data_management::interface1::TensorOffsetLayout::getOffsets
const services::Collection< size_t > & getOffsets() const
Definition: tensor.h:271
daal::data_management::interface1::TensorIface::doNotAllocate
Definition: tensor.h:105
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:466
daal::data_management::interface1::TensorIface::userAllocated
Definition: tensor.h:95
daal::data_management::interface1::TensorIface::notAllocate
Definition: tensor.h:106
daal::data_management::interface1::TensorLayout::getDimensions
const services::Collection< size_t > & getDimensions() const
Definition: tensor.h:188
daal::data_management::interface1::TensorIface::doAllocate
Definition: tensor.h:107
daal::data_management::interface1::TensorIface::notAllocated
Definition: tensor.h:94
daal::services::interface1::SharedPtr
Shared pointer that retains shared ownership of an object through a pointer. Several SharedPtr object...
Definition: daal_shared_ptr.h:187
daal::data_management::interface1::DenseTensorIface
Abstract interface class for a data management component responsible for accessing data in the numeri...
Definition: tensor.h:360
daal::data_management::interface1::TensorOffsetLayout::TensorOffsetLayout
TensorOffsetLayout(const services::Collection< size_t > &dims)
Definition: tensor.h:227
daal::data_management::interface1::Tensor::getDimensions
const services::Collection< size_t > & getDimensions() const
Definition: tensor.h:534
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:450
daal::data_management::interface1::TensorIface::allocateDataMemory
virtual DAAL_DEPRECATED_VIRTUAL services::Status allocateDataMemory(daal::MemType type=daal::dram)=0
daal::data_management::interface1::TensorLayout
Class for a data management component responsible for representation of data layout in the tensor...
Definition: tensor.h:179
daal::data_management::interface1::TensorIface
Abstract interface class for a data management component responsible for representation of data in th...
Definition: tensor.h:85
daal::services::interface1::Collection::size
size_t size() const
Definition: collection.h:144
daal::data_management::interface1::Tensor::Tensor
Tensor()
Definition: tensor.h:496
daal::data_management::interface1::TensorOffsetLayout
Class for a data management component responsible for representation of data layout in the HomogenTen...
Definition: tensor.h:215
daal::data_management::interface1::Tensor::check
virtual services::Status check(const char *description) const DAAL_C11_OVERRIDE
Definition: tensor.h:568
daal::data_management::interface1::TensorIface::getSampleTensor
virtual DAAL_DEPRECATED_VIRTUAL TensorPtr getSampleTensor(size_t firstDimIndex)=0
daal::data_management::interface1::TensorOffsetLayout::getSerializationTag
virtual int getSerializationTag() const DAAL_C11_OVERRIDE
Definition: tensor.h:324
daal::data_management::interface1::SubtensorDescriptor
Class with descriptor of the subtensor retrieved from Tensor getSubTensor function.
Definition: subtensor.h:73
daal::data_management::interface1::SerializationIface
Abstract interface class that defines the interface for serialization and deserialization.
Definition: data_serialize.h:76
daal::MemType
MemType
Definition: daal_defines.h:157
daal::data_management::checkTensor
DAAL_EXPORT services::Status checkTensor(const Tensor *tensor, const char *description, const services::Collection< size_t > *dims=NULL)
daal::services::interface1::Collection
Class that implements functionality of the Collection container.
Definition: collection.h:69
daal::services::ErrorIncorrectSizeOfDimensionInTensor
Definition: error_indexes.h:136