§
    OŠtjý  ã                   ó”   — 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	 d dl
mZ d dlmZ d dlmZ d	„ Zd
„ Zd„ Z G d„ de¦  «        ZdS )é    )ÚAdd)ÚTuple)ÚExpr)ÚMul)ÚPow)Údefault_sort_key)Úsympify)ÚMatrixc                 ó¦   — t          | ¦  «        } t          | t          ¦  «        r,| j        s#| j        s| j        s| j        s| j        r	| j        rdS dS )z Helper method used in TrTF)	r	   Ú
isinstancer   Ú
is_IntegerÚis_FloatÚis_RationalÚ	is_NumberÚ	is_SymbolÚis_commutative)Úes    úY/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/physics/quantum/trace.pyÚ
_is_scalarr      si   € õ 	�‰
Œ
€AÝ�!•TÑÔð ØŒLð 	˜AœJð 	ØŒMð	Øœ[ð	àŒ[ð	àÔ-ð	ð �4àˆ5ó    c                 ó  ‡‡‡— t          | ¦  «        dk    r| S t          | t          ¬¦  «        Šˆfd„t          | ¦  «        D ¦   «         Št	          | ¦  «        Š‰                     | ¦  «         ‰                     t          | ¦  «        ‰d         z   ¦  «         ˆˆfd„t          t          ‰¦  «        dz
  ¦  «        D ¦   «         }|                     t          |¦  «        ¦  «        }‰‰|         ‰|         t          | ¦  «        z   …         }|S )a5   Cyclic permutations based on canonical ordering

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

    This method does the sort based ascii values while
    a better approach would be to used lexicographic sort.

    TODO: Handle condition such as symbols have subscripts/superscripts
    in case of lexicographic sort

    é   )Úkeyc                 ó&   •— g | ]\  }}|‰k    ¯|‘ŒS © r   )Ú.0ÚiÚxÚmin_items      €r   ú
<listcomp>z"_cycle_permute.<locals>.<listcomp>,   s"   ø€ Ð;Ð;Ð;‘T�Q˜¨Q°(ª]¨]ˆq¨]¨]¨]r   r   c                 óD   •— g | ]}‰‰|         ‰|d z            …         g‘ŒS )r   r   )r   r   ÚindicesÚles     €€r   r    z"_cycle_permute.<locals>.<listcomp>7   s>   ø€ ð (ð (ð (°1��7˜1”:˜g a¨!¡eœnÐ,Ô-Ð.ð (ð (ð (r   )	ÚlenÚminr   Ú	enumerateÚlistÚextendÚappendÚrangeÚindex)ÚlÚsublistÚidxÚ	ordered_lr"   r#   r   s       @@@r   Ú_cycle_permuter0      s  øøø€ õ ˆ1�v„v�‚{€{Øˆå�1Õ*Ð+Ñ+Ô+€HØ;Ð;Ð;Ð;�Y q™\œ\Ð;Ñ;Ô;€Gå	ˆa‰Œ€BØ‡I‚Iˆa�L„L€Lð ‡N‚N•3�q‘6”6˜G AœJÑ&Ñ'Ô'Ð'ð
(ð (ð (ð (ð (Ý•S˜‘\”\ AÑ%Ñ&Ô&ð(ñ (ô (€Gð
 �-Š-�˜G™œÑ
%Ô
%€CØ�7˜3”< ¨¤­s°1©v¬vÑ 5Ð5Ô6€IàÐr   c                 ó°   — t          | ¦  «        dk    r| S t          | dd…         ¦  «        }|                     | dd…         ¦  «         t          |Ž j        S )zk this just moves the last arg to first position
     to enable expansion of args
     A,B,A ==> A**2,B
    r   éÿÿÿÿNr   )r$   r'   r(   r   Úargs)r,   r   s     r   Ú_rearrange_argsr4   B   sQ   € õ
 ˆ1�v„v�‚{€{ØˆåˆQˆrˆsˆsŒV‰Œ€AØ‡H‚HˆQˆq�ˆtŒWÑÔÐÝ�ˆ7Œ<Ðr   c                   óV   — e Zd ZdZd„ Zed„ ¦   «         Zd„ Zed„ ¦   «         Zd„ Z	d„ Z
dS )	ÚTra‚   Generic Trace operation than can trace over:

    a) SymPy matrix
    b) operators
    c) outer products

    Parameters
    ==========
    o : operator, matrix, expr
    i : tuple/list indices (optional)

    Examples
    ========

    # TODO: Need to handle printing

    a) Trace(A+B) = Tr(A) + Tr(B)
    b) Trace(scalar*Operator) = scalar*Trace(Operator)

    >>> from sympy.physics.quantum.trace import Tr
    >>> from sympy import symbols, Matrix
    >>> a, b = symbols('a b', commutative=True)
    >>> A, B = symbols('A B', commutative=False)
    >>> Tr(a*A,[2])
    a*Tr(A)
    >>> m = Matrix([[1,2],[1,1]])
    >>> Tr(m)
    2

    c                 ó„  ‡— t          |¦  «        dk    rVt          |d         t          t          t          f¦  «        st          |d         ¦  «        Šnt          |d         Ž Š|d         }n9t          |¦  «        dk    rt          ¦   «         Š|d         }nt          d¦  «        ‚t          |t          ¦  «        r|                     ¦   «         S t          |d¦  «        r(t          |j        ¦  «        r|                     ¦   «         S t          |t          ¦  «        rt          ˆfd„|j        D ¦   «         Ž S t          |t          ¦  «        rq|                     ¦   «         \  }}t          |¦  «        dk    r	t          |Ž S t          j        | t          |Ž ‰¦  «        }t          |¦  «        dk    rt          |Ž |z  n|S t          |t           ¦  «        rLt#          |j        d         ¦  «        rt#          |j        d         ¦  «        r|S t          j        | |‰¦  «        S t#          |¦  «        r|S t          j        | |‰¦  «        S )z� Construct a Trace object.

        Parameters
        ==========
        args = SymPy expression
        indices = tuple/list if indices, optional

        é   r   r   z5Arguments to Tr should be of form (expr[, [indices]])Útracec                 ó0   •— g | ]}t          |‰¦  «        ‘ŒS r   )r6   )r   Úargr"   s     €r   r    zTr.__new__.<locals>.<listcomp>�   s#   ø€ Ð?Ð?Ð?¨c�˜C Ñ)Ô)Ð?Ð?Ð?r   )r$   r   r'   r   ÚtupleÚ
ValueErrorr
   r9   ÚhasattrÚcallabler   r3   r   Úargs_cncr   Ú__new__r   r   )Úclsr3   ÚexprÚc_partÚnc_partÚobjr"   s         @r   rA   z
Tr.__new__n   s  ø€ õ �‰IŒI˜ŠNˆNÝ˜d 1œg­­eµUÐ';Ñ<Ô<ð *Ý  Q¤™.œ.��å  a¤˜/�à˜”7ˆDˆDÝ�$‰iŒi˜1ŠnˆnÝ‘g”gˆGØ˜”7ˆDˆDåð 3ñ 4ô 4ð 4õ �d�FÑ#Ô#ð 	4Ø—:’:‘<”<ÐÝ�T˜7Ñ#Ô#ð 	4­°´Ñ(<Ô(<ð 	4à—:’:‘<”<ÐÝ˜�cÑ"Ô"ð 	4ÝÐ?Ð?Ð?Ð?°T´YÐ?Ñ?Ô?Ð@Ð@Ý˜�cÑ"Ô"ð 	4Ø"Ÿmšm™oœo‰OˆF�GÝ�7‰|Œ|˜qÒ Ð Ý˜F�|Ð#å”l 3­¨W¨°wÑ@Ô@�õ ,/¨v©;¬;¸ª?¨?•s˜F�| CÑ'Ð'ÀÐCÝ˜�cÑ"Ô"ð 
	4Ý˜4œ9 Qœ<Ñ(Ô(ð 8Ý˜tœy¨œ|Ñ,Ô,ð8à�å”| C¨¨wÑ7Ô7Ð7å˜4Ñ Ô ð Ø�å”<  T¨7Ñ3Ô3Ð3r   c                 ó8   — | j         d         }|j        }|j        S )Nr   )r3   ÚkindÚelement_kind)ÚselfrC   Ú	expr_kinds      r   rH   zTr.kind£   s   € àŒy˜Œ|ˆØ”Iˆ	ØÔ%Ð%r   c                 ó”   — t          | j        d         d¦  «        r,| j        d                              | j        d         ¬¦  «        S | S )a†   Perform the trace operation.

        #TODO: Current version ignores the indices set for partial trace.

        >>> from sympy.physics.quantum.trace import Tr
        >>> from sympy.physics.quantum.operator import OuterProduct
        >>> from sympy.physics.quantum.spin import JzKet, JzBra
        >>> t = Tr(OuterProduct(JzKet(1,1), JzBra(1,1)))
        >>> t.doit()
        1

        r   Ú_eval_tracer   )r"   )r>   r3   rM   )rJ   Úhintss     r   ÚdoitzTr.doit©   sE   € õ �4”9˜Q”< Ñ/Ô/ð 	BØ”9˜Q”<×+Ò+°D´I¸a´LÐ+ÑAÔAÐAàˆr   c                 ó   — dS )NTr   )rJ   s    r   Ú	is_numberzTr.is_number»   s	   € ð ˆtr   c                 óh  — |dk    r#|t          | j        d         j        ¦  «        z  }n0t          |¦  «        t          | j        d         j        ¦  «        z   }t          | j        d         j        | d…         | j        d         j        d| …         z   ¦  «        }t	          t          |Ž ¦  «        S )aÌ   Permute the arguments cyclically.

        Parameters
        ==========

        pos : integer, if positive, shift-right, else shift-left

        Examples
        ========

        >>> from sympy.physics.quantum.trace import Tr
        >>> from sympy import symbols
        >>> A, B, C, D = symbols('A B C D', commutative=False)
        >>> t = Tr(A*B*C*D)
        >>> t.permute(2)
        Tr(C*D*A*B)
        >>> t.permute(-2)
        Tr(C*D*A*B)

        r   N)r$   r3   Úabsr'   r6   r   )rJ   Úposr3   s      r   Úpermutez
Tr.permuteÂ   sš   € ð* �Š7ˆ7Ø�˜DœI aœLÔ-Ñ.Ô.Ñ.ˆCˆCå˜‘H”H�s 4¤9¨Q¤<Ô#4Ñ5Ô5Ñ5Ð6ˆCå�D”I˜a”LÔ% s d e eÔ,¨t¬y¸¬|Ô/@ÀÀCÀ4ÀÔ/HÑHÑIÔIˆå•#˜�,ÑÔÐr   c                 óô   — t          | j        d         t          ¦  «        r-t          t	          | j        d         j        ¦  «        ¦  «        }n| j        d         g}t          |¦  «        | j        d         fz   S )Nr   r   )r   r3   r   r0   r4   r<   )rJ   r3   s     r   Ú_hashable_contentzTr._hashable_contentà   sa   € Ý�d”i ”l¥CÑ(Ô(ð 	"Ý!¥/°$´)¸A´,Ô2CÑ"DÔ"DÑEÔEˆDˆDà”I˜a”L�>ˆDå�T‰{Œ{˜dœi¨œlÐ-Ñ-Ð-r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rA   ÚpropertyrH   rO   rQ   rU   rW   r   r   r   r6   r6   O   s‘   € € € € € ðð ð<34ð 34ð 34ðj ð&ð &ñ „Xð&ð
ð ð ð$ ðð ñ „Xðð ð  ð  ð<.ð .ð .ð .ð .r   r6   N)Úsympy.core.addr   Úsympy.core.containersr   Úsympy.core.exprr   Úsympy.core.mulr   Úsympy.core.powerr   Úsympy.core.sortingr   Úsympy.core.sympifyr	   Úsympy.matricesr
   r   r0   r4   r6   r   r   r   ú<module>re      s  ðØ Ð Ð Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø  Ð  Ð  Ð  Ð  Ð  Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ø /Ð /Ð /Ð /Ð /Ð /Ø &Ð &Ð &Ð &Ð &Ð &Ø !Ð !Ð !Ð !Ð !Ð !ðð ð ð%ð %ð %ðP
ð 
ð 
ðW.ð W.ð W.ð W.ð W.ˆñ W.ô W.ð W.ð W.ð W.r   