a
    {d                     @   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                    sv  ddl m}  dd}| dkr&tjS | jddd} t| trB| S t| trxd}| j	D ]}|t
|fi  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i  | j S t| trn|  \}}t| }	t| }
t|
tr,|	t|
fi   }n|	t
|
fi   }|| krh|rhttt| fi  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i  |fqS  r   ).0stateZproboptionsr   e/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/sympy/physics/quantum/qapply.py
<listcomp>e   s   
zqapply.<locals>.<listcomp>c                    s   g | ]}t |fi  qS r   r   )r   tr   r   r   r   k       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r4  }t|trt| j||jd g  | j||jd g   fi S t| j| |  fi 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i | S z jfi }W n~ ttfyh   zj  fi }W nN ttfyb   t t!rZtt"rZt# }|r^| }nd }Y n0 Y n0 |dkrzt$j%S |d u rt|dkr| S t| j| g  fi  S n@t|t#r|t| j| fi  S t| j| | fi 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>   r   zqapply_Mul.<locals>.<genexpr>c                 s   s(   | ] }t |ttttfp|d kV  qdS r.   r/   r0   r   r   r   r1      r   c                    s,   g | ]$}t  j| j|  fi qS r   )r   r$   )r   nlhsr   rhsr   r   r      r   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   r3   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