concat_funcs.h 3.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#pragma once

17
#include "paddle/phi/core/enforce.h"
18
#include "paddle/phi/core/errors.h"
19
namespace phi {
20 21 22 23
namespace funcs {

static inline int64_t ComputeAxis(int64_t axis, int64_t rank) {
  PADDLE_ENFORCE_EQ(
24
      !rank || (axis >= -rank && axis < rank),
25
      true,
26
      phi::errors::InvalidArgument(
27 28 29 30
          "The axis is expected to be in range of [%d, %d), but got %d",
          -rank,
          rank,
          axis));
31
  axis = rank ? axis : 0;
32 33 34 35 36 37
  if (axis < 0) {
    axis = axis + rank;
  }
  return axis > 0 ? axis : 0;
}

38
static inline phi::DDim ComputeAndCheckShape(
39
    bool is_runtime,
40
    const std::vector<phi::DDim>& inputs_dims,
41 42 43 44 45
    const size_t axis) {
  const size_t n = inputs_dims.size();
  auto out_dims = inputs_dims[0];
  size_t in_zero_dims_size = out_dims.size();
  for (size_t i = 1; i < n; i++) {
46 47 48 49 50 51 52 53 54 55 56
    PADDLE_ENFORCE_EQ(
        inputs_dims[i].size(),
        out_dims.size(),
        phi::errors::InvalidArgument("The shape of input[0] and input[%d] "
                                     "is expected to be equal."
                                     "But received input[0]'s shape = "
                                     "[%s], input[%d]'s shape = [%s].",
                                     i,
                                     inputs_dims[0],
                                     i,
                                     inputs_dims[i]));
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
    for (size_t j = 0; j < in_zero_dims_size; j++) {
      if (j == axis) {
        if (is_runtime) {
          out_dims[axis] += inputs_dims[i][j];
        } else {
          if (inputs_dims[i][j] == -1 || out_dims[j] == -1) {
            out_dims[axis] = -1;
          } else {
            out_dims[axis] += inputs_dims[i][j];
          }
        }
      } else {
        bool check_shape =
            is_runtime || (inputs_dims[0][j] > 0 && inputs_dims[i][j] > 0);
        if (check_shape) {
          // check all shape in run time
          PADDLE_ENFORCE_EQ(inputs_dims[0][j],
                            inputs_dims[i][j],
75
                            phi::errors::InvalidArgument(
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
                                "The %d-th dimension of input[0] and input[%d] "
                                "is expected to be equal."
                                "But received input[0]'s shape = "
                                "[%s], input[%d]'s shape = [%s].",
                                j,
                                i,
                                inputs_dims[0],
                                i,
                                inputs_dims[i]));
        }
        if (!is_runtime && out_dims[j] == -1 && inputs_dims[i][j] > 0) {
          out_dims[j] = inputs_dims[i][j];
        }
      }
    }
  }
  return out_dims;
}

}  // namespace funcs
96
}  // namespace phi