o
    *ήc                     @   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 g d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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   
   | j d S Nr   )argsself r   D/tmp/pip-target-vg8gfxp4/lib/python/sympy/physics/quantum/fermion.pyname'      
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/      zFermionOp.default_argsc                 O   sd   t |dvrtd| t |dkr|d tj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   Oner   r   __new__)clsr   hintsr   r   r   r   3   s   zFermionOp.__new__c                 K   s   d|v 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   sB   | j |j kr| js|jrtjS d S d|v 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   "   | j r
dt| j S dt| j S )Nz{%s}z{{%s}^\dagger}r   r,   r   r   printerr   r   r   r   _print_contents_latex\      zFermionOp._print_contents_latexc                 G   r.   )Nz%sz
Dagger(%s)r/   r0   r   r   r   _print_contentsb   r3   zFermionOp._print_contentsc                 G   s:   ddl m} |j| jd g|R  }| jr|S ||d S )Nr   )
prettyFormu   †) sympy.printing.pretty.stringpictr5   _printr   r   )r   r1   r   r5   pformr   r   r   _print_contents_prettyh   s
   z FermionOp._print_contents_prettyN)__name__
__module____qualname____doc__propertyr   r   classmethodr   r   r'   r(   r)   r+   r-   r2   r4   r9   r   r   r   r   r	      s"    


r	   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      |dvrt dt| |S N)r   r   zn must be 0 or 1)r   r   r   r    nr   r   r   r   |      zFermionFockKet.__new__c                 C   r   r   labelr   r   r   r   rC      r   zFermionFockKet.nc                 C      t S r*   )r   r   r   r   r   
dual_class   r   zFermionFockKet.dual_classc                 C   s   t  S r*   )r   )r    rF   r   r   r   _eval_hilbert_space   s   z"FermionFockKet._eval_hilbert_spacec                 K   s   t | j|jS r*   )r   rC   )r   brar!   r   r   r   !_eval_innerproduct_FermionFockBra   s   z0FermionFockKet._eval_innerproduct_FermionFockBrac                 K   s6   |j r| jdkrtdS tjS | jdkrtdS tjS )Nr   r   )r   rC   r
   r   r$   )r   opoptionsr   r   r   _apply_operator_FermionOp   s   

z(FermionFockKet._apply_operator_FermionOpN)r:   r;   r<   r=   r   r>   rC   r?   rH   rI   rK   rN   r   r   r   r   r
   q   s    



r
   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   r@   rA   )r   r   r   rB   r   r   r   r      rD   zFermionFockBra.__new__c                 C   r   r   rE   r   r   r   r   rC      r   zFermionFockBra.nc                 C   rG   r*   )r
   r   r   r   r   rH      r   zFermionFockBra.dual_classN)	r:   r;   r<   r=   r   r>   rC   r?   rH   r   r   r   r   r      s    

r   N)r=   sympy.core.numbersr   sympy.core.singletonr   sympy.physics.quantumr   r   r   r   (sympy.functions.special.tensor_functionsr   __all__r	   r
   r   r   r   r   r   <module>   s    `,