o
    8Va                     @   sx   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	 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)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   ?/usr/lib/python3/dist-packages/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   sf   t |dvrtd| t |dkr|d td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   r   __new__)clsr   hintsr   r   r   r   2   s   zFermionOp.__new__c                 K   s   d|v 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   sD   | j |j kr| js|jrtdS d S d|v r |d r d|  | S d S )Nr   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   _eval_anticommutator_BosonOpQ   s   z&FermionOp._eval_anticommutator_BosonOpc                 K   s   t dS 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   "   | 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,   r-   r   r   r   _print_contentsa   r0   zFermionOp._print_contentsc                 G   s:   ddl m} |j| jd g|R  }| jr|S ||d S )Nr   )
prettyFormu   †)Z sympy.printing.pretty.stringpictr2   Z_printr   r   )r   r.   r   r2   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/   r1   r3   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   r=      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   r@   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dS | jdkrtdS tdS )Nr   r   )r   r=   r
   r   )r   opoptionsr   r   r   _apply_operator_FermionOp   s   

z(FermionFockKet._apply_operator_FermionOpN)r4   r5   r6   r7   r   r8   r=   r9   rB   rC   rD   rG   r   r   r   r   r
   p   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:   r;   )r   r   r   r<   r   r   r   r      r>   zFermionFockBra.__new__c                 C   r   r   r?   r   r   r   r   r=      r   zFermionFockBra.nc                 C   rA   r(   )r
   r   r   r   r   rB      r   zFermionFockBra.dual_classN)	r4   r5   r6   r7   r   r8   r=   r9   rB   r   r   r   r   r      s    

r   N)r7   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    `,