
    MZd                         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	e      Z G d
 de      Z G d de	      Zy)zFermionic quantum operators.    )Integer)S)Operator)HilbertSpaceKetBra)KroneckerDelta)	FermionOpFermionFockKetFermionFockBrac                   v    e Zd ZdZed        Zed        Zed        Zd Z	d Z
d Zd Zd	 Zd
 Zd Zd Zd Zy)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                      | j                   d   S Nr   )argsselfs    ?/usr/lib/python3/dist-packages/sympy/physics/quantum/fermion.pynamezFermionOp.name'   s    yy|    c                 2    t        | j                  d         S )N   )boolr   r   s    r   is_annihilationzFermionOp.is_annihilation+   s    DIIaL!!r   c                      y)N)cT r   s    r   default_argszFermionOp.default_args/   s    r   c                     t        |      dvrt        d|z        t        |      dk(  r|d   t        j                  f}t        |      dk(  r|d   t	        |d         f}t        j                  | g| S )N)r      z"1 or 2 parameters expected, got %sr   r   r   )len
ValueErrorr   Oner   r   __new__)clsr   hintss      r   r#   zFermionOp.__new__3   st    4yF"ADHIIt9>GQUU#Dt9>GWT!W-.D+d++r   c                 6    d|v r|d   rt         j                  S y )Nindependentr   Zeror   otherr%   s      r   _eval_commutator_FermionOpz$FermionOp._eval_commutator_FermionOp?   s    E!eM&:66Mr   c                     | j                   |j                   k(  r)| j                  s|j                  rt        j                  S y d|v r|d   rd| z  |z  S y )Nr'   r   )r   r   r   r"   r*   s      r   _eval_anticommutator_FermionOpz(FermionOp._eval_anticommutator_FermionOpF   sT    99

"''E,A,Auu 	 e#m(<t8e##r   c                     d| z  |z  S )Nr   r   r*   s      r   _eval_anticommutator_BosonOpz&FermionOp._eval_anticommutator_BosonOpR   s    4x%r   c                 "    t         j                  S Nr(   r*   s      r   _eval_commutator_BosonOpz"FermionOp._eval_commutator_BosonOpV   s    vvr   c                 V    t        t        | j                        | j                         S r2   )r
   strr   r   r   s    r   _eval_adjointzFermionOp._eval_adjointY   s     TYYT-A-A)ABBr   c                 z    | j                   rdt        | j                        z  S dt        | j                        z  S )Nz{%s}z{{%s}^\dagger}r   r5   r   r   printerr   s      r   _print_contents_latexzFermionOp._print_contents_latex\   s1    S^++$s499~55r   c                 z    | j                   rdt        | j                        z  S dt        | j                        z  S )Nz%sz
Dagger(%s)r8   r9   s      r   _print_contentszFermionOp._print_contentsb   s1    3tyy>)) 3tyy>11r   c                     ddl m}  |j                  | j                  d   g| }| j                  r|S | |d      z  S )Nr   )
prettyFormu   †) sympy.printing.pretty.stringpictr?   _printr   r   )r   r:   r   r?   pforms        r   _print_contents_prettyz FermionOp._print_contents_prettyh   s@    ?tyy|3d3L*\222r   N)__name__
__module____qualname____doc__propertyr   r   classmethodr   r#   r,   r.   r0   r3   r6   r;   r=   rC   r   r   r   r
   r
      sq    *   " "  
,
 C623r   r
   c                   R    e Zd ZdZd Zed        Zed        Zed        Z	d Z
d Zy)	r   zxFock state ket for a fermionic mode.

    Parameters
    ==========

    n : Number
        The Fock state number.

    c                 L    |dvrt        d      t        j                  | |      S N)r   r   zn must be 0 or 1)r!   r   r#   r$   ns     r   r#   zFermionFockKet.__new__|   &    F?/00{{3""r   c                      | j                   d   S r   labelr   s    r   rN   zFermionFockKet.n       zz!}r   c                     t         S r2   )r   r   s    r   
dual_classzFermionFockKet.dual_class       r   c                     t               S r2   )r   )r$   rR   s     r   _eval_hilbert_spacez"FermionFockKet._eval_hilbert_space   s
    ~r   c                 B    t        | j                  |j                        S r2   )r	   rN   )r   brar%   s      r   !_eval_innerproduct_FermionFockBraz0FermionFockKet._eval_innerproduct_FermionFockBra   s    dffcee,,r   c                     |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   rN   r   r   r)   )r   opoptionss      r   _apply_from_right_to_FermionOpz-FermionFockKet._apply_from_right_to_FermionOp   sI    vv{%a((vvvv{%a((vvr   N)rD   rE   rF   rG   r#   rH   rN   rI   rU   rX   r[   r_   r   r   r   r   r   q   sR    #
      -
r   r   c                   6    e Zd ZdZd Zed        Zed        Zy)r   zxFock state bra for a fermionic mode.

    Parameters
    ==========

    n : Number
        The Fock state number.

    c                 L    |dvrt        d      t        j                  | |      S rL   )r!   r   r#   rM   s     r   r#   zFermionFockBra.__new__   rO   r   c                      | j                   d   S r   rQ   r   s    r   rN   zFermionFockBra.n   rS   r   c                     t         S r2   )r   r   s    r   rU   zFermionFockBra.dual_class   rV   r   N)	rD   rE   rF   rG   r#   rH   rN   rI   rU   r   r   r   r   r      s4    #
    r   r   N)rG   sympy.core.numbersr   sympy.core.singletonr   sympy.physics.quantumr   r   r   r   (sympy.functions.special.tensor_functionsr	   __all__r
   r   r   r   r   r   <module>ri      sI    " & " * 8 8 C]3 ]3@)S )XS r   