U
    ,d7                     @   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 )DimzA 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   9/tmp/pip-unpacked-wheel-eu7e0c37/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rt	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rd|d< ||j9 }qH| j}| j D ]2}|jdkr|j|krd|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rdd |D }tj	| D ]$}t
||}||j ||j fV  qn<dd | jD }tj	| D ] }t
|| j}||| j fV  qd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~|}qtd	q`||	9 }q`|dkr|dks| j| dkrt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st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   s|   |dkrt d| jdkr| S |dkr,| js:|dkrp| jrp| jf}| jf}| | jj||| j}|t	| 
 fS tdd S )Nrj   rk   r   CAZFAzravel on non-contiguous array)rr   r	   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   ctypesZnumpyrv   Znumbar   Z
numba.corer   r   	CFUNCTYPEc_intc_longrx   Z	ndpointerry   Z	c_helpersr
   objectr   r:   r;   rA   ru   rt   r   r   r   r   r   r   <module>   s>   
R
  

