/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef __NEURUN_UTIL_FEATURE_NCHW_VIEW_H__ #define __NEURUN_UTIL_FEATURE_NCHW_VIEW_H__ #include "misc/feature/Reader.h" #include "misc/feature/Shape.h" #include "backend/interface/operand/ITensor.h" #include "util/feature/Coordinate4D.h" #include namespace neurun { namespace util { namespace feature { namespace nchw { template class View final : public nnfw::misc::feature::Reader { public: View(::neurun::backend::operand::ITensor *tensor) : _tensor{tensor} { // TODO Validate whether tensor is a feature map, or not _shape.N = tensor->dimension(3); _shape.C = tensor->dimension(2); _shape.H = tensor->dimension(1); _shape.W = tensor->dimension(0); } public: const ::nnfw::misc::feature::Shape &shape(void) const { return _shape; } public: T at(uint32_t ch, uint32_t row, uint32_t col) const override { const auto offset = feature_index_to_byte_offset(0, ch, row, col); T *ptr = reinterpret_cast(_tensor->buffer() + offset); return *ptr; } T at(uint32_t batch, uint32_t ch, uint32_t row, uint32_t col) const override { const auto offset = feature_index_to_byte_offset(batch, ch, row, col); T *ptr = reinterpret_cast(_tensor->buffer() + offset); return *ptr; } public: T &at(uint32_t ch, uint32_t row, uint32_t col) { const auto offset = feature_index_to_byte_offset(0, ch, row, col); T *ptr = reinterpret_cast(_tensor->buffer() + offset); return *ptr; } T &at(uint32_t batch, uint32_t ch, uint32_t row, uint32_t col) { const auto offset = feature_index_to_byte_offset(batch, ch, row, col); T *ptr = reinterpret_cast(_tensor->buffer() + offset); return *ptr; } private: size_t feature_index_to_byte_offset(uint32_t batch, uint32_t ch, uint32_t row, uint32_t col) const { return _tensor->calcOffset( neurun::util::feature::Coordinate4D{static_cast(batch), static_cast(row), static_cast(col), static_cast(ch)}); } private: ::nnfw::misc::feature::Shape _shape; ::neurun::backend::operand::ITensor *_tensor; }; } // namespace nchw } // namespace feature } // namespace util } // namespace neurun #endif // __NEURUN_UTIL_FEATURE_NCHW_VIEW_H__