| 49 | namespace |
| 50 | { |
| 51 | Status validate_arguments(const ITensorInfo *src1, |
| 52 | const ITensorInfo *src2, |
| 53 | const ITensorInfo *dst, |
| 54 | float scale, |
| 55 | ConvertPolicy overflow_policy, |
| 56 | RoundingPolicy rounding_policy, |
| 57 | const ActivationLayerInfo &act_info) |
| 58 | { |
| 59 | ARM_COMPUTE_UNUSED(overflow_policy); |
| 60 | ARM_COMPUTE_UNUSED(rounding_policy); |
| 61 | |
| 62 | ARM_COMPUTE_RETURN_ERROR_ON_NULLPTR(src1, src2, dst); |
| 63 | ARM_COMPUTE_RETURN_ERROR_ON_SIZE_UNSUPPORTED(src1, src2); |
| 64 | ARM_COMPUTE_RETURN_ERROR_ON_F16_UNSUPPORTED(src1); |
| 65 | ARM_COMPUTE_RETURN_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(src1, 1, DataType::U8, DataType::QASYMM8, |
| 66 | DataType::QASYMM8_SIGNED, DataType::S16, DataType::QSYMM16, |
| 67 | DataType::F16, DataType::S32, DataType::F32); |
| 68 | ARM_COMPUTE_RETURN_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(src2, 1, DataType::U8, DataType::QASYMM8, |
| 69 | DataType::QASYMM8_SIGNED, DataType::S16, DataType::QSYMM16, |
| 70 | DataType::F16, DataType::S32, DataType::F32); |
| 71 | ARM_COMPUTE_RETURN_ERROR_ON_MSG(scale < 0, "Scale cannot be negative."); |
| 72 | ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled() && !is_data_type_float(dst->data_type())); |
| 73 | |
| 74 | // Check whether it is in_place calculation |
| 75 | const bool in_place = (src1 == dst) || (src2 == dst); |
| 76 | const bool src1_in_place = in_place && (src1 == dst); |
| 77 | |
| 78 | const TensorShape &out_shape = TensorShape::broadcast_shape(src1->tensor_shape(), src2->tensor_shape()); |
| 79 | |
| 80 | ARM_COMPUTE_RETURN_ERROR_ON_MSG(out_shape.total_size() == 0, "Inputs are not broadcast compatible"); |
| 81 | |
| 82 | // Validate in case of configured dst |
| 83 | if (dst->total_size() > 0) |
| 84 | { |
| 85 | ARM_COMPUTE_RETURN_ERROR_ON_SIZE_UNSUPPORTED(dst); |
| 86 | ARM_COMPUTE_RETURN_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(dst, 1, DataType::U8, DataType::QASYMM8, |
| 87 | DataType::QASYMM8_SIGNED, DataType::S16, DataType::QSYMM16, |
| 88 | DataType::F16, DataType::S32, DataType::F32); |
| 89 | ARM_COMPUTE_RETURN_ERROR_ON_MSG(dst->data_type() == DataType::U8 && |
| 90 | (src1->data_type() != DataType::U8 || src2->data_type() != DataType::U8), |
| 91 | "Dst can only be U8 if both src are U8"); |
| 92 | ARM_COMPUTE_RETURN_ERROR_ON_MSG( |
| 93 | dst->data_type() == DataType::QASYMM8 && |
| 94 | (src1->data_type() != DataType::QASYMM8 || src2->data_type() != DataType::QASYMM8), |
| 95 | "Dst can only be QASYMM8 if both src are QASYMM8"); |
| 96 | ARM_COMPUTE_RETURN_ERROR_ON_MSG( |
| 97 | dst->data_type() == DataType::QASYMM8_SIGNED && |
| 98 | (src1->data_type() != DataType::QASYMM8_SIGNED || src2->data_type() != DataType::QASYMM8_SIGNED), |
| 99 | "Dst can only be QASYMM8_SIGNED if both src are QASYMM8_SIGNED"); |
| 100 | ARM_COMPUTE_RETURN_ERROR_ON_MSG( |
| 101 | dst->data_type() == DataType::QSYMM16 && |
| 102 | (src1->data_type() != DataType::QSYMM16 || src2->data_type() != DataType::QSYMM16), |
| 103 | "Dst can only be QSYMM16 if both src are QSYMM16"); |
| 104 | ARM_COMPUTE_RETURN_ERROR_ON_MSG((src1->data_type() == DataType::S32 || src2->data_type() == DataType::S32) && |
| 105 | (dst->data_type() != DataType::S32), |
| 106 | "Dst must be S32 if source tensors are S32"); |
| 107 | if (in_place) |
| 108 | { |
no test coverage detected