B
    ˜‘[€  ã               @   sz   d Z ddlmZ ddlmZ ddlmZmZmZ ddlm	Z	 dddgZ
G d	d„ deƒZG d
d„ deƒZG dd„ deƒZdS )zFermionic quantum operators.é    )ÚInteger)ÚOperator)ÚHilbertSpaceÚKetÚBra)ÚKroneckerDeltaÚ	FermionOpÚFermionFockKetÚFermionFockBrac               @   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 fermionic operator that satisfies {c, Dagger(c)} == 1.

    Parameters
    ==========

    name : str
        A string that labels the fermionic mode.

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

    Examples
    ========

    >>> from sympy.physics.quantum import Dagger, AntiCommutator
    >>> from sympy.physics.quantum.fermion import FermionOp
    >>> c = FermionOp("c")
    >>> AntiCommutator(c, Dagger(c)).doit()
    1
    c             C   s
   | j d S )Nr   )Úargs)Úself© r   ú<lib/python3.7/site-packages/sympy/physics/quantum/fermion.pyÚname&   s    zFermionOp.namec             C   s   t | jd ƒS )Né   )Úboolr   )r   r   r   r   Úis_annihilation*   s    zFermionOp.is_annihilationc             C   s   dS )N)ÚcTr   )r   r   r   r   Údefault_args.   s    zFermionOp.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   2   s    zFermionOp.__new__c             K   s   d|kr|d rt dƒS d S )NÚindependentr   )r   )r   Úotherr   r   r   r   Ú_eval_commutator_FermionOp>   s    z$FermionOp._eval_commutator_FermionOpc             K   sB   | j |j kr"| js>|jr>tdƒS nd|kr>|d r>d|  | S d S )Nr   r   r   )r   r   r   )r   r   r   r   r   r   Ú_eval_anticommutator_FermionOpE   s    
z(FermionOp._eval_anticommutator_FermionOpc             K   s   d|  | S )Nr   r   )r   r   r   r   r   r   Ú_eval_anticommutator_BosonOpQ   s    z&FermionOp._eval_anticommutator_BosonOpc             K   s   t dƒS )Nr   )r   )r   r   r   r   r   r   Ú_eval_commutator_BosonOpU   s    z"FermionOp._eval_commutator_BosonOpc             C   s   t t| jƒ| j ƒS )N)r   Ústrr   r   )r   r   r   r   Ú_eval_adjointX   s    zFermionOp._eval_adjointc             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_latex[   s    zFermionOp._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#   r   r   r   r   Ú_print_contentsa   s    zFermionOp._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.stringpictr&   Z_printr   r   )r   r#   r   r&   Zpformr   r   r   Ú_print_contents_prettyg   s
    z FermionOp._print_contents_prettyN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úpropertyr   r   Úclassmethodr   r   r   r   r   r    r"   r$   r%   r'   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	   zxFock state ket for a fermionic mode.

    Parameters
    ==========

    n : Number
        The Fock state number.

    c             C   s   |dkrt dƒ‚t | |¡S )N)r   r   zn must be 0 or 1)r   r   r   )r   Únr   r   r   r   {   s    zFermionFockKet.__new__c             C   s
   | j d S )Nr   )Úlabel)r   r   r   r   r.   €   s    zFermionFockKet.nc             C   s   t S )N)r
   )r   r   r   r   Ú
dual_class„   s    zFermionFockKet.dual_classc             C   s   t ƒ S )N)r   )r   r/   r   r   r   Ú_eval_hilbert_spaceˆ   s    z"FermionFockKet._eval_hilbert_spacec             K   s   t | j|jƒS )N)r   r.   )r   Zbrar   r   r   r   Ú!_eval_innerproduct_FermionFockBraŒ   s    z0FermionFockKet._eval_innerproduct_FermionFockBrac             K   s@   |j r"| jdkrtdƒS tdƒS n| jdkr4tdƒS tdƒS d S )Nr   r   )r   r.   r	   r   )r   ÚopZoptionsr   r   r   Ú_apply_operator_FermionOp   s    


z(FermionFockKet._apply_operator_FermionOpN)r(   r)   r*   r+   r   r,   r.   r-   r0   r1   r2   r4   r   r   r   r   r	   p   s   	c               @   s0   e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZdS )	r
   zxFock state bra for a fermionic mode.

    Parameters
    ==========

    n : Number
        The Fock state number.

    c             C   s   |dkrt dƒ‚t | |¡S )N)r   r   zn must be 0 or 1)r   r   r   )r   r.   r   r   r   r   §   s    zFermionFockBra.__new__c             C   s
   | j d S )Nr   )r/   )r   r   r   r   r.   ¬   s    zFermionFockBra.nc             C   s   t S )N)r	   )r   r   r   r   r0   °   s    zFermionFockBra.dual_classN)	r(   r)   r*   r+   r   r,   r.   r-   r0   r   r   r   r   r
   œ   s   	N)r+   Zsympyr   Zsympy.physics.quantumr   r   r   r   Z(sympy.functions.special.tensor_functionsr   Ú__all__r   r	   r
   r   r   r   r   Ú<module>   s   `,