a
    Dfd                     @   s   d dl Z d dlmZ d dlZd dlmZ d dlmZ d dl	m
Z
mZmZ d dlZd dlmZmZ zd dlZd dlmZ W n ey   dZdZY n0 dd	 ZG d
d deZG dd deZedd ZG dd deZG dd deZdS )    N)memoize)Glyphinfer_interval_breaks)isrealngjitngjit_parallel)cudaprange)	cuda_argsc                    s"   t jfdd  fdd}|S )Nc                    sF   t d\}}||jd k rB||jd k rB | ||f |||f< d S N   r      r	   gridshape)in_array	out_arrayij)mapper g/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/datashader/glyphs/quadmesh.pykernel   s    z_cuda_mapper.<locals>.kernelc                    s2   t j| jdd}t| }  t| j | | |S )Nfloat64Zdtype)cupyzerosr   r	   Z	to_devicer   )r   r   )r   r   r   cuda_map   s    
z_cuda_mapper.<locals>.cuda_map)r	   jit)r   r   r   )r   r   r   _cuda_mapper   s    r    c                   @   sL   e Zd Zdd Zedd Zedd Zdd Zed	d
 Zedd Z	dS )_QuadMeshLikec                 C   s   || _ || _|| _d S Nxyname)selfr$   r%   r&   r   r   r   __init__%   s    z_QuadMeshLike.__init__c                 C   s   dS )Nr   r   r'   r   r   r   ndims*   s    z_QuadMeshLike.ndimsc                 C   s   | j | j| jfS r"   r#   r)   r   r   r   inputs.   s    z_QuadMeshLike.inputsc                 C   s\   t |jt| j stdn:t |jt| j s<tdnt |jt| j sXtdd S )Nzx must be realzy must be realzaggregate value must be real)r   Zmeasurestrr$   
ValueErrorr%   r&   )r'   Z	in_dshaper   r   r   validate2   s    

z_QuadMeshLike.validatec                 C   s   | j S r"   )r$   r)   r   r   r   x_label:   s    z_QuadMeshLike.x_labelc                 C   s   | j S r"   )r%   r)   r   r   r   y_label>   s    z_QuadMeshLike.y_labelN)
__name__
__module____qualname__r(   propertyr*   r+   r.   r/   r0   r   r   r   r   r!   $   s   


r!   c                   @   sB   e Zd ZdddZdd Zdd Zd	d
 Zdd Zedd Z	dS )QuadMeshRectilinearFTc                    s   || j   fdddD \}}}}||k rFd}	||||f\}}}}nd}	|d||   |d||   f}
|s|	r|
d |
d f}
|r| |
}
|
S )	Nc                    s   g | ]} | qS r   r   ).0r   valsr   r   
<listcomp>J   s   zGQuadMeshRectilinear._compute_bounds_from_1d_centers.<locals>.<listcomp>)r   r   TF      ?r   r   )valuesmaybe_expand_bounds)r'   xr_dsZdimmaybe_expandorientZv0Zv1Zv_nm1Zv_nZ
descendingboundsr   r7   r   _compute_bounds_from_1d_centersD   s    

 
z3QuadMeshRectilinear._compute_bounds_from_1d_centersc                 C   s   | j || jddS NT)r@   )rC   r$   r'   r?   r   r   r   compute_x_bounds^   s    z$QuadMeshRectilinear.compute_x_boundsc                 C   s   | j || jddS rD   )rC   r%   rE   r   r   r   compute_y_boundsa   s    z$QuadMeshRectilinear.compute_y_boundsc                 C   s   |  || |fS r"   rF   rG   rE   r   r   r   compute_bounds_daskd   s    z'QuadMeshRectilinear.compute_bounds_daskc                 C   s   t |S r"   r   )r'   centersr   r   r   r   g   s    z)QuadMeshRectilinear.infer_interval_breaksc              
      s   j j
jt  fddtj fddt fddd		
f	dd	}|S )
Nc                    s   ||  || d   }}||kr(|| }}||kr8|d7 }|| ||d   }}||kr`|| }}||krp|d7 }t ||D ]*}	t ||D ]}
 || |	|
g|R   qqzd S Nr   )range)r   r   xsysaggs_and_colsZx0iZx1iZy0iZy1ixiyiappendr   r   perform_extendr   s    

z9QuadMeshRectilinear._build_extend.<locals>.perform_extendc                    sL   t d\}}|| jd d k rH||jd d k rH ||| |g|R   d S r   r   rM   rN   rO   r   r   rT   r   r   extend_cuda   s    $z6QuadMeshRectilinear._build_extend.<locals>.extend_cudac                    sF   t t| d D ]0}t t|d D ]} ||| |g|R   q$qd S rK   )rL   lenrU   rV   r   r   
extend_cpu   s    z5QuadMeshRectilinear._build_extend.<locals>.extend_cpuc                    sf  ddl m} to t| jtj}|r8t	}t}	n	}}	|d u rj|
 j}
|r`t|
}
	|
}|d u r| j}|rt|}	|}|\}}}}|| }|| }	|j
u r|| | }n||| | }|j
u r|| | }n|	|| | }t|dk|dk@ d }t|dk|dk@ d }t|dksPt|dkrTd S t| d d| d   t| d d| d  | d jd d \}}| d  | td|}|d  | td|}|
| d jd d }t fdd|D }| | }|rLt| j }n}|||g|R   d S )Nr   
LinearAxisr   r   c                    s    g | ]}| f qS r   r   )r6   cZxm0Zxm1Zym0Zym1r   r   r9          zEQuadMeshRectilinear._build_extend.<locals>.extend.<locals>.<listcomp>)datashader.corer[   r   
isinstancedatandarrayr    r=   arrayr   r   npwhererX   maxminr   astypeintZclip	transposetupler   )aggsr?   vtrB   x_breaksy_breaksr[   use_cuda	x_mapper2	y_mapper2	x_centers	y_centersx0x1y0y1xspanyspanxscaledyscaledZxindsZyindsplot_height
plot_widthrM   rN   Z	cols_fullcolsrO   	do_extend	rY   rW   infor&   r'   x_mapperx_namey_mappery_namer]   r   extend   sT    








  "" z1QuadMeshRectilinear._build_extend.<locals>.extend)NNr$   r%   r&   r   expand_aggs_and_colsr	   r   r'   r   r   r   rS   Z_antialias_stage_2Z_antialias_stage_2_funcsr   r   rS   rY   rW   r   r&   rT   r'   r   r   r   r   r   _build_extendk   s    Cz!QuadMeshRectilinear._build_extendN)FT)
r1   r2   r3   rC   rF   rG   rI   r   r   r   r   r   r   r   r5   C   s    
r5   c                 C   s4   |||  ||  }|||  | ||   }||fS r"   r   )Zout_sizeZout0Zout1Zsrc_sizeZsrc0Zsrc1translate_yscale_yr   r   r   build_scale_translate   s    r   c                   @   s    e Zd Zdd Zedd ZdS )QuadMeshRasterc	                 C   s   t || }	|d u r||	k}
nJ|\}}| j||ddd\}}t|| |	 }t|| | }||k}
t || }|d u r||k}nJ|\}}| j||ddd\}}t|| | }t|| | }||k}|
|fS )NFr@   rA   )rX   rC   mathfabs)r'   sourcer$   r%   r&   Zx_rangeZy_rangeout_wout_hsrc_wZupsample_widthout_x0out_x1src_x0src_x1src_xbinsizeout_xbinsizesrc_hZupsample_heightout_y0out_y1src_y0src_y1src_ybinsizeout_ybinsizer   r   r   is_upsample   s*    



zQuadMeshRaster.is_upsamplec              
      s   j j	jtdd tjdd t  fddtj  fddd	f	d	d
	}|S )Nc                 S   s   t |	D ]}tt||d  | | }t|D ]f}tt||d  | | }|dk st||kst|dk st|| krtj|
||f< q2|||f |
||f< q2qd S )Nr<   r   )r
   ri   r   floorrL   rd   nan)r   r   translate_xr   scale_xr   offset_xoffset_yr   r   aggcolout_jsrc_jout_isrc_ir   r   r   upsample_cpu  s     z2QuadMeshRaster._build_extend.<locals>.upsample_cpuc                 S   s   t d\}}||k r||	k rtt||d  | | }tt||d  | | }|dk sz||ksz|dk sz|| krtj|
||f< n|||f |
||f< d S )Nr   r<   r   )r	   r   ri   r   r   rd   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   upsample_cuda  s     z3QuadMeshRaster._build_extend.<locals>.upsample_cudac
              	      s   t |	D ]}ttt||d  | | d}ttt||d  | | |}t|D ]}ttt||d  | | d}ttt||d  | | | }t||D ]*}t||D ]} ||||g|
R   qqq\qd S )N        r         ?)r
   ri   rf   r   r   rg   rL   )r   r   r   r   r   r   r   r   r   r   rO   r   src_j0src_j1r   src_i0src_i1r   r   rR   r   r   downsample_cpu'  s"    z4QuadMeshRaster._build_extend.<locals>.downsample_cpuc
                    s   t d\}}||k r||	k rtt||d  | | d}tt||d  | | |}tt||d  | | d}tt||d  | | | }t||D ]*}t||D ]} ||||g|
R   qqd S )Nr   r   r   r   )r	   r   rf   r   r   rg   rL   )r   r   r   r   r   r   r   r   r   r   rO   r   r   r   r   r   r   r   r   rR   r   r   downsample_cuda?  s"    z5QuadMeshRaster._build_extend.<locals>.downsample_cudac                    s   t ot| jt j}| d j\}}|\}}}}t|| | }t|| | }|}| j\}}|d u s|d u s|d u s|d u s|d u s|	d u s|
d u s|d u r4j|ddd\}}j|ddd\}}t|| | }
t|| | }t	||||||\}}t	||||||\}}d }}	|| d jd d }t
| t
| }|dks|dks|dks|dkrd S |
|kr||kr|rt||f }n}|||||||||	||| d |d S |rt||f }n }|||||||||	||g
|R  S d S )Nr   Fr   r   )r   r`   ra   rb   r   r   r   rj   rC   r   rk   r   )rl   r?   rm   rB   r   r   r   r   r   r   r   r   rp   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rO   Zdo_sampling)	r   r   r   r&   r'   r   r   r   r   r   r   r   W  sp    

(z,QuadMeshRaster._build_extend.<locals>.extend)NNNNNNNN)r$   r%   r&   r   r	   r   r   r   r   )
rS   r   r   r   r&   r'   r   r   r   r   r   r     s"    

  EzQuadMeshRaster._build_extendN)r1   r2   r3   r   r   r   r   r   r   r   r      s   r   c                   @   s8   e Zd Zdd Zdd Zdd Zdd Zed	d
 ZdS )QuadMeshCurvilinearc                 C   s&   |  || j j}t|}| |S r"   )r   r$   r=   r   _compute_bounds_2dr>   )r'   r?   rn   rB   r   r   r   rF     s    
z$QuadMeshCurvilinear.compute_x_boundsc                 C   s&   |  || j j}t|}| |S r"   )r   r%   r=   r   r   r>   )r'   r?   ro   rB   r   r   r   rG     s    
z$QuadMeshCurvilinear.compute_y_boundsc                 C   s   |  || |fS r"   rH   rE   r   r   r   rI     s    z'QuadMeshCurvilinear.compute_bounds_daskc                 C   s   t |dd}t |dd}|S )Nr   )Zaxisr   r   )r'   rJ   Zbreaksr   r   r   r     s    z)QuadMeshCurvilinear.infer_interval_breaksc              
      s   j j
jt  fddtj fddt fddd		
f	dd	}|S )
Nc                    s  ||| f |d< ||| d f |d< ||d | d f |d< ||d | f |d< |d |d< ||| f |d< ||| d f |d< ||d | d f |d< ||d | f |d< |d |d< t t |d |d t |d |d }||krd S t|d}tt|d |d t|d |d }|dk r(d S t ||}t t |d |d t |d |d }||krfd S t|d}tt|d |d t|d |d }|dk rd S t ||}||ks||kr8||kr||k r|d7 }||kr||k r|d7 }t||D ].}t||D ]} || ||g|R   qqd S d|d d < tdD ]D}||d  || krpd||< n||d  || k rLd||< qLt||D ]F}d|	d d < t||D ]&}d|
d d < tdD ]}|	| sq|| |k r||d  |k rd|	|< q|| |k||d  |kkr:d|	|< q|| | }|| | }||d  | }||d  | }|| ||  }|||  dk |
|< q|
d |
d  |
d  |
d  }|d dkr || ||g|R   qqd S )Nr   r   r         r;   )rg   rf   rL   )r   r   r}   r~   rM   rN   xvertsyvertsyincreasingeligible	intersectrO   ZxminZxmaxZyminZymaxrQ   rP   kZedge_iaxZaybxZbyZbxaZintersectionsrR   r   r   rT     s    	&
&

&

&





z9QuadMeshCurvilinear._build_extend.<locals>.perform_extendc                    s   t jjdtjjd}t jjdtjjd}t jjdtjjd}t jjdtjjd}t jjdtjjd}	t d\}
}|
|jd d k r||jd d k r |
|| ||||||||	g|R   d S )N   r   r   r   r   r   )	r	   localrc   numbatypesint32int8r   r   )r}   r~   rM   rN   rO   r   r   r   r   r   r   r   rV   r   r   rW   1  s    $
z6QuadMeshCurvilinear._build_extend.<locals>.extend_cudac                    s   t jdt jd}t jdt jd}t jdt jd}t jdt jd}t jdt jd}	|j\}
}t|d D ]:}t|
d D ](} ||| ||||||||	g|R   qvqfd S )Nr   r   r   r   )rd   r   r   r   Zonesr   rL   )r}   r~   rM   rN   rO   r   r   r   r   r   Zy_lenZx_lenr   r   rV   r   r   rY   N  s    

z5QuadMeshCurvilinear._build_extend.<locals>.extend_cpuc                    s  ddl m} to t| jtj}|r8t}t}	n}}	|d u rj| j}
|r`t|
}
	|
}|d u r| j}|rt|}	|}|\}}}}|| }|| }|j
u r|| | }n||| | }|j
u r|| | }n|	|| | }| d jd d \}}|| t}|| t}|j j}| |j| | d jd d  }|rzt| j }n }|||||g|R   d S )Nr   rZ   r   )r_   r[   r   r`   ra   rb   r    r=   rc   r   r   r   rh   ri   Zcoordsdimsrj   r   )rl   r?   rm   rB   rn   ro   r[   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   rM   rN   Z
coord_dimsrO   r   r   r   r   r   l  sN    








"z1QuadMeshCurvilinear._build_extend.<locals>.extend)NNr   r   r   r   r   r     s    u8z!QuadMeshCurvilinear._build_extendN)	r1   r2   r3   rF   rG   rI   r   r   r   r   r   r   r   r     s   r   )r   Ztoolzr   numpyrd   Zdatashader.glyphs.glyphr   Zdatashader.resamplingr   Zdatashader.utilsr   r   r   r   r	   r
   r   Z)datashader.transfer_functions._cuda_utilsr   	Exceptionr    r!   r5   r   r   r   r   r   r   r   <module>   s,   
 
 :