| 107 | { |
| 108 | |
| 109 | std::vector<std::shared_ptr<Tensor>> interpret(const luci::Module *module, |
| 110 | const InputDataLoader::Data &data) |
| 111 | { |
| 112 | auto interpreter = std::make_unique<luci_interpreter::Interpreter>(module); |
| 113 | |
| 114 | auto input_nodes = ::inputs_of(module); |
| 115 | auto output_nodes = ::outputs_of(module); |
| 116 | |
| 117 | for (uint32_t input_idx = 0; input_idx < data.size(); input_idx++) |
| 118 | { |
| 119 | auto input_node = loco::must_cast<const luci::CircleInput *>(input_nodes[input_idx]); |
| 120 | assert(input_node->index() == input_idx); |
| 121 | |
| 122 | auto input_data = data.at(input_idx); |
| 123 | interpreter->writeInputTensor(input_node, input_data.buffer(), input_data.byte_size()); |
| 124 | } |
| 125 | |
| 126 | interpreter->interpret(); |
| 127 | |
| 128 | std::vector<std::shared_ptr<Tensor>> outputs; |
| 129 | for (uint32_t output_idx = 0; output_idx < output_nodes.size(); output_idx++) |
| 130 | { |
| 131 | auto output_node = loco::must_cast<const luci::CircleOutput *>(output_nodes[output_idx]); |
| 132 | assert(output_node->index() == output_idx); |
| 133 | |
| 134 | auto tensor = createEmptyTensor(output_node); |
| 135 | interpreter->readOutputTensor(output_node, tensor->buffer(), tensor->byte_size()); |
| 136 | outputs.emplace_back(tensor); |
| 137 | } |
| 138 | |
| 139 | return outputs; |
| 140 | } |
| 141 | |
| 142 | CircleEvalDiff::CircleEvalDiff(std::unique_ptr<Context> &&ctx) : _ctx(std::move(ctx)) |
| 143 | { |
no test coverage detected