未验证 提交 83077f6f 编写于 作者: R RedContritio 提交者: GitHub

Fix 堆栈溢出 (stack overflow) of case8: paddle.unique_consecutive (#49983)

* support negative index in unique_consecutive

* add unittest

* add unittest
上级 5cfe1645
......@@ -51,6 +51,7 @@ void UniqueConsecutiveKernel(const Context& dev_ctx,
dev_ctx, x, out, return_inverse, return_counts, index, counts));
} else {
int valid_axis = axis[0];
if (valid_axis < 0) valid_axis += x.dims().size();
phi::VisitDataTypeTiny(
data_type,
UniqueConsecutiveDimFunctor<Context, T>(dev_ctx,
......
......@@ -54,6 +54,7 @@ void UniqueConsecutiveKernel(const Context& dev_ctx,
} else {
// 'axis' is required.
int valid_axis = axis[0];
if (valid_axis < 0) valid_axis += x.dims().size();
phi::VisitDataTypeTiny(
data_type,
UniqueConsecutiveDimsCUDAFunctor<Context, T>(dev_ctx,
......
......@@ -22,7 +22,9 @@ import paddle.fluid as fluid
import paddle.fluid.core as core
def reference_unique_consecutive(X, return_inverse=False, return_counts=False):
def reference_unique_consecutive(
X, return_inverse=False, return_counts=False, axis=None
):
"""
Reference unique_consecutive implementation using python.
Args:
......@@ -273,6 +275,47 @@ class TestUniqueConsecutiveCase2API(unittest.TestCase):
)
class TestUniqueConsecutiveCase3API(unittest.TestCase):
def setUp(self):
self.places = [fluid.CPUPlace()]
if core.is_compiled_with_cuda():
self.places.append(fluid.CUDAPlace(0))
def check_static_result(self, place):
with fluid.program_guard(fluid.Program(), fluid.Program()):
paddle.enable_static()
input_x = fluid.data(
name="input_x",
shape=[
100,
],
dtype="float32",
)
result, inverse, counts = paddle.unique_consecutive(
input_x, return_inverse=True, return_counts=True, axis=-1
)
x_np = np.random.randint(20, size=100).astype("float32")
exe = fluid.Executor(place)
fetches = exe.run(
fluid.default_main_program(),
feed={"input_x": x_np},
fetch_list=[result],
)
def test_static(self):
for place in self.places:
self.check_static_result(place=place)
def test_dygraph(self):
for place in self.places:
with fluid.dygraph.guard(place):
input_x = np.random.randint(20, size=100).astype("float64")
x = paddle.to_tensor(input_x)
result, inverse, counts = paddle.unique_consecutive(
x, return_inverse=True, return_counts=True, axis=-1
)
class TestUniqueConsecutiveEmptyInput(OpTest):
"""empty input"""
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册