FLImaging 6.5.16.1
Tensor.h
1#pragma once
2
3#if _MSC_VER >= 1900 && defined(_M_X64)
4
5#include "ComputationalBase.h"
6
7#include <cstdint>
8#include <vector>
9#include <atomic>
10
11#include "Scalar.h"
12#include "DefinitionsAI.h"
13
14namespace FLImaging
15{
16 namespace AI
17 {
18 #ifdef CUDNN_MODE
19 template <typename T>
20 class CCuda_Tensor_Cudnn;
21 #endif
22
23 #ifdef CUBLAS_MODE
24 template <typename T>
25 class CCuda_ComputationalGraphMatMul_Cublas;
26 #endif
27
28 template <typename T>
29 class FL_EXPORT CTensor : public CComputationalBase<T>
30 {
31 public:
32 CTensor();
33
34 CTensor(const CTensor<float >& tsr, bool bDeepCopy = true);
35 CTensor(const CTensor<double>& tsr, bool bDeepCopy = true);
36
37 CTensor(const T& tScalar);
38 CTensor(const std::vector<int64_t>& vctShapeDesc);
39 CTensor(const std::initializer_list<int64_t>& ilShapeDesc);
40
41 virtual ~CTensor();
42
43 static const CResult GetClassNumFromImages(const Base::CFLImage* pFli, Base::CFLArray<int32_t>& flaClassNum);
44
45 virtual const CResult Load(const wchar_t* pWcsFileName) override;
46 virtual const CResult Save(const wchar_t* pWcsFileName) override;
47
48 virtual const CResult GetBinaryData(Base::CFLData& fldBinary, bool bSuperClass = false, int32_t i32Version = -1, bool bDumpMode = false) const override;
49 virtual const CResult GetBinaryData(Base::CFLData* pFldBinary, bool bSuperClass = false, int32_t i32Version = -1, bool bDumpMode = false) const override;
50
51 virtual const CResult SetBinaryData(const Base::CFLData& fldBinary, int64_t* pI64Offset = nullptr) override;
52 virtual const CResult SetBinaryData(const Base::CFLData* pFldBinary, int64_t* pI64Offset = nullptr) override;
53
54 virtual const CResult Clear() override;
55
56 virtual const CResult CopyHostToDevice();
57 virtual const CResult CopyDeviceToHost();
58
59 virtual const CResult SetMemory(const T* pTMemory, const std::vector<int64_t>& vctShape, bool bOrderByDesc = true, bool bDeepCopy = false);
60 virtual const CResult SetMemory(const T* pTMemory, const std::initializer_list<int64_t>& vctShape, bool bOrderByDesc = true, bool bDeepCopy = false);
61
62 virtual const CResult SetMemoryCuda(const T* pTMemory, const std::vector<int64_t>& vctShape, bool bOrderByDesc = true, bool bDeepCopy = false);
63 virtual const CResult SetMemoryCuda(const T* pTMemory, const std::initializer_list<int64_t>& vctShape, bool bOrderByDesc = true, bool bDeepCopy = false);
64
65 virtual const T* GetMemory() const;
66 virtual const T* GetMemoryCuda() const;
67
68 virtual bool IsAutoDestroyCPUMemoryEnabled() const;
69 virtual bool IsAutoDestroyCudaMemoryEnabled() const;
70
71 virtual const CResult Assign(const Base::CFLImage& fli, bool bNormalize = true);
72 virtual const CResult Assign(const Base::CFLImage* pFli, bool bNormalize = true);
73 virtual const CResult Assign(const CTensor<float>& tsr, bool bDeepCopy = true);
74 virtual const CResult Assign(const CTensor<float>* pTsr, bool bDeepCopy = true);
75 virtual const CResult Assign(const CTensor<double>& tsr, bool bDeepCopy = true);
76 virtual const CResult Assign(const CTensor<double>* pTsr, bool bDeepCopy = true);
77 virtual const CResult Assign(const T tScalar);
78 virtual const CResult Assign(const CComputationalBase<T>& cb);
79 virtual const CResult Assign(const Base::CFLImage* pFli, const std::vector<int64_t>& vctNewSize, EResizeMethod eResizeMethod = EResizeMethod_ScaleAllAxises, bool bROIExtraction = false, bool bNormalize = true, const Base::CMultiVar<T>& mvBlankColor = 0., ImageProcessing::EInterpolationMethod eInterpolationMethod = ImageProcessing::EInterpolationMethod_Bilinear, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
80 virtual const CResult Assign(const Base::CFLImage& fli, const std::vector<int64_t>& vctNewSize, EResizeMethod eResizeMethod = EResizeMethod_ScaleAllAxises, bool bROIExtraction = false, bool bNormalize = true, const Base::CMultiVar<T>& mvBlankColor = 0., ImageProcessing::EInterpolationMethod eInterpolationMethod = ImageProcessing::EInterpolationMethod_Bilinear, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
81 virtual const CResult Assign(const Base::CFLImage* pFli, const std::initializer_list<int64_t>& ilNewSize, EResizeMethod eResizeMethod = EResizeMethod_ScaleAllAxises, bool bROIExtraction = false, bool bNormalize = true, const Base::CMultiVar<T>& mvBlankColor = 0., ImageProcessing::EInterpolationMethod eInterpolationMethod = ImageProcessing::EInterpolationMethod_Bilinear, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
82 virtual const CResult Assign(const Base::CFLImage& fli, const std::initializer_list<int64_t>& ilNewSize, EResizeMethod eResizeMethod = EResizeMethod_ScaleAllAxises, bool bROIExtraction = false, bool bNormalize = true, const Base::CMultiVar<T>& mvBlankColor = 0., ImageProcessing::EInterpolationMethod eInterpolationMethod = ImageProcessing::EInterpolationMethod_Bilinear, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
83
84 virtual const CResult Create(const std::vector<int64_t>& vctShape, bool bOrderByDesc = true, bool bCudaAllocation = true);
85 virtual const CResult Create(const std::initializer_list<int64_t>& ilShape, bool bOrderByDesc = true, bool bCudaAllocation = true);
86 virtual const CResult Create(const Base::CFLImage& fli, bool bNormalize = true, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
87 virtual const CResult Create(const Base::CFLImage* pFli, bool bNormalize = true, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
88 virtual const CResult Create(const Base::CFLImage* pFli, const std::vector<int64_t>& vctNewSize, EResizeMethod eResizeMethod = EResizeMethod_ScaleAllAxises, bool bROIExtraction = false, bool bNormalize = true, const Base::CMultiVar<T>& mvBlankColor = 0., ImageProcessing::EInterpolationMethod eInterpolationMethod = ImageProcessing::EInterpolationMethod_Bilinear, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
89 virtual const CResult Create(const Base::CFLImage& fli, const std::vector<int64_t>& vctNewSize, EResizeMethod eResizeMethod = EResizeMethod_ScaleAllAxises, bool bROIExtraction = false, bool bNormalize = true, const Base::CMultiVar<T>& mvBlankColor = 0., ImageProcessing::EInterpolationMethod eInterpolationMethod = ImageProcessing::EInterpolationMethod_Bilinear, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
90 virtual const CResult Create(const Base::CFLImage* pFli, const std::initializer_list<int64_t>& ilNewSize, EResizeMethod eResizeMethod = EResizeMethod_ScaleAllAxises, bool bROIExtraction = false, bool bNormalize = true, const Base::CMultiVar<T>& mvBlankColor = 0., ImageProcessing::EInterpolationMethod eInterpolationMethod = ImageProcessing::EInterpolationMethod_Bilinear, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
91 virtual const CResult Create(const Base::CFLImage& fli, const std::initializer_list<int64_t>& ilNewSize, EResizeMethod eResizeMethod = EResizeMethod_ScaleAllAxises, bool bROIExtraction = false, bool bNormalize = true, const Base::CMultiVar<T>& mvBlankColor = 0., ImageProcessing::EInterpolationMethod eInterpolationMethod = ImageProcessing::EInterpolationMethod_Bilinear, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
92
93 virtual const CResult Append(const Base::CFLImage* pFli, EResizeMethod eResizeMethod = EResizeMethod_ScaleAllAxises, bool bROIExtraction = false, bool bNormalize = true, const Base::CMultiVar<T>& mvBlankColor = 0., ImageProcessing::EInterpolationMethod eInterpolationMethod = ImageProcessing::EInterpolationMethod_Bilinear, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
94 virtual const CResult Append(const Base::CFLImage& fli, EResizeMethod eResizeMethod = EResizeMethod_ScaleAllAxises, bool bROIExtraction = false, bool bNormalize = true, const Base::CMultiVar<T>& mvBlankColor = 0., ImageProcessing::EInterpolationMethod eInterpolationMethod = ImageProcessing::EInterpolationMethod_Bilinear, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
95
96 virtual const CResult SetLabels(Foundation::CFLFigureArray& flfaSourceLabel, bool bDeepCopy = false);
97 virtual const CResult SetLabels(Foundation::CFLFigureArray* pFlfaSourceLabel, bool bDeepCopy = false);
98 virtual Foundation::CFLFigureArray* GetLabels() const;
99 virtual const CResult SetOriginBoundaryLabels(Foundation::CFLFigureArray& flfaSourceLabel, bool bDeepCopy = false);
100 virtual const CResult SetOriginBoundaryLabels(Foundation::CFLFigureArray* pFlfaSourceLabel, bool bDeepCopy = false);
101 virtual Foundation::CFLFigureArray* GetOriginBoundaryLabels() const;
102
103 virtual const CResult MakeMiniBatch(const CTensor<T>& tsrSrc, int64_t i64Start, int64_t i64End);
104
105 virtual const CResult CreateCudaMemory();
106 virtual const CResult ClearCudaMemory();
107
108 virtual const CResult Reshape(const std::vector<int64_t>& vctAxes = { }, bool bOrderByDesc = true);
109
110 virtual const CResult FillZero();
111 virtual const CResult Fill(T tFillValue);
112 virtual const CResult FillRandom(T tRangeMin, T tRangeMax);
113 virtual const CResult FillUniformRandom(T tRangeMin, T tRangeMax);
114 virtual const CResult FillNormalRandom(T tMean = 0, T tStdev = 1);
115 virtual const CResult FillSeries(T tStartValue, T tInterval);
116 virtual const CResult FillXavier();
117 virtual const CResult FillHe();
118 virtual const CResult FillHe(int64_t i64InputSize);
119
120 virtual CTensor<T>& Evaluate() override;
121 virtual CTensor<T>& Forward() override;
122 virtual CTensor<T>* Backward() override;
123
124 virtual int64_t GetRequiredDedicatedMemory(bool bTraining = false, bool bRecursively = true, int64_t i64BatchSize = 1) const override;
125 virtual int64_t GetRequiredTemporaryMemory(bool bTraining = false, bool bRecursively = true, int64_t i64BatchSize = 1, int64_t i64MemoryIndex = 0) const override;
126
127 virtual CTensor<T>& GetValue() const override;
128 virtual const int64_t& GetRank() const;
129 virtual const std::vector<int64_t>& GetEstimatedShape(bool bRecursive = true) const override;
130 virtual const std::vector<int64_t>& GetShapeAsc() const override;
131
132 virtual const std::vector<int64_t>& GetPitchByRank() const;
133 virtual const std::vector<int64_t>& GetPitchByRankAsc() const;
134 virtual const int64_t& GetTotalElement() const;
135 virtual const int64_t& GetTotalSizeByte() const;
136
137 virtual const CResult SetBatchParameters(const CTensor<T>& tsr);
138
139 operator const T& () const;
140 operator const T* () const;
141 const CTensor<T>& operator=(const CTensor<float>& tsr);
142 const CTensor<T>& operator=(const CTensor<double>& tsr);
143 const CTensor<T>& operator=(const std::initializer_list<T>& ilRank1st);
144 const CTensor<T>& operator=(const std::initializer_list<const std::initializer_list<T>>& ilRank2nd);
145 const CTensor<T>& operator=(const std::initializer_list<const std::initializer_list<const std::initializer_list<T> > >& ilRank3rd);
146 const CTensor<T>& operator=(const std::initializer_list<const std::initializer_list<const std::initializer_list<const std::initializer_list<T> > > >& ilRank4th);
147 const T operator=(const T tScalar);
148 CScalar<T> operator[](int32_t i32Index) const;
149 CScalar<T> operator[](uint32_t u32Index) const;
150 CScalar<T> operator[](int64_t i64Index) const;
151 CScalar<T> operator[](uint64_t u64Index) const;
152
153 virtual const CTensor<T>& operator+=(const CTensor<T>& tsr);
154 virtual const CTensor<T>& operator+=(const float& f32Scalar);
155 virtual const CTensor<T>& operator+=(const double& f64Scalar);
156 virtual const CTensor<T>& operator-=(const CTensor<T>& tsr);
157 virtual const CTensor<T>& operator-=(const float& f32Scalar);
158 virtual const CTensor<T>& operator-=(const double& f64Scalar);
159 virtual const CTensor<T>& operator*=(const CTensor<T>& tsr);
160 virtual const CTensor<T>& operator*=(const float& f32Scalar);
161 virtual const CTensor<T>& operator*=(const double& f64Scalar);
162 virtual const CTensor<T>& operator/=(const CTensor<T>& tsr);
163 virtual const CTensor<T>& operator/=(const float& f32Scalar);
164 virtual const CTensor<T>& operator/=(const double& f64Scalar);
165
166 CTensor<T> operator+(const CTensor<T>& tsr) const;
167 CTensor<T> operator+(const float& f32Scalar) const;
168 CTensor<T> operator+(const double& f64Scalar) const;
169 CTensor<T> operator-(const CTensor<T>& tsr) const;
170 CTensor<T> operator-(const float& f32Scalar) const;
171 CTensor<T> operator-(const double& f64Scalar) const;
172 CTensor<T> operator*(const CTensor<T>& tsr) const;
173 CTensor<T> operator*(const float& f32Scalar) const;
174 CTensor<T> operator*(const double& f64Scalar) const;
175 CTensor<T> operator/(const CTensor<T>& tsr) const;
176 CTensor<T> operator/(const float& f32Scalar) const;
177 CTensor<T> operator/(const double& f64Scalar) const;
178
179 friend CTensor<T> operator+(const float& f32Scalar, const CTensor<T>& tsr)
180 {
181 CTensor<T> tsrReturn((T)f32Scalar);
182
183 tsrReturn += tsr;
184 return tsrReturn;
185 }
186
187 friend CTensor<T> operator+(const double& f64Scalar, const CTensor<T>& tsr)
188 {
189 CTensor<T> tsrReturn((T)f64Scalar);
190
191 tsrReturn += tsr;
192 return tsrReturn;
193 }
194
195 friend CTensor<T> operator-(const float& f32Scalar, const CTensor<T>& tsr)
196 {
197 CTensor<T> tsrReturn((T)f32Scalar);
198
199 tsrReturn -= tsr;
200 return tsrReturn;
201 }
202
203 friend CTensor<T> operator-(const double& f64Scalar, const CTensor<T>& tsr)
204 {
205 CTensor<T> tsrReturn((T)f64Scalar);
206
207 tsrReturn -= tsr;
208 return tsrReturn;
209 }
210
211 friend CTensor<T> operator*(const float& f32Scalar, const CTensor<T>& tsr)
212 {
213 CTensor<T> tsrReturn((T)f32Scalar);
214
215 tsrReturn *= tsr;
216 return tsrReturn;
217 }
218
219 friend CTensor<T> operator*(const double& f64Scalar, const CTensor<T>& tsr)
220 {
221 CTensor<T> tsrReturn((T)f64Scalar);
222
223 tsrReturn *= tsr;
224 return tsrReturn;
225 }
226
227 friend CTensor<T> operator/(const float& f32Scalar, const CTensor<T>& tsr)
228 {
229 CTensor<T> tsrReturn((T)f32Scalar);
230
231 tsrReturn /= tsr;
232 return tsrReturn;
233 }
234
235 friend CTensor<T> operator/(const double& f64Scalar, const CTensor<T>& tsr)
236 {
237 CTensor<T> tsrReturn((T)f64Scalar);
238
239 tsrReturn /= tsr;
240 return tsrReturn;
241 }
242
243 CTensor<T> operator>(const CTensor<T>& tsr);
244 CTensor<T> operator>(const float& f32Scalar);
245 CTensor<T> operator>(const double& f64Scalar);
246 CTensor<T> operator>=(const CTensor<T>& tsr);
247 CTensor<T> operator>=(const float& f32Scalar);
248 CTensor<T> operator>=(const double& f64Scalar);
249 CTensor<T> operator==(const CTensor<T>& tsr);
250 CTensor<T> operator==(const float& f32Scalar);
251 CTensor<T> operator==(const double& f64Scalar);
252 CTensor<T> operator!=(const CTensor<T>& tsr);
253 CTensor<T> operator!=(const float& f32Scalar);
254 CTensor<T> operator!=(const double& f64Scalar);
255 CTensor<T> operator<=(const CTensor<T>& tsr);
256 CTensor<T> operator<=(const float& f32Scalar);
257 CTensor<T> operator<=(const double& f64Scalar);
258 CTensor<T> operator<(const CTensor<T>& tsr);
259 CTensor<T> operator<(const float& f32Scalar);
260 CTensor<T> operator<(const double& f64Scalar);
261
262 bool Equals(const CTensor<float>& tsr);
263 bool Equals(const CTensor<double>& tsr);
264
265 virtual const CResult Add(const CTensor<T>& tsrTarget, CTensor<T>* pTsrResult);
266 virtual const CResult Subtract(const CTensor<T>& tsrTarget, CTensor<T>* pTsrResult);
267 virtual const CResult Multiply(const CTensor<T>& tsrTarget, CTensor<T>* pTsrResult);
268 virtual const CResult MatMul(const CTensor<T>& tsrTarget, CTensor<T>* pTsrResult);
269 virtual const CResult Divide(const CTensor<T>& tsrTarget, CTensor<T>* pTsrResult);
270 virtual const CResult Dot(const CTensor<T>& tsrTarget, CTensor<T>* pTsrResult);
271 virtual const CResult Pow(const CTensor<T>& tsrTarget, CTensor<T>* pTsrResult);
272 virtual const CResult Compare(const CTensor<T>& tsrTarget, CTensor<T>* pTsrResult, Base::ELogicalCondition eConditon);
273
274 virtual const CResult Chunk(std::vector<CTensor<T>>& vctResult, int64_t i64ChunkCount, int64_t i64Axis = -1);
275 virtual const CResult Chunk(CTensor<T>* pTsrResult, int64_t i64ChunkCount, int64_t i64Axis = -1);
276 virtual const CResult Chunk(CTensor<T>* pTsrResult, std::vector<CTensor<T>>& vctResult, int64_t i64ChunkCount, int64_t i64Axis = -1);
277
278 virtual const CResult Stack(const std::initializer_list<CTensor<T>*>& tsrTarget, CTensor<T>* pTsrResult, int64_t i64Axis = -1);
279 virtual const CResult Stack(const std::vector<CTensor<T>*>& vctTarget, CTensor<T>* pTsrResult, int64_t i64Axis = -1);
280 virtual const CResult HStack(const std::initializer_list<CTensor<T>*>& tsrTarget, CTensor<T>* pTsrResult);
281 virtual const CResult HStack(const std::vector<CTensor<T>*>& vctTarget, CTensor<T>* pTsrResult);
282 virtual const CResult VStack(const std::initializer_list<CTensor<T>*>& tsrTarget, CTensor<T>* pTsrResult);
283 virtual const CResult VStack(const std::vector<CTensor<T>*>& vctTarget, CTensor<T>* pTsrResult);
284 virtual const CResult Concatenate(const std::initializer_list<CTensor<T>*>& ilTarget, CTensor<T>* pTsrResult, int64_t i64Axis = -1);
285 virtual const CResult Concatenate(const std::vector<CTensor<T>*>& vctTarget, CTensor<T>* pTsrResult, int64_t i64Axis = -1);
286
287 virtual const CResult Transpose(CTensor<T>* pTsrResult);
288 virtual const CResult Transpose(CTensor<T>* pTsrResult, const std::vector<int64_t>& vctTransDesc);
289 virtual const CResult Repeat(CTensor<T>* pTsrResult, int64_t i64Count, int64_t i64Axis = 0);
290
291 virtual const CResult ReduceSum(CTensor<T>* pTsrResult, bool bKeepDim = false);
292 virtual const CResult ReduceSum(CTensor<T>* pTsrResult, const std::vector<int64_t>& vctAxes, bool bKeepDim = false);
293 virtual const CResult ReduceSum(CTensor<T>* pTsrResult, const std::initializer_list<int64_t>& ilAxes, bool bKeepDim = false);
294 virtual const CResult ReduceMean(CTensor<T>* pTsrResult, bool bKeepDim = false);
295 virtual const CResult ReduceMean(CTensor<T>* pTsrResult, const std::vector<int64_t>& vctAxes, bool bKeepDim = false);
296 virtual const CResult ReduceMean(CTensor<T>* pTsrResult, const std::initializer_list<int64_t>& ilAxes, bool bKeepDim = false);
297 virtual const CResult ReduceMin(CTensor<T>* pTsrResult, bool bKeepDim = false);
298 virtual const CResult ReduceMin(CTensor<T>* pTsrResult, const std::vector<int64_t>& ilAxes, bool bKeepDim = false);
299 virtual const CResult ReduceMin(CTensor<T>* pTsrResult, const std::initializer_list<int64_t>& ilAxes, bool bKeepDim = false);
300 virtual const CResult ReduceMax(CTensor<T>* pTsrResult, bool bKeepDim = false);
301 virtual const CResult ReduceMax(CTensor<T>* pTsrResult, const std::vector<int64_t>& vctAxes, bool bKeepDim = false);
302 virtual const CResult ReduceMax(CTensor<T>* pTsrResult, const std::initializer_list<int64_t>& ilAxes, bool bKeepDim = false);
303
304 virtual const CResult ReduceVar(CTensor<T>* pTsrResult, bool bUnBiased = true, bool bKeepDim = false);
305 virtual const CResult ReduceVar(CTensor<T>* pTsrResult, const std::vector<int64_t>& vctAxes, bool bUnBiased = true, bool bKeepDim = false);
306 virtual const CResult ReduceVar(CTensor<T>* pTsrResult, const std::initializer_list<int64_t>& ilAxes, bool bUnBiased = true, bool bKeepDim = false);
307 virtual const CResult ReduceVarMean(CTensor<T>* pTsrVarResult, CTensor<T>* pTsrMeanResult, bool bUnBiased = true, bool bKeepDim = false);
308 virtual const CResult ReduceVarMean(CTensor<T>* pTsrVarResult, CTensor<T>* pTsrMeanResult, const std::vector<int64_t>& vctAxes, bool bUnBiased = true, bool bKeepDim = false);
309 virtual const CResult ReduceVarMean(CTensor<T>* pTsrVarResult, CTensor<T>* pTsrMeanResult, const std::initializer_list<int64_t>& ilAxes, bool bUnBiased = true, bool bKeepDim = false);
310
311 virtual const CResult ReduceStdev(CTensor<T>* pTsrResult, bool bUnBiased = true, bool bKeepDim = false);
312 virtual const CResult ReduceStdev(CTensor<T>* pTsrResult, const std::vector<int64_t>& vctAxes, bool bUnBiased = true, bool bKeepDim = false);
313 virtual const CResult ReduceStdev(CTensor<T>* pTsrResult, const std::initializer_list<int64_t>& ilAxes, bool bUnBiased = true, bool bKeepDim = false);
314
315 virtual const CResult ReduceAny(CTensor<T>* pTsrResult, bool bKeepDim = false);
316 virtual const CResult ReduceAny(CTensor<T>* pTsrResult, const std::vector<int64_t>& vctAxes, bool bKeepDim = false);
317 virtual const CResult ReduceAny(CTensor<T>* pTsrResult, const std::initializer_list<int64_t>& ilAxes, bool bKeepDim = false);
318
319 virtual const CResult ArgMax(CTensor<T>* pTsrResult);
320 virtual const CResult ArgMax(CTensor<T>* pTsrResult, int64_t i64Axis);
321
322 virtual const CResult Square(CTensor<T>* pTsrResult);
323 virtual const CResult Sqrt(CTensor<T>* pTsrResult);
324
325 virtual const CResult Sigmoid(CTensor<T>* pTsrResult);
326 virtual const CResult Log(CTensor<T>* pTsrResult);
327 virtual const CResult Log10(CTensor<T>* pTsrResult);
328 virtual const CResult Log1p(CTensor<T>* pTsrResult);
329 virtual const CResult Tanh(CTensor<T>* pTsrResult);
330 virtual const CResult Absolute(CTensor<T>* pTsrResult);
331
332 virtual const CResult Sin(CTensor<T>* pTsrResult);
333 virtual const CResult Cos(CTensor<T>* pTsrResult);
334 virtual const CResult ArcCos(CTensor<T>* pTsrResult);
335 virtual const CResult ArcTan2(const CTensor<T>& tsrTarget, CTensor<T>* pTsrResult);
336 virtual const CResult Degrees(CTensor<T>* pTsrResult);
337
338 virtual CComputationalBase<T>* Clone() const override;
339
340 virtual const CResult ArgMin(CTensor<T>* pTsrResult);
341 virtual const CResult ArgMin(CTensor<T>* pTsrResult, int64_t i64Axis);
342
343 virtual const CResult Ceil(CTensor<T>* pTsrResult);
344 virtual const CResult Floor(CTensor<T>* pTsrResult);
345
346 virtual const CResult Clip(const CTensor<T>& tsrMin, const CTensor<T>& tsrMax = -std::numeric_limits<T>::lowest());
347 virtual const CResult Clip(CTensor<T>* pTsrResult,const CTensor<T>& tsrMin, const CTensor<T>& tsrMax = -std::numeric_limits<T>::lowest());
348
349 virtual const CResult FillZero_Like(CTensor<T>& pTsrOpr);
350
351 virtual const CResult LinSpace(T tStart, T tEnd, int64_t i64Num = 50, bool bEndPoint=true, int64_t i64Axis=0);
352
353 virtual const CResult Diff(CTensor<T>* pTsrResult, int64_t i64RepeatNum = 1, int64_t i64Axis = -1);
354 virtual const CResult Diff(CTensor<T>* pTsrResult, int64_t i64RepeatNum, int64_t i64Axis , const CTensor<T>& tsrPrepend, const CTensor<T>& tsrAppend = CTensor());
355
356 virtual const CResult Product(CTensor<T>* pTsrResult, bool bKeepDim = false, const CTensor<T>& tsrInitial = CTensor<T>());
357 virtual const CResult Product(CTensor<T>* pTsrResult, int64_t i64Axis, bool bKeepDim = false, const CTensor<T>& tsrInitial = CTensor<T>());
358 virtual const CResult Product(CTensor<T>* pTsrResult, const std::vector<int64_t>& vctAxes, bool bKeepDim = false,const CTensor<T> &tsrInitial = CTensor<T>());
359
360 virtual const CResult ArgSort(CTensor<T>* pTsrResult, bool bDecrease = false, bool bStable = false);
361 virtual const CResult ArgSort(CTensor<T>* pTsrResult, int64_t i64Axis, bool bDecrease = false, bool bStable = false);
362 virtual const CResult Sort(CTensor<T>* pTsrResult, const bool bDecrease = false);
363 virtual const CResult Sort(CTensor<T>* pTsrResult, int64_t i64Axis, bool bDecrease = false);
364 virtual const CResult Sort(CTensor<T>* pTsrResult, std::vector<uint32_t>* pVtIndices, bool bDecrease = false, bool bStable = false);
365 virtual const CResult Sort(CTensor<T>* pTsrResult, std::vector<uint32_t>* pVtIndices, int64_t i64Axis, bool bDecrease = false, bool bStable = false);
366
367 virtual const CResult TopK(CTensor<T>* pTsrResult, int64_t i64K = 3, bool bDec = true );
368 virtual const CResult TopK(CTensor<T>* pTsrResult, int64_t i64K, int64_t i64Axis, bool bDec = true);
369 virtual const CResult TopK(CTensor<T>* pTsrResult, std::vector<uint32_t>* pVtIndices, int64_t i64K = 3, bool bDec = true, bool bStable = false);
370 virtual const CResult TopK(CTensor<T>* pTsrResult, std::vector<uint32_t>* pVtIndices, int64_t i64K, int64_t i64Axis, bool bDec = true, bool bStable = false);
371
372 virtual const CResult Gather(const CTensor<T>& tsrIndex, CTensor<T>* pTsrResult, int64_t i64Axis = 0);
373 virtual const CResult Gather(CTensor<T>* pTsrResult, std::vector<std::pair<int64_t , std::vector<int64_t>>> vtGatherPoint);
374
375
376 virtual const CResult Cross(const CTensor<T>& tsrOprand, CTensor<T>* pTsrResult, int64_t i64AxisA = -1, int64_t i64AxisB = -1, int64_t i64AxisC = -1);
377 virtual const CResult Cross(const CTensor<T>& tsrOprand, CTensor<T>* pTsrResultconst ,std::vector<int64_t>& vctAxes);
378
379 virtual const CResult Ones();
380 virtual const CResult Sum(CTensor<T>* pTsrResult, int64_t i64Axis = -1, bool bKeepDim = false, const CTensor<T>& tsrInitial = CTensor<T>());
381 virtual const CResult Sum(CTensor<T>* pTsrResult, std::vector<int64_t> vtAxis, bool bKeepDim = false, const CTensor<T>& tsrInitial = CTensor<T>());
382
383 virtual const CResult Maximum(const CTensor<T>& tsrOpr2, CTensor<T>* pTsrResult);
384 virtual const CResult Minimum(const CTensor<T>& tsrOpr2, CTensor<T>* pTsrResult);
385
386 virtual const CResult Swap(CComputationalBase<T>& cbSwap) override;
387 virtual const CResult SwapMemory(CComputationalBase<T>& cbSwap);
388 virtual const CResult SwapAxes(CTensor<T>* pTsrResult, int64_t i64AxisOne, int64_t i64AxisOther);
389
390 virtual const CResult Permute(CTensor<T>* pTsrResult, const std::initializer_list<int64_t>& ilShape);
391 virtual const CResult Permute(CTensor<T>* pTsrResult, const std::vector<int64_t>& vctShape);
392
393 virtual const CResult Unique(CTensor<T>* pTsrResult);
394 virtual const CResult Unique(CTensor<T>* pTsrResult, int64_t i64Axis);
395 virtual const CResult Unique(CTensor<T>* pTsrResult, std::vector<int64_t>* pVctAdditionalResult, EUniqueResultSettings eResultSettings);
396 virtual const CResult Unique(CTensor<T>* pTsrResult, std::vector<int64_t>* pVctAdditionalResult, EUniqueResultSettings eResultSettings, int64_t i64Axis);
397 virtual const CResult Unique(CTensor<T>* pTsrResult, std::vector<int64_t>* pVctAdditionalResult0, std::vector<int64_t>* pVctAdditionalResult1, EUniqueResultSettings eResultSettings);
398 virtual const CResult Unique(CTensor<T>* pTsrResult, std::vector<int64_t>* pVctAdditionalResult0, std::vector<int64_t>* pVctAdditionalResult1, EUniqueResultSettings eResultSettings, int64_t i64Axis);
399 virtual const CResult Unique(CTensor<T>* pTsrResult, std::vector<int64_t>* pVctAdditionalResult0, std::vector<int64_t>* pVctAdditionalResult1, std::vector<int64_t>* pVctAdditionalResult2, EUniqueResultSettings eResultSettings);
400 virtual const CResult Unique(CTensor<T>* pTsrResult, std::vector<int64_t>* pVctAdditionalResult0, std::vector<int64_t>* pVctAdditionalResult1, std::vector<int64_t>* pVctAdditionalResult2, EUniqueResultSettings eResultSettings, int64_t i64Axis);
401
402 virtual const CResult Norm(CTensor<T>* pTsrResult, ENormOrder eNormOrder = ENormOrder_Frobenius, bool bKeepDim = false);
403 virtual const CResult Norm(CTensor<T>* pTsrResult, int64_t i64Order, bool bKeepDim = false);
404
405 virtual const CResult Norm(CTensor<T>* pTsrResult, const std::vector<int64_t>& vctAxes, ENormOrder eNormOrder = ENormOrder_Frobenius, bool bKeepDim = false);
406 virtual const CResult Norm(CTensor<T>* pTsrResult, const std::vector<int64_t>& vctAxes, int64_t i64Order = 0, bool bKeepDim = false);
407
408 virtual const CResult Norm(CTensor<T>* pTsrResult, const std::initializer_list<int64_t>& ilAxes, ENormOrder eNormOrder = ENormOrder_Frobenius, bool bKeepDim = false);
409 virtual const CResult Norm(CTensor<T>* pTsrResult, const std::initializer_list<int64_t>& ilAxes, int64_t i64Order = 0, bool bKeepDim = false);
410
411 virtual const CResult Where(const CTensor<T>& tsrCondition, CTensor<T>* pTsrResult);
412 virtual const CResult Where(const CTensor<T>* pTsrCondition, CTensor<T>* pTsrResult);
413 virtual const CResult Where(const CTensor<T>& tsrCondition, const CTensor<T>& tsrTrue, const CTensor<T>& tsrFalse, CTensor<T>* pTsrResult, bool bAdd = false);
414 virtual const CResult Where(const CTensor<T>* pTsrCondition, const CTensor<T>* pTsrTrue, const CTensor<T>* pTsrFalse, CTensor<T>* pTsrResult, bool bAdd = false);
415 virtual const CResult Where(const CTensor<T>& tsrCondition, const T tTrue, const CTensor<T>& tsrFalse, CTensor<T>* pTsrResult, bool bAdd = false);
416 virtual const CResult Where(const CTensor<T>* pTsrCondition, const T tTrue, const CTensor<T>* pTsrFalse, CTensor<T>* pTsrResult, bool bAdd = false);
417 virtual const CResult Where(const CTensor<T>& tsrCondition, const CTensor<T>& tsrTrue, const T tFalse, CTensor<T>* pTsrResult, bool bAdd = false);
418 virtual const CResult Where(const CTensor<T>* pTsrCondition, const CTensor<T>* pTsrTrue, const T tFalse, CTensor<T>* pTsrResult, bool bAdd = false);
419 virtual const CResult Where(const CTensor<T>& tsrCondition, const T tTrue, const T tFalse, CTensor<T>* pTsrResult, bool bAdd = false);
420 virtual const CResult Where(const CTensor<T>* pTsrCondition, const T tTrue, const T tFalse, CTensor<T>* pTsrResult, bool bAdd = false);
421
422 virtual const CResult Threshold(T tThreshold, T tValue, Base::ELogicalCondition eLogicalCondition, CTensor<T>* pTsrResult);
423 virtual const CResult Threshold(T tThreshold, T tInRangeValue, T tOutRangeValue, Base::ELogicalCondition eLogicalCondition, CTensor<T>* pTsrResult);
424
425 virtual const CResult SSIM(const Base::CFLImage& fliInput1, const Base::CFLImage& fliInput2, CTensor<T>* pTsrResult, T tMaxDiffValue = (T)INFINITY, int64_t i64FilterSize = 11, T tFilterSigma = (T)1.5, T tK1 = (T)0.01, T tK2 = (T)0.03, bool bReturnIndexMap = false);
426 virtual const CResult SSIM(const Base::CFLImage* pFliInput1, const Base::CFLImage* pFliInput2, CTensor<T>* pTsrResult, T tMaxDiffValue = (T)INFINITY, int64_t i64FilterSize = 11, T tFilterSigma = (T)1.5, T tK1 = (T)0.01, T tK2 = (T)0.03, bool bReturnIndexMap = false);
427
428 virtual const CResult SSIM(const CTensor<T>& tsrInput1, const CTensor<T>& tsrInput2, CTensor<T>* pTsrResult, T tMaxDiffValue = (T)INFINITY, int64_t i64FilterSize = 11, T tFilterSigma = (T)1.5, T tK1 = (T)0.01, T tK2 = (T)0.03, bool bReturnIndexMap = false);
429 virtual const CResult SSIM(const CTensor<T>* pTsrInput1, const CTensor<T>* pTsrInput2, CTensor<T>* pTsrResult, T tMaxDiffValue = (T)INFINITY, int64_t i64FilterSize = 11, T tFilterSigma = (T)1.5, T tK1 = (T)0.01, T tK2 = (T)0.03, bool bReturnIndexMap = false);
430
431 virtual const CResult SVD(CTensor<T>* pTsrUMatrix, CTensor<T>* pTsrSingular, CTensor<T>* pTsrVMatrix, bool bFullMatrices = true);
432
433 virtual const CResult Diag(CTensor<T>* pTsrResult, int64_t i64K = 0);
434 virtual const CResult Eye(CTensor<T>* pTsrResult, int64_t i64Row, int64_t i64Col = 0, int64_t i64K = 0);
435
436 virtual const CResult Unfold(CTensor<T>* pTsrResult, int64_t i64Dim, int64_t i64Size, int64_t i64Step);
437
438 virtual const CComputationalBase<T>* GetAt(const wchar_t* pWcsName) const override;
439 virtual const CResult FindByValueAttribute(EValueAttribute eValueAttribute, std::vector<const CComputationalBase<T>*>& vctResult) const override;
440
441 virtual const CResult PrintGraphInfo(bool bRecursively = true, bool bShapeOrderAsc = false, bool bIncludeTensors = false) const override;
442 virtual const CResult Print();
443
444 virtual const CResult EnableMemorySavingMode(bool bEnable = false);
445 virtual bool IsMemorySavingModeEnabled() const;
446
447 virtual const CResult SetImagePreprocessingAlgorithms(const std::vector<Foundation::CAlgorithmFeatureBase*>* vctPreprocessingAlgorithm);
448 virtual const std::vector<Foundation::CAlgorithmFeatureBase*>* GetImagePreprocessingAlgorithms() const;
449 static const CResult Preprocessing(Base::CFLImage& fliSrc, const std::vector<Foundation::CAlgorithmFeatureBase*>* vctPreprocessingAlgorithm);
450
451 virtual const CResult SetUpdateWeight(T tUpdateWeight);
452 virtual T GetUpdateWeight() const;
453
454 DeclareGetClassType();
455 SupportToDuplicateObject(CTensor, *this);
456
457 protected:
458 virtual const CResult RecalcPitchByRank();
459
460 virtual const CResult InternalCreate(const std::vector<int64_t>& vctBatchIndices, const Base::CFLImage* pFli, bool bNormalize, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
461 virtual const CResult InternalCreate(const std::vector<int64_t>& vctBatchIndices, const Base::CFLImage* pFli, const std::vector<int64_t>& vctNewSize, EResizeMethod eResizeMethod = EResizeMethod_ScaleAllAxises, bool bROIExtraction = false, bool bNormalize = true, const Base::CMultiVar<T>& mvBlankColor = 0., ImageProcessing::EInterpolationMethod eInterpolationMethod = ImageProcessing::EInterpolationMethod_Bilinear, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
462 protected:
463
464 std::vector<int64_t>& m_vctPitchByRank;
465 std::vector<int64_t>& m_vctPitchByRankAsc;
466
467 #ifdef CUDNN_MODE
468 CCuda_Tensor_Cudnn<T>* m_pCudnn;
469 #endif
470
471 T* m_pMemory;
472 int64_t m_i64Rank;
473 int64_t m_i64TotalElement;
474 int64_t m_i64TotalSizeByte;
475
476 Foundation::CFLFigureArray* m_pFlfaLabels;
477 Foundation::CFLFigureArray* m_pFlfaOrgBoundaryLabels;
478
479 T* m_pMemoryCuda;
480
481 bool m_bAutoDestroyCPUMemory;
482 bool m_bAutoDestroyCudaMemory;
483 bool m_bMemorySavingMode;
484
485 Base::CFLImage m_fliThreadBuffer;
486
487 #ifdef CUBLAS_MODE
488 CCuda_ComputationalGraphMatMul_Cublas<T>* m_pCublas;
489 #endif
490
491 std::vector<Foundation::CAlgorithmFeatureBase*>* m_pVctPreprocessingAlgorithm;
492
493 T m_tUpdateWeight;
494 public:
495 DeclareGetSignletonObject(CTensor);
496 };
497
498 #define CCGFTensor(...) (*(new CTensor<float>(__VA_ARGS__)))
499 #define CCGDTensor(...) (*(new CTensor<double>(__VA_ARGS__)))
500
501 typedef CTensor<float> CTensorF;
502 typedef CTensor<double> CTensorD;
503 }
504}
505
506#endif
@ Assign
Set the value of CGUIPropertyItemView3DFigure to the specified figure.
@ Clear
Clear all the figure objects.
@ Log
CGUIPaneLog 타입 Pane.
@ Sort
Sort the order of Figure Array or Multiple Figures.