U
    hâËd„7  ã                   @   s(  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZ edddgƒZe ejejejjejjdd	�ejjejjdd	�ejejjejjdd	�ejjejjdd	�ejej¡	e	jd
 ƒZG dd„ deƒZdd„ ZG dd„ deƒZG dd„ deƒZddd„Zddd„Zdd„ Zdd„ ZdS )é    )Ú
namedtupleN)Ú
_helperlib)ÚconfigÚExtentÚbeginÚendé   )ÚndimÚattempt_nocopy_reshapec                   @   sN   e Zd 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 )ÚDimzÃA single dimension of the array

    Attributes
    ----------
    start:
        start offset
    stop:
        stop offset
    size:
        number of items
    stride:
        item stride
    ©ÚstartÚstopÚsizeÚstrideÚsinglec                 C   s2   || _ || _|| _|| _|| _|r.|dks.t‚d S ©Nr   )r   r   r   r   r   ÚAssertionError©Úselfr   r   r   r   r   © r   úN/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/misc/dummyarray.pyÚ__init__,   s    zDim.__init__c           	      C   sÎ   t |tƒr~| | j¡\}}}|| j }| j|t| jƒ  }| j|t| jƒ  }|dkr\d}nt|||ƒ}t||||dd�}|S |dkr–| ||d … n
| dd … }|jdkr°t	‚t|j|j
|j|jdd�S d S )Nr   r   Fr   éÿÿÿÿT)Ú
isinstanceÚsliceÚindicesr   r   r   ÚabsÚ_compute_sizer   Ú
IndexErrorr   )	r   Úitemr   r   Ústepr   r   ÚretZslicedr   r   r   Ú__getitem__4   s4    

û$
ûzDim.__getitem__c                 C   s   | j || j  S ©N)r   r   )r   Úidxr   r   r   Ú
get_offsetR   s    zDim.get_offsetc                 C   s   d}|| j | j| j| jf S )Nz*Dim(start=%s, stop=%s, size=%s, stride=%s))r   r   r   r   )r   Zstrfmtr   r   r   Ú__repr__U   s    zDim.__repr__c                 C   s$   t | j| | j| | j| j| jd�S )Nr   )r   r   r   r   r   r   )r   Úbaser   r   r   Ú	normalizeY   s
      ÿzDim.normalizeNc                 C   sV   |d kr| j }|d kr| j}|d kr*| j}|d kr8| j}|d krF| j}t|||||ƒS r$   )r   r   r   r   r   r   r   r   r   r   Úcopy]   s    zDim.copyc                 C   s
   | j |kS r$   ©r   )r   Úitemsizer   r   r   Úis_contiguousj   s    zDim.is_contiguous)NNNNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r   r#   r&   r'   r)   r*   r-   r   r   r   r   r      s   
r   c                 C   s   t dd„ t| |ƒD ƒƒS )Nc                 s   s   | ]\}}|  |¡V  qd S r$   )r&   )Ú.0ÚiÚdr   r   r   Ú	<genexpr>o   s     z compute_index.<locals>.<genexpr>)ÚsumÚzip)r   Údimsr   r   r   Úcompute_indexn   s    r:   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚElementFc                 C   s
   || _ d S r$   ©Úextent)r   r=   r   r   r   r   u   s    zElement.__init__c                 c   s   | j V  d S r$   r<   ©r   r   r   r   Úiter_contiguous_extentx   s    zElement.iter_contiguous_extentN)r.   r/   r0   Úis_arrayr   r?   r   r   r   r   r;   r   s   r;   c                   @   s„   e Zd ZdZdZedd„ ƒZdd„ Zdd„ Zd	d
„ Z	dd„ Z
dd„ Zedd„ ƒZedd„ ƒZdd„ Zdd„ Zddd„Zddd„ZdS )ÚArrayaû  A dummy numpy array-like object.  Consider it an array without the
    actual data, but offset from the base data pointer.

    Attributes
    ----------
    dims: tuple of Dim
        describing each dimension of the array

    ndim: int
        number of dimension

    shape: tuple of int
        size of each dimension

    strides: tuple of int
        stride of each dimension

    itemsize: int
        itemsize

    extent: (start, end)
        start and end offset containing the memory region
    Tc           	      C   sJ   g }t ||ƒD ]0\}}t||||  ||dd�}| |¡ d}q| ||ƒS )NF)r   r   )r8   r   Úappend)	ÚclsÚoffsetÚshapeÚstridesr,   r9   ZashapeZastrideÚdimr   r   r   Ú	from_desc–   s    ÿ
zArray.from_descc                 C   st   t |ƒ| _t| jƒ| _t dd„ | jD ƒƒ| _t dd„ | jD ƒƒ| _|| _t t	j
| jd¡| _|  ¡ | _|  ¡ | _d S )Nc                 s   s   | ]}|j V  qd S r$   )r   ©r3   rG   r   r   r   r6   £   s     z!Array.__init__.<locals>.<genexpr>c                 s   s   | ]}|j V  qd S r$   r+   rI   r   r   r   r6   ¤   s     r   )Útupler9   Úlenr	   rE   rF   r,   Ú	functoolsÚreduceÚoperatorÚmulr   Ú_compute_extentr=   Ú_compute_layoutÚflags)r   r9   r,   r   r   r   r       s    

zArray.__init__c                 C   sÐ   | j sdddœS tdd„ | j D ƒƒr.dddœS dddœ}| j}t| j ƒD ]B}|jdkrddddœ  S |jdkrH|j|kr€d|d< ||j9 }qH| j}| j D ]2}|jdkr˜|j|krÀd|d	< |  S ||j9 }q˜|S )
NT)ÚC_CONTIGUOUSÚF_CONTIGUOUSc                 S   s   g | ]}|j d k‘qS )r   r+   rI   r   r   r   Ú
<listcomp>µ   s     z)Array._compute_layout.<locals>.<listcomp>Fr   r   rS   rT   )r9   Úanyr,   Úreversedr   r   )r   rR   ÚsdrG   r   r   r   rQ   ª   s*    








zArray._compute_layoutc                 C   sN   dg| j  }dd„ | jD ƒ}t|| jƒ}t|| jƒ| j }t||ƒ}t||ƒS )Nr   c                 S   s   g | ]}|d  ‘qS )r   r   ©r3   Úsr   r   r   rU   Ò   s     z)Array._compute_extent.<locals>.<listcomp>)r	   rE   r:   r9   r,   Úmaxr   )r   ZfirstidxZlastidxr   r   r   r   r   rP   Ð   s    
zArray._compute_extentc                 C   s   d| j | jf S )Nz<Array dims=%s itemsize=%s>)r9   r,   r>   r   r   r   r'   Ø   s    zArray.__repr__c                 C   s´   t |tƒs|g}nt|ƒ}t|ƒ}t| jƒ}||krFtd|| f ƒ‚t|ƒ|k rd| td d ƒ¡ qFdd„ t| j|ƒD ƒ}dd„ |D ƒ}t	|| j
ƒ}|r¦|j|Ž d S t|jƒS d S )Nz%d extra indices givenc                 S   s   g | ]\}}|  |¡‘qS r   )r#   )r3   rG   Úitr   r   r   rU   ê   s     z%Array.__getitem__.<locals>.<listcomp>c                 S   s   g | ]}|j s|j‘qS r   )r   r   )r3   r5   r   r   r   rU   ë   s      r   )r   rJ   ÚlistrK   r9   r   rB   r   r8   rA   r,   Úreshaper;   r=   )r   r    Znitemr	   r9   ÚnewshapeÚarrr   r   r   r#   Û   s    

zArray.__getitem__c                 C   s
   | j d S )NrS   ©rR   r>   r   r   r   Úis_c_contigó   s    zArray.is_c_contigc                 C   s
   | j d S )NrT   ra   r>   r   r   r   Úis_f_contig÷   s    zArray.is_f_contigc                 c   s  | j s| jr| jV  nî| jd j| jd jk rV| jd }| jdd… }| jdd… }n&| jd }| jdd… }| jdd… }| | j¡rÈdd„ |D ƒ}tj	|Ž D ]$}t
||ƒ}||j ||j fV  q n<dd„ | jD ƒ}tj	|Ž D ] }t
|| jƒ}||| j fV  qâdS )z Generates extents
        r   r   r   Nc                 S   s   g | ]}t |ƒ‘qS r   ©ÚrangerY   r   r   r   rU     s     z0Array.iter_contiguous_extent.<locals>.<listcomp>c                 S   s   g | ]}t |ƒ‘qS r   rd   rY   r   r   r   rU     s     )rb   rc   r=   r9   r   rE   r-   r,   Ú	itertoolsÚproductr:   r   r   )r   ZinnerdimZ	outerdimsZ
outershapeZoslenr   r(   rD   r   r   r   r?   û   s$    



zArray.iter_contiguous_extentc              
   O   s  | j }t|ƒ}|| jkr | d fS | dd¡}|r@td| ¡  ƒ‚|dkrPtdƒ‚d}d}t|ƒD ]0\}}	|	dk rˆ|dkr~|}q�td	ƒ‚q`||	9 }q`|dkrâ|dks°| j| dkrºtd
ƒ‚n(|d|… | j| f ||d d …  }t	 
tj|d¡}
|dk�r| j�rdnd}|
| jk�r tdƒ‚| j�s0| j�rn|dk�rJtt| |ƒƒ}n"|dk�rdtt| |ƒƒ}ntdƒ‚npt |tjj¡}tj| jtjjd�}tj| jtjjd�}tj|tjjd�}t||||||| j|dkƒ�sÞtdƒ‚| j| jj||| jd�}|t|  ¡ ƒfS )NÚorderÚCzunknown keyword arguments %sÚCFAúorder not C|F|Ar   r   r   z&can only specify one unknown dimensionz.cannot infer valid shape for unknown dimensionÚAÚFz%reshape changes the size of the arrayZunreachable)Zdtypezreshape would require copy©rE   rF   r,   ) r	   rK   rE   ÚpopÚ	TypeErrorÚkeysÚ
ValueErrorÚ	enumerater   rL   rM   rN   rO   rc   rb   r]   Úiter_strides_c_contigÚiter_strides_f_contigr   ÚnpÚemptyÚ	ctypeslibÚc_intpÚarrayrF   r
   r,   ÚNotImplementedErrorrH   r=   r   r?   )r   ZnewdimsÚkwsZoldndZnewndrh   Z
unknownidxZ	knownsizer4   rG   ZnewsizeÚ
newstridesZolddimsZ
oldstridesr"   r   r   r   r^     sp    





ÿþ



ø
 ÿzArray.reshapeNc           	      C   sÜ   g g  }}|d krHt | j| jƒD ]$\}}|dkr | |¡ | |¡ q nlt|tƒsX|f}|D ]}| j| dkr\tdƒ‚q\tt | j| jƒƒD ](\}\}}||krŠ| |¡ | |¡ qŠ| j| j	j
||| jd�}|t|  ¡ ƒfS )Nr   zDcannot select an axis to squeeze out which has size not equal to onern   )r8   rE   rF   rB   r   rJ   rr   rs   rH   r=   r   r,   r]   r?   )	r   Zaxisr_   r}   Úlengthr   Zaxr4   Znewarrr   r   r   Úsqueezea  s0    


ÿ
üzArray.squeezeri   c                 C   sn   |dkrt dƒ‚|dkr| js,|dkrb| jrb| jf}| jf}|  | jj||| j¡}|t|  	¡ ƒfS t
dƒ‚d S )Nrj   rk   ÚCAZFAzravel on non-contiguous array)rr   rb   rc   r   r,   rH   r=   r   r]   r?   r{   )r   rh   r_   r}   r`   r   r   r   Úravel}  s    ÿÿÿzArray.ravel)N)ri   )r.   r/   r0   r1   r@   ÚclassmethodrH   r   rQ   rP   r'   r#   Úpropertyrb   rc   r?   r^   r   r�   r   r   r   r   rA   |   s"   
	
&

L
rA   c                 c   sJ   |dkr| j n|}| j}|V  d}|dd… D ]}||9 }|| V  q.dS )z$yields the f-contiguous strides
    Nr   r   )rE   r,   )r`   rE   r,   r7   rZ   r   r   r   ru   �  s    ru   c                 #   sD   ˆdkr| j nˆ‰| j‰ ‡ ‡fdd„}tt|ƒ ƒƒD ]
}|V  q4dS )z$yields the c-contiguous strides
    Nc                  3   s6   ˆ V  d} t ˆdd … ƒD ]}| |9 } | ˆ  V  qd S r   )rW   )r7   rZ   ©r,   rE   r   r   ÚgenŸ  s
    z"iter_strides_c_contig.<locals>.gen)rE   r,   rW   r]   )r`   rE   r…   r4   r   r„   r   rt   ™  s
    rt   c                 C   sD   t | tƒrdS t | tƒr<t| ƒ|kr@tdd„ | D ƒƒs@dS ndS dS )NFc                 s   s   | ]}t |tƒV  qd S r$   )r   r   )r3   r\   r   r   r   r6   °  s     z&is_element_indexing.<locals>.<genexpr>T)r   r   rJ   rK   rV   )r    r	   r   r   r   Úis_element_indexingª  s    

r†   c                 C   s@   |dkr| }|}n|}| }| }||kr,dS || d | d S )z1Algorithm adapted from cpython rangeobject.c
    r   r   r   )r   r   r!   ÚloÚhir   r   r   r   ¹  s    r   )N)N)Úcollectionsr   rf   rL   rN   ÚctypesÚnumpyrv   Znumbar   Z
numba.corer   r   Z	CFUNCTYPEÚc_intZc_longrx   Z	ndpointerry   Z	c_helpersr
   Úobjectr   r:   r;   rA   ru   rt   r†   r   r   r   r   r   Ú<module>   s>   ÷
öR
  

