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

New algorithm for RB building Cliffords by layers #892

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
146 commits
Select commit Hold shift + click to select a range
9d81eed
New algorithm for generating Clifford circuits for single qubit. We g…
merav-aharoni May 25, 2022
c836831
Changed basis for transpilation to match the one in single_qubit_test…
merav-aharoni May 29, 2022
86cad33
Modified the methods in create_clifford_map so that compose does not …
merav-aharoni May 31, 2022
9a873dc
Changed generation of generation of random numbers to be identical to…
merav-aharoni May 31, 2022
76ff366
Test to run on device
merav-aharoni Jun 1, 2022
ab7d4f3
Merge pull request #2 from merav-aharoni/rb_performance
merav-aharoni Jun 7, 2022
274432a
added methods for new algorithm to generate rb circuits: build_rb_cir…
merav-aharoni Jun 9, 2022
890d890
Added the method _layout_for_rb_single_qubit and added test_full_samp…
merav-aharoni Jun 12, 2022
8dc9aa1
In test_full_sampling_single_qubit fixed num_samples to be 1, because…
merav-aharoni Jun 12, 2022
f0c3cc8
Tidied up build_rb_circuits
merav-aharoni Jun 13, 2022
10a7e9f
Added documentation and moved methods
merav-aharoni Jun 13, 2022
aea856a
Added test_single_qubit_parallel
merav-aharoni Jun 13, 2022
eec3721
Merge branch 'main' into transpiled-rb
merav-aharoni Jun 14, 2022
dd0b62b
Changed name _format_data to format_data because the method wasn't be…
merav-aharoni Jun 14, 2022
b9c9f41
Fixed handling of num_samples>1. Cleaned out prints. Reverted previou…
merav-aharoni Jun 15, 2022
92f5580
Added assertExperimentDone to test_single-qubit_parallel. Fixed param…
merav-aharoni Jun 15, 2022
3e9c386
Modified assertAllIdentity to support circuits with rz gates
merav-aharoni Jun 15, 2022
4557572
Changed name _new_rb to _transpiled_rb. Also changed default to be Fa…
merav-aharoni Jun 15, 2022
0673e23
removed fast_rb.py
merav-aharoni Jun 15, 2022
c543fa4
removed rb_on_device.py
merav-aharoni Jun 15, 2022
3c2dca8
Removed temporary 'import time'
merav-aharoni Jun 15, 2022
b9e0884
Added support for interleaved rb single qubit
merav-aharoni Jun 21, 2022
f899247
Fixed handling of interleaved element
merav-aharoni Jun 21, 2022
2bc7469
Fixed bug caused by change of interface of _buil_rb_circuits after ad…
merav-aharoni Jun 22, 2022
bbaf218
added test_number_to_clifford_mapping and fixed the method num_from_1…
merav-aharoni Jun 23, 2022
402bf69
Added support for computation of the Clifford to number mapping of a …
merav-aharoni Jun 23, 2022
67f07ca
Moved setting of interleaved metadata to be under 'if is_interleaved'
merav-aharoni Jun 26, 2022
d72beb1
Added transpilation of interleaved element before creating the rb cir…
merav-aharoni Jun 26, 2022
7f9778f
Fixed incorrect parameter 'qubits' in test_non_clifford_interleaved_e…
merav-aharoni Jun 28, 2022
af42386
Added support for 'delay' as interleaved element
merav-aharoni Jun 28, 2022
95125ed
Moved setting of basis gates to circuits(), because in __init__ the t…
merav-aharoni Jun 28, 2022
d5949f4
Cleaned up setting of tranpile_options in the test. Added call to gen…
merav-aharoni Jun 29, 2022
a9e3146
Changed the clifford compose mapping so that the rhs includes only si…
merav-aharoni Jun 30, 2022
de1d6ff
Changed all methods in CliffordUtils to be classmethod
merav-aharoni Jun 30, 2022
b79b5bf
Fixes following changes in CliffordUtils
merav-aharoni Jun 30, 2022
96046a5
Changed structure of CLIFF_COMPOSE_DATA to be an array instead of a d…
merav-aharoni Jun 30, 2022
352539e
Improved _layout_for_rb_single_qubit to be more robust
merav-aharoni Jul 3, 2022
b10b1c6
Documentation, black, pylint
merav-aharoni Jul 3, 2022
0cef2b7
Merge branch 'main' into transpiled-rb
merav-aharoni Jul 3, 2022
eab49ec
black
merav-aharoni Jul 3, 2022
16fe2e1
Removed the parameter transpiled_rb used for choosing whether to use …
merav-aharoni Jul 5, 2022
e2fe641
Cleaning up
merav-aharoni Jul 5, 2022
6c4662e
Generated transpiled clifford circuits for 2 qubits, and stored in a …
merav-aharoni Jul 6, 2022
2654c1a
Merged with branch transpiled_rb
merav-aharoni Jul 6, 2022
a27ded2
re-generated transpiled circuits
merav-aharoni Jul 6, 2022
6c38ad1
Added support for compose_num_with_clifford_2q. Added suitable test …
merav-aharoni Jul 10, 2022
8c47f94
Created method load_transpiled_cliff_circuits
merav-aharoni Jul 10, 2022
5882832
Added support for two sets of basis gates and their corresponding tra…
merav-aharoni Jul 12, 2022
5d0b893
United the two class variables _transpiled_cliff_circuits_1q and _tra…
merav-aharoni Jul 12, 2022
bbb91ea
Added setting of transpile_options to all tests
merav-aharoni Jul 12, 2022
3788e0f
Fixed error messages
merav-aharoni Jul 12, 2022
ce72dd9
United methods compose_num_with_clifford and num_from_clifford_single…
merav-aharoni Jul 12, 2022
57a6ab0
Unified the format for CLIFF_SINGLE_GATE_MAP_1Q and CLIFF_SINGLE_GATE…
merav-aharoni Jul 12, 2022
eed14b7
Added method clifford_inverse_by_num to unite handling of 1 and 2 qub…
merav-aharoni Jul 12, 2022
93dfec7
Fixes to support 1 and 2 qubits in _build_rb_circuits
merav-aharoni Jul 12, 2022
4408e31
Fixed more places where the code assumed 1 qubit rb
merav-aharoni Jul 14, 2022
04622e3
Fix for handling of delay. Changed test_interleaving_circuit_with_del…
merav-aharoni Jul 17, 2022
89b7602
changed basis gates in test, because rz is not supported in conversio…
merav-aharoni Jul 19, 2022
7415163
Extended lenths for test, because test was failing for statistical re…
merav-aharoni Jul 19, 2022
f7d6609
changed name of method after addition of 2q
merav-aharoni Jul 19, 2022
b0a5e24
Merged with main. Changed test_poor_experiment_result to use a set of…
merav-aharoni Jul 19, 2022
968a7fc
black and lint
merav-aharoni Jul 20, 2022
b05f7df
black, lint and documentation
merav-aharoni Jul 20, 2022
b4f4eb7
black, lint, cleaning
merav-aharoni Jul 21, 2022
d75adc3
Removed legacy code. Additional cleaning
merav-aharoni Jul 21, 2022
60a41f0
Removed more legacy code. More cleaning
merav-aharoni Jul 21, 2022
506eaa7
Merge branch 'main' into 2_qubits_rb
merav-aharoni Jul 21, 2022
6d42ef1
Removed pylint messages for the data file
merav-aharoni Jul 21, 2022
535ffb0
pylint, and use method CliffordUtils.file_name
merav-aharoni Jul 21, 2022
db4b782
Removed additional legacy code
merav-aharoni Jul 21, 2022
ed2824a
Release notes
merav-aharoni Jul 21, 2022
b8c4fb6
Added missing ()
merav-aharoni Jul 21, 2022
d1c304b
Fixed error message
merav-aharoni Jul 21, 2022
a2dd0a7
Added QiskitError to documentation
merav-aharoni Jul 21, 2022
7a0acfc
black
merav-aharoni Jul 21, 2022
059904f
Fixed error message
merav-aharoni Jul 22, 2022
1cafa16
Changed varible name
merav-aharoni Jul 22, 2022
66ceb08
Merge branch 'main' into 2_qubits_rb
merav-aharoni Jul 22, 2022
a4ff280
attempt to fix documentation failure in CI
merav-aharoni Jul 24, 2022
0eda2e7
pylint
merav-aharoni Jul 24, 2022
e6b13c5
Added transpile options to every experiment
merav-aharoni Jul 24, 2022
1efbd0c
Made setting transpile_options mandatory, because if basis_gates are …
merav-aharoni Jul 24, 2022
1fdecee
Split test_rb_utils into itself and test_clifford_utils
merav-aharoni Jul 25, 2022
08e3a27
Added tests for composing a clifford with a number
merav-aharoni Jul 25, 2022
60505a8
Added test for inverse clifford by num
merav-aharoni Jul 25, 2022
14411d4
Changed random to rng because of failure on Windows
merav-aharoni Jul 25, 2022
2990180
Removed dependency on Aer for transpile. Removed the method transpile…
merav-aharoni Jul 27, 2022
0d63efa
Changed parameter backend to be optional, as it was before
merav-aharoni Jul 27, 2022
e90a5e5
Improved format for CLIFF_SINGLE_GATE_MAP, CLIFF_COMPOSE_DATA, CLIFF_…
merav-aharoni Jul 27, 2022
b91b4a0
Changed usage from cliff.__repr__ to repr(cliff)
merav-aharoni Jul 27, 2022
30654f4
Merge branch 'main' into 2_qubits_rb
merav-aharoni Aug 4, 2022
632fa52
Fixed a bug where transpiled_circuits were loaded multiple times
merav-aharoni Aug 7, 2022
0923667
Merge branch '2_qubits_rb' of github.com:merav-aharoni/qiskit-experim…
merav-aharoni Aug 7, 2022
5cf5c5f
Merge branch 'main' into 2_qubits_rb
merav-aharoni Aug 10, 2022
2abba21
New algorithm that constructs the Cliffords by layers
merav-aharoni Aug 17, 2022
afadfec
Added support for 1 qubits, for full sampling and for interleaved rb
merav-aharoni Aug 18, 2022
460417a
Removed unused files. Black
merav-aharoni Aug 18, 2022
b01ee51
Added 2 parameters to CliffordUtils.__init__: num_qubits and basis_gates
merav-aharoni Aug 23, 2022
652df1f
Removed all parameters num_qubits and use self.num-qubits instead
merav-aharoni Aug 23, 2022
536f8a6
merged with main
merav-aharoni Aug 25, 2022
650e68a
Removed usage of specific gate sets
merav-aharoni Aug 29, 2022
c6cf37c
moved interleaved element out of StandardRB
merav-aharoni Aug 29, 2022
f5e5538
Split _build_rb_circuits into small methods to make it more modular
merav-aharoni Aug 30, 2022
ad66611
Added tests for CliffordUtils
merav-aharoni Aug 30, 2022
992ea89
Added support for cz
merav-aharoni Sep 4, 2022
82128f1
Added backend to CliffordInit.__init__. Added transpile to initial ci…
merav-aharoni Sep 4, 2022
bf20523
Modified test_correct_1q_depolarization for it to pass
merav-aharoni Sep 5, 2022
adcb60d
black and pylint
merav-aharoni Sep 5, 2022
732d632
Fixed bug with cz - since it is a symmetrical operation, we store onl…
merav-aharoni Sep 6, 2022
fc9145e
Fixed the parameters in cliffordUtils methods. Since num_qubits was a…
merav-aharoni Sep 6, 2022
48db166
Data updated by changes in create_clifford_map.py from previous commit
merav-aharoni Sep 6, 2022
a268ff1
Fixed two tests. test_correct_1q_depolarization was failing due to to…
merav-aharoni Sep 7, 2022
0d2e490
Changed usage of VGate and WGate to their component gates: s, h, sdg.
merav-aharoni Sep 7, 2022
abd440d
Moved transpiled clifford structures outside init to make them static…
merav-aharoni Sep 7, 2022
383bec9
Added test for two qubit rb in parallel
merav-aharoni Sep 7, 2022
95d1d3f
Moved structures back inside __init__ because the previous change cau…
merav-aharoni Sep 8, 2022
0eb9f0e
Added back the old code to create RB circuits for more than 2 qubits
merav-aharoni Sep 8, 2022
5771ae2
Merge branch 'alg-rb-layers' of github.com:merav-aharoni/qiskit-exper…
merav-aharoni Sep 8, 2022
655f1c3
Merge branch 'main' into alg-rb-layers
merav-aharoni Sep 11, 2022
b60e93e
Changed InterleavedRB.circuits to call its super() when number of qub…
merav-aharoni Sep 11, 2022
1ba2c7a
Added test for three qubit RB
merav-aharoni Sep 11, 2022
68546ad
Documentation
merav-aharoni Sep 11, 2022
d8e5289
black and pylint
merav-aharoni Sep 11, 2022
5a49453
Disabled black and pylint errors on clifford_data.py
merav-aharoni Sep 11, 2022
8bfda17
Changed _clifford_utils to be a static class member. Added a couple o…
merav-aharoni Sep 11, 2022
dfec1e7
Updated release notes
merav-aharoni Sep 11, 2022
31fb184
Fixed failing test
merav-aharoni Sep 11, 2022
3adc552
Fixed bug: _transpile_cliff_layer_0 was ignoring the backend
merav-aharoni Sep 11, 2022
533366c
Documentation
merav-aharoni Sep 11, 2022
64c0b9e
Reverted changes in tutorial as it is not mandatory to supply basis_g…
merav-aharoni Sep 11, 2022
d9a148f
Cleaning up
merav-aharoni Sep 11, 2022
cb2cdf8
Cleaning up
merav-aharoni Sep 12, 2022
39bae42
black and doc
merav-aharoni Sep 12, 2022
54c7629
Fixed bug found in tutorial - added transpile at the beginning of bui…
merav-aharoni Sep 12, 2022
c79986d
Added header
merav-aharoni Sep 12, 2022
d28a728
Merged with main. Included comments for discussion
merav-aharoni Sep 13, 2022
d3c7322
black
merav-aharoni Sep 13, 2022
17cc293
Cleaning up temporary comments
merav-aharoni Sep 14, 2022
8c6ba9d
documentation
merav-aharoni Sep 14, 2022
a08a66c
Changed order of several methods
merav-aharoni Sep 14, 2022
9c0da39
Removed -interleave(). It was previously removed in main, but I forgo…
merav-aharoni Sep 14, 2022
b96cbb3
Removed method _set_interleaved_element that was removed in a previou…
merav-aharoni Sep 14, 2022
3863028
Name changed and spaces
merav-aharoni Sep 14, 2022
e0ad72f
Removed empty spaces
merav-aharoni Sep 14, 2022
5d5714f
typo
merav-aharoni Sep 14, 2022
f6458ff
Fixed transpilation of interleaved element. Made a few structural cha…
merav-aharoni Sep 14, 2022
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

Large diffs are not rendered by default.

372 changes: 360 additions & 12 deletions qiskit_experiments/library/randomized_benchmarking/clifford_utils.py

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,253 @@
# This code is part of Qiskit.
#
# (C) Copyright IBM 2021.
#
# 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
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
#
# Any modifications or derivative works of this code must retain this
# copyright notice, and modified files need to carry a notice indicating
# that they have been altered from the originals.
"""
This is a script used to create the data in clifford_data.py.
Every Clifford is represented by a number. We store a list of the compositions of Cliffords represented
as numbers. For example, if Clifford1.compose(Clifford2) == Clifford3, then we conceptually,
we store {(1, 2) : 3}. We don't actually store the map, but only the results of compose in a list,
because this is more efficient in performance. The result is found using the indices of the input
Cliffords.
Similarly, we store for each number representing a Clifford, the number representing the
inverse Clifford.
For compose, we don't actually store the full compose table of all-cliffords X all-cliffords.
Instead, we define an list of single-gate-cliffords. This comprises all Cliffords that consist
of a single gate. There are 9 such Cliffords for 1-qubit, and 21 such Cliffords for 2-qubits.
It is sufficient to store the compose table of all-cliffords X single-gate-cliffords,
since for every Clifford on the right hand side, we can break it down into single gate Cliffords,
and do the composition one gate at a time. This greatly reduces the storage space for the array of
composition results (from O(n^2) to O(n)), where n is the number of Cliffords.
"""
import itertools

from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import (
IGate,
HGate,
SXdgGate,
SGate,
XGate,
SXGate,
YGate,
ZGate,
SdgGate,
CXGate,
CZGate,
)
from qiskit.quantum_info.operators.symplectic import Clifford
from qiskit_experiments.library.randomized_benchmarking.clifford_utils import CliffordUtils

gate_list_1q = [
IGate(),
HGate(),
SXdgGate(),
SGate(),
XGate(),
SXGate(),
YGate(),
ZGate(),
SdgGate(),
]
asymm_gates_2q = [
CXGate(),
]
symm_gates_2q = [CZGate()]


class CliffordNumMapping:
"""Class that creates creates all the structures with the mappings between Cliffords
and numbers."""

basis_gates = ["h", "s", "sdg", "x", "cx"]
single_gate_clifford_map_1q = {}
single_gate_clifford_map_2q = {}
num_to_cliff_1q = {}
cliff_to_num_1q = {}
num_to_cliff_2q = {}
cliff_to_num_2q = {}
layers_num_to_cliff_num_2q = {}
cliff_num_to_layers_2q = {}

@classmethod
def gen_nums_single_gate_cliffs_1q(cls):
"""
Generates a dict mapping numbers to Cliffords and the reverse dict.
Based on these structures, we build a mapping from every single-gate-clifford to its number.
The mapping actually looks like {(gate, '[0]'): num}, where [0] represents qubit 0.
The qubit is added to be consistent with the format for 2 qubits.
"""
clifford_utils = CliffordUtils(1, cls.basis_gates)
for i in range(clifford_utils.NUM_CLIFFORD_1_QUBIT):
cliff = clifford_utils.clifford_1_qubit(i)
cls.num_to_cliff_1q[i] = cliff
cls.cliff_to_num_1q[repr(cliff)] = i

for gate in gate_list_1q:
qc = QuantumCircuit(1)
qc.append(gate, [0])
cliff = Clifford(qc)
if repr(cliff) in cls.cliff_to_num_1q.keys():
num = cls.cliff_to_num_1q[repr(cliff)]
# qubit_as_str is not really necessary. It is only added to be consistent
# with the representation for 2 qubits
qubit_as_str = "[0]"
cls.single_gate_clifford_map_1q[(gate.name, qubit_as_str)] = num
else:
print("not found")
cliff_data_file.write(f"CLIFF_SINGLE_GATE_MAP_1Q = {cls.single_gate_clifford_map_1q}\n")

@classmethod
def gen_nums_single_gate_cliffs_2q(cls):
"""
Generates a dict mapping numbers to Cliffords and the reverse dict.
Based on these structures, we build a mapping from every single-gate-clifford to its number.
The mapping actually looks like {(gate, '[qubits]'): num}.
"""
clifford_utils = CliffordUtils(2, cls.basis_gates)
for i in range(clifford_utils.NUM_CLIFFORD_2_QUBIT):
cliff = clifford_utils.clifford_2_qubit(i)
cls.num_to_cliff_2q[i] = cliff
cls.cliff_to_num_2q[repr(cliff)] = i

for gate, qubit in itertools.product(gate_list_1q, [0, 1]):
qc = QuantumCircuit(2)
qc.append(gate, [qubit])
cliff = Clifford(qc)
if repr(cliff) in cls.cliff_to_num_2q:
num = cls.cliff_to_num_2q[repr(cliff)]
# qubit_as_str is not really necessary. It is only added to be consistent
# with the representation for 2 qubits
qubit_as_str = "[" + str(qubit) + "]"
cls.single_gate_clifford_map_2q[(gate.name, qubit_as_str)] = num
else:
print("not found")

for gate, qubits in itertools.product(asymm_gates_2q, [[0, 1], [1, 0]]):
qc = QuantumCircuit(2)
qc.append(gate, qubits)
cliff = Clifford(qc)
if repr(cliff) in cls.cliff_to_num_2q.keys():
num = cls.cliff_to_num_2q[repr(cliff)]
else:
print("not found")
direction = "[0, 1]" if qubits == [0, 1] else "[1, 0]"
cls.single_gate_clifford_map_2q[(gate.name, direction)] = num

for gate in symm_gates_2q:
qc = QuantumCircuit(2)
qc.append(gate, [0, 1])
cliff = Clifford(qc)
if repr(cliff) in cls.cliff_to_num_2q.keys():
num = cls.cliff_to_num_2q[repr(cliff)]
else:
print("not found")
cls.single_gate_clifford_map_2q[(gate.name, "[0, 1]")] = num

cliff_data_file.write(f"CLIFF_SINGLE_GATE_MAP_2Q = {cls.single_gate_clifford_map_2q}\n")

@classmethod
def create_compose_map_1q(cls):
"""Creates the data in compose data in CLIFF_COMPOSE_DATA and
the inverse data in CLIFF_INVERSE_DATA"""
products = {}
for i in range(CliffordUtils.NUM_CLIFFORD_1_QUBIT):
cliff1 = cls.num_to_cliff_1q[i]
for gate in cls.single_gate_clifford_map_1q:
cliff2 = cls.num_to_cliff_1q[cls.single_gate_clifford_map_1q[gate]]
cliff = cliff1.compose(cliff2)
products[(i, gate)] = cls.cliff_to_num_1q[repr(cliff)]

invs = {}
for i in range(CliffordUtils.NUM_CLIFFORD_1_QUBIT):
cliff1 = cls.num_to_cliff_1q[i]
cliff = cliff1.adjoint()
invs[i] = cls.cliff_to_num_1q[repr(cliff)]

cliff_data_file.write("CLIFF_COMPOSE_DATA_1Q = [")
for i in products:
cliff_data_file.write(f"{products[i]},")
cliff_data_file.write("]")
cliff_data_file.write("\n")

cliff_data_file.write("CLIFF_INVERSE_DATA_1Q = [")
for i in invs:
cliff_data_file.write(f"{invs[i]},")
cliff_data_file.write("]")
cliff_data_file.write("\n")

@classmethod
def create_compose_map_2q(cls):
"""Creates the data in CLIFF_COMPOSE_DATA and CLIFF_INVERSE_DATA"""
products = {}
for i in range(CliffordUtils.NUM_CLIFFORD_2_QUBIT):
cliff1 = cls.num_to_cliff_2q[i]
for gate in cls.single_gate_clifford_map_2q:
cliff2 = cls.num_to_cliff_2q[cls.single_gate_clifford_map_2q[gate]]
cliff = cliff1.compose(cliff2)
products[(i, gate)] = cls.cliff_to_num_2q[repr(cliff)]

invs = {}
for i in range(CliffordUtils.NUM_CLIFFORD_2_QUBIT):
cliff1 = cls.num_to_cliff_2q[i]
cliff = cliff1.adjoint()
invs[i] = cls.cliff_to_num_2q[repr(cliff)]

cliff_data_file.write("CLIFF_COMPOSE_DATA_2Q = [")
for i in products:
cliff_data_file.write(f"{products[i]},")
cliff_data_file.write("]")
cliff_data_file.write("\n")

cliff_data_file.write("CLIFF_INVERSE_DATA_2Q = [")
for i in invs:
cliff_data_file.write(f"{invs[i]},")
cliff_data_file.write("]")
cliff_data_file.write("\n")

@classmethod
def map_layers_to_cliffords_2q(cls):
"""Creates a map from a triplet describing the indices in the layers, to the
number of the corresponding Clifford"""
clifford_utils = CliffordUtils(2, cls.basis_gates)
clifford_utils.transpile_2q_cliff_layers()
length = [len(clifford_utils._transpiled_cliff_layer[i]) for i in [0, 1, 2]]
for n0, n1, n2 in itertools.product(range(length[0]), range(length[1]), range(length[2])):
cliff = Clifford(clifford_utils.transpiled_cliff_from_layer_nums((n0, n1, n2)))

num = cls.cliff_to_num_2q[repr(cliff)]
cls.layers_num_to_cliff_num_2q[(n0, n1, n2)] = num
cls.cliff_num_to_layers_2q[num] = (n0, n1, n2)

cliff_data_file.write("CLIFF_LAYERS_TO_NUM_2Q = [")
for i in cls.layers_num_to_cliff_num_2q:
cliff_data_file.write(f"{cls.layers_num_to_cliff_num_2q[i]},")
cliff_data_file.write("]\n")

cliff_data_file.write("CLIFF_NUM_TO_LAYERS_2Q = [")
for i in range(len(cls.cliff_num_to_layers_2q)):
cliff_data_file.write(f"{cls.cliff_num_to_layers_2q[i]},")
cliff_data_file.write("]\n")

@classmethod
def create_clifford_data(cls):
"""Creates all the data for compose and inverse."""
cls.gen_nums_single_gate_cliffs_1q()
cls.gen_nums_single_gate_cliffs_2q()
cls.create_compose_map_1q()
cls.create_compose_map_2q()


with open("clifford_data.py", "w") as cliff_data_file:
cliff_data_file.write("# fmt: off\n")
cliff_data_file.write("# pylint: skip-file\n\n")
CliffordNumMapping.create_clifford_data()
CliffordNumMapping.map_layers_to_cliffords_2q()
cliff_data_file.write("\n# fmt: on\n")
Loading