@@ -171,6 +171,46 @@ void NCHW2NHWCDataLayoutConverter::ConvertAdaptivePool2D(
171171 SetOperationLayout (operation);
172172}
173173
174+ void NCHW2NHWCDataLayoutConverter::ConvertArgMinMax (
175+ core::Operation* operation) {
176+ auto & input_operands = operation->input_operands ;
177+ auto & output_operands = operation->output_operands ;
178+ auto input_count = input_operands.size ();
179+ auto output_count = output_operands.size ();
180+ NNADAPTER_CHECK_EQ (input_count, 4 );
181+ NNADAPTER_CHECK_EQ (output_count, 1 );
182+ auto input_operand = input_operands[0 ];
183+ auto input_dimensions_count = input_operand->type .dimensions .count ;
184+ auto axis = reinterpret_cast <int32_t *>(input_operands[1 ]->buffer );
185+ if (*axis < 0 ) {
186+ *axis += input_dimensions_count;
187+ }
188+ auto keepdim = *reinterpret_cast <bool *>(input_operands[2 ]->buffer );
189+ auto output_operand = output_operands[0 ];
190+ auto input_permutation = GetPermutation (input_operand);
191+ if (keepdim) {
192+ // Recalculate the axis according to the dimorder vector of the input
193+ // operand
194+ *axis = TransposeAxis (*axis, input_permutation);
195+ TransposeOperand (output_operand, input_permutation);
196+ SetPermutation (output_operand, input_permutation);
197+ } else {
198+ // Force to restore the dimorder vector of the input operand
199+ auto transpose_input_permutation = InversePermutation (input_permutation);
200+ if (!IsIdentityPermutation (transpose_input_permutation)) {
201+ auto transpose_input_operand = AppendTransposeOperation (
202+ model_, input_operand, transpose_input_permutation);
203+ UpdateOperationInputOperands (
204+ {operation}, input_operand, transpose_input_operand);
205+ SetPermutation (transpose_input_operand,
206+ IdentityPermutation (input_dimensions_count));
207+ }
208+ int output_dimensions_count = output_operand->type .dimensions .count ;
209+ SetPermutation (output_operand,
210+ IdentityPermutation (output_dimensions_count));
211+ }
212+ }
213+
174214void NCHW2NHWCDataLayoutConverter::ConvertBatchNormalization (
175215 core::Operation* operation) {
176216 auto & input_operands = operation->input_operands ;
@@ -704,6 +744,38 @@ void NCHW2NHWCDataLayoutConverter::ConvertPow(core::Operation* operation) {
704744 SetPermutation (output_operand, input_permutation);
705745}
706746
747+ void NCHW2NHWCDataLayoutConverter::ConvertPrelu (core::Operation* operation) {
748+ auto & input_operands = operation->input_operands ;
749+ auto & output_operands = operation->output_operands ;
750+ auto input_count = input_operands.size ();
751+ auto output_count = output_operands.size ();
752+ NNADAPTER_CHECK_EQ (input_count, 2 );
753+ NNADAPTER_CHECK_EQ (output_count, 1 );
754+ auto input_operand = input_operands[0 ];
755+ auto output_operand = output_operands[0 ];
756+ auto input_permutation = GetPermutation (input_operand);
757+ auto slope_size = input_operands[1 ]->type .dimensions .data [0 ];
758+ if (slope_size == 1 ) {
759+ // The input and output operands share the same dimorder vector
760+ TransposeOperand (output_operand, input_permutation);
761+ SetPermutation (output_operand, input_permutation);
762+ } else {
763+ // Force to apply the dimorder vector of NCHW2NHWC conversion
764+ auto transpose_input_permutation =
765+ MultiplyPermutation (InversePermutation (input_permutation), kNCHW2NHWC );
766+ if (!IsIdentityPermutation (transpose_input_permutation)) {
767+ auto transpose_input_operand = AppendTransposeOperation (
768+ model_, input_operand, transpose_input_permutation);
769+ UpdateOperationInputOperands (
770+ {operation}, input_operand, transpose_input_operand);
771+ SetPermutation (transpose_input_operand, kNCHW2NHWC );
772+ }
773+ TransposeOperand (output_operand, kNCHW2NHWC );
774+ SetPermutation (output_operand, kNCHW2NHWC );
775+ SetOperationLayout (operation);
776+ }
777+ }
778+
707779void NCHW2NHWCDataLayoutConverter::ConvertQuantize (core::Operation* operation) {
708780 auto & input_operands = operation->input_operands ;
709781 auto & output_operands = operation->output_operands ;
@@ -921,6 +993,32 @@ void NCHW2NHWCDataLayoutConverter::ConvertFlatten(core::Operation* operation) {
921993 SetPermutation (output_operand, IdentityPermutation (output_dimensions_count));
922994}
923995
996+ void NCHW2NHWCDataLayoutConverter::ConvertInstanceNormalization (
997+ core::Operation* operation) {
998+ auto & input_operands = operation->input_operands ;
999+ auto & output_operands = operation->output_operands ;
1000+ auto input_count = input_operands.size ();
1001+ auto output_count = output_operands.size ();
1002+ NNADAPTER_CHECK_EQ (input_count, 4 );
1003+ NNADAPTER_CHECK_EQ (output_count, 1 );
1004+ auto input_operand = input_operands[0 ];
1005+ auto output_operand = output_operands[0 ];
1006+ // Force to apply the dimorder vector of NCHW2NHWC conversion
1007+ auto input_permutation = GetPermutation (input_operand);
1008+ auto transpose_input_permutation =
1009+ MultiplyPermutation (InversePermutation (input_permutation), kNCHW2NHWC );
1010+ if (!IsIdentityPermutation (transpose_input_permutation)) {
1011+ auto transpose_input_operand = AppendTransposeOperation (
1012+ model_, input_operand, transpose_input_permutation);
1013+ UpdateOperationInputOperands (
1014+ {operation}, input_operand, transpose_input_operand);
1015+ SetPermutation (transpose_input_operand, kNCHW2NHWC );
1016+ }
1017+ TransposeOperand (output_operand, kNCHW2NHWC );
1018+ SetPermutation (output_operand, kNCHW2NHWC );
1019+ SetOperationLayout (operation);
1020+ }
1021+
9241022void NCHW2NHWCDataLayoutConverter::ConvertLayerNormalization (
9251023 core::Operation* operation) {
9261024 auto & input_operands = operation->input_operands ;
@@ -1297,6 +1395,10 @@ void NCHW2NHWCDataLayoutConverter::Apply(core::Model* model) {
12971395 case NNADAPTER_ADAPTIVE_AVERAGE_POOL_2D:
12981396 ConvertAdaptivePool2D (operation);
12991397 break ;
1398+ case NNADAPTER_ARG_MAX:
1399+ case NNADAPTER_ARG_MIN:
1400+ ConvertArgMinMax (operation);
1401+ break ;
13001402 case NNADAPTER_AVERAGE_POOL_2D:
13011403 case NNADAPTER_MAX_POOL_2D:
13021404 ConvertPool2D (operation);
@@ -1354,6 +1456,9 @@ void NCHW2NHWCDataLayoutConverter::Apply(core::Model* model) {
13541456 case NNADAPTER_GELU:
13551457 ConvertGelu (operation);
13561458 break ;
1459+ case NNADAPTER_INSTANCE_NORMALIZATION:
1460+ ConvertInstanceNormalization (operation);
1461+ break ;
13571462 case NNADAPTER_LAYER_NORMALIZATION:
13581463 ConvertLayerNormalization (operation);
13591464 break ;
@@ -1372,6 +1477,9 @@ void NCHW2NHWCDataLayoutConverter::Apply(core::Model* model) {
13721477 case NNADAPTER_POW:
13731478 ConvertPow (operation);
13741479 break ;
1480+ case NNADAPTER_PRELU:
1481+ ConvertPrelu (operation);
1482+ break ;
13751483 case NNADAPTER_QUANTIZE:
13761484 ConvertQuantize (operation);
13771485 break ;
0 commit comments