o
    Niz                     @   s  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	 d dl
mZ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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(d) Z)	+dd,d-Z*	*dd.d/Z+d0d1 Z,d2d3 Z-d4d5 Z.dd7d8Z/G d9d: d:ej0Z1d;d< Z2d=d> Z3d?d@ Z4dAdB Z5dCdD Z6ddEdFZ7G dGdH dHZ8G dIdJ dJe8Z9G dKdL dLe8Z:dMdN Z;dOdP Z<dQdR Z=dSdT Z>dUdV Z?dWdX Z@dYdZd[d\d]d^d_ZAd`da ZBdbdc ZCddde ZDdfdg ZEddidjZF	kddhdldmdnZGdodp ZHejIejJejKjLdqdrZMdsdt ZNeGdudveMdwZOeGdxZPdydz ZQd{d| ZReGd}ZSeGd~ZTeGdZUeGdZVeGdeMdlZWeGdZXe	jYdd ZZe	jYdd Z[dd Z\dZ]dhS )   )CompileErrorerror)	ExprNodes)IntNodeNameNodeAttributeNode)Options   )Utils)UtilityCodeTempitaUtilityCode)CythonUtilityCodeCythonSharedUtilityCode)Buffer)Naming)
PyrexTypesz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)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_c                 C   s    | d|   | d|   d S )Nz%s.data = NULL;z%s.memview = NULL;)putln)mv_cnamecode r*   N/home/ubuntu/.local/lib/python3.10/site-packages/Cython/Compiler/MemoryView.pyput_init_entry:   s   r,   FTc           	   	   C   s   |j jsJ | p| }|r| }n|jj|dd}|d|||f  t	| ||||||d |s>|j
| dS dS )zEWe can avoid decreffing the lhs if we know it is the first assignmentF
manage_ref%s = %s;)have_gilfirst_assignmentN)typeis_memoryviewsliceresult_in_temp	is_simpleresult	funcstateallocate_tempr'   	result_asput_assign_to_memviewslicerelease_temp)		lhs_cnamelhs_typelhs_posrhsr)   r0   r1   
pretty_rhsrhstmpr*   r*   r+   put_acquire_memoryviewsliceC   s   
rB   c                 C   sR   | |kr| d d S |s|j| ||d | s|| | d| |f  d S )Nz&/* memoryview self assignment no-op */r0   r/   )r'   put_xdecrefr4   make_owned_memoryviewslice)r<   r?   	rhs_cnamememviewslicetyper)   r0   r1   r*   r*   r+   r:   X   s   

r:   c                 C   s@   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packingr*   r*   r+   get_buf_flagsj   s   rT   c                 C   s$   dg| }| | j t| j|S )Nr   r   )extendaxesr   MemoryViewSliceTypedtype)memoryviewtypenrW   r*   r*   r+   insert_newaxesz   s   
r\   c                 C   s8   t | j|j }| j|jk rt| ||fS | t||fS N)absndimr\   )srcdstr[   r*   r*   r+   broadcast_types   s   rb       c                 C   s   | j r	| jjr	dS | tju rdS | jr)| jdkr)| jjD ]
}t	|j
s& dS qdS | jpK| jo:|dk o:t	| j|d pK| jpK| jpK| jpK| joKt	| 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_dtyper2   is_erroris_array	base_type
is_numericis_pyobjectis_fused
is_typedeftypedef_base_type)rY   imemberr*   r*   r+   rn      s,   

rn   c                   @   sJ   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdddZ	dd Z
dS )MemoryViewSliceBufferEntryz
    May be used during code generation time to be queried for
    shape/strides/suboffsets attributes, or to perform indexing or slicing.
    c                 C   sD   || _ |j| _|j| _d| j | _| j jj}t|| _|   d S )Nz%s.data)	entryr2   cnamebuf_ptrrY   r   CPtrTypebuf_ptr_typeinit_attributes)selfrz   rY   r*   r*   r+   __init__   s   
z#MemoryViewSliceBufferEntry.__init__c                 C   
   |  dS )N%s.suboffsets[%d]_for_all_ndimr   r*   r*   r+   get_buf_suboffsetvars      
z0MemoryViewSliceBufferEntry.get_buf_suboffsetvarsc                 C   r   )N%s.strides[%d]r   r   r*   r*   r+   get_buf_stridevars   r   z-MemoryViewSliceBufferEntry.get_buf_stridevarsc                 C   r   )N%s.shape[%d]r   r   r*   r*   r+   get_buf_shapevars   r   z,MemoryViewSliceBufferEntry.get_buf_shapevarsc                    s&    fddt | jjD }| ||S )Nc                    s$   g | ]\}\}}| | ||fqS r*   r*   ).0dimrR   rS   index_cnamesr*   r+   
<listcomp>   s    
zJMemoryViewSliceBufferEntry.generate_buffer_lookup_code.<locals>.<listcomp>)	enumerater2   rW   _generate_buffer_lookup_code)r   r)   r   rW   r*   r   r+   generate_buffer_lookup_code   s   

z6MemoryViewSliceBufferEntry.generate_buffer_lookup_codeTc                 C   s  | j }| jj }|D ]r\}}}}	d| j|f }
d| j|f }d| j|f }t||	}|dv r>|jt d||||f }n9|dkrPd|||f }d||f }n'|d	kr\d
|||f }n|dkrhd|||f }n|dkspJ |d|||f }d||f }q|rd||f 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(%s, %s, %s, %s)indirectz(%s + %s * %s)z(*((char **) %s) + %s)indirect_contiguousz(*((char **) %s + %s) + %s)r   
contiguousz((char *) (((%s *) %s) + %s))z( /* dim=%d */ %s )z((%s *) %s))	r|   r2   rY   empty_declaration_coder{   get_memoryview_flagglobalstateuse_utility_codememviewslice_index_helpers)r   r)   rW   cast_resultbufp	type_declr   indexrR   rS   shapestride	suboffsetflagr*   r*   r+   r      s2   

z7MemoryViewSliceBufferEntry._generate_buffer_lookup_codec              	      s  | j } dt    dt    j|||d tdd | jjD }	g  fdd}
d}d	}|D ]}|jrQd
D ]\}} d||||f  q<|d7 }q5|d7 }| jj| \}}|jrt	t }d
 D ]}t||}|j  }|d| < |r| nd||< qi|d s|d s|d s||d< d}n
d} |j|d< |d7 }n8| }|dk}|r|dk}|d	krt|jd  S t	t t|d t|d d}|d r݈ |j|d< d}tj|d|d\}} | q5r jd	  d S d S )!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;rC   c                 s   s    | ]	\}}|d kV  qdS )r   Nr*   )r   rR   rS   r*   r*   r+   	<genexpr>  s    zHMemoryViewSliceBufferEntry.generate_buffer_slice_code.<locals>.<genexpr>c                     s6   s j jtjdd}  d|   |  d S )NFr-   z%s = -1;rc   )r7   r8   r   
c_int_typer'   append)suboffset_dimr)   suboffset_dim_tempr*   r+   get_suboffset_dim  s
   
zPMemoryViewSliceBufferEntry.generate_buffer_slice_code.<locals>.get_suboffset_dimrc   ))r   r   )stridesrc   )
suboffsetsr   z%s.%s[%d] = %d;r   zstart stop stephave_0
have_start	have_stop	have_steprR   SimpleSlice
ToughSlice
error_gotor   r   z7All preceding dimensions must be indexed and not sliced
wraparoundboundscheck)r   r   
SliceIndexMemoryView_C.ccontextN)r{   r'   localsput_incref_memoryviewsliceallr2   rW   is_noneis_slicedictsplitgetattrr6   r   posr   intr   load_as_stringputr7   r;   )r   r)   indicesra   dst_typer0   have_slices
directivesr`   all_dimensions_directr   r   new_ndimr   attribvaluerR   rS   r!   r%   idxhave_idx	util_namer   r   r&   implr*   r   r+   generate_buffer_slice_code   sd   




z5MemoryViewSliceBufferEntry.generate_buffer_slice_codeN)T)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r*   r*   r*   r+   ry      s    
.ry   c                 C   s   t | }t j| |||dS )N)startstopstep)r   NoneNode	SliceNode)r   noner*   r*   r+   empty_sliceO  s   
r   c                 C   s   g }d}d}dd | D }t | t | }| D ]5}t|tjr?d}t|j}|r.|| q|| d }	||g|	  d}q|pF|jpF|j	}|| qt |t | }
|
|k rld}||
 }	|t| d jg|	  |||fS )NFc                 S   s   g | ]}|j r|qS r*   )r   )r   newaxisr*   r*   r+   r   Z  s    zunellipsify.<locals>.<listcomp>Tr   r   )
len
isinstancer   EllipsisNoder   r   r   rV   r   r   )r   r_   r6   seen_ellipsisr   newaxes	n_indicesr   
full_slicenslicesresult_lengthr*   r*   r+   unellipsifyU  s,   

r   c                 C   s   | dkr
|dv r
dS | dkr|dkrdS | dkr|dv rdS | dkr(|dkr(dS | d	kr2|dv r2d
S | |fdks>J | |fdS )Nr   )r   r    r   r   r   r   r   r   r   r   r   r   r   r*   )rR   rS   r*   r*   r+   r   u  s   r   c                 C   s   | dv sJ d| |f S )NCFz!__pyx_memviewslice_is_contig_%s%dr*   )contig_typer_   r*   r*   r+   get_is_contig_func_name  s   r   c                 C   s.   | dv sJ t t|| d}td|tgd}|S )Nr   )r_   r   MemviewSliceCheckContigr   requires)r   template_contextload_memview_c_utilityis_contig_utility)r   r_   r   utilityr*   r*   r+   get_is_contig_utility  s   r   c                 C   s,   | j s| jr|st| |||S t| |||S r]   )rP   rQ   ContigSliceIterStridedSliceIter)
slice_typeslice_resultr_   r)   force_stridedr*   r*   r+   
slice_iter  s   r  c                   @   s   e Zd Zdd ZdS )	SliceIterc                 C   s   || _ || _|| _|| _d S r]   )r   r   r)   r_   )r   r   r   r_   r)   r*   r*   r+   r     s   
zSliceIter.__init__N)r   r   r   r   r*   r*   r*   r+   r    s    r  c                   @      e Zd Zdd Zdd ZdS )r   c                    st    j }|   jj }d fddt jD }|d|  |d |d|| j	f  |d dS )	Nz * c                 3   s    | ]
}d  j |f V  qdS )r   N)r   )r   rw   r   r*   r+   r     s    z.ContigSliceIter.start_loops.<locals>.<genexpr>z"Py_ssize_t __pyx_temp_extent = %s;zPy_ssize_t __pyx_temp_idx;z(%s *__pyx_temp_pointer = (%s *) %s.data;zPfor (__pyx_temp_idx = 0; __pyx_temp_idx < __pyx_temp_extent; __pyx_temp_idx++) {__pyx_temp_pointer)
r)   begin_blockr   rY   r   joinranger_   r'   r   )r   r)   r   
total_sizer*   r   r+   start_loops  s   

zContigSliceIter.start_loopsc                 C   s&   | j d | j d | j   d S )Nz__pyx_temp_pointer += 1;})r)   r'   	end_blockr   r*   r*   r+   	end_loops  s   zContigSliceIter.end_loopsNr   r   r   r	  r  r*   r*   r*   r+   r     s    r   c                   @   r  )r   c                 C   s   | j }|  t| jD ]$}|| j|f}|d|  |d|  |d|  |d|  q|d| j  t| jD ]}|dkrO|d||d f  |d	||||f  q>d
| jd  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;rc   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)r)   r  r  r_   r   r'   )r   r)   rw   tr*   r*   r+   r	    s    
zStridedSliceIter.start_loopsc                 C   sF   | j }t| jd ddD ]}|d||f  |d q|  d S )Nr   r   z.__pyx_temp_pointer_%d += __pyx_temp_stride_%d;r
  )r)   r  r_   r'   r  )r   r)   rw   r*   r*   r+   r    s
   zStridedSliceIter.end_loopsNr  r*   r*   r*   r+   r     s    r   c                 C   s    | j rd}nd}d|  |f S )Nr$   r#   z!__pyx_memoryview_copy_slice_%s_%s)rP   specialization_suffix)memviewc_or_fr*   r*   r+   copy_c_or_fortran_cname  s   r  c                 C   s   |j |j kr|j jr|j j|j kst| d d S t|jt|jkr)t| d d S |js6|js6t| d d S |jD ]\}}|dkrIt| d  d S q9|jrRd}t}n	|jsWJ d}t	}t
dtt||j  ||jt|t|j jd	d
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_flagr_   
func_cnamedtype_is_objectr   )rY   is_cv_qualifiedcv_base_typer   r   rW   rP   rQ   rI   rJ   r   r   r   r   r_   r  r   rs   )r   from_memview
to_memviewrR   rS   r  r  r*   r*   r+   get_copy_new_utility  sF   





r  c                    s  | j j}|  |j t fdddD }t fdddD }d\}}d\}}|d}	}
g }t|D ]l\}}|jjsCt|jj	t
|jjsNt|jj	t|jjrZ|||f q4t|jtrw|j| d	krot|jj	t||	d
f q4t|jttfrt| |j}|jtv r|t|j  q4t|jj	tt|jj	td}d}t|D ]\}\}}|d
kr|rt|jj	t|}|df||< d}q|rY|t|d	 krd}nd}|r||d	  d dvrt|| j	d|r
d}tt|D ]\}\}}|dv r	t|| d	 }q|d	 }t|| }t||| D ]-\}\}}|d	 | }|dkr5t|| j	d|dkrBt|| j	d||
f||< q|rY|d \}}|df|d< tdd |D ||| |S )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'
    c                       g | ]}  |qS r*   lookupr   name	viewscoper*   r+   r         z"get_axes_specs.<locals>.<listcomp>)r   r   r   c                    r  r*   r   r"  r$  r*   r+   r     r&  r   r   r    FFrU   r    r   cfcontigrc   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 contiguousc                 S   s   g | ]}|j jqS r*   )r   r   r   axisr*   r*   r+   r   v  s    )r   cython_scopeload_cythonscoper%  tupler   r   r   r   r   	START_ERRr   STOP_ERRr   r   r   r   compile_time_valueSTEP_ERRr   r   _get_resolved_specr#  view_constant_to_access_packingINVALID_ERRBOTH_CF_ERRr   reversedvalidate_axes_specs)envrW   cythonscopeaccess_specspacking_specsrQ   rP   default_accessdefault_packing	cf_access
cf_packing
axes_specsr   r,  rz   
contig_dim	is_contigrR   rS   r   r   ar"   r*   r$  r+   get_axes_specs  s   



	



rF  c                 C   s    t |tjkrt| d dS dS )NzGMore dimensions than the maximum number of buffer dimensions were used.FT)r   r   buffer_max_dimsr   )r   rW   r*   r*   r+   validate_axes~  s   
rH  c                 C   s   d }}t | dkr| dgkrd}||fS | d dkr.tdd | d d D r.d}||fS t | dkrI| d dkrItd	d | dd  D rId}||fS )
NFr   r   Tr   c                 s       | ]}|d kV  qdS )r   r    Nr*   r+  r*   r*   r+   r         zis_cf_contig.<locals>.<genexpr>rc   c                 s   rI  rJ  r*   r+  r*   r*   r+   r     rK  )r   r   )rO   rP   rQ   r*   r*   r+   rH     s   rH   c                 C   s<   t | \}}|r
dS |rdS | D ]\}}|dv r dS qdS )Nr$   r  r*  r   r   )rH   rN   r*   r*   r+   get_mode  s   rL  )r   r   rU   )r   r   )r   r   r   )r   r   )r   r   r   r   r   r   c                 C   s:  d}d}d } } }}	d}
t |D ]\}\}}|dkr|}
qt t| |D ]t\}\}\}}||v r6||v s;t|d|dkrBd}nR|d	kr|rMt|d
|
d t|d f}||vr{|dkr{|
d t|d krnd| }nd|d  }t|d| |dk}n|dkr|rt|d|s|st|d|dv rd}q&d S )Nr'  )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 %drc   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.r*  )r   rK   r   r   )	positionsrO   rP   rQ   r=  r<  
has_contig
has_followhas_stridedhas_generic_contiglast_indirect_dimensionr   rR   rS   r   valid_contig_dimsdimsr*   r*   r+   r9    sB   





r9  c                 C   s4   t |tr
t| |S t |trt| |S t|jtr]   )r   r   _resolve_NameNoder   _resolve_AttributeNoder   r   r6  )r:  specr*   r*   r+   r4    s
   



r4  c                 C   sZ   z	|  |jj}W n ty   t|jtw | jjj}| |}|d u r+t|jt	|S r]   )
r!  r#  AttributeErrorr   r   r6  r   r-  r%  NOT_CIMPORTED_ERR)r:  noderesolved_namer%  rz   r*   r*   r+   rU    s   

rU  c                 C   s   g }t |tr|d|j |j}t |tst |tr#|d|j nt|jt	|d d }|s3J | }|D ]}|
|}|rC|jsKt|jd| |j}q7|
|d }|sbt|jd|d  |S )Nrc   r   zundeclared name not builtin: %szNo such attribute '%s')r   r   insert	attributeobjr   r#  r   r   EXPR_ERRr!  	as_module)r:  rZ  pathmodnamesrl   modnamemodrz   r*   r*   r+   rV    s,   





rV  Nc                 K   s   t j| dfd|i|S )NzMemoryView.pyxr   )r   load)util_code_namer   kwargsr*   r*   r+   load_memview_cy_utility  s
   rh  r   r   c                K   s4   |d u rt j| |fi |S tj| |fd|i|S )Nr   )r   re  r   )rf  util_code_filenamer   rg  r*   r*   r+   r     s   r   c                 C   s.   | j jrd S | j j}|  d|jd_d S )NTarray_cwrapper)r   shared_utility_qualified_namer-  r.  r%  r!  used)r:  r-  r*   r*   r+   use_cython_array_utility_code#  s
   rm  re   )max_dimsmemviewslice_namememslice_initTHREAD_LOCKS_PREALLOCATEDc                  C   s   t dtg d} | S )NMemviewSliceStructr   )r   r   )memviewslice_declare_coder*   r*   r+   _get_memviewslice_declare_code1  s   rt  AtomicszSynchronization.c)ri  r   MemviewSliceIndexc                   C   s   t dtjgdS )NBufferFormatFromTypeInfo)r   )rh  r   _typeinfo_to_format_coder*   r*   r*   r+   _get_typeinfo_to_format_code=  s   ry  c                 C   s   | r
t d| tg dS t S )NzBufferFormatFromTypeInfo.pxdr   r   )r   r   ry  rk  r*   r*   r+   get_typeinfo_to_format_codeA  s   r|  MemviewSliceIsContigOverlappingSlicesMemviewRefcountMemviewSliceInitrr  MemviewSliceCopyc                  C   s&   t dttjtjttttt	t
gd} | S )NzView.MemoryViewr   )rh  r   r   buffer_struct_declare_codebuffer_formats_declare_coders  refcount_utilityatomic_utilityr   overlapping_utilitycopy_contents_new_utility)memoryview_utility_coder*   r*   r+   _get_memoryview_utility_codeT  s   r  c              	   C   s"   t d| ttjtjtttgd}|S )NzMemoryView.pxdrz  )r   r   r   r  r  rs  r  r  )rk  shared_utility_coder*   r*   r+   #_get_memoryview_shared_utility_codeh  s   r  c                 C   s   | rt | S t S r]   )r  r  r{  r*   r*   r+   get_view_utility_codey  s   r  )array
memoryviewrj  r   r   r   r   r   )FTr(  )rc   )Fr]   )r   )^Errorsr   r    r   r   r   r   r   r
   Coder   r   r   r   r   r   r   r0  r1  r3  r7  r6  rY  r_  CF_ERRERR_UNINITIALIZEDformat_flagrI   rJ   memview_any_contiguousrL   rM   MEMVIEW_DIRECTMEMVIEW_PTRMEMVIEW_FULLMEMVIEW_CONTIGMEMVIEW_STRIDEDMEMVIEW_FOLLOW_spec_to_const_spec_to_abbrevr,   rB   r:   rT   r\   rb   rn   BufferEntryry   r   r   r   r   r   r  r  r   r   r  r  rF  rH  rH   rL  r5  r9  r4  rU  rV  rh  r   rm  rG  memviewslice_cnamerX   default_valuer   rt  r  r   ry  r|  r   r  r  slice_init_utilityrs  r  cached_functionr  r  r  view_utility_allowlistr*   r*   r*   r+   <module>   s    





! ' 
!
'r		.	



