B
     \Q1                 @   s,  d dl mZmZ 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 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 )    )print_functiondivision)
namedtupleN   )
_helperlib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   /lib/python3.7/site-packages/numba/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  }t|j|j	|j|jddS d S )Nr   r   F)r   r   r   r   r   T)

isinstancesliceindicesr   r   r   abs_compute_sizer   r   )	r   itemr   r   stepr   r   retZslicedr   r   r   __getitem__5   s,    

zDim.__getitem__c             C   s   | j || j  S )N)r   r   )r   idxr   r   r   
get_offsetQ   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__T   s    zDim.__repr__c             C   s$   t | j| | j| | j| j| jdS )N)r   r   r   r   r   )r   r   r   r   r   r   )r   baser   r   r   	normalizeX   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 )N)r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   copy\   s    zDim.copyc             C   s
   | j |kS )N)r   )r   itemsizer   r   r   is_contiguousi   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 )N)r!   ).0idr   r   r   	<genexpr>n   s    z compute_index.<locals>.<genexpr>)sumzip)r   dimsr   r   r   compute_indexm   s    r4   c               @   s    e Zd ZdZdd Zdd ZdS )ElementFc             C   s
   || _ d S )N)extent)r   r6   r   r   r   r   t   s    zElement.__init__c             c   s   | j V  d S )N)r6   )r   r   r   r   iter_contiguous_extentw   s    zElement.iter_contiguous_extentN)r(   r)   r*   is_arrayr   r7   r   r   r   r   r5   q   s   r5   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   sN   g }x>t ||D ]0\}}t||||  ||dd}|| d}qW | ||S )NF)r   r   )r2   r   append)	clsoffsetshapestridesr&   r3   ZashapeZastridedimr   r   r   	from_desc   s    
zArray.from_descc             C   sn   t || _t| j| _t dd | jD | _t dd | jD | _|| _t| j| _	| 
 | _|  | _d S )Nc             s   s   | ]}|j V  qd S )N)r   )r-   r?   r   r   r   r0      s    z!Array.__init__.<locals>.<genexpr>c             s   s   | ]}|j V  qd S )N)r   )r-   r?   r   r   r   r0      s    )tupler3   lenr
   r=   r>   r&   npprodr   _compute_extentr6   _compute_layoutflags)r   r3   r&   r   r   r   r      s    

zArray.__init__c             C   sz   i }| j sd|d< d|d< |S | j d | j}| j d | j}dd }|oZ|t| j |d< |op|t| j |d< |S )NTF_CONTIGUOUSC_CONTIGUOUSr   c             S   s>   t | }x0| D ](}|jdkr2|j|j |jkr2dS |}qW dS )Nr   FT)nextr   r   )ZtraverseZlastr?   r   r   r   	is_contig   s    
z(Array._compute_layout.<locals>.is_contig)r3   r'   r&   iterreversed)r   rG   ZleftmostZ	rightmostrL   r   r   r   rF      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   )r-   sr   r   r   
<listcomp>   s    z)Array._compute_extent.<locals>.<listcomp>)r
   r=   r4   r3   r&   maxr   )r   ZfirstidxZlastidxr   r   r   r   r   rE      s    
zArray._compute_extentc             C   s   d| j | jf S )Nz<Array dims=%s itemsize=%s>)r3   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 x t||k rf|td d  qHW d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   )r-   r?   itr   r   r   rP      s    z%Array.__getitem__.<locals>.<listcomp>c             S   s   g | ]}|j s|jqS r   )r   r   )r-   r/   r   r   r   rP      s    r   )r   rA   listrB   r3   
IndexErrorr:   r   r2   r9   r&   reshaper5   r6   )r   r   Znitemr
   r3   newshapearrr   r   r   r      s    

zArray.__getitem__c             C   s
   | j d S )NrI   )rG   )r   r   r   r   is_c_contig   s    zArray.is_c_contigc             C   s
   | j d S )NrH   )rG   )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 }xttj	| D ]$}t
||}||j ||j fV  qW n@dd | jD }x.tj	| D ] }t
|| j}||| j fV  qW dS )z Generates extents
        r   rJ   r   Nc             S   s   g | ]}t |qS r   )range)r-   rO   r   r   r   rP      s    z0Array.iter_contiguous_extent.<locals>.<listcomp>c             S   s   g | ]}t |qS r   )rZ   )r-   rO   r   r   r   rP     s    )rX   rY   r6   r3   r   r=   r'   r&   	itertoolsproductr4   r   r   )r   ZinnerdimZ	outerdimsZ
outershapeZoslenr   r#   r<   r   r   r   r7      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t|}|dkrp| j	rldnd}|| j
krtd| js| j	r|dkrtt| |}n |dkrt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s8td| j| jj||| jd}
|
t|  fS )NorderCzunknown keyword arguments %sCFAzorder not C|F|AAFz%reshape changes the size of the arrayZunreachable)Zdtypezreshape would require copy)r=   r>   r&   )r
   rB   r=   pop	TypeErrorkeys
ValueErrorrC   rD   rY   r   rX   rS   iter_strides_c_contigiter_strides_f_contigr   empty	ctypeslibc_intpZarrayr>   r   r&   NotImplementedErrorr@   r6   r   r7   )r   ZnewdimsZkwsZoldndZnewndr]   Znewsize
newstridesZolddimsZ
oldstridesr   r   r   r   rU     sJ    



zArray.reshapeNc       	      C   s   g g  }}|d krLxt | j| jD ]$\}}|dkr"|| || q"W ntt|ts\|f}x"|D ]}| j| dkrbtdqbW x>tt | j| jD ](\}\}}||kr|| || qW | j| j	j
||| jd}|t|  fS )Nr   zDcannot select an axis to squeeze out which has size not equal to one)r=   r>   r&   )r2   r=   r>   r:   r   rA   re   	enumerater@   r6   r   r&   rS   r7   )	r   ZaxisrV   rl   lengthr   Zaxr.   Znewarrr   r   r   squeeze<  s,    




 

zArray.squeezer^   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 )Nr_   zorder not C|F|Ar   r^   ra   zravel on non-contiguous array)re   r
   rX   rY   r   r&   r@   r6   r   rS   r7   rk   )r   r]   rV   rl   rW   r   r   r   ravelX  s    
zArray.ravel)N)r^   )r(   r)   r*   r+   r8   classmethodr@   r   rF   rE   r"   r   propertyrX   rY   r7   rU   ro   rp   r   r   r   r   r9   {   s   

6
r9   c             c   sN   |dkr| j n|}| j}|V  d}x&|dd D ]}||9 }|| V  q0W dS )z#yields the f-contigous strides
    Nr   rJ   )r=   r&   )rW   r=   r&   r1   rO   r   r   r   rg   k  s    rg   c             #   sH   dkr| j n| j  fdd}xtt| D ]
}|V  q6W dS )z#yields the c-contigous strides
    Nc              3   s:    V  d} x*t dd  D ]}| |9 } |   V  qW d S )Nr   )rN   )r1   rO   )r&   r=   r   r   gen}  s
    z"iter_strides_c_contig.<locals>.gen)r=   r&   rN   rS   )rW   r=   rs   r.   r   )r&   r=   r   rf   w  s
    rf   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 )N)r   r   )r-   rR   r   r   r   r0     s    z&is_element_indexing.<locals>.<genexpr>T)r   r   rA   rB   any)r   r
   r   r   r   is_element_indexing  s    

ru   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)Z
__future__r   r   collectionsr   r[   	functoolsoperatorZctypesZnumpyrC    r   r   Z	CFUNCTYPEZc_intZc_longri   Z	ndpointerrj   Z	c_helpersr   objectr   r4   r5   r9   rg   rf   ru   r   r   r   r   r   <module>   s8   P
 q

