o
    8Va                     @   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	m
Z
mZmZmZ ddlmZ g dZG dd deZG d	d
 d
eZG dd deZG dd deZG dd deZdS )zBosonic quantum operators.    )MulIntegerexpsqrt	conjugate)Operator)HilbertSpace	FockSpaceKetBraIdentityOperator)KroneckerDelta)BosonOpBosonFockKetBosonFockBraBosonCoherentKetBosonCoherentBrac                   @   s|   e Zd ZdZedd Zedd Zedd Zdd	 Z	d
d Z
dd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )r   a  A bosonic operator that satisfies [a, Dagger(a)] == 1.

    Parameters
    ==========

    name : str
        A string that labels the bosonic mode.

    annihilation : bool
        A bool that indicates if the bosonic operator is an annihilation (True,
        default value) or creation operator (False)

    Examples
    ========

    >>> from sympy.physics.quantum import Dagger, Commutator
    >>> from sympy.physics.quantum.boson import BosonOp
    >>> a = BosonOp("a")
    >>> Commutator(a, Dagger(a)).doit()
    1
    c                 C   
   | j d S Nr   )argsself r   =/usr/lib/python3/dist-packages/sympy/physics/quantum/boson.pyname)      
zBosonOp.namec                 C   s   t | jd S N   )boolr   r   r   r   r   is_annihilation-   s   zBosonOp.is_annihilationc                 C   s   dS )N)aTr   r   r   r   r   default_args1      zBosonOp.default_argsc                 O   sf   t |dvrtd| t |dkr|d tdf}t |dkr*|d t|d f}tj| g|R  S )N)r      z"1 or 2 parameters expected, got %sr   r   r#   )len
ValueErrorr   r   __new__)clsr   hintsr   r   r   r&   5   s   zBosonOp.__new__c                 K   s@   | j |j kr| js|jrtdS d S d|v r|d rtdS d S )Nindependentr   )r   r   r   r   otherr(   r   r   r   _eval_commutator_BosonOpA   s   z BosonOp._eval_commutator_BosonOpc                 K   s   t dS r   )r   r+   r   r   r   _eval_commutator_FermionOpM   s   z"BosonOp._eval_commutator_FermionOpc                 K   s    d|v r|d rd|  | S d S )Nr*   r#   r   r+   r   r   r   _eval_anticommutator_BosonOpP   s   z$BosonOp._eval_anticommutator_BosonOpc                 C   s   t t| j| j S N)r   strr   r   r   r   r   r   _eval_adjointW   s   zBosonOp._eval_adjointc                 C   sn   |t dkr| S t|tr2tdd |jD }tdd |jD }| }|D ]}|| }q%t| | S t| |S )Nr#   c                 s   s    | ]}|j r|V  qd S r0   Zis_commutative.0argr   r   r   	<genexpr>`       z"BosonOp.__mul__.<locals>.<genexpr>c                 s   s    | ]}|j s|V  qd S r0   r3   r4   r   r   r   r7   a   r8   )r   
isinstancer   tupler   )r   r,   Zargs1Zargs2xyr   r   r   __mul__Z   s   


zBosonOp.__mul__c                 G   "   | j r
dt| j S dt| j S )Nz{%s}z{{%s}^\dagger}r   r1   r   r   printerr   r   r   r   _print_contents_latexi      zBosonOp._print_contents_latexc                 G   r>   )Nz%sz
Dagger(%s)r?   r@   r   r   r   _print_contentso   rC   zBosonOp._print_contentsc                 G   s:   ddl m} |j| jd g|R  }| jr|S ||d S )Nr   )
prettyFormu   †)Z sympy.printing.pretty.stringpictrE   Z_printr   r   )r   rA   r   rE   Zpformr   r   r   _print_contents_prettyu   s
   zBosonOp._print_contents_prettyN)__name__
__module____qualname____doc__propertyr   r   classmethodr!   r&   r-   r.   r/   r2   r=   rB   rD   rF   r   r   r   r   r      s"    


r   c                   @   L   e Zd ZdZdd Zedd Zedd Zedd	 Z	d
d Z
dd ZdS )r   zvFock state ket for a bosonic mode.

    Parameters
    ==========

    n : Number
        The Fock state number.

    c                 C      t | |S r0   r
   r&   r'   nr   r   r   r&         zBosonFockKet.__new__c                 C   r   r   labelr   r   r   r   rQ      r   zBosonFockKet.nc                 C      t S r0   )r   r   r   r   r   
dual_class   r"   zBosonFockKet.dual_classc                 C      t  S r0   r	   r'   rT   r   r   r   _eval_hilbert_space      z BosonFockKet._eval_hilbert_spacec                 K   s   t | j|jS r0   )r   rQ   r   Zbrar(   r   r   r   _eval_innerproduct_BosonFockBra   s   z,BosonFockKet._eval_innerproduct_BosonFockBrac                 K   s:   |j rt| jt| jd  S t| jd t| jd  S r   )r   r   rQ   r   r   opoptionsr   r   r   _apply_operator_BosonOp   s   z$BosonFockKet._apply_operator_BosonOpN)rG   rH   rI   rJ   r&   rK   rQ   rL   rV   rZ   r]   ra   r   r   r   r   r   ~   s    



r   c                   @   s<   e Zd ZdZdd Zedd Zedd Zedd	 Z	d
S )r   zvFock state bra for a bosonic mode.

    Parameters
    ==========

    n : Number
        The Fock state number.

    c                 C   rN   r0   r   r&   rP   r   r   r   r&      rR   zBosonFockBra.__new__c                 C   r   r   rS   r   r   r   r   rQ      r   zBosonFockBra.nc                 C   rU   r0   )r   r   r   r   r   rV      r"   zBosonFockBra.dual_classc                 C   rW   r0   rX   rY   r   r   r   rZ      r[   z BosonFockBra._eval_hilbert_spaceN)
rG   rH   rI   rJ   r&   rK   rQ   rL   rV   rZ   r   r   r   r   r      s    


r   c                   @   rM   )r   zCoherent state ket for a bosonic mode.

    Parameters
    ==========

    alpha : Number, Symbol
        The complex amplitude of the coherent state.

    c                 C   rN   r0   rO   r'   alphar   r   r   r&      rR   zBosonCoherentKet.__new__c                 C   r   r   rS   r   r   r   r   rd      r   zBosonCoherentKet.alphac                 C   rU   r0   )r   r   r   r   r   rV      r"   zBosonCoherentKet.dual_classc                 C   rW   r0   )r   rY   r   r   r   rZ      r[   z$BosonCoherentKet._eval_hilbert_spacec                 K   sN   | j |j kr
tdS tt| j d t|j d  dt|j  | j    d S )Nr   r#   )rd   r   r   absr   r\   r   r   r   #_eval_innerproduct_BosonCoherentBra   s   :z4BosonCoherentKet._eval_innerproduct_BosonCoherentBrac                 K   s   |j r| j|  S d S r0   r   rd   r^   r   r   r   ra         
z(BosonCoherentKet._apply_operator_BosonOpN)rG   rH   rI   rJ   r&   rK   rd   rL   rV   rZ   rf   ra   r   r   r   r   r      s    



r   c                   @   s8   e Zd ZdZdd Zedd Zedd Zdd	 Z	d
S )r   zCoherent state bra for a bosonic mode.

    Parameters
    ==========

    alpha : Number, Symbol
        The complex amplitude of the coherent state.

    c                 C   rN   r0   rb   rc   r   r   r   r&      rR   zBosonCoherentBra.__new__c                 C   r   r   rS   r   r   r   r   rd      r   zBosonCoherentBra.alphac                 C   rU   r0   )r   r   r   r   r   rV      r"   zBosonCoherentBra.dual_classc                 K   s   |j s| j|  S d S r0   rg   r^   r   r   r   ra      rh   z(BosonCoherentBra._apply_operator_BosonOpN)
rG   rH   rI   rJ   r&   rK   rd   rL   rV   ra   r   r   r   r   r      s    


r   N)rJ   Zsympyr   r   r   r   r   Zsympy.physics.quantumr   r   r	   r
   r   r   Z(sympy.functions.special.tensor_functionsr   __all__r   r   r   r   r   r   r   r   r   <module>   s    	l$'