U
    ZÊ¹j©  ã                   @   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mZmZmZmZ dd
lmZ dddddg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)ÚS)Ú	conjugate)Úexp)Úsqrt)Ú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   s
   | j d S ©Nr   )Úargs©Úself© r   úZ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/physics/quantum/boson.pyÚname.   s    zBosonOp.namec                 C   s   t | jd ƒS ©Né   )Úboolr   r   r   r   r   Úis_annihilation2   s    zBosonOp.is_annihilationc                 C   s   dS )N)ÚaTr   r   r   r   r   Údefault_args6   s    zBosonOp.default_argsc                 O   sb   t |ƒdkrtd| ƒ‚t |ƒdkr2|d tjf}t |ƒdkrR|d t|d ƒf}tj| f|žŽ S )N)r   é   z"1 or 2 parameters expected, got %sr   r   r!   )ÚlenÚ
ValueErrorr   ÚOner   r   Ú__new__)Úclsr   Úhintsr   r   r   r%   :   s    zBosonOp.__new__c                 K   s:   | j |j kr | js6|jr6tjS nd|kr6|d r6tjS d S )NÚindependent)r   r   r   ZNegativeOneÚZero©r   Úotherr'   r   r   r   Ú_eval_commutator_BosonOpF   s    z BosonOp._eval_commutator_BosonOpc                 K   s   t jS ©N)r   r)   r*   r   r   r   Ú_eval_commutator_FermionOpR   s    z"BosonOp._eval_commutator_FermionOpc                 K   s    d|kr|d rd|  | S d S )Nr(   r!   r   r*   r   r   r   Ú_eval_anticommutator_BosonOpU   s    z$BosonOp._eval_anticommutator_BosonOpc                 C   s   t t| jƒ| j ƒS r-   )r   Ústrr   r   r   r   r   r   Ú_eval_adjoint\   s    zBosonOp._eval_adjointc                 C   sn   |t dƒkr| S t|tƒrdtdd„ |jD ƒƒ}tdd„ |jD ƒƒ}| }|D ]}|| }qJt|Ž | S t| |ƒS )Nr!   c                 s   s   | ]}|j r|V  qd S r-   ©Zis_commutative©Ú.0Úargr   r   r   Ú	<genexpr>e   s      z"BosonOp.__mul__.<locals>.<genexpr>c                 s   s   | ]}|j s|V  qd S r-   r2   r3   r   r   r   r6   f   s      )r   Ú
isinstancer   Útupler   )r   r+   Zargs1Zargs2ÚxÚyr   r   r   Ú__mul___   s    

zBosonOp.__mul__c                 G   s&   | j rdt| jƒ S dt| jƒ S d S )Nz{%s}z{{%s}^\dagger}©r   r0   r   ©r   Úprinterr   r   r   r   Ú_print_contents_latexn   s    zBosonOp._print_contents_latexc                 G   s&   | j rdt| jƒ S dt| jƒ S d S )Nz%sz
Dagger(%s)r<   r=   r   r   r   Ú_print_contentst   s    zBosonOp._print_contentsc                 G   s<   ddl m} |j| jd f|žŽ }| jr,|S ||dƒ S d S )Nr   )Ú
prettyFormu   â€ )Z sympy.printing.pretty.stringpictrA   Z_printr   r   )r   r>   r   rA   Zpformr   r   r   Ú_print_contents_prettyz   s
    zBosonOp._print_contents_prettyN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úpropertyr   r   Úclassmethodr    r%   r,   r.   r/   r1   r;   r?   r@   rB   r   r   r   r   r      s    


c                   @   sL   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   s   t  | |¡S r-   ©r   r%   ©r&   Únr   r   r   r%   Ž   s    zBosonFockKet.__new__c                 C   s
   | j d S r   ©Úlabelr   r   r   r   rK   ‘   s    zBosonFockKet.nc                 C   s   t S r-   )r   r   r   r   r   Ú
dual_class•   s    zBosonFockKet.dual_classc                 C   s   t ƒ S r-   ©r
   ©r&   rM   r   r   r   Ú_eval_hilbert_space™   s    z BosonFockKet._eval_hilbert_spacec                 K   s   t | j|jƒS r-   )r   rK   ©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 d S r   )r   r   rK   r   ©r   ÚopÚoptionsr   r   r   Ú_apply_from_right_to_BosonOp    s    z)BosonFockKet._apply_from_right_to_BosonOpN)rC   rD   rE   rF   r%   rG   rK   rH   rN   rQ   rS   rW   r   r   r   r   r   ƒ   s   



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   s   t  | |¡S r-   ©r   r%   rJ   r   r   r   r%   ²   s    zBosonFockBra.__new__c                 C   s
   | j d S r   rL   r   r   r   r   rK   µ   s    zBosonFockBra.nc                 C   s   t S r-   )r   r   r   r   r   rN   ¹   s    zBosonFockBra.dual_classc                 C   s   t ƒ S r-   rO   rP   r   r   r   rQ   ½   s    z BosonFockBra._eval_hilbert_spaceN)
rC   rD   rE   rF   r%   rG   rK   rH   rN   rQ   r   r   r   r   r   §   s   


c                   @   sL   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   zœCoherent state ket for a bosonic mode.

    Parameters
    ==========

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

    c                 C   s   t  | |¡S r-   rI   ©r&   Úalphar   r   r   r%   Í   s    zBosonCoherentKet.__new__c                 C   s
   | j d S r   rL   r   r   r   r   rZ   Ð   s    zBosonCoherentKet.alphac                 C   s   t S r-   )r   r   r   r   r   rN   Ô   s    zBosonCoherentKet.dual_classc                 C   s   t ƒ S r-   )r	   rP   r   r   r   rQ   Ø   s    z$BosonCoherentKet._eval_hilbert_spacec                 K   sP   | j |j krtjS tt| j ƒd t|j ƒd  dt|j ƒ | j    d ƒS d S )Nr!   )rZ   r   r$   r   Úabsr   rR   r   r   r   Ú#_eval_innerproduct_BosonCoherentBraÜ   s    z4BosonCoherentKet._eval_innerproduct_BosonCoherentBrac                 K   s   |j r| j|  S d S d S r-   ©r   rZ   rT   r   r   r   rW   â   s    
z-BosonCoherentKet._apply_from_right_to_BosonOpN)rC   rD   rE   rF   r%   rG   rZ   rH   rN   rQ   r\   rW   r   r   r   r   r   Â   s   



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   zœCoherent state bra for a bosonic mode.

    Parameters
    ==========

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

    c                 C   s   t  | |¡S r-   rX   rY   r   r   r   r%   ô   s    zBosonCoherentBra.__new__c                 C   s
   | j d S r   rL   r   r   r   r   rZ   ÷   s    zBosonCoherentBra.alphac                 C   s   t S r-   )r   r   r   r   r   rN   û   s    zBosonCoherentBra.dual_classc                 K   s   |j s| j|  S d S d S r-   r]   rT   r   r   r   Ú_apply_operator_BosonOpÿ   s    
z(BosonCoherentBra._apply_operator_BosonOpN)
rC   rD   rE   rF   r%   rG   rZ   rH   rN   r^   r   r   r   r   r   é   s   


N)rF   Zsympy.core.mulr   Zsympy.core.numbersr   Zsympy.core.singletonr   Z$sympy.functions.elementary.complexesr   Z&sympy.functions.elementary.exponentialr   Z(sympy.functions.elementary.miscellaneousr   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$'