Coverage for cuda / core / _layout.pyx: 89.47%
551 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-08 01:07 +0000
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-08 01:07 +0000
1# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2#
3# SPDX-License-Identifier: Apache-2.0
5cimport cython
7from libc.stdint cimport int64_t, intptr_t
9from cpython.object cimport PyObject
12cdef extern from "Python.h":
13 int _PySlice_Unpack "PySlice_Unpack" (PyObject *slice, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step) except -1
14 Py_ssize_t _PySlice_AdjustIndices "PySlice_AdjustIndices" (Py_ssize_t length, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t step) noexcept nogil
17@cython.final
18cdef class _StridedLayout:
19 """
20 A class describing the layout of a multi-dimensional tensor
21 with a shape, strides and itemsize.
23 Parameters
24 ----------
25 shape : tuple
26 A tuple of non-negative integers.
27 strides : tuple, optional
28 If provided, must be a tuple of integers of the same length as ``shape``.
29 Otherwise, the strides are assumed to be implicitly C-contiguous and the resulting
30 layout's :attr:`strides` will be None.
31 itemsize : int
32 The number of bytes per single element (dtype size).
33 divide_strides : bool, optional
34 If True, the provided :attr:`strides` will be divided by the :attr:`itemsize`.
37 See also :meth:`dense`.
40 Attributes
41 ----------
42 itemsize : int
43 The number of bytes per single element (dtype size).
44 slice_offset : int
45 The offset (as a number of elements, not bytes) of the element at
46 index ``(0,) * ndim``. See also :attr:`slice_offset_in_bytes`.
47 """
49 def __init__(
50 self : _StridedLayout,
51 shape : tuple[int, ...],
52 strides : tuple[int, ...] | None,
53 itemsize : int,
54 divide_strides : bool = False
55 ) -> None:
56 self.init_from_tuple(shape, strides, itemsize, divide_strides) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f%h'h4h5h6h1cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijinixgygkioipi
58 @classmethod
59 def dense(
60 cls,
61 shape : tuple[int],
62 itemsize : int,
63 stride_order : str | tuple[int] = 'C'
64 ) -> _StridedLayout:
65 """
66 Creates a new _StridedLayout instance with dense strides.
68 Parameters
69 ----------
70 shape : tuple
71 A tuple of non-negative integers.
72 itemsize : int
73 The number of bytes per single element of the tensor.
74 stride_order : str or tuple, optional
75 The order of the strides:
76 * 'C' (default) - the strides are computed in C-order (increasing from the right to the left)
77 * 'F' - the strides are computed in F-order (increasing from the left to the right)
78 * A tuple - it must be a permutation of ``tuple(range(len(shape)))``.
79 The last element of the tuple is the axis with stride 1.
81 See also :attr:`stride_order`.
84 .. highlight:: python
85 .. code-block:: python
87 assert _StridedLayout.dense((5, 3, 7), 1, "C") == _StridedLayout((5, 3, 7), (21, 7, 1), 1)
88 assert _StridedLayout.dense((5, 3, 7), 1, "F") == _StridedLayout((5, 3, 7), (1, 5, 15), 1)
89 assert _StridedLayout.dense((5, 3, 7), 1, (2, 0, 1)) == _StridedLayout((5, 3, 7), (3, 1, 15), 1)
91 """
92 cdef _StridedLayout new_layout = _StridedLayout.__new__(cls) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H AcucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f9h!h#h$hOhPhQhRhShTh1cwc%cxcyc2c'czc,f?eVg4gHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f.f0gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijilimixgygki
93 new_layout.init_dense_from_tuple(shape, itemsize, stride_order) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H AcucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f9h!h#h$hOhPhQhRhShTh1cwc%cxcyc2c'czc,f?eVg4gHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f.f0gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijilimixgygki
94 return new_layout 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H AcucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f9h!h#h$hOhPhQhRhShTh1cwc%cxcyc2c'czc,f?eVg4gHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f.f0gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijilimixgygki
96 @classmethod
97 def dense_like(
98 cls,
99 other : _StridedLayout,
100 stride_order : str | tuple[int] = "K"
101 ) -> _StridedLayout:
102 """
103 Creates a _StridedLayout with the same :attr:`shape` and :attr:`itemsize` as the other layout,
104 but with contiguous strides in the specified order and no slice offset.
106 See also :attr:`is_dense`.
108 Parameters
109 ----------
110 other : _StridedLayout
111 The _StridedLayout to copy the :attr:`shape` and :attr:`itemsize` from.
112 stride_order : str or tuple, optional
113 The order of the strides:
114 * 'K' (default) - keeps the order of the strides as in the ``other`` layout.
115 * 'C' - the strides are computed in C-order (increasing from the right to the left)
116 * 'F' - the strides are computed in F-order (increasing from the left to the right)
117 * A tuple - it must be a permutation of ``tuple(range(len(shape)))``.
118 The last element of the tuple is the axis with stride 1.
120 See also :attr:`stride_order`.
123 .. highlight:: python
124 .. code-block:: python
126 layout = _StridedLayout.dense((5, 3, 7), 1).permuted((2, 0, 1))
127 assert layout == _StridedLayout((7, 5, 3), (1, 21, 7), 1)
129 # dense_like with the default "K" stride_order
130 # keeps the same order of strides as in the original layout
131 assert _StridedLayout.dense_like(layout) == layout
132 # "C", "F" recompute the strides accordingly
133 assert _StridedLayout.dense_like(layout, "C") == _StridedLayout((7, 5, 3), (15, 3, 1), 1)
134 assert _StridedLayout.dense_like(layout, "F") == _StridedLayout((7, 5, 3), (1, 7, 35), 1)
135 """
136 cdef OrderFlag order_flag
137 cdef axis_vec_t stride_order_vec
138 cdef bint is_dense = other.get_is_dense() 2}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
140 if stride_order == "K": 2}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
141 if is_dense: 2thuhvhwhxhyhodrdzhsdAhCdDdBhFd@cSd]cTdVd,c.cChDhEh2d4d8ddd=c/e:e;e
142 return other 2thuhvhwhxhyhzhAhBhChDhEh/e:e;e
143 other.get_stride_order(stride_order_vec) 2odrdsdCdDdFd@cSd]cTdVd,c.c2d4d8ddd=c
144 order_flag = ORDER_PERM 2odrdsdCdDdFd@cSd]cTdVd,c.c2d4d8ddd=c
145 else:
146 order_flag = _stride_order2vec(stride_order_vec, stride_order) 2}g~gahbh-g.gchdh/geh:g;gfhghhh=gihjhpd?gkhqdlhMdNdmhtdudnhvdwdOdxd@gohphydPdQdRdzdAdBdEd[g]g^g8gqh_g`g-d[c^crhUd+cWdfd_cXd`c9gYd{c-c.dZdgd|c}c/d{g|g!g:dhd~c;d0d=d1d?did@dad/c3d[dbd:csh]djd^d5d6d7dcd_d9d;ckded?cxeyezeAeBeoeCepeDeEeFeGeHeIeJeqeKeLeMereNeOesete
147 if order_flag == ORDER_NONE: 2}g~gahbh-g.gchdh/geh:g;gfhghhh=gihjhpd?gkhqdlhMdNdmhtdudnhvdwdOdxd@gohphydPdQdRdzdAdBdEd[g]g^g8gqh_g`g-d[c^crhUd+cWdfd_cXd`c9gYd{c-c.dZdgd|c}c/d{g|g!g:dhd~c;d0d=d1d?did@dad/c3d[dbd:csh]djd^d5d6d7dcd_d9d;ckded?cxeyezeAeBeoeCepeDeEeFeGeHeIeJeqeKeLeMereNeOesete
148 raise ValueError(
149 f"The stride_order must be 'K', 'C', 'F', "
150 f"or a permutation tuple. Got: {stride_order}"
151 )
152 elif order_flag == ORDER_C:
153 if is_dense and other.get_is_contiguous_c(): 2}g~gahfhghihpdlhnhvdxdohzdBdEd[crhWd|c!g~c0d/csh5d6d7d9d;c?coepete
154 return other 2*f}g~gahfhghihlhnhohrhsh
155 elif order_flag == ORDER_F:
156 if is_dense and other.get_is_contiguous_f(): 2bhchdhehhhjhkhqdmhtdudwdphydAd8gqhUd+c_cXd9gYd-cZd}c1d3d:cedqerese
157 return other 2bhchdhehhhjhkhmhphqh
159 cdef _StridedLayout new_layout = _StridedLayout.__new__(cls) 2*f-g.g/g:g;g=godpd?gqdrdMdNdsdtdudvdwdOdxd@gydPdQdRdzdAdBdCdDdEd[gFd]g^g8g@cSd_g`g-d[c]cTd^cUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!g:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEeFeGeHeIeJeqeKeLeMereNeOesete
160 new_layout.init_dense_from_ptr( 2-g.g/g:g;g=godpd?gqdrdMdNdsdtdudvdwdOdxd@gydPdQdRdzdAdBdCdDdEd[gFd]g^g8g@cSd_g`g-d[c]cTd^cUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!g:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEeFeGeHeIeJeqeKeLeMereNeOesete
161 other.base.ndim,
162 other.base.shape,
163 other.itemsize,
164 order_flag,
165 &stride_order_vec
166 )
167 return new_layout 2-g.g/g:g;g=godpd?gqdrdMdNdsdtdudvdwdOdxd@gydPdQdRdzdAdBdCdDdEd[gFd]g^g8g@cSd_g`g-d[c]cTd^cUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!g:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEeFeGeHeIeJeqeKeLeMereNeOesete
169 def __repr__(self : _StridedLayout) -> str:
170 if self.slice_offset == 0:
171 return (
172 f"_StridedLayout(shape={self.shape}, strides={self.strides}, itemsize={self.itemsize})"
173 )
174 else:
175 return (
176 f"_StridedLayout(shape={self.shape}, strides={self.strides}, itemsize={self.itemsize}, _slice_offset={self.slice_offset})"
177 )
179 def __eq__(self : _StridedLayout, other : _StridedLayout) -> bool:
180 return self.itemsize == other.itemsize and self.slice_offset == other.slice_offset and _base_layout_equal(self.base, other.base) 2)d`d% ' M N c ( d ) G H Ac9cucJcO P vcKc=e+fMc*cNcLcOc(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiiji
182 @property
183 def ndim(self : _StridedLayout):
184 """
185 The number of dimensions (length of the shape tuple).
187 :type: int
188 """
189 return self.base.ndim 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f9h%h!h#h'h$h1cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec
191 @property
192 def shape(self : _StridedLayout):
193 """
194 Shape of the tensor.
196 :type: tuple[int]
197 """
198 return self.get_shape_tuple() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecniki
200 @property
201 def strides(self : _StridedLayout):
202 """
203 Strides of the tensor (in **counts**, not bytes).
204 If _StridedLayout was created with strides=None, the
205 returned value is None and layout is implicitly C-contiguous.
207 :type: tuple[int] | None
208 """
209 return self.get_strides_tuple() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f#g3g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z :f;f5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijinikioiCgDg
211 @property
212 def strides_in_bytes(self : _StridedLayout):
213 """
214 Strides of the tensor (in bytes).
216 :type: tuple[int] | None
217 """
218 return self.get_strides_in_bytes_tuple() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecvgwgEgFgCgDg
220 @property
221 def stride_order(self : _StridedLayout):
222 """
223 A permutation of ``tuple(range(ndim))`` describing the
224 relative order of the strides.
226 .. highlight:: python
227 .. code-block:: python
229 # C-contiguous layout
230 assert _StridedLayout.dense((5, 3, 7), 1).stride_order == (0, 1, 2)
231 # F-contiguous layout
232 assert _StridedLayout.dense((5, 3, 7), 1, stride_order="F").stride_order == (2, 1, 0)
233 # Permuted layout
234 assert _StridedLayout.dense((5, 3, 7), 1, stride_order=(2, 0, 1)).stride_order == (2, 0, 1)
236 :type: tuple[int]
237 """
238 return self.get_stride_order_tuple() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H ucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czcHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z TgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec
240 @property
241 def volume(self : _StridedLayout):
242 """
243 The number of elements in the tensor, i.e. the product of the shape tuple.
245 :type: int
246 """
247 return self.get_volume() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec
249 @property
250 def is_unique(self : _StridedLayout):
251 """
252 If True, each element of a tensor with this layout is mapped to
253 a unique memory offset.
255 All contiguous layouts are unique and so are layouts that can be created
256 by permuting, slicing, flattening, squeezing, repacking, or reshaping
257 a contiguous layout.
258 Conversely, broadcast layouts (layouts with a 0 stride
259 for some extent greater than 1) are not unique.
261 For layouts resulting from manual stride manipulations
262 (such as with ``numpy.lib.stride_tricks``), the check
263 may inaccurately report False, as the exact uniqueness
264 check may be expensive.
266 :type: bool
267 """
268 return self.get_is_unique() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec
270 @property
271 def is_contiguous_c(self : _StridedLayout):
272 """
273 True iff the layout is contiguous in C-order, i.e.
274 the rightmost stride is 1 and each subsequent
275 stride to the left is the product of the
276 extent and the stride to the right.
278 .. highlight:: python
279 .. code-block:: python
281 layout = _StridedLayout.dense((2, 5, 3), 1, "C")
282 assert layout == _StridedLayout((2, 5, 3), (15, 3, 1), 1)
283 assert layout.is_contiguous_c
285 See also :attr:`is_contiguous_any`.
287 :type: bool
288 """
289 return self.get_is_contiguous_c() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec
291 @property
292 def is_contiguous_f(self : _StridedLayout):
293 """
294 True iff the layout is contiguous in F-order, i.e.
295 the leftmost stride is 1 and each subsequent
296 stride to the right is the product of the
297 stride and extent to the left.
299 .. highlight:: python
300 .. code-block:: python
302 layout = _StridedLayout.dense((2, 5, 3), 1, "F")
303 assert layout == _StridedLayout((2, 5, 3), (1, 2, 10), 1)
304 assert layout.is_contiguous_f
306 See also :attr:`is_contiguous_any`.
308 :type: bool
309 """
310 return self.get_is_contiguous_f() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec
312 @property
313 def is_contiguous_any(self : _StridedLayout):
314 """
315 True iff the layout is contiguous in some axis order, i.e.
316 there exists a permutation of axes such that the layout
317 is C-contiguous.
319 In a contiguous layout, the strides are non-negative and
320 the mapping of elements to the memory offset range
321 ``[min_offset, max_offset]`` is 1-to-1.
323 .. highlight:: python
324 .. code-block:: python
326 # dense defaults to C-contiguous
327 layout = _StridedLayout.dense((5, 3, 7), 1)
328 assert layout.is_contiguous_c and not layout.is_contiguous_f
329 assert layout.is_contiguous_any
331 # reversing the order of axes gives F-contiguous layout
332 permuted = layout.permuted((2, 1, 0))
333 assert not permuted.is_contiguous_c and permuted.is_contiguous_f
334 assert permuted.is_contiguous_any
336 # neither C- nor F-order but still contiguous
337 permuted = layout.permuted((2, 0, 1))
338 assert not permuted.is_contiguous_c and not permuted.is_contiguous_f
339 assert permuted.is_contiguous_any
341 # slicing the right-most extent creates a gap in the
342 # offset_bounds range that is not reachable with any
343 # element in the sliced layout
344 sliced = layout[:, :, :-1]
345 assert not sliced.is_contiguous_c and not sliced.is_contiguous_f
346 assert not sliced.is_contiguous_any
348 :type: bool
349 """
350 return self.get_is_contiguous_any() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec
352 @property
353 def is_dense(self : _StridedLayout):
354 """
355 A dense layout is contiguous (:attr:`is_contiguous_any` is True)
356 and has no slice offset (:attr:`slice_offset_in_bytes` is 0).
358 In a dense layout, elements are mapped 1-to-1 to the ``[0, volume - 1]``
359 memory offset range.
361 :type: bool
362 """
363 return self.get_is_dense() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecvgwgEgFgCgDg
365 @property
366 def offset_bounds(self : _StridedLayout):
367 """
368 The memory offset range ``[min_offset, max_offset]`` (in element counts, not bytes)
369 that elements of a tensor with this layout are mapped to.
371 If the layout is empty (i.e. ``volume == 0``), the returned tuple is ``(0, -1)``.
372 Otherwise, ``min_offset <= max_offset`` and all elements of the tensor with
373 this layout are mapped within the ``[min_offset, max_offset]`` range.
375 .. highlight:: python
376 .. code-block:: python
378 # Possible implementation of the offset_bounds
379 def offset_bounds(layout : _StridedLayout):
380 if layout.volume == 0:
381 return 0, -1
382 ndim = layout.ndim
383 shape = layout.shape
384 strides = layout.strides
385 idx_min = [shape[i] - 1 if strides[i] < 0 else 0 for i in range(ndim)]
386 idx_max = [shape[i] - 1 if strides[i] > 0 else 0 for i in range(ndim)]
387 min_offset = sum(strides[i] * idx_min[i] for i in range(ndim)) + layout.slice_offset
388 max_offset = sum(strides[i] * idx_max[i] for i in range(ndim)) + layout.slice_offset
389 return min_offset, max_offset
391 :type: tuple[int, int]
392 """
393 cdef stride_t min_offset = 0 2*fdgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK AbBbCbDbL y z -f:f;f.fgbhbibjbg h i j k l q r EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec
394 cdef stride_t max_offset = 0 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK AbBbCbDbL y z -f:f;f.fgbhbibjbg h i j k l q r EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec
395 self.get_offset_bounds(min_offset, max_offset) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK AbBbCbDbL y z -f:f;f.fgbhbibjbg h i j k l q r EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec
396 return min_offset, max_offset 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK AbBbCbDbL y z -f:f;f.fgbhbibjbg h i j k l q r EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec
398 @property
399 def min_offset(self : _StridedLayout):
400 """
401 See :attr:`offset_bounds` for details.
403 :type: int
404 """
405 cdef stride_t min_offset = 0
406 cdef stride_t max_offset = 0
407 self.get_offset_bounds(min_offset, max_offset)
408 return min_offset
410 @property
411 def max_offset(self : _StridedLayout):
412 """
413 See :attr:`offset_bounds` for details.
415 :type: int
416 """
417 cdef stride_t min_offset = 0
418 cdef stride_t max_offset = 0
419 self.get_offset_bounds(min_offset, max_offset)
420 return max_offset
422 @property
423 def slice_offset_in_bytes(self : _StridedLayout):
424 """
425 The memory offset (as a number of bytes) of the element at index ``(0,) * ndim``.
426 Equal to :attr:`itemsize` ``*`` :attr:`slice_offset`.
428 .. note::
429 The only way for the index ``(0,) * ndim`` to be mapped to a non-zero offset
430 is slicing with :meth:`sliced` method (or ``[]`` operator).
432 :type: int
433 """
434 return self.get_slice_offset_in_bytes() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgyg
436 def required_size_in_bytes(self : _StridedLayout) -> int:
437 """
438 The memory allocation size (in bytes) needed so that
439 all elements of a tensor with this layout can be mapped
440 within the allocated memory range.
442 The function raises an error if ``min_offset < 0``.
443 Otherwise, the returned value is equal to
444 ``(max_offset + 1) * itemsize``.
446 .. hint::
447 For dense layouts, the function always succeeds and the
448 ``(max_offset + 1) * itemsize`` is equal to the ``volume * itemsize``.
450 .. highlight:: python
451 .. code-block:: python
453 # Allocating memory on a device to copy a host tensor
454 def device_tensor_like(a : numpy.ndarray, device : ccx.Device) -> StridedMemoryView:
455 a_view = StridedMemoryView(a, -1)
456 # get the original layout of ``a`` and convert it to a dense layout
457 # to avoid overallocating memory (e.g. if the ``a`` was sliced)
458 layout = a_view._layout.to_dense()
459 # get the required size in bytes to fit the tensor
460 required_size = layout.required_size_in_bytes()
461 # allocate the memory on the device
462 device.set_current()
463 mem = device.allocate(required_size)
464 # create a view on the newly allocated device memory
465 b_view = StridedMemoryView.from_buffer(mem, layout, a_view.dtype)
466 return b_view
467 """
468 return self.get_required_size_in_bytes() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK AbBbCbDbL y z -f:f;f.fgbhbibjbg h i j k l q r EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijilimixgygoivgwgEgFg
470 def flattened_axis_mask(self : _StridedLayout) -> axes_mask_t:
471 """
472 A mask describing which axes of this layout are mergeable
473 using the :meth:`flattened` method.
474 """
475 return self.get_flattened_axis_mask() 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc
477 def to_dense(self : _StridedLayout, object stride_order="K") -> _StridedLayout:
478 """
479 Returns a dense layout with the same shape and itemsize,
480 but with dense strides in the specified order.
482 See :meth:`dense_like` method documentation for details.
483 """
484 return _StridedLayout.dense_like(self, stride_order) 2}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
486 def reshaped(self : _StridedLayout, shape : tuple[int]) -> _StridedLayout:
487 """
488 Returns a layout with the new shape, if the new shape is compatible
489 with the current layout.
491 The new shape is compatible if:
492 * the new and old shapes have the same volume
493 * the old strides can be split or flattened to match the new shape,
494 assuming indices are iterated in C-order
496 A single extent in the ``shape`` tuple can be set to -1 to indicate
497 it should be inferred from the old volume and the other extents.
499 .. highlight:: python
500 .. code-block:: python
502 layout = _StridedLayout.dense((5, 3, 4), 1)
503 assert layout.reshaped((20, 3)) == _StridedLayout.dense((20, 3), 1)
504 assert layout.reshaped((4, -1)) == _StridedLayout.dense((4, 15), 1)
505 assert layout.permuted((2, 0, 1)).reshaped((4, 15,)) == _StridedLayout((4, 15), (1, 4), 1)
506 # layout.permuted((2, 0, 1)).reshaped((20, 3)) -> error
507 """
508 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 21cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb
509 cdef BaseLayout new_shape
510 init_base_layout(new_shape, len(shape)) 21cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb
511 for i in range(len(shape)): 21cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb
512 new_shape.shape[i] = shape[i] 21cwcxcyc2czc/f#g,f?e3gVg4g^eSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb
513 self.reshape_into(new_layout, new_shape) 21cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb
514 return new_layout 21cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK AbBbCbDbL y z -f:f;f.fgbhbibjbg h i j k l q r EbFb
516 def permuted(self : _StridedLayout, axis_order : tuple[int]) -> _StridedLayout:
517 """
518 Returns a new layout where the shape and strides tuples are permuted
519 according to the specified permutation of axes.
520 """
521 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f9h%h!h#h'h$h4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
522 cdef axis_vec_t axis_order_vec
523 _tuple2axis_vec(axis_order_vec, axis_order) 2*fc ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f9h%h!h#h'h$h4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
524 self.permute_into(new_layout, axis_order_vec) 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f9h%h!h#h'h$h4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
525 return new_layout 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
527 def flattened(self : _StridedLayout, start_axis : int = 0, end_axis : int = -1, mask : int | None = None) -> _StridedLayout:
528 """
529 Merges consecutive extents into a single extent (equal to the product of merged extents)
530 if the corresponding strides can be replaced with a single stride
531 (assuming indices are iterated in C-order, i.e. the rightmost
532 axis is incremented first).
534 .. highlight:: python
535 .. code-block:: python
537 # the two extents can be merged into a single extent
538 # because layout.strides[0] == layout.strides[1] * layout.shape[1]
539 layout = _StridedLayout((3, 2), (2, 1), 1)
540 assert layout.flattened() == _StridedLayout((6,), (1,), 1)
542 # the two extents cannot be merged into a single extent
543 # because layout.strides[0] != layout.strides[1] * layout.shape[1]
544 layout = _StridedLayout((3, 2), (1, 3), 1)
545 assert layout.flattened() == layout
547 If ``start_axis`` and ``end_axis`` are provided, only the axes in the
548 inclusive range ``[start_axis, end_axis]`` are considered for flattening.
550 Alternatively, a mask specifying which axes to consider can be provided.
551 A mask of mergeable extents can be obtained using the :meth:`flattened_axis_mask` method.
552 Masks for layouts with the same number of dimensions can be combined
553 using the logical ``&`` (bitwise AND) operator.
555 .. highlight:: python
556 .. code-block:: python
558 layout = _StridedLayout.dense((4, 5, 3), 4)
559 layout2 = _StridedLayout((4, 5, 3), (1, 12, 4), 4)
560 # Even though the two layouts have the same shape initially,
561 # their shapes differ after flattening.
562 assert layout.flattened() == _StridedLayout((60,), (1,), 4)
563 assert layout2.flattened() == _StridedLayout((4, 15), (1, 4), 4)
564 # With the mask, only extents that are mergeable in both layouts are flattened
565 # and the resulting shape is the same for both layouts.
566 mask = layout.flattened_axis_mask() & layout2.flattened_axis_mask()
567 assert layout.flattened(mask=mask) == _StridedLayout((4, 15), (15, 1), 4)
568 assert layout2.flattened(mask=mask) == _StridedLayout((4, 15), (1, 4), 4)
569 """
570 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc
571 cdef axes_mask_t axis_mask
572 if mask is None: 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc
573 axis_mask = axis_mask_from_range(self.ndim, start_axis, end_axis) 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc
574 else:
575 axis_mask = mask 2)d`d% ' M N c ( d ) G H Ac9cucJcO P vcKc=e+fMc*cNcLcOc
576 self.flatten_into(new_layout, axis_mask) 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc
577 return new_layout 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc
579 def squeezed(self : _StridedLayout) -> _StridedLayout:
580 """
581 Returns a new layout where all the singleton dimensions (extents equal to 1)
582 are removed. Additionally, if the layout volume is 0,
583 the returned layout will be reduced to a 1-dim layout
584 with shape (0,) and strides (0,).
585 """
586 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f
587 self.squeeze_into(new_layout) 2*fmgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f
588 return new_layout 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f
590 def unsqueezed(self : _StridedLayout, axis : int | tuple[int]) -> _StridedLayout:
591 """
592 Returns a new layout where the specified axis or axes are added as singleton extents.
593 The ``axis`` can be either a single integer in range ``[0, ndim]``
594 or a tuple of unique integers in range ``[0, ndim + len(axis) - 1]``.
595 """
596 cdef axis_vec_t axis_vec
597 if isinstance(axis, int): 2{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec
598 axis_vec.push_back(axis)
599 else:
600 _tuple2axis_vec(axis_vec, axis) 2{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec
601 if axis_vec.size() == 0: 2{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec
602 return self 2IhJhKhLhMhNhuevewe
603 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
604 self.unsqueeze_into(new_layout, axis_vec) 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
605 return new_layout 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
607 def broadcast_to(self : _StridedLayout, shape : tuple[int]) -> _StridedLayout:
608 """
609 Returns a layout with the new shape, if the old shape can be
610 broadcast to the new one.
612 The shapes are compatible if:
613 * the new shape has the same or greater number of dimensions
614 * starting from the right, each extent in the old shape must be 1 or
615 equal to the corresponding extent in the new shape.
617 Strides of the added or modified extents are set to 0, the remaining ones are unchanged.
618 If the shapes are not compatible, a ValueError is raised.
619 """
620 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc
621 cdef BaseLayout new_shape
622 cdef int new_ndim = len(shape) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc
623 init_base_layout(new_shape, new_ndim) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc
624 for i in range(new_ndim): 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc
625 new_shape.shape[i] = shape[i] 2dgegfggghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc
626 self.broadcast_into(new_layout, new_shape) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc
627 return new_layout 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc
629 def repacked(self : _StridedLayout, itemsize : int, data_ptr : intptr_t = 0, axis : int = -1, keep_dim : bool = True) -> _StridedLayout:
630 """
631 Converts the layout to match the specified itemsize.
632 If ``new_itemsize < itemsize``, each element of the tensor is **unpacked** into multiple elements,
633 i.e. the extent at ``axis`` increases by the factor ``itemsize // new_itemsize``.
634 If ``new_itemsize > itemsize``, the consecutive elements in the tensor are **packed** into a single element,
635 i.e. the extent at ``axis`` decreases by the factor ``new_itemsize // itemsize``.
636 In either case, the ``volume * itemsize`` of the layout remains the same.
638 The conversion is subject to the following constraints:
639 * The extent at ``axis`` must be a positive integer.
640 * The stride at ``axis`` must be 1.
642 Moreover, if the ``new_itemsize > itemsize``:
643 * The extent at ``axis`` must be divisible by ``new_itemsize // itemsize``.
644 * All other strides must be divisible by ``new_itemsize // itemsize``.
645 * The ``slice_offset`` must be divisible by ``new_itemsize // itemsize``.
646 * If ``data_ptr`` is provided, it must be aligned to the new itemsize.
648 The maximum itemsize that satisfies all the constraints
649 can be obtained using the :meth:`max_compatible_itemsize` method.
651 If the ``keep_dim`` is False and the extent at ``axis`` would be reduced to 1,
652 it is omitted from the returned layout.
654 .. highlight:: python
655 .. code-block:: python
657 # Repacking the layout with itemsize = 4 bytes as 2, 8, and 16 sized layouts.
658 layout = _StridedLayout.dense((5, 4), 4)
659 assert layout.repacked(2) == _StridedLayout.dense((5, 8), 2)
660 assert layout.repacked(8) == _StridedLayout.dense((5, 2), 8)
661 assert layout.repacked(16) == _StridedLayout.dense((5, 1), 16)
662 assert layout.repacked(16, keep_dim=False) == _StridedLayout.dense((5,), 16)
665 .. highlight:: python
666 .. code-block:: python
668 # Viewing (5, 6) float array as (5, 3) complex64 array.
669 a = numpy.ones((5, 6), dtype=numpy.float32)
670 float_view = StridedMemoryView(a, -1)
671 layout = float_view._layout
672 assert layout.shape == (5, 6)
673 assert layout.itemsize == 4
674 complex_view = float_view.view(layout.repacked(8), numpy.complex64)
675 assert complex_view._layout.shape == (5, 3)
676 assert complex_view._layout.itemsize == 8
677 b = numpy.from_dlpack(complex_view)
678 assert b.shape == (5, 3)
679 """
681 if itemsize == self.itemsize: 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7
682 return self 2sgtgug!c#c$c
683 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 2*f; = ? a b 2 3 4 5 6 7
684 if itemsize > self.itemsize: 1;=?ab234567
685 self.pack_into(new_layout, itemsize, data_ptr, keep_dim, axis) 1;=?ab234567
686 else:
687 self.unpack_into(new_layout, itemsize, axis) 1;=?ab234567
688 return new_layout 1;=?ab234567
690 def max_compatible_itemsize(self : _StridedLayout, max_itemsize : int = 16, data_ptr : intptr_t = 0, axis : int = -1) -> int:
691 """
692 Returns the maximum itemsize (but no greater than ``max_itemsize``) that can be used
693 with the :meth:`repacked` method for the current layout.
694 """
695 return self.get_max_compatible_itemsize(max_itemsize, data_ptr, axis) 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7
697 def sliced(self : _StridedLayout, slices : int | slice | tuple[int | slice]) -> _StridedLayout:
698 """
699 Returns a sliced layout.
700 The ``slices`` parameter can be a single integer, a single :py:class:`slice` object
701 or a tuple of integers/slices.
703 .. hint::
704 For convenience, instead of calling this method directly, please rely
705 on the :py:meth:`~object.__getitem__` operator (i.e. bracket syntax), e.g.:
706 ``layout[:, start:end:step]``.
708 .. note::
709 Slicing is purely a layout transformation and does not involve
710 any data access.
712 """
713 if not isinstance(slices, tuple): 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
714 slices = (slices,) 2% ' c d (cnc)cscoctcu v w x PeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheKgQg%eRgMg'eSgPg(e)e*e+eodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd^c+c,c`c{c-c.cad/cbd:ccd;c=c?cCgDg
715 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
716 self.slice_into(new_layout, slices) 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
717 return new_layout 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
719 def __getitem__(self : _StridedLayout, slices : int | slice | tuple[int | slice]) -> _StridedLayout:
720 return self.sliced(slices) 2=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.exgygvgwgEgFgCgDg
722 cdef axes_mask_t get_flattened_axis_mask(_StridedLayout self) except? -1 nogil:
723 return flattened_strides_in_c_index_order_mask(self.base) 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc
725 cdef int get_max_compatible_itemsize(_StridedLayout self, int max_itemsize, intptr_t data_ptr, int axis=-1) except -1 nogil:
726 return max_compatible_itemsize(self.base, self.slice_offset, self.itemsize, max_itemsize, data_ptr, axis) 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7
728 cdef int reshape_into(_StridedLayout self, _StridedLayout out_layout, BaseLayout& new_shape) except -1 nogil:
729 cdef int64_t old_volume = self.get_volume() 21cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb
731 validate_reshaped_shape(new_shape, old_volume) 21cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb
732 _zero_strides(new_shape) 21cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.fgbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
734 cdef BaseLayout flattened
735 if old_volume != 0: 21cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.fgbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
736 flatten_strides_in_c_index_order(flattened, self.base, axis_mask_from_range(self.base.ndim, 0, -1)) 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
737 if not split_strides_in_c_index_order(new_shape, flattened): 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
738 raise ValueError("Layout strides are incompatible with the new shape") 1UV*,W0#+$-1XeYQfZRST
740 # Reset all memoized properties
741 out_layout._prop_mask = 0 21cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK AbBbCbDbL y z -f:f;f.fgbhbibjbg h i j k l q r EbFb
743 # Copy preserved attributes
744 out_layout.slice_offset = self.slice_offset 21cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK AbBbCbDbL y z -f:f;f.fgbhbibjbg h i j k l q r EbFb
745 out_layout.itemsize = self.itemsize 21cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK AbBbCbDbL y z -f:f;f.fgbhbibjbg h i j k l q r EbFb
746 maybe_copy_volume(out_layout, self) 21cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK AbBbCbDbL y z -f:f;f.fgbhbibjbg h i j k l q r EbFb
748 # Set new attributes
749 _swap_layout(out_layout.base, new_shape) 21cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK AbBbCbDbL y z -f:f;f.fgbhbibjbg h i j k l q r EbFb
750 return 0 21cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK AbBbCbDbL y z -f:f;f.fgbhbibjbg h i j k l q r EbFb
752 cdef int permute_into(_StridedLayout self, _StridedLayout out_layout, axis_vec_t& axis_order) except -1 nogil:
753 if axis_order.size() != <size_t>self.base.ndim: 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f9h%h!h#h'h$h4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
754 raise ValueError(f"Permutation must have the same length as the number of dimensions, got {axis_order.size()} for {self.ndim}D tensor.") 29h%h!h#h'h$h
756 cdef BaseLayout permuted
757 permute_extents(permuted, self.base, axis_order) 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
759 # Reset all memoized properties
760 out_layout._prop_mask = 0 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
762 # Preserved attributes
763 out_layout.itemsize = self.itemsize 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
764 out_layout.slice_offset = self.slice_offset 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
765 maybe_copy_volume(out_layout, self) 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
767 # Set new attributes
768 _swap_layout(out_layout.base, permuted) 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
769 return 0 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
771 cdef int flatten_into(_StridedLayout self, _StridedLayout out_layout, axes_mask_t axis_mask) except -1 nogil:
772 cdef BaseLayout flattened
773 cdef int ndim = flatten_strides_in_c_index_order(flattened, self.base, axis_mask) 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc
775 if out_layout is self and ndim == self.base.ndim: 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc
776 return 0
778 # Reset all memoized properties
779 out_layout._prop_mask = 0 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc
781 # Preserved attributes
782 out_layout.itemsize = self.itemsize 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc
783 out_layout.slice_offset = self.slice_offset 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc
784 maybe_copy_volume(out_layout, self) 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc
786 # Set new attributes
787 _swap_layout(out_layout.base, flattened) 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc
788 return 0 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc
790 cdef int squeeze_into(_StridedLayout self, _StridedLayout out_layout) except -1 nogil:
791 cdef BaseLayout squeezed
792 squeeze_extents(squeezed, self.base) 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f
794 if out_layout is self and squeezed.ndim == self.base.ndim: 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f
795 return 0
797 # Reset all memoized properties
798 out_layout._prop_mask = 0 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f
800 # Preserved attributes
801 out_layout.itemsize = self.itemsize 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f
802 out_layout.slice_offset = self.slice_offset 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f
803 maybe_copy_volume(out_layout, self) 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f
805 # Set new attributes
806 _swap_layout(out_layout.base, squeezed) 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f
807 return 0 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f
809 cdef int unsqueeze_into(_StridedLayout self, _StridedLayout out_layout, axis_vec_t& axis_vec) except -1 nogil:
810 if axis_vec.size() == 0 and self is out_layout: 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
811 return 0
813 cdef BaseLayout unsqueezed
814 unsqueeze_extents(unsqueezed, self.base, axis_vec) 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
816 # Reset all memoized properties
817 out_layout._prop_mask = 0 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
819 # Preserved attributes
820 out_layout.itemsize = self.itemsize 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
821 out_layout.slice_offset = self.slice_offset 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
822 maybe_copy_volume(out_layout, self) 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
824 # Set new attributes
825 _swap_layout(out_layout.base, unsqueezed) 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
826 return 0 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
828 cdef int broadcast_into(_StridedLayout self, _StridedLayout out_layout, BaseLayout& broadcast) except -1 nogil:
829 _validate_shape(broadcast) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc
830 broadcast_extents(broadcast, self.base) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc
832 # Reset all memoized properties
833 out_layout._prop_mask = 0 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc
835 # Preserved attributes
836 out_layout.itemsize = self.itemsize 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc
837 out_layout.slice_offset = self.slice_offset 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc
839 # Set new attributes
840 _swap_layout(out_layout.base, broadcast) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc
841 return 0 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc
843 cdef int pack_into(_StridedLayout self, _StridedLayout out_layout, int itemsize, intptr_t data_ptr, bint keep_dim, int axis=-1) except -1 nogil:
845 cdef BaseLayout packed
846 cdef stride_t new_slice_offset = 0 1;=?ab234567
847 cdef int vec_size = pack_extents( 1;=?ab234567
848 packed,
849 new_slice_offset,
850 self.base,
851 self.slice_offset,
852 self.itemsize,
853 itemsize,
854 data_ptr,
855 keep_dim,
856 axis
857 )
859 if vec_size == 1 and out_layout is self: 1;=?ab234567
860 return 0
862 # Reset all memoized properties
863 out_layout._prop_mask = 0 1;=?ab234567
865 # Set new attributes
866 out_layout.itemsize = itemsize 1;=?ab234567
867 out_layout.slice_offset = new_slice_offset 1;=?ab234567
868 _swap_layout(out_layout.base, packed) 1;=?ab234567
869 return vec_size 1;=?ab234567
871 cdef int unpack_into(_StridedLayout self, _StridedLayout out_layout, int itemsize, int axis=-1) except -1 nogil:
872 cdef BaseLayout unpacked
873 cdef int vec_size = unpack_extents( 1;=?ab234567
874 unpacked,
875 self.base,
876 self.itemsize,
877 itemsize,
878 axis
879 )
880 if vec_size == 1 and out_layout is self: 1;=?ab234567
881 return 0
883 cdef int64_t new_slice_offset = _overflow_checked_mul(self.slice_offset, vec_size) 1;=?ab234567
885 # Reset all memoized properties
886 out_layout._prop_mask = 0 1;=?ab234567
888 # Set new attributes
889 out_layout.itemsize = itemsize 1;=?ab234567
890 out_layout.slice_offset = new_slice_offset 1;=?ab234567
891 _swap_layout(out_layout.base, unpacked) 1;=?ab234567
892 return vec_size 1;=?ab234567
894 cdef int slice_into(_StridedLayout self, _StridedLayout out_layout, tuple slices) except -1:
895 cdef BaseLayout sliced
896 cdef stride_t slice_offset = slice_extents(sliced, self.base, slices) 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
897 cdef int64_t new_slice_offset = _overflow_checked_sum(self.slice_offset, slice_offset) 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
899 # Reset all memoized properties
900 out_layout._prop_mask = 0 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
902 # Preserved attributes
903 out_layout.itemsize = self.itemsize 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
905 # Set new attributes
906 _swap_layout(out_layout.base, sliced) 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
907 out_layout.slice_offset = new_slice_offset 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
908 return 0 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
910cdef inline int maybe_copy_volume(_StridedLayout out_layout, _StridedLayout in_layout) except -1 nogil:
911 if _has_valid_property(in_layout, PROP_VOLUME): 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOca b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.fgbhbibjbe g h i j f k l q r EbFbmgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%fxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
912 out_layout._volume = in_layout.get_volume() 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOca b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.fgbhbibjbe g h i j f k l q r EbFbmgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%fxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
913 _mark_property_valid(out_layout, PROP_VOLUME) 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOca b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.fgbhbibjbe g h i j f k l q r EbFbmgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%fxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
914 return 0 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOca b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.fgbhbibjbe g h i j f k l q r EbFbmgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%fxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
917cdef inline int validate_reshaped_shape(BaseLayout& new_shape, int64_t old_volume) except -1 nogil:
918 cdef int ndim = new_shape.ndim 21cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb
919 cdef int axis = -1 21cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb
920 cdef extent_t extent
921 for i in range(ndim): 21cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb
922 extent = new_shape.shape[i] 21cwcxcyc2czc/f#g,f?e3gVg4g^eSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb
923 if extent < -1: 21cwcxcyc2czc/f#g,f?e3gVg4g^eSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb
924 raise ValueError("Extents must be non-negative") 2$g%g6g'g7g(g)g*g+g,g
925 elif extent == -1: 21cwcxcyc2czc/f#g,f?e3gVg4g^eSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg6g7g1g2ghbIgibjbUgJge g h i j Y Q f k Z R l q S r T EbFb
926 if axis == -1: 2wcxcyczc?e3gVg^eSbTbncoc@ [ ] ^ _ ` { | } ~ abbbcbdbebfb0g5gTgGggbHg1g2ghbIgibjbUgJg
927 axis = i 2wcxcyczc?e3gVg^eSbTbncoc@ [ ] ^ _ ` { | } ~ abbbcbdbebfb0g5gTgGggbHg1g2ghbIgibjbUgJg
928 else:
929 raise ValueError("There can be at most one -1 extent in a shape") 21g2g
930 cdef int64_t new_volume = _c_abs(_volume(new_shape)) 21cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHghbIgibjbUgJge g h i j Y Q f k Z R l q S r T EbFb
931 if axis == -1: 21cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHghbIgibjbUgJge g h i j Y Q f k Z R l q S r T EbFb
932 if new_volume != old_volume: 21c%c2c'c/f#g,f4gHcIc(c)csctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t qbrbsbtbubvbwbxbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.fe g h i j Y Q f k Z R l q S r T EbFb
933 raise ValueError(f"The original volume {old_volume} and the new volume {new_volume} must be equal.") 2#g4g(c)cWgXgYgZg
934 else:
935 if new_volume == 0: 2wcxcyczc?e3gVg^eSbTbncoc@ [ ] ^ _ ` { | } ~ abbbcbdbebfb0g5gTgGggbHghbIgibjbUgJg
936 raise ValueError("The -1 extent is ambiguous when the specified sub-volume is 0") 23gVg0g5gTgUg
937 extent = old_volume // new_volume 2wcxcyczc?e^eSbTbncoc@ [ ] ^ _ ` { | } ~ abbbcbdbebfbGggbHghbIgibjbJg
938 if extent * new_volume != old_volume: 2wcxcyczc?e^eSbTbncoc@ [ ] ^ _ ` { | } ~ abbbcbdbebfbGggbHghbIgibjbJg
939 raise ValueError(f"The original volume {old_volume} must be divisible by the specified sub-volume {new_volume}.") 2GgHgIgJg
940 new_shape.shape[axis] = extent 2wcxcyczc?e^eSbTbncoc@ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjb
941 return 0 21cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.fgbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
944cdef inline axes_mask_t axis_mask_from_range(int ndim, int start_axis, int end_axis) except? -1 nogil:
945 cdef axes_mask_t axes_mask = flatten_all_axes_mask(ndim) 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc1cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
946 if start_axis == 0 and end_axis == -1: 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc1cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
947 return axes_mask 2)d`d% ' M N c ( d ) G H Ac9cucJcO P vcKc1cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
948 if not _normalize_axis(start_axis, ndim): 1ABCDIEFJ
949 raise ValueError(f"Invalid start axis: {start_axis} out of range for {ndim}D tensor")
950 if not _normalize_axis(end_axis, ndim): 1ABCDIEFJ
951 raise ValueError(f"Invalid end axis: {end_axis} out of range for {ndim}D tensor")
952 if start_axis > 0: 1ABCDIEFJ
953 axes_mask &= (AXES_MASK_ALL << start_axis) 1ABCDEF
954 if end_axis < ndim: 1ABCDIEFJ
955 axes_mask &= (AXES_MASK_ALL >> (STRIDED_LAYOUT_MAX_NDIM - end_axis - 1)) 1ABCDIEFJ
956 return axes_mask 1ABCDIEFJ
959cdef inline int flatten_strides_in_c_index_order(BaseLayout& out_layout, BaseLayout& in_layout, axes_mask_t axis_mask) except -1 nogil:
960 cdef int ndim = in_layout.ndim 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc1cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
961 if ndim == 0: 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc1cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
962 init_base_layout(out_layout, 1) 2)d`d=e+f1cwc%cxcyc2c'czc
963 out_layout.shape[0] = 1 2)d`d=e+f1cwc%cxcyc2c'czc
964 out_layout.strides[0] = 1 2)d`d=e+f1cwc%cxcyc2c'czc
965 return 1 2)d`d=e+f1cwc%cxcyc2c'czc
966 init_base_layout(out_layout, ndim) 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
967 cdef int group_start = 0 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
968 cdef int group_end = 0 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
969 cdef int64_t group_vol
970 cdef int64_t group_stride
971 cdef int out_i = 0 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
972 cdef extent_t* in_shape = in_layout.shape 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
973 cdef stride_t* in_strides = get_strides_ptr(in_layout) 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
974 while group_start < ndim: 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
975 group_vol = in_shape[group_start] 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
976 group_stride = in_strides[group_start] 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
977 group_end = group_start + 1 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
978 while ( 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
979 group_end < ndim 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
980 and (axis_mask & _axis2mask(group_end)) 2M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
981 and group_stride == _overflow_checked_mul(in_strides[group_end], in_shape[group_end]) 2M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
982 ):
983 group_vol = _overflow_checked_mul(group_vol, in_shape[group_end]) 2M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcm n kblbmbnbobpb@ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybW 0 zbAbBbCb1 DbX y z gbhbibjbg h i j Q k R l q S r T EbFb
984 group_stride = in_strides[group_end] 2M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcm n kblbmbnbobpb@ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybW 0 zbAbBbCb1 DbX y z gbhbibjbg h i j Q k R l q S r T EbFb
985 group_end += 1 2M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcm n kblbmbnbobpb@ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybW 0 zbAbBbCb1 DbX y z gbhbibjbg h i j Q k R l q S r T EbFb
986 out_layout.shape[out_i] = group_vol 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
987 out_layout.strides[out_i] = group_stride 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
988 out_i += 1 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
989 group_start = group_end 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
990 if out_i != ndim: 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
991 trim_base_layout(out_layout, out_i) 2M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcm n kblbmbnbobpb@ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybW 0 zbAbBbCb1 DbX y z gbhbibjbg h i j Q k R l q S r T EbFb
992 return out_i 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
995cdef inline axes_mask_t flattened_strides_in_c_index_order_mask(BaseLayout& layout) except? -1 nogil:
996 if layout.strides == NULL: 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc
997 return flatten_all_axes_mask(layout.ndim) 2)d9cJcKc+f*cLc
998 cdef axes_mask_t axis_mask = 0 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=eMcNcLcOc
999 cdef int ndim = layout.ndim 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=eMcNcLcOc
1000 cdef int group_start = 0 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=eMcNcLcOc
1001 cdef int group_end = 0 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=eMcNcLcOc
1002 cdef int64_t group_vol
1003 cdef int64_t group_stride
1004 while group_start < ndim: 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=eMcNcLcOc
1005 group_vol = layout.shape[group_start] 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMcNcLcOc
1006 group_stride = layout.strides[group_start] 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMcNcLcOc
1007 group_end = group_start + 1 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMcNcLcOc
1008 while group_end < ndim and group_stride == layout.strides[group_end] * layout.shape[group_end]: 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMcNcLcOc
1009 group_vol = _overflow_checked_mul(group_vol, layout.shape[group_end]) 2M N c ( d ) G H AcucA B C D I O P E F J vcMcNcLcOc
1010 group_stride = layout.strides[group_end] 2M N c ( d ) G H AcucA B C D I O P E F J vcMcNcLcOc
1011 axis_mask |= _axis2mask(group_end) 2M N c ( d ) G H AcucA B C D I O P E F J vcMcNcLcOc
1012 group_end += 1 2M N c ( d ) G H AcucA B C D I O P E F J vcMcNcLcOc
1013 group_start = group_end 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMcNcLcOc
1014 return axis_mask 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=eMcNcLcOc
1017cdef inline bint split_strides_in_c_index_order(BaseLayout& out_layout, BaseLayout& in_layout) except -1 nogil:
1018 cdef int i = in_layout.ndim - 1 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
1019 cdef int new_i = out_layout.ndim - 1 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
1020 cdef extent_t extent
1021 cdef extent_t new_extent
1022 cdef extent_t group_vol
1023 cdef stride_t group_stride
1024 cdef extent_t* in_shape = in_layout.shape 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
1025 cdef stride_t* in_strides = get_strides_ptr(in_layout) 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
1026 if out_layout.strides == NULL: 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
1027 _zero_strides(out_layout)
1028 while i >= 0: 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
1029 extent = in_shape[i] 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
1030 group_stride = in_strides[i] 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
1031 group_vol = 1 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
1032 while new_i >= 0: 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
1033 new_extent = out_layout.shape[new_i] 21cwcxcyc2czcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
1034 if new_extent == 0: 21cwcxcyc2czcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
1035 return False
1036 if new_extent == 1 or group_vol < extent: 21cwcxcyc2czcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
1037 out_layout.strides[new_i] = group_stride 21cwcxcyc2czcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
1038 group_stride = _overflow_checked_mul(group_stride, new_extent) 21cwcxcyc2czcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
1039 group_vol = _overflow_checked_mul(group_vol, new_extent) 21cwcxcyc2czcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
1040 new_i -= 1 21cwcxcyc2czcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
1041 else:
1042 break 1UsVt*WK#+$LXyzeghijQfkRlST
1043 if group_vol != extent: 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb
1044 return False 1UV*,W0#+$-1XeYQfZRST
1045 i -= 1 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK Ab# BbCb$ DbL y z gbhbibjbe g h i j f k l q r EbFb
1046 return True 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK AbBbCbDbL y z gbhbibjbg h i j k l q r EbFb
1049cdef inline int permute_extents(BaseLayout& out_layout, BaseLayout& in_layout, axis_vec_t& axis_order) except -1 nogil:
1050 cdef int ndim = in_layout.ndim 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
1051 init_base_layout(out_layout, ndim) 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
1052 cdef axis_t axis
1053 cdef axes_mask_t axis_mask
1054 cdef axes_mask_t axis_order_mask = 0 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
1055 cdef extent_t* in_shape = in_layout.shape 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
1056 cdef stride_t* in_strides = get_strides_ptr(in_layout) 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
1058 for i in range(ndim): 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
1059 axis = axis_order[i] 2c ( d ) a b _e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
1060 if not _normalize_axis(axis, ndim): 2c ( d ) a b _e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
1061 raise ValueError(f"Invalid permutation: axis {axis} out of range for {ndim}D tensor") 2Qh5h6hRhShTh
1062 axis_mask = _axis2mask(axis) 2c ( d ) a b _e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
1063 if axis_order_mask & axis_mask: 2c ( d ) a b _e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
1064 raise ValueError(f"Invalid permutation: axis {axis_order[i]} appears multiple times.") 24hOhPh
1065 axis_order_mask |= axis_mask 2c ( d ) a b _e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
1066 out_layout.shape[i] = in_shape[axis] 2c ( d ) a b _e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
1067 out_layout.strides[i] = in_strides[axis] 2c ( d ) a b _e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
1068 return 0 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete
1071cdef inline stride_t slice_extents(BaseLayout& out_layout, BaseLayout& in_layout, tuple slices) except? -1:
1072 cdef int ndim = in_layout.ndim 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
1073 cdef int num_slices = len(slices) 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
1074 if num_slices > ndim: 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
1075 raise ValueError(f"The number of slices ({num_slices}) is greater than the number of dimensions ({ndim}).") 2FhGhHh
1076 init_base_layout(out_layout, ndim) 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
1077 cdef extent_t* in_shape = in_layout.shape 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
1078 cdef stride_t* in_strides = get_strides_ptr(in_layout) 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
1079 cdef stride_t slice_offset = 0 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
1080 cdef Py_ssize_t start
1081 cdef Py_ssize_t stop
1082 cdef Py_ssize_t step
1083 cdef extent_t new_extent
1084 cdef object py_slice
1085 cdef bint zero_slice = False 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
1086 cdef int out_i = 0 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
1087 for i in range(num_slices): 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
1088 py_slice = slices[i] 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T PeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
1089 if isinstance(py_slice, int): 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T PeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
1090 start = py_slice 2ie@e[eKg]e%eLgjekeMgNgle'eOgmePgne(e)e*e*d+e+d,dvgwg
1091 if not _normalize_axis(start, in_shape[i]): 2ie@e[eKg]e%eLgjekeMgNgle'eOgmePgne(e)e*e*d+e+d,dvgwg
1092 raise ValueError(f"Invalid index: {start} out of range for axis {i} with extent {in_shape[i]}") 2KgLgMgNgOgPg
1093 # single element index removes extent from the shape,
1094 # just increase the offset and skip the shape and stride
1095 slice_offset = _overflow_checked_sum(slice_offset, _overflow_checked_mul(start, in_strides[i])) 2ie@e[e]e%eLgjekeNgle'eOgmene(e)e*e*d+e+d,dvgwg
1096 elif isinstance(py_slice, slice): 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T PeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheieQgRgjekeleSgmene*d+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
1097 _PySlice_Unpack(<PyObject *>py_slice, &start, &stop, &step) 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T PeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheiejekelemene*d+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
1098 new_extent = _PySlice_AdjustIndices(in_shape[i], &start, &stop, step) 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T PeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheiejekelemene*d+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
1099 if new_extent > 0: 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T PeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheiejekelemene*d+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
1100 # out_extent > 0 implies start is in [0, extent - 1] range
1101 slice_offset = _overflow_checked_sum(slice_offset, _overflow_checked_mul(start, in_strides[i])) 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b u v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T PeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBggeheiejekelemene*d+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
1102 else:
1103 zero_slice = True 2(cnc)cscoctccedeee8 9 !
1104 out_layout.shape[out_i] = new_extent 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T PeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheiejekelemene*d+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
1105 out_layout.strides[out_i] = _overflow_checked_mul(in_strides[i], step) 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T PeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheiejekelemene*d+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
1106 out_i += 1 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T PeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheiejekelemene*d+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
1107 else:
1108 raise TypeError(f"Invalid slice: {py_slice}. Expected slice instance or integer.") 2QgRgSg
1109 for i in range(num_slices, ndim): 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
1110 out_layout.shape[out_i] = in_shape[i] 2BcCcDcEcFcGcc d G H e f fecegedeeehe%e'e(e)e*e*d+e+d,dpcqcrc@c[c]c^c+c,cfd_c`c{c-c.cgd|c}chd~cidad/cbd:cjdcddd;c=ckded?c
1111 out_layout.strides[out_i] = in_strides[i] 2BcCcDcEcFcGcc d G H e f fecegedeeehe%e'e(e)e*e*d+e+d,dpcqcrc@c[c]c^c+c,cfd_c`c{c-c.cgd|c}chd~cidad/cbd:cjdcddd;c=ckded?c
1112 out_i += 1 2BcCcDcEcFcGcc d G H e f fecegedeeehe%e'e(e)e*e*d+e+d,dpcqcrc@c[c]c^c+c,cfd_c`c{c-c.cgd|c}chd~cidad/cbd:cjdcddd;c=ckded?c
1113 if out_i != ndim: 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
1114 trim_base_layout(out_layout, out_i) 2ie@e[e]e%ejekele'emene(e)e*e*d+e+d,dvgwg
1115 if zero_slice: 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
1116 _zero_strides(out_layout) 2(cnc)cscoctccedeee8 9 !
1117 return slice_offset 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg
1120cdef inline int squeeze_extents(BaseLayout& out_layout, BaseLayout& in_layout) except -1 nogil:
1121 cdef int ndim = in_layout.ndim 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f
1122 init_base_layout(out_layout, ndim) 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f
1123 cdef extent_t* in_shape = in_layout.shape 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f
1124 cdef stride_t* in_strides = get_strides_ptr(in_layout) 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f
1125 cdef int out_i = 0 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f
1126 cdef extent_t extent
1127 for i in range(ndim): 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f
1128 extent = in_shape[i] 2'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f
1129 if extent == 0: 2'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f
1130 trim_base_layout(out_layout, 1) 189!
1131 out_layout.shape[0] = 0 189!
1132 out_layout.strides[0] = 0 189!
1133 return 1 189!
1134 elif extent != 1: 2'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f
1135 out_layout.shape[out_i] = extent 2'f(f)f8 9 . ! / : 5f6f7fpcqcrc8f9f!f#f$f%f
1136 out_layout.strides[out_i] = in_strides[i] 2'f(f)f8 9 . ! / : 5f6f7fpcqcrc8f9f!f#f$f%f
1137 out_i += 1 2'f(f)f8 9 . ! / : 5f6f7fpcqcrc8f9f!f#f$f%f
1138 if out_i != ndim: 2mgngog'f(f)f. / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f
1139 trim_base_layout(out_layout, out_i) 2. / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f
1140 return out_i 2mgngog'f(f)f. / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f
1143cdef inline int unsqueeze_extents(BaseLayout& out_layout, BaseLayout& in_layout, axis_vec_t& axis_vec) except -1 nogil:
1144 cdef int ndim = in_layout.ndim 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
1145 cdef int num_new_axes = axis_vec.size() 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
1146 cdef int out_ndim = ndim + num_new_axes 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
1147 # init_base_layout validates out_ndim
1148 init_base_layout(out_layout, out_ndim) 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
1149 cdef extent_t* in_shape = in_layout.shape 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
1150 cdef stride_t* in_strides = get_strides_ptr(in_layout) 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
1151 cdef axes_mask_t out_shape_mask = 0 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
1152 cdef axes_mask_t axis_mask = 0 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
1153 cdef axis_t axis
1154 for i in range(num_new_axes): 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
1155 axis = axis_vec[i] 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
1156 if not _normalize_axis(axis, out_ndim): 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
1157 raise ValueError(f"Invalid axis: {axis} out of range for {out_ndim}D tensor")
1158 axis_mask = _axis2mask(axis) 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
1159 if out_shape_mask & axis_mask: 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
1160 raise ValueError(f"Axis {axis} appears multiple times.")
1161 out_shape_mask |= axis_mask 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
1162 cdef int in_i = 0 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
1163 for i in range(out_ndim): 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
1164 axis_mask = _axis2mask(<axis_t>i) 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
1165 if out_shape_mask & axis_mask: 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
1166 out_layout.shape[i] = 1 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
1167 if in_i < ndim: 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
1168 out_layout.strides[i] = _overflow_checked_mul(in_shape[in_i], in_strides[in_i]) 2ld!d#d$d%dmd'dnd(d0bGb1b2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKb,b-bLb.bMb/b:b;bNb=b?b@bOb[b]b^b_bPbQb`b{b|b}b~bacRbbcccdcec
1169 else:
1170 if ndim > 0: 2{d|d}d~daebeldGdHdIdJdmdKdndLdGbUbHbIbJbKbVbLbMbWbNbObPbQbXbYbRbZb
1171 out_layout.strides[i] = in_strides[ndim - 1] 2ldGdHdIdJdmdKdndLdGbUbHbIbJbKbVbLbMbWbNbObPbQbXbYbRbZb
1172 else:
1173 out_layout.strides[i] = 1 2{d|d}d~daebe
1174 else:
1175 out_layout.shape[i] = in_shape[in_i] 2ld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
1176 out_layout.strides[i] = in_strides[in_i] 2ld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
1177 in_i += 1 2ld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
1178 assert in_i == ndim 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
1179 return 0 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec
1182cdef inline int broadcast_extents(BaseLayout& broadcast, BaseLayout& in_layout) except -1 nogil:
1183 if broadcast.ndim < in_layout.ndim: 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc
1184 raise ValueError(
1185 f"The broadcast shape ndim ({broadcast.ndim}) must be "
1186 f"greater than or equal to the input shape "
1187 f"ndim ({in_layout.ndim})."
1188 )
1189 cdef int ndim_diff = broadcast.ndim - in_layout.ndim 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc
1190 _zero_strides(broadcast) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc
1191 cdef extent_t* in_shape = in_layout.shape 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc
1192 cdef stride_t* in_strides = get_strides_ptr(in_layout) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc
1193 cdef extent_t* broadcast_shape = broadcast.shape + ndim_diff 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc
1194 cdef stride_t* broadcast_strides = broadcast.strides + ndim_diff 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc
1195 for i in range(in_layout.ndim): 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc
1196 if in_shape[i] == broadcast_shape[i]: 2[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc
1197 broadcast_strides[i] = in_strides[i] 2|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc
1198 elif in_shape[i] != 1: 2[f]f^f_f`f{fScTcUcVcWcBcCcXcYcDcZc0cEcFcGc
1199 raise ValueError(
1200 f"Shapes cannot be broadcast together: "
1201 f"the original extent must be 1 or be equal to broadcast extent, "
1202 f"got {in_shape[i]} and {broadcast_shape[i]} for axis {i}."
1203 )
1204 # else -> in_extent == 1, the broadcast extent and zero stride are already set
1205 return 0 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc
1208cdef inline int64_t gcd(int64_t a, int64_t b) except? -1 nogil:
1209 while b != 0: 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7
1210 a, b = b, a % b 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7
1211 return a 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7
1214cdef inline int pack_extents(BaseLayout& out_layout, stride_t& out_slice_offset, BaseLayout& in_layout, stride_t slice_offset, int itemsize, int new_itemsize, intptr_t data_ptr, bint keep_dim, int axis) except -1 nogil:
1215 cdef int ndim = in_layout.ndim 1;=?ab234567
1216 if new_itemsize <= 0: 1;=?ab234567
1217 raise ValueError(f"new itemsize must be greater than zero, got {new_itemsize}.")
1218 if itemsize <= 0: 1;=?ab234567
1219 raise ValueError(f"itemsize must be greater than zero, got {itemsize}.")
1220 if new_itemsize <= itemsize: 1;=?ab234567
1221 if new_itemsize == itemsize:
1222 return 1
1223 raise ValueError(f"new itemsize ({new_itemsize}) must be greater than or equal to itemsize ({itemsize}).")
1224 if not _normalize_axis(axis, ndim): 1;=?ab234567
1225 raise ValueError(f"Invalid axis: {axis} out of range for {ndim}D tensor")
1226 if data_ptr % new_itemsize != 0: 1;=?ab234567
1227 raise ValueError(f"The data pointer ({data_ptr}) must be aligned to the packed itemsize ({new_itemsize}).")
1229 cdef extent_t* shape = in_layout.shape 1;=?ab234567
1230 cdef stride_t* strides = get_strides_ptr(in_layout) 1;=?ab234567
1231 if strides[axis] != 1: 1;=?ab234567
1232 raise ValueError(f"The axis {axis} stride must be 1, got {strides[axis]}.")
1234 cdef int vec_size = new_itemsize // itemsize 1;=?ab234567
1235 cdef extent_t packed_extent = shape[axis] 1;=?ab234567
1236 if packed_extent == 0: 1;=?ab234567
1237 raise ValueError(f"The axis {axis} extent must be non-zero, got {shape[axis]}.")
1238 packed_extent //= vec_size 1;=?ab234567
1239 if packed_extent * vec_size != shape[axis]: 1;=?ab234567
1240 raise ValueError(f"The axis {axis} extent ({shape[axis]}) must be divisible by {vec_size}.")
1242 cdef stride_t new_slice_offset = slice_offset // vec_size 1;=?ab234567
1243 if new_slice_offset * vec_size != slice_offset: 1;=?ab234567
1244 raise ValueError(f"The slice offset ({slice_offset}) must be divisible by {vec_size}.")
1245 out_slice_offset = new_slice_offset 1;=?ab234567
1247 init_base_layout(out_layout, ndim) 1;=?ab234567
1248 cdef stride_t packed_stride
1249 cdef int out_i = 0 1;=?ab234567
1250 for i in range(ndim): 1;=?ab234567
1251 if i == axis: 1;=?ab234567
1252 if keep_dim or packed_extent != 1: # omit the packed axis if it is reduced to 1 1;=?ab234567
1253 out_layout.shape[out_i] = packed_extent 1;=?ab234567
1254 out_layout.strides[out_i] = 1 1;=?ab234567
1255 out_i += 1 1;=?ab234567
1256 else:
1257 packed_stride = strides[i] // vec_size 1ab234567
1258 if packed_stride * vec_size != strides[i]: 1ab234567
1259 raise ValueError(f"The {i} axis stride ({strides[i]}) must be divisible by {vec_size}.")
1260 out_layout.shape[out_i] = shape[i] 1ab234567
1261 out_layout.strides[out_i] = packed_stride 1ab234567
1262 out_i += 1 1ab234567
1263 if out_i != ndim: 1;=?ab234567
1264 trim_base_layout(out_layout, out_i)
1265 return vec_size 1;=?ab234567
1268cdef inline int unpack_extents(BaseLayout &out_layout, BaseLayout &in_layout, int itemsize, int new_itemsize, int axis) except -1 nogil:
1269 cdef int ndim = in_layout.ndim 1;=?ab234567
1270 if not _normalize_axis(axis, ndim): 1;=?ab234567
1271 raise ValueError(f"Invalid axis: {axis} out of range for {ndim}D tensor")
1272 if new_itemsize <= 0: 1;=?ab234567
1273 raise ValueError(f"new itemsize must be greater than zero, got {new_itemsize}.")
1274 if itemsize <= 0: 1;=?ab234567
1275 raise ValueError(f"itemsize must be greater than zero, got {itemsize}.")
1276 if new_itemsize >= itemsize: 1;=?ab234567
1277 if new_itemsize == itemsize:
1278 return 1
1279 raise ValueError(f"new itemsize ({new_itemsize}) must be less than or equal to itemsize ({itemsize}).")
1281 cdef extent_t* shape = in_layout.shape 1;=?ab234567
1282 cdef stride_t* strides = get_strides_ptr(in_layout) 1;=?ab234567
1283 if shape[axis] == 0: 1;=?ab234567
1284 raise ValueError(f"The axis {axis} extent must be non-zero, got {shape[axis]}.")
1285 if strides[axis] != 1: 1;=?ab234567
1286 raise ValueError(f"The axis {axis} stride must be 1, got {strides[axis]}.")
1288 cdef int vec_size = itemsize // new_itemsize 1;=?ab234567
1289 init_base_layout(out_layout, ndim) 1;=?ab234567
1290 out_layout.shape[axis] = _overflow_checked_mul(shape[axis], vec_size) 1;=?ab234567
1291 out_layout.strides[axis] = 1 1;=?ab234567
1293 for i in range(ndim): 1;=?ab234567
1294 if i == axis: 1;=?ab234567
1295 continue 1;=?ab234567
1296 out_layout.shape[i] = shape[i] 1ab234567
1297 out_layout.strides[i] = _overflow_checked_mul(strides[i], vec_size) 1ab234567
1298 return vec_size 1;=?ab234567
1301cdef inline int max_compatible_itemsize(BaseLayout& layout, stride_t slice_offset, int itemsize, int max_itemsize, intptr_t data_ptr, int axis) except? -1 nogil:
1302 cdef int ndim = layout.ndim 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7
1303 if max_itemsize <= 0: 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7
1304 raise ValueError(f"max_itemsize must be greater than zero, got {max_itemsize}.")
1305 if itemsize <= 0: 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7
1306 raise ValueError(f"itemsize must be greater than zero, got {itemsize}.")
1307 if not _normalize_axis(axis, ndim): 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7
1308 raise ValueError(f"Invalid axis: {axis} out of range for {ndim}D tensor")
1309 if max_itemsize < itemsize: 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7
1310 raise ValueError(f"max_itemsize ({max_itemsize}) cannot be less than itemsize ({itemsize}).")
1311 max_itemsize = gcd(max_itemsize, _c_abs(data_ptr)) 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7
1312 cdef extent_t* shape = layout.shape 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7
1313 cdef stride_t* strides = get_strides_ptr(layout) 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7
1314 if ndim < 1 or strides[axis] != 1 or shape[axis] == 0: 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7
1315 return itemsize
1316 max_itemsize = gcd(max_itemsize, _overflow_checked_mul(slice_offset, itemsize)) 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7
1317 max_itemsize = gcd(max_itemsize, _overflow_checked_mul(shape[axis], itemsize)) 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7
1318 for i in range(ndim): 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7
1319 if i == axis: 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7
1320 continue 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7
1321 max_itemsize = gcd(max_itemsize, _overflow_checked_mul(_c_abs(strides[i]), itemsize)) 2!c#c$ca b 2 3 4 5 6 7
1322 return max_itemsize 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7