§
    PŠtjfÃ ã                  ó¢  — d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
mZ ddlmZ ddlZddlZdd	lmZmZ dd
lmZ ddlmZmZmZmZ ddlmZmZmZmZmZm Z  ddl!m"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- ddl.m/Z/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8m9Z9m:Z: ddl;m<Z<m=Z= ddl>m?Z? d„ Z@d„ ZAd„ ZB G d„ de/¦  «        ZCd„ ZD G d„ d e/¦  «        ZE eE¦   «         ZF G d!„ d"¦  «        ZG eG¦   «         ZH G d#„ d$e¦  «        ZI G d%„ d&e¦  «        ZJd'„ ZK G d(„ d)e¦  «        ZL e=d*d+d,¬-¦  «        d.„ ¦   «         ZM e=d/d+d0¬-¦  «         G d1„ d2e¦  «        ¦   «         ZN e=d3d+d4¬-¦  «        d\d5„¦   «         ZO G d6„ d7e¦  «        ZPd\d8„ZQ G d9„ d:ee¦  «        ZR G d;„ d<eRe2¦  «        ZS G d=„ d>eR¦  «        ZT G d?„ d@eRe2¦  «        ZU G dA„ dBeR¦  «        ZV G dC„ dDeP¦  «        ZW G dE„ dFeT¦  «        ZX G dG„ dHeJ¦  «        ZY G dI„ dJe¦  «        ZZdK„ Z[dL„ Z\dM„ Z]dN„ Z^dO„ Z_dP„ Z`dQ„ ZadR„ ZbdS„ ZcdT„ ZddU„ Zed]dW„ZfdX„ ZgdY„ ZhdZ„ Zid[ eie¦  «        giejj        eR<   dS )^a�  
This module defines tensors with abstract index notation.

The abstract index notation has been first formalized by Penrose.

Tensor indices are formal objects, with a tensor type; there is no
notion of index range, it is only possible to assign the dimension,
used to trace the Kronecker delta; the dimension can be a Symbol.

The Einstein summation convention is used.
The covariant indices are indicated with a minus sign in front of the index.

For instance the tensor ``t = p(a)*A(b,c)*q(-c)`` has the index ``c``
contracted.

A tensor expression ``t`` can be called; called with its
indices in sorted order it is equal to itself:
in the above example ``t(a, b) == t``;
one can call ``t`` with different indices; ``t(c, d) == p(c)*A(d,a)*q(-a)``.

The contracted indices are dummy indices, internally they have no name,
the indices being represented by a graph-like structure.

Tensors are put in canonical form using ``canon_bp``, which uses
the Butler-Portugal algorithm for canonicalization using the monoterm
symmetries of the tensors.

If there is a (anti)symmetric metric, the indices can be raised and
lowered when the tensor is put in canonical form.
é    )Úannotations)ÚAny)Úreduce)Úprod)ÚabstractmethodÚABC)ÚdefaultdictN)ÚIntegerÚRational©ÚPermutation)Úget_symmetric_group_sgsÚbsgs_direct_productÚcanonicalizeÚriemann_bsgs)ÚBasicÚExprÚsympifyÚAddÚMulÚS)Úclear_cache)ÚTupleÚDict)ÚWildFunction)Údefault_sort_key)ÚSymbolÚsymbolsÚWild)ÚCantSympifyÚ_sympify)ÚAssocOp)Ú
SYMPY_INTS)Úeye)Úsympy_deprecation_warningÚSymPyDeprecationWarningÚignore_warnings)Úmemoize_propertyÚ
deprecated)Úsiftc                 ó,   — t          dddd¬¦  «         d S )Nz|
        The data attribute of TensorIndexType is deprecated. Use The
        replace_with_arrays() method instead.
        z1.4z deprecated-tensorindextype-attrsé   ©Údeprecated_since_versionÚactive_deprecations_targetÚ
stacklevel©r%   © ó    úQ/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/tensor/tensor.pyÚdeprecate_datar5   ?   s3   € Ýð	ð "'Ø#EØðñ ô ð ð ð r3   c                 ó,   — t          dddd¬¦  «         d S )Nzn
        The Tensor.fun_eval() method is deprecated. Use
        Tensor.substitute_indices() instead.
        ú1.5údeprecated-tensor-fun-evalr,   r-   r1   r2   r3   r4   Údeprecate_fun_evalr9   J   ó3   € Ýð	ð "'Ø#?Øðñ ô ð ð ð r3   c                 ó,   — t          dddd¬¦  «         d S )Nzx
        Calling a tensor like Tensor(*indices) is deprecated. Use
        Tensor.substitute_indices() instead.
        r7   r8   r,   r-   r1   r2   r3   r4   Údeprecate_callr<   V   r:   r3   c                  óÞ   — e Zd ZdZdd„Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zd„ Z	ed„ ¦   «         Z
ed	„ ¦   «         Zed
„ ¦   «         Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zd„ ZdS )Ú_IndexStructurea¶  
    This class handles the indices (free and dummy ones). It contains the
    algorithms to manage the dummy indices replacements and contractions of
    free indices under multiplications of tensor expressions, as well as stuff
    related to canonicalization sorting, getting the permutation of the
    expression and so on. It also includes tools to get the ``TensorIndex``
    objects corresponding to the given index structure.
    Fc                óØ   — || _         || _        || _        || _        t	          | j         ¦  «        dt	          | j        ¦  «        z  z   | _        | j                             d„ ¬¦  «         d S )Né   c                ó   — | d         S ©Nr   r2   ©Úxs    r4   ú<lambda>z*_IndexStructure.__init__.<locals>.<lambda>r   s
   €  A a¤D€ r3   ©Úkey)ÚfreeÚdumÚindex_typesÚindicesÚlenÚ	_ext_rankÚsort)ÚselfrH   rI   rJ   rK   Úcanon_bps         r4   Ú__init__z_IndexStructure.__init__l   s]   € ØˆŒ	ØˆŒØ&ˆÔØˆŒÝ˜TœY™œ¨!­C°´©M¬M©/Ñ9ˆŒØŒ�Š˜.˜.ˆÑ)Ô)Ð)Ð)Ð)r3   c                 ó˜   — t          j        | Ž \  }}d„ | D ¦   «         }t                                | ||¦  «        } t          |||| ¦  «        S )až  
        Create a new ``_IndexStructure`` object from a list of ``indices``.

        Explanation
        ===========

        ``indices``     ``TensorIndex`` objects, the indices. Contractions are
                        detected upon construction.

        Examples
        ========

        >>> from sympy.tensor.tensor import TensorIndexType, tensor_indices, _IndexStructure
        >>> Lorentz = TensorIndexType('Lorentz', dummy_name='L')
        >>> m0, m1, m2, m3 = tensor_indices('m0,m1,m2,m3', Lorentz)
        >>> _IndexStructure.from_indices(m0, m1, -m1, m3)
        _IndexStructure([(m0, 0), (m3, 3)], [(1, 2)], [Lorentz, Lorentz, Lorentz, Lorentz])
        c                ó   — g | ]	}|j         ‘Œ
S r2   ©Útensor_index_type©Ú.0Úis     r4   ú
<listcomp>z0_IndexStructure.from_indices.<locals>.<listcomp>Š   ó   € Ð<Ð<Ð<¨q�qÔ*Ð<Ð<Ð<r3   )r>   Ú_free_dum_from_indicesÚ_replace_dummy_names)rK   rH   rI   rJ   s       r4   Úfrom_indicesz_IndexStructure.from_indicest   sS   € õ* $Ô:¸GÐD‰	ˆˆcØ<Ð<°GÐ<Ñ<Ô<ˆÝ!×6Ò6°wÀÀcÑJÔJˆÝ˜t S¨+°wÑ?Ô?Ð?r3   c                ó    — g }| D ]}|                      |j        ¦  «         Œt                               |||¦  «        }t          ||||¦  «        S ©N)ÚextendrJ   r>   Ú*generate_indices_from_free_dum_index_types)Ú
componentsrH   rI   rJ   Ú	componentrK   s         r4   Úfrom_components_free_dumz(_IndexStructure.from_components_free_dumŽ   s]   € àˆØ#ð 	6ð 	6ˆIØ×Ò˜yÔ4Ñ5Ô5Ð5Ð5Ý!×LÒLÈTÐSVÐXcÑdÔdˆÝ˜t S¨+°wÑ?Ô?Ð?r3   c                 ó^  ‡— t          | ¦  «        }|dk    r| d         dfgg fS dgt          | ¦  «        z  Ši }g }t          | ¦  «        D ]±\  }}|j        }|j        }|j        }||f|v rƒ|||f         \  }	}
|	r!|rt          d|
|fz  ¦  «        ‚d‰|
<   d‰|<   n!|rd‰|
<   d‰|<   nt          d|
|fz  ¦  «        ‚|r|                     ||
f¦  «         Œ‹|                     |
|f¦  «         Œ£|j        |f|||f<   Œ²ˆfd„t          | ¦  «        D ¦   «         Š‰                     ¦   «          ‰|fS )a  
        Convert ``indices`` into ``free``, ``dum`` for single component tensor.

        Explanation
        ===========

        ``free``     list of tuples ``(index, pos, 0)``,
                     where ``pos`` is the position of index in
                     the list of indices formed by the component tensors

        ``dum``      list of tuples ``(pos_contr, pos_cov, 0, 0)``

        Examples
        ========

        >>> from sympy.tensor.tensor import TensorIndexType, tensor_indices,             _IndexStructure
        >>> Lorentz = TensorIndexType('Lorentz', dummy_name='L')
        >>> m0, m1, m2, m3 = tensor_indices('m0,m1,m2,m3', Lorentz)
        >>> _IndexStructure._free_dum_from_indices(m0, m1, -m1, m3)
        ([(m0, 0), (m3, 3)], [(1, 2)])
        é   r   Tz2two equal contravariant indices in slots %d and %dFz.two equal covariant indices in slots %d and %dc                ó.   •— g | ]\  }}‰|         ¯||f‘ŒS r2   r2   )rW   rX   ÚindexrH   s      €r4   rY   z:_IndexStructure._free_dum_from_indices.<locals>.<listcomp>Ñ   s*   ø€ ÐIÐIÐI™x˜q %ÀÀaÄÐI�˜�
ÐIÐIÐIr3   )rL   Ú	enumerateÚnamerU   Úis_upÚ
ValueErrorÚappendrN   )rK   ÚnÚ
index_dictrI   rX   rh   rj   ÚtypÚcontrÚis_contrÚposrH   s              @r4   r[   z&_IndexStructure._free_dum_from_indices–   s   ø€ õ0 �‰LŒLˆØ�Š6ˆ6Ø˜Q”Z �OÐ$ bÐ(Ð(ð ˆv•c˜'‘l”lÑ"ˆØˆ
ØˆÝ! 'Ñ*Ô*ð 	9ð 	9‰HˆAˆuØ”:ˆDØÔ)ˆCØ”KˆEØ�cˆ{˜jÐ(Ð(à *¨D°#¨;Ô 7‘�˜#àð eØð (Ý(Ð)]Ð`cÐefÐ_gÑ)gÑhÔhÐhà$)˜˜S™	Ø"'˜˜Q™˜àð eØ$)˜˜S™	Ø"'˜˜Q™˜å(Ð)YÐ\_ÐabÐ[cÑ)cÑdÔdÐdØð )Ø—J’J  3˜xÑ(Ô(Ð(Ð(à—J’J  Q˜xÑ(Ô(Ð(Ð(à*/¬+°q¨.�
˜D #˜;Ñ'Ð'àIÐIÐIÐI­9°WÑ+=Ô+=ÐIÑIÔIˆØ�	Š	‰ŒˆØ�SˆyÐr3   c                ó    — | j         dd…         S )z_
        Get a list of indices, creating new tensor indices to complete dummy indices.
        N)rK   ©rO   s    r4   Úget_indicesz_IndexStructure.get_indicesÕ   s   € ð Œ|˜A˜A˜AŒÐr3   c                óZ  — d gt          | ¦  «        dt          |¦  «        z  z   z  }| D ]
\  }}|||<   Œt                               | ¦  «        }|D ]@\  }}||         }	 ||	¦  «        }
t          |
|	d¦  «        ||<   t          |
|	d¦  «        ||<   ŒAt                               || |¦  «        S )Nr@   TF)rL   r>   Ú _get_generator_for_dummy_indicesÚTensorIndexr\   )rH   rI   rJ   rK   Úidxrs   Úgenerate_dummy_nameÚpos1Úpos2Útyp1Úindnames              r4   ra   z:_IndexStructure.generate_indices_from_free_dum_index_typesÛ   sÆ   € à�&�#˜d™)œ) A¥c¨#¡h¤h¡JÑ.Ñ/ˆØð 	ð 	‰HˆC�ØˆG�C‰LˆLå-×NÒNÈtÑTÔTÐØð 	>ð 	>‰JˆD�$Ø˜tÔ$ˆDØ)Ð)¨$Ñ/Ô/ˆGÝ'¨°°tÑ<Ô<ˆG�D‰MÝ'¨°°uÑ=Ô=ˆG�D‰MˆMå×3Ò3°G¸TÀ3ÑGÔGÐGr3   c           	     óH  ‡— t          t          ¦  «        Š| D ]„\  }}|j                             d¦  «        d         |j        j        k    rQt          ‰|j                 t          |j                             d¦  «        d         ¦  «        dz   ¦  «        ‰|j        <   Œ…ˆfd„}|S )NÚ_r   rf   c                óh   •— t          ‰|          ¦  «        }‰| xx         dz  cc<   | j        dz   |z   S ©Nrf   r�   ©ÚstrÚ
dummy_name©rU   ÚndÚcdts     €r4   Údummy_name_genzH_IndexStructure._get_generator_for_dummy_indices.<locals>.dummy_name_genô   óF   ø€ Ý�SÐ*Ô+Ñ,Ô,ˆBØÐ!Ð"Ð"Ô" aÑ'Ð"Ð"Ñ"Ø$Ô/°#Ñ5¸Ñ:Ð:r3   )r	   Úintrj   ÚsplitrU   r†   Úmax)rH   ÚindxÚiposrŠ   r‰   s       @r4   rx   z0_IndexStructure._get_generator_for_dummy_indicesê   s³   ø€ å�#ÑÔˆð ð 	qð 	q‰JˆD�$ØŒy�Š˜sÑ#Ô# AÔ&¨$Ô*@Ô*KÒKÐKÝ.1°#°dÔ6LÔ2MÍsÐSWÔS\×SbÒSbÐcfÑSgÔSgÐhiÔSjÑOkÔOkÐnoÑOoÑ.pÔ.p��DÔ*Ñ+øð	;ð 	;ð 	;ð 	;ð 	;ð
 Ðr3   c                ó€  — |                      d„ ¬¦  «         t          | ¦  «        }t          | ¦  «        t          |¦  «        dt          |¦  «        z  z   k    sJ ‚t                               |¦  «        }|D ]E\  }}||         j        } ||¦  «        }t          ||d¦  «        ||<   t          ||d¦  «        ||<   ŒF|S )Nc                ó   — | d         S rB   r2   rC   s    r4   rE   z6_IndexStructure._replace_dummy_names.<locals>.<lambda>ý   s
   € ˜q œt€ r3   rF   r@   TF)rN   ÚlistrL   r>   rx   rU   ry   )	rK   rH   rI   Únew_indicesr{   Úipos1Úipos2r~   r   s	            r4   r\   z$_IndexStructure._replace_dummy_namesû   sÊ   € à�Š�^�^ˆÑ$Ô$Ð$Ý˜7‘m”mˆÝ�7‰|Œ|�s 4™yœy¨1­S°©X¬X©:Ñ5Ò5Ð5Ð5Ð5Ý-×NÒNÈtÑTÔTÐØð 	Cð 	C‰LˆE�5Ø˜uÔ%Ô7ˆDØ)Ð)¨$Ñ/Ô/ˆGÝ!,¨W°d¸DÑ!AÔ!AˆK˜ÑÝ!,¨W°d¸EÑ!BÔ!BˆK˜ÑÐØÐr3   Úreturnúlist[TensorIndex]c                óH   — t          | j        d„ ¬¦  «        }d„ |D ¦   «         S )z-
        Get a list of free indices.
        c                ó   — | d         S ©Nrf   r2   rC   s    r4   rE   z2_IndexStructure.get_free_indices.<locals>.<lambda>  s
   € ¨q°¬t€ r3   rF   c                ó   — g | ]
}|d          ‘ŒS ©r   r2   rV   s     r4   rY   z4_IndexStructure.get_free_indices.<locals>.<listcomp>  s   € Ð#Ð#Ð#˜��!”Ð#Ð#Ð#r3   ©ÚsortedrH   )rO   rH   s     r4   Úget_free_indicesz _IndexStructure.get_free_indices  s.   € õ
 �d”i ^ ^Ð4Ñ4Ô4ˆØ#Ð#˜dÐ#Ñ#Ô#Ð#r3   c                óN   — d                      | j        | j        | j        ¦  «        S )Nz_IndexStructure({}, {}, {}))ÚformatrH   rI   rJ   ru   s    r4   Ú__str__z_IndexStructure.__str__  s!   € Ø,×3Ò3°D´I¸t¼xÈÔIYÑZÔZÐZr3   c                ó*   — |                       ¦   «         S r_   )r£   ru   s    r4   Ú__repr__z_IndexStructure.__repr__  s   € Ø�|Š|‰~Œ~Ðr3   c                óR   — | j         d d …         }|                     d„ ¬¦  «         |S )Nc                ó   — | d         S rB   r2   rC   s    r4   rE   zD_IndexStructure._get_sorted_free_indices_for_canon.<locals>.<lambda>  s
   €  q¨¤t€ r3   rF   )rH   rN   )rO   Úsorted_frees     r4   Ú"_get_sorted_free_indices_for_canonz2_IndexStructure._get_sorted_free_indices_for_canon  s0   € Ø”i   ”lˆØ×Ò˜^˜^ÐÑ,Ô,Ð,ØÐr3   c                ó0   — t          | j        d„ ¬¦  «        S )Nc                ó   — | d         S rB   r2   rC   s    r4   rE   zC_IndexStructure._get_sorted_dum_indices_for_canon.<locals>.<lambda>  s
   € ¨a°¬d€ r3   rF   )rŸ   rI   ru   s    r4   Ú!_get_sorted_dum_indices_for_canonz1_IndexStructure._get_sorted_dum_indices_for_canon  s   € Ý�d”h N NÐ3Ñ3Ô3Ð3r3   c                ó    — |                       ¦   «         d         }d g| j        z  }t          | j        ¦  «        D ]\  }}|| ||¦  «        <   Œ|S rB   )Úindices_canon_argsrM   ri   rJ   )rO   ÚpermutationrJ   rX   Úits        r4   Ú)_get_lexicographically_sorted_index_typesz9_IndexStructure._get_lexicographically_sorted_index_types  s_   € Ø×-Ò-Ñ/Ô/°Ô2ˆØ�f˜Tœ^Ñ+ˆÝ˜tÔ/Ñ0Ô0ð 	-ð 	-‰EˆAˆrØ*,ˆK˜˜ A™œÑ'Ð'ØÐr3   c                ó    — |                       ¦   «         d         }d g| j        z  }t          | j        ¦  «        D ]\  }}|| ||¦  «        <   Œ|S rB   )r®   rM   ri   rK   )rO   r¯   rK   rX   r°   s        r4   Ú%_get_lexicographically_sorted_indicesz5_IndexStructure._get_lexicographically_sorted_indices%  s]   € Ø×-Ò-Ñ/Ô/°Ô2ˆØ�&˜œÑ'ˆÝ˜tœ|Ñ,Ô,ð 	)ð 	)‰EˆAˆrØ&(ˆG�K�K ‘N”NÑ#Ð#Øˆr3   c                ó�  — d„ |                       ¦   «         D ¦   «         }|                      ¦   «         }|                      ¦   «         }t          |¦  «        }| j        }d„ t          ||z
  dz  ¦  «        D ¦   «         }g }	dg|z  }
dg|z  }t          |¦  «        D ]�}||         }||         |
|<   ||         ||<   ||k     r9||         }|
|         ||         j        k    sJ ‚|	                     ||f¦  «         Œ_||z
  }t          |d¦  «        \  }}|r|||         d<   Œ…|||         d<   Œ‘d„ |D ¦   «         }t          |	||
|¦  «        S )at  
        Returns a ``_IndexStructure`` instance corresponding to the permutation ``g``.

        Explanation
        ===========

        ``g``  permutation corresponding to the tensor in the representation
        used in canonicalization

        ``is_canon_bp``   if True, then ``g`` is the permutation
        corresponding to the canonical form of the tensor
        c                ó   — g | ]
}|d          ‘ŒS r�   r2   rV   s     r4   rY   z/_IndexStructure.perm2tensor.<locals>.<listcomp>9  s   € ÐOÐOÐO �q˜”tÐOÐOÐOr3   c                ó   — g | ]}d gdz  ‘Œ	S ©Nr@   r2   rV   s     r4   rY   z/_IndexStructure.perm2tensor.<locals>.<listcomp>>  s   € Ð:Ð:Ð:˜A�ˆv�a‰xÐ:Ð:Ð:r3   r@   Nrf   r   c                ó,   — g | ]}t          |¦  «        ‘ŒS r2   )Útuple©rW   rD   s     r4   rY   z/_IndexStructure.perm2tensor.<locals>.<listcomp>R  s   € Ð%Ð%Ð%˜A�u�Q‰xŒxÐ%Ð%Ð%r3   )
r©   r±   r³   rL   rM   ÚrangerU   rm   Údivmodr>   )rO   ÚgÚis_canon_bpr¨   Úlex_index_typesÚlex_indicesÚnfreeÚrankrI   rH   rJ   rK   rX   ÚgiÚindÚjÚidumÚcovs                     r4   Úperm2tensorz_IndexStructure.perm2tensor,  s€  € ð PÐO T×%LÒ%LÑ%NÔ%NÐOÑOÔOˆØ×HÒHÑJÔJˆØ×@Ò@ÑBÔBˆÝ�KÑ Ô ˆØŒ~ˆØ:Ð:¥¨¨u©°qÑ'8Ñ!9Ô!9Ð:Ñ:Ô:ˆØˆà�f˜T‘kˆØ�&˜‘+ˆÝ�t‘”ð 	%ð 	%ˆAØ�1”ˆBØ,¨RÔ0ˆK˜‰NØ$ RœˆG�A‰JØ�EŠzˆzØ! "”o�Ø" 1”~¨°R¬Ô)JÒJÐJÐJÐJØ—’˜S !˜HÑ%Ô%Ð%Ð%à˜‘J�Ý" 1 a™LœL‘	��cØð %Ø#$�C˜”I˜a‘L�Là#$�C˜”I˜a‘L�LØ%Ð% Ð%Ñ%Ô%ˆå˜t S¨+°wÑ?Ô?Ð?r3   c                óŠ  — ddl m} | j        }dg|z  ||dz   gz   }d„ }t          |                      ¦   «         ¦  «        D ]\  }\  }}|||<   Œt          | j        ¦  «        }t          | j        ¦  «        }	g }
d}g }g }|                      ¦   «         D ]�\  }}|	||<   |	dz   ||<   |	dz  }	| j        |         }||k    rD|r|
 	                    |¦  «         ||dz   g}|}| 	                     ||j
        ¦  «        ¦  «         n|                     ||dz   g¦  «         |dz  }ŒŽ|r|
 	                    |¦  «          ||¦  «        |
|fS )z 
        Returns ``(g, dummies, msym, v)``, the entries of ``canonicalize``

        See ``canonicalize`` in ``tensor_can.py`` in combinatorics module.
        r   )Ú_af_newNrf   c                óœ   — | €d S | j         }|t                               d¦  «        k    rdS |t                               d¦  «        k    rdS d S )Nr@   r   éþÿÿÿrf   )ÚsymmetryÚTensorSymmetryÚfully_symmetric)ÚmetricÚsyms     r4   Úmetric_symmetry_to_msymzC_IndexStructure.indices_canon_args.<locals>.metric_symmetry_to_msymc  sT   € Øˆ~Ø�tØ”/ˆCØ•n×4Ò4°QÑ7Ô7Ò7Ð7Ø�qØ•n×4Ò4°RÑ8Ô8Ò8Ð8Ø�qØ�4r3   r@   )Ú sympy.combinatorics.permutationsrÊ   rM   ri   r©   rL   rH   r¬   rJ   rm   rÐ   r`   )rO   rÊ   rn   r½   rÒ   rX   r�   r�   rs   rÅ   ÚdummiesÚprevÚaÚmsymr•   r–   rp   s                    r4   r®   z"_IndexStructure.indices_canon_argsV  s¡  € ð 	=Ð<Ð<Ð<Ð<Ð<ØŒNˆØˆF�1‰H˜˜1˜Q™3�xÑˆð	ð 	ð 	õ  )¨×)PÒ)PÑ)RÔ)RÑSÔSð 	ð 	‰OˆA‰|��dØˆAˆd‰GˆGÝ�$”)‰nŒnˆÝ�”	‰NŒNˆØˆØˆØˆØˆØ ×BÒBÑDÔDð 	ð 	‰LˆE�5ØˆAˆe‰HØ˜1‘uˆAˆe‰HØ�‰FˆAØÔ" 5Ô)ˆCØ�dŠ{ˆ{Øð &Ø—N’N 1Ñ%Ô%Ð%Ø˜# ™'�N�Ø�Ø—’Ð3Ð3°C´JÑ?Ô?Ñ@Ô@Ð@Ð@à—’˜#˜s Q™w˜Ñ(Ô(Ð(Ø�1‰HˆCˆCØð 	Ø�NŠN˜1ÑÔÐàˆw�q‰zŒz˜7 DÐ(Ð(r3   N©F©r—   r˜   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rQ   Ústaticmethodr]   rd   r[   rv   ra   rx   r\   r    r£   r¥   r©   r¬   r±   r³   rÈ   r®   r2   r3   r4   r>   r>   b   s†  € € € € € ðð ð*ð *ð *ð *ð ð@ð @ñ „\ð@ð2 ð@ð @ñ „\ð@ð ð<ð <ñ „\ð<ð|ð ð ð ðHð Hñ „\ðHð ðð ñ „\ðð  ð
ð 
ñ „\ð
ð$ð $ð $ð $ð[ð [ð [ðð ð ðð ð ð
4ð 4ð 4ðð ð ðð ð ð(@ð (@ð (@ð (@ðT4)ð 4)ð 4)ð 4)ð 4)r3   r>   c                ó^  — g }d }| D ]8}||k    r|d         dxx         dz  cc<   Œ|}|                      |dg¦  «         Œ9g }|D ]h\  }}|j        dv r|j        }n%t                               |j        |j        ¦  «        }|                      |j        j        |j        j        ||f¦  «         Œi|S )Néÿÿÿÿrf   ©r   rf   )rm   ÚcommÚTensorManagerÚget_commrÍ   ÚbaseÚ
generators)rb   ÚnumtyprÕ   ÚtÚvÚhrn   râ   s           r4   Úcomponents_canon_argsrë   �  sÓ   € Ø€FØ€DØð %ð %ˆØ�Š9ˆ9Ø�2ŒJ�qˆMˆMŒM˜QÑˆMˆM‰MˆMàˆDØ�MŠM˜4 ˜)Ñ$Ô$Ð$Ð$Ø
€AØð Dð D‰ˆˆ1ØŒ6�VÐÐØ”6ˆDˆDå ×)Ò)¨!¬&°!´&Ñ9Ô9ˆDØ	�Š�!”*”/ 1¤:Ô#8¸!¸TÐBÑCÔCÐCÐCØ€Hr3   c                  ó  — e Zd ZU dZi Zded<   i Zded<   d„ Zd„ Ze	d„ ¦   «         Z
d„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Ze	d„ ¦   «         Ze	d„ ¦   «         Ze	d„ ¦   «         Ze	dd„¦   «         Ze	d„ ¦   «         Ze	d„ ¦   «         Ze	d„ ¦   «         ZdS )Ú_TensorDataLazyEvaluatora³  
    EXPERIMENTAL: do not rely on this class, it may change without deprecation
    warnings in future versions of SymPy.

    Explanation
    ===========

    This object contains the logic to associate components data to a tensor
    expression. Components data are set via the ``.data`` property of tensor
    expressions, is stored inside this class as a mapping between the tensor
    expression and the ``ndarray``.

    Computations are executed lazily: whereas the tensor expressions can have
    contractions, tensor products, and additions, components data are not
    computed until they are accessed by reading the ``.data`` property
    associated to the tensor expression.
    zdict[Any, Any]Ú_substitutions_dictÚ_substitutions_dict_tensmulc                ó  — |                       |¦  «        }|€d S ddlm} t          ||¦  «        s|S |                     ¦   «         dk    r|d         S |                     ¦   «         dk    rt          |¦  «        dk    r|d         S |S )Nrf   )Ú	NDimArrayr   r2   )Ú_getÚarrayrñ   Ú
isinstancerÂ   rL   )rO   rG   Údatrñ   s       r4   Ú__getitem__z$_TensorDataLazyEvaluator.__getitem__µ  s‹   € Ø�iŠi˜‰nŒnˆØˆ;Ø�4à$Ð$Ð$Ð$Ð$Ð$Ý˜#˜yÑ)Ô)ð 	ØˆJà�8Š8‰:Œ:˜Š?ˆ?Ø�r”7ˆNØ�XŠX‰ZŒZ˜1Š_ˆ_¥ S¡¤¨Q¢ Ø�q”6ˆMØˆ
r3   c                ó  ‡ ‡— |‰ j         v r‰ j         |         S t          |t          ¦  «        rdS t          |t          ¦  «        rƒt	          d„ |                     ¦   «         D ¦   «         ¦  «        }|j        f|z   }|‰ j        v r‰ j        |         S ‰                      |¦  «        g}‰  	                    ||j
        |j        ¦  «        S t          |t          ¦  «        �r&|j        }t          |¦  «        dk    r|t          |d         j        ¦  «        dk    r^t	          d„ |d                              ¦   «         D ¦   «         ¦  «        }|d         j        d         f|z   }|‰ j        v r‰ j        |         S ˆ fd„|D ¦   «         }t!          d„ |D ¦   «         ¦  «        }t#          d„ |D ¦   «         ¦  «        rdS t%          d	„ |D ¦   «         ¦  «        rt'          d
¦  «        ‚‰  	                    ||j
        |j        ¦  «        }||z  S t          |t(          ¦  «        �rrg }g }	|j        D ]€}
t          |
t*          ¦  «        r?|                     |
j        ¦  «         |	                     d„ |
j        D ¦   «         ¦  «         ŒV|                     |
¦  «         |	                     g ¦  «         Œ�t#          d„ |D ¦   «         ¦  «        rdS t%          d„ |D ¦   «         ¦  «        rt'          d
¦  «        ‚g }ddlm} t7          ||	¦  «        D ]y\  }}t          |¦  «        dk     r|                     |¦  «         Œ.d„ t9          |¦  «        D ¦   «         Šˆfd„|j        D ¦   «         }|                      |||¦  «        ¦  «         Œzt=          d„ |¦  «        S dS )a]  
        Retrieve ``data`` associated with ``key``.

        Explanation
        ===========

        This algorithm looks into ``self._substitutions_dict`` for all
        ``TensorHead`` in the ``TensExpr`` (or just ``TensorHead`` if key is a
        TensorHead instance). It reconstructs the components data that the
        tensor expression should have by performing on components data the
        operations that correspond to the abstract tensor operations applied.

        Metric tensor is handled in a different manner: it is pre-computed in
        ``self._substitutions_dict_tensmul``.
        Nc                ó   — g | ]	}|j         ‘Œ
S r2   ©rk   rV   s     r4   rY   z1_TensorDataLazyEvaluator._get.<locals>.<listcomp>Þ  s   € ÐBÐBÐB¨1˜qœwÐBÐBÐBr3   rf   r   c                ó   — g | ]	}|j         ‘Œ
S r2   rù   rV   s     r4   rY   z1_TensorDataLazyEvaluator._get.<locals>.<listcomp>ë  s   € Ð"RÐ"RÐ"R¨q 1¤7Ð"RÐ"RÐ"Rr3   c                óœ   •— g | ]H}t          |t          ¦  «        ¯t          |t          ¦  «        r‰                     |¦  «        n|j        ‘ŒIS r2   )rô   ÚTensExprÚTensorÚdata_from_tensorÚdata)rW   rX   rO   s     €r4   rY   z1_TensorDataLazyEvaluator._get.<locals>.<listcomp>ð  ss   ø€ ð  Ið  Ið  IÐ[\ÕpzÐ{|õ  Gñ  qHô  qHð  IµZÀÅ6Ñ5JÔ5JÐV˜×.Ò.¨qÑ1Ô1Ð1ÐPQÔPVð  Ið  Ið  Ir3   c                ó<   — g | ]}t          |t          ¦  «        °|‘ŒS r2   ©rô   rü   rV   s     r4   rY   z1_TensorDataLazyEvaluator._get.<locals>.<listcomp>ñ  s'   € ÐQÐQÐQ ½ÀAÅxÑ9PÔ9PÐQ˜!ÐQÐQÐQr3   c              3  ó   K  — | ]}|d u V — Œ	d S r_   r2   rV   s     r4   ú	<genexpr>z0_TensorDataLazyEvaluator._get.<locals>.<genexpr>ò  ó&   è è € Ð0Ð0 �1˜�9Ð0Ð0Ð0Ð0Ð0Ð0r3   c              3  ó   K  — | ]}|d u V — Œ	d S r_   r2   rV   s     r4   r  z0_TensorDataLazyEvaluator._get.<locals>.<genexpr>ô  r  r3   zSMixing tensors with associated components data with tensors without components datac                ó   — g | ]
}|d          ‘ŒS r�   r2   rº   s     r4   rY   z1_TensorDataLazyEvaluator._get.<locals>.<listcomp>   s   € Ð*BÐ*BÐ*B°A¨1¨Q¬4Ð*BÐ*BÐ*Br3   c              3  ó   K  — | ]}|d u V — Œ	d S r_   r2   rV   s     r4   r  z0_TensorDataLazyEvaluator._get.<locals>.<genexpr>  r  r3   c              3  ó   K  — | ]}|d u V — Œ	d S r_   r2   rV   s     r4   r  z0_TensorDataLazyEvaluator._get.<locals>.<genexpr>  r  r3   ©Úpermutedimsr@   c                ó   — i | ]\  }}||“Œ	S r2   r2   )rW   rD   Úys      r4   ú
<dictcomp>z1_TensorDataLazyEvaluator._get.<locals>.<dictcomp>  s   € Ð$KÐ$KÐ$K©d¨a° Q¨Ð$KÐ$KÐ$Kr3   c                ó    •— g | ]
}‰|         ‘ŒS r2   r2   )rW   ÚargÚfree_args_poss     €r4   rY   z1_TensorDataLazyEvaluator._get.<locals>.<listcomp>  s   ø€ ÐHÐHÐH°3˜M¨#Ô.ÐHÐHÐHr3   c                ó   — | |z   S r_   r2   )rD   r  s     r4   rE   z/_TensorDataLazyEvaluator._get.<locals>.<lambda>  s
   €  q¨¡s€ r3   )rî   rô   Ú
TensorHeadrý   r¹   rv   rc   rï   rþ   Údata_contract_dumrI   Úext_rankÚTensMulÚargsrL   rb   r   ÚallÚanyrl   ÚTensAddrü   rm   rÿ   rH   ró   r
  Úzipri   Ú	free_argsr   )rO   rG   Ú	signatureÚsrchÚ
array_listÚtensmul_argsÚ	data_listÚcoeffÚdata_resultÚfree_args_listr  Úsum_listr
  rÿ   r  Úaxesr  s   `               @r4   rò   z_TensorDataLazyEvaluator._getÄ  s  øø€ ð  �$Ô*Ð*Ð*ØÔ+¨CÔ0Ð0å�c�:Ñ&Ô&ð 	Ø�4å�c�6Ñ"Ô"ð 		Mõ ÐBÐB°·²Ñ0AÔ0AÐBÑBÔBÑCÔCˆIØ”MÐ# iÑ/ˆDØ�tÔ7Ð7Ð7ØÔ7¸Ô=Ð=Ø×/Ò/°Ñ4Ô4Ð5ˆJØ×)Ò)¨*°c´g¸s¼|ÑLÔLÐLå�c�7Ñ#Ô#ñ 	%Øœ8ˆLÝ�<Ñ Ô  AÒ%Ð%­#¨l¸1¬oÔ.HÑ*IÔ*IÈQÒ*NÐ*Nõ "Ð"RÐ"R°LÀ´O×4OÒ4OÑ4QÔ4QÐ"RÑ"RÔ"RÑSÔS�	Ø$ QœÔ2°1Ô5Ð7¸)ÑC�Ø˜4Ô;Ð;Ð;ØÔ;¸DÔAÐAð Ið  Ið  Ið  IÐ`lð  Iñ  Iô  IˆIÝÐQÐQ \ÐQÑQÔQÑRÔRˆEÝÐ0Ð0 iÐ0Ñ0Ô0Ñ0Ô0ð Ø�tÝÐ0Ð0 iÐ0Ñ0Ô0Ñ0Ô0ð NÝ ð "Mñ Nô Nð Nà×0Ò0°¸C¼GÀSÄ\ÑRÔRˆKØ˜Ñ$Ð$å�c�7Ñ#Ô#ñ 	6ØˆIØˆNØ”xð .ð .�Ý˜c¥8Ñ,Ô,ð .Ø×$Ò$ S¤XÑ.Ô.Ð.Ø"×)Ò)Ð*BÐ*B¸¼Ð*BÑ*BÔ*BÑCÔCÐCÐCà×$Ò$ SÑ)Ô)Ð)Ø"×)Ò)¨"Ñ-Ô-Ð-Ð-ÝÐ0Ð0 iÐ0Ñ0Ô0Ñ0Ô0ð Ø�tÝÐ0Ð0 iÐ0Ñ0Ô0Ñ0Ô0ð NÝ ð "Mñ Nô Nð Nð ˆHØ*Ð*Ð*Ð*Ð*Ð*Ý#& y°.Ñ#AÔ#Að =ð =‘��iÝ�y‘>”> AÒ%Ð%Ø—O’O DÑ)Ô)Ð)Ð)à$KÐ$KµiÀ	Ñ6JÔ6JÐ$KÑ$KÔ$K�MØHÐHÐHÐH¸#¼-ÐHÑHÔH�DØ—O’O K K°°dÑ$;Ô$;Ñ<Ô<Ð<Ð<ÝÐ*Ð*¨HÑ5Ô5Ð5àˆtr3   c                ól   — ddl m}m}m} t	          t          || ¦  «        ¦  «        } ||Ž } ||g|¢R Ž S )Nrf   )ÚtensorproductÚtensorcontractionÚMutableDenseNDimArray)ró   r'  r(  r)  r“   Úmap)Úndarray_listrI   r  r'  r(  r)  ÚarraysÚprodarrs           r4   r  z*_TensorDataLazyEvaluator.data_contract_dum  s]   € àRÐRÐRÐRÐRÐRÐRÐRÐRÐRÝ•cÐ/°Ñ>Ô>Ñ?Ô?ˆØ�- Ð(ˆØ Ð  Ð/¨3Ð/Ð/Ð/Ð/r3   c                ót   — |€dS |                       ||                     ¦   «         |j        |j        d¦  «        S )zå
        This method is used when assigning components data to a ``TensMul``
        object, it converts components data to a fully contravariant ndarray,
        which is then stored according to the ``TensorHead`` key.
        NT)Ú_correct_signature_from_indicesrv   rH   rI   )rO   rÿ   ÚtensmulÚ
tensorheads       r4   Údata_tensorhead_from_tensmulz5_TensorDataLazyEvaluator.data_tensorhead_from_tensmul  sE   € ð ˆ<Ø�4à×3Ò3ØØ×ÒÑ!Ô!ØŒLØŒKØñô ð 	r3   c                ó”   — |j         }|j        €dS |                      |j        |                     ¦   «         |j        |j        ¦  «        S )z¶
        This method corrects the components data to the right signature
        (covariant/contravariant) using the metric associated with each
        ``TensorIndexType``.
        N)rc   rÿ   r/  rv   rH   rI   )rO   Útensorr1  s      r4   rþ   z)_TensorDataLazyEvaluator.data_from_tensor.  sO   € ð Ô%ˆ
àŒ?Ð"Ø�4à×3Ò3ØŒOØ×ÒÑ Ô ØŒKØŒJñ	ô ð 	r3   c                óè   — t          |t          ¦  «        rt          d¦  «        ‚t          |j        ¦  «        dk    rt          d¦  «        ‚|j        d         }|                      |||¦  «        }||fS )Nzcannot assign data to TensAddrf   z6cannot assign data to TensMul with multiple componentsr   )rô   r  rl   rL   rb   r2  )rO   rG   rÿ   r1  Únewdatas        r4   Ú_assign_data_to_tensor_exprz4_TensorDataLazyEvaluator._assign_data_to_tensor_expr?  su   € Ý�c�7Ñ#Ô#ð 	>ÝÐ<Ñ=Ô=Ð=åˆsŒ~ÑÔ !Ò#Ð#ÝÐUÑVÔVÐVØ”^ AÔ&ˆ
Ø×3Ò3°D¸#¸zÑJÔJˆØ˜7Ð"Ð"r3   c           	     óŒ  — ddl m} ddlm} t	          |t
          ¦  «        r|j        }|j        j        }nft	          |t          ¦  «        r|j        }|j
        d         j        j        }n2t	          |t          ¦  «        r|j        j        }|j        j        j        }|D ]¥} ||¦  «        |k    rdnd}|}	|}
t          t          |t          |¦  «        ¦  «        ¦  «        }t          |                     ¦   «         dz
  ¦  «        D ]=} ||	|¦  «        }	t#           ||
||	z  z
  ¦  «        ¦  «        rt%          d¦  «        ‚|	}
Œ>Œ¦d S )Nrf   r	  )ÚFlattenr   rà   z'Component data symmetry structure error)ró   r
  Úarray.arrayopr9  rô   r  rÂ   rÍ   ræ   rý   rb   ÚTensorIndexTyperÐ   r“   r*  r»   Úorderr  rl   )rO   Útensrÿ   r
  r9  rÂ   ræ   ÚgenerÚsign_changeÚdata_swappedÚ	last_dataÚpermute_axesrX   s                r4   Ú_check_permutations_on_dataz4_TensorDataLazyEvaluator._check_permutations_on_dataI  st  € Ø&Ð&Ð&Ð&Ð&Ð&Ø*Ð*Ð*Ð*Ð*Ð*å�d�JÑ'Ô'ð 	9Ø”9ˆDØœÔ1ˆJˆJÝ˜�fÑ%Ô%ð 	9Ø”9ˆDØœ¨Ô+Ô4Ô?ˆJˆJÝ˜�oÑ.Ô.ð 	9Ø”;Ô#ˆDØœÔ-Ô8ˆJð
  ð 	)ð 	)ˆEØ!&  t¡¤°Ò!4Ð!4˜"˜"¸2ˆKØˆLØˆIÝ¥ E­5°©;¬;Ñ 7Ô 7Ñ8Ô8ˆLõ ˜5Ÿ;š;™=œ=¨™?Ñ+Ô+ð )ð )�Ø*˜{¨<¸ÑFÔF�å�w�w˜y¨;°|Ñ+CÑCÑDÔDÑEÔEð PÝ$Ð%NÑOÔOÐOØ(�	�	ð)ð	)ð 	)r3   c                óî  — t                                |¦  «        }|                      ||¦  «         t          |t          t
          f¦  «        s|                      ||¦  «        \  }}t          |t          ¦  «        rpt          |j        |j	        ¦  «        D ]U\  }}|j
        €"t          d                     |¦  «        ¦  «        ‚|j        j        sŒ;||j        k    rt          d¦  «        ‚ŒV|| j        |<   dS )aS  
        Set the components data of a tensor object/expression.

        Explanation
        ===========

        Components data are transformed to the all-contravariant form and stored
        with the corresponding ``TensorHead`` object. If a ``TensorHead`` object
        cannot be uniquely identified, it will raise an error.
        NzMindex type {} has no components data associated (needed to raise/lower index)zwrong dimension of ndarray)rí   Ú
parse_datarC  rô   r  r;  r7  r  ÚshaperJ   rÿ   rl   r¢   ÚdimÚ	is_numberrî   )rO   rG   Úvaluerÿ   rG  Ú	indextypes         r4   Ú__setitem__z$_TensorDataLazyEvaluator.__setitem__h  s
  € õ (×2Ò2°5Ñ9Ô9ˆØ×(Ò(¨¨dÑ3Ô3Ð3õ
 ˜#¥
­OÐ<Ñ=Ô=ð 	DØ×8Ò8¸¸dÑCÔC‰IˆC�å�c�:Ñ&Ô&ð 	CÝ"% d¤j°#´/Ñ"BÔ"Bð Cð C‘��YØ”>Ð)Ý$ð &@ß@FÂÀyÑ@QÔ@QñSô Sð Sà ”}Ô.ð ØØ˜)œ-Ò'Ð'Ý$Ð%AÑBÔBÐBð (à(,ˆÔ  Ñ%Ð%Ð%r3   c                ó   — | j         |= d S r_   ©rî   ©rO   rG   s     r4   Ú__delitem__z$_TensorDataLazyEvaluator.__delitem__‡  s   € ØÔ$ SÐ)Ð)Ð)r3   c                ó   — || j         v S r_   rM  rN  s     r4   Ú__contains__z%_TensorDataLazyEvaluator.__contains__Š  s   € Ø�dÔ.Ð.Ð.r3   c                óô   — || j         |ddf<   |                      |¦  «        }|| j         |ddf<   |                     ¦   «         }|                     ¦   «         }||z  | j         |ddf<   ||z  | j         |ddf<   dS )aÇ  
        Assign data to the ``metric`` tensor. The metric tensor behaves in an
        anomalous way when raising and lowering indices.

        Explanation
        ===========

        A fully covariant metric is the inverse transpose of the fully
        contravariant metric (it is meant matrix inverse). If the metric is
        symmetric, the transpose is not necessary and mixed
        covariant/contravariant metrics are Kronecker deltas.
        TFN)rï   Úinverse_transpose_matrixÚtomatrix)rO   rÐ   rÿ   Úinverse_transposeÚmÚinvts         r4   Úadd_metric_dataz(_TensorDataLazyEvaluator.add_metric_data�  sœ   € ð" @DˆÔ(¨°°tÐ);Ñ<Ø ×9Ò9¸$Ñ?Ô?Ðð BSˆÔ(¨°¸Ð)=Ñ>ð �MŠM‰OŒOˆØ ×)Ò)Ñ+Ô+ˆØ@AÀDÁˆÔ(¨°°uÐ)<Ñ=Ø@DÀqÁˆÔ(¨°¸Ð)<Ñ=Ð=Ð=r3   c                óÚ   — ddl m}m} |                     ¦   «         }|                      ¦   «         }|dk    r | ||| ¦  «        d||z   f¦  «        } n | || |¦  «        ||f¦  «        } | S )Nrf   ©r'  r(  r   )ró   r'  r(  rÂ   )rÿ   rÐ   rs   r'  r(  ÚmdimÚddims          r4   Ú_flip_index_by_metricz._TensorDataLazyEvaluator._flip_index_by_metric«  s¬   € à;Ð;Ð;Ð;Ð;Ð;Ð;Ð;à�{Š{‰}Œ}ˆØ�yŠy‰{Œ{ˆà�!Š8ˆ8Ø$Ð$Ø�ØØñô ð �D˜‘H�ñô ˆDˆDð %Ð$Ø�ØØñô ð �d�ñô ˆDð ˆr3   c                ó‚   — |                       ¦   «                              ¦   «         }t                               |¦  «        S r_   )rT  Úinvrí   rE  ©ÚndarrayrV  s     r4   Úinverse_matrixz'_TensorDataLazyEvaluator.inverse_matrixÄ  s3   € à×ÒÑÔ×"Ò"Ñ$Ô$ˆÝ'×2Ò2°1Ñ5Ô5Ð5r3   c                óŒ   — |                       ¦   «                              ¦   «         j        }t                               |¦  «        S r_   )rT  r_  ÚTrí   rE  r`  s     r4   rS  z1_TensorDataLazyEvaluator.inverse_transpose_matrixÉ  s6   € à×ÒÑÔ×"Ò"Ñ$Ô$Ô&ˆÝ'×2Ò2°1Ñ5Ô5Ð5r3   Fc                ó  — t          |¦  «        D ]|\  }}|j        s)|s't                               | |j        j        |¦  «        } Œ5|j        s@|r>t                               | t                               |j        j        ¦  «        |¦  «        } Œ}| S )zé
        Utility function to correct the values inside the components data
        ndarray according to whether indices are covariant or contravariant.

        It uses the metric matrix to lower values of covariant indices.
        )ri   rk   rí   r]  rU   rÿ   rb  )rÿ   rK   rH   rI   ÚinverserX   r�   s          r4   r/  z8_TensorDataLazyEvaluator._correct_signature_from_indicesÎ  s›   € õ ! Ñ)Ô)ð 	ð 	‰GˆAˆtØ”:ð  gð Ý/×EÒEÀdÈDÔLbÔLgÐijÑkÔk��Ø”Zð  Gð Ý/×EÒEØÝ,×;Ò;¸DÔ<RÔ<WÑXÔXØñô �øð
 ˆr3   c                óx  — ddl m} | j                             ¦   «         }d„ | j        D ¦   «         }d„ |j        D ¦   «         }t          t          |¦  «        ¦  «        D ][}t          |t          |¦  «        ¦  «        D ];}||         ||         k    r'||         ||         c||<   ||<    ||||f¦  «        } nŒ<Œ\|S )Nrf   r	  c                ó   — g | ]
}|d          ‘ŒS r�   r2   rV   s     r4   rY   z<_TensorDataLazyEvaluator._sort_data_axes.<locals>.<listcomp>é  ó   € Ð+Ð+Ð+˜Q�A�a”DÐ+Ð+Ð+r3   c                ó   — g | ]
}|d          ‘ŒS r�   r2   rV   s     r4   rY   z<_TensorDataLazyEvaluator._sort_data_axes.<locals>.<listcomp>ê  ri  r3   )ró   r
  rÿ   ÚcopyrH   r»   rL   )ÚoldÚnewr
  Únew_dataÚold_freeÚnew_freerX   rÅ   s           r4   Ú_sort_data_axesz(_TensorDataLazyEvaluator._sort_data_axesã  sß   € à&Ð&Ð&Ð&Ð&Ð&à”8—=’=‘?”?ˆà+Ð+ #¤(Ð+Ñ+Ô+ˆØ+Ð+ #¤(Ð+Ñ+Ô+ˆå•s˜8‘}”}Ñ%Ô%ð 	ð 	ˆAÝ˜1�c (™mœmÑ,Ô,ð ð �Ø˜A”; (¨1¤+Ò-Ð-Ø/7¸¬{¸HÀQ¼KÐ,�H˜Q‘K ¨!¡Ø*˜{¨8°a¸°VÑ<Ô<�HØ�Eð .øð ˆr3   c                óD   ‡ ‡— ˆ ˆfd„} |¦   «         t           j        ‰ <   d S )Nc                 ó:   •— t                                ‰‰ ¦  «        S r_   )rí   rq  )Únew_tensmulÚold_tensmuls   €€r4   Úsorted_compozJ_TensorDataLazyEvaluator.add_rearrange_tensmul_parts.<locals>.sorted_compoö  s   ø€ Ý+×;Ò;¸KÈÑUÔUÐUr3   )rí   rî   )rt  ru  rv  s   `` r4   Úadd_rearrange_tensmul_partsz4_TensorDataLazyEvaluator.add_rearrange_tensmul_partsô  sF   øø€ ð	Vð 	Vð 	Vð 	Vð 	Vð 	Vð EQÀLÁNÄNÕ Ô4°[ÑAÐAÐAr3   c                óÌ   — ddl m} t          | |¦  «        sMt          | ¦  «        dk    r/t	          | d         d¦  «        r || d         | d         ¦  «        } n || ¦  «        } | S )aÆ  
        Transform ``data`` to array. The parameter ``data`` may
        contain data in various formats, e.g. nested lists, SymPy ``Matrix``,
        and so on.

        Examples
        ========

        >>> from sympy.tensor.tensor import _TensorDataLazyEvaluator
        >>> _TensorDataLazyEvaluator.parse_data([1, 3, -6, 12])
        [1, 3, -6, 12]

        >>> _TensorDataLazyEvaluator.parse_data([[1, 2], [4, 7]])
        [[1, 2], [4, 7]]
        rf   ©r)  r@   r   Ú__call__)ró   r)  rô   rL   Úhasattr)rÿ   r)  s     r4   rE  z#_TensorDataLazyEvaluator.parse_dataû  s{   € ð" 	1Ð0Ð0Ð0Ð0Ð0å˜$Ð 5Ñ6Ô6ð 	3Ý�4‰yŒy˜AŠ~ˆ~¥'¨$¨q¬'°:Ñ">Ô">ˆ~Ø,Ð,¨T°!¬W°d¸1´gÑ>Ô>��à,Ð,¨TÑ2Ô2�Øˆr3   NrØ   )rÚ   rÛ   rÜ   rÝ   rî   Ú__annotations__rï   rö   rò   rÞ   r  r2  rþ   r7  rC  rK  rO  rQ  rX  r]  rb  rS  r/  rq  rw  rE  r2   r3   r4   rí   rí      sÃ  € € € € € € ðð ð" +-ÐÐ,Ð,Ð,Ñ,Ø24ÐÐ4Ð4Ð4Ñ4ðð ð ðQð Qð Qðf ð0ð 0ñ „\ð0ðð ð ð ð ð ð"#ð #ð #ð)ð )ð )ð>-ð -ð -ð>*ð *ð *ð/ð /ð /ðIð Ið Ið< ðð ñ „\ðð0 ð6ð 6ñ „\ð6ð ð6ð 6ñ „\ð6ð ðð ð ñ „\ðð( ðð ñ „\ðð  ðSð Sñ „\ðSð ðð ñ „\ðð ð r3   rí   c                  óX   — e Zd ZdZd„ Zd„ Zed„ ¦   «         Zd„ Zd„ Z	d„ Z
d„ Zd	„ Zd
„ ZdS )Ú_TensorManagera  
    Class to manage tensor properties.

    Notes
    =====

    Tensors belong to tensor commutation groups; each group has a label
    ``comm``; there are predefined labels:

    ``0``   tensors commuting with any other tensor

    ``1``   tensors anticommuting among themselves

    ``2``   tensors not commuting, apart with those with ``comm=0``

    Other groups can be defined using ``set_comm``; tensors in those
    groups commute with those with ``comm=0``; by default they
    do not commute with any other group.
    c                ó.   — |                       ¦   «          d S r_   ©Ú
_comm_initru   s    r4   rQ   z_TensorManager.__init__,  s   € Ø�ŠÑÔÐÐÐr3   c                ó2  — d„ t          d¦  «        D ¦   «         | _        t          d¦  «        D ]"}d| j        d         |<   d| j        |         d<   Œ#d| j        d         d<   d | j        d         d<   d | j        d         d<   ddddœ| _        ddddœ| _        d S )Nc                ó   — g | ]}i ‘ŒS r2   r2   rV   s     r4   rY   z-_TensorManager._comm_init.<locals>.<listcomp>0  s   € Ð+Ð+Ð+˜Q�bÐ+Ð+Ð+r3   é   r   rf   r@   )r   rf   r@   )r»   Ú_commÚ_comm_symbols2iÚ_comm_i2symbol©rO   rX   s     r4   r�  z_TensorManager._comm_init/  s«   € Ø+Ð+¥%¨¡(¤(Ð+Ñ+Ô+ˆŒ
Ý�q‘”ð 	!ð 	!ˆAØ ˆDŒJ�qŒM˜!ÑØ ˆDŒJ�qŒM˜!ÑÐØˆŒ
�1Œ�aÑØˆŒ
�1Œ�aÑØˆŒ
�1Œ�aÑØ"# q¨A˜˜ˆÔØ!" a¨1˜o˜oˆÔÐÐr3   c                ó   — | j         S r_   )r…  ru   s    r4   râ   z_TensorManager.comm:  ó
   € àŒzÐr3   c                óö   — || j         vrdt          | j        ¦  «        }| j                             i ¦  «         d| j        |         d<   d| j        d         |<   || j         |<   || j        |<   |S | j         |         S )zØ
        Get the commutation group number corresponding to ``i``.

        ``i`` can be a symbol or a number or a string.

        If ``i`` is not already defined its commutation group number
        is set.
        r   )r†  rL   r…  rm   r‡  )rO   rX   rn   s      r4   Úcomm_symbols2iz_TensorManager.comm_symbols2i>  s‚   € ð �DÔ(Ð(Ð(Ý�D”J‘”ˆAØŒJ×Ò˜bÑ!Ô!Ð!Ø ˆDŒJ�qŒM˜!ÑØ ˆDŒJ�qŒM˜!ÑØ&'ˆDÔ  Ñ#Ø%&ˆDÔ Ñ"ØˆHØÔ# AÔ&Ð&r3   c                ó   — | j         |         S )zS
        Returns the symbol corresponding to the commutation group number.
        )r‡  rˆ  s     r4   Úcomm_i2symbolz_TensorManager.comm_i2symbolQ  s   € ð Ô" 1Ô%Ð%r3   c                ó¦  — |dvrt          d¦  «        ‚t          |¦  «        }t          |¦  «        }|| j        vrbt          | j        ¦  «        }| j                             i ¦  «         d| j        |         d<   d| j        d         |<   || j        |<   || j        |<   || j        vrbt          | j        ¦  «        }| j                             i ¦  «         d| j        d         |<   d| j        |         d<   || j        |<   || j        |<   | j        |         }| j        |         }|| j        |         |<   || j        |         |<   	 t          ¦   «          dS )a  
        Set the commutation parameter ``c`` for commutation groups ``i, j``.

        Parameters
        ==========

        i, j : symbols representing commutation groups

        c  :  group commutation number

        Notes
        =====

        ``i, j`` can be symbols, strings or numbers,
        apart from ``0, 1`` and ``2`` which are reserved respectively
        for commuting, anticommuting tensors and tensors not commuting
        with any other group apart with the commuting tensors.
        For the remaining cases, use this method to set the commutation rules;
        by default ``c=None``.

        The group commutation number ``c`` is assigned in correspondence
        to the group commutation symbols; it can be

        0        commuting

        1        anticommuting

        None     no commutation property

        Examples
        ========

        ``G`` and ``GH`` do not commute with themselves and commute with
        each other; A is commuting.

        >>> from sympy.tensor.tensor import TensorIndexType, tensor_indices, TensorHead, TensorManager, TensorSymmetry
        >>> Lorentz = TensorIndexType('Lorentz')
        >>> i0,i1,i2,i3,i4 = tensor_indices('i0:5', Lorentz)
        >>> A = TensorHead('A', [Lorentz])
        >>> G = TensorHead('G', [Lorentz], TensorSymmetry.no_symmetry(1), 'Gcomm')
        >>> GH = TensorHead('GH', [Lorentz], TensorSymmetry.no_symmetry(1), 'GHcomm')
        >>> TensorManager.set_comm('Gcomm', 'GHcomm', 0)
        >>> (GH(i1)*G(i0)).canon_bp()
        G(i0)*GH(i1)
        >>> (G(i1)*G(i0)).canon_bp()
        G(i1)*G(i0)
        >>> (G(i1)*A(i0)).canon_bp()
        A(i0)*G(i1)
        )r   rf   Nz+`c` can assume only the values 0, 1 or Noner   N)rl   r   r†  rL   r…  rm   r‡  r   )rO   rX   rÅ   Úcrn   ÚniÚnjs          r4   Úset_commz_TensorManager.set_commW  sY  € ðd �LÐ Ð ÝÐJÑKÔKÐKå�A‰JŒJˆÝ�A‰JŒJˆà�DÔ(Ð(Ð(Ý�D”J‘”ˆAØŒJ×Ò˜bÑ!Ô!Ð!Ø ˆDŒJ�qŒM˜!ÑØ ˆDŒJ�qŒM˜!ÑØ&'ˆDÔ  Ñ#Ø%&ˆDÔ Ñ"Ø�DÔ(Ð(Ð(Ý�D”J‘”ˆAØŒJ×Ò˜bÑ!Ô!Ð!Ø ˆDŒJ�qŒM˜!ÑØ ˆDŒJ�qŒM˜!ÑØ&'ˆDÔ  Ñ#Ø%&ˆDÔ Ñ"ØÔ! !Ô$ˆØÔ! !Ô$ˆØˆŒ
�2Œ�rÑØˆŒ
�2Œ�rÑð	õ 	‰Œˆˆˆr3   c                óF   — |D ]\  }}}|                       |||¦  «         ŒdS )z 
        Set the commutation group numbers ``c`` for symbols ``i, j``.

        Parameters
        ==========

        args : sequence of ``(i, j, c)``
        N)r“  )rO   r  rX   rÅ   r�  s        r4   Ú	set_commsz_TensorManager.set_commsª  s<   € ð ð 	#ð 	#‰GˆAˆq�!Ø�MŠM˜!˜Q Ñ"Ô"Ð"Ð"ð	#ð 	#r3   c                ó`   — | j         |                              ||dk    s|dk    rdnd¦  «        S )z‚
        Return the commutation parameter for commutation group numbers ``i, j``

        see ``_TensorManager.set_comm``
        r   N)r…  Úget)rO   rX   rÅ   s      r4   rä   z_TensorManager.get_comm¶  s4   € ð Œz˜!Œ}× Ò  ¨¨aª¨°1¸²6°6 A A¸tÑDÔDÐDr3   c                ó.   — |                       ¦   «          dS )z*
        Clear the TensorManager.
        Nr€  ru   s    r4   Úclearz_TensorManager.clear¾  s   € ð 	�ŠÑÔÐÐÐr3   N)rÚ   rÛ   rÜ   rÝ   rQ   r�  Úpropertyrâ   rŒ  rŽ  r“  r•  rä   r™  r2   r3   r4   r~  r~    s¸   € € € € € ðð ð&ð ð ð	.ð 	.ð 	.ð ðð ñ „Xðð'ð 'ð 'ð&&ð &ð &ðQð Qð Qðf
#ð 
#ð 
#ðEð Eð Eðð ð ð ð r3   r~  c                  ó†  — e Zd ZdZ	 	 dd„Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed	„ ¦   «         Z	e
d
„ ¦   «         Ze
d„ ¦   «         Ze
d„ ¦   «         Zd„ Zd„ Zd„ ZeZed„ ¦   «         Zej        d„ ¦   «         Zej        d„ ¦   «         Z eddd¬¦  «        d„ ¦   «         Z eddd¬¦  «        d„ ¦   «         Zd„ ZdS )r;  aH	  
    A TensorIndexType is characterized by its name and its metric.

    Parameters
    ==========

    name : name of the tensor type
    dummy_name : name of the head of dummy indices
    dim : dimension, it can be a symbol or an integer or ``None``
    eps_dim : dimension of the epsilon tensor
    metric_symmetry : integer that denotes metric symmetry or ``None`` for no metric
    metric_name : string with the name of the metric tensor

    Attributes
    ==========

    ``metric`` : the metric tensor
    ``delta`` : ``Kronecker delta``
    ``epsilon`` : the ``Levi-Civita epsilon`` tensor
    ``data`` : (deprecated) a property to add ``ndarray`` values, to work in a specified basis.

    Notes
    =====

    The possible values of the ``metric_symmetry`` parameter are:

        ``1``   :   metric tensor is fully symmetric
        ``0``   :   metric tensor possesses no index symmetry
        ``-1``  :   metric tensor is fully antisymmetric
        ``None``:   there is no metric tensor (metric equals to ``None``)

    The metric is assumed to be symmetric by default. It can also be set
    to a custom tensor by the ``.set_metric()`` method.

    If there is a metric the metric is used to raise and lower indices.

    In the case of non-symmetric metric, the following raising and
    lowering conventions will be adopted:

    ``psi(a) = g(a, b)*psi(-b); chi(-a) = chi(b)*g(-b, -a)``

    From these it is easy to find:

    ``g(-a, b) = delta(-a, b)``

    where ``delta(-a, b) = delta(b, -a)`` is the ``Kronecker delta``
    (see ``TensorIndex`` for the conventions on indices).
    For antisymmetric metrics there is also the following equality:

    ``g(a, -b) = -delta(a, -b)``

    If there is no metric it is not possible to raise or lower indices;
    e.g. the index of the defining representation of ``SU(N)``
    is 'covariant' and the conjugate representation is
    'contravariant'; for ``N > 2`` they are linearly independent.

    ``eps_dim`` is by default equal to ``dim``, if the latter is an integer;
    else it can be assigned (for use in naive dimensional regularization);
    if ``eps_dim`` is not an integer ``epsilon`` is ``None``.

    Examples
    ========

    >>> from sympy.tensor.tensor import TensorIndexType
    >>> Lorentz = TensorIndexType('Lorentz', dummy_name='L')
    >>> Lorentz.metric
    metric(Lorentz,Lorentz)
    Nrf   rÐ   c           	     ó²  — d|v r |d         }t          d|› d�dd¬¦  «         |}t          |t          ¦  «        rt          |¦  «        }|€t          |¦  «        d         }t          |t          ¦  «        rt          |¦  «        }|€t          d|j        z   ¦  «        }nt          |¦  «        }|€|}nt          |¦  «        }t          |¦  «        }t          |t          ¦  «        rt          |¦  «        }d	|v r>t          d
dd¬¦  «         |                     d	¦  «        }	|	�|	dv rd	}n|	j        }|	rd}nd}t          j	        | ||||||¦  «        }
g |
_
        |
S )NÚ	dummy_fmtzh
                The dummy_fmt keyword to TensorIndexType is deprecated. Use
                dummy_name=z instead.
                r7   z$deprecated-tensorindextype-dummy-fmt©r.   r/   r   Údim_rÐ   zà
                The 'metric' keyword argument to TensorIndexType is
                deprecated. Use the 'metric_symmetry' keyword argument or the
                TensorIndexType.set_metric() method instead.
                z!deprecated-tensorindextype-metric)TFr   rf   rà   rf   )r%   rô   r…   r   rj   r   r&   r—  r   Ú__new__Ú_autogenerated)Úclsrj   r†   rG  Úeps_dimÚmetric_symmetryÚmetric_nameÚkwargsr�  rÐ   Úobjs              r4   r   zTensorIndexType.__new__  s¹  € à˜&Ð Ð Ø˜{Ô+ˆIÝ%ðà%ðð ð ð */Ø+Qðñ ô ð ð #ˆJå�d�CÑ Ô ð 	 Ý˜$‘<”<ˆDàÐÝ˜T™œ 1œˆJÝ�j¥#Ñ&Ô&ð 	,Ý 
Ñ+Ô+ˆJàˆ;Ý˜ *¤/Ñ1Ñ2Ô2ˆCˆCå˜#‘,”,ˆCàˆ?ØˆGˆGå˜gÑ&Ô&ˆGå! /Ñ2Ô2ˆå�k¥3Ñ'Ô'ð 	.Ý  Ñ-Ô-ˆKà�vÐÐÝ#ðð
 */Ø+Nðñ ô ð ð —Z’Z Ñ)Ô)ˆFØÐ!ØÐ0Ð0Ð0Ø"*�K�Kð #)¤+�Kð ð (Ø&(�O�Oà&'�OåŒm˜C  z°3¸Ø+¨[ñ:ô :ˆð  ˆÔØˆ
r3   c                ó&   — | j         d         j        S rB   ©r  rj   ru   s    r4   rj   zTensorIndexType.nameQ  ó   € àŒy˜Œ|Ô Ð r3   c                ó&   — | j         d         j        S r›   r©  ru   s    r4   r†   zTensorIndexType.dummy_nameU  rª  r3   c                ó   — | j         d         S r·   ©r  ru   s    r4   rG  zTensorIndexType.dimY  ó   € àŒy˜Œ|Ðr3   c                ó   — | j         d         S ©Nr„  r­  ru   s    r4   r£  zTensorIndexType.eps_dim]  r®  r3   c                ó,  — | j         d         }| j         d         }|€d S |dk    rt                               d¦  «        }nA|dk    rt                               d¦  «        }n |dk    rt                               d¦  «        }t	          || gdz  |¦  «        S )Nr,   é   r   r@   rf   rà   rÌ   )r  rÎ   Úno_symmetryrÏ   r  )rO   r¤  r¥  rÍ   s       r4   rÐ   zTensorIndexType.metrica  s™   € àœ) Aœ,ˆØ”i ”lˆØÐ"Ø�4à˜aÒÐÝ%×1Ò1°!Ñ4Ô4ˆHˆHØ Ò!Ð!Ý%×5Ò5°aÑ8Ô8ˆHˆHØ Ò"Ð"Ý%×5Ò5°bÑ9Ô9ˆHå˜+¨ v¨a¡x°Ñ:Ô:Ð:r3   c                ó\   — t          d| gdz  t                               d¦  «        ¦  «        S )NÚKDr@   )r  rÎ   rÏ   ru   s    r4   ÚdeltazTensorIndexType.deltaq  s(   € å˜$   q¡­.×*HÒ*HÈÑ*KÔ*KÑLÔLÐLr3   c                ó¼   — t          | j        t          t          f¦  «        sd S t                               | j         ¦  «        }t          d| g| j        z  |¦  «        S )NÚEps)rô   r£  r#   r
   rÎ   rÏ   r  )rO   rÍ   s     r4   ÚepsilonzTensorIndexType.epsilonu  sR   € å˜$œ,­µWÐ(=Ñ>Ô>ð 	Ø�4Ý!×1Ò1°4´<°-Ñ@Ô@ˆÝ˜% $ ¨¬Ñ!4°hÑ?Ô?Ð?r3   c                ó   — || _         d S r_   )Ú_metric)rO   r4  s     r4   Ú
set_metriczTensorIndexType.set_metric|  s   € ØˆŒˆˆr3   c                ó"   — | j         |j         k     S r_   ©rj   ©rO   Úothers     r4   Ú__lt__zTensorIndexType.__lt__  s   € ØŒy˜5œ:Ò%Ð%r3   c                ó   — | j         S r_   r¾  ru   s    r4   r£   zTensorIndexType.__str__‚  s
   € ØŒyÐr3   c                ó”   — t          ¦   «          t          t          ¦  «        5  t          |          cd d d ¦  «         S # 1 swxY w Y   d S r_   ©r5   r'   r&   Ú_tensor_data_substitution_dictru   s    r4   rÿ   zTensorIndexType.data‰  ó‰   € åÑÔÐÝÕ4Ñ5Ô5ð 	8ð 	8Ý1°$Ô7ð	8ð 	8ð 	8ð 	8ñ 	8ô 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8øøøð 	8ð 	8ð 	8ð 	8ð 	8ð 	8ó   £=½AÁAc                ó.  — t          ¦   «          ddlm} t                               |¦  «        }|                     ¦   «         dk    rt          d¦  «        ‚|                     ¦   «         dk    rt| j        j        r'|j	        d         }|| j        k    rt          d¦  «        ‚|j	        d         }| 
                    ||¦  «        }t          |¦  «        D ]\  }}||||f<   Œ|}|j	        \  }}	||	k    rt          d¦  «        ‚| j        j        r| j        |k    rt          d¦  «        ‚|t          | <   t                               | j        |¦  «         t          t           ¦  «        5  |                      ¦   «         }
d d d ¦  «         n# 1 swxY w Y   t%          d| ¦  «        }t%          d	| ¦  «        }t          t           ¦  «        5  t                               t'          |¦  «        ¦  «         |
|| ¦  «        _        d d d ¦  «         d S # 1 swxY w Y   d S )
Nrf   ry  r@   z1data have to be of rank 1 (diagonal metric) or 2.r   zDimension mismatchzNon-square matrix tensor.Úi1Úi2)r5   ró   r)  rí   rE  rÂ   rl   rG  rH  rF  Úzerosri   rÅ  rX  rÐ   r'   r&   Úget_kronecker_deltary   r$   rÿ   )rO   rÿ   r)  Únda_dimrG  Ú
newndarrayrX   ÚvalÚdim1Údim2r¶  rÉ  rÊ  s                r4   rÿ   zTensorIndexType.data�  sœ  € åÑÔÐð 	1Ð0Ð0Ð0Ð0Ð0å'×2Ò2°4Ñ8Ô8ˆØ�9Š9‰;Œ;˜Š?ˆ?ÝÐPÑQÔQÐQØ�9Š9‰;Œ;˜!ÒÐØŒxÔ!ð ;Øœ* Qœ-�Ø˜dœhÒ&Ð&Ý$Ð%9Ñ:Ô:Ð:à”*˜Q”-ˆCØ.×4Ò4°S¸#Ñ>Ô>ˆJÝ# D™/œ/ð 'ð '‘��3Ø#&�
˜1˜a˜4Ñ Ð ØˆDØ”Z‰
ˆˆdØ�4Š<ˆ<ÝÐ8Ñ9Ô9Ð9ØŒ8Ôð 	7ØŒx˜4ÒÐÝ Ð!5Ñ6Ô6Ð6Ø/3Õ& tÑ,Ý&×6Ò6°t´{ÀDÑIÔIÐIÝÕ4Ñ5Ô5ð 	/ð 	/Ø×,Ò,Ñ.Ô.ˆEð	/ð 	/ð 	/ñ 	/ô 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/øøøð 	/ð 	/ð 	/ð 	/å˜˜tÑ$Ô$ˆÝ˜˜tÑ$Ô$ˆÝÕ4Ñ5Ô5ð 	Qð 	QÝ":×"EÒ"EÅcÈ$ÁiÄiÑ"PÔ"PˆEˆE�"�r�c‰NŒNÔð	Qð 	Qð 	Qñ 	Qô 	Qð 	Qð 	Qð 	Qð 	Qð 	Qð 	Qð 	Qøøøð 	Qð 	Qð 	Qð 	Qð 	Qð 	Qs$   Å%FÆF
ÆF
Ç8H
È
HÈHc                óÔ   — t          ¦   «          t          t          ¦  «        5  | t          v rt          | = | j        t          v rt          | j        = d d d ¦  «         d S # 1 swxY w Y   d S r_   ©r5   r'   r&   rÅ  rÐ   ru   s    r4   rÿ   zTensorIndexType.data´  óÁ   € åÑÔÐÝÕ4Ñ5Ô5ð 	@ð 	@ØÕ5Ð5Ð5Ý2°4Ð8ØŒ{Õ<Ð<Ð<Ý2°4´;Ð?ð		@ð 	@ð 	@ñ 	@ô 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@øøøð 	@ð 	@ð 	@ð 	@ð 	@ð 	@ó   £-AÁA!Á$A!zŠ
        The TensorIndexType.get_kronecker_delta() method is deprecated. Use
        the TensorIndexType.delta attribute instead.
        r7   z"deprecated-tensorindextype-methodsrž  c                óh   — t          t          d¦  «        ¦  «        }t          d| gdz  |¦  «        }|S )Nr@   rµ  )rÎ   r   r  )rO   Úsym2r¶  s      r4   rÌ  z#TensorIndexType.get_kronecker_delta½  s6   € õ Õ5°aÑ8Ô8Ñ9Ô9ˆÝ˜4 $ ¨¡¨4Ñ0Ô0ˆØˆr3   z„
        The TensorIndexType.get_epsilon() method is deprecated. Use
        the TensorIndexType.epsilon attribute instead.
        c                óÄ   — t          | j        t          t          f¦  «        sd S t	          t          | j        d¦  «        ¦  «        }t          d| g| j        z  |¦  «        }|S )Nrf   r¸  )rô   Ú_eps_dimr#   r
   rÎ   r   r  )rO   rÑ   r¹  s      r4   Úget_epsilonzTensorIndexType.get_epsilonÊ  s[   € õ ˜$œ-­*µgÐ)>Ñ?Ô?ð 	Ø�4ÝÕ4°T´]ÀAÑFÔFÑGÔGˆÝ˜U T F¨4¬=Ñ$8¸#Ñ>Ô>ˆØˆr3   c                ó  — | t           v rt           | = d„ } || j        ddf¦  «          || j        ddf¦  «          || j        ddf¦  «          || j        ddf¦  «         |                      ¦   «         }|t           v r
t           |= dS dS )zé
        EXPERIMENTAL: do not rely on this API method.

        This destroys components data associated to the ``TensorIndexType``, if
        any, specifically:

        * metric tensor data
        * Kronecker tensor data
        c                ó@   — | t           j        v rt           j        | = d S d S r_   )rÅ  rï   rF   s    r4   Údelete_tensmul_datazJTensorIndexType._components_data_full_destroy.<locals>.delete_tensmul_dataæ  s+   € ØÕ4ÔPÐPÐPÝ2ÔNÈsÐSÐSÐSð QÐPr3   TFN)rÅ  rÐ   rÌ  )rO   rÝ  r¶  s      r4   Ú_components_data_full_destroyz-TensorIndexType._components_data_full_destroyÙ  sÉ   € ð Õ1Ð1Ð1Ý.¨tÐ4ð	Tð 	Tð 	Tð
 	Ð˜Tœ[¨$°Ð5Ñ6Ô6Ð6ØÐ˜Tœ[¨$°Ð6Ñ7Ô7Ð7ØÐ˜Tœ[¨%°Ð6Ñ7Ô7Ð7ØÐ˜Tœ[¨%°Ð7Ñ8Ô8Ð8ð ×(Ò(Ñ*Ô*ˆØÕ2Ð2Ð2Ý.¨uÐ5Ð5Ð5ð 3Ð2r3   )NNNrf   rÐ   )rÚ   rÛ   rÜ   rÝ   r   rš  rj   r†   rG  r£  r(   rÐ   r¶  r¹  r¼  rÁ  r£   r¥   rÿ   ÚsetterÚdeleterr)   rÌ  rÚ  rÞ  r2   r3   r4   r;  r;  È  s   € € € € € ðCð CðJ ?CØ/7ðAð Að Að AðF ð!ð !ñ „Xð!ð ð!ð !ñ „Xð!ð ðð ñ „Xðð ðð ñ „Xðð ð;ð ;ñ Ôð;ð ðMð Mñ ÔðMð ð@ð @ñ Ôð@ðð ð ð&ð &ð &ðð ð ð €Hð ð8ð 8ñ „Xð8ð
 
„[ð"Qð "Qñ „[ð"QðH 
„\ð@ð @ñ „\ð@ð €Zð	ð "'Ø#Gðñ ô ðð ñô ðð
 €Zð	ð "'Ø#Gðñ ô ðð ñô ðð6ð 6ð 6ð 6ð 6r3   r;  c                  ón   — e Zd ZdZdd„Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zd„ Z	d„ Z
d	„ Zd
S )ry   aq  
    Represents a tensor index

    Parameters
    ==========

    name : name of the index, or ``True`` if you want it to be automatically assigned
    tensor_index_type : ``TensorIndexType`` of the index
    is_up :  flag for contravariant index (is_up=True by default)

    Attributes
    ==========

    ``name``
    ``tensor_index_type``
    ``is_up``

    Notes
    =====

    Tensor indices are contracted with the Einstein summation convention.

    An index can be in contravariant or in covariant form; in the latter
    case it is represented prepending a ``-`` to the index name. Adding
    ``-`` to a covariant (is_up=False) index makes it contravariant.

    Dummy indices have a name with head given by
    ``tensor_inde_type.dummy_name`` with underscore and a number.

    Similar to ``symbols`` multiple contravariant indices can be created
    at once using ``tensor_indices(s, typ)``, where ``s`` is a string
    of names.


    Examples
    ========

    >>> from sympy.tensor.tensor import TensorIndexType, TensorIndex, TensorHead, tensor_indices
    >>> Lorentz = TensorIndexType('Lorentz', dummy_name='L')
    >>> mu = TensorIndex('mu', Lorentz, is_up=False)
    >>> nu, rho = tensor_indices('nu, rho', Lorentz)
    >>> A = TensorHead('A', [Lorentz, Lorentz])
    >>> A(mu, nu)
    A(-mu, nu)
    >>> A(-mu, -rho)
    A(mu, -rho)
    >>> A(mu, -mu)
    A(-L_0, L_0)
    Tc                ó�  — t          |t          ¦  «        rt          |¦  «        }n|t          |t          ¦  «        r|}nd|du rQd                     t	          |j        ¦  «        ¦  «        }t          |¦  «        }|j                             |¦  «         nt          d¦  «        ‚t          |¦  «        }t          j
        | |||¦  «        S ©NTz_i{}úinvalid name©rô   r…   r   r¢   rL   r¡  rm   rl   r   r   r   )r¢  rj   rU   rk   Úname_symbols        r4   r   zTensorIndex.__new__(  sµ   € Ý�d�CÑ Ô ð 		-Ý  ™,œ,ˆKˆKÝ˜�fÑ%Ô%ð 	-ØˆKˆKØ�Tˆ\ˆ\Ø—=’=¥Ð%6Ô%EÑ!FÔ!FÑGÔGˆDÝ  ™,œ,ˆKØÔ,×3Ò3°KÑ@Ô@Ð@Ð@å˜^Ñ,Ô,Ð,å˜‘”ˆÝŒ}˜S +Ð/@À%ÑHÔHÐHr3   c                ó&   — | j         d         j        S rB   r©  ru   s    r4   rj   zTensorIndex.name7  rª  r3   c                ó   — | j         d         S r›   r­  ru   s    r4   rU   zTensorIndex.tensor_index_type;  r®  r3   c                ó   — | j         d         S r·   r­  ru   s    r4   rk   zTensorIndex.is_up?  r®  r3   c                ó,   — | j         }| j        sd|z  }|S )Nz-%s)rj   rk   )rO   Úss     r4   Ú_printzTensorIndex._printC  s!   € ØŒIˆØŒzð 	Ø˜‘	ˆAØˆr3   c                ó>   — | j         | j        f|j         |j        fk     S r_   )rU   rj   r¿  s     r4   rÁ  zTensorIndex.__lt__I  s&   € ØÔ'¨¬Ð3ØÔ(¨%¬*Ð5ò6ð 	7r3   c                óH   — t          | j        | j        | j         ¦  «        }|S r_   )ry   rj   rU   rk   ©rO   Út1s     r4   Ú__neg__zTensorIndex.__neg__M  s&   € Ý˜œ DÔ$:Ø”Z�ñ"ô "ˆàˆ	r3   N©T)rÚ   rÛ   rÜ   rÝ   r   rš  rj   rU   rk   rì  rÁ  rñ  r2   r3   r4   ry   ry   ö  sµ   € € € € € ð0ð 0ðbIð Ið Ið Ið ð!ð !ñ „Xð!ð ðð ñ „Xðð ðð ñ „Xððð ð ð7ð 7ð 7ðð ð ð ð r3   ry   c                óÚ   ‡— t          | t          ¦  «        rd„ t          | d¬¦  «        D ¦   «         }nt          d¦  «        ‚ˆfd„|D ¦   «         }t	          |¦  «        dk    r|d         S |S )a¥  
    Returns list of tensor indices given their names and their types.

    Parameters
    ==========

    s : string of comma separated names of indices

    typ : ``TensorIndexType`` of the indices

    Examples
    ========

    >>> from sympy.tensor.tensor import TensorIndexType, tensor_indices
    >>> Lorentz = TensorIndexType('Lorentz', dummy_name='L')
    >>> a, b, c, d = tensor_indices('a,b,c,d', Lorentz)
    c                ó   — g | ]	}|j         ‘Œ
S r2   r¾  rº   s     r4   rY   z"tensor_indices.<locals>.<listcomp>f  s   € Ð2Ð2Ð2˜ˆQŒVÐ2Ð2Ð2r3   T©Úseqúexpecting a stringc                ó0   •— g | ]}t          |‰¦  «        ‘ŒS r2   )ry   )rW   rX   rp   s     €r4   rY   z"tensor_indices.<locals>.<listcomp>j  s#   ø€ Ð-Ð-Ð- a�k˜!˜SÑ!Ô!Ð-Ð-Ð-r3   rf   r   ©rô   r…   r   rl   rL   )rë  rp   rÖ   Útilists    `  r4   Útensor_indicesrû  S  s�   ø€ õ$ �!•SÑÔð /Ø2Ð2�W Q¨DÐ1Ñ1Ô1Ð2Ñ2Ô2ˆˆåÐ-Ñ.Ô.Ð.à-Ð-Ð-Ð-¨1Ð-Ñ-Ô-€FÝ
ˆ6�{„{�aÒÐØ�aŒyÐØ€Mr3   c                  ó²   — e Zd ZdZd„ Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Ze	d„ ¦   «         Z
e	d„ ¦   «         Ze	d„ ¦   «         Ze	d	„ ¦   «         Zd
S )rÎ   aƒ  
    Monoterm symmetry of a tensor (i.e. any symmetric or anti-symmetric
    index permutation). For the relevant terminology see ``tensor_can.py``
    section of the combinatorics module.

    Parameters
    ==========

    bsgs : tuple ``(base, sgs)`` BSGS of the symmetry of the tensor

    Attributes
    ==========

    ``base`` : base of the BSGS
    ``generators`` : generators of the BSGS
    ``rank`` : rank of the tensor

    Notes
    =====

    A tensor can have an arbitrary monoterm symmetry provided by its BSGS.
    Multiterm symmetries, like the cyclic symmetry of the Riemann tensor
    (i.e., Bianchi identity), are not covered. See combinatorics module for
    information on how to generate BSGS for a general index permutation group.
    Simple symmetries can be generated using built-in methods.

    See Also
    ========

    sympy.combinatorics.tensor_can.get_symmetric_group_sgs

    Examples
    ========

    Define a symmetric tensor of rank 2

    >>> from sympy.tensor.tensor import TensorIndexType, TensorSymmetry, get_symmetric_group_sgs, TensorHead
    >>> Lorentz = TensorIndexType('Lorentz', dummy_name='L')
    >>> sym = TensorSymmetry(get_symmetric_group_sgs(2))
    >>> T = TensorHead('T', [Lorentz]*2, sym)

    Note, that the same can also be done using built-in TensorSymmetry methods

    >>> sym2 = TensorSymmetry.fully_symmetric(2)
    >>> sym == sym2
    True
    c                ó0  — t          |¦  «        dk    r|d         \  }}n(t          |¦  «        dk    r|\  }}nt          d¦  «        ‚t          |t          ¦  «        s	t          |Ž }t          |t          ¦  «        s	t          |Ž }t	          j        | ||fi |¤ŽS )Nrf   r   r@   z:bsgs required, either two separate parameters or one tuple)rL   Ú	TypeErrorrô   r   r   r   )r¢  r  Úkw_argsrå   ræ   s        r4   r   zTensorSymmetry.__new__   sž   € Ýˆt‰9Œ9˜Š>ˆ>Ø# AœwÑˆD�*�*Ý�‰YŒY˜!Š^ˆ^Ø#ÑˆD�*�*åÐXÑYÔYÐYå˜$¥Ñ&Ô&ð 	 Ý˜$�<ˆDÝ˜*¥eÑ,Ô,ð 	,Ý 
Ð+ˆJåŒ}˜S $¨
Ð>Ð>°gÐ>Ð>Ð>r3   c                ó   — | j         d         S rB   r­  ru   s    r4   rå   zTensorSymmetry.base¯  r®  r3   c                ó   — | j         d         S r›   r­  ru   s    r4   ræ   zTensorSymmetry.generators³  r®  r3   c                ó,   — | j         d         j        dz
  S )Nr   r@   )ræ   Úsizeru   s    r4   rÂ   zTensorSymmetry.rank·  s   € àŒ˜qÔ!Ô&¨Ñ*Ð*r3   c                ó®   — |dk    rt          |d¦  «        }n0|dk     rt          | d¦  «        }n|dk    rg t          d¦  «        gf}t          |¦  «        S )z‚
        Returns a fully symmetric (antisymmetric if ``rank``<0)
        TensorSymmetry object for ``abs(rank)`` indices.
        r   FTrf   )r   r   rÎ   )r¢  rÂ   Úbsgss      r4   rÏ   zTensorSymmetry.fully_symmetric»  sd   € ð �!Š8ˆ8Ý*¨4°Ñ7Ô7ˆDˆDØ�AŠXˆXÝ*¨D¨5°$Ñ7Ô7ˆDˆDØ�QŠYˆYØ� Q™œÐ(Ð)ˆDÝ˜dÑ#Ô#Ð#r3   c                óÒ   — g t          d¦  «        g}}|D ]C}|dk    rt          |d¦  «        }n|dk     rt          | d¦  «        }nŒ2t          ||g|¢R Ž \  }}ŒDt          ||¦  «        S )až  
        Returns a TensorSymmetry object that is being a direct product of
        fully (anti-)symmetric index permutation groups.

        Notes
        =====

        Some examples for different values of ``(*args)``:
        ``(1)``         vector, equivalent to ``TensorSymmetry.fully_symmetric(1)``
        ``(2)``         tensor with 2 symmetric indices, equivalent to ``.fully_symmetric(2)``
        ``(-2)``        tensor with 2 antisymmetric indices, equivalent to ``.fully_symmetric(-2)``
        ``(2, -2)``     tensor with the first 2 indices commuting and the last 2 anticommuting
        ``(1, 1, 1)``   tensor with 3 indices without any symmetry
        rf   r   FT)r   r   r   rÎ   )r¢  r  rå   Úsgsr  Úbsgs2s         r4   Údirect_productzTensorSymmetry.direct_productÉ  s‹   € ð  � Q™œÐ(ˆcˆØð 	?ð 	?ˆCØ�QŠwˆwÝ/°°UÑ;Ô;��Ø�q’�Ý/°°°dÑ;Ô;��àÝ+¨D°#Ð>¸Ð>Ð>Ð>‰IˆD�#�#å˜d CÑ(Ô(Ð(r3   c                ó*   — t          t          ¦  «        S )zD
        Returns a monotorem symmetry of the Riemann tensor
        )rÎ   r   )r¢  s    r4   ÚriemannzTensorSymmetry.riemannå  s   € õ
 �lÑ+Ô+Ð+r3   c                óD   — t          g t          |dz   ¦  «        g¦  «        S )zM
        TensorSymmetry object for ``rank`` indices with no symmetry
        rf   )rÎ   r   )r¢  rÂ   s     r4   r³  zTensorSymmetry.no_symmetryì  s#   € õ
 ˜b¥;¨t°A©vÑ#6Ô#6Ð"7Ñ8Ô8Ð8r3   N)rÚ   rÛ   rÜ   rÝ   r   rš  rå   ræ   rÂ   ÚclassmethodrÏ   r	  r  r³  r2   r3   r4   rÎ   rÎ   p  së   € € € € € ð.ð .ð^?ð ?ð ?ð ðð ñ „Xðð ðð ñ „Xðð ð+ð +ñ „Xð+ð ð$ð $ñ „[ð$ð ð)ð )ñ „[ð)ð6 ð,ð ,ñ „[ð,ð ð9ð 9ñ „[ð9ð 9ð 9r3   rÎ   zf
    The tensorsymmetry() function is deprecated. Use the TensorSymmetry
    constructor instead.
    r7   zdeprecated-tensorsymmetryrž  c                 óº  — ddl m} d„ }| s2t          t          ¦   «         t           |d¦  «        ¦  «        ¦  «        S t	          | ¦  «        dk    r+t          | d         d         |¦  «        rt          | ¦  «        S  || d         ¦  «        \  }}| dd…         D ]%} ||¦  «        \  }}t          ||||¦  «        \  }}Œ&t          t          ||¦  «        ¦  «        S )ay  
    Returns a ``TensorSymmetry`` object. This method is deprecated, use
    ``TensorSymmetry.direct_product()`` or ``.riemann()`` instead.

    Explanation
    ===========

    One can represent a tensor with any monoterm slot symmetry group
    using a BSGS.

    ``args`` can be a BSGS
    ``args[0]``    base
    ``args[1]``    sgs

    Usually tensors are in (direct products of) representations
    of the symmetric group;
    ``args`` can be a list of lists representing the shapes of Young tableaux

    Notes
    =====

    For instance:
    ``[[1]]``       vector
    ``[[1]*n]``     symmetric tensor of rank ``n``
    ``[[n]]``       antisymmetric tensor of rank ``n``
    ``[[2, 2]]``    monoterm slot symmetry of the Riemann tensor
    ``[[1],[1]]``   vector*vector
    ``[[2],[1],[1]`` (antisymmetric tensor)*vector*vector

    Notice that with the shape ``[2, 2]`` we associate only the monoterm
    symmetries of the Riemann tensor; this is an abuse of notation,
    since the shape ``[2, 2]`` corresponds usually to the irreducible
    representation characterized by the monoterm symmetries and by the
    cyclic symmetry.
    r   r   c                óü   — t          | ¦  «        dk    r| d         }t          |d¦  «        }nOt          d„ | D ¦   «         ¦  «        rt          | ¦  «        }t          |¦  «        }n| ddgk    rt          }nt          ‚|S )Nrf   r   c              3  ó"   K  — | ]
}|d k    V — ŒdS )rf   Nr2   rº   s     r4   r  z7tensorsymmetry.<locals>.tableau2bsgs.<locals>.<genexpr>(  s&   è è € Ð%Ð%˜a�1˜’6Ð%Ð%Ð%Ð%Ð%Ð%r3   r@   )rL   r   r  r   ÚNotImplementedError)rÖ   rn   r  s      r4   Útableau2bsgsz$tensorsymmetry.<locals>.tableau2bsgs"  sƒ   € Ýˆq‰6Œ6�QŠ;ˆ;à�!”ˆAÝ*¨1¨aÑ0Ô0ˆDˆDåÐ%Ð% 1Ð%Ñ%Ô%Ñ%Ô%ð *å˜‘F”F�Ý.¨qÑ1Ô1��Ø�q˜!�f’�Ý#��å)Ð)Øˆr3   rf   r@   N)Úsympy.combinatoricsr   rÎ   r   rL   rô   r   )r  r   r  rå   r  rÖ   ÚbasexÚsgsxs           r4   Útensorsymmetryr  ô  sù   € ðX 0Ð/Ð/Ð/Ð/Ð/ðð ð ð  ð >Ý�e™gœg¥u¨[¨[¸©^¬^Ñ'<Ô'<Ñ=Ô=Ð=å
ˆ4�y„y�A‚~€~�* T¨!¤W¨Q¤Z°Ñ=Ô=€~Ý˜dÑ#Ô#Ð#Ø�˜T !œWÑ%Ô%�I€Dˆ#Ø�!�"�"ŒXð @ð @ˆØ"�l 1‘o”o‰ˆˆtÝ'¨¨c°5¸$Ñ?Ô?‰	ˆˆcˆcÝ�%  cÑ*Ô*Ñ+Ô+Ð+r3   z5TensorType is deprecated. Use tensor_heads() instead.zdeprecated-tensortypec                  ól   — e Zd ZdZdZd„ Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Z	d„ Z
dd	„Zd
S )Ú
TensorTypeaa  
    Class of tensor types. Deprecated, use tensor_heads() instead.

    Parameters
    ==========

    index_types : list of ``TensorIndexType`` of the tensor indices
    symmetry : ``TensorSymmetry`` of the tensor

    Attributes
    ==========

    ``index_types``
    ``symmetry``
    ``types`` : list of ``TensorIndexType`` without repetitions
    Fc                óp   — |j         t          |¦  «        k    sJ ‚t          j        | t	          |Ž |fi |¤Ž}|S r_   )rÂ   rL   r   r   r   )r¢  rJ   rÍ   rÿ  r§  s        r4   r   zTensorType.__new__U  sB   € ØŒ}¥ KÑ 0Ô 0Ò0Ð0Ð0Ð0ÝŒm˜C¥¨Ð!4°hÐJÐJÀ'ÐJÐJˆØˆ
r3   c                ó   — | j         d         S rB   r­  ru   s    r4   rJ   zTensorType.index_typesZ  r®  r3   c                ó   — | j         d         S r›   r­  ru   s    r4   rÍ   zTensorType.symmetry^  r®  r3   c                óJ   — t          t          | j        ¦  «        d„ ¬¦  «        S )Nc                ó   — | j         S r_   r¾  rC   s    r4   rE   z"TensorType.types.<locals>.<lambda>d  s   € ¸1¼6€ r3   rF   )rŸ   ÚsetrJ   ru   s    r4   ÚtypeszTensorType.typesb  s$   € å•c˜$Ô*Ñ+Ô+Ð1AÐ1AÐBÑBÔBÐBr3   c                ó*   — dd„ | j         D ¦   «         z  S )NzTensorType(%s)c                ó,   — g | ]}t          |¦  «        ‘ŒS r2   ©r…   rº   s     r4   rY   z&TensorType.__str__.<locals>.<listcomp>g  s   € Ð#EÐ#EÐ#E¨q¥C¨¡F¤FÐ#EÐ#EÐ#Er3   )rJ   ru   s    r4   r£   zTensorType.__str__f  s   € ØÐ#EÐ#E°DÔ4DÐ#EÑ#EÔ#EÑFÐFr3   r   c                ó  ‡ ‡— t          |t          ¦  «        rd„ t          |d¬¦  «        D ¦   «         }nt          d¦  «        ‚t	          |¦  «        dk    r"t          |d         ‰ j        ‰ j        ‰¦  «        S ˆˆ fd„|D ¦   «         S )zæ
        Return a TensorHead object or a list of TensorHead objects.

        Parameters
        ==========

        s : name or string of names.

        comm : Commutation group.

        see ``_TensorManager.set_comm``
        c                ó   — g | ]	}|j         ‘Œ
S r2   r¾  rº   s     r4   rY   z'TensorType.__call__.<locals>.<listcomp>w  s   € Ð:Ð:Ð: �Q”VÐ:Ð:Ð:r3   Trõ  r÷  rf   r   c                óH   •— g | ]}t          |‰j        ‰j        ‰¦  «        ‘ŒS r2   )r  rJ   rÍ   )rW   rj   râ   rO   s     €€r4   rY   z'TensorType.__call__.<locals>.<listcomp>}  s-   ø€ Ð^Ð^Ð^ÐPT•J˜t TÔ%5°t´}ÀdÑKÔKÐ^Ð^Ð^r3   )rô   r…   r   rl   rL   r  rJ   rÍ   )rO   rë  râ   Únamess   ` ` r4   rz  zTensorType.__call__i  s“   øø€ õ �a�ÑÔð 	3Ø:Ð:¥W¨Q°DÐ%9Ñ%9Ô%9Ð:Ñ:Ô:ˆEˆEåÐ1Ñ2Ô2Ð2Ýˆu‰:Œ:˜Š?ˆ?Ý˜e Aœh¨Ô(8¸$¼-ÈÑNÔNÐNà^Ð^Ð^Ð^Ð^ÐX]Ð^Ñ^Ô^Ð^r3   Nr�   )rÚ   rÛ   rÜ   rÝ   Úis_commutativer   rš  rJ   rÍ   r  r£   rz  r2   r3   r4   r  r  =  s´   € € € € € ðð ð  €Nðð ð ð
 ðð ñ „Xðð ðð ñ „Xðð ðCð Cñ „XðCðGð Gð Gð_ð _ð _ð _ð _ð _r3   r  zN
    The tensorhead() function is deprecated. Use tensor_heads() instead.
    zdeprecated-tensorheadc                óà   — |€&d„ t          t          |¦  «        ¦  «        D ¦   «         }t          t          ¦  «        5  t	          |Ž }ddd¦  «         n# 1 swxY w Y   t          | |||¦  «        S )ao  
    Function generating tensorhead(s). This method is deprecated,
    use TensorHead constructor or tensor_heads() instead.

    Parameters
    ==========

    name : name or sequence of names (as in ``symbols``)

    typ :  index types

    sym :  same as ``*args`` in ``tensorsymmetry``

    comm : commutation group number
    see ``_TensorManager.set_comm``
    Nc                ó   — g | ]}d g‘ŒS ©rf   r2   rV   s     r4   rY   ztensorhead.<locals>.<listcomp>™  s   € Ð,Ð,Ð,�q�ˆsÐ,Ð,Ð,r3   )r»   rL   r'   r&   r  r  )rj   rp   rÑ   râ   s       r4   r1  r1  €  sª   € ð0 €{Ø,Ð,�E¥# c¡(¤(™OœOÐ,Ñ,Ô,ˆÝ	Õ0Ñ	1Ô	1ð #ð #Ý˜cÐ"ˆð#ð #ð #ñ #ô #ð #ð #ð #ð #ð #ð #øøøð #ð #ð #ð #å�d˜C  dÑ+Ô+Ð+s   ½
AÁAÁAc                  ó  — e Zd ZdZdZdd„Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Z	ed	„ ¦   «         Z
ed
„ ¦   «         Zd„ Zd„ Zd„ Zd„ Zd„ Zed„ ¦   «         Zej        d„ ¦   «         Zej        d„ ¦   «         Zd„ Zd„ ZdS )r  at  
    Tensor head of the tensor.

    Parameters
    ==========

    name : name of the tensor
    index_types : list of TensorIndexType
    symmetry : TensorSymmetry of the tensor
    comm : commutation group number

    Attributes
    ==========

    ``name``
    ``index_types``
    ``rank`` : total number of indices
    ``symmetry``
    ``comm`` : commutation group

    Notes
    =====

    Similar to ``symbols`` multiple TensorHeads can be created using
    ``tensorhead(s, typ, sym=None, comm=0)`` function, where ``s``
    is the string of names and ``sym`` is the monoterm tensor symmetry
    (see ``tensorsymmetry``).

    A ``TensorHead`` belongs to a commutation group, defined by a
    symbol on number ``comm`` (see ``_TensorManager.set_comm``);
    tensors in a commutation group have the same commutation properties;
    by default ``comm`` is ``0``, the group of the commuting tensors.

    Examples
    ========

    Define a fully antisymmetric tensor of rank 2:

    >>> from sympy.tensor.tensor import TensorIndexType, TensorHead, TensorSymmetry
    >>> Lorentz = TensorIndexType('Lorentz', dummy_name='L')
    >>> asym2 = TensorSymmetry.fully_symmetric(-2)
    >>> A = TensorHead('A', [Lorentz, Lorentz], asym2)

    Examples with ndarray values, the components data assigned to the
    ``TensorHead`` object are assumed to be in a fully-contravariant
    representation. In case it is necessary to assign components data which
    represents the values of a non-fully covariant tensor, see the other
    examples.

    >>> from sympy.tensor.tensor import tensor_indices
    >>> from sympy import diag
    >>> Lorentz = TensorIndexType('Lorentz', dummy_name='L')
    >>> i0, i1 = tensor_indices('i0:2', Lorentz)

    Specify a replacement dictionary to keep track of the arrays to use for
    replacements in the tensorial expression. The ``TensorIndexType`` is
    associated to the metric used for contractions (in fully covariant form):

    >>> repl = {Lorentz: diag(1, -1, -1, -1)}

    Let's see some examples of working with components with the electromagnetic
    tensor:

    >>> from sympy import symbols
    >>> Ex, Ey, Ez, Bx, By, Bz = symbols('E_x E_y E_z B_x B_y B_z')
    >>> c = symbols('c', positive=True)

    Let's define `F`, an antisymmetric tensor:

    >>> F = TensorHead('F', [Lorentz, Lorentz], asym2)

    Let's update the dictionary to contain the matrix to use in the
    replacements:

    >>> repl.update({F(-i0, -i1): [
    ... [0, Ex/c, Ey/c, Ez/c],
    ... [-Ex/c, 0, -Bz, By],
    ... [-Ey/c, Bz, 0, -Bx],
    ... [-Ez/c, -By, Bx, 0]]})

    Now it is possible to retrieve the contravariant form of the Electromagnetic
    tensor:

    >>> F(i0, i1).replace_with_arrays(repl, [i0, i1])
    [[0, -E_x/c, -E_y/c, -E_z/c], [E_x/c, 0, -B_z, B_y], [E_y/c, B_z, 0, -B_x], [E_z/c, -B_y, B_x, 0]]

    and the mixed contravariant-covariant form:

    >>> F(i0, -i1).replace_with_arrays(repl, [i0, -i1])
    [[0, E_x/c, E_y/c, E_z/c], [E_x/c, 0, B_z, -B_y], [E_y/c, -B_z, 0, B_x], [E_z/c, B_y, -B_x, 0]]

    Energy-momentum of a particle may be represented as:

    >>> from sympy import symbols
    >>> P = TensorHead('P', [Lorentz], TensorSymmetry.no_symmetry(1))
    >>> E, px, py, pz = symbols('E p_x p_y p_z', positive=True)
    >>> repl.update({P(i0): [E, px, py, pz]})

    The contravariant and covariant components are, respectively:

    >>> P(i0).replace_with_arrays(repl, [i0])
    [E, p_x, p_y, p_z]
    >>> P(-i0).replace_with_arrays(repl, [-i0])
    [E, -p_x, -p_y, -p_z]

    The contraction of a 1-index tensor by itself:

    >>> expr = P(i0)*P(-i0)
    >>> expr.replace_with_arrays(repl, [])
    E**2 - p_x**2 - p_y**2 - p_z**2
    FNr   c           	     ó~  — t          |t          ¦  «        rt          |¦  «        }n't          |t          ¦  «        r|}nt          d¦  «        ‚|€(t                               t          |¦  «        ¦  «        }n|j        t          |¦  «        k    sJ ‚t          j	        | |t          |Ž |t          |¦  «        ¦  «        }|S )Nrä  )rô   r…   r   rl   rÎ   r³  rL   rÂ   r   r   r   r   )r¢  rj   rJ   rÍ   râ   ræ  r§  s          r4   r   zTensorHead.__new__  s®   € Ý�d�CÑ Ô ð 	-Ý  ™,œ,ˆKˆKÝ˜�fÑ%Ô%ð 	-ØˆKˆKå˜^Ñ,Ô,Ð,àÐÝ%×1Ò1µ#°kÑ2BÔ2BÑCÔCˆHˆHà”=¥C¨Ñ$4Ô$4Ò4Ð4Ð4Ð4åŒm˜C ­e°[Ð.AÀ8ÍWÐUYÉ]Ì]Ñ[Ô[ˆØˆ
r3   c                ó&   — | j         d         j        S rB   r©  ru   s    r4   rj   zTensorHead.name!  rª  r3   c                ó6   — t          | j        d         ¦  «        S r›   ©r“   r  ru   s    r4   rJ   zTensorHead.index_types%  s   € å�D”I˜a”LÑ!Ô!Ð!r3   c                ó   — | j         d         S r·   r­  ru   s    r4   rÍ   zTensorHead.symmetry)  r®  r3   c                óL   — t                                | j        d         ¦  «        S r°  )rã   rŒ  r  ru   s    r4   râ   zTensorHead.comm-  s   € å×+Ò+¨D¬I°a¬LÑ9Ô9Ð9r3   c                ó*   — t          | j        ¦  «        S r_   )rL   rJ   ru   s    r4   rÂ   zTensorHead.rank1  s   € å�4Ô#Ñ$Ô$Ð$r3   c                ó>   — | j         | j        f|j         |j        fk     S r_   )rj   rJ   r¿  s     r4   rÁ  zTensorHead.__lt__5  s!   € Ø”	˜4Ô+Ð,°´
¸EÔ<MÐ/NÒNÐNr3   c                óP   — t                                | j        |j        ¦  «        }|S )z²
        Returns ``0`` if ``self`` and ``other`` commute, ``1`` if they anticommute.

        Returns ``None`` if ``self`` and ``other`` neither commute nor anticommute.
        )rã   rä   râ   )rO   rÀ  Úrs      r4   Úcommutes_withzTensorHead.commutes_with8  s"   € õ ×"Ò" 4¤9¨e¬jÑ9Ô9ˆØˆr3   c                ó`   — | j         ›dd                     d„ | j        D ¦   «         ¦  «        ›d�S )Nú(ú,c                ó,   — g | ]}t          |¦  «        ‘ŒS r2   r"  rº   s     r4   rY   z%TensorHead._print.<locals>.<listcomp>B  s   € Ð.PÐ.PÐ.P¸!­s°1©v¬vÐ.PÐ.PÐ.Pr3   ú))rj   ÚjoinrJ   ru   s    r4   rì  zTensorHead._printA  s7   € Øœ)˜)˜) S§X¢XÐ.PÐ.P¸tÔ?OÐ.PÑ.PÔ.PÑ%QÔ%QÐ%QÐ%QÐRÐRr3   c                ó&  — g }t          || j        ¦  «        D ]¾\  }}t          |t          ¦  «        r�|                     ¦   «                              dd¦  «        }|                     d¦  «        r.|                     t          |dd…         |d¬¦  «        ¦  «         Œ…|                     t          ||¦  «        ¦  «         Œ©|                     |¦  «         Œ¿||t          |¦  «        d…         z  }t          | |fi |¤Ž}|                     ¦   «         S )a�  
        Returns a tensor with indices.

        Explanation
        ===========

        There is a special behavior in case of indices denoted by ``True``,
        they are considered auto-matrix indices, their slots are automatically
        filled, and confer to the tensor the behavior of a matrix or vector
        upon multiplication with another tensor containing auto-matrix indices
        of the same ``TensorIndexType``. This means indices get summed over the
        same way as in matrix multiplication. For matrix behavior, define two
        auto-matrix indices, for vector behavior define just one.

        Indices can also be strings, in which case the attribute
        ``index_types`` is used to convert them to proper ``TensorIndex``.

        Examples
        ========

        >>> from sympy.tensor.tensor import TensorIndexType, tensor_indices, TensorSymmetry, TensorHead
        >>> Lorentz = TensorIndexType('Lorentz', dummy_name='L')
        >>> a, b = tensor_indices('a,b', Lorentz)
        >>> A = TensorHead('A', [Lorentz]*2, TensorSymmetry.no_symmetry(2))
        >>> t = A(a, -b)
        >>> t
        A(a, -b)

        ú Ú ú-rf   NFrù   )r  rJ   rô   r…   ÚstripÚreplaceÚ
startswithrm   ry   rL   rý   Údoit)rO   rK   rÿ  Úupdated_indicesrz   rp   r4  s          r4   rz  zTensorHead.__call__D  s&  € ð> ˆÝ˜G TÔ%5Ñ6Ô6ð 		,ð 		,‰HˆC�Ý˜#�sÑ#Ô#ð ,Ø—i’i‘k”k×)Ò)¨#¨rÑ2Ô2�Ø—>’> #Ñ&Ô&ð BØ#×*Ò*­;°s¸1¸2¸2´wÀØ16ð,8ñ ,8ô ,8ñ 9ô 9ð 9ð 9ð $×*Ò*­;°s¸CÑ+@Ô+@ÑAÔAÐAÐAà×&Ò& sÑ+Ô+Ð+Ð+à˜7¥3 Ñ#7Ô#7Ð#8Ð#8Ô9Ñ9ˆå˜˜oÐ9Ð9°Ð9Ð9ˆØ�{Š{‰}Œ}Ðr3   c           	     ó„  — t          ¦   «          t          t          ¦  «        5  | j        €t	          d¦  «        ‚ddlm}m} d„ | j        D ¦   «         }| j        }| 	                    ¦   «         }|D ]&} ||||¦  «        } ||d|f|dz   |dz   f¦  «        }Œ'||t          j        z  z  cd d d ¦  «         S # 1 swxY w Y   d S )NzNo power on abstract tensors.rf   rZ  c                ó   — g | ]	}|j         ‘Œ
S r2   )rÿ   ©rW   r�   s     r4   rY   z&TensorHead.__pow__.<locals>.<listcomp>|  s   € Ð8Ð8Ð8 !�q”vÐ8Ð8Ð8r3   r   r@   )r5   r'   r&   rÿ   rl   ró   r'  r(  rJ   rÂ   r   ÚHalf)rO   rÀ  r'  r(  ÚmetricsÚmarrayÚ	marraydimrÐ   s           r4   Ú__pow__zTensorHead.__pow__v  s6  € ÝÑÔÐÝÕ4Ñ5Ô5ð 	.ð 	.ØŒyÐ Ý Ð!@ÑAÔAÐAØ?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ø8Ð8 tÔ'7Ð8Ñ8Ô8ˆGà”YˆFØŸš™œˆIØ!ð _ð _�Ø&˜ v¨v°vÑ>Ô>�Ø*Ð*¨6°A°y°>ÀIÈaÁKÐQZÐ[\ÑQ\ÐC]Ñ^Ô^��à˜e¥a¤f™nÑ-ð	.ð 	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.ð 	.ð 	.s   £BB5Â5B9Â<B9c                ó”   — t          ¦   «          t          t          ¦  «        5  t          |          cd d d ¦  «         S # 1 swxY w Y   d S r_   rÄ  ru   s    r4   rÿ   zTensorHead.data†  rÆ  rÇ  c                ó�   — t          ¦   «          t          t          ¦  «        5  |t          | <   d d d ¦  «         d S # 1 swxY w Y   d S r_   rÄ  ©rO   rÿ   s     r4   rÿ   zTensorHead.dataŒ  óŒ   € åÑÔÐÝÕ4Ñ5Ô5ð 	8ð 	8Ø37Õ*¨4Ñ0ð	8ð 	8ð 	8ñ 	8ô 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8øøøð 	8ð 	8ð 	8ð 	8ð 	8ð 	8ó   £;»?Á?c                óH   — t          ¦   «          | t          v r
t          | = d S d S r_   )r5   rÅ  ru   s    r4   rÿ   zTensorHead.data’  s0   € åÑÔÐØÕ1Ð1Ð1Ý.¨tÐ4Ð4Ð4ð 2Ð1r3   c                ó¬   — t          ¦   «          t          t          ¦  «        5  | j                             ¦   «         cd d d ¦  «         S # 1 swxY w Y   d S r_   ©r5   r'   r&   rÿ   Ú__iter__ru   s    r4   rV  zTensorHead.__iter__˜  ó’   € ÝÑÔÐÝÕ4Ñ5Ô5ð 	(ð 	(Ø”9×%Ò%Ñ'Ô'ð	(ð 	(ð 	(ð 	(ñ 	(ô 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(øøøð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ó   £A	Á	AÁAc                ób   — t          ¦   «          | j        dk    rdS | t          v r
t          | = dS dS )zÝ
        EXPERIMENTAL: do not rely on this API method.

        Destroy components data associated to the ``TensorHead`` object, this
        checks for attached components data, and destroys components data too.
        rµ  N)r5   rj   rÅ  ru   s    r4   rÞ  z(TensorHead._components_data_full_destroy�  sF   € õ 	ÑÔÐØŒ9˜ÒÐØˆFð
 Õ1Ð1Ð1Ý.¨tÐ4Ð4Ð4ð 2Ð1r3   rB   )rÚ   rÛ   rÜ   rÝ   r'  r   rš  rj   rJ   rÍ   râ   rÂ   rÁ  r6  rì  rz  rM  rÿ   rß  rà  rV  rÞ  r2   r3   r4   r  r  Ÿ  sˆ  € € € € € ðnð nð^ €Nðð ð ð ð  ð!ð !ñ „Xð!ð ð"ð "ñ „Xð"ð ðð ñ „Xðð ð:ð :ñ „Xð:ð ð%ð %ñ „Xð%ðOð Oð Oðð ð ðSð Sð Sð.ð .ð .ðd.ð .ð .ð  ð8ð 8ñ „Xð8ð
 
„[ð8ð 8ñ „[ð8ð
 
„\ð5ð 5ñ „\ð5ð
(ð (ð (ð
5ð 5ð 5ð 5ð 5r3   r  c                óâ   ‡‡‡— t          | t          ¦  «        rd„ t          | d¬¦  «        D ¦   «         }nt          d¦  «        ‚ˆˆˆfd„|D ¦   «         }t	          |¦  «        dk    r|d         S |S )z=
    Returns a sequence of TensorHeads from a string `s`
    c                ó   — g | ]	}|j         ‘Œ
S r2   r¾  rº   s     r4   rY   z tensor_heads.<locals>.<listcomp>¶  s   € Ð6Ð6Ð6˜A�”Ð6Ð6Ð6r3   Trõ  r÷  c                ó4   •— g | ]}t          |‰‰‰¦  «        ‘ŒS r2   )r  )rW   rj   râ   rJ   rÍ   s     €€€r4   rY   z tensor_heads.<locals>.<listcomp>º  s'   ø€ ÐNÐNÐNÀ�j˜˜{¨H°dÑ;Ô;ÐNÐNÐNr3   rf   r   rù  )rë  rJ   rÍ   râ   r&  Úthlists    ```  r4   Útensor_headsr^  ±  s‰   øøø€ õ �!•SÑÔð /Ø6Ð6¥¨°Ð!5Ñ!5Ô!5Ð6Ñ6Ô6ˆˆåÐ-Ñ.Ô.Ð.àNÐNÐNÐNÐNÐNÈÐNÑNÔN€FÝ
ˆ6�{„{�aÒÐØ�aŒyÐØ€Mr3   c                  ó²  — e Zd ZdZdZdZd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zeed„ ¦   «         ¦   «         Zeed„ ¦   «         ¦   «         Zed„ ¦   «         Zed)d„¦   «         Zed*d„¦   «         Zd„ Zd„ Zed„ ¦   «         Zd„ Zd„ Zd„ Zed„ ¦   «         Z ed „ ¦   «         Z!ed!„ ¦   «         Z"ed"„ ¦   «         Z#ed#„ ¦   «         Z$d+d%„Z%d&„ Z&d'„ Z'd,d(„Z(d$S )-rü   aÜ  
    Abstract base class for tensor expressions

    Notes
    =====

    A tensor expression is an expression formed by tensors;
    currently the sums of tensors are distributed.

    A ``TensExpr`` can be a ``TensAdd`` or a ``TensMul``.

    ``TensMul`` objects are formed by products of component tensors,
    and include a coefficient, which is a SymPy expression.


    In the internal representation contracted indices are represented
    by ``(ipos1, ipos2, icomp1, icomp2)``, where ``icomp1`` is the position
    of the component tensor with contravariant index, ``ipos1`` is the
    slot which the index occupies in that component tensor.

    Contracted indices are therefore nameless in the internal representation.
    g      (@Fc                ó    — | t           j        z  S r_   )r   ÚNegativeOneru   s    r4   rñ  zTensExpr.__neg__Û  s   € Ø•A”MÑ!Ð!r3   c                ó   — t           ‚r_   ©r  ru   s    r4   Ú__abs__zTensExpr.__abs__Þ  ó   € Ý!Ð!r3   c                óJ   — t          | |¦  «                             d¬¦  «        S ©NF©Údeep©r  rD  r¿  s     r4   Ú__add__zTensExpr.__add__á  s#   € Ý�t˜UÑ#Ô#×(Ò(¨eÐ(Ñ4Ô4Ð4r3   c                óJ   — t          || ¦  «                             d¬¦  «        S rg  rj  r¿  s     r4   Ú__radd__zTensExpr.__radd__ä  ó#   € Ý�u˜dÑ#Ô#×(Ò(¨eÐ(Ñ4Ô4Ð4r3   c                óL   — t          | | ¦  «                             d¬¦  «        S rg  rj  r¿  s     r4   Ú__sub__zTensExpr.__sub__ç  s%   € Ý�t˜e˜VÑ$Ô$×)Ò)¨uÐ)Ñ5Ô5Ð5r3   c                óL   — t          ||  ¦  «                             d¬¦  «        S rg  rj  r¿  s     r4   Ú__rsub__zTensExpr.__rsub__ê  s%   € Ý�u˜t˜eÑ$Ô$×)Ò)¨uÐ)Ñ5Ô5Ð5r3   c                óJ   — t          | |¦  «                             d¬¦  «        S )a©  
        Multiply two tensors using Einstein summation convention.

        Explanation
        ===========

        If the two tensors have an index in common, one contravariant
        and the other covariant, in their product the indices are summed

        Examples
        ========

        >>> from sympy.tensor.tensor import TensorIndexType, tensor_indices, tensor_heads
        >>> Lorentz = TensorIndexType('Lorentz', dummy_name='L')
        >>> m0, m1, m2 = tensor_indices('m0,m1,m2', Lorentz)
        >>> g = Lorentz.metric
        >>> p, q = tensor_heads('p,q', [Lorentz])
        >>> t1 = p(m0)
        >>> t2 = q(-m0)
        >>> t1*t2
        p(L_0)*q(-L_0)
        Frh  ©r  rD  r¿  s     r4   Ú__mul__zTensExpr.__mul__í  s%   € õ. �t˜UÑ#Ô#×(Ò(¨eÐ(Ñ4Ô4Ð4r3   c                óJ   — t          || ¦  «                             d¬¦  «        S rg  rt  r¿  s     r4   Ú__rmul__zTensExpr.__rmul__  rn  r3   c                óÊ   — t          |¦  «        }t          |t          ¦  «        rt          d¦  «        ‚t	          | t
          j        |z  ¦  «                             d¬¦  «        S )Núcannot divide by a tensorFrh  )r!   rô   rü   rl   r  r   ÚOnerD  r¿  s     r4   Ú__truediv__zTensExpr.__truediv__	  sU   € Ý˜‘”ˆÝ�e�XÑ&Ô&ð 	:ÝÐ8Ñ9Ô9Ð9Ý�t�QœU 5™[Ñ)Ô)×.Ò.°EÐ.Ñ:Ô:Ð:r3   c                ó    — t          d¦  «        ‚)Nry  )rl   r¿  s     r4   Ú__rtruediv__zTensExpr.__rtruediv__  s   € ÝÐ4Ñ5Ô5Ð5r3   c           	     óŒ  — t          ¦   «          t          t          ¦  «        5  | j        €t	          d¦  «        ‚ddlm}m} | j        }| j        }| 	                    ¦   «         }|D ]4} | |||d         j
        j        |¦  «        d|f|dz   |dz   f¦  «        }Œ5||t          j        z  z  cd d d ¦  «         S # 1 swxY w Y   d S )NzNo power without ndarray data.rf   rZ  r   r@   )r5   r'   r&   rÿ   rl   ró   r'  r(  rH   rÂ   rU   r   rI  )rO   rÀ  r'  r(  rH   rK  r[  rÐ   s           r4   rM  zTensExpr.__pow__  s8  € ÝÑÔÐÝÕ4Ñ5Ô5ð 	.ð 	.ØŒyÐ Ý Ð!AÑBÔBÐBØ?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ø”9ˆDØ”YˆFØ—;’;‘=”=ˆDØð ð �Ø*Ð*Ø!�MØØ˜1”IÔ/Ô4Øñô ð ˜�I  Q¡¨¨Q©Ð/ñô ��ð ˜e¥a¤f™nÑ-ð	.ð 	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.ð 	.ð 	.s   £B	B9Â9B=Ã B=c                ó   — t           ‚r_   rc  r¿  s     r4   Ú__rpow__zTensExpr.__rpow__%  re  r3   c                ó    — t          d¦  «        ‚©Nzabstract methodrc  ru   s    r4   ÚnocoeffzTensExpr.nocoeff(  ó   € õ "Ð"3Ñ4Ô4Ð4r3   c                ó    — t          d¦  «        ‚r‚  rc  ru   s    r4   r!  zTensExpr.coeff-  r„  r3   c                ó    — t          d¦  «        ‚r‚  rc  ru   s    r4   rv   zTensExpr.get_indices2  ó   € å!Ð"3Ñ4Ô4Ð4r3   r—   r˜   c                ó    — t          d¦  «        ‚r‚  rc  ru   s    r4   r    zTensExpr.get_free_indices6  r‡  r3   Úreplúdict[TensorIndex, TensorIndex]c                ó    — t          d¦  «        ‚r‚  rc  ©rO   r‰  s     r4   Ú_replace_indiceszTensExpr._replace_indices:  r‡  r3   c                ó2   — t          ¦   «           | j        |Ž S r_   )r9   Úsubstitute_indices)rO   Úindex_tupless     r4   Úfun_evalzTensExpr.fun_eval>  s   € ÝÑÔÐØ&ˆtÔ&¨Ð5Ð5r3   c                óf  — ddl m} t          ¦   «          t          t          ¦  «        5  d| j        cxk     rdk    rÛn nØ| j        j        d         }| j        dk    r| j        j        d         nd}| j        dk    rbg |z  }t          |¦  «        D ]L}| 	                    g ¦  «         t          |¦  «        D ]%}||          	                    | ||f         ¦  «         Œ&ŒMn#dg|z  }t          |¦  «        D ]}| |         ||<   Œ ||¦  «        cddd¦  «         S t          d¦  «        ‚# 1 swxY w Y   dS )z±
        DEPRECATED: do not use.

        Returns ndarray components data as a matrix, if components data are
        available and ndarray dimension does not exceed 2.
        r   )ÚMatrixr@   rf   Nz-missing multidimensional reduction to matrix.)Úsympy.matrices.denser“  r5   r'   r&   rÂ   rÿ   rF  r»   rm   r  )rO   r“  ÚrowsÚcolumnsÚmat_listrX   rÅ   s          r4   Ú
get_matrixzTensExpr.get_matrixB  sÍ  € ð 	0Ð/Ð/Ð/Ð/Ð/ÝÑÔÐÝÕ4Ñ5Ô5ð 	Eð 	EØ�4”9Ð!Ð!Ò!Ð! Ò!Ð!Ð!Ð!Ð!Ø”y” qÔ)�Ø04´	¸Q²°˜$œ)œ/¨!Ô,Ð,ÀA�Ø”9 ’>�>Ø! D™y�HÝ" 4™[œ[ð ;ð ;˜Ø Ÿš¨Ñ+Ô+Ð+Ý!& w¡¤ð ;ð ;˜AØ$ QœK×.Ò.¨t°A°q°D¬zÑ:Ô:Ð:Ð:ð;ð;ð
 !%˜v¨™}�HÝ" 4™[œ[ð .ð .˜Ø&*¨1¤g˜ ™˜Ø�v˜hÑ'Ô'ð	Eð 	Eð 	Eð 	Eñ 	Eô 	Eð 	Eð 	Eõ  *ØCñEô Eð Eð!	Eð 	Eð 	Eð 	Eøøøð 	Eð 	Eð 	Eð 	Eð 	Eð 	Es   ©C!D&ÄD&Ä&D*Ä-D*c                ó    ‡ — ˆ fd„|D ¦   «         S )Nc                ó:   •— g | ]}‰                      |¦  «        ‘ŒS r2   ©rh   )rW   rX   Úindices1s     €r4   rY   z5TensExpr._get_indices_permutation.<locals>.<listcomp>`  s%   ø€ Ð4Ð4Ð4 a�—’˜qÑ!Ô!Ð4Ð4Ð4r3   r2   )rœ  Úindices2s   ` r4   Ú_get_indices_permutationz!TensExpr._get_indices_permutation^  s   ø€ à4Ð4Ð4Ð4¨8Ð4Ñ4Ô4Ð4r3   c                ó®   — t          ¦   «         }| j        D ]>}t          |t          ¦  «        r'|                     |                     ¦   «         ¦  «         Œ?|S r_   )r  r  rô   rü   ÚupdateÚ_get_free_indices_set©rO   Úindsetr  s      r4   r¡  zTensExpr._get_free_indices_setb  sR   € Ý‘”ˆØ”9ð 	;ð 	;ˆCÝ˜#�xÑ(Ô(ð ;Ø—’˜c×7Ò7Ñ9Ô9Ñ:Ô:Ð:øØˆr3   c                ó®   — t          ¦   «         }| j        D ]>}t          |t          ¦  «        r'|                     |                     ¦   «         ¦  «         Œ?|S r_   )r  r  rô   rü   r   Ú_get_dummy_indices_setr¢  s      r4   r¥  zTensExpr._get_dummy_indices_seti  sR   € Ý‘”ˆØ”9ð 	<ð 	<ˆCÝ˜#�xÑ(Ô(ð <Ø—’˜c×8Ò8Ñ:Ô:Ñ;Ô;Ð;øØˆr3   c                ó®   — t          ¦   «         }| j        D ]>}t          |t          ¦  «        r'|                     |                     ¦   «         ¦  «         Œ?|S r_   )r  r  rô   rü   r   Ú_get_indices_setr¢  s      r4   r§  zTensExpr._get_indices_setp  sR   € Ý‘”ˆØ”9ð 	6ð 	6ˆCÝ˜#�xÑ(Ô(ð 6Ø—’˜c×2Ò2Ñ4Ô4Ñ5Ô5Ð5øØˆr3   c                óR   ‡‡— |                       ¦   «         Šˆˆfd„Š ‰| d¦  «        S )Nc              3  óî   •K  — t          | t          ¦  «        r| ‰v r| |fV — d S d S t          | t          t          f¦  «        r0t	          | j        ¦  «        D ]\  }} ‰|||fz   ¦  «        E d {V —† Œd S d S r_   ©rô   ry   r   rü   ri   r  )Úexprrs   Úpr  Ú	dummy_setÚrecursors       €€r4   r®  z1TensExpr._iterate_dummy_indices.<locals>.recursor{  s·   øè è € Ý˜$¥Ñ,Ô,ð 7Ø˜9Ð$Ð$Ø ˜+Ð%Ð%Ð%Ð%Ð%ð %Ð$å˜D¥5­(Ð"3Ñ4Ô4ð 7Ý'¨¬	Ñ2Ô2ð 7ð 7‘F�A�sØ'˜x¨¨S°!°©XÑ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6ð7ð 7ð7ð 7r3   r2   )r¥  )rO   r­  r®  s    @@r4   Ú_iterate_dummy_indiceszTensExpr._iterate_dummy_indicesw  sG   øø€ à×/Ò/Ñ1Ô1ˆ	ð	7ð 	7ð 	7ð 	7ð 	7ð 	7ð ˆx˜˜bÑ!Ô!Ð!r3   c                óR   ‡‡— |                       ¦   «         Šˆˆfd„Š ‰| d¦  «        S )Nc              3  óî   •K  — t          | t          ¦  «        r| ‰v r| |fV — d S d S t          | t          t          f¦  «        r0t	          | j        ¦  «        D ]\  }} ‰|||fz   ¦  «        E d {V —† Œd S d S r_   rª  )r«  rs   r¬  r  Úfree_setr®  s       €€r4   r®  z0TensExpr._iterate_free_indices.<locals>.recursor‰  s·   øè è € Ý˜$¥Ñ,Ô,ð 7Ø˜8Ð#Ð#Ø ˜+Ð%Ð%Ð%Ð%Ð%ð $Ð#å˜D¥5­(Ð"3Ñ4Ô4ð 7Ý'¨¬	Ñ2Ô2ð 7ð 7‘F�A�sØ'˜x¨¨S°!°©XÑ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6ð7ð 7ð7ð 7r3   r2   )r¡  )rO   r²  r®  s    @@r4   Ú_iterate_free_indiceszTensExpr._iterate_free_indices…  sG   øø€ à×-Ò-Ñ/Ô/ˆð	7ð 	7ð 	7ð 	7ð 	7ð 	7ð ˆx˜˜bÑ!Ô!Ð!r3   c                ó&   ‡— ˆfd„Š ‰| d¦  «        S )Nc              3  óâ   •K  — t          | t          ¦  «        r| |fV — d S t          | t          t          f¦  «        r0t	          | j        ¦  «        D ]\  }} ‰|||fz   ¦  «        E d {V —† Œd S d S r_   rª  )r«  rs   r¬  r  r®  s       €r4   r®  z+TensExpr._iterate_indices.<locals>.recursor•  s¤   øè è € Ý˜$¥Ñ,Ô,ð 7Ø˜S�kÐ!Ð!Ð!Ð!Ð!Ý˜D¥5­(Ð"3Ñ4Ô4ð 7Ý'¨¬	Ñ2Ô2ð 7ð 7‘F�A�sØ'˜x¨¨S°!°©XÑ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6ð7ð 7ð7ð 7r3   r2   r2   )rO   r®  s    @r4   Ú_iterate_indiceszTensExpr._iterate_indices“  s0   ø€ ð	7ð 	7ð 	7ð 	7ð 	7ð ˆx˜˜bÑ!Ô!Ð!r3   c                óÊ   — ddl m}m}m}  | || |¦  «        dd|z   f¦  «        }t	          t          |¦  «        ¦  «        }||         |d         c|d<   ||<    |||¦  «        S )Nrf   )r(  r'  r
  r@   r   )ró   r(  r'  r
  r“   r»   )rÐ   ró   rs   rG  r(  r'  r
  Úpermus           r4   Ú!_contract_and_permute_with_metricz*TensExpr._contract_and_permute_with_metricž  sŠ   € ð 	IÐHÐHÐHÐHÐHÐHÐHÐHÐHà!Ð! - -°¸Ñ">Ô">ÀÀAÀcÁEÀ
ÑKÔKˆÝ•U˜3‘Z”ZÑ Ô ˆØ$ Sœz¨5°¬8Ðˆˆa‰�%˜‘*Øˆ{˜5 %Ñ(Ô(Ð(r3   c           	     ó  — ddl m} d„ |D ¦   «         }g }g }|d d …         }t          |¦  «        D ]æ\  }	}
|
|v r|                     |
¦  «        }d ||<   Œ$|
 |v rS|                     |
 ¦  «        }d ||<   |
||<   |
j        r|                     |¦  «         Œf|                     |¦  «         Œ|||	         }|€t          d|›d|›�¦  «        ‚d ||	<   |
||	<   |
j        |j        z  r2|
j        r|                     |	¦  «         ŒÑ|                     |	¦  «         Œçt          t          |¦  «        t          |¦  «        z  ¦  «        t          |¦  «        k     rt          d|›d|›�¦  «        ‚|D ]i}||         }||vrt          d¦  «        ‚||         }t           
                    |¦  «        }t                               || |t          |¦  «        ¦  «        } Œj|D ]O}||         }||vrt          d¦  «        ‚||         }t                               || |t          |¦  «        ¦  «        } ŒP|r't                               ||¦  «        } || |¦  «        } t          | d¦  «        r |                      ¦   «         dk    r| d	         } || fS )
Nrf   r	  c                ó   — g | ]	}|j         ‘Œ
S r2   rT   rV   s     r4   rY   z=TensExpr._match_indices_with_other_tensor.<locals>.<listcomp>¬  s   € Ð?Ð?Ð?°˜Ô+Ð?Ð?Ð?r3   zincompatible indices: z and z!No metric provided to lower indexrÂ   r   r2   )ró   r
  ri   rh   rk   rm   rl   rL   r  rí   rb  rü   r¹  rž  r{  rÂ   )ró   Ú	free_ind1Ú	free_ind2Úreplacement_dictr
  Úindex_types1Úpos2upÚpos2downÚfree2remainingr|   Úindex1r}   Úindex2rs   Úindex_type_posrÐ   Úmetric_inverser¯   s                     r4   Ú _match_indices_with_other_tensorz)TensExpr._match_indices_with_other_tensor¨  sü  € à&Ð&Ð&Ð&Ð&Ð&à?Ð?°YÐ?Ñ?Ô?ˆð ˆØˆØ" 1 1 1œˆÝ% iÑ0Ô0ð 	.ð 	.‰LˆD�&Ø˜Ð'Ð'Ø%×+Ò+¨FÑ3Ô3�Ø'+�˜tÑ$ØØˆw˜.Ð(Ð(Ø%×+Ò+¨V¨GÑ4Ô4�Ø'+�˜tÑ$Ø"(�	˜$‘Ø”<ð *Ø—M’M $Ñ'Ô'Ð'Ð'à—O’O DÑ)Ô)Ð)Ð)à'¨Ô-�Ø�>Ý$˜*È)È)È)ÐU^ÐU^Ð%_Ñ`Ô`Ð`Ø'+�˜tÑ$Ø"(�	˜$‘Ø”< &¤,Ñ.ð .Ø”|ð .ØŸš dÑ+Ô+Ð+Ð+à Ÿš¨Ñ-Ô-Ð-øå�s�9‰~Œ~¥ I¡¤Ñ.Ñ/Ô/µ#°i±.´.Ò@Ð@Ý�*À)À)À)ÈYÈYÐWÑXÔXÐXð ð 	kð 	kˆCØ)¨#Ô.ˆNØÐ%5Ð5Ð5Ý Ð!DÑEÔEÐEØ% nÔ5ˆFÝ5×DÒDÀVÑLÔLˆNÝ×>Ò>¸~ÈuÐVYÕ[^Ð_hÑ[iÔ[iÑjÔjˆEˆEàð 	cð 	cˆCØ)¨#Ô.ˆNØÐ%5Ð5Ð5Ý Ð!DÑEÔEÐEØ% nÔ5ˆFÝ×>Ò>¸vÀuÈcÕSVÐW`ÑSaÔSaÑbÔbˆEˆEàð 	4Ý"×;Ò;¸IÀyÑQÔQˆKØ�K  {Ñ3Ô3ˆEå�5˜&Ñ!Ô!ð 	 e§j¢j¡l¤l°aÒ&7Ð&7Ø˜"”IˆEà˜%ÐÐr3   Nc           	     ó0  ‡
‡— ddl mŠ
 |pg }d„ |                      ¦   «         D ¦   «         }t          |¦  «        D ]>\  }}t	          |t
          t          f¦  «        r||v r||         ||<   Œ1||           ||<   Œ?ˆ
fd„|                     ¦   «         D ¦   «         }|                     ¦   «         D ]µ\  Š}t	          ‰t          ¦  «        rˆfd„t          d¦  «        D ¦   «         }nd„ ‰j
        D ¦   «         }t          |¦  «        |                     ¦   «         k    s,t          d„ t          ||j        ¦  «        D ¦   «         ¦  «        st!          d	‰›d
|›d|j        ›�¦  «        ‚Œ¶|                      |¦  «        \  }}|                      ||||¦  «        \  }	}|S )aA  
        Replace the tensorial expressions with arrays. The final array will
        correspond to the N-dimensional array with indices arranged according
        to ``indices``.

        Parameters
        ==========

        replacement_dict
            dictionary containing the replacement rules for tensors.
        indices
            the index order with respect to which the array is read. The
            original index order will be used if no value is passed.

        Examples
        ========

        >>> from sympy.tensor.tensor import TensorIndexType, tensor_indices
        >>> from sympy.tensor.tensor import TensorHead
        >>> from sympy import symbols, diag

        >>> L = TensorIndexType("L")
        >>> i, j = tensor_indices("i j", L)
        >>> A = TensorHead("A", [L])
        >>> A(i).replace_with_arrays({A(i): [1, 2]}, [i])
        [1, 2]

        Since 'indices' is optional, we can also call replace_with_arrays by
        this way if no specific index order is needed:

        >>> A(i).replace_with_arrays({A(i): [1, 2]})
        [1, 2]

        >>> expr = A(i)*A(j)
        >>> expr.replace_with_arrays({A(i): [1, 2]})
        [[1, 2], [2, 4]]

        For contractions, specify the metric of the ``TensorIndexType``, which
        in this case is ``L``, in its covariant form:

        >>> expr = A(i)*A(-i)
        >>> expr.replace_with_arrays({A(i): [1, 2], L: diag(1, -1)})
        -3

        Symmetrization of an array:

        >>> H = TensorHead("H", [L, L])
        >>> a, b, c, d = symbols("a b c d")
        >>> expr = H(i, j)/2 + H(j, i)/2
        >>> expr.replace_with_arrays({H(i, j): [[a, b], [c, d]]})
        [[a, b/2 + c/2], [b/2 + c/2, d]]

        Anti-symmetrization of an array:

        >>> expr = H(i, j)/2 - H(j, i)/2
        >>> repl = {H(i, j): [[a, b], [c, d]]}
        >>> expr.replace_with_arrays(repl)
        [[0, b/2 - c/2], [-b/2 + c/2, 0]]

        The same expression can be read as the transpose by inverting ``i`` and
        ``j``:

        >>> expr.replace_with_arrays(repl, [j, i])
        [[0, -b/2 + c/2], [b/2 - c/2, 0]]
        rf   ©ÚArrayc                óT   — i | ]%}|j         r|j        d          n|j        d           |“Œ&S r�   )rk   r  ©rW   Úks     r4   r  z0TensExpr.replace_with_arrays.<locals>.<dictcomp>,	  s3   € ÐZÐZÐZ¸Q˜aœgÐ5�”˜”�¨A¬F°1¬I¨:°qÐZÐZÐZr3   c                ó.   •— i | ]\  }}| ‰|¦  «        “ŒS r2   r2   )rW   r4  ró   rÊ  s      €r4   r  z0TensExpr.replace_with_arrays.<locals>.<dictcomp>4	  s'   ø€ Ð_Ð_Ð_±]°V¸U˜F E E¨%¡L¤LÐ_Ð_Ð_r3   c                ó   •— g | ]	}‰j         ‘Œ
S r2   ©rG  )rW   rX   r4  s     €r4   rY   z0TensExpr.replace_with_arrays.<locals>.<listcomp>9	  s   ø€ Ð!?Ð!?Ð!?° &¤*Ð!?Ð!?Ð!?r3   r@   c                ó   — g | ]	}|j         ‘Œ
S r2   rÐ  )rW   Ú
index_types     r4   rY   z0TensExpr.replace_with_arrays.<locals>.<listcomp>;	  s   € Ð!VÐ!VÐ!V°Z *¤.Ð!VÐ!VÐ!Vr3   c              3  ó:   K  — | ]\  }}|j         r||k    nd V — ŒdS )TN)rH  )rW   rÐ  rÑ  s      r4   r  z/TensExpr.replace_with_arrays.<locals>.<genexpr><	  sJ   è è € ð ?ð ?Ù-7¨T°4�”ð@)¸tÀtº|¸|Ø$(ð?ð ?ð ?ð ?ð ?ð ?r3   zshapes for tensor z expected to be z, replacement array shape is )ró   rÊ  r    ri   rô   r   r   Úitemsr;  r»   rJ   rL   rÂ   r  r  rF  rl   Ú_extract_datarÇ  )rO   r¾  rK   ÚremaprX   rh   ró   Úexpected_shapeÚret_indicesÚlast_indicesrÊ  r4  s             @@r4   Úreplace_with_arrayszTensExpr.replace_with_arraysç  sù  øø€ ðD 	!Ð Ð Ð Ð Ð à�-˜RˆØZÐZÀ$×BWÒBWÑBYÔBYÐZÑZÔZˆÝ! 'Ñ*Ô*ð 	0ð 	0‰HˆAˆuÝ˜%¥&­# Ñ/Ô/ð 0Ø˜E�>�>Ø!& u¤�G˜A‘J�Jà"'¨¨¤- �G˜A‘Jøà_Ð_Ð_Ð_ÐFV×F\ÒF\ÑF^ÔF^Ð_Ñ_Ô_Ðð .×3Ò3Ñ5Ô5ð 
	"ð 
	"‰MˆF�EÝ˜&¥/Ñ2Ô2ð WØ!?Ð!?Ð!?Ð!?µe¸A±h´hÐ!?Ñ!?Ô!?��à!VÐ!VÀ6ÔCUÐ!VÑ!VÔ!V�Ý�>Ñ"Ô" e§j¢j¡l¤lÒ2Ð2½3ð ?ð ?Ý;>¸~Ø”ñ<ô <ð?ñ ?ô ?ñ <ô <Ð2õ !�jØ7=°v°v¸~¸~¸~Ø”K�Kð"!ñ "ô "ð "ð 3ð "×/Ò/Ð0@ÑAÔAÑˆ�Uà"×CÒCÀEÈ7ÐT_ÐaqÑrÔrÑˆ�eØˆr3   c                ó€   ‡‡— ddl m} |                      ¦   «         Š| j        }ˆˆfd„|D ¦   «         }|r	 ||g|¢R Ž }|S )Nr   ©ÚSumc                óR   •— g | ]#\  }}‰|         d ‰|         j         j        dz
  f‘Œ$S rá   )rU   rG  )rW   rX   rÅ   Úindex_symbolsrK   s      €€r4   rY   z+TensExpr._check_add_Sum.<locals>.<listcomp>L	  sQ   ø€ ð Að Að AÙ48°A°qð ' qÔ)¨1Ø�AŒJÔ(Ô,¨QÑ.ð0ð Að Að Ar3   )Úsympy.concrete.summationsrÝ  rv   rI   )rO   r«  rß  rÝ  rI   Úsum_indicesrK   s     `   @r4   Ú_check_add_SumzTensExpr._check_add_SumH	  s‡   øø€ Ø1Ð1Ð1Ð1Ð1Ð1Ø×"Ò"Ñ$Ô$ˆØŒhˆðAð Að Að Að AØ<?ðAñ Aô Aˆàð 	+Ø�3�tÐ*˜kÐ*Ð*Ð*ˆDØˆr3   c                ó4   —  | j         d„ | j        D ¦   «         Ž S )Nc                ód   — g | ]-}t          |t          ¦  «        r|                     ¦   «         n|‘Œ.S r2   )rô   rü   Ú_expand_partial_derivative©rW   rÖ   s     r4   rY   z7TensExpr._expand_partial_derivative.<locals>.<listcomp>U	  sM   € ð (ð (ð (ð õ " !¥XÑ.Ô.ð6�A×0Ò0Ñ2Ô2Ð2Ø45ð(ð (ð (r3   ©Úfuncr  ru   s    r4   rå  z#TensExpr._expand_partial_derivativeR	  s5   € ð ˆtŒyð (ð (ð "œYð(ñ (ô (ð )ð 	)r3   c                ó‚  — |€i }n|                      ¦   «         }t          |t          ¦  «        s(t          |                      ¦   «         ¦  «        dk    rdS nFt          |                      ¦   «         ¦  «        t          |                     ¦   «         ¦  «        k    rdS t          | |z
  ¦  «        t          j        k    r|S dS )zE
        Matches assuming there are no wild objects in self.
        Nr   )	rk  rô   rü   rL   r    r  rP   r   ÚZero©rO   r«  Ú	repl_dictrl  s       r4   Ú_matches_simplezTensExpr._matches_simpleZ	  s¹   € ð ÐØˆIˆIà!ŸšÑ(Ô(ˆIå˜$¥Ñ)Ô)ð 	Ý�4×(Ò(Ñ*Ô*Ñ+Ô+¨aÒ/Ð/à�tð 0õ �×&Ò&Ñ(Ô(Ñ)Ô)­S°×1FÒ1FÑ1HÔ1HÑ-IÔ-IÒIÐIà�tå�D˜4‘KÑ Ô ¥A¤FÒ*Ð*ØÐà�4r3   rÙ   ©r‰  rŠ  r—   rü   r_   ©NF))rÚ   rÛ   rÜ   rÝ   Ú_op_priorityr'  rñ  rd  rk  rm  rp  rr  ru  rw  r{  r}  rM  r€  rš  r   rƒ  r!  rv   r    r�  r‘  r˜  rÞ   rž  r¡  r¥  r§  r¯  r³  r¶  r¹  rÇ  rÚ  râ  rå  rí  r2   r3   r4   rü   rü   À  s¿  € € € € € ðð ð. €LØ€Nð"ð "ð "ð"ð "ð "ð5ð 5ð 5ð5ð 5ð 5ð6ð 6ð 6ð6ð 6ð 6ð5ð 5ð 5ð25ð 5ð 5ð;ð ;ð ;ð6ð 6ð 6ð.ð .ð .ð&"ð "ð "ð Øð5ð 5ñ „^ñ „Xð5ð Øð5ð 5ñ „^ñ „Xð5ð ð5ð 5ñ „^ð5ð ð5ð 5ð 5ñ „^ð5ð ð5ð 5ð 5ñ „^ð5ð6ð 6ð 6ðEð Eð Eð8 ð5ð 5ñ „\ð5ðð ð ðð ð ðð ð ð ð"ð "ñ „Xð"ð ð"ð "ñ „Xð"ð ð"ð "ñ „Xð"ð ð)ð )ñ „\ð)ð ð< ð < ñ „\ð< ð|_ð _ð _ð _ðBð ð ð)ð )ð )ðð ð ð ð ð r3   rü   c                  óŒ  — e Zd ZdZd„ Zed„ ¦   «         Zed„ ¦   «         Zd'd„Zd(d„Z	e
d„ ¦   «         Ze
d„ ¦   «         Ze
d„ ¦   «         Zd)d„Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zed„ ¦   «         Zej        d„ ¦   «         Zej        d „ ¦   «         Zd!„ Z d"„ Z!d#„ Z"d*d&„Z#d$S )+r  að  
    Sum of tensors.

    Parameters
    ==========

    free_args : list of the free indices

    Attributes
    ==========

    ``args`` : tuple of addends
    ``rank`` : rank of the tensor
    ``free_args`` : list of the free indices in sorted order

    Examples
    ========

    >>> from sympy.tensor.tensor import TensorIndexType, tensor_heads, tensor_indices
    >>> Lorentz = TensorIndexType('Lorentz', dummy_name='L')
    >>> a, b = tensor_indices('a,b', Lorentz)
    >>> p, q = tensor_heads('p,q', [Lorentz])
    >>> t = p(a) + q(a); t
    p(a) + q(a)

    Examples with components data added to the tensor expression:

    >>> from sympy import symbols, diag
    >>> x, y, z, t = symbols("x y z t")
    >>> repl = {}
    >>> repl[Lorentz] = diag(1, -1, -1, -1)
    >>> repl[p(a)] = [1, 2, 3, 4]
    >>> repl[q(a)] = [x, y, z, t]

    The following are: 2**2 - 3**2 - 2**2 - 7**2 ==> -58

    >>> expr = p(a) + q(a)
    >>> expr.replace_with_arrays(repl, [a])
    [x + 1, y + 2, z + 3, t + 4]
    c                ó   — d„ |D ¦   «         }t                                |¦  «        }|                     t          ¬¦  «         |st          j        S t          |¦  «        dk    r|d         S t          j        | g|¢R i |¤ŽS )Nc                ó0   — g | ]}|¯t          |¦  «        ‘ŒS r2   )r!   rº   s     r4   rY   z#TensAdd.__new__.<locals>.<listcomp>œ	  s#   € Ð/Ð/Ð/ ¨QÐ/•˜‘”Ð/Ð/Ð/r3   rF   rf   r   )	r  Ú_tensAdd_flattenrN   r   r   rê  rL   r   r   )r¢  r  rÿ  s      r4   r   zTensAdd.__new__›	  s„   € Ø/Ð/ TÐ/Ñ/Ô/ˆÝ×'Ò'¨Ñ-Ô-ˆØ�	Š	Õ&ˆ	Ñ'Ô'Ð'Øð 	Ý”6ˆMÝˆt‰9Œ9˜Š>ˆ>Ø˜”7ˆNåŒ}˜SÐ3 4Ð3Ð3Ð3¨7Ð3Ð3Ð3r3   c                ó   — t           j        S r_   ©r   rz  ru   s    r4   r!  zTensAdd.coeff¦	  ó	   € åŒuˆr3   c                ó   — | S r_   r2   ru   s    r4   rƒ  zTensAdd.nocoeffª	  ó   € àˆr3   r—   r˜   c                ó   — | j         S r_   )Úfree_indicesru   s    r4   r    zTensAdd.get_free_indices®	  s   € ØÔ Ð r3   r‰  rŠ  rü   c                ó>   ‡— ˆfd„| j         D ¦   «         } | j        |Ž S )Nc                óh   •— g | ].}t          |t          ¦  «        r|                     ‰¦  «        n|‘Œ/S r2   ©rô   rü   r�  ©rW   r  r‰  s     €r4   rY   z,TensAdd._replace_indices.<locals>.<listcomp>²	  s=   ø€ ÐiÐiÐiÐX[µ¸CÅÑ1JÔ1JÐS�3×'Ò'¨Ñ-Ô-Ð-ÐPSÐiÐiÐir3   )r  rè  )rO   r‰  Únewargss    ` r4   r�  zTensAdd._replace_indices±	  s/   ø€ ØiÐiÐiÐiÐ_cÔ_hÐiÑiÔiˆØˆtŒy˜'Ð"Ð"r3   c                ój   — t          | j        d         t          ¦  «        r| j        d         j        S dS rB   )rô   r  rü   rÂ   ru   s    r4   rÂ   zTensAdd.rankµ	  s.   € å�d”i ”l¥HÑ-Ô-ð 	Ø”9˜Q”<Ô$Ð$à�1r3   c                ój   — t          | j        d         t          ¦  «        r| j        d         j        S g S rB   )rô   r  rü   r  ru   s    r4   r  zTensAdd.free_args¼	  s.   € å�d”i ”l¥HÑ-Ô-ð 	Ø”9˜Q”<Ô)Ð)àˆIr3   c                óœ   — t          | j        d         t          ¦  «        r| j        d                              ¦   «         S t	          ¦   «         S rB   )rô   r  rü   r    r  ru   s    r4   rû  zTensAdd.free_indicesÃ	  s;   € å�d”i ”l¥HÑ-Ô-ð 	Ø”9˜Q”<×0Ò0Ñ2Ô2Ð2å‘5”5ˆLr3   r   c                óú  ‡— ‰                      dd¦  «        }|rˆfd„| j        D ¦   «         }n| j        }d„ |D ¦   «         }t          |¦  «        dk    rt          j        S t          |¦  «        dk    r|d         S t
                               |¦  «         t
                               |¦  «        }d„ }|                     |¬¦  «         |st          j        S t          |¦  «        dk    r|d         S  | j	        |Ž }|S )	Nri  Tc                ó*   •— g | ]} |j         d i ‰¤Ž‘ŒS ©r2   ©rD  ©rW   r  Úhintss     €r4   rY   z TensAdd.doit.<locals>.<listcomp>Í	  ó+   ø€ Ð;Ð;Ð;¨#�H�C”HÐ%Ð%˜uÐ%Ð%Ð;Ð;Ð;r3   c                ó2   — g | ]}|t           j        k    ¯|‘ŒS r2   )r   rê  ©rW   r  s     r4   rY   z TensAdd.doit.<locals>.<listcomp>Ò	  s   € Ð5Ð5Ð5˜ s­a¬f¢} }� } } }r3   r   rf   c                óÆ   — t          | t          ¦  «        sg g g fS t          | d¦  «        r3t          | d¦  «        r#t          | ¦  «        }| j        |j        |j        fS g g g fS )NÚ_index_structurerb   )rô   rü   r{  Úget_index_structurerb   rH   rI   )rè   rD   s     r4   Úsort_keyzTensAdd.doit.<locals>.sort_keyà	  sp   € Ý˜a¥Ñ*Ô*ð "Ø˜2˜r�zÐ!Ý�qÐ,Ñ-Ô-ð 3µ'¸!¸\Ñ2JÔ2Jð 3Ý'¨Ñ*Ô*�Ø”| Q¤V¨Q¬UÐ2Ð2Ø�r˜2�:Ðr3   rF   )
r—  r  rL   r   rê  r  Ú_tensAdd_checkÚ_tensAdd_collect_termsrN   rè  )rO   r	  ri  r  r  r§  s    `    r4   rD  zTensAdd.doitÊ	  s  ø€ Ø�yŠy˜ Ñ&Ô&ˆØð 	Ø;Ð;Ð;Ð;°´Ð;Ñ;Ô;ˆDˆDà”9ˆDð 6Ð5˜tÐ5Ñ5Ô5ˆåˆt‰9Œ9˜Š>ˆ>Ý”6ˆMÝ�‰YŒY˜!Š^ˆ^Ø˜”7ˆNõ 	×Ò˜tÑ$Ô$Ð$õ ×-Ò-¨dÑ3Ô3ˆð	ð 	ð 	ð 	�	Š	�hˆ	ÑÔÐàð 	Ý”6ˆMåˆt‰9Œ9˜Š>ˆ>Ø˜”7ˆNàˆdŒi˜ÐˆØˆ
r3   c                óÞ   — g }| D ][}t          |t          t          f¦  «        r(|                     t	          |j        ¦  «        ¦  «         ŒF|                     |¦  «         Œ\d„ |D ¦   «         } | S )Nc                ó    — g | ]}|j         ¯	|‘ŒS r2   ©r!  rº   s     r4   rY   z,TensAdd._tensAdd_flatten.<locals>.<listcomp>û	  s   € Ð(Ð(Ð(�a ¤Ð(�Ð(Ð(Ð(r3   )rô   r   r  r`   r“   r  rm   )r  rÖ   rD   s      r4   rô  zTensAdd._tensAdd_flattenò	  st   € ð ˆØð 	ð 	ˆAÝ˜!�c¥7˜^Ñ,Ô,ð Ø—’�˜aœf™œÑ&Ô&Ð&Ð&à—’˜‘”��Ø(Ð(˜1Ð(Ñ(Ô(ˆØˆr3   c                ó´   ‡‡— dd„Š ‰| d         ¦  «        Šˆfd„| dd …         D ¦   «         }t          ˆfd	„|D ¦   «         ¦  «        st          d
¦  «        ‚d S )NrD   r   r—   úset[TensorIndex]c                óŠ   — t          | t          ¦  «        r!t          |                      ¦   «         ¦  «        S t          ¦   «         S r_   )rô   rü   r  r    rC   s    r4   Úget_indices_setz/TensAdd._tensAdd_check.<locals>.get_indices_set
  s7   € Ý˜!�XÑ&Ô&ð 1Ý˜1×-Ò-Ñ/Ô/Ñ0Ô0Ð0Ý‘5”5ˆLr3   r   c                ó&   •— g | ]} ‰|¦  «        ‘ŒS r2   r2   )rW   r  r  s     €r4   rY   z*TensAdd._tensAdd_check.<locals>.<listcomp>
  s#   ø€ ÐAÐAÐA°˜˜¨Ñ,Ô,ÐAÐAÐAr3   rf   c              3  ó$   •K  — | ]
}|‰k    V — Œd S r_   r2   )rW   rD   Úindices0s     €r4   r  z)TensAdd._tensAdd_check.<locals>.<genexpr>	
  s'   øè è € Ð7Ð7 Q�1˜’=Ð7Ð7Ð7Ð7Ð7Ð7r3   z&all tensors must have the same indices)rD   r   r—   r  )r  rl   )r  Úlist_indicesr  r  s     @@r4   r  zTensAdd._tensAdd_checkþ	  s�   øø€ ð	ð 	ð 	ð 	ð
 #�? 4¨¤7Ñ+Ô+ˆØAÐAÐAÐA¸¸Q¸R¸R¼ÐAÑAÔAˆÝÐ7Ð7Ð7Ð7¨,Ð7Ñ7Ô7Ñ7Ô7ð 	GÝÐEÑFÔFÐFð	Gð 	Gr3   c                óÊ  — t          t          ¦  «        }t          j        }t	          | d         t
          ¦  «        r(t          | d                              ¦   «         ¦  «        }nt          ¦   «         }| D ]—}t	          |t
          ¦  «        s'|t          ¦   «         k    rt          d¦  «        ‚||z  }Œ>|t          |                     ¦   «         ¦  «        k    rt          d¦  «        ‚||j	                  
                    |j        ¦  «         Œ˜d„ |                     ¦   «         D ¦   «         }t	          |t          ¦  «        rt          |j        ¦  «        |z   }n|dk    r|g|z   }|S )Nr   zwrong valencec                ó„   — g | ]=\  }}t          |Ž d k    ¯t          t          |Ž |¦  «                             d¬¦  «        ‘Œ>S )r   Frh  )r   r  rD  )rW   rè   r!  s      r4   rY   z2TensAdd._tensAdd_collect_terms.<locals>.<listcomp>"
  sM   € ÐtÐtÐtÁÀÀEÕcfÐhmÐcnÐrsÒcsÐcs•G�C ˜K¨Ñ+Ô+×0Ò0°eÐ0Ñ<Ô<ÐcsÐcsÐcsr3   )r	   r“   r   rê  rô   rü   r  r    rl   rƒ  rm   r!  rÔ  r   r  )r  Ú
terms_dictÚscalarsrû  r  Únew_argss         r4   r  zTensAdd._tensAdd_collect_terms
  sP  € õ !¥Ñ&Ô&ˆ
Ý”&ˆÝ�d˜1”g�xÑ(Ô(ð 	!Ý˜t Aœw×7Ò7Ñ9Ô9Ñ:Ô:ˆLˆLå™5œ5ˆLàð 
	6ð 
	6ˆCÝ˜c¥8Ñ,Ô,ð Ø¥3¡5¤5Ò(Ð(Ý$ _Ñ5Ô5Ð5Ø˜3‘�ØØ�s 3×#7Ò#7Ñ#9Ô#9Ñ:Ô:Ò:Ð:Ý  Ñ1Ô1Ð1ð �s”{Ô#×*Ò*¨3¬9Ñ5Ô5Ð5Ð5àtÐtÈZ×M]ÒM]ÑM_ÔM_ÐtÑtÔtˆÝ�g�sÑ#Ô#ð 	,Ý˜GœLÑ)Ô)¨HÑ4ˆHˆHØ˜Š\ˆ\Ø�y 8Ñ+ˆHØˆr3   c                ó|   ‡— g Š| j         D ]0}‰                     ˆfd„t          |¦  «        D ¦   «         ¦  «         Œ1‰S )Nc                ó   •— g | ]}|‰v¯|‘Œ	S r2   r2   )rW   rX   rK   s     €r4   rY   z'TensAdd.get_indices.<locals>.<listcomp>,
  s#   ø€ ÐLÐLÐL !¸1ÀGÐ;KÐ;K˜AÐ;KÐ;KÐ;Kr3   )r  r`   rv   )rO   r  rK   s     @r4   rv   zTensAdd.get_indices)
  sR   ø€ ØˆØ”9ð 	Nð 	NˆCØ�NŠNÐLÐLÐLÐL¥{°3Ñ'7Ô'7ÐLÑLÔLÑMÔMÐMÐMØˆr3   c                óL  ‡— t          ¦   «          | j        }t          |¦  «        }d„ |D ¦   «         d„ |D ¦   «         k    rt          d¦  «        ‚||k    r| S t          t	          ||¦  «        ¦  «        Šˆfd„| j        D ¦   «         }t          |Ž                      d¬¦  «        }|S )Nc                ó   — g | ]	}|j         ‘Œ
S r2   rT   rº   s     r4   rY   z$TensAdd.__call__.<locals>.<listcomp>4
  ó   € Ð1Ð1Ð1 AˆAÔÐ1Ð1Ð1r3   c                ó   — g | ]	}|j         ‘Œ
S r2   rT   rº   s     r4   rY   z$TensAdd.__call__.<locals>.<listcomp>4
  ó   € Ð5]Ð5]Ð5]Èa°aÔ6IÐ5]Ð5]Ð5]r3   úincompatible typesc                ó>   •— g | ]} |j          |j        ‰Ž j        Ž ‘ŒS r2   )rè  r�  r  )rW   rD   r�  s     €r4   rY   z$TensAdd.__call__.<locals>.<listcomp>9
  s0   ø€ ÐRÐRÐRÀ1ˆVˆQŒVÐ)�QÔ)¨<Ð8Ô=Ð>ÐRÐRÐRr3   Frh  )r<   r  r“   rl   r  r  r  rD  )rO   rK   r  rÖ   Úresr�  s        @r4   rz  zTensAdd.__call__0
  sº   ø€ ÝÑÔÐØ”Nˆ	Ý�w‘-”-ˆØ1Ð1¨Ð1Ñ1Ô1Ð5]Ð5]ÐS\Ð5]Ñ5]Ô5]Ò]Ð]ÝÐ1Ñ2Ô2Ð2Ø�iÒÐØˆKÝ�C 	¨7Ñ3Ô3Ñ4Ô4ˆØRÐRÐRÐRÈÌ	ÐRÑRÔRˆÝ�qˆk×Ò EÐÑ*Ô*ˆØˆ
r3   c                óÒ   — |                       ¦   «         }t          || j        ¦  «        r0d„ |j        D ¦   «         }t	          |Ž                      d¬¦  «        }|S t          |¦  «        S )zz
        Canonicalize using the Butler-Portugal algorithm for canonicalization
        under monoterm symmetries.
        c                ó,   — g | ]}t          |¦  «        ‘ŒS r2   ©rP   rº   s     r4   rY   z$TensAdd.canon_bp.<locals>.<listcomp>D
  s   € Ð3Ð3Ð3 A•H˜Q‘K”KÐ3Ð3Ð3r3   Frh  )Úexpandrô   rè  r  r  rD  rP   )rO   r«  r  r,  s       r4   rP   zTensAdd.canon_bp=
  se   € ð
 �{Š{‰}Œ}ˆÝ�d˜DœIÑ&Ô&ð 	"Ø3Ð3¨¬Ð3Ñ3Ô3ˆDÝ˜4�.×%Ò%¨5Ð%Ñ1Ô1ˆCØˆJå˜D‘>”>Ð!r3   c                ó,  — t          |¦  «        }t          |t          ¦  «        r)|j        dk    rt	          d„ | j        D ¦   «         ¦  «        S t          |t          ¦  «        r| j        |j        k    rdS t          |t          ¦  «        r.t          | j        ¦  «        t          |j        ¦  «        k    rdS dS | |z
  }t          |t          ¦  «        s|dk    S t          |t          ¦  «        r|j        dk    S t	          d„ |j        D ¦   «         ¦  «        S )Nr   c              3  ó,   K  — | ]}|j         d k    V — ŒdS ©r   Nr  rº   s     r4   r  z!TensAdd.equals.<locals>.<genexpr>M
  s(   è è € Ð7Ð7¨�q”w !’|Ð7Ð7Ð7Ð7Ð7Ð7r3   FTc              3  ó,   K  — | ]}|j         d k    V — ŒdS r3  r  rº   s     r4   r  z!TensAdd.equals.<locals>.<genexpr>]
  s(   è è € Ð8Ð8¨A˜1œ7 aš<Ð8Ð8Ð8Ð8Ð8Ð8r3   )
r!   rô   r  r!  r  r  rü   rÂ   r  r  )rO   rÀ  rè   s      r4   ÚequalszTensAdd.equalsJ
  s  € Ý˜‘”ˆÝ�e�WÑ%Ô%ð 	8¨%¬+¸Ò*:Ð*:ÝÐ7Ð7¨T¬YÐ7Ñ7Ô7Ñ7Ô7Ð7Ý�e�XÑ&Ô&ð 	ØŒy˜EœJÒ&Ð&Ø�uÝ�e�WÑ%Ô%ð 	Ý�4”9‰~Œ~¥ U¤Z¡¤Ò0Ð0Ø�uà�tØ�5‰LˆÝ˜!�XÑ&Ô&ð 	9Ø˜’6ˆMå˜!�WÑ%Ô%ð 9Ø”w !’|Ð#åÐ8Ð8°´Ð8Ñ8Ô8Ñ8Ô8Ð8r3   c                ó”   — t          ¦   «          t          t          ¦  «        5  | j        |         cd d d ¦  «         S # 1 swxY w Y   d S r_   ©r5   r'   r&   rÿ   ©rO   Úitems     r4   rö   zTensAdd.__getitem___
  óŠ   € ÝÑÔÐÝÕ4Ñ5Ô5ð 	#ð 	#Ø”9˜T”?ð	#ð 	#ð 	#ð 	#ñ 	#ô 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#øøøð 	#ð 	#ð 	#ð 	#ð 	#ð 	#rÇ  c                ó‚   ‡— ˆfd„| j         D ¦   «         }t          |Ž                      d¬¦  «        }t          |¦  «        S )Nc                óh   •— g | ].}t          |t          ¦  «        r|                     ‰¦  «        n|‘Œ/S r2   )rô   rü   Úcontract_delta)rW   rD   r¶  s     €r4   rY   z*TensAdd.contract_delta.<locals>.<listcomp>e
  s;   ø€ Ð]Ð]Ð]Èa­:°a½Ñ+BÔ+BÐI�× Ò  Ñ'Ô'Ð'ÈÐ]Ð]Ð]r3   Frh  ©r  r  rD  rP   )rO   r¶  r  rè   s    `  r4   r=  zTensAdd.contract_deltad
  sF   ø€ Ø]Ð]Ð]Ð]ÐSWÔS\Ð]Ñ]Ô]ˆÝ�TˆN×Ò UÐÑ+Ô+ˆÝ˜‰{Œ{Ðr3   c                ó‚   ‡— ˆfd„| j         D ¦   «         }t          |Ž                      d¬¦  «        }t          |¦  «        S )a1  
        Raise or lower indices with the metric ``g``.

        Parameters
        ==========

        g :  metric

        contract_all : if True, eliminate all ``g`` which are contracted

        Notes
        =====

        see the ``TensorIndexType`` docstring for the contraction conventions
        c                ó0   •— g | ]}t          |‰¦  «        ‘ŒS r2   ©Úcontract_metric)rW   rD   r½   s     €r4   rY   z+TensAdd.contract_metric.<locals>.<listcomp>z
  s#   ø€ Ð9Ð9Ð9¨!•  1Ñ%Ô%Ð9Ð9Ð9r3   Frh  r>  )rO   r½   r  rè   s    `  r4   rB  zTensAdd.contract_metrici
  sF   ø€ ð" :Ð9Ð9Ð9¨t¬yÐ9Ñ9Ô9ˆÝ�TˆN×Ò UÐÑ+Ô+ˆÝ˜‰{Œ{Ðr3   c                ó¼   — g }| j         D ]6}t          |t          ¦  «        r
 |j        |Ž }|                     |¦  «         Œ7t          |Ž                      d¬¦  «        S rg  )r  rô   rü   r�  rm   r  rD  ©rO   r�  r"  r  s       r4   r�  zTensAdd.substitute_indices~
  ój   € ØˆØ”9ð 	!ð 	!ˆCÝ˜#�xÑ(Ô(ð <Ø,�cÔ,¨lÐ;�Ø�OŠO˜CÑ Ô Ð Ð Ý˜Ð!×&Ò&¨EÐ&Ñ2Ô2Ð2r3   c                ó¼   — g }| j         }|D ]$}|                     t          |¦  «        ¦  «         Œ%d                     |¦  «        }|                     dd¦  «        }|S )Nz + z+ -z- )r  rm   r…   r<  rB  )rO   rÖ   r  rD   rë  s        r4   rì  zTensAdd._print†
  s_   € ØˆØŒyˆØð 	ð 	ˆAØ�HŠH•S˜‘V”VÑÔÐÐØ�JŠJ�q‰MŒMˆØ�IŠI�e˜TÑ"Ô"ˆØˆr3   c                ón  ‡‡
— ddl mŠ
m} t          ˆfd„| j        D ¦   «         Ž \  }}ˆ
fd„|D ¦   «         }|d         }t          dt          |¦  «        ¦  «        D ]<}||         }||         }t                               ||¦  «        }	 |||	¦  «        ||<   Œ=|t          | ‰
j
        |j        Ž ¦  «        fS )Nr   )rÊ  r
  c                ól   •— g | ]0}t          |t          ¦  «        r|                     ‰¦  «        ng |f‘Œ1S r2   ©rô   rü   rÕ  ©rW   r  r¾  s     €r4   rY   z)TensAdd._extract_data.<locals>.<listcomp>‘
  sP   ø€ ð %
ð %
ð %
à9<�J�s�HÑ%Ô%ð5ˆC×ÒÐ.Ñ/Ô/Ð/Ø,.°¨9ð%
ð %
ð %
r3   c                ó&   •— g | ]} ‰|¦  «        ‘ŒS r2   r2   )rW   rX   rÊ  s     €r4   rY   z)TensAdd._extract_data.<locals>.<listcomp>•
  s!   ø€ Ð+Ð+Ð+˜q�%�%˜‘(”(Ð+Ð+Ð+r3   rf   )Úsympy.tensor.arrayrÊ  r
  r  r  r»   rL   r  rž  ÚsumrË  rF  )rO   r¾  r
  Úargs_indicesr,  Úref_indicesrX   rK   ró   r¯   rÊ  s    `        @r4   rÕ  zTensAdd._extract_data�
  sö   øø€ Ø9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ý"ð %
ð %
ð %
ð %
à@DÄ	ð%
ñ %
ô %
ð  Ñˆ�fð ,Ð+Ð+Ð+ FÐ+Ñ+Ô+ˆØ" 1”oˆÝ�q�#˜lÑ+Ô+Ñ,Ô,ð 	8ð 	8ˆAØ" 1”oˆGØ˜1”IˆEÝ!×:Ò:¸7ÀKÑPÔPˆKØ#˜ E¨;Ñ7Ô7ˆF�1‰IˆIØ�C ¨¨¬°U´[Ð(AÑBÔBÐBÐBr3   c                ó¸   — t          ¦   «          t          t          ¦  «        5  t          |                      ¦   «                  cd d d ¦  «         S # 1 swxY w Y   d S r_   ©r5   r'   r&   rÅ  r0  ru   s    r4   rÿ   zTensAdd.dataž
  s¥   € åÑÔÐÝÕ4Ñ5Ô5ð 	Að 	AÝ1°$·+²+±-´-Ô@ð	Að 	Að 	Að 	Añ 	Aô 	Að 	Að 	Að 	Að 	Að 	Að 	Aøøøð 	Að 	Að 	Að 	Að 	Að 	As   £AÁAÁAc                ó�   — t          ¦   «          t          t          ¦  «        5  |t          | <   d d d ¦  «         d S # 1 swxY w Y   d S r_   rÄ  rP  s     r4   rÿ   zTensAdd.data¤
  rQ  rR  c                óž   — t          ¦   «          t          t          ¦  «        5  | t          v rt          | = d d d ¦  «         d S # 1 swxY w Y   d S r_   rÄ  ru   s    r4   rÿ   zTensAdd.dataª
  s•   € åÑÔÐÝÕ4Ñ5Ô5ð 	9ð 	9ØÕ5Ð5Ð5Ý2°4Ð8ð	9ð 	9ð 	9ñ 	9ô 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9øøøð 	9ð 	9ð 	9ð 	9ð 	9ð 	9s   £AÁAÁ	Ac                ó    — t          ¦   «          | j        st          d¦  «        ‚| j                             ¦   «                              ¦   «         S ©Nz No iteration on abstract tensors)r5   rÿ   rl   ÚflattenrV  ru   s    r4   rV  zTensAdd.__iter__±
  sH   € ÝÑÔÐØŒyð 	AÝÐ?Ñ@Ô@Ð@ØŒy× Ò Ñ"Ô"×+Ò+Ñ-Ô-Ð-r3   c                ó*   — t          j        |¦  «        S r_   )r   Úfromiter)rO   r  r¦  s      r4   Ú_eval_rewrite_as_Indexedz TensAdd._eval_rewrite_as_Indexed·
  s   € ÝŒ|˜DÑ!Ô!Ð!r3   c                ó0  — g }| j         D ]o}t          |t          ¦  «        r)|                     |                     |¦  «        ¦  «         Œ@|j        r(|                     |                     |¦  «        ¦  «         Œp | j        |Ž                      d¬¦  «        S rg  )	r  rô   rü   rm   Ú_eval_partial_derivativeÚ	_diff_wrtÚ_eval_derivativerè  rD  )rO   rë  Úlist_addendsrÖ   s       r4   r[  z TensAdd._eval_partial_derivativeº
  sœ   € àˆØ”ð 	;ð 	;ˆAÝ˜!�XÑ&Ô&ð ;Ø×#Ò# A×$>Ò$>¸qÑ$AÔ$AÑBÔBÐBÐBà”ð ;Ø×#Ò# A×$6Ò$6°qÑ$9Ô$9Ñ:Ô:Ð:øàˆtŒy˜,Ð'×,Ò,°%Ð,Ñ8Ô8Ð8r3   NFc                óf  ‡— t          |¦  «        }|€i }n|                     ¦   «         }t          |t          ¦  «        sd S t	          t          | ¦  «        ¦  «        dk    r|                      |||¦  «        S d„ }t          | j        |¦  «        }t          |j        |¦  «        }g Š|d         D ]`}d}|d         D ]N}	|	‰v rŒ| 	                    |	||¬¦  «        }
|
€Œ"d}| 
                    |
¦  «         ‰                     |	¦  «          |s d S Œaˆfd„|d         D ¦   «         }|d         D ]�}|D ]|}| 	                    |¦  «        }
|
�c‰                     |¦  «         ||                     ¦   «         v r#||xx         |
                     |¦  «        z  cc<   | 
                    |
¦  «         Œ}Œ‚ˆfd	„|d         D ¦   «         }|d
         D ]�}|D ]‹}| 	                    |¦  «        }
|
�r‰                     |¦  «         |j        |                     ¦   «         v r-||j        xx         |
                     |j        ¦  «        z  cc<   | 
                    |
¦  «         ŒŒŒ‘ˆfd„|d         D ¦   «         }|d         D ]�}|D ]‹}| 	                    |¦  «        }
|
�r‰                     |¦  «         |j        |                     ¦   «         v r-||j        xx         |
                     |j        ¦  «        z  cc<   | 
                    |
¦  «         ŒŒŒ‘ˆfd„|d         D ¦   «         }t	          |¦  «        dk    rd S |S )Nr   c                ó  — t          | ¦  «        }t          |t          ¦  «        }t          |¦  «        dk    rdS t          |                     ¦   «         v r5|d         D ]*}t          |                     ¦   «         ¦  «        dk    r dS Œ+dS dS )Nr   ÚnonwildÚ
WildTensorÚindexless_wildtensorÚ
wildtensorÚ	otherwild)Ú
_get_wildsr*   ÚtyperL   rb  Úkeysrv   )r  Ú	wildatomsÚwildatom_typesÚws       r4   Úsiftkeyz TensAdd.matches.<locals>.siftkeyÔ
  s�   € Ý" 3™œˆIÝ! )­TÑ2Ô2ˆNÝ�9‰~Œ~ Ò"Ð"Ø �yÝ˜~×2Ò2Ñ4Ô4Ð4Ð4Ø'¨Ô5ð 6ð 6�AÝ˜1Ÿ=š=™?œ?Ñ+Ô+¨qÒ0Ð0Ø5Ð5Ð5ð 1à#�|à"�{r3   ra  F)rì  rl  Tc                ó   •— g | ]}|‰v¯|‘Œ	S r2   r2   ©rW   rè   Úmatched_e_tensorss     €r4   rY   z#TensAdd.matches.<locals>.<listcomp>ø
  ó$   ø€ Ð_Ð_Ð_ QÀAÐM^ÐD^ÐD^˜qÐD^ÐD^ÐD^r3   re  c                ó   •— g | ]}|‰v¯|‘Œ	S r2   r2   rn  s     €r4   rY   z#TensAdd.matches.<locals>.<listcomp>  rp  r3   rd  c                ó   •— g | ]}|‰v¯|‘Œ	S r2   r2   rn  s     €r4   rY   z#TensAdd.matches.<locals>.<listcomp>  rp  r3   rc  c                ó   •— g | ]}|‰v¯|‘Œ	S r2   r2   rn  s     €r4   rY   z#TensAdd.matches.<locals>.<listcomp>  rp  r3   )r   rk  rô   r  rL   rf  rí  r*   r  Úmatchesr   rm   rh  Úpoprc   )rO   r«  rì  rl  rl  Úquery_siftedÚexpr_siftedÚq_tensorÚmatched_this_qÚe_tensorrV  Úremaining_e_tensorsrk  Úero  s                 @r4   rt  zTensAdd.matchesÆ
  sã  ø€ Ý�t‰}Œ}ˆàÐØˆIˆIà!ŸšÑ(Ô(ˆIå˜$¥Ñ(Ô(ð 	Ø�4å�z˜$ÑÔÑ Ô  AÒ%Ð%Ø×'Ò'¨¨i¸Ñ=Ô=Ð=ð	#ð 	#ð 	#õ ˜DœI wÑ/Ô/ˆÝ˜4œ9 gÑ.Ô.ˆð ÐØ$ YÔ/ð 	ð 	ˆHØ"ˆNØ'¨	Ô2ð ð �ØÐ0Ð0Ð0Øà×$Ò$ X¸ÈÐ$ÑLÔL�Ø�9Øà%)�NØ×$Ò$ QÑ'Ô'Ð'Ø%×,Ò,¨XÑ6Ô6Ð6Øà!ð Ø�t�tðð `Ð_Ð_Ð_¨+°iÔ*@Ð_Ñ_Ô_ÐØ˜kÔ*ð 	(ð 	(ˆAØ(ð (ð (�Ø—I’I˜a‘L”L�Ø�=Ø%×,Ò,¨QÑ/Ô/Ð/Ø˜IŸNšNÑ,Ô,Ð,Ð,Ø! !˜˜œ¨¯ª¨a©¬Ñ0˜˜™Ø×$Ò$ QÑ'Ô'Ð'øð(ð `Ð_Ð_Ð_¨+°iÔ*@Ð_Ñ_Ô_ÐØ˜lÔ+ð 	(ð 	(ˆAØ(ð (ð (�Ø—I’I˜a‘L”L�Ø�=Ø%×,Ò,¨QÑ/Ô/Ð/Ø”{ i§n¢nÑ&6Ô&6Ð6Ð6Ø! !¤+Ð.Ð.Ô.°!·%²%¸¼Ñ2DÔ2DÑDÐ.Ð.Ñ.Ø×$Ò$ QÑ'Ô'Ð'øð(ð `Ð_Ð_Ð_¨+°iÔ*@Ð_Ñ_Ô_ÐØÐ4Ô5ð 	(ð 	(ˆAØ(ð (ð (�Ø—I’I˜a‘L”L�Ø�=Ø%×,Ò,¨QÑ/Ô/Ð/Ø”{ i§n¢nÑ&6Ô&6Ð6Ð6Ø! !¤+Ð.Ð.Ô.°!·%²%¸¼Ñ2DÔ2DÑDÐ.Ð.Ñ.Ø×$Ò$ QÑ'Ô'Ð'øð(ð `Ð_Ð_Ð_¨+°iÔ*@Ð_Ñ_Ô_ÐÝÐ"Ñ#Ô# aÒ'Ð'Ø�4àÐr3   rÙ   rî  )r—   r   rï  )$rÚ   rÛ   rÜ   rÝ   r   rš  r!  rƒ  r    r�  r(   rÂ   r  rû  rD  rÞ   rô  r  r  rv   rz  rP   r5  rö   r=  rB  r�  rì  rÕ  rÿ   rß  rà  rV  rY  r[  rt  r2   r3   r4   r  r  q	  s�  € € € € € ð'ð 'ðR	4ð 	4ð 	4ð ðð ñ „Xðð ðð ñ „Xðð!ð !ð !ð !ð#ð #ð #ð #ð ðð ñ Ôðð ðð ñ Ôðð ðð ñ Ôðð&ð &ð &ð &ðP ð	ð 	ñ „\ð	ð ðGð Gñ „\ðGð ðð ñ „\ðð8ð ð ðð ð ð"ð "ð "ð9ð 9ð 9ð*#ð #ð #ð
ð ð ð
ð ð ð*3ð 3ð 3ðð ð ðCð Cð Cð ðAð Añ „XðAð
 
„[ð8ð 8ñ „[ð8ð
 
„\ð9ð 9ñ „\ð9ð.ð .ð .ð"ð "ð "ð
9ð 
9ð 
9ðTð Tð Tð Tð Tð Tr3   r  c                  óÈ  — e Zd ZU dZdZded<   ded<   ddœd„Zed	„ ¦   «         Zed
„ ¦   «         Z	ed„ ¦   «         Z
ed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zd„ Zed„ ¦   «         ZdBd„Zddœd„Zd„ Zd„ Zd„ Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zd „ Z dBd!„Z!d"„ Z"d#„ Z#d$„ Z$dCd'„Z%dCd(„Z&dDd,„Z'd-„ Z(d.„ Z)d/„ Z*dEd1„Z+dEd2„Z,d3„ Z-d4„ Z.d5„ Z/d6„ Z0ed7„ ¦   «         Z1e1j2        d8„ ¦   «         Z1e1j3        d9„ ¦   «         Z1d:„ Z4d;„ Z5d<„ Z6d=„ Z7d>„ Z8dFdA„Z9d0S )Grý   a‰  
    Base tensor class, i.e. this represents a tensor, the single unit to be
    put into an expression.

    Explanation
    ===========

    This object is usually created from a ``TensorHead``, by attaching indices
    to it. Indices preceded by a minus sign are considered contravariant,
    otherwise covariant.

    Examples
    ========

    >>> from sympy.tensor.tensor import TensorIndexType, tensor_indices, TensorHead
    >>> Lorentz = TensorIndexType("Lorentz", dummy_name="L")
    >>> mu, nu = tensor_indices('mu nu', Lorentz)
    >>> A = TensorHead("A", [Lorentz, Lorentz])
    >>> A(mu, -nu)
    A(mu, -nu)
    >>> A(mu, -mu)
    A(L_0, -L_0)

    It is also possible to use symbols instead of inidices (appropriate indices
    are then generated automatically).

    >>> from sympy import Symbol
    >>> x = Symbol('x')
    >>> A(x, mu)
    A(x, mu)
    >>> A(x, -x)
    A(L_0, -L_0)

    Fr>   r  ztuple[TensorHead, Tuple]r  ©r¾   c               ó  — |                       ||¦  «        }t          j        | |t          |Ž fi |¤Ž}t	          j        |Ž |_        |j        j        d d …         |_        |j        j	        d d …         |_
        |j        j        |_        t          j        |_        ||_        ||_        |g|_        |j        t'          |¦  «        k    rt)          d¦  «        ‚||_        t,                               ||j        ¦  «        |_        |S )Núwrong number of indices)Ú_parse_indicesr   r   r   r>   r]   r  rH   Ú_freerI   Ú_dumrM   r   rz  Ú_coeffÚ_nocoeffÚ
_componentÚ_componentsrÂ   rL   rl   r¾   rý   Ú_build_index_mapÚ
_index_map)r¢  Útensor_headrK   r¾   rÿ  r§  s         r4   r   zTensor.__new__F  sè   € Ø×$Ò$ [°'Ñ:Ô:ˆÝŒm˜C ­e°W¨oÐIÐIÀÐIÐIˆÝ.Ô;¸WÐEˆÔØÔ(Ô-¨a¨a¨aÔ0ˆŒ	ØÔ'Ô+¨A¨A¨AÔ.ˆŒØÔ,Ô6ˆŒÝ”UˆŒ
ØˆŒØ$ˆŒØ&˜-ˆŒØÔ�s 7™|œ|Ò+Ð+ÝÐ6Ñ7Ô7Ð7Ø%ˆŒÝ×0Ò0°¸#Ô:NÑOÔOˆŒØˆ
r3   c                ó   — | j         S r_   ©r‚  ru   s    r4   rH   zTensor.freeW  rŠ  r3   c                ó   — | j         S r_   ©rƒ  ru   s    r4   rI   z
Tensor.dum[  s
   € àŒyÐr3   c                ó   — | j         S r_   ©rM   ru   s    r4   r  zTensor.ext_rank_  s
   € àŒ~Ðr3   c                ó   — | j         S r_   ©r„  ru   s    r4   r!  zTensor.coeffc  s
   € àŒ{Ðr3   c                ó   — | j         S r_   )r…  ru   s    r4   rƒ  zTensor.nocoeffg  s
   € àŒ}Ðr3   c                ó   — | j         S r_   )r†  ru   s    r4   rc   zTensor.componentk  s
   € àŒÐr3   c                ó   — | j         S r_   )r‡  ru   s    r4   rb   zTensor.componentso  s   € àÔÐr3   c                ó   — | j         d         S rB   r­  ru   s    r4   ÚheadzTensor.heads  r®  r3   c                ó   — | j         d         S r›   r­  ru   s    r4   rK   zTensor.indicesw  r®  r3   c                óN   — t          | j                             ¦   «         ¦  «        S r_   )r  r  r    ru   s    r4   rû  zTensor.free_indices{  s   € å�4Ô(×9Ò9Ñ;Ô;Ñ<Ô<Ð<r3   c                ó   — | j         j        S r_   )r—  rJ   ru   s    r4   rJ   zTensor.index_types  s   € àŒyÔ$Ð$r3   c                ó*   — t          | j        ¦  «        S r_   )rL   rû  ru   s    r4   rÂ   zTensor.rankƒ  s   € å�4Ô$Ñ%Ô%Ð%r3   c                óF   — i }| D ]}|                       |¦  «        f||<   Œ|S r_   r›  )rK   Úindex_structureÚ	index_maprz   s       r4   rˆ  zTensor._build_index_map‡  s6   € àˆ	Øð 	3ð 	3ˆCØ%Ÿmšm¨CÑ0Ô0Ð2ˆI�c‰NˆNØÐr3   c                óR   — t                                | g¦  «        \  }}}}|d         S rB   )r  Ú_tensMul_contract_indices)rO   r	  r  rK   rH   rI   s         r4   rD  zTensor.doitŽ  s)   € Ý#*×#DÒ#DÀdÀVÑ#LÔ#LÑ ˆˆg�t˜SØ�AŒwˆr3   c           	     óš  — t          |t          t          t          f¦  «        st	          dt          |¦  «        z  ¦  «        ‚t          |¦  «        }t          |¦  «        D ]ê\  }}t          |t          ¦  «        r t          || j	        |         d¦  «        ||<   Œ:t          |t          ¦  «        rd|                     ¦   «         \  }}|dk    r5t          |t          ¦  «        r t          || j	        |         d¦  «        ||<   Œ¡t          d|z  ¦  «        ‚t          |t          ¦  «        s"t	          d|›dt          |¦  «        ›�¦  «        ‚Œë|S )Nz"indices should be an array, got %sTrà   Fzindex not understood: %szwrong type for index: z is )rô   r¹   r“   r   rþ  rg  ri   r   ry   rJ   r   Úas_coeff_Mulrl   )rŠ  rK   rX   rh   r�  r|  s         r4   r�  zTensor._parse_indices’  sB  € å˜'¥E­4µÐ#7Ñ8Ô8ð 	RÝÐ@Å4ÈÁ=Ä=ÑPÑQÔQÐQÝ�w‘-”-ˆÝ! 'Ñ*Ô*ð 
	Yð 
	Y‰HˆAˆuÝ˜%¥Ñ(Ô(ð 	YÝ(¨°Ô0GÈÔ0JÈDÑQÔQ�˜‘
�
Ý˜E¥3Ñ'Ô'ð YØ×)Ò)Ñ+Ô+‘��1Ø˜’7�7�z¨!­VÑ4Ô4�7Ý!,¨Q°Ô0GÈÔ0JÈEÑ!RÔ!R�G˜A‘J�Jå$Ð%?À%Ñ%GÑHÔHÐHÝ ¥{Ñ3Ô3ð YÝ�iÀEÀEÀEÍ4ÐPUÉ;Ì;È;Ð WÑXÔXÐXðYàˆr3   c                óD   — |                      ¦   «         } | j        |d|iŽS ©Nr¾   ©rv   Ú_set_indices©rO   Úimr¾   rK   s       r4   Ú_set_new_index_structurezTensor._set_new_index_structure¤  ó)   € Ø—.’.Ñ"Ô"ˆØ ˆtÔ  'ÐC°{ÐCÐCÐCr3   c               óº   — t          |¦  «        | j        k    rt          d¦  «        ‚|                      | j        d         ||¬¦  «                             ¦   «         S )Núindices length mismatchr   r~  )rL   r  rl   rè  r  rD  )rO   r¾   rK   rÿ  s       r4   r¦  zTensor._set_indices¨  sN   € Ýˆw‰<Œ<˜4œ=Ò(Ð(ÝÐ6Ñ7Ô7Ð7Ø�yŠy˜œ 1œ w¸KˆyÑHÔH×MÒMÑOÔOÐOr3   c                ó.   — d„ | j         j        D ¦   «         S )Nc                ó   — h | ]
}|d          ’ŒS r�   r2   rV   s     r4   ú	<setcomp>z/Tensor._get_free_indices_set.<locals>.<setcomp>®  s   € Ð9Ð9Ð9˜��!”Ð9Ð9Ð9r3   )r  rH   ru   s    r4   r¡  zTensor._get_free_indices_set­  s   € Ø9Ð9˜dÔ3Ô8Ð9Ñ9Ô9Ð9r3   c                óš   ‡— t          t          j        | j        j        Ž ¦  «        Šˆfd„t          | j        d         ¦  «        D ¦   «         S )Nc                ó"   •— h | ]\  }}|‰v ¯	|’ŒS r2   r2   ©rW   rX   rz   Ú	dummy_poss      €r4   r¯  z0Tensor._get_dummy_indices_set.<locals>.<setcomp>²  s"   ø€ ÐLÐLÐL™˜˜3¸QÀ)¸^¸^�¸^¸^¸^r3   rf   )r  Ú	itertoolsÚchainr  rI   ri   r  ©rO   r³  s    @r4   r¥  zTensor._get_dummy_indices_set°  sE   ø€ Ý�	œ¨Ô)>Ô)BÐCÑDÔDˆ	ØLÐLÐLÐL¥)¨D¬I°a¬LÑ"9Ô"9ÐLÑLÔLÐLr3   c                ó@   — t          | j        d         j        ¦  «        S r›   )r  r  ru   s    r4   r§  zTensor._get_indices_set´  s   € Ý�4”9˜Q”<Ô$Ñ%Ô%Ð%r3   c                ó$   — d„ | j         D ¦   «         S )Nc                ó   — g | ]
\  }}||d f‘ŒS r�   r2   )rW   rÄ   rs   s      r4   rY   z'Tensor.free_in_args.<locals>.<listcomp>¹  s"   € Ð8Ð8Ð8¡( # s��c˜1�Ð8Ð8Ð8r3   ©rH   ru   s    r4   Úfree_in_argszTensor.free_in_args·  s   € à8Ð8¨d¬iÐ8Ñ8Ô8Ð8r3   c                ó$   — d„ | j         D ¦   «         S )Nc                ó    — g | ]\  }}||d d f‘ŒS r�   r2   )rW   Úp1Úp2s      r4   rY   z&Tensor.dum_in_args.<locals>.<listcomp>½  s$   € Ð6Ð6Ð6¡6 2 r��R˜˜A�Ð6Ð6Ð6r3   )rI   ru   s    r4   Údum_in_argszTensor.dum_in_args»  s   € à6Ð6¨T¬XÐ6Ñ6Ô6Ð6r3   c                ó>   — t          d„ | j        D ¦   «         ¦  «        S )Nc                ó   — g | ]
}|d          ‘ŒS r�   r2   rº   s     r4   rY   z$Tensor.free_args.<locals>.<listcomp>Á  ó   € Ð/Ð/Ð/ �q˜”tÐ/Ð/Ð/r3   rž   ru   s    r4   r  zTensor.free_args¿  ó!   € åÐ/Ð/ T¤YÐ/Ñ/Ô/Ñ0Ô0Ð0r3   c                ó¦   — t          |t          ¦  «        sdS t          |t          ¦  «        r| j                             |j        ¦  «        S t
          S )z”
        :param other:
        :return:
            0  commute
            1  anticommute
            None  neither commute nor anticommute
        r   )rô   rü   rý   rc   r6  r  r¿  s     r4   r6  zTensor.commutes_withÃ  sM   € õ ˜%¥Ñ*Ô*ð 	AØ�1Ý˜�vÑ&Ô&ð 	AØ”>×/Ò/°´Ñ@Ô@Ð@Ý"Ð"r3   c                ó$   — t          | ||¦  «        S )z™
        Returns the tensor corresponding to the permutation ``g``.

        For further details, see the method in ``TIDS`` with the same name.
        ©rÈ   ©rO   r½   r¾   s      r4   rÈ   zTensor.perm2tensorÑ  s   € õ ˜4  KÑ0Ô0Ð0r3   c                ó  — | j         r| S |                      ¦   «         }|j                             ¦   «         \  }}}t	          |j        g¦  «        }t          |||g|¢R Ž }|dk    rt          j        S |  	                    |d¦  «        }|S )Nr   T)
r¾   r0  r  r®   rë   rc   r   r   rê  rÈ   )rO   r«  r½   rÔ   r×   ré   Úcanr4  s           r4   rP   zTensor.canon_bpÙ  s�   € ØÔð 	ØˆKØ�{Š{‰}Œ}ˆØÔ0×CÒCÑEÔEÑˆˆ7�DÝ! 4¤>Ð"2Ñ3Ô3ˆÝ˜1˜g tÐ0¨aÐ0Ð0Ð0ˆØ�!Š8ˆ8Ý”6ˆMØ×!Ò! # tÑ,Ô,ˆØˆr3   c                ó   — | gS r_   r2   ru   s    r4   r�   zTensor.splitå  s	   € Øˆvˆr3   c                ó   — | S r_   r2   ru   s    r4   Úsorted_componentszTensor.sorted_componentsè  s   € Øˆr3   r—   r˜   c                ó6   — t          | j        d         ¦  «        S )zN
        Get a list of indices, corresponding to those of the tensor.
        rf   r/  ru   s    r4   rv   zTensor.get_indicesë  s   € õ �D”I˜a”LÑ!Ô!Ð!r3   c                ó4   — | j                              ¦   «         S )zS
        Get a list of free indices, corresponding to those of the tensor.
        ©r  r    ru   s    r4   r    zTensor.get_free_indicesñ  s   € ð Ô$×5Ò5Ñ7Ô7Ð7r3   r‰  rŠ  rü   c                ó,   — |                       |¦  «        S r_   ©ÚxreplacerŒ  s     r4   r�  zTensor._replace_indices÷  s   € ð �}Š}˜TÑ"Ô"Ð"r3   c                ó   — | t           j        fS r_   rö  ru   s    r4   Úas_base_expzTensor.as_base_expü  s   € Ø•Q”Uˆ{Ðr3   c                ó$  — g }| j         D ]}}|D ]c\  }}|j        |j        k    rN|j        |j        k    r>|j        |j        k    r|                     |¦  «         n|                     | ¦  «          nŒd|                     |¦  «         Œ~ | j        |Ž S )a•  
        Return a tensor with free indices substituted according to ``index_tuples``.

        ``index_types`` list of tuples ``(old_index, new_index)``.

        Examples
        ========

        >>> from sympy.tensor.tensor import TensorIndexType, tensor_indices, tensor_heads, TensorSymmetry
        >>> Lorentz = TensorIndexType('Lorentz', dummy_name='L')
        >>> i, j, k, l = tensor_indices('i,j,k,l', Lorentz)
        >>> A, B = tensor_heads('A,B', [Lorentz]*2, TensorSymmetry.fully_symmetric(2))
        >>> t = A(i, k)*B(-k, -j); t
        A(i, L_0)*B(-L_0, -j)
        >>> t.substitute_indices((i, k),(-j, l))
        A(k, L_0)*B(-L_0, l)
        )rK   rj   rU   rk   rm   r—  )rO   r�  rK   rh   Úind_oldÚind_news         r4   r�  zTensor.substitute_indicesÿ  s´   € ð$ ˆØ”\ð 
	&ð 
	&ˆEØ$0ð 	&ð 	&Ñ �˜Ø”J '¤,Ò.Ð.°5Ô3JØ3:Ô3Lò4Mð 4Mà”{ g¤mÒ3Ð3ØŸš wÑ/Ô/Ð/Ð/àŸš¨ xÑ0Ô0Ð0Ø�Eøà—’˜uÑ%Ô%Ð%øØˆtŒy˜'Ð"Ð"r3   c           	     óÚ  ‡
‡— | j         }|j        j        }|j        }d}| h}||k    rÃ|                     ¦   «         }|D ]¦}|D ]¡Š
|                     ¦   «         Šˆ
fd„t          d|¦  «        D ¦   «         }d‰
                     |¦  «        |z
  z  }t          t          ‰ˆfd„|D ¦   «         ¦  «        ¦  «        }	| 
                    ||                     |	¦  «        z  ¦  «         Œ¢Œ§||k    °Ã|S )zl
        Return a list giving all possible permutations of self that are allowed by its symmetries.
        Nc                ó:   •— g | ]}‰                      |¦  «        ‘ŒS r2   )Úapply)rW   rX   Úgens     €r4   rY   z1Tensor._get_symmetrized_forms.<locals>.<listcomp>.  s#   ø€ Ð?Ð?Ð?¨A˜3Ÿ9š9 Q™<œ<Ð?Ð?Ð?r3   r   rà   c                ó    •— g | ]
}‰|         ‘ŒS r2   r2   )rW   rX   Úindss     €r4   rY   z1Tensor._get_symmetrized_forms.<locals>.<listcomp>0  s   ø€ Ð-CÐ-CÐ-C¸!¨d°1¬gÐ-CÐ-CÐ-Cr3   )rc   rÍ   ræ   rÂ   rk  rv   r»   rÛ  Údictr  Úaddr�  )rO   ÚcompÚgensrÂ   Ú	old_permsÚ	new_permsr=  ÚperÚsignÚind_maprÜ  rÞ  s             @@r4   Ú_get_symmetrized_formszTensor._get_symmetrized_forms  s   øø€ ð Œ~ˆØŒ}Ô'ˆØŒyˆàˆ	Ø�Fˆ	Ø˜9Ò$Ð$Ø!ŸšÑ(Ô(ˆIØ!ð Kð K�Øð Kð K�CØ×+Ò+Ñ-Ô-�DØ?Ð?Ð?Ð?µ°q¸±´Ð?Ñ?Ô?�CØ #§)¢)¨D¡/¤/°DÑ"8Ñ9�DÝ"¥3 tÐ-CÐ-CÐ-CÐ-C¸sÐ-CÑ-CÔ-CÑ#DÔ#DÑEÔE�GØ—M’M 4¨$×*?Ò*?ÀÑ*HÔ*HÑ#HÑJÔJÐJÐJðKð ˜9Ò$Ð$ð Ðr3   Nc                óL  — t          |¦  «        }|€i }n|                     ¦   «         }| |k    r|S t          |t          ¦  «        sd S | j        |j        k    rd S |                     ¦   «         D ]5}|                      |||¬¦  «        }|�|                     |¦  «         |c S Œ6d S )N©rl  )r   rk  rô   rý   r—  rè  Ú_matchesr   )rO   r«  rì  rl  Únew_exprrV  s         r4   rt  zTensor.matches5  sÊ   € Ý�t‰}Œ}ˆàÐØˆIˆIà!ŸšÑ(Ô(ˆIð �4Š<ˆ<ØÐÝ˜$¥Ñ'Ô'ð 	Ø�4ØŒ9˜œ	Ò!Ð!Ø�4ð ×3Ò3Ñ5Ô5ð 	!ð 	!ˆHØ—’˜h¨	°s�Ñ;Ô;ˆAØˆ}Ø× Ò  Ñ#Ô#Ð#Ø Ð Ð Ð ð ð ˆtr3   c                ó`  — t          |¦  «        }|€i }n|                     ¦   «         }| |k    r|S t          |t          ¦  «        sdS | j        |j        k    rdS |                      ¦   «         }|                     ¦   «         }t          |¦  «        t          |¦  «        k    rdS t          t          |¦  «        ¦  «        D ]m}||         }|                     ||         ¦  «        }|€ dS | | 	                    ¦   «         v r||           ||         k    r dS | 
                    |¦  «         Œn|S )zD
        This does not account for index symmetries of expr
        N)r   rk  rô   rý   r—  rv   rL   r»   rt  rh  r   )	rO   r«  rì  rl  Ú	s_indicesÚ	e_indicesrX   Ús_indrV  s	            r4   rë  zTensor._matchesN  s?  € õ �t‰}Œ}ˆàÐØˆIˆIà!ŸšÑ(Ô(ˆIð �4Š<ˆ<ØÐÝ˜$¥Ñ'Ô'ð 	Ø�4ØŒ9˜œ	Ò!Ð!Ø�4à×$Ò$Ñ&Ô&ˆ	Ø×$Ò$Ñ&Ô&ˆ	åˆy‰>Œ>�S ™^œ^Ò+Ð+Ø�4å•s˜9‘~”~Ñ&Ô&ð 	$ð 	$ˆAØ˜a”LˆEØ—’˜i¨œlÑ+Ô+ˆAØˆyØ�t�tØ�˜9Ÿ>š>Ñ+Ô+Ð+Ð+°¸E¸6Ô1BÐ0BÀaÈÄhÒ0NÐ0NØ�t�tà× Ò  Ñ#Ô#Ð#Ð#àÐr3   c                ól  — t          ¦   «          | j        }t          |¦  «        }d„ |D ¦   «         d„ |D ¦   «         k    rt          d¦  «        ‚||k    r| S  | j        t          t          ||¦  «        ¦  «        Ž }t          d„ |D ¦   «         ¦  «        t          |¦  «        k    r |j        |j        Ž S |S )Nc                ó   — g | ]	}|j         ‘Œ
S r2   rT   rº   s     r4   rY   z#Tensor.__call__.<locals>.<listcomp>w  r'  r3   c                ó   — g | ]	}|j         ‘Œ
S r2   rT   rº   s     r4   rY   z#Tensor.__call__.<locals>.<listcomp>w  r)  r3   r*  c                ó&   — h | ]}|j         r|n| ’ŒS r2   rù   rV   s     r4   r¯  z"Tensor.__call__.<locals>.<setcomp>  ó%   € Ð6Ð6Ð6¨�Q”WÐ$�� 1 "Ð6Ð6Ð6r3   ©	r<   r  r“   rl   r�  r  rL   rè  r  ©rO   rK   r  rè   s       r4   rz  zTensor.__call__s  óÈ   € ÝÑÔÐØ”Nˆ	Ý�w‘-”-ˆØ1Ð1¨Ð1Ñ1Ô1Ð5]Ð5]ÐS\Ð5]Ñ5]Ô5]Ò]Ð]ÝÐ1Ñ2Ô2Ð2Ø�iÒÐØˆKØ#ˆDÔ#¥T­#¨i¸Ñ*AÔ*AÑ%BÔ%BÐCˆõ Ð6Ð6¨gÐ6Ñ6Ô6Ñ7Ô7½3¸w¹<¼<ÒGÐGØ�1”6˜1œ6�?Ð"Øˆr3   c                ó¬   — t          ¦   «          t          t          ¦  «        5  | j                             ¦   «         cd d d ¦  «         S # 1 swxY w Y   d S r_   rU  ru   s    r4   rV  zTensor.__iter__„  rW  rX  c                ó”   — t          ¦   «          t          t          ¦  «        5  | j        |         cd d d ¦  «         S # 1 swxY w Y   d S r_   r7  r8  s     r4   rö   zTensor.__getitem__Š  r:  rÇ  c           
     óš  ‡‡— ddl mŠ |                     ¦   «         D ]<\  }}t          |t          ¦  «        r"|j        d         | j        d         k    r|}|} nŒ=t          | ›d|›�¦  «        ‚ˆfd„|                     ¦   «         D ¦   «         } ‰|¦  «        }| j        }|j        Št          ‰¦  «        dk    r)‰D ]}||vrt          d|z  ¦  «        ‚Œˆfd„|D ¦   «         }t          |¦  «        dk    �r|  
                    ¦   «         }| 
                    ¦   «         }	i }
|D ]˜\  }}|	|          |
|	|         <   ||fD ]|}||         j        |	|         j        z  r_|||         j                 }||         j        rt                               |¦  «        }|                      |||t          |	¦  «        ¦  «        }Œ}Œ™|                     |
¦  «                             ¦   «         }t                               |g|t          |	¦  «        ¦  «        }|                      ¦   «         }|                     ¦   «         }|                      ||||¦  «        S )Nrf   rÉ  r   z not found in c                ó.   •— i | ]\  }}| ‰|¦  «        “ŒS r2   r2   )rW   rÍ  ré   rÊ  s      €r4   r  z(Tensor._extract_data.<locals>.<dictcomp>š  s'   ø€ ÐMÐMÐM©D¨A¨q˜A˜u˜u Q™xœxÐMÐMÐMr3   z'%s with contractions is not implementedc                ó   •— g | ]}|‰v¯|‘Œ	S r2   r2   )rW   ÚpairÚdum2s     €r4   rY   z(Tensor._extract_data.<locals>.<listcomp>¦  s#   ø€ Ð>Ð>Ð>˜T¨T¸Ð-=Ð-=�DÐ-=Ð-=Ð-=r3   )ró   rÊ  rÔ  rô   rý   r  rl   rI   rL   r  rv   rk   rU   rí   rb  r¹  rÓ  rD  r  r    rÇ  )rO   r¾  rÍ  ré   rÀ  ró   Údum1rþ  rœ  r�  r‰  r¾  r¿  rs   rÐ   r¼  r½  rÊ  rÿ  s                    @@r4   rÕ  zTensor._extract_data�  sš  øø€ Ø Ð Ð Ð Ð Ð Ø$×*Ò*Ñ,Ô,ð 	Nð 	N‰DˆAˆqÝ˜!�VÑ$Ô$ð ¨¬°¬°d´iÀ´lÒ)BÐ)BØ�Ø�Ø�øå°T°T°TÐ;KÐ;KÐLÑMÔMÐMð NÐMÐMÐMÐ4D×4JÒ4JÑ4LÔ4LÐMÑMÔMÐØ��e‘”ˆàŒxˆØŒyˆåˆt‰9Œ9�qŠ=ˆ=Øð að a�à˜tÐ#Ð#Ý-Ð.WÐZ_Ñ._Ñ`Ô`Ð`ð $ð ?Ð>Ð>Ð> TÐ>Ñ>Ô>ˆDÝˆt‰9Œ9�qŠ=‰=Ø×'Ò'Ñ)Ô)ˆHØ×(Ò(Ñ*Ô*ˆHØˆDØð jð j‘��BØ&.¨r¤l ]��X˜b”\Ñ"Ø ˜8ð jð j�CØ ”}Ô*¨X°c¬]Ô-@Ñ@ð jØ!1°(¸3´-Ô2QÔ!R˜Ø# Cœ=Ô.ð UÝ%=×%LÒ%LÈVÑ%TÔ%T˜FØ $× FÒ FÀvÈuÐVYÕ[^Ð_gÑ[hÔ[hÑ iÔ i˜øðjð —N’N 4Ñ(Ô(×-Ò-Ñ/Ô/ˆEÝ,×>Ò>À¸wÈÍcÐRZÉmÌmÑ\Ô\ˆEà×)Ò)Ñ+Ô+ˆ	Ø×*Ò*Ñ,Ô,ˆ	à×4Ò4°U¸IÀyÐRbÑcÔcÐcr3   c                ó”   — t          ¦   «          t          t          ¦  «        5  t          |          cd d d ¦  «         S # 1 swxY w Y   d S r_   rÄ  ru   s    r4   rÿ   zTensor.data»  rÆ  rÇ  c                ó�   — t          ¦   «          t          t          ¦  «        5  |t          | <   d d d ¦  «         d S # 1 swxY w Y   d S r_   rÄ  rP  s     r4   rÿ   zTensor.dataÁ  sŒ   € åÑÔÐåÕ4Ñ5Ô5ð 	8ð 	8Ø37Õ*¨4Ñ0ð	8ð 	8ð 	8ñ 	8ô 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8øøøð 	8ð 	8ð 	8ð 	8ð 	8ð 	8rR  c                óÔ   — t          ¦   «          t          t          ¦  «        5  | t          v rt          | = | j        t          v rt          | j        = d d d ¦  «         d S # 1 swxY w Y   d S r_   rÓ  ru   s    r4   rÿ   zTensor.dataÈ  rÔ  rÕ  c                óœ   — d„ | j         D ¦   «         }| j        }|j        dk    r |j        ›dd                     |¦  «        ›d�S d|j        z  S )Nc                ó,   — g | ]}t          |¦  «        ‘ŒS r2   r"  ©rW   rÄ   s     r4   rY   z!Tensor._print.<locals>.<listcomp>Ò  s   € Ð4Ð4Ð4 •3�s‘8”8Ð4Ð4Ð4r3   r   r8  z, r;  z%s)rK   rc   rÂ   rj   r<  )rO   rK   rc   s      r4   rì  zTensor._printÑ  s[   € Ø4Ð4 t¤|Ð4Ñ4Ô4ˆØ”Nˆ	ØŒ>˜AÒÐØ )¤  °·	²	¸'Ñ0BÔ0BÐ0BÐ0BÐCÐDà˜9œ>Ñ)Ð*r3   c                óÔ   — |dk    r| j         dk    S t          |¦  «        }t          |t          ¦  «        s| j        rJ ‚t
          j        |k    S d„ } || ¦  «         ||¦  «        k    S )Nr   c                óä   — |                       ¦   «         }|j        t          |j        ¦  «        t          t	          |j        ¦  «        ¦  «        t          t	          |j        ¦  «        ¦  «        f}|S r_   )rP   r!  r¹   rb   rŸ   rH   rI   )rO   rè   r5  s      r4   Ú_get_compar_compz'Tensor.equals.<locals>._get_compar_compá  sR   € Ø—’‘”ˆAØ”�% ¤Ñ-Ô-Ý�& ¤™.œ.Ñ)Ô)­5µ¸¼±´Ñ+?Ô+?ðAˆAàˆHr3   )r!  r!   rô   rü   rb   r   rz  )rO   rÀ  r	  s      r4   r5  zTensor.equalsÙ  s�   € Ø�AŠ:ˆ:Ø”: ’?Ð"Ý˜‘”ˆÝ˜%¥Ñ*Ô*ð 	"Ø”Ð&Ð&Ð&Ý”5˜E’>Ð!ð	ð 	ð 	ð  Ð Ñ%Ô%Ð)9Ð)9¸%Ñ)@Ô)@Ò@Ð@r3   c                óØ  — | j         |k    r| S t          | j        ¦  «        dk    r| S |j        t                               d¦  «        k    rd}nS|j        t                               d¦  «        k    rd}n-|j        t                               d¦  «        k    rd }nt          ‚t          j	        }|j
        d         }|s||j        z  }n#||j        z  }| j        d         \  }}||k     r| }|S )Nr   rÌ   rf   r@   )rc   rL   rH   rÍ   rÎ   rÏ   r³  r  r   rz  rJ   rG  rI   )rO   r½   Úantisymræ  rp   Údp0Údp1s          r4   rB  zTensor.contract_metricé  só   € àŒ>˜QÒÐØˆKåˆtŒy‰>Œ>˜QÒÐØˆKð Œ:�×7Ò7¸Ñ;Ô;Ò;Ð;ØˆGˆGØŒZ�>×9Ò9¸!Ñ<Ô<Ò<Ð<ØˆGˆGØŒZ�>×5Ò5°aÑ8Ô8Ò8Ð8ØˆGˆGå%Ð%ÝŒuˆØŒm˜AÔˆàð 
	à˜œ‘<ˆDˆDð ˜œ‘<ˆDà”x ”{‰HˆC�Ø�SŠyˆyà�u�àˆr3   c                ó,   — |                       |¦  «        S r_   rA  )rO   rÐ   s     r4   r=  zTensor.contract_delta  s   € Ø×#Ò# FÑ+Ô+Ð+r3   c                óž   — ddl m} d„ |                      ¦   «         D ¦   «         } ||j        d         g|¢R Ž }|                      ||¦  «        S )Nr   )ÚIndexedc                ó(   — g | ]}|j         d          ‘ŒS r�   r­  rV   s     r4   rY   z3Tensor._eval_rewrite_as_Indexed.<locals>.<listcomp>  ó   € Ð?Ð?Ð? q˜œ œÐ?Ð?Ð?r3   )Úsympy.tensor.indexedr  rv   r  râ  )rO   r=  rK   r¦  r  rß  r«  s          r4   rY  zTensor._eval_rewrite_as_Indexed  sf   € Ø0Ð0Ð0Ð0Ð0Ð0à?Ð?¨D×,<Ò,<Ñ,>Ô,>Ð?Ñ?Ô?ˆØˆw�t”y ”|Ð4 mÐ4Ð4Ð4ˆØ×"Ò" 4¨Ñ7Ô7Ð7r3   rë  r   c                óô  — t          |t          ¦  «        st          j        S | j        |j        k    rt          j        S dg}t          t          |                      ¦   «         |                     ¦   «         ¦  «        ¦  «        D ]É\  }\  }}|j        |j        k    rt          d¦  «        ‚|j        }|j
        }t          dt          |¦  «        z   ||j        ¬¦  «        }|j        |j        k    r|                     || ¦  «        }	n0t           |||¦  «        |                     | | ¦  «        ¦  «        }	|                     |	¦  «         ŒÊt                               |¦  «                             d¬¦  «        S )Nrf   zindex types not compatibleÚd_rù   Frh  )rô   rý   r   rê  r—  ri   r  r    rU   rl   rÐ   ry   r…   rk   r¶  r  rm   rX  rD  )
rO   rë  Úkronecker_delta_listÚcountÚiselfÚiotherrU   Útensor_metricÚdummyÚkroneckerdeltas
             r4   r[  zTensor._eval_partial_derivative  s�  € å˜!�VÑ$Ô$ð '	KÝ”6ˆMð Œy˜AœFÒ"Ð"Ý”v�ð %& 3Ð õ -6µc¸$×:OÒ:OÑ:QÔ:QÐST×SeÒSeÑSgÔSgÑ6hÔ6hÑ,iÔ,ið @ð @Ñ(�™˜ ØÔ*¨fÔ.FÒFÐFÝ$Ð%AÑBÔBÐBà(-Ô(?Ð%Ø$5Ô$<�MÝ'¨­s°5©z¬zÑ(9Ð;LØ.3¬kð;ñ ;ô ;�Eà”{ f¤lÒ2Ð2Ø):×)@Ò)@ÀÈÈÑ)PÔ)P˜˜õ $ M M°%¸Ñ$?Ô$?Ø$5×$;Ò$;¸U¸FÀVÀGÑ$LÔ$LñNô Nð 'ð )×/Ò/°Ñ?Ô?Ð?Ð?Ý×#Ò#Ð$8Ñ9Ô9×>Ò>ÀEÐ>ÑJÔJÐJr3   rØ   rÙ   rî  rï  )rë  rý   r—   r   ):rÚ   rÛ   rÜ   rÝ   r'  r|  r   rš  rH   rI   r  r!  rƒ  rc   rb   r—  rK   rû  rJ   rÂ   rÞ   rˆ  rD  r�  r©  r¦  r¡  r¥  r§  r»  rÀ  r  r6  rÈ   rP   r�   rÍ  rv   r    r�  rÕ  r�  rè  rt  rë  rz  rV  rö   rÕ  rÿ   rß  rà  rì  r5  rB  r=  rY  r[  r2   r3   r4   rý   rý     s…  € € € € € € ð!ð !ðF €Nà%Ð%Ð%Ñ%Ø"Ð"Ð"Ñ"à:?ð ð ð ð ð ð" ðð ñ „Xðð ðð ñ „Xðð ðð ñ „Xðð ðð ñ „Xðð ðð ñ „Xðð ðð ñ „Xðð ð ð  ñ „Xð ð ðð ñ „Xðð ðð ñ „Xðð ð=ð =ñ „Xð=ð ð%ð %ñ „Xð%ð ð&ð &ñ „Xð&ð ðð ñ „\ððð ð ð ðð ñ „\ðð"Dð Dð Dð Dð 27ð Pð Pð Pð Pð Pð
:ð :ð :ðMð Mð Mð&ð &ð &ð ð9ð 9ñ „Xð9ð ð7ð 7ñ „Xð7ð ð1ð 1ñ „Xð1ð#ð #ð #ð1ð 1ð 1ð 1ð
ð 
ð 
ðð ð ðð ð ð"ð "ð "ð "ð8ð 8ð 8ð 8ð#ð #ð #ð #ð
ð ð ð#ð #ð #ð@ð ð ð,ð ð ð ð2#ð #ð #ð #ðJð ð ð"(ð (ð (ð#ð #ð #ð
*dð *dð *dðX ð8ð 8ñ „Xð8ð
 
„[ð8ð 8ñ „[ð8ð 
„\ð@ð @ñ „\ð@ð+ð +ð +ðAð Að Að  ð  ð  ðD,ð ,ð ,ð8ð 8ð 8ð)Kð )Kð )Kð )Kð )Kð )Kr3   rý   c                  ó6  — e Zd ZU dZej        Zded<   d„ Z e	d„ ¦  «        Z
 e	d„ ¦  «        Z e	d„ ¦  «        Z e	d„ ¦  «        Z e	d	„ ¦  «        Z e	d
„ ¦  «        Zed„ ¦   «         Zed„ ¦   «         ZedFd„¦   «         Zed„ ¦   «         Zed„ ¦   «         Zd„ Zed„ ¦   «         Zed„ ¦   «         Zd„ Zd„ Zd„ Ze	d„ ¦   «         Ze	d„ ¦   «         Ze	d„ ¦   «         Ze	d„ ¦   «         Ze	d„ ¦   «         Z e	d„ ¦   «         Z!d„ Z"d„ Z#dGd!„Z$dHd%„Z%d&„ Z&d'„ Z'd(„ Z(d)„ Z)d*„ Z*d+„ Z+d,„ Z,dId.„Z-d/„ Z.d0„ Z/d1„ Z0d2„ Z1dId3„Z2d-d4œd5„Z3ed6„ ¦   «         Z4d7„ Z5d8„ Z6d9„ Z7e	d:„ ¦   «         Z8e8j9        d;„ ¦   «         Z8e8j:        d<„ ¦   «         Z8d=„ Z;ed>„ ¦   «         Z<d?„ Z=d@„ Z>dA„ Z?dB„ Z@dJdD„ZAdJdE„ZBdCS )Kr  að  
    Product of tensors.

    Parameters
    ==========

    coeff : SymPy coefficient of the tensor
    args

    Attributes
    ==========

    ``components`` : list of ``TensorHead`` of the component tensors
    ``types`` : list of nonrepeated ``TensorIndexType``
    ``free`` : list of ``(ind, ipos, icomp)``, see Notes
    ``dum`` : list of ``(ipos1, ipos2, icomp1, icomp2)``, see Notes
    ``ext_rank`` : rank of the tensor counting the dummy indices
    ``rank`` : rank of the tensor
    ``coeff`` : SymPy coefficient of the tensor
    ``free_args`` : list of the free indices in sorted order
    ``is_canon_bp`` : ``True`` if the tensor in in canonical form

    Notes
    =====

    ``args[0]``   list of ``TensorHead`` of the component tensors.

    ``args[1]``   list of ``(ind, ipos, icomp)``
    where ``ind`` is a free index, ``ipos`` is the slot position
    of ``ind`` in the ``icomp``-th component tensor.

    ``args[2]`` list of tuples representing dummy indices.
    ``(ipos1, ipos2, icomp1, icomp2)`` indicates that the contravariant
    dummy index is the ``ipos1``-th slot position in the ``icomp1``-th
    component tensor; the corresponding covariant index is
    in the ``ipos2`` slot position in the ``icomp2``-th component tensor.

    r>   r  c                óÔ  — |                      dd¦  «        }t          t          t          |¦  «        ¦  «        }	 d„ |D ¦   «         }t	          t          j        |Ž ¦  «        }g }|D ]Ð}t	          t          |¦  «        ¦  «        }d„ |D ¦   «         }t	          t          j        |Ž ¦  «        }t	          t          |¦  «        ¦  «        }	t          | 
                    |¦  «        ¦  «        dk    r2|	                     ||¦  «        }
t                               ||
¦  «        }n|}|                     |¦  «         ŒÑ|}d„ |D ¦   «         }t                               |d¬¦  «        \  }}}}d„ |D ¦   «         }t!          |||||¬	¦  «        }t#          j        | g|¢R Ž }||_        |                     ¦   «         |_        ||_        |j        d d …         |_        |j        d d …         |_        d
„ |j        D ¦   «         |_        t          |j        ¦  «        |_        t          |j        j        ¦  «        dt          |j        j        ¦  «        z  z   |_        t<          j        |_         ||_!        |S )Nr¾   Fc                ó,   — g | ]}t          |¦  «        ‘ŒS r2   ©r    r  s     r4   rY   z#TensMul.__new__.<locals>.<listcomp>u  s!   € Ð6Ð6Ð6¨#Õ  Ñ%Ô%Ð6Ð6Ð6r3   c                ó,   — g | ]}t          |¦  «        ‘ŒS r2   )Úget_dummy_indicesræ  s     r4   rY   z#TensMul.__new__.<locals>.<listcomp>z  s!   € Ð?Ð?Ð?°!Õ*¨1Ñ-Ô-Ð?Ð?Ð?r3   r   c                ód   — g | ]-}t          |t          t          f¦  «        r|j        n|gD ]}|‘ŒŒ.S r2   )rô   r  r   r  )rW   r  rX   s      r4   rY   z#TensMul.__new__.<locals>.<listcomp>‡  sC   € ÐdÐdÐd�c½
À3ÍÕRUÈÑ8WÔ8WÐ,b¨C¬H¨HÐ^aÐ]bÐdÐd a�ÐdÐdÐdÐdr3   )Úreplace_indicesc                ó   — g | ]	}|j         ‘Œ
S r2   rT   rV   s     r4   rY   z#TensMul.__new__.<locals>.<listcomp>Œ  rZ   r3   r/  c                ó   — h | ]
}|d          ’ŒS r�   r2   rº   s     r4   r¯  z"TensMul.__new__.<locals>.<setcomp>•  s   € Ð4Ð4Ð4 a˜Q˜qœTÐ4Ð4Ð4r3   r@   )"r—  r“   r*  r!   r  r´  rµ  r"  r    rL   ÚintersectionÚunionr  Ú_dedupe_indicesrm   r   r>   rü   r   Ú_indicesrk  Ú_index_typesr  rH   r‚  rI   rƒ  Ú_free_indicesÚ_rankrM   r   rz  r„  Ú_is_canon_bp)r¢  r  rÿ  r¾   rH   r   r  Údum_thisÚ	dum_otherÚ	free_thisÚexcludeÚnewargrK   rI   rJ   r�  r§  s                    r4   r   zTensMul.__new__m  s\  € Ø—k’k -°Ñ7Ô7ˆÝ•C� $Ñ'Ô'Ñ(Ô(ˆð	ð 7Ð6°Ð6Ñ6Ô6ˆÝ•9”? DÐ)Ñ*Ô*ˆØˆØð 
	#ð 
	#ˆCÝÕ,¨SÑ1Ô1Ñ2Ô2ˆHØ?Ð?°wÐ?Ñ?Ô?ˆIÝ�IœO¨YÐ7Ñ8Ô8ˆIÝÕ,¨SÑ1Ô1Ñ2Ô2ˆIÝ�8×(Ò(¨Ñ.Ô.Ñ/Ô/°!Ò3Ð3Ø#Ÿ/š/¨$°	Ñ:Ô:�Ý ×0Ò0°°gÑ>Ô>��à�Ø�NŠN˜6Ñ"Ô"Ð"Ð"àˆð eÐd˜TÐdÑdÔdˆå#*×#DÒ#DÀTÐ[`Ð#DÑ#aÔ#aÑ ˆˆg�t˜Sð =Ð<°GÐ<Ñ<Ô<ˆÝ)¨$°°[À'ÐT_Ð`Ñ`Ô`ˆåÔ˜sÐ* TÐ*Ð*Ð*ˆØˆŒØ&×+Ò+Ñ-Ô-ˆÔØ.ˆÔØ#Ô(¨¨¨Ô+ˆŒ	Ø"Ô& q q qÔ)ˆŒØ4Ð4¨3¬8Ð4Ñ4Ô4ˆÔÝ˜œ‘M”MˆŒ	Ý˜CÔ0Ô5Ñ6Ô6¸½3¸sÔ?SÔ?WÑ;XÔ;XÑ9XÑXˆŒÝ”UˆŒ
Ø&ˆÔØˆ
r3   c                ó   — | j         S r_   )r+  ru   s    r4   rE   zTensMul.<lambda>œ  s	   € ¨Ô(9€ r3   c                ó   — | j         S r_   rŒ  ru   s    r4   rE   zTensMul.<lambda>�  ó   €  ¤€ r3   c                ó   — | j         S r_   rŽ  ru   s    r4   rE   zTensMul.<lambda>ž  s   €  ¤	€ r3   c                ó   — | j         S r_   ©r,  ru   s    r4   rE   zTensMul.<lambda>Ÿ  s	   € ¨Ô);€ r3   c                ó   — | j         S r_   )r-  ru   s    r4   rE   zTensMul.<lambda>   r6  r3   c                ó   — | j         S r_   r�  ru   s    r4   rE   zTensMul.<lambda>¡  s   €  T¤^€ r3   c           	     óÆ  — i }i }g }g }d}t          | ¦  «        D ]ì\  }}|D ]ä}t          |t          ¦  «        st          d¦  «        ‚| |v r|                     | ¦  «        }	|                     | ¦  «        }
|j        r|                     |||	||
f¦  «         n|                     | |	||
|f¦  «         |                     |¦  «         n5||v rt          d|z  ¦  «        ‚|||<   |||<   |                     |¦  «         |dz  }ŒåŒít          | 	                    ¦   «         ¦  «        }d„ | 
                    ¦   «         D ¦   «         }|                     d„ ¬¦  «         ||||fS )Nr   zexpected TensorIndexzRepeated index: %srf   c                ó   — g | ]	}|j         ‘Œ
S r2   r¾  rV   s     r4   rY   z0TensMul._indices_to_free_dum.<locals>.<listcomp>Í  s   € Ð7Ð7Ð7 �a”fÐ7Ð7Ð7r3   c                ó   — | d         S r°  r2   rC   s    r4   rE   z.TensMul._indices_to_free_dum.<locals>.<lambda>Ï  s
   €  a¨¤d€ r3   rF   )ri   rô   ry   rþ  ru  rk   rm   rl   r“   rÔ  rh  rN   )rN  Ú	free2pos1Ú	free2pos2Ú
dummy_datarK   r}   r|   Úarg_indicesrh   Ú
other_pos1Ú
other_pos2rH   Ú
free_namess                r4   Ú_indices_to_free_dumzTensMul._indices_to_free_dum£  s°  € àˆ	Øˆ	Øˆ
Øˆð ˆå!*¨<Ñ!8Ô!8ð 	ð 	ÑˆD�+à$ð ð �Ý! %­Ñ5Ô5ð <Ý#Ð$:Ñ;Ô;Ð;Ø�6˜YÐ&Ð&à!*§¢°¨vÑ!6Ô!6�JØ!*§¢°¨vÑ!6Ô!6�JØ”{ð XØ"×)Ò)¨5°$¸
ÀDÈ*Ð*UÑVÔVÐVÐVà"×)Ò)¨E¨6°:¸tÀZÐQUÐ*VÑWÔWÐWØ—N’N 5Ñ)Ô)Ð)Ð)Ø˜iÐ'Ð'Ý$Ð%9¸EÑ%AÑBÔBÐBà'+�I˜eÑ$Ø'+�I˜eÑ$Ø—N’N 5Ñ)Ô)Ð)Ø˜‘	��ð%õ( �I—O’OÑ%Ô%Ñ&Ô&ˆØ7Ð7 i§n¢nÑ&6Ô&6Ð7Ñ7Ô7ˆ
à�Š˜N˜NˆÑ+Ô+Ð+Ø˜˜j¨*Ð4Ð4r3   c                ó   — d„ | D ¦   «         S )Nc                ó"   — g | ]\  }}}}}||f‘ŒS r2   r2   )rW   rX   Úp1aÚp1bÚp2aÚp2bs         r4   rY   z.TensMul._dummy_data_to_dum.<locals>.<listcomp>Ô  s'   € ÐEÐEÐEÑ6  3¨¨S°#��c�
ÐEÐEÐEr3   r2   )rA  s    r4   Ú_dummy_data_to_dumzTensMul._dummy_data_to_dumÒ  s   € àEÐE¸*ÐEÑEÔEÐEr3   Tc                ó:  ‡— d„ | D ¦   «         }d„ | D ¦   «         }t                                |¦  «        \  }}}}t          t          ¦  «        Šˆfd„}|r©|D ]`\  }	}
}}}|	j        }	  ||¦  «        }||vrnŒ |	j        ||g|	j        dd …         ¢R Ž }|||
         |	<   | ||         |	 <   |||<   | ||<   Œad„ t          | |¦  «        D ¦   «         } 	 d„ | D ¦   «         }t                                |¦  «        \  }}}}t                                |¦  «        }| |||fS )Nc                ó   — g | ]}i ‘ŒS r2   r2   rH  s     r4   rY   z5TensMul._tensMul_contract_indices.<locals>.<listcomp>Ø  s   € Ð)Ð)Ð)˜q˜Ð)Ð)Ð)r3   c                ó,   — g | ]}t          |¦  «        ‘ŒS r2   ©rv   r  s     r4   rY   z5TensMul._tensMul_contract_indices.<locals>.<listcomp>Ü  s    € Ð9Ð9Ð9¨S� CÑ(Ô(Ð9Ð9Ð9r3   c                óh   •— t          ‰|          ¦  «        }‰| xx         dz  cc<   | j        dz   |z   S rƒ   r„   r‡   s     €r4   rŠ   z9TensMul._tensMul_contract_indices.<locals>.dummy_name_gená  r‹   r3   Tr@   c                ól   — g | ]1\  }}t          |t          ¦  «        r|                     |¦  «        n|‘Œ2S r2   rþ  rÿ  s      r4   rY   z5TensMul._tensMul_contract_indices.<locals>.<listcomp>ò  sN   € ð :ð :ð :á�C˜õ /9¸½hÑ.GÔ.GÐP�×$Ò$ TÑ*Ô*Ð*ÈSð:ð :ð :r3   c                ó,   — g | ]}t          |¦  «        ‘ŒS r2   rQ  r  s     r4   rY   z5TensMul._tensMul_contract_indices.<locals>.<listcomp>ú  s    € Ð=Ð=Ð=°�K¨Ñ,Ô,Ð=Ð=Ð=r3   )	r  rF  r	   rŒ   rU   rè  r  r  rM  )r  r$  ÚreplacementsrN  rK   rH   rE  rA  rŠ   Ú	old_indexÚpos1covÚ
pos1contraÚpos2covÚ
pos2contrarÒ  r†   r  rI   r‰   s                     @r4   r   z!TensMul._tensMul_contract_indicesÖ  s¥  ø€ à)Ð) DÐ)Ñ)Ô)ˆð :Ð9°DÐ9Ñ9Ô9ˆÝ07×0LÒ0LÈ\Ñ0ZÔ0ZÑ-ˆ��z :å�#ÑÔˆð	;ð 	;ð 	;ð 	;ð 	;ð
 ð 	_ØGQð 
-ð 
-ÑC�	˜7 J°¸Ø&Ô8�
ðØ!/ °
Ñ!;Ô!;�JØ!¨Ð3Ð3Øðð '˜	œ z°:ÐSÀ	ÄÈqÈrÈrÔ@RÐSÐSÐS�Ø38�˜WÔ% iÑ0Ø8=°v�˜ZÔ(¨)¨Ñ4Ø#(�˜Ñ Ø', f�˜
Ñ#Ð#ð:ð :å!$ T¨<Ñ!8Ô!8ð:ñ :ô :ˆDðð >Ð=¸Ð=Ñ=Ô=ˆLÝ4;×4PÒ4PÐQ]Ñ4^Ô4^Ñ1ˆG�T˜: zå×(Ò(¨Ñ4Ô4ˆØ�W˜d CÐ'Ð'r3   c                ó    — g }| D ]H}t          |t          ¦  «        sŒt          |t          ¦  «        rŒ.|                     |j        ¦  «         ŒI|S )zq
        Get a list of ``Tensor`` objects having the same ``TIDS`` if multiplied
        by one another.
        )rô   rü   r  r`   rb   )r  rb   r  s      r4   Ú_get_components_from_argsz!TensMul._get_components_from_args   sa   € ð ˆ
Øð 	.ð 	.ˆCÝ˜c¥8Ñ,Ô,ð ØÝ˜#�wÑ'Ô'ð ØØ×Ò˜cœnÑ-Ô-Ð-Ð-ØÐr3   c                óà   — |                      ¦   «         }d}t          | ¦  «        D ]G\  }}t          |t          ¦  «        sŒ|}||j        z  }t          |j        |||…         ¦  «        | |<   ŒHd S rB   )rv   ri   rô   rü   r  rý   rc   )r  r�  rK   Úind_posrX   r  Úprev_poss          r4   Ú_rebuild_tensors_listzTensMul._rebuild_tensors_list  s†   € à!×-Ò-Ñ/Ô/ˆàˆÝ ‘o”oð 	Gð 	G‰FˆAˆsÝ˜c¥8Ñ,Ô,ð ØØˆHØ�s”|Ñ#ˆGÝ˜Sœ]¨G°H¸WÐ4DÔ,EÑFÔFˆD�‰GˆGð	Gð 	Gr3   c                ó|  ‡ ‡‡— ‰ j         }‰                     dd¦  «        }|r_ˆfd„‰ j        D ¦   «         }	 t          t	          ‰ j        |¦  «        ¦  «        Š‰                      ‰¦  «        Šˆfd„‰ j        D ¦   «         }n‰ j        }ˆ fd„|D ¦   «         }t          d„ d„ |D ¦   «         t          j        ¦  «        }d„ |D ¦   «         }t          |¦  «        d	k    r|S |‰ j
        k    r|g|z   }|d	k    rt          j        S t          |¦  «        d
k    r|d	         S t                               |¦  «        \  }}}}d„ |D ¦   «         }	t          |||	||¬¦  «        }
 ‰ j        |Ž }|	|_        |
|_        t          |j        j        ¦  «        dt          |j        j        ¦  «        z  z   |_        ||_        ||_         |S )Nri  Tc                ó*   •— g | ]} |j         d i ‰¤Ž‘ŒS r  r  r  s     €r4   rY   z TensMul.doit.<locals>.<listcomp>  r
  r3   c                ó    •— g | ]
}‰|         ‘ŒS r2   r2   )rW   rÖ   Úrules     €r4   rY   z TensMul.doit.<locals>.<listcomp>)  s   ø€ Ð/Ð/Ð/ �D˜”GÐ/Ð/Ð/r3   c                ó*   •— g | ]}|‰j         k    ¯|‘ŒS r2   )Úidentity)rW   r  rO   s     €r4   rY   z TensMul.doit.<locals>.<listcomp>.  s%   ø€ Ð<Ð<Ð<˜ s¨d¬mÒ';Ð';�Ð';Ð';Ð';r3   c                ó   — | |z  S r_   r2   ©rÖ   Úbs     r4   rE   zTensMul.doit.<locals>.<lambda>1  s
   €  A a¡C€ r3   c                ó<   — g | ]}t          |t          ¦  «        °|‘ŒS r2   r  r  s     r4   rY   z TensMul.doit.<locals>.<listcomp>1  s)   € Ð)_Ð)_Ð)_°#ÅZÐPSÕU]ÑE^ÔE^Ð)_¨#Ð)_Ð)_Ð)_r3   c                ó<   — g | ]}t          |t          ¦  «        ¯|‘ŒS r2   r  r  s     r4   rY   z TensMul.doit.<locals>.<listcomp>2  s'   € ÐAÐAÐA˜¥z°#µxÑ'@Ô'@ÐA�ÐAÐAÐAr3   r   rf   c                ó   — g | ]	}|j         ‘Œ
S r2   rT   rV   s     r4   rY   z TensMul.doit.<locals>.<listcomp>B  rZ   r3   r/  r@   )r.  r—  r  rß  r  Ú_dedupe_indices_in_ruler   r   rz  rL   rf  rê  r  r   r>   rè  r+  r  rH   rI   rM   r„  )rO   r	  r¾   ri  r  r!  rK   rH   rI   rJ   r�  r§  rd  s   ``          @r4   rD  zTensMul.doit  sï  øøø€ ØÔ'ˆØ�yŠy˜ Ñ&Ô&ˆØð 	Ø;Ð;Ð;Ð;°´Ð;Ñ;Ô;ˆDðõ �˜DœI tÑ,Ô,Ñ-Ô-ˆDØ×/Ò/°Ñ5Ô5ˆDØ/Ð/Ð/Ð/ T¤YÐ/Ñ/Ô/ˆDˆDð ”9ˆDà<Ð<Ð<Ð<˜tÐ<Ñ<Ô<ˆõ Ð'Ð'Ð)_Ð)_¸Ð)_Ñ)_Ô)_ÕabÔafÑgÔgˆØAÐA˜tÐAÑAÔAˆåˆt‰9Œ9˜Š>ˆ>ØˆLà�D”MÒ!Ð!Ø�7˜T‘>ˆDØ�AŠ:ˆ:Ý”6ˆMåˆt‰9Œ9˜Š>ˆ>Ø˜”7ˆNå#*×#DÒ#DÀTÑ#JÔ#JÑ ˆˆg�t˜Sð =Ð<°GÐ<Ñ<Ô<ˆÝ)¨$°°[À'ÐT_Ð`Ñ`Ô`ˆàˆdŒi˜ÐˆØ&ˆÔØ.ˆÔÝ˜CÔ0Ô5Ñ6Ô6¸½3¸sÔ?SÔ?WÑ;XÔ;XÑ9XÑXˆŒØˆŒ
Ø&ˆÔØˆ
r3   c                ó~   — t          | gt                                |||¦  «        ¢R i |¤Ž                     d¬¦  «        S rg  )r  Ú%_get_tensors_from_components_free_dumrD  )r!  rb   rH   rI   rÿ  s        r4   Ú	from_datazTensMul.from_dataO  sP   € å�uÐo�w×LÒLÈZÐY]Ð_bÑcÔcÐoÐoÐoÐgnÐoÐo×tÒtÐzÐtñ  Aô  Að  	Ar3   c                óú   — t                                | ||¦  «        }|                     ¦   «         }d„ | D ¦   «         }d}t          | ¦  «        D ],\  }}|}	||j        z  }t          |||	|…         ¦  «        ||<   Œ-|S )zv
        Get a list of ``Tensor`` objects by distributing ``free`` and ``dum`` indices on the ``components``.
        c                ó   — g | ]}d ‘ŒS r_   r2   rV   s     r4   rY   zATensMul._get_tensors_from_components_free_dum.<locals>.<listcomp>Z  s   € Ð,Ð,Ð,˜A�4Ð,Ð,Ð,r3   r   )r>   rd   rv   ri   rÂ   rý   )
rb   rH   rI   r�  rK   Útensorsr^  rX   rc   r_  s
             r4   ro  z-TensMul._get_tensors_from_components_free_dumS  s™   € õ
 *×BÒBÀ:ÈtÐUXÑYÔYˆØ!×-Ò-Ñ/Ô/ˆØ,Ð, Ð,Ñ,Ô,ˆð ˆÝ% jÑ1Ô1ð 	Fð 	F‰LˆAˆyØˆHØ�y”~Ñ%ˆGÝ 	¨7°8¸GÐ3CÔ+DÑEÔEˆG�A‰JˆJØˆr3   c                ó$   — d„ | j         D ¦   «         S )Nc                ó   — h | ]
}|d          ’ŒS r�   r2   rV   s     r4   r¯  z0TensMul._get_free_indices_set.<locals>.<setcomp>e  s   € Ð(Ð(Ð(˜��!”Ð(Ð(Ð(r3   rº  ru   s    r4   r¡  zTensMul._get_free_indices_setd  s   € Ø(Ð(˜dœiÐ(Ñ(Ô(Ð(r3   c                ó¨   ‡— t          t          j        | j        Ž ¦  «        Šˆfd„t	          | j                             ¦   «         ¦  «        D ¦   «         S )Nc                ó"   •— h | ]\  }}|‰v ¯	|’ŒS r2   r2   r²  s      €r4   r¯  z1TensMul._get_dummy_indices_set.<locals>.<setcomp>i  s)   ø€ ÐcÐcÐc™˜˜3ÐTUÐYbÐTbÐTb�ÐTbÐTbÐTbr3   )r  r´  rµ  rI   ri   r  rv   r¶  s    @r4   r¥  zTensMul._get_dummy_indices_setg  sJ   ø€ Ý�	œ¨¬Ð2Ñ3Ô3ˆ	ØcÐcÐcÐc¥)¨DÔ,A×,MÒ,MÑ,OÔ,OÑ"PÔ"PÐcÑcÔcÐcr3   c                óØ   — d„ t          | j        ¦  «        D ¦   «         }d}| j        D ]A}t          |t          ¦  «        sŒt          |j        ¦  «        D ]
}||||z   <   Œ||j        z  }ŒB|S )Nc                ó   — g | ]}d ‘ŒS r_   r2   rV   s     r4   rY   z<TensMul._get_position_offset_for_indices.<locals>.<listcomp>l  s   € Ð9Ð9Ð9˜q�dÐ9Ð9Ð9r3   r   )r»   r  r  rô   rü   )rO   Ú
arg_offsetÚcounterr  rÅ   s        r4   Ú _get_position_offset_for_indicesz(TensMul._get_position_offset_for_indicesk  sˆ   € Ø9Ð9¥E¨$¬-Ñ$8Ô$8Ð9Ñ9Ô9ˆ
ØˆØ”9ð 	$ð 	$ˆCÝ˜c¥8Ñ,Ô,ð ØÝ˜3œ<Ñ(Ô(ð 2ð 2�Ø*1�
˜1˜w™;Ñ'Ð'Ø�s”|Ñ#ˆGˆGØÐr3   c                ó>   — t          d„ | j        D ¦   «         ¦  «        S )Nc                ó   — g | ]
}|d          ‘ŒS r�   r2   rº   s     r4   rY   z%TensMul.free_args.<locals>.<listcomp>x  rÃ  r3   rž   ru   s    r4   r  zTensMul.free_argsv  rÄ  r3   c                ó6   — |                       | j        ¦  «        S r_   )r\  r  ru   s    r4   rb   zTensMul.componentsz  s   € à×-Ò-¨d¬iÑ8Ô8Ð8r3   c                ó~   ‡‡— |                       ¦   «         Š|                      ¦   «         Šˆˆfd„| j        D ¦   «         S )Nc                ó>   •— g | ]\  }}||‰|         z
  ‰|         f‘ŒS r2   r2   )rW   rÄ   rs   rz  Úargposs      €€r4   rY   z(TensMul.free_in_args.<locals>.<listcomp>‚  s1   ø€ ÐTÐTÐT¹J¸SÀ#��c˜* Sœ/Ñ)¨6°#¬;Ð7ÐTÐTÐTr3   )r|  Ú_get_indices_to_args_posrH   ©rO   rz  r‚  s    @@r4   r»  zTensMul.free_in_args~  sE   øø€ à×:Ò:Ñ<Ô<ˆ
Ø×.Ò.Ñ0Ô0ˆØTÐTÐTÐTÐTÈ$Ì)ÐTÑTÔTÐTr3   c                ó   — | j         S r_   r’  ru   s    r4   r!  zTensMul.coeff„  s   € ð Œ{Ðr3   c                ób   —  | j         g | j        ¢d| j        z  ‘R Ž                      d¬¦  «        S ©Nrf   Frh  )rè  r  r!  rD  ru   s    r4   rƒ  zTensMul.nocoeff‰  s8   € àˆtŒyÐ2˜$œ)Ð2 Q t¤z¡\Ð2Ð2Ð2×7Ò7¸UÐ7ÑCÔCÐCr3   c                ó~   ‡‡— |                       ¦   «         Š|                      ¦   «         Šˆˆfd„| j        D ¦   «         S )Nc                ó^   •— g | ])\  }}|‰|         z
  |‰|         z
  ‰|         ‰|         f‘Œ*S r2   r2   )rW   r¾  r¿  rz  r‚  s      €€r4   rY   z'TensMul.dum_in_args.<locals>.<listcomp>‘  sC   ø€ ÐfÐfÐfÑSYÐSUÐWY��J˜r”NÑ" B z°"¤~Ñ$5°v¸b´zÀ6È"Ä:ÐNÐfÐfÐfr3   )r|  rƒ  rI   r„  s    @@r4   rÀ  zTensMul.dum_in_args�  sG   øø€ à×:Ò:Ñ<Ô<ˆ
Ø×.Ò.Ñ0Ô0ˆØfÐfÐfÐfÐfÐ]aÔ]eÐfÑfÔfÐfr3   c                óè   — |dk    r| j         dk    S t          |¦  «        }t          |t          ¦  «        s| j        rJ ‚| j         |k    S |                      ¦   «         |                     ¦   «         k    S rB   )r!  r!   rô   rü   rb   rP   r¿  s     r4   r5  zTensMul.equals“  sl   € Ø�AŠ:ˆ:Ø”: ’?Ð"Ý˜‘”ˆÝ˜%¥Ñ*Ô*ð 	'Ø”Ð&Ð&Ð&Ø”: Ò&Ð&à�}Š}‰Œ %§.¢.Ñ"2Ô"2Ò2Ð2r3   c                ó   — | j         S )a+  
        Returns the list of indices of the tensor.

        Explanation
        ===========

        The indices are listed in the order in which they appear in the
        component tensors.
        The dummy indices are given a name which does not collide with
        the names of the free indices.

        Examples
        ========

        >>> from sympy.tensor.tensor import TensorIndexType, tensor_indices, tensor_heads
        >>> Lorentz = TensorIndexType('Lorentz', dummy_name='L')
        >>> m0, m1, m2 = tensor_indices('m0,m1,m2', Lorentz)
        >>> g = Lorentz.metric
        >>> p, q = tensor_heads('p,q', [Lorentz])
        >>> t = p(m1)*g(m0,m2)
        >>> t.get_indices()
        [m1, m0, m2]
        >>> t2 = p(m1)*g(-m1, m2)
        >>> t2.get_indices()
        [L_0, -L_0, m2]
        )r*  ru   s    r4   rv   zTensMul.get_indices�  s   € ð6 Œ}Ðr3   r—   r˜   c                ó4   — | j                              ¦   «         S )aÁ  
        Returns the list of free indices of the tensor.

        Explanation
        ===========

        The indices are listed in the order in which they appear in the
        component tensors.

        Examples
        ========

        >>> from sympy.tensor.tensor import TensorIndexType, tensor_indices, tensor_heads
        >>> Lorentz = TensorIndexType('Lorentz', dummy_name='L')
        >>> m0, m1, m2 = tensor_indices('m0,m1,m2', Lorentz)
        >>> g = Lorentz.metric
        >>> p, q = tensor_heads('p,q', [Lorentz])
        >>> t = p(m1)*g(m0,m2)
        >>> t.get_free_indices()
        [m1, m0, m2]
        >>> t2 = p(m1)*g(-m1, m2)
        >>> t2.get_free_indices()
        [m2]
        rÐ  ru   s    r4   r    zTensMul.get_free_indicesº  s   € ð2 Ô$×5Ò5Ñ7Ô7Ð7r3   r‰  rŠ  rü   c                ó:   ‡—  | j         ˆfd„| j        D ¦   «         Ž S )Nc                óh   •— g | ].}t          |t          ¦  «        r|                     ‰¦  «        n|‘Œ/S r2   rþ  rÿ  s     €r4   rY   z,TensMul._replace_indices.<locals>.<listcomp>Ö  s=   ø€ ÐqÐqÐqÐ`c½ÀCÍÑ9RÔ9RÐ[˜3×/Ò/°Ñ5Ô5Ð5ÐX[ÐqÐqÐqr3   rç  rŒ  s    `r4   r�  zTensMul._replace_indicesÕ  s+   ø€ ØˆtŒyÐqÐqÐqÐqÐgkÔgpÐqÑqÔqÐrÐrr3   c                ó¨   — | j         dk    r| gS g }d}| j         D ]7}t          |t          ¦  «        r|                     ||z  ¦  «         d}Œ2||z  }Œ8|S )aý  
        Returns a list of tensors, whose product is ``self``.

        Explanation
        ===========

        Dummy indices contracted among different tensor components
        become free indices with the same name as the one used to
        represent the dummy indices.

        Examples
        ========

        >>> from sympy.tensor.tensor import TensorIndexType, tensor_indices, tensor_heads, TensorSymmetry
        >>> Lorentz = TensorIndexType('Lorentz', dummy_name='L')
        >>> a, b, c, d = tensor_indices('a,b,c,d', Lorentz)
        >>> A, B = tensor_heads('A,B', [Lorentz]*2, TensorSymmetry.fully_symmetric(2))
        >>> t = A(a,b)*B(-b,c)
        >>> t
        A(a, L_0)*B(-L_0, c)
        >>> t.split()
        [A(a, L_0), B(-L_0, c)]
        r2   rf   )r  rô   rý   rm   )rO   Úsplitpr,  r  s       r4   r�   zTensMul.splitØ  sp   € ð0 Œ9˜Š?ˆ?Ø�6ˆMØˆØˆØ”9ð 	ð 	ˆCÝ˜#�vÑ&Ô&ð Ø—’˜c #™gÑ&Ô&Ð&Ø��à�s‘
��Øˆr3   c                ób   — d„ | j         D ¦   «         }t          d„ t          j        |Ž D ¦   «         Ž S )Nc                óZ   — g | ](}t          |t          t          f¦  «        r|j        n|f‘Œ)S r2   )rô   r   r  r  r  s     r4   rY   z,TensMul._eval_expand_mul.<locals>.<listcomp>ý  s3   € Ð^Ð^Ð^ÈS�Z¨­cµ7¨^Ñ<Ô<ÐH�”�À3À&Ð^Ð^Ð^r3   c                óH   — g | ]}t          |Ž                      d ¬¦  «        ‘Œ S )Frh  rt  rV   s     r4   rY   z,TensMul._eval_expand_mul.<locals>.<listcomp>þ  s@   € ð Mð Mð MØ-.�G�QˆK×Ò %ÐÑ(Ô(ðMð Mð Mr3   )r  r  r´  Úproduct)rO   r	  Úargs1s      r4   Ú_eval_expand_mulzTensMul._eval_expand_mulü  sO   € Ø^Ð^ÐTXÔT]Ð^Ñ^Ô^ˆÝð Mð MÝ2;Ô2CÀUÐ2KðMñ Mô Mð 
ð 	
r3   c                ól   — t          t          j        | | j        ¬¦  «                             d¬¦  «        S )Nr~  Frh  )r  r   ra  r.  rD  ru   s    r4   rñ  zTensMul.__neg__  s.   € Ý•q”} d¸Ô8IÐJÑJÔJ×OÒOÐUZÐOÑ[Ô[Ð[r3   c                ó”   — t          ¦   «          t          t          ¦  «        5  | j        |         cd d d ¦  «         S # 1 swxY w Y   d S r_   r7  r8  s     r4   rö   zTensMul.__getitem__  r:  rÇ  c                óÈ   — t          | j        ¦  «        }| j                             ¦   «         r0d}|d         t          j        k    r|dd …         }n|d          |d<   nd}||fS )Nr@  r   rf   r?  )r“   r  r!  Úcould_extract_minus_signr   ra  )rO   r  ræ  s      r4   Ú!_get_args_for_traditional_printerz)TensMul._get_args_for_traditional_printer
  sj   € Ý�D”I‰ŒˆØŒ:×.Ò.Ñ0Ô0ð 	àˆDØ�AŒw�!œ-Ò'Ð'Ø˜A˜B˜B”x��à œ7˜(��Q‘�àˆDØ�TˆzÐr3   c           	     óz  — d„ | j         D ¦   «         }d}t          |¦  «        dz
  }t          |¦  «        D ]ï}t          ||d¦  «        D ]Û}||dz
                                ||         ¦  «        }|dvrŒ+t	          t          ||dz
           j        j        ¦  «        d„ ¬¦  «        }t	          t          ||         j        j        ¦  «        d„ ¬¦  «        }|||dz
           j        j        f|||         j        j        fk    r"||         ||dz
           c||dz
  <   ||<   |r| }ŒÜŒð|| j	        z  }	|	dk    r|	g|z   S |S )zû
        Returns the ``args`` sorted according to the components commutation
        properties.

        Explanation
        ===========

        The sorting is done taking into account the commutation group
        of the component tensors.
        c                ó<   — g | ]}t          |t          ¦  «        ¯|‘ŒS r2   r  r  s     r4   rY   z<TensMul._sort_args_for_sorted_components.<locals>.<listcomp>"  s'   € ÐDÐDÐD�c­*°S½(Ñ*CÔ*CÐDˆcÐDÐDÐDr3   rf   rà   rá   c                ó   — | j         S r_   r¾  rC   s    r4   rE   z:TensMul._sort_args_for_sorted_components.<locals>.<lambda>+  s
   € ÐPQÔPV€ r3   rF   c                ó   — | j         S r_   r¾  rC   s    r4   rE   z:TensMul._sort_args_for_sorted_components.<locals>.<lambda>,  s   € ÈaÌf€ r3   )
r  rL   r»   r6  rŸ   r  rc   rJ   rj   r!  )
rO   Úcvræ  rn   rX   rÅ   r�  r~   Útyp2r!  s
             r4   Ú _sort_args_for_sorted_componentsz(TensMul._sort_args_for_sorted_components  sf  € ð EÐD˜TœYÐDÑDÔDˆØˆÝ�‰GŒG�a‰KˆÝ�q‘”ð 	%ð 	%ˆAÝ˜1˜a ‘_”_ð %ð %�Ø�q˜‘s”G×)Ò)¨"¨Q¬%Ñ0Ô0�à˜F�?�?ØÝ�c " Q q¡S¤'Ô"3Ô"?Ñ@Ô@ÐFVÐFVÐWÑWÔW�Ý�c " Q¤%¤/Ô"=Ñ>Ô>ÐDTÐDTÐUÑUÔU�Ø˜"˜Q˜q™Sœ'Ô+Ô0Ð1°T¸2¸a¼5¼?Ô;OÐ4PÒPÐPØ%'¨¤U¨B¨q°©s¬G�N�B�q˜‘s‘G˜R ™Uàð %Ø $˜u˜øð%ð �t”zÑ!ˆØ�AŠ:ˆ:Ø�7˜R‘<ÐØˆ	r3   c                ó`   — t          |                      ¦   «         Ž                      d¬¦  «        S )zB
        Returns a tensor product with sorted components.
        Frh  )r  r¢  rD  ru   s    r4   rÍ  zTensMul.sorted_components8  s,   € õ ˜×=Ò=Ñ?Ô?Ð@×EÒEÈ5ÐEÑQÔQÐQr3   Fc                ó&   — t          | ||¬¦  «        S )z˜
        Returns the tensor corresponding to the permutation ``g``

        For further details, see the method in ``TIDS`` with the same name.
        r~  rÇ  rÈ  s      r4   rÈ   zTensMul.perm2tensor>  s   € õ ˜4 °Ð<Ñ<Ô<Ð<r3   c                óÈ  — | j         r| S |                      ¦   «         }t          |t          ¦  «        r|                     ¦   «         S |j        s|S |                     d¬¦  «        }|                     ¦   «         }|j         	                    ¦   «         \  }}}t          |j        ¦  «        }t          |||g|¢R Ž }|dk    rt          j        S |                     |d¦  «        }|S )a†  
        Canonicalize using the Butler-Portugal algorithm for canonicalization
        under monoterm symmetries.

        Examples
        ========

        >>> from sympy.tensor.tensor import TensorIndexType, tensor_indices, TensorHead, TensorSymmetry
        >>> Lorentz = TensorIndexType('Lorentz', dummy_name='L')
        >>> m0, m1, m2 = tensor_indices('m0,m1,m2', Lorentz)
        >>> A = TensorHead('A', [Lorentz]*2, TensorSymmetry.fully_symmetric(-2))
        >>> t = A(m0,-m1)*A(m1,-m0)
        >>> t.canon_bp()
        -A(L_0, L_1)*A(-L_0, -L_1)
        >>> t = A(m0,-m1)*A(m1,-m2)*A(m2,-m0)
        >>> t.canon_bp()
        0
        Frh  r   T)r.  r0  rô   r  rP   rb   rD  rÍ  r  r®   rë   r   r   rê  rÈ   )	rO   r«  rè   r½   rÔ   r×   ré   rÊ  Útmuls	            r4   rP   zTensMul.canon_bpF  sß   € ð& Ôð 	ØˆKØ�{Š{‰}Œ}ˆÝ�d�GÑ$Ô$ð 	#Ø—=’=‘?”?Ð"ØŒð 	ØˆKØ�yŠy˜eˆyÑ$Ô$ˆØ×"Ò"Ñ$Ô$ˆØÔ-×@Ò@ÑBÔBÑˆˆ7�DÝ! !¤,Ñ/Ô/ˆÝ˜1˜g tÐ0¨aÐ0Ð0Ð0ˆØ�!Š8ˆ8Ý”6ˆMØ�}Š}˜S $Ñ'Ô'ˆØˆr3   c                ó0   — |                       |¦  «        }|S r_   rA  )rO   r¶  rè   s      r4   r=  zTensMul.contract_deltaj  s   € Ø× Ò  Ñ'Ô'ˆØˆr3   c                óÞ   — i }d}t          | j        ¦  «        D ]S\  }}t          |t          ¦  «        sŒt          |t          ¦  «        sJ ‚t          |j        ¦  «        D ]}|||<   |dz  }ŒŒT|S )zU
        Get a dict mapping the index position to TensMul's argument number.
        r   rf   )ri   r  rô   rü   rý   r»   r  )rO   Úpos_mapÚpos_counterÚarg_ir  rX   s         r4   rƒ  z TensMul._get_indices_to_args_posn  s‘   € ð ˆØˆÝ# D¤IÑ.Ô.ð 	!ð 	!‰JˆE�3Ý˜c¥8Ñ,Ô,ð ØÝ˜c¥6Ñ*Ô*Ð*Ð*Ð*Ý˜3œ<Ñ(Ô(ð !ð !�Ø',�˜Ñ$Ø˜qÑ ��ð!ð ˆr3   c                óà  ‡‡‡‡‡‡‡— |                       ¦   «                              d¬¦  «        }| |k    rt          |¦  «        }t          |‰¦  «        S |                      ¦   «         Št          | j        ¦  «        }‰j        t           	                    d¦  «        k    rd}nS‰j        t           	                    d¦  «        k    rd}n-‰j        t           
                    d¦  «        k    rd}nt          ‚ˆfd„t          | j        ¦  «        D ¦   «         }|s| S d}| j        dd…         }| j        dd…         }t          ¦   «         Š|D �]TŠ‰‰v rŒˆˆfd	„|D ¦   «         Šˆˆfd
„|D ¦   «         Š‰sŒ)‰                     ‰¦  «         d|‰<   t#          ‰¦  «        dk    rê|sd‰\  }	}
‰|	d                  ‰k    r	|	d         }n|	d         }‰|
d                  ‰k    r	|
d         }n|
d         }|                     ||f¦  «         �n|‰\  }	}
‰|	d                  ‰k    r|	d         }|	d         dk    r| }n|	d         }|	d         dk    r| }‰|
d                  ‰k    r|
d         }| }n|
d         }|                     ||f¦  «         nøt#          ‰¦  «        dk    rå|si‰d         \  }}‰|         ‰|         k    r‰j        d         }||j        z  }n®‰|         ‰k    r|}n|}‰d         \  }}|                     ||f¦  «         nz‰d         \  }}‰|         ‰|         k    r!‰j        d         }||j        z  }||k     r| }n<‰|         ‰k    r|}|dk    r| }n|}‰d         \  }}|                     ||f¦  «         ˆfd„|D ¦   «         }ˆfd„|D ¦   «         }�ŒVd}dgt#          |¦  «        z  Št+          t#          |¦  «        ¦  «        D ]}|‰v r|dz  }Œ|‰|<   Œˆˆˆfd„|D ¦   «         }ˆˆˆfd„|D ¦   «         }|t-          |Ž z                       d¬¦  «        }t/          |t0          ¦  «        s|S t2                               |j        ||¦  «        }|                     |¦  «        S )aá  
        Raise or lower indices with the metric ``g``.

        Parameters
        ==========

        g : metric

        Notes
        =====

        See the ``TensorIndexType`` docstring for the contraction conventions.

        Examples
        ========

        >>> from sympy.tensor.tensor import TensorIndexType, tensor_indices, tensor_heads
        >>> Lorentz = TensorIndexType('Lorentz', dummy_name='L')
        >>> m0, m1, m2 = tensor_indices('m0,m1,m2', Lorentz)
        >>> g = Lorentz.metric
        >>> p, q = tensor_heads('p,q', [Lorentz])
        >>> t = p(m0)*q(m1)*g(-m0, -m1)
        >>> t.canon_bp()
        metric(L_0, L_1)*p(-L_0)*q(-L_1)
        >>> t.contract_metric(g).canon_bp()
        p(L_0)*q(-L_0)
        Frh  rÌ   rf   r@   r   Nc                óZ   •— g | ]'\  }}t          |t          ¦  «        ¯|j        ‰k    ¯%|‘Œ(S r2   )rô   rý   rc   )rW   rX   rD   r½   s      €r4   rY   z+TensMul.contract_metric.<locals>.<listcomp>«  s;   ø€ ÐaÐaÐa‘d�a˜µjÀÅFÑ6KÔ6KÐaÐPQÔP[Ð_`ÒP`ÐP`�ÐP`ÐP`ÐP`r3   c                ó8   •— g | ]}‰|d                   ‰k    ¯|‘ŒS r*  r2   ©rW   rD   Úgposxr©  s     €€r4   rY   z+TensMul.contract_metric.<locals>.<listcomp>¸  s+   ø€ Ð?Ð?Ð?˜1¨°°!´¬¸Ò(>Ð(>�QÐ(>Ð(>Ð(>r3   c                ó\   •— g | ](}‰|d                   ‰k    s‰|d                  ‰k    ¯&|‘Œ)S rá   r2   r¯  s     €€r4   rY   z+TensMul.contract_metric.<locals>.<listcomp>¹  s>   ø€ ÐWÐWÐW˜! g¨a°¬d¤m°uÒ&<Ð&<ÀÈÈ!ÌÄÐQVÒ@VÐ@V�AÐ@VÐ@VÐ@Vr3   c                ó   •— g | ]}|‰v¯|‘Œ	S r2   r2   )rW   rD   r   s     €r4   rY   z+TensMul.contract_metric.<locals>.<listcomp>  s   ø€ Ð3Ð3Ð3˜ Q¨d ] ]�1 ] ] ]r3   c                ó   •— g | ]}|‰v¯|‘Œ	S r2   r2   )rW   rD   Úfree1s     €r4   rY   z+TensMul.contract_metric.<locals>.<listcomp>  s   ø€ Ð6Ð6Ð6˜! q° ~ ~�A ~ ~ ~r3   c                óP   •— g | ]"\  }}‰|         ‰v¯||‰‰|                  z
  f‘Œ#S r2   r2   )rW   rÄ   r¬  Úelimr©  Úshiftss      €€€r4   rY   z+TensMul.contract_metric.<locals>.<listcomp>  s?   ø€ Ð]Ð]Ð]±(°3¸ÀgÈaÄjÐX\ÐF\ÐF\��a˜& ¨¤Ô,Ñ,Ð-ÐF\ÐF\ÐF\r3   c                ó‚   •— g | ];\  }}‰|         ‰v¯‰|         ‰v¯|‰‰|                  z
  |‰‰|                  z
  f‘Œ<S r2   r2   )rW   Úp0r¾  r¶  r©  r·  s      €€€r4   rY   z+TensMul.contract_metric.<locals>.<listcomp>  s‡   ø€ ð  Nð  Nð  NÉÈÈBÐY`ÐacÔYdÐlpÐYpÐYpÐu|Ð}ô  vAð  IMð  vMð  vM��V˜G BœKÔ(Ñ(¨"¨v°g¸b´kÔ/BÑ*BÐCð  vMð  vMð  vMr3   )r0  rD  rP   rB  rƒ  r“   r  rÍ   rÎ   rÏ   r³  r  ri   rI   rH   r  rà  rL   rm   rJ   rG  r»   r  rô   rü   r>   rd   rb   r©  )rO   r½   r«  r  r  Úgposræ  rI   rH   Údum10Údum11r¹  r¾  r  r  rp   rÄ   r¬  ÚshiftrX   r,  r¨  r   r¶  r´  r°  r©  r·  s    `                    @@@@@@r4   rB  zTensMul.contract_metric}  sU  øøøøøøø€ ð8 �{Š{‰}Œ}×!Ò! uÐ!Ñ-Ô-ˆØ�4Š<ˆ<Ý˜D‘>”>ˆDÝ" 4¨Ñ+Ô+Ð+Ø×/Ò/Ñ1Ô1ˆÝ�D”I‰Œˆð Œ:�×7Ò7¸Ñ;Ô;Ò;Ð;ØˆGˆGØŒZ�>×9Ò9¸!Ñ<Ô<Ò<Ð<ØˆGˆGØŒZ�>×5Ò5°aÑ8Ô8Ò8Ð8ØˆGˆGå%Ð%ð bÐaÐaÐa�i¨¬	Ñ2Ô2ÐaÑaÔaˆØð 	ØˆKð ˆØŒh�q�q�qŒkˆØŒy˜˜˜Œ|ˆÝ‰uŒuˆØð Y	7ñ Y	7ˆEØ˜ˆ}ˆ}ØØ?Ð?Ð?Ð?Ð? Ð?Ñ?Ô?ˆEØWÐWÐWÐWÐW˜sÐWÑWÔWˆDØð ØØ�HŠH�U‰OŒOˆOàˆD�‰KÝ�4‰yŒy˜AŠ~ˆ~Øð &)Ø#'‘L�E˜5Ø˜u QœxÔ(¨EÒ1Ð1à" 1œX˜˜ð # 1œX˜Ø˜u QœxÔ(¨EÒ1Ð1à" 1œX˜˜ð # 1œX˜à—J’J  B˜xÑ(Ô(Ð(Ñ(à#'‘L�E˜5ð ˜u QœxÔ(¨EÒ1Ð1à" 1œX˜Ø  œ8 qš=˜=Ø$( 5˜Døð # 1œX˜Ø  œ8 qš=˜=Ø$( 5˜DØ˜u QœxÔ(¨EÒ1Ð1à" 1œX˜Ø $˜u˜˜ð # 1œX˜à—J’J  B˜xÑ(Ô(Ð(Ð(å�T‘”˜a’�Øð #/Ø# Aœw‘H�C˜Ø˜s”| w¨s¤|Ò3Ð3àœm¨AÔ.˜Ø# C¤G™|˜˜ð # 3œ<¨5Ò0Ð0Ø!$˜B˜Bà!$˜Bà!& q¤™˜˜QØŸš S¨" IÑ.Ô.Ð.Ð.à# Aœw‘H�C˜Ø˜s”| w¨s¤|Ò3Ð3àœm¨AÔ.˜Ø# C¤G™|˜à š9˜9à$( 5˜Døð # 3œ<¨5Ò0Ð0Ø!$˜BØ" ašx˜xØ(, u øà!$˜BØ!& q¤™˜˜QØŸš S¨" IÑ.Ô.Ð.Ø3Ð3Ð3Ð3˜cÐ3Ñ3Ô3ˆCØ6Ð6Ð6Ð6˜tÐ6Ñ6Ô6ˆD‰Dð ˆØ�•S˜‘Y”Y‘ˆÝ•s˜4‘y”yÑ!Ô!ð 	ð 	ˆAØ�DˆyˆyØ˜‘
�ØØˆF�1‰IˆIØ]Ð]Ð]Ð]Ð]Ð]¸dÐ]Ñ]Ô]ˆð Nð  Nð  Nð  Nð  Nð  NÐRUð  Nñ  Nô  Nˆà•W˜d�^Ñ#×*Ò*°Ð*Ñ6Ô6ˆÝ˜#�xÑ(Ô(ð 	ØˆJÝ×5Ò5°c´nÀdÈCÑPÔPˆØ×+Ò+¨BÑ/Ô/Ð/r3   c                óD   — |                      ¦   «         } | j        |d|iŽS r¤  r¥  r§  s       r4   r©  z TensMul._set_new_index_structure!  rª  r3   r~  c               óˆ  — t          |¦  «        | j        k    rt          d¦  «        ‚t          | j        ¦  «        }d}t          |¦  «        D ]V\  }}t          |t          ¦  «        sŒt          |t          ¦  «        sJ ‚|j        } |j	        ||||z   …         Ž ||<   ||z  }ŒWt          |d|iŽ                     d¬¦  «        S )Nr¬  r   r¾   Frh  )rL   r  rl   r“   r  ri   rô   rü   rý   r¦  r  rD  )	rO   r¾   rK   rÿ  r  rs   rX   r  r  s	            r4   r¦  zTensMul._set_indices%  sÑ   € Ýˆw‰<Œ<˜4œ=Ò(Ð(ÝÐ6Ñ7Ô7Ð7Ý�D”I‰ŒˆØˆÝ ‘o”oð 	ð 	‰FˆAˆsÝ˜c¥8Ñ,Ô,ð ØÝ˜c¥6Ñ*Ô*Ð*Ð*Ð*Ø”|ˆHØ&�cÔ&¨°°C¸±LÐ0@Ô(AÐBˆD�‰GØ�8‰OˆCˆCÝ˜Ð6¨+Ð6Ð6×;Ò;ÀÐ;ÑGÔGÐGr3   c                ój   — | D ]/}t          |t          ¦  «        sŒt          |t          ¦  «        sJ ‚Œ0d S r_   )rô   rü   rý   )r  rH   rI   r  s       r4   Ú&_index_replacement_for_contract_metricz.TensMul._index_replacement_for_contract_metric3  sI   € àð 	+ð 	+ˆCÝ˜c¥8Ñ,Ô,ð ØÝ˜c¥6Ñ*Ô*Ð*Ð*Ð*Ð*ð	+ð 	+r3   c                ó¼   — g }| j         D ]6}t          |t          ¦  «        r
 |j        |Ž }|                     |¦  «         Œ7t          |Ž                      d¬¦  «        S rg  )r  rô   rü   r�  rm   r  rD  rD  s       r4   r�  zTensMul.substitute_indices:  rE  r3   c                ól  — t          ¦   «          | j        }t          |¦  «        }d„ |D ¦   «         d„ |D ¦   «         k    rt          d¦  «        ‚||k    r| S  | j        t          t          ||¦  «        ¦  «        Ž }t          d„ |D ¦   «         ¦  «        t          |¦  «        k    r |j        |j        Ž S |S )Nc                ó   — g | ]	}|j         ‘Œ
S r2   rT   rº   s     r4   rY   z$TensMul.__call__.<locals>.<listcomp>F  r'  r3   c                ó   — g | ]	}|j         ‘Œ
S r2   rT   rº   s     r4   rY   z$TensMul.__call__.<locals>.<listcomp>F  r)  r3   r*  c                ó&   — h | ]}|j         r|n| ’ŒS r2   rù   rV   s     r4   r¯  z#TensMul.__call__.<locals>.<setcomp>N  rõ  r3   rö  r÷  s       r4   rz  zTensMul.__call__B  rø  r3   c                ó®  ‡— t          ˆfd„| j        D ¦   «         Ž \  }}t          t          j        d„ | j        D ¦   «         t
          j        ¦  «        }t                               |¦  «        \  }}}}t           	                    |¦  «        }	| j
        }
|                     d„ ¬¦  «         d„ |D ¦   «         }||t                               ||	|
¦  «        z  fS )Nc                ód   •— g | ],}t          |t          ¦  «        ¯|                     ‰¦  «        ‘Œ-S r2   rI  rJ  s     €r4   rY   z)TensMul._extract_data.<locals>.<listcomp>S  s:   ø€ Ð${Ð${Ð${ÈSÕakÐloÕqyÑazÔazÐ${ S×%6Ò%6Ð7GÑ%HÔ%HÐ${Ð${Ð${r3   c                ó<   — g | ]}t          |t          ¦  «        °|‘ŒS r2   r  ræ  s     r4   rY   z)TensMul._extract_data.<locals>.<listcomp>T  s(   € Ð%ZÐ%ZÐ%Z¨AÅ*ÈQÕPXÑBYÔBYÐ%Z aÐ%ZÐ%ZÐ%Zr3   c                ó   — | d         S r›   r2   rC   s    r4   rE   z'TensMul._extract_data.<locals>.<lambda>X  s
   €   !¤€ r3   rF   c                ó   — g | ]
}|d          ‘ŒS r�   r2   rV   s     r4   rY   z)TensMul._extract_data.<locals>.<listcomp>Y  s   € Ð+Ð+Ð+ ˜˜!œÐ+Ð+Ð+r3   )r  r  r   ÚoperatorÚmulr   rz  r  rF  rM  r  rN   rí   r  )rO   r¾  rN  r,  r!  rK   rH   rE  rA  rI   r  rû  s    `          r4   rÕ  zTensMul._extract_dataR  s×   ø€ Ý"Ð${Ð${Ð${Ð${ÐTXÔT]Ð${Ñ${Ô${Ð|Ñˆ�fÝ•x”|Ð%ZÐ%Z°´Ð%ZÑ%ZÔ%ZÕ\]Ô\aÑbÔbˆÝ07×0LÒ0LÈ\Ñ0ZÔ0ZÑ-ˆ��z :Ý×(Ò(¨Ñ4Ô4ˆØ”=ˆØ�	Š	�n�nˆ	Ñ%Ô%Ð%Ø+Ð+ dÐ+Ñ+Ô+ˆØ˜UÕ#;×#MÒ#MÈfÐVYÐ[cÑ#dÔ#dÑdÐdÐdr3   c                ó¸   — t          ¦   «          t          t          ¦  «        5  t          |                      ¦   «                  }d d d ¦  «         n# 1 swxY w Y   |S r_   rQ  )rO   rõ   s     r4   rÿ   zTensMul.data\  sš   € åÑÔÐÝÕ4Ñ5Ô5ð 	@ð 	@Ý0°·²±´Ô?ˆCð	@ð 	@ð 	@ñ 	@ô 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@øøøð 	@ð 	@ð 	@ð 	@àˆ
s   £ AÁAÁAc                ó<   — t          ¦   «          t          d¦  «        ‚)Nz9Not possible to set component data to a tensor expression©r5   rl   rP  s     r4   rÿ   zTensMul.datac  s   € åÑÔÐÝÐTÑUÔUÐUr3   c                ó<   — t          ¦   «          t          d¦  «        ‚)Nz<Not possible to delete component data to a tensor expressionrÐ  ru   s    r4   rÿ   zTensMul.datah  s   € åÑÔÐÝÐWÑXÔXÐXr3   c                óØ   — t          ¦   «          t          t          ¦  «        5  | j        €t	          d¦  «        ‚| j                             ¦   «         cd d d ¦  «         S # 1 swxY w Y   d S rU  )r5   r'   r&   rÿ   rl   rV  ru   s    r4   rV  zTensMul.__iter__m  s©   € ÝÑÔÐÝÕ4Ñ5Ô5ð 	(ð 	(ØŒyÐ Ý Ð!CÑDÔDÐDØ”9×%Ò%Ñ'Ô'ð	(ð 	(ð 	(ð 	(ñ 	(ô 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(øøøð 	(ð 	(ð 	(ð 	(ð 	(ð 	(s   £/AÁA#Á&A#c                óŠ  — t          |¦  «        }t          t          | ¦  «        ¦  «        }t          t          | ¦  «        ¦  «        }|                     |¦  «        }t	          |¦  «        dk    rdS 	 |                     |¦  «         |                     |¦  «         d„ |D ¦   «         }t                               |¦  «        }i }|D ]Q}| |                     ¦   «         v rŒ ||j	        ¦  «        }	 |j
        |	g|j        dd…         ¢R Ž }
|
||<   |
 || <   ŒRt	          |¦  «        dk    rdS |                      |¦  «        }|S )zè
        exclude: set
        new: TensExpr

        If ``new`` has any dummy indices that are in ``exclude``, return a version
        of new with those indices replaced. If no replacements are needed,
        return None

        r   Nc                ó   — g | ]}|d f‘ŒS r_   r2   rV   s     r4   rY   z+TensMul._dedupe_indices.<locals>.<listcomp>Ž  s   € Ð6Ð6Ð6¨˜A˜t˜9Ð6Ð6Ð6r3   rf   )r  r"  r    r'  rL   r   r>   rx   rh  rU   rè  r  r�  )rm  r2  Údums_newÚfree_newÚ	conflictsÚexclude_for_genrÜ  r‰  ÚdÚnewnameÚnew_dÚnew_renameds               r4   r)  zTensMul._dedupe_indicest  s[  € õ �g‘,”,ˆÝÕ(¨Ñ-Ô-Ñ.Ô.ˆÝÕ'¨Ñ,Ô,Ñ-Ô-ˆà×)Ò)¨'Ñ2Ô2ˆ	Ýˆy‰>Œ>˜QÒÐØ�4ð	ð
 	�Š�xÑ Ô Ð Ø�Š�xÑ Ô Ð Ø6Ð6¨gÐ6Ñ6Ô6ˆÝ×>Ò>¸ÑOÔOˆØˆØð 	ð 	ˆAØˆr�T—Y’Y‘[”[Ð Ð ØØ�c˜!Ô-Ñ.Ô.ˆGØ�A”F˜7Ð0 Q¤V¨A¨B¨B¤ZÐ0Ð0Ð0ˆEØˆD�‰GØ�vˆD�!�‰HˆHåˆt‰9Œ9˜Š>ˆ>Ø�4à×*Ò*¨4Ñ0Ô0ˆØÐr3   c                ód  ‡— d„ |                      ¦   «         D ¦   «         Šˆfd„|                      ¦   «         D ¦   «         }t          |                      ¦   «         ¦  «        }i }|                     ‰¦  «         |                     ‰                     ¦   «         ¦  «         |                     ‰                     ¦   «         ¦  «         |                      ¦   «         D ]U\  }}t                               ||¦  «        }||k    s|€|||<   Œ.|||<   |                     t          |¦  «        ¦  «         ŒV|S )zb
        rule: dict

        This applies TensMul._dedupe_indices on all values of rule.

        c                óD   — i | ]\  }}t          |t          ¦  «        ¯||“ŒS r2   ©rô   ry   )rW   rÍ  ré   s      r4   r  z3TensMul._dedupe_indices_in_rule.<locals>.<dictcomp>¦  s-   € ÐQÐQÐQ™s˜q µjÀÅKÑ6PÔ6PÐQ�q˜ÐQÐQÐQr3   c                óH   •— i | ]\  }}|‰                      ¦   «         v¯||“ŒS r2   ©rh  )rW   rÍ  ré   Úindex_ruless      €r4   r  z3TensMul._dedupe_indices_in_rule.<locals>.<dictcomp>§  s5   ø€ ÐRÐRÐR™s˜q °a¸{×?OÒ?OÑ?QÔ?QÐ6QÐ6Q�q˜Ð6QÐ6QÐ6Qr3   )rÔ  r  rv   r   rh  Úvaluesr  r)  )	rO   rd  Úother_rulesr2  Únewrulerl  rm  rÜ  râ  s	           @r4   rm  zTensMul._dedupe_indices_in_ruleŸ  s&  ø€ ð RÐQ d§j¢j¡l¤lÐQÑQÔQˆØRÐRÐRÐR d§j¢j¡l¤lÐRÑRÔRˆÝ�d×&Ò&Ñ(Ô(Ñ)Ô)ˆàˆØ�Š�{Ñ#Ô#Ð#Ø�Š�{×'Ò'Ñ)Ô)Ñ*Ô*Ð*Ø�Š�{×)Ò)Ñ+Ô+Ñ,Ô,Ð,Ø#×)Ò)Ñ+Ô+ð 	9ð 	9‰HˆC�Ý!×1Ò1°#°wÑ?Ô?ˆKØ�cŠzˆz˜[Ð0Ø"�˜‘�à*�˜‘Ø—’�{¨;Ñ7Ô7Ñ8Ô8Ð8Ð8Øˆr3   c                ó¾   — t          |t          ¦  «        sdS |h}|                      | |¦  «        }|€dS |                     ||¦  «                             d¬¦  «        S )zx
        If new is an index which is already present in self as a dummy, the dummies in self should be renamed.
        NFrh  )rô   ry   r)  Ú_subsrD  )rO   rl  rm  r2  Úself_renameds        r4   Ú
_eval_subszTensMul._eval_subs·  si   € õ
 ˜#�{Ñ+Ô+ð 	Ø�4à�%ˆØ×+Ò+¨D°'Ñ:Ô:ˆØÐØ�4à×%Ò% c¨3Ñ/Ô/×4Ò4¸%Ð4Ñ@Ô@Ð@r3   c                ó¼   ‡— ddl mŠ d„ |                      ¦   «         D ¦   «         }ˆfd„|D ¦   «         }t          j        |¦  «        }|                      ||¦  «        S )Nr   rÜ  c                ó(   — g | ]}|j         d          ‘ŒS r�   r­  rV   s     r4   rY   z4TensMul._eval_rewrite_as_Indexed.<locals>.<listcomp>È  r  r3   c                óN   •— g | ]!}t          |‰¦  «        r|j        d          n|‘Œ"S r�   )rô   r  )rW   r  rÝ  s     €r4   rY   z4TensMul._eval_rewrite_as_Indexed.<locals>.<listcomp>É  s2   ø€ ÐMÐMÐMÀ�z¨#¨sÑ3Ô3Ð<�”˜”�¸ÐMÐMÐMr3   )rà  rÝ  rv   r   rX  râ  )rO   r  r¦  rß  r«  rÝ  s        @r4   rY  z TensMul._eval_rewrite_as_IndexedÆ  sr   ø€ Ø1Ð1Ð1Ð1Ð1Ð1Ø?Ð?¨D×,<Ò,<Ñ,>Ô,>Ð?Ñ?Ô?ˆØMÐMÐMÐMÈÐMÑMÔMˆÝŒ|˜DÑ!Ô!ˆØ×"Ò" 4¨Ñ7Ô7Ð7r3   c           	     ó  — g }t          | j        ¦  «        D ]À\  }}t          |t          ¦  «        r|                     |¦  «        }n)|j        r|                     |¦  «        }nt          j        }|re| 	                    t                               | j        d |…         |fz   | j        |dz   d …         z   ¦  «                             d¬¦  «        ¦  «         ŒÁt                               |¦  «                             d¬¦  «        S r‡  )ri   r  rô   rü   r[  r\  r]  r   rê  rm   r  rX  rD  r  )rO   rë  ÚtermsrX   r  rÙ  s         r4   r[  z TensMul._eval_partial_derivativeÍ  sþ   € àˆÝ ¤	Ñ*Ô*ð 	jð 	j‰FˆAˆsõ ˜#�xÑ(Ô(ð Ø×0Ò0°Ñ3Ô3��ð ”;ð Ø×,Ò,¨QÑ/Ô/�A�Aåœ�AØð jØ—’�W×-Ò-¨d¬i¸¸¸¬m¸q¸dÑ.BÀTÄYÈqÐSTÉuÈvÈvÔEVÑ.VÑWÔW×\Ò\ÐbgÐ\ÑhÔhÑiÔiÐiøÝ×Ò Ñ&Ô&×+Ò+°Ð+Ñ7Ô7Ð7r3   Nc                ó"  ‡‡‡ ‡!‡"— t          |t          ¦  «        s.t          |t          t          f¦  «        rt          |¦  «        }ndS |€i }nM|                     ¦   «         }d„ |                     ¦   «         D ¦   «         Š ˆ fd„} || ¦  «        }  ||¦  «        }t          d„ d„ |j        D ¦   «         t          j	        ¦  «        }| |k    r|S t          t          | ¦  «        ¦  «        dk    r|                      |||¦  «        S d„ }t          | j        |¦  «        }t          |j        |¦  «        }d|                     ¦   «         v rDt          |d         Ž                      d	¬
¦  «        | j        k    rt#          d|d         › �¦  «        ‚d|                     ¦   «         v r?t          |d         Ž                      d	¬
¦  «        |k    rt#          d|d         › �¦  «        ‚d„ |d         D ¦   «         }	d„ |d         D ¦   «         }
|	                     |
¦  «        sdS t          |d         ¦  «        dk    �rŽ|d         d         Š"	 ‰"                     ¦   «         D �]g}|d         D �]ZŠt          |t          ¦  «        rd}nd}	 ||z                       ‰¦  «        }|€Œ9 | j        |gˆ"fd„| j        D ¦   «         ¢R Ž                      d	¬
¦  «        } |j        ˆfd„|j        D ¦   «         Ž                      d	¬
¦  «        }i }|                     |¦  «         |                     |¦  «         |                     ||¬¦  «        }|�zd}|                     ¦   «         D ]F}t          |t0          ¦  «        r/| |                     ¦   «         v r||          ||          k    rd	} nŒG|r|                     |¦  «         |c c S �Œ\�ŒidS g Š!|d         }t          |d         d„ d¬¦  «        \  }}|D ]Ý}t3          |                     ¦   «         ¦  «        }g }|D ]Q}|                     ¦   «         }d}|D ]Št7          ˆfd„|D ¦   «         ¦  «        rd	}Œ |r|                     |¦  «         ŒR|                     t          |Ž                      d	¬
¦  «        ¦  «        }|€ dS |D ]}‰!                     |¦  «         Œ|                     |¦  «         ŒÞˆ!fd„|d         D ¦   «         }t          |¦  «        dk    rT|d                              t          dg|¢R Ž                      d	¬
¦  «        ¦  «        }|€dS |                     |¦  «         nt          |¦  «        dk    rdS | j                             ||¬¦  «        }|€dS |                     |¦  «         |S )z�
        Match assuming all tensors commute. But note that we are not assuming anything about their symmetry under index permutations.
        Nc                ó<   — g | ]}t          |t          ¦  «        ¯|‘ŒS r2   rß  rÌ  s     r4   rY   z0TensMul._matches_commutative.<locals>.<listcomp>ó  s'   € ÐSÐSÐS˜Q½
À1ÅkÑ8RÔ8RÐS�qÐSÐSÐSr3   c                óF   •— t                                | ‰¦  «        }|�|S | S r_   )r  r)  )r«  ÚrenamedrK   s     €r4   Údedupez,TensMul._matches_commutative.<locals>.dedupeõ  s(   ø€ Ý!×1Ò1°$¸Ñ@Ô@�ØÐ&Ø"�Nà�Kr3   c                ó   — | |z  S r_   r2   rh  s     r4   rE   z.TensMul._matches_commutative.<locals>.<lambda>   s
   € ¨¨1©€ r3   c                ó<   — g | ]}t          |t          ¦  «        °|‘ŒS r2   r  r  s     r4   rY   z0TensMul._matches_commutative.<locals>.<listcomp>   s)   € Ð.iÐ.iÐ.i°sÍzÐZ]Õ_gÑOhÔOhÐ.i¨sÐ.iÐ.iÐ.ir3   r   c                óp   — t          | t          ¦  «        rdS t          | t          t          f¦  «        rdS dS )Nrb  rý   r!  )rô   rb  rý   rü   )r  s    r4   rl  z-TensMul._matches_commutative.<locals>.siftkey	  s:   € Ý˜#�zÑ*Ô*ð Ø#�|Ý˜C¥&­(Ð!3Ñ4Ô4ð Ø�xà�wr3   r!  Frh  z/Found something that we do not know to handle: c           	     óJ   — h | ] }t          t          |d g ¦  «        ¦  «        ’Œ!S ©rb   ©r¹   Úgetattrrº   s     r4   r¯  z/TensMul._matches_commutative.<locals>.<setcomp>  s,   € Ð`Ð`Ð`ÀA�E¥'¨!¨\¸2Ñ">Ô">Ñ?Ô?Ð`Ð`Ð`r3   rý   c           	     óJ   — h | ] }t          t          |d g ¦  «        ¦  «        ’Œ!S rø  rù  rº   s     r4   r¯  z/TensMul._matches_commutative.<locals>.<setcomp>  s,   € Ð^Ð^Ð^À1�5¥¨¨L¸"Ñ!=Ô!=Ñ>Ô>Ð^Ð^Ð^r3   rà   rf   c                ó    •— g | ]
}|‰k    ¯|‘ŒS r2   r2   )rW   rÖ   rx  s     €r4   rY   z0TensMul._matches_commutative.<locals>.<listcomp>7  s   ø€ Ð1XÐ1XÐ1X¸È!ÈxÊ-È-°!È-È-È-r3   c                ó    •— g | ]
}|‰k    ¯|‘ŒS r2   r2   )rW   rÖ   r|  s     €r4   rY   z0TensMul._matches_commutative.<locals>.<listcomp>8  s   ø€ Ð*JÐ*JÐ*J°À1ÈÂ6À6¨1À6À6À6r3   )rì  Trb  c                óL   — t          |                      ¦   «         ¦  «        dk    S rB   )rL   r    rC   s    r4   rE   z.TensMul._matches_commutative.<locals>.<lambda>N  s!   € ÍCÐPQ×PbÒPbÑPdÔPdÑLeÔLeÐijÒLj€ r3   )Úbinaryc              3  óF   •K  — | ]}|                      ‰¦  «        d u V — Œd S r_   )rt  )rW   rÅ   rX   s     €r4   r  z/TensMul._matches_commutative.<locals>.<genexpr>W  s2   øè è € ÐHÐH°A˜1Ÿ9š9 Q™<œ<¨4Ð/ÐHÐHÐHÐHÐHÐHr3   c                ó   •— g | ]}|‰v¯|‘Œ	S r2   r2   rn  s     €r4   rY   z0TensMul._matches_commutative.<locals>.<listcomp>f  s$   ø€ Ð^Ð^Ð^ QÀ1ÐL]ÐC]ÐC]˜qÐC]ÐC]ÐC]r3   rê  )rô   r  rü   r   rk  rã  r   r  r   rz  rL   rf  rí  r*   rh  rD  r!  r  Úissubsetrè  rë  rè  r   rt  ry   r  r    r  rm   )#rO   r«  rì  rl  ró  Ú
expr_coeffrl  rv  rw  Úquery_tens_headsÚexpr_tens_headsÚq_tensræ  rV  Ú	rem_queryÚrem_exprÚtmp_replÚrem_mÚinternally_consistentrÍ  r{  Úindexless_wildsÚwildsrk  Úfree_this_wildÚtensors_to_tryrè   rH   Úshares_indices_with_wildr=  r|  rX   rK   ro  rx  s#                                 @@@@@r4   Ú_matches_commutativezTensMul._matches_commutativeà  s¤  øøøøø€ õ
 ˜$¥Ñ(Ô(ð 	Ý˜$¥­4Ð 0Ñ1Ô1ð Ý˜t‘}”}��à�tð ÐØˆIˆIà!ŸšÑ(Ô(ˆIð TÐS )×"2Ò"2Ñ"4Ô"4ÐSÑSÔSˆGð ð  ð  ð  ð  ð �6˜$‘<”<ˆDØ�6˜$‘<”<ˆDõ Ð,Ð,Ð.iÐ.i¸d¼iÐ.iÑ.iÔ.iÕklÔkpÑqÔqˆ
ð �4Š<ˆ<ØÐå�z˜$ÑÔÑ Ô  AÒ%Ð%Ø×'Ò'¨¨i¸Ñ=Ô=Ð=ð	ð 	ð 	õ ˜DœI wÑ/Ô/ˆÝ˜4œ9 gÑ.Ô.ˆð �l×'Ò'Ñ)Ô)Ð)Ð)Ý˜ WÔ-Ð.×3Ò3¸Ð3Ñ?Ô?À4Ä:ÒMÐMÝ)Ð*sÐ\hÐipÔ\qÐ*sÐ*sÑtÔtÐtØ�k×&Ò&Ñ(Ô(Ð(Ð(Ý˜ GÔ,Ð-×2Ò2¸Ð2Ñ>Ô>À*ÒLÐLÝ)Ð*rÐ\gÐhoÔ\pÐ*rÐ*rÑsÔsÐsà`Ð`ÈÐV^ÔI_Ð`Ñ`Ô`ÐØ^Ð^ÈÐT\ÔH]Ð^Ñ^Ô^ˆØ×(Ò(¨Ñ9Ô9ð 	à�4õ ˆ|˜HÔ%Ñ&Ô&¨Ò*Ñ*Ø# HÔ-¨aÔ0ˆHðð #×9Ò9Ñ;Ô;ð -ñ -�Ø$ XÔ.ð -ñ -�AÝ! &­'Ñ2Ô2ð !à!˜˜à ˜ðð ˜f™×.Ò.¨qÑ1Ô1�AØ�yØ à ) ¤	¨$Ð YÐ1XÐ1XÐ1XÐ1X¸T¼YÐ1XÑ1XÔ1XÐ YÐ YÐ Y× ^Ò ^ÐdiÐ ^Ñ jÔ j�IØ(˜tœyÐ*JÐ*JÐ*JÐ*J°d´iÐ*JÑ*JÔ*JÐK×PÒPÐV[ÐPÑ\Ô\�HØ!�HØ—O’O IÑ.Ô.Ð.Ø—O’O AÑ&Ô&Ð&Ø%×-Ò-¨hÀ(Ð-ÑKÔK�EØÐ(à04Ð-Ø!&§¢¡¤ð *ð *˜AÝ)¨!­KÑ8Ô8ð *Ø$% 2¨¯ª©¬Ð#5Ð#5¸%ÀÀ¼)ÈÈaÌÀyÒ:PÐ:PØ<AÐ$9Ø$) EøØ0ð -Ø%×,Ò,¨UÑ3Ô3Ð3Ø#,Ð,Ð,Ð,Ð,Ð,ùñ=-ð@ �4ð ÐØ)¨(Ô3ÐÝ!% l°<Ô&@ÐBjÐBjÐswÐ!xÑ!xÔ!xÑˆ˜àð 	$ð 	$ˆAÝ  ×!3Ò!3Ñ!5Ô!5Ñ6Ô6ˆNØˆNØ(ð -ð -�Ø×)Ò)Ñ+Ô+�Ø+/Ð(Øð 9ð 9�AÝÐHÐHÐHÐH¸ÐHÑHÔHÑHÔHð 9à38Ð0øØ+ð -Ø"×)Ò)¨!Ñ,Ô,Ð,øà—	’	�' >Ð2×7Ò7¸UÐ7ÑCÔCÑEÔEˆAØˆyØ�t�tà*ð 3ð 3�DØ%×,Ò,¨TÑ2Ô2Ð2Ð2Ø× Ò  Ñ#Ô#Ð#Ð#ð _Ð^Ð^Ð^¨+°hÔ*?Ð^Ñ^Ô^ÐÝˆÑÔ !Ò#Ð#à  Ô#×+Ò+­W°QÐ-LÐ8KÐ-LÐ-LÐ-L×-QÒ-QÐW\Ð-QÑ-]Ô-]Ñ_Ô_ˆAØˆyØ�tà× Ò  Ñ#Ô#Ð#Ð#ÝÐ$Ñ%Ô%¨Ò)Ð)Ø�4ð ŒJ×Ò˜z¨sÐÑ3Ô3ˆØˆ9Ø�4à×Ò˜QÑÔÐàÐr3   c                óÞ   — t          |¦  «        }|€i }n|                     ¦   «         }t          d„ |j        D ¦   «         ¦  «        }|r|                      |||¦  «        S t          d¦  «        ‚)Nc              3  ó`   K  — | ])}t          |t          ¦  «        ¯|j        j        d k    V — Œ*dS r3  )rô   rý   rc   râ   r  s     r4   r  z"TensMul.matches.<locals>.<genexpr>‚  s=   è è € Ð^Ð^°#ÅjÐQTÕV\ÑF]ÔF]Ð^�c”mÔ(¨AÒ-Ð^Ð^Ð^Ð^Ð^Ð^r3   z9Tensor matching not implemented for non-commuting tensors)r   rk  r  r  r  r  )rO   r«  rì  rl  Úcommutes        r4   rt  zTensMul.matchesz  sw   € Ý�t‰}Œ}ˆàÐØˆIˆIà!ŸšÑ(Ô(ˆIåÐ^Ð^¸¼Ð^Ñ^Ô^Ñ^Ô^ˆØð 	cØ×,Ò,¨T°9¸cÑBÔBÐBå%Ð&aÑbÔbÐbr3   rò  rÙ   rî  rØ   rï  )CrÚ   rÛ   rÜ   rÝ   r   rz  rf  r|  r   rš  rJ   rH   rI   rû  rÂ   r  rÞ   rF  rM  r   r\  r`  rD  rp  ro  r¡  r¥  r|  r  rb   r»  r!  rƒ  rÀ  r5  rv   r    r�  r�   r–  rñ  rö   r›  r¢  rÍ  rÈ   rP   r=  rƒ  rB  r©  r¦  rÁ  r�  rz  rÕ  rÿ   rß  rà  rV  r)  rm  ré  rY  r[  r  rt  r2   r3   r4   r  r  B  sþ  € € € € € € ð%ð %ðL Œu€Hà%Ð%Ð%Ñ%ð-ð -ð -ð^ �(Ð9Ð9Ñ:Ô:€KØˆ8Ð+Ð+Ñ,Ô,€DØ
ˆ(Ð)Ð)Ñ
*Ô
*€CØ�8Ð;Ð;Ñ<Ô<€LØˆ8Ð+Ð+Ñ,Ô,€DØˆxÐ3Ð3Ñ4Ô4€Hàð,5ð ,5ñ „\ð,5ð\ ðFð Fñ „\ðFð ð'(ð '(ð '(ñ „\ð'(ðR ðð ñ „\ðð ð	Gð 	Gñ „\ð	Gð0ð 0ð 0ðh ðAð Añ „\ðAð ðð ñ „\ðð )ð )ð )ðdð dð dð	ð 	ð 	ð ð1ð 1ñ „Xð1ð ð9ð 9ñ „Xð9ð ðUð Uñ „XðUð
 ðð ñ „Xðð ðDð Dñ „XðDð ðgð gñ „Xðgð
3ð 3ð 3ðð ð ð:8ð 8ð 8ð 8ð6sð sð sð sð"ð "ð "ðH
ð 
ð 
ð\ð \ð \ð#ð #ð #ð
ð ð ðð ð ðBRð Rð Rð=ð =ð =ð =ð"ð "ð "ðHð ð ðð ð ðb0ð b0ð b0ðHDð Dð Dð Dð 27ð Hð Hð Hð Hð Hð ð+ð +ñ „\ð+ð3ð 3ð 3ðð ð ð eð eð eð ðð ñ „Xðð 
„[ðVð Vñ „[ðVð 
„\ðYð Yñ „\ðYð(ð (ð (ð ð(ð (ñ „\ð(ðTð ð ð0Að Að Að8ð 8ð 8ð8ð 8ð 8ð&Xð Xð Xð Xðtcð cð cð cð cð cr3   r  c                  ó¶   — e Zd ZdZd„ Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Z	ed„ ¦   «         Z
ed„ ¦   «         Zd	„ Zdd„Zd„ Zd„ ZdS )ÚTensorElementaè  
    Tensor with evaluated components.

    Examples
    ========

    >>> from sympy.tensor.tensor import TensorIndexType, TensorHead, TensorSymmetry
    >>> from sympy import symbols
    >>> L = TensorIndexType("L")
    >>> i, j, k = symbols("i j k")
    >>> A = TensorHead("A", [L, L], TensorSymmetry.fully_symmetric(2))
    >>> A(i, j).get_free_indices()
    [i, j]

    If we want to set component ``i`` to a specific value, use the
    ``TensorElement`` class:

    >>> from sympy.tensor.tensor import TensorElement
    >>> te = TensorElement(A(i, j), {i: 2})

    As index ``i`` has been accessed (``{i: 2}`` is the evaluation of its 3rd
    element), the free indices will only contain ``j``:

    >>> te.get_free_indices()
    [j]
    c                ó$  ‡‡‡— t          |t          ¦  «        sBt          |t          ¦  «        st          d|z  ¦  «        ‚ |j        ˆfd„|j        D ¦   «         Ž S |                     ¦   «         Šd„ ‰D ¦   «         Šˆfd„‰                     ¦   «         D ¦   «         Šˆfd„‰                     ¦   «         D ¦   «         Št          ‰¦  «        dk    r|S ˆfd„‰D ¦   «         }t          ‰¦  «        Št           
                    | |‰¦  «        }||_        |S )Nz%s is not a tensor expressionc                ó0   •— g | ]}t          |‰¦  «        ‘ŒS r2   )r  )rW   r  rž  s     €r4   rY   z)TensorElement.__new__.<locals>.<listcomp>©  s#   ø€ ÐRÐRÐRÀ�}¨S°)Ñ<Ô<ÐRÐRÐRr3   c                ó*   — i | ]}|j         d          |“ŒS r�   r­  rV   s     r4   r  z)TensorElement.__new__.<locals>.<dictcomp>«  s    € ÐDÐDÐD¨Q˜AœF 1œI qÐDÐDÐDr3   c                óD   •— i | ]\  }}‰                      ||¦  «        |“ŒS r2   )r—  )rW   rh   rI  Úname_translations      €r4   r  z)TensorElement.__new__.<locals>.<dictcomp>¬  s0   ø€ ÐeÐeÐeÁ<À5È%Ð%×)Ò)¨%°Ñ7Ô7¸ÐeÐeÐer3   c                ó$   •— i | ]\  }}|‰v ¯	||“ŒS r2   r2   )rW   rh   rI  Úexpr_free_indicess      €r4   r  z)TensorElement.__new__.<locals>.<dictcomp>­  s*   ø€ ÐfÐfÐf¡l e¨UÈ5ÐTeÐKeÐKe�U˜EÐKeÐKeÐKer3   r   c                ó@   •— g | ]}|‰                      ¦   «         v¯|‘ŒS r2   rá  ©rW   rX   rž  s     €r4   rY   z)TensorElement.__new__.<locals>.<listcomp>°  s-   ø€ ÐRÐRÐR˜a¸ÀÇÂÑAQÔAQÐ8QÐ8Q˜Ð8QÐ8QÐ8Qr3   )rô   rý   rü   rþ  rè  r  r    rÔ  rL   r   r   r,  )r¢  r«  rž  rû  r§  r  r  s     `  @@r4   r   zTensorElement.__new__¤  s4  øøø€ Ý˜$¥Ñ'Ô'ð 	Tå˜d¥HÑ-Ô-ð HÝÐ ?À$Ñ FÑGÔGÐGØ�4”9ÐRÐRÐRÐRÈÌ	ÐRÑRÔRÐSÐSØ ×1Ò1Ñ3Ô3ÐØDÐDÐ2CÐDÑDÔDÐØeÐeÐeÐeÐS\×SbÒSbÑSdÔSdÐeÑeÔeˆ	ØfÐfÐfÐf°i·o²oÑ6GÔ6GÐfÑfÔfˆ	Ýˆy‰>Œ>˜QÒÐØˆKØRÐRÐRÐRÐ#4ÐRÑRÔRˆÝ˜‘O”Oˆ	Ý×Ò˜s D¨)Ñ4Ô4ˆØ(ˆÔØˆ
r3   c                óX   — d„ t          |                      ¦   «         ¦  «        D ¦   «         S )Nc                ó   — g | ]	\  }}||f‘Œ
S r2   r2   )rW   rX   rh   s      r4   rY   z&TensorElement.free.<locals>.<listcomp>¸  s    € ÐNÐNÐN™x˜q %�˜�
ÐNÐNÐNr3   )ri   r    ru   s    r4   rH   zTensorElement.free¶  s*   € àNÐN­9°T×5JÒ5JÑ5LÔ5LÑ+MÔ+MÐNÑNÔNÐNr3   c                ó   — g S r_   r2   ru   s    r4   rI   zTensorElement.dumº  s	   € ð ˆ	r3   c                ó   — | j         d         S rB   ©Ú_argsru   s    r4   r«  zTensorElement.expr¿  ó   € àŒz˜!Œ}Ðr3   c                ó   — | j         d         S r›   r$  ru   s    r4   rž  zTensorElement.index_mapÃ  r&  r3   c                ó   — t           j        S r_   rö  ru   s    r4   r!  zTensorElement.coeffÇ  r÷  r3   c                ó   — | S r_   r2   ru   s    r4   rƒ  zTensorElement.nocoeffË  rù  r3   c                ó   — | j         S r_   r9  ru   s    r4   r    zTensorElement.get_free_indicesÏ  s   € ØÔ!Ð!r3   r‰  rŠ  r—   rü   c                ó,   — |                       |¦  «        S r_   rÒ  rŒ  s     r4   r�  zTensorElement._replace_indicesÒ  s   € à�}Š}˜TÑ"Ô"Ð"r3   c                ó*   — |                       ¦   «         S r_   r   ru   s    r4   rv   zTensorElement.get_indicesÖ  s   € Ø×$Ò$Ñ&Ô&Ð&r3   c                óÐ   ‡— | j                              |¦  «        \  }}| j        Št          ˆfd„|D ¦   «         ¦  «        }ˆfd„|D ¦   «         }|                     |¦  «        }||fS )Nc              3  ó^   •K  — | ]'}‰                      |t          d ¦  «        ¦  «        V — Œ(d S r_   )r—  Úslicer  s     €r4   r  z.TensorElement._extract_data.<locals>.<genexpr>Ü  s7   øè è € ÐOÐO¸a˜IŸMšM¨!­U°4©[¬[Ñ9Ô9ÐOÐOÐOÐOÐOÐOr3   c                ó   •— g | ]}|‰v¯|‘Œ	S r2   r2   r  s     €r4   rY   z/TensorElement._extract_data.<locals>.<listcomp>Ý  s#   ø€ ÐDÐDÐD˜Q°¸)Ð1CÐ1C�qÐ1CÐ1CÐ1Cr3   )r«  rÕ  rž  r¹   rö   )rO   r¾  rØ  ró   Úslice_tuplerž  s        @r4   rÕ  zTensorElement._extract_dataÙ  s~   ø€ Ø!œY×4Ò4Ð5EÑFÔFÑˆ�UØ”Nˆ	ÝÐOÐOÐOÐOÀ;ÐOÑOÔOÑOÔOˆØDÐDÐDÐD +ÐDÑDÔDˆØ×!Ò! +Ñ.Ô.ˆØ˜EÐ!Ð!r3   Nrî  )rÚ   rÛ   rÜ   rÝ   r   rš  rH   rI   r«  rž  r!  rƒ  r    r�  rv   rÕ  r2   r3   r4   r  r  ˆ  s  € € € € € ðð ð6ð ð ð$ ðOð Oñ „XðOð ðð ñ „Xðð ðð ñ „Xðð ðð ñ „Xðð ðð ñ „Xðð ðð ñ „Xðð"ð "ð "ð#ð #ð #ð #ð'ð 'ð 'ð"ð "ð "ð "ð "r3   r  c                  ó6   — e Zd ZdZdd„Zed„ ¦   «         Zd„ ZdS )	ÚWildTensorHeada©  
    A wild object that is used to create ``WildTensor`` instances

    Explanation
    ===========

    Examples
    ========
    >>> from sympy.tensor.tensor import TensorHead, TensorIndex, WildTensorHead, TensorIndexType
    >>> R3 = TensorIndexType('R3', dim=3)
    >>> p = TensorIndex('p', R3)
    >>> q = TensorIndex('q', R3)

    A WildTensorHead can be created without specifying a ``TensorIndexType``

    >>> W = WildTensorHead("W")

    Calling it with a ``TensorIndex`` creates a ``WildTensor`` instance.

    >>> type(W(p))
    <class 'sympy.tensor.tensor.WildTensor'>

    The ``TensorIndexType`` is automatically detected from the index that is passed

    >>> W(p).component
    W(R3)

    Calling it with no indices returns an object that can match tensors with any number of indices.

    >>> K = TensorHead('K', [R3])
    >>> Q = TensorHead('Q', [R3, R3])
    >>> W().matches(K(p))
    {W: K(p)}
    >>> W().matches(Q(p,q))
    {W: Q(p, q)}

    If you want to ignore the order of indices while matching, pass ``unordered_indices=True``.

    >>> U = WildTensorHead("U", unordered_indices=True)
    >>> W(p,q).matches(Q(q,p))
    >>> U(p,q).matches(Q(q,p))
    {U(R3,R3): _WildTensExpr(Q(q, p))}

    Parameters
    ==========
    name : name of the tensor
    unordered_indices : whether the order of the indices matters for matching
        (default: False)

    See also
    ========
    ``WildTensor``
    ``TensorHead``

    Nr   Fc           
     ó0  — t          |t          ¦  «        rt          |¦  «        }n't          |t          ¦  «        r|}nt          d¦  «        ‚|€g }|€(t                               t          |¦  «        ¦  «        }n|j        t          |¦  «        k    sJ ‚|t                               t          |¦  «        ¦  «        k    rt          d¦  «        ‚t          j
        | |t          |Ž t          |¦  «        t          |¦  «        t          |¦  «        ¦  «        }|S )Nrä  z3Wild matching based on symmetry is not implemented.)rô   r…   r   rl   rÎ   r³  rL   rÂ   r  r   r   r   r   )r¢  rj   rJ   rÍ   râ   Úunordered_indicesræ  r§  s           r4   r   zWildTensorHead.__new__  s  € Ý�d�CÑ Ô ð 	-Ý  ™,œ,ˆKˆKÝ˜�fÑ%Ô%ð 	-ØˆKˆKå˜^Ñ,Ô,Ð,àÐØˆKàÐÝ%×1Ò1µ#°kÑ2BÔ2BÑCÔCˆHˆHà”=¥C¨Ñ$4Ô$4Ò4Ð4Ð4Ð4à•~×1Ò1µ#°kÑ2BÔ2BÑCÔCÒCÐCÝ%Ð&[Ñ\Ô\Ð\åŒm˜C ­e°[Ð.AÅ7È8ÑCTÔCTÕV]Ð^bÑVcÔVcÕelÐm~ÑeÔeñ  Aô  Aˆàˆ
r3   c                ó   — | j         d         S )Nr,   r­  ru   s    r4   r5  z WildTensorHead.unordered_indices1  r®  r3   c                óF   — t          | |fi |¤Ž}|                     ¦   «         S r_   )rb  rD  )rO   rK   r¦  r4  s       r4   rz  zWildTensorHead.__call__5  s'   € Ý˜D 'Ð4Ð4¨VÐ4Ð4ˆØ�{Š{‰}Œ}Ðr3   )NNr   F)rÚ   rÛ   rÜ   rÝ   r   rš  r5  rz  r2   r3   r4   r3  r3  â  s]   € € € € € ð6ð 6ðnð ð ð ð. ðð ñ „Xððð ð ð ð r3   r3  c                  ó(   — e Zd ZdZd„ Zdd„Zdd„ZdS )rb  a   
    A wild object which matches ``Tensor`` instances

    Explanation
    ===========
    This is instantiated by attaching indices to a ``WildTensorHead`` instance.

    Examples
    ========
    >>> from sympy.tensor.tensor import TensorHead, TensorIndex, WildTensorHead, TensorIndexType
    >>> W = WildTensorHead("W")
    >>> R3 = TensorIndexType('R3', dim=3)
    >>> p = TensorIndex('p', R3)
    >>> q = TensorIndex('q', R3)
    >>> K = TensorHead('K', [R3])
    >>> Q = TensorHead('Q', [R3, R3])

    Matching also takes the indices into account
    >>> W(p).matches(K(p))
    {W(R3): _WildTensExpr(K(p))}
    >>> W(p).matches(K(q))
    >>> W(p).matches(K(-p))

    If you want to match objects with any number of indices, just use a ``WildTensor`` with no indices.
    >>> W().matches(K(p))
    {W: K(p)}
    >>> W().matches(Q(p,q))
    {W: Q(p, q)}

    See Also
    ========
    ``WildTensorHead``
    ``Tensor``

    c                ó  — |                      dd¦  «        }|j        t          k    r	 t          ||fd|i|¤ŽS |j        t          k    r ||Ž S |                      ||¦  «        }d„ |D ¦   «         }|                     |j        |d |j        |j        ¬¦  «        }t          j
        | |t          |Ž ¦  «        }|j        |_        t          j        |Ž |_        |j        j        d d …         |_        |j        j        d d …         |_        |j        j        |_        t(          j        |_        ||_        ||_        |g|_        |j        t7          |¦  «        k    rt9          d¦  «        ‚||_        |                     ||j        ¦  «        |_        |S )Nr¾   Fc                ó   — g | ]	}|j         ‘Œ
S r2   rT   r  s     r4   rY   z&WildTensor.__new__.<locals>.<listcomp>j  s   € Ð@Ð@Ð@°�sÔ,Ð@Ð@Ð@r3   )rÍ   râ   r5  r€  ) ru  rè  r  rý   Ú_WildTensExprr�  rj   râ   r5  r   r   r   r>   r]   r  rH   r‚  rI   rƒ  rM   r   rz  r„  r…  r†  r‡  rÂ   rL   rl   r¾   rˆ  r‰  )r¢  rŠ  rK   rÿ  r¾   rJ   r§  s          r4   r   zWildTensor.__new__^  s‘  € Ø—k’k -°Ñ7Ô7ˆàÔ�zÒ)Ð)ðõ ˜+ wÐSÐS¸KÐSÈ7ÐSÐSÐSØÔ¥Ò.Ð.Ø�; Ð(Ð(à×$Ò$ [°'Ñ:Ô:ˆØ@Ð@¸Ð@Ñ@Ô@ˆØ!×&Ò&ØÔØØØÔ!Ø)Ô;ð 'ñ ô ˆõ Œm˜C ­e°W¨oÑ>Ô>ˆØÔ#ˆŒÝ.Ô;¸WÐEˆÔØÔ(Ô-¨a¨a¨aÔ0ˆŒ	ØÔ'Ô+¨A¨A¨AÔ.ˆŒØÔ,Ô6ˆŒÝ”UˆŒ
ØˆŒØ$ˆŒØ&˜-ˆŒØÔ�s 7™|œ|Ò+Ð+ÝÐ6Ñ7Ô7Ð7Ø%ˆŒØ×-Ò-¨g°sÔ7KÑLÔLˆŒàˆ
r3   NFc                óÄ  — t          |t          ¦  «        s|t          d¦  «        k    rd S |€i }n|                     ¦   «         }t	          | j        ¦  «        dk    rÿt          |d¦  «        sd S |                     ¦   «         }t	          |¦  «        t	          | j        ¦  «        k    rd S | j        j	        r/|  
                    |¦  «        }|€d S |                     |¦  «         n_t          t	          |¦  «        ¦  «        D ]B}| j        |                              ||         ¦  «        }|€ d S |                     |¦  «         ŒCt          |¦  «        || j        <   n||| <   |S )Nrf   r   r    )rô   rü   r   rk  rL   rK   r{  r    r†  r5  Ú_match_indices_ignoring_orderr   r»   rt  r;  rc   )rO   r«  rì  rl  Úexpr_indicesrV  rX   s          r4   rt  zWildTensor.matches…  sk  € Ý˜$¥Ñ)Ô)ð 	¨dµa¸±d´dªl¨lØ�4àÐØˆIˆIà!ŸšÑ(Ô(ˆIåˆtŒ|ÑÔ˜qÒ Ð Ý˜4Ð!3Ñ4Ô4ð Ø�tØ×0Ò0Ñ2Ô2ˆLÝ�<Ñ Ô ¥C¨¬Ñ$5Ô$5Ò5Ð5Ø�tØŒÔ0ð ,Ø×6Ò6°tÑ<Ô<�Ø�9Ø˜4à×$Ò$ QÑ'Ô'Ð'Ð'å�s <Ñ0Ô0Ñ1Ô1ð ,ð ,�AØœ Qœ×/Ò/°¸Q´Ñ@Ô@�AØ�yØ#˜t˜tà!×(Ò(¨Ñ+Ô+Ð+Ð+å(5°dÑ(;Ô(;ˆI�d”nÑ%Ð%ð #ˆI�d‰OàÐr3   c                ó
  ‡— |€i }n|                      ¦   «         }d„ }t          | j        |¦  «        }g Š|                     ¦   «         }|d         D ]X}d}|D ]L}	|	‰v rŒ|                     |	¦  «        }
|
�.d}|                     |
¦  «         ‰                     |	¦  «          nŒM|s dS ŒYˆfd„|D ¦   «         }|d         D ]‚}d}|D ]v}	|                     |	¦  «        }
|
�]| |                     ¦   «         v r||           |
|         k    r  dS d}|                     |
¦  «         ‰                     |	¦  «          nŒw|s dS Œƒˆfd„|D ¦   «         }|d	         D ]‚}d}|D ]v}	|                     |	¦  «        }
|
�]| |                     ¦   «         v r||           |
|         k    r  dS d}|                     |
¦  «         ‰                     |	¦  «          nŒw|s dS Œƒt          ‰¦  «        t          | j        ¦  «        k     rdS |S )
z~
        Helper method for matches. Checks if the indices of self and expr
        match disregarding index ordering.
        Nc                óF   — t          | t          ¦  «        r| j        rdS dS dS )Núwild, updownÚwildra  )rô   ÚWildTensorIndexÚignore_updown)rÄ   s    r4   rl  z9WildTensor._match_indices_ignoring_order.<locals>.siftkey³  s.   € Ý˜#�Ñ/Ô/ð !ØÔ$ð "Ø)˜>à!˜6à �yr3   ra  FTc                ó   •— g | ]}|‰v¯|‘Œ	S r2   r2   ©rW   rX   Úmatched_indicess     €r4   rY   z<WildTensor._match_indices_ignoring_order.<locals>.<listcomp>Î  ó$   ø€ Ð!`Ð!`Ð!`¨ÀqÐP_ÐG_ÐG_ !ÐG_ÐG_ÐG_r3   rB  c                ó   •— g | ]}|‰v¯|‘Œ	S r2   r2   rF  s     €r4   rY   z<WildTensor._match_indices_ignoring_order.<locals>.<listcomp>Ý  rH  r3   rA  )	rk  r*   rK   rv   rt  r   rm   rh  rL   )rO   r«  rì  rl  rl  Úindices_siftedÚexpr_indices_remainingrÄ   Úmatched_this_indÚe_indrV  rG  s              @r4   r=  z(WildTensor._match_indices_ignoring_order©  sã  ø€ ð
 ÐØˆIˆIà!ŸšÑ(Ô(ˆIð	!ð 	!ð 	!õ ˜dœl¨GÑ4Ô4ˆàˆØ!%×!1Ò!1Ñ!3Ô!3ÐØ! )Ô,ð 	ð 	ˆCØ$ÐØ/ð ð �Ø˜OÐ+Ð+ØØ—K’K Ñ&Ô&�Ø�=Ø'+Ð$Ø×$Ò$ QÑ'Ô'Ð'Ø#×*Ò*¨5Ñ1Ô1Ð1Ø�Eð	 !ð
 $ð Ø�t�tðð "aÐ!`Ð!`Ð!`Ð-CÐ!`Ñ!`Ô!`ÐØ! &Ô)ð 	ð 	ˆCØ$ÐØ/ð ð �Ø—K’K Ñ&Ô&�Ø�=Ø�t˜yŸ~š~Ñ/Ô/Ð/Ð/°YÀ¸t´_Ð4DÈÈ#ÌÒ4NÐ4NØ#˜t˜t˜tØ'+Ð$Ø×$Ò$ QÑ'Ô'Ð'Ø#×*Ò*¨5Ñ1Ô1Ð1Ø�Eð !ð $ð Ø�t�tðð "aÐ!`Ð!`Ð!`Ð-CÐ!`Ñ!`Ô!`ÐØ! .Ô1ð 	ð 	ˆCØ$ÐØ/ð ð �Ø—K’K Ñ&Ô&�Ø�=Ø�t˜yŸ~š~Ñ/Ô/Ð/Ð/°YÀ¸t´_Ð4DÈÈ#ÌÒ4NÐ4NØ#˜t˜t˜tØ'+Ð$Ø×$Ò$ QÑ'Ô'Ð'Ø#×*Ò*¨5Ñ1Ô1Ð1Ø�Eð !ð $ð Ø�t�tðõ ˆÑÔ¥# d¤lÑ"3Ô"3Ò3Ð3Ø�4àÐr3   rï  )rÚ   rÛ   rÜ   rÝ   r   rt  r=  r2   r3   r4   rb  rb  :  s^   € € € € € ð"ð "ðF$ð $ð $ðN"ð "ð "ð "ðHFð Fð Fð Fð Fð Fr3   rb  c                  ó>   — e Zd ZdZd	d„Zed„ ¦   «         Zd„ Zd
d„ZdS )rC  a  
    A wild object that matches TensorIndex instances.

    Examples
    ========
    >>> from sympy.tensor.tensor import TensorIndex, TensorIndexType, WildTensorIndex
    >>> R3 = TensorIndexType('R3', dim=3)
    >>> p = TensorIndex("p", R3)

    By default, covariant indices only match with covariant indices (and
    similarly for contravariant)

    >>> q = WildTensorIndex("q", R3)
    >>> (q).matches(p)
    {q: p}
    >>> (q).matches(-p)

    If you want matching to ignore whether the index is co/contra-variant, set
    ignore_updown=True

    >>> r = WildTensorIndex("r", R3, ignore_updown=True)
    >>> (r).matches(-p)
    {r: -p}
    >>> (r).matches(p)
    {r: p}

    Parameters
    ==========
    name : name of the index (string), or ``True`` if you want it to be
        automatically assigned
    tensor_index_type : ``TensorIndexType`` of the index
    is_up :  flag for contravariant index (is_up=True by default)
    ignore_updown : bool, Whether this should match both co- and contra-variant
        indices (default:False)
    TFc                ó°  — t          |t          ¦  «        rt          |¦  «        }n|t          |t          ¦  «        r|}nd|du rQd                     t	          |j        ¦  «        ¦  «        }t          |¦  «        }|j                             |¦  «         nt          d¦  «        ‚t          |¦  «        }t          |¦  «        }t          j
        | ||||¦  «        S rã  rå  )r¢  rj   rU   rk   rD  ræ  s         r4   r   zWildTensorIndex.__new__  sÄ   € Ý�d�CÑ Ô ð 		-Ý  ™,œ,ˆKˆKÝ˜�fÑ%Ô%ð 	-ØˆKˆKØ�Tˆ\ˆ\Ø—=’=¥Ð%6Ô%EÑ!FÔ!FÑGÔGˆDÝ  ™,œ,ˆKØÔ,×3Ò3°KÑ@Ô@Ð@Ð@å˜^Ñ,Ô,Ð,å˜‘”ˆÝ Ñ.Ô.ˆÝŒ}˜S +Ð/@À%ÈÑWÔWÐWr3   c                ó   — | j         d         S r°  r­  ru   s    r4   rD  zWildTensorIndex.ignore_updown%  r®  r3   c                óT   — t          | j        | j        | j         | j        ¦  «        }|S r_   )rC  rj   rU   rk   rD  rï  s     r4   rñ  zWildTensorIndex.__neg__)  s+   € Ý˜TœY¨Ô(>Ø”Z� $Ô"4ñ6ô 6ˆàˆ	r3   Nc                óÆ   — t          |t          ¦  «        sd S | j        |j        k    rd S | j        s| j        |j        k    rd S |€i }n|                     ¦   «         }||| <   |S r_   )rô   ry   rU   rD  rk   rk  rë  s       r4   rt  zWildTensorIndex.matches.  sy   € Ý˜$¥Ñ,Ô,ð 	Ø�4ØÔ! TÔ%;Ò;Ð;Ø�4ØÔ!ð 	ØŒz˜TœZÒ'Ð'Ø�tàÐØˆIˆIà!ŸšÑ(Ô(ˆIàˆ	�$‰ØÐr3   )TFrï  )	rÚ   rÛ   rÜ   rÝ   r   rš  rD  rñ  rt  r2   r3   r4   rC  rC  ñ  su   € € € € € ð"ð "ðFXð Xð Xð Xð  ðð ñ „Xððð ð ð
ð ð ð ð ð r3   rC  c                  óf   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )r;  a€  
    INTERNAL USE ONLY

    This is an object that helps with replacement of WildTensors in expressions.
    When this object is set as the tensor_head of a WildTensor, it replaces the
    WildTensor by a TensExpr (passed when initializing this object).

    Examples
    ========
    >>> from sympy.tensor.tensor import WildTensorHead, TensorIndex, TensorHead, TensorIndexType
    >>> W = WildTensorHead("W")
    >>> R3 = TensorIndexType('R3', dim=3)
    >>> p = TensorIndex('p', R3)
    >>> q = TensorIndex('q', R3)
    >>> K = TensorHead('K', [R3])
    >>> print( ( K(p) ).replace( W(p), W(q)*W(-q)*W(p) ) )
    K(R_0)*K(-R_0)*K(p)

    c                ó\   — t          |t          ¦  «        st          d¦  «        ‚|| _        d S )Nz,_WildTensExpr expects a TensExpr as argument)rô   rü   rþ  r«  )rO   r«  s     r4   rQ   z_WildTensExpr.__init__T  s/   € Ý˜$¥Ñ)Ô)ð 	LÝÐJÑKÔKÐKØˆŒ	ˆ	ˆ	r3   c                óš   — | j                              t          t          | j                              ¦   «         |¦  «        ¦  «        ¦  «        S r_   )r«  r�  rß  r  r    )rO   rK   s     r4   rz  z_WildTensExpr.__call__Y  s9   € ØŒy×)Ò)­$­s°4´9×3MÒ3MÑ3OÔ3OÐQXÑ/YÔ/YÑ*ZÔ*ZÑ[Ô[Ð[r3   c                óP   — |                       | j        t          j        z  ¦  «        S r_   )rè  r«  r   ra  ru   s    r4   rñ  z_WildTensExpr.__neg__\  s   € Ø�yŠy˜œ¥1¤=Ñ0Ñ1Ô1Ð1r3   c                ó   — t           ‚r_   rc  ru   s    r4   rd  z_WildTensExpr.__abs___  re  r3   c                ó¤   — |j         | j         k    rt          d| j         › d|j         › �¦  «        ‚|                       | j        |j        z   ¦  «        S ©NzCannot add z to ©rè  rþ  r«  r¿  s     r4   rk  z_WildTensExpr.__add__b  sO   € ØŒ:˜œÒ"Ð"ÝÐE¨$¬)ÐEÐE¸¼ÐEÐEÑFÔFÐFØ�yŠy˜œ 5¤:Ñ-Ñ.Ô.Ð.r3   c                ó¤   — |j         | j         k    rt          d| j         › d|j         › �¦  «        ‚|                       |j        | j        z   ¦  «        S rY  rZ  r¿  s     r4   rm  z_WildTensExpr.__radd__g  sO   € ØŒ:˜œÒ"Ð"ÝÐE¨$¬)ÐEÐE¸¼ÐEÐEÑFÔFÐFØ�yŠy˜œ D¤IÑ-Ñ.Ô.Ð.r3   c                ó   — | | z   S r_   r2   r¿  s     r4   rp  z_WildTensExpr.__sub__l  s   € Ø˜�v‰Ðr3   c                ó   — ||  z   S r_   r2   r¿  s     r4   rr  z_WildTensExpr.__rsub__o  s   € Ø˜˜‰Ðr3   c                ó   — t           ‚r_   rc  r¿  s     r4   ru  z_WildTensExpr.__mul__r  re  r3   c                ó   — t           ‚r_   rc  r¿  s     r4   rw  z_WildTensExpr.__rmul__u  re  r3   c                ó   — t           ‚r_   rc  r¿  s     r4   r{  z_WildTensExpr.__truediv__x  re  r3   c                ó   — t           ‚r_   rc  r¿  s     r4   r}  z_WildTensExpr.__rtruediv__{  re  r3   c                ó   — t           ‚r_   rc  r¿  s     r4   rM  z_WildTensExpr.__pow__~  re  r3   c                ó   — t           ‚r_   rc  r¿  s     r4   r€  z_WildTensExpr.__rpow__�  re  r3   N)rÚ   rÛ   rÜ   rÝ   rQ   rz  rñ  rd  rk  rm  rp  rr  ru  rw  r{  r}  rM  r€  r2   r3   r4   r;  r;  @  só   € € € € € ðð ð&ð ð ð
\ð \ð \ð2ð 2ð 2ð"ð "ð "ð/ð /ð /ð
/ð /ð /ð
ð ð ðð ð ð"ð "ð "ð"ð "ð "ð"ð "ð "ð"ð "ð "ð"ð "ð "ð"ð "ð "ð "ð "r3   r;  c                óX   — t          | t          ¦  «        r|                      ¦   «         S | S )zt
    Butler-Portugal canonicalization. See ``tensor_can.py`` from the
    combinatorics module for the details.
    )rô   rü   rP   )r¬  s    r4   rP   rP   …  s)   € õ
 �!•XÑÔð Ø�zŠz‰|Œ|ÐØ€Hr3   c                 óŒ   — | s't                                t          j        g g g ¦  «        S | d         }| dd…         D ]}||z  }Œ|S )z
    product of tensors
    r   rf   N)r  rp  r   rz  )rÖ   rè   Útxs      r4   Ú
tensor_mulrg  �  sX   € ð ð 4Ý× Ò ¥¤¨¨B°Ñ3Ô3Ð3Ø	ˆ!Œ€AØ���Œeð ð ˆØˆb‰DˆˆØ€Hr3   c                óR  — t          | j        d„ ¬¦  «        }d„ |D ¦   «         \  }}}}| t          dd¦  «        z  }|                      ||f||f||f||f¦  «         t          dd¦  «        z  }|                      ||f||f||f||f¦  «        t          dd¦  «        z  }||z   |z   }	|	S )z‡
    replace Riemann tensor with an equivalent expression

    ``R(m,n,p,q) -> 2/3*R(m,n,p,q) - 1/3*R(m,q,n,p) + 1/3*R(m,p,n,q)``

    c                ó   — | d         S r›   r2   rC   s    r4   rE   z(riemann_cyclic_replace.<locals>.<lambda>¢  s
   € ¨!¨A¬$€ r3   rF   c                ó   — g | ]
}|d          ‘ŒS r�   r2   rº   s     r4   rY   z*riemann_cyclic_replace.<locals>.<listcomp>£  s   € Ð%Ð%Ð%˜1�!�A”$Ð%Ð%Ð%r3   r@   r„  rf   )rŸ   rH   r   r�  )
Út_rrH   rV  rn   r¬  ÚqÚt0rð  Út2Út3s
             r4   Úriemann_cyclic_replacerp  ›  sÈ   € õ �#”(  Ð/Ñ/Ô/€DØ%Ð% Ð%Ñ%Ô%�J€A€qˆ!ˆQØ	�X�a˜‰^Œ^Ñ	€BØ
×
 Ò
  ! A ¨¨! u¨a°¨U°A°a°5Ñ
9Ô
9Ð	9½(À1Àa¹.¼.Ñ	H€BØ	×	Ò	  1  q¨ e¨Q¨q¨E°1°Q°%Ñ	8Ô	8½À!ÀQ¹¼Ñ	G€BØ	ˆb‰�2‰€BØ€Ir3   c                ó   — |                       ¦   «         } t          | t          t          f¦  «        r| g}n| j        }d„ |D ¦   «         }d„ |D ¦   «         }d„ |D ¦   «         }t          |Ž                      d¬¦  «        }|s|S t          |¦  «        S )aJ  
    Replace each Riemann tensor with an equivalent expression
    satisfying the cyclic identity.

    This trick is discussed in the reference guide to Cadabra.

    Examples
    ========

    >>> from sympy.tensor.tensor import TensorIndexType, tensor_indices, TensorHead, riemann_cyclic, TensorSymmetry
    >>> Lorentz = TensorIndexType('Lorentz', dummy_name='L')
    >>> i, j, k, l = tensor_indices('i,j,k,l', Lorentz)
    >>> R = TensorHead('R', [Lorentz]*4, TensorSymmetry.riemann())
    >>> t = R(i,j,k,l)*(R(-i,-j,-k,-l) - 2*R(-i,-k,-j,-l))
    >>> riemann_cyclic(t)
    0
    c                ó6   — g | ]}|                      ¦   «         ‘ŒS r2   )r�   rº   s     r4   rY   z"riemann_cyclic.<locals>.<listcomp>Á  s    € Ð	"Ð	"Ð	"˜ˆ!�'Š'‰)Œ)Ð	"Ð	"Ð	"r3   c                ó&   — g | ]}d „ |D ¦   «         ‘ŒS )c                ó,   — g | ]}t          |¦  «        ‘ŒS r2   )rp  )rW   rf  s     r4   rY   z-riemann_cyclic.<locals>.<listcomp>.<listcomp>Â  s!   € Ð
2Ð
2Ð
2¨"Õ! "Ñ%Ô%Ð
2Ð
2Ð
2r3   r2   )rW   r  s     r4   rY   z"riemann_cyclic.<locals>.<listcomp>Â  s'   € Ð	?Ð	?Ð	?°qÐ
2Ð
2°Ð
2Ñ
2Ô
2Ð	?Ð	?Ð	?r3   c                ó    — g | ]}t          |Ž ‘ŒS r2   )rg  )rW   ré   s     r4   rY   z"riemann_cyclic.<locals>.<listcomp>Ã  s   € Ð	%Ð	%Ð	%˜Q�*�aˆ.Ð	%Ð	%Ð	%r3   Frh  )r0  rô   r  rý   r  r  rD  rP   )rn  r  Úa1Úa2Úa3ro  s         r4   Úriemann_cyclicry  ª  s¤   € ð$ 
�Š‰Œ€BÝ�"•w¥Ð'Ñ(Ô(ð ØˆtˆˆàŒwˆØ	"Ð	"˜TÐ	"Ñ	"Ô	"€BØ	?Ð	?¸BÐ	?Ñ	?Ô	?€BØ	%Ð	% "Ð	%Ñ	%Ô	%€BÝ	�"ˆ×	Ò	 Ð	Ñ	&Ô	&€BØð Øˆ	å˜‰|Œ|Ðr3   c                ó²  ‡‡— d„ }| j         }i }| j         D ]¡}t          |t          ¦  «        sŒ||v rŒ|j        }g }t	          t          |¦  «        ¦  «        D ]!}||         |u r|                     |¦  «         Œ"t          |¦  «        dk    rt          d|z  ¦  «        ‚t          |¦  «        dk    r|||<   Œ¢g }	g }
g Š| j        D �]¥\  }}}}||         |vrŒ||k    r|
                     |g¦  «         Œ0|||                  }|||                  }||vrŒQ| 	                    |¦  «        | 	                    |¦  «        k    rt          ‚|||                  }||d         k    r||fn||f\  }}|	                     ¦   «         }|	D ]µ}|d         |k    rƒ|d         |k    r`| 	                    t          |¦  «        ¦  «        }‰                     |¦  «         |
                     ||d…         |d|…         z   ¦  «         n|                     |¦  «          n<|d         |k    r|                     d|¦  «          nŒ¶|                     ||g¦  «         ˆfd„|D ¦   «         }	 ||	¦  «        }	�Œ§g Š|	D ]}|D ]}‰                     |¦  «         ŒŒ|
D ]}|D ]}‰                     |¦  «         ŒŒˆfd	„t	          t          |¦  «        ¦  «        D ¦   «         Š|	|
‰fS )
zø
    Returns ``(lines, traces, rest)`` for an index type,
    where ``lines`` is the list of list of positions of a matrix line,
    ``traces`` is the list of list of traced matrix lines,
    ``rest`` is the rest of the elements of the tensor.
    c                óö  — d}|t          | ¦  «        k     �râ| |         }|d         }|d         }d}|�r¬d}t          |dz   t          | ¦  «        ¦  «        D �]…}|t          | ¦  «        k    r �nn| |         d         |k    rCd}|                     | |         dd …         ¦  «         |d         }|                      |¦  «         Œn| |         d         |k    rQd}t	          | |         dd …         ¦  «        |z   | |<   | |         }| |         d         }|                      |¦  «         ŒÑ| |         d         |k    rQd}|                     t	          | |         d d…         ¦  «        ¦  «         |d         }|                      |¦  «         �Œ4| |         d         |k    r?d}| |         d d…         |z   | |<   | |         }|d         }|                      |¦  «         �Œ…�Œ‡|�°¬|dz  }|t          | ¦  «        k     �°â| S )Nr   rà   TFrf   )rL   r»   r`   ru  Úreversed)rÖ   rX   rD   ÚxendÚxstartÚhitrÅ   s          r4   Ú_join_lineszget_lines.<locals>._join_linesÒ  s  € ØˆØ•#�a‘&”&Šj‰jØ�!”ˆAØ�R”5ˆDØ�q”TˆFØˆCØñ !Ø�Ý˜q 1™u¥c¨!¡f¤fÑ-Ô-ð !ñ !�AØ�C ™FœF’{�{Ø™Ø˜”t˜A”w $’�Ø"˜ØŸš  1¤ a b b¤Ñ*Ô*Ð*Ø  œu˜ØŸš˜a™œ˜Ø Ø˜”t˜A”w &Ò(Ð(Ø"˜Ý'¨¨!¬¨Q¨R¨R¬Ñ1Ô1°AÑ5˜˜!™Ø˜aœD˜Ø!" 1¤ a¤˜ØŸš˜a™œ˜Ø Ø˜”t˜B”x 4Ò'Ð'Ø"˜ØŸš¥¨!¨A¬$¨s°¨s¬)Ñ!4Ô!4Ñ5Ô5Ð5Ø  œu˜ØŸš˜a™œ˜Ù Ø˜”t˜B”x 6Ò)Ð)Ø"˜Ø  œt C R Cœy¨1™}˜˜!™Ø˜aœD˜Ø!" 1¤˜ØŸš˜a™œ˜Ù ñ *ð1 ñ !ð> �‰FˆAðI •#�a‘&”&Šj‰jðJ ˆr3   r@   z&at most two indices of type %s allowedrf   rà   r   Nc                ó   •— g | ]}|‰v¯|‘Œ	S r2   r2   )rW   rD   Útraces1s     €r4   rY   zget_lines.<locals>.<listcomp>5  s#   ø€ Ð7Ð7Ð7�q a¨wÐ&6Ð&6�Ð&6Ð&6Ð&6r3   c                ó   •— g | ]}|‰v¯|‘Œ	S r2   r2   )rW   rD   Úrests     €r4   rY   zget_lines.<locals>.<listcomp>>  s   ø€ Ð>Ð>Ð>�!°¸°°ˆA°°°r3   )r  rô   rü   rJ   r»   rL   rm   rl   rÀ  rh   r  rk  ÚminÚinsert)ÚexrÒ  r€  Ú	argumentsÚdtr�  rJ   rÖ   rX   ÚlinesÚtracesr¹  r¾  Úc0Úc1Úta0Úta1Úb0Úb1Úlines1Úlinern   r  r„  r‚  s                          @@r4   Ú	get_linesr”  Ë  sa  øø€ ð'ð 'ð 'ðR ”€IØ	€BØŒWð ð ˆÝ˜!�XÑ&Ô&ð 	ØØ�ˆ7ˆ7ØØ”mˆØˆÝ•s˜;Ñ'Ô'Ñ(Ô(ð 	ð 	ˆAØ˜1Œ~ Ð+Ð+Ø—’˜‘”�øÝˆq‰6Œ6�AŠ:ˆ:ÝÐEÈ
ÑRÑSÔSÐSÝˆq‰6Œ6�QŠ;ˆ;ØˆBˆq‰Eøà€EØ€FØ€Gð œ.ð %#ñ %#‰ˆˆB��BØ�RŒ= Ð"Ð"ØØ�Š8ˆ8Ø�MŠM˜2˜$ÑÔÐØØ�˜2”ÔˆØ�˜2”ÔˆØ�Sˆ=ˆ=ØØ�9Š9�R‰=Œ=˜CŸIšI b™MœMÒ)Ð)õ
 &Ð%ð �˜2”ÔˆØ 3 q¤6š\˜\�"�b��°°R°‰ˆˆBØ—’‘”ˆØð 	$ð 	$ˆDØ�BŒx˜2Š~ˆ~Ø˜”7˜b’=�=ØŸ
š
¥3 t¡9¤9Ñ-Ô-�AØ—N’N 4Ñ(Ô(Ð(Ø—M’M $ q r r¤(¨T°"°1°"¬XÑ"5Ñ6Ô6Ð6Ð6à—K’K ‘O”O�OØ�Ø�a”˜B’�Ø—’˜A˜rÑ"Ô"Ð"Ø�ð ð �MŠM˜2˜r˜(Ñ#Ô#Ð#à7Ð7Ð7Ð7˜FÐ7Ñ7Ô7ˆØ�˜EÑ"Ô"ˆ‰Ø€DØð ð ˆØð 	ð 	ˆAØ�KŠK˜‰NŒNˆNˆNð	àð ð ˆØð 	ð 	ˆAØ�KŠK˜‰NŒNˆNˆNð	à>Ð>Ð>Ð>•u�S ™^œ^Ñ,Ô,Ð>Ñ>Ô>€Dà�&˜$ÐÐr3   c                óX   — t          | t          ¦  «        sdS |                      ¦   «         S ©Nr2   )rô   rü   r    ©rè   s    r4   r    r    C  s+   € Ý�a�Ñ"Ô"ð ØˆrØ×ÒÑÔÐr3   c                óX   — t          | t          ¦  «        sdS |                      ¦   «         S r–  )rô   rü   rv   r—  s    r4   rv   rv   I  s'   € Ý�a�Ñ"Ô"ð ØˆrØ�=Š=‰?Œ?Ðr3   c                óž   ‡— t          | t          ¦  «        sdS |                      ¦   «         }|                      ¦   «         Šˆfd„|D ¦   «         S )Nr2   c                ó   •— g | ]}|‰v¯|‘Œ	S r2   r2   )rW   rX   rH   s     €r4   rY   z%get_dummy_indices.<locals>.<listcomp>S  s   ø€ Ð-Ð-Ð-�!˜q¨˜}˜}ˆA˜}˜}˜}r3   )rô   rü   rv   r    )rè   rÞ  rH   s     @r4   r"  r"  N  sR   ø€ Ý�a�Ñ"Ô"ð ØˆrØ�=Š=‰?Œ?€DØ×ÒÑÔ€DØ-Ð-Ð-Ð-�tÐ-Ñ-Ô-Ð-r3   c                ó^   — t          | t          ¦  «        r| j        S t          g g g g ¦  «        S r_   )rô   rü   r  r>   r—  s    r4   r  r  U  s1   € Ý�!•XÑÔð "ØÔ!Ð!Ý˜2˜r 2 rÑ*Ô*Ð*r3   c                óÈ   — t          | t          ¦  «        rt          j        S t          | t          ¦  «        r| j        S t          | t          ¦  «        rt          d¦  «        ‚| S )Nz3no coefficient associated to this tensor expression)rô   rý   r   rz  r  r!  rü   rl   r—  s    r4   Ú	get_coeffr�  [  s[   € Ý�!•VÑÔð ÝŒuˆÝ�!•WÑÔð ØŒwˆÝ�!•XÑÔð PÝÐNÑOÔOÐOØ€Hr3   c                óZ   — t          | t          ¦  «        r|                      |¦  «        S | S r_   )rô   rü   rB  )rè   r½   s     r4   rB  rB  d  s-   € Ý�!•XÑÔð $Ø× Ò  Ñ#Ô#Ð#Ø€Hr3   Fc                ó<  — t          | t          ¦  «        s| S t          | t          t          f¦  «        r\t	          | ¦  «                             ||¬¦  «        }|                      ||¬¦  «        }|d         t          |¦  «        dz
  k    r| S |S t          ¦   «         ‚)zŒ
    Returns the tensor corresponding to the permutation ``g``

    For further details, see the method in ``TIDS`` with the same name.
    r~  rà   rf   )	rô   rü   rý   r  r  rÈ   r©  rL   r  )rè   r½   r¾   Únimr,  s        r4   rÈ   rÈ   i  s›   € õ �a�Ñ"Ô"ð ØˆÝ	�A�¥Ð(Ñ	)Ô	)ð Ý! !Ñ$Ô$×0Ò0°ÀÐ0ÑLÔLˆØ×(Ò(¨¸+Ð(ÑFÔFˆØˆRŒ5•C˜‘F”F˜Q‘JÒÐØ�4ˆKàˆ
Ý
Ñ
Ô
Ðr3   c                óD   — t          | t          ¦  «        s| S  | j        |Ž S r_   )rô   rü   r�  )rè   r�  s     r4   r�  r�  {  s)   € Ý�a�Ñ"Ô"ð ØˆØˆ1Ô Ð.Ð.r3   c           	     ó€   — t          |                      t          t          t          t
          t          ¦  «        ¦  «        S r_   )r“   Úatomsr   r   rb  rC  r3  )r«  s    r4   rf  rf  �  s$   € Ý�—
’
�4¥­z½?ÍNÑ[Ô[Ñ\Ô\Ð\r3   c                ó   ‡ — ˆ fd„}|S )Nc                ó˜   •— t           t          t          t          i‰         }t	          d„ | j        D ¦   «         ¦  «        r
 || j        Ž S | S )Nc              3  ó@   K  — | ]}t          |t          ¦  «        V — Œd S r_   r  ræ  s     r4   r  z<get_postprocessor.<locals>._postprocessor.<locals>.<genexpr>ˆ  s,   è è € Ð:Ð:¨1�z˜!�XÑ&Ô&Ð:Ð:Ð:Ð:Ð:Ð:r3   )r   r  r   r  r  r  )r«  Ú
tens_classr¢  s     €r4   Ú_postprocessorz)get_postprocessor.<locals>._postprocessor†  sK   ø€ Ý�7¥C­Ð1°#Ô6ˆ
ÝÐ:Ð:°´	Ð:Ñ:Ô:Ñ:Ô:ð 	Ø�:˜tœyÐ)Ð)àˆKr3   r2   )r¢  r¨  s   ` r4   Úget_postprocessorr©  …  s$   ø€ ðð ð ð ð ð Ðr3   r   rB   rØ   )krÝ   Ú
__future__r   Útypingr   Ú	functoolsr   Úmathr   Úabcr   r   Úcollectionsr	   rÌ  r´  Úsympy.core.numbersr
   r   r  r   Úsympy.combinatorics.tensor_canr   r   r   r   Ú
sympy.corer   r   r   r   r   r   Úsympy.core.cacher   Úsympy.core.containersr   r   Úsympy.core.functionr   Úsympy.core.sortingr   Úsympy.core.symbolr   r   r   Úsympy.core.sympifyr    r!   Úsympy.core.operationsr"   Úsympy.external.gmpyr#   Úsympy.matricesr$   Úsympy.utilities.exceptionsr%   r&   r'   Úsympy.utilities.decoratorr(   r)   Úsympy.utilities.iterablesr*   r5   r9   r<   r>   rë   rí   rÅ  r~  rã   r;  ry   rû  rÎ   r  r  r1  r  r^  rü   r  rý   r  r  r3  rb  rC  r;  rP   rg  rp  ry  r”  r    rv   r"  r  r�  rB  rÈ   r�  rf  r©  Ú"_constructor_postprocessor_mappingr2   r3   r4   ú<module>rÀ     sý  ððð ð> #Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ø #Ð #Ð #Ð #Ð #Ð #Ø €€€Ø Ð Ð Ð à 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø +Ð +Ð +Ð +Ð +Ð +ð4ð 4ð 4ð 4ð 4ð 4ð 4ð 4ð 4ð 4ð 4ð 4à 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø (Ð (Ð (Ð (Ð (Ð (Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø /Ð /Ð /Ð /Ð /Ð /Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø )Ð )Ð )Ð )Ð )Ð )Ø *Ð *Ð *Ð *Ð *Ð *Ø Ð Ð Ð Ð Ð ð9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð CÐ BÐ BÐ BÐ BÐ BÐ BÐ BØ *Ð *Ð *Ð *Ð *Ð *ð	ð 	ð 	ð	ð 	ð 	ð	ð 	ð 	ðh)ð h)ð h)ð h)ð h)�kñ h)ô h)ð h)ðV	ð ð ð&sð sð sð sð s˜{ñ sô sð sðj ":Ð!9Ñ!;Ô!;Ð ðjð jð jð jð jñ jô jð jðZ �Ñ Ô €ðk6ð k6ð k6ð k6ð k6�eñ k6ô k6ð k6ð\	Zð Zð Zð Zð Z�%ñ Zô Zð Zðzð ð ð:A9ð A9ð A9ð A9ð A9�Uñ A9ô A9ð A9ðH €ðð #Ø:ðñ ô ð?,ð ?,ñô ð?,ðB €Ø;Ø"Ø6ðñ ô ð
;_ð ;_ð ;_ð ;_ð ;_�ñ ;_ô ;_ñô ð
;_ð| €ðð #Ø6ðñ ô ð,ð ,ð ,ñô ð,ð0O5ð O5ð O5ð O5ð O5�ñ O5ô O5ð O5ðdð ð ð ðnð nð nð nð nˆt�Sñ nô nð nðbið ið ið ið iˆh˜ñ iô ið iðXaKð aKð aKð aKð aKˆXñ aKô aKð aKðJDcð Dcð Dcð Dcð Dcˆh˜ñ Dcô Dcð DcðL"W"ð W"ð W"ð W"ð W"�Hñ W"ô W"ð W"ðtUð Uð Uð Uð U�Zñ Uô Uð Uðpuð uð uð uð u�ñ uô uð uðnLð Lð Lð Lð L�kñ Lô Lð Lð^B"ð B"ð B"ð B"ð B"�Eñ B"ô B"ð B"ðJð ð ð	ð 	ð 	ðð ð ðð ð ðBuð uð uðp ð  ð  ðð ð ð
.ð .ð .ð+ð +ð +ðð ð ðð ð ð
 ð  ð  ð  ð$/ð /ð /ð]ð ]ð ]ðð ð ð 
ÐÐ˜cÑ"Ô"Ð#ð6€Ô (¨Ñ 2Ð 2Ð 2r3   