diff options
Diffstat (limited to 'runtimes/libs/tflite/src/ext/nnapi_delegate_ex_AddOpsAndParams_lambda.inc')
-rw-r--r-- | runtimes/libs/tflite/src/ext/nnapi_delegate_ex_AddOpsAndParams_lambda.inc | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/runtimes/libs/tflite/src/ext/nnapi_delegate_ex_AddOpsAndParams_lambda.inc b/runtimes/libs/tflite/src/ext/nnapi_delegate_ex_AddOpsAndParams_lambda.inc new file mode 100644 index 000000000..a3e99ee7a --- /dev/null +++ b/runtimes/libs/tflite/src/ext/nnapi_delegate_ex_AddOpsAndParams_lambda.inc @@ -0,0 +1,123 @@ +// This file is included from AddOpsAndParams defined in nnapi_delegate.cc +// and contains lambda for extened implementation to original Tensorflow Lite. + auto add_resize_bilinear_params = [&add_scalar_int32, &interpreter, &augmented_inputs](void* data) { + auto builtin = reinterpret_cast<TfLiteResizeBilinearParams*>(data); + if (builtin->align_corners) { + FATAL("Resize bilinear does not support align corners in NNAPI"); + } + + TfLiteTensor* tensor = interpreter->tensor(augmented_inputs.back()); + assert(tensor->type == kTfLiteInt32); + assert(tensor->bytes == sizeof(int)*2); + augmented_inputs.pop_back(); + + int height = ((int*)(tensor->data.raw))[1]; + int width = ((int*)(tensor->data.raw))[0]; + add_scalar_int32(height); + add_scalar_int32(width); + }; + + auto add_transpose_conv_params = [&add_scalar_int32](void* data) { + auto builtin = reinterpret_cast<TfLiteTransposeConvParams*>(data); + add_scalar_int32(builtin->padding); + add_scalar_int32(builtin->stride_width); + add_scalar_int32(builtin->stride_height); + }; + + auto add_lrn_params = [&add_scalar_int32, + &add_scalar_float32](void* data) { + auto builtin = reinterpret_cast<TfLiteLocalResponseNormParams*>(data); + add_scalar_int32(builtin->radius); + add_scalar_float32(builtin->bias); + add_scalar_float32(builtin->alpha); + add_scalar_float32(builtin->beta); + }; + + auto add_strided_slice_params = [&add_scalar_int32](void* data) { + auto builtin = reinterpret_cast<TfLiteStridedSliceParams*>(data); + add_scalar_int32(builtin->begin_mask); + add_scalar_int32(builtin->end_mask); + // ellipsis_mask and new_axis_mask are not supported on nn runtime + // cf) tflite interpreter supports both operations + if (builtin->ellipsis_mask) { + FATAL("STRIDE_SLICE does not support ellipsis_mask in NNAPI"); + } + if (builtin->new_axis_mask) { + FATAL("STRIDE_SLICE does not support new_axis_mask in NNAPI"); + } + add_scalar_int32(builtin->shrink_axis_mask); + }; + + auto add_gather_ex_params = [&add_scalar_int32](void* data) { + auto builtin = reinterpret_cast<TfLiteGatherParams*>(data); + add_scalar_int32(builtin->axis); + if (builtin->axis != 0) { + FATAL("GATHER does not support axis>0 in NNAPI"); + } + }; + +#if TFLITE_MAJOR_VER == 1 && TFLITE_MINOR_VER == 13 + auto add_pack_ex_params = [&add_scalar_int32](void* data) { + auto builtin = reinterpret_cast<TfLitePackParams*>(data); + add_scalar_int32(builtin->values_count); + add_scalar_int32(builtin->axis); + }; + + auto add_unpack_ex_params = [&add_scalar_int32](void* data) { + auto builtin = reinterpret_cast<TfLiteUnpackParams*>(data); + add_scalar_int32(builtin->num); + add_scalar_int32(builtin->axis); + }; +#endif + + auto check_batch_to_space_params = [interpreter, &node, &augmented_inputs]() { + + //If there are 3 inputs, check if crops is having default values {0, 0, 0, 0} + //Else unsupported by NNAPI + + if(augmented_inputs.size() == 3) + { + const uint32_t crops_buffer_index = node.inputs->data[2]; + const TfLiteTensor* crops = interpreter->tensor(crops_buffer_index); + const int *crops_value = crops->data.i32; + + //Check if crops is having default values {0, 0, 0, 0} + if(crops_value[0] != 0 || crops_value[1] != 0 || crops_value[2] != 0 || crops_value[3] != 0) + { + FATAL("BATCH_TO_SPACE_ND does not support Explicit crops in NNAPI"); + } + else + { + //Restrict crops input and pass only other two inputs + augmented_inputs.pop_back(); + } + } + }; + + auto add_split_params = [&add_scalar_int32, &augmented_inputs](void* data) { + // swap 1st and 2nd operand order + auto input_tensor = augmented_inputs[1]; + auto axis = augmented_inputs[0]; + augmented_inputs[0] = input_tensor; + augmented_inputs[1] = axis; + + auto builtin = reinterpret_cast<TfLiteSplitParams*>(data); + add_scalar_int32(builtin->num_splits); + }; + + auto check_arg_max_input = [&interpreter, &augmented_inputs](void *data) { + auto params = reinterpret_cast<TfLiteArgMaxParams*>(data); + if (params->output_type != kTfLiteInt32) + { + FATAL("Cannot handle output type in NNAPI"); + } + + TfLiteTensor* axis_tensor = interpreter->tensor(augmented_inputs.back()); + assert(axis_tensor->type == kTfLiteInt32); + + int64_t count = 1; + for (int i = 0; i < axis_tensor->dims->size; ++i) { + count *= axis_tensor->dims->data[i]; + } + assert(count == 1); + }; |