Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Register Workflows #269

Merged
merged 29 commits into from
Aug 30, 2024
Merged
Changes from 1 commit
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
649f418
Added workflow_registry and register_workflow
mtweiden Aug 14, 2024
b4e5366
compile checks workflow_registry
mtweiden Aug 14, 2024
5912fdf
Pre-commit
mtweiden Aug 14, 2024
18929e1
Workflows can be registered through GateSets
mtweiden Aug 16, 2024
bb3febb
GateSets are hashable
mtweiden Aug 16, 2024
3694184
Check for Gate sequences
mtweiden Aug 16, 2024
888e0b2
Tests for register_workflow
mtweiden Aug 16, 2024
f007e6b
pre-commit
mtweiden Aug 16, 2024
0a33d18
Added test for optimization_level=2
mtweiden Aug 16, 2024
a8b5e25
Renamed workflow_registry -> _workflow_registry
mtweiden Aug 20, 2024
ae23a05
Added clear_register
mtweiden Aug 20, 2024
6e59f4b
register -> registry
mtweiden Aug 20, 2024
92364bd
Fixed spelling error
mtweiden Aug 28, 2024
a74a8aa
Added is_workflow static function
mtweiden Aug 28, 2024
6ff5f9a
Workflow checking is done in Workflow construction
mtweiden Aug 28, 2024
3725b22
No default optimization level
mtweiden Aug 28, 2024
6b7da3c
Permutation robust Gateset hash
mtweiden Aug 28, 2024
99dfee1
Gateset hash test
mtweiden Aug 28, 2024
1e02804
Moved documentation
mtweiden Aug 28, 2024
b6219a9
Removed clear_registry function
mtweiden Aug 28, 2024
6e31654
Removed clear_registry function
mtweiden Aug 28, 2024
6e01010
Changed test
mtweiden Aug 28, 2024
46972c1
Fixed import global conflict
mtweiden Aug 28, 2024
433a108
MachineModels registered in _compile_registry
mtweiden Aug 28, 2024
74e53a0
only considers registered MachineModels
mtweiden Aug 28, 2024
cfa229d
Updated tests for _compile_registry
mtweiden Aug 28, 2024
47fa2ed
Removed unused import
mtweiden Aug 28, 2024
bae9fee
pre-commit
mtweiden Aug 28, 2024
1f94658
Fixed imports
mtweiden Aug 28, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Tests for register_workflow
  • Loading branch information
mtweiden committed Aug 16, 2024
commit 888e0b21b6b4633845dca78b34cc44b8064492b8
95 changes: 95 additions & 0 deletions tests/compiler/test_register.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
"""This file tests the register_workflow function."""
from __future__ import annotations

from itertools import combinations

from random import choice

from bqskit.compiler import compile
from bqskit.compiler.machine import MachineModel
from bqskit.compiler.register import workflow_registry
from bqskit.compiler.register import register_workflow
from bqskit.compiler.workflow import Workflow

from bqskit.ir import Circuit
from bqskit.ir import Gate
from bqskit.ir.gates import CZGate
from bqskit.ir.gates import HGate
from bqskit.ir.gates import RZGate

from bqskit.passes import QuickPartitioner
from bqskit.passes import ScanningGateRemovalPass


def machine_match(mach_a: MachineModel, mach_b: MachineModel) -> bool:
if mach_a.num_qudits != mach_b.num_qudits:
return False
if mach_a.radixes != mach_b.radixes:
return False
if mach_a.coupling_graph != mach_b.coupling_graph:
return False
if mach_a.gate_set != mach_b.gate_set:
return False
return True


def workflow_match(workflow_a: Workflow, workflow_b: Workflow) -> bool:
if len(workflow_a) != len(workflow_b):
return False
for a, b in zip(workflow_a, workflow_b):
if a.name != b.name:
return False
return True


def simple_circuit(num_qudits: int, gate_set: list[Gate]) -> Circuit:
circ = Circuit(num_qudits)
gate = choice(gate_set)
if gate.num_qudits == 1:
loc = choice(range(num_qudits))
else:
loc = choice(list(combinations(range(num_qudits), 2)))
gate_inv = gate.get_inverse()
circ.append_gate(gate, loc)
circ.append_gate(gate_inv, loc)
return circ


class TestRegisterWorkflow:

def test_register_workflow(self) -> None:
assert workflow_registry == {}
machine = MachineModel(3)
workflow = [QuickPartitioner(), ScanningGateRemovalPass()]
register_workflow(machine, workflow)
assert machine in workflow_registry
assert 1 in workflow_registry[machine]
assert workflow_match(workflow_registry[machine][1], workflow)

def test_custom_compile_machine(self) -> None:
gateset = [CZGate(), HGate(), RZGate()]
num_qudits = 3
machine = MachineModel(num_qudits, gate_set=gateset)
workflow = [QuickPartitioner(2)]
register_workflow(machine, workflow)
circuit = simple_circuit(num_qudits, gateset)
result = compile(circuit, machine)
assert result.get_unitary() == circuit.get_unitary()
assert result.num_operations > 0
assert result.gate_counts != circuit.gate_counts
result.unfold_all()
assert result.gate_counts == circuit.gate_counts

def test_custom_compile_gateset(self) -> None:
gateset = [CZGate(), HGate(), RZGate()]
num_qudits = 3
machine = MachineModel(num_qudits, gate_set=gateset)
workflow = [QuickPartitioner(2)]
register_workflow(gateset, workflow)
circuit = simple_circuit(num_qudits, gateset)
result = compile(circuit, machine)
assert result.get_unitary() == circuit.get_unitary()
assert result.num_operations > 0
assert result.gate_counts != circuit.gate_counts
result.unfold_all()
assert result.gate_counts == circuit.gate_counts