a
    S/bL                     @   s   d dl Z d dlZd dlZdddZdZdddZdd	d
ZdddZdddZ	dddZ
d ddZdd Zd!ddZdd ZdS )"    N   c                 K   s   t tt| }t| r$tdt|s4tdt| dkrHtdt| dkrht	| fd|i|S t| dkrt
| fd|i|S t| dkrt| fd|i|S t| fd|i|S d	S )
zConvert chunks from Dask Array into an SVG Image

    Parameters
    ----------
    chunks: tuple
    size: int
        Rough size of the image

    Returns
    -------
    text: An svg string depicting the array as a grid of chunks
    zbCan't generate SVG with unknown chunk sizes.

 A possible solution is with x.compute_chunk_sizes()z+Can't generate SVG with 0-length dimensionsr   z$Can't generate SVG with 0 dimensions   size      N)tuplemapsumnpZisnananyNotImplementedErroralllensvg_1dsvg_2dsvg_3dsvg_nd)chunksr   kwargsshape r   -lib/python3.9/site-packages/dask/array/svg.pysvg   s     r   z9font-size="1.0rem" font-weight="100" text-anchor="middle"r   r   c                 C   s   t tt| }|pt||d}t| |\}}t|||||d\}\}	}
}}d|
d |d f }d}|d dkrtd}nd}d	d
d|
d |d t|d f d|
d |d t||
d |d |d f g}|d||  | S )Nr   offsetskewr   G<svg width="%d" height="%d" style="stroke:rgb(0,0,0);stroke-width:1" >
2   
</svg>r   d      <!-- Text -->#  <text x="%f" y="%f" %s >%d</text>r      r   ?  <text x="%f" y="%f" %s transform="rotate(%d,%f,%f)">%d</text>
r   r   r	   
draw_sizesgrid_pointssvg_grid
text_stylejoin)r   r   r   r   sizesr   yxlinesmin_xmax_xmin_ymax_yheaderfooterrotatetextr   r   r   r   +   s0    
$	r   c                 C   s  t tt| }|pt||d}t| |\}}}|\}}	t|d ||d |	d fd|d\}
\}}}}t||d |d |	d fd|d\}\}}}}t|||| d |	| fd|d\}\}}}}d	|d
 |d
 f }d}|d dkrd}nd}ddd|| d |d t|d f d|d || d t||d || d |d f d|| d d ||| d  d t|| d d ||| d  d |d f g}|d|
| | |  | S )Nr   g333333?
   r   )r   r   r   )r   r   r   r   r   r    r   r!   r"   r#   r$   r%   r   r&   r'   z?  <text x="%f" y="%f" %s transform="rotate(45,%f,%f)">%d</text>r(   r)   )r   r   r/   r   r   r1   r0   zZoxZoyZxyZmnxZmxxZmnyZmxyZzx_r4   ZzyZmin_zZmax_zr5   r6   r7   r8   r9   r:   r   r   r   r   K   s^    


r   c                 C   s.  t | d dkrd|  } ttt| }t||d}| }|}g }d}d}|rt |d pZd}	t|d |	 |d |	 |dfd}
||	d  }||	d  }|
d}|d }tt	d|
 d }t||}tt	d	|
 d }||d
 7 }d|dd }
||
 qFd||f }d}|d| | S )Nr   r   )r   r   r   )r/   r   r(   zheight="(\d*\.?\d*)"zwidth="(\d*\.?\d*)"r;   r   r    z

)r   r   r   r	   r*   r   splitfloatresearchgroupsmaxr.   append)r   r   r   r/   Zchunks2Zsizes2outleftZtotal_heightnor2   r7   Zheightwidthr8   r   r   r   r      s8    "

r   r&   c                    st   t  }||kr(tjd|d |dd}nt|} fdd|D }|d dd|d< |d	 dd|d	< |S )
a5  Convert points into lines of text for an SVG plot

    Examples
    --------
    >>> svg_lines([0, 1], [0, 0], [10, 11], [1, 1])  # doctest: +NORMALIZE_WHITESPACE
    ['  <line x1="0" y1="0" x2="10" y2="1" style="stroke-width:2" />',
     '  <line x1="1" y1="0" x2="11" y2="1" style="stroke-width:2" />']
    r   r   int)Zdtypec                    s,   g | ]$}d  | | | | f qS )z*  <line x1="%d" y1="%d" x2="%d" y2="%d" />r   ).0ix1x2y1y2r   r   
<listcomp>   s   zsvg_lines.<locals>.<listcomp>z /z style="stroke-width:2" /r?   )r   r
   Zlinspacerangereplace)rP   rR   rQ   rS   max_nrI   indicesr2   r   rO   r   	svg_lines   s    	rY   c                 C   s6  t ||d  }||d  }t || d |d  }||d  }|d r^||  |d  7 }|d r||d | 7 }||d | 7 }t| | }	t| | }
t| | }t| | }|d }ddgt||||| }| |d  }t | |d  }| |d  }t | |d |d  }|d rZ||d |  7 }||d |  7 }|d rx||d |  7 }ddgt||||| }t| |k rt||k rdnd	}|d  d
|d  d|d  d
|d  d|d  d
|d  d|d  d
|d  }ddd| d| dg}|| | |	||
|ffS )zCreate lines of SVG text that show a grid

    Parameters
    ----------
    x: numpy.ndarray
    y: numpy.ndarray
    offset: tuple
        translational displacement of the grid in SVG coordinates
    skew: tuple
    r   r   r?      r#   z  <!-- Horizontal lines -->z  <!-- Vertical lines -->ZECB172Z8B4903, z  <!-- Colored Rectangle -->z  <polygon points="z" style="fill:#zA0;stroke-width:0"/>)r
   Z
zeros_likeZ	full_likerE   minrY   r   )r1   r0   r   r   r   rP   rR   rQ   rS   r3   r5   r4   r6   rW   Zh_linesZv_linesZcolorZcornersZrectr   r   r   r,      s@    

$Rr,   c                 K   s   t d|  fi |S )Nr>   )r   )r   r/   r   r   r   r   r      s    r   c                 C   s&   dd | D }dd t ||D }|S )Nc                 S   s   g | ]}t d | qS ))r   )r
   Zcumsum)rM   cr   r   r   rT          zgrid_points.<locals>.<listcomp>c                 S   s    g | ]\}}|| |d   qS )r?   r   )rM   r1   r   r   r   r   rT      r_   )zip)r   r/   Z	cumchunksZpointsr   r   r   r+      s    r+   c                    s>   t |   fdd| D }dd |D }tfdd|D S )z%Get size in pixels for all dimensionsc                    s   g | ]} t d | qS )g?)rE   )rM   d)mxr   r   rT     r_   zdraw_sizes.<locals>.<listcomp>c                 S   s   g | ]}t |qS r   )ratio_responserM   rr   r   r   rT     r_   c                 3   s   | ]} | V  qd S )Nr   rd   r   r   r   	<genexpr>  r_   zdraw_sizes.<locals>.<genexpr>)rE   r   )r   r   Zratiosr   )rb   r   r   r*     s    r*   c                 C   s2   | t jk r| S | dkr$t | d S t dS dS )a  How we display actual size ratios

    Common ratios in sizes span several orders of magnitude,
    which is hard for us to perceive.

    We keep ratios in the 1-3 range accurate, and then apply a logarithm to
    values up until about 100 or so, at which point we stop scaling.
    r!   g(@g\@N)mathelog)r1   r   r   r   rc     s
    	
rc   )r   )r   r   r   N)r   Nr   )r   )r&   )r   r   r   )N)r   )rg   rB   Znumpyr
   r   r-   r   r   r   rY   r,   r   r+   r*   rc   r   r   r   r   <module>   s   
!
 
9
#

8

