-
Notifications
You must be signed in to change notification settings - Fork 2.4k
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
Single classical bit conditioning breaks various functions #6475
Comments
I just added qpy serialization support to the list of things here. It was pointed out to me that trying to dump (and likely load too) a circuit with a single bit condition won't serialize correctly and error. The source is this line: because a |
In Qiskit#6018 initial support for adding classical conditions on a single bit instead of a register was added. However this wasn't accounted for in qpy because it didn't exist when qpy was first written. This commit adds support to qpy without a file format change so it can be backported and used with already released versions of qpy without needing a new format version. This is accomplished by exploiting the strict register naming in qiskit. A register can't have a name outside of regex "[a-z][a-zA-Z0-9_]*" which we leverage in the case of single clbit conditions the "register" name in the output QPY data is set to str(clbit_index) which isn't a valid name. Then on the loading side we check for a valid name, if it's outside the allowed regex we treat the condition as a single bit and the name is a str(index). The tradeoff here is that for a QPY file generated with 0.18.1 (assuming this is backported and included in 0.18.1) this qpy file can not be loaded with qiskit 0.18.0. But this is fine as we only guarantee compatibility in one direction (loading qpy files generated with older with qiskit with a newer version of qiskit). Fixes partially Qiskit#6475
As I understand it, QASM 2 doesn't support conditional operations on anything other than a complete register, so the circuit import qiskit.circuit.qpy_serialization
from qiskit.circuit import QuantumRegister, QuantumCircuit, ClassicalRegister, Clbit
qr = QuantumRegister(2)
cr = ClassicalRegister(8)
qc = QuantumCircuit(qr, cr)
qc.measure(0, cr[0])
qc.measure(1, cr[1])
qc.x(0).c_if(cr[0], 1)
qc.x(1).c_if(cr, 3) can't be translated into valid QASM 2. I had intended to go around this by emitting additional 1-bit classical registers and copying the data, but there's also no classical assignment operation, so that doesn't work either. In theory it is possible to emit valid QASM if the only classical bits used aren't attached to registers, though - instead of binding them all into a single I suspect the "best" solution to this within the framework of QASM 2 is just to emit |
* Handle single bit conditions in QPY In #6018 initial support for adding classical conditions on a single bit instead of a register was added. However this wasn't accounted for in qpy because it didn't exist when qpy was first written. This commit adds support to qpy without a file format change so it can be backported and used with already released versions of qpy without needing a new format version. This is accomplished by exploiting the strict register naming in qiskit. A register can't have a name outside of regex "[a-z][a-zA-Z0-9_]*" which we leverage in the case of single clbit conditions the "register" name in the output QPY data is set to str(clbit_index) which isn't a valid name. Then on the loading side we check for a valid name, if it's outside the allowed regex we treat the condition as a single bit and the name is a str(index). The tradeoff here is that for a QPY file generated with 0.18.1 (assuming this is backported and included in 0.18.1) this qpy file can not be loaded with qiskit 0.18.0. But this is fine as we only guarantee compatibility in one direction (loading qpy files generated with older with qiskit with a newer version of qiskit). Fixes partially #6475 * Add release note * Prefix bit index with null character This commit modifies the special string we use in the register name field to be prefixed with a null character. This leaves open using the string for other special cases and also returning a sane error if an invalid QPY file was generated by something besides Qiskit. * Update qiskit/circuit/qpy_serialization.py Co-authored-by: Jake Lishman <jake@binhbar.com> * Add note to release note about feature not being supported * Add backwards compat test case too Co-authored-by: Jake Lishman <jake@binhbar.com> Co-authored-by: Jake Lishman <jake.lishman@ibm.com> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
* Handle single bit conditions in QPY In #6018 initial support for adding classical conditions on a single bit instead of a register was added. However this wasn't accounted for in qpy because it didn't exist when qpy was first written. This commit adds support to qpy without a file format change so it can be backported and used with already released versions of qpy without needing a new format version. This is accomplished by exploiting the strict register naming in qiskit. A register can't have a name outside of regex "[a-z][a-zA-Z0-9_]*" which we leverage in the case of single clbit conditions the "register" name in the output QPY data is set to str(clbit_index) which isn't a valid name. Then on the loading side we check for a valid name, if it's outside the allowed regex we treat the condition as a single bit and the name is a str(index). The tradeoff here is that for a QPY file generated with 0.18.1 (assuming this is backported and included in 0.18.1) this qpy file can not be loaded with qiskit 0.18.0. But this is fine as we only guarantee compatibility in one direction (loading qpy files generated with older with qiskit with a newer version of qiskit). Fixes partially #6475 * Add release note * Prefix bit index with null character This commit modifies the special string we use in the register name field to be prefixed with a null character. This leaves open using the string for other special cases and also returning a sane error if an invalid QPY file was generated by something besides Qiskit. * Update qiskit/circuit/qpy_serialization.py Co-authored-by: Jake Lishman <jake@binhbar.com> * Add note to release note about feature not being supported * Add backwards compat test case too Co-authored-by: Jake Lishman <jake@binhbar.com> Co-authored-by: Jake Lishman <jake.lishman@ibm.com> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> (cherry picked from commit afb0c47)
* Handle single bit conditions in QPY In #6018 initial support for adding classical conditions on a single bit instead of a register was added. However this wasn't accounted for in qpy because it didn't exist when qpy was first written. This commit adds support to qpy without a file format change so it can be backported and used with already released versions of qpy without needing a new format version. This is accomplished by exploiting the strict register naming in qiskit. A register can't have a name outside of regex "[a-z][a-zA-Z0-9_]*" which we leverage in the case of single clbit conditions the "register" name in the output QPY data is set to str(clbit_index) which isn't a valid name. Then on the loading side we check for a valid name, if it's outside the allowed regex we treat the condition as a single bit and the name is a str(index). The tradeoff here is that for a QPY file generated with 0.18.1 (assuming this is backported and included in 0.18.1) this qpy file can not be loaded with qiskit 0.18.0. But this is fine as we only guarantee compatibility in one direction (loading qpy files generated with older with qiskit with a newer version of qiskit). Fixes partially #6475 * Add release note * Prefix bit index with null character This commit modifies the special string we use in the register name field to be prefixed with a null character. This leaves open using the string for other special cases and also returning a sane error if an invalid QPY file was generated by something besides Qiskit. * Update qiskit/circuit/qpy_serialization.py Co-authored-by: Jake Lishman <jake@binhbar.com> * Add note to release note about feature not being supported * Add backwards compat test case too Co-authored-by: Jake Lishman <jake@binhbar.com> Co-authored-by: Jake Lishman <jake.lishman@ibm.com> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> (cherry picked from commit afb0c47) Co-authored-by: Matthew Treinish <mtreinish@kortar.org>
@TharrmashasthaPV we are planning to release 0.20 soon. Are you planning to fix the rest of issues listed here? |
Information
What is the current behavior?
The PR #6018 enables classical conditioning of gates on individual bits. However, as mentioned in that PR, this new feature breaks the following functions:
m
bit integer as the condition value for condition on a creg ofn
classical bits (wherem>n
) does not raise error .qc.qasm()
breaks when circuitqc
contains gates with classical conditioning on a single cbit.qc.depth()
also breaks. Refer to Classical conditioning on individual classical bits now supported #6018 (comment) ( Fixed in Fixed error in qc.depth() when using on circuits with single bit classical conditions #6476 )disassemble(qc_assembled)
breaks whereqc_assembled
is an assembledQobj
. (PR in review. Check Fixed diassembler for circuits containing single bit conditioned gates #6989 .)qc.num_connected_components
breaks. ( Fixed in Fixed qc.num_connected_components() for circuits with bit conditioned gates #6564.)circuit_to_instruction(qc)
breaks. (PR in review Fixes circuit_to_instruction() method for circuits containing single bit conditions #6537.)_check_wires_list()
andsubstitute_node_with_dag()
methods in qiskit/dagcircuit/dagcircuit.py break._is_same_c_conf()
method inForwardMatch
andBackwardMatch
classes in qiskit/transpiler/passes/optimization/template_matching breaks.run()
method inConsolidateBlocks
class in qiskit/transpiler/passes/optimization breaks.Suggested solutions
The fixes should be simple. Need to look for parts that have
ClassicalRegister
in condition in these functions and extend them also to cases whenClbit
is in condition.The text was updated successfully, but these errors were encountered: