Skip to content

Commit

Permalink
✅ trial and error
Browse files Browse the repository at this point in the history
  • Loading branch information
nquetschlich committed Dec 3, 2024
1 parent 3e2c601 commit 018621e
Show file tree
Hide file tree
Showing 3 changed files with 226 additions and 203 deletions.
86 changes: 45 additions & 41 deletions src/mqt/predictor/rl/helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

import numpy as np
import requests
from bqskit import MachineModel
from pytket.architecture import Architecture
from pytket.circuit import Circuit, Node, Qubit
from pytket.passes import (
Expand All @@ -18,7 +19,7 @@
RoutingPass,
)
from pytket.placement import place_with_map
from qiskit import QuantumCircuit, QuantumRegister
from qiskit import QuantumCircuit
from qiskit.circuit.equivalence_library import StandardEquivalenceLibrary
from qiskit.circuit.library import XGate, ZGate
from qiskit.transpiler import CouplingMap, Layout, PassManager, TranspileLayout
Expand Down Expand Up @@ -63,10 +64,13 @@


import operator
import os
import zipfile
from importlib import resources

from bqskit import compile as bqskit_compile
from bqskit.ir import gates
from qiskit import QuantumRegister
from qiskit.passmanager import ConditionalController
from qiskit.transpiler.preset_passmanagers import common
from qiskit_ibm_runtime.fake_provider import FakeGuadalupeV2, FakeMontrealV2, FakeQuitoV2, FakeWashingtonV2
Expand Down Expand Up @@ -187,17 +191,17 @@ def get_actions_opt() -> list[dict[str, Any]]:
"origin": "qiskit",
"do_while": lambda property_set: (not property_set["optimization_loop_minimum_point"]),
},
# {
# "name": "BQSKitO2",
# "transpile_pass": lambda circuit: bqskit_compile(
# circuit,
# optimization_level=1 if os.getenv("GITHUB_ACTIONS") == "true" else 2,
# synthesis_epsilon=1e-1 if os.getenv("GITHUB_ACTIONS") == "true" else 1e-8,
# max_synthesis_size=2 if os.getenv("GITHUB_ACTIONS") == "true" else 3,
# seed=10,
# ),
# "origin": "bqskit",
# },
{
"name": "BQSKitO2",
"transpile_pass": lambda circuit: bqskit_compile(
circuit,
optimization_level=1 if os.getenv("GITHUB_ACTIONS") == "true" else 2,
synthesis_epsilon=1e-1 if os.getenv("GITHUB_ACTIONS") == "true" else 1e-8,
max_synthesis_size=2 if os.getenv("GITHUB_ACTIONS") == "true" else 3,
seed=10,
),
"origin": "bqskit",
},
]


Expand Down Expand Up @@ -288,23 +292,23 @@ def get_actions_mapping() -> list[dict[str, Any]]:
],
"origin": "qiskit",
},
# {
# "name": "BQSKitMapping",
# "transpile_pass": lambda device: lambda bqskit_circuit: bqskit_compile(
# bqskit_circuit,
# model=MachineModel(
# num_qudits=device.num_qubits,
# gate_set=get_bqskit_native_gates(device),
# coupling_graph=[(elem[0], elem[1]) for elem in device.coupling_map],
# ),
# with_mapping=True,
# optimization_level=1 if os.getenv("GITHUB_ACTIONS") == "true" else 2,
# synthesis_epsilon=1e-1 if os.getenv("GITHUB_ACTIONS") == "true" else 1e-8,
# max_synthesis_size=2 if os.getenv("GITHUB_ACTIONS") == "true" else 3,
# seed=10,
# ),
# "origin": "bqskit",
# },
{
"name": "BQSKitMapping",
"transpile_pass": lambda device: lambda bqskit_circuit: bqskit_compile(
bqskit_circuit,
model=MachineModel(
num_qudits=device.num_qubits,
gate_set=get_bqskit_native_gates(device),
coupling_graph=[(elem[0], elem[1]) for elem in device.coupling_map],
),
with_mapping=True,
optimization_level=1 if os.getenv("GITHUB_ACTIONS") == "true" else 2,
synthesis_epsilon=1e-1 if os.getenv("GITHUB_ACTIONS") == "true" else 1e-8,
max_synthesis_size=2 if os.getenv("GITHUB_ACTIONS") == "true" else 3,
seed=10,
),
"origin": "bqskit",
},
]


Expand All @@ -318,18 +322,18 @@ def get_actions_synthesis() -> list[dict[str, Any]]:
],
"origin": "qiskit",
},
# {
# "name": "BQSKitSynthesis",
# "transpile_pass": lambda device: lambda bqskit_circuit: bqskit_compile(
# bqskit_circuit,
# model=MachineModel(bqskit_circuit.num_qudits, gate_set=get_bqskit_native_gates(device)),
# optimization_level=1 if os.getenv("GITHUB_ACTIONS") == "true" else 2,
# synthesis_epsilon=1e-1 if os.getenv("GITHUB_ACTIONS") == "true" else 1e-8,
# max_synthesis_size=2 if os.getenv("GITHUB_ACTIONS") == "true" else 3,
# seed=10,
# ),
# "origin": "bqskit",
# },
{
"name": "BQSKitSynthesis",
"transpile_pass": lambda device: lambda bqskit_circuit: bqskit_compile(
bqskit_circuit,
model=MachineModel(bqskit_circuit.num_qudits, gate_set=get_bqskit_native_gates(device)),
optimization_level=1 if os.getenv("GITHUB_ACTIONS") == "true" else 2,
synthesis_epsilon=1e-1 if os.getenv("GITHUB_ACTIONS") == "true" else 1e-8,
max_synthesis_size=2 if os.getenv("GITHUB_ACTIONS") == "true" else 3,
seed=10,
),
"origin": "bqskit",
},
]


Expand Down
207 changes: 105 additions & 102 deletions tests/compilation/test_integration_further_SDKs.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,92 +2,95 @@

from __future__ import annotations

from typing import cast

import pytest
from bqskit.ext import bqskit_to_qiskit, qiskit_to_bqskit
from pytket.circuit import Qubit
from pytket.extensions.qiskit import qiskit_to_tk, tk_to_qiskit
from qiskit import QuantumCircuit
from qiskit.transpiler import CouplingMap, PassManager
from qiskit.transpiler.layout import TranspileLayout
from qiskit.transpiler.passes import CheckMap
from qiskit.transpiler.passes import CheckMap, GatesInBasis

from mqt.bench.devices import Device, get_device_by_name
from mqt.bench.devices import Device, get_available_devices, get_device_by_name
from mqt.predictor.rl import helper

#
# def test_bqskit_o2_action() -> None:
# """Test the BQSKitO2 action."""
# action_bqskit_o2 = None
# for action in helper.get_actions_opt():
# if action["name"] == "BQSKitO2":
# action_bqskit_o2 = action
#
# assert action_bqskit_o2 is not None
#
# qc = QuantumCircuit(2)
# qc.h(0)
# qc.cx(0, 1)
#
# bqskit_qc = qiskit_to_bqskit(qc)
# optimized_qc = bqskit_to_qiskit(action_bqskit_o2["transpile_pass"](bqskit_qc))
#
# assert optimized_qc != qc
#

# @pytest.mark.parametrize("device", get_available_devices(), ids=lambda device: cast("str", device.name))
# def test_bqskit_synthesis_action(device: Device) -> None:
# """Test the BQSKitSynthesis action for all devices."""
# action_bqskit_synthesis_action = None
# for action in helper.get_actions_synthesis():
# if action["name"] == "BQSKitSynthesis":
# action_bqskit_synthesis_action = action
#
# assert action_bqskit_synthesis_action is not None
#
# qc = QuantumCircuit(2)
# qc.h(0)
# qc.cx(0, 1)
#
# check_nat_gates = GatesInBasis(basis_gates=device.basis_gates)
# check_nat_gates(qc)
# assert not check_nat_gates.property_set["all_gates_in_basis"]
#
# transpile_pass = action_bqskit_synthesis_action["transpile_pass"](device)
# bqskit_qc = qiskit_to_bqskit(qc)
# native_gates_qc = bqskit_to_qiskit(transpile_pass(bqskit_qc))
#
# check_nat_gates = GatesInBasis(basis_gates=device.basis_gates)
# check_nat_gates(native_gates_qc)
# only_nat_gates = check_nat_gates.property_set["all_gates_in_basis"]
# # IQM devices have a native R gate that is approximated using the U3 gate, but this equivalence is not recognized
# # by the currently implemented check whether the synthesis was successful.
# assert only_nat_gates or "iqm" in device.name

#
# def test_bqskit_mapping_action_swaps_necessary() -> None:
# """Test the BQSKitMapping action for quantum circuit that requires SWAP gates."""
# bqskit_mapping_action = None
# for action in helper.get_actions_mapping():
# if action["name"] == "BQSKitMapping":
# bqskit_mapping_action = action
#
# assert bqskit_mapping_action is not None
#
# qc = QuantumCircuit(5)
# qc.h(0)
# qc.cx(0, 1)
# qc.cx(0, 2)
# qc.cx(0, 3)
# qc.cx(0, 4)
#
# device = get_device_by_name("ibm_montreal")
# bqskit_qc = qiskit_to_bqskit(qc)
# bqskit_qc_mapped, input_mapping, output_mapping = bqskit_mapping_action["transpile_pass"](device)(bqskit_qc)
# mapped_qc = bqskit_to_qiskit(bqskit_qc_mapped)
# layout = helper.final_layout_bqskit_to_qiskit(input_mapping, output_mapping, mapped_qc, qc)
#
# assert input_mapping != output_mapping
# assert layout.final_layout is not None
# check_mapped_circuit(initial_qc=qc, mapped_qc=mapped_qc, device=device, layout=layout)
#

def test_bqskit_o2_action() -> None:
"""Test the BQSKitO2 action."""
action_bqskit_o2 = None
for action in helper.get_actions_opt():
if action["name"] == "BQSKitO2":
action_bqskit_o2 = action

assert action_bqskit_o2 is not None

qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)

bqskit_qc = qiskit_to_bqskit(qc)
optimized_qc = bqskit_to_qiskit(action_bqskit_o2["transpile_pass"](bqskit_qc))

assert optimized_qc != qc


@pytest.mark.parametrize("device", get_available_devices(), ids=lambda device: cast("str", device.name))
def test_bqskit_synthesis_action(device: Device) -> None:
"""Test the BQSKitSynthesis action for all devices."""
action_bqskit_synthesis_action = None
for action in helper.get_actions_synthesis():
if action["name"] == "BQSKitSynthesis":
action_bqskit_synthesis_action = action

assert action_bqskit_synthesis_action is not None

qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)

check_nat_gates = GatesInBasis(basis_gates=device.basis_gates)
check_nat_gates(qc)
assert not check_nat_gates.property_set["all_gates_in_basis"]

transpile_pass = action_bqskit_synthesis_action["transpile_pass"](device)
bqskit_qc = qiskit_to_bqskit(qc)
native_gates_qc = bqskit_to_qiskit(transpile_pass(bqskit_qc))

check_nat_gates = GatesInBasis(basis_gates=device.basis_gates)
check_nat_gates(native_gates_qc)
only_nat_gates = check_nat_gates.property_set["all_gates_in_basis"]
# IQM devices have a native R gate that is approximated using the U3 gate, but this equivalence is not recognized
# by the currently implemented check whether the synthesis was successful.
assert only_nat_gates or "iqm" in device.name


def test_bqskit_mapping_action_swaps_necessary() -> None:
"""Test the BQSKitMapping action for quantum circuit that requires SWAP gates."""
bqskit_mapping_action = None
for action in helper.get_actions_mapping():
if action["name"] == "BQSKitMapping":
bqskit_mapping_action = action

assert bqskit_mapping_action is not None

qc = QuantumCircuit(5)
qc.h(0)
qc.cx(0, 1)
qc.cx(0, 2)
qc.cx(0, 3)
qc.cx(0, 4)

device = get_device_by_name("ibm_montreal")
bqskit_qc = qiskit_to_bqskit(qc)
bqskit_qc_mapped, input_mapping, output_mapping = bqskit_mapping_action["transpile_pass"](device)(bqskit_qc)
mapped_qc = bqskit_to_qiskit(bqskit_qc_mapped)
layout = helper.final_layout_bqskit_to_qiskit(input_mapping, output_mapping, mapped_qc, qc)

assert input_mapping != output_mapping
assert layout.final_layout is not None
check_mapped_circuit(initial_qc=qc, mapped_qc=mapped_qc, device=device, layout=layout)


def check_mapped_circuit(
Expand Down Expand Up @@ -127,30 +130,30 @@ def check_mapped_circuit(
assert virtual_qubit in layout.initial_layout._p2v.values() # noqa: SLF001


# def test_bqskit_mapping_action_no_swaps_necessary() -> None:
# """Test the BQSKitMapping action for a simple quantum circuit that does not require SWAP gates."""
# bqskit_mapping_action = None
# for action in helper.get_actions_mapping():
# if action["name"] == "BQSKitMapping":
# bqskit_mapping_action = action
#
# assert bqskit_mapping_action is not None
#
# qc_no_swap_needed = QuantumCircuit(2)
# qc_no_swap_needed.h(0)
# qc_no_swap_needed.cx(0, 1)
#
# device = get_device_by_name("ibm_montreal")
#
# bqskit_qc = qiskit_to_bqskit(qc_no_swap_needed)
# bqskit_qc_mapped, input_mapping, output_mapping = bqskit_mapping_action["transpile_pass"](device)(bqskit_qc)
# mapped_qc = bqskit_to_qiskit(bqskit_qc_mapped)
# layout = helper.final_layout_bqskit_to_qiskit(input_mapping, output_mapping, mapped_qc, qc_no_swap_needed)
# assert layout is not None
# assert input_mapping == output_mapping
# assert layout.final_layout is None
#
# check_mapped_circuit(qc_no_swap_needed, mapped_qc, device, layout)
def test_bqskit_mapping_action_no_swaps_necessary() -> None:
"""Test the BQSKitMapping action for a simple quantum circuit that does not require SWAP gates."""
bqskit_mapping_action = None
for action in helper.get_actions_mapping():
if action["name"] == "BQSKitMapping":
bqskit_mapping_action = action

assert bqskit_mapping_action is not None

qc_no_swap_needed = QuantumCircuit(2)
qc_no_swap_needed.h(0)
qc_no_swap_needed.cx(0, 1)

device = get_device_by_name("ibm_montreal")

bqskit_qc = qiskit_to_bqskit(qc_no_swap_needed)
bqskit_qc_mapped, input_mapping, output_mapping = bqskit_mapping_action["transpile_pass"](device)(bqskit_qc)
mapped_qc = bqskit_to_qiskit(bqskit_qc_mapped)
layout = helper.final_layout_bqskit_to_qiskit(input_mapping, output_mapping, mapped_qc, qc_no_swap_needed)
assert layout is not None
assert input_mapping == output_mapping
assert layout.final_layout is None

check_mapped_circuit(qc_no_swap_needed, mapped_qc, device, layout)


def test_tket_routing() -> None:
Expand Down
Loading

0 comments on commit 018621e

Please sign in to comment.