Skip to content

Commit

Permalink
Update
Browse files Browse the repository at this point in the history
  • Loading branch information
ElePT committed May 2, 2024
1 parent 5b91a18 commit 7216498
Showing 1 changed file with 58 additions and 14 deletions.
72 changes: 58 additions & 14 deletions test/benchmarks/transpiler_hls_plugins.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# This code is part of Qiskit.
#
# (C) Copyright IBM 2024
# (C) Copyright IBM 2024.
#
# This code is licensed under the Apache License, Version 2.0. You may
# obtain a copy of this license in the LICENSE.txt file in the root directory
Expand Down Expand Up @@ -36,6 +36,9 @@
iSwapGate,
LinearFunction,
)
from qiskit.quantum_info.operators.symplectic.random import random_clifford
from qiskit.synthesis.linear import random_invertible_binary_matrix

class VGate(Gate):
"""V Gate used in Clifford synthesis."""

Expand Down Expand Up @@ -69,13 +72,16 @@ def _define(self):

class HLSPluginsSuite:

def _construct_linear_circuit(self, num_qubits: int):
"""Construct linear circuit."""
# randomized benchmarking
def layer_fidelity_clifford_circuit(self, num_qubits, depth, seed=None):
qc = QuantumCircuit(num_qubits)
for i in range(1, num_qubits):
qc.cx(i - 1, i)
for i in range(0, depth):
for _ in range(depth):
cliff = random_clifford(2, seed=seed)
qc.append(cliff, [2 * i, 2 * i + 1])
return qc

# single large clifford
def random_clifford_circuit(self, num_qubits, num_gates, gates="all", seed=None):
"""Generate a pseudo random Clifford circuit."""

Expand Down Expand Up @@ -128,14 +134,18 @@ def setUp(self):
self.num_qubits = 150
self.rng = np.random.default_rng(1234)

linear_function = LinearFunction(self._construct_linear_circuit(self.num_qubits))
# generate num.samples
mat = random_invertible_binary_matrix(self.num_qubits)
self.qc_linear = QuantumCircuit(self.num_qubits)
self.qc_linear.append(linear_function, list(range(self.num_qubits)))
self.qc_linear.append(LinearFunction(mat), list(range(self.num_qubits)), copy=False)

self.num_samples = 20

# separate transpile from build
# track: depth, num. 2q gates, 2q depth

# Clifford Synthesis Plugins
def time_synth_ag(self):
def time_clifford_ag_large_circuit(self):
"""Test A&G synthesis for set of {num_qubits}-qubit Cliffords"""
hls_config = HLSConfig(clifford=["ag"])
pm = PassManager([HighLevelSynthesis(hls_config=hls_config)])
Expand All @@ -144,7 +154,15 @@ def time_synth_ag(self):
qc_clifford = self.random_clifford_circuit(self.num_qubits, 5 * self.num_qubits, seed=self.rng)
_ = pm.run(qc_clifford)

def time_synth_bm(self):
def time_clifford_ag_rand_benchmarking(self):
"""Test A&G synthesis for set of {num_qubits}-qubit Cliffords"""
hls_config = HLSConfig(clifford=["ag"])
pm = PassManager([HighLevelSynthesis(hls_config=hls_config)])

qc_clifford = self.layer_fidelity_clifford_circuit(self.num_qubits, 50, seed=self.rng)
_ = pm.run(qc_clifford)

def time_clifford_bm_large_circuit(self):
"""Test B&M synthesis for set of {num_qubits}-qubit Cliffords"""
hls_config = HLSConfig(clifford=["bm"])
pm = PassManager([HighLevelSynthesis(hls_config=hls_config)])
Expand All @@ -153,7 +171,15 @@ def time_synth_bm(self):
qc_clifford = self.random_clifford_circuit(self.num_qubits, 5 * self.num_qubits, seed=self.rng)
_ = pm.run(qc_clifford)

def time_synth_greedy(self):
def time_clifford_bm_rand_benchmarking(self):
"""Test B&M synthesis for set of {num_qubits}-qubit Cliffords"""
hls_config = HLSConfig(clifford=["bm"])
pm = PassManager([HighLevelSynthesis(hls_config=hls_config)])

qc_clifford = self.layer_fidelity_clifford_circuit(self.num_qubits, 50, seed=self.rng)
_ = pm.run(qc_clifford)

def time_clifford_greedy_large_circuit(self):
"""Test B&M synthesis for set of {num_qubits}-qubit Cliffords"""
hls_config = HLSConfig(clifford=["greedy"])
pm = PassManager([HighLevelSynthesis(hls_config=hls_config)])
Expand All @@ -162,22 +188,40 @@ def time_synth_greedy(self):
qc_clifford = self.random_clifford_circuit(self.num_qubits, 5 * self.num_qubits, seed=self.rng)
_ = pm.run(qc_clifford)

def time_synth_full(self):
def time_clifford_greedy_rand_benchmarking(self):
"""Test B&M synthesis for set of {num_qubits}-qubit Cliffords"""
hls_config = HLSConfig(clifford=["greedy"])
pm = PassManager([HighLevelSynthesis(hls_config=hls_config)])

qc_clifford = self.layer_fidelity_clifford_circuit(self.num_qubits, 50, seed=self.rng)
_ = pm.run(qc_clifford)

def time_clifford_default_large_circuit(self):
"""Test synthesis for set of {num_qubits}-qubit Cliffords"""
hls_config = HLSConfig(clifford=["full"])
hls_config = HLSConfig(clifford=["default"])
pm = PassManager([HighLevelSynthesis(hls_config=hls_config)])

for _ in range(self.num_samples):
qc_clifford = self.random_clifford_circuit(self.num_qubits, 5 * self.num_qubits, seed=self.rng)
_ = pm.run(qc_clifford)

def time_clifford_default_rand_benchmarking(self):
"""Test synthesis for set of {num_qubits}-qubit Cliffords"""
hls_config = HLSConfig(clifford=["default"])
pm = PassManager([HighLevelSynthesis(hls_config=hls_config)])

qc_clifford = self.layer_fidelity_clifford_circuit(self.num_qubits, 50, seed=self.rng)
_ = pm.run(qc_clifford)

# Clifford Layer Synthesis Plugins

# Linear Synthesis Plugins
def time_pmh_linear_func_plugin(self):
def time_linear_func_pmh(self):
hls_config = HLSConfig(linear_function=[("pmh", {})])
pm = PassManager([HighLevelSynthesis(hls_config=hls_config)])
_ = pm.run(self.qc_linear)

def time_kms_linear_func_plugin(self):
def time_linear_func_kms(self):
hls_config = HLSConfig(linear_function=[("kms", {})])
pm = PassManager([HighLevelSynthesis(hls_config=hls_config)])
_ = pm.run(self.qc_linear)

0 comments on commit 7216498

Please sign in to comment.