U
    ZÊ¹jw  ã                   @   s†   d 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	 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©ÚS)Ú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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   ú\/var/www/html/bwave/python/venv/lib/python3.8/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   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   3   s    zFermionOp.__new__c                 K   s   d|kr|d rt jS d S )NÚindependent©r   ÚZero©r   Úotherr   r   r   r   Ú_eval_commutator_FermionOp?   s    z$FermionOp._eval_commutator_FermionOpc                 K   s@   | j |j kr | js<|jr<tjS nd|kr<|d r<d|  | S d S )Nr    r   )r   r   r   r   r#   r   r   r   Ú_eval_anticommutator_FermionOpF   s    z(FermionOp._eval_anticommutator_FermionOpc                 K   s   d|  | S )Nr   r   r#   r   r   r   Ú_eval_anticommutator_BosonOpR   s    z&FermionOp._eval_anticommutator_BosonOpc                 K   s   t jS ©Nr!   r#   r   r   r   Ú_eval_commutator_BosonOpV   s    z"FermionOp._eval_commutator_BosonOpc                 C   s   t t| jƒ| j ƒS r(   )r
   Ústrr   r   r   r   r   r   Ú_eval_adjointY   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   Ú_print_contentsb   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.stringpictr1   Z_printr   r   )r   r.   r   r1   Zpformr   r   r   Ú_print_contents_prettyh   s
    z FermionOp._print_contents_prettyc                 C   sl   ddl m} |dkr|jS |dkr&| S |dkdkrB|jdkrB|jS |dk dksX|jdkr`tdƒ‚t | |¡S )Nr   r   r   TFzBFermionic operators can only be raised to a positive integer power)Úsympy.core.singletonr   r   Ú
is_integerr"   r   r   Ú_eval_power)r   Úexpr   r   r   r   r5   p   s    zFermionOp._eval_powerN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úpropertyr   r   Úclassmethodr   r   r%   r&   r'   r)   r+   r/   r0   r2   r5   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 r   ©Úlabelr   r   r   r   r?   �   s    zFermionFockKet.nc                 C   s   t S r(   )r   r   r   r   r   Ú
dual_class‘   s    zFermionFockKet.dual_classc                 C   s   t ƒ S r(   )r   )r   rA   r   r   r   Ú_eval_hilbert_space•   s    z"FermionFockKet._eval_hilbert_spacec                 K   s   t | j|jƒS r(   )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jS n| jdkr2tdƒS tjS d S )Nr   r   )r   r?   r   r   r"   )r   ÚopÚoptionsr   r   r   Ú_apply_from_right_to_FermionOpœ   s    

z-FermionFockKet._apply_from_right_to_FermionOpN)r7   r8   r9   r:   r   r;   r?   r<   rB   rC   rD   rG   r   r   r   r   r   }   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 r=   )r   r   r   r>   r   r   r   r   ´   s    zFermionFockBra.__new__c                 C   s
   | j d S r   r@   r   r   r   r   r?   ¹   s    zFermionFockBra.nc                 C   s   t S r(   )r   r   r   r   r   rB   ½   s    zFermionFockBra.dual_classN)	r7   r8   r9   r:   r   r;   r?   r<   rB   r   r   r   r   r   ©   s   

N)r:   Zsympy.core.numbersr   r3   r   Zsympy.physics.quantumr   r   r   r   Z(sympy.functions.special.tensor_functionsr	   Ú__all__r
   r   r   r   r   r   r   Ú<module>   s   ýl,