+
    iJ%                         ^ 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	IHt ^ R
IHt ^ RIHt ^ RIHt ^ RIHtHtHt ^ RIHt  ! R R]4      tR t R t!R# )    )product)Add)Tuple)expand)Mul)Slog)MutableDenseMatrix
prettyForm)Dagger)HermitianOperator)	represent)numpy_ndarrayscipy_sparse_matrixto_numpy)Trc                      a a ] tR t^t oRt]V 3R l4       tR tR tR t	R t
R tR tR	 tR
 tR tR tR tR tRtVtV ;t# )Densitya  Density operator for representing mixed states.

TODO: Density operator support for Qubits

Parameters
==========

values : tuples/lists
Each tuple/list should be of form (state, prob) or [state,prob]

Examples
========

Create a density operator with 2 states represented by Kets.

>>> from sympy.physics.quantum.state import Ket
>>> from sympy.physics.quantum.density import Density
>>> d = Density([Ket(0), 0.5], [Ket(1),0.5])
>>> d
Density((|0>, 0.5),(|1>, 0.5))

c                   < \         SV `  V4      pV F4  p\        V\        4      '       d   \	        V4      ^8X  d   K+  \        R4      h	  V# )   z?Each argument should be of form [state,prob] or ( state, prob ))super
_eval_args
isinstancer   len
ValueError)clsargsarg	__class__s   && }/Users/tonyclaw/.openclaw/workspace/skills/math-calculator/venv/lib/python3.14/site-packages/sympy/physics/quantum/density.pyr   Density._eval_args)   sN     w!$'CsE**s3x1}  "7 8 8      c                ^    \        V P                   Uu. uF  q^ ,          NK  	  up!  # u upi )zReturn list of all states.

Examples
========

>>> from sympy.physics.quantum.state import Ket
>>> from sympy.physics.quantum.density import Density
>>> d = Density([Ket(0), 0.5], [Ket(1),0.5])
>>> d.states()
(|0>, |1>)

r   r   selfr    s   & r"   statesDensity.states6   )     3#1vv3443   *c                ^    \        V P                   Uu. uF  q^,          NK  	  up!  # u upi )zReturn list of all probabilities.

Examples
========

>>> from sympy.physics.quantum.state import Ket
>>> from sympy.physics.quantum.density import Density
>>> d = Density([Ket(0), 0.5], [Ket(1),0.5])
>>> d.probs()
(0.5, 0.5)

r&   r'   s   & r"   probsDensity.probsE   r+   r,   c                :    V P                   V,          ^ ,          pV# )a  Return specific state by index.

Parameters
==========

index : index of state to be returned

Examples
========

>>> from sympy.physics.quantum.state import Ket
>>> from sympy.physics.quantum.density import Density
>>> d = Density([Ket(0), 0.5], [Ket(1),0.5])
>>> d.states()[1]
|1>

r   )r(   indexstates   && r"   	get_stateDensity.get_stateT   s    $ 		% #r$   c                :    V P                   V,          ^,          pV# )aJ  Return probability of specific state by index.

Parameters
===========

index : index of states whose probability is returned.

Examples
========

>>> from sympy.physics.quantum.state import Ket
>>> from sympy.physics.quantum.density import Density
>>> d = Density([Ket(0), 0.5], [Ket(1),0.5])
>>> d.probs()[1]
0.500000000000000

r1   )r(   r2   probs   && r"   get_probDensity.get_probi   s    $ yy"r$   c                n    V P                    UUu. uF  w  r#W,          V3NK  	  ppp\        V!  # u uppi )a{  op will operate on each individual state.

Parameters
==========

op : Operator

Examples
========

>>> from sympy.physics.quantum.state import Ket
>>> from sympy.physics.quantum.density import Density
>>> from sympy.physics.quantum.operator import Operator
>>> A = Operator('A')
>>> d = Density([Ket(0), 0.5], [Ket(1),0.5])
>>> d.apply_op(A)
Density((A*|0>, 0.5),(A*|1>, 0.5))

)r   r   )r(   opr3   r7   new_argss   &&   r"   apply_opDensity.apply_op~   s6    ( ;?))D)%RXt$)D!! Es   1c           
        . pV P                    F  w  r4VP                  4       p\        V\        4      '       dV   \	        VP                   ^R7       F8  pVP                  W@P                  V^ ,          V^,          4      ,          4       K:  	  K  VP                  W@P                  W34      ,          4       K  	  \        V!  # )aU  Expand the density operator into an outer product format.

Examples
========

>>> from sympy.physics.quantum.state import Ket
>>> from sympy.physics.quantum.density import Density
>>> from sympy.physics.quantum.operator import Operator
>>> A = Operator('A')
>>> d = Density([Ket(0), 0.5], [Ket(1),0.5])
>>> d.doit()
0.5*|0><0| + 0.5*|1><1|

)repeat)r   r   r   r   r   append_generate_outer_prod)r(   hintstermsr3   r7   r    s   &,    r"   doitDensity.doit   s      !YYMULLNE5#&&"5::a8CLL&?&?A@CA'H "H I 9 T";";E"IIJ ' E{r$   c                   VP                  4       w  r4VP                  4       w  rV\        V4      ^ 8X  g   \        V4      ^ 8X  d   \        R4      h\        V!  \	        \        V!  4      ,          p\        V!  \        V!  ,          V,          # )r   zHAtleast one-pair of Non-commutative instance required for outer product.)args_cncr   r   r   r   )r(   arg1arg2c_part1nc_part1c_part2nc_part2r;   s   &&&     r"   rB   Density._generate_outer_prod   sx     MMO MMOMQ#h-1"4 3 4 4 (^F3>22G}S']*R//r$   c                6    \        V P                  4       3/ VB # N)r   rE   )r(   optionss   &,r"   
_representDensity._represent   s    000r$   c                    R # )z\rho r(   printerr   s   &&*r"   _print_operator_name_latex"Density._print_operator_name_latex   s    r$   c                    \        R 4      # )u   ρr   rW   s   &&*r"   _print_operator_name_pretty#Density._print_operator_name_pretty   s    677r$   c                v    VP                  R . 4      p\        V P                  4       V4      P                  4       # )indices)getr   rE   )r(   kwargsr_   s   &, r"   _eval_traceDensity._eval_trace   s.    **Y+$))+w',,..r$   c                    \        V 4      # )z[Compute the entropy of a density matrix.

Refer to density.entropy() method  for examples.
)entropy)r(   s   &r"   re   Density.entropy   s    
 t}r$   rV   )__name__
__module____qualname____firstlineno____doc__classmethodr   r)   r.   r4   r8   r=   rE   rB   rS   rY   r\   rb   re   __static_attributes____classdictcell____classcell__)r!   __classdict__s   @@r"   r   r      s_     , 
 
55**".80 18/ r$   r   c                   \        V \        4      '       d   \        V 4      p \        V \        4      '       d   \	        V 4      p \        V \
        4      '       d;   V P                  4       P                  4       p\        \        R V 4       4      ) 4      # \        V \        4      '       dG   ^ RIpVP                  P                  V 4      pVP                  WP                  V4      ,          4      ) # \        R4      h)a{  Compute the entropy of a matrix/density object.

This computes -Tr(density*ln(density)) using the eigenvalue decomposition
of density, which is given as either a Density instance or a matrix
(numpy.ndarray, sympy.Matrix or scipy.sparse).

Parameters
==========

density : density matrix of type Density, SymPy matrix,
scipy.sparse or numpy.ndarray

Examples
========

>>> from sympy.physics.quantum.density import Density, entropy
>>> from sympy.physics.quantum.spin import JzKet
>>> from sympy import S
>>> up = JzKet(S(1)/2,S(1)/2)
>>> down = JzKet(S(1)/2,-S(1)/2)
>>> d = Density((up,S(1)/2),(down,S(1)/2))
>>> entropy(d)
log(2)/2

c              3   D   "   T F  q\        V4      ,          x  K  	  R # 5irQ   r	   ).0es   & r"   	<genexpr>entropy.<locals>.<genexpr>   s     5WSV88Ws    Nz4numpy.ndarray, scipy.sparse or SymPy matrix expected)r   r   r   r   r   Matrix	eigenvalskeysr   sumr   numpylinalgeigvalsr
   r   )densityr}   nps   &  r"   re   re      s    4 '7##G$'.//7#'6""##%**,s5W55566	G]	+	+))##G,wvvg.///BD 	Dr$   c                F   \        V \        4      '       d   \        V 4      MT p \        V\        4      '       d   \        V4      MTp\        V \        4      '       d   \        V\        4      '       g'   \	        R\        V 4      : R\        V4      : R24      hV P                  VP                  8w  d   V P                  '       d   \	        R4      hV \        P                  ,          p\        W!,          V,          \        P                  ,          4      P                  4       # )a#  Computes the fidelity [1]_ between two quantum states

The arguments provided to this function should be a square matrix or a
Density object. If it is a square matrix, it is assumed to be diagonalizable.

Parameters
==========

state1, state2 : a density matrix or Matrix


Examples
========

>>> from sympy import S, sqrt
>>> from sympy.physics.quantum.dagger import Dagger
>>> from sympy.physics.quantum.spin import JzKet
>>> from sympy.physics.quantum.density import fidelity
>>> from sympy.physics.quantum.represent import represent
>>>
>>> up = JzKet(S(1)/2,S(1)/2)
>>> down = JzKet(S(1)/2,-S(1)/2)
>>> amp = 1/sqrt(2)
>>> updown = (amp*up) + (amp*down)
>>>
>>> # represent turns Kets into matrices
>>> up_dm = represent(up*Dagger(up))
>>> down_dm = represent(down*Dagger(down))
>>> updown_dm = represent(updown*Dagger(updown))
>>>
>>> fidelity(up_dm, up_dm)
1
>>> fidelity(up_dm, down_dm) #orthogonal states
0
>>> fidelity(up_dm, updown_dm).evalf().round(3)
0.707

References
==========

.. [1] https://en.wikipedia.org/wiki/Fidelity_of_quantum_states

zBstate1 and state2 must be of type Density or Matrix received type=z for state1 and type=z for state2z]The dimensions of both args should be equal and the matrix obtained should be a square matrix)r   r   r   rw   r   typeshape	is_squarer   Halfr   rE   )state1state2sqrt_state1s   && r"   fidelityr     s    X #-VW"="=Yv6F",VW"="=Yv6Fff%%Z-G-Gv,V6 7 	7 ||v||#(8(8(8 E F 	F !&&.K{!+-67<<>>r$   N)"	itertoolsr   sympy.core.addr   sympy.core.containersr   sympy.core.functionr   sympy.core.mulr   sympy.core.singletonr   &sympy.functions.elementary.exponentialr
   sympy.matrices.denser   rw    sympy.printing.pretty.stringpictr   sympy.physics.quantum.daggerr   sympy.physics.quantum.operatorr   sympy.physics.quantum.representr   !sympy.physics.quantum.matrixutilsr   r   r   sympy.physics.quantum.tracer   r   re   r   rV   r$   r"   <module>r      sN      ' &  " 6 = 7 / < 5 Z Z *A AH)DX9?r$   