
    ev1                     X   d dl Zd dlmZmZ d dlmZ ddlmZ ddl	m
Z
mZmZmZmZmZ ddlmZmZ  G d	 d
          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Zej        d         Zeee<   eee
<   eee<   eee<   eee<   dS )    N)CustomJSToolbar)	RangeTool   )isscalar   )DataLinkLinkRangeToolLinkRectanglesTableLinkSelectionLinkVertexTableLink)GenericElementPlotGenericOverlayPlotc                   r    e Zd ZdZdZg Zg Zg Zg Zg Z	g Z
dZdZddZed             Zedd            Zd ZdS )LinkCallbackNc                    || _         || _        || _        || _        |                                  d |j                                                                        D             }| j        | j	        gz   D ]}d| }|j
        |         ||<   |j                                                                        D ]\  }}	|dv r
|	||<   |(| j        | j        gz   D ]}d| }|j
        |         ||<   | j	        |j
        v rp|j
        | j	                 }
t          || j                  }| j        D ]}|
                    ||           | j        D ]}|
                    ||           || _        nd | _        || j        |j
        v rx| j        rq|j
        | j                 }t          || j                  }| j        D ]}|                    ||           | j        D ]}|                    ||           || _        d S d | _        d S )Nc                 "    i | ]\  }}|d v	||S ))sourcetargetname ).0kvs      >lib/python3.11/site-packages/holoviews/plotting/bokeh/links.py
<dictcomp>z)LinkCallback.__init__.<locals>.<dictcomp>(   s6     @ @ @tq!">>> >>>    source_)r   r   r   target_)argscode)
root_modellinksource_plottarget_plotvalidateparamvaluesitemssource_handlessource_modelhandlestarget_handlestarget_modelr   source_codeon_source_changesjs_on_changeon_source_eventsjs_on_eventsrc_cbtarget_codeon_target_changeson_target_eventstgt_cb)selfr#   r$   r%   r&   
referencesshkeypvalue	src_modelr5   chev	tgt_modelr9   s                   r   __init__zLinkCallback.__init__!   sz   $	&&@ @tz'8'8':':'@'@'B'B @ @ @
 %t'8&99 	6 	6B B..C)1"5JsOO
))++1133 	" 	"HAu000!JqMM")4+<*== : :$nn"-"5b"9
3 333#+D,=>I:D4DEEEF, 3 3&&r62222+ 2 2%%b&1111 DKKDK"t'8K<O'O'OTXTd'O#+D,=>I:D4DEEEF, 3 3&&r62222+ 2 2%%b&1111 DKKKDKKKr   c                 T   
 d }|                     d |g          } fd|D             }d |D             }g }|D ]k\  }}|D ]c

j        s|                    
|df           " 
fd|D             }d |D             }	|	r$|                    
||	d         d         f           dl|S )	zh
        Traverses the supplied plot and searches for any Links on
        the plotted objects.
        c                 :    t          | t          t          f          S N)
isinstancer   r   xs    r   <lambda>z)LinkCallback.find_links.<locals>.<lambda>U   s    Jq+=?Q*RSS r   c                     | S rG   r   rI   s    r   rK   z)LinkCallback.find_links.<locals>.<lambda>V   s    Q r   c                 :    g | ]}                     |          S r   	find_link)r   plotclss     r   
<listcomp>z+LinkCallback.find_links.<locals>.<listcomp>W   s%    <<<dcmmD))<<<r   c                     g | ]}||S rG   r   r   r>   s     r   rR   z+LinkCallback.find_links.<locals>.<listcomp>X   s    ???ar   Nc                 <    g | ]}                     |          S r   rN   )r   r>   rQ   r$   s     r   rR   z+LinkCallback.find_links.<locals>.<listcomp>`   s'    DDDcmmAt44DDDr   c                     g | ]}||S rG   r   rT   s     r   rR   z+LinkCallback.find_links.<locals>.<listcomp>a   s    DDD1amQmmmr   r   )traverse_requires_targetappend)rQ   	root_plotplot_fnplots
potentialssource_linksfoundrP   links	tgt_linksr$   s   `         @r   
find_linkszLinkCallback.find_linksO   s    TS"";;	::<<<<e<<<
??:???' 		@ 		@KD% @ @, LL$d!3444DDDDDeDDD
DD
DDD	 @LL$il1o!>???@ r   c                     t           j                                        }|j        D ]S|fd|D             }|r||fc S |j        u s(|j        (|j        j        |j        j        j        k    r||gfc S TdS )z;
        Searches a GenericElementPlot for a Link.
        Nc                 Z    g | ]'\  }}|D ]}|u s|j         |j         j         k    | (S rG   )_plot_id)r   srcr`   lr   s       r   rR   z*LinkCallback.find_link.<locals>.<listcomp>n   s]     K K K$#u%K K56f}})A),)H)H )H)H)H)Hr   )r
   registryr*   link_sourcesr   re   )rQ   rP   r$   rh   r`   r   s        @r   rO   zLinkCallback.find_linkf   s    
 =&&((' 	& 	&F|K K K K(0K K K  ) %=((();&(((K(4K(FO;;tf~%%%	& 	&r   c                     dS )z}
        Should be subclassed to check if the source and target plots
        are compatible to perform the linking.
        Nr   )r:   s    r   r'   zLinkCallback.validatez   s      r   rG   )__name__
__module____qualname__r,   r/   r+   r.   r3   r1   r8   r7   r0   r6   rD   classmethodrb   rO   r'   r   r   r   r   r      s        LLNNKK, , , ,\   [, & & & [&&    r   r   c                       e Zd ZdZd ZdS )RangeToolLinkCallbackzk
    Attaches a RangeTool to the source plot and links it to the
    specified axes on the target plot
    c                    t          |                    dt          i                    }i }dD ]}||j        vr|j        | d         || d<   t          |d| d           }|9|\  }	}
|	 |	|| d         _        |	|| d         _        |
 |
|| d         _        |
|| d         _	        t          di |}|j                            |           |r"|d         j                            |           d S d S )Ntype)rJ   y_rangeboundsr   r   )listselectr   axesr-   getattrstartreset_startend	reset_endr   state	add_toolstoolsrY   )r:   r#   r$   r%   r&   toolbarsrx   axisru   rz   r|   tools               r   rD   zRangeToolLinkCallback.__init__   sA   
))67*;<<== 	6 	6D49$$$/$74$HDD!T?D??D99F~JE3 .3___%+49___%1,/___%)25___%/  4  ##D))) 	+QK$$T*****	+ 	+r   Nrk   rl   rm   __doc__rD   r   r   r   rp   rp      s-         
+ + + + +r   rp   c                       e Zd ZdZd ZdS )DataLinkCallbackz7
    Merges the source and target ColumnDataSource
    c                    |j         d         }|j         d         }||u rd S d |j                                        D             }d |j                                        D             }|r4|r2|d         |d         k    r t          d|d         |d         fz            |j                                        D ]\  }	}
|	|j        vrt          j        |
          }
t          j        |j        |	                   }t          |
          r!t          |
d         t
          j	                  rrt          |
          r|
|k    sl|
j        j        dvr|
|k                                    sFt          j        |
t          j        |j        |	                   d          st          d	|	z            |j                            |j                   |j                             d
          }|nCd|                                v r|                    |           n|                    |           ||j         d<   ||j         d<   |j        D ]#}|                    |j        d                    $d S )Nr   c                 ,    g | ]}t          |          S r   lenr   r   s     r   rR   z-DataLinkCallback.__init__.<locals>.<listcomp>       999a3q66999r   c                 ,    g | ]}t          |          S r   r   r   s     r   rR   z-DataLinkCallback.__init__.<locals>.<listcomp>   r   r   r   zmDataLink source data length must match target data length, found source length of %d and target length of %d.iufcT)	equal_nanzqDataLink can only be applied if overlapping dimension values are equal, %s column on source does not match targetglyph_rendererdata_source)r   )r   cdsid)plot_id)r-   datar)   
ValueErrorr*   npasarrayr   rH   ndarrayr   dtypekindallallcloseupdateget
properties	callbacks
initializeref)r:   r#   r$   r%   r&   src_cdstgt_cdssrc_lentgt_lenr   r   colrenderercallbacks                 r   rD   zDataLinkCallback.__init__   s   %h/%h/gF997<#6#6#8#8999997<#6#6#8#8999 	Ow 	OGAJ'!*$<$< 36=aj'!*5MN O O O
 L&&(( 	> 	>DAq$$
1A*W\!_--C1vv *QqT2:66 a[[ >Q#XXW\//QVLLNN/K2:gl1o#>#>$OOO 0  "9;<"= > > > 	GL)))&**+;<<h113333OOO0000OO7O+++(/H%%,E"#- 	> 	>H
t(<====	> 	>r   Nr   r   r   r   r   r      s-         '> '> '> '> '>r   r   c                   6    e Zd ZdZdZdgZdgZdgZdgZdZ	dZ
dS )SelectionLinkCallbackselectedindicesr   zl
    target_selected.indices = source_selected.indices
    target_cds.properties.selected.change.emit()
    zl
    source_selected.indices = target_selected.indices
    source_cds.properties.selected.change.emit()
    N)rk   rl   rm   r,   r/   r1   r7   r+   r.   r0   r6   r   r   r   r   r      sD        LL""WNWNK
KKKr   r   c                   :    e Zd ZdZdZdgZddgZdgZdZdZ	d
d	Z
dS )RectanglesTableLinkCallbackr   glyphr   r   patchinga3  
    target_cds.data[columns[0]] = source_cds.data[source_glyph.left.field]
    target_cds.data[columns[1]] = source_cds.data[source_glyph.bottom.field]
    target_cds.data[columns[2]] = source_cds.data[source_glyph.right.field]
    target_cds.data[columns[3]] = source_cds.data[source_glyph.top.field]
    z
    source_cds.data['left'] = target_cds.data[columns[0]]
    source_cds.data['bottom'] = target_cds.data[columns[1]]
    source_cds.data['right'] = target_cds.data[columns[2]]
    source_cds.data['top'] = target_cds.data[columns[3]]
    Nc                     t                               | ||||           t                              | ||||           d |j        j        D             }|| j        j        d<   || j        j        d<   d S )Nc                     g | ]	}|j         
S r   )r   )r   kds     r   rR   z8RectanglesTableLinkCallback.__init__.<locals>.<listcomp>  s    EEEr27EEEr   columns)r   rD   r   current_framekdimsr5   r!   r9   )r:   r#   r$   r%   r&   r   s         r   rD   z$RectanglesTableLinkCallback.__init__   sw    !!$
D+{SSSdJk;OOOEE[%>%DEEE&-#&-###r   rG   )rk   rl   rm   r,   r/   r+   r1   r7   r0   r6   rD   r   r   r   r   r      sZ        LLYN#V,#KK. . . . . .r   r   c                   .    e Zd ZdZdZg dZddgZdZdZdS )VertexTableLinkCallbackr   )r   r   r   r   r   a  
    var index = source_cds.selected.indices[0];
    if (index == undefined) {
      var xs_column = [];
      var ys_column = [];
    } else {
      var xs_column = source_cds.data['xs'][index];
      var ys_column = source_cds.data['ys'][index];
    }
    if (xs_column == undefined) {
      var xs_column = [];
      var ys_column = [];
    }
    var xs = []
    var ys = []
    var empty = []
    for (var i = 0; i < xs_column.length; i++) {
      xs.push(xs_column[i])
      ys.push(ys_column[i])
      empty.push(null)
    }
    var [x, y] = vertex_columns
    target_cds.data[x] = xs
    target_cds.data[y] = ys
    var length = xs.length
    for (var col in target_cds.data) {
      if (vertex_columns.indexOf(col) != -1) { continue; }
      else if (col in source_cds.data) {
        var path = source_cds.data[col][index];
        if ((path == undefined)) {
          var data = empty;
        } else if (path.length == length) {
          var data = source_cds.data[col][index];
        } else {
          var data = empty;
        }
      } else {
        var data = empty;
      }
      target_cds.data[col] = data;
    }
    target_cds.change.emit()
    target_cds.data = target_cds.data
    a  
    if (!source_cds.selected.indices.length) { return }
    var [x, y] = vertex_columns
    var xs_column = target_cds.data[x]
    var ys_column = target_cds.data[y]
    var xs = []
    var ys = []
    var points = []
    for (var i = 0; i < xs_column.length; i++) {
      xs.push(xs_column[i])
      ys.push(ys_column[i])
      points.push(i)
    }
    var index = source_cds.selected.indices[0]
    var xpaths = source_cds.data['xs']
    var ypaths = source_cds.data['ys']
    var length = source_cds.data['xs'].length
    for (var col in target_cds.data) {
      if ((col == x) || (col == y)) { continue; }
      if (!(col in source_cds.data)) {
        var empty = []
        for (var i = 0; i < length; i++)
          empty.push([])
        source_cds.data[col] = empty
      }
      source_cds.data[col][index] = target_cds.data[col]
      for (var p of points) {
        for (var pindex = 0; pindex < xpaths.length; pindex++) {
          if (pindex != index) { continue }
          var xs = xpaths[pindex]
          var ys = ypaths[pindex]
          var column = source_cds.data[col][pindex]
          if (column.length != xs.length) {
            for (var ind = 0; ind < xs.length; ind++) {
              column.push(null)
            }
          }
          for (var ind = 0; ind < xs.length; ind++) {
            if ((xs[ind] == xpaths[index][p]) && (ys[ind] == ypaths[index][p])) {
              column[ind] = target_cds.data[col][p]
              xs[ind] = xs[p];
              ys[ind] = ys[p];
            }
          }
        }
      }
    }
    xpaths[index] = xs;
    ypaths[index] = ys;
    source_cds.change.emit()
    source_cds.properties.data.change.emit();
    source_cds.data = source_cds.data
    N)	rk   rl   rm   r,   r/   r1   r7   r0   r6   r   r   r   r   r     s>        LL888,+KZ4KKKr   r   bokeh)numpyr   bokeh.modelsr   r   bokeh.models.toolsr   	core.utilr   r`   r	   r
   r   r   r   r   rP   r   r   r   rp   r   r   r   r   
_callbacksr   r   r   r   <module>r      s       * * * * * * * * ( ( ( ( ( ( ! ! ! ! ! !                : 9 9 9 9 9 9 9m m m m m m m m`+ + + + +L + + +B,> ,> ,> ,> ,>| ,> ,> ,>^    L   *. . . . ."2 . . .@i i i i il i i iX OG$	0	- &	( 0	- 4	/ !<	
   r   