//=============================================================================
//
// Copyright (c) 2015-2020 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
//
//=============================================================================
# ifndef _ITENSOR_HPP_
# define _ITENSOR_HPP_
# include "ITensorItr.hpp"
# include "ITensorItrImpl.hpp"
# include "TensorShape.hpp"
# include "ZdlExportDefine.hpp"
# include <memory>
# include <ostream>
# include <cmath>
namespace zdl {
namespace DlSystem
{
class ITensor ;
} }
namespace zdl { namespace DlSystem
{
/** @addtogroup c_plus_plus_apis C++
@ { */
/**
* Represents a tensor which holds n - dimensional data . It is important to
* understand how the tensor data is represented in memory
* relative to the tensor dimensions . Tensors store data in
* memory in row - major order ( i . e . the last tensor dimension is
* the fastest varying one ) . For example , if you have a two
* dimensional tensor with 3 rows and 2 columns ( i . e . the tensor
* dimensions are 3 , 2 as returned in tensor dimension vectors )
* with the following data in terms rows and columns :
*
* | 1 2 | < br / >
* | 3 4 | < br / >
* | 5 6 | < br / >
*
* This data would be stored in memory as 1 , 2 , 3 , 4 , 5 , 6.
*/
class ZDL_EXPORT ITensor
{
public :
typedef zdl : : DlSystem : : ITensorItr < false > iterator ;
typedef zdl : : DlSystem : : ITensorItr < true > const_iterator ;
virtual ~ ITensor ( ) { }
/**
* Returns a tensor iterator pointing to the beginning
* of the data in the tensor .
*
* @ return A tensor iterator that points to the first data
* element in the tensor .
*/
virtual iterator begin ( ) = 0 ;
/**
* Returns the const version of a tensor iterator
* pointing to the beginning of the data in the tensor .
*
* @ return A tensor const iterator that points to the first data
* element in the tensor .
*/
virtual const_iterator cbegin ( ) const = 0 ;
/**
* Returns a tensor iterator pointing to the end of the
* data in the tensor . This tensor should not be
* dereferenced .
*
* @ return A tensor iterator that points to the end of the data
* ( one past the last element ) in the tensor .
*/
virtual iterator end ( ) = 0 ;
/**
* Returns the const version of a tensor iterator
* pointing to the end of the data in the tensor . This
* tensor should not be dereferenced .
*
* @ return A tensor const iterator that points to the end of the
* data ( one past the last element ) in the tensor .
*/
virtual const_iterator cend ( ) const = 0 ;
/**
* @ brief Gets the shape of this tensor .
*
* The last element of the vector represents the fastest varying
* dimension and the zeroth element represents the slowest
* varying dimension , etc .
*
* @ return A shape class holding the tensor dimensions .
*/
virtual TensorShape getShape ( ) const = 0 ;
/**
* Returns the element size of the data in the tensor
* ( discounting strides ) . This is how big a buffer would
* need to be to hold the tensor data contiguously in
* memory .
*
* @ return The size of the tensor ( in elements ) .
*/
virtual size_t getSize ( ) const = 0 ;
/**
* @ brief Serializes the tensor to an output stream .
*
* @ param [ in ] output The output stream to which to write the tensor
*
* @ throw std : : runtime_error If the stream is ever in a bad
* state before the tensor is fully serialized .
*/
virtual void serialize ( std : : ostream & output ) const = 0 ;
friend iterator ;
friend const_iterator ;
virtual bool isQuantized ( ) { return false ; }
virtual float GetDelta ( ) { return NAN ; } ;
virtual float GetOffset ( ) { return NAN ; } ;
protected :
/**
* Returns the tensor iterator implementation .
*
* @ return A pointer to the tensor iterator implementation .
*/
virtual std : : unique_ptr < : : DlSystem : : ITensorItrImpl > getItrImpl ( ) const = 0 ;
} ;
} }
/** @} */ /* end_addtogroup c_plus_plus_apis C++ */
# endif