
    Cd#                        d dl mZ d dlZd dlmZ d dlmZmZm	Z	 d dl
mZ dZ ee          Zd Zd Z ee          dd	dd
d            ZdS )    )annotationsN)
basestring)asarray	blockwiseeinsum_lookup)derived_from4abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZc                 *   |                     d          }|                     d          }|                     d          }t          j        t          | d                             } ||g| R d|i|}|                    |j        d|z  z             S )N
subscriptsncontract_indskernel_dtyper   dtype   )popr   dispatchtypereshapeshape)operandskwargsr   r   r   einsumchunks          6lib/python3.11/site-packages/dask/array/einsumfuncs.pychunk_einsumr      s    L))JZZ 011NJJ~&&E#D!$5$566FF:@@@@@@@E ==tn'<<===    c                R   t          |           dk    rt          d          t          | d         t                    rW| d                             dd          }d | dd         D             } |D ]"}|dv r|t
          vrt          d	|z            #nut          |           }g }g }t          t          |           d
z            D ]R}|                    |	                    d                     |                    |	                    d                     St          |          r|d         nd}d |D             } d}t          |          dz
  }t          |          D ]X\  }	}
|
D ]E}|t          u r|dz  }t          |t                    r|t          |         z  }7t          d          |	|k    r|dz  }Y|M|dz  }|D ]E}|t          u r|dz  }t          |t                    r|t          |         z  }7t          d          d|v sd|v r\|                    d          dk    p|                    d          dk    }|s|                    d          dk    rt          d          d|v r|                    dd                              dd                              dd          }t          t
          t!          |          z
            }d                    |          }d}d|v r0|                    d          \  }}|                    d          }d}n|                    d          }d}t          |          D ]\  }	}
d|
v r|
                    d          dk    s|
                    d          dk    rt          d          | |	         j        dk    rd}n0t)          | |	         j        d          }|t          |
          dz
  z  }||k    r|}|dk     rt          d          |dk    r|
                    dd          ||	<   || d         }|
                    d|          ||	<   d                    |          }|dk    rd}n|| d         }|r|d|                    d|          z   z  }nd}|                    dd          }t-          t!          |                    D ];}|t
          vrt          d	|z            |                    |          dk    r||z  }<d                    t-          t!          |          t!          |          z
                      }|d|z   |z   z  }d|v r|                    d          \  }}nr|}|                    dd          }d}t-          t!          |                    D ];}|t
          vrt          d	|z            |                    |          dk    r||z  }<|D ]}||vrt          d|z            t          |                    d                    t          |           k    rt          d          ||| fS )a  
    A reproduction of numpy's _parse_einsum_input()
    which in itself is a reproduction of
    c side einsum parsing in python.

    Returns
    -------
    input_strings : str
        Parsed input strings
    output_string : str
        Parsed output string
    operands : list of array_like
        The operands to use in the numpy contraction
    Examples
    --------
    The operand list is simplified to reduce printing:
    >> a = np.random.rand(4, 4)
    >> b = np.random.rand(4, 4, 4)
    >> __parse_einsum_input(('...a,...a->...', a, b))
    ('za,xza', 'xz', [a, b])
    >> __parse_einsum_input((a, [Ellipsis, 0], b, [Ellipsis, 0]))
    ('za,xza', 'xz', [a, b])
    r   zNo input operands  c                ,    g | ]}t          |          S  r   .0os     r   
<listcomp>z&parse_einsum_input.<locals>.<listcomp>:       5551GAJJ555r   r   Nz.,->z#Character %s is not a valid symbol.   c                ,    g | ]}t          |          S r!   r"   )r$   vs     r   r&   z&parse_einsum_input.<locals>.<listcomp>L   r'   r   z...z=For this input type lists must contain either int or Ellipsis,->->z%Subscripts can only contain one '->'..TF   zInvalid Ellipses.r!   zEllipses lengths do not match.z/Output character %s did not appear in the inputzDNumber of einsum subscripts must be equal to the number of operands.)len
ValueError
isinstancer   replaceeinsum_symbols_setlistrangeappendr   	enumerateEllipsisinteinsum_symbols	TypeErrorcountsetjoinsplitr   maxndimsorted)r   r   stmp_operandsoperand_listsubscript_list_output_listlastnumsubinvalidusedunusedellipse_indslongest	input_tmp
output_subsplit_subscriptsout_subellipse_countrep_indsout_ellipseoutput_subscripttmp_subscriptsnormal_indsinput_subscriptschars                               r   parse_einsum_inputr`      s-   2 8}},---(1+z** 0a[((b11
55555  	L 	LAF{{*** !F!JKKK +	L H~~s8}})** 	7 	7A 0 0 3 3444!!,"2"21"5"56666*-l*;*;El2&&55555
>""Q&!.11 	" 	"HC 	 	==%'JJ3'' ."33JJ#1   d{{c!
"$J  	 	==%'JJ3'' ."33JJ#1  
 	zsj00##C((1,L*2B2B32G2G!2K 	Fz''--22DEEE j!!#r**223;;CCD"MM(3t99455wwv:$.$4$4T$:$:!Iz(s33GG)//44G!"233 	I 	IHCczzIIcNNa''SYYu-=-=-B-B$%8999 C=&",,$%MM$'(:A$>$>M!SXX\1M 7**+G 1$$$%EFFF"a'',/KKr,B,B$S))+]NOO<H,/KKx,H,H$S)XX.//
a<<KK&xyy1K 	;$!3!3E;!G!GGGJJ  "'//R88NC//00 * *...$%JQ%NOOO!''**a//$)$''&-=)>)>[AQAQ)Q"R"RSSK$,{::J z-7-=-=d-C-C***%#++C44N++,, 	& 	&A*** !F!JKKK##A&&!++ A%  ! W W'''NQUUVVV ( !!#&&''3x==88R
 
 	
 .99r   F)r   optimizesplit_everyc           
        | }t          |          \  }}}d                    ||f          }	| t          j        d |D              } |dur$d |D             }
t          j        |	g|
R d|i\  }}d |                    d          D             }d	 |D             }|t          |          z
  }t          |          }t          t          t          |          t          |          z   gd
 t          ||          D             R d |D             | |	|||d|}|dk    rDt          |          }|                    t          t          |||z                       |          S |S )a  Dask added an additional keyword-only argument ``split_every``.

    split_every: int >= 2 or dict(axis: int), optional
        Determines the depth of the recursive aggregation.
        Deafults to ``None`` which would let dask heuristically
        decide a good default.
    r-   Nc                    g | ]	}|j         
S r!   )r   r#   s     r   r&   zeinsum.<locals>.<listcomp>   s     6 6 6Q 6 6 6r   Fc                t    g | ]5}t          j        |j                            d           |j                  6S )r   )r   )npbroadcast_tor   r   r   r#   s     r   r&   zeinsum.<locals>.<listcomp>   s5    QQQBOAGLLOO17CCCQQQr   ra   c                ,    g | ]}t          |          S r!   )tuple)r$   is     r   r&   zeinsum.<locals>.<listcomp>   s    2221eAhh222r   r,   c                    h | ]	}|D ]}|
S r!   r!   )r$   rj   as      r   	<setcomp>zeinsum.<locals>.<setcomp>   s%    ---a1--a----r   c              3  $   K   | ]}|D ]}|V  d S )Nr!   )r$   aprl   s      r   	<genexpr>zeinsum.<locals>.<genexpr>   s/      	3	3	3	31!	3	3	3	3	3	3	3r   c                    i | ]}|d S r   r!   )r$   inds     r   
<dictcomp>zeinsum.<locals>.<dictcomp>   s    777#sA777r   )adjust_chunksr   r   r   r   ra   r   )axisrb   )r`   rA   rf   result_typeeinsum_pathrB   r@   r2   r   r   ri   zipsumr7   r8   )r   ra   rb   r   r   einsum_dtypeinputsoutputsopsr   fake_opsrJ   all_indscontract_indsr   resultsizes                    r   r   r      s    L-h77FGSFG,--J } 6 6# 6 6 67u RQSQQQnZN(NNNXNN!22S 1 1222F .-6---H s7||+M''N g}--- 
4	3c#v&&	3	3	3 
 87777!%   F  7||zzeD$"78899{  
 
 	
 Mr   )
__future__r   numpyrf   numpy.compatr   dask.array.corer   r   r   
dask.utilsr   r=   r@   r6   r   r`   r   r!   r   r   <module>r      s    " " " " " "     # # # # # # = = = = = = = = = = # # # # # #GS(( 	> 	> 	>g: g: g:T b 5d : : : : : : :r   