Example #1
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)
Example #2
0
def test_symbolic_term_with_imag_creation():
    """Test creating ``SymbolicTerm`` from sympy expression that contains imaginary coefficients."""
    from qibo.symbols import Y
    expression = 3j * Y(0)
    term = terms.SymbolicTerm(2, expression)
    assert term.target_qubits == (0, )
    assert term.coefficient == 6j
Example #3
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)
Example #4
0
def test_symbolic_term_matrix(backend):
    """Test matrix calculation of ``SymbolicTerm``."""
    from qibo.symbols import X, Y, Z
    expression = X(0) * Y(1) * Z(2) * X(1)
    term = terms.SymbolicTerm(2, expression)
    assert term.target_qubits == (0, 1, 2)
    target_matrix = np.kron(matrices.X, matrices.Y @ matrices.X)
    target_matrix = 2 * np.kron(target_matrix, matrices.Z)
    K.assert_allclose(term.matrix, target_matrix)
Example #5
0
def test_symbolic_term_mul(backend):
    """Test multiplying scalar to ``SymbolicTerm``."""
    from qibo.symbols import X, Y, Z
    expression = Y(2) * Z(3) * X(2) * X(3)
    term = terms.SymbolicTerm(1, expression)
    assert term.target_qubits == (2, 3)
    target_matrix = np.kron(matrices.Y @ matrices.X, matrices.Z @ matrices.X)
    K.assert_allclose(term.matrix, target_matrix)
    K.assert_allclose((2 * term).matrix, 2 * target_matrix)
    K.assert_allclose((term * 3).matrix, 3 * target_matrix)
Example #6
0
def test_symbolic_term_with_power_creation():
    """Test creating ``SymbolicTerm`` from sympy expression that contains powers."""
    from qibo.symbols import X, Z
    expression = X(0)**4 * Z(1)**2 * X(2)
    term = terms.SymbolicTerm(2, expression)
    assert term.target_qubits == (0, 1, 2)
    assert len(term.matrix_map) == 3
    assert term.coefficient == 2
    K.assert_allclose(term.matrix_map.get(0), 4 * [matrices.X])
    K.assert_allclose(term.matrix_map.get(1), 2 * [matrices.Z])
    K.assert_allclose(term.matrix_map.get(2), [matrices.X])
Example #7
0
def test_symbolic_term_call(backend, density_matrix):
    """Test applying ``SymbolicTerm`` to state."""
    from qibo.symbols import X, Y, Z
    expression = Z(0) * X(1) * Y(2)
    term = terms.SymbolicTerm(2, expression)
    matrixlist = [
        np.kron(matrices.Z, np.eye(4)),
        np.kron(np.kron(np.eye(2), matrices.X), np.eye(2)),
        np.kron(np.eye(4), matrices.Y)
    ]
    initial_state = random_density_matrix(
        3) if density_matrix else random_state(3)
    final_state = term(np.copy(initial_state), density_matrix=density_matrix)
    target_state = 2 * np.copy(initial_state)
    for matrix in matrixlist:
        target_state = matrix @ target_state
    K.assert_allclose(final_state, target_state)
Example #8
0
def test_symbolic_term_creation(use_symbols):
    """Test creating ``SymbolicTerm`` from sympy expression."""
    if use_symbols:
        from qibo.symbols import X, Y
        expression = X(0) * Y(1) * X(1)
        symbol_map = {}
    else:
        import sympy
        x0, x1, y1 = sympy.symbols("X0 X1 Y1", commutative=False)
        expression = x0 * y1 * x1
        symbol_map = {
            x0: (0, matrices.X),
            x1: (1, matrices.X),
            y1: (1, matrices.Y)
        }
    term = terms.SymbolicTerm(2, expression, symbol_map)
    assert term.target_qubits == (0, 1)
    assert len(term.matrix_map) == 2
    K.assert_allclose(term.matrix_map.get(0)[0], matrices.X)
    K.assert_allclose(term.matrix_map.get(1)[0], matrices.Y)
    K.assert_allclose(term.matrix_map.get(1)[1], matrices.X)