qiskit 1.3.0__cp39-abi3-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -0
- qiskit/__init__.py +146 -0
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/assembler/__init__.py +42 -0
- qiskit/assembler/assemble_circuits.py +451 -0
- qiskit/assembler/assemble_schedules.py +367 -0
- qiskit/assembler/disassemble.py +310 -0
- qiskit/assembler/run_config.py +77 -0
- qiskit/circuit/__init__.py +1313 -0
- qiskit/circuit/_classical_resource_map.py +148 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/add_control.py +274 -0
- qiskit/circuit/annotated_operation.py +279 -0
- qiskit/circuit/barrier.py +50 -0
- qiskit/circuit/bit.py +94 -0
- qiskit/circuit/classical/__init__.py +41 -0
- qiskit/circuit/classical/expr/__init__.py +238 -0
- qiskit/circuit/classical/expr/constructors.py +556 -0
- qiskit/circuit/classical/expr/expr.py +397 -0
- qiskit/circuit/classical/expr/visitors.py +300 -0
- qiskit/circuit/classical/types/__init__.py +109 -0
- qiskit/circuit/classical/types/ordering.py +222 -0
- qiskit/circuit/classical/types/types.py +117 -0
- qiskit/circuit/classicalfunction/__init__.py +140 -0
- qiskit/circuit/classicalfunction/boolean_expression.py +129 -0
- qiskit/circuit/classicalfunction/classical_element.py +54 -0
- qiskit/circuit/classicalfunction/classical_function_visitor.py +155 -0
- qiskit/circuit/classicalfunction/classicalfunction.py +173 -0
- qiskit/circuit/classicalfunction/exceptions.py +35 -0
- qiskit/circuit/classicalfunction/types.py +18 -0
- qiskit/circuit/classicalfunction/utils.py +91 -0
- qiskit/circuit/classicalregister.py +57 -0
- qiskit/circuit/commutation_checker.py +106 -0
- qiskit/circuit/commutation_library.py +20 -0
- qiskit/circuit/controlflow/__init__.py +28 -0
- qiskit/circuit/controlflow/_builder_utils.py +207 -0
- qiskit/circuit/controlflow/break_loop.py +56 -0
- qiskit/circuit/controlflow/builder.py +691 -0
- qiskit/circuit/controlflow/continue_loop.py +58 -0
- qiskit/circuit/controlflow/control_flow.py +84 -0
- qiskit/circuit/controlflow/for_loop.py +217 -0
- qiskit/circuit/controlflow/if_else.py +511 -0
- qiskit/circuit/controlflow/switch_case.py +417 -0
- qiskit/circuit/controlflow/while_loop.py +171 -0
- qiskit/circuit/controlledgate.py +274 -0
- qiskit/circuit/delay.py +123 -0
- qiskit/circuit/duration.py +95 -0
- qiskit/circuit/equivalence.py +94 -0
- qiskit/circuit/equivalence_library.py +18 -0
- qiskit/circuit/exceptions.py +19 -0
- qiskit/circuit/gate.py +263 -0
- qiskit/circuit/instruction.py +697 -0
- qiskit/circuit/instructionset.py +179 -0
- qiskit/circuit/library/__init__.py +668 -0
- qiskit/circuit/library/arithmetic/__init__.py +34 -0
- qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +210 -0
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +88 -0
- qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
- qiskit/circuit/library/arithmetic/integer_comparator.py +243 -0
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +196 -0
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +189 -0
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +192 -0
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +353 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +277 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +317 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +335 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +198 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +337 -0
- qiskit/circuit/library/basis_change/__init__.py +15 -0
- qiskit/circuit/library/basis_change/qft.py +313 -0
- qiskit/circuit/library/blueprintcircuit.py +280 -0
- qiskit/circuit/library/boolean_logic/__init__.py +18 -0
- qiskit/circuit/library/boolean_logic/inner_product.py +155 -0
- qiskit/circuit/library/boolean_logic/quantum_and.py +200 -0
- qiskit/circuit/library/boolean_logic/quantum_or.py +202 -0
- qiskit/circuit/library/boolean_logic/quantum_xor.py +165 -0
- qiskit/circuit/library/data_preparation/__init__.py +57 -0
- qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
- qiskit/circuit/library/data_preparation/initializer.py +107 -0
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
- qiskit/circuit/library/fourier_checking.py +158 -0
- qiskit/circuit/library/generalized_gates/__init__.py +30 -0
- qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
- qiskit/circuit/library/generalized_gates/gms.py +174 -0
- qiskit/circuit/library/generalized_gates/gr.py +215 -0
- qiskit/circuit/library/generalized_gates/isometry.py +370 -0
- qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
- qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
- qiskit/circuit/library/generalized_gates/pauli.py +85 -0
- qiskit/circuit/library/generalized_gates/permutation.py +194 -0
- qiskit/circuit/library/generalized_gates/rv.py +96 -0
- qiskit/circuit/library/generalized_gates/uc.py +213 -0
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
- qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
- qiskit/circuit/library/generalized_gates/ucry.py +32 -0
- qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
- qiskit/circuit/library/generalized_gates/unitary.py +215 -0
- qiskit/circuit/library/graph_state.py +169 -0
- qiskit/circuit/library/grover_operator.py +579 -0
- qiskit/circuit/library/hamiltonian_gate.py +142 -0
- qiskit/circuit/library/hidden_linear_function.py +161 -0
- qiskit/circuit/library/iqp.py +175 -0
- qiskit/circuit/library/n_local/__init__.py +45 -0
- qiskit/circuit/library/n_local/efficient_su2.py +277 -0
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +515 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +297 -0
- qiskit/circuit/library/n_local/n_local.py +1472 -0
- qiskit/circuit/library/n_local/pauli_two_design.py +243 -0
- qiskit/circuit/library/n_local/qaoa_ansatz.py +366 -0
- qiskit/circuit/library/n_local/real_amplitudes.py +306 -0
- qiskit/circuit/library/n_local/two_local.py +289 -0
- qiskit/circuit/library/overlap.py +182 -0
- qiskit/circuit/library/pauli_evolution.py +186 -0
- qiskit/circuit/library/phase_estimation.py +175 -0
- qiskit/circuit/library/phase_oracle.py +153 -0
- qiskit/circuit/library/quantum_volume.py +167 -0
- qiskit/circuit/library/standard_gates/__init__.py +142 -0
- qiskit/circuit/library/standard_gates/dcx.py +78 -0
- qiskit/circuit/library/standard_gates/ecr.py +130 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
- qiskit/circuit/library/standard_gates/global_phase.py +85 -0
- qiskit/circuit/library/standard_gates/h.py +258 -0
- qiskit/circuit/library/standard_gates/i.py +76 -0
- qiskit/circuit/library/standard_gates/iswap.py +134 -0
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +405 -0
- qiskit/circuit/library/standard_gates/p.py +441 -0
- qiskit/circuit/library/standard_gates/r.py +117 -0
- qiskit/circuit/library/standard_gates/rx.py +303 -0
- qiskit/circuit/library/standard_gates/rxx.py +183 -0
- qiskit/circuit/library/standard_gates/ry.py +298 -0
- qiskit/circuit/library/standard_gates/ryy.py +183 -0
- qiskit/circuit/library/standard_gates/rz.py +319 -0
- qiskit/circuit/library/standard_gates/rzx.py +229 -0
- qiskit/circuit/library/standard_gates/rzz.py +196 -0
- qiskit/circuit/library/standard_gates/s.py +428 -0
- qiskit/circuit/library/standard_gates/swap.py +288 -0
- qiskit/circuit/library/standard_gates/sx.py +315 -0
- qiskit/circuit/library/standard_gates/t.py +179 -0
- qiskit/circuit/library/standard_gates/u.py +403 -0
- qiskit/circuit/library/standard_gates/u1.py +501 -0
- qiskit/circuit/library/standard_gates/u2.py +149 -0
- qiskit/circuit/library/standard_gates/u3.py +436 -0
- qiskit/circuit/library/standard_gates/x.py +1529 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +235 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +239 -0
- qiskit/circuit/library/standard_gates/y.py +262 -0
- qiskit/circuit/library/standard_gates/z.py +348 -0
- qiskit/circuit/library/templates/__init__.py +92 -0
- qiskit/circuit/library/templates/clifford/__init__.py +33 -0
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
- qiskit/circuit/library/templates/nct/__init__.py +67 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
- qiskit/circuit/library/templates/rzx/__init__.py +25 -0
- qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
- qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
- qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
- qiskit/circuit/measure.py +44 -0
- qiskit/circuit/operation.py +67 -0
- qiskit/circuit/parameter.py +178 -0
- qiskit/circuit/parameterexpression.py +692 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +120 -0
- qiskit/circuit/quantumcircuit.py +6829 -0
- qiskit/circuit/quantumcircuitdata.py +136 -0
- qiskit/circuit/quantumregister.py +75 -0
- qiskit/circuit/random/__init__.py +15 -0
- qiskit/circuit/random/utils.py +358 -0
- qiskit/circuit/register.py +233 -0
- qiskit/circuit/reset.py +34 -0
- qiskit/circuit/singleton.py +606 -0
- qiskit/circuit/store.py +97 -0
- qiskit/circuit/tools/__init__.py +16 -0
- qiskit/circuit/tools/pi_check.py +190 -0
- qiskit/circuit/twirling.py +145 -0
- qiskit/compiler/__init__.py +33 -0
- qiskit/compiler/assembler.py +681 -0
- qiskit/compiler/scheduler.py +109 -0
- qiskit/compiler/sequencer.py +71 -0
- qiskit/compiler/transpiler.py +533 -0
- qiskit/converters/__init__.py +74 -0
- qiskit/converters/circuit_to_dag.py +78 -0
- qiskit/converters/circuit_to_dagdependency.py +51 -0
- qiskit/converters/circuit_to_dagdependency_v2.py +47 -0
- qiskit/converters/circuit_to_gate.py +107 -0
- qiskit/converters/circuit_to_instruction.py +155 -0
- qiskit/converters/dag_to_circuit.py +79 -0
- qiskit/converters/dag_to_dagdependency.py +55 -0
- qiskit/converters/dag_to_dagdependency_v2.py +44 -0
- qiskit/converters/dagdependency_to_circuit.py +46 -0
- qiskit/converters/dagdependency_to_dag.py +54 -0
- qiskit/dagcircuit/__init__.py +44 -0
- qiskit/dagcircuit/collect_blocks.py +391 -0
- qiskit/dagcircuit/dagcircuit.py +24 -0
- qiskit/dagcircuit/dagdependency.py +646 -0
- qiskit/dagcircuit/dagdependency_v2.py +641 -0
- qiskit/dagcircuit/dagdepnode.py +160 -0
- qiskit/dagcircuit/dagnode.py +176 -0
- qiskit/dagcircuit/exceptions.py +42 -0
- qiskit/exceptions.py +153 -0
- qiskit/passmanager/__init__.py +240 -0
- qiskit/passmanager/base_tasks.py +230 -0
- qiskit/passmanager/compilation_status.py +74 -0
- qiskit/passmanager/exceptions.py +19 -0
- qiskit/passmanager/flow_controllers.py +116 -0
- qiskit/passmanager/passmanager.py +333 -0
- qiskit/primitives/__init__.py +481 -0
- qiskit/primitives/backend_estimator.py +486 -0
- qiskit/primitives/backend_estimator_v2.py +434 -0
- qiskit/primitives/backend_sampler.py +222 -0
- qiskit/primitives/backend_sampler_v2.py +339 -0
- qiskit/primitives/base/__init__.py +20 -0
- qiskit/primitives/base/base_estimator.py +252 -0
- qiskit/primitives/base/base_primitive.py +45 -0
- qiskit/primitives/base/base_primitive_job.py +78 -0
- qiskit/primitives/base/base_result.py +65 -0
- qiskit/primitives/base/base_sampler.py +204 -0
- qiskit/primitives/base/estimator_result.py +46 -0
- qiskit/primitives/base/sampler_result.py +45 -0
- qiskit/primitives/base/validation.py +231 -0
- qiskit/primitives/containers/__init__.py +26 -0
- qiskit/primitives/containers/bindings_array.py +389 -0
- qiskit/primitives/containers/bit_array.py +741 -0
- qiskit/primitives/containers/data_bin.py +173 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +279 -0
- qiskit/primitives/containers/primitive_result.py +53 -0
- qiskit/primitives/containers/pub_result.py +51 -0
- qiskit/primitives/containers/sampler_pub.py +193 -0
- qiskit/primitives/containers/sampler_pub_result.py +74 -0
- qiskit/primitives/containers/shape.py +129 -0
- qiskit/primitives/estimator.py +172 -0
- qiskit/primitives/primitive_job.py +81 -0
- qiskit/primitives/sampler.py +162 -0
- qiskit/primitives/statevector_estimator.py +174 -0
- qiskit/primitives/statevector_sampler.py +292 -0
- qiskit/primitives/utils.py +247 -0
- qiskit/providers/__init__.py +803 -0
- qiskit/providers/backend.py +667 -0
- qiskit/providers/backend_compat.py +472 -0
- qiskit/providers/basic_provider/__init__.py +45 -0
- qiskit/providers/basic_provider/basic_provider.py +101 -0
- qiskit/providers/basic_provider/basic_provider_job.py +65 -0
- qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
- qiskit/providers/basic_provider/basic_simulator.py +821 -0
- qiskit/providers/basic_provider/exceptions.py +30 -0
- qiskit/providers/exceptions.py +45 -0
- qiskit/providers/fake_provider/__init__.py +105 -0
- qiskit/providers/fake_provider/backends_v1/__init__.py +22 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +37 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_20q/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +43 -0
- qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +50 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +41 -0
- qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +44 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +1 -0
- qiskit/providers/fake_provider/fake_1q.py +91 -0
- qiskit/providers/fake_provider/fake_backend.py +165 -0
- qiskit/providers/fake_provider/fake_openpulse_2q.py +391 -0
- qiskit/providers/fake_provider/fake_openpulse_3q.py +340 -0
- qiskit/providers/fake_provider/fake_pulse_backend.py +49 -0
- qiskit/providers/fake_provider/fake_qasm_backend.py +77 -0
- qiskit/providers/fake_provider/generic_backend_v2.py +1035 -0
- qiskit/providers/fake_provider/utils/__init__.py +15 -0
- qiskit/providers/fake_provider/utils/backend_converter.py +150 -0
- qiskit/providers/fake_provider/utils/json_decoder.py +109 -0
- qiskit/providers/job.py +147 -0
- qiskit/providers/jobstatus.py +30 -0
- qiskit/providers/models/__init__.py +89 -0
- qiskit/providers/models/backendconfiguration.py +1040 -0
- qiskit/providers/models/backendproperties.py +517 -0
- qiskit/providers/models/backendstatus.py +94 -0
- qiskit/providers/models/jobstatus.py +66 -0
- qiskit/providers/models/pulsedefaults.py +305 -0
- qiskit/providers/options.py +273 -0
- qiskit/providers/provider.py +95 -0
- qiskit/providers/providerutils.py +110 -0
- qiskit/pulse/__init__.py +158 -0
- qiskit/pulse/builder.py +2254 -0
- qiskit/pulse/calibration_entries.py +381 -0
- qiskit/pulse/channels.py +227 -0
- qiskit/pulse/configuration.py +245 -0
- qiskit/pulse/exceptions.py +45 -0
- qiskit/pulse/filters.py +309 -0
- qiskit/pulse/instruction_schedule_map.py +424 -0
- qiskit/pulse/instructions/__init__.py +67 -0
- qiskit/pulse/instructions/acquire.py +150 -0
- qiskit/pulse/instructions/delay.py +71 -0
- qiskit/pulse/instructions/directives.py +154 -0
- qiskit/pulse/instructions/frequency.py +135 -0
- qiskit/pulse/instructions/instruction.py +270 -0
- qiskit/pulse/instructions/phase.py +152 -0
- qiskit/pulse/instructions/play.py +99 -0
- qiskit/pulse/instructions/reference.py +100 -0
- qiskit/pulse/instructions/snapshot.py +82 -0
- qiskit/pulse/library/__init__.py +97 -0
- qiskit/pulse/library/continuous.py +430 -0
- qiskit/pulse/library/pulse.py +148 -0
- qiskit/pulse/library/samplers/__init__.py +15 -0
- qiskit/pulse/library/samplers/decorators.py +295 -0
- qiskit/pulse/library/samplers/strategies.py +71 -0
- qiskit/pulse/library/symbolic_pulses.py +1988 -0
- qiskit/pulse/library/waveform.py +136 -0
- qiskit/pulse/macros.py +262 -0
- qiskit/pulse/parameter_manager.py +445 -0
- qiskit/pulse/parser.py +314 -0
- qiskit/pulse/reference_manager.py +58 -0
- qiskit/pulse/schedule.py +1854 -0
- qiskit/pulse/transforms/__init__.py +106 -0
- qiskit/pulse/transforms/alignments.py +406 -0
- qiskit/pulse/transforms/base_transforms.py +71 -0
- qiskit/pulse/transforms/canonicalization.py +498 -0
- qiskit/pulse/transforms/dag.py +122 -0
- qiskit/pulse/utils.py +149 -0
- qiskit/qasm/libs/dummy/stdgates.inc +75 -0
- qiskit/qasm/libs/qelib1.inc +266 -0
- qiskit/qasm/libs/stdgates.inc +82 -0
- qiskit/qasm2/__init__.py +654 -0
- qiskit/qasm2/exceptions.py +27 -0
- qiskit/qasm2/export.py +372 -0
- qiskit/qasm2/parse.py +452 -0
- qiskit/qasm3/__init__.py +367 -0
- qiskit/qasm3/ast.py +738 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1299 -0
- qiskit/qasm3/printer.py +577 -0
- qiskit/qobj/__init__.py +75 -0
- qiskit/qobj/common.py +81 -0
- qiskit/qobj/converters/__init__.py +18 -0
- qiskit/qobj/converters/lo_config.py +177 -0
- qiskit/qobj/converters/pulse_instruction.py +897 -0
- qiskit/qobj/pulse_qobj.py +709 -0
- qiskit/qobj/qasm_qobj.py +708 -0
- qiskit/qobj/utils.py +46 -0
- qiskit/qpy/__init__.py +1822 -0
- qiskit/qpy/binary_io/__init__.py +36 -0
- qiskit/qpy/binary_io/circuits.py +1475 -0
- qiskit/qpy/binary_io/schedules.py +635 -0
- qiskit/qpy/binary_io/value.py +1025 -0
- qiskit/qpy/common.py +350 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +401 -0
- qiskit/qpy/interface.py +377 -0
- qiskit/qpy/type_keys.py +572 -0
- qiskit/quantum_info/__init__.py +162 -0
- qiskit/quantum_info/analysis/__init__.py +17 -0
- qiskit/quantum_info/analysis/average.py +47 -0
- qiskit/quantum_info/analysis/distance.py +102 -0
- qiskit/quantum_info/analysis/make_observable.py +44 -0
- qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
- qiskit/quantum_info/operators/__init__.py +28 -0
- qiskit/quantum_info/operators/base_operator.py +145 -0
- qiskit/quantum_info/operators/channel/__init__.py +29 -0
- qiskit/quantum_info/operators/channel/chi.py +191 -0
- qiskit/quantum_info/operators/channel/choi.py +218 -0
- qiskit/quantum_info/operators/channel/kraus.py +337 -0
- qiskit/quantum_info/operators/channel/ptm.py +204 -0
- qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
- qiskit/quantum_info/operators/channel/stinespring.py +296 -0
- qiskit/quantum_info/operators/channel/superop.py +377 -0
- qiskit/quantum_info/operators/channel/transformations.py +475 -0
- qiskit/quantum_info/operators/custom_iterator.py +48 -0
- qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
- qiskit/quantum_info/operators/dihedral/dihedral.py +509 -0
- qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
- qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
- qiskit/quantum_info/operators/dihedral/random.py +64 -0
- qiskit/quantum_info/operators/linear_op.py +25 -0
- qiskit/quantum_info/operators/measures.py +418 -0
- qiskit/quantum_info/operators/mixins/__init__.py +52 -0
- qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
- qiskit/quantum_info/operators/mixins/group.py +171 -0
- qiskit/quantum_info/operators/mixins/linear.py +84 -0
- qiskit/quantum_info/operators/mixins/multiply.py +62 -0
- qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
- qiskit/quantum_info/operators/op_shape.py +525 -0
- qiskit/quantum_info/operators/operator.py +865 -0
- qiskit/quantum_info/operators/operator_utils.py +76 -0
- qiskit/quantum_info/operators/predicates.py +183 -0
- qiskit/quantum_info/operators/random.py +154 -0
- qiskit/quantum_info/operators/scalar_op.py +254 -0
- qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
- qiskit/quantum_info/operators/symplectic/clifford.py +1030 -0
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
- qiskit/quantum_info/operators/symplectic/pauli.py +753 -0
- qiskit/quantum_info/operators/symplectic/pauli_list.py +1230 -0
- qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
- qiskit/quantum_info/operators/symplectic/random.py +117 -0
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1196 -0
- qiskit/quantum_info/operators/utils/__init__.py +20 -0
- qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
- qiskit/quantum_info/operators/utils/commutator.py +36 -0
- qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
- qiskit/quantum_info/quaternion.py +156 -0
- qiskit/quantum_info/random.py +26 -0
- qiskit/quantum_info/states/__init__.py +28 -0
- qiskit/quantum_info/states/densitymatrix.py +845 -0
- qiskit/quantum_info/states/measures.py +288 -0
- qiskit/quantum_info/states/quantum_state.py +503 -0
- qiskit/quantum_info/states/random.py +157 -0
- qiskit/quantum_info/states/stabilizerstate.py +773 -0
- qiskit/quantum_info/states/statevector.py +958 -0
- qiskit/quantum_info/states/utils.py +247 -0
- qiskit/result/__init__.py +73 -0
- qiskit/result/counts.py +189 -0
- qiskit/result/distributions/__init__.py +17 -0
- qiskit/result/distributions/probability.py +100 -0
- qiskit/result/distributions/quasi.py +154 -0
- qiskit/result/exceptions.py +40 -0
- qiskit/result/mitigation/__init__.py +13 -0
- qiskit/result/mitigation/base_readout_mitigator.py +79 -0
- qiskit/result/mitigation/correlated_readout_mitigator.py +277 -0
- qiskit/result/mitigation/local_readout_mitigator.py +328 -0
- qiskit/result/mitigation/utils.py +217 -0
- qiskit/result/models.py +234 -0
- qiskit/result/postprocess.py +239 -0
- qiskit/result/result.py +392 -0
- qiskit/result/sampled_expval.py +75 -0
- qiskit/result/utils.py +295 -0
- qiskit/scheduler/__init__.py +40 -0
- qiskit/scheduler/config.py +37 -0
- qiskit/scheduler/lowering.py +187 -0
- qiskit/scheduler/methods/__init__.py +15 -0
- qiskit/scheduler/methods/basic.py +140 -0
- qiskit/scheduler/schedule_circuit.py +69 -0
- qiskit/scheduler/sequence.py +104 -0
- qiskit/synthesis/__init__.py +220 -0
- qiskit/synthesis/arithmetic/__init__.py +16 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
- qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
- qiskit/synthesis/clifford/__init__.py +19 -0
- qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
- qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
- qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
- qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
- qiskit/synthesis/cnotdihedral/__init__.py +17 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
- qiskit/synthesis/discrete_basis/__init__.py +16 -0
- qiskit/synthesis/discrete_basis/commutator_decompose.py +241 -0
- qiskit/synthesis/discrete_basis/gate_sequence.py +415 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +163 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +217 -0
- qiskit/synthesis/evolution/__init__.py +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +117 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +311 -0
- qiskit/synthesis/evolution/qdrift.py +138 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +215 -0
- qiskit/synthesis/linear/__init__.py +26 -0
- qiskit/synthesis/linear/cnot_synth.py +69 -0
- qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
- qiskit/synthesis/linear/linear_depth_lnn.py +276 -0
- qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
- qiskit/synthesis/linear_phase/__init__.py +17 -0
- qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +262 -0
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
- qiskit/synthesis/multi_controlled/__init__.py +24 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +356 -0
- qiskit/synthesis/one_qubit/__init__.py +15 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
- qiskit/synthesis/permutation/__init__.py +18 -0
- qiskit/synthesis/permutation/permutation_full.py +78 -0
- qiskit/synthesis/permutation/permutation_lnn.py +54 -0
- qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
- qiskit/synthesis/permutation/permutation_utils.py +16 -0
- qiskit/synthesis/qft/__init__.py +16 -0
- qiskit/synthesis/qft/qft_decompose_full.py +97 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +79 -0
- qiskit/synthesis/stabilizer/__init__.py +16 -0
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
- qiskit/synthesis/two_qubit/__init__.py +19 -0
- qiskit/synthesis/two_qubit/local_invariance.py +63 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +700 -0
- qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
- qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
- qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
- qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
- qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
- qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
- qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
- qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
- qiskit/synthesis/unitary/__init__.py +13 -0
- qiskit/synthesis/unitary/aqc/__init__.py +177 -0
- qiskit/synthesis/unitary/aqc/approximate.py +116 -0
- qiskit/synthesis/unitary/aqc/aqc.py +175 -0
- qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
- qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
- qiskit/synthesis/unitary/qsd.py +288 -0
- qiskit/transpiler/__init__.py +1290 -0
- qiskit/transpiler/basepasses.py +221 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +281 -0
- qiskit/transpiler/layout.py +737 -0
- qiskit/transpiler/passes/__init__.py +312 -0
- qiskit/transpiler/passes/analysis/__init__.py +23 -0
- qiskit/transpiler/passes/analysis/count_ops.py +30 -0
- qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
- qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
- qiskit/transpiler/passes/analysis/depth.py +33 -0
- qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
- qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
- qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
- qiskit/transpiler/passes/analysis/size.py +36 -0
- qiskit/transpiler/passes/analysis/width.py +27 -0
- qiskit/transpiler/passes/basis/__init__.py +19 -0
- qiskit/transpiler/passes/basis/basis_translator.py +137 -0
- qiskit/transpiler/passes/basis/decompose.py +131 -0
- qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +88 -0
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +109 -0
- qiskit/transpiler/passes/calibration/__init__.py +17 -0
- qiskit/transpiler/passes/calibration/base_builder.py +79 -0
- qiskit/transpiler/passes/calibration/builders.py +20 -0
- qiskit/transpiler/passes/calibration/exceptions.py +22 -0
- qiskit/transpiler/passes/calibration/pulse_gate.py +100 -0
- qiskit/transpiler/passes/calibration/rx_builder.py +164 -0
- qiskit/transpiler/passes/calibration/rzx_builder.py +411 -0
- qiskit/transpiler/passes/calibration/rzx_templates.py +51 -0
- qiskit/transpiler/passes/layout/__init__.py +26 -0
- qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
- qiskit/transpiler/passes/layout/apply_layout.py +123 -0
- qiskit/transpiler/passes/layout/csp_layout.py +132 -0
- qiskit/transpiler/passes/layout/dense_layout.py +202 -0
- qiskit/transpiler/passes/layout/disjoint_utils.py +219 -0
- qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +117 -0
- qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
- qiskit/transpiler/passes/layout/sabre_layout.py +487 -0
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
- qiskit/transpiler/passes/layout/set_layout.py +69 -0
- qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
- qiskit/transpiler/passes/layout/vf2_layout.py +263 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +419 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +260 -0
- qiskit/transpiler/passes/optimization/__init__.py +43 -0
- qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
- qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
- qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +115 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +104 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +80 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +227 -0
- qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
- qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
- qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +149 -0
- qiskit/transpiler/passes/optimization/cx_cancellation.py +65 -0
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +162 -0
- qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
- qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
- qiskit/transpiler/passes/optimization/normalize_rx_angle.py +149 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +268 -0
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +254 -0
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
- qiskit/transpiler/passes/optimization/optimize_annotated.py +448 -0
- qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
- qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
- qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
- qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +69 -0
- qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +47 -0
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +40 -0
- qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
- qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
- qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +638 -0
- qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
- qiskit/transpiler/passes/routing/__init__.py +22 -0
- qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
- qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
- qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
- qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
- qiskit/transpiler/passes/routing/basic_swap.py +166 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +395 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
- qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
- qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
- qiskit/transpiler/passes/routing/sabre_swap.py +447 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +392 -0
- qiskit/transpiler/passes/routing/stochastic_swap.py +532 -0
- qiskit/transpiler/passes/routing/utils.py +35 -0
- qiskit/transpiler/passes/scheduling/__init__.py +27 -0
- qiskit/transpiler/passes/scheduling/alap.py +153 -0
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +81 -0
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +255 -0
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +78 -0
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +107 -0
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +250 -0
- qiskit/transpiler/passes/scheduling/asap.py +175 -0
- qiskit/transpiler/passes/scheduling/base_scheduler.py +310 -0
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +312 -0
- qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +256 -0
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +452 -0
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +82 -0
- qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +127 -0
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +131 -0
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +94 -0
- qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +165 -0
- qiskit/transpiler/passes/synthesis/__init__.py +20 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +854 -0
- qiskit/transpiler/passes/synthesis/hls_plugins.py +1559 -0
- qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
- qiskit/transpiler/passes/synthesis/plugin.py +734 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +297 -0
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +1076 -0
- qiskit/transpiler/passes/utils/__init__.py +33 -0
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
- qiskit/transpiler/passes/utils/check_gate_direction.py +52 -0
- qiskit/transpiler/passes/utils/check_map.py +78 -0
- qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
- qiskit/transpiler/passes/utils/control_flow.py +65 -0
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +93 -0
- qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
- qiskit/transpiler/passes/utils/error.py +69 -0
- qiskit/transpiler/passes/utils/filter_op_nodes.py +65 -0
- qiskit/transpiler/passes/utils/fixed_point.py +48 -0
- qiskit/transpiler/passes/utils/gate_direction.py +86 -0
- qiskit/transpiler/passes/utils/gates_basis.py +51 -0
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
- qiskit/transpiler/passes/utils/minimum_point.py +118 -0
- qiskit/transpiler/passes/utils/remove_barriers.py +49 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +114 -0
- qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
- qiskit/transpiler/passmanager.py +490 -0
- qiskit/transpiler/passmanager_config.py +216 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +73 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1045 -0
- qiskit/transpiler/preset_passmanagers/common.py +649 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +626 -0
- qiskit/transpiler/preset_passmanagers/level0.py +113 -0
- qiskit/transpiler/preset_passmanagers/level1.py +120 -0
- qiskit/transpiler/preset_passmanagers/level2.py +119 -0
- qiskit/transpiler/preset_passmanagers/level3.py +119 -0
- qiskit/transpiler/preset_passmanagers/plugin.py +353 -0
- qiskit/transpiler/target.py +1319 -0
- qiskit/transpiler/timing_constraints.py +59 -0
- qiskit/user_config.py +262 -0
- qiskit/utils/__init__.py +89 -0
- qiskit/utils/classtools.py +146 -0
- qiskit/utils/deprecate_pulse.py +119 -0
- qiskit/utils/deprecation.py +490 -0
- qiskit/utils/lazy_tester.py +363 -0
- qiskit/utils/multiprocessing.py +56 -0
- qiskit/utils/optionals.py +347 -0
- qiskit/utils/parallel.py +191 -0
- qiskit/utils/units.py +143 -0
- qiskit/version.py +84 -0
- qiskit/visualization/__init__.py +288 -0
- qiskit/visualization/array.py +204 -0
- qiskit/visualization/bloch.py +778 -0
- qiskit/visualization/circuit/__init__.py +15 -0
- qiskit/visualization/circuit/_utils.py +675 -0
- qiskit/visualization/circuit/circuit_visualization.py +727 -0
- qiskit/visualization/circuit/latex.py +661 -0
- qiskit/visualization/circuit/matplotlib.py +2029 -0
- qiskit/visualization/circuit/qcstyle.py +278 -0
- qiskit/visualization/circuit/styles/__init__.py +13 -0
- qiskit/visualization/circuit/styles/bw.json +202 -0
- qiskit/visualization/circuit/styles/clifford.json +202 -0
- qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
- qiskit/visualization/circuit/styles/iqp.json +214 -0
- qiskit/visualization/circuit/styles/textbook.json +202 -0
- qiskit/visualization/circuit/text.py +1844 -0
- qiskit/visualization/circuit_visualization.py +19 -0
- qiskit/visualization/counts_visualization.py +481 -0
- qiskit/visualization/dag_visualization.py +316 -0
- qiskit/visualization/exceptions.py +21 -0
- qiskit/visualization/gate_map.py +1485 -0
- qiskit/visualization/library.py +37 -0
- qiskit/visualization/pass_manager_visualization.py +308 -0
- qiskit/visualization/pulse_v2/__init__.py +21 -0
- qiskit/visualization/pulse_v2/core.py +901 -0
- qiskit/visualization/pulse_v2/device_info.py +173 -0
- qiskit/visualization/pulse_v2/drawings.py +253 -0
- qiskit/visualization/pulse_v2/events.py +254 -0
- qiskit/visualization/pulse_v2/generators/__init__.py +40 -0
- qiskit/visualization/pulse_v2/generators/barrier.py +76 -0
- qiskit/visualization/pulse_v2/generators/chart.py +208 -0
- qiskit/visualization/pulse_v2/generators/frame.py +436 -0
- qiskit/visualization/pulse_v2/generators/snapshot.py +133 -0
- qiskit/visualization/pulse_v2/generators/waveform.py +645 -0
- qiskit/visualization/pulse_v2/interface.py +458 -0
- qiskit/visualization/pulse_v2/layouts.py +387 -0
- qiskit/visualization/pulse_v2/plotters/__init__.py +17 -0
- qiskit/visualization/pulse_v2/plotters/base_plotter.py +53 -0
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +201 -0
- qiskit/visualization/pulse_v2/stylesheet.py +312 -0
- qiskit/visualization/pulse_v2/types.py +242 -0
- qiskit/visualization/state_visualization.py +1518 -0
- qiskit/visualization/timeline/__init__.py +21 -0
- qiskit/visualization/timeline/core.py +480 -0
- qiskit/visualization/timeline/drawings.py +260 -0
- qiskit/visualization/timeline/generators.py +506 -0
- qiskit/visualization/timeline/interface.py +436 -0
- qiskit/visualization/timeline/layouts.py +115 -0
- qiskit/visualization/timeline/plotters/__init__.py +16 -0
- qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
- qiskit/visualization/timeline/plotters/matplotlib.py +192 -0
- qiskit/visualization/timeline/stylesheet.py +301 -0
- qiskit/visualization/timeline/types.py +148 -0
- qiskit/visualization/transition_visualization.py +369 -0
- qiskit/visualization/utils.py +49 -0
- qiskit-1.3.0.dist-info/LICENSE.txt +203 -0
- qiskit-1.3.0.dist-info/METADATA +222 -0
- qiskit-1.3.0.dist-info/RECORD +836 -0
- qiskit-1.3.0.dist-info/WHEEL +5 -0
- qiskit-1.3.0.dist-info/entry_points.txt +76 -0
- qiskit-1.3.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,206 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2019.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""
|
14
|
+
Implementation of the GraySynth algorithm for synthesizing CNOT-Phase
|
15
|
+
circuits with efficient CNOT cost, and the Patel-Hayes-Markov algorithm
|
16
|
+
for optimal synthesis of linear (CNOT-only) reversible circuits.
|
17
|
+
"""
|
18
|
+
from __future__ import annotations
|
19
|
+
|
20
|
+
import copy
|
21
|
+
import numpy as np
|
22
|
+
from qiskit.circuit import QuantumCircuit
|
23
|
+
from qiskit.exceptions import QiskitError
|
24
|
+
from qiskit.synthesis.linear import synth_cnot_count_full_pmh
|
25
|
+
|
26
|
+
|
27
|
+
def synth_cnot_phase_aam(
|
28
|
+
cnots: list[list[int]], angles: list[str], section_size: int = 2
|
29
|
+
) -> QuantumCircuit:
|
30
|
+
r"""This function is an implementation of the `GraySynth` algorithm of
|
31
|
+
Amy, Azimadeh and Mosca.
|
32
|
+
|
33
|
+
GraySynth is a heuristic algorithm from [1] for synthesizing small parity networks.
|
34
|
+
It is inspired by Gray codes. Given a set of binary strings :math:`S`
|
35
|
+
(called ``cnots`` bellow), the algorithm synthesizes a parity network for :math:`S` by
|
36
|
+
repeatedly choosing an index :math:`i` to expand and then effectively recursing on
|
37
|
+
the co-factors :math:`S_0` and :math:`S_1`, consisting of the strings :math:`y \in S`,
|
38
|
+
with :math:`y_i = 0` or :math:`1` respectively. As a subset :math:`S` is recursively expanded,
|
39
|
+
``cx`` gates are applied so that a designated target bit contains the
|
40
|
+
(partial) parity :math:`\chi_y(x)` where :math:`y_i = 1` if and only if :math:`y'_i = 1` for all
|
41
|
+
:math:`y' \in S`. If :math:`S` contains a single element :math:`\{y'\}`, then :math:`y = y'`,
|
42
|
+
and the target bit contains the value :math:`\chi_{y'}(x)` as desired.
|
43
|
+
|
44
|
+
Notably, rather than uncomputing this sequence of ``cx`` (CNOT) gates when a subset :math:`S`
|
45
|
+
is finished being synthesized, the algorithm maintains the invariant
|
46
|
+
that the remaining parities to be computed are expressed over the current state
|
47
|
+
of bits. This allows the algorithm to avoid the 'backtracking' inherent in
|
48
|
+
uncomputing-based methods.
|
49
|
+
|
50
|
+
The algorithm is described in detail in section 4 of [1].
|
51
|
+
|
52
|
+
Args:
|
53
|
+
cnots: A matrix whose columns are the parities to be synthesized
|
54
|
+
e.g.::
|
55
|
+
|
56
|
+
[[0, 1, 1, 1, 1, 1],
|
57
|
+
[1, 0, 0, 1, 1, 1],
|
58
|
+
[1, 0, 0, 1, 0, 0],
|
59
|
+
[0, 0, 1, 0, 1, 0]]
|
60
|
+
|
61
|
+
corresponds to::
|
62
|
+
|
63
|
+
x1^x2 + x0 + x0^x3 + x0^x1^x2 + x0^x1^x3 + x0^x1
|
64
|
+
|
65
|
+
angles: A list containing all the phase-shift gates which are
|
66
|
+
to be applied, in the same order as in ``cnots``. A number is
|
67
|
+
interpreted as the angle of :math:`p(angle)`, otherwise the elements
|
68
|
+
have to be ``'t'``, ``'tdg'``, ``'s'``, ``'sdg'`` or ``'z'``.
|
69
|
+
|
70
|
+
section_size: The size of every section in the Patel–Markov–Hayes algorithm.
|
71
|
+
``section_size`` must be a factor of the number of qubits.
|
72
|
+
|
73
|
+
Returns:
|
74
|
+
The decomposed quantum circuit.
|
75
|
+
|
76
|
+
Raises:
|
77
|
+
QiskitError: when dimensions of ``cnots`` and ``angles`` don't align.
|
78
|
+
|
79
|
+
References:
|
80
|
+
1. Matthew Amy, Parsiad Azimzadeh, and Michele Mosca.
|
81
|
+
*On the controlled-NOT complexity of controlled-NOT–phase circuits.*,
|
82
|
+
Quantum Science and Technology 4.1 (2018): 015002.
|
83
|
+
`arXiv:1712.01859 <https://arxiv.org/abs/1712.01859>`_
|
84
|
+
"""
|
85
|
+
num_qubits = len(cnots)
|
86
|
+
|
87
|
+
# Create a quantum circuit on num_qubits
|
88
|
+
qcir = QuantumCircuit(num_qubits)
|
89
|
+
|
90
|
+
if len(cnots[0]) != len(angles):
|
91
|
+
raise QiskitError('Size of "cnots" and "angles" do not match.')
|
92
|
+
|
93
|
+
range_list = list(range(num_qubits))
|
94
|
+
epsilon = num_qubits
|
95
|
+
sta = []
|
96
|
+
cnots_copy = np.transpose(np.array(copy.deepcopy(cnots)))
|
97
|
+
# This matrix keeps track of the state in the algorithm
|
98
|
+
state = np.eye(num_qubits).astype("int")
|
99
|
+
|
100
|
+
# Check if some phase-shift gates can be applied, before adding any C-NOT gates
|
101
|
+
for qubit in range(num_qubits):
|
102
|
+
index = 0
|
103
|
+
for icnots in cnots_copy:
|
104
|
+
if np.array_equal(icnots, state[qubit]):
|
105
|
+
if angles[index] == "t":
|
106
|
+
qcir.t(qubit)
|
107
|
+
elif angles[index] == "tdg":
|
108
|
+
qcir.tdg(qubit)
|
109
|
+
elif angles[index] == "s":
|
110
|
+
qcir.s(qubit)
|
111
|
+
elif angles[index] == "sdg":
|
112
|
+
qcir.sdg(qubit)
|
113
|
+
elif angles[index] == "z":
|
114
|
+
qcir.z(qubit)
|
115
|
+
else:
|
116
|
+
qcir.p(angles[index] % np.pi, qubit)
|
117
|
+
del angles[index]
|
118
|
+
cnots_copy = np.delete(cnots_copy, index, axis=0)
|
119
|
+
if index == len(cnots_copy):
|
120
|
+
break
|
121
|
+
index -= 1
|
122
|
+
index += 1
|
123
|
+
|
124
|
+
# Implementation of the pseudo-code (Algorithm 1) in the aforementioned paper
|
125
|
+
sta.append([cnots, range_list, epsilon])
|
126
|
+
while sta:
|
127
|
+
[cnots, ilist, qubit] = sta.pop()
|
128
|
+
if cnots == []:
|
129
|
+
continue
|
130
|
+
if 0 <= qubit < num_qubits:
|
131
|
+
condition = True
|
132
|
+
while condition:
|
133
|
+
condition = False
|
134
|
+
for j in range(num_qubits):
|
135
|
+
if (j != qubit) and (sum(cnots[j]) == len(cnots[j])):
|
136
|
+
condition = True
|
137
|
+
qcir.cx(j, qubit)
|
138
|
+
state[qubit] ^= state[j]
|
139
|
+
index = 0
|
140
|
+
for icnots in cnots_copy:
|
141
|
+
if np.array_equal(icnots, state[qubit]):
|
142
|
+
if angles[index] == "t":
|
143
|
+
qcir.t(qubit)
|
144
|
+
elif angles[index] == "tdg":
|
145
|
+
qcir.tdg(qubit)
|
146
|
+
elif angles[index] == "s":
|
147
|
+
qcir.s(qubit)
|
148
|
+
elif angles[index] == "sdg":
|
149
|
+
qcir.sdg(qubit)
|
150
|
+
elif angles[index] == "z":
|
151
|
+
qcir.z(qubit)
|
152
|
+
else:
|
153
|
+
qcir.p(angles[index] % np.pi, qubit)
|
154
|
+
del angles[index]
|
155
|
+
cnots_copy = np.delete(cnots_copy, index, axis=0)
|
156
|
+
if index == len(cnots_copy):
|
157
|
+
break
|
158
|
+
index -= 1
|
159
|
+
index += 1
|
160
|
+
for x in _remove_duplicates(sta + [[cnots, ilist, qubit]]):
|
161
|
+
[cnotsp, _, _] = x
|
162
|
+
if cnotsp == []:
|
163
|
+
continue
|
164
|
+
for ttt in range(len(cnotsp[j])):
|
165
|
+
cnotsp[j][ttt] ^= cnotsp[qubit][ttt]
|
166
|
+
if ilist == []:
|
167
|
+
continue
|
168
|
+
# See line 18 in pseudo-code of Algorithm 1 in the aforementioned paper
|
169
|
+
# this choice of j maximizes the size of the largest subset (S_0 or S_1)
|
170
|
+
# and the larger a subset, the closer it gets to the ideal in the
|
171
|
+
# Gray code of one CNOT per string.
|
172
|
+
j = ilist[np.argmax([[max(row.count(0), row.count(1)) for row in cnots][k] for k in ilist])]
|
173
|
+
cnots0 = []
|
174
|
+
cnots1 = []
|
175
|
+
for y in list(map(list, zip(*cnots))):
|
176
|
+
if y[j] == 0:
|
177
|
+
cnots0.append(y)
|
178
|
+
elif y[j] == 1:
|
179
|
+
cnots1.append(y)
|
180
|
+
cnots0 = list(map(list, zip(*cnots0)))
|
181
|
+
cnots1 = list(map(list, zip(*cnots1)))
|
182
|
+
if qubit == epsilon:
|
183
|
+
sta.append([cnots1, list(set(ilist).difference([j])), j])
|
184
|
+
else:
|
185
|
+
sta.append([cnots1, list(set(ilist).difference([j])), qubit])
|
186
|
+
sta.append([cnots0, list(set(ilist).difference([j])), qubit])
|
187
|
+
qcir &= synth_cnot_count_full_pmh(state, section_size).inverse()
|
188
|
+
return qcir
|
189
|
+
|
190
|
+
|
191
|
+
def _remove_duplicates(lists):
|
192
|
+
"""
|
193
|
+
Remove duplicates in list
|
194
|
+
|
195
|
+
Args:
|
196
|
+
lists (list): a list which may contain duplicate elements.
|
197
|
+
|
198
|
+
Returns:
|
199
|
+
list: a list which contains only unique elements.
|
200
|
+
"""
|
201
|
+
|
202
|
+
unique_list = []
|
203
|
+
for element in lists:
|
204
|
+
if element not in unique_list:
|
205
|
+
unique_list.append(element)
|
206
|
+
return unique_list
|
@@ -0,0 +1,262 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2023
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""
|
14
|
+
Given -CZ-CX- transformation (a layer consisting only CNOT gates
|
15
|
+
followed by a layer consisting only CZ gates)
|
16
|
+
Return a depth-5n circuit implementation of the -CZ-CX- transformation over LNN.
|
17
|
+
|
18
|
+
Args:
|
19
|
+
mat_z: n*n symmetric binary matrix representing a -CZ- circuit
|
20
|
+
mat_x: n*n invertable binary matrix representing a -CX- transformation
|
21
|
+
|
22
|
+
Output:
|
23
|
+
QuantumCircuit: :class:`.QuantumCircuit` object containing a depth-5n circuit to implement -CZ-CX-
|
24
|
+
|
25
|
+
References:
|
26
|
+
[1] S. A. Kutin, D. P. Moulton, and L. M. Smithline, "Computation at a distance," 2007.
|
27
|
+
[2] D. Maslov and W. Yang, "CNOT circuits need little help to implement arbitrary
|
28
|
+
Hadamard-free Clifford transformations they generate," 2022.
|
29
|
+
"""
|
30
|
+
|
31
|
+
from copy import deepcopy
|
32
|
+
import numpy as np
|
33
|
+
|
34
|
+
from qiskit.circuit import QuantumCircuit
|
35
|
+
from qiskit.synthesis.linear.linear_matrix_utils import calc_inverse_matrix
|
36
|
+
from qiskit.synthesis.linear.linear_depth_lnn import _optimize_cx_circ_depth_5n_line
|
37
|
+
|
38
|
+
|
39
|
+
def _initialize_phase_schedule(mat_z):
|
40
|
+
"""
|
41
|
+
Given a CZ layer (represented as an n*n CZ matrix Mz)
|
42
|
+
Return a schedule of phase gates implementing Mz in a SWAP-only netwrok
|
43
|
+
(c.f. Alg 1, [2])
|
44
|
+
"""
|
45
|
+
n = len(mat_z)
|
46
|
+
phase_schedule = np.zeros((n, n), dtype=int)
|
47
|
+
for i, j in zip(*np.where(mat_z)):
|
48
|
+
if i >= j:
|
49
|
+
continue
|
50
|
+
|
51
|
+
phase_schedule[i, j] = 3
|
52
|
+
phase_schedule[i, i] += 1
|
53
|
+
phase_schedule[j, j] += 1
|
54
|
+
|
55
|
+
return phase_schedule
|
56
|
+
|
57
|
+
|
58
|
+
def _shuffle(labels, odd):
|
59
|
+
"""
|
60
|
+
Args:
|
61
|
+
labels : a list of indices
|
62
|
+
odd : a boolean indicating whether this layer is odd or even,
|
63
|
+
Shuffle the indices in labels by swapping adjacent elements
|
64
|
+
(c.f. Fig.2, [2])
|
65
|
+
"""
|
66
|
+
swapped = [v for p in zip(labels[1::2], labels[::2]) for v in p]
|
67
|
+
return swapped + labels[-1:] if odd else swapped
|
68
|
+
|
69
|
+
|
70
|
+
def _make_seq(n):
|
71
|
+
"""
|
72
|
+
Given the width of the circuit n,
|
73
|
+
Return the labels of the boxes in order from left to right, top to bottom
|
74
|
+
(c.f. Fig.2, [2])
|
75
|
+
"""
|
76
|
+
seq = []
|
77
|
+
wire_labels = list(range(n - 1, -1, -1))
|
78
|
+
|
79
|
+
for i in range(n):
|
80
|
+
wire_labels_new = (
|
81
|
+
_shuffle(wire_labels, n % 2)
|
82
|
+
if i % 2 == 0
|
83
|
+
else wire_labels[0:1] + _shuffle(wire_labels[1:], (n + 1) % 2)
|
84
|
+
)
|
85
|
+
seq += [
|
86
|
+
(min(i), max(i)) for i in zip(wire_labels[::2], wire_labels_new[::2]) if i[0] != i[1]
|
87
|
+
]
|
88
|
+
wire_labels = wire_labels_new
|
89
|
+
|
90
|
+
return seq
|
91
|
+
|
92
|
+
|
93
|
+
def _swap_plus(instructions, seq):
|
94
|
+
"""
|
95
|
+
Given CX instructions (c.f. Thm 7.1, [1]) and the labels of all boxes,
|
96
|
+
Return a list of labels of the boxes that is SWAP+ in descending order
|
97
|
+
* Assumes the instruction gives gates in the order from top to bottom,
|
98
|
+
from left to right
|
99
|
+
* SWAP+ is defined in section 3.A. of [2]. Note the northwest
|
100
|
+
diagonalization procedure of [1] consists exactly n layers of boxes,
|
101
|
+
each being either a SWAP or a SWAP+. That is, each northwest
|
102
|
+
diagonalization circuit can be uniquely represented by which of its
|
103
|
+
n(n-1)/2 boxes are SWAP+ and which are SWAP.
|
104
|
+
"""
|
105
|
+
instr = deepcopy(instructions)
|
106
|
+
swap_plus = set()
|
107
|
+
for i, j in reversed(seq):
|
108
|
+
cnot_1 = instr.pop()
|
109
|
+
instr.pop()
|
110
|
+
|
111
|
+
if instr == [] or instr[-1] != cnot_1:
|
112
|
+
# Only two CNOTs on same set of controls -> this box is SWAP+
|
113
|
+
swap_plus.add((i, j))
|
114
|
+
else:
|
115
|
+
instr.pop()
|
116
|
+
return swap_plus
|
117
|
+
|
118
|
+
|
119
|
+
def _update_phase_schedule(n, phase_schedule, swap_plus):
|
120
|
+
"""
|
121
|
+
Given phase_schedule initialized to induce a CZ circuit in SWAP-only network and list of SWAP+ boxes
|
122
|
+
Update phase_schedule for each SWAP+ according to Algorithm 2, [2]
|
123
|
+
"""
|
124
|
+
layer_order = list(range(n))[-3::-2] + list(range(n))[-2::-2][::-1]
|
125
|
+
order_comp = np.argsort(layer_order[::-1])
|
126
|
+
|
127
|
+
# Go through each box by descending layer order
|
128
|
+
|
129
|
+
for i in layer_order:
|
130
|
+
for j in range(i + 1, n):
|
131
|
+
if (i, j) not in swap_plus:
|
132
|
+
continue
|
133
|
+
# we need to correct for the effected linear functions:
|
134
|
+
|
135
|
+
# We first correct type 1 and type 2 by switching
|
136
|
+
# the phase applied to c_j and c_i+c_j
|
137
|
+
phase_schedule[j, j], phase_schedule[i, j] = phase_schedule[i, j], phase_schedule[j, j]
|
138
|
+
|
139
|
+
# Then, we go through all the boxes that permutes j BEFORE box(i,j) and update:
|
140
|
+
|
141
|
+
for k in range(n): # all boxes that permutes j
|
142
|
+
if k in (i, j):
|
143
|
+
continue
|
144
|
+
if (
|
145
|
+
order_comp[min(k, j)] < order_comp[i]
|
146
|
+
and phase_schedule[min(k, j), max(k, j)] % 4 != 0
|
147
|
+
):
|
148
|
+
phase = phase_schedule[min(k, j), max(k, j)]
|
149
|
+
phase_schedule[min(k, j), max(k, j)] = 0
|
150
|
+
|
151
|
+
# Step 1, apply phase to c_i, c_j, c_k
|
152
|
+
for l_s in (i, j, k):
|
153
|
+
phase_schedule[l_s, l_s] = (phase_schedule[l_s, l_s] + phase * 3) % 4
|
154
|
+
|
155
|
+
# Step 2, apply phase to c_i+ c_j, c_i+c_k, c_j+c_k:
|
156
|
+
for l1, l2 in [(i, j), (i, k), (j, k)]:
|
157
|
+
ls = min(l1, l2)
|
158
|
+
lb = max(l1, l2)
|
159
|
+
phase_schedule[ls, lb] = (phase_schedule[ls, lb] + phase * 3) % 4
|
160
|
+
return phase_schedule
|
161
|
+
|
162
|
+
|
163
|
+
def _apply_phase_to_nw_circuit(n, phase_schedule, seq, swap_plus):
|
164
|
+
"""
|
165
|
+
Given
|
166
|
+
Width of the circuit (int n)
|
167
|
+
A CZ circuit, represented by the n*n phase schedule phase_schedule
|
168
|
+
A CX circuit, represented by box-labels (seq) and whether the box is SWAP+ (swap_plus)
|
169
|
+
* This circuit corresponds to the CX tranformation that tranforms a matrix to
|
170
|
+
a NW matrix (c.f. Prop.7.4, [1])
|
171
|
+
* SWAP+ is defined in section 3.A. of [2].
|
172
|
+
* As previously noted, the northwest diagonalization procedure of [1] consists
|
173
|
+
of exactly n layers of boxes, each being either a SWAP or a SWAP+. That is,
|
174
|
+
each northwest diagonalization circuit can be uniquely represented by which
|
175
|
+
of its n(n-1)/2 boxes are SWAP+ and which are SWAP.
|
176
|
+
Return a QuantumCircuit that computes the phase schedule S inside CX
|
177
|
+
"""
|
178
|
+
cir = QuantumCircuit(n)
|
179
|
+
|
180
|
+
wires = list(zip(range(n), range(1, n)))
|
181
|
+
wires = wires[::2] + wires[1::2]
|
182
|
+
|
183
|
+
for i, (j, k) in zip(range(len(seq) - 1, -1, -1), reversed(seq)):
|
184
|
+
w1, w2 = wires[i % (n - 1)]
|
185
|
+
|
186
|
+
p = phase_schedule[j, k]
|
187
|
+
|
188
|
+
if (j, k) not in swap_plus:
|
189
|
+
cir.cx(w1, w2)
|
190
|
+
|
191
|
+
cir.cx(w2, w1)
|
192
|
+
|
193
|
+
if p % 4 == 0:
|
194
|
+
pass
|
195
|
+
elif p % 4 == 1:
|
196
|
+
cir.sdg(w2)
|
197
|
+
elif p % 4 == 2:
|
198
|
+
cir.z(w2)
|
199
|
+
else:
|
200
|
+
cir.s(w2)
|
201
|
+
|
202
|
+
cir.cx(w1, w2)
|
203
|
+
|
204
|
+
for i in range(n):
|
205
|
+
p = phase_schedule[n - 1 - i, n - 1 - i]
|
206
|
+
if p % 4 == 0:
|
207
|
+
continue
|
208
|
+
if p % 4 == 1:
|
209
|
+
cir.sdg(i)
|
210
|
+
elif p % 4 == 2:
|
211
|
+
cir.z(i)
|
212
|
+
else:
|
213
|
+
cir.s(i)
|
214
|
+
|
215
|
+
return cir
|
216
|
+
|
217
|
+
|
218
|
+
def synth_cx_cz_depth_line_my(mat_x: np.ndarray, mat_z: np.ndarray) -> QuantumCircuit:
|
219
|
+
"""
|
220
|
+
Joint synthesis of a -CZ-CX- circuit for linear nearest neighbor (LNN) connectivity,
|
221
|
+
with 2-qubit depth at most 5n, based on Maslov and Yang.
|
222
|
+
This method computes the CZ circuit inside the CX circuit via phase gate insertions.
|
223
|
+
|
224
|
+
Args:
|
225
|
+
mat_z : a boolean symmetric matrix representing a CZ circuit.
|
226
|
+
``mat_z[i][j]=1`` represents a ``cz(i,j)`` gate
|
227
|
+
|
228
|
+
mat_x : a boolean invertible matrix representing a CX circuit.
|
229
|
+
|
230
|
+
Returns:
|
231
|
+
A circuit implementation of a CX circuit following a CZ circuit,
|
232
|
+
denoted as a -CZ-CX- circuit,in two-qubit depth at most ``5n``, for LNN connectivity.
|
233
|
+
|
234
|
+
References:
|
235
|
+
1. Kutin, S., Moulton, D. P., Smithline, L.,
|
236
|
+
*Computation at a distance*, Chicago J. Theor. Comput. Sci., vol. 2007, (2007),
|
237
|
+
`arXiv:quant-ph/0701194 <https://arxiv.org/abs/quant-ph/0701194>`_
|
238
|
+
2. Dmitri Maslov, Willers Yang, *CNOT circuits need little help to implement arbitrary
|
239
|
+
Hadamard-free Clifford transformations they generate*,
|
240
|
+
`arXiv:2210.16195 <https://arxiv.org/abs/2210.16195>`_.
|
241
|
+
"""
|
242
|
+
|
243
|
+
# First, find circuits implementing mat_x by Proposition 7.3 and Proposition 7.4 of [1]
|
244
|
+
|
245
|
+
n = len(mat_x)
|
246
|
+
mat_x = calc_inverse_matrix(mat_x)
|
247
|
+
|
248
|
+
cx_instructions_rows_m2nw, cx_instructions_rows_nw2id = _optimize_cx_circ_depth_5n_line(mat_x)
|
249
|
+
|
250
|
+
# Meanwhile, also build the -CZ- circuit via Phase gate insertions as per Algorithm 2 [2]
|
251
|
+
phase_schedule = _initialize_phase_schedule(mat_z)
|
252
|
+
seq = _make_seq(n)
|
253
|
+
swap_plus = _swap_plus(cx_instructions_rows_nw2id, seq)
|
254
|
+
|
255
|
+
_update_phase_schedule(n, phase_schedule, swap_plus)
|
256
|
+
|
257
|
+
qc = _apply_phase_to_nw_circuit(n, phase_schedule, seq, swap_plus)
|
258
|
+
|
259
|
+
for i, j in reversed(cx_instructions_rows_m2nw):
|
260
|
+
qc.cx(i, j)
|
261
|
+
|
262
|
+
return qc
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2023
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""
|
14
|
+
Synthesis of an n-qubit circuit containing only CZ gates for
|
15
|
+
linear nearest neighbor (LNN) connectivity, using CX and phase (S, Sdg or Z) gates.
|
16
|
+
The two-qubit depth of the circuit is bounded by 2*n+2.
|
17
|
+
This algorithm reverts the order of qubits.
|
18
|
+
|
19
|
+
References:
|
20
|
+
[1]: Dmitri Maslov, Martin Roetteler,
|
21
|
+
Shorter stabilizer circuits via Bruhat decomposition and quantum circuit transformations,
|
22
|
+
`arXiv:1705.09176 <https://arxiv.org/abs/1705.09176>`_.
|
23
|
+
"""
|
24
|
+
|
25
|
+
import numpy as np
|
26
|
+
from qiskit.circuit import QuantumCircuit
|
27
|
+
|
28
|
+
from qiskit._accelerate.synthesis.linear_phase import (
|
29
|
+
synth_cz_depth_line_mr as synth_cz_depth_line_mr_inner,
|
30
|
+
)
|
31
|
+
|
32
|
+
|
33
|
+
def synth_cz_depth_line_mr(mat: np.ndarray) -> QuantumCircuit:
|
34
|
+
r"""Synthesis of a CZ circuit for linear nearest neighbor (LNN) connectivity,
|
35
|
+
based on Maslov and Roetteler.
|
36
|
+
|
37
|
+
Note that this method *reverts* the order of qubits in the circuit,
|
38
|
+
and returns a circuit containing :class:`.CXGate`\s and phase gates
|
39
|
+
(:class:`.SGate`, :class:`.SdgGate` or :class:`.ZGate`).
|
40
|
+
|
41
|
+
Args:
|
42
|
+
mat: an upper-diagonal matrix representing the CZ circuit.
|
43
|
+
``mat[i][j]=1 for i<j`` represents a ``cz(i,j)`` gate
|
44
|
+
|
45
|
+
Returns:
|
46
|
+
A circuit implementation of the CZ circuit of depth :math:`2n+2` for LNN
|
47
|
+
connectivity.
|
48
|
+
|
49
|
+
References:
|
50
|
+
1. Dmitri Maslov, Martin Roetteler,
|
51
|
+
*Shorter stabilizer circuits via Bruhat decomposition and quantum circuit transformations*,
|
52
|
+
`arXiv:1705.09176 <https://arxiv.org/abs/1705.09176>`_.
|
53
|
+
"""
|
54
|
+
|
55
|
+
# Call Rust implementaton
|
56
|
+
return QuantumCircuit._from_circuit_data(
|
57
|
+
synth_cz_depth_line_mr_inner(mat.astype(bool)), add_regs=True
|
58
|
+
)
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2024.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Module containing multi-controlled circuits synthesis"""
|
14
|
+
|
15
|
+
from .mcmt_vchain import synth_mcmt_vchain
|
16
|
+
from .mcx_synthesis import (
|
17
|
+
synth_mcx_n_dirty_i15,
|
18
|
+
synth_mcx_n_clean_m15,
|
19
|
+
synth_mcx_1_clean_b95,
|
20
|
+
synth_mcx_gray_code,
|
21
|
+
synth_mcx_noaux_v24,
|
22
|
+
synth_c3x,
|
23
|
+
synth_c4x,
|
24
|
+
)
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2024.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Synthesis for multiple-control, multiple-target Gate."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from qiskit.circuit import QuantumCircuit, Gate
|
18
|
+
from qiskit._accelerate.synthesis.multi_controlled import mcmt_v_chain
|
19
|
+
|
20
|
+
|
21
|
+
def synth_mcmt_vchain(
|
22
|
+
gate: Gate, num_ctrl_qubits: int, num_target_qubits: int, ctrl_state: int | None = None
|
23
|
+
) -> QuantumCircuit:
|
24
|
+
"""Synthesize MCMT using a V-chain.
|
25
|
+
|
26
|
+
This uses a chain of CCX gates, using ``num_ctrl_qubits - 1`` auxiliary qubits.
|
27
|
+
|
28
|
+
For example, a 3-control and 2-target H gate will be synthesized as::
|
29
|
+
|
30
|
+
q_0: ──■────────────────────────■──
|
31
|
+
│ │
|
32
|
+
q_1: ──■────────────────────────■──
|
33
|
+
│ │
|
34
|
+
q_2: ──┼────■──────────────■────┼──
|
35
|
+
│ │ ┌───┐ │ │
|
36
|
+
q_3: ──┼────┼──┤ H ├───────┼────┼──
|
37
|
+
│ │ └─┬─┘┌───┐ │ │
|
38
|
+
q_4: ──┼────┼────┼──┤ H ├──┼────┼──
|
39
|
+
┌─┴─┐ │ │ └─┬─┘ │ ┌─┴─┐
|
40
|
+
q_5: ┤ X ├──■────┼────┼────■──┤ X ├
|
41
|
+
└───┘┌─┴─┐ │ │ ┌─┴─┐└───┘
|
42
|
+
q_6: ─────┤ X ├──■────■──┤ X ├─────
|
43
|
+
└───┘ └───┘
|
44
|
+
|
45
|
+
"""
|
46
|
+
if gate.num_qubits != 1:
|
47
|
+
raise ValueError("Only single qubit gates are supported as input.")
|
48
|
+
|
49
|
+
circ = QuantumCircuit._from_circuit_data(
|
50
|
+
mcmt_v_chain(gate.control(), num_ctrl_qubits, num_target_qubits, ctrl_state)
|
51
|
+
)
|
52
|
+
return circ
|