52 runtime_kernel.
readKernel(op_index, runtime_context);
54 const circle::Tensor *input = runtime_kernel.
inputs[inputTensorIdx];
55 const circle::Tensor *weight = runtime_kernel.
inputs[weightTensorIdx];
56 const circle::Tensor *bias = runtime_kernel.
inputs[biasTensorIdx];
58 const circle::Tensor *output = runtime_kernel.
outputs[outputTensorIdx];
60 assert(input !=
nullptr);
61 assert(weight !=
nullptr);
63 assert(output !=
nullptr);
66 const auto *options = runtime_kernel.
first_operator->builtin_options_as_DepthwiseConv2DOptions();
73 status = utils::checkCondition(input->type() == output->type());
77 status = utils::checkCondition(input->type() == weight->type());
95 status = utils::checkCondition(
96 bias ==
nullptr or (bias_shape.
dimensionsCount() == 1 && bias_shape.
dims(0) == output_depth));
100 switch (options->fused_activation_function())
102 case circle::ActivationFunctionType_NONE:
103 case circle::ActivationFunctionType_RELU:
104 case circle::ActivationFunctionType_RELU6:
105 case circle::ActivationFunctionType_RELU_N1_TO_1:
111 if (input->type() == circle::TensorType_FLOAT32)
113 status = utils::checkCondition(bias ==
nullptr or input->type() == bias->type());
117 auto input_quant = input->quantization();
118 auto filter_quant = weight->quantization();
119 auto output_quant = output->quantization();
121 status = utils::checkCondition(input_quant !=
nullptr and filter_quant !=
nullptr and
122 output_quant !=
nullptr);
126 auto input_scales = input_quant->scale();
127 auto filter_scales = filter_quant->scale();
128 auto output_scales = output_quant->scale();
130 status = utils::checkCondition(input_scales !=
nullptr and filter_scales !=
nullptr and
131 output_scales !=
nullptr);
136 status = utils::checkCondition(filter_scales->size() > 1);