[nnkit] Introduce 'TensorContext' interface (#240)
author박종현/동작제어Lab(SR)/Senior Engineer/삼성전자 <jh1302.park@samsung.com>
Wed, 23 May 2018 23:48:58 +0000 (08:48 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Wed, 23 May 2018 23:48:58 +0000 (08:48 +0900)
* [nnkit] Introduce 'TensorContext' interface

This commit introduces 'nnkit::TensorContext' interface which all nnkit
actions and backends will use.

Signed-off-by: Jonghyun Park <jh1302.park@samsung.com>
* Fix typos

contrib/nnkit/CMakeLists.txt
contrib/nnkit/libs/CMakeLists.txt [new file with mode: 0644]
contrib/nnkit/libs/intf/CMakeLists.txt [new file with mode: 0644]
contrib/nnkit/libs/intf/tensor/CMakeLists.txt [new file with mode: 0644]
contrib/nnkit/libs/intf/tensor/include/nnkit/TensorContext.h [new file with mode: 0644]

index d470150..d4281ab 100644 (file)
@@ -9,4 +9,5 @@ macro(nnkit_add_backend PREFIX)
   set_property(TARGET ${PREFIX} PROPERTY INTERFACE_LINK_LIBRARIES -Wl,--whole-archive,$<TARGET_FILE:${PREFIX}>,--no-whole-archive)
 endmacro(nnkit_add_backend)
 
+add_subdirectory(libs)
 add_subdirectory(tools)
diff --git a/contrib/nnkit/libs/CMakeLists.txt b/contrib/nnkit/libs/CMakeLists.txt
new file mode 100644 (file)
index 0000000..c1f4b8a
--- /dev/null
@@ -0,0 +1 @@
+add_subdirectory(intf)
diff --git a/contrib/nnkit/libs/intf/CMakeLists.txt b/contrib/nnkit/libs/intf/CMakeLists.txt
new file mode 100644 (file)
index 0000000..22c826b
--- /dev/null
@@ -0,0 +1 @@
+add_subdirectory(tensor)
diff --git a/contrib/nnkit/libs/intf/tensor/CMakeLists.txt b/contrib/nnkit/libs/intf/tensor/CMakeLists.txt
new file mode 100644 (file)
index 0000000..cbb26a7
--- /dev/null
@@ -0,0 +1,3 @@
+add_library(nnkit_intf_tensor INTERFACE)
+target_include_directories(nnkit_intf_tensor INTERFACE include)
+target_link_libraries(nnkit_intf_tensor INTERFACE nncc_core)
diff --git a/contrib/nnkit/libs/intf/tensor/include/nnkit/TensorContext.h b/contrib/nnkit/libs/intf/tensor/include/nnkit/TensorContext.h
new file mode 100644 (file)
index 0000000..f7846e1
--- /dev/null
@@ -0,0 +1,61 @@
+#ifndef __NNKIT_TENSOR_CONTEXT_H__
+#define __NNKIT_TENSOR_CONTEXT_H__
+
+#include <nncc/core/ADT/tensor/Shape.h>
+#include <nncc/core/ADT/tensor/Reader.h>
+#include <nncc/core/ADT/tensor/Accessor.h>
+
+#include <string>
+#include <functional>
+
+#include <cstdint>
+
+namespace nnkit
+{
+
+// NOTE This interface is subject to change.
+struct TensorContext
+{
+  template<typename T>
+  using TypedReader = std::function<void (const TensorContext &, uint32_t n, const nncc::core::ADT::tensor::Reader<T> &)>;
+
+  template<typename T>
+  using TypedAccessor = std::function<void (const TensorContext &, uint32_t n, nncc::core::ADT::tensor::Accessor<T> &)>;
+
+  virtual ~TensorContext() = default;
+
+  // The number of tensors that this context provides
+  virtual uint32_t size(void) const = 0;
+
+  // Query on properties of each tensor
+  virtual std::string name(uint32_t n) const = 0;
+  virtual nncc::core::ADT::tensor::Shape shape(uint32_t n) const = 0;
+
+  // TODO Support generic byte tensor
+  // TODO Support typed tensor for primitive types such as half(fp16), double(fp64), int8(s8), int32(s32), uint8(u8), uint(u32)
+
+  // Float (fp32) tensor support
+  virtual bool isFloatTensor(uint32_t n) const = 0;
+
+  virtual void getMutableFloatTensor(uint32_t n, const TypedAccessor<float> &cb) = 0;
+  void getMutableFloatTensor(uint32_t n, const std::function<void (nncc::core::ADT::tensor::Accessor<float> &)> &f)
+  {
+    getMutableFloatTensor(n, [&f] (const TensorContext &, uint32_t, nncc::core::ADT::tensor::Accessor<float> &t)
+    {
+      f(t);
+    });
+  }
+
+  virtual void getConstFloatTensor(uint32_t n, const TypedReader<float> &cb) const = 0;
+  void getConstFloatTensor(uint32_t n, const std::function<void (const nncc::core::ADT::tensor::Reader<float> &)> &f) const
+  {
+    getConstFloatTensor(n, [&f] (const TensorContext &, uint32_t, const nncc::core::ADT::tensor::Reader<float> &t)
+    {
+      f(t);
+    });
+  }
+};
+
+} // namespace nnkit
+
+#endif // __NNKIT_TENSOR_CONTEXT_H__