
    |Led                     (   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 	 d dlZd dlmZ n# e$ r dZdZY nw xY wd Z G d	 d
e          Z G d de          Zed             Z G d de          Z G d de          ZdS )    N)memoize)Glyphinfer_interval_breaks)isrealngjitngjit_parallel)cudaprange)	cuda_argsc                 B     t           j         fd            fd}|S )Nc                     t          j        d          \  }}||j        d         k     r+||j        d         k     r | ||f                   |||f<   d S d S d S N   r      r
   gridshape)in_array	out_arrayijmappers       :lib/python3.11/site-packages/datashader/glyphs/quadmesh.pykernelz_cuda_mapper.<locals>.kernel   sh    y||1yq!!!a)/!*<&<&<$fXad^44IadOOO "!&<&<    c                     t          j        | j        d          }t          j        |           }  t          | j                           | |           |S )Nfloat64dtype)cupyzerosr   r
   	to_devicer   )r   r   r   s     r   cuda_mapz_cuda_mapper.<locals>.cuda_map   sO    Jx~Y???	>(++)y(()(I>>>r   )r
   jit)r   r$   r   s   ` @r   _cuda_mapperr&      sI    	X5 5 5 5 X5
     Or   c                   r    e Zd Zd Zed             Zed             Zd Zed             Zed             Z	dS )_QuadMeshLikec                 0    || _         || _        || _        d S Nxyname)selfr,   r-   r.   s       r   __init__z_QuadMeshLike.__init__%   s    			r   c                     dS )Nr    r/   s    r   ndimsz_QuadMeshLike.ndims*   s    qr   c                 *    | j         | j        | j        fS r*   r+   r3   s    r   inputsz_QuadMeshLike.inputs.   s    	**r   c                 h   t          |j        t          | j                                     st	          d          t          |j        t          | j                                     st	          d          t          |j        t          | j                                     st	          d          d S )Nzx must be realzy must be realzaggregate value must be real)r   measurestrr,   
ValueErrorr-   r.   )r/   	in_dshapes     r   validatez_QuadMeshLike.validate2   s    i'DF455 	=-...	)#df++677 	=-...	)#di..9:: 	=;<<<	= 	=r   c                     | j         S r*   )r,   r3   s    r   x_labelz_QuadMeshLike.x_label:   	    vr   c                     | j         S r*   )r-   r3   s    r   y_labelz_QuadMeshLike.y_label>   r?   r   N)
__name__
__module____qualname__r0   propertyr4   r6   r<   r>   rA   r2   r   r   r(   r(   $   s          
   X + + X+= = =   X   X  r   r(   c                   F    e Zd Z	 d
dZd Zd Zd Zd Zed             Z	d	S )QuadMeshRectilinearFTc                     ||         j         fddD             \  }}}}||k     rd}	||||f\  }}}}nd}	|d||z
  z  z
  |d||z
  z  z   f}
|s|	r|
d         |
d         f}
|r|                     |
          }
|
S )Nc                      g | ]
}|         S r2   r2   ).0r   valss     r   
<listcomp>zGQuadMeshRectilinear._compute_bounds_from_1d_centers.<locals>.<listcomp>J   s*     
 
 
DG
 
 
r   )r   r   TF      ?r   r   )valuesmaybe_expand_bounds)r/   xr_dsdimmaybe_expandorientv0v1v_nm1v_n
descendingboundsrK   s              @r   _compute_bounds_from_1d_centersz3QuadMeshRectilinear._compute_bounds_from_1d_centersD   s     Sz 
 
 
 
+
 
 
Bs
 88J!$eR!3BE33Jsb2g&cS5[.A(AB 	** 	*AYq	)F 	6--f55Fr   c                 <    |                      || j        d          S NT)rT   )r\   r,   r/   rR   s     r   compute_x_boundsz$QuadMeshRectilinear.compute_x_bounds^        33E46PT3UUUr   c                 <    |                      || j        d          S r^   )r\   r-   r_   s     r   compute_y_boundsz$QuadMeshRectilinear.compute_y_boundsa   ra   r   c                 V    |                      |          |                     |          fS r*   r`   rc   r_   s     r   compute_bounds_daskz'QuadMeshRectilinear.compute_bounds_daskd   )    $$U++T-B-B5-I-IIIr   c                      t          |          S r*   r   )r/   centerss     r   r   z)QuadMeshRectilinear.infer_interval_breaksg   s    $W---r   c           
      z   	
  j          j         j        
t                                         fd                        t
          j                                       fd                        	t                                         fd                        d	
 f	d	}|S )Nc                    ||          || dz            }}||k    r||}}||k    r|dz  }||         ||dz            }}||k    r||}}||k    r|dz  }t          ||          D ]!}	t          ||          D ]}
 || |	|
g|R   "d S Nr   )range)r   r   xsysaggs_and_colsx0ix1iy0iy1ixiyiappends              r   perform_extendz9QuadMeshRectilinear._build_extend.<locals>.perform_extendr   s     !ubQiCSyySczzq!ubQiCSyySczzq
 Coo 9 9S// 9 9BF1aR8-8888899 9r   c                     t          j        d          \  }}|| j        d         dz
  k     r"||j        d         dz
  k     r ||| |g|R   d S d S d S r   r   rn   ro   rp   r   r   rx   s        r   extend_cudaz6QuadMeshRectilinear._build_extend.<locals>.extend_cuda   sq     9Q<<DAqBHQK!O$$bhqkAo)>)>q!R<m<<<<<< %$)>)>r   c                     t          t          |           dz
            D ]0}t          t          |          dz
            D ]} ||| |g|R   1d S rl   )rm   lenrz   s        r   
extend_cpuz5QuadMeshRectilinear._build_extend.<locals>.extend_cpu   s~     3r77Q;'' A As2ww{++ A AA"N1aR@-@@@@@AA Ar   c                 V  	 ! ddl m} t          o$t          |%         j        t          j                  }|rt          '          }t          )          }	n'})}	|8|(         j        }
|rt          j        |
          }
&	                    |
          }|8|*         j        }|rt          j        |          }&	                    |          }|\  }}}}||z
  }||z
  }'|j
        u r	||z
  |z  }n ||          |z
  |z  })|j
        u r	||z
  |z  }n |	|          |z
  |z  }t          j        |dk    |dk    z            d         }t          j        |dk    |dk    z            d         }t          |          dk    st          |          dk    rd S t          |                                dz
  d          |                                dz   ct          |                                dz
  d          |                                dz   c !| d         j        d d         \  }}|dz            |z                      t$                                        d|          }| !dz            |z                      t$                                        d|          } $|                    *(          | d         j        d d                   }t+           !fd|D                       }| |z   }|r!#t-          |%         j                           }n"} |||g|R   d S )Nr   
LinearAxisr   r   c                 ,    g | ]}|f         S r2   r2   )rJ   cxm0xm1ym0ym1s     r   rL   zEQuadMeshRectilinear._build_extend.<locals>.extend.<locals>.<listcomp>   s+    AAA!!CGSW,-AAAr   )datashader.corer   r!   
isinstancedatandarrayr&   rP   arrayr   r   npwherer}   maxminr   astypeintclip	transposetupler   )+aggsrR   vtr[   x_breaksy_breaksr   use_cuda	x_mapper2	y_mapper2	x_centers	y_centersx0x1y0y1xspanyspanxscaledyscaledxindsyindsplot_height
plot_widthrn   ro   	cols_fullcolsrp   	do_extendr   r   r   r   r~   r{   infor.   r/   x_mapperx_namey_mappery_names+                                 @@@@r   extendz1QuadMeshRectilinear._build_extend.<locals>.extend   s\   222222J
5;+;T\ J JH  %(22	(22		$	$	 !&M0	 6 $
9 5 5I55i@@!&M0	 6 $
9 5 5I55i@@#NBBGEGE:,,,#b=E1$9X..3u<:,,,#b=E1$9X..3u<Hglw!|<==a@EHglw!|<==a@E5zzQ#e**//599;;?A..		aHC599;;?A..		aHC&*1gmBQB&7#K #cAg+&3;;C@@EEaTTB#cAg+&4<<SAAFFq+VVB U__VV<<d1gmBQB>OPPIAAAAAAAyAAABBD 4KM ''	%+2C(D(DE		&	Ib"-}------r   NNr,   r-   r.   r   expand_aggs_and_colsr
   r%   r/   r   r   r   rw   _antialias_stage_2_antialias_stage_2_funcsr   r~   r{   r.   rx   r   r   s   `````   @@@@@@r   _build_extendz!QuadMeshRectilinear._build_extendk   s?    y			"	"6	*	*	9 	9 	9 	9 
+	* 
	9. 
		"	"6	*	*	= 	= 	= 	= 
+	* 
	=
 
		"	"6	*	*	A 	A 	A 	A 
+	* 
	A
A	. A	. A	. A	. A	. A	. A	. A	. A	. A	. A	. A	. A	. A	.F r   N)FT)
rB   rC   rD   r\   r`   rc   rf   r   r   r   r2   r   r   rG   rG   C   s        9=   4V V VV V VJ J J. . . p p Wp p pr   rG   c                 H    |||z
  z  ||z
  z  }|||z
  z  | ||z
  z  z  }||fS r*   r2   )out_sizeout0out1src_sizesrc0src1translate_yscale_ys           r   build_scale_translater      s@    dTk*dTk:K4$;'Ht,DEGKr   c                   *    e Zd Zd Zed             ZdS )QuadMeshRasterc	                    t          ||                   }	|||	k    }
n[|\  }}|                     ||dd          \  }}t          j        ||z
  |	z            }t          j        ||z
  |z            }||k    }
t          ||                   }|||k    }n[|\  }}|                     ||dd          \  }}t          j        ||z
  |z            }t          j        ||z
  |z            }||k    }|
|fS )NFrT   rU   )r}   r\   mathfabs)r/   sourcer,   r-   r.   x_rangey_rangeout_wout_hsrc_wupsample_widthout_x0out_x1src_x0src_x1src_xbinsizeout_xbinsizesrc_hupsample_heightout_y0out_y1src_y0src_y1src_ybinsizeout_ybinsizes                            r   is_upsamplezQuadMeshRaster.is_upsample   s'   F1I?"e^NN$NFF!AAe B  NFF  9fvo%>??L9fvo%>??L)\9N F1I?#unOO$NFF!AAe B  NFF  9fvo%>??L9fvo%>??L*l:O..r   c           
      l   	
  j          j         j        
t          d             t          j        d             t                                         fd                        t          j                                       fd                        		 	 d	
 f	d	}|S )Nc           	      t   t          |	          D ]}t          t          j        ||dz   z  |z   |z
                      }t	          |          D ]h}t          t          j        ||dz   z  |z   |z
                      }|dk     s||k    s|dk     s|| k    rt
          j        |
||f<   Y|||f         |
||f<   id S )NrO   r   )r   r   r   floorrm   r   nan)r   r   translate_xr   scale_xr   offset_xoffset_yr   r   aggcolout_jsrc_jout_isrc_is                   r   upsample_cpuz2QuadMeshRaster._build_extend.<locals>.upsample_cpu  s    
   > >DJw%#+'>'Lx'WXXYY"5\\ > >E
7eck+B[+PS[+[ \ \]]EqyyEUNNeaii5E>>,.FE5L)),/u,=E5L))>> >r   c                 |   t          j        d          \  }}||k     r||	k     rt          t          j        ||dz   z  |z   |z
                      }t          t          j        ||dz   z  |z   |z
                      }|dk     s||k    s|dk     s|| k    rt
          j        |
||f<   d S |||f         |
||f<   d S d S d S )Nr   rO   r   )r
   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s                   r   upsample_cudaz3QuadMeshRaster._build_extend.<locals>.upsample_cuda  s    
  9Q<<LE5u}}DJw%#+'>'Lx'WXXYYDJw%#+'>'Lx'WXXYY199%!))u~~(*Cu%%%(+E5L(9Cu%%% }r   c
                    t          |	          D ]3}t          t          t          j        ||dz   z  |z   |z
            d                    }t          t          t          j        ||dz   z  |z   |z
            |                    }t          |          D ]}t          t          t          j        ||dz   z  |z   |z
            d                    }t          t          t          j        ||dz   z  |z   |z
            |                     }t          ||          D ]!}t          ||          D ]} ||||g|
R   "5d S )N        r         ?)r   r   r   r   r   r   rm   )r   r   r   r   r   r   r   r   r   r   rp   r   src_j0src_j1r   src_i0src_i1r   r   rw   s                      r   downsample_cpuz4QuadMeshRaster._build_extend.<locals>.downsample_cpu'  s      O OSJw%#+6DxOPPRS    SJw%#+6DxOPPRW    #5\\ 	O 	OE 
7eck#:[#H8#STTVW" "  F !
7eck#:[#H8#STTV[" "  F "'vv!6!6 O O%*66%:%: O OE"F5%NNNNNNOO	OO Or   c
                 *   t          j        d          \  }}||k     r||	k     rt          t          j        ||dz   z  |z   |z
            d          }t          t          j        ||dz   z  |z   |z
            |          }t          t          j        ||dz   z  |z   |z
            d          }t          t          j        ||dz   z  |z   |z
            |           }t          ||          D ]%}t          ||          D ]} ||||g|
R   "d S d S d S )Nr   r   r   r   )r
   r   r   r   r   r   rm   )r   r   r   r   r   r   r   r   r   r   rp   r   r   r   r   r   r   r   r   rw   s                      r   downsample_cudaz5QuadMeshRaster._build_extend.<locals>.downsample_cuda?  sk     9Q<<LE5u}}Jw%#+6DxOPPRS  Jw%#+6DxOPPRW  Jw%#+6DxOPPRS  Jw%#+6DxOPPRW  #6622 K KE!&vv!6!6 K KueUEJMJJJJJK }K Kr   c                 :  	 t           o$t          |!         j        t           j                  }| d         j        \  }}|\  }}}}t          j        ||z
  |z            }t          j        ||z
  |z            }|                    &%          }|!         j        \  }}|||
|||	|
|"                    |%dd          \  }}"                    |&dd          \  }}t          j        ||z
  |z            }
t          j        ||z
  |z            }t          ||||||          \  }}t          ||||||          \  }}dx}}	  || d         j        d d                   }t          |           t          |          z   }|dk    s|dk    s|dk    s|dk    rd S |
|k    rD||k    r>|r$t          ||f                   }n#} |||||||||	||| d         |d                   S |rt          ||f                   }n} |||||||||	||g
|R  S )Nr   Fr   r   )r!   r   r   r   r   r   r   r   r\   r   r   r   )'r   rR   r   r[   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rp   do_samplingr   r   r   r.   r/   r   r   r   r   s'                                 r   r   z,QuadMeshRaster._build_extend.<locals>.extendW  s    J
5;+;T\ J JH  7=LE5-3*FFFF9fvo%>??L9fvo%>??L OOFF33E ;,LE57?';+>$(8 (L,@!%!E!E6e "F " " "&!E!E6e "F " "  $y&6/U)BCC#y&6/U)BCC (=665&&( ($ (=665&&( ($ '('8 4tAw}RaR011D!$KK%++5MzzUaZZ5A::!--,,2N2N /"/	5%.0I0I"JKK".K"{5+{GWhud1gtAw    1"1)UEN2K2K"LKK"0K"{5+{GWhu7D   r   )NNNNNNNN)r,   r-   r.   r	   r
   r%   r   )r/   r   r   r   rw   r   r   r   r   r   r.   r   r   r   r   s   `  ``   @@@@@@@r   r   zQuadMeshRaster._build_extend  sG    y		> 	> 
	> 
	: 	: 
	: 
		"	"6	*	*	O 	O 	O 	O 
+	* 
	O, 
		"	"6	*	*	K 	K 	K 	K 
+	* 
	K. NRQUC	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	J r   N)rB   rC   rD   r   r   r   r2   r   r   r   r      sC        / / /: W W WW W Wr   r   c                   <    e Zd Zd Zd Zd Zd Zed             ZdS )QuadMeshCurvilinearc                     |                      || j                 j                  }t          j        |          }|                     |          S r*   )r   r,   rP   r   _compute_bounds_2drQ   )r/   rR   r   r[   s       r   r`   z$QuadMeshCurvilinear.compute_x_bounds  B    --eDFm.BCC)(33''///r   c                     |                      || j                 j                  }t          j        |          }|                     |          S r*   )r   r-   rP   r   r  rQ   )r/   rR   r   r[   s       r   rc   z$QuadMeshCurvilinear.compute_y_bounds  r  r   c                 V    |                      |          |                     |          fS r*   re   r_   s     r   rf   z'QuadMeshCurvilinear.compute_bounds_dask  rg   r   c                 J    t          |d          }t          |d          }|S )Nr   )axisr   r   )r/   ri   breakss      r   r   z)QuadMeshCurvilinear.infer_interval_breaks  s+    &wQ777&vA666r   c           
      z   	
  j          j         j        
t                                         fd                        t
          j                                       fd                        	t                                         fd                        d	
 f	d	}|S )Nc                    ||| f         |d<   ||| dz   f         |d<   ||dz   | dz   f         |d<   ||dz   | f         |d<   |d         |d<   ||| f         |d<   ||| dz   f         |d<   ||dz   | dz   f         |d<   ||dz   | f         |d<   |d         |d<   t          t          |d         |d                   t          |d         |d                             }||k    rd S t          |d          }t          t          |d         |d                   t          |d         |d                             }|dk     rd S t          ||          }t          t          |d         |d                   t          |d         |d                             }||k    rd S t          |d          }t          t          |d         |d                   t          |d         |d                             }|dk     rd S t          ||          }||k    s||k    rV||k    r||k     r|dz  }||k    r||k     r|dz  }t          ||          D ]!}t          ||          D ]} || ||g|R   "d S d|d d <   t          d          D ]7}||dz            ||         k    rd||<   ||dz            ||         k     rd||<   8t          ||          D ]
}d|	d d <   t          ||          D ]}d|
d d <   t          d          D ]}|	|         s||         |k     r||dz            |k     rd|	|<   ,||         |k    ||dz            |k    k    rd|	|<   O||         |z
  }||         |z
  }||dz            |z
  }||dz            |z
  }||z  ||z  z
  }|||         z  dk     |
|<   |
d         |
d         z   |
d         z   |
d         z   }|dz  dk    r || ||g|R   d S )Nr   r   r         rN   )r   r   rm   )r   r   r   r   rn   ro   xvertsyvertsyincreasingeligible	intersectrp   xminxmaxyminymaxrv   ru   kedge_iaxaybxbybxaintersectionsrw   s                             r   rx   z9QuadMeshCurvilinear._build_extend.<locals>.perform_extend  s    1a4F1I1a!e8F1I1q5!a%<(F1I1q5!8F1Iq	F1I1a4F1I1a!e8F1I1q5!a%<(F1I1q5!8F1Iq	F1I
 s6!9fQi00#fQi2K2KLLDz!!tQ<<Ds6!9fQi00#fQi2K2KLLDaxxtZ((Ds6!9fQi00#fQi2K2KLLD{""tQ<<Ds6!9fQi00#fQi2K2KLLDaxxt[))D t||tt||4<<D:$5$5AID4<<D;$6$6AIDd++ = =B#D$// = =q!R<m<<<<<= 
 KN1XX ( (!a%=6!9,,%&KNNAE]VAY..%'KND$'' 1= 1=d++ /= /=B#$IaaaL"'(( % %'/ %$
 $F^b00!'
!3b!8!8/0HV,$
 $F^b0!'
!3b!8: :/0HV,$ $F^b0#F^b0 $FQJ/"4#FQJ/"4  "Bwb0
 !$k&&9 9A = "&)) &aL9Q<7)A,FSTU " %q(A-- q!R<m<<<<_/=1= 1=r   c                    t           j                            dt          j        j                  }t           j                            dt          j        j                  }t           j                            dt          j        j                  }t           j                            dt          j        j                  }t           j                            dt          j        j                  }	t          j        d          \  }
}|
|j        d         dz
  k     r)||j        d         dz
  k     r |
|| ||||||||	g|R   d S d S d S )N   r   r  r   r   r   )	r
   localr   numbatypesint32int8r   r   )r   r   rn   ro   rp   r  r  r  r  r  r   r   rx   s               r   r{   z6QuadMeshCurvilinear._build_extend.<locals>.extend_cuda1  s3   
 Z%%au{/@%AAFZ%%au{/@%AAF
 ***1EK4D*EEK z''1A'BBH 
((%+2B(CCI9Q<<DAqBHQK!O$$bhqkAo)>)>q+z2rFK9 #      %$)>)>r   c                    t          j        dt           j                  }t          j        dt           j                  }t          j        dt           j                  }t          j        dt           j                  }t          j        dt           j                  }	|j        \  }
}t          |dz
            D ]*}t          |
dz
            D ]} ||| ||||||||	g|R   +d S )Nr  r   r  r   )r   r"   r"  r#  onesr   rm   )r   r   rn   ro   rp   r  r  r  r  r  y_lenx_lenr   r   rx   s                 r   r~   z5QuadMeshCurvilinear._build_extend.<locals>.extend_cpuN  s    Xarx000FXarx000F
 (1BG444K wq000H "'222IHME5519%%  uqy))  A"N1k:r2XyKX     r   c                   	 ddl m} t          o$t          |         j        t          j                  }|rt                     }t          "          }	n }"}	|8|!         j        }
|rt          j        |
          }
	                    |
          }|8|#         j        }|rt          j        |          }	                    |          }|\  }}}}||z
  }||z
  } |j
        u r	||z
  |z  }n ||          |z
  |z  }"|j
        u r	||z
  |z  }n |	|          |z
  |z  }| d         j        d d         \  }}||z                      t                    }||z                      t                    }|j        !         j        }|   |j        | | d         j        d d                   z   }|r!t#          |         j                           }n} |||||g|R   d S )Nr   r   r   )r   r   r!   r   r   r   r&   rP   r   r   r   r   r   r   coordsdimsr   r   )$r   rR   r   r[   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rn   ro   
coord_dimsrp   r   r~   r{   r   r.   r/   r   r   r   r   s$                              r   r   z1QuadMeshCurvilinear._build_extend.<locals>.extendl  sP   222222J
5;+;T\ J JH  %(22	(22		$	$	 !&M0	 6 $
9 5 5I55i@@!&M0	 6 $
9 5 5I55i@@ $NBBGEGE:,,,#b=E1$9X..3u<:,,,#b=E1$9X..3u<&*1gmBQB&7#KJ&..s33BK'//44Bf-2J 44(Dd1gmTVUVTVFW#X#XXM ''	%+2C(D(DE		&	IZR2?     r   r   r   r   s   `````   @@@@@@r   r   z!QuadMeshCurvilinear._build_extend  s2    y			"	"6	*	*s	= s	= s	= s	= 
+	* 
s	=j 
		"	"6	*	*	 	 	 	 
+	* 
	6 
		"	"6	*	*	 	 	 	 
+	* 
	86	 6	 6	 6	 6	 6	 6	 6	 6	 6	 6	 6	 6	 6	p r   N)	rB   rC   rD   r`   rc   rf   r   r   r   r2   r   r   r   r     ss        0 0 0
0 0 0
J J J   p p Wp p pr   r   )r   toolzr   numpyr   datashader.glyphs.glyphr   datashader.resamplingr   datashader.utilsr   r   r	   r   r
   r   r!   )datashader.transfer_functions._cuda_utilsr   	Exceptionr&   r(   rG   r   r   r   r2   r   r   <module>r3     s              ) ) ) ) ) ) 7 7 7 7 7 7 : : : : : : : : : :         KKKCCCCCCC   DIII
       E   >Y Y Y Y Y- Y Y Yx      v v v v v( v v vrE E E E E- E E E E Es   
= 	A	A	