qiskit 1.3.0__cp39-abi3-win32.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.pyd +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,69 @@
|
|
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
|
+
|
19
|
+
from __future__ import annotations
|
20
|
+
|
21
|
+
import numpy as np
|
22
|
+
from qiskit.circuit import QuantumCircuit
|
23
|
+
|
24
|
+
from qiskit._accelerate.synthesis.linear import synth_cnot_count_full_pmh as fast_pmh
|
25
|
+
|
26
|
+
|
27
|
+
def synth_cnot_count_full_pmh(
|
28
|
+
state: list[list[bool]] | np.ndarray[bool], section_size: int | None = None
|
29
|
+
) -> QuantumCircuit:
|
30
|
+
r"""
|
31
|
+
Synthesize linear reversible circuits for all-to-all architecture
|
32
|
+
using Patel, Markov and Hayes method.
|
33
|
+
|
34
|
+
This function is an implementation of the Patel, Markov and Hayes algorithm from [1]
|
35
|
+
for optimal synthesis of linear reversible circuits for all-to-all architecture,
|
36
|
+
as specified by an :math:`n \times n` matrix.
|
37
|
+
|
38
|
+
Args:
|
39
|
+
state: :math:`n \times n` boolean invertible matrix, describing
|
40
|
+
the state of the input circuit.
|
41
|
+
section_size: The size of each section in the Patel–Markov–Hayes algorithm [1].
|
42
|
+
If ``None`` it is chosen to be :math:`\max(2, \alpha\log_2(n))` with
|
43
|
+
:math:`\alpha = 0.56`, which approximately minimizes the upper bound on the number
|
44
|
+
of row operations given in [1] Eq. (3).
|
45
|
+
|
46
|
+
Returns:
|
47
|
+
A CX-only circuit implementing the linear transformation.
|
48
|
+
|
49
|
+
Raises:
|
50
|
+
ValueError: When ``section_size`` is larger than the number of columns.
|
51
|
+
|
52
|
+
References:
|
53
|
+
1. Patel, Ketan N., Igor L. Markov, and John P. Hayes,
|
54
|
+
*Optimal synthesis of linear reversible circuits*,
|
55
|
+
Quantum Information & Computation 8.3 (2008): 282-294.
|
56
|
+
`arXiv:quant-ph/0302002 [quant-ph] <https://arxiv.org/abs/quant-ph/0302002>`_
|
57
|
+
"""
|
58
|
+
normalized = np.asarray(state).astype(bool)
|
59
|
+
if section_size is not None and normalized.shape[1] < section_size:
|
60
|
+
raise ValueError(
|
61
|
+
f"The section_size ({section_size}) cannot be larger than the number of columns "
|
62
|
+
f"({normalized.shape[1]})."
|
63
|
+
)
|
64
|
+
|
65
|
+
# call Rust implementation with normalized input
|
66
|
+
circuit_data = fast_pmh(normalized, section_size)
|
67
|
+
|
68
|
+
# construct circuit from the data
|
69
|
+
return QuantumCircuit._from_circuit_data(circuit_data, add_regs=True)
|
@@ -0,0 +1,128 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2022.
|
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
|
+
"""Utility functions for handling linear reversible circuits."""
|
14
|
+
|
15
|
+
import copy
|
16
|
+
from typing import Callable
|
17
|
+
import numpy as np
|
18
|
+
from qiskit.circuit import QuantumCircuit
|
19
|
+
from qiskit.exceptions import QiskitError
|
20
|
+
from qiskit.circuit.exceptions import CircuitError
|
21
|
+
from . import calc_inverse_matrix, check_invertible_binary_matrix
|
22
|
+
|
23
|
+
|
24
|
+
def transpose_cx_circ(qc: QuantumCircuit):
|
25
|
+
"""Takes a circuit having only CX gates, and calculates its transpose.
|
26
|
+
This is done by recursively replacing CX(i, j) with CX(j, i) in all instructions.
|
27
|
+
|
28
|
+
Args:
|
29
|
+
qc: a :class:`.QuantumCircuit` containing only CX gates.
|
30
|
+
|
31
|
+
Returns:
|
32
|
+
QuantumCircuit: the transposed circuit.
|
33
|
+
|
34
|
+
Raises:
|
35
|
+
CircuitError: if qc has a non-CX gate.
|
36
|
+
"""
|
37
|
+
transposed_circ = QuantumCircuit(qc.qubits, qc.clbits, name=qc.name + "_transpose")
|
38
|
+
for instruction in reversed(qc.data):
|
39
|
+
if instruction.operation.name != "cx":
|
40
|
+
raise CircuitError("The circuit contains non-CX gates.")
|
41
|
+
transposed_circ._append(instruction.replace(qubits=reversed(instruction.qubits)))
|
42
|
+
return transposed_circ
|
43
|
+
|
44
|
+
|
45
|
+
def optimize_cx_4_options(function: Callable, mat: np.ndarray, optimize_count: bool = True):
|
46
|
+
"""Get the best implementation of a circuit implementing a binary invertible matrix M,
|
47
|
+
by considering all four options: M,M^(-1),M^T,M^(-1)^T.
|
48
|
+
Optimizing either the CX count or the depth.
|
49
|
+
|
50
|
+
Args:
|
51
|
+
function: the synthesis function.
|
52
|
+
mat: a binary invertible matrix.
|
53
|
+
optimize_count: True if the number of CX gates in optimize, False if the depth is optimized.
|
54
|
+
|
55
|
+
Returns:
|
56
|
+
QuantumCircuit: an optimized :class:`.QuantumCircuit`, has the best depth or CX count of
|
57
|
+
the four options.
|
58
|
+
|
59
|
+
Raises:
|
60
|
+
QiskitError: if mat is not an invertible matrix.
|
61
|
+
"""
|
62
|
+
if not check_invertible_binary_matrix(mat):
|
63
|
+
raise QiskitError("The matrix is not invertible.")
|
64
|
+
|
65
|
+
qc = function(mat)
|
66
|
+
best_qc = qc
|
67
|
+
best_depth = qc.depth()
|
68
|
+
best_count = qc.count_ops()["cx"]
|
69
|
+
|
70
|
+
for i in range(1, 4):
|
71
|
+
mat_cpy = copy.deepcopy(mat)
|
72
|
+
# i=1 inverse, i=2 transpose, i=3 transpose and inverse
|
73
|
+
if i == 1:
|
74
|
+
mat_cpy = calc_inverse_matrix(mat_cpy)
|
75
|
+
qc = function(mat_cpy)
|
76
|
+
qc = qc.inverse()
|
77
|
+
elif i == 2:
|
78
|
+
mat_cpy = np.transpose(mat_cpy)
|
79
|
+
qc = function(mat_cpy)
|
80
|
+
qc = transpose_cx_circ(qc)
|
81
|
+
elif i == 3:
|
82
|
+
mat_cpy = calc_inverse_matrix(np.transpose(mat_cpy))
|
83
|
+
qc = function(mat_cpy)
|
84
|
+
qc = transpose_cx_circ(qc)
|
85
|
+
qc = qc.inverse()
|
86
|
+
|
87
|
+
new_depth = qc.depth()
|
88
|
+
new_count = qc.count_ops()["cx"]
|
89
|
+
# Prioritize count, and if it has the same count, then also consider depth
|
90
|
+
better_count = (optimize_count and best_count > new_count) or (
|
91
|
+
not optimize_count and best_depth == new_depth and best_count > new_count
|
92
|
+
)
|
93
|
+
# Prioritize depth, and if it has the same depth, then also consider count
|
94
|
+
better_depth = (not optimize_count and best_depth > new_depth) or (
|
95
|
+
optimize_count and best_count == new_count and best_depth > new_depth
|
96
|
+
)
|
97
|
+
|
98
|
+
if better_count or better_depth:
|
99
|
+
best_count = new_count
|
100
|
+
best_depth = new_depth
|
101
|
+
best_qc = qc
|
102
|
+
|
103
|
+
return best_qc
|
104
|
+
|
105
|
+
|
106
|
+
def check_lnn_connectivity(qc: QuantumCircuit) -> bool:
|
107
|
+
"""Check that the synthesized circuit qc fits linear nearest neighbor connectivity.
|
108
|
+
|
109
|
+
Args:
|
110
|
+
qc: a :class:`.QuantumCircuit` containing only CX and single qubit gates.
|
111
|
+
|
112
|
+
Returns:
|
113
|
+
bool: True if the circuit has linear nearest neighbor connectivity.
|
114
|
+
|
115
|
+
Raises:
|
116
|
+
CircuitError: if qc has a non-CX two-qubit gate.
|
117
|
+
"""
|
118
|
+
for instruction in qc.data:
|
119
|
+
if instruction.operation.num_qubits > 1:
|
120
|
+
if instruction.operation.name == "cx":
|
121
|
+
q0 = qc.find_bit(instruction.qubits[0]).index
|
122
|
+
q1 = qc.find_bit(instruction.qubits[1]).index
|
123
|
+
dist = abs(q0 - q1)
|
124
|
+
if dist != 1:
|
125
|
+
return False
|
126
|
+
else:
|
127
|
+
raise CircuitError("The circuit has two-qubits gates different than CX.")
|
128
|
+
return True
|
@@ -0,0 +1,276 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2022, 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
|
+
"""
|
14
|
+
Optimize the synthesis of an n-qubit circuit contains only CX gates for
|
15
|
+
linear nearest neighbor (LNN) connectivity.
|
16
|
+
The depth of the circuit is bounded by 5*n, while the gate count is approximately 2.5*n^2
|
17
|
+
|
18
|
+
References:
|
19
|
+
[1]: Kutin, S., Moulton, D. P., Smithline, L. (2007).
|
20
|
+
Computation at a Distance.
|
21
|
+
`arXiv:quant-ph/0701194 <https://arxiv.org/abs/quant-ph/0701194>`_.
|
22
|
+
"""
|
23
|
+
|
24
|
+
from __future__ import annotations
|
25
|
+
import numpy as np
|
26
|
+
from qiskit.exceptions import QiskitError
|
27
|
+
from qiskit.circuit import QuantumCircuit
|
28
|
+
from qiskit.synthesis.linear.linear_matrix_utils import (
|
29
|
+
calc_inverse_matrix,
|
30
|
+
check_invertible_binary_matrix,
|
31
|
+
col_op,
|
32
|
+
row_op,
|
33
|
+
)
|
34
|
+
|
35
|
+
|
36
|
+
def _row_op_update_instructions(cx_instructions, mat, a, b):
|
37
|
+
# Add a cx gate to the instructions and update the matrix mat
|
38
|
+
cx_instructions.append((a, b))
|
39
|
+
row_op(mat, a, b)
|
40
|
+
|
41
|
+
|
42
|
+
def _get_lower_triangular(n, mat, mat_inv):
|
43
|
+
# Get the instructions for a lower triangular basis change of a matrix mat.
|
44
|
+
# See the proof of Proposition 7.3 in [1].
|
45
|
+
mat = mat.copy()
|
46
|
+
mat_t = mat.copy()
|
47
|
+
mat_inv_t = mat_inv.copy()
|
48
|
+
|
49
|
+
cx_instructions_rows = []
|
50
|
+
|
51
|
+
# Use the instructions in U, which contains only gates of the form cx(a,b) a>b
|
52
|
+
# to transform the matrix to a permuted lower-triangular matrix.
|
53
|
+
# The original Matrix is unchanged.
|
54
|
+
for i in reversed(range(0, n)):
|
55
|
+
found_first = False
|
56
|
+
# Find the last "1" in row i, use COL operations to the left in order to
|
57
|
+
# zero out all other "1"s in that row.
|
58
|
+
for j in reversed(range(0, n)):
|
59
|
+
if mat[i, j]:
|
60
|
+
if not found_first:
|
61
|
+
found_first = True
|
62
|
+
first_j = j
|
63
|
+
else:
|
64
|
+
# cx_instructions_cols (L instructions) are not needed
|
65
|
+
col_op(mat, j, first_j)
|
66
|
+
# Use row operations directed upwards to zero out all "1"s above the remaining "1" in row i
|
67
|
+
for k in reversed(range(0, i)):
|
68
|
+
if mat[k, first_j]:
|
69
|
+
_row_op_update_instructions(cx_instructions_rows, mat, i, k)
|
70
|
+
|
71
|
+
# Apply only U instructions to get the permuted L
|
72
|
+
for inst in cx_instructions_rows:
|
73
|
+
row_op(mat_t, inst[0], inst[1])
|
74
|
+
col_op(mat_inv_t, inst[0], inst[1])
|
75
|
+
return mat_t, mat_inv_t
|
76
|
+
|
77
|
+
|
78
|
+
def _get_label_arr(n, mat_t):
|
79
|
+
# For each row in mat_t, save the column index of the last "1"
|
80
|
+
label_arr = []
|
81
|
+
for i in range(n):
|
82
|
+
j = 0
|
83
|
+
while not mat_t[i, n - 1 - j]:
|
84
|
+
j += 1
|
85
|
+
label_arr.append(j)
|
86
|
+
return label_arr
|
87
|
+
|
88
|
+
|
89
|
+
def _in_linear_combination(label_arr_t, mat_inv_t, row, k):
|
90
|
+
# Check if "row" is a linear combination of all rows in mat_inv_t not including the row labeled by k
|
91
|
+
indx_k = label_arr_t[k]
|
92
|
+
w_needed = np.zeros(len(row), dtype=bool)
|
93
|
+
# Find the linear combination of mat_t rows which produces "row"
|
94
|
+
for row_l, _ in enumerate(row):
|
95
|
+
if row[row_l]:
|
96
|
+
# mat_inv_t can be thought of as a set of instructions. Row l in mat_inv_t
|
97
|
+
# indicates which rows from mat_t are necessary to produce the elementary vector e_l
|
98
|
+
w_needed = w_needed ^ mat_inv_t[row_l]
|
99
|
+
# If the linear combination requires the row labeled by k
|
100
|
+
if w_needed[indx_k]:
|
101
|
+
return False
|
102
|
+
return True
|
103
|
+
|
104
|
+
|
105
|
+
def _get_label_arr_t(n, label_arr):
|
106
|
+
# Returns label_arr_t = label_arr^(-1)
|
107
|
+
label_arr_t = [None] * n
|
108
|
+
for i in range(n):
|
109
|
+
label_arr_t[label_arr[i]] = i
|
110
|
+
return label_arr_t
|
111
|
+
|
112
|
+
|
113
|
+
def _matrix_to_north_west(n, mat, mat_inv):
|
114
|
+
# Transform an arbitrary boolean invertible matrix to a north-west triangular matrix
|
115
|
+
# by Proposition 7.3 in [1]
|
116
|
+
|
117
|
+
# The rows of mat_t hold all w_j vectors (see [1]). mat_inv_t is the inverted matrix of mat_t
|
118
|
+
mat_t, mat_inv_t = _get_lower_triangular(n, mat, mat_inv)
|
119
|
+
|
120
|
+
# Get all pi(i) labels
|
121
|
+
label_arr = _get_label_arr(n, mat_t)
|
122
|
+
|
123
|
+
# Save the original labels, exchange index <-> value
|
124
|
+
label_arr_t = _get_label_arr_t(n, label_arr)
|
125
|
+
|
126
|
+
first_qubit = 0
|
127
|
+
empty_layers = 0
|
128
|
+
done = False
|
129
|
+
cx_instructions_rows = []
|
130
|
+
|
131
|
+
while not done:
|
132
|
+
# At each iteration the values of i switch between even and odd
|
133
|
+
at_least_one_needed = False
|
134
|
+
|
135
|
+
for i in range(first_qubit, n - 1, 2):
|
136
|
+
# "If j < k, we do nothing" (see [1])
|
137
|
+
# "If j > k, we swap the two labels, and we also perform a box" (see [1])
|
138
|
+
if label_arr[i] > label_arr[i + 1]:
|
139
|
+
at_least_one_needed = True
|
140
|
+
# "Let W be the span of all w_l for l!=k" (see [1])
|
141
|
+
# " We can perform a box on <i> and <i + 1> that writes a vector in W to wire <i + 1>."
|
142
|
+
# (see [1])
|
143
|
+
if _in_linear_combination(label_arr_t, mat_inv_t, mat[i + 1], label_arr[i + 1]):
|
144
|
+
pass
|
145
|
+
|
146
|
+
elif _in_linear_combination(
|
147
|
+
label_arr_t, mat_inv_t, mat[i + 1] ^ mat[i], label_arr[i + 1]
|
148
|
+
):
|
149
|
+
_row_op_update_instructions(cx_instructions_rows, mat, i, i + 1)
|
150
|
+
|
151
|
+
elif _in_linear_combination(label_arr_t, mat_inv_t, mat[i], label_arr[i + 1]):
|
152
|
+
_row_op_update_instructions(cx_instructions_rows, mat, i + 1, i)
|
153
|
+
_row_op_update_instructions(cx_instructions_rows, mat, i, i + 1)
|
154
|
+
|
155
|
+
label_arr[i], label_arr[i + 1] = label_arr[i + 1], label_arr[i]
|
156
|
+
|
157
|
+
if not at_least_one_needed:
|
158
|
+
empty_layers += 1
|
159
|
+
if empty_layers > 1: # if nothing happened twice in a row, then finished.
|
160
|
+
done = True
|
161
|
+
else:
|
162
|
+
empty_layers = 0
|
163
|
+
|
164
|
+
first_qubit = int(not first_qubit)
|
165
|
+
|
166
|
+
return cx_instructions_rows
|
167
|
+
|
168
|
+
|
169
|
+
def _north_west_to_identity(n, mat):
|
170
|
+
# Transform a north-west triangular matrix to identity in depth 3*n by Proposition 7.4 of [1]
|
171
|
+
|
172
|
+
# At start the labels are in reversed order
|
173
|
+
label_arr = list(reversed(range(n)))
|
174
|
+
first_qubit = 0
|
175
|
+
empty_layers = 0
|
176
|
+
done = False
|
177
|
+
cx_instructions_rows = []
|
178
|
+
|
179
|
+
while not done:
|
180
|
+
at_least_one_needed = False
|
181
|
+
|
182
|
+
for i in range(first_qubit, n - 1, 2):
|
183
|
+
# Exchange the labels if needed
|
184
|
+
if label_arr[i] > label_arr[i + 1]:
|
185
|
+
at_least_one_needed = True
|
186
|
+
|
187
|
+
# If row i has "1" in column i+1, swap and remove the "1" (in depth 2)
|
188
|
+
# otherwise, only do a swap (in depth 3)
|
189
|
+
if not mat[i, label_arr[i + 1]]:
|
190
|
+
# Adding this turns the operation to a SWAP
|
191
|
+
_row_op_update_instructions(cx_instructions_rows, mat, i + 1, i)
|
192
|
+
|
193
|
+
_row_op_update_instructions(cx_instructions_rows, mat, i, i + 1)
|
194
|
+
_row_op_update_instructions(cx_instructions_rows, mat, i + 1, i)
|
195
|
+
|
196
|
+
label_arr[i], label_arr[i + 1] = label_arr[i + 1], label_arr[i]
|
197
|
+
|
198
|
+
if not at_least_one_needed:
|
199
|
+
empty_layers += 1
|
200
|
+
if empty_layers > 1: # if nothing happened twice in a row, then finished.
|
201
|
+
done = True
|
202
|
+
else:
|
203
|
+
empty_layers = 0
|
204
|
+
|
205
|
+
first_qubit = int(not first_qubit)
|
206
|
+
|
207
|
+
return cx_instructions_rows
|
208
|
+
|
209
|
+
|
210
|
+
def _optimize_cx_circ_depth_5n_line(mat):
|
211
|
+
# Optimize CX circuit in depth bounded by 5n for LNN connectivity.
|
212
|
+
# The algorithm [1] has two steps:
|
213
|
+
# a) transform the original matrix to a north-west matrix (m2nw),
|
214
|
+
# b) transform the north-west matrix to identity (nw2id).
|
215
|
+
#
|
216
|
+
# A square n-by-n matrix A is called north-west if A[i][j]=0 for all i+j>=n
|
217
|
+
# For example, the following matrix is north-west:
|
218
|
+
# [[0, 1, 0, 1]
|
219
|
+
# [1, 1, 1, 0]
|
220
|
+
# [0, 1, 0, 0]
|
221
|
+
# [1, 0, 0, 0]]
|
222
|
+
|
223
|
+
# According to [1] the synthesis is done on the inverse matrix
|
224
|
+
# so the matrix mat is inverted at this step
|
225
|
+
mat_inv = mat.astype(bool, copy=True)
|
226
|
+
mat_cpy = calc_inverse_matrix(mat_inv)
|
227
|
+
|
228
|
+
n = len(mat_cpy)
|
229
|
+
|
230
|
+
# Transform an arbitrary invertible matrix to a north-west triangular matrix
|
231
|
+
# by Proposition 7.3 of [1]
|
232
|
+
cx_instructions_rows_m2nw = _matrix_to_north_west(n, mat_cpy, mat_inv)
|
233
|
+
|
234
|
+
# Transform a north-west triangular matrix to identity in depth 3*n
|
235
|
+
# by Proposition 7.4 of [1]
|
236
|
+
cx_instructions_rows_nw2id = _north_west_to_identity(n, mat_cpy)
|
237
|
+
|
238
|
+
return cx_instructions_rows_m2nw, cx_instructions_rows_nw2id
|
239
|
+
|
240
|
+
|
241
|
+
def synth_cnot_depth_line_kms(mat: np.ndarray[bool]) -> QuantumCircuit:
|
242
|
+
"""
|
243
|
+
Synthesize linear reversible circuit for linear nearest-neighbor architectures using
|
244
|
+
Kutin, Moulton, Smithline method.
|
245
|
+
|
246
|
+
Synthesis algorithm for linear reversible circuits from [1], section 7.
|
247
|
+
This algorithm synthesizes any linear reversible circuit of :math:`n` qubits over
|
248
|
+
a linear nearest-neighbor architecture using CX gates with depth at most :math:`5n`.
|
249
|
+
|
250
|
+
Args:
|
251
|
+
mat: A boolean invertible matrix.
|
252
|
+
|
253
|
+
Returns:
|
254
|
+
The synthesized quantum circuit.
|
255
|
+
|
256
|
+
Raises:
|
257
|
+
QiskitError: if ``mat`` is not invertible.
|
258
|
+
|
259
|
+
References:
|
260
|
+
1. Kutin, S., Moulton, D. P., Smithline, L.,
|
261
|
+
*Computation at a distance*, Chicago J. Theor. Comput. Sci., vol. 2007, (2007),
|
262
|
+
`arXiv:quant-ph/0701194 <https://arxiv.org/abs/quant-ph/0701194>`_
|
263
|
+
"""
|
264
|
+
if not check_invertible_binary_matrix(mat):
|
265
|
+
raise QiskitError("The input matrix is not invertible.")
|
266
|
+
|
267
|
+
# Returns the quantum circuit constructed from the instructions
|
268
|
+
# that we got in _optimize_cx_circ_depth_5n_line
|
269
|
+
num_qubits = len(mat)
|
270
|
+
cx_inst = _optimize_cx_circ_depth_5n_line(mat)
|
271
|
+
qc = QuantumCircuit(num_qubits)
|
272
|
+
for pair in cx_inst[0]:
|
273
|
+
qc.cx(pair[0], pair[1])
|
274
|
+
for pair in cx_inst[1]:
|
275
|
+
qc.cx(pair[0], pair[1])
|
276
|
+
return qc
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2022.
|
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
|
+
"""Utility functions for handling binary matrices."""
|
14
|
+
|
15
|
+
# pylint: disable=unused-import
|
16
|
+
from qiskit._accelerate.synthesis.linear import (
|
17
|
+
gauss_elimination,
|
18
|
+
gauss_elimination_with_perm,
|
19
|
+
compute_rank_after_gauss_elim,
|
20
|
+
compute_rank,
|
21
|
+
calc_inverse_matrix,
|
22
|
+
binary_matmul,
|
23
|
+
random_invertible_binary_matrix,
|
24
|
+
check_invertible_binary_matrix,
|
25
|
+
row_op,
|
26
|
+
col_op,
|
27
|
+
)
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017 - 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
|
+
"""Module containing cnot-phase circuits"""
|
14
|
+
|
15
|
+
from .cz_depth_lnn import synth_cz_depth_line_mr
|
16
|
+
from .cx_cz_depth_lnn import synth_cx_cz_depth_line_my
|
17
|
+
from .cnot_phase_synth import synth_cnot_phase_aam
|