You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					147 lines
				
				4.0 KiB
			
		
		
			
		
	
	
					147 lines
				
				4.0 KiB
			| 
								 
											6 years ago
										 
									 | 
							
								//=============================================================================
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 
											5 years ago
										 
									 | 
							
								//  Copyright (c) 2015-2020 Qualcomm Technologies, Inc.
							 | 
						||
| 
								 
											6 years ago
										 
									 | 
							
								//  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
							 |