This is an automated email from the ASF dual-hosted git repository.
kparzysz pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm.git
The following commit(s) were added to refs/heads/main by this push:
new 9863cf0d5f [hexagon][testing] Better pytest ID strings (#12154)
9863cf0d5f is described below
commit 9863cf0d5f49e54c21d1a1243d87fd01f7277911
Author: Christian Convey <[email protected]>
AuthorDate: Fri Jul 22 15:52:56 2022 -0400
[hexagon][testing] Better pytest ID strings (#12154)
- Add utility functions to allow more human-readable pytest test IDs.
Helpful when ID strings become too large for humans to easily read.
- Update the `test_avg_pool2d_slice.py` unit test to use this mechanism.
---
tests/python/contrib/test_hexagon/pytest_util.py | 93 ++++++++++++++++++++++
.../test_hexagon/topi/test_avg_pool2d_slice.py | 45 ++++++++---
2 files changed, 125 insertions(+), 13 deletions(-)
diff --git a/tests/python/contrib/test_hexagon/pytest_util.py
b/tests/python/contrib/test_hexagon/pytest_util.py
new file mode 100644
index 0000000000..fb28ebeb68
--- /dev/null
+++ b/tests/python/contrib/test_hexagon/pytest_util.py
@@ -0,0 +1,93 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+
+import pytest
+import numpy as np
+from typing import *
+import collections
+import tvm.testing
+
+
+def get_test_id(*test_params, test_param_descs: List[Optional[str]] = None) ->
str:
+ """
+ An opinionated alternative to pytest's default algorithm for generating a
+ test's ID string. Intended to make it easier for human readers to
+ interpret the test IDs.
+
+ 'test_params': The sequence of pytest parameter values supplied to some
unit
+ test.
+
+ 'test_param_descs': An (optional) means to provide additional text for
some/all of the
+ paramuments in 'test_params'.
+
+ If provided, then len(test_params) must equal len(test_param_descs).
+ Each element test_param_descs that is a non-empty string will be used
+ in some sensible way in this function's returned string.
+ """
+
+ assert len(test_params) > 0
+
+ if test_param_descs is None:
+ test_param_descs = [None] * len(test_params)
+ else:
+ assert len(test_param_descs) == len(test_params)
+
+ def get_single_param_chunk(param_val, param_desc: Optional[str]):
+ if type(param_val) == list:
+ # Like str(list), but avoid the whitespace padding.
+ val_str = "[" + ",".join(str(x) for x in param_val) + "]"
+ need_prefix_separator = False
+
+ elif type(param_val) == bool:
+ if param_val:
+ val_str = "T"
+ else:
+ val_str = "F"
+ need_prefix_separator = True
+
+ else:
+ val_str = str(param_val)
+ need_prefix_separator = True
+
+ if param_desc and need_prefix_separator:
+ return f"{param_desc}:{val_str}"
+ elif param_desc and not need_prefix_separator:
+ return f"{param_desc}{val_str}"
+ else:
+ return val_str
+
+ chunks = [
+ get_single_param_chunk(param_val, param_desc)
+ for param_val, param_desc in zip(test_params, test_param_descs)
+ ]
+ return "-".join(chunks)
+
+
+def get_multitest_ids(
+ multitest_params_list: List[List], param_descs:
Optional[List[Optional[str]]]
+) -> List[str]:
+ """
+ A convenience function for classes that use both 'tvm.testing.parameters'
and 'get_test_id'.
+
+ This function provides a workaround for a specific quirk in Python, where
list-comprehension
+ can't necessarily access the value of another class-variable, discused
here:
+ https://stackoverflow.com/q/13905741
+ """
+ return [
+ get_test_id(*single_test_param_list, test_param_descs=param_descs)
+ for single_test_param_list in multitest_params_list
+ ]
diff --git a/tests/python/contrib/test_hexagon/topi/test_avg_pool2d_slice.py
b/tests/python/contrib/test_hexagon/topi/test_avg_pool2d_slice.py
index 5b1f59c897..34e9b751b9 100644
--- a/tests/python/contrib/test_hexagon/topi/test_avg_pool2d_slice.py
+++ b/tests/python/contrib/test_hexagon/topi/test_avg_pool2d_slice.py
@@ -17,6 +17,8 @@
import pytest
import numpy as np
+from typing import *
+import collections
from tvm import te
import tvm.testing
@@ -25,6 +27,7 @@ from tvm.contrib.hexagon.build import HexagonLauncher
from tvm.contrib.hexagon.session import Session
import tvm.topi.hexagon.slice_ops as sl
from ..infrastructure import allocate_hexagon_array, transform_numpy
+from ..pytest_util import get_multitest_ids
input_layout = tvm.testing.parameter(
@@ -48,18 +51,19 @@ def transformed_input_np_padded(input_np_padded,
input_layout):
class TestAvgPool2dSlice:
- # NOTE: input_layout is always assumed to be "nhwc-8h2w32c2w-2d"
- (
- output_shape,
- kernel,
- stride,
- dilation,
- padding,
- ceil_mode,
- count_include_pad,
- output_layout,
- dtype,
- ) = tvm.testing.parameters(
+ _param_descs = [
+ "out_shape", # output_shape
+ "kernel", # kernel
+ "stride", # stride
+ "dil", # dilation
+ "pad", # padding
+ "ceil", # ceil_mode
+ "cnt_padded", # count_include_pad
+ "out_layout", # output_layout
+ None, # dtype
+ ]
+
+ _multitest_params = [
(
[1, 8, 8, 32],
[3, 3],
@@ -217,7 +221,22 @@ class TestAvgPool2dSlice:
"n11c-1024c-2d",
"float16",
),
- )
+ ]
+
+ _param_ids = get_multitest_ids(_multitest_params, _param_descs)
+
+ # NOTE: input_layout is always assumed to be "nhwc-8h2w32c2w-2d"
+ (
+ output_shape,
+ kernel,
+ stride,
+ dilation,
+ padding,
+ ceil_mode,
+ count_include_pad,
+ output_layout,
+ dtype,
+ ) = tvm.testing.parameters(*_multitest_params, ids=_param_ids)
@tvm.testing.fixture
def expected_output_np(