o
    8Vam                     @   s   d Z ddlmZmZmZmZ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sympifyS)AntiCommutator)
Commutator)Dagger)InnerProduct)OuterProductOperator)StateKetBaseBraBaseWavefunction)TensorProductqapplyc                    sh  ddl m}  dd}| dkrtjS | jddd} t| tr!| S t| tr<d}| j	D ]}|t
|fi  7 }q+| S t| |rO fdd| j	D }|| S t| tr`t fd	d| j	D  S t| trqt
| jfi  | j S t| tr|  \}}t| }	t| }
t|
tr|	t|
fi   }n
|	t
|
fi   }|| kr|rt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)Z
commutatortensorproductc                    s$   g | ]\}}t |fi  |fqS  r   ).0stateZproboptionsr   >/usr/lib/python3/dist-packages/sympy/physics/quantum/qapply.py
<listcomp>a   s   
 zqapply.<locals>.<listcomp>c                    s   g | ]
}t |fi  qS r   r   )r   tr   r   r   r   g   s    )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s| S | |  tjr*tt	r4t jr6t t	s6| S t t
rM jjrM| j jd    j t tr[| j  j t ttfr  }t|trt| 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y-   zj fi }W n' ttfy*   t t r&tt!r&t" }|r%| }nd }Y nw Y nw |dkr6t#j$S |d u rTt|dkrD| S t| j| g  fi  S t|t"rg|t| j| fi  S t| j| | fi S )
Nip_doitT   r   c                 S   &   g | ]}t |ttttfp|d kqS r,   r"   r   r   r   r   r   r)   r   r   r   r         & zqapply_Mul.<locals>.<listcomp>c                 S   r-   r.   r/   r0   r   r   r   r      r1   c                    s,   g | ]}t  j| j|  fi qS r   )r   r#   )r   nZlhsr   Zrhsr   r   r      s   , )r   )%r   listr#   lenr"   r   popr   Zis_commutativer   r   r%   Z
is_Integerappendr$   r   ZketZbrar   r   Zdoitr   r   funcr   allranger!   r&   Z_apply_operatorNotImplementedErrorAttributeErrorr   r   r
   r   r    )r'   r   r+   r#   Zcommr(   r   r3   r   r&      s~   


,


 r&   N)__doc__Zsympyr   r   r   r   r   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