Exemplo n.º 1
0
def test_ascii_bra_operations():
    """Test the ascii representation of bra operations"""
    hs1 = LocalSpace('q_1', dimension=2)
    hs2 = LocalSpace('q_2', dimension=2)
    psi1 = KetSymbol("Psi_1", hs=hs1)
    psi2 = KetSymbol("Psi_2", hs=hs1)
    psi2 = KetSymbol("Psi_2", hs=hs1)
    psi3 = KetSymbol("Psi_3", hs=hs1)
    phi = KetSymbol("Phi", hs=hs2)
    bra_psi1 = KetSymbol("Psi_1", hs=hs1).dag()
    bra_psi2 = KetSymbol("Psi_2", hs=hs1).dag()
    bra_psi2 = KetSymbol("Psi_2", hs=hs1).dag()
    bra_psi3 = KetSymbol("Psi_3", hs=hs1).dag()
    bra_phi = KetSymbol("Phi", hs=hs2).dag()
    A = OperatorSymbol("A_0", hs=hs1)
    gamma = symbols('gamma', positive=True)
    phase = exp(-I * gamma)
    assert ascii((psi1 + psi2).dag()) == '<Psi_1|^(q_1) + <Psi_2|^(q_1)'
    assert ascii(bra_psi1 + bra_psi2) == '<Psi_1|^(q_1) + <Psi_2|^(q_1)'
    assert (ascii(
        (psi1 - psi2 +
         psi3).dag()) == '<Psi_1|^(q_1) - <Psi_2|^(q_1) + <Psi_3|^(q_1)')
    assert (ascii(bra_psi1 - bra_psi2 +
                  bra_psi3) == '<Psi_1|^(q_1) - <Psi_2|^(q_1) + <Psi_3|^(q_1)')
    assert ascii((psi1 * phi).dag()) == '<Psi_1|^(q_1) * <Phi|^(q_2)'
    assert ascii(bra_psi1 * bra_phi) == '<Psi_1|^(q_1) * <Phi|^(q_2)'
    assert ascii(Bra(phase * psi1)) == 'exp(I*gamma) * <Psi_1|^(q_1)'
    assert ascii((A * psi1).dag()) == '<Psi_1|^(q_1) A_0^(q_1)H'
Exemplo n.º 2
0
def test_ascii_symbolic_labels():
    """Test ascii representation of symbols with symbolic labels"""
    i = IdxSym('i')
    j = IdxSym('j')
    hs0 = LocalSpace(0)
    hs1 = LocalSpace(1)
    Psi = IndexedBase('Psi')
    assert ascii(BasisKet(FockIndex(2 * i), hs=hs0)) == '|2*i>^(0)'
    assert ascii(KetSymbol(StrLabel(2 * i), hs=hs0)) == '|2*i>^(0)'
    assert (ascii(KetSymbol(StrLabel(Psi[i, j]),
                            hs=hs0 * hs1)) == '|Psi_ij>^(0*1)')
    expr = BasisKet(FockIndex(i), hs=hs0) * BasisKet(FockIndex(j), hs=hs1)
    assert ascii(expr) == '|i,j>^(0*1)'
    assert ascii(Bra(BasisKet(FockIndex(2 * i), hs=hs0))) == '<2*i|^(0)'
    assert (ascii(LocalSigma(FockIndex(i), FockIndex(j),
                             hs=hs0)) == '|i><j|^(0)')
    expr = CoherentStateKet(symbols('alpha'), hs=1).to_fock_representation()
    assert (ascii(expr) == 'exp(-alpha*conjugate(alpha)/2) * '
            '(Sum_{n in H_1} alpha**n/sqrt(n!) * |n>^(1))')

    tls = SpinSpace(label='s', spin='1/2', basis=('down', 'up'))
    Sig = IndexedBase('sigma')
    n = IdxSym('n')
    Sig_n = OperatorSymbol(StrLabel(Sig[n]), hs=tls)
    assert ascii(Sig_n, show_hs_label=False) == 'sigma_n'
Exemplo n.º 3
0
def test_tex_symbolic_labels():
    """Test tex representation of symbols with symbolic labels"""
    i = IdxSym('i')
    j = IdxSym('j')
    hs0 = LocalSpace(0)
    hs1 = LocalSpace(1)
    Psi = IndexedBase('Psi')
    with configure_printing(tex_use_braket=True):
        assert latex(BasisKet(FockIndex(2 * i), hs=hs0)) == r'\Ket{2 i}^{(0)}'
        assert latex(KetSymbol(StrLabel(2 * i), hs=hs0)) == r'\Ket{2 i}^{(0)}'
        assert (latex(KetSymbol(StrLabel(Psi[i, j]), hs=hs0 *
                                hs1)) == r'\Ket{\Psi_{i j}}^{(0 \otimes 1)}')
        expr = BasisKet(FockIndex(i), hs=hs0) * BasisKet(FockIndex(j), hs=hs1)
        assert latex(expr) == r'\Ket{i,j}^{(0 \otimes 1)}'
        assert (latex(Bra(BasisKet(FockIndex(2 * i),
                                   hs=hs0))) == r'\Bra{2 i}^{(0)}')
        assert (latex(LocalSigma(FockIndex(i), FockIndex(j),
                                 hs=hs0)) == r'\Ket{i}\!\Bra{j}^{(0)}')
        alpha = symbols('alpha')
        expr = CoherentStateKet(alpha, hs=1).to_fock_representation()
        assert (latex(expr) == r'e^{- \frac{\alpha \overline{\alpha}}{2}} '
                r'\left(\sum_{n \in \mathcal{H}_{1}} '
                r'\frac{\alpha^{n}}{\sqrt{n!}} \Ket{n}^{(1)}\right)')
        assert (latex(
            expr, conjg_style='star') == r'e^{- \frac{\alpha {\alpha}^*}{2}} '
                r'\left(\sum_{n \in \mathcal{H}_{1}} '
                r'\frac{\alpha^{n}}{\sqrt{n!}} \Ket{n}^{(1)}\right)')

    tls = SpinSpace(label='s', spin='1/2', basis=('down', 'up'))
    Sig = IndexedBase('sigma')
    n = IdxSym('n')
    Sig_n = OperatorSymbol(StrLabel(Sig[n]), hs=tls)
    assert latex(Sig_n, show_hs_label=False) == r'\hat{\sigma}_{n}'
Exemplo n.º 4
0
def test_qubit_state_bra():
    """Test  sum_i alpha_i <i| for TLS"""
    i = IdxSym('i')
    alpha = IndexedBase('alpha')
    alpha_i = alpha[i]
    hs_tls = LocalSpace('tls', basis=('g', 'e'))

    term = alpha_i * BasisKet(FockIndex(i), hs=hs_tls).dag()

    expr = KetIndexedSum.create(term, ranges=IndexOverFockSpace(i, hs=hs_tls))

    assert IndexOverFockSpace(i, hs=hs_tls) in expr.ket.kwargs['ranges']

    assert ascii(expr) == "Sum_{i in H_tls} alpha_i * <i|^(tls)"

    assert expr.ket.term.free_symbols == set([i, symbols('alpha'), alpha_i])
    assert expr.free_symbols == set([symbols('alpha'), alpha_i])
    assert expr.ket.variables == [i]
    assert expr.space == hs_tls
    assert len(expr.ket.args) == 1
    assert len(expr.ket.operands) == 1
    assert len(expr.ket.kwargs) == 1
    assert expr.ket.args[0] == term.ket
    assert expr.ket.term == term.ket
    assert len(expr.kwargs) == 0
    expr_expand = Bra.create(expr.ket.doit().substitute({
        alpha[0]: alpha['g'],
        alpha[1]: alpha['e']
    }))
    assert expr_expand == (alpha['g'] * BasisKet('g', hs=hs_tls).dag() +
                           alpha['e'] * BasisKet('e', hs=hs_tls).dag())
    assert ascii(expr_expand) == 'alpha_e * <e|^(tls) + alpha_g * <g|^(tls)'
Exemplo n.º 5
0
def test_tex_bra_elements():
    """Test the tex representation of "atomic" kets"""
    hs1 = LocalSpace('q1', basis=('g', 'e'))
    hs2 = LocalSpace('q2', basis=('g', 'e'))
    alpha, beta = symbols('alpha, beta')
    bra = Bra(KetSymbol('Psi', hs=hs1))
    assert latex(bra) == r'\left\langle \Psi \right\rvert^{(q_{1})}'
    assert latex(Bra(KetSymbol('Psi', alpha, beta, hs=hs1))) == (
        r'\left\langle \Psi\left(\alpha, \beta\right) \right\rvert^{(q_{1})}')
    assert latex(bra, tex_use_braket=True) == r'\Bra{\Psi}^{(q_{1})}'
    assert (latex(bra, tex_use_braket=True,
                  show_hs_label='subscript') == r'\Bra{\Psi}_{(q_{1})}')
    assert (latex(bra, tex_use_braket=True,
                  show_hs_label=False) == r'\Bra{\Psi}')
    assert (latex(Bra(KetSymbol(
        'Psi', hs=1))) == r'\left\langle \Psi \right\rvert^{(1)}')
    assert (latex(Bra(KetSymbol(
        'Psi',
        hs=(1, 2)))) == r'\left\langle \Psi \right\rvert^{(1 \otimes 2)}')
    assert (latex(Bra(KetSymbol(
        'Psi', hs=hs1 *
        hs2))) == r'\left\langle \Psi \right\rvert^{(q_{1} \otimes q_{2})}')
    assert (latex(KetSymbol(
        'Psi', hs=1).dag()) == r'\left\langle \Psi \right\rvert^{(1)}')
    assert latex(Bra(ZeroKet)) == '0'
    assert latex(Bra(TrivialKet)) == '1'
    assert (latex(BasisKet(
        'e', hs=hs1).adjoint()) == r'\left\langle e \right\rvert^{(q_{1})}')
    assert (latex(BasisKet(
        1, hs=1).adjoint()) == r'\left\langle 1 \right\rvert^{(1)}')
    assert (latex(CoherentStateKet(
        2.0, hs=1).dag()) == r'\left\langle \alpha=2 \right\rvert^{(1)}')
Exemplo n.º 6
0
def test_unicode_bra_operations():
    """Test the unicode representation of bra operations"""
    hs1 = LocalSpace('q_1', dimension=2)
    hs2 = LocalSpace('q_2', dimension=2)
    psi1 = KetSymbol("Psi_1", hs=hs1)
    psi2 = KetSymbol("Psi_2", hs=hs1)
    psi2 = KetSymbol("Psi_2", hs=hs1)
    phi = KetSymbol("Phi", hs=hs2)
    gamma = symbols('gamma', positive=True)
    phase = exp(-I * gamma)
    assert unicode((psi1 + psi2).dag()) == '⟨Ψ₁|^(q₁) + ⟨Ψ₂|^(q₁)'
    assert unicode((psi1 * phi).dag()) == '⟨Ψ₁|^(q₁) ⊗ ⟨Φ|^(q₂)'
    assert unicode(Bra(phase * psi1)) == 'exp(ⅈ γ) ⟨Ψ₁|^(q₁)'
Exemplo n.º 7
0
def test_tex_bra_operations():
    """Test the tex representation of bra operations"""
    hs1 = LocalSpace('q_1', dimension=2)
    hs2 = LocalSpace('q_2', dimension=2)
    psi1 = KetSymbol("Psi_1", hs=hs1)
    psi2 = KetSymbol("Psi_2", hs=hs1)
    psi2 = KetSymbol("Psi_2", hs=hs1)
    bra_psi1 = KetSymbol("Psi_1", hs=hs1).dag()
    bra_psi2 = KetSymbol("Psi_2", hs=hs1).dag()
    bra_psi2 = KetSymbol("Psi_2", hs=hs1).dag()
    bra_psi3 = KetSymbol("Psi_3", hs=hs1).dag()
    bra_phi = KetSymbol("Phi", hs=hs2).dag()
    A = OperatorSymbol("A_0", hs=hs1)
    gamma = symbols('gamma', positive=True)
    phase = exp(-I * gamma)
    assert (latex(
        (psi1 +
         psi2).dag()) == r'\left\langle \Psi_{1} \right\rvert^{(q_{1})} + '
            r'\left\langle \Psi_{2} \right\rvert^{(q_{1})}')
    assert (latex((psi1 + psi2).dag(), tex_use_braket=True) ==
            r'\Bra{\Psi_{1}}^{(q_{1})} + \Bra{\Psi_{2}}^{(q_{1})}')
    assert (
        latex(bra_psi1 +
              bra_psi2) == r'\left\langle \Psi_{1} \right\rvert^{(q_{1})} + '
        r'\left\langle \Psi_{2} \right\rvert^{(q_{1})}')
    assert (
        latex(bra_psi1 - bra_psi2 +
              bra_psi3) == r'\left\langle \Psi_{1} \right\rvert^{(q_{1})} - '
        r'\left\langle \Psi_{2} \right\rvert^{(q_{1})} + '
        r'\left\langle \Psi_{3} \right\rvert^{(q_{1})}')
    assert (latex(
        bra_psi1 *
        bra_phi) == r'\left\langle \Psi_{1} \right\rvert^{(q_{1})} \otimes '
            r'\left\langle \Phi \right\rvert^{(q_{2})}')
    assert (latex(bra_psi1 * bra_phi, tex_use_braket=True) ==
            r'\Bra{\Psi_{1}}^{(q_{1})} \otimes \Bra{\Phi}^{(q_{2})}')
    assert (latex(Bra(
        phase *
        psi1)) == r'e^{i \gamma} \left\langle \Psi_{1} \right\rvert^{(q_{1})}')
    assert (latex(
        (A * psi1).dag()) == r'\left\langle \Psi_{1} \right\rvert^{(q_{1})} '
            r'\hat{A}_{0}^{(q_{1})\dagger}')
Exemplo n.º 8
0
def test_unicode_bra_elements():
    """Test the unicode representation of "atomic" kets"""
    hs1 = LocalSpace('q1', basis=('g', 'e'))
    alpha, beta = symbols('alpha, beta')
    assert unicode(Bra(KetSymbol('Psi', hs=hs1))) == '⟨Ψ|^(q₁)'
    assert unicode(Bra(KetSymbol('Psi', hs=1))) == '⟨Ψ|⁽¹⁾'
    assert unicode(Bra(KetSymbol('Psi', alpha, beta,
                                 hs=hs1))) == ('⟨Ψ(α, β)|^(q₁)')
    assert unicode(Bra(KetSymbol('Psi', hs=(1, 2)))) == '⟨Ψ|^(1⊗2)'
    assert unicode(Bra(ZeroKet)) == '0'
    assert unicode(Bra(TrivialKet)) == '1'
    assert unicode(BasisKet('e', hs=hs1).adjoint()) == '⟨e|^(q₁)'
    assert unicode(BasisKet(1, hs=1).adjoint()) == '⟨1|⁽¹⁾'
    assert unicode(CoherentStateKet(2.0, hs=1).dag()) == '⟨α=2|⁽¹⁾'
    assert unicode(CoherentStateKet(0.5j, hs=1).dag()) == '⟨α=0.5j|⁽¹⁾'
    assert unicode(CoherentStateKet(I / 2, hs=1).dag()) == '⟨α=ⅈ/2|⁽¹⁾'
Exemplo n.º 9
0
def test_braket_indexed_sum():
    """Test braket product of sums"""
    i = IdxSym('i')
    hs = LocalSpace(1, dimension=5)
    alpha = IndexedBase('alpha')

    psi = KetSymbol('Psi', hs=hs)

    psi1 = KetIndexedSum(
        alpha[1, i] * BasisKet(FockIndex(i), hs=hs),
        ranges=IndexOverFockSpace(i, hs),
    )

    psi2 = KetIndexedSum(
        alpha[2, i] * BasisKet(FockIndex(i), hs=hs),
        ranges=IndexOverFockSpace(i, hs),
    )

    expr = Bra.create(psi1) * psi2
    assert expr.space == TrivialSpace
    assert expr == ScalarIndexedSum.create(
        alpha[1, i].conjugate() * alpha[2, i],
        ranges=(IndexOverFockSpace(i, hs), ),
    )
    assert BraKet.create(psi1, psi2) == expr

    expr = psi.dag() * psi2
    assert expr == ScalarIndexedSum(
        alpha[2, i] * BraKet(psi, BasisKet(FockIndex(i), hs=hs)),
        ranges=IndexOverFockSpace(i, hs),
    )
    assert BraKet.create(psi, psi2) == expr

    expr = psi1.dag() * psi
    assert expr == ScalarIndexedSum(
        alpha[1, i].conjugate() * BraKet(BasisKet(FockIndex(i), hs=hs), psi),
        ranges=IndexOverFockSpace(i, hs),
    )
    assert BraKet.create(psi1, psi) == expr
Exemplo n.º 10
0
def test_ascii_bra_elements():
    """Test the ascii representation of "atomic" kets"""
    hs1 = LocalSpace('q1', basis=('g', 'e'))
    hs2 = LocalSpace('q2', basis=('g', 'e'))
    bra = Bra(KetSymbol('Psi', hs=1))
    alpha, beta = symbols('alpha, beta')
    assert ascii(Bra(KetSymbol('Psi', hs=hs1))) == '<Psi|^(q1)'
    assert ascii(bra) == '<Psi|^(1)'
    assert ascii(bra, show_hs_label=False) == '<Psi|'
    assert ascii(bra, show_hs_label='subscript') == '<Psi|_(1)'
    assert ascii(Bra(KetSymbol('Psi', alpha, beta,
                               hs=hs1))) == ('<Psi(alpha, beta)|^(q1)')
    assert ascii(Bra(KetSymbol('Psi', hs=(1, 2)))) == '<Psi|^(1*2)'
    assert ascii(Bra(KetSymbol('Psi', hs=hs1 * hs2))) == '<Psi|^(q1*q2)'
    assert ascii(KetSymbol('Psi', hs=1).dag()) == '<Psi|^(1)'
    assert ascii(Bra(ZeroKet)) == '0'
    assert ascii(Bra(TrivialKet)) == '1'
    assert ascii(BasisKet('e', hs=hs1).adjoint()) == '<e|^(q1)'
    assert ascii(BasisKet(1, hs=1).adjoint()) == '<1|^(1)'
    assert ascii(CoherentStateKet(2.0, hs=1).dag()) == '<alpha=2|^(1)'
    assert ascii(CoherentStateKet(2.1, hs=1).dag()) == '<alpha=2.1|^(1)'
    assert ascii(CoherentStateKet(0.5j, hs=1).dag()) == '<alpha=0.5j|^(1)'
Exemplo n.º 11
0
def test_unicode_symbolic_labels():
    """Test unicode representation of symbols with symbolic labels"""
    i = IdxSym('i')
    j = IdxSym('j')
    hs0 = LocalSpace(0)
    hs1 = LocalSpace(1)
    Psi = IndexedBase('Psi')
    assert unicode(BasisKet(FockIndex(2 * i), hs=hs0)) == '|2 i⟩⁽⁰⁾'
    assert unicode(KetSymbol(StrLabel(2 * i), hs=hs0)) == '|2 i⟩⁽⁰⁾'
    assert (unicode(KetSymbol(StrLabel(Psi[i, j]),
                              hs=hs0 * hs1)) == '|Ψ_ij⟩^(0⊗1)')
    expr = BasisKet(FockIndex(i), hs=hs0) * BasisKet(FockIndex(j), hs=hs1)
    assert unicode(expr) == '|i,j⟩^(0⊗1)'
    assert unicode(Bra(BasisKet(FockIndex(2 * i), hs=hs0))) == '⟨2 i|⁽⁰⁾'
    assert (unicode(LocalSigma(FockIndex(i), FockIndex(j),
                               hs=hs0)) == '|i⟩⟨j|⁽⁰⁾')
    expr = CoherentStateKet(symbols('alpha'), hs=1).to_fock_representation()
    assert unicode(expr) == 'exp(-α α ⃰/2) (∑_{n ∈ ℌ₁} αⁿ/√n! |n⟩⁽¹⁾)'

    tls = SpinSpace(label='s', spin='1/2', basis=('down', 'up'))
    Sig = IndexedBase('sigma')
    n = IdxSym('n')
    Sig_n = OperatorSymbol(StrLabel(Sig[n]), hs=tls)
    assert unicode(Sig_n, show_hs_label=False) == 'σ̂ₙ'
Exemplo n.º 12
0
def state_exprs():
    """Prepare a list of state algebra expressions"""
    hs1 = LocalSpace('q1', basis=('g', 'e'))
    hs2 = LocalSpace('q2', basis=('g', 'e'))
    ket_g1 = BasisKet('g', hs=hs1)
    ket_e1 = BasisKet('e', hs=hs1)
    ket_g2 = BasisKet('g', hs=hs2)
    ket_e2 = BasisKet('e', hs=hs2)
    psi1 = KetSymbol("Psi_1", hs=hs1)
    psi1_l = KetSymbol("Psi_1", hs=hs1)
    psi2 = KetSymbol("Psi_2", hs=hs1)
    psi2 = KetSymbol("Psi_2", hs=hs1)
    psi3 = KetSymbol("Psi_3", hs=hs1)
    phi = KetSymbol("Phi", hs=hs2)
    phi_l = KetSymbol("Phi", hs=hs2)
    A = OperatorSymbol("A_0", hs=hs1)
    gamma = symbols('gamma')
    phase = exp(-I * gamma)
    bell1 = (ket_e1 * ket_g2 - I * ket_g1 * ket_e2) / sqrt(2)
    bell2 = (ket_e1 * ket_e2 - ket_g1 * ket_g2) / sqrt(2)
    bra_psi1 = KetSymbol("Psi_1", hs=hs1).dag()
    bra_psi1_l = KetSymbol("Psi_1", hs=hs1).dag()
    bra_psi2 = KetSymbol("Psi_2", hs=hs1).dag()
    bra_psi2 = KetSymbol("Psi_2", hs=hs1).dag()
    bra_phi_l = KetSymbol("Phi", hs=hs2).dag()
    return [
        KetSymbol('Psi', hs=hs1),
        KetSymbol('Psi', hs=1),
        KetSymbol('Psi', hs=(1, 2)),
        KetSymbol('Psi', symbols('alpha'), symbols('beta'), hs=(1, 2)),
        KetSymbol('Psi', hs=1),
        ZeroKet,
        TrivialKet,
        BasisKet('e', hs=hs1),
        BasisKet('excited', hs=LocalSpace(1, basis=('ground', 'excited'))),
        BasisKet(1, hs=1),
        CoherentStateKet(2.0, hs=1),
        CoherentStateKet(2.0, hs=1).to_fock_representation(),
        Bra(KetSymbol('Psi', hs=hs1)),
        Bra(KetSymbol('Psi', hs=1)),
        Bra(KetSymbol('Psi', hs=(1, 2))),
        Bra(KetSymbol('Psi', hs=hs1 * hs2)),
        KetSymbol('Psi', hs=1).dag(),
        Bra(ZeroKet),
        Bra(TrivialKet),
        BasisKet('e', hs=hs1).adjoint(),
        BasisKet(1, hs=1).adjoint(),
        CoherentStateKet(2.0, hs=1).dag(),
        psi1 + psi2,
        psi1 - psi2 + psi3,
        psi1 * phi,
        psi1_l * phi_l,
        phase * psi1,
        A * psi1,
        BraKet(psi1, psi2),
        ket_e1.dag() * ket_e1,
        ket_g1.dag() * ket_e1,
        KetBra(psi1, psi2),
        bell1,
        BraKet.create(bell1, bell2),
        KetBra.create(bell1, bell2),
        (psi1 + psi2).dag(),
        bra_psi1 + bra_psi2,
        bra_psi1_l * bra_phi_l,
        Bra(phase * psi1),
        (A * psi1).dag(),
    ]
Exemplo n.º 13
0
def test_series_expand(braket):
    """Test expansion of scalar into a series"""
    t = symbols('t', real=True)
    alpha = symbols('alpha')
    three = ScalarValue(3)
    expr = ScalarValue(alpha * t**2 / 2 + 2 * t)

    assert expr.series_expand(t, about=0, order=4) == (
        Zero,
        2,
        alpha / 2,
        Zero,
        Zero,
    )

    assert expr.series_expand(t, about=0, order=1) == (Zero, 2)

    terms = expr.series_expand(t, about=1, order=4)
    for term in terms:
        assert isinstance(term, Scalar)
    expr_from_terms = sum([terms[i] * (t - 1)**i for i in range(1, 5)],
                          terms[0])
    assert expr_from_terms.val.expand() == expr

    assert expr.series_expand(alpha, about=0, order=4) == (
        2 * t,
        t**2 / 2,
        Zero,
        Zero,
        Zero,
    )

    assert expr.series_expand(symbols('x'), about=0, order=4) == (
        expr,
        Zero,
        Zero,
        Zero,
        Zero,
    )

    assert three.series_expand(symbols('x'), 0, 2) == (three, Zero, Zero)
    assert Zero.series_expand(symbols('x'), 0, 2) == (Zero, Zero, Zero)
    assert One.series_expand(symbols('x'), 0, 2) == (One, Zero, Zero)

    expr = One / ScalarValue(t)
    with pytest.raises(ValueError) as exc_info:
        expr.series_expand(t, 0, 2)
    assert "singular" in str(exc_info.value)

    expr = sqrt(ScalarValue(t))
    assert expr.series_expand(t, 1, 2) == (One, One / 2, -One / 8)
    with pytest.raises(ValueError) as exc_info:
        expr.series_expand(t, 0, 2)
    assert "singular" in str(exc_info.value)

    expr = braket.bra
    assert expr.series_expand(t, 0, 2) == (
        braket.bra,
        Bra(ZeroKet),
        Bra(ZeroKet),
    )

    expr = braket
    assert expr.series_expand(t, 0, 2) == (braket, Zero, Zero)

    expr = t * braket
    assert expr.series_expand(t, 0, 2) == (Zero, braket, Zero)

    expr = (1 + t * braket)**2
    assert expr.series_expand(t, 0, 2) == (One, 2 * braket, braket**2)

    expr = (1 + t * braket)**(sympify(1) / 2)
    with pytest.raises(ValueError):
        expr.series_expand(t, 0, 2)