o
    jgR                     @   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                    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)
commutatortensorproductc                    s$   g | ]\}}t |fi  |fqS  r   ).0stateproboptionsr   T/var/www/html/zoom/venv/lib/python3.10/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   s    )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_mulr   r   r   r      s@   *








c                    s   dd}t| j}t|dkst| ts| S | |  tts*tj	s4t ts6t j	r6| 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y   d }Y nw |d u r!tdd }|d ur!z
| fi }W n ty    d }Y nw |d u r>t t r>tt!r>t" }|r>| }|dkrFt#j$S |d u rdt|dkrT| S t| j| g  fi  S t|t"rw|t| j| fi  S t| j| | fi S )Nip_doitT   r   c                 s   *    | ]}t |ttttfp|d kV  qdS r4   Nr%   r   r   r   r   r   r-   r   r   r   	<genexpr>      ( zqapply_Mul.<locals>.<genexpr>c                 s   r5   r6   r7   r8   r   r   r   r9      r:   c                    s,   g | ]}t  j| j|  fi qS r   )r   r&   )r   nlhsr   rhsr   r   r      s   , zqapply_Mul.<locals>.<listcomp>)r   _apply_from_right_to)%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getattrr   r   r
   r   r#   )r+   r   r3   r&   commr,   _apply_rightr   r<   r   r*      s   


,





 r*   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   r   <module>   s"    	g