@@ -421,6 +421,81 @@ void NCHW2NHWCDataLayoutConverter::ConvertConv2DTranspose(
421421 SetOperationLayout (operation, 3 );
422422}
423423
424+ void NCHW2NHWCDataLayoutConverter::ConvertComparisons (
425+ core::Operation* operation) {
426+ auto & input_operands = operation->input_operands ;
427+ auto & output_operands = operation->output_operands ;
428+ auto input_count = input_operands.size ();
429+ auto output_count = output_operands.size ();
430+ NNADAPTER_CHECK_EQ (input_count, 2 );
431+ NNADAPTER_CHECK_EQ (output_count, 1 );
432+ auto output_operand = output_operands[0 ];
433+ auto output_dimensions_count = output_operand->type .dimensions .count ;
434+ // Force to align the dimorder vector of all of input operands
435+ std::vector<int32_t > reference_permutation;
436+ core::Operand* reference_operand = nullptr ;
437+ for (size_t i = 0 ; i < input_count; i++) {
438+ auto input_operand = input_operands[i];
439+ if (!IsConstantOperand (input_operand)) {
440+ auto input_permutation = GetPermutation (input_operand);
441+ if (input_permutation.size () > reference_permutation.size ()) {
442+ reference_permutation = input_permutation;
443+ reference_operand = input_operand;
444+ }
445+ }
446+ }
447+ if (reference_permutation.empty ()) {
448+ // All of input operands are constant
449+ SetPermutation (output_operand,
450+ IdentityPermutation (output_dimensions_count));
451+ } else {
452+ auto reference_dimensions_count = reference_operand->type .dimensions .count ;
453+ for (size_t i = 0 ; i < input_count; i++) {
454+ auto input_operand = input_operands[i];
455+ auto input_dimensions_count = input_operand->type .dimensions .count ;
456+ if (!IsConstantOperand (input_operand)) {
457+ auto input_permutation = GetPermutation (input_operand);
458+ auto transpose_input_permutation = MultiplyPermutation (
459+ InversePermutation (input_permutation), reference_permutation);
460+ if (!IsIdentityPermutation (transpose_input_permutation)) {
461+ auto transpose_input_operand = AppendTransposeOperation (
462+ model_, input_operand, transpose_input_permutation);
463+ UpdateOperationInputOperands (
464+ {operation}, input_operand, transpose_input_operand);
465+ SetPermutation (transpose_input_operand, reference_permutation);
466+ }
467+ } else {
468+ if (IsIdentityPermutation (reference_permutation)) {
469+ // Ignore
470+ } else if (input_dimensions_count == reference_permutation.size ()) {
471+ TransposeOperand (input_operand, reference_permutation);
472+ } else {
473+ // Expand shape with 1
474+ std::vector<int32_t > origin_reference_dimensions (
475+ reference_dimensions_count);
476+ TransposeDimensions (reference_operand->type .dimensions .data ,
477+ InversePermutation (reference_permutation),
478+ &origin_reference_dimensions[0 ]);
479+ std::vector<int32_t > expanded_input_dimensions;
480+ for (uint32_t j = 0 , k = 0 ; j < reference_dimensions_count; j++) {
481+ if (origin_reference_dimensions[j] ==
482+ input_operand->type .dimensions .data [k] &&
483+ k < input_dimensions_count) {
484+ expanded_input_dimensions.push_back (
485+ input_operand->type .dimensions .data [k]);
486+ ++k;
487+ } else {
488+ expanded_input_dimensions.push_back (1 );
489+ }
490+ }
491+ }
492+ }
493+ }
494+ TransposeOperand (output_operand, reference_permutation);
495+ SetPermutation (output_operand, reference_permutation);
496+ }
497+ }
498+
424499void NCHW2NHWCDataLayoutConverter::ConvertCumSum (core::Operation* operation) {
425500 auto & input_operands = operation->input_operands ;
426501 auto & output_operands = operation->output_operands ;
@@ -679,6 +754,26 @@ void NCHW2NHWCDataLayoutConverter::ConvertShape(core::Operation* operation) {
679754 SetPermutation (output_operand, IdentityPermutation (output_dimensions_count));
680755}
681756
757+ void NCHW2NHWCDataLayoutConverter::ConvertSlice (core::Operation* operation) {
758+ auto & input_operands = operation->input_operands ;
759+ auto & output_operands = operation->output_operands ;
760+ auto input_count = input_operands.size ();
761+ auto output_count = output_operands.size ();
762+ NNADAPTER_CHECK_EQ (input_count, 5 );
763+ NNADAPTER_CHECK_EQ (output_count, 1 );
764+ // Recalculate the axis according to the dimorder vector of the input operand
765+ auto axes_operand = input_operands[1 ];
766+ int axes_count = axes_operand->length / sizeof (int32_t );
767+ int * axes = reinterpret_cast <int32_t *>(axes_operand->buffer );
768+ auto input_permutation = GetPermutation (input_operands[0 ]);
769+ for (int i = 0 ; i < axes_count; i++) {
770+ axes[i] = TransposeAxis (axes[i], input_permutation);
771+ }
772+ auto output_operand = output_operands[0 ];
773+ TransposeOperand (output_operand, input_permutation);
774+ SetPermutation (output_operand, input_permutation);
775+ }
776+
682777void NCHW2NHWCDataLayoutConverter::ConvertFill (core::Operation* operation) {
683778 auto & input_operands = operation->input_operands ;
684779 auto & output_operands = operation->output_operands ;
@@ -937,6 +1032,32 @@ void NCHW2NHWCDataLayoutConverter::ConvertTranspose(
9371032 SetPermutation (output_operand, input_permutation);
9381033}
9391034
1035+ void NCHW2NHWCDataLayoutConverter::ConvertUnsqueeze (
1036+ core::Operation* operation) {
1037+ auto & input_operands = operation->input_operands ;
1038+ auto & output_operands = operation->output_operands ;
1039+ auto input_count = input_operands.size ();
1040+ auto output_count = output_operands.size ();
1041+ NNADAPTER_CHECK_EQ (input_count, 2 );
1042+ NNADAPTER_CHECK_EQ (output_count, 1 );
1043+ auto input_operand = input_operands[0 ];
1044+ int input_dimensions_count = input_operand->type .dimensions .count ;
1045+ auto output_operand = output_operands[0 ];
1046+ auto output_dimensions_count = output_operand->type .dimensions .count ;
1047+ // Force to restore the dimorder vector of the input operand
1048+ auto input_permutation = GetPermutation (input_operand);
1049+ auto transpose_input_permutation = InversePermutation (input_permutation);
1050+ if (!IsIdentityPermutation (transpose_input_permutation)) {
1051+ auto transpose_input_operand = AppendTransposeOperation (
1052+ model_, input_operand, transpose_input_permutation);
1053+ UpdateOperationInputOperands (
1054+ {operation}, input_operand, transpose_input_operand);
1055+ SetPermutation (transpose_input_operand,
1056+ IdentityPermutation (input_dimensions_count));
1057+ }
1058+ SetPermutation (output_operand, IdentityPermutation (output_dimensions_count));
1059+ }
1060+
9401061void NCHW2NHWCDataLayoutConverter::Apply (core::Model* model) {
9411062 model_ = model;
9421063 // Initialize the permutation of model input operands
@@ -987,6 +1108,14 @@ void NCHW2NHWCDataLayoutConverter::Apply(core::Model* model) {
9871108 case NNADAPTER_CUM_SUM:
9881109 ConvertCumSum (operation);
9891110 break ;
1111+ case NNADAPTER_EQUAL:
1112+ case NNADAPTER_GREATER:
1113+ case NNADAPTER_GREATER_EQUAL:
1114+ case NNADAPTER_LESS:
1115+ case NNADAPTER_LESS_EQUAL:
1116+ case NNADAPTER_NOT_EQUAL:
1117+ ConvertComparisons (operation);
1118+ break ;
9901119 case NNADAPTER_FILL:
9911120 ConvertFill (operation);
9921121 break ;
@@ -1045,6 +1174,9 @@ void NCHW2NHWCDataLayoutConverter::Apply(core::Model* model) {
10451174 case NNADAPTER_SHAPE:
10461175 ConvertShape (operation);
10471176 break ;
1177+ case NNADAPTER_SLICE:
1178+ ConvertSlice (operation);
1179+ break ;
10481180 case NNADAPTER_SOFTMAX:
10491181 ConvertSoftmax (operation);
10501182 break ;
@@ -1060,6 +1192,9 @@ void NCHW2NHWCDataLayoutConverter::Apply(core::Model* model) {
10601192 case NNADAPTER_TRANSPOSE:
10611193 ConvertTranspose (operation);
10621194 break ;
1195+ case NNADAPTER_UNSQUEEZE:
1196+ ConvertUnsqueeze (operation);
1197+ break ;
10631198 default :
10641199 NNADAPTER_LOG (FATAL)
10651200 << " Missing the processing of "
0 commit comments