U
    9%e                     @   s   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d Zd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                    sb  ddl m}  dd}| dkr&tjS | jddd} t| trB| S t| trtd}| j	D ]}|t
|f 7 }qV| S t| |r fdd| j	D }|| S t| trt fd	d| j	D  S t| trt
| jf | j S t| trZ|  \}}t| }	t| }
t|
tr |	t|
f  }n|	t
|
f  }|| krT|rTttt| f S |S n| S d
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)Z
commutatortensorproductc                    s    g | ]\}}t |f |fqS  r   ).0stateZproboptionsr   [/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/sympy/physics/quantum/qapply.py
<listcomp>e   s    zqapply.<locals>.<listcomp>c                    s   g | ]}t |f qS r   r   )r   tr   r   r   r   k   s     N)Zsympy.physics.quantum.densityr   getr   Zeroexpand
isinstancer   r   argsr   r   r   baseexpr   Zargs_cnc
qapply_Mulr	   )er   r   r   resultargnew_argsZc_partZnc_partZc_mulZnc_mulr   r   r   r      s@    *






c                    s   dd}t| j}t|dks,t| ts0| S | |  ttsTtj	sht tslt j	rl| S t t
r jjr| j jd    j t tr| j  j t ttfr,  }t|trt| j||jd g  | j||jd g   fS t| j| |  fS t trtdd  jD rttrtdd jD rt jtjkrt fdd	tt jD  jdd
}t| j| f| S z jf}W n~ ttfk
rX   zj  f}W nP ttfk
rR   t t!rJtt"rJt# }|rN| }nd }Y nX Y nX |dkrjt$j%S |d krt|dkr| S t| j| g  f S n8t|t#r|t| j| f S t| j| | fS d S )Nip_doitT   r   c                 s   s(   | ] }t |ttttfp|d kV  qdS r,   Nr"   r   r   r   r   r   r)   r   r   r   	<genexpr>   s     zqapply_Mul.<locals>.<genexpr>c                 s   s(   | ] }t |ttttfp|d kV  qdS r-   r.   r/   r   r   r   r0      s     c                    s(   g | ] }t  j| j|  fqS r   )r   r#   )r   nlhsr   rhsr   r   r      s     zqapply_Mul.<locals>.<listcomp>)r   )&r   listr#   lenr"   r   popr   r   Zis_commutativer   r%   Z
is_Integerappendr$   r   ZketZbrar   r   Zdoitr   r   funcr   allranger!   r&   Z_apply_operatorNotImplementedErrorAttributeErrorZ_apply_from_right_tor   r   r
   r   r    )r'   r   r+   r#   Zcommr(   r   r2   r   r&      st    

",



r&   N) __doc__Zsympy.core.addr   Zsympy.core.mulr   Zsympy.core.powerr   Zsympy.core.singletonr   Zsympy.core.sympifyr   Z$sympy.physics.quantum.anticommutatorr   Z sympy.physics.quantum.commutatorr   Zsympy.physics.quantum.daggerr	   Z"sympy.physics.quantum.innerproductr
   Zsympy.physics.quantum.operatorr   r   Zsympy.physics.quantum.stater   r   r   r   Z#sympy.physics.quantum.tensorproductr   __all__r   r&   r   r   r   r   <module>   s    	g