Skip to content

Commit a8ae9bb

Browse files
Merge pull request #1449 from IntelPython/further-splitting-down-elementwise-functions
2 parents b291c97 + fa4924a commit a8ae9bb

File tree

157 files changed

+12712
-5573
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

157 files changed

+12712
-5573
lines changed

dpctl/tensor/CMakeLists.txt

Lines changed: 80 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,78 @@ if(WIN32)
3030
endif()
3131
endif()
3232

33+
set(_elementwise_sources
34+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/elementwise_common.cpp
35+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/elementwise_functions_type_utils.cpp
36+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/abs.cpp
37+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/acos.cpp
38+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/acosh.cpp
39+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/add.cpp
40+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/asin.cpp
41+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/asinh.cpp
42+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/atan.cpp
43+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/atan2.cpp
44+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/atanh.cpp
45+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/bitwise_and.cpp
46+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/bitwise_invert.cpp
47+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/bitwise_left_shift.cpp
48+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/bitwise_or.cpp
49+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/bitwise_right_shift.cpp
50+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/bitwise_xor.cpp
51+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/cbrt.cpp
52+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/ceil.cpp
53+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/conj.cpp
54+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/copysign.cpp
55+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/cos.cpp
56+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/cosh.cpp
57+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/equal.cpp
58+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/exp.cpp
59+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/exp2.cpp
60+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/expm1.cpp
61+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/floor_divide.cpp
62+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/floor.cpp
63+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/greater_equal.cpp
64+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/greater.cpp
65+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/hypot.cpp
66+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/imag.cpp
67+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/isfinite.cpp
68+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/isinf.cpp
69+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/isnan.cpp
70+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/less_equal.cpp
71+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/less.cpp
72+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/log.cpp
73+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/log1p.cpp
74+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/log2.cpp
75+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/log10.cpp
76+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/logaddexp.cpp
77+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/logical_and.cpp
78+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/logical_not.cpp
79+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/logical_or.cpp
80+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/logical_xor.cpp
81+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/maximum.cpp
82+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/minimum.cpp
83+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/multiply.cpp
84+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/negative.cpp
85+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/not_equal.cpp
86+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/positive.cpp
87+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/pow.cpp
88+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/proj.cpp
89+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/real.cpp
90+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/remainder.cpp
91+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/round.cpp
92+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/rsqrt.cpp
93+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/sign.cpp
94+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/signbit.cpp
95+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/sin.cpp
96+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/sinh.cpp
97+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/sqrt.cpp
98+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/square.cpp
99+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/subtract.cpp
100+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/tan.cpp
101+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/tanh.cpp
102+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/true_divide.cpp
103+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/trunc.cpp
104+
)
33105
set(_tensor_impl_sources
34106
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/tensor_py.cpp
35107
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/accumulators.cpp
@@ -47,11 +119,12 @@ set(_tensor_impl_sources
47119
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/where.cpp
48120
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/boolean_reductions.cpp
49121
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/device_support_queries.cpp
50-
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions1.cpp
51-
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions2.cpp
52122
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/repeat.cpp
53123
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/reduction_over_axis.cpp
54124
)
125+
list(APPEND _tensor_impl_sources
126+
${_elementwise_sources}
127+
)
55128

56129
set(python_module_name _tensor_impl)
57130
pybind11_add_module(${python_module_name} MODULE ${_tensor_impl_sources})
@@ -64,10 +137,11 @@ endif()
64137
set(_no_fast_math_sources
65138
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/full_ctor.cpp
66139
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/linear_sequences.cpp
67-
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions1.cpp
68-
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions2.cpp
69140
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/reduction_over_axis.cpp
70141
)
142+
list(APPEND _no_fast_math_sources
143+
${_elementwise_sources}
144+
)
71145
foreach(_src_fn ${_no_fast_math_sources})
72146
get_source_file_property(_cmpl_options_prop ${_src_fn} COMPILE_OPTIONS)
73147
set(_combined_options_prop ${_cmpl_options_prop} "${_clang_prefix}-fno-fast-math")
@@ -78,7 +152,8 @@ foreach(_src_fn ${_no_fast_math_sources})
78152
endforeach()
79153
if (UNIX)
80154
set_source_files_properties(
81-
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions.cpp
155+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/abs.cpp
156+
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions/sqrt.cpp
82157
PROPERTIES COMPILE_DEFINITIONS "USE_STD_ABS_FOR_COMPLEX_TYPES;USE_STD_SQRT_FOR_COMPLEX_TYPES")
83158
endif()
84159
target_compile_options(${python_module_name} PRIVATE -fno-sycl-id-queries-fit-in-int)

dpctl/tensor/_elementwise_funcs.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1183,7 +1183,7 @@
11831183
_logical_xor_docstring_,
11841184
)
11851185

1186-
# B??: ==== MAXIMUM (x1, x2)
1186+
# B26: ==== MAXIMUM (x1, x2)
11871187
_maximum_docstring_ = """
11881188
maximum(x1, x2, out=None, order='K')
11891189
@@ -1213,7 +1213,7 @@
12131213
_maximum_docstring_,
12141214
)
12151215

1216-
# B??: ==== MINIMUM (x1, x2)
1216+
# B27: ==== MINIMUM (x1, x2)
12171217
_minimum_docstring_ = """
12181218
minimum(x1, x2, out=None, order='K')
12191219
@@ -1373,7 +1373,7 @@
13731373
binary_inplace_fn=ti._pow_inplace,
13741374
)
13751375

1376-
# U??: ==== PROJ (x)
1376+
# U40: ==== PROJ (x)
13771377
_proj_docstring = """
13781378
proj(x, out=None, order='K')
13791379
@@ -1514,7 +1514,7 @@
15141514
"sign", ti._sign_result_type, ti._sign, _sign_docstring
15151515
)
15161516

1517-
# ==== SIGNBIT (x)
1517+
# U41: ==== SIGNBIT (x)
15181518
_signbit_docstring = """
15191519
signbit(x, out=None, order='K')
15201520

dpctl/tensor/libtensor/include/kernels/elementwise_functions/bitwise_and.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "utils/type_utils.hpp"
3434

3535
#include "kernels/elementwise_functions/common.hpp"
36+
#include "kernels/elementwise_functions/common_inplace.hpp"
3637
#include <pybind11/pybind11.h>
3738

3839
namespace dpctl

dpctl/tensor/libtensor/include/kernels/elementwise_functions/bitwise_invert.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
#include "utils/type_utils.hpp"
3636
#include <pybind11/pybind11.h>
3737

38+
#include "kernels/elementwise_functions/common.hpp"
39+
3840
namespace dpctl
3941
{
4042
namespace tensor

dpctl/tensor/libtensor/include/kernels/elementwise_functions/bitwise_left_shift.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include "utils/type_utils.hpp"
3535

3636
#include "kernels/elementwise_functions/common.hpp"
37+
#include "kernels/elementwise_functions/common_inplace.hpp"
3738
#include <pybind11/pybind11.h>
3839

3940
namespace dpctl

dpctl/tensor/libtensor/include/kernels/elementwise_functions/bitwise_or.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "utils/type_utils.hpp"
3434

3535
#include "kernels/elementwise_functions/common.hpp"
36+
#include "kernels/elementwise_functions/common_inplace.hpp"
3637
#include <pybind11/pybind11.h>
3738

3839
namespace dpctl

dpctl/tensor/libtensor/include/kernels/elementwise_functions/bitwise_right_shift.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include "utils/type_utils.hpp"
3535

3636
#include "kernels/elementwise_functions/common.hpp"
37+
#include "kernels/elementwise_functions/common_inplace.hpp"
3738
#include <pybind11/pybind11.h>
3839

3940
namespace dpctl

dpctl/tensor/libtensor/include/kernels/elementwise_functions/bitwise_xor.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "utils/type_utils.hpp"
3434

3535
#include "kernels/elementwise_functions/common.hpp"
36+
#include "kernels/elementwise_functions/common_inplace.hpp"
3637
#include <pybind11/pybind11.h>
3738

3839
namespace dpctl

dpctl/tensor/libtensor/include/kernels/elementwise_functions/floor_divide.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include "utils/type_utils.hpp"
3535

3636
#include "kernels/elementwise_functions/common.hpp"
37+
#include "kernels/elementwise_functions/common_inplace.hpp"
3738
#include <pybind11/pybind11.h>
3839

3940
namespace dpctl

dpctl/tensor/libtensor/include/kernels/elementwise_functions/pow.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#include "utils/type_utils.hpp"
3636

3737
#include "kernels/elementwise_functions/common.hpp"
38+
#include "kernels/elementwise_functions/common_inplace.hpp"
3839
#include <pybind11/pybind11.h>
3940

4041
namespace dpctl

dpctl/tensor/libtensor/include/kernels/elementwise_functions/remainder.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#include "utils/type_utils.hpp"
3636

3737
#include "kernels/elementwise_functions/common.hpp"
38+
#include "kernels/elementwise_functions/common_inplace.hpp"
3839
#include <pybind11/pybind11.h>
3940

4041
namespace dpctl

dpctl/tensor/libtensor/include/kernels/elementwise_functions/subtract.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include "utils/type_utils.hpp"
3535

3636
#include "kernels/elementwise_functions/common.hpp"
37+
#include "kernels/elementwise_functions/common_inplace.hpp"
3738
#include <pybind11/pybind11.h>
3839

3940
namespace dpctl

dpctl/tensor/libtensor/include/kernels/elementwise_functions/true_divide.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include "utils/type_utils.hpp"
3535

3636
#include "kernels/elementwise_functions/common.hpp"
37+
#include "kernels/elementwise_functions/common_inplace.hpp"
3738
#include <pybind11/pybind11.h>
3839

3940
namespace dpctl
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
//===----------- Implementation of _tensor_impl module ---------*-C++-*-/===//
2+
//
3+
// Data Parallel Control (dpctl)
4+
//
5+
// Copyright 2020-2023 Intel Corporation
6+
//
7+
// Licensed under the Apache License, Version 2.0 (the "License");
8+
// you may not use this file except in compliance with the License.
9+
// You may obtain a copy of the License at
10+
//
11+
// http://www.apache.org/licenses/LICENSE-2.0
12+
//
13+
// Unless required by applicable law or agreed to in writing, software
14+
// distributed under the License is distributed on an "AS IS" BASIS,
15+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16+
// See the License for the specific language governing permissions and
17+
// limitations under the License.
18+
//
19+
//===----------------------------------------------------------------------===//
20+
///
21+
/// \file
22+
/// This file defines functions of dpctl.tensor._tensor_impl extensions,
23+
/// specifically functions for elementwise operations.
24+
//===----------------------------------------------------------------------===//
25+
26+
#include "dpctl4pybind11.hpp"
27+
#include <CL/sycl.hpp>
28+
#include <pybind11/numpy.h>
29+
#include <pybind11/pybind11.h>
30+
#include <pybind11/stl.h>
31+
#include <vector>
32+
33+
#include "abs.hpp"
34+
#include "elementwise_functions.hpp"
35+
#include "utils/type_dispatch.hpp"
36+
37+
#include "kernels/elementwise_functions/abs.hpp"
38+
#include "kernels/elementwise_functions/common.hpp"
39+
40+
namespace py = pybind11;
41+
42+
namespace dpctl
43+
{
44+
namespace tensor
45+
{
46+
namespace py_internal
47+
{
48+
49+
namespace td_ns = dpctl::tensor::type_dispatch;
50+
51+
namespace ew_cmn_ns = dpctl::tensor::kernels::elementwise_common;
52+
using ew_cmn_ns::unary_contig_impl_fn_ptr_t;
53+
using ew_cmn_ns::unary_strided_impl_fn_ptr_t;
54+
55+
// U01: ==== ABS (x)
56+
namespace impl
57+
{
58+
59+
namespace abs_fn_ns = dpctl::tensor::kernels::abs;
60+
61+
static unary_contig_impl_fn_ptr_t abs_contig_dispatch_vector[td_ns::num_types];
62+
static int abs_output_typeid_vector[td_ns::num_types];
63+
static unary_strided_impl_fn_ptr_t
64+
abs_strided_dispatch_vector[td_ns::num_types];
65+
66+
void populate_abs_dispatch_vectors(void)
67+
{
68+
using namespace td_ns;
69+
namespace fn_ns = abs_fn_ns;
70+
71+
using fn_ns::AbsContigFactory;
72+
DispatchVectorBuilder<unary_contig_impl_fn_ptr_t, AbsContigFactory,
73+
num_types>
74+
dvb1;
75+
dvb1.populate_dispatch_vector(abs_contig_dispatch_vector);
76+
77+
using fn_ns::AbsStridedFactory;
78+
DispatchVectorBuilder<unary_strided_impl_fn_ptr_t, AbsStridedFactory,
79+
num_types>
80+
dvb2;
81+
dvb2.populate_dispatch_vector(abs_strided_dispatch_vector);
82+
83+
using fn_ns::AbsTypeMapFactory;
84+
DispatchVectorBuilder<int, AbsTypeMapFactory, num_types> dvb3;
85+
dvb3.populate_dispatch_vector(abs_output_typeid_vector);
86+
};
87+
88+
} // namespace impl
89+
90+
void init_abs(py::module_ m)
91+
{
92+
using arrayT = dpctl::tensor::usm_ndarray;
93+
using event_vecT = std::vector<sycl::event>;
94+
{
95+
impl::populate_abs_dispatch_vectors();
96+
using impl::abs_contig_dispatch_vector;
97+
using impl::abs_output_typeid_vector;
98+
using impl::abs_strided_dispatch_vector;
99+
100+
auto abs_pyapi = [&](const arrayT &src, const arrayT &dst,
101+
sycl::queue &exec_q,
102+
const event_vecT &depends = {}) {
103+
return py_unary_ufunc(
104+
src, dst, exec_q, depends, abs_output_typeid_vector,
105+
abs_contig_dispatch_vector, abs_strided_dispatch_vector);
106+
};
107+
m.def("_abs", abs_pyapi, "", py::arg("src"), py::arg("dst"),
108+
py::arg("sycl_queue"), py::arg("depends") = py::list());
109+
110+
auto abs_result_type_pyapi = [&](const py::dtype &dtype) {
111+
return py_unary_ufunc_result_type(dtype, abs_output_typeid_vector);
112+
};
113+
m.def("_abs_result_type", abs_result_type_pyapi);
114+
}
115+
}
116+
117+
} // namespace py_internal
118+
} // namespace tensor
119+
} // namespace dpctl

dpctl/tensor/libtensor/source/elementwise_functions1.hpp renamed to dpctl/tensor/libtensor/source/elementwise_functions/abs.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,16 @@
2626
#pragma once
2727
#include <pybind11/pybind11.h>
2828

29+
namespace py = pybind11;
30+
2931
namespace dpctl
3032
{
3133
namespace tensor
3234
{
3335
namespace py_internal
3436
{
3537

36-
extern void init_elementwise_functions1(py::module_ m);
38+
extern void init_abs(py::module_ m);
3739

3840
} // namespace py_internal
3941
} // namespace tensor

0 commit comments

Comments
 (0)