
    sgc                     |    d dl 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 Zd	 Zd
 Zd Zd Zd ZdedefdZy)    N)defaultdict)Permutation)Tuple)Integerc                 l    i }d}t        |       D ]!  \  }}t        |      D ]  }||f||<   |dz  } # |S )Nr      )	enumeraterange)subranksmappingcounterirankjs         W/var/www/html/venv/lib/python3.12/site-packages/sympy/tensor/array/expressions/utils.py_get_mapping_from_subranksr   	   sU    GGX& 4t 	A !1vGGqLG	 N    c           	         t        |      }|D cg c]  }|D cg c]  }||   	 c} }}}t        t              }|D ]0  }t        |      dk(  s|\  \  }	}
\  }}||f||	   |
<   |	|
f||   |<   2 | t        |      fS c c}w c c}}w )N   )r   r   dictlen)argsr   contraction_indicesr   r   r   contraction_tuplesdlinkslinksarg1pos1arg2pos2s                r   _get_contraction_linksr!      s    (2G;NOaq1!71:1OOF# u:?).&LT4,4"&F4L"&F4L f 2Os   	BA?B?Bc                 r    | D cg c]  }t        t        |        } }| j                  d        | S c c}w )Nc                     t        |       S N)min)xs    r   <lambda>z+_sort_contraction_indices.<locals>.<lambda>#   s
    s1v r   key)r   sortedsort)pairing_indicesr   s     r   _sort_contraction_indicesr-   !   s<    2ABQufQi(BOB-. Cs   4c                     t        t              }t               D ]0  \  }}t        |t        t
        f      r||   j                  |       2 |j                         D ci c]  \  }}t        |      dkD  s|| }}} D cg c]	  }||vs| }}t        |      }|j                   fd       |D cg c]  }t        ||          }}||z  }t        |      }||fS c c}}w c c}w c c}w )Nr   c                 &    j                  |       S r$   )index)r&   flattened_indicess    r   r'   z'_get_diagonal_indices.<locals>.<lambda>2   s    $5$;$;A$> r   r(   )r   listr	   
isinstanceintr   appenditemsr   r+   tuple)	r1   axes_contractionr   indkvret_indicesdiag_indicesdiagonal_indicess	   `        r   _get_diagonal_indicesr?   '   s   "4(-. (3cC>*$$Q'	(
 *:)?)?)APASVaZ1PP/M1<L3L1MKM()L>?<HIq.q12II<K$K[(( QM Js   "C$9C$	C*C*9C/c                     t        |       D ]-  \  }}||k(  r|c S t        |t        t        f      s&||v s+|c S  t	        |d|       )Nz not found in )r	   r3   set	frozenset
IndexError)
subindicesr9   r   sinds       r   _get_argindexrF   9   sR    Z( 4$;HdS),-#+H	
 S*=
>>r   c                      t        |t        t        t        f      rt         fd|D              S t        |t              rt        j                   fd|D              S   |      S )Nc              3   6   K   | ]  }t        |        y wr$   $_apply_recursively_over_nested_lists.0r   funcs     r   	<genexpr>z7_apply_recursively_over_nested_lists.<locals>.<genexpr>D   s     Pq9$BP   c              3   6   K   | ]  }t        |        y wr$   rI   rK   s     r   rN   z7_apply_recursively_over_nested_lists.<locals>.<genexpr>F   s     YPQB4KYrO   )r3   r7   r2   r   fromiter)rM   arrs   ` r   rJ   rJ   B   sO    #tU+,PCPPP	C	~~YUXYYYCyr   c                 >    ddid}d}|t               k  r]d}||z   t               k  r) |   |z    ||z      k7  rn|dz  }||z   t               k  r)||z  }| |   <   ||z  }|t               k  r]t        j                               fd fd}|S )Nr   r   c                 B    t        j                  |       dz
        S )Nr   )bisectbisect_right)idx
shift_keysshiftss    r   rM   z8_build_push_indices_up_func_transformation.<locals>.funcZ   s%    j!4!4Z!Ea!GHIIr   c                 $    | v ry |  |       z
  S r$    )r   flattened_contraction_indicesrM   s    r   	transformz=_build_push_indices_up_func_transformation.<locals>.transform]   s    --tAw;r   )r   r*   keys)r\   r   
cumulativer   r]   rM   rX   rY   s   `    @@@r   *_build_push_indices_up_func_transformationr`   K   s    VF	AJ
c/0
0cC566,Q/!37TUVWXUX7YYFA cC566 	a
3=,Q/0	Q c/0
0 &JJ r   c                 h    | d   dz   }t        |      D cg c]	  }|| vs| c}fd}|S c c}w )Nr   c                 X    | t              k  r|    S | d   z   t              z
  dz   S )Nrb   r   )r   )r   rY   s    r   r]   z?_build_push_indices_down_func_transformation.<locals>.transformk   s4    s6{?!9vbz>CK/!33r   )r
   )r\   Nr   r]   rY   s       @r   ,_build_push_indices_down_func_transformationre   f   sA    %b)!+AqLAQ.K%KaLF4  Ms   	//permtarget_listc                     t        | j                        D cg c]  }d }}t        |      D ]  \  }}|| | |      <    |S c c}w )z<
    Permute a list according to the given permutation.
    N)r
   sizer	   )rf   rg   r   new_listes        r   _apply_permutation_to_listrl   t   sP     $DII.//H/+& 1aO 0s   	A)rU   collectionsr   sympy.combinatoricsr   sympy.core.containersr   sympy.core.numbersr   r   r!   r-   r?   rF   rJ   r`   re   r2   rl   r[   r   r   <module>rq      sO     # + ' &)$?6[ t r   