B
    [                 @   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 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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   s
   | j d S )Nr   )args)self r   :lib/python3.7/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_annihilation-   s    zBosonOp.is_annihilationc             C   s   dS )N)aTr   )r   r   r   r   default_args1   s    zBosonOp.default_argsc             O   sd   t |dkrtd| t |dkr4|d tdf}t |dkrT|d t|d f}tj| f| 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 nd|k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 )Nr   )r   )r   r%   r"   r   r   r   _eval_commutator_FermionOpM   s    z"BosonOp._eval_commutator_FermionOpc             K   s    d|kr|d rd|  | S d S )Nr$   r   r   )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   sr   |t dkr| S t|trhtdd |jD }tdd |jD }| }x|D ]}|| }qLW t| | S t| |S )Nr   c             s   s   | ]}|j r|V  qd S )N)is_commutative).0argr   r   r   	<genexpr>`   s    z"BosonOp.__mul__.<locals>.<genexpr>c             s   s   | ]}|j s|V  qd S )N)r+   )r,   r-   r   r   r   r.   a   s    )r   
isinstancer   tupler   )r   r%   Zargs1Zargs2xyr   r   r   __mul__Z   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   r)   r   )r   printerr   r   r   r   _print_contents_latexi   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   r4   r   r   r   r   _print_contentso   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.stringpictr7   Z_printr   r   )r   r4   r   r7   Zpformr   r   r   _print_contents_prettyu   s
    zBosonOp._print_contents_prettyN)__name__
__module____qualname____doc__propertyr   r   classmethodr   r    r&   r'   r(   r*   r3   r5   r6   r8   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 )N)r
   r    )r!   nr   r   r   r       s    zBosonFockKet.__new__c             C   s
   | j d S )Nr   )label)r   r   r   r   r?      s    zBosonFockKet.nc             C   s   t S )N)r   )r   r   r   r   
dual_class   s    zBosonFockKet.dual_classc             C   s   t  S )N)r	   )r!   r@   r   r   r   _eval_hilbert_space   s    z BosonFockKet._eval_hilbert_spacec             K   s   t | j|jS )N)r   r?   )r   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 )Nr   )r   r   r?   r   )r   opoptionsr   r   r   _apply_operator_BosonOp   s    z$BosonFockKet._apply_operator_BosonOpN)r9   r:   r;   r<   r    r=   r?   r>   rA   rB   rD   rG   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 )N)r   r    )r!   r?   r   r   r   r       s    zBosonFockBra.__new__c             C   s
   | j d S )Nr   )r@   )r   r   r   r   r?      s    zBosonFockBra.nc             C   s   t S )N)r   )r   r   r   r   rA      s    zBosonFockBra.dual_classc             C   s   t  S )N)r	   )r!   r@   r   r   r   rB      s    z BosonFockBra._eval_hilbert_spaceN)
r9   r:   r;   r<   r    r=   r?   r>   rA   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   zCoherent state ket for a bosonic mode.

    Parameters
    ==========

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

    c             C   s   t | |S )N)r
   r    )r!   alphar   r   r   r       s    zBosonCoherentKet.__new__c             C   s
   | j d S )Nr   )r@   )r   r   r   r   rH      s    zBosonCoherentKet.alphac             C   s   t S )N)r   )r   r   r   r   rA      s    zBosonCoherentKet.dual_classc             C   s   t  S )N)r   )r!   r@   r   r   r   rB      s    z$BosonCoherentKet._eval_hilbert_spacec             K   sR   | j |j krtdS tt| j d t|j d  dt|j  | j    d S d S )Nr   r   )rH   r   r   absr   )r   rC   r"   r   r   r   #_eval_innerproduct_BosonCoherentBra   s    z4BosonCoherentKet._eval_innerproduct_BosonCoherentBrac             K   s   |j r| j|  S d S d S )N)r   rH   )r   rE   rF   r   r   r   rG      s    
z(BosonCoherentKet._apply_operator_BosonOpN)r9   r:   r;   r<   r    r=   rH   r>   rA   rB   rJ   rG   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   zCoherent state bra for a bosonic mode.

    Parameters
    ==========

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

    c             C   s   t | |S )N)r   r    )r!   rH   r   r   r   r       s    zBosonCoherentBra.__new__c             C   s
   | j d S )Nr   )r@   )r   r   r   r   rH      s    zBosonCoherentBra.alphac             C   s   t S )N)r   )r   r   r   r   rA      s    zBosonCoherentBra.dual_classc             K   s   |j s| j|  S d S d S )N)r   rH   )r   rE   rF   r   r   r   rG      s    
z(BosonCoherentBra._apply_operator_BosonOpN)
r9   r:   r;   r<   r    r=   rH   r>   rA   rG   r   r   r   r   r      s
   	N)r<   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$'