Coverage for cuda / core / _layout.pyx: 89.47%

551 statements  

« prev     ^ index     » next       coverage.py v7.13.4, created at 2026-03-08 01:07 +0000

1# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 

2# 

3# SPDX-License-Identifier: Apache-2.0 

4  

5cimport cython 

6  

7from libc.stdint cimport int64_t, intptr_t 

8  

9from cpython.object cimport PyObject 

10  

11  

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 

15  

16  

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. 

22  

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`. 

35  

36  

37 See also :meth:`dense`. 

38  

39  

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 """ 

48  

49 def __init__( 

50 self : _StridedLayout, 

51 shape : tuple[int, ...], 

52 strides : tuple[int, ...] | None, 

53 itemsize : int, 

54 divide_strides : bool = False 

55 ) -> None: 

56 self.init_from_tuple(shape, strides, itemsize, divide_strides) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f%h'h4h5h6h1cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijinixgygkioipi

57  

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. 

67  

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. 

80  

81 See also :attr:`stride_order`. 

82  

83  

84 .. highlight:: python 

85 .. code-block:: python 

86  

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) 

90  

91 """ 

92 cdef _StridedLayout new_layout = _StridedLayout.__new__(cls) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H AcucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f9h!h#h$hOhPhQhRhShTh1cwc%cxcyc2c'czc,f?eVg4gHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f.f0gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijilimixgygki

93 new_layout.init_dense_from_tuple(shape, itemsize, stride_order) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H AcucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f9h!h#h$hOhPhQhRhShTh1cwc%cxcyc2c'czc,f?eVg4gHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f.f0gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijilimixgygki

94 return new_layout 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H AcucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f9h!h#h$hOhPhQhRhShTh1cwc%cxcyc2c'czc,f?eVg4gHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f.f0gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijilimixgygki

95  

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. 

105  

106 See also :attr:`is_dense`. 

107  

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. 

119  

120 See also :attr:`stride_order`. 

121  

122  

123 .. highlight:: python 

124 .. code-block:: python 

125  

126 layout = _StridedLayout.dense((5, 3, 7), 1).permuted((2, 0, 1)) 

127 assert layout == _StridedLayout((7, 5, 3), (1, 21, 7), 1) 

128  

129 # dense_like with the default "K" stride_order 

130 # keeps the same order of strides as in the original layout 

131 assert _StridedLayout.dense_like(layout) == layout 

132 # "C", "F" recompute the strides accordingly 

133 assert _StridedLayout.dense_like(layout, "C") == _StridedLayout((7, 5, 3), (15, 3, 1), 1) 

134 assert _StridedLayout.dense_like(layout, "F") == _StridedLayout((7, 5, 3), (1, 7, 35), 1) 

135 """ 

136 cdef OrderFlag order_flag 

137 cdef axis_vec_t stride_order_vec 

138 cdef bint is_dense = other.get_is_dense() 2}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

139  

140 if stride_order == "K": 2}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

141 if is_dense: 2thuhvhwhxhyhodrdzhsdAhCdDdBhFd@cSd]cTdVd,c.cChDhEh2d4d8ddd=c/e:e;e

142 return other 2thuhvhwhxhyhzhAhBhChDhEh/e:e;e

143 other.get_stride_order(stride_order_vec) 2odrdsdCdDdFd@cSd]cTdVd,c.c2d4d8ddd=c

144 order_flag = ORDER_PERM 2odrdsdCdDdFd@cSd]cTdVd,c.c2d4d8ddd=c

145 else: 

146 order_flag = _stride_order2vec(stride_order_vec, stride_order) 2}g~gahbh-g.gchdh/geh:g;gfhghhh=gihjhpd?gkhqdlhMdNdmhtdudnhvdwdOdxd@gohphydPdQdRdzdAdBdEd[g]g^g8gqh_g`g-d[c^crhUd+cWdfd_cXd`c9gYd{c-c.dZdgd|c}c/d{g|g!g:dhd~c;d0d=d1d?did@dad/c3d[dbd:csh]djd^d5d6d7dcd_d9d;ckded?cxeyezeAeBeoeCepeDeEeFeGeHeIeJeqeKeLeMereNeOesete

147 if order_flag == ORDER_NONE: 2}g~gahbh-g.gchdh/geh:g;gfhghhh=gihjhpd?gkhqdlhMdNdmhtdudnhvdwdOdxd@gohphydPdQdRdzdAdBdEd[g]g^g8gqh_g`g-d[c^crhUd+cWdfd_cXd`c9gYd{c-c.dZdgd|c}c/d{g|g!g:dhd~c;d0d=d1d?did@dad/c3d[dbd:csh]djd^d5d6d7dcd_d9d;ckded?cxeyezeAeBeoeCepeDeEeFeGeHeIeJeqeKeLeMereNeOesete

148 raise ValueError( 

149 f"The stride_order must be 'K', 'C', 'F', " 

150 f"or a permutation tuple. Got: {stride_order}" 

151 ) 

152 elif order_flag == ORDER_C: 

153 if is_dense and other.get_is_contiguous_c(): 2}g~gahfhghihpdlhnhvdxdohzdBdEd[crhWd|c!g~c0d/csh5d6d7d9d;c?coepete

154 return other 2*f}g~gahfhghihlhnhohrhsh

155 elif order_flag == ORDER_F: 

156 if is_dense and other.get_is_contiguous_f(): 2bhchdhehhhjhkhqdmhtdudwdphydAd8gqhUd+c_cXd9gYd-cZd}c1d3d:cedqerese

157 return other 2bhchdhehhhjhkhmhphqh

158  

159 cdef _StridedLayout new_layout = _StridedLayout.__new__(cls) 2*f-g.g/g:g;g=godpd?gqdrdMdNdsdtdudvdwdOdxd@gydPdQdRdzdAdBdCdDdEd[gFd]g^g8g@cSd_g`g-d[c]cTd^cUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!g:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEeFeGeHeIeJeqeKeLeMereNeOesete

160 new_layout.init_dense_from_ptr( 2-g.g/g:g;g=godpd?gqdrdMdNdsdtdudvdwdOdxd@gydPdQdRdzdAdBdCdDdEd[gFd]g^g8g@cSd_g`g-d[c]cTd^cUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!g:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEeFeGeHeIeJeqeKeLeMereNeOesete

161 other.base.ndim, 

162 other.base.shape, 

163 other.itemsize, 

164 order_flag, 

165 &stride_order_vec 

166 ) 

167 return new_layout 2-g.g/g:g;g=godpd?gqdrdMdNdsdtdudvdwdOdxd@gydPdQdRdzdAdBdCdDdEd[gFd]g^g8g@cSd_g`g-d[c]cTd^cUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!g:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEeFeGeHeIeJeqeKeLeMereNeOesete

168  

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 ) 

178  

179 def __eq__(self : _StridedLayout, other : _StridedLayout) -> bool: 

180 return self.itemsize == other.itemsize and self.slice_offset == other.slice_offset and _base_layout_equal(self.base, other.base) 2)d`d% ' M N c ( d ) G H Ac9cucJcO P vcKc=e+fMc*cNcLcOc(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiiji

181  

182 @property 

183 def ndim(self : _StridedLayout): 

184 """ 

185 The number of dimensions (length of the shape tuple). 

186  

187 :type: int 

188 """ 

189 return self.base.ndim 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f9h%h!h#h'h$h1cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

190  

191 @property 

192 def shape(self : _StridedLayout): 

193 """ 

194 Shape of the tensor. 

195  

196 :type: tuple[int] 

197 """ 

198 return self.get_shape_tuple() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecniki

199  

200 @property 

201 def strides(self : _StridedLayout): 

202 """ 

203 Strides of the tensor (in **counts**, not bytes). 

204 If _StridedLayout was created with strides=None, the 

205 returned value is None and layout is implicitly C-contiguous. 

206  

207 :type: tuple[int] | None 

208 """ 

209 return self.get_strides_tuple() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f#g3g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z :f;f5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijinikioiCgDg

210  

211 @property 

212 def strides_in_bytes(self : _StridedLayout): 

213 """ 

214 Strides of the tensor (in bytes). 

215  

216 :type: tuple[int] | None 

217 """ 

218 return self.get_strides_in_bytes_tuple() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecvgwgEgFgCgDg

219  

220 @property 

221 def stride_order(self : _StridedLayout): 

222 """ 

223 A permutation of ``tuple(range(ndim))`` describing the 

224 relative order of the strides. 

225  

226 .. highlight:: python 

227 .. code-block:: python 

228  

229 # C-contiguous layout 

230 assert _StridedLayout.dense((5, 3, 7), 1).stride_order == (0, 1, 2) 

231 # F-contiguous layout 

232 assert _StridedLayout.dense((5, 3, 7), 1, stride_order="F").stride_order == (2, 1, 0) 

233 # Permuted layout 

234 assert _StridedLayout.dense((5, 3, 7), 1, stride_order=(2, 0, 1)).stride_order == (2, 0, 1) 

235  

236 :type: tuple[int] 

237 """ 

238 return self.get_stride_order_tuple() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H ucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czcHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z TgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

239  

240 @property 

241 def volume(self : _StridedLayout): 

242 """ 

243 The number of elements in the tensor, i.e. the product of the shape tuple. 

244  

245 :type: int 

246 """ 

247 return self.get_volume() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

248  

249 @property 

250 def is_unique(self : _StridedLayout): 

251 """ 

252 If True, each element of a tensor with this layout is mapped to 

253 a unique memory offset. 

254  

255 All contiguous layouts are unique and so are layouts that can be created 

256 by permuting, slicing, flattening, squeezing, repacking, or reshaping 

257 a contiguous layout. 

258 Conversely, broadcast layouts (layouts with a 0 stride 

259 for some extent greater than 1) are not unique. 

260  

261 For layouts resulting from manual stride manipulations 

262 (such as with ``numpy.lib.stride_tricks``), the check 

263 may inaccurately report False, as the exact uniqueness 

264 check may be expensive. 

265  

266 :type: bool 

267 """ 

268 return self.get_is_unique() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

269  

270 @property 

271 def is_contiguous_c(self : _StridedLayout): 

272 """ 

273 True iff the layout is contiguous in C-order, i.e. 

274 the rightmost stride is 1 and each subsequent 

275 stride to the left is the product of the 

276 extent and the stride to the right. 

277  

278 .. highlight:: python 

279 .. code-block:: python 

280  

281 layout = _StridedLayout.dense((2, 5, 3), 1, "C") 

282 assert layout == _StridedLayout((2, 5, 3), (15, 3, 1), 1) 

283 assert layout.is_contiguous_c 

284  

285 See also :attr:`is_contiguous_any`. 

286  

287 :type: bool 

288 """ 

289 return self.get_is_contiguous_c() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

290  

291 @property 

292 def is_contiguous_f(self : _StridedLayout): 

293 """ 

294 True iff the layout is contiguous in F-order, i.e. 

295 the leftmost stride is 1 and each subsequent 

296 stride to the right is the product of the 

297 stride and extent to the left. 

298  

299 .. highlight:: python 

300 .. code-block:: python 

301  

302 layout = _StridedLayout.dense((2, 5, 3), 1, "F") 

303 assert layout == _StridedLayout((2, 5, 3), (1, 2, 10), 1) 

304 assert layout.is_contiguous_f 

305  

306 See also :attr:`is_contiguous_any`. 

307  

308 :type: bool 

309 """ 

310 return self.get_is_contiguous_f() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

311  

312 @property 

313 def is_contiguous_any(self : _StridedLayout): 

314 """ 

315 True iff the layout is contiguous in some axis order, i.e. 

316 there exists a permutation of axes such that the layout 

317 is C-contiguous. 

318  

319 In a contiguous layout, the strides are non-negative and 

320 the mapping of elements to the memory offset range 

321 ``[min_offset, max_offset]`` is 1-to-1. 

322  

323 .. highlight:: python 

324 .. code-block:: python 

325  

326 # dense defaults to C-contiguous 

327 layout = _StridedLayout.dense((5, 3, 7), 1) 

328 assert layout.is_contiguous_c and not layout.is_contiguous_f 

329 assert layout.is_contiguous_any 

330  

331 # reversing the order of axes gives F-contiguous layout 

332 permuted = layout.permuted((2, 1, 0)) 

333 assert not permuted.is_contiguous_c and permuted.is_contiguous_f 

334 assert permuted.is_contiguous_any 

335  

336 # neither C- nor F-order but still contiguous 

337 permuted = layout.permuted((2, 0, 1)) 

338 assert not permuted.is_contiguous_c and not permuted.is_contiguous_f 

339 assert permuted.is_contiguous_any 

340  

341 # slicing the right-most extent creates a gap in the 

342 # offset_bounds range that is not reachable with any 

343 # element in the sliced layout 

344 sliced = layout[:, :, :-1] 

345 assert not sliced.is_contiguous_c and not sliced.is_contiguous_f 

346 assert not sliced.is_contiguous_any 

347  

348 :type: bool 

349 """ 

350 return self.get_is_contiguous_any() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

351  

352 @property 

353 def is_dense(self : _StridedLayout): 

354 """ 

355 A dense layout is contiguous (:attr:`is_contiguous_any` is True) 

356 and has no slice offset (:attr:`slice_offset_in_bytes` is 0). 

357  

358 In a dense layout, elements are mapped 1-to-1 to the ``[0, volume - 1]`` 

359 memory offset range. 

360  

361 :type: bool 

362 """ 

363 return self.get_is_dense() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecvgwgEgFgCgDg

364  

365 @property 

366 def offset_bounds(self : _StridedLayout): 

367 """ 

368 The memory offset range ``[min_offset, max_offset]`` (in element counts, not bytes) 

369 that elements of a tensor with this layout are mapped to. 

370  

371 If the layout is empty (i.e. ``volume == 0``), the returned tuple is ``(0, -1)``. 

372 Otherwise, ``min_offset <= max_offset`` and all elements of the tensor with 

373 this layout are mapped within the ``[min_offset, max_offset]`` range. 

374  

375 .. highlight:: python 

376 .. code-block:: python 

377  

378 # Possible implementation of the offset_bounds 

379 def offset_bounds(layout : _StridedLayout): 

380 if layout.volume == 0: 

381 return 0, -1 

382 ndim = layout.ndim 

383 shape = layout.shape 

384 strides = layout.strides 

385 idx_min = [shape[i] - 1 if strides[i] < 0 else 0 for i in range(ndim)] 

386 idx_max = [shape[i] - 1 if strides[i] > 0 else 0 for i in range(ndim)] 

387 min_offset = sum(strides[i] * idx_min[i] for i in range(ndim)) + layout.slice_offset 

388 max_offset = sum(strides[i] * idx_max[i] for i in range(ndim)) + layout.slice_offset 

389 return min_offset, max_offset 

390  

391 :type: tuple[int, int] 

392 """ 

393 cdef stride_t min_offset = 0 2*fdgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK AbBbCbDbL y z -f:f;f.fgbhbibjbg h i j k l q r EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

394 cdef stride_t max_offset = 0 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK AbBbCbDbL y z -f:f;f.fgbhbibjbg h i j k l q r EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

395 self.get_offset_bounds(min_offset, max_offset) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK AbBbCbDbL y z -f:f;f.fgbhbibjbg h i j k l q r EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

396 return min_offset, max_offset 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK AbBbCbDbL y z -f:f;f.fgbhbibjbg h i j k l q r EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

397  

398 @property 

399 def min_offset(self : _StridedLayout): 

400 """ 

401 See :attr:`offset_bounds` for details. 

402  

403 :type: int 

404 """ 

405 cdef stride_t min_offset = 0 

406 cdef stride_t max_offset = 0 

407 self.get_offset_bounds(min_offset, max_offset) 

408 return min_offset 

409  

410 @property 

411 def max_offset(self : _StridedLayout): 

412 """ 

413 See :attr:`offset_bounds` for details. 

414  

415 :type: int 

416 """ 

417 cdef stride_t min_offset = 0 

418 cdef stride_t max_offset = 0 

419 self.get_offset_bounds(min_offset, max_offset) 

420 return max_offset 

421  

422 @property 

423 def slice_offset_in_bytes(self : _StridedLayout): 

424 """ 

425 The memory offset (as a number of bytes) of the element at index ``(0,) * ndim``. 

426 Equal to :attr:`itemsize` ``*`` :attr:`slice_offset`. 

427  

428 .. note:: 

429 The only way for the index ``(0,) * ndim`` to be mapped to a non-zero offset 

430 is slicing with :meth:`sliced` method (or ``[]`` operator). 

431  

432 :type: int 

433 """ 

434 return self.get_slice_offset_in_bytes() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgyg

435  

436 def required_size_in_bytes(self : _StridedLayout) -> int: 

437 """ 

438 The memory allocation size (in bytes) needed so that 

439 all elements of a tensor with this layout can be mapped 

440 within the allocated memory range. 

441  

442 The function raises an error if ``min_offset < 0``. 

443 Otherwise, the returned value is equal to 

444 ``(max_offset + 1) * itemsize``. 

445  

446 .. hint:: 

447 For dense layouts, the function always succeeds and the 

448 ``(max_offset + 1) * itemsize`` is equal to the ``volume * itemsize``. 

449  

450 .. highlight:: python 

451 .. code-block:: python 

452  

453 # Allocating memory on a device to copy a host tensor 

454 def device_tensor_like(a : numpy.ndarray, device : ccx.Device) -> StridedMemoryView: 

455 a_view = StridedMemoryView(a, -1) 

456 # get the original layout of ``a`` and convert it to a dense layout 

457 # to avoid overallocating memory (e.g. if the ``a`` was sliced) 

458 layout = a_view._layout.to_dense() 

459 # get the required size in bytes to fit the tensor 

460 required_size = layout.required_size_in_bytes() 

461 # allocate the memory on the device 

462 device.set_current() 

463 mem = device.allocate(required_size) 

464 # create a view on the newly allocated device memory 

465 b_view = StridedMemoryView.from_buffer(mem, layout, a_view.dtype) 

466 return b_view 

467 """ 

468 return self.get_required_size_in_bytes() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGcUhVhWhXhYhZh0h1h2h3h)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOcsgtgug; = ? !c#c$ca b 2 3 4 5 6 7 jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK AbBbCbDbL y z -f:f;f.fgbhbibjbg h i j k l q r EbFb=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.emgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijilimixgygoivgwgEgFg

469  

470 def flattened_axis_mask(self : _StridedLayout) -> axes_mask_t: 

471 """ 

472 A mask describing which axes of this layout are mergeable 

473 using the :meth:`flattened` method. 

474 """ 

475 return self.get_flattened_axis_mask() 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc

476  

477 def to_dense(self : _StridedLayout, object stride_order="K") -> _StridedLayout: 

478 """ 

479 Returns a dense layout with the same shape and itemsize, 

480 but with dense strides in the specified order. 

481  

482 See :meth:`dense_like` method documentation for details. 

483 """ 

484 return _StridedLayout.dense_like(self, stride_order) 2}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhodpd?gkhqdlhrdMdzhNdsdmhtdudnhvdwdOdxd@gohphydPdAhQdRdzdAdBdCdDdEd[gBhFd]g^g8g@cqhSd_g`g-d[c]cTd^crhUdVd+c,cWdfd_cXd`c9gYd{c-c.c.dZdgd|c}c/d{g|g!gCh:dhd~c;dDh0d=d1dEh?d2did@dad/c3d[dbd:csh]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?cxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

485  

486 def reshaped(self : _StridedLayout, shape : tuple[int]) -> _StridedLayout: 

487 """ 

488 Returns a layout with the new shape, if the new shape is compatible 

489 with the current layout. 

490  

491 The new shape is compatible if: 

492 * the new and old shapes have the same volume 

493 * the old strides can be split or flattened to match the new shape, 

494 assuming indices are iterated in C-order 

495  

496 A single extent in the ``shape`` tuple can be set to -1 to indicate 

497 it should be inferred from the old volume and the other extents. 

498  

499 .. highlight:: python 

500 .. code-block:: python 

501  

502 layout = _StridedLayout.dense((5, 3, 4), 1) 

503 assert layout.reshaped((20, 3)) == _StridedLayout.dense((20, 3), 1) 

504 assert layout.reshaped((4, -1)) == _StridedLayout.dense((4, 15), 1) 

505 assert layout.permuted((2, 0, 1)).reshaped((4, 15,)) == _StridedLayout((4, 15), (1, 4), 1) 

506 # layout.permuted((2, 0, 1)).reshaped((20, 3)) -> error 

507 """ 

508 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 21cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb

509 cdef BaseLayout new_shape 

510 init_base_layout(new_shape, len(shape)) 21cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb

511 for i in range(len(shape)): 21cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb

512 new_shape.shape[i] = shape[i] 21cwcxcyc2czc/f#g,f?e3gVg4g^eSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb

513 self.reshape_into(new_layout, new_shape) 21cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb

514 return new_layout 21cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK AbBbCbDbL y z -f:f;f.fgbhbibjbg h i j k l q r EbFb

515  

516 def permuted(self : _StridedLayout, axis_order : tuple[int]) -> _StridedLayout: 

517 """ 

518 Returns a new layout where the shape and strides tuples are permuted 

519 according to the specified permutation of axes. 

520 """ 

521 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f9h%h!h#h'h$h4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

522 cdef axis_vec_t axis_order_vec 

523 _tuple2axis_vec(axis_order_vec, axis_order) 2*fc ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f9h%h!h#h'h$h4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

524 self.permute_into(new_layout, axis_order_vec) 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f9h%h!h#h'h$h4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

525 return new_layout 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

526  

527 def flattened(self : _StridedLayout, start_axis : int = 0, end_axis : int = -1, mask : int | None = None) -> _StridedLayout: 

528 """ 

529 Merges consecutive extents into a single extent (equal to the product of merged extents) 

530 if the corresponding strides can be replaced with a single stride 

531 (assuming indices are iterated in C-order, i.e. the rightmost 

532 axis is incremented first). 

533  

534 .. highlight:: python 

535 .. code-block:: python 

536  

537 # the two extents can be merged into a single extent 

538 # because layout.strides[0] == layout.strides[1] * layout.shape[1] 

539 layout = _StridedLayout((3, 2), (2, 1), 1) 

540 assert layout.flattened() == _StridedLayout((6,), (1,), 1) 

541  

542 # the two extents cannot be merged into a single extent 

543 # because layout.strides[0] != layout.strides[1] * layout.shape[1] 

544 layout = _StridedLayout((3, 2), (1, 3), 1) 

545 assert layout.flattened() == layout 

546  

547 If ``start_axis`` and ``end_axis`` are provided, only the axes in the 

548 inclusive range ``[start_axis, end_axis]`` are considered for flattening. 

549  

550 Alternatively, a mask specifying which axes to consider can be provided. 

551 A mask of mergeable extents can be obtained using the :meth:`flattened_axis_mask` method. 

552 Masks for layouts with the same number of dimensions can be combined 

553 using the logical ``&`` (bitwise AND) operator. 

554  

555 .. highlight:: python 

556 .. code-block:: python 

557  

558 layout = _StridedLayout.dense((4, 5, 3), 4) 

559 layout2 = _StridedLayout((4, 5, 3), (1, 12, 4), 4) 

560 # Even though the two layouts have the same shape initially, 

561 # their shapes differ after flattening. 

562 assert layout.flattened() == _StridedLayout((60,), (1,), 4) 

563 assert layout2.flattened() == _StridedLayout((4, 15), (1, 4), 4) 

564 # With the mask, only extents that are mergeable in both layouts are flattened 

565 # and the resulting shape is the same for both layouts. 

566 mask = layout.flattened_axis_mask() & layout2.flattened_axis_mask() 

567 assert layout.flattened(mask=mask) == _StridedLayout((4, 15), (15, 1), 4) 

568 assert layout2.flattened(mask=mask) == _StridedLayout((4, 15), (1, 4), 4) 

569 """ 

570 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc

571 cdef axes_mask_t axis_mask 

572 if mask is None: 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc

573 axis_mask = axis_mask_from_range(self.ndim, start_axis, end_axis) 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc

574 else: 

575 axis_mask = mask 2)d`d% ' M N c ( d ) G H Ac9cucJcO P vcKc=e+fMc*cNcLcOc

576 self.flatten_into(new_layout, axis_mask) 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc

577 return new_layout 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc

578  

579 def squeezed(self : _StridedLayout) -> _StridedLayout: 

580 """ 

581 Returns a new layout where all the singleton dimensions (extents equal to 1) 

582 are removed. Additionally, if the layout volume is 0, 

583 the returned layout will be reduced to a 1-dim layout 

584 with shape (0,) and strides (0,). 

585 """ 

586 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f

587 self.squeeze_into(new_layout) 2*fmgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f

588 return new_layout 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f

589  

590 def unsqueezed(self : _StridedLayout, axis : int | tuple[int]) -> _StridedLayout: 

591 """ 

592 Returns a new layout where the specified axis or axes are added as singleton extents. 

593 The ``axis`` can be either a single integer in range ``[0, ndim]`` 

594 or a tuple of unique integers in range ``[0, ndim + len(axis) - 1]``. 

595 """ 

596 cdef axis_vec_t axis_vec 

597 if isinstance(axis, int): 2{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

598 axis_vec.push_back(axis) 

599 else: 

600 _tuple2axis_vec(axis_vec, axis) 2{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

601 if axis_vec.size() == 0: 2{d|dIh}d~daeJhbeKhLhld!d#dGdHd$dId%dJdmdKdMh'dnd(dLdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

602 return self 2IhJhKhLhMhNhuevewe

603 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

604 self.unsqueeze_into(new_layout, axis_vec) 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

605 return new_layout 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

606  

607 def broadcast_to(self : _StridedLayout, shape : tuple[int]) -> _StridedLayout: 

608 """ 

609 Returns a layout with the new shape, if the old shape can be 

610 broadcast to the new one. 

611  

612 The shapes are compatible if: 

613 * the new shape has the same or greater number of dimensions 

614 * starting from the right, each extent in the old shape must be 1 or 

615 equal to the corresponding extent in the new shape. 

616  

617 Strides of the added or modified extents are set to 0, the remaining ones are unchanged. 

618 If the shapes are not compatible, a ValueError is raised. 

619 """ 

620 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc

621 cdef BaseLayout new_shape 

622 cdef int new_ndim = len(shape) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc

623 init_base_layout(new_shape, new_ndim) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc

624 for i in range(new_ndim): 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc

625 new_shape.shape[i] = shape[i] 2dgegfggghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc

626 self.broadcast_into(new_layout, new_shape) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc

627 return new_layout 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc

628  

629 def repacked(self : _StridedLayout, itemsize : int, data_ptr : intptr_t = 0, axis : int = -1, keep_dim : bool = True) -> _StridedLayout: 

630 """ 

631 Converts the layout to match the specified itemsize. 

632 If ``new_itemsize < itemsize``, each element of the tensor is **unpacked** into multiple elements, 

633 i.e. the extent at ``axis`` increases by the factor ``itemsize // new_itemsize``. 

634 If ``new_itemsize > itemsize``, the consecutive elements in the tensor are **packed** into a single element, 

635 i.e. the extent at ``axis`` decreases by the factor ``new_itemsize // itemsize``. 

636 In either case, the ``volume * itemsize`` of the layout remains the same. 

637  

638 The conversion is subject to the following constraints: 

639 * The extent at ``axis`` must be a positive integer. 

640 * The stride at ``axis`` must be 1. 

641  

642 Moreover, if the ``new_itemsize > itemsize``: 

643 * The extent at ``axis`` must be divisible by ``new_itemsize // itemsize``. 

644 * All other strides must be divisible by ``new_itemsize // itemsize``. 

645 * The ``slice_offset`` must be divisible by ``new_itemsize // itemsize``. 

646 * If ``data_ptr`` is provided, it must be aligned to the new itemsize. 

647  

648 The maximum itemsize that satisfies all the constraints 

649 can be obtained using the :meth:`max_compatible_itemsize` method. 

650  

651 If the ``keep_dim`` is False and the extent at ``axis`` would be reduced to 1, 

652 it is omitted from the returned layout. 

653  

654 .. highlight:: python 

655 .. code-block:: python 

656  

657 # Repacking the layout with itemsize = 4 bytes as 2, 8, and 16 sized layouts. 

658 layout = _StridedLayout.dense((5, 4), 4) 

659 assert layout.repacked(2) == _StridedLayout.dense((5, 8), 2) 

660 assert layout.repacked(8) == _StridedLayout.dense((5, 2), 8) 

661 assert layout.repacked(16) == _StridedLayout.dense((5, 1), 16) 

662 assert layout.repacked(16, keep_dim=False) == _StridedLayout.dense((5,), 16) 

663  

664  

665 .. highlight:: python 

666 .. code-block:: python 

667  

668 # Viewing (5, 6) float array as (5, 3) complex64 array. 

669 a = numpy.ones((5, 6), dtype=numpy.float32) 

670 float_view = StridedMemoryView(a, -1) 

671 layout = float_view._layout 

672 assert layout.shape == (5, 6) 

673 assert layout.itemsize == 4 

674 complex_view = float_view.view(layout.repacked(8), numpy.complex64) 

675 assert complex_view._layout.shape == (5, 3) 

676 assert complex_view._layout.itemsize == 8 

677 b = numpy.from_dlpack(complex_view) 

678 assert b.shape == (5, 3) 

679 """ 

680  

681 if itemsize == self.itemsize: 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7

682 return self 2sgtgug!c#c$c

683 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 2*f; = ? a b 2 3 4 5 6 7

684 if itemsize > self.itemsize: 1;=?ab234567

685 self.pack_into(new_layout, itemsize, data_ptr, keep_dim, axis) 1;=?ab234567

686 else: 

687 self.unpack_into(new_layout, itemsize, axis) 1;=?ab234567

688 return new_layout 1;=?ab234567

689  

690 def max_compatible_itemsize(self : _StridedLayout, max_itemsize : int = 16, data_ptr : intptr_t = 0, axis : int = -1) -> int: 

691 """ 

692 Returns the maximum itemsize (but no greater than ``max_itemsize``) that can be used 

693 with the :meth:`repacked` method for the current layout. 

694 """ 

695 return self.get_max_compatible_itemsize(max_itemsize, data_ptr, axis) 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7

696  

697 def sliced(self : _StridedLayout, slices : int | slice | tuple[int | slice]) -> _StridedLayout: 

698 """ 

699 Returns a sliced layout. 

700 The ``slices`` parameter can be a single integer, a single :py:class:`slice` object 

701 or a tuple of integers/slices. 

702  

703 .. hint:: 

704 For convenience, instead of calling this method directly, please rely 

705 on the :py:meth:`~object.__getitem__` operator (i.e. bracket syntax), e.g.: 

706 ``layout[:, start:end:step]``. 

707  

708 .. note:: 

709 Slicing is purely a layout transformation and does not involve 

710 any data access. 

711  

712 """ 

713 if not isinstance(slices, tuple): 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

714 slices = (slices,) 2% ' c d (cnc)cscoctcu v w x PeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheKgQg%eRgMg'eSgPg(e)e*e+eodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd^c+c,c`c{c-c.cad/cbd:ccd;c=c?cCgDg

715 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

716 self.slice_into(new_layout, slices) 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

717 return new_layout 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

718  

719 def __getitem__(self : _StridedLayout, slices : int | slice | tuple[int | slice]) -> _StridedLayout: 

720 return self.sliced(slices) 2=f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.exgygvgwgEgFgCgDg

721  

722 cdef axes_mask_t get_flattened_axis_mask(_StridedLayout self) except? -1 nogil: 

723 return flattened_strides_in_c_index_order_mask(self.base) 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc

724  

725 cdef int get_max_compatible_itemsize(_StridedLayout self, int max_itemsize, intptr_t data_ptr, int axis=-1) except -1 nogil: 

726 return max_compatible_itemsize(self.base, self.slice_offset, self.itemsize, max_itemsize, data_ptr, axis) 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7

727  

728 cdef int reshape_into(_StridedLayout self, _StridedLayout out_layout, BaseLayout& new_shape) except -1 nogil: 

729 cdef int64_t old_volume = self.get_volume() 21cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb

730  

731 validate_reshaped_shape(new_shape, old_volume) 21cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb

732 _zero_strides(new_shape) 21cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.fgbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

733  

734 cdef BaseLayout flattened 

735 if old_volume != 0: 21cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.fgbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

736 flatten_strides_in_c_index_order(flattened, self.base, axis_mask_from_range(self.base.ndim, 0, -1)) 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

737 if not split_strides_in_c_index_order(new_shape, flattened): 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

738 raise ValueError("Layout strides are incompatible with the new shape") 1UV*,W0#+$-1XeYQfZRST

739  

740 # Reset all memoized properties 

741 out_layout._prop_mask = 0 21cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK AbBbCbDbL y z -f:f;f.fgbhbibjbg h i j k l q r EbFb

742  

743 # Copy preserved attributes 

744 out_layout.slice_offset = self.slice_offset 21cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK AbBbCbDbL y z -f:f;f.fgbhbibjbg h i j k l q r EbFb

745 out_layout.itemsize = self.itemsize 21cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK AbBbCbDbL y z -f:f;f.fgbhbibjbg h i j k l q r EbFb

746 maybe_copy_volume(out_layout, self) 21cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK AbBbCbDbL y z -f:f;f.fgbhbibjbg h i j k l q r EbFb

747  

748 # Set new attributes 

749 _swap_layout(out_layout.base, new_shape) 21cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK AbBbCbDbL y z -f:f;f.fgbhbibjbg h i j k l q r EbFb

750 return 0 21cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK AbBbCbDbL y z -f:f;f.fgbhbibjbg h i j k l q r EbFb

751  

752 cdef int permute_into(_StridedLayout self, _StridedLayout out_layout, axis_vec_t& axis_order) except -1 nogil: 

753 if axis_order.size() != <size_t>self.base.ndim: 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f9h%h!h#h'h$h4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

754 raise ValueError(f"Permutation must have the same length as the number of dimensions, got {axis_order.size()} for {self.ndim}D tensor.") 29h%h!h#h'h$h

755  

756 cdef BaseLayout permuted 

757 permute_extents(permuted, self.base, axis_order) 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

758  

759 # Reset all memoized properties 

760 out_layout._prop_mask = 0 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

761  

762 # Preserved attributes 

763 out_layout.itemsize = self.itemsize 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

764 out_layout.slice_offset = self.slice_offset 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

765 maybe_copy_volume(out_layout, self) 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

766  

767 # Set new attributes 

768 _swap_layout(out_layout.base, permuted) 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

769 return 0 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

770  

771 cdef int flatten_into(_StridedLayout self, _StridedLayout out_layout, axes_mask_t axis_mask) except -1 nogil: 

772 cdef BaseLayout flattened 

773 cdef int ndim = flatten_strides_in_c_index_order(flattened, self.base, axis_mask) 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc

774  

775 if out_layout is self and ndim == self.base.ndim: 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc

776 return 0 

777  

778 # Reset all memoized properties 

779 out_layout._prop_mask = 0 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc

780  

781 # Preserved attributes 

782 out_layout.itemsize = self.itemsize 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc

783 out_layout.slice_offset = self.slice_offset 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc

784 maybe_copy_volume(out_layout, self) 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc

785  

786 # Set new attributes 

787 _swap_layout(out_layout.base, flattened) 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc

788 return 0 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc

789  

790 cdef int squeeze_into(_StridedLayout self, _StridedLayout out_layout) except -1 nogil: 

791 cdef BaseLayout squeezed 

792 squeeze_extents(squeezed, self.base) 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f

793  

794 if out_layout is self and squeezed.ndim == self.base.ndim: 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f

795 return 0 

796  

797 # Reset all memoized properties 

798 out_layout._prop_mask = 0 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f

799  

800 # Preserved attributes 

801 out_layout.itemsize = self.itemsize 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f

802 out_layout.slice_offset = self.slice_offset 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f

803 maybe_copy_volume(out_layout, self) 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f

804  

805 # Set new attributes 

806 _swap_layout(out_layout.base, squeezed) 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f

807 return 0 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f

808  

809 cdef int unsqueeze_into(_StridedLayout self, _StridedLayout out_layout, axis_vec_t& axis_vec) except -1 nogil: 

810 if axis_vec.size() == 0 and self is out_layout: 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

811 return 0 

812  

813 cdef BaseLayout unsqueezed 

814 unsqueeze_extents(unsqueezed, self.base, axis_vec) 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

815  

816 # Reset all memoized properties 

817 out_layout._prop_mask = 0 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

818  

819 # Preserved attributes 

820 out_layout.itemsize = self.itemsize 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

821 out_layout.slice_offset = self.slice_offset 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

822 maybe_copy_volume(out_layout, self) 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

823  

824 # Set new attributes 

825 _swap_layout(out_layout.base, unsqueezed) 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

826 return 0 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

827  

828 cdef int broadcast_into(_StridedLayout self, _StridedLayout out_layout, BaseLayout& broadcast) except -1 nogil: 

829 _validate_shape(broadcast) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc

830 broadcast_extents(broadcast, self.base) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc

831  

832 # Reset all memoized properties 

833 out_layout._prop_mask = 0 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc

834  

835 # Preserved attributes 

836 out_layout.itemsize = self.itemsize 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc

837 out_layout.slice_offset = self.slice_offset 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc

838  

839 # Set new attributes 

840 _swap_layout(out_layout.base, broadcast) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc

841 return 0 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc

842  

843 cdef int pack_into(_StridedLayout self, _StridedLayout out_layout, int itemsize, intptr_t data_ptr, bint keep_dim, int axis=-1) except -1 nogil: 

844  

845 cdef BaseLayout packed 

846 cdef stride_t new_slice_offset = 0 1;=?ab234567

847 cdef int vec_size = pack_extents( 1;=?ab234567

848 packed, 

849 new_slice_offset, 

850 self.base, 

851 self.slice_offset, 

852 self.itemsize, 

853 itemsize, 

854 data_ptr, 

855 keep_dim, 

856 axis 

857 ) 

858  

859 if vec_size == 1 and out_layout is self: 1;=?ab234567

860 return 0 

861  

862 # Reset all memoized properties 

863 out_layout._prop_mask = 0 1;=?ab234567

864  

865 # Set new attributes 

866 out_layout.itemsize = itemsize 1;=?ab234567

867 out_layout.slice_offset = new_slice_offset 1;=?ab234567

868 _swap_layout(out_layout.base, packed) 1;=?ab234567

869 return vec_size 1;=?ab234567

870  

871 cdef int unpack_into(_StridedLayout self, _StridedLayout out_layout, int itemsize, int axis=-1) except -1 nogil: 

872 cdef BaseLayout unpacked 

873 cdef int vec_size = unpack_extents( 1;=?ab234567

874 unpacked, 

875 self.base, 

876 self.itemsize, 

877 itemsize, 

878 axis 

879 ) 

880 if vec_size == 1 and out_layout is self: 1;=?ab234567

881 return 0 

882  

883 cdef int64_t new_slice_offset = _overflow_checked_mul(self.slice_offset, vec_size) 1;=?ab234567

884  

885 # Reset all memoized properties 

886 out_layout._prop_mask = 0 1;=?ab234567

887  

888 # Set new attributes 

889 out_layout.itemsize = itemsize 1;=?ab234567

890 out_layout.slice_offset = new_slice_offset 1;=?ab234567

891 _swap_layout(out_layout.base, unpacked) 1;=?ab234567

892 return vec_size 1;=?ab234567

893  

894 cdef int slice_into(_StridedLayout self, _StridedLayout out_layout, tuple slices) except -1: 

895 cdef BaseLayout sliced 

896 cdef stride_t slice_offset = slice_extents(sliced, self.base, slices) 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

897 cdef int64_t new_slice_offset = _overflow_checked_sum(self.slice_offset, slice_offset) 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

898  

899 # Reset all memoized properties 

900 out_layout._prop_mask = 0 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

901  

902 # Preserved attributes 

903 out_layout.itemsize = self.itemsize 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

904  

905 # Set new attributes 

906 _swap_layout(out_layout.base, sliced) 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

907 out_layout.slice_offset = new_slice_offset 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

908 return 0 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

909  

910cdef inline int maybe_copy_volume(_StridedLayout out_layout, _StridedLayout in_layout) except -1 nogil: 

911 if _has_valid_property(in_layout, PROP_VOLUME): 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOca b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.fgbhbibjbe g h i j f k l q r EbFbmgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%fxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

912 out_layout._volume = in_layout.get_volume() 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOca b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.fgbhbibjbe g h i j f k l q r EbFbmgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%fxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

913 _mark_property_valid(out_layout, PROP_VOLUME) 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOca b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.fgbhbibjbe g h i j f k l q r EbFbmgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%fxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

914 return 0 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOca b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f1cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.fgbhbibjbe g h i j f k l q r EbFbmgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%fxeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

915  

916  

917cdef inline int validate_reshaped_shape(BaseLayout& new_shape, int64_t old_volume) except -1 nogil: 

918 cdef int ndim = new_shape.ndim 21cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb

919 cdef int axis = -1 21cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb

920 cdef extent_t extent 

921 for i in range(ndim): 21cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb

922 extent = new_shape.shape[i] 21cwcxcyc2czc/f#g,f?e3gVg4g^eSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb

923 if extent < -1: 21cwcxcyc2czc/f#g,f?e3gVg4g^eSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j Y Q f k Z R l q S r T EbFb

924 raise ValueError("Extents must be non-negative") 2$g%g6g'g7g(g)g*g+g,g

925 elif extent == -1: 21cwcxcyc2czc/f#g,f?e3gVg4g^eSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHg6g7g1g2ghbIgibjbUgJge g h i j Y Q f k Z R l q S r T EbFb

926 if axis == -1: 2wcxcyczc?e3gVg^eSbTbncoc@ [ ] ^ _ ` { | } ~ abbbcbdbebfb0g5gTgGggbHg1g2ghbIgibjbUgJg

927 axis = i 2wcxcyczc?e3gVg^eSbTbncoc@ [ ] ^ _ ` { | } ~ abbbcbdbebfb0g5gTgGggbHg1g2ghbIgibjbUgJg

928 else: 

929 raise ValueError("There can be at most one -1 extent in a shape") 21g2g

930 cdef int64_t new_volume = _c_abs(_volume(new_shape)) 21cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHghbIgibjbUgJge g h i j Y Q f k Z R l q S r T EbFb

931 if axis == -1: 21cwc%cxcyc2c'czc/f#g,f?e3gVg4g^eHcIcSbTb(cnc)cscoctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.f0g5gTgGggbHghbIgibjbUgJge g h i j Y Q f k Z R l q S r T EbFb

932 if new_volume != old_volume: 21c%c2c'c/f#g,f4gHcIc(c)csctcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbU s V t qbrbsbtbubvbwbxbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.fe g h i j Y Q f k Z R l q S r T EbFb

933 raise ValueError(f"The original volume {old_volume} and the new volume {new_volume} must be equal.") 2#g4g(c)cWgXgYgZg

934 else: 

935 if new_volume == 0: 2wcxcyczc?e3gVg^eSbTbncoc@ [ ] ^ _ ` { | } ~ abbbcbdbebfb0g5gTgGggbHghbIgibjbUgJg

936 raise ValueError("The -1 extent is ambiguous when the specified sub-volume is 0") 23gVg0g5gTgUg

937 extent = old_volume // new_volume 2wcxcyczc?e^eSbTbncoc@ [ ] ^ _ ` { | } ~ abbbcbdbebfbGggbHghbIgibjbJg

938 if extent * new_volume != old_volume: 2wcxcyczc?e^eSbTbncoc@ [ ] ^ _ ` { | } ~ abbbcbdbebfbGggbHghbIgibjbJg

939 raise ValueError(f"The original volume {old_volume} must be divisible by the specified sub-volume {new_volume}.") 2GgHgIgJg

940 new_shape.shape[axis] = extent 2wcxcyczc?e^eSbTbncoc@ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjb

941 return 0 21cwc%cxcyc2c'czc/f,f?e^eHcIcSbTbncscoctcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z -f:f;f.fgbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

942  

943  

944cdef inline axes_mask_t axis_mask_from_range(int ndim, int start_axis, int end_axis) except? -1 nogil: 

945 cdef axes_mask_t axes_mask = flatten_all_axes_mask(ndim) 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc1cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

946 if start_axis == 0 and end_axis == -1: 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc1cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

947 return axes_mask 2)d`d% ' M N c ( d ) G H Ac9cucJcO P vcKc1cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

948 if not _normalize_axis(start_axis, ndim): 1ABCDIEFJ

949 raise ValueError(f"Invalid start axis: {start_axis} out of range for {ndim}D tensor") 

950 if not _normalize_axis(end_axis, ndim): 1ABCDIEFJ

951 raise ValueError(f"Invalid end axis: {end_axis} out of range for {ndim}D tensor") 

952 if start_axis > 0: 1ABCDIEFJ

953 axes_mask &= (AXES_MASK_ALL << start_axis) 1ABCDEF

954 if end_axis < ndim: 1ABCDIEFJ

955 axes_mask &= (AXES_MASK_ALL >> (STRIDED_LAYOUT_MAX_NDIM - end_axis - 1)) 1ABCDIEFJ

956 return axes_mask 1ABCDIEFJ

957  

958  

959cdef inline int flatten_strides_in_c_index_order(BaseLayout& out_layout, BaseLayout& in_layout, axes_mask_t axis_mask) except -1 nogil: 

960 cdef int ndim = in_layout.ndim 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc1cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

961 if ndim == 0: 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc1cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

962 init_base_layout(out_layout, 1) 2)d`d=e+f1cwc%cxcyc2c'czc

963 out_layout.shape[0] = 1 2)d`d=e+f1cwc%cxcyc2c'czc

964 out_layout.strides[0] = 1 2)d`d=e+f1cwc%cxcyc2c'czc

965 return 1 2)d`d=e+f1cwc%cxcyc2c'czc

966 init_base_layout(out_layout, ndim) 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

967 cdef int group_start = 0 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

968 cdef int group_end = 0 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

969 cdef int64_t group_vol 

970 cdef int64_t group_stride 

971 cdef int out_i = 0 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

972 cdef extent_t* in_shape = in_layout.shape 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

973 cdef stride_t* in_strides = get_strides_ptr(in_layout) 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

974 while group_start < ndim: 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

975 group_vol = in_shape[group_start] 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

976 group_stride = in_strides[group_start] 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

977 group_end = group_start + 1 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

978 while ( 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

979 group_end < ndim 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

980 and (axis_mask & _axis2mask(group_end)) 2M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

981 and group_stride == _overflow_checked_mul(in_strides[group_end], in_shape[group_end]) 2M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcm n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

982 ): 

983 group_vol = _overflow_checked_mul(group_vol, in_shape[group_end]) 2M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcm n kblbmbnbobpb@ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybW 0 zbAbBbCb1 DbX y z gbhbibjbg h i j Q k R l q S r T EbFb

984 group_stride = in_strides[group_end] 2M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcm n kblbmbnbobpb@ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybW 0 zbAbBbCb1 DbX y z gbhbibjbg h i j Q k R l q S r T EbFb

985 group_end += 1 2M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcm n kblbmbnbobpb@ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybW 0 zbAbBbCb1 DbX y z gbhbibjbg h i j Q k R l q S r T EbFb

986 out_layout.shape[out_i] = group_vol 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

987 out_layout.strides[out_i] = group_stride 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

988 out_i += 1 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

989 group_start = group_end 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

990 if out_i != ndim: 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

991 trim_base_layout(out_layout, out_i) 2M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcm n kblbmbnbobpb@ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybW 0 zbAbBbCb1 DbX y z gbhbibjbg h i j Q k R l q S r T EbFb

992 return out_i 2% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMc*cNcLcOcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

993  

994  

995cdef inline axes_mask_t flattened_strides_in_c_index_order_mask(BaseLayout& layout) except? -1 nogil: 

996 if layout.strides == NULL: 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=e+fMc*cNcLcOc

997 return flatten_all_axes_mask(layout.ndim) 2)d9cJcKc+f*cLc

998 cdef axes_mask_t axis_mask = 0 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=eMcNcLcOc

999 cdef int ndim = layout.ndim 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=eMcNcLcOc

1000 cdef int group_start = 0 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=eMcNcLcOc

1001 cdef int group_end = 0 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=eMcNcLcOc

1002 cdef int64_t group_vol 

1003 cdef int64_t group_stride 

1004 while group_start < ndim: 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=eMcNcLcOc

1005 group_vol = layout.shape[group_start] 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMcNcLcOc

1006 group_stride = layout.strides[group_start] 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMcNcLcOc

1007 group_end = group_start + 1 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMcNcLcOc

1008 while group_end < ndim and group_stride == layout.strides[group_end] * layout.shape[group_end]: 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMcNcLcOc

1009 group_vol = _overflow_checked_mul(group_vol, layout.shape[group_end]) 2M N c ( d ) G H AcucA B C D I O P E F J vcMcNcLcOc

1010 group_stride = layout.strides[group_end] 2M N c ( d ) G H AcucA B C D I O P E F J vcMcNcLcOc

1011 axis_mask |= _axis2mask(group_end) 2M N c ( d ) G H AcucA B C D I O P E F J vcMcNcLcOc

1012 group_end += 1 2M N c ( d ) G H AcucA B C D I O P E F J vcMcNcLcOc

1013 group_start = group_end 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKcMcNcLcOc

1014 return axis_mask 2)d`d% ' M N c ( d ) G H Ac9cucJcA B C D I O P E F J vcKc=eMcNcLcOc

1015  

1016  

1017cdef inline bint split_strides_in_c_index_order(BaseLayout& out_layout, BaseLayout& in_layout) except -1 nogil: 

1018 cdef int i = in_layout.ndim - 1 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

1019 cdef int new_i = out_layout.ndim - 1 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

1020 cdef extent_t extent 

1021 cdef extent_t new_extent 

1022 cdef extent_t group_vol 

1023 cdef stride_t group_stride 

1024 cdef extent_t* in_shape = in_layout.shape 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

1025 cdef stride_t* in_strides = get_strides_ptr(in_layout) 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

1026 if out_layout.strides == NULL: 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

1027 _zero_strides(out_layout) 

1028 while i >= 0: 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

1029 extent = in_shape[i] 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

1030 group_stride = in_strides[i] 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

1031 group_vol = 1 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

1032 while new_i >= 0: 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

1033 new_extent = out_layout.shape[new_i] 21cwcxcyc2czcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

1034 if new_extent == 0: 21cwcxcyc2czcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

1035 return False 

1036 if new_extent == 1 or group_vol < extent: 21cwcxcyc2czcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

1037 out_layout.strides[new_i] = group_stride 21cwcxcyc2czcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

1038 group_stride = _overflow_checked_mul(group_stride, new_extent) 21cwcxcyc2czcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

1039 group_vol = _overflow_checked_mul(group_vol, new_extent) 21cwcxcyc2czcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

1040 new_i -= 1 21cwcxcyc2czcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

1041 else: 

1042 break 1UsVt*WK#+$LXyzeghijQfkRlST

1043 if group_vol != extent: 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbU s V t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , W 0 zbK Ab# BbCb+ $ - 1 DbL X y z gbhbibjbe g h i j Y Q f k Z R l q S r T EbFb

1044 return False 1UV*,W0#+$-1XeYQfZRST

1045 i -= 1 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK Ab# BbCb$ DbL y z gbhbibjbe g h i j f k l q r EbFb

1046 return True 21cwc%cxcyc2c'czcHcIcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbK AbBbCbDbL y z gbhbibjbg h i j k l q r EbFb

1047  

1048  

1049cdef inline int permute_extents(BaseLayout& out_layout, BaseLayout& in_layout, axis_vec_t& axis_order) except -1 nogil: 

1050 cdef int ndim = in_layout.ndim 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

1051 init_base_layout(out_layout, ndim) 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

1052 cdef axis_t axis 

1053 cdef axes_mask_t axis_mask 

1054 cdef axes_mask_t axis_order_mask = 0 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

1055 cdef extent_t* in_shape = in_layout.shape 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

1056 cdef stride_t* in_strides = get_strides_ptr(in_layout) 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

1057  

1058 for i in range(ndim): 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

1059 axis = axis_order[i] 2c ( d ) a b _e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

1060 if not _normalize_axis(axis, ndim): 2c ( d ) a b _e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

1061 raise ValueError(f"Invalid permutation: axis {axis} out of range for {ndim}D tensor") 2Qh5h6hRhShTh

1062 axis_mask = _axis2mask(axis) 2c ( d ) a b _e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

1063 if axis_order_mask & axis_mask: 2c ( d ) a b _e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

1064 raise ValueError(f"Invalid permutation: axis {axis_order[i]} appears multiple times.") 24hOhPh

1065 axis_order_mask |= axis_mask 2c ( d ) a b _e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

1066 out_layout.shape[i] = in_shape[axis] 2c ( d ) a b _e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

1067 out_layout.strides[i] = in_strides[axis] 2c ( d ) a b _e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f4hOhPhQh5h6hRhShTh* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

1068 return 0 2c ( d ) a b jgkglg_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f* , W 0 K # + $ - 1 L X y z e f 8 9 . ! / : xeyezeAeBeoeCepeDeEe/eFe:eGeHe;eIeJeqeKeLeMereNeOesete

1069  

1070  

1071cdef inline stride_t slice_extents(BaseLayout& out_layout, BaseLayout& in_layout, tuple slices) except? -1: 

1072 cdef int ndim = in_layout.ndim 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1073 cdef int num_slices = len(slices) 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1074 if num_slices > ndim: 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeFhGheeHhheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1075 raise ValueError(f"The number of slices ({num_slices}) is greater than the number of dimensions ({ndim}).") 2FhGhHh

1076 init_base_layout(out_layout, ndim) 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1077 cdef extent_t* in_shape = in_layout.shape 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1078 cdef stride_t* in_strides = get_strides_ptr(in_layout) 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1079 cdef stride_t slice_offset = 0 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1080 cdef Py_ssize_t start 

1081 cdef Py_ssize_t stop 

1082 cdef Py_ssize_t step 

1083 cdef extent_t new_extent 

1084 cdef object py_slice 

1085 cdef bint zero_slice = False 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1086 cdef int out_i = 0 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1087 for i in range(num_slices): 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1088 py_slice = slices[i] 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T PeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1089 if isinstance(py_slice, int): 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T PeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheie@e[eKgQg]e%eRgLgjekeMgNgle'eSgOgmePgne(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1090 start = py_slice 2ie@e[eKg]e%eLgjekeMgNgle'eOgmePgne(e)e*e*d+e+d,dvgwg

1091 if not _normalize_axis(start, in_shape[i]): 2ie@e[eKg]e%eLgjekeMgNgle'eOgmePgne(e)e*e*d+e+d,dvgwg

1092 raise ValueError(f"Invalid index: {start} out of range for axis {i} with extent {in_shape[i]}") 2KgLgMgNgOgPg

1093 # single element index removes extent from the shape, 

1094 # just increase the offset and skip the shape and stride 

1095 slice_offset = _overflow_checked_sum(slice_offset, _overflow_checked_mul(start, in_strides[i])) 2ie@e[e]e%eLgjekeNgle'eOgmene(e)e*e*d+e+d,dvgwg

1096 elif isinstance(py_slice, slice): 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T PeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheieQgRgjekeleSgmene*d+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1097 _PySlice_Unpack(<PyObject *>py_slice, &start, &stop, &step) 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T PeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheiejekelemene*d+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1098 new_extent = _PySlice_AdjustIndices(in_shape[i], &start, &stop, step) 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T PeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheiejekelemene*d+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1099 if new_extent > 0: 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T PeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheiejekelemene*d+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1100 # out_extent > 0 implies start is in [0, extent - 1] range 

1101 slice_offset = _overflow_checked_sum(slice_offset, _overflow_checked_mul(start, in_strides[i])) 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b u v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T PeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBggeheiejekelemene*d+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1102 else: 

1103 zero_slice = True 2(cnc)cscoctccedeee8 9 !

1104 out_layout.shape[out_i] = new_extent 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T PeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheiejekelemene*d+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1105 out_layout.strides[out_i] = _overflow_checked_mul(in_strides[i], step) 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T PeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheiejekelemene*d+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1106 out_i += 1 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T PeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$ezgAgfeBgcegedeeeheiejekelemene*d+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1107 else: 

1108 raise TypeError(f"Invalid slice: {py_slice}. Expected slice instance or integer.") 2QgRgSg

1109 for i in range(num_slices, ndim): 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1110 out_layout.shape[out_i] = in_shape[i] 2BcCcDcEcFcGcc d G H e f fecegedeeehe%e'e(e)e*e*d+e+d,dpcqcrc@c[c]c^c+c,cfd_c`c{c-c.cgd|c}chd~cidad/cbd:cjdcddd;c=ckded?c

1111 out_layout.strides[out_i] = in_strides[i] 2BcCcDcEcFcGcc d G H e f fecegedeeehe%e'e(e)e*e*d+e+d,dpcqcrc@c[c]c^c+c,cfd_c`c{c-c.cgd|c}chd~cidad/cbd:cjdcddd;c=ckded?c

1112 out_i += 1 2BcCcDcEcFcGcc d G H e f fecegedeeehe%e'e(e)e*e*d+e+d,dpcqcrc@c[c]c^c+c,cfd_c`c{c-c.cgd|c}chd~cidad/cbd:cjdcddd;c=ckded?c

1113 if out_i != ndim: 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1114 trim_base_layout(out_layout, out_i) 2ie@e[e]e%ejekele'emene(e)e*e*d+e+d,dvgwg

1115 if zero_slice: 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1116 _zero_strides(out_layout) 2(cnc)cscoctccedeee8 9 !

1117 return slice_offset 2ScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc% ' M N c d G H A B C D I O P E F J !c#c$ca b (cnc)cscoctcu v w x m n U s V t o p e g h i j Y Q f k Z R l q S r T =f?f@fPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$efecegedeeeheie@e[e]e%ejekele'emene(e)e*e*d+e+d,d,e-e.e8 9 . ! / : PcQcRcpcqcrcodpdqdrdMdNdsdtdudvdwdOdxdydPdQdRdzdAdBdCdDdEdFd@cSd-d[c]cTd^cUdVd+c,cWdfd_cXd`cYd{c-c.c.dZdgd|c}c/d:dhd~c;d0d=d1d?d2did@dad/c3d[dbd:c]d4djd^d5d6d7dcd_d8ddd9d;c=ckded?c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1118  

1119  

1120cdef inline int squeeze_extents(BaseLayout& out_layout, BaseLayout& in_layout) except -1 nogil: 

1121 cdef int ndim = in_layout.ndim 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f

1122 init_base_layout(out_layout, ndim) 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f

1123 cdef extent_t* in_shape = in_layout.shape 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f

1124 cdef stride_t* in_strides = get_strides_ptr(in_layout) 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f

1125 cdef int out_i = 0 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f

1126 cdef extent_t extent 

1127 for i in range(ndim): 2mgngog'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f

1128 extent = in_shape[i] 2'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f

1129 if extent == 0: 2'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f

1130 trim_base_layout(out_layout, 1) 189!

1131 out_layout.shape[0] = 0 189!

1132 out_layout.strides[0] = 0 189!

1133 return 1 189!

1134 elif extent != 1: 2'f(f)f8 9 . ! / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f

1135 out_layout.shape[out_i] = extent 2'f(f)f8 9 . ! / : 5f6f7fpcqcrc8f9f!f#f$f%f

1136 out_layout.strides[out_i] = in_strides[i] 2'f(f)f8 9 . ! / : 5f6f7fpcqcrc8f9f!f#f$f%f

1137 out_i += 1 2'f(f)f8 9 . ! / : 5f6f7fpcqcrc8f9f!f#f$f%f

1138 if out_i != ndim: 2mgngog'f(f)f. / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f

1139 trim_base_layout(out_layout, out_i) 2. / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f

1140 return out_i 2mgngog'f(f)f. / : Pc5f6f7fQcRcpcqcrc8f9f!f#f$f%f

1141  

1142  

1143cdef inline int unsqueeze_extents(BaseLayout& out_layout, BaseLayout& in_layout, axis_vec_t& axis_vec) except -1 nogil: 

1144 cdef int ndim = in_layout.ndim 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1145 cdef int num_new_axes = axis_vec.size() 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1146 cdef int out_ndim = ndim + num_new_axes 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1147 # init_base_layout validates out_ndim 

1148 init_base_layout(out_layout, out_ndim) 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1149 cdef extent_t* in_shape = in_layout.shape 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1150 cdef stride_t* in_strides = get_strides_ptr(in_layout) 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1151 cdef axes_mask_t out_shape_mask = 0 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1152 cdef axes_mask_t axis_mask = 0 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1153 cdef axis_t axis 

1154 for i in range(num_new_axes): 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1155 axis = axis_vec[i] 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1156 if not _normalize_axis(axis, out_ndim): 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1157 raise ValueError(f"Invalid axis: {axis} out of range for {out_ndim}D tensor") 

1158 axis_mask = _axis2mask(axis) 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1159 if out_shape_mask & axis_mask: 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1160 raise ValueError(f"Axis {axis} appears multiple times.") 

1161 out_shape_mask |= axis_mask 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1162 cdef int in_i = 0 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1163 for i in range(out_ndim): 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1164 axis_mask = _axis2mask(<axis_t>i) 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1165 if out_shape_mask & axis_mask: 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1166 out_layout.shape[i] = 1 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1167 if in_i < ndim: 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1168 out_layout.strides[i] = _overflow_checked_mul(in_shape[in_i], in_strides[in_i]) 2ld!d#d$d%dmd'dnd(d0bGb1b2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKb,b-bLb.bMb/b:b;bNb=b?b@bOb[b]b^b_bPbQb`b{b|b}b~bacRbbcccdcec

1169 else: 

1170 if ndim > 0: 2{d|d}d~daebeldGdHdIdJdmdKdndLdGbUbHbIbJbKbVbLbMbWbNbObPbQbXbYbRbZb

1171 out_layout.strides[i] = in_strides[ndim - 1] 2ldGdHdIdJdmdKdndLdGbUbHbIbJbKbVbLbMbWbNbObPbQbXbYbRbZb

1172 else: 

1173 out_layout.strides[i] = 1 2{d|d}d~daebe

1174 else: 

1175 out_layout.shape[i] = in_shape[in_i] 2ld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1176 out_layout.strides[i] = in_strides[in_i] 2ld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1177 in_i += 1 2ld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1178 assert in_i == ndim 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1179 return 0 2{d|d}d~daebeld!d#dGdHd$dId%dJdmdKd'dnd(dLd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1180  

1181  

1182cdef inline int broadcast_extents(BaseLayout& broadcast, BaseLayout& in_layout) except -1 nogil: 

1183 if broadcast.ndim < in_layout.ndim: 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc

1184 raise ValueError( 

1185 f"The broadcast shape ndim ({broadcast.ndim}) must be " 

1186 f"greater than or equal to the input shape " 

1187 f"ndim ({in_layout.ndim})." 

1188 ) 

1189 cdef int ndim_diff = broadcast.ndim - in_layout.ndim 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc

1190 _zero_strides(broadcast) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc

1191 cdef extent_t* in_shape = in_layout.shape 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc

1192 cdef stride_t* in_strides = get_strides_ptr(in_layout) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc

1193 cdef extent_t* broadcast_shape = broadcast.shape + ndim_diff 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc

1194 cdef stride_t* broadcast_strides = broadcast.strides + ndim_diff 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc

1195 for i in range(in_layout.ndim): 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc

1196 if in_shape[i] == broadcast_shape[i]: 2[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc

1197 broadcast_strides[i] = in_strides[i] 2|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc

1198 elif in_shape[i] != 1: 2[f]f^f_f`f{fScTcUcVcWcBcCcXcYcDcZc0cEcFcGc

1199 raise ValueError( 

1200 f"Shapes cannot be broadcast together: " 

1201 f"the original extent must be 1 or be equal to broadcast extent, " 

1202 f"got {in_shape[i]} and {broadcast_shape[i]} for axis {i}." 

1203 ) 

1204 # else -> in_extent == 1, the broadcast extent and zero stride are already set 

1205 return 0 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgScTcUc3cVc4cWcBc5cCc6c7cXc8cYcDcZc0cEcFcGc

1206  

1207  

1208cdef inline int64_t gcd(int64_t a, int64_t b) except? -1 nogil: 

1209 while b != 0: 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7

1210 a, b = b, a % b 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7

1211 return a 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7

1212  

1213  

1214cdef inline int pack_extents(BaseLayout& out_layout, stride_t& out_slice_offset, BaseLayout& in_layout, stride_t slice_offset, int itemsize, int new_itemsize, intptr_t data_ptr, bint keep_dim, int axis) except -1 nogil: 

1215 cdef int ndim = in_layout.ndim 1;=?ab234567

1216 if new_itemsize <= 0: 1;=?ab234567

1217 raise ValueError(f"new itemsize must be greater than zero, got {new_itemsize}.") 

1218 if itemsize <= 0: 1;=?ab234567

1219 raise ValueError(f"itemsize must be greater than zero, got {itemsize}.") 

1220 if new_itemsize <= itemsize: 1;=?ab234567

1221 if new_itemsize == itemsize: 

1222 return 1 

1223 raise ValueError(f"new itemsize ({new_itemsize}) must be greater than or equal to itemsize ({itemsize}).") 

1224 if not _normalize_axis(axis, ndim): 1;=?ab234567

1225 raise ValueError(f"Invalid axis: {axis} out of range for {ndim}D tensor") 

1226 if data_ptr % new_itemsize != 0: 1;=?ab234567

1227 raise ValueError(f"The data pointer ({data_ptr}) must be aligned to the packed itemsize ({new_itemsize}).") 

1228  

1229 cdef extent_t* shape = in_layout.shape 1;=?ab234567

1230 cdef stride_t* strides = get_strides_ptr(in_layout) 1;=?ab234567

1231 if strides[axis] != 1: 1;=?ab234567

1232 raise ValueError(f"The axis {axis} stride must be 1, got {strides[axis]}.") 

1233  

1234 cdef int vec_size = new_itemsize // itemsize 1;=?ab234567

1235 cdef extent_t packed_extent = shape[axis] 1;=?ab234567

1236 if packed_extent == 0: 1;=?ab234567

1237 raise ValueError(f"The axis {axis} extent must be non-zero, got {shape[axis]}.") 

1238 packed_extent //= vec_size 1;=?ab234567

1239 if packed_extent * vec_size != shape[axis]: 1;=?ab234567

1240 raise ValueError(f"The axis {axis} extent ({shape[axis]}) must be divisible by {vec_size}.") 

1241  

1242 cdef stride_t new_slice_offset = slice_offset // vec_size 1;=?ab234567

1243 if new_slice_offset * vec_size != slice_offset: 1;=?ab234567

1244 raise ValueError(f"The slice offset ({slice_offset}) must be divisible by {vec_size}.") 

1245 out_slice_offset = new_slice_offset 1;=?ab234567

1246  

1247 init_base_layout(out_layout, ndim) 1;=?ab234567

1248 cdef stride_t packed_stride 

1249 cdef int out_i = 0 1;=?ab234567

1250 for i in range(ndim): 1;=?ab234567

1251 if i == axis: 1;=?ab234567

1252 if keep_dim or packed_extent != 1: # omit the packed axis if it is reduced to 1 1;=?ab234567

1253 out_layout.shape[out_i] = packed_extent 1;=?ab234567

1254 out_layout.strides[out_i] = 1 1;=?ab234567

1255 out_i += 1 1;=?ab234567

1256 else: 

1257 packed_stride = strides[i] // vec_size 1ab234567

1258 if packed_stride * vec_size != strides[i]: 1ab234567

1259 raise ValueError(f"The {i} axis stride ({strides[i]}) must be divisible by {vec_size}.") 

1260 out_layout.shape[out_i] = shape[i] 1ab234567

1261 out_layout.strides[out_i] = packed_stride 1ab234567

1262 out_i += 1 1ab234567

1263 if out_i != ndim: 1;=?ab234567

1264 trim_base_layout(out_layout, out_i) 

1265 return vec_size 1;=?ab234567

1266  

1267  

1268cdef inline int unpack_extents(BaseLayout &out_layout, BaseLayout &in_layout, int itemsize, int new_itemsize, int axis) except -1 nogil: 

1269 cdef int ndim = in_layout.ndim 1;=?ab234567

1270 if not _normalize_axis(axis, ndim): 1;=?ab234567

1271 raise ValueError(f"Invalid axis: {axis} out of range for {ndim}D tensor") 

1272 if new_itemsize <= 0: 1;=?ab234567

1273 raise ValueError(f"new itemsize must be greater than zero, got {new_itemsize}.") 

1274 if itemsize <= 0: 1;=?ab234567

1275 raise ValueError(f"itemsize must be greater than zero, got {itemsize}.") 

1276 if new_itemsize >= itemsize: 1;=?ab234567

1277 if new_itemsize == itemsize: 

1278 return 1 

1279 raise ValueError(f"new itemsize ({new_itemsize}) must be less than or equal to itemsize ({itemsize}).") 

1280  

1281 cdef extent_t* shape = in_layout.shape 1;=?ab234567

1282 cdef stride_t* strides = get_strides_ptr(in_layout) 1;=?ab234567

1283 if shape[axis] == 0: 1;=?ab234567

1284 raise ValueError(f"The axis {axis} extent must be non-zero, got {shape[axis]}.") 

1285 if strides[axis] != 1: 1;=?ab234567

1286 raise ValueError(f"The axis {axis} stride must be 1, got {strides[axis]}.") 

1287  

1288 cdef int vec_size = itemsize // new_itemsize 1;=?ab234567

1289 init_base_layout(out_layout, ndim) 1;=?ab234567

1290 out_layout.shape[axis] = _overflow_checked_mul(shape[axis], vec_size) 1;=?ab234567

1291 out_layout.strides[axis] = 1 1;=?ab234567

1292  

1293 for i in range(ndim): 1;=?ab234567

1294 if i == axis: 1;=?ab234567

1295 continue 1;=?ab234567

1296 out_layout.shape[i] = shape[i] 1ab234567

1297 out_layout.strides[i] = _overflow_checked_mul(strides[i], vec_size) 1ab234567

1298 return vec_size 1;=?ab234567

1299  

1300  

1301cdef inline int max_compatible_itemsize(BaseLayout& layout, stride_t slice_offset, int itemsize, int max_itemsize, intptr_t data_ptr, int axis) except? -1 nogil: 

1302 cdef int ndim = layout.ndim 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7

1303 if max_itemsize <= 0: 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7

1304 raise ValueError(f"max_itemsize must be greater than zero, got {max_itemsize}.") 

1305 if itemsize <= 0: 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7

1306 raise ValueError(f"itemsize must be greater than zero, got {itemsize}.") 

1307 if not _normalize_axis(axis, ndim): 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7

1308 raise ValueError(f"Invalid axis: {axis} out of range for {ndim}D tensor") 

1309 if max_itemsize < itemsize: 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7

1310 raise ValueError(f"max_itemsize ({max_itemsize}) cannot be less than itemsize ({itemsize}).") 

1311 max_itemsize = gcd(max_itemsize, _c_abs(data_ptr)) 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7

1312 cdef extent_t* shape = layout.shape 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7

1313 cdef stride_t* strides = get_strides_ptr(layout) 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7

1314 if ndim < 1 or strides[axis] != 1 or shape[axis] == 0: 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7

1315 return itemsize 

1316 max_itemsize = gcd(max_itemsize, _overflow_checked_mul(slice_offset, itemsize)) 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7

1317 max_itemsize = gcd(max_itemsize, _overflow_checked_mul(shape[axis], itemsize)) 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7

1318 for i in range(ndim): 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7

1319 if i == axis: 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7

1320 continue 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7

1321 max_itemsize = gcd(max_itemsize, _overflow_checked_mul(_c_abs(strides[i]), itemsize)) 2!c#c$ca b 2 3 4 5 6 7

1322 return max_itemsize 2sgtgug; = ? !c#c$ca b 2 3 4 5 6 7