--- /dev/null
+#include <nnkit/Action.h>
+
+#include <nncc/core/ADT/tensor/IndexEnumerator.h>
+
+#include <iostream>
+
+using nncc::core::ADT::tensor::Index;
+using nncc::core::ADT::tensor::IndexEnumerator;
+
+std::ostream &operator<<(std::ostream &os, const Index &index)
+{
+ if (index.rank() > 0)
+ {
+ os << index.at(0);
+ for (uint32_t axis = 1; axis < index.rank(); ++axis)
+ {
+ os << "," << index.at(axis);
+ }
+ }
+ return os;
+}
+
+struct ShowAction final : public nnkit::Action
+{
+ void run(nnkit::TensorContext &ctx) override;
+};
+
+void ShowAction::run(nnkit::TensorContext &ctx)
+{
+ std::cout << "count: " << ctx.size() << std::endl;
+ for (uint32_t n = 0; n < ctx.size(); ++n)
+ {
+ std::cout << " tensor(" << n << ") : " << ctx.name(n) << std::endl;
+
+ using nncc::core::ADT::tensor::Reader;
+ using nnkit::TensorContext;
+
+ ctx.getConstFloatTensor(n, [] (const TensorContext &ctx, uint32_t n, const Reader<float> &t)
+ {
+ for (IndexEnumerator e{ctx.shape(n)}; e.valid(); e.advance())
+ {
+ const auto &index = e.current();
+
+ std::cout << " " << index << ": " << t.at(index) << std::endl;
+ }
+ });
+ }
+}
+
+#include <nnkit/CmdlineArguments.h>
+#include <nncc/foundation/Memory.h>
+
+extern "C" std::unique_ptr<nnkit::Action> make_action(const nnkit::CmdlineArguments &args)
+{
+ return nncc::foundation::make_unique<ShowAction>();
+}