Coverage for cuda / core / _layout.pyx: 89.59%
557 statements
« prev ^ index » next coverage.py v7.14.0, created at 2026-05-22 01:37 +0000
« prev ^ index » next coverage.py v7.14.0, created at 2026-05-22 01:37 +0000
1# SPDX-FileCopyrightText: Copyright (c) 2025-2026 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~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6fjiki4h5h6h2cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!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~bacYbRbbcccdcZbec9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiwixgyglixiyi
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~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3heinioipiqirisiti+c[cU V C D c W d X y z rcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6ffigihiiiOhPhQhRhShTh2cDc'cEcFc3c(cGc,f@eVg4gOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f.f0gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!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~bacYbRbbcccdcZbec9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiuivixgygli
93 new_layout.init_dense_from_tuple(shape, itemsize, stride_order) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3heinioipiqirisiti+c[cU V C D c W d X y z rcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6ffigihiiiOhPhQhRhShTh2cDc'cEcFc3c(cGc,f@eVg4gOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f.f0gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!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~bacYbRbbcccdcZbec9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiuivixgygli
94 return new_layout 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3heinioipiqirisiti+c[cU V C D c W d X y z rcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6ffigihiiiOhPhQhRhShTh2cDc'cEcFc3c(cGc,f@eVg4gOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f.f0gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!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~bacYbRbbcccdcZbec9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiuivixgygli
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=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
140 if stride_order == "K": 2}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
141 if is_dense: 2thuhvhwhxhyhqdtdzhudAhEdFdBhHd]cUd_cVdXd-c/cChDhEh4d6d!dfd?c:e;e=e
142 return other 2thuhvhwhxhyhzhAhBhChDhEh:e;e=e
143 other.get_stride_order(stride_order_vec) 2qdtdudEdFdHd]cUd_cVdXd-c/c4d6d!dfd?c
144 order_flag = ORDER_PERM 2qdtdudEdFdHd]cUd_cVdXd-c/c4d6d!dfd?c
145 else:
146 order_flag = _stride_order2vec(stride_order_vec, stride_order) 2}g~gahbh-g.gchdh/geh:g;gfhghhh=gihjhrd?gkhsdlhOdPdmhvdwdnhxdydQdzd@gohphAdRdSdTdBdCdDdGd[g]g^g8gqh_g`g.d^c`crhWd,cYdhd{cZd|c9g0d}c.c/d1did~cad:d{g|g!g;djdbd=d2d?d3d@dkd[dcd:c5d]ddd;csh^dld_d7d8d9ded`d#d=cmdgd@cyezeAeBeCeoeDepeEeFeGeHeIeJeKeqeLeMeNereOePesete
147 if order_flag == ORDER_NONE: 2}g~gahbh-g.gchdh/geh:g;gfhghhh=gihjhrd?gkhsdlhOdPdmhvdwdnhxdydQdzd@gohphAdRdSdTdBdCdDdGd[g]g^g8gqh_g`g.d^c`crhWd,cYdhd{cZd|c9g0d}c.c/d1did~cad:d{g|g!g;djdbd=d2d?d3d@dkd[dcd:c5d]ddd;csh^dld_d7d8d9ded`d#d=cmdgd@cyezeAeBeCeoeDepeEeFeGeHeIeJeKeqeLeMeNereOePesete
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~gahfhghihrdlhnhxdzdohBdDdGd^crhYd~c!gbd2d:csh7d8d9d#d=c@coepete
154 return other 2[e}g~gahfhghihlhnhohrhsh
155 elif order_flag == ORDER_F:
156 if is_dense and other.get_is_contiguous_f(): 2bhchdhehhhjhkhsdmhvdwdydphAdCd8gqhWd,c{cZd9g0d.c1dad3d5d;cgdqerese
157 return other 2bhchdhehhhjhkhmhphqh
159 cdef _StridedLayout new_layout = _StridedLayout.__new__(cls) 2[e-g.g/g:g;g=gqdrd?gsdtdOdPdudvdwdxdydQdzd@gAdRdSdTdBdCdDdEdFdGd[gHd]g^g8g]cUd_g`g.d^c_cVd`cWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!g;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFeGeHeIeJeKeqeLeMeNereOePesete
160 new_layout.init_dense_from_ptr( 2-g.g/g:g;g=gqdrd?gsdtdOdPdudvdwdxdydQdzd@gAdRdSdTdBdCdDdEdFdGd[gHd]g^g8g]cUd_g`g.d^c_cVd`cWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!g;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFeGeHeIeJeKeqeLeMeNereOePesete
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=gqdrd?gsdtdOdPdudvdwdxdydQdzd@gAdRdSdTdBdCdDdEdFdGd[gHd]g^g8g]cUd_g`g.d^c_cVd`cWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!g;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFeGeHeIeJeKeqeLeMeNereOePesete
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, other):
180 if not isinstance(other, _StridedLayout): 2einioipiqirisiti+c[cU V C D c W d X y z rcNcpcscE F qctcxe?eyc%czcucAc9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidimi
181 return NotImplemented 2nioipiqirisiti
182 cdef _StridedLayout _other = <_StridedLayout>other 2ei+c[cU V C D c W d X y z rcNcpcscE F qctcxe?eyc%czcucAc9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidimi
183 return ( 2ei+c[cU V C D c W d X y z rcNcpcscE F qctcxe?eyc%czcucAc9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidimi
184 self.itemsize == _other.itemsize 2ei+c[cU V C D c W d X y z rcNcpcscE F qctcxe?eyc%czcucAc9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidimi
185 and self.slice_offset == _other.slice_offset 2[eei+c[cU V C D c W d X y z rcNcpcscE F qctcxe?eyc%czcucAc9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidimi
186 and _base_layout_equal(self.base, _other.base) 2ei+c[cU V C D c W d X y z rcNcpcscE F qctcxe?eyc%czcucAc9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidimi
187 )
189 @property
190 def ndim(self : _StridedLayout):
191 """
192 The number of dimensions (length of the shape tuple).
194 :type: int
195 """
196 return self.base.ndim 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6ffijigihikiii2cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!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
198 @property
199 def shape(self : _StridedLayout):
200 """
201 Shape of the tensor.
203 :type: tuple[int]
204 """
205 return self.get_shape_tuple() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!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~bacYbRbbcccdcZbecwili
207 @property
208 def strides(self : _StridedLayout):
209 """
210 Strides of the tensor (in **counts**, not bytes).
211 If _StridedLayout was created with strides=None, the
212 returned value is None and layout is implicitly C-contiguous.
214 :type: tuple[int] | None
215 """
216 return self.get_strides_tuple() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f#g3g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B :f;f5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!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~bacYbRbbcccdcZbec9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiwilixiCgDg
218 @property
219 def strides_in_bytes(self : _StridedLayout):
220 """
221 Strides of the tensor (in bytes).
223 :type: tuple[int] | None
224 """
225 return self.get_strides_in_bytes_tuple() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!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
227 @property
228 def stride_order(self : _StridedLayout):
229 """
230 A permutation of ``tuple(range(ndim))`` describing the
231 relative order of the strides.
233 .. highlight:: python
234 .. code-block:: python
236 # C-contiguous layout
237 assert _StridedLayout.dense((5, 3, 7), 1).stride_order == (0, 1, 2)
238 # F-contiguous layout
239 assert _StridedLayout.dense((5, 3, 7), 1, stride_order="F").stride_order == (2, 1, 0)
240 # Permuted layout
241 assert _StridedLayout.dense((5, 3, 7), 1, stride_order=(2, 0, 1)).stride_order == (2, 0, 1)
243 :type: tuple[int]
244 """
245 return self.get_stride_order_tuple() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z pcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGcOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B TgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!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
247 @property
248 def volume(self : _StridedLayout):
249 """
250 The number of elements in the tensor, i.e. the product of the shape tuple.
252 :type: int
253 """
254 return self.get_volume() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!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
256 @property
257 def is_unique(self : _StridedLayout):
258 """
259 If True, each element of a tensor with this layout is mapped to
260 a unique memory offset.
262 All contiguous layouts are unique and so are layouts that can be created
263 by permuting, slicing, flattening, squeezing, repacking, or reshaping
264 a contiguous layout.
265 Conversely, broadcast layouts (layouts with a 0 stride
266 for some extent greater than 1) are not unique.
268 For layouts resulting from manual stride manipulations
269 (such as with ``numpy.lib.stride_tricks``), the check
270 may inaccurately report False, as the exact uniqueness
271 check may be expensive.
273 :type: bool
274 """
275 return self.get_is_unique() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!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
277 @property
278 def is_contiguous_c(self : _StridedLayout):
279 """
280 True iff the layout is contiguous in C-order, i.e.
281 the rightmost stride is 1 and each subsequent
282 stride to the left is the product of the
283 extent and the stride to the right.
285 .. highlight:: python
286 .. code-block:: python
288 layout = _StridedLayout.dense((2, 5, 3), 1, "C")
289 assert layout == _StridedLayout((2, 5, 3), (15, 3, 1), 1)
290 assert layout.is_contiguous_c
292 See also :attr:`is_contiguous_any`.
294 :type: bool
295 """
296 return self.get_is_contiguous_c() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!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
298 @property
299 def is_contiguous_f(self : _StridedLayout):
300 """
301 True iff the layout is contiguous in F-order, i.e.
302 the leftmost stride is 1 and each subsequent
303 stride to the right is the product of the
304 stride and extent to the left.
306 .. highlight:: python
307 .. code-block:: python
309 layout = _StridedLayout.dense((2, 5, 3), 1, "F")
310 assert layout == _StridedLayout((2, 5, 3), (1, 2, 10), 1)
311 assert layout.is_contiguous_f
313 See also :attr:`is_contiguous_any`.
315 :type: bool
316 """
317 return self.get_is_contiguous_f() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!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
319 @property
320 def is_contiguous_any(self : _StridedLayout):
321 """
322 True iff the layout is contiguous in some axis order, i.e.
323 there exists a permutation of axes such that the layout
324 is C-contiguous.
326 In a contiguous layout, the strides are non-negative and
327 the mapping of elements to the memory offset range
328 ``[min_offset, max_offset]`` is 1-to-1.
330 .. highlight:: python
331 .. code-block:: python
333 # dense defaults to C-contiguous
334 layout = _StridedLayout.dense((5, 3, 7), 1)
335 assert layout.is_contiguous_c and not layout.is_contiguous_f
336 assert layout.is_contiguous_any
338 # reversing the order of axes gives F-contiguous layout
339 permuted = layout.permuted((2, 1, 0))
340 assert not permuted.is_contiguous_c and permuted.is_contiguous_f
341 assert permuted.is_contiguous_any
343 # neither C- nor F-order but still contiguous
344 permuted = layout.permuted((2, 0, 1))
345 assert not permuted.is_contiguous_c and not permuted.is_contiguous_f
346 assert permuted.is_contiguous_any
348 # slicing the right-most extent creates a gap in the
349 # offset_bounds range that is not reachable with any
350 # element in the sliced layout
351 sliced = layout[:, :, :-1]
352 assert not sliced.is_contiguous_c and not sliced.is_contiguous_f
353 assert not sliced.is_contiguous_any
355 :type: bool
356 """
357 return self.get_is_contiguous_any() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!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
359 @property
360 def is_dense(self : _StridedLayout):
361 """
362 A dense layout is contiguous (:attr:`is_contiguous_any` is True)
363 and has no slice offset (:attr:`slice_offset_in_bytes` is 0).
365 In a dense layout, elements are mapped 1-to-1 to the ``[0, volume - 1]``
366 memory offset range.
368 :type: bool
369 """
370 return self.get_is_dense() 2[edgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!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
372 @property
373 def offset_bounds(self : _StridedLayout):
374 """
375 The memory offset range ``[min_offset, max_offset]`` (in element counts, not bytes)
376 that elements of a tensor with this layout are mapped to.
378 If the layout is empty (i.e. ``volume == 0``), the returned tuple is ``(0, -1)``.
379 Otherwise, ``min_offset <= max_offset`` and all elements of the tensor with
380 this layout are mapped within the ``[min_offset, max_offset]`` range.
382 .. highlight:: python
383 .. code-block:: python
385 # Possible implementation of the offset_bounds
386 def offset_bounds(layout : _StridedLayout):
387 if layout.volume == 0:
388 return 0, -1
389 ndim = layout.ndim
390 shape = layout.shape
391 strides = layout.strides
392 idx_min = [shape[i] - 1 if strides[i] < 0 else 0 for i in range(ndim)]
393 idx_max = [shape[i] - 1 if strides[i] > 0 else 0 for i in range(ndim)]
394 min_offset = sum(strides[i] * idx_min[i] for i in range(ndim)) + layout.slice_offset
395 max_offset = sum(strides[i] * idx_max[i] for i in range(ndim)) + layout.slice_offset
396 return min_offset, max_offset
398 :type: tuple[int, int]
399 """
400 cdef stride_t min_offset = 0 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO AbBbCbDbP A B -f:f;f.fgbhbibjbg h i j k l q r EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!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
401 cdef stride_t max_offset = 0 2[edgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO AbBbCbDbP A B -f:f;f.fgbhbibjbg h i j k l q r EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!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
402 self.get_offset_bounds(min_offset, max_offset) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO AbBbCbDbP A B -f:f;f.fgbhbibjbg h i j k l q r EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!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
403 return min_offset, max_offset 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO AbBbCbDbP A B -f:f;f.fgbhbibjbg h i j k l q r EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!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
405 @property
406 def min_offset(self : _StridedLayout):
407 """
408 See :attr:`offset_bounds` for details.
410 :type: int
411 """
412 cdef stride_t min_offset = 0
413 cdef stride_t max_offset = 0
414 self.get_offset_bounds(min_offset, max_offset)
415 return min_offset
417 @property
418 def max_offset(self : _StridedLayout):
419 """
420 See :attr:`offset_bounds` for details.
422 :type: int
423 """
424 cdef stride_t min_offset = 0
425 cdef stride_t max_offset = 0
426 self.get_offset_bounds(min_offset, max_offset)
427 return max_offset
429 @property
430 def slice_offset_in_bytes(self : _StridedLayout):
431 """
432 The memory offset (as a number of bytes) of the element at index ``(0,) * ndim``.
433 Equal to :attr:`itemsize` ``*`` :attr:`slice_offset`.
435 .. note::
436 The only way for the index ``(0,) * ndim`` to be mapped to a non-zero offset
437 is slicing with :meth:`sliced` method (or ``[]`` operator).
439 :type: int
440 """
441 return self.get_slice_offset_in_bytes() 2[edgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!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
443 def required_size_in_bytes(self : _StridedLayout) -> int:
444 """
445 The memory allocation size (in bytes) needed so that
446 all elements of a tensor with this layout can be mapped
447 within the allocated memory range.
449 The function raises an error if ``min_offset < 0``.
450 Otherwise, the returned value is equal to
451 ``(max_offset + 1) * itemsize``.
453 .. hint::
454 For dense layouts, the function always succeeds and the
455 ``(max_offset + 1) * itemsize`` is equal to the ``volume * itemsize``.
457 .. highlight:: python
458 .. code-block:: python
460 # Allocating memory on a device to copy a host tensor
461 def device_tensor_like(a : numpy.ndarray, device : ccx.Device) -> StridedMemoryView:
462 a_view = StridedMemoryView(a, -1)
463 # get the original layout of ``a`` and convert it to a dense layout
464 # to avoid overallocating memory (e.g. if the ``a`` was sliced)
465 layout = a_view._layout.to_dense()
466 # get the required size in bytes to fit the tensor
467 required_size = layout.required_size_in_bytes()
468 # allocate the memory on the device
469 device.set_current()
470 mem = device.allocate(required_size, stream=device.default_stream)
471 # create a view on the newly allocated device memory
472 b_view = StridedMemoryView.from_buffer(mem, layout, a_view.dtype)
473 return b_view
474 """
475 return self.get_required_size_in_bytes() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO AbBbCbDbP A B -f:f;f.fgbhbibjbg h i j k l q r EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!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~bacYbRbbcccdcZbec9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiuivixgygxivgwgEgFg
477 def flattened_axis_mask(self : _StridedLayout) -> axes_mask_t:
478 """
479 A mask describing which axes of this layout are mergeable
480 using the :meth:`flattened` method.
481 """
482 return self.get_flattened_axis_mask() 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc
484 def to_dense(self : _StridedLayout, object stride_order="K") -> _StridedLayout:
485 """
486 Returns a dense layout with the same shape and itemsize,
487 but with dense strides in the specified order.
489 See :meth:`dense_like` method documentation for details.
490 """
491 return _StridedLayout.dense_like(self, stride_order) 2}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
493 def reshaped(self : _StridedLayout, shape : tuple[int]) -> _StridedLayout:
494 """
495 Returns a layout with the new shape, if the new shape is compatible
496 with the current layout.
498 The new shape is compatible if:
499 * the new and old shapes have the same volume
500 * the old strides can be split or flattened to match the new shape,
501 assuming indices are iterated in C-order
503 A single extent in the ``shape`` tuple can be set to -1 to indicate
504 it should be inferred from the old volume and the other extents.
506 .. highlight:: python
507 .. code-block:: python
509 layout = _StridedLayout.dense((5, 3, 4), 1)
510 assert layout.reshaped((20, 3)) == _StridedLayout.dense((20, 3), 1)
511 assert layout.reshaped((4, -1)) == _StridedLayout.dense((4, 15), 1)
512 assert layout.permuted((2, 0, 1)).reshaped((4, 15,)) == _StridedLayout((4, 15), (1, 4), 1)
513 # layout.permuted((2, 0, 1)).reshaped((20, 3)) -> error
514 """
515 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 22cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb
516 cdef BaseLayout new_shape
517 init_base_layout(new_shape, len(shape)) 22cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb
518 for i in range(len(shape)): 22cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb
519 new_shape.shape[i] = shape[i] 22cDcEcFc3cGc/f#g,f@e3gVg4g`eSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb
520 self.reshape_into(new_layout, new_shape) 22cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb
521 return new_layout 22cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO AbBbCbDbP A B -f:f;f.fgbhbibjbg h i j k l q r EbFb
523 def permuted(self : _StridedLayout, axis_order : tuple[int]) -> _StridedLayout:
524 """
525 Returns a new layout where the shape and strides tuples are permuted
526 according to the specified permutation of axes.
527 """
528 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6ffijigihikiii4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
529 cdef axis_vec_t axis_order_vec
530 _tuple2axis_vec(axis_order_vec, axis_order) 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6ffijigihikiii4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
531 self.permute_into(new_layout, axis_order_vec) 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6ffijigihikiii4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
532 return new_layout 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
534 def flattened(self : _StridedLayout, start_axis : int = 0, end_axis : int = -1, mask : int | None = None) -> _StridedLayout:
535 """
536 Merges consecutive extents into a single extent (equal to the product of merged extents)
537 if the corresponding strides can be replaced with a single stride
538 (assuming indices are iterated in C-order, i.e. the rightmost
539 axis is incremented first).
541 .. highlight:: python
542 .. code-block:: python
544 # the two extents can be merged into a single extent
545 # because layout.strides[0] == layout.strides[1] * layout.shape[1]
546 layout = _StridedLayout((3, 2), (2, 1), 1)
547 assert layout.flattened() == _StridedLayout((6,), (1,), 1)
549 # the two extents cannot be merged into a single extent
550 # because layout.strides[0] != layout.strides[1] * layout.shape[1]
551 layout = _StridedLayout((3, 2), (1, 3), 1)
552 assert layout.flattened() == layout
554 If ``start_axis`` and ``end_axis`` are provided, only the axes in the
555 inclusive range ``[start_axis, end_axis]`` are considered for flattening.
557 Alternatively, a mask specifying which axes to consider can be provided.
558 A mask of mergeable extents can be obtained using the :meth:`flattened_axis_mask` method.
559 Masks for layouts with the same number of dimensions can be combined
560 using the logical ``&`` (bitwise AND) operator.
562 .. highlight:: python
563 .. code-block:: python
565 layout = _StridedLayout.dense((4, 5, 3), 4)
566 layout2 = _StridedLayout((4, 5, 3), (1, 12, 4), 4)
567 # Even though the two layouts have the same shape initially,
568 # their shapes differ after flattening.
569 assert layout.flattened() == _StridedLayout((60,), (1,), 4)
570 assert layout2.flattened() == _StridedLayout((4, 15), (1, 4), 4)
571 # With the mask, only extents that are mergeable in both layouts are flattened
572 # and the resulting shape is the same for both layouts.
573 mask = layout.flattened_axis_mask() & layout2.flattened_axis_mask()
574 assert layout.flattened(mask=mask) == _StridedLayout((4, 15), (15, 1), 4)
575 assert layout2.flattened(mask=mask) == _StridedLayout((4, 15), (1, 4), 4)
576 """
577 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc
578 cdef axes_mask_t axis_mask
579 if mask is None: 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc
580 axis_mask = axis_mask_from_range(self.ndim, start_axis, end_axis) 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctc
581 else:
582 axis_mask = mask 2+c[cU V C D c W d X y z rcNcpcscE F qctcxe?eyc%czcucAc
583 self.flatten_into(new_layout, axis_mask) 2[e+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc
584 return new_layout 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc
586 def squeezed(self : _StridedLayout) -> _StridedLayout:
587 """
588 Returns a new layout where all the singleton dimensions (extents equal to 1)
589 are removed. Additionally, if the layout volume is 0,
590 the returned layout will be reduced to a 1-dim layout
591 with shape (0,) and strides (0,).
592 """
593 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f
594 self.squeeze_into(new_layout) 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f
595 return new_layout 2[emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f
597 def unsqueezed(self : _StridedLayout, axis : int | tuple[int]) -> _StridedLayout:
598 """
599 Returns a new layout where the specified axis or axes are added as singleton extents.
600 The ``axis`` can be either a single integer in range ``[0, ndim]``
601 or a tuple of unique integers in range ``[0, ndim + len(axis) - 1]``.
602 """
603 cdef axis_vec_t axis_vec
604 if isinstance(axis, int): 2{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!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
605 axis_vec.push_back(axis)
606 else:
607 _tuple2axis_vec(axis_vec, axis) 2{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!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
608 if axis_vec.size() == 0: 2{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!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
609 return self 2[eIhJhKhLhMhNhuevewe
610 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
611 self.unsqueeze_into(new_layout, axis_vec) 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
612 return new_layout 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
614 def broadcast_to(self : _StridedLayout, shape : tuple[int]) -> _StridedLayout:
615 """
616 Returns a layout with the new shape, if the old shape can be
617 broadcast to the new one.
619 The shapes are compatible if:
620 * the new shape has the same or greater number of dimensions
621 * starting from the right, each extent in the old shape must be 1 or
622 equal to the corresponding extent in the new shape.
624 Strides of the added or modified extents are set to 0, the remaining ones are unchanged.
625 If the shapes are not compatible, a ValueError is raised.
626 """
627 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc
628 cdef BaseLayout new_shape
629 cdef int new_ndim = len(shape) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc
630 init_base_layout(new_shape, new_ndim) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc
631 for i in range(new_ndim): 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc
632 new_shape.shape[i] = shape[i] 2[edgegfggghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc
633 self.broadcast_into(new_layout, new_shape) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc
634 return new_layout 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc
636 def repacked(self : _StridedLayout, itemsize : int, data_ptr : intptr_t = 0, axis : int = -1, keep_dim : bool = True) -> _StridedLayout:
637 """
638 Converts the layout to match the specified itemsize.
639 If ``new_itemsize < itemsize``, each element of the tensor is **unpacked** into multiple elements,
640 i.e. the extent at ``axis`` increases by the factor ``itemsize // new_itemsize``.
641 If ``new_itemsize > itemsize``, the consecutive elements in the tensor are **packed** into a single element,
642 i.e. the extent at ``axis`` decreases by the factor ``new_itemsize // itemsize``.
643 In either case, the ``volume * itemsize`` of the layout remains the same.
645 The conversion is subject to the following constraints:
646 * The extent at ``axis`` must be a positive integer.
647 * The stride at ``axis`` must be 1.
649 Moreover, if the ``new_itemsize > itemsize``:
650 * The extent at ``axis`` must be divisible by ``new_itemsize // itemsize``.
651 * All other strides must be divisible by ``new_itemsize // itemsize``.
652 * The ``slice_offset`` must be divisible by ``new_itemsize // itemsize``.
653 * If ``data_ptr`` is provided, it must be aligned to the new itemsize.
655 The maximum itemsize that satisfies all the constraints
656 can be obtained using the :meth:`max_compatible_itemsize` method.
658 If the ``keep_dim`` is False and the extent at ``axis`` would be reduced to 1,
659 it is omitted from the returned layout.
661 .. highlight:: python
662 .. code-block:: python
664 # Repacking the layout with itemsize = 4 bytes as 2, 8, and 16 sized layouts.
665 layout = _StridedLayout.dense((5, 4), 4)
666 assert layout.repacked(2) == _StridedLayout.dense((5, 8), 2)
667 assert layout.repacked(8) == _StridedLayout.dense((5, 2), 8)
668 assert layout.repacked(16) == _StridedLayout.dense((5, 1), 16)
669 assert layout.repacked(16, keep_dim=False) == _StridedLayout.dense((5,), 16)
672 .. highlight:: python
673 .. code-block:: python
675 # Viewing (5, 6) float array as (5, 3) complex64 array.
676 a = numpy.ones((5, 6), dtype=numpy.float32)
677 float_view = StridedMemoryView(a, -1)
678 layout = float_view._layout
679 assert layout.shape == (5, 6)
680 assert layout.itemsize == 4
681 complex_view = float_view.view(layout.repacked(8), numpy.complex64)
682 assert complex_view._layout.shape == (5, 3)
683 assert complex_view._layout.itemsize == 8
684 b = numpy.from_dlpack(complex_view)
685 assert b.shape == (5, 3)
686 """
688 if itemsize == self.itemsize: 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #
689 return self 2sgtgug!c#c$c
690 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 1;=?ab6789!#
691 if itemsize > self.itemsize: 1;=?ab6789!#
692 self.pack_into(new_layout, itemsize, data_ptr, keep_dim, axis) 1;=?ab6789!#
693 else:
694 self.unpack_into(new_layout, itemsize, axis) 1;=?ab6789!#
695 return new_layout 1;=?ab6789!#
697 def max_compatible_itemsize(self : _StridedLayout, max_itemsize : int = 16, data_ptr : intptr_t = 0, axis : int = -1) -> int:
698 """
699 Returns the maximum itemsize (but no greater than ``max_itemsize``) that can be used
700 with the :meth:`repacked` method for the current layout.
701 """
702 return self.get_max_compatible_itemsize(max_itemsize, data_ptr, axis) 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #
704 def sliced(self : _StridedLayout, slices : int | slice | tuple[int | slice]) -> _StridedLayout:
705 """
706 Returns a sliced layout.
707 The ``slices`` parameter can be a single integer, a single :py:class:`slice` object
708 or a tuple of integers/slices.
710 .. hint::
711 For convenience, instead of calling this method directly, please rely
712 on the :py:meth:`~object.__getitem__` operator (i.e. bracket syntax), e.g.:
713 ``layout[:, start:end:step]``.
715 .. note::
716 Slicing is purely a layout transformation and does not involve
717 any data access.
719 """
720 if not isinstance(slices, tuple): 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
721 slices = (slices,) 2U V c d )cnc*cBcocCcu v w x QeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheKgQg'eRgMg(eSgPg)e*e+e,eqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd`c,c-c|c}c.c/ccd:cdd;ced=c?c@cCgDg
722 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
723 self.slice_into(new_layout, slices) 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
724 return new_layout 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
726 def __getitem__(self : _StridedLayout, slices : int | slice | tuple[int | slice]) -> _StridedLayout:
727 return self.sliced(slices) 2=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/exgygvgwgEgFgCgDg
729 cdef axes_mask_t get_flattened_axis_mask(_StridedLayout self) except? -1 nogil:
730 return flattened_strides_in_c_index_order_mask(self.base) 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc
732 cdef int get_max_compatible_itemsize(_StridedLayout self, int max_itemsize, intptr_t data_ptr, int axis=-1) except -1 nogil:
733 return max_compatible_itemsize(self.base, self.slice_offset, self.itemsize, max_itemsize, data_ptr, axis) 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #
735 cdef int reshape_into(_StridedLayout self, _StridedLayout out_layout, BaseLayout& new_shape) except -1 nogil:
736 cdef int64_t old_volume = self.get_volume() 22cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb
738 validate_reshaped_shape(new_shape, old_volume) 22cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb
739 _zero_strides(new_shape) 22cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.fgbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
741 cdef BaseLayout flattened
742 if old_volume != 0: 22cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.fgbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
743 flatten_strides_in_c_index_order(flattened, self.base, axis_mask_from_range(self.base.ndim, 0, -1)) 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
744 if not split_strides_in_c_index_order(new_shape, flattened): 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
745 raise ValueError("Layout strides are incompatible with the new shape") 1YZ*,04(+)-51e2Qf3RST
747 # Reset all memoized properties
748 out_layout._prop_mask = 0 22cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO AbBbCbDbP A B -f:f;f.fgbhbibjbg h i j k l q r EbFb
750 # Copy preserved attributes
751 out_layout.slice_offset = self.slice_offset 22cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO AbBbCbDbP A B -f:f;f.fgbhbibjbg h i j k l q r EbFb
752 out_layout.itemsize = self.itemsize 22cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO AbBbCbDbP A B -f:f;f.fgbhbibjbg h i j k l q r EbFb
753 maybe_copy_volume(out_layout, self) 22cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO AbBbCbDbP A B -f:f;f.fgbhbibjbg h i j k l q r EbFb
755 # Set new attributes
756 _swap_layout(out_layout.base, new_shape) 22cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO AbBbCbDbP A B -f:f;f.fgbhbibjbg h i j k l q r EbFb
757 return 0 22cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO AbBbCbDbP A B -f:f;f.fgbhbibjbg h i j k l q r EbFb
759 cdef int permute_into(_StridedLayout self, _StridedLayout out_layout, axis_vec_t& axis_order) except -1 nogil:
760 if axis_order.size() != <size_t>self.base.ndim: 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6ffijigihikiii4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
761 raise ValueError(f"Permutation must have the same length as the number of dimensions, got {axis_order.size()} for {self.ndim}D tensor.") 2fijigihikiii
763 cdef BaseLayout permuted
764 permute_extents(permuted, self.base, axis_order) 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
766 # Reset all memoized properties
767 out_layout._prop_mask = 0 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
769 # Preserved attributes
770 out_layout.itemsize = self.itemsize 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
771 out_layout.slice_offset = self.slice_offset 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
772 maybe_copy_volume(out_layout, self) 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
774 # Set new attributes
775 _swap_layout(out_layout.base, permuted) 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
776 return 0 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
778 cdef int flatten_into(_StridedLayout self, _StridedLayout out_layout, axes_mask_t axis_mask) except -1 nogil:
779 cdef BaseLayout flattened
780 cdef int ndim = flatten_strides_in_c_index_order(flattened, self.base, axis_mask) 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc
782 if out_layout is self and ndim == self.base.ndim: 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc
783 return 0
785 # Reset all memoized properties
786 out_layout._prop_mask = 0 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc
788 # Preserved attributes
789 out_layout.itemsize = self.itemsize 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc
790 out_layout.slice_offset = self.slice_offset 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc
791 maybe_copy_volume(out_layout, self) 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc
793 # Set new attributes
794 _swap_layout(out_layout.base, flattened) 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc
795 return 0 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc
797 cdef int squeeze_into(_StridedLayout self, _StridedLayout out_layout) except -1 nogil:
798 cdef BaseLayout squeezed
799 squeeze_extents(squeezed, self.base) 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f
801 if out_layout is self and squeezed.ndim == self.base.ndim: 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f
802 return 0
804 # Reset all memoized properties
805 out_layout._prop_mask = 0 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f
807 # Preserved attributes
808 out_layout.itemsize = self.itemsize 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f
809 out_layout.slice_offset = self.slice_offset 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f
810 maybe_copy_volume(out_layout, self) 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f
812 # Set new attributes
813 _swap_layout(out_layout.base, squeezed) 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f
814 return 0 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f
816 cdef int unsqueeze_into(_StridedLayout self, _StridedLayout out_layout, axis_vec_t& axis_vec) except -1 nogil:
817 if axis_vec.size() == 0 and self is out_layout: 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
818 return 0
820 cdef BaseLayout unsqueezed
821 unsqueeze_extents(unsqueezed, self.base, axis_vec) 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
823 # Reset all memoized properties
824 out_layout._prop_mask = 0 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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 # Preserved attributes
827 out_layout.itemsize = self.itemsize 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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 out_layout.slice_offset = self.slice_offset 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
829 maybe_copy_volume(out_layout, self) 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
831 # Set new attributes
832 _swap_layout(out_layout.base, unsqueezed) 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
833 return 0 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
835 cdef int broadcast_into(_StridedLayout self, _StridedLayout out_layout, BaseLayout& broadcast) except -1 nogil:
836 _validate_shape(broadcast) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc
837 broadcast_extents(broadcast, self.base) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc
839 # Reset all memoized properties
840 out_layout._prop_mask = 0 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc
842 # Preserved attributes
843 out_layout.itemsize = self.itemsize 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc
844 out_layout.slice_offset = self.slice_offset 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc
846 # Set new attributes
847 _swap_layout(out_layout.base, broadcast) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc
848 return 0 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc
850 cdef int pack_into(_StridedLayout self, _StridedLayout out_layout, int itemsize, intptr_t data_ptr, bint keep_dim, int axis=-1) except -1 nogil:
852 cdef BaseLayout packed
853 cdef stride_t new_slice_offset = 0 1;=?ab6789!#
854 cdef int vec_size = pack_extents( 1;=?ab6789!#
855 packed,
856 new_slice_offset,
857 self.base,
858 self.slice_offset,
859 self.itemsize,
860 itemsize,
861 data_ptr,
862 keep_dim,
863 axis
864 )
866 if vec_size == 1 and out_layout is self: 1;=?ab6789!#
867 return 0
869 # Reset all memoized properties
870 out_layout._prop_mask = 0 1;=?ab6789!#
872 # Set new attributes
873 out_layout.itemsize = itemsize 1;=?ab6789!#
874 out_layout.slice_offset = new_slice_offset 1;=?ab6789!#
875 _swap_layout(out_layout.base, packed) 1;=?ab6789!#
876 return vec_size 1;=?ab6789!#
878 cdef int unpack_into(_StridedLayout self, _StridedLayout out_layout, int itemsize, int axis=-1) except -1 nogil:
879 cdef BaseLayout unpacked
880 cdef int vec_size = unpack_extents( 1;=?ab6789!#
881 unpacked,
882 self.base,
883 self.itemsize,
884 itemsize,
885 axis
886 )
887 if vec_size == 1 and out_layout is self: 1;=?ab6789!#
888 return 0
890 cdef int64_t new_slice_offset = _overflow_checked_mul(self.slice_offset, vec_size) 1;=?ab6789!#
892 # Reset all memoized properties
893 out_layout._prop_mask = 0 1;=?ab6789!#
895 # Set new attributes
896 out_layout.itemsize = itemsize 1;=?ab6789!#
897 out_layout.slice_offset = new_slice_offset 1;=?ab6789!#
898 _swap_layout(out_layout.base, unpacked) 1;=?ab6789!#
899 return vec_size 1;=?ab6789!#
901 cdef int slice_into(_StridedLayout self, _StridedLayout out_layout, tuple slices) except -1:
902 cdef BaseLayout sliced
903 cdef stride_t slice_offset = slice_extents(sliced, self.base, slices) 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
904 cdef int64_t new_slice_offset = _overflow_checked_sum(self.slice_offset, slice_offset) 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
906 # Reset all memoized properties
907 out_layout._prop_mask = 0 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
909 # Preserved attributes
910 out_layout.itemsize = self.itemsize 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
912 # Set new attributes
913 _swap_layout(out_layout.base, sliced) 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
914 out_layout.slice_offset = new_slice_offset 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
915 return 0 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
917cdef inline int maybe_copy_volume(_StridedLayout out_layout, _StridedLayout in_layout) except -1 nogil:
918 if _has_valid_property(in_layout, PROP_VOLUME): 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAca b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.fgbhbibjbe g h i j f k l q r EbFbmgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(fyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
919 out_layout._volume = in_layout.get_volume() 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAca b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.fgbhbibjbe g h i j f k l q r EbFbmgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(fyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
920 _mark_property_valid(out_layout, PROP_VOLUME) 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAca b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.fgbhbibjbe g h i j f k l q r EbFbmgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(fyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
921 return 0 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAca b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.fgbhbibjbe g h i j f k l q r EbFbmgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(fyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
924cdef inline int validate_reshaped_shape(BaseLayout& new_shape, int64_t old_volume) except -1 nogil:
925 cdef int ndim = new_shape.ndim 22cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb
926 cdef int axis = -1 22cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb
927 cdef extent_t extent
928 for i in range(ndim): 22cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb
929 extent = new_shape.shape[i] 22cDcEcFc3cGc/f#g,f@e3gVg4g`eSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb
930 if extent < -1: 22cDcEcFc3cGc/f#g,f@e3gVg4g`eSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb
931 raise ValueError("Extents must be non-negative") 2$g%g6g'g7g(g)g*g+g,g
932 elif extent == -1: 22cDcEcFc3cGc/f#g,f@e3gVg4g`eSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg6g7g1g2ghbIgibjbUgJge g h i j 2 Q f k 3 R l q S r T EbFb
933 if axis == -1: 2DcEcFcGc@e3gVg`eSbTbncoc@ [ ] ^ _ ` { | } ~ abbbcbdbebfb0g5gTgGggbHg1g2ghbIgibjbUgJg
934 axis = i 2DcEcFcGc@e3gVg`eSbTbncoc@ [ ] ^ _ ` { | } ~ abbbcbdbebfb0g5gTgGggbHg1g2ghbIgibjbUgJg
935 else:
936 raise ValueError("There can be at most one -1 extent in a shape") 21g2g
937 cdef int64_t new_volume = _c_abs(_volume(new_shape)) 22cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHghbIgibjbUgJge g h i j 2 Q f k 3 R l q S r T EbFb
938 if axis == -1: 22cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHghbIgibjbUgJge g h i j 2 Q f k 3 R l q S r T EbFb
939 if new_volume != old_volume: 22c'c3c(c/f#g,f4gOcPc)c*cBcCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t qbrbsbtbubvbwbxbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.fe g h i j 2 Q f k 3 R l q S r T EbFb
940 raise ValueError(f"The original volume {old_volume} and the new volume {new_volume} must be equal.") 2#g4g)c*cWgXgYgZg
941 else:
942 if new_volume == 0: 2DcEcFcGc@e3gVg`eSbTbncoc@ [ ] ^ _ ` { | } ~ abbbcbdbebfb0g5gTgGggbHghbIgibjbUgJg
943 raise ValueError("The -1 extent is ambiguous when the specified sub-volume is 0") 23gVg0g5gTgUg
944 extent = old_volume // new_volume 2DcEcFcGc@e`eSbTbncoc@ [ ] ^ _ ` { | } ~ abbbcbdbebfbGggbHghbIgibjbJg
945 if extent * new_volume != old_volume: 2DcEcFcGc@e`eSbTbncoc@ [ ] ^ _ ` { | } ~ abbbcbdbebfbGggbHghbIgibjbJg
946 raise ValueError(f"The original volume {old_volume} must be divisible by the specified sub-volume {new_volume}.") 2GgHgIgJg
947 new_shape.shape[axis] = extent 2DcEcFcGc@e`eSbTbncoc@ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjb
948 return 0 22cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.fgbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
951cdef inline axes_mask_t axis_mask_from_range(int ndim, int start_axis, int end_axis) except? -1 nogil:
952 cdef axes_mask_t axes_mask = flatten_all_axes_mask(ndim) 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctc2cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
953 if start_axis == 0 and end_axis == -1: 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctc2cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
954 return axes_mask 2+c[cU V C D c W d X y z rcNcpcscE F qctc2cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
955 if not _normalize_axis(start_axis, ndim): 1GHIJMKLN
956 raise ValueError(f"Invalid start axis: {start_axis} out of range for {ndim}D tensor")
957 if not _normalize_axis(end_axis, ndim): 1GHIJMKLN
958 raise ValueError(f"Invalid end axis: {end_axis} out of range for {ndim}D tensor")
959 if start_axis > 0: 1GHIJMKLN
960 axes_mask &= (AXES_MASK_ALL << start_axis) 1GHIJKL
961 if end_axis < ndim: 1GHIJMKLN
962 axes_mask &= (AXES_MASK_ALL >> (STRIDED_LAYOUT_MAX_NDIM - end_axis - 1)) 1GHIJMKLN
963 return axes_mask 1GHIJMKLN
966cdef inline int flatten_strides_in_c_index_order(BaseLayout& out_layout, BaseLayout& in_layout, axes_mask_t axis_mask) except -1 nogil:
967 cdef int ndim = in_layout.ndim 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc2cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
968 if ndim == 0: 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc2cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
969 init_base_layout(out_layout, 1) 2+c[cxe?e2cDc'cEcFc3c(cGc
970 out_layout.shape[0] = 1 2+c[cxe?e2cDc'cEcFc3c(cGc
971 out_layout.strides[0] = 1 2+c[cxe?e2cDc'cEcFc3c(cGc
972 return 1 2+c[cxe?e2cDc'cEcFc3c(cGc
973 init_base_layout(out_layout, ndim) 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
974 cdef int group_start = 0 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
975 cdef int group_end = 0 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
976 cdef int64_t group_vol
977 cdef int64_t group_stride
978 cdef int out_i = 0 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
979 cdef extent_t* in_shape = in_layout.shape 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
980 cdef stride_t* in_strides = get_strides_ptr(in_layout) 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
981 while group_start < ndim: 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
982 group_vol = in_shape[group_start] 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
983 group_stride = in_strides[group_start] 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
984 group_end = group_start + 1 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
985 while ( 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
986 group_end < ndim 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
987 and (axis_mask & _axis2mask(group_end)) 2C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
988 and group_stride == _overflow_checked_mul(in_strides[group_end], in_shape[group_end]) 2C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
989 ):
990 group_vol = _overflow_checked_mul(group_vol, in_shape[group_end]) 2C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcm n kblbmbnbobpb@ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb0 4 zbAbBbCb5 Db1 A B gbhbibjbg h i j Q k R l q S r T EbFb
991 group_stride = in_strides[group_end] 2C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcm n kblbmbnbobpb@ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb0 4 zbAbBbCb5 Db1 A B gbhbibjbg h i j Q k R l q S r T EbFb
992 group_end += 1 2C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcm n kblbmbnbobpb@ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb0 4 zbAbBbCb5 Db1 A B gbhbibjbg h i j Q k R l q S r T EbFb
993 out_layout.shape[out_i] = group_vol 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
994 out_layout.strides[out_i] = group_stride 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
995 out_i += 1 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
996 group_start = group_end 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
997 if out_i != ndim: 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
998 trim_base_layout(out_layout, out_i) 2C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcm n kblbmbnbobpb@ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb0 4 zbAbBbCb5 Db1 A B gbhbibjbg h i j Q k R l q S r T EbFb
999 return out_i 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
1002cdef inline axes_mask_t flattened_strides_in_c_index_order_mask(BaseLayout& layout) except? -1 nogil:
1003 if layout.strides == NULL: 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc
1004 return flatten_all_axes_mask(layout.ndim) 2+cNcsctc?e%cuc
1005 cdef axes_mask_t axis_mask = 0 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxeyczcucAc
1006 cdef int ndim = layout.ndim 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxeyczcucAc
1007 cdef int group_start = 0 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxeyczcucAc
1008 cdef int group_end = 0 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxeyczcucAc
1009 cdef int64_t group_vol
1010 cdef int64_t group_stride
1011 while group_start < ndim: 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxeyczcucAc
1012 group_vol = layout.shape[group_start] 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyczcucAc
1013 group_stride = layout.strides[group_start] 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyczcucAc
1014 group_end = group_start + 1 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyczcucAc
1015 while group_end < ndim and group_stride == layout.strides[group_end] * layout.shape[group_end]: 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyczcucAc
1016 group_vol = _overflow_checked_mul(group_vol, layout.shape[group_end]) 2C D c W d X y z rcpcG H I J M E F K L N qcyczcucAc
1017 group_stride = layout.strides[group_end] 2C D c W d X y z rcpcG H I J M E F K L N qcyczcucAc
1018 axis_mask |= _axis2mask(group_end) 2C D c W d X y z rcpcG H I J M E F K L N qcyczcucAc
1019 group_end += 1 2C D c W d X y z rcpcG H I J M E F K L N qcyczcucAc
1020 group_start = group_end 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyczcucAc
1021 return axis_mask 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxeyczcucAc
1024cdef inline bint split_strides_in_c_index_order(BaseLayout& out_layout, BaseLayout& in_layout) except -1 nogil:
1025 cdef int i = in_layout.ndim - 1 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
1026 cdef int new_i = out_layout.ndim - 1 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
1027 cdef extent_t extent
1028 cdef extent_t new_extent
1029 cdef extent_t group_vol
1030 cdef stride_t group_stride
1031 cdef extent_t* in_shape = in_layout.shape 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
1032 cdef stride_t* in_strides = get_strides_ptr(in_layout) 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
1033 if out_layout.strides == NULL: 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
1034 _zero_strides(out_layout)
1035 while i >= 0: 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
1036 extent = in_shape[i] 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
1037 group_stride = in_strides[i] 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
1038 group_vol = 1 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
1039 while new_i >= 0: 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
1040 new_extent = out_layout.shape[new_i] 22cDcEcFc3cGcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
1041 if new_extent == 0: 22cDcEcFc3cGcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
1042 return False
1043 if new_extent == 1 or group_vol < extent: 22cDcEcFc3cGcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
1044 out_layout.strides[new_i] = group_stride 22cDcEcFc3cGcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
1045 group_stride = _overflow_checked_mul(group_stride, new_extent) 22cDcEcFc3cGcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
1046 group_vol = _overflow_checked_mul(group_vol, new_extent) 22cDcEcFc3cGcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
1047 new_i -= 1 22cDcEcFc3cGcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
1048 else:
1049 break 1YsZt*0O(+)P1ABeghijQfkRlST
1050 if group_vol != extent: 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb
1051 return False 1YZ*,04(+)-51e2Qf3RST
1052 i -= 1 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO Ab( BbCb) DbP A B gbhbibjbe g h i j f k l q r EbFb
1053 return True 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO AbBbCbDbP A B gbhbibjbg h i j k l q r EbFb
1056cdef inline int permute_extents(BaseLayout& out_layout, BaseLayout& in_layout, axis_vec_t& axis_order) except -1 nogil:
1057 cdef int ndim = in_layout.ndim 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
1058 init_base_layout(out_layout, ndim) 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
1059 cdef axis_t axis
1060 cdef axes_mask_t axis_mask
1061 cdef axes_mask_t axis_order_mask = 0 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
1062 cdef extent_t* in_shape = in_layout.shape 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
1063 cdef stride_t* in_strides = get_strides_ptr(in_layout) 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
1065 for i in range(ndim): 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
1066 axis = axis_order[i] 2c W d X a b {e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
1067 if not _normalize_axis(axis, ndim): 2c W d X a b {e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
1068 raise ValueError(f"Invalid permutation: axis {axis} out of range for {ndim}D tensor") 2Qh5h6hRhShTh
1069 axis_mask = _axis2mask(axis) 2c W d X a b {e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
1070 if axis_order_mask & axis_mask: 2c W d X a b {e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
1071 raise ValueError(f"Invalid permutation: axis {axis_order[i]} appears multiple times.") 24hOhPh
1072 axis_order_mask |= axis_mask 2c W d X a b {e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
1073 out_layout.shape[i] = in_shape[axis] 2c W d X a b {e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
1074 out_layout.strides[i] = in_strides[axis] 2c W d X a b {e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
1075 return 0 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete
1078cdef inline stride_t slice_extents(BaseLayout& out_layout, BaseLayout& in_layout, tuple slices) except? -1:
1079 cdef int ndim = in_layout.ndim 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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 int num_slices = len(slices) 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
1081 if num_slices > ndim: 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
1082 raise ValueError(f"The number of slices ({num_slices}) is greater than the number of dimensions ({ndim}).") 2FhGhHh
1083 init_base_layout(out_layout, ndim) 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
1084 cdef extent_t* in_shape = in_layout.shape 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
1085 cdef stride_t* in_strides = get_strides_ptr(in_layout) 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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 stride_t slice_offset = 0 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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 cdef Py_ssize_t start
1088 cdef Py_ssize_t stop
1089 cdef Py_ssize_t step
1090 cdef extent_t new_extent
1091 cdef object py_slice
1092 cdef bint zero_slice = False 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
1093 cdef int out_i = 0 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
1094 for i in range(num_slices): 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
1095 py_slice = slices[i] 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T QeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
1096 if isinstance(py_slice, int): 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T QeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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 start = py_slice 2ie]e^eKg_e'eLgjekeMgNgle(eOgmePgne)e*e+e+d,e,d-dvgwg
1098 if not _normalize_axis(start, in_shape[i]): 2ie]e^eKg_e'eLgjekeMgNgle(eOgmePgne)e*e+e+d,e,d-dvgwg
1099 raise ValueError(f"Invalid index: {start} out of range for axis {i} with extent {in_shape[i]}") 2KgLgMgNgOgPg
1100 # single element index removes extent from the shape,
1101 # just increase the offset and skip the shape and stride
1102 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
1103 elif isinstance(py_slice, slice): 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T QeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheieQgRgjekeleSgmene+d,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
1104 _PySlice_Unpack(<PyObject *>py_slice, &start, &stop, &step) 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T QeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheiejekelemene+d,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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 new_extent = _PySlice_AdjustIndices(in_shape[i], &start, &stop, step) 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T QeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheiejekelemene+d,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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 if new_extent > 0: 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T QeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheiejekelemene+d,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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 # out_extent > 0 implies start is in [0, extent - 1] range
1108 slice_offset = _overflow_checked_sum(slice_offset, _overflow_checked_mul(start, in_strides[i])) 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b u v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T QeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBggeheiejekelemene+d,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
1109 else:
1110 zero_slice = True 2)cnc*cBcocCccedeee$ % '
1111 out_layout.shape[out_i] = new_extent 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T QeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheiejekelemene+d,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
1112 out_layout.strides[out_i] = _overflow_checked_mul(in_strides[i], step) 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T QeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheiejekelemene+d,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
1113 out_i += 1 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T QeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheiejekelemene+d,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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 else:
1115 raise TypeError(f"Invalid slice: {py_slice}. Expected slice instance or integer.") 2QgRgSg
1116 for i in range(num_slices, ndim): 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
1117 out_layout.shape[out_i] = in_shape[i] 2HcIcJcKcLcMcc d y z e f fecegedeeehe'e(e)e*e+e+d,e,d-dvcwcxc]c^c_c`c,c-chd{c|c}c.c/cid~cadjdbdkdcd:cdd;cldedfd=c?cmdgd@c
1118 out_layout.strides[out_i] = in_strides[i] 2HcIcJcKcLcMcc d y z e f fecegedeeehe'e(e)e*e+e+d,e,d-dvcwcxc]c^c_c`c,c-chd{c|c}c.c/cid~cadjdbdkdcd:cdd;cldedfd=c?cmdgd@c
1119 out_i += 1 2HcIcJcKcLcMcc d y z e f fecegedeeehe'e(e)e*e+e+d,e,d-dvcwcxc]c^c_c`c,c-chd{c|c}c.c/cid~cadjdbdkdcd:cdd;cldedfd=c?cmdgd@c
1120 if out_i != ndim: 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
1121 trim_base_layout(out_layout, out_i) 2ie]e^e_e'ejekele(emene)e*e+e+d,e,d-dvgwg
1122 if zero_slice: 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
1123 _zero_strides(out_layout) 2)cnc*cBcocCccedeee$ % '
1124 return slice_offset 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@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
1127cdef inline int squeeze_extents(BaseLayout& out_layout, BaseLayout& in_layout) except -1 nogil:
1128 cdef int ndim = in_layout.ndim 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f
1129 init_base_layout(out_layout, ndim) 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f
1130 cdef extent_t* in_shape = in_layout.shape 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f
1131 cdef stride_t* in_strides = get_strides_ptr(in_layout) 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f
1132 cdef int out_i = 0 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f
1133 cdef extent_t extent
1134 for i in range(ndim): 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f
1135 extent = in_shape[i] 2)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f
1136 if extent == 0: 2)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f
1137 trim_base_layout(out_layout, 1) 1$%'
1138 out_layout.shape[0] = 0 1$%'
1139 out_layout.strides[0] = 0 1$%'
1140 return 1 1$%'
1141 elif extent != 1: 2)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f
1142 out_layout.shape[out_i] = extent 2)f*f+f$ % . ' / : 7f8f9fvcwcxc!f#f$f%f'f(f
1143 out_layout.strides[out_i] = in_strides[i] 2)f*f+f$ % . ' / : 7f8f9fvcwcxc!f#f$f%f'f(f
1144 out_i += 1 2)f*f+f$ % . ' / : 7f8f9fvcwcxc!f#f$f%f'f(f
1145 if out_i != ndim: 2mgngog)f*f+f. / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f
1146 trim_base_layout(out_layout, out_i) 2. / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f
1147 return out_i 2mgngog)f*f+f. / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f
1150cdef inline int unsqueeze_extents(BaseLayout& out_layout, BaseLayout& in_layout, axis_vec_t& axis_vec) except -1 nogil:
1151 cdef int ndim = in_layout.ndim 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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 int num_new_axes = axis_vec.size() 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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 int out_ndim = ndim + num_new_axes 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
1154 # init_base_layout validates out_ndim
1155 init_base_layout(out_layout, out_ndim) 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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 cdef extent_t* in_shape = in_layout.shape 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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 cdef stride_t* in_strides = get_strides_ptr(in_layout) 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
1158 cdef axes_mask_t out_shape_mask = 0 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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 cdef axes_mask_t axis_mask = 0 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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 cdef axis_t axis
1161 for i in range(num_new_axes): 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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 axis = axis_vec[i] 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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 if not _normalize_axis(axis, out_ndim): 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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 raise ValueError(f"Invalid axis: {axis} out of range for {out_ndim}D tensor")
1165 axis_mask = _axis2mask(axis) 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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 if out_shape_mask & axis_mask: 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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 raise ValueError(f"Axis {axis} appears multiple times.")
1168 out_shape_mask |= axis_mask 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
1169 cdef int in_i = 0 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
1170 for i in range(out_ndim): 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
1171 axis_mask = _axis2mask(<axis_t>i) 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
1172 if out_shape_mask & axis_mask: 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
1173 out_layout.shape[i] = 1 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
1174 if in_i < ndim: 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
1175 out_layout.strides[i] = _overflow_checked_mul(in_shape[in_i], in_strides[in_i]) 2nd$d%d'd(dod)dpd*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
1176 else:
1177 if ndim > 0: 2{d|d}d~daebendIdJdKdLdodMdpdNdGbUbHbIbJbKbVbLbMbWbNbObPbQbXbYbRbZb
1178 out_layout.strides[i] = in_strides[ndim - 1] 2ndIdJdKdLdodMdpdNdGbUbHbIbJbKbVbLbMbWbNbObPbQbXbYbRbZb
1179 else:
1180 out_layout.strides[i] = 1 2{d|d}d~daebe
1181 else:
1182 out_layout.shape[i] = in_shape[in_i] 2nd$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
1183 out_layout.strides[i] = in_strides[in_i] 2nd$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
1184 in_i += 1 2nd$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
1185 assert in_i == ndim 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
1186 return 0 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!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
1189cdef inline int broadcast_extents(BaseLayout& broadcast, BaseLayout& in_layout) except -1 nogil:
1190 if broadcast.ndim < in_layout.ndim: 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc
1191 raise ValueError(
1192 f"The broadcast shape ndim ({broadcast.ndim}) must be "
1193 f"greater than or equal to the input shape "
1194 f"ndim ({in_layout.ndim})."
1195 )
1196 cdef int ndim_diff = broadcast.ndim - in_layout.ndim 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc
1197 _zero_strides(broadcast) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc
1198 cdef extent_t* in_shape = in_layout.shape 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc
1199 cdef stride_t* in_strides = get_strides_ptr(in_layout) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc
1200 cdef extent_t* broadcast_shape = broadcast.shape + ndim_diff 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc
1201 cdef stride_t* broadcast_strides = broadcast.strides + ndim_diff 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc
1202 for i in range(in_layout.ndim): 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc
1203 if in_shape[i] == broadcast_shape[i]: 2[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc
1204 broadcast_strides[i] = in_strides[i] 2|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc
1205 elif in_shape[i] != 1: 2[f]f^f_f`f{fTcUcVcWcXcHcIcYcZcJc0c1cKcLcMc
1206 raise ValueError(
1207 f"Shapes cannot be broadcast together: "
1208 f"the original extent must be 1 or be equal to broadcast extent, "
1209 f"got {in_shape[i]} and {broadcast_shape[i]} for axis {i}."
1210 )
1211 # else -> in_extent == 1, the broadcast extent and zero stride are already set
1212 return 0 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc
1215cdef inline int64_t gcd(int64_t a, int64_t b) except? -1 nogil:
1216 while b != 0: 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #
1217 a, b = b, a % b 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #
1218 return a 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #
1221cdef 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:
1222 cdef int ndim = in_layout.ndim 1;=?ab6789!#
1223 if new_itemsize <= 0: 1;=?ab6789!#
1224 raise ValueError(f"new itemsize must be greater than zero, got {new_itemsize}.")
1225 if itemsize <= 0: 1;=?ab6789!#
1226 raise ValueError(f"itemsize must be greater than zero, got {itemsize}.")
1227 if new_itemsize <= itemsize: 1;=?ab6789!#
1228 if new_itemsize == itemsize:
1229 return 1
1230 raise ValueError(f"new itemsize ({new_itemsize}) must be greater than or equal to itemsize ({itemsize}).")
1231 if not _normalize_axis(axis, ndim): 1;=?ab6789!#
1232 raise ValueError(f"Invalid axis: {axis} out of range for {ndim}D tensor")
1233 if data_ptr % new_itemsize != 0: 1;=?ab6789!#
1234 raise ValueError(f"The data pointer ({data_ptr}) must be aligned to the packed itemsize ({new_itemsize}).")
1236 cdef extent_t* shape = in_layout.shape 1;=?ab6789!#
1237 cdef stride_t* strides = get_strides_ptr(in_layout) 1;=?ab6789!#
1238 if strides[axis] != 1: 1;=?ab6789!#
1239 raise ValueError(f"The axis {axis} stride must be 1, got {strides[axis]}.")
1241 cdef int vec_size = new_itemsize // itemsize 1;=?ab6789!#
1242 cdef extent_t packed_extent = shape[axis] 1;=?ab6789!#
1243 if packed_extent == 0: 1;=?ab6789!#
1244 raise ValueError(f"The axis {axis} extent must be non-zero, got {shape[axis]}.")
1245 packed_extent //= vec_size 1;=?ab6789!#
1246 if packed_extent * vec_size != shape[axis]: 1;=?ab6789!#
1247 raise ValueError(f"The axis {axis} extent ({shape[axis]}) must be divisible by {vec_size}.")
1249 cdef stride_t new_slice_offset = slice_offset // vec_size 1;=?ab6789!#
1250 if new_slice_offset * vec_size != slice_offset: 1;=?ab6789!#
1251 raise ValueError(f"The slice offset ({slice_offset}) must be divisible by {vec_size}.")
1252 out_slice_offset = new_slice_offset 1;=?ab6789!#
1254 init_base_layout(out_layout, ndim) 1;=?ab6789!#
1255 cdef stride_t packed_stride
1256 cdef int out_i = 0 1;=?ab6789!#
1257 for i in range(ndim): 1;=?ab6789!#
1258 if i == axis: 1;=?ab6789!#
1259 if keep_dim or packed_extent != 1: # omit the packed axis if it is reduced to 1 1;=?ab6789!#
1260 out_layout.shape[out_i] = packed_extent 1;=?ab6789!#
1261 out_layout.strides[out_i] = 1 1;=?ab6789!#
1262 out_i += 1 1;=?ab6789!#
1263 else:
1264 packed_stride = strides[i] // vec_size 1ab6789!#
1265 if packed_stride * vec_size != strides[i]: 1ab6789!#
1266 raise ValueError(f"The {i} axis stride ({strides[i]}) must be divisible by {vec_size}.")
1267 out_layout.shape[out_i] = shape[i] 1ab6789!#
1268 out_layout.strides[out_i] = packed_stride 1ab6789!#
1269 out_i += 1 1ab6789!#
1270 if out_i != ndim: 1;=?ab6789!#
1271 trim_base_layout(out_layout, out_i)
1272 return vec_size 1;=?ab6789!#
1275cdef inline int unpack_extents(BaseLayout &out_layout, BaseLayout &in_layout, int itemsize, int new_itemsize, int axis) except -1 nogil:
1276 cdef int ndim = in_layout.ndim 1;=?ab6789!#
1277 if not _normalize_axis(axis, ndim): 1;=?ab6789!#
1278 raise ValueError(f"Invalid axis: {axis} out of range for {ndim}D tensor")
1279 if new_itemsize <= 0: 1;=?ab6789!#
1280 raise ValueError(f"new itemsize must be greater than zero, got {new_itemsize}.")
1281 if itemsize <= 0: 1;=?ab6789!#
1282 raise ValueError(f"itemsize must be greater than zero, got {itemsize}.")
1283 if new_itemsize >= itemsize: 1;=?ab6789!#
1284 if new_itemsize == itemsize:
1285 return 1
1286 raise ValueError(f"new itemsize ({new_itemsize}) must be less than or equal to itemsize ({itemsize}).")
1288 cdef extent_t* shape = in_layout.shape 1;=?ab6789!#
1289 cdef stride_t* strides = get_strides_ptr(in_layout) 1;=?ab6789!#
1290 if shape[axis] == 0: 1;=?ab6789!#
1291 raise ValueError(f"The axis {axis} extent must be non-zero, got {shape[axis]}.")
1292 if strides[axis] != 1: 1;=?ab6789!#
1293 raise ValueError(f"The axis {axis} stride must be 1, got {strides[axis]}.")
1295 cdef int vec_size = itemsize // new_itemsize 1;=?ab6789!#
1296 init_base_layout(out_layout, ndim) 1;=?ab6789!#
1297 out_layout.shape[axis] = _overflow_checked_mul(shape[axis], vec_size) 1;=?ab6789!#
1298 out_layout.strides[axis] = 1 1;=?ab6789!#
1300 for i in range(ndim): 1;=?ab6789!#
1301 if i == axis: 1;=?ab6789!#
1302 continue 1;=?ab6789!#
1303 out_layout.shape[i] = shape[i] 1ab6789!#
1304 out_layout.strides[i] = _overflow_checked_mul(strides[i], vec_size) 1ab6789!#
1305 return vec_size 1;=?ab6789!#
1308cdef 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:
1309 cdef int ndim = layout.ndim 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #
1310 if max_itemsize <= 0: 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #
1311 raise ValueError(f"max_itemsize must be greater than zero, got {max_itemsize}.")
1312 if itemsize <= 0: 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #
1313 raise ValueError(f"itemsize must be greater than zero, got {itemsize}.")
1314 if not _normalize_axis(axis, ndim): 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #
1315 raise ValueError(f"Invalid axis: {axis} out of range for {ndim}D tensor")
1316 if max_itemsize < itemsize: 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #
1317 raise ValueError(f"max_itemsize ({max_itemsize}) cannot be less than itemsize ({itemsize}).")
1318 max_itemsize = gcd(max_itemsize, _c_abs(data_ptr)) 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #
1319 cdef extent_t* shape = layout.shape 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #
1320 cdef stride_t* strides = get_strides_ptr(layout) 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #
1321 if ndim < 1 or strides[axis] != 1 or shape[axis] == 0: 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #
1322 return itemsize
1323 max_itemsize = gcd(max_itemsize, _overflow_checked_mul(slice_offset, itemsize)) 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #
1324 max_itemsize = gcd(max_itemsize, _overflow_checked_mul(shape[axis], itemsize)) 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #
1325 for i in range(ndim): 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #
1326 if i == axis: 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #
1327 continue 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #
1328 max_itemsize = gcd(max_itemsize, _overflow_checked_mul(_c_abs(strides[i]), itemsize)) 2!c#c$ca b 6 7 8 9 ! #
1329 return max_itemsize 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #