24#ifndef TVM_TOPI_DETAIL_STRIDED_SLICE_H_
25#define TVM_TOPI_DETAIL_STRIDED_SLICE_H_
43inline int64_t CanonicalizeIndex(int64_t index, int64_t extent, int64_t stride) {
44 int64_t begin_range = stride < 0 ? -1 : 0;
45 int64_t end_range = stride < 0 ? extent - 1 : extent;
49 return std::min(std::max(index, begin_range), end_range);
52inline std::tuple<std::vector<int64_t>, std::vector<int64_t>, std::vector<int64_t>> ConvertToVec(
53 const ffi::Array<ffi::Optional<IntImm>>& begin,
const ffi::Array<ffi::Optional<IntImm>>& end,
54 const ffi::Array<IntImm>& strides, std::string slice_mode) {
55 std::vector<int64_t> stride_vec(strides.size(), 1);
56 if (slice_mode ==
"end") {
57 for (
size_t i = 0; i < strides.size(); ++i) {
58 stride_vec[i] =
static_cast<int64_t
>(strides[i]->value);
61 const int64_t max_range = std::numeric_limits<int64_t>::max();
62 std::vector<int64_t> begin_vec;
63 for (
size_t i = 0; i < begin.size(); ++i) {
64 if (!begin[i].has_value()) {
66 begin_vec.push_back(stride_vec[i] > 0 ? 0 : max_range);
68 begin_vec.push_back(
static_cast<int64_t
>(begin[i].value()->value));
71 std::vector<int64_t> end_vec;
72 for (
size_t i = 0; i < end.size(); ++i) {
74 if (!end[i].has_value()) {
75 end_vec.push_back(stride_vec[i] < 0 ? 0 : max_range);
76 }
else if (slice_mode ==
"size") {
77 int64_t end_val =
static_cast<int64_t
>(end[i].value()->value);
79 end_vec.push_back(stride_vec[i] < 0 ? 0 : max_range);
81 end_vec.push_back(begin_vec[i] + end_val);
84 end_vec.push_back(
static_cast<int64_t
>(end[i].value()->value));
87 return std::make_tuple(begin_vec, end_vec, stride_vec);
90inline ffi::Array<PrimExpr> StridedSliceCanonicalizeBegin(
const ffi::Array<PrimExpr>& ishape,
91 const std::vector<int64_t>& begin,
92 const std::vector<int64_t>& strides,
93 const ffi::Array<int64_t>& axes,
95 std::string slice_mode =
"end") {
97 ffi::Array<PrimExpr> begin_expr;
98 for (
size_t i = 0; i < axes.size(); ++i) {
100 if (ishape[ax]->IsInstance<tvm::IntImmNode>()) {
101 int64_t dim_i = GetConstInt(ishape[ax]);
102 int64_t begin_i = CanonicalizeIndex(begin[i], dim_i, strides[i]);
103 begin_expr.push_back(
MakeConst(dtype, begin_i));
105 auto idim = ishape[ax];
106 auto b_expr =
MakeConst(dtype, begin[i]);
107 PrimExpr b = begin[i] < 0 ? b_expr + idim : b_expr;
114 begin_expr.push_back(b);
120inline ffi::Array<PrimExpr> StridedSliceOutputShape(
121 const ffi::Array<PrimExpr>& ishape,
const std::vector<int64_t>& begin,
122 const std::vector<int64_t>& end,
const std::vector<int64_t>& strides,
123 const ffi::Array<int64_t>& axes, std::string slice_mode,
124 const ffi::Array<PrimExpr>& begin_canonicalized,
bool use_any =
false) {
125 TVM_FFI_ICHECK(!use_any) <<
"StridedSliceOutputShape does not legacy use_any";
126 const size_t src_tensor_dim = ishape.size();
127 ffi::Array<PrimExpr> out_shape;
128 for (
size_t i = 0; i < src_tensor_dim; ++i) {
129 out_shape.push_back(ishape[i]);
132 for (
size_t i = 0; i < axes.size(); ++i) {
133 int64_t ax = axes[i];
134 if (ishape[ax]->IsInstance<tvm::IntImmNode>()) {
135 const int64_t dim_i = GetConstInt(ishape[ax]);
136 TVM_FFI_ICHECK(begin_canonicalized[i]->IsInstance<tvm::IntImmNode>());
137 int64_t begin_i = GetConstInt(begin_canonicalized[i]);
138 int64_t end_i = CanonicalizeIndex(end[i], dim_i, strides[i]);
139 int interval = std::abs(end_i - begin_i);
141 static_cast<int>((interval + std::abs(strides[i]) - 1) / std::abs(strides[i]));
142 TVM_FFI_ICHECK(strides[i] < 0 ? (end_i <= begin_i) : (begin_i <= end_i))
143 <<
": Input [Begin=" << begin[i] <<
", End=" << end[i] <<
"] is invalid for axis=" << i;
146 out_shape.Set(ax,
tvm::PrimVar(
"dim", out_shape[i].ty()));
Typed reference/view over any Expr whose ExprNode::ty is PrimType.
Definition base_expr.h:447
Definition base_expr.h:161
Checked scalar view over a VarNode.
Definition expr.h:742
Utility functions for handling constants in TVM expressions.
PrimExpr MakeConst(PrimType dtype, ValueType value, Location loc=UnknownLoc())
Make a const value with certain data type.
Definition op.h:553
TVM_TIRX_DLL PrimExpr cast(PrimType t, PrimExpr value, Location loc=UnknownLoc())
cast value to type.
Tensor expression language DSL.
Definition extracted_task.h:33
An object that builds and maintains block scope and StmtSref mapping for Dependence analysis.
Definition attr.h:23
TVM_TIRX_DLL PrimExpr if_then_else(PrimExpr cond, PrimExpr true_value, PrimExpr false_value, Location loc=UnknownLoc())
Conditional expression.
TVM_TIRX_DLL PrimExpr min(PrimExpr a, PrimExpr b, Location loc=UnknownLoc())
take minimum of two values