qiskit 1.3.0b1__cp39-abi3-win32.whl → 1.3.0rc2__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 -1
- qiskit/__init__.py +20 -1
- qiskit/_accelerate.pyd +0 -0
- qiskit/assembler/assemble_schedules.py +2 -0
- qiskit/circuit/__init__.py +44 -1
- qiskit/circuit/_standard_gates_commutations.py +585 -0
- qiskit/circuit/barrier.py +2 -0
- qiskit/circuit/controlflow/builder.py +3 -3
- qiskit/circuit/controlflow/if_else.py +13 -5
- qiskit/circuit/controlflow/while_loop.py +10 -2
- qiskit/circuit/delay.py +20 -3
- qiskit/circuit/equivalence.py +13 -214
- qiskit/circuit/gate.py +3 -1
- qiskit/circuit/instruction.py +32 -11
- qiskit/circuit/instructionset.py +2 -0
- qiskit/circuit/library/__init__.py +110 -14
- qiskit/circuit/library/arithmetic/__init__.py +9 -2
- qiskit/circuit/library/arithmetic/adders/__init__.py +1 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +154 -2
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +20 -56
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +14 -1
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +21 -91
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +1 -0
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +8 -1
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +94 -3
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +8 -1
- qiskit/circuit/library/arithmetic/weighted_adder.py +1 -1
- qiskit/circuit/library/basis_change/qft.py +20 -38
- qiskit/circuit/library/blueprintcircuit.py +64 -0
- qiskit/circuit/library/boolean_logic/__init__.py +4 -4
- qiskit/circuit/library/boolean_logic/inner_product.py +81 -4
- qiskit/circuit/library/boolean_logic/quantum_and.py +107 -4
- qiskit/circuit/library/boolean_logic/quantum_or.py +107 -3
- qiskit/circuit/library/boolean_logic/quantum_xor.py +97 -3
- qiskit/circuit/library/data_preparation/__init__.py +6 -3
- qiskit/circuit/library/data_preparation/{z_feature_map.py → _z_feature_map.py} +45 -34
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +342 -29
- qiskit/circuit/library/fourier_checking.py +72 -11
- qiskit/circuit/library/generalized_gates/__init__.py +1 -1
- qiskit/circuit/library/generalized_gates/diagonal.py +45 -51
- qiskit/circuit/library/generalized_gates/gms.py +67 -14
- qiskit/circuit/library/generalized_gates/gr.py +4 -4
- qiskit/circuit/library/generalized_gates/isometry.py +2 -2
- qiskit/circuit/library/generalized_gates/linear_function.py +12 -6
- qiskit/circuit/library/generalized_gates/mcmt.py +167 -107
- qiskit/circuit/library/generalized_gates/permutation.py +8 -6
- qiskit/circuit/library/generalized_gates/rv.py +8 -9
- qiskit/circuit/library/graph_state.py +93 -10
- qiskit/circuit/library/grover_operator.py +270 -2
- qiskit/circuit/library/hidden_linear_function.py +83 -20
- qiskit/circuit/library/iqp.py +99 -20
- qiskit/circuit/library/n_local/__init__.py +19 -7
- qiskit/circuit/library/n_local/efficient_su2.py +118 -5
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +259 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +130 -6
- qiskit/circuit/library/n_local/n_local.py +406 -5
- qiskit/circuit/library/n_local/pauli_two_design.py +106 -4
- qiskit/circuit/library/n_local/qaoa_ansatz.py +80 -1
- qiskit/circuit/library/n_local/real_amplitudes.py +127 -7
- qiskit/circuit/library/n_local/two_local.py +14 -7
- qiskit/circuit/library/overlap.py +91 -26
- qiskit/circuit/library/pauli_evolution.py +17 -15
- qiskit/circuit/library/phase_estimation.py +80 -4
- qiskit/circuit/library/quantum_volume.py +72 -20
- qiskit/circuit/library/standard_gates/__init__.py +20 -1
- qiskit/circuit/library/standard_gates/dcx.py +2 -1
- qiskit/circuit/library/standard_gates/ecr.py +2 -2
- qiskit/circuit/library/standard_gates/h.py +4 -3
- qiskit/circuit/library/standard_gates/i.py +2 -1
- qiskit/circuit/library/standard_gates/iswap.py +2 -2
- qiskit/circuit/library/standard_gates/p.py +20 -12
- qiskit/circuit/library/standard_gates/r.py +1 -1
- qiskit/circuit/library/standard_gates/rx.py +4 -3
- qiskit/circuit/library/standard_gates/rxx.py +2 -2
- qiskit/circuit/library/standard_gates/ry.py +4 -3
- qiskit/circuit/library/standard_gates/ryy.py +2 -2
- qiskit/circuit/library/standard_gates/rz.py +13 -12
- qiskit/circuit/library/standard_gates/rzx.py +6 -6
- qiskit/circuit/library/standard_gates/rzz.py +1 -1
- qiskit/circuit/library/standard_gates/s.py +4 -4
- qiskit/circuit/library/standard_gates/swap.py +3 -3
- qiskit/circuit/library/standard_gates/sx.py +4 -3
- qiskit/circuit/library/standard_gates/t.py +2 -2
- qiskit/circuit/library/standard_gates/u.py +11 -3
- qiskit/circuit/library/standard_gates/u1.py +65 -15
- qiskit/circuit/library/standard_gates/u2.py +4 -1
- qiskit/circuit/library/standard_gates/u3.py +31 -3
- qiskit/circuit/library/standard_gates/x.py +7 -5
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -2
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -2
- qiskit/circuit/library/standard_gates/y.py +4 -3
- qiskit/circuit/library/standard_gates/z.py +3 -3
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +9 -8
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +9 -7
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +9 -8
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +9 -8
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +9 -8
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +10 -9
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +9 -7
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +10 -8
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +16 -14
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +14 -12
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +14 -12
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +11 -9
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +11 -9
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +11 -9
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +11 -9
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +12 -10
- qiskit/circuit/library/templates/rzx/rzx_cy.py +11 -10
- qiskit/circuit/library/templates/rzx/rzx_xz.py +16 -15
- qiskit/circuit/library/templates/rzx/rzx_yz.py +12 -10
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +22 -20
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +16 -15
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +17 -15
- qiskit/circuit/parameter.py +4 -0
- qiskit/circuit/parameterexpression.py +167 -34
- qiskit/circuit/quantumcircuit.py +162 -126
- qiskit/circuit/singleton.py +2 -0
- qiskit/circuit/store.py +2 -0
- qiskit/circuit/twirling.py +145 -0
- qiskit/compiler/assembler.py +17 -4
- qiskit/compiler/scheduler.py +2 -0
- qiskit/compiler/sequencer.py +2 -0
- qiskit/compiler/transpiler.py +81 -26
- qiskit/converters/circuit_to_dag.py +2 -2
- qiskit/converters/circuit_to_dagdependency.py +1 -1
- qiskit/converters/circuit_to_dagdependency_v2.py +1 -1
- qiskit/converters/circuit_to_instruction.py +1 -1
- qiskit/converters/dag_to_circuit.py +7 -5
- qiskit/converters/dag_to_dagdependency.py +1 -1
- qiskit/converters/dag_to_dagdependency_v2.py +1 -1
- qiskit/converters/dagdependency_to_circuit.py +5 -1
- qiskit/converters/dagdependency_to_dag.py +6 -1
- qiskit/dagcircuit/collect_blocks.py +3 -3
- qiskit/dagcircuit/dagdependency.py +18 -5
- qiskit/dagcircuit/dagdependency_v2.py +1 -1
- qiskit/dagcircuit/dagnode.py +2 -2
- qiskit/passmanager/__init__.py +2 -2
- qiskit/primitives/backend_estimator.py +5 -2
- qiskit/primitives/backend_sampler_v2.py +61 -18
- qiskit/primitives/base/base_estimator.py +2 -2
- qiskit/primitives/containers/data_bin.py +9 -1
- qiskit/primitives/statevector_sampler.py +1 -1
- qiskit/primitives/utils.py +1 -1
- qiskit/providers/__init__.py +3 -3
- qiskit/providers/backend.py +12 -1
- qiskit/providers/backend_compat.py +23 -3
- qiskit/providers/basic_provider/basic_simulator.py +12 -2
- qiskit/providers/fake_provider/fake_pulse_backend.py +6 -1
- qiskit/providers/fake_provider/generic_backend_v2.py +46 -30
- qiskit/providers/models/pulsedefaults.py +2 -0
- qiskit/pulse/builder.py +59 -18
- qiskit/pulse/calibration_entries.py +4 -1
- qiskit/pulse/channels.py +2 -0
- qiskit/pulse/exceptions.py +2 -0
- qiskit/pulse/instruction_schedule_map.py +21 -6
- qiskit/pulse/instructions/acquire.py +2 -0
- qiskit/pulse/instructions/delay.py +2 -0
- qiskit/pulse/instructions/directives.py +8 -0
- qiskit/pulse/instructions/frequency.py +3 -0
- qiskit/pulse/instructions/instruction.py +2 -0
- qiskit/pulse/instructions/phase.py +3 -0
- qiskit/pulse/instructions/play.py +2 -0
- qiskit/pulse/instructions/reference.py +2 -0
- qiskit/pulse/instructions/snapshot.py +2 -0
- qiskit/pulse/library/pulse.py +2 -0
- qiskit/pulse/library/symbolic_pulses.py +28 -0
- qiskit/pulse/library/waveform.py +2 -0
- qiskit/pulse/macros.py +1 -1
- qiskit/pulse/schedule.py +12 -13
- qiskit/pulse/transforms/alignments.py +5 -3
- qiskit/pulse/transforms/dag.py +7 -0
- qiskit/qasm2/export.py +5 -3
- qiskit/qasm2/parse.py +46 -2
- qiskit/qasm3/__init__.py +1 -0
- qiskit/qasm3/ast.py +123 -15
- qiskit/qasm3/exporter.py +103 -77
- qiskit/qobj/converters/pulse_instruction.py +6 -4
- qiskit/qpy/__init__.py +181 -0
- qiskit/qpy/binary_io/circuits.py +20 -5
- qiskit/qpy/binary_io/schedules.py +3 -4
- qiskit/qpy/binary_io/value.py +310 -13
- qiskit/qpy/common.py +46 -2
- qiskit/qpy/formats.py +7 -0
- qiskit/qpy/interface.py +40 -4
- qiskit/quantum_info/__init__.py +4 -0
- qiskit/quantum_info/operators/channel/transformations.py +28 -21
- qiskit/quantum_info/operators/dihedral/dihedral.py +1 -1
- qiskit/quantum_info/operators/operator.py +54 -8
- qiskit/quantum_info/operators/symplectic/base_pauli.py +11 -19
- qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +1 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +2 -0
- qiskit/quantum_info/operators/symplectic/pauli_list.py +4 -4
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +23 -2
- qiskit/quantum_info/states/densitymatrix.py +5 -5
- qiskit/quantum_info/states/stabilizerstate.py +1 -1
- qiskit/quantum_info/states/statevector.py +6 -6
- qiskit/result/mitigation/base_readout_mitigator.py +1 -1
- qiskit/result/mitigation/correlated_readout_mitigator.py +9 -1
- qiskit/result/mitigation/local_readout_mitigator.py +9 -1
- qiskit/result/mitigation/utils.py +57 -0
- qiskit/scheduler/config.py +2 -0
- qiskit/scheduler/methods/basic.py +3 -0
- qiskit/scheduler/schedule_circuit.py +2 -0
- qiskit/scheduler/sequence.py +2 -0
- qiskit/synthesis/__init__.py +25 -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/clifford_decompose_bm.py +1 -2
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +3 -2
- qiskit/synthesis/clifford/clifford_decompose_layers.py +2 -1
- qiskit/synthesis/evolution/__init__.py +1 -0
- qiskit/synthesis/evolution/lie_trotter.py +16 -42
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +165 -238
- qiskit/synthesis/evolution/qdrift.py +36 -29
- qiskit/synthesis/evolution/suzuki_trotter.py +87 -27
- qiskit/synthesis/multi_controlled/__init__.py +1 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/qft/qft_decompose_full.py +19 -1
- qiskit/synthesis/qft/qft_decompose_lnn.py +2 -1
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -1
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +4 -63
- qiskit/synthesis/unitary/qsd.py +5 -5
- qiskit/transpiler/__init__.py +21 -14
- qiskit/transpiler/basepasses.py +1 -1
- qiskit/transpiler/passes/__init__.py +2 -0
- qiskit/transpiler/passes/basis/basis_translator.py +9 -565
- qiskit/transpiler/passes/basis/decompose.py +45 -12
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +1 -1
- qiskit/transpiler/passes/calibration/pulse_gate.py +4 -2
- qiskit/transpiler/passes/calibration/rx_builder.py +11 -7
- qiskit/transpiler/passes/calibration/rzx_builder.py +46 -30
- qiskit/transpiler/passes/layout/disjoint_utils.py +15 -13
- qiskit/transpiler/passes/layout/sabre_layout.py +7 -2
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +5 -0
- qiskit/transpiler/passes/optimization/__init__.py +1 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +19 -3
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +1 -1
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
- qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +1 -1
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +48 -131
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +4 -2
- qiskit/transpiler/passes/optimization/elide_permutations.py +9 -32
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +5 -11
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
- qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +1 -1
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +69 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +5 -5
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +4 -4
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +2 -2
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +1 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +7 -3
- qiskit/transpiler/passes/routing/star_prerouting.py +2 -2
- qiskit/transpiler/passes/scheduling/alap.py +1 -1
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +2 -2
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +2 -0
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +2 -2
- qiskit/transpiler/passes/scheduling/asap.py +1 -1
- qiskit/transpiler/passes/scheduling/base_scheduler.py +14 -12
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +9 -4
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +16 -5
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +4 -1
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +6 -2
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +9 -4
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +262 -99
- qiskit/transpiler/passes/synthesis/hls_plugins.py +637 -7
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +3 -3
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +55 -34
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +2 -56
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +5 -0
- qiskit/transpiler/passes/utils/gate_direction.py +12 -275
- qiskit/transpiler/passes/utils/gates_basis.py +7 -30
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +2 -1
- qiskit/transpiler/passmanager_config.py +22 -4
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +40 -14
- qiskit/transpiler/preset_passmanagers/common.py +5 -3
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +125 -42
- qiskit/transpiler/preset_passmanagers/plugin.py +1 -1
- qiskit/transpiler/target.py +74 -16
- qiskit/utils/deprecate_pulse.py +119 -0
- qiskit/visualization/circuit/_utils.py +2 -2
- qiskit/visualization/circuit/circuit_visualization.py +3 -2
- qiskit/visualization/circuit/matplotlib.py +1 -1
- qiskit/visualization/dag_visualization.py +1 -1
- qiskit/visualization/pass_manager_visualization.py +3 -14
- qiskit/visualization/pulse_v2/interface.py +3 -1
- qiskit/visualization/timeline/core.py +25 -2
- qiskit/visualization/timeline/interface.py +12 -0
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/METADATA +9 -8
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/RECORD +357 -346
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/WHEEL +1 -1
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/entry_points.txt +19 -0
- qiskit/circuit/library/data_preparation/zz_feature_map.py +0 -118
- qiskit/synthesis/two_qubit/weyl.py +0 -97
- qiskit/transpiler/passes/synthesis/qubit_tracker.py +0 -132
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,20 @@
|
|
1
1
|
[qiskit.synthesis]
|
2
|
+
FullAdder.default = qiskit.transpiler.passes.synthesis.hls_plugins:FullAdderSynthesisC04
|
3
|
+
FullAdder.ripple_c04 = qiskit.transpiler.passes.synthesis.hls_plugins:FullAdderSynthesisC04
|
4
|
+
FullAdder.ripple_v95 = qiskit.transpiler.passes.synthesis.hls_plugins:FullAdderSynthesisV95
|
5
|
+
HalfAdder.default = qiskit.transpiler.passes.synthesis.hls_plugins:HalfAdderSynthesisDefault
|
6
|
+
HalfAdder.qft_d00 = qiskit.transpiler.passes.synthesis.hls_plugins:HalfAdderSynthesisD00
|
7
|
+
HalfAdder.ripple_c04 = qiskit.transpiler.passes.synthesis.hls_plugins:HalfAdderSynthesisC04
|
8
|
+
HalfAdder.ripple_v95 = qiskit.transpiler.passes.synthesis.hls_plugins:HalfAdderSynthesisV95
|
9
|
+
ModularAdder.default = qiskit.transpiler.passes.synthesis.hls_plugins:ModularAdderSynthesisDefault
|
10
|
+
ModularAdder.qft_d00 = qiskit.transpiler.passes.synthesis.hls_plugins:ModularAdderSynthesisD00
|
11
|
+
ModularAdder.ripple_c04 = qiskit.transpiler.passes.synthesis.hls_plugins:ModularAdderSynthesisC04
|
12
|
+
ModularAdder.ripple_v95 = qiskit.transpiler.passes.synthesis.hls_plugins:ModularAdderSynthesisV95
|
13
|
+
Multiplier.cumulative_h18 = qiskit.transpiler.passes.synthesis.hls_plugins:MultiplierSynthesisH18
|
14
|
+
Multiplier.default = qiskit.transpiler.passes.synthesis.hls_plugins:MultiplierSynthesisR17
|
15
|
+
Multiplier.qft_r17 = qiskit.transpiler.passes.synthesis.hls_plugins:MultiplierSynthesisR17
|
16
|
+
PauliEvolution.default = qiskit.transpiler.passes.synthesis.hls_plugins:PauliEvolutionSynthesisDefault
|
17
|
+
PauliEvolution.rustiq = qiskit.transpiler.passes.synthesis.hls_plugins:PauliEvolutionSynthesisRustiq
|
2
18
|
clifford.ag = qiskit.transpiler.passes.synthesis.hls_plugins:AGSynthesisClifford
|
3
19
|
clifford.bm = qiskit.transpiler.passes.synthesis.hls_plugins:BMSynthesisClifford
|
4
20
|
clifford.default = qiskit.transpiler.passes.synthesis.hls_plugins:DefaultSynthesisClifford
|
@@ -8,6 +24,9 @@ clifford.lnn = qiskit.transpiler.passes.synthesis.hls_plugins:LayerLnnSynthesisC
|
|
8
24
|
linear_function.default = qiskit.transpiler.passes.synthesis.hls_plugins:DefaultSynthesisLinearFunction
|
9
25
|
linear_function.kms = qiskit.transpiler.passes.synthesis.hls_plugins:KMSSynthesisLinearFunction
|
10
26
|
linear_function.pmh = qiskit.transpiler.passes.synthesis.hls_plugins:PMHSynthesisLinearFunction
|
27
|
+
mcmt.default = qiskit.transpiler.passes.synthesis.hls_plugins:MCMTSynthesisDefault
|
28
|
+
mcmt.noaux = qiskit.transpiler.passes.synthesis.hls_plugins:MCMTSynthesisNoAux
|
29
|
+
mcmt.vchain = qiskit.transpiler.passes.synthesis.hls_plugins:MCMTSynthesisVChain
|
11
30
|
mcx.1_clean_b95 = qiskit.transpiler.passes.synthesis.hls_plugins:MCXSynthesis1CleanB95
|
12
31
|
mcx.default = qiskit.transpiler.passes.synthesis.hls_plugins:MCXSynthesisDefault
|
13
32
|
mcx.gray_code = qiskit.transpiler.passes.synthesis.hls_plugins:MCXSynthesisGrayCode
|
@@ -1,118 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2017, 2020.
|
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
|
-
"""Second-order Pauli-Z expansion circuit."""
|
14
|
-
|
15
|
-
from typing import Callable, List, Union, Optional, Dict, Tuple
|
16
|
-
import numpy as np
|
17
|
-
from .pauli_feature_map import PauliFeatureMap
|
18
|
-
|
19
|
-
|
20
|
-
class ZZFeatureMap(PauliFeatureMap):
|
21
|
-
r"""Second-order Pauli-Z evolution circuit.
|
22
|
-
|
23
|
-
For 3 qubits and 1 repetition and linear entanglement the circuit is represented by:
|
24
|
-
|
25
|
-
.. parsed-literal::
|
26
|
-
|
27
|
-
┌───┐┌─────────────────┐
|
28
|
-
┤ H ├┤ U1(2.0*φ(x[0])) ├──■────────────────────────────■────────────────────────────────────
|
29
|
-
├───┤├─────────────────┤┌─┴─┐┌──────────────────────┐┌─┴─┐
|
30
|
-
┤ H ├┤ U1(2.0*φ(x[1])) ├┤ X ├┤ U1(2.0*φ(x[0],x[1])) ├┤ X ├──■────────────────────────────■──
|
31
|
-
├───┤├─────────────────┤└───┘└──────────────────────┘└───┘┌─┴─┐┌──────────────────────┐┌─┴─┐
|
32
|
-
┤ H ├┤ U1(2.0*φ(x[2])) ├──────────────────────────────────┤ X ├┤ U1(2.0*φ(x[1],x[2])) ├┤ X ├
|
33
|
-
└───┘└─────────────────┘ └───┘└──────────────────────┘└───┘
|
34
|
-
|
35
|
-
where :math:`\varphi` is a classical non-linear function, which defaults to :math:`\varphi(x) = x`
|
36
|
-
if and :math:`\varphi(x,y) = (\pi - x)(\pi - y)`.
|
37
|
-
|
38
|
-
Examples:
|
39
|
-
|
40
|
-
>>> from qiskit.circuit.library import ZZFeatureMap
|
41
|
-
>>> prep = ZZFeatureMap(2, reps=1)
|
42
|
-
>>> print(prep)
|
43
|
-
┌───┐┌──────────────┐
|
44
|
-
q_0: ┤ H ├┤ U1(2.0*x[0]) ├──■───────────────────────────────────────■──
|
45
|
-
├───┤├──────────────┤┌─┴─┐┌─────────────────────────────────┐┌─┴─┐
|
46
|
-
q_1: ┤ H ├┤ U1(2.0*x[1]) ├┤ X ├┤ U1(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├
|
47
|
-
└───┘└──────────────┘└───┘└─────────────────────────────────┘└───┘
|
48
|
-
|
49
|
-
>>> from qiskit.circuit.library import EfficientSU2
|
50
|
-
>>> classifier = ZZFeatureMap(3) + EfficientSU2(3)
|
51
|
-
>>> classifier.num_parameters
|
52
|
-
15
|
53
|
-
>>> classifier.parameters # 'x' for the data preparation, 'θ' for the SU2 parameters
|
54
|
-
ParameterView([
|
55
|
-
ParameterVectorElement(x[0]), ParameterVectorElement(x[1]),
|
56
|
-
ParameterVectorElement(x[2]), ParameterVectorElement(θ[0]),
|
57
|
-
ParameterVectorElement(θ[1]), ParameterVectorElement(θ[2]),
|
58
|
-
ParameterVectorElement(θ[3]), ParameterVectorElement(θ[4]),
|
59
|
-
ParameterVectorElement(θ[5]), ParameterVectorElement(θ[6]),
|
60
|
-
ParameterVectorElement(θ[7]), ParameterVectorElement(θ[8]),
|
61
|
-
ParameterVectorElement(θ[9]), ParameterVectorElement(θ[10]),
|
62
|
-
ParameterVectorElement(θ[11]), ParameterVectorElement(θ[12]),
|
63
|
-
ParameterVectorElement(θ[13]), ParameterVectorElement(θ[14]),
|
64
|
-
ParameterVectorElement(θ[15]), ParameterVectorElement(θ[16]),
|
65
|
-
ParameterVectorElement(θ[17]), ParameterVectorElement(θ[18]),
|
66
|
-
ParameterVectorElement(θ[19]), ParameterVectorElement(θ[20]),
|
67
|
-
ParameterVectorElement(θ[21]), ParameterVectorElement(θ[22]),
|
68
|
-
ParameterVectorElement(θ[23])
|
69
|
-
])
|
70
|
-
>>> classifier.count_ops()
|
71
|
-
OrderedDict([('ZZFeatureMap', 1), ('EfficientSU2', 1)])
|
72
|
-
"""
|
73
|
-
|
74
|
-
def __init__(
|
75
|
-
self,
|
76
|
-
feature_dimension: int,
|
77
|
-
reps: int = 2,
|
78
|
-
entanglement: Union[
|
79
|
-
str,
|
80
|
-
Dict[int, List[Tuple[int]]],
|
81
|
-
Callable[[int], Union[str, Dict[int, List[Tuple[int]]]]],
|
82
|
-
] = "full",
|
83
|
-
data_map_func: Optional[Callable[[np.ndarray], float]] = None,
|
84
|
-
parameter_prefix: str = "x",
|
85
|
-
insert_barriers: bool = False,
|
86
|
-
name: str = "ZZFeatureMap",
|
87
|
-
) -> None:
|
88
|
-
"""Create a new second-order Pauli-Z expansion.
|
89
|
-
|
90
|
-
Args:
|
91
|
-
feature_dimension: Number of features.
|
92
|
-
reps: The number of repeated circuits, has a min. value of 1.
|
93
|
-
entanglement: Specifies the entanglement structure. Refer to
|
94
|
-
:class:`~qiskit.circuit.library.PauliFeatureMap` for detail.
|
95
|
-
data_map_func: A mapping function for data x.
|
96
|
-
parameter_prefix: The prefix used if default parameters are generated.
|
97
|
-
insert_barriers: If True, barriers are inserted in between the evolution instructions
|
98
|
-
and hadamard layers.
|
99
|
-
|
100
|
-
Raises:
|
101
|
-
ValueError: If the feature dimension is smaller than 2.
|
102
|
-
"""
|
103
|
-
if feature_dimension < 2:
|
104
|
-
raise ValueError(
|
105
|
-
"The ZZFeatureMap contains 2-local interactions and cannot be "
|
106
|
-
f"defined for less than 2 qubits. You provided {feature_dimension}."
|
107
|
-
)
|
108
|
-
|
109
|
-
super().__init__(
|
110
|
-
feature_dimension=feature_dimension,
|
111
|
-
reps=reps,
|
112
|
-
entanglement=entanglement,
|
113
|
-
paulis=["Z", "ZZ"],
|
114
|
-
data_map_func=data_map_func,
|
115
|
-
parameter_prefix=parameter_prefix,
|
116
|
-
insert_barriers=insert_barriers,
|
117
|
-
name=name,
|
118
|
-
)
|
@@ -1,97 +0,0 @@
|
|
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
|
-
# pylint: disable=invalid-name
|
13
|
-
|
14
|
-
"""Routines that compute and use the Weyl chamber coordinates.
|
15
|
-
"""
|
16
|
-
|
17
|
-
from __future__ import annotations
|
18
|
-
import numpy as np
|
19
|
-
|
20
|
-
# "Magic" basis used for the Weyl decomposition. The basis and its adjoint are stored individually
|
21
|
-
# unnormalized, but such that their matrix multiplication is still the identity. This is because
|
22
|
-
# they are only used in unitary transformations (so it's safe to do so), and `sqrt(0.5)` is not
|
23
|
-
# exactly representable in floating point. Doing it this way means that every element of the matrix
|
24
|
-
# is stored exactly correctly, and the multiplication is _exactly_ the identity rather than
|
25
|
-
# differing by 1ULP.
|
26
|
-
_B_nonnormalized = np.array([[1, 1j, 0, 0], [0, 0, 1j, 1], [0, 0, 1j, -1], [1, -1j, 0, 0]])
|
27
|
-
_B_nonnormalized_dagger = 0.5 * _B_nonnormalized.conj().T
|
28
|
-
|
29
|
-
|
30
|
-
def transform_to_magic_basis(U: np.ndarray, reverse: bool = False) -> np.ndarray:
|
31
|
-
"""Transform the 4-by-4 matrix ``U`` into the magic basis.
|
32
|
-
|
33
|
-
This method internally uses non-normalized versions of the basis to minimize the floating-point
|
34
|
-
errors that arise during the transformation.
|
35
|
-
|
36
|
-
Args:
|
37
|
-
U (np.ndarray): 4-by-4 matrix to transform.
|
38
|
-
reverse (bool): Whether to do the transformation forwards (``B @ U @ B.conj().T``, the
|
39
|
-
default) or backwards (``B.conj().T @ U @ B``).
|
40
|
-
|
41
|
-
Returns:
|
42
|
-
np.ndarray: The transformed 4-by-4 matrix.
|
43
|
-
"""
|
44
|
-
if reverse:
|
45
|
-
return _B_nonnormalized_dagger @ U @ _B_nonnormalized
|
46
|
-
return _B_nonnormalized @ U @ _B_nonnormalized_dagger
|
47
|
-
|
48
|
-
|
49
|
-
def weyl_coordinates(U: np.ndarray) -> np.ndarray:
|
50
|
-
"""Computes the Weyl coordinates for a given two-qubit unitary matrix.
|
51
|
-
|
52
|
-
Args:
|
53
|
-
U (np.ndarray): Input two-qubit unitary.
|
54
|
-
|
55
|
-
Returns:
|
56
|
-
np.ndarray: Array of the 3 Weyl coordinates.
|
57
|
-
"""
|
58
|
-
import scipy.linalg as la
|
59
|
-
|
60
|
-
pi2 = np.pi / 2
|
61
|
-
pi4 = np.pi / 4
|
62
|
-
|
63
|
-
U = U / la.det(U) ** (0.25)
|
64
|
-
Up = transform_to_magic_basis(U, reverse=True)
|
65
|
-
# We only need the eigenvalues of `M2 = Up.T @ Up` here, not the full diagonalization.
|
66
|
-
D = la.eigvals(Up.T @ Up)
|
67
|
-
d = -np.angle(D) / 2
|
68
|
-
d[3] = -d[0] - d[1] - d[2]
|
69
|
-
cs = np.mod((d[:3] + d[3]) / 2, 2 * np.pi)
|
70
|
-
|
71
|
-
# Reorder the eigenvalues to get in the Weyl chamber
|
72
|
-
cstemp = np.mod(cs, pi2)
|
73
|
-
np.minimum(cstemp, pi2 - cstemp, cstemp)
|
74
|
-
order = np.argsort(cstemp)[[1, 2, 0]]
|
75
|
-
cs = cs[order]
|
76
|
-
d[:3] = d[order]
|
77
|
-
|
78
|
-
# Flip into Weyl chamber
|
79
|
-
if cs[0] > pi2:
|
80
|
-
cs[0] -= 3 * pi2
|
81
|
-
if cs[1] > pi2:
|
82
|
-
cs[1] -= 3 * pi2
|
83
|
-
conjs = 0
|
84
|
-
if cs[0] > pi4:
|
85
|
-
cs[0] = pi2 - cs[0]
|
86
|
-
conjs += 1
|
87
|
-
if cs[1] > pi4:
|
88
|
-
cs[1] = pi2 - cs[1]
|
89
|
-
conjs += 1
|
90
|
-
if cs[2] > pi2:
|
91
|
-
cs[2] -= 3 * pi2
|
92
|
-
if conjs == 1:
|
93
|
-
cs[2] = pi2 - cs[2]
|
94
|
-
if cs[2] > pi4:
|
95
|
-
cs[2] -= pi2
|
96
|
-
|
97
|
-
return cs[[1, 0, 2]]
|
@@ -1,132 +0,0 @@
|
|
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
|
-
"""A qubit state tracker for synthesizing operations with auxiliary qubits."""
|
14
|
-
|
15
|
-
from __future__ import annotations
|
16
|
-
from collections.abc import Iterable
|
17
|
-
from dataclasses import dataclass
|
18
|
-
|
19
|
-
|
20
|
-
@dataclass
|
21
|
-
class QubitTracker:
|
22
|
-
"""Track qubits (by global index) and their state.
|
23
|
-
|
24
|
-
The states are distinguished into clean (meaning in state :math:`|0\rangle`) or dirty (an
|
25
|
-
unknown state).
|
26
|
-
"""
|
27
|
-
|
28
|
-
# This could in future be extended to track different state types, if necessary.
|
29
|
-
# However, using sets of integers here is much faster than e.g. storing a dictionary with
|
30
|
-
# {index: state} entries.
|
31
|
-
qubits: tuple[int]
|
32
|
-
clean: set[int]
|
33
|
-
dirty: set[int]
|
34
|
-
|
35
|
-
def num_clean(self, active_qubits: Iterable[int] | None = None):
|
36
|
-
"""Return the number of clean qubits, not considering the active qubits."""
|
37
|
-
# this could be cached if getting the set length becomes a performance bottleneck
|
38
|
-
return len(self.clean.difference(active_qubits or set()))
|
39
|
-
|
40
|
-
def num_dirty(self, active_qubits: Iterable[int] | None = None):
|
41
|
-
"""Return the number of dirty qubits, not considering the active qubits."""
|
42
|
-
return len(self.dirty.difference(active_qubits or set()))
|
43
|
-
|
44
|
-
def borrow(self, num_qubits: int, active_qubits: Iterable[int] | None = None) -> list[int]:
|
45
|
-
"""Get ``num_qubits`` qubits, excluding ``active_qubits``."""
|
46
|
-
active_qubits = set(active_qubits or [])
|
47
|
-
available_qubits = [qubit for qubit in self.qubits if qubit not in active_qubits]
|
48
|
-
|
49
|
-
if num_qubits > (available := len(available_qubits)):
|
50
|
-
raise RuntimeError(f"Cannot borrow {num_qubits} qubits, only {available} available.")
|
51
|
-
|
52
|
-
# for now, prioritize returning clean qubits
|
53
|
-
available_clean = [qubit for qubit in available_qubits if qubit in self.clean]
|
54
|
-
available_dirty = [qubit for qubit in available_qubits if qubit in self.dirty]
|
55
|
-
|
56
|
-
borrowed = available_clean[:num_qubits]
|
57
|
-
return borrowed + available_dirty[: (num_qubits - len(borrowed))]
|
58
|
-
|
59
|
-
def used(self, qubits: Iterable[int], check: bool = True) -> None:
|
60
|
-
"""Set the state of ``qubits`` to used (i.e. False)."""
|
61
|
-
qubits = set(qubits)
|
62
|
-
|
63
|
-
if check:
|
64
|
-
if len(untracked := qubits.difference(self.qubits)) > 0:
|
65
|
-
raise ValueError(f"Setting state of untracked qubits: {untracked}. Tracker: {self}")
|
66
|
-
|
67
|
-
self.clean -= qubits
|
68
|
-
self.dirty |= qubits
|
69
|
-
|
70
|
-
def reset(self, qubits: Iterable[int], check: bool = True) -> None:
|
71
|
-
"""Set the state of ``qubits`` to 0 (i.e. True)."""
|
72
|
-
qubits = set(qubits)
|
73
|
-
|
74
|
-
if check:
|
75
|
-
if len(untracked := qubits.difference(self.qubits)) > 0:
|
76
|
-
raise ValueError(f"Setting state of untracked qubits: {untracked}. Tracker: {self}")
|
77
|
-
|
78
|
-
self.clean |= qubits
|
79
|
-
self.dirty -= qubits
|
80
|
-
|
81
|
-
def drop(self, qubits: Iterable[int], check: bool = True) -> None:
|
82
|
-
"""Drop qubits from the tracker, meaning that they are no longer available."""
|
83
|
-
qubits = set(qubits)
|
84
|
-
|
85
|
-
if check:
|
86
|
-
if len(untracked := qubits.difference(self.qubits)) > 0:
|
87
|
-
raise ValueError(f"Dropping untracked qubits: {untracked}. Tracker: {self}")
|
88
|
-
|
89
|
-
self.qubits = tuple(qubit for qubit in self.qubits if qubit not in qubits)
|
90
|
-
self.clean -= qubits
|
91
|
-
self.dirty -= qubits
|
92
|
-
|
93
|
-
def copy(
|
94
|
-
self, qubit_map: dict[int, int] | None = None, drop: Iterable[int] | None = None
|
95
|
-
) -> "QubitTracker":
|
96
|
-
"""Copy self.
|
97
|
-
|
98
|
-
Args:
|
99
|
-
qubit_map: If provided, apply the mapping ``{old_qubit: new_qubit}`` to
|
100
|
-
the qubits in the tracker. Only those old qubits in the mapping will be
|
101
|
-
part of the new one.
|
102
|
-
drop: If provided, drop these qubits in the copied tracker. This argument is ignored
|
103
|
-
if ``qubit_map`` is given, since the qubits can then just be dropped in the map.
|
104
|
-
"""
|
105
|
-
if qubit_map is None and drop is not None:
|
106
|
-
remaining_qubits = [qubit for qubit in self.qubits if qubit not in drop]
|
107
|
-
qubit_map = dict(zip(remaining_qubits, remaining_qubits))
|
108
|
-
|
109
|
-
if qubit_map is None:
|
110
|
-
clean = self.clean.copy()
|
111
|
-
dirty = self.dirty.copy()
|
112
|
-
qubits = self.qubits # tuple is immutable, no need to copy
|
113
|
-
else:
|
114
|
-
clean, dirty = set(), set()
|
115
|
-
for old_index, new_index in qubit_map.items():
|
116
|
-
if old_index in self.clean:
|
117
|
-
clean.add(new_index)
|
118
|
-
elif old_index in self.dirty:
|
119
|
-
dirty.add(new_index)
|
120
|
-
else:
|
121
|
-
raise ValueError(f"Unknown old qubit index: {old_index}. Tracker: {self}")
|
122
|
-
|
123
|
-
qubits = tuple(qubit_map.values())
|
124
|
-
|
125
|
-
return QubitTracker(qubits, clean=clean, dirty=dirty)
|
126
|
-
|
127
|
-
def __str__(self) -> str:
|
128
|
-
return (
|
129
|
-
f"QubitTracker({len(self.qubits)}, clean: {self.num_clean()}, dirty: {self.num_dirty()})"
|
130
|
-
+ f"\n\tclean: {self.clean}"
|
131
|
-
+ f"\n\tdirty: {self.dirty}"
|
132
|
-
)
|
File without changes
|
File without changes
|