--- /dev/null
+struct Command
+{
+ virtual ~Command() = default;
+
+ virtual int run(int argc, char **argv) const = 0;
+};
+
+#include "tensorflow/contrib/lite/kernels/register.h"
+#include "tensorflow/contrib/lite/model.h"
+
+#include <iostream>
+
+using namespace tflite;
+using namespace tflite::ops::builtin;
+
+class RunCommand final : public Command
+{
+public:
+ int run(int argc, char **argv) const override;
+};
+
+int RunCommand::run(int argc, char **argv) const
+{
+ // USAGE: HEADER run [.tflite]
+ const auto filename = argv[0];
+
+ StderrReporter error_reporter;
+
+ auto model = FlatBufferModel::BuildFromFile(filename, &error_reporter);
+
+ std::unique_ptr<Interpreter> interpreter;
+
+ TfLiteStatus status = kTfLiteError;
+
+ BuiltinOpResolver resolver;
+ InterpreterBuilder builder(*model, resolver);
+
+ status = builder(&interpreter);
+ assert(status == kTfLiteOk);
+
+ interpreter->SetNumThreads(1);
+
+ status = interpreter->AllocateTensors();
+ assert(status == kTfLiteOk);
+
+ status = interpreter->Invoke();
+ assert(status == kTfLiteOk);
+
+ std::cout << "# of outputs: " << interpreter->outputs().size() << std::endl;
+
+ return 0;
+}
+
+#include <nncc/foundation/Memory.h>
+
+#include <map>
+#include <memory>
+#include <string>
+
+int main(int argc, char **argv)
+{
+ std::map<std::string, std::unique_ptr<Command>> commands;
+
+ commands["run"] = nncc::foundation::make_unique<RunCommand>();
+
+ if (argc < 2)
+ {
+ std::cerr << "ERROR: COMMAND is not provided" << std::endl;
+ std::cerr << std::endl;
+ std::cerr << "USAGE: " << argv[0] << " [COMMAND] ..." << std::endl;
+ return 255;
+ }
+
+ // USAGE: HEADER [command] ...
+ if (commands.find(argv[1]) == commands.end())
+ {
+ std::cerr << "ERROR: '" << argv[1] << "' is not a valid command" << std::endl;
+ std::cerr << std::endl;
+ std::cerr << "USAGE: " << argv[0] << " [COMMAND] ..." << std::endl;
+ std::cerr << std::endl;
+ std::cerr << "SUPPORTED COMMANDS:" << std::endl;
+ for (auto it = commands.begin(); it != commands.end(); ++it)
+ {
+ std::cerr << " " << it->first << std::endl;
+ }
+ return 255;
+ }
+
+ return commands.at(argv[1])->run(argc - 2, argv + 2);
+}