
    Ed                         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
 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mZmZmZ ddlmZ dgZd Zd ZdS )z}Logic for applying operators to states.

Todo:
* Sometimes the final result needs to be expanded, we should do this by hand.
    )Add)Mul)Pow)S)sympify)AntiCommutator)
Commutator)Dagger)InnerProduct)OuterProductOperator)StateKetBaseBraBaseWavefunction)TensorProductqapplyc                    ddl m}                     dd          }| dk    rt          j        S |                     dd          } t          | t                    r| S t          | t                    r0d}| j	        D ]}|t          |fi z  }|                                S t          | |          rfd| j	        D             } || S t          | t                    rt          fd| j	        D              S t          | t                    rt          | j        fi | j        z  S t          | t                    r|                                 \  }}t          | }	t          | }
t          |
t                    r|	t#          |
fi z  }n|	t          |
fi z  }|| k    r)|r't%          t#          t%          |           fi           S |S | S )	a_  Apply operators to states in a quantum expression.

    Parameters
    ==========

    e : Expr
        The expression containing operators and states. This expression tree
        will be walked to find operators acting on states symbolically.
    options : dict
        A dict of key/value pairs that determine how the operator actions
        are carried out.

        The following options are valid:

        * ``dagger``: try to apply Dagger operators to the left
          (default: False).
        * ``ip_doit``: call ``.doit()`` in inner products when they are
          encountered (default: True).

    Returns
    =======

    e : Expr
        The original expression, but with the operators applied to states.

    Examples
    ========

        >>> from sympy.physics.quantum import qapply, Ket, Bra
        >>> b = Bra('b')
        >>> k = Ket('k')
        >>> A = k * b
        >>> A
        |k><b|
        >>> qapply(A * b.dual / (b * b.dual))
        |k>
        >>> qapply(k.dual * A / (k.dual * k), dagger=True)
        <b|
        >>> qapply(k.dual * A / (k.dual * k))
        <k|*|k><b|/<k|k>
    r   )DensitydaggerFT)
commutatortensorproductc                 4    g | ]\  }}t          |fi |fS  r   ).0stateproboptionss      <lib/python3.11/site-packages/sympy/physics/quantum/qapply.py
<listcomp>zqapply.<locals>.<listcomp>e   sE     & & & :% E--W--t4 & & &    c                 *    g | ]}t          |fi S r   r   )r   tr   s     r    r!   zqapply.<locals>.<listcomp>k   s)    DDDva33733DDDr"   )sympy.physics.quantum.densityr   getr   Zeroexpand
isinstancer   r   argsr   r   r   baseexpr   args_cnc
qapply_Mulr
   )er   r   r   resultargnew_argsc_partnc_partc_mulnc_muls    `         r    r   r      s8   T 655555[[5))FAv v 	
D55A !W * 
As		 %6 	- 	-CfS,,G,,,FF}} 
Aw		 & & & &f& & &w!! 
A}	%	% DDDDQVDDDEE 
As		 af((((!%// 
As		 **,,Vgfc"" 	5:f88888FF6&44G444FQ; 	6 	*VAYY::'::;;;M
 r"   c                 (                        dd          }t          | j                  }t          |          dk    st	          | t
                    s| S |                                |                                t	          t                    st                    j	        s)t	          t                    st                    j	        r| S t	          t                    r8j        j        r,|                    j        j        dz
  z             j        t	          t                    r!|                    j                   j        t	          t$          t&          f          r                                }t	          |t*                    r@t-           | j        ||j        d         gz     | j        ||j        d         gz    z   fi S t-           | j        | |z  z  fi S t	          t0                    rt3          d j        D                       rt	          t0                    rt3          d j        D                       rt          j                  t          j                  k    rbt1          fdt5          t          j                            D                                  d          }t9           | j        | fi |z  S 	  j        fi }n# t<          t>          f$ r} 	  j        fi }nj# t<          t>          f$ rV t	          t@                    r<t	          tB                    r'tE                    }|r|                                }nd }Y nw xY wY nw xY w|dk    rtF          j$        S |1t          |          dk    r| S t9           | j        |gz    fi z  S t	          |tD                    r|t9           | j        | fi z  S t-           | j        | |z  fi S )	Nip_doitT   r   c              3   r   K   | ]2}t          |t          t          t          t          f          p|d k    V  3dS r9   Nr)   r   r   r   r   r   r1   s     r    	<genexpr>zqapply_Mul.<locals>.<genexpr>   sD      -{-{knjxPSUX>Y.Z.Z.f^aef^f-{-{-{-{-{-{r"   c              3   r   K   | ]2}t          |t          t          t          t          f          p|d k    V  3dS r;   r<   r=   s     r    r>   zqapply_Mul.<locals>.<genexpr>   s\        3A  3Aps:cHeUXZ]C^3_3_3kcfjkck  3A  3A  3A  3A  3A  3Ar"   c                 \    g | ](}t          j        |         j        |         z  fi )S r   )r   r*   )r   nlhsr   rhss     r    r!   zqapply_Mul.<locals>.<listcomp>   s;     j j jPQCHQK(?!K!K7!K!K j j jr"   )r   )%r&   listr*   lenr)   r   popr   r   is_commutativer   r,   
is_Integerappendr+   r   ketbrar	   r   doitr   r   funcr   allranger(   r.   _apply_operatorNotImplementedErrorAttributeErrorr   r   r   r   r'   )r/   r   r8   r*   commr0   rB   rC   s    `    @@r    r.   r.      s   kk)T**G<<D 4yyA~ Z3// 
((**C
((**C sL)) gcll.I C..3:3<<3N #s  2 CHsw{+,,,h #|$$ CGg #
N344 	=xxzzdC   	=1s 3351s 3356     &!&$-,S0<<G<<< #}%% ;#-{-{rurz-{-{-{*{*{ ;sM**;/2  3A  3Awzw  3A  3A  3A  0A  0A;MMS]]*;  j j j j j jUZ[^_b_g[h[hUiUi j j jkrr  BFr  G  G&!&$-33733F::$$S44G440 	 	 		(S(8888FF#^4 	 	 	#w'' JsG,D,D %c3// +#[[]]F		 { 7v	 	7t99> 	FHfaftse|5AAAA#EE	FL	)	) 7j::'::::fafdmF*66g666s7   *K9 9NLNA$N>N NNNN) __doc__sympy.core.addr   sympy.core.mulr   sympy.core.powerr   sympy.core.singletonr   sympy.core.sympifyr   $sympy.physics.quantum.anticommutatorr    sympy.physics.quantum.commutatorr	   sympy.physics.quantum.daggerr
   "sympy.physics.quantum.innerproductr   sympy.physics.quantum.operatorr   r   sympy.physics.quantum.stater   r   r   r   #sympy.physics.quantum.tensorproductr   __all__r   r.   r   r"   r    <module>rb      s>                            " " " " " " & & & & & & ? ? ? ? ? ? 7 7 7 7 7 7 / / / / / / ; ; ; ; ; ; A A A A A A A A M M M M M M M M M M M M = = = = = = d d dNI7 I7 I7 I7 I7r"   