| 5 | using namespace test; |
| 6 | |
| 7 | TEST(INSTRUCTION, SubTensorTest) { |
| 8 | std::vector<Instruction> insts; |
| 9 | std::vector<std::shared_ptr<Tensor>> in_tensors; |
| 10 | std::vector<std::shared_ptr<Tensor>> out_tensors; |
| 11 | std::vector<Tensor*> inputs; |
| 12 | |
| 13 | //! input shape =[20, 20, 20] |
| 14 | std::vector<float> data(20 * 20 * 20); |
| 15 | for (size_t i = 0; i < 20 * 20 * 20; i++) { |
| 16 | data[i] = i; |
| 17 | } |
| 18 | auto src_tensor = create_tensor({20, 20, 20}, TinyNN_FLOAT, data.data()); |
| 19 | |
| 20 | auto create_subtensor = [&](IndexDesc* index, IndexDesc* flag, |
| 21 | std::vector<uint32_t> scaler_value = {}) { |
| 22 | auto subtensor = std::make_shared<SubTensor>(); |
| 23 | inputs.clear(); |
| 24 | inputs.push_back(src_tensor.get()); |
| 25 | if (flag->start == 1) { |
| 26 | in_tensors.push_back(create_scalar_tensor(scaler_value[0], TinyNN_INT)); |
| 27 | inputs.push_back(in_tensors.back().get()); |
| 28 | scaler_value.erase(scaler_value.begin()); |
| 29 | } |
| 30 | if (flag->end == 1) { |
| 31 | in_tensors.push_back(create_scalar_tensor(scaler_value[0], TinyNN_INT)); |
| 32 | inputs.push_back(in_tensors.back().get()); |
| 33 | scaler_value.erase(scaler_value.begin()); |
| 34 | } |
| 35 | if (flag->step == 1) { |
| 36 | in_tensors.push_back(create_scalar_tensor(scaler_value[0], TinyNN_INT)); |
| 37 | inputs.push_back(in_tensors.back().get()); |
| 38 | scaler_value.erase(scaler_value.begin()); |
| 39 | } |
| 40 | if (flag->index == 1) { |
| 41 | in_tensors.push_back(create_scalar_tensor(scaler_value[0], TinyNN_INT)); |
| 42 | inputs.push_back(in_tensors.back().get()); |
| 43 | scaler_value.erase(scaler_value.begin()); |
| 44 | } |
| 45 | auto output = std::make_shared<Tensor>(); |
| 46 | output->is_dynamic = true; |
| 47 | out_tensors.push_back(output); |
| 48 | |
| 49 | subtensor->nr_descs = 1; |
| 50 | subtensor->descs = index; |
| 51 | subtensor->flags = flag; |
| 52 | |
| 53 | subtensor->nr_input = inputs.size(); |
| 54 | subtensor->inputs = inputs.data(); |
| 55 | subtensor->output = out_tensors.back().get(); |
| 56 | return subtensor; |
| 57 | }; |
| 58 | VM* vm = create_vm(); |
| 59 | auto test_subtensor = [&](IndexDesc* index, IndexDesc* flag, const Tensor& expect, |
| 60 | std::vector<uint32_t> input_idx = {}) { |
| 61 | auto subtensor = create_subtensor(index, flag, input_idx); |
| 62 | Instruction inst; |
| 63 | inst.tag = TinyNN_INST_SUBTENSOR; |
| 64 | inst.workload.subtensor = *subtensor; |
nothing calls this directly
no test coverage detected