
    Ae9u                     2   d dl mZ ddlmZmZ ddlmZ ddlmZmZm	Z	 ddlm
Z
 ddlmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZ dZdZdZdZdZdZdZdZdZd ZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%d Z&d!Z'e"e#e$e%e&e'd"Z(d#d$d%d&d'd(d"Z)d)Z*d*Z+d+Z,d,Z-d-Z.d. Z/	 dfd/Z0	 dgd0Z1d1 Z2d2 Z3d3 Z4dhd4Z5 G d5 d6ejl                        Z7d7 Z8d8 Z9d9 Z:d: Z;d; Z<d< Z= G d= d>e>      Z? G d? d@e?      Z@ G dA dBe?      ZAdC ZBdD ZCdE ZDdF ZEdG ZFdH ZGdIdJdKdLdMdNdOZHdP ZIdQ ZJdR ZKdS ZLdidUZMdidVZNdW ZOe-e
j                  e.e*dXZQ eNdYeQg Z      ZR eNd[eQ      ZS eNd\ eTeQe
j                  ]      eReSgZ      ZU eNd^      ZV eMd_ej                  g`      ZX eNdaeQ      ZY eNdbeQ      ZZ eNdceQg `      Z[ eMddeQ ej                         ej                  ej                  eUeYeZe[ej                  gZ      Z`deZaeRj                  j                  e`       e[j                  j                  e`       yT)j    )absolute_import   )CompileErrorerror)	ExprNodes)IntNodeNameNodeAttributeNode)Options)UtilityCodeTempitaUtilityCode)CythonUtilityCode)Buffer)
PyrexTypes)
ModuleNodezStart must not be given.z3Axis specification only allowed in the 'step' slot.z.Step must be omitted, 1, or a valid specifier.z>Cannot specify an array that is both C and Fortran contiguous.zInvalid axis specification.z+Variable was not cimported from cython.viewz=no expressions allowed in axis spec, only names and literals.z<Invalid axis specification for a C/Fortran contiguous array.zdCannot check if memoryview %s is initialized without the GIL, consider using initializedcheck(False)c                  *    ddj                  |       z  S )Nz(%s)|)join)flagss    :lib/python3.12/site-packages/Cython/Compiler/MemoryView.pyconcat_flagsr      s    CHHUO##    PyBUF_FORMATz#(PyBUF_C_CONTIGUOUS | PyBUF_FORMAT)z#(PyBUF_F_CONTIGUOUS | PyBUF_FORMAT)z%(PyBUF_ANY_CONTIGUOUS | PyBUF_FORMAT)PyBUF_FULL_ROPyBUF_RECORDS_RO__Pyx_MEMVIEW_DIRECT__Pyx_MEMVIEW_PTR__Pyx_MEMVIEW_FULL__Pyx_MEMVIEW_CONTIG__Pyx_MEMVIEW_STRIDED__Pyx_MEMVIEW_FOLLOW)directptrfullcontigstridedfollowdpfcs_z{ 0, 0, { 0 }, { 0 }, { 0 } }
memoryview__pyx_memoryview_type__pyx_memoryview_obj__Pyx_memviewslicec                 T    |j                  d| z         |j                  d| z         y )Nz%s.data = NULL;z%s.memview = NULL;)putln)mv_cnamecodes     r   put_init_entryr6   G   s&    JJ 8+,JJ#h./r   c           	         |j                   j                  sJ |j                         xs |j                         }|r|j	                         }nC|j
                  j                  |d      }|j                  |d|j                  |      d       t        | ||||||       |s|j
                  j                  |       yy)zEWe can avoid decreffing the lhs if we know it is the first assignmentF
manage_ref = ;)have_gilfirst_assignmentN)typeis_memoryviewsliceresult_in_temp	is_simpleresult	funcstateallocate_tempr3   	result_asput_assign_to_memviewslicerelease_temp)		lhs_cnamelhs_typelhs_posrhsr5   r<   r=   
pretty_rhsrhstmps	            r   put_acquire_memoryviewslicerN   P   s     88&&&##%8J--h5-I

x)@AB y#vx(0CSU ##F+ r   c                     |s|j                  | |       |j                         s|j                  |       |j                  | d|d       y )N)r<   r:   r;   )put_xdecref_memoryviewslicer@   make_owned_memoryviewslicer3   )rH   rK   	rhs_cnamememviewslicetyper5   r<   r=   s          r   rF   rF   e   sC    ((X(F&&t,JJY	23r   c                 |    t        |       \  }}|rt        S |rt        S t        |  \  }}d|v sd|v rt        S t
        S )Nr$   r#   )is_cf_contigmemview_c_contiguousmemview_f_contiguouszipmemview_full_accessmemview_strided_accessspecsis_c_contigis_f_contigaccesspackings        r   get_buf_flagsra   p   sJ    +E2K##	##5kOFG5F?""%%r   c                     dg|z  }|j                  | j                         t        j                  | j                  |      S )Nr"   r&   )extendaxesr   MemoryViewSliceTypedtype)memoryviewtypenre   s      r   insert_newaxesrj      s:    !"Q&DKK##$)).*>*>EEr   c                     t        | j                  |j                  z
        }| j                  |j                  k  rt        | |      |fS | t        ||      fS N)absndimrj   )srcdstri   s      r   broadcast_typesrq      sM    CHHsxx A
xx#((c1%s**N3***r   c                     | j                   r| j                  j                  ry| t        j                  u ry| j
                  rB| j                  dk(  r3| j                  j                  D ]  }t        |j                        r y y| j                  xs} | j                  xr  |dk  xr t        | j                  |dz         xsM | j                  xs? | j                  xs1 | j                   xs# | j"                  xr t        | j$                        S )z
    Return whether type dtype can be used as the base type of a
    memoryview slice.

    We support structs, numeric types and objects
    FstructT   r   )
is_complex	real_typeis_intr   c_bint_type	is_structkindscopevar_entriesvalid_memslice_dtyper>   is_erroris_array	base_type
is_numericis_pyobjectis_fused
is_typedeftypedef_base_type)rg   imembers      r   r}   r}      s     EOO22
&&&5::1kk-- 	F'4	  	 	M 
 
6AE 
6	eooq1u	5		M
 		M 		M 		M 
			K253J3JK
r   c                   <    e Zd ZdZd Zd Zd Zd Zd Zd
dZ	d Z
y	)MemoryViewSliceBufferEntryz
    May be used during code generation time to be queried for
    shape/strides/suboffsets attributes, or to perform indexing or slicing.
    c                    || _         |j                  | _        |j                  | _        d| j                  z  | _        | j                   j                  j                  }t        j                  |      | _        | j                          y )Nz%s.data)	entryr>   cnamebuf_ptrrg   r   CPtrTypebuf_ptr_typeinit_attributes)selfr   rg   s      r   __init__z#MemoryViewSliceBufferEntry.__init__   sa    
JJ	[[
 4::-

%%&//6r   c                 $    | j                  d      S )N%s.suboffsets[%d]_for_all_ndimr   s    r   get_buf_suboffsetvarsz0MemoryViewSliceBufferEntry.get_buf_suboffsetvars   s    !!"566r   c                 $    | j                  d      S )N%s.strides[%d]r   r   s    r   get_buf_stridevarsz-MemoryViewSliceBufferEntry.get_buf_stridevars   s    !!"233r   c                 $    | j                  d      S )N%s.shape[%d]r   r   s    r   get_buf_shapevarsz,MemoryViewSliceBufferEntry.get_buf_shapevars   s    !!.11r   c           	          t        | j                  j                        D cg c]  \  }\  }}|||   ||f }}}}| j                  ||      S c c}}}w rl   )	enumerater>   re   _generate_buffer_lookup_code)r   r5   index_cnamesdimr_   r`   re   s          r   generate_buffer_lookup_codez6MemoryViewSliceBufferEntry.generate_buffer_lookup_code   se    2;DIINN2KM M..fg l3'9 M M00t<<Ms   Ac           
      4   | j                   }| j                  j                  j                         }|D ]  \  }}}}	d| j                  |fz  }
d| j                  |fz  }d| j                  |fz  }t        ||	      }|dv r/|j                  j                  t               d|d|d|d|d	}nW|dk(  rd	|d
|d|d}d|d|d}n<|dk(  rd|d
|d|d}n*|dk(  rd	|d
|d|d}n|dk(  sJ |       d|d|d|d}d||fz  } |r	d|d|dS |S )zl
        Generate a single expression that indexes the memory view slice
        in each dimension.
        r   r   r   )genericgeneric_contiguousz__pyx_memviewslice_index_full(z, )indirect(z +  * z(*((char **) z) + indirect_contiguousr&   
contiguousz((char *) ((( *) z))z( /* dim=%d */ %s )z(()	r   r>   rg   empty_declaration_coder   get_memoryview_flagglobalstateuse_utility_codememviewslice_index_helpers)r   r5   re   cast_resultbufp	type_declr   indexr_   r`   shapestride	suboffsetflags                 r   r   z7MemoryViewSliceBufferEntry._generate_buffer_lookup_code   s?   
 ||IIOO::<	+/ 	7'C"djj#%66E%S(99F+tzz3.??I&vw7D88
   112LM-15&)M #+/?48)D..8<eYO"+/? |+1T1+:CT5Q(C;6D?	7B $-t44r   c           	         | j                   }j                  dt               z         j                  dt               z         j                  |       t	        d | j
                  j                  D              }g fd}	d}
d}|D ]  }|j                  r(dD ]  \  }}j                  d||||fz          |d	z  }8|
d	z  }
| j
                  j                  |
   \  }}t        |t        j                        rt        t                     }d
j                         D ]:  }t        ||      }|j                   x}|d|z   <   |r|j                         nd||<   < |d   s|d   s|d   s||d<   d}n d}j                  |j                         |d<   |d	z  }n|j                         }|dk7  }|r"|dk(  }|dk7  rt#        |j                   d      c S t        t               t%        |d         t%        |d               }|d   rj                  |j                         |d<   d}t'        j(                  |d|      \  }}j+                  |        rj,                  j/                  d          yy)a  
        Slice a memoryviewslice.

        indices     - list of index nodes. If not a SliceNode, or NoneNode,
                      then it must be coercible to Py_ssize_t

        Simply call __pyx_memoryview_slice_memviewslice with the right
        arguments, unless the dimension is omitted or a bare ':', in which
        case we copy over the shape/strides/suboffsets attributes directly
        for that dimension.
        z%(dst)s.data = %(src)s.data;z"%(dst)s.memview = %(src)s.memview;c              3   ,   K   | ]  \  }}|d k(    yw)r"   N ).0r_   r`   s      r   	<genexpr>zHMemoryViewSliceBufferEntry.generate_buffer_slice_code.<locals>.<genexpr>  s     #]?67Fh$6#]s   c                      sPj                   j                  t        j                  d      } j	                  d| z         j                  |        d   S )NFr8   z%s = -1;r   )rC   rD   r   
c_int_typer3   append)suboffset_dimr5   suboffset_dim_temps    r   get_suboffset_dimzPMemoryViewSliceBufferEntry.generate_buffer_slice_code.<locals>.get_suboffset_dim  sP    % $ < <Z=R=R_d < e

:56"))-8%a((r   r   ))r   r   )stridesr   )
suboffsetsr   z%s.%s[%d] = %d;r   zstart stop stephave_0
have_start	have_stop	have_stepr_   SimpleSlice
ToughSlice
error_gotor"   r$   z7All preceding dimensions must be indexed and not sliced
wraparoundboundscheck)r   r   
SliceIndexMemoryView_C.c)contextN)r   r3   localsput_incref_memoryviewsliceallr>   re   is_none
isinstancer   	SliceNodedictsplitgetattrrB   r   posr   intr   load_as_stringputrC   rG   )r   r5   indicesrp   r<   have_slices
directivesro   all_dimensions_directr   r   new_ndimr   attribvaluer_   r`   r(   r,   idxhave_idx	util_namer   r   r-   implr   s    `                        @r   generate_buffer_slice_codez5MemoryViewSliceBufferEntry.generate_buffer_slice_code   sv    jj

1FH<=

7&(BC'', ##]diinn#] ]	)  4	E}}%W SMFEJJ0C53QQRS A1HC"iinnS1OFG%!4!45N*002 =A!%+C47KK?Hq1~+33::<AaD=
 ,1[>Q{^ #)AhK -I ,I&*ooeii&@AlOA lln!X-$.G1}$UYY&> ? ? H":l#;< #J}$= >
 ]#&*ooeii&@AlO(	(77	CS]^_GAtHHTNi4	l NN''(:1(=> r   N)T)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r   r   r   r      s,    	742=
,\W?r   r   c                 ^    t        j                  |       }t        j                  | |||      S )N)startstopstep)r   NoneNoder   )r   nones     r   empty_slicer   U  s.    c"Ds$$(t5 5r   c                 Z   g }d}d}| D cg c]  }|j                   s| }}t        |       t        |      z
  }| D ]  }t        |t        j                        rKd}t        |j                        }	|r|j                  |	       H||z
  dz   }
|j                  |	g|
z         d}h|xs |j                  xs |j                   }|j                  |        t        |      t        |      z
  }||k  r2d}||z
  }
|j                  t        | d   j                        g|
z         |||fS c c}w )NFTr   r   )
r   lenr   r   EllipsisNoder   r   r   rd   is_slice)r   rn   rB   seen_ellipsisr   newaxisnewaxes	n_indicesr   
full_slicenslicesresult_lengths               r   unellipsifyr  [  s&   FMK&-A7wAGAGs7|+I !eY334K$UYY/Jj)*Q.zlW45 $%HH5==KMM% ! K#g,.Mt&{72;??34w>?''1 Bs
   D(D(c                     | dk(  r|dv ry| dk(  r|dk(  ry| dk(  r|dv ry| dk(  r|dk(  ry| d	k(  r|dv ry
| |fdk(  s	J | |f       y)Nr$   )r&   r'   r   r%   r   r#   r   r   r"   r&   r"   r%   r   r   )r_   r`   s     r   r   r   {  s{    G'<<	6	g1#	5W(==	5W0$	8	+@ @ $88K67:KKr   c                     | dv sJ d| |fz  S )NCFz!__pyx_memviewslice_is_contig_%s%dr   )contig_typern   s     r   get_is_contig_func_namer    s    *$$.+t1DDDr   c                 \    | dv sJ t        t        ||       }t        d|t        g      }|S )Nr
  )rn   r  MemviewSliceCheckContigrequires)r   r   load_memview_c_utilityis_contig_utility)r  rn   r  utilitys       r   get_is_contig_utilityr    s3    *$$W4[9A$%>M^L_`GNr   c                 j    | j                   s| j                  rt        | |||      S t        | |||      S rl   )r]   r^   ContigSliceIterStridedSliceIter)
slice_typeslice_resultrn   r5   s       r   
slice_iterr    s5    !7!7z<tDD
L$EEr   c                       e Zd Zd Zy)	SliceIterc                 <    || _         || _        || _        || _        y rl   )r  r  r5   rn   )r   r  r  rn   r5   s        r   r   zSliceIter.__init__  s    $(		r   N)r   r   r   r   r   r   r   r  r    s    r   r  c                       e Zd Zd Zd Zy)r  c                      j                   }|j                           j                  j                  j	                         }dj                   fdt         j                        D              }|j                  d|z         |j                  d       |j                  |d|d j                  d       |j                  d       y	)
Nr   c              3   @   K   | ]  }d j                   |fz    yw)r   N)r  )r   r   r   s     r   r   z.ContigSliceIter.start_loops.<locals>.<genexpr>  s)       ;$% !/$2C2CQ1G G  ;s   z"Py_ssize_t __pyx_temp_extent = %s;zPy_ssize_t __pyx_temp_idx;z *__pyx_temp_pointer = (r   z.data;zPfor (__pyx_temp_idx = 0; __pyx_temp_idx < __pyx_temp_extent; __pyx_temp_idx++) {__pyx_temp_pointer)
r5   begin_blockr  rg   r   r   rangern   r3   r  )r   r5   r   
total_sizes   `   r   start_loopszContigSliceIter.start_loops  s    yyOO))@@B	ZZ  ;).tyy)9 ; ;


7*DE

/0

y$"3"35 	6

 . 	/ $r   c                     | j                   j                  d       | j                   j                  d       | j                   j                          y )Nz__pyx_temp_pointer += 1;})r5   r3   	end_blockr   s    r   	end_loopszContigSliceIter.end_loops  s3    		23				r   Nr   r   r   r'  r+  r   r   r   r  r    s    $$r   r  c                       e Zd Zd Zd Zy)r  c                 ,   | j                   }|j                          t        | j                        D ]a  }|| j                  |f}|j                  d|z         |j                  d|z         |j                  d|z         |j                  d|z         c |j                  d| j                  z         t        | j                        D ]8  }|dkD  r|j                  d||dz
  fz         |j                  d	||||fz         : d
| j                  dz
  z  S )Nz/Py_ssize_t __pyx_temp_extent_%d = %s.shape[%d];z1Py_ssize_t __pyx_temp_stride_%d = %s.strides[%d];zchar *__pyx_temp_pointer_%d;zPy_ssize_t __pyx_temp_idx_%d;z__pyx_temp_pointer_0 = %s.data;r   z.__pyx_temp_pointer_%d = __pyx_temp_pointer_%d;r   z\for (__pyx_temp_idx_%d = 0; __pyx_temp_idx_%d < __pyx_temp_extent_%d; __pyx_temp_idx_%d++) {z__pyx_temp_pointer_%d)r5   r$  r%  rn   r  r3   )r   r5   r   ts       r   r'  zStridedSliceIter.start_loops  s   yytyy! 	<A4$$a'AJJH1LMJJJQNOJJ59:JJ6:;	< 	

4t7H7HHItyy! 	EA1u

KqRSVWRWjXYJJ 5891a|D E		E '$))a-88r   c                     | j                   }t        | j                  dz
  dd      D ])  }|j                  d||fz         |j                  d       + |j	                          y )Nr   r   z.__pyx_temp_pointer_%d += __pyx_temp_stride_%d;r)  )r5   r%  rn   r3   r*  )r   r5   r   s      r   r+  zStridedSliceIter.end_loops  sX    yytyy1}b"- 	AJJG1a&PQJJsO	 	r   Nr,  r   r   r   r  r    s    9.r   r  c                 P    | j                   rd}nd}d| j                         d|S )Nr+   r*   __pyx_memoryview_copy_slice_r-   )r]   specialization_suffix)memviewc_or_fs     r   copy_c_or_fortran_cnamer6    s0     ))+V5 5r   c                    |j                   |j                   k7  rF|j                   j                  r#|j                   j                  |j                   k(  st        | d       y t	        |j
                        t	        |j
                        k7  rt        | d       y |j                  s|j                  st        | d       y |j
                  D ]  \  }}|dk7  st        | d        y  |j                  r	d}t        }n|j                  rd}t        }t        dt        t        |j                   j                         |j                  t        |      t!        |j                   j"                        	      t$        g
      S )Nzdtypes must be the same!z!number of dimensions must be samez%to_memview must be c or f contiguous.r"   z2cannot handle 'full' or 'ptr' access at this time.r+   fortranCopyContentsUtility)mode
dtype_declcontig_flagrn   
func_cnamedtype_is_objectr   r  )rg   is_constconst_base_typer   r   re   r]   r^   rV   rW   r  r   r   r   rn   r6  r   r   copy_contents_new_utility)r   from_memview
to_memviewr_   r`   r:  r<  s          r   get_copy_new_utilityrE    sL   j...##,,1C1C1S1SWaWgWg1gc-.
<Z__!55c67""j&<&<c:;).. X#KL
 *			*!!''>>@#.z:
 0 0 < <=? ,,
. 
.r   c                    | j                         j                  j                  }|j                          |j                  }t        dD cg c]  }|j                  |       c}      }t        dD cg c]  }|j                  |       c}      }d\  }}d\  }	}
|	d}}g }t        |      D ]  \  }}|j                  j                  s$t        |j                  j                  t              |j                  j                  s$t        |j                  j                  t              |j                  j                  r|j!                  |	|
f       t#        |j                  t$              rW|j                  j'                  |       dk7  r$t        |j                  j                  t(              |j!                  |df       t#        |j                  t*        t,        f      rpt/        | |j                        }|j0                  t2        v r$|j!                  t2        |j0                            t        |j                  j                  t4              t        |j                  j                  t4               d}d	}t        |      D ]?  \  }\  }}|dk(  s|r$t        j                  j                  t6              |}|d
f||<   d}A |r|t9        |      dz
  k(  rd}n*d}|r&||dz
     d   dvrt        ||   j                  d      |r7d}t        t;        |            D ]  \  }\  }}|dv st9        |      |z
  dz
  }  |dz   }t9        |      |z
  }t        |||       D ]S  \  }\  }}|dz   |z   }|dk7  rt        ||   j                  d      |d
k(  rt        ||   j                  d      ||f||<   U |r|d   \  }}|d
f|d<   t=        |D cg c]  }|j                  j                   c}|||       |S c c}w c c}w c c}w )z
    get_axes_specs(env, axes) -> list of (access, packing) specs for each axis.
    access is one of 'full', 'ptr' or 'direct'
    packing is one of 'contig', 'strided' or 'follow'
    )r$   r"   r#   r%   r&   r'   FFrc   r'   r   cfcontigr   Fr%   T)r$   r#   z>Fortran contiguous specifier must follow an indirect dimensionr   r#   r$   r"   z>Indirect dimension may not follow Fortran contiguous dimensionzDimension may not be contiguous)global_scoper   cython_scopeload_cythonscope	viewscopetuplelookupr   r   r   r   r   	START_ERRr   STOP_ERRr   r   r   r   compile_time_valueSTEP_ERRr	   r
   _get_resolved_specnameview_constant_to_access_packingINVALID_ERRBOTH_CF_ERRr   reversedvalidate_axes_specs)envre   cythonscoperN  rV  access_specspacking_specsr^   r]   default_accessdefault_packing	cf_access
cf_packing
axes_specsr   axisr   
contig_dim	is_contigr_   r`   r   r   ar)   s                            r   get_axes_specsri    s    ""$,,99K  "%%I 9; $**40 ; <L ?A %++D1 A BM  ,K&9#NO*HzIJt_ ;	Tzz!!tzz~~	::yy  tyy}}h7799~?@		7+ yy++C0A5"499==(;;y*56		Hm#<=&sDII6Ezz<<!!"A%**"MN"499==+>> tyy}}k::5;: JI"+J"7 fgj "499==+>>J%x0JsOI TQ&KK*Z!^"<Q"??"R"4
#3#7#7#ce e J*3HZ4H*I 5&&fg_,!$TS1!4J5 Q4y;&&/
50F&G 		3"C"&'q.3&C!"49==$BC C (""49==#DF F%z2JsO		3  b>DAq[JrND9D9"##%
 I;Az :s   
O;2P Pc                 V    t        |      t        j                  k\  rt        | d       yy)NzGMore dimensions than the maximum number of buffer dimensions were used.FT)r   r   buffer_max_dimsr   )r   re   s     r   validate_axesrl    s)    
4yG+++c 6 	7r   c                     dx}}t        |       dk(  r| dgk(  rd}||fS | d   dk(  rt        d | d d D              rd}||fS t        |       dkD  r| d   dk(  rt        d | dd  D              rd}||fS )	NFr   r  Tr   c              3   &   K   | ]	  }|d k(    yw)r"   r'   Nr   r   re  s     r   r   zis_cf_contig.<locals>.<genexpr>  s     Add))A   r   c              3   &   K   | ]	  }|d k(    ywro  r   rp  s     r   r   zis_cf_contig.<locals>.<genexpr>  s     >DD''>rq  )r   r   )r\   r]   r^   s      r   rU   rU     s     %%K+
5zQ5%9$:: ## )*
*
AeCRjA
A ## e*q.a''>E!"I>>##r   c                 L    t        |       \  }}|ry|ry| D ]  \  }}|dv s y y)Nr+   r8  rJ  r$   r&   )rU   r[   s        r   get_modert    s@    +E2K	  _$ r   )r$   r&   rc   )r#   r&   )r$   r%   r  )r#   r%   )r   r&   r   r   r   r   c                    d}d}dx}x}x}}	d}
t        |      D ]  \  }\  }}|dk(  s|}
 t        t        | |            D ]  \  }\  }\  }}||v r||v st        |d      |dk(  rd}n|d	k(  ra|rt        |d
      |
dz   t        |      dz
  f}||vr6|dk7  r1|
dz   t        |      dz
  k7  rd|z  }nd|d   z  }t        |d|z        |dk7  }n#|dk(  r|rt        |d      |s|st        |d      |dv sd} y )NrG  )r"   r#   r$   Fr   r#   zInvalid axes specification.r&   Tr%   z1Only one direct contiguous axis may be specified.r   zdimensions %d and %dzdimension %dr   z$Only %s may be contiguous and directr'   zAA memoryview cannot have both follow and strided axis specifiers.z$Invalid use of the follow specifier.rJ  )r   rX   r   r   )	positionsr\   r]   r^   r_  r^  
has_contig
has_followhas_stridedhas_generic_contiglast_indirect_dimensionr   r_   r`   r   valid_contig_dimsdimss                    r   r[  r[    s~   3M,L BGFJFFk,> "+E"2 *fgU?&)#* *33y%3H)I  %%c$FG,&=(s$ABBiK "3 )A B B !8! ;SZ!^ K++%*Q.#e*q.@14EED),=a,@@D"3(NQU(UVV5J "3(kll;"3(NOO_$K= r   c                     t        |t              rt        | |      S t        |t              rt	        | |      S t        |j                  t              rl   )r   r	   _resolve_NameNoder
   _resolve_AttributeNoder   r   rX  )r\  specs     r   rU  rU    sA    $! d++	D-	(%c400488[11r   c                 V   	 | j                  |j                        j                  }| j                         j                  j                  j                  }|j                  |      }|t        |j                  t              |S # t        $ r t        |j                  t
              w xY wrl   )rP  rV  AttributeErrorr   r   rX  rK  r   rL  rN  NOT_CIMPORTED_ERR)r\  noderesolved_namerN  r   s        r   r  r    s    2

499-22   "**77AAI]+E}488%677L  2488[112s   %B $B(c                 :   g }t        |t              r9|j                  d|j                         |j                  }t        |t              r9t        |t
              r|j                  d|j                         nt        |j                  t              |d d }|sJ | }|D ]F  }|j                  |      }|r|j                  st        |j                  d|z        |j                  }H |j                  |d         }|st        |j                  d|d   z        |S )Nr   r   zundeclared name not builtin: %szNo such attribute '%s')r   r
   insert	attributeobjr	   rV  r   r   EXPR_ERRrP  	as_module)r\  r  pathmodnamesr{   modnamemodr   s           r   r  r    s    D
T=
)At~~&xx T=
) $!Atyy!488X..CRyHOE ll7##--HH?'IK K LLb"E488%=R%HIILr   Nc                 4    t        j                  | dfd|i|S )NzMemoryView.pyxr   )r   loadutil_code_namer   kwargss      r   load_memview_cy_utilityr    s*    !!.2B =*1=5;= =r   c                 f    |t        j                  | dfi |S t        j                  | dfd|i|S )Nr   r   )r   r  r   r  s      r   r  r    sL    0@KFKK!&&~7G B/6B:@B 	Br   c                     | j                         j                  j                  }|j                          d|j                  j                  d      _        y )NTarray_cwrapper)rK  r   rL  rM  rN  rP  used)r\  rL  s     r   use_cython_array_utility_coder  #  sB    ##%--::L!!#;?L!!"238r   )memview_struct_namemax_dimsmemviewslice_namememslice_initMemviewSliceStructr?  AtomicsMemviewSliceInit)BUF_MAX_NDIMSMemviewSliceIndexBufferFormatFromTypeInfor  MemviewSliceIsContigOverlappingSlicesMemviewSliceCopyTemplatezView.MemoryView)arrayr.   r  r   r&   r   r   r   )FTrH  )r   rl   )d
__future__r   Errorsr   r    r   r   r	   r
   r   Coder   r   r   r   r   r   rQ  rR  rT  rY  rX  r  r  CF_ERRERR_UNINITIALIZEDr   format_flagrV   rW   memview_any_contiguousrY   rZ   MEMVIEW_DIRECTMEMVIEW_PTRMEMVIEW_FULLMEMVIEW_CONTIGMEMVIEW_STRIDEDMEMVIEW_FOLLOW_spec_to_const_spec_to_abbrevmemslice_entry_initmemview_namememview_typeptr_cnamememview_objstruct_cnamememviewslice_cnamer6   rN   rF   ra   rj   rq   r}   BufferEntryr   r   r  r   r  r  r  objectr  r  r  r6  rE  ri  rl  rU   rt  rW  r[  rU  r  r  r  r  r  rk  r   memviewslice_declare_codeatomic_utilityr   memviewslice_init_coder   _typeinfo_to_format_codetypeinfo_to_format_coder  overlapping_utilityrB  GetAndReleaseBufferUtilityCodebuffer_struct_declare_codebuffer_formats_declare_codecapsule_utility_codeview_utility_codeview_utility_whitelistr  r   r   r   r   <module>r     s)   & '  7 7  1 *   &	@;N+A J	GC $ < < @ % + '$%'(' "!"!
  6 / 0 * 0 BF,, AF4& F+Bc?!3!3 c?L5(@ E
F i 2y B5".Jod$( 211000# , \2>=B@ 3''+(	 3 
 (	7;/(?(?@'  44GH 1"f.M.M-NP  ++A7K ,-@'J 2  ,7&7793344(#%+113 1   " " ) )*; <  " " ) )*; <r   