Exemple #1
0
def test_hamiltonian_term_initialization(backend):
    """Test initialization and matrix assignment of ``HamiltonianTerm``."""
    matrix = np.random.random((2, 2))
    term = terms.HamiltonianTerm(matrix, 0)
    assert term.target_qubits == (0, )
    K.assert_allclose(term.matrix, matrix)
    matrix = np.random.random((4, 4))
    term = terms.HamiltonianTerm(matrix, 2, 3)
    assert term.target_qubits == (2, 3)
    K.assert_allclose(term.matrix, matrix)
Exemple #2
0
def test_hamiltonian_term_merge(backend):
    """Test ``HamiltonianTerm.merge``."""
    matrix1 = np.random.random((2, 2))
    matrix2 = np.random.random((4, 4))
    term1 = terms.HamiltonianTerm(matrix1, 1)
    term2 = terms.HamiltonianTerm(matrix2, 0, 1)
    mterm = term2.merge(term1)
    target_matrix = np.kron(np.eye(2), matrix1) + matrix2
    assert mterm.target_qubits == (0, 1)
    K.assert_allclose(mterm.matrix, target_matrix)
    with pytest.raises(ValueError):
        term1.merge(term2)
Exemple #3
0
def test_term_group_append():
    """Test ``GroupTerm.can_append`` method."""
    term1 = terms.HamiltonianTerm(np.random.random((8, 8)), 0, 1, 3)
    term2 = terms.HamiltonianTerm(np.random.random((2, 2)), 0)
    term3 = terms.HamiltonianTerm(np.random.random((2, 2)), 1)
    term4 = terms.HamiltonianTerm(np.random.random((2, 2)), 2)
    group = terms.TermGroup(term1)
    assert group.can_append(term2)
    assert group.can_append(term3)
    assert not group.can_append(term4)
    group.append(term2)
    group.append(term3)
    assert group.target_qubits == {0, 1, 3}
Exemple #4
0
def test_hamiltonian_term_initialization_errors():
    """Test initializing ``HamiltonianTerm`` with wrong parameters."""
    # Wrong HamiltonianTerm matrix
    with pytest.raises(TypeError):
        t = terms.HamiltonianTerm("test", 0, 1)
    # Passing negative target qubits in HamiltonianTerm
    with pytest.raises(ValueError):
        t = terms.HamiltonianTerm("test", 0, -1)
    # Passing matrix shape incompatible with number of qubits
    with pytest.raises(ValueError):
        t = terms.HamiltonianTerm(np.random.random((4, 4)), 0, 1, 2)
    # Merging terms with invalid qubits
    t1 = terms.HamiltonianTerm(np.random.random((4, 4)), 0, 1)
    t2 = terms.HamiltonianTerm(np.random.random((4, 4)), 1, 2)
    with pytest.raises(ValueError):
        t = t1.merge(t2)
Exemple #5
0
def test_symbolic_term_merge(backend):
    """Test merging ``SymbolicTerm`` to ``HamiltonianTerm``."""
    from qibo.symbols import X, Z
    matrix = np.random.random((4, 4))
    term1 = terms.HamiltonianTerm(matrix, 0, 1)
    term2 = terms.SymbolicTerm(1, X(0) * Z(1))
    term = term1.merge(term2)
    target_matrix = matrix + np.kron(matrices.X, matrices.Z)
    K.assert_allclose(term.matrix, target_matrix)
Exemple #6
0
def test_hamiltonian_term_mul(backend):
    """Test scalar multiplication of ``HamiltonianTerm``."""
    matrix = np.random.random((4, 4))
    term = terms.HamiltonianTerm(matrix, 0, 2)
    mterm = 2 * term
    assert mterm.target_qubits == term.target_qubits
    K.assert_allclose(mterm.matrix, 2 * matrix)
    mterm = term * 5
    assert mterm.target_qubits == term.target_qubits
    K.assert_allclose(mterm.matrix, 5 * matrix)
Exemple #7
0
def test_hamiltonian_term_exponentiation(backend):
    """Test exp gate application of ``HamiltonianTerm``."""
    from scipy.linalg import expm
    matrix = np.random.random((2, 2))
    term = terms.HamiltonianTerm(matrix, 1)
    exp_matrix = expm(-0.5j * matrix)
    K.assert_allclose(term.exp(0.5), exp_matrix)

    initial_state = random_state(2)
    final_state = term.expgate(0.5)(np.copy(initial_state))
    exp_gate = gates.Unitary(exp_matrix, 1)
    target_state = exp_gate(np.copy(initial_state))
    K.assert_allclose(final_state, target_state)
Exemple #8
0
def test_hamiltonian_term_gates(backend):
    """Test gate application of ``HamiltonianTerm``."""
    matrix = np.random.random((4, 4))
    term = terms.HamiltonianTerm(matrix, 1, 2)
    gate = term.gate
    assert gate.target_qubits == (1, 2)
    K.assert_allclose(gate.matrix, matrix)

    initial_state = random_state(4)
    final_state = term(np.copy(initial_state))
    c = models.Circuit(4)
    c.add(gates.Unitary(matrix, 1, 2))
    target_state = c(np.copy(initial_state))
    K.assert_allclose(final_state, target_state)
Exemple #9
0
def test_term_group_to_term(backend):
    """Test ``GroupTerm.term`` property."""
    from qibo.symbols import X, Z
    matrix = np.random.random((8, 8))
    term1 = terms.HamiltonianTerm(matrix, 0, 1, 3)
    term2 = terms.SymbolicTerm(1, X(0) * Z(3))
    term3 = terms.SymbolicTerm(2, X(1))
    group = terms.TermGroup(term1)
    group.append(term2)
    group.append(term3)
    matrix2 = np.kron(np.kron(matrices.X, np.eye(2)), matrices.Z)
    matrix3 = np.kron(np.kron(np.eye(2), matrices.X), np.eye(2))
    target_matrix = matrix + matrix2 + 2 * matrix3
    K.assert_allclose(group.term.matrix, target_matrix)