Esempio n. 1
0
def test_hilbert_tree():
    """Test tree representation of a Hilbert space algebra expression"""
    H1 = LocalSpace(1)
    H2 = LocalSpace(2)
    tree = tree_str(H1 * H2)
    assert (tree == dedent(r'''
    . ProductSpace(ℌ₁, ℌ₂)
      ├─ LocalSpace(1)
      └─ LocalSpace(2)
    ''').strip())
Esempio n. 2
0
def test_derivative_tree(MyScalarFunc):
    s, t, t0 = symbols('s, t, t_0', real=True)
    expr = (  # nested derivative
        MyScalarFunc("f", s, t).diff(s, n=2).diff(t).evaluate_at({
            t: t0
        }).diff(t0))
    tree = tree_str(expr)
    assert (tree == dedent(r'''
        . MyScalarDerivative(..., derivs=((t₀, 1)))
          └─ MyScalarDerivative(..., derivs=..., vals=((t, t₀)))
             └─ ScalarFunc(f, s, t)
        ''').strip())
Esempio n. 3
0
def test_sop_operations():
    """Test tree representation of a superoperator algebra expression"""
    hs1 = LocalSpace('q_1', dimension=2)
    hs2 = LocalSpace('q_2', dimension=2)
    A = SuperOperatorSymbol("A", hs=hs1)
    B = SuperOperatorSymbol("B", hs=hs1)
    C = SuperOperatorSymbol("C", hs=hs2)
    gamma = symbols('gamma', positive=True)
    tree = tree_str(2 * A - sqrt(gamma) * (B + C))
    assert (tree == dedent(r'''
        . SuperOperatorPlus(2 A^(q₁), ...)
          ├─ ScalarTimesSuperOperator(2, A^(q₁))
          │  ├─ ScalarValue(2)
          │  └─ SuperOperatorSymbol(A, hs=ℌ_q₁)
          └─ ScalarTimesSuperOperator(-√γ, B^(q₁) + C^(q₂))
             ├─ ScalarValue(-√γ)
             └─ SuperOperatorPlus(B^(q₁), C^(q₂))
                ├─ SuperOperatorSymbol(B, hs=ℌ_q₁)
                └─ SuperOperatorSymbol(C, hs=ℌ_q₂)
        ''').strip())
Esempio n. 4
0
def test_operator_tree():
    """Test tree representation of a operator space algebra expression"""
    hs1 = LocalSpace('q_1', dimension=2)
    hs2 = LocalSpace('q_2', dimension=2)
    A = OperatorSymbol("A", hs=hs1)
    B = OperatorSymbol("B", hs=hs1)
    C = OperatorSymbol("C", hs=hs2)
    gamma = symbols('gamma', positive=True)
    expr = 2 * A - sqrt(gamma) * (B + C)
    tree = tree_str(expr, unicode=False)
    assert (tree == dedent(r'''
    . OperatorPlus(2 * A^(q_1), ...)
      +- ScalarTimesOperator(2, A^(q_1))
      |  +- ScalarValue(2)
      |  +- OperatorSymbol(A, hs=H_q_1)
      +- ScalarTimesOperator(-sqrt(gamma), ...)
         +- ScalarValue(-sqrt(gamma))
         +- OperatorPlus(B^(q_1), C^(q_2))
            +- OperatorSymbol(B, hs=H_q_1)
            +- OperatorSymbol(C, hs=H_q_2)
    ''').strip())
Esempio n. 5
0
def test_ket_tree():
    """Test tree representation of a state algebra expression"""
    hs1 = LocalSpace('q_1', basis=('g', 'e'))
    hs2 = LocalSpace('q_2', 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)
    gamma = symbols('gamma', positive=True)
    phase = exp(-I * gamma)
    bell1 = (ket_e1 * ket_g2 - phase * ket_g1 * ket_e2) / sqrt(2)
    bell2 = (ket_e1 * ket_e2 - ket_g1 * ket_g2) / sqrt(2)
    tree = tree_str(KetBra.create(bell1, bell2))
    assert (tree == dedent(r'''
    . ScalarTimesOperator(1/2, ...)
      ├─ ScalarValue(1/2)
      └─ KetBra(..., ...)
         ├─ KetPlus(|eg⟩^(q₁⊗q₂), ...)
         │  ├─ TensorKet(|e⟩^(q₁), |g⟩^(q₂))
         │  │  ├─ BasisKet(e, hs=ℌ_q₁)
         │  │  └─ BasisKet(g, hs=ℌ_q₂)
         │  └─ ScalarTimesKet(-exp(-ⅈ γ), |ge⟩^(q₁⊗q₂))
         │     ├─ ScalarValue(-exp(-ⅈ γ))
         │     └─ TensorKet(|g⟩^(q₁), |e⟩^(q₂))
         │        ├─ BasisKet(g, hs=ℌ_q₁)
         │        └─ BasisKet(e, hs=ℌ_q₂)
         └─ KetPlus(|ee⟩^(q₁⊗q₂), -|gg⟩^(q₁⊗q₂))
            ├─ TensorKet(|e⟩^(q₁), |e⟩^(q₂))
            │  ├─ BasisKet(e, hs=ℌ_q₁)
            │  └─ BasisKet(e, hs=ℌ_q₂)
            └─ ScalarTimesKet(-1, |gg⟩^(q₁⊗q₂))
               ├─ ScalarValue(-1)
               └─ TensorKet(|g⟩^(q₁), |g⟩^(q₂))
                  ├─ BasisKet(g, hs=ℌ_q₁)
                  └─ BasisKet(g, hs=ℌ_q₂)
    ''').strip())