
    e                     Z    d Z ddlmZ ddlmZ ddlmZ ddlmZ d Z	d Z
dd
Zd Zd ZdS )z
Advanced utilities for traversing nesting/hierarchical Dimensioned
objects either to inspect the structure of their declared dimensions
or mutate the matching elements.
    )defaultdict)
itemgetter   )	Dimension)merge_dimensionsc                 b    d g| z  }t          ||          D ]
\  }}|||<   t          |          S N)ziptuple)lengthindexesvalueskeyivs         8lib/python3.11/site-packages/holoviews/core/traversal.pycreate_ndkeyr      sA    &6/CGV$$  1A::    c                     ddl m} |                     d |f          }|r'd |D             t          fdD                       S dS )z
    Finds all common dimension keys in the object including subsets of
    dimensions. If there are is no common subset of dimensions, None
    is returned.
    r   HoloMapc                 *    t          | j                  S r	   )r   kdimsxs    r   <lambda>zuniform.<locals>.<lambda>   s    ag r   c                 @    g | ]}t          d  |D                       S )c              3   $   K   | ]}|j         V  d S r	   name.0ds     r   	<genexpr>z%uniform.<locals>.<listcomp>.<genexpr>   s$      00QV000000r   	frozensetr"   dgs     r   
<listcomp>zuniform.<locals>.<listcomp>   s/    FFFR900R00000FFFr   c              3   :   K   | ]}D ]}||k    p||k    V  d S r	    r"   g1g2dgroupss      r   r$   zuniform.<locals>.<genexpr>   s=      LLBGLLb28'rRxLLLLLLLr   T)spacesr   traverseall)objr   
dim_groupsr/   s      @r   uniformr5      sy      66&j* *J MFF:FFFLLLL'LLLLLL4r   Framec                 *   ddl m}m} ddlm} |                     d |f          }|st          |          gdgfS t          t          |d            \  }d D             t          fd	D                       }|r$t                    }t          |fd
          n|                     d dg          }	|	rt          d          t                    }
i |D ]*\  }}|D ]"}t          ||          D ]\  }}||j        <   #+rt          fd|
D                       g}ng }t                    |fS t                    }g }t          |          D ]N\  }}fd|D             }|D ]8}t          |||          fd|D             }|s|                               9O |d          5   |d |D                       j                                        }ddd           n# 1 swxY w Y   t'          |          fS )z
    Finds all common dimension keys in the object including subsets of
    dimensions. If there are is no common subset of dimensions, None
    is returned.

    Returns the list of dimensions followed by the list of unique
    keys.
    r   )	NdMapping
item_checkr   c                 v    t          | j                  t          | j                                                  fS r	   )r   r   listdatakeysr   s    r   r   z unique_dimkeys.<locals>.<lambda>.   s(    uQW~~'+AFKKMM':':'< r   )r   c                 .    t          | d                    S Nr   )lenr   s    r   r   z unique_dimkeys.<locals>.<lambda>2   s    C!II: r   )r   c                 @    g | ]}t          d  |D                       S )c              3   $   K   | ]}|j         V  d S r	   r   r!   s     r   r$   z,unique_dimkeys.<locals>.<listcomp>.<genexpr>3   s$      ,,A,,,,,,r   r%   r'   s     r   r)   z"unique_dimkeys.<locals>.<listcomp>3   s/    BBBy,,,,,,,BBBr   c              3   :   K   | ]}D ]}||k    p||k    V  d S r	   r+   r,   s      r   r$   z!unique_dimkeys.<locals>.<genexpr>4   s=      JJ"'JJBr%R2XJJJJJJJr   c                 :    d                              |           S r?   index)r   r4   s    r   r   z unique_dimkeys.<locals>.<lambda>8   s    jm.A.A!.D.D r   c                     | S r	   r+   r   s    r   r   z unique_dimkeys.<locals>.<lambda>;   s    q r   r   z]When combining HoloMaps into a composite plot their dimensions must be subsets of each other.c              3   L   K   | ]}                     |j                  V  d S r	   )getr    )r"   dimdim_keyss     r   r$   z!unique_dimkeys.<locals>.<genexpr>F   s1      GGS(,,sx00GGGGGGr   c                 :    g | ]}                     |          S r+   rE   )r"   rJ   all_dimss     r   r)   z"unique_dimkeys.<locals>.<listcomp>N   s%    999CHNN3''999r   c           
      j    g | ]/}t          d  t          |          D                       k    -|0S )c              3   (   K   | ]\  }}||n|V  d S r	   r+   )r"   r   ks      r   r$   z,unique_dimkeys.<locals>.<listcomp>.<genexpr>R   sJ       .Q .Q26!Q 459aa! .Q .Q .Q .Q .Q .Qr   )r   r
   )r"   item
padded_keys     r   r)   z"unique_dimkeys.<locals>.<listcomp>Q   sv     R R R$ .Q .Q:=dJ:O:O.Q .Q .Q )Q )Q Q Q Q Q Qr   Fc                     i | ]}|d S r	   r+   )r"   r   s     r   
<dictcomp>z"unique_dimkeys.<locals>.<dictcomp>X   s     B B Bsd B B Br   )r   N)	ndmappingr8   r9   r0   r   r1   r   r
   sortedr2   r   
ValueErrorr    r   r@   r   appendr<   r=   r;   )r3   default_dimr8   r9   r   key_dimsr=   subsetdimshmaps
dimensionsr   r#   rP   ndimsunique_keysgroupsubkeysdim_idxsmatchessorted_keysrM   r/   r4   rK   rR   s                        @@@@@r   unique_dimkeysrf   #   sY    10000000|| < <>EZI IH 0+&&'$//F81E1EFFFGJBBzBBBGJJJJJJJJJF 2
++$$D$D$D$DEEE [[9+66 	P O P P P%j11
" 	) 	)JD$ ) )cNN ) )DAq'(HQV$$))  	GGGGJGGGGGHDDD
++T11MMEKj$// / /w99995999 	/ 	/C%eXs;;JR R R R R R RG  /"":...	/ 
E		 < <i B Bk B B B&.0 0 004TTVV 	< < < < < < < < < < < < < < < T+&&&&s   >/G99G= G=c                    t          | d                   }|dk    rdS t          |          D ]St          fdt          |          D              }g }| D ]*} ||          }||v r  dS |                    |           +TdS )Nr   r   Tc              3   (   K   | ]}|k    |V  d S r	   r+   )r"   r   idxs     r   r$   zbijective.<locals>.<genexpr>b   s'      BBAcaBBr   F)r@   ranger   rX   )r=   r_   getterstorer   subkeyri   s         @r   	bijectivern   ]   s    QLLEzztU|| ! !BBBBuBBBC 	! 	!CVC[[FuuuLL    		!
 4r   c                    t          | d                   }|dk    rdS t          t          |            fdt          |dz
            D             }g }|D ]}d}t	          t                    }t	          t                    }|D ]i\  }}	|	||         vr||                             |	           ||	         }
|
r|
d         |k    rd} n&|||	         vr||	                             |           j|                    |r|ni            |S )aT  
    Iterates over dimension values in keys, taking two sets
    of dimension values at a time to determine whether two
    consecutive dimensions have a one-to-many relationship.
    If they do a mapping between the first and second dimension
    values is returned. Returns a list of n-1 mappings, between
    consecutive dimensions.
    r   r   Tc              3   @   K   | ]}t          ||d z             V  dS )   N)r
   )r"   r   dim_valss     r   r$   zhierarchical.<locals>.<genexpr>y   sH       - - !AaC%) - - - - - -r   F)r@   r;   r
   rj   r   rX   )r=   r_   combinationshierarchiescombination	hierarchystore1store2v1v2previousrr   s              @r   hierarchicalr|   l   sI    QLLEzztCJH- - - -"57^^- - -LK# 8 8	T""T""! 	& 	&FB##r
!!"%%%bzH HQK2--!	##r
!!"%%%Y666B7777r   N)r6   )__doc__collectionsr   operatorr   	dimensionr   utilr   r   r5   rf   rn   r|   r+   r   r   <module>r      s     $ # # # # #                   " " " " " "    7' 7' 7' 7't      r   