예제 #1
0
def test_output_unitary_same_as_qiskit():
    qubits = tuple(_make_qubits(5))
    operations = _all_operations(*qubits, include_measurements=False)
    output = cirq.QasmOutput(operations, qubits, header='Generated from Cirq', precision=10)
    text = str(output)

    circuit = cirq.Circuit(operations)
    cirq_unitary = circuit.unitary(qubit_order=qubits)
    cq.assert_qiskit_parsed_qasm_consistent_with_unitary(text, cirq_unitary)
예제 #2
0
def test_unsupported_operation():
    q0, = _make_qubits(1)

    class UnsupportedOperation(cirq.Operation):
        qubits = (q0,)
        with_qubits = NotImplemented

    output = cirq.QasmOutput((UnsupportedOperation(),), (q0,))
    with pytest.raises(ValueError):
        _ = str(output)
예제 #3
0
def test_empty_circuit_one_qubit():
    (q0, ) = _make_qubits(1)
    output = cirq.QasmOutput((), (q0, ))
    assert (str(output) == """OPENQASM 2.0;
include "qelib1.inc";


// Qubits: [q0]
qreg q[1];
""")
예제 #4
0
def test_empty_circuit_no_qubits():
    output = cirq.QasmOutput((), ())
    assert (
        str(output)
        == """OPENQASM 2.0;
include "qelib1.inc";


// Qubits: []
"""
    )
예제 #5
0
def test_header():
    (q0, ) = _make_qubits(1)
    output = cirq.QasmOutput(
        (),
        (q0, ),
        header="""My test circuit
Device: Bristlecone""",
    )
    assert (str(output) == """// My test circuit
// Device: Bristlecone

OPENQASM 2.0;
include "qelib1.inc";


// Qubits: [q0]
qreg q[1];
""")

    output = cirq.QasmOutput(
        (),
        (q0, ),
        header="""
My test circuit
Device: Bristlecone
""",
    )
    assert (str(output) == """//
// My test circuit
// Device: Bristlecone
//

OPENQASM 2.0;
include "qelib1.inc";


// Qubits: [q0]
qreg q[1];
""")
예제 #6
0
def test_precision():
    (q0, ) = _make_qubits(1)
    output = cirq.QasmOutput((cirq.X(q0)**0.1234567, ), (q0, ), precision=3)
    assert (str(output) == """OPENQASM 2.0;
include "qelib1.inc";


// Qubits: [q0]
qreg q[1];


rx(pi*0.123) q[0];
""")
예제 #7
0
def test_single_gate_with_parameter():
    (q0, ) = _make_qubits(1)
    output = cirq.QasmOutput((cirq.X(q0)**0.25, ), (q0, ))
    assert (str(output) == """OPENQASM 2.0;
include "qelib1.inc";


// Qubits: [q0]
qreg q[1];


rx(pi*0.25) q[0];
""")
예제 #8
0
def test_single_gate_no_parameter():
    q0, = _make_qubits(1)
    output = cirq.QasmOutput((cirq.X(q0), ), (q0, ))
    assert (str(output) == """OPENQASM 2.0;
include "qelib1.inc";


// Qubits: [q0]
qreg q[1];


x q[0];
""")
예제 #9
0
def test_save_to_file(tmpdir):
    file_path = os.path.join(tmpdir, 'test.qasm')
    (q0, ) = _make_qubits(1)
    output = cirq.QasmOutput((), (q0, ))
    output.save(file_path)
    with open(file_path, 'r') as f:
        file_content = f.read()
    assert (file_content == """OPENQASM 2.0;
include "qelib1.inc";


// Qubits: [q0]
qreg q[1];
""")
예제 #10
0
def test_save_to_file():
    q0, = _make_qubits(1)
    output = cirq.QasmOutput((), (q0, ))
    with cirq.testing.TempFilePath() as file_path:
        output.save(file_path)
        with open(file_path, 'r') as f:
            file_content = f.read()
    assert (file_content == """OPENQASM 2.0;
include "qelib1.inc";


// Qubits: [q0]
qreg q[1];
""")
예제 #11
0
def test_output_parseable_by_qiskit():
    qubits = tuple(_make_qubits(5))
    operations = _all_operations(*qubits)
    output = cirq.QasmOutput(operations, qubits,
                             header='Generated from Cirq',
                             precision=10)
    text = str(output)

    # coverage: ignore
    try:
        # We don't want to require qiskit as a dependency but
        # if Qiskit is installed, test QASM output against it.
        import qiskit  # type: ignore
    except ImportError:
        return

    assert qiskit.qasm.Qasm(data=text).parse().qasm() is not None
예제 #12
0
def test_output_format():
    def filter_unpredictable_numbers(text):
        return re.sub(r'u3\(.+\)', r'u3(<not-repeatable>)', text)

    qubits = tuple(_make_qubits(5))
    operations = _all_operations(*qubits)
    output = cirq.QasmOutput(operations, qubits,
                             header='Generated from Cirq!',
                             precision=5)
    assert (filter_unpredictable_numbers(
        str(output)) == filter_unpredictable_numbers("""// Generated from Cirq!

OPENQASM 2.0;
include "qelib1.inc";


// Qubits: [q0, q1, q2, q3, q4]
qreg q[5];
creg m_xX[1];
creg m_x_a[1];
creg m0[1];  // Measurement: x?
creg m_X[1];
creg m__x[1];
creg m_multi[3];


z q[0];
rz(pi*0.625) q[0];
y q[0];
ry(pi*0.375) q[0];
x q[0];
rx(pi*0.875) q[0];
h q[1];
cz q[0],q[1];

// Gate: CZ**0.25
u3(pi*0.5,pi*1.0,pi*0.75) q[0];
u3(pi*0.5,pi*1.0,pi*0.25) q[1];
rx(pi*0.5) q[0];
cx q[0],q[1];
rx(pi*0.375) q[0];
ry(pi*0.5) q[1];
cx q[1],q[0];
rx(pi*-0.5) q[1];
rz(pi*0.5) q[1];
cx q[0],q[1];
u3(pi*0.5,pi*0.375,0) q[0];
u3(pi*0.5,pi*0.875,0) q[1];

cx q[0],q[1];

// Gate: CNOT**0.5
ry(pi*-0.5) q[1];
u3(pi*0.5,0,pi*0.25) q[0];
u3(pi*0.5,0,pi*0.75) q[1];
rx(pi*0.5) q[0];
cx q[0],q[1];
rx(pi*0.25) q[0];
ry(pi*0.5) q[1];
cx q[1],q[0];
rx(pi*-0.5) q[1];
rz(pi*0.5) q[1];
cx q[0],q[1];
u3(pi*0.5,pi*1.0,pi*1.0) q[0];
u3(pi*0.5,pi*0.5,pi*1.0) q[1];
ry(pi*0.5) q[1];

swap q[0],q[1];

// Gate: SWAP**0.75
cx q[0],q[1];
ry(pi*-0.5) q[0];
u3(pi*0.5,0,pi*0.45919) q[1];
u3(pi*0.5,0,pi*1.95919) q[0];
rx(pi*0.5) q[1];
cx q[1],q[0];
rx(pi*0.125) q[1];
ry(pi*0.5) q[0];
cx q[0],q[1];
rx(pi*-0.5) q[0];
rz(pi*0.5) q[0];
cx q[1],q[0];
u3(pi*0.5,pi*0.91581,pi*1.0) q[1];
u3(pi*0.5,pi*1.41581,pi*1.0) q[0];
ry(pi*0.5) q[0];
cx q[0],q[1];

h q[2];
ccx q[0],q[1],q[2];
h q[2];
ccx q[0],q[1],q[2];

// Gate: CCZ**0.5
rz(pi*0.125) q[0];
rz(pi*0.125) q[1];
rz(pi*0.125) q[2];
cx q[0],q[1];
cx q[1],q[2];
rz(pi*-0.125) q[1];
rz(pi*0.125) q[2];
cx q[0],q[1];
cx q[1],q[2];
rz(pi*-0.125) q[2];
cx q[0],q[1];
cx q[1],q[2];
rz(pi*-0.125) q[2];
cx q[0],q[1];
cx q[1],q[2];

// Gate: TOFFOLI**0.5
h q[2];
rz(pi*0.125) q[0];
rz(pi*0.125) q[1];
rz(pi*0.125) q[2];
cx q[0],q[1];
cx q[1],q[2];
rz(pi*-0.125) q[1];
rz(pi*0.125) q[2];
cx q[0],q[1];
cx q[1],q[2];
rz(pi*-0.125) q[2];
cx q[0],q[1];
cx q[1],q[2];
rz(pi*-0.125) q[2];
cx q[0],q[1];
cx q[1],q[2];
h q[2];

cswap q[0],q[1],q[2];
id q[0];
id q[0];
id q[1];
id q[2];

// Gate: ISWAP
cx q[2],q[0];
h q[2];
cx q[0],q[2];
rz(pi*0.5) q[2];
cx q[0],q[2];
rz(pi*-0.5) q[2];
h q[2];
cx q[2],q[0];

u3(pi*-0.25, pi*0.611, pi*-0.611) q[1];
u2(pi*-0.167, pi*0.167) q[1];
u2(pi*1.277, pi*-1.277) q[1];
measure q[0] -> m_xX[0];
measure q[2] -> m_x_a[0];
measure q[1] -> m0[0];
measure q[3] -> m_X[0];
measure q[4] -> m__x[0];
measure q[2] -> m_x_a[0];
measure q[1] -> m_multi[0];
x q[2];  // Invert the following measurement
measure q[2] -> m_multi[1];
measure q[3] -> m_multi[2];
// Dummy operation

// Operation: DummyCompositeOperation()
x q[0];
"""))
예제 #13
0
def test_version():
    q0, = _make_qubits(1)
    with pytest.raises(ValueError):
        output = cirq.QasmOutput((), (q0,), version='3.0')
        _ = str(output)