def test_moments() -> None:
    circ0 = qf.ghz_circuit(range(5))
    dag = qf.DAGCircuit(circ0)
    circ = dag.moments()
    assert circ.size() == dag.depth()

    circ1 = qf.Circuit([
        qf.Z(0),
        qf.Z(1),
        qf.Z(2),
        qf.CNot(0, 1),
        qf.Measure(0, 0),
        qf.Measure(1, 1),
        qf.Measure(2, 2),
    ])
    moments = qf.DAGCircuit(circ1).moments()
    print()
    print(moments)

    assert len(moments) == 3
    assert len(moments[0]) == 3  # type: ignore
    assert len(moments[1]) == 1  # type: ignore
    assert len(moments[2]) == 3  # type: ignore

    with pytest.warns(DeprecationWarning):
        _ = dag.layers()
def test_components() -> None:
    circ = qf.Circuit()
    circ += qf.H(0)
    circ += qf.H(1)
    dag = qf.DAGCircuit(circ)
    assert dag.component_nb() == 2

    circ += qf.CNot(0, 1)
    dag = qf.DAGCircuit(circ)
    assert dag.component_nb() == 1

    circ0 = qf.ghz_circuit([0, 2, 4, 6, 8])
    circ1 = qf.ghz_circuit([1, 3, 5, 7, 9])

    circ = circ0 + circ1
    dag = qf.DAGCircuit(circ)
    comps = dag.components()
    assert dag.component_nb() == 2
    assert len(comps) == 2

    circ0 = qf.Circuit(qf.QFTGate([0, 2, 4, 6]).decompose())
    circ1 = qf.ghz_circuit([1, 3, 5, 7])
    circ += circ0
    circ += circ1
    circ += qf.H(10)
    dag = qf.DAGCircuit(circ)
    comps = dag.components()
    assert dag.component_nb() == 3
    assert len(comps) == 3
示例#3
0
def test_components():
    circ = qf.Circuit()
    circ += qf.H(0)
    circ += qf.H(1)
    dag = qf.DAGCircuit(circ)
    assert dag.component_nb() == 2

    circ += qf.CNOT(0, 1)
    dag = qf.DAGCircuit(circ)
    assert dag.component_nb() == 1

    circ0 = qf.ghz_circuit([0, 2, 4, 6, 8])
    circ1 = qf.ghz_circuit([1, 3, 5, 7, 9])

    circ = qf.Circuit()
    circ.extend(circ0)
    circ.extend(circ1)
    dag = qf.DAGCircuit(circ)
    comps = dag.components()
    assert dag.component_nb() == 2

    circ0 = qf.qft_circuit([0, 2, 4, 6])
    circ1 = qf.ghz_circuit([1, 3, 5, 7])
    circ.extend(circ0)
    circ.extend(circ1)
    circ += qf.H(10)
    dag = qf.DAGCircuit(circ)
    comps = dag.components()
    assert dag.component_nb() == 3
    assert len(comps) == 3
示例#4
0
def test_depth():
    circ = qf.qft_circuit([0, 1, 2, 3])
    dag = qf.DAGCircuit(circ)
    assert dag.depth() == 8

    circ = qf.ghz_circuit(range(5))
    dag = qf.DAGCircuit(circ)
    assert dag.depth() == 5

    assert dag.depth(local=False) == 4
def test_depth() -> None:
    circ = qf.Circuit(qf.QFTGate([0, 1, 2, 3]).decompose())
    dag = qf.DAGCircuit(circ)
    assert dag.depth() == 8

    circ = qf.ghz_circuit(range(5))
    dag = qf.DAGCircuit(circ)
    assert dag.depth() == 5

    assert dag.depth(local=False) == 4
def test_ascircuit() -> None:
    circ0 = qf.ghz_circuit(range(5))
    dag = qf.DAGCircuit(circ0)
    circ1 = qf.Circuit(dag)

    assert tuple(circ1.qubits) == (0, 1, 2, 3, 4)
    assert dag.qubits == circ0.qubits
    assert dag.qubit_nb == 5
def test_evolve() -> None:
    rho0 = qf.random_state(3).asdensity()
    rho1 = qf.CCNot(0, 1, 2).evolve(rho0)

    dag = qf.DAGCircuit(qf.translate_ccnot_to_cnot(qf.CCNot(0, 1, 2)))
    rho2 = dag.evolve(rho0)

    assert qf.densities_close(rho1, rho2)
示例#8
0
def test_evolve():
    rho0 = qf.random_state(3).asdensity()
    rho1 = qf.CCNOT(0, 1, 2).evolve(rho0)

    dag = qf.DAGCircuit(qf.ccnot_circuit([0, 1, 2]))
    rho2 = dag.evolve(rho0)

    assert qf.densities_close(rho1, rho2)
def test_inverse() -> None:
    dag = qf.DAGCircuit(_test_circ())
    inv_dag = dag.H

    ket0 = qf.random_state(2)
    ket1 = dag.run(ket0)
    ket2 = inv_dag.run(ket1)

    assert qf.states_close(ket0, ket2)
示例#10
0
def test_next_prev() -> None:
    circ = qf.ghz_circuit([0, 2, 4, 6, 8])
    elem = circ[3]
    dag = qf.DAGCircuit(circ)

    assert dag.next_element(elem, elem.qubits[1]) == circ[4]
    assert dag.prev_element(elem, elem.qubits[0]) == circ[2]

    assert dag.next_element(elem, elem.qubits[0]) == Out(4)
    assert dag.prev_element(elem, elem.qubits[1]) == In(6)
示例#11
0
def test_str() -> None:
    circ0 = qf.ghz_circuit(range(5))
    dag = qf.DAGCircuit(circ0)
    string = str(dag)
    assert (string == """DAGCircuit
    H 0
    CNot 0 1
    CNot 1 2
    CNot 2 3
    CNot 3 4\
""")
示例#12
0
def test_next():
    circ = qf.ghz_circuit([0, 2, 4, 6, 8])
    elem = circ.elements[3]
    dag = qf.DAGCircuit(circ)

    assert dag.next_element(elem, elem.qubits[1]) == circ.elements[4]
    assert dag.prev_element(elem, elem.qubits[0]) == circ.elements[2]

    # FIXME: out and in nodes should also be Operation's ?
    assert dag.next_element(elem, elem.qubits[0]) == ('out', 4)
    assert dag.prev_element(elem, elem.qubits[1]) == ('in', 6)
示例#13
0
def test_compile() -> None:
    circ0 = qf.addition_circuit([0], [1], [2, 3])
    circ1 = qf.compile_circuit(circ0)
    assert qf.circuits_close(circ0, circ1)
    assert circ1.size() == 76

    dagc = qf.DAGCircuit(circ1)
    assert dagc.depth(local=False) == 16
    counts = qf.count_operations(dagc)
    assert counts[qf.ZPow] == 27
    assert counts[qf.XPow] == 32
    assert counts[qf.CZ] == 17
示例#14
0
def test_on() -> None:
    circ = qf.Circuit()
    circ += qf.H(0)
    circ += qf.H(1)
    dag = qf.DAGCircuit(circ)

    dag = dag.on(2, 3)
    assert dag.qubits == (2, 3)

    dag = dag.rewire({2: 4, 3: 6})
    assert dag.qubits == (4, 6)

    with pytest.raises(ValueError):
        dag.on(2, 3, 5)
示例#15
0
def test_merge() -> None:
    circ0 = qf.Circuit([
        qf.XPow(0.4, 0),
        qf.XPow(0.2, 0),
        qf.YPow(0.1, 1),
        qf.YPow(0.1, 1),
        qf.ZPow(0.1, 1),
        qf.ZPow(0.1, 1),
    ])
    dagc = qf.DAGCircuit(circ0)

    qf.merge_tx(dagc)
    qf.merge_tz(dagc)
    qf.merge_ty(dagc)
    circ1 = qf.Circuit(dagc)
    assert len(circ1) == 3
示例#16
0
def test_asgate() -> None:
    circ0 = qf.zyz_circuit(0.1, 2.2, 0.5, 0)
    gate0 = circ0.asgate()
    dag0 = qf.DAGCircuit(circ0)
    gate1 = dag0.asgate()
    assert qf.gates_close(gate0, gate1)
示例#17
0
def test_init() -> None:
    dag = qf.DAGCircuit([])
    assert dag.size() == 0
示例#18
0
def test_asgate():
    gate0 = qf.ZYZ(0.1, 2.2, 0.5)
    circ0 = qf.zyz_circuit(0.1, 2.2, 0.5, 0)
    dag0 = qf.DAGCircuit(circ0)
    gate1 = dag0.asgate()
    assert qf.gates_close(gate0, gate1)
示例#19
0
#!/usr/bin/env python
"""
QuantumFlow: Examples of compiling circuits to native gates
"""

import quantumflow as qf

example_circuits = [
    ["3-qubit addition", qf.addition_circuit([0, 1, 2], [3, 4, 5], [6, 7])],
    ["7-qubit QFT", qf.Circuit(qf.QFTGate([0, 1, 2, 3, 4, 5, 6, 7]).decompose())],
]

for title, example in example_circuits:
    print()
    print(title)
    print(qf.circuit_to_diagram(example))
    print("Gate count:", example.size())

    print()
    print("Simplified circuit")
    circ = qf.compile_circuit(example)
    print(qf.circuit_to_diagram(circ, transpose=True))

    qf.circuit_to_image(circ).show()
    dagc = qf.DAGCircuit(circ)
    print("Gate depth", dagc.depth(local=False))
    print("Operation count", qf.count_operations(dagc))
示例#20
0
def test_layers():
    circ0 = qf.ghz_circuit(range(5))
    dag = qf.DAGCircuit(circ0)
    layers = dag.layers()
    assert len(layers.elements) == dag.depth()