U
    9%e                     @   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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/Darija-Ai-API/env/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.stringpictr0   Z_printr   r   )r   r-   r   r0   Z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*   r.   r/   r1   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   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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)r2   r3   r4   r5   r   r6   r:   r7   r=   r>   r?   rB   r   r   r   r   r
   q   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 r8   )r   r   r   r9   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   r=      s    zFermionFockBra.dual_classN)	r2   r3   r4   r5   r   r6   r:   r7   r=   r   r   r   r   r      s   

N)r5   Zsympy.core.numbersr   Zsympy.core.singletonr   Zsympy.physics.quantumr   r   r   r   Z(sympy.functions.special.tensor_functionsr   __all__r	   r
   r   r   r   r   r   <module>   s   `,