+
    i                         ^ RI Ht ^ RIHt ^ RIHt ^ RIHt ^ RIH	t	 ^ RI
Ht ^ RIHt ^ RIHt R	 tR
 tR t ! R R]4      tR# )    )Add)Tuple)Expr)Mul)Pow)default_sort_key)sympify)Matrixc                $   \        V 4      p \        V \        4      '       do   V P                  '       g[   V P                  '       gI   V P
                  '       g7   V P                  '       g%   V P                  '       d   V P                  '       d   R# R# )zHelper method used in TrTF)	r	   
isinstancer   
is_Integeris_Floatis_Rational	is_Number	is_Symbolis_commutative)es   &{/Users/tonyclaw/.openclaw/workspace/skills/math-calculator/venv/lib/python3.14/site-packages/sympy/physics/quantum/trace.py
_is_scalarr      sV     	
A!TLLLAJJJMMMQ[[[[[[Q---    c                ,   \        V 4      ^8X  d   V # \        V \        R7      p\        V 4       UUu. uF  w  r#W18X  g   K  VNK  	  ppp\	        V 4      pVP                  V 4       VP                  \        V 4      V^ ,          ,           4       \        \        V4      ^,
          4       Uu. uF  q%WB,          WB^,           ,           .NK  	  ppVP                  \        V4      4      pWTV,          WG,          \        V 4      ,            pV# u uppi u upi )a  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

)key)	lenminr   	enumeratelistextendappendrangeindex)	lmin_itemixindiceslesublistidx	ordered_ls	   &        r   _cycle_permuter*      s     1v{1*+H&q\;\TQQ]qq\G;	aBIIaL NN3q6GAJ&' S\A%&(& 457:g!en-.&  (
 --G
%C3<s1v 56I' <(s   
DD+!Dc                    \        V 4      ^8X  d   V # \        V RR 4      pVP                  V ^ R 4       \        V!  P                  # )z\this just moves the last arg to first position
to enable expansion of args
A,B,A ==> A**2,B
N)r   r   r   r   args)r!   r$   s   & r   _rearrange_argsr.   B   sC    
 1v{QrsVAHHQqW7<<r   c                   \   a  ] tR t^Ot o RtR t]R 4       tR t]R 4       t	R t
R tRtV tR	# )
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           	        \        V4      ^8X  dV   \        V^,          \        \        \        34      '       g   \        V^,          4      pM\        V^,          !  pV^ ,          pM/\        V4      ^8X  d   \        4       pV^ ,          pM\        R4      h\        V\        4      '       d   VP                  4       # \        VR4      '       d,   \        VP                  4      '       d   VP                  4       # \        V\        4      '       d-   \        VP                   Uu. uF  p\        WB4      NK  	  up!  # \        V\        4      '       dm   VP                  4       w  rV\        V4      ^ 8X  d
   \        V!  # \        P                   ! V \        V!  V4      p\        V4      ^ 8  d   \        V!  V,          # T# \        V\"        4      '       d^   \%        VP                  ^ ,          4      '       d%   \%        VP                  ^,          4      '       d   V# \        P                   ! WV4      # \%        V4      '       d   V# \        P                   ! WV4      # u upi )ztConstruct a Trace object.

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

z5Arguments to Tr should be of form (expr[, [indices]])trace)r   r   r   r   tuple
ValueErrorr
   r2   hasattrcallabler   r-   r0   r   args_cncr   __new__r   r   )clsr-   r%   exprargc_partnc_partobjs   &*      r   r8   
Tr.__new__n   s    INd1geU';<<Q.a/7D$i1ngG7D 3 4 4 dF##::<T7##(<(<::<c""TYY?YcC)Y?@@c"""mmoOF7|q F|#ll3Ww@ ,/v;?sF|C'CCc""499Q<((tyy|,,||Cw774  <<733) @s   !Ic                X    V P                   ^ ,          pVP                  pVP                  # r   )r-   kindelement_kind)selfr:   	expr_kinds   &  r   rB   Tr.kind   s$    yy|II	%%%r   c                    \        V P                  ^ ,          R4      '       d5   V P                  ^ ,          P                  V P                  ^,          R7      # V # )aE  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

_eval_trace)r%   )r5   r-   rH   )rD   hintss   &,r   doitTr.doit   sB     499Q<//99Q<++DIIaL+AAr   c                    R # )T )rD   s   &r   	is_numberTr.is_number   s     r   c                   V^ 8  d/   V\        V P                  ^ ,          P                  4      ,          pM7\        V4      \        V P                  ^ ,          P                  4      ,          ) p\        V P                  ^ ,          P                  V) R V P                  ^ ,          P                  ^ V)  ,           4      p\	        \        V!  4      # )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)

N)r   r-   absr   r0   r   )rD   posr-   s   && r   permute
Tr.permute   s    * 7DIIaL--..CHs499Q<#4#4556CDIIaL%%sde,tyy|/@/@C4/HHI#,r   c                    \        V P                  ^ ,          \        4      '       d1   \        \	        V P                  ^ ,          P                  4      4      pMV P                  ^ ,          .p\        V4      V P                  ^,          3,           # rA   )r   r-   r   r*   r.   r3   )rD   r-   s   & r   _hashable_contentTr._hashable_content   s]    diilC((!/$))A,2C2C"DEDIIaL>DT{diil---r   rM   N)__name__
__module____qualname____firstlineno____doc__r8   propertyrB   rJ   rN   rS   rV   __static_attributes____classdictcell__)__classdict__s   @r   r0   r0   O   sL     <34j & &
$   <. .r   r0   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   r*   r.   r0   rM   r   r   <module>ri      s;     '      / & !%P
W. W.r   