|
|
|
@ -20,44 +20,102 @@
|
|
|
|
|
#endif
|
|
|
|
|
#include "nnacl/errorcode.h"
|
|
|
|
|
|
|
|
|
|
int ElementNotEqual(int8_t *input0, int8_t *input1, int8_t *output, int element_size) {
|
|
|
|
|
#define ACCURACY_DATA 0.00000001
|
|
|
|
|
|
|
|
|
|
int ElementNotEqualInt8(int8_t *input0, int8_t *input1, int8_t *output, int element_size,
|
|
|
|
|
ArithmeticQuantArg *quant_arg) {
|
|
|
|
|
float in0_bias = -quant_arg->in0_args_.zp_ * quant_arg->in0_args_.scale_;
|
|
|
|
|
float in1_bias = -quant_arg->in1_args_.zp_ * quant_arg->in1_args_.scale_;
|
|
|
|
|
float output_inverse_scale = 1.f / quant_arg->out_args_.scale_;
|
|
|
|
|
float out_zp = quant_arg->out_args_.zp_;
|
|
|
|
|
for (int index = 0; index < element_size; ++index) {
|
|
|
|
|
output[index] = (int8_t)(input0[index] != input1[index]);
|
|
|
|
|
float in0_real = input0[index] * quant_arg->in0_args_.scale_ + in0_bias;
|
|
|
|
|
float in1_real = input1[index] * quant_arg->in1_args_.scale_ + in1_bias;
|
|
|
|
|
float minus_inputs = in0_real - in1_real;
|
|
|
|
|
float out_real = (float)true;
|
|
|
|
|
if (minus_inputs >= -ACCURACY_DATA && minus_inputs <= ACCURACY_DATA) {
|
|
|
|
|
out_real = (float)false;
|
|
|
|
|
}
|
|
|
|
|
output[index] = (int8_t)(out_real * output_inverse_scale + out_zp);
|
|
|
|
|
}
|
|
|
|
|
return NNACL_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int ElementEqual(int8_t *input0, int8_t *input1, int8_t *output, int element_size) {
|
|
|
|
|
int ElementEqualInt8(int8_t *input0, int8_t *input1, int8_t *output, int element_size, ArithmeticQuantArg *quant_arg) {
|
|
|
|
|
float in0_bias = -quant_arg->in0_args_.zp_ * quant_arg->in0_args_.scale_;
|
|
|
|
|
float in1_bias = -quant_arg->in1_args_.zp_ * quant_arg->in1_args_.scale_;
|
|
|
|
|
float output_inverse_scale = 1.f / quant_arg->out_args_.scale_;
|
|
|
|
|
float out_zp = quant_arg->out_args_.zp_;
|
|
|
|
|
for (int index = 0; index < element_size; ++index) {
|
|
|
|
|
output[index] = (int8_t)(input0[index] == input1[index]);
|
|
|
|
|
float in0_real = input0[index] * quant_arg->in0_args_.scale_ + in0_bias;
|
|
|
|
|
float in1_real = input1[index] * quant_arg->in1_args_.scale_ + in1_bias;
|
|
|
|
|
float minus_inputs = in0_real - in1_real;
|
|
|
|
|
float out_real = (float)false;
|
|
|
|
|
if (minus_inputs >= -ACCURACY_DATA && minus_inputs <= ACCURACY_DATA) {
|
|
|
|
|
out_real = (float)true;
|
|
|
|
|
}
|
|
|
|
|
output[index] = (int8_t)(out_real * output_inverse_scale + out_zp);
|
|
|
|
|
}
|
|
|
|
|
return NNACL_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int ElementLess(int8_t *input0, int8_t *input1, int8_t *output, int element_size) {
|
|
|
|
|
int ElementLessInt8(int8_t *input0, int8_t *input1, int8_t *output, int element_size, ArithmeticQuantArg *quant_arg) {
|
|
|
|
|
float in0_bias = -quant_arg->in0_args_.zp_ * quant_arg->in0_args_.scale_;
|
|
|
|
|
float in1_bias = -quant_arg->in1_args_.zp_ * quant_arg->in1_args_.scale_;
|
|
|
|
|
float output_inverse_scale = 1.f / quant_arg->out_args_.scale_;
|
|
|
|
|
float out_zp = quant_arg->out_args_.zp_;
|
|
|
|
|
for (int index = 0; index < element_size; ++index) {
|
|
|
|
|
output[index] = (int8_t)(input0[index] < input1[index]);
|
|
|
|
|
float in0_real = input0[index] * quant_arg->in0_args_.scale_ + in0_bias;
|
|
|
|
|
float in1_real = input1[index] * quant_arg->in1_args_.scale_ + in1_bias;
|
|
|
|
|
float out_real = (float)(in0_real < in1_real);
|
|
|
|
|
output[index] = (int8_t)(out_real * output_inverse_scale + out_zp);
|
|
|
|
|
}
|
|
|
|
|
return NNACL_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int ElementLessEqual(int8_t *input0, int8_t *input1, int8_t *output, int element_size) {
|
|
|
|
|
int ElementLessEqualInt8(int8_t *input0, int8_t *input1, int8_t *output, int element_size,
|
|
|
|
|
ArithmeticQuantArg *quant_arg) {
|
|
|
|
|
float in0_bias = -quant_arg->in0_args_.zp_ * quant_arg->in0_args_.scale_;
|
|
|
|
|
float in1_bias = -quant_arg->in1_args_.zp_ * quant_arg->in1_args_.scale_;
|
|
|
|
|
float output_inverse_scale = 1.f / quant_arg->out_args_.scale_;
|
|
|
|
|
float out_zp = quant_arg->out_args_.zp_;
|
|
|
|
|
for (int index = 0; index < element_size; ++index) {
|
|
|
|
|
output[index] = (int8_t)(input0[index] <= input1[index]);
|
|
|
|
|
float in0_real = input0[index] * quant_arg->in0_args_.scale_ + in0_bias;
|
|
|
|
|
float in1_real = input1[index] * quant_arg->in1_args_.scale_ + in1_bias;
|
|
|
|
|
float out_real = (float)(in0_real <= in1_real);
|
|
|
|
|
output[index] = (int8_t)(out_real * output_inverse_scale + out_zp);
|
|
|
|
|
}
|
|
|
|
|
return NNACL_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int ElementGreater(int8_t *input0, int8_t *input1, int8_t *output, int element_size) {
|
|
|
|
|
int ElementGreaterInt8(int8_t *input0, int8_t *input1, int8_t *output, int element_size,
|
|
|
|
|
ArithmeticQuantArg *quant_arg) {
|
|
|
|
|
float in0_bias = -quant_arg->in0_args_.zp_ * quant_arg->in0_args_.scale_;
|
|
|
|
|
float in1_bias = -quant_arg->in1_args_.zp_ * quant_arg->in1_args_.scale_;
|
|
|
|
|
float output_inverse_scale = 1.f / quant_arg->out_args_.scale_;
|
|
|
|
|
float out_zp = quant_arg->out_args_.zp_;
|
|
|
|
|
for (int index = 0; index < element_size; ++index) {
|
|
|
|
|
output[index] = (int8_t)(input0[index] > input1[index]);
|
|
|
|
|
float in0_real = input0[index] * quant_arg->in0_args_.scale_ + in0_bias;
|
|
|
|
|
float in1_real = input1[index] * quant_arg->in1_args_.scale_ + in1_bias;
|
|
|
|
|
float out_real = (float)(in0_real > in1_real);
|
|
|
|
|
output[index] = (int8_t)(out_real * output_inverse_scale + out_zp);
|
|
|
|
|
}
|
|
|
|
|
return NNACL_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int ElementGreaterEqual(int8_t *input0, int8_t *input1, int8_t *output, int element_size) {
|
|
|
|
|
int ElementGreaterEqualInt8(int8_t *input0, int8_t *input1, int8_t *output, int element_size,
|
|
|
|
|
ArithmeticQuantArg *quant_arg) {
|
|
|
|
|
float in0_bias = -quant_arg->in0_args_.zp_ * quant_arg->in0_args_.scale_;
|
|
|
|
|
float in1_bias = -quant_arg->in1_args_.zp_ * quant_arg->in1_args_.scale_;
|
|
|
|
|
float output_inverse_scale = 1.f / quant_arg->out_args_.scale_;
|
|
|
|
|
float out_zp = quant_arg->out_args_.zp_;
|
|
|
|
|
for (int index = 0; index < element_size; ++index) {
|
|
|
|
|
output[index] = (int8_t)(input0[index] >= input1[index]);
|
|
|
|
|
float in0_real = input0[index] * quant_arg->in0_args_.scale_ + in0_bias;
|
|
|
|
|
float in1_real = input1[index] * quant_arg->in1_args_.scale_ + in1_bias;
|
|
|
|
|
float out_real = (float)(in0_real >= in1_real);
|
|
|
|
|
output[index] = (int8_t)(out_real * output_inverse_scale + out_zp);
|
|
|
|
|
}
|
|
|
|
|
return NNACL_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#undef ACCURACY_DATA
|
|
|
|
|