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

557 statements  

« prev     ^ index     » next       coverage.py v7.14.0, created at 2026-05-22 01:37 +0000

1# SPDX-FileCopyrightText: Copyright (c) 2025-2026 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~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6fjiki4h5h6h2cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiwixgyglixiyi

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~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3heinioipiqirisiti+c[cU V C D c W d X y z rcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6ffigihiiiOhPhQhRhShTh2cDc'cEcFc3c(cGc,f@eVg4gOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f.f0gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiuivixgygli

93 new_layout.init_dense_from_tuple(shape, itemsize, stride_order) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3heinioipiqirisiti+c[cU V C D c W d X y z rcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6ffigihiiiOhPhQhRhShTh2cDc'cEcFc3c(cGc,f@eVg4gOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f.f0gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiuivixgygli

94 return new_layout 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3heinioipiqirisiti+c[cU V C D c W d X y z rcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6ffigihiiiOhPhQhRhShTh2cDc'cEcFc3c(cGc,f@eVg4gOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f.f0gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiuivixgygli

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=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

139  

140 if stride_order == "K": 2}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

141 if is_dense: 2thuhvhwhxhyhqdtdzhudAhEdFdBhHd]cUd_cVdXd-c/cChDhEh4d6d!dfd?c:e;e=e

142 return other 2thuhvhwhxhyhzhAhBhChDhEh:e;e=e

143 other.get_stride_order(stride_order_vec) 2qdtdudEdFdHd]cUd_cVdXd-c/c4d6d!dfd?c

144 order_flag = ORDER_PERM 2qdtdudEdFdHd]cUd_cVdXd-c/c4d6d!dfd?c

145 else: 

146 order_flag = _stride_order2vec(stride_order_vec, stride_order) 2}g~gahbh-g.gchdh/geh:g;gfhghhh=gihjhrd?gkhsdlhOdPdmhvdwdnhxdydQdzd@gohphAdRdSdTdBdCdDdGd[g]g^g8gqh_g`g.d^c`crhWd,cYdhd{cZd|c9g0d}c.c/d1did~cad:d{g|g!g;djdbd=d2d?d3d@dkd[dcd:c5d]ddd;csh^dld_d7d8d9ded`d#d=cmdgd@cyezeAeBeCeoeDepeEeFeGeHeIeJeKeqeLeMeNereOePesete

147 if order_flag == ORDER_NONE: 2}g~gahbh-g.gchdh/geh:g;gfhghhh=gihjhrd?gkhsdlhOdPdmhvdwdnhxdydQdzd@gohphAdRdSdTdBdCdDdGd[g]g^g8gqh_g`g.d^c`crhWd,cYdhd{cZd|c9g0d}c.c/d1did~cad:d{g|g!g;djdbd=d2d?d3d@dkd[dcd:c5d]ddd;csh^dld_d7d8d9ded`d#d=cmdgd@cyezeAeBeCeoeDepeEeFeGeHeIeJeKeqeLeMeNereOePesete

148 raise ValueError( 

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

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

151 ) 

152 elif order_flag == ORDER_C: 

153 if is_dense and other.get_is_contiguous_c(): 2}g~gahfhghihrdlhnhxdzdohBdDdGd^crhYd~c!gbd2d:csh7d8d9d#d=c@coepete

154 return other 2[e}g~gahfhghihlhnhohrhsh

155 elif order_flag == ORDER_F: 

156 if is_dense and other.get_is_contiguous_f(): 2bhchdhehhhjhkhsdmhvdwdydphAdCd8gqhWd,c{cZd9g0d.c1dad3d5d;cgdqerese

157 return other 2bhchdhehhhjhkhmhphqh

158  

159 cdef _StridedLayout new_layout = _StridedLayout.__new__(cls) 2[e-g.g/g:g;g=gqdrd?gsdtdOdPdudvdwdxdydQdzd@gAdRdSdTdBdCdDdEdFdGd[gHd]g^g8g]cUd_g`g.d^c_cVd`cWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!g;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFeGeHeIeJeKeqeLeMeNereOePesete

160 new_layout.init_dense_from_ptr( 2-g.g/g:g;g=gqdrd?gsdtdOdPdudvdwdxdydQdzd@gAdRdSdTdBdCdDdEdFdGd[gHd]g^g8g]cUd_g`g.d^c_cVd`cWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!g;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFeGeHeIeJeKeqeLeMeNereOePesete

161 other.base.ndim, 

162 other.base.shape, 

163 other.itemsize, 

164 order_flag, 

165 &stride_order_vec 

166 ) 

167 return new_layout 2-g.g/g:g;g=gqdrd?gsdtdOdPdudvdwdxdydQdzd@gAdRdSdTdBdCdDdEdFdGd[gHd]g^g8g]cUd_g`g.d^c_cVd`cWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!g;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFeGeHeIeJeKeqeLeMeNereOePesete

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, other): 

180 if not isinstance(other, _StridedLayout): 2einioipiqirisiti+c[cU V C D c W d X y z rcNcpcscE F qctcxe?eyc%czcucAc9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidimi

181 return NotImplemented 2nioipiqirisiti

182 cdef _StridedLayout _other = <_StridedLayout>other 2ei+c[cU V C D c W d X y z rcNcpcscE F qctcxe?eyc%czcucAc9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidimi

183 return ( 2ei+c[cU V C D c W d X y z rcNcpcscE F qctcxe?eyc%czcucAc9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidimi

184 self.itemsize == _other.itemsize 2ei+c[cU V C D c W d X y z rcNcpcscE F qctcxe?eyc%czcucAc9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidimi

185 and self.slice_offset == _other.slice_offset 2[eei+c[cU V C D c W d X y z rcNcpcscE F qctcxe?eyc%czcucAc9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidimi

186 and _base_layout_equal(self.base, _other.base) 2ei+c[cU V C D c W d X y z rcNcpcscE F qctcxe?eyc%czcucAc9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidimi

187 ) 

188  

189 @property 

190 def ndim(self : _StridedLayout): 

191 """ 

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

193  

194 :type: int 

195 """ 

196 return self.base.ndim 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6ffijigihikiii2cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

197  

198 @property 

199 def shape(self : _StridedLayout): 

200 """ 

201 Shape of the tensor. 

202  

203 :type: tuple[int] 

204 """ 

205 return self.get_shape_tuple() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecwili

206  

207 @property 

208 def strides(self : _StridedLayout): 

209 """ 

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

211 If _StridedLayout was created with strides=None, the 

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

213  

214 :type: tuple[int] | None 

215 """ 

216 return self.get_strides_tuple() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f#g3g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B :f;f5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiwilixiCgDg

217  

218 @property 

219 def strides_in_bytes(self : _StridedLayout): 

220 """ 

221 Strides of the tensor (in bytes). 

222  

223 :type: tuple[int] | None 

224 """ 

225 return self.get_strides_in_bytes_tuple() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecvgwgEgFgCgDg

226  

227 @property 

228 def stride_order(self : _StridedLayout): 

229 """ 

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

231 relative order of the strides. 

232  

233 .. highlight:: python 

234 .. code-block:: python 

235  

236 # C-contiguous layout 

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

238 # F-contiguous layout 

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

240 # Permuted layout 

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

242  

243 :type: tuple[int] 

244 """ 

245 return self.get_stride_order_tuple() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z pcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGcOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B TgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

246  

247 @property 

248 def volume(self : _StridedLayout): 

249 """ 

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

251  

252 :type: int 

253 """ 

254 return self.get_volume() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

255  

256 @property 

257 def is_unique(self : _StridedLayout): 

258 """ 

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

260 a unique memory offset. 

261  

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

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

264 a contiguous layout. 

265 Conversely, broadcast layouts (layouts with a 0 stride 

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

267  

268 For layouts resulting from manual stride manipulations 

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

270 may inaccurately report False, as the exact uniqueness 

271 check may be expensive. 

272  

273 :type: bool 

274 """ 

275 return self.get_is_unique() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

276  

277 @property 

278 def is_contiguous_c(self : _StridedLayout): 

279 """ 

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

281 the rightmost stride is 1 and each subsequent 

282 stride to the left is the product of the 

283 extent and the stride to the right. 

284  

285 .. highlight:: python 

286 .. code-block:: python 

287  

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

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

290 assert layout.is_contiguous_c 

291  

292 See also :attr:`is_contiguous_any`. 

293  

294 :type: bool 

295 """ 

296 return self.get_is_contiguous_c() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

297  

298 @property 

299 def is_contiguous_f(self : _StridedLayout): 

300 """ 

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

302 the leftmost stride is 1 and each subsequent 

303 stride to the right is the product of the 

304 stride and extent to the left. 

305  

306 .. highlight:: python 

307 .. code-block:: python 

308  

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

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

311 assert layout.is_contiguous_f 

312  

313 See also :attr:`is_contiguous_any`. 

314  

315 :type: bool 

316 """ 

317 return self.get_is_contiguous_f() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

318  

319 @property 

320 def is_contiguous_any(self : _StridedLayout): 

321 """ 

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

323 there exists a permutation of axes such that the layout 

324 is C-contiguous. 

325  

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

327 the mapping of elements to the memory offset range 

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

329  

330 .. highlight:: python 

331 .. code-block:: python 

332  

333 # dense defaults to C-contiguous 

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

335 assert layout.is_contiguous_c and not layout.is_contiguous_f 

336 assert layout.is_contiguous_any 

337  

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

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

340 assert not permuted.is_contiguous_c and permuted.is_contiguous_f 

341 assert permuted.is_contiguous_any 

342  

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

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

345 assert not permuted.is_contiguous_c and not permuted.is_contiguous_f 

346 assert permuted.is_contiguous_any 

347  

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

349 # offset_bounds range that is not reachable with any 

350 # element in the sliced layout 

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

352 assert not sliced.is_contiguous_c and not sliced.is_contiguous_f 

353 assert not sliced.is_contiguous_any 

354  

355 :type: bool 

356 """ 

357 return self.get_is_contiguous_any() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

358  

359 @property 

360 def is_dense(self : _StridedLayout): 

361 """ 

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

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

364  

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

366 memory offset range. 

367  

368 :type: bool 

369 """ 

370 return self.get_is_dense() 2[edgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecvgwgEgFgCgDg

371  

372 @property 

373 def offset_bounds(self : _StridedLayout): 

374 """ 

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

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

377  

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

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

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

381  

382 .. highlight:: python 

383 .. code-block:: python 

384  

385 # Possible implementation of the offset_bounds 

386 def offset_bounds(layout : _StridedLayout): 

387 if layout.volume == 0: 

388 return 0, -1 

389 ndim = layout.ndim 

390 shape = layout.shape 

391 strides = layout.strides 

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

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

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

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

396 return min_offset, max_offset 

397  

398 :type: tuple[int, int] 

399 """ 

400 cdef stride_t min_offset = 0 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO AbBbCbDbP A B -f:f;f.fgbhbibjbg h i j k l q r EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

401 cdef stride_t max_offset = 0 2[edgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO AbBbCbDbP A B -f:f;f.fgbhbibjbg h i j k l q r EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

402 self.get_offset_bounds(min_offset, max_offset) 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO AbBbCbDbP A B -f:f;f.fgbhbibjbg h i j k l q r EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

403 return min_offset, max_offset 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO AbBbCbDbP A B -f:f;f.fgbhbibjbg h i j k l q r EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

404  

405 @property 

406 def min_offset(self : _StridedLayout): 

407 """ 

408 See :attr:`offset_bounds` for details. 

409  

410 :type: int 

411 """ 

412 cdef stride_t min_offset = 0 

413 cdef stride_t max_offset = 0 

414 self.get_offset_bounds(min_offset, max_offset) 

415 return min_offset 

416  

417 @property 

418 def max_offset(self : _StridedLayout): 

419 """ 

420 See :attr:`offset_bounds` for details. 

421  

422 :type: int 

423 """ 

424 cdef stride_t min_offset = 0 

425 cdef stride_t max_offset = 0 

426 self.get_offset_bounds(min_offset, max_offset) 

427 return max_offset 

428  

429 @property 

430 def slice_offset_in_bytes(self : _StridedLayout): 

431 """ 

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

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

434  

435 .. note:: 

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

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

438  

439 :type: int 

440 """ 

441 return self.get_slice_offset_in_bytes() 2[edgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*g7hhbIg8hibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgyg

442  

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

444 """ 

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

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

447 within the allocated memory range. 

448  

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

450 Otherwise, the returned value is equal to 

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

452  

453 .. hint:: 

454 For dense layouts, the function always succeeds and the 

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

456  

457 .. highlight:: python 

458 .. code-block:: python 

459  

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

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

462 a_view = StridedMemoryView(a, -1) 

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

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

465 layout = a_view._layout.to_dense() 

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

467 required_size = layout.required_size_in_bytes() 

468 # allocate the memory on the device 

469 device.set_current() 

470 mem = device.allocate(required_size, stream=device.default_stream) 

471 # create a view on the newly allocated device memory 

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

473 return b_view 

474 """ 

475 return self.get_required_size_in_bytes() 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcUhVhWhXhYhZh0h1h2h3h+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAcsgtgug; = ? !c#c$ca b 6 7 8 9 ! # jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO AbBbCbDbP A B -f:f;f.fgbhbibjbg h i j k l q r EbFb=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiuivixgygxivgwgEgFg

476  

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

478 """ 

479 A mask describing which axes of this layout are mergeable 

480 using the :meth:`flattened` method. 

481 """ 

482 return self.get_flattened_axis_mask() 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc

483  

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

485 """ 

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

487 but with dense strides in the specified order. 

488  

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

490 """ 

491 return _StridedLayout.dense_like(self, stride_order) 2}g~gahbh-g.gchdhth/guhvheh:g;gfhwhxhghhh=gihyhjhqdrd?gkhsdlhtdOdzhPdudmhvdwdnhxdydQdzd@gohphAdRdAhSdTdBdCdDdEdFdGd[gBhHd]g^g8g]cqhUd_g`g.d^c_cVd`crhWdXd,c-cYdhd{cZd|c9g0d}c.c/c/d1did~cad:d{g|g!gCh;djdbd=dDh2d?d3dEh@d4dkd[dcd:c5d]ddd;csh^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@cyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

492  

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

494 """ 

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

496 with the current layout. 

497  

498 The new shape is compatible if: 

499 * the new and old shapes have the same volume 

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

501 assuming indices are iterated in C-order 

502  

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

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

505  

506 .. highlight:: python 

507 .. code-block:: python 

508  

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

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

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

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

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

514 """ 

515 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 22cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb

516 cdef BaseLayout new_shape 

517 init_base_layout(new_shape, len(shape)) 22cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb

518 for i in range(len(shape)): 22cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb

519 new_shape.shape[i] = shape[i] 22cDcEcFc3cGc/f#g,f@e3gVg4g`eSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb

520 self.reshape_into(new_layout, new_shape) 22cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb

521 return new_layout 22cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO AbBbCbDbP A B -f:f;f.fgbhbibjbg h i j k l q r EbFb

522  

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

524 """ 

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

526 according to the specified permutation of axes. 

527 """ 

528 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6ffijigihikiii4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

529 cdef axis_vec_t axis_order_vec 

530 _tuple2axis_vec(axis_order_vec, axis_order) 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6ffijigihikiii4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

531 self.permute_into(new_layout, axis_order_vec) 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6ffijigihikiii4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

532 return new_layout 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

533  

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

535 """ 

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

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

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

539 axis is incremented first). 

540  

541 .. highlight:: python 

542 .. code-block:: python 

543  

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

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

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

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

548  

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

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

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

552 assert layout.flattened() == layout 

553  

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

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

556  

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

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

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

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

561  

562 .. highlight:: python 

563 .. code-block:: python 

564  

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

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

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

568 # their shapes differ after flattening. 

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

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

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

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

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

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

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

576 """ 

577 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc

578 cdef axes_mask_t axis_mask 

579 if mask is None: 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc

580 axis_mask = axis_mask_from_range(self.ndim, start_axis, end_axis) 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctc

581 else: 

582 axis_mask = mask 2+c[cU V C D c W d X y z rcNcpcscE F qctcxe?eyc%czcucAc

583 self.flatten_into(new_layout, axis_mask) 2[e+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc

584 return new_layout 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc

585  

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

587 """ 

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

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

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

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

592 """ 

593 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f

594 self.squeeze_into(new_layout) 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f

595 return new_layout 2[emgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f

596  

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

598 """ 

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

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

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

602 """ 

603 cdef axis_vec_t axis_vec 

604 if isinstance(axis, int): 2{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

605 axis_vec.push_back(axis) 

606 else: 

607 _tuple2axis_vec(axis_vec, axis) 2{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

608 if axis_vec.size() == 0: 2{d|dIh}d~daeJhbeKhLhnd$d%dIdJd'dKd(dLdodMdMh)dpd*dNdNh0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbec

609 return self 2[eIhJhKhLhMhNhuevewe

610 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

611 self.unsqueeze_into(new_layout, axis_vec) 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

612 return new_layout 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

613  

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

615 """ 

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

617 broadcast to the new one. 

618  

619 The shapes are compatible if: 

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

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

622 equal to the corresponding extent in the new shape. 

623  

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

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

626 """ 

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

628 cdef BaseLayout new_shape 

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

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

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

632 new_shape.shape[i] = shape[i] 2[edgegfggghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc

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

634 return new_layout 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc

635  

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

637 """ 

638 Converts the layout to match the specified itemsize. 

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

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

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

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

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

644  

645 The conversion is subject to the following constraints: 

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

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

648  

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

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

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

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

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

654  

655 The maximum itemsize that satisfies all the constraints 

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

657  

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

659 it is omitted from the returned layout. 

660  

661 .. highlight:: python 

662 .. code-block:: python 

663  

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

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

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

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

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

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

670  

671  

672 .. highlight:: python 

673 .. code-block:: python 

674  

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

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

677 float_view = StridedMemoryView(a, -1) 

678 layout = float_view._layout 

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

680 assert layout.itemsize == 4 

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

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

683 assert complex_view._layout.itemsize == 8 

684 b = numpy.from_dlpack(complex_view) 

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

686 """ 

687  

688 if itemsize == self.itemsize: 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #

689 return self 2sgtgug!c#c$c

690 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 1;=?ab6789!#

691 if itemsize > self.itemsize: 1;=?ab6789!#

692 self.pack_into(new_layout, itemsize, data_ptr, keep_dim, axis) 1;=?ab6789!#

693 else: 

694 self.unpack_into(new_layout, itemsize, axis) 1;=?ab6789!#

695 return new_layout 1;=?ab6789!#

696  

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

698 """ 

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

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

701 """ 

702 return self.get_max_compatible_itemsize(max_itemsize, data_ptr, axis) 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #

703  

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

705 """ 

706 Returns a sliced layout. 

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

708 or a tuple of integers/slices. 

709  

710 .. hint:: 

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

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

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

714  

715 .. note:: 

716 Slicing is purely a layout transformation and does not involve 

717 any data access. 

718  

719 """ 

720 if not isinstance(slices, tuple): 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

721 slices = (slices,) 2U V c d )cnc*cBcocCcu v w x QeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheKgQg'eRgMg(eSgPg)e*e+e,eqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd`c,c-c|c}c.c/ccd:cdd;ced=c?c@cCgDg

722 cdef _StridedLayout new_layout = _StridedLayout.__new__(_StridedLayout) 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

723 self.slice_into(new_layout, slices) 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

724 return new_layout 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

725  

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

727 return self.sliced(slices) 2=f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/exgygvgwgEgFgCgDg

728  

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

730 return flattened_strides_in_c_index_order_mask(self.base) 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc

731  

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

733 return max_compatible_itemsize(self.base, self.slice_offset, self.itemsize, max_itemsize, data_ptr, axis) 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #

734  

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

736 cdef int64_t old_volume = self.get_volume() 22cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb

737  

738 validate_reshaped_shape(new_shape, old_volume) 22cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb

739 _zero_strides(new_shape) 22cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.fgbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

740  

741 cdef BaseLayout flattened 

742 if old_volume != 0: 22cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.fgbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

743 flatten_strides_in_c_index_order(flattened, self.base, axis_mask_from_range(self.base.ndim, 0, -1)) 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

744 if not split_strides_in_c_index_order(new_shape, flattened): 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

745 raise ValueError("Layout strides are incompatible with the new shape") 1YZ*,04(+)-51e2Qf3RST

746  

747 # Reset all memoized properties 

748 out_layout._prop_mask = 0 22cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO AbBbCbDbP A B -f:f;f.fgbhbibjbg h i j k l q r EbFb

749  

750 # Copy preserved attributes 

751 out_layout.slice_offset = self.slice_offset 22cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO AbBbCbDbP A B -f:f;f.fgbhbibjbg h i j k l q r EbFb

752 out_layout.itemsize = self.itemsize 22cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO AbBbCbDbP A B -f:f;f.fgbhbibjbg h i j k l q r EbFb

753 maybe_copy_volume(out_layout, self) 22cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO AbBbCbDbP A B -f:f;f.fgbhbibjbg h i j k l q r EbFb

754  

755 # Set new attributes 

756 _swap_layout(out_layout.base, new_shape) 22cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO AbBbCbDbP A B -f:f;f.fgbhbibjbg h i j k l q r EbFb

757 return 0 22cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO AbBbCbDbP A B -f:f;f.fgbhbibjbg h i j k l q r EbFb

758  

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

760 if axis_order.size() != <size_t>self.base.ndim: 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6ffijigihikiii4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

761 raise ValueError(f"Permutation must have the same length as the number of dimensions, got {axis_order.size()} for {self.ndim}D tensor.") 2fijigihikiii

762  

763 cdef BaseLayout permuted 

764 permute_extents(permuted, self.base, axis_order) 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

765  

766 # Reset all memoized properties 

767 out_layout._prop_mask = 0 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

768  

769 # Preserved attributes 

770 out_layout.itemsize = self.itemsize 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

771 out_layout.slice_offset = self.slice_offset 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

772 maybe_copy_volume(out_layout, self) 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

773  

774 # Set new attributes 

775 _swap_layout(out_layout.base, permuted) 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

776 return 0 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

777  

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

779 cdef BaseLayout flattened 

780 cdef int ndim = flatten_strides_in_c_index_order(flattened, self.base, axis_mask) 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc

781  

782 if out_layout is self and ndim == self.base.ndim: 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc

783 return 0 

784  

785 # Reset all memoized properties 

786 out_layout._prop_mask = 0 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc

787  

788 # Preserved attributes 

789 out_layout.itemsize = self.itemsize 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc

790 out_layout.slice_offset = self.slice_offset 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc

791 maybe_copy_volume(out_layout, self) 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc

792  

793 # Set new attributes 

794 _swap_layout(out_layout.base, flattened) 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc

795 return 0 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc

796  

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

798 cdef BaseLayout squeezed 

799 squeeze_extents(squeezed, self.base) 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f

800  

801 if out_layout is self and squeezed.ndim == self.base.ndim: 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f

802 return 0 

803  

804 # Reset all memoized properties 

805 out_layout._prop_mask = 0 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f

806  

807 # Preserved attributes 

808 out_layout.itemsize = self.itemsize 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f

809 out_layout.slice_offset = self.slice_offset 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f

810 maybe_copy_volume(out_layout, self) 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f

811  

812 # Set new attributes 

813 _swap_layout(out_layout.base, squeezed) 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f

814 return 0 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f

815  

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

817 if axis_vec.size() == 0 and self is out_layout: 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

818 return 0 

819  

820 cdef BaseLayout unsqueezed 

821 unsqueeze_extents(unsqueezed, self.base, axis_vec) 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

822  

823 # Reset all memoized properties 

824 out_layout._prop_mask = 0 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

825  

826 # Preserved attributes 

827 out_layout.itemsize = self.itemsize 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

828 out_layout.slice_offset = self.slice_offset 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

829 maybe_copy_volume(out_layout, self) 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

830  

831 # Set new attributes 

832 _swap_layout(out_layout.base, unsqueezed) 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

833 return 0 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

834  

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

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

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

838  

839 # Reset all memoized properties 

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

841  

842 # Preserved attributes 

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

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

845  

846 # Set new attributes 

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

848 return 0 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc

849  

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

851  

852 cdef BaseLayout packed 

853 cdef stride_t new_slice_offset = 0 1;=?ab6789!#

854 cdef int vec_size = pack_extents( 1;=?ab6789!#

855 packed, 

856 new_slice_offset, 

857 self.base, 

858 self.slice_offset, 

859 self.itemsize, 

860 itemsize, 

861 data_ptr, 

862 keep_dim, 

863 axis 

864 ) 

865  

866 if vec_size == 1 and out_layout is self: 1;=?ab6789!#

867 return 0 

868  

869 # Reset all memoized properties 

870 out_layout._prop_mask = 0 1;=?ab6789!#

871  

872 # Set new attributes 

873 out_layout.itemsize = itemsize 1;=?ab6789!#

874 out_layout.slice_offset = new_slice_offset 1;=?ab6789!#

875 _swap_layout(out_layout.base, packed) 1;=?ab6789!#

876 return vec_size 1;=?ab6789!#

877  

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

879 cdef BaseLayout unpacked 

880 cdef int vec_size = unpack_extents( 1;=?ab6789!#

881 unpacked, 

882 self.base, 

883 self.itemsize, 

884 itemsize, 

885 axis 

886 ) 

887 if vec_size == 1 and out_layout is self: 1;=?ab6789!#

888 return 0 

889  

890 cdef int64_t new_slice_offset = _overflow_checked_mul(self.slice_offset, vec_size) 1;=?ab6789!#

891  

892 # Reset all memoized properties 

893 out_layout._prop_mask = 0 1;=?ab6789!#

894  

895 # Set new attributes 

896 out_layout.itemsize = itemsize 1;=?ab6789!#

897 out_layout.slice_offset = new_slice_offset 1;=?ab6789!#

898 _swap_layout(out_layout.base, unpacked) 1;=?ab6789!#

899 return vec_size 1;=?ab6789!#

900  

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

902 cdef BaseLayout sliced 

903 cdef stride_t slice_offset = slice_extents(sliced, self.base, slices) 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

904 cdef int64_t new_slice_offset = _overflow_checked_sum(self.slice_offset, slice_offset) 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

905  

906 # Reset all memoized properties 

907 out_layout._prop_mask = 0 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

908  

909 # Preserved attributes 

910 out_layout.itemsize = self.itemsize 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

911  

912 # Set new attributes 

913 _swap_layout(out_layout.base, sliced) 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

914 out_layout.slice_offset = new_slice_offset 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

915 return 0 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

916  

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

918 if _has_valid_property(in_layout, PROP_VOLUME): 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAca b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.fgbhbibjbe g h i j f k l q r EbFbmgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(fyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

919 out_layout._volume = in_layout.get_volume() 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAca b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.fgbhbibjbe g h i j f k l q r EbFbmgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(fyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

920 _mark_property_valid(out_layout, PROP_VOLUME) 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAca b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.fgbhbibjbe g h i j f k l q r EbFbmgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(fyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

921 return 0 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAca b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f2cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.fgbhbibjbe g h i j f k l q r EbFbmgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(fyezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

922  

923  

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

925 cdef int ndim = new_shape.ndim 22cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb

926 cdef int axis = -1 22cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb

927 cdef extent_t extent 

928 for i in range(ndim): 22cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb

929 extent = new_shape.shape[i] 22cDcEcFc3cGc/f#g,f@e3gVg4g`eSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb

930 if extent < -1: 22cDcEcFc3cGc/f#g,f@e3gVg4g`eSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg$g%g6g'g7g1g(g)g2g*ghbIgibjb+gUgJg,ge g h i j 2 Q f k 3 R l q S r T EbFb

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

932 elif extent == -1: 22cDcEcFc3cGc/f#g,f@e3gVg4g`eSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHg6g7g1g2ghbIgibjbUgJge g h i j 2 Q f k 3 R l q S r T EbFb

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

934 axis = i 2DcEcFcGc@e3gVg`eSbTbncoc@ [ ] ^ _ ` { | } ~ abbbcbdbebfb0g5gTgGggbHg1g2ghbIgibjbUgJg

935 else: 

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

937 cdef int64_t new_volume = _c_abs(_volume(new_shape)) 22cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHghbIgibjbUgJge g h i j 2 Q f k 3 R l q S r T EbFb

938 if axis == -1: 22cDc'cEcFc3c(cGc/f#g,f@e3gVg4g`eOcPcSbTb)cnc*cBcocCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.f0g5gTgGggbHghbIgibjbUgJge g h i j 2 Q f k 3 R l q S r T EbFb

939 if new_volume != old_volume: 22c'c3c(c/f#g,f4gOcPc)c*cBcCcu v fcgcw WghcicjckcXglcmcx YgZgm n kblbmbnbobpbY s Z t qbrbsbtbubvbwbxbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.fe g h i j 2 Q f k 3 R l q S r T EbFb

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

941 else: 

942 if new_volume == 0: 2DcEcFcGc@e3gVg`eSbTbncoc@ [ ] ^ _ ` { | } ~ abbbcbdbebfb0g5gTgGggbHghbIgibjbUgJg

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

944 extent = old_volume // new_volume 2DcEcFcGc@e`eSbTbncoc@ [ ] ^ _ ` { | } ~ abbbcbdbebfbGggbHghbIgibjbJg

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

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

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

948 return 0 22cDc'cEcFc3c(cGc/f,f@e`eOcPcSbTbncBcocCcu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B -f:f;f.fgbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

949  

950  

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

952 cdef axes_mask_t axes_mask = flatten_all_axes_mask(ndim) 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctc2cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

953 if start_axis == 0 and end_axis == -1: 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctc2cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

954 return axes_mask 2+c[cU V C D c W d X y z rcNcpcscE F qctc2cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

955 if not _normalize_axis(start_axis, ndim): 1GHIJMKLN

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

957 if not _normalize_axis(end_axis, ndim): 1GHIJMKLN

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

959 if start_axis > 0: 1GHIJMKLN

960 axes_mask &= (AXES_MASK_ALL << start_axis) 1GHIJKL

961 if end_axis < ndim: 1GHIJMKLN

962 axes_mask &= (AXES_MASK_ALL >> (STRIDED_LAYOUT_MAX_NDIM - end_axis - 1)) 1GHIJMKLN

963 return axes_mask 1GHIJMKLN

964  

965  

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

967 cdef int ndim = in_layout.ndim 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc2cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

968 if ndim == 0: 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc2cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

969 init_base_layout(out_layout, 1) 2+c[cxe?e2cDc'cEcFc3c(cGc

970 out_layout.shape[0] = 1 2+c[cxe?e2cDc'cEcFc3c(cGc

971 out_layout.strides[0] = 1 2+c[cxe?e2cDc'cEcFc3c(cGc

972 return 1 2+c[cxe?e2cDc'cEcFc3c(cGc

973 init_base_layout(out_layout, ndim) 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

974 cdef int group_start = 0 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

975 cdef int group_end = 0 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

976 cdef int64_t group_vol 

977 cdef int64_t group_stride 

978 cdef int out_i = 0 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

979 cdef extent_t* in_shape = in_layout.shape 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

980 cdef stride_t* in_strides = get_strides_ptr(in_layout) 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

981 while group_start < ndim: 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

982 group_vol = in_shape[group_start] 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

983 group_stride = in_strides[group_start] 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

984 group_end = group_start + 1 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

985 while ( 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

986 group_end < ndim 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

987 and (axis_mask & _axis2mask(group_end)) 2C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

988 and group_stride == _overflow_checked_mul(in_strides[group_end], in_shape[group_end]) 2C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcm n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

989 ): 

990 group_vol = _overflow_checked_mul(group_vol, in_shape[group_end]) 2C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcm n kblbmbnbobpb@ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb0 4 zbAbBbCb5 Db1 A B gbhbibjbg h i j Q k R l q S r T EbFb

991 group_stride = in_strides[group_end] 2C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcm n kblbmbnbobpb@ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb0 4 zbAbBbCb5 Db1 A B gbhbibjbg h i j Q k R l q S r T EbFb

992 group_end += 1 2C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcm n kblbmbnbobpb@ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb0 4 zbAbBbCb5 Db1 A B gbhbibjbg h i j Q k R l q S r T EbFb

993 out_layout.shape[out_i] = group_vol 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

994 out_layout.strides[out_i] = group_stride 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

995 out_i += 1 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

996 group_start = group_end 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

997 if out_i != ndim: 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

998 trim_base_layout(out_layout, out_i) 2C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcm n kblbmbnbobpb@ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb0 4 zbAbBbCb5 Db1 A B gbhbibjbg h i j Q k R l q S r T EbFb

999 return out_i 2U V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyc%czcucAcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

1000  

1001  

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

1003 if layout.strides == NULL: 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxe?eyc%czcucAc

1004 return flatten_all_axes_mask(layout.ndim) 2+cNcsctc?e%cuc

1005 cdef axes_mask_t axis_mask = 0 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxeyczcucAc

1006 cdef int ndim = layout.ndim 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxeyczcucAc

1007 cdef int group_start = 0 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxeyczcucAc

1008 cdef int group_end = 0 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxeyczcucAc

1009 cdef int64_t group_vol 

1010 cdef int64_t group_stride 

1011 while group_start < ndim: 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxeyczcucAc

1012 group_vol = layout.shape[group_start] 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyczcucAc

1013 group_stride = layout.strides[group_start] 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyczcucAc

1014 group_end = group_start + 1 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyczcucAc

1015 while group_end < ndim and group_stride == layout.strides[group_end] * layout.shape[group_end]: 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyczcucAc

1016 group_vol = _overflow_checked_mul(group_vol, layout.shape[group_end]) 2C D c W d X y z rcpcG H I J M E F K L N qcyczcucAc

1017 group_stride = layout.strides[group_end] 2C D c W d X y z rcpcG H I J M E F K L N qcyczcucAc

1018 axis_mask |= _axis2mask(group_end) 2C D c W d X y z rcpcG H I J M E F K L N qcyczcucAc

1019 group_end += 1 2C D c W d X y z rcpcG H I J M E F K L N qcyczcucAc

1020 group_start = group_end 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcyczcucAc

1021 return axis_mask 2+c[cU V C D c W d X y z rcNcpcscG H I J M E F K L N qctcxeyczcucAc

1022  

1023  

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

1025 cdef int i = in_layout.ndim - 1 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

1026 cdef int new_i = out_layout.ndim - 1 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

1027 cdef extent_t extent 

1028 cdef extent_t new_extent 

1029 cdef extent_t group_vol 

1030 cdef stride_t group_stride 

1031 cdef extent_t* in_shape = in_layout.shape 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

1032 cdef stride_t* in_strides = get_strides_ptr(in_layout) 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

1033 if out_layout.strides == NULL: 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

1034 _zero_strides(out_layout) 

1035 while i >= 0: 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

1036 extent = in_shape[i] 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

1037 group_stride = in_strides[i] 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

1038 group_vol = 1 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

1039 while new_i >= 0: 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

1040 new_extent = out_layout.shape[new_i] 22cDcEcFc3cGcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

1041 if new_extent == 0: 22cDcEcFc3cGcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

1042 return False 

1043 if new_extent == 1 or group_vol < extent: 22cDcEcFc3cGcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

1044 out_layout.strides[new_i] = group_stride 22cDcEcFc3cGcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

1045 group_stride = _overflow_checked_mul(group_stride, new_extent) 22cDcEcFc3cGcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

1046 group_vol = _overflow_checked_mul(group_vol, new_extent) 22cDcEcFc3cGcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

1047 new_i -= 1 22cDcEcFc3cGcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

1048 else: 

1049 break 1YsZt*0O(+)P1ABeghijQfkRlST

1050 if group_vol != extent: 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbY s Z t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p yb* , 0 4 zbO Ab( BbCb+ ) - 5 DbP 1 A B gbhbibjbe g h i j 2 Q f k 3 R l q S r T EbFb

1051 return False 1YZ*,04(+)-51e2Qf3RST

1052 i -= 1 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO Ab( BbCb) DbP A B gbhbibjbe g h i j f k l q r EbFb

1053 return True 22cDc'cEcFc3c(cGcOcPcSbTbu v fcgcw hcicjckclcmcx m n kblbmbnbobpbs t @ qb[ ] ^ rb_ ` sbtbubvb{ wb| } ~ abbbcbdbebxbfbo p ybzbO AbBbCbDbP A B gbhbibjbg h i j k l q r EbFb

1054  

1055  

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

1057 cdef int ndim = in_layout.ndim 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

1058 init_base_layout(out_layout, ndim) 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

1059 cdef axis_t axis 

1060 cdef axes_mask_t axis_mask 

1061 cdef axes_mask_t axis_order_mask = 0 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

1062 cdef extent_t* in_shape = in_layout.shape 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

1063 cdef stride_t* in_strides = get_strides_ptr(in_layout) 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

1064  

1065 for i in range(ndim): 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

1066 axis = axis_order[i] 2c W d X a b {e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

1067 if not _normalize_axis(axis, ndim): 2c W d X a b {e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

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

1069 axis_mask = _axis2mask(axis) 2c W d X a b {e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

1070 if axis_order_mask & axis_mask: 2c W d X a b {e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

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

1072 axis_order_mask |= axis_mask 2c W d X a b {e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

1073 out_layout.shape[i] = in_shape[axis] 2c W d X a b {e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

1074 out_layout.strides[i] = in_strides[axis] 2c W d X a b {e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f4hOhPhQh5h6hRhShTh* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

1075 return 0 2c W d X a b jgkglg{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f* , 0 4 O ( + ) - 5 P 1 A B e f $ % . ' / : yezeAeBeCeoeDepeEeFe:eGe;eHeIe=eJeKeqeLeMeNereOePesete

1076  

1077  

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

1079 cdef int ndim = in_layout.ndim 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1080 cdef int num_slices = len(slices) 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1081 if num_slices > ndim: 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeFhGheeHhheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

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

1083 init_base_layout(out_layout, ndim) 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1084 cdef extent_t* in_shape = in_layout.shape 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1085 cdef stride_t* in_strides = get_strides_ptr(in_layout) 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1086 cdef stride_t slice_offset = 0 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1087 cdef Py_ssize_t start 

1088 cdef Py_ssize_t stop 

1089 cdef Py_ssize_t step 

1090 cdef extent_t new_extent 

1091 cdef object py_slice 

1092 cdef bint zero_slice = False 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1093 cdef int out_i = 0 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1094 for i in range(num_slices): 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1095 py_slice = slices[i] 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T QeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1096 if isinstance(py_slice, int): 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T QeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheie]e^eKgQg_e'eRgLgjekeMgNgle(eSgOgmePgne)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1097 start = py_slice 2ie]e^eKg_e'eLgjekeMgNgle(eOgmePgne)e*e+e+d,e,d-dvgwg

1098 if not _normalize_axis(start, in_shape[i]): 2ie]e^eKg_e'eLgjekeMgNgle(eOgmePgne)e*e+e+d,e,d-dvgwg

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

1100 # single element index removes extent from the shape, 

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

1102 slice_offset = _overflow_checked_sum(slice_offset, _overflow_checked_mul(start, in_strides[i])) 2ie]e^e_e'eLgjekeNgle(eOgmene)e*e+e+d,e,d-dvgwg

1103 elif isinstance(py_slice, slice): 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T QeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheieQgRgjekeleSgmene+d,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1104 _PySlice_Unpack(<PyObject *>py_slice, &start, &stop, &step) 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T QeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheiejekelemene+d,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1105 new_extent = _PySlice_AdjustIndices(in_shape[i], &start, &stop, step) 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T QeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheiejekelemene+d,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1106 if new_extent > 0: 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T QeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheiejekelemene+d,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

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

1108 slice_offset = _overflow_checked_sum(slice_offset, _overflow_checked_mul(start, in_strides[i])) 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b u v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T QeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBggeheiejekelemene+d,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1109 else: 

1110 zero_slice = True 2)cnc*cBcocCccedeee$ % '

1111 out_layout.shape[out_i] = new_extent 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T QeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheiejekelemene+d,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1112 out_layout.strides[out_i] = _overflow_checked_mul(in_strides[i], step) 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T QeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheiejekelemene+d,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1113 out_i += 1 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T QeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%ezgAgfeBgcegedeeeheiejekelemene+d,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1114 else: 

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

1116 for i in range(num_slices, ndim): 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1117 out_layout.shape[out_i] = in_shape[i] 2HcIcJcKcLcMcc d y z e f fecegedeeehe'e(e)e*e+e+d,e,d-dvcwcxc]c^c_c`c,c-chd{c|c}c.c/cid~cadjdbdkdcd:cdd;cldedfd=c?cmdgd@c

1118 out_layout.strides[out_i] = in_strides[i] 2HcIcJcKcLcMcc d y z e f fecegedeeehe'e(e)e*e+e+d,e,d-dvcwcxc]c^c_c`c,c-chd{c|c}c.c/cid~cadjdbdkdcd:cdd;cldedfd=c?cmdgd@c

1119 out_i += 1 2HcIcJcKcLcMcc d y z e f fecegedeeehe'e(e)e*e+e+d,e,d-dvcwcxc]c^c_c`c,c-chd{c|c}c.c/cid~cadjdbdkdcd:cdd;cldedfd=c?cmdgd@c

1120 if out_i != ndim: 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1121 trim_base_layout(out_layout, out_i) 2ie]e^e_e'ejekele(emene)e*e+e+d,e,d-dvgwg

1122 if zero_slice: 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1123 _zero_strides(out_layout) 2)cnc*cBcocCccedeee$ % '

1124 return slice_offset 2TcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMcU V C D c d y z G H I J M E F K L N !c#c$ca b )cnc*cBcocCcu v w x m n Y s Z t o p e g h i j 2 Q f k 3 R l q S r T =f?f@fQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%efecegedeeeheie]e^e_e'ejekele(emene)e*e+e+d,e,d-d-e.e/e$ % . ' / : QcRcScvcwcxcqdrdsdtdOdPdudvdwdxdydQdzdAdRdSdTdBdCdDdEdFdGdHd]cUd.d^c_cVd`cWdXd,c-cYdhd{cZd|c0d}c.c/c/d1did~cad:d;djdbd=d2d?d3d@d4dkd[dcd:c5d]ddd;c^d6dld_d7d8d9ded`d!dfd#d=c?cmdgd@c0bGb1bUbue2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVbve,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXbwe{b|b}b~bacYbRbbcccdcZbecxgygvgwgEgFgCgDg

1125  

1126  

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

1128 cdef int ndim = in_layout.ndim 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f

1129 init_base_layout(out_layout, ndim) 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f

1130 cdef extent_t* in_shape = in_layout.shape 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f

1131 cdef stride_t* in_strides = get_strides_ptr(in_layout) 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f

1132 cdef int out_i = 0 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f

1133 cdef extent_t extent 

1134 for i in range(ndim): 2mgngog)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f

1135 extent = in_shape[i] 2)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f

1136 if extent == 0: 2)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f

1137 trim_base_layout(out_layout, 1) 1$%'

1138 out_layout.shape[0] = 0 1$%'

1139 out_layout.strides[0] = 0 1$%'

1140 return 1 1$%'

1141 elif extent != 1: 2)f*f+f$ % . ' / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f

1142 out_layout.shape[out_i] = extent 2)f*f+f$ % . ' / : 7f8f9fvcwcxc!f#f$f%f'f(f

1143 out_layout.strides[out_i] = in_strides[i] 2)f*f+f$ % . ' / : 7f8f9fvcwcxc!f#f$f%f'f(f

1144 out_i += 1 2)f*f+f$ % . ' / : 7f8f9fvcwcxc!f#f$f%f'f(f

1145 if out_i != ndim: 2mgngog)f*f+f. / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f

1146 trim_base_layout(out_layout, out_i) 2. / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f

1147 return out_i 2mgngog)f*f+f. / : Qc7f8f9fRcScvcwcxc!f#f$f%f'f(f

1148  

1149  

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

1151 cdef int ndim = in_layout.ndim 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1152 cdef int num_new_axes = axis_vec.size() 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1153 cdef int out_ndim = ndim + num_new_axes 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1154 # init_base_layout validates out_ndim 

1155 init_base_layout(out_layout, out_ndim) 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1156 cdef extent_t* in_shape = in_layout.shape 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1157 cdef stride_t* in_strides = get_strides_ptr(in_layout) 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1158 cdef axes_mask_t out_shape_mask = 0 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1159 cdef axes_mask_t axis_mask = 0 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1160 cdef axis_t axis 

1161 for i in range(num_new_axes): 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1162 axis = axis_vec[i] 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1163 if not _normalize_axis(axis, out_ndim): 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

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

1165 axis_mask = _axis2mask(axis) 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1166 if out_shape_mask & axis_mask: 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

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

1168 out_shape_mask |= axis_mask 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1169 cdef int in_i = 0 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1170 for i in range(out_ndim): 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1171 axis_mask = _axis2mask(<axis_t>i) 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1172 if out_shape_mask & axis_mask: 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1173 out_layout.shape[i] = 1 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1174 if in_i < ndim: 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

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

1176 else: 

1177 if ndim > 0: 2{d|d}d~daebendIdJdKdLdodMdpdNdGbUbHbIbJbKbVbLbMbWbNbObPbQbXbYbRbZb

1178 out_layout.strides[i] = in_strides[ndim - 1] 2ndIdJdKdLdodMdpdNdGbUbHbIbJbKbVbLbMbWbNbObPbQbXbYbRbZb

1179 else: 

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

1181 else: 

1182 out_layout.shape[i] = in_shape[in_i] 2nd$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1183 out_layout.strides[i] = in_strides[in_i] 2nd$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1184 in_i += 1 2nd$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1185 assert in_i == ndim 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1186 return 0 2{d|d}d~daebend$d%dIdJd'dKd(dLdodMd)dpd*dNd0bGb1bUb2b3b4b5b6b7b8b9b!bHbIb#b$bJb%b'b(b)b*b+bKbVb,b-bLb.bMb/bWb:b;bNb=b?b@bOb[b]b^b_bPbQb`bXb{b|b}b~bacYbRbbcccdcZbec

1187  

1188  

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

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

1191 raise ValueError( 

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

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

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

1195 ) 

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

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

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

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

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

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

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

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

1204 broadcast_strides[i] = in_strides[i] 2|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc

1205 elif in_shape[i] != 1: 2[f]f^f_f`f{fTcUcVcWcXcHcIcYcZcJc0c1cKcLcMc

1206 raise ValueError( 

1207 f"Shapes cannot be broadcast together: " 

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

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

1210 ) 

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

1212 return 0 2dgpgegfgggqgrghgig[f]f^f_f`f{f|f}f~fagbgcgTcUcVc4cWc5cXcHc6cIc7c8cYc9cZcJc0c1cKcLcMc

1213  

1214  

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

1216 while b != 0: 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #

1217 a, b = b, a % b 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #

1218 return a 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #

1219  

1220  

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

1222 cdef int ndim = in_layout.ndim 1;=?ab6789!#

1223 if new_itemsize <= 0: 1;=?ab6789!#

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

1225 if itemsize <= 0: 1;=?ab6789!#

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

1227 if new_itemsize <= itemsize: 1;=?ab6789!#

1228 if new_itemsize == itemsize: 

1229 return 1 

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

1231 if not _normalize_axis(axis, ndim): 1;=?ab6789!#

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

1233 if data_ptr % new_itemsize != 0: 1;=?ab6789!#

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

1235  

1236 cdef extent_t* shape = in_layout.shape 1;=?ab6789!#

1237 cdef stride_t* strides = get_strides_ptr(in_layout) 1;=?ab6789!#

1238 if strides[axis] != 1: 1;=?ab6789!#

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

1240  

1241 cdef int vec_size = new_itemsize // itemsize 1;=?ab6789!#

1242 cdef extent_t packed_extent = shape[axis] 1;=?ab6789!#

1243 if packed_extent == 0: 1;=?ab6789!#

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

1245 packed_extent //= vec_size 1;=?ab6789!#

1246 if packed_extent * vec_size != shape[axis]: 1;=?ab6789!#

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

1248  

1249 cdef stride_t new_slice_offset = slice_offset // vec_size 1;=?ab6789!#

1250 if new_slice_offset * vec_size != slice_offset: 1;=?ab6789!#

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

1252 out_slice_offset = new_slice_offset 1;=?ab6789!#

1253  

1254 init_base_layout(out_layout, ndim) 1;=?ab6789!#

1255 cdef stride_t packed_stride 

1256 cdef int out_i = 0 1;=?ab6789!#

1257 for i in range(ndim): 1;=?ab6789!#

1258 if i == axis: 1;=?ab6789!#

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

1260 out_layout.shape[out_i] = packed_extent 1;=?ab6789!#

1261 out_layout.strides[out_i] = 1 1;=?ab6789!#

1262 out_i += 1 1;=?ab6789!#

1263 else: 

1264 packed_stride = strides[i] // vec_size 1ab6789!#

1265 if packed_stride * vec_size != strides[i]: 1ab6789!#

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

1267 out_layout.shape[out_i] = shape[i] 1ab6789!#

1268 out_layout.strides[out_i] = packed_stride 1ab6789!#

1269 out_i += 1 1ab6789!#

1270 if out_i != ndim: 1;=?ab6789!#

1271 trim_base_layout(out_layout, out_i) 

1272 return vec_size 1;=?ab6789!#

1273  

1274  

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

1276 cdef int ndim = in_layout.ndim 1;=?ab6789!#

1277 if not _normalize_axis(axis, ndim): 1;=?ab6789!#

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

1279 if new_itemsize <= 0: 1;=?ab6789!#

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

1281 if itemsize <= 0: 1;=?ab6789!#

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

1283 if new_itemsize >= itemsize: 1;=?ab6789!#

1284 if new_itemsize == itemsize: 

1285 return 1 

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

1287  

1288 cdef extent_t* shape = in_layout.shape 1;=?ab6789!#

1289 cdef stride_t* strides = get_strides_ptr(in_layout) 1;=?ab6789!#

1290 if shape[axis] == 0: 1;=?ab6789!#

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

1292 if strides[axis] != 1: 1;=?ab6789!#

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

1294  

1295 cdef int vec_size = itemsize // new_itemsize 1;=?ab6789!#

1296 init_base_layout(out_layout, ndim) 1;=?ab6789!#

1297 out_layout.shape[axis] = _overflow_checked_mul(shape[axis], vec_size) 1;=?ab6789!#

1298 out_layout.strides[axis] = 1 1;=?ab6789!#

1299  

1300 for i in range(ndim): 1;=?ab6789!#

1301 if i == axis: 1;=?ab6789!#

1302 continue 1;=?ab6789!#

1303 out_layout.shape[i] = shape[i] 1ab6789!#

1304 out_layout.strides[i] = _overflow_checked_mul(strides[i], vec_size) 1ab6789!#

1305 return vec_size 1;=?ab6789!#

1306  

1307  

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

1309 cdef int ndim = layout.ndim 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #

1310 if max_itemsize <= 0: 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #

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

1312 if itemsize <= 0: 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #

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

1314 if not _normalize_axis(axis, ndim): 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #

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

1316 if max_itemsize < itemsize: 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #

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

1318 max_itemsize = gcd(max_itemsize, _c_abs(data_ptr)) 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #

1319 cdef extent_t* shape = layout.shape 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #

1320 cdef stride_t* strides = get_strides_ptr(layout) 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #

1321 if ndim < 1 or strides[axis] != 1 or shape[axis] == 0: 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #

1322 return itemsize 

1323 max_itemsize = gcd(max_itemsize, _overflow_checked_mul(slice_offset, itemsize)) 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #

1324 max_itemsize = gcd(max_itemsize, _overflow_checked_mul(shape[axis], itemsize)) 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #

1325 for i in range(ndim): 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #

1326 if i == axis: 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #

1327 continue 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #

1328 max_itemsize = gcd(max_itemsize, _overflow_checked_mul(_c_abs(strides[i]), itemsize)) 2!c#c$ca b 6 7 8 9 ! #

1329 return max_itemsize 2sgtgug; = ? !c#c$ca b 6 7 8 9 ! #