blob: 4440b70632a79e37c822105374c9339d64cefcc8 [file] [log] [blame]
# Copyright 2020 Google LLC
#
# 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
#
# https://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.
# Test coverage across backends for e2e tests is defined directly in the BUILD
# files. Coverage tables generated from this file can be viewed here:
# https://google.github.io/iree/tensorflow-coverage/tf-base-coverage
# Updates made to test suite names should also be reflected here:
# https://github.com/google/iree/blob/main/scripts/update_e2e_coverage.py
load(
"//bindings/python:build_defs.oss.bzl",
"INTREE_TENSORFLOW_PY_DEPS",
"NUMPY_DEPS",
"iree_py_binary",
"iree_py_test",
)
load(
"//integrations/tensorflow/e2e:iree_e2e_test_suite.bzl",
"set_difference",
)
load(
"//integrations/tensorflow/e2e:iree_e2e_cartesian_product_test_suite.bzl",
"iree_e2e_cartesian_product_test_suite",
)
package(
default_visibility = ["//visibility:public"],
features = ["layering_check"],
licenses = ["notice"], # Apache 2.0
)
[
iree_py_binary(
name = src.replace(".py", "_manual"),
srcs = [src],
main = src,
python_version = "PY3",
deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [
"//integrations/tensorflow/bindings/python/pyiree/tf/support",
],
)
for src in glob(
["*_test.py"],
exclude = ["keyword_spotting_streaming_test.py"],
)
]
# These functions were selected using all of the funcions in the tf.math docs:
# https://www.tensorflow.org/api_docs/python/tf/math
TF_MATH_FUNCTIONS = [
"abs",
"accumulate_n",
"acos",
"acosh",
"add",
"add_n",
"angle",
"argmax",
"argmin",
"asin",
"asinh",
"atan",
"atan2",
"atanh",
"bessel_i0",
"bessel_i0e",
"bessel_i1",
"bessel_i1e",
"betainc",
"bincount",
"ceil",
"confusion_matrix",
"cos",
"cosh",
"count_nonzero",
"cumprod",
"cumsum",
"cumulative_logsumexp",
"digamma",
"divide",
"divide_no_nan",
"equal",
"erf",
"erfc",
"erfinv",
"exp",
"expm1",
"floor",
"floordiv",
"floormod",
"greater",
"greater_equal",
"igamma",
"igammac",
"imag",
"in_top_k",
"invert_permutation",
"is_finite",
"is_inf",
"is_nan",
"is_non_decreasing",
"is_strictly_increasing",
"lbeta",
"less",
"less_equal",
"lgamma",
"log",
"log1p",
"log_sigmoid",
"log_softmax",
"logical_and",
"logical_not",
"logical_or",
"logical_xor",
"maximum",
"minimum",
"mod",
"multiply",
"multiply_no_nan",
"ndtri",
"negative",
"nextafter",
"not_equal",
"polygamma",
"polyval",
"pow",
"real",
"reciprocal",
"reciprocal_no_nan",
"reduce_all",
"reduce_any",
"reduce_euclidean_norm",
"reduce_logsumexp",
"reduce_max",
"reduce_mean",
"reduce_min",
"reduce_prod",
"reduce_std",
"reduce_sum",
"reduce_variance",
"rint",
"round",
"rsqrt",
"scalar_mul",
"segment_max",
"segment_mean",
"segment_min",
"segment_prod",
"segment_sum",
"sigmoid",
"sign",
"sin",
"sinh",
"sobol_sample",
"softmax",
"softplus",
"softsign",
"sqrt",
"square",
"squared_difference",
"subtract",
"tan",
"tanh",
# "top_k", # TODO(meadowlark): Enable once list outputs are supported.
"truediv",
"unsorted_segment_max",
"unsorted_segment_mean",
"unsorted_segment_min",
"unsorted_segment_prod",
"unsorted_segment_sqrt_n",
"unsorted_segment_sum",
"xdivy",
"xlog1py",
"xlogy",
"zero_fraction",
"zeta",
]
# keep sorted
TFLITE_FAILING = [
"abs", # Failing for integer inputs.
"acos",
"acosh",
"asin",
"asinh",
"atan",
"atan2",
"atanh",
"bessel_i0",
"bessel_i0e",
"bessel_i1",
"bessel_i1e",
"betainc",
"bincount",
"confusion_matrix",
"conj",
"cosh",
"cumprod",
"cumulative_logsumexp",
"digamma",
"divide", # Failing for integer inputs.
"erf",
"erfc",
"erfinv",
"expm1",
"igamma",
"igammac",
"in_top_k",
"invert_permutation",
"is_finite",
"is_non_decreasing",
"is_strictly_increasing",
"l2_normalize",
"lbeta",
"lgamma",
"log1p",
"log_sigmoid",
"ndtri",
"nextafter",
"polygamma",
"polyval",
"pow", # Failing for integer inputs.
"reduce_all",
"reduce_euclidean_norm",
"reduce_logsumexp",
"reduce_mean",
"reduce_std",
"reduce_variance",
"rint",
"segment_max",
"segment_mean",
"segment_min",
"segment_prod",
"sign",
"sinh",
"sobol_sample",
"softmax",
"softplus",
"softsign",
"tan",
"unsorted_segment_max",
"unsorted_segment_mean",
"unsorted_segment_min",
"unsorted_segment_prod",
"unsorted_segment_sqrt_n",
"unsorted_segment_sum",
"xdivy",
"xlog1py",
"xlogy",
"zeta",
]
# Note: The VMLA_FAILING_DYNAMIC specification extends this list. Newly-passing
# functions removed from this list may need to be added to VMLA_FAILING_DYNAMIC.
# keep sorted
VMLA_FAILING = [
"acosh",
"argmax",
"argmin",
"asin",
"asinh",
"atan2",
"atanh",
"bessel_i0",
"bessel_i0e",
"bessel_i1",
"bessel_i1e",
"betainc",
"bincount",
"confusion_matrix",
"cosh",
"count_nonzero",
"cumprod",
"cumulative_logsumexp",
"digamma",
"divide", # Failing for integer inputs because iree doesn't output 'f64'.
"erf",
"erfc",
"erfinv",
"expm1",
"igamma",
"igammac",
"in_top_k",
"invert_permutation",
"is_nan", # TODO(#4061): tf.math.is_nan miscompiles with static shapes.
"is_non_decreasing",
"is_strictly_increasing",
"ndtri",
"nextafter",
"polygamma",
"pow", # Failing for integer inputs.
"reduce_euclidean_norm",
"reduce_prod",
"rint",
"segment_max",
"segment_mean",
"segment_min",
"segment_prod",
"segment_sum",
"sign",
"sobol_sample",
"softsign",
"unsorted_segment_max",
"unsorted_segment_mean",
"unsorted_segment_min",
"unsorted_segment_prod",
"unsorted_segment_sqrt_n",
"unsorted_segment_sum",
"xdivy",
"xlog1py",
"xlogy",
"zeta",
]
# Note: The LLVM_FAILING_DYNAMIC specification extends this list. Newly-passing
# functions removed from this list may need to be added to LLVM_FAILING_DYNAMIC.
# keep sorted
LLVM_FAILING = [
"acos",
"acosh",
"argmax",
"argmin",
"asin",
"asinh",
"atan",
"atan2",
"atanh",
"bessel_i0",
"bessel_i0e",
"bessel_i1",
"bessel_i1e",
"betainc",
"bincount",
"confusion_matrix",
"cosh",
"count_nonzero",
"cumprod",
"cumulative_logsumexp",
"digamma",
"divide", # Failing for integer inputs because iree doesn't output 'f64'.
"erf",
"erfc",
"erfinv",
"expm1",
"igamma",
"igammac",
"in_top_k",
"invert_permutation",
"is_nan",
"is_non_decreasing",
"is_strictly_increasing",
"l2_normalize",
"logical_or",
"logical_xor",
"ndtri",
"nextafter",
"polygamma",
"pow",
"reduce_all",
"reduce_any",
"reduce_euclidean_norm",
"reduce_logsumexp",
"reduce_max",
"reduce_mean",
"reduce_min",
"reduce_prod",
"reduce_std",
"reduce_sum",
"reduce_variance",
"rint",
"segment_max",
"segment_mean",
"segment_min",
"segment_prod",
"segment_sum",
"sign",
"sobol_sample",
"softsign",
"unsorted_segment_max",
"unsorted_segment_mean",
"unsorted_segment_min",
"unsorted_segment_prod",
"unsorted_segment_sqrt_n",
"unsorted_segment_sum",
"xdivy",
"xlog1py",
"xlogy",
"zeta",
]
# Note: The VULKAN_FAILING_DYNAMIC specification extends this list.
# Newly-passing functions removed from this list may need to be added to
# VULKAN_FAILING_DYNAMIC.
# keep sorted
VULKAN_FAILING = [
"acos",
"acosh",
"argmax",
"argmin",
"asin",
"asinh",
"atan",
"atan2",
"atanh",
"bessel_i0",
"bessel_i0e",
"bessel_i1",
"bessel_i1e",
"betainc",
"bincount",
"confusion_matrix",
"cosh",
"count_nonzero",
"cumprod",
"cumsum",
"cumulative_logsumexp",
"digamma",
"divide", # Failing for integer inputs because iree doesn't output 'f64'.
"erf",
"erfc",
"erfinv",
"expm1",
"igamma",
"igammac",
"in_top_k",
"invert_permutation",
"is_nan",
"is_non_decreasing",
"is_strictly_increasing",
"l2_normalize",
"logical_and",
"logical_not",
"logical_or",
"logical_xor",
"mod", # Passes with swiftshader, but fails on Turing GPU
"ndtri",
"nextafter",
"polygamma",
"pow",
"reduce_all",
"reduce_any",
"reduce_euclidean_norm",
"reduce_logsumexp",
"reduce_max",
"reduce_mean",
"reduce_min",
"reduce_prod",
"reduce_std",
"reduce_sum",
"reduce_variance",
"rint",
"segment_max",
"segment_mean",
"segment_min",
"segment_prod",
"segment_sum",
"sign",
"sobol_sample",
"softsign",
"unsorted_segment_max",
"unsorted_segment_mean",
"unsorted_segment_min",
"unsorted_segment_prod",
"unsorted_segment_sqrt_n",
"unsorted_segment_sum",
"xdivy",
"xlog1py",
"xlogy",
"zeta",
]
# ---- INDIVIDUAL STATIC TESTS ----------------------------------------------- #
# These tests allow us to generate coverage tables and give a finer-grained view
# of the coverage, but are very slow due to bazel overhead, so they are not
# run on the internal or OSS CI.
iree_e2e_cartesian_product_test_suite(
name = "math_tests",
srcs = ["math_test.py"],
failing_configurations = [
{
# Failing on TFLite.
"functions": TFLITE_FAILING,
"target_backends": "tflite",
},
{
# Failing on vmla.
"functions": VMLA_FAILING,
"target_backends": "iree_vmla",
},
{
# Failing on llvm.
"functions": LLVM_FAILING,
"target_backends": "iree_llvmjit",
},
{
# Failing on vulkan.
"functions": VULKAN_FAILING,
"target_backends": "iree_vulkan",
},
],
flags_to_values = {
"reference_backend": "tf",
"functions": TF_MATH_FUNCTIONS,
"dynamic_dims": False,
"test_complex": False,
"target_backends": [
"tf",
"tflite",
"iree_vmla",
"iree_llvmjit",
"iree_vulkan",
],
},
main = "math_test.py",
tags = [
"manual",
"nokokoro",
"notap",
],
deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [
"//integrations/tensorflow/bindings/python/pyiree/tf/support",
],
)
# ---- MULTIPLE STATIC TESTS ------------------------------------------------ #
# These tests compile all functions in tf.math at once for testing so that
# we can run them on the CI with 5 additional targets instead of 640. The tests
# are run sharded such that about 5 functions run per shard. This is a
# reasonable tradeoff between shard startup overhead and critical path test
# latency.
# TODO(#3810) 'multiply' outputs all zeros when compiled with other functions.
VMLA_FAILING_MULTIPLE = VMLA_FAILING + ["multiply"]
# TODO(#3810) Including 'square' causes error: Recieved signal 11.
# @unused
LLVM_FAILING_MULTIPLE = LLVM_FAILING + ["square"]
# TODO(#3810) Including 'square' causes error: Recieved signal 11.
VULKAN_FAILING_MULTIPLE = VULKAN_FAILING + ["square"]
[
iree_py_test(
name = "math_tests_multiple__{}".format(target_backend),
srcs = ["math_test.py"],
args = [
"--reference_backend=tf",
"--target_backends={}".format(target_backend),
"--functions={}".format(",".join(functions)),
"--dynamic_dims=False",
"--test_complex=False",
],
main = "math_test.py",
python_version = "PY3",
shard_count = len(functions) // 5,
deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [
"//integrations/tensorflow/bindings/python/pyiree/tf/support",
],
)
for target_backend, functions in dict(
# TODO(#2673): enable LLVM AOT for these tests. JIT is deprecated.
# iree_llvmjit = set_difference(TF_MATH_FUNCTIONS, LLVM_FAILING_MULTIPLE),
iree_vmla = set_difference(TF_MATH_FUNCTIONS, VMLA_FAILING_MULTIPLE),
iree_vulkan = set_difference(TF_MATH_FUNCTIONS, VULKAN_FAILING_MULTIPLE),
tf = TF_MATH_FUNCTIONS,
tflite = set_difference(TF_MATH_FUNCTIONS, TFLITE_FAILING),
).items()
]
# ---- INDIVIDUAL DYNAMIC TESTS ---------------------------------------------- #
# keep sorted
VMLA_FAILING_DYNAMIC = VMLA_FAILING + [
"angle",
"cumsum",
"divide_no_nan",
"floordiv", # TODO(#4065): VMLA raises INVALID_ARGUMENT errors after DeviceQueue failure.
"floormod", # TODO(#4065): VMLA raises INVALID_ARGUMENT errors after DeviceQueue failure.
"lbeta",
"lgamma",
"log_sigmoid",
"log1p",
"logical_and",
"logical_not",
"logical_or",
"logical_xor",
"mod", # TODO(#4065): VMLA raises INVALID_ARGUMENT errors after DeviceQueue failure.
"multiply_no_nan",
"round",
"reciprocal_no_nan",
"reduce_all",
"reduce_any",
"reduce_logsumexp",
"reduce_max",
"reduce_min",
"reduce_sum",
"reduce_mean",
"reduce_std",
"reduce_variance",
"softplus",
"zero_fraction",
]
# TODO(#4061): tf.math.is_nan miscompiles with static shapes.
VMLA_FAILING_DYNAMIC.remove("is_nan")
# keep sorted
LLVM_FAILING_DYNAMIC = LLVM_FAILING + [
"accumulate_n",
"add",
"add_n",
"angle",
"cumsum",
"divide",
"divide_no_nan",
"equal",
"floordiv",
"floormod",
"greater",
"greater_equal",
"is_finite",
"is_inf",
"lbeta",
"less",
"less_equal",
"lgamma",
"log_sigmoid",
"log_softmax",
"log1p",
"logical_and",
"logical_not",
"maximum",
"minimum",
"mod",
"multiply",
"multiply_no_nan",
"not_equal",
"polyval",
"reciprocal",
"reciprocal_no_nan",
"reduce_mean",
"scalar_mul",
"sigmoid",
"sinh",
"softmax",
"softplus",
"square",
"squared_difference",
"subtract",
"round",
"tan",
"truediv",
"zero_fraction",
]
# keep sorted
VULKAN_FAILING_DYNAMIC = VULKAN_FAILING + [
"abs",
"accumulate_n",
"add",
"add_n",
"angle",
"ceil",
"cos",
"divide",
"divide_no_nan",
"equal",
"exp",
"floor",
"floordiv",
"floormod",
"greater",
"greater_equal",
"imag",
"is_finite",
"is_inf",
"lbeta",
"less",
"round",
"less_equal",
"lgamma",
"log",
"log_sigmoid",
"log_softmax",
"log1p",
"maximum",
"minimum",
"mod",
"multiply",
"multiply_no_nan",
"negative",
"not_equal",
"polyval",
"reciprocal",
"reciprocal_no_nan",
"reduce_max",
"reduce_mean",
"reduce_min",
"reduce_sum",
"rsqrt",
"scalar_mul",
"sigmoid",
"sin",
"sinh",
"softmax",
"softplus",
"sqrt",
"square",
"squared_difference",
"subtract",
"tan",
"tanh",
"truediv",
"zero_fraction",
]
# These tests allow us to generate coverage tables and give a finer-grained view
# of the coverage, but are very slow due to bazel overhead, so they are not
# run on the internal or OSS CI.
iree_e2e_cartesian_product_test_suite(
name = "math_dynamic_dims_tests",
srcs = ["math_test.py"],
failing_configurations = [
{
# TFLite does not support dynamic shapes.
"target_backends": "tflite",
},
{
# Failing on vmla.
"functions": VMLA_FAILING_DYNAMIC,
"target_backends": "iree_vmla",
},
{
# Failing on llvm.
"functions": LLVM_FAILING_DYNAMIC,
"target_backends": "iree_llvmjit",
},
{
# Failing on vulkan.
"functions": VULKAN_FAILING_DYNAMIC,
"target_backends": "iree_vulkan",
},
],
flags_to_values = {
"reference_backend": "tf",
"functions": TF_MATH_FUNCTIONS,
"dynamic_dims": True,
"test_complex": False,
"target_backends": [
"tf",
"tflite",
"iree_vmla",
"iree_llvmjit",
"iree_vulkan",
],
},
main = "math_test.py",
tags = [
"manual",
"nokokoro",
"notap",
],
deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [
"//integrations/tensorflow/bindings/python/pyiree/tf/support",
],
)
# ---- MULTIPLE DYNAMIC TESTS ----------------------------------------------- #
# These tests compile all functions in tf.math at once for testing so that
# we can run them on the CI with 4 additional targets instead of 512. The tests
# are run sharded such that about 5 functions run per shard. This is a
# reasonable tradeoff between shard startup overhead and critical path test
# latency.
# TODO(#3810) 'multiply' outputs all zeros when compiled with other functions.
VMLA_FAILING_DYNAMIC_MULTIPLE = VMLA_FAILING_DYNAMIC + ["multiply"]
[
iree_py_test(
name = "math_dynamic_dims_tests_multiple__{}".format(target_backend),
srcs = ["math_test.py"],
args = [
"--reference_backend=tf",
"--target_backends={}".format(target_backend),
"--functions={}".format(",".join(functions)),
"--dynamic_dims=True",
"--test_complex=False",
],
main = "math_test.py",
python_version = "PY3",
shard_count = len(functions) // 5,
deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [
"//integrations/tensorflow/bindings/python/pyiree/tf/support",
],
)
for target_backend, functions in dict(
# TODO(#2673): enable LLVM AOT for these tests. JIT is deprecated.
# iree_llvmjit = set_difference(TF_MATH_FUNCTIONS, LLVM_FAILING_DYNAMIC),
iree_vmla = set_difference(TF_MATH_FUNCTIONS, VMLA_FAILING_DYNAMIC_MULTIPLE),
iree_vulkan = set_difference(TF_MATH_FUNCTIONS, VULKAN_FAILING_DYNAMIC),
tf = TF_MATH_FUNCTIONS,
).items()
]
# ---- INDIVIDUAL COMPLEX TESTS ---------------------------------------------- #
# This list was generated by running:
# bazel run integrations/tensorflow/e2e/math:math_test_manual -- --list_functions_with_complex_tests
COMPLEX_FUNCTIONS = [
"abs",
"add",
"angle",
"asinh",
"atanh",
"conj",
"cos",
"cosh",
"count_nonzero",
"cumprod",
"cumsum",
"divide",
"divide_no_nan",
"exp",
"expm1",
"imag",
"l2_normalize",
"log",
"log1p",
"multiply",
"multiply_no_nan",
"negative",
"pow",
"real",
"reciprocal",
"reciprocal_no_nan",
"reduce_euclidean_norm",
"reduce_std",
"reduce_variance",
"rsqrt",
"sigmoid",
"sign",
"sin",
"sinh",
"sqrt",
"square",
"squared_difference",
"subtract",
"tan",
"tanh",
"truediv",
"xdivy",
"xlog1py",
"xlogy",
"zero_fraction",
]
# keep sorted
FAILING_COMPLEX = [
"angle",
"cos",
"cumsum",
"divide_no_nan",
"log",
"log1p",
"multiply_no_nan",
"negative",
"reciprocal",
"reciprocal_no_nan",
"reduce_std",
"reduce_variance",
"rsqrt",
"sigmoid",
"sin",
"sinh",
"sqrt",
"tan",
"tanh",
"zero_fraction",
]
VMLA_FAILING_COMPLEX = VMLA_FAILING + FAILING_COMPLEX
LLVM_FAILING_COMPLEX = LLVM_FAILING + FAILING_COMPLEX
VULKAN_FAILING_COMPLEX = VULKAN_FAILING + FAILING_COMPLEX
# These tests allow us to generate coverage tables and give a finer-grained view
# of the coverage, but are very slow due to bazel overhead, so they are not
# run on the internal or OSS CI.
iree_e2e_cartesian_product_test_suite(
name = "math_complex_tests",
srcs = ["math_test.py"],
failing_configurations = [
{
# TFLite does not support complex numbers.
"target_backends": "tflite",
},
{
# Failing on vmla.
"functions": VMLA_FAILING_COMPLEX,
"target_backends": "iree_vmla",
},
{
# Failing on llvm.
"functions": LLVM_FAILING_COMPLEX,
"target_backends": "iree_llvmjit",
},
{
# Failing on vulkan.
"functions": VULKAN_FAILING_COMPLEX,
"target_backends": "iree_vulkan",
},
],
flags_to_values = {
"reference_backend": "tf",
"functions": COMPLEX_FUNCTIONS,
"dynamic_dims": False,
"test_complex": True,
"target_backends": [
"tf",
"tflite",
"iree_vmla",
"iree_llvmjit",
"iree_vulkan",
],
},
main = "math_test.py",
tags = [
"manual",
"nokokoro",
"notap",
],
deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [
"//integrations/tensorflow/bindings/python/pyiree/tf/support",
],
)
# ---- MULTIPLE COMPLEX TESTS ----------------------------------------------- #
# These tests compile all functions in tf.math at once for testing so that
# we can run them on the CI with 4 additional targets instead of 512. The tests
# are run sharded such that about 5 functions run per shard. This is a
# reasonable tradeoff between shard startup overhead and critical path test
# latency.
# TODO(#3810) 'multiply' outputs all zeros when compiled with other functions.
VMLA_FAILING_COMPLEX_MULTIPLE = VMLA_FAILING_COMPLEX + ["multiply"]
# TODO(#3810) Including 'square' causes error: Recieved signal 11.
# @unused
LLVM_FAILING_COMPLEX_MULTIPLE = LLVM_FAILING_COMPLEX + ["square"]
# TODO(#3810) Including 'square' causes error: Recieved signal 11.
VULKAN_FAILING_COMPLEX_MULTIPLE = VULKAN_FAILING_COMPLEX + ["square"]
[
iree_py_test(
name = "math_complex_tests_multiple__{}".format(target_backend),
srcs = ["math_test.py"],
args = [
"--reference_backend=tf",
"--target_backends={}".format(target_backend),
"--functions={}".format(",".join(functions)),
"--dynamic_dims=False",
"--test_complex=True",
],
main = "math_test.py",
python_version = "PY3",
shard_count = len(functions) // 5,
deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [
"//integrations/tensorflow/bindings/python/pyiree/tf/support",
],
)
for target_backend, functions in dict(
# TODO(#2673): enable LLVM AOT for these tests. JIT is deprecated.
# iree_llvmjit = set_difference(TF_MATH_FUNCTIONS, LLVM_FAILING_COMPLEX_MULTIPLE),
iree_vmla = set_difference(TF_MATH_FUNCTIONS, VMLA_FAILING_COMPLEX_MULTIPLE),
iree_vulkan = set_difference(TF_MATH_FUNCTIONS, VULKAN_FAILING_COMPLEX_MULTIPLE),
tf = TF_MATH_FUNCTIONS,
).items()
]