qiskit 1.4.1__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0__cp39-abi3-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -1
- qiskit/__init__.py +3 -9
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/circuit/__init__.py +35 -10
- qiskit/circuit/{add_control.py → _add_control.py} +32 -12
- qiskit/circuit/_classical_resource_map.py +5 -3
- qiskit/circuit/barrier.py +3 -7
- qiskit/circuit/classical/expr/__init__.py +31 -3
- qiskit/circuit/classical/expr/constructors.py +236 -28
- qiskit/circuit/classical/expr/expr.py +104 -3
- qiskit/circuit/classical/expr/visitors.py +75 -0
- qiskit/circuit/classical/types/__init__.py +12 -8
- qiskit/circuit/classical/types/ordering.py +14 -7
- qiskit/circuit/classical/types/types.py +36 -0
- qiskit/circuit/commutation_checker.py +34 -7
- qiskit/circuit/controlflow/__init__.py +32 -1
- qiskit/circuit/controlflow/_builder_utils.py +9 -5
- qiskit/circuit/controlflow/box.py +163 -0
- qiskit/circuit/controlflow/break_loop.py +1 -1
- qiskit/circuit/controlflow/builder.py +139 -39
- qiskit/circuit/controlflow/continue_loop.py +1 -3
- qiskit/circuit/controlflow/control_flow.py +10 -0
- qiskit/circuit/controlflow/for_loop.py +2 -1
- qiskit/circuit/controlflow/if_else.py +3 -16
- qiskit/circuit/controlflow/switch_case.py +2 -8
- qiskit/circuit/controlflow/while_loop.py +2 -7
- qiskit/circuit/controlledgate.py +2 -4
- qiskit/circuit/delay.py +40 -11
- qiskit/circuit/duration.py +0 -15
- qiskit/circuit/gate.py +2 -4
- qiskit/circuit/instruction.py +2 -141
- qiskit/circuit/instructionset.py +7 -54
- qiskit/circuit/library/__init__.py +469 -154
- qiskit/circuit/library/arithmetic/__init__.py +16 -10
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
- qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
- qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
- qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +52 -16
- qiskit/circuit/library/data_preparation/initializer.py +1 -1
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
- qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
- qiskit/circuit/library/generalized_gates/gms.py +1 -1
- qiskit/circuit/library/generalized_gates/isometry.py +1 -1
- qiskit/circuit/library/generalized_gates/pauli.py +1 -2
- qiskit/circuit/library/generalized_gates/uc.py +97 -7
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
- qiskit/circuit/library/generalized_gates/unitary.py +4 -2
- qiskit/circuit/library/graph_state.py +1 -0
- qiskit/circuit/library/hamiltonian_gate.py +1 -1
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
- qiskit/circuit/library/n_local/n_local.py +1 -1
- qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
- qiskit/circuit/library/overlap.py +2 -2
- qiskit/circuit/library/pauli_evolution.py +39 -24
- qiskit/circuit/library/phase_oracle.py +130 -51
- qiskit/circuit/library/standard_gates/__init__.py +0 -1
- qiskit/circuit/library/standard_gates/dcx.py +3 -4
- qiskit/circuit/library/standard_gates/ecr.py +3 -4
- qiskit/circuit/library/standard_gates/global_phase.py +5 -6
- qiskit/circuit/library/standard_gates/h.py +4 -9
- qiskit/circuit/library/standard_gates/i.py +2 -2
- qiskit/circuit/library/standard_gates/iswap.py +3 -4
- qiskit/circuit/library/standard_gates/p.py +15 -34
- qiskit/circuit/library/standard_gates/r.py +7 -10
- qiskit/circuit/library/standard_gates/rx.py +5 -15
- qiskit/circuit/library/standard_gates/rxx.py +3 -6
- qiskit/circuit/library/standard_gates/ry.py +5 -17
- qiskit/circuit/library/standard_gates/ryy.py +3 -6
- qiskit/circuit/library/standard_gates/rz.py +5 -17
- qiskit/circuit/library/standard_gates/rzx.py +3 -6
- qiskit/circuit/library/standard_gates/rzz.py +3 -6
- qiskit/circuit/library/standard_gates/s.py +6 -15
- qiskit/circuit/library/standard_gates/swap.py +4 -11
- qiskit/circuit/library/standard_gates/sx.py +7 -12
- qiskit/circuit/library/standard_gates/t.py +6 -7
- qiskit/circuit/library/standard_gates/u.py +2 -10
- qiskit/circuit/library/standard_gates/u1.py +5 -16
- qiskit/circuit/library/standard_gates/u2.py +2 -6
- qiskit/circuit/library/standard_gates/u3.py +3 -11
- qiskit/circuit/library/standard_gates/x.py +14 -62
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/y.py +4 -9
- qiskit/circuit/library/standard_gates/z.py +5 -15
- qiskit/circuit/measure.py +11 -2
- qiskit/circuit/parameterexpression.py +11 -0
- qiskit/circuit/quantumcircuit.py +890 -564
- qiskit/circuit/random/utils.py +12 -6
- qiskit/circuit/reset.py +5 -2
- qiskit/circuit/singleton.py +5 -11
- qiskit/circuit/store.py +0 -8
- qiskit/circuit/tools/pi_check.py +3 -0
- qiskit/compiler/__init__.py +1 -7
- qiskit/compiler/transpiler.py +38 -196
- qiskit/converters/circuit_to_dag.py +6 -4
- qiskit/converters/circuit_to_dagdependency.py +0 -2
- qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
- qiskit/converters/circuit_to_gate.py +1 -1
- qiskit/converters/circuit_to_instruction.py +16 -29
- qiskit/converters/dag_to_circuit.py +7 -8
- qiskit/converters/dag_to_dagdependency.py +0 -1
- qiskit/converters/dag_to_dagdependency_v2.py +0 -1
- qiskit/converters/dagdependency_to_circuit.py +0 -6
- qiskit/converters/dagdependency_to_dag.py +0 -6
- qiskit/dagcircuit/collect_blocks.py +32 -20
- qiskit/dagcircuit/dagdependency.py +3 -37
- qiskit/dagcircuit/dagdependency_v2.py +5 -82
- qiskit/dagcircuit/dagnode.py +14 -2
- qiskit/passmanager/__init__.py +24 -6
- qiskit/passmanager/passmanager.py +26 -24
- qiskit/primitives/__init__.py +44 -35
- qiskit/primitives/backend_estimator_v2.py +102 -23
- qiskit/primitives/backend_sampler_v2.py +5 -20
- qiskit/primitives/base/__init__.py +4 -4
- qiskit/primitives/base/base_estimator.py +77 -82
- qiskit/primitives/base/base_primitive_job.py +2 -2
- qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
- qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
- qiskit/primitives/base/base_sampler.py +52 -60
- qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
- qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
- qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
- qiskit/primitives/containers/bindings_array.py +3 -1
- qiskit/primitives/containers/bit_array.py +23 -0
- qiskit/primitives/containers/data_bin.py +3 -1
- qiskit/primitives/containers/observables_array.py +19 -2
- qiskit/primitives/statevector_sampler.py +6 -8
- qiskit/primitives/utils.py +14 -189
- qiskit/providers/__init__.py +4 -130
- qiskit/providers/backend.py +11 -314
- qiskit/providers/basic_provider/__init__.py +3 -1
- qiskit/providers/basic_provider/basic_provider.py +29 -9
- qiskit/providers/basic_provider/basic_simulator.py +158 -298
- qiskit/providers/exceptions.py +0 -33
- qiskit/providers/fake_provider/__init__.py +0 -37
- qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
- qiskit/qasm2/__init__.py +21 -6
- qiskit/qasm2/export.py +2 -10
- qiskit/qasm2/parse.py +11 -25
- qiskit/qasm3/__init__.py +5 -1
- qiskit/qasm3/ast.py +44 -0
- qiskit/qasm3/exporter.py +65 -27
- qiskit/qasm3/printer.py +35 -4
- qiskit/qpy/__init__.py +162 -19
- qiskit/qpy/binary_io/__init__.py +0 -1
- qiskit/qpy/binary_io/circuits.py +96 -116
- qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
- qiskit/qpy/binary_io/schedules.py +61 -388
- qiskit/qpy/binary_io/value.py +159 -33
- qiskit/qpy/common.py +10 -7
- qiskit/qpy/formats.py +41 -0
- qiskit/qpy/interface.py +29 -62
- qiskit/qpy/type_keys.py +58 -221
- qiskit/quantum_info/analysis/distance.py +3 -1
- qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
- qiskit/quantum_info/operators/operator.py +6 -2
- qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
- qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
- qiskit/quantum_info/states/densitymatrix.py +16 -6
- qiskit/quantum_info/states/stabilizerstate.py +35 -4
- qiskit/quantum_info/states/statevector.py +16 -6
- qiskit/result/__init__.py +5 -17
- qiskit/result/models.py +18 -11
- qiskit/result/result.py +38 -134
- qiskit/result/sampled_expval.py +1 -2
- qiskit/result/utils.py +3 -4
- qiskit/synthesis/__init__.py +21 -1
- qiskit/synthesis/arithmetic/__init__.py +3 -1
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
- qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
- qiskit/synthesis/evolution/lie_trotter.py +10 -7
- qiskit/synthesis/evolution/product_formula.py +44 -35
- qiskit/synthesis/evolution/qdrift.py +17 -24
- qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
- qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
- qiskit/synthesis/multi_controlled/__init__.py +1 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
- qiskit/synthesis/two_qubit/__init__.py +1 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
- qiskit/transpiler/__init__.py +32 -232
- qiskit/transpiler/basepasses.py +20 -51
- qiskit/transpiler/layout.py +1 -1
- qiskit/transpiler/passes/__init__.py +4 -40
- qiskit/transpiler/passes/basis/basis_translator.py +5 -4
- qiskit/transpiler/passes/basis/decompose.py +1 -15
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
- qiskit/transpiler/passes/layout/apply_layout.py +4 -0
- qiskit/transpiler/passes/layout/dense_layout.py +2 -39
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +3 -4
- qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
- qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
- qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
- qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
- qiskit/transpiler/passes/optimization/__init__.py +2 -3
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
- qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
- qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +3 -2
- qiskit/transpiler/passes/routing/__init__.py +0 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
- qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
- qiskit/transpiler/passes/scheduling/__init__.py +1 -7
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +32 -4
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +134 -62
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
- qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
- qiskit/transpiler/passes/synthesis/plugin.py +4 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
- qiskit/transpiler/passes/utils/__init__.py +0 -1
- qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
- qiskit/transpiler/passes/utils/control_flow.py +2 -6
- qiskit/transpiler/passes/utils/gate_direction.py +7 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
- qiskit/transpiler/passmanager.py +13 -0
- qiskit/transpiler/passmanager_config.py +5 -81
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
- qiskit/transpiler/preset_passmanagers/common.py +140 -167
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +107 -322
- qiskit/transpiler/preset_passmanagers/level0.py +2 -11
- qiskit/transpiler/preset_passmanagers/level1.py +2 -14
- qiskit/transpiler/preset_passmanagers/level2.py +2 -12
- qiskit/transpiler/preset_passmanagers/level3.py +2 -11
- qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
- qiskit/transpiler/target.py +78 -524
- qiskit/user_config.py +8 -4
- qiskit/utils/__init__.py +13 -12
- qiskit/utils/deprecation.py +4 -112
- qiskit/utils/optionals.py +11 -4
- qiskit/utils/parallel.py +214 -87
- qiskit/utils/units.py +4 -1
- qiskit/visualization/__init__.py +3 -7
- qiskit/visualization/array.py +4 -1
- qiskit/visualization/bloch.py +1 -1
- qiskit/visualization/circuit/_utils.py +19 -19
- qiskit/visualization/circuit/circuit_visualization.py +11 -4
- qiskit/visualization/circuit/matplotlib.py +13 -23
- qiskit/visualization/circuit/text.py +7 -3
- qiskit/visualization/counts_visualization.py +4 -0
- qiskit/visualization/dag_visualization.py +2 -1
- qiskit/visualization/gate_map.py +39 -154
- qiskit/visualization/library.py +4 -1
- qiskit/visualization/pass_manager_visualization.py +6 -2
- qiskit/visualization/state_visualization.py +19 -2
- qiskit/visualization/timeline/core.py +19 -13
- qiskit/visualization/timeline/interface.py +19 -18
- qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/RECORD +303 -449
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/WHEEL +2 -1
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
- qiskit/assembler/__init__.py +0 -42
- qiskit/assembler/assemble_circuits.py +0 -451
- qiskit/assembler/assemble_schedules.py +0 -367
- qiskit/assembler/disassemble.py +0 -310
- qiskit/assembler/run_config.py +0 -77
- qiskit/circuit/bit.py +0 -106
- qiskit/circuit/classicalfunction/__init__.py +0 -152
- qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
- qiskit/circuit/classicalfunction/classical_element.py +0 -54
- qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
- qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
- qiskit/circuit/classicalfunction/exceptions.py +0 -41
- qiskit/circuit/classicalfunction/types.py +0 -18
- qiskit/circuit/classicalfunction/utils.py +0 -91
- qiskit/circuit/classicalregister.py +0 -57
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
- qiskit/circuit/quantumregister.py +0 -75
- qiskit/circuit/register.py +0 -246
- qiskit/compiler/assembler.py +0 -689
- qiskit/compiler/scheduler.py +0 -109
- qiskit/compiler/sequencer.py +0 -71
- qiskit/primitives/backend_estimator.py +0 -486
- qiskit/primitives/backend_sampler.py +0 -222
- qiskit/primitives/estimator.py +0 -172
- qiskit/primitives/sampler.py +0 -162
- qiskit/providers/backend_compat.py +0 -507
- qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
- qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
- qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
- qiskit/providers/fake_provider/fake_1q.py +0 -91
- qiskit/providers/fake_provider/fake_backend.py +0 -165
- qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
- qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
- qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
- qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
- qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
- qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
- qiskit/providers/models/__init__.py +0 -89
- qiskit/providers/models/backendconfiguration.py +0 -1040
- qiskit/providers/models/backendproperties.py +0 -535
- qiskit/providers/models/backendstatus.py +0 -104
- qiskit/providers/models/jobstatus.py +0 -77
- qiskit/providers/models/pulsedefaults.py +0 -305
- qiskit/providers/provider.py +0 -95
- qiskit/pulse/__init__.py +0 -158
- qiskit/pulse/builder.py +0 -2262
- qiskit/pulse/calibration_entries.py +0 -381
- qiskit/pulse/channels.py +0 -227
- qiskit/pulse/configuration.py +0 -245
- qiskit/pulse/exceptions.py +0 -45
- qiskit/pulse/filters.py +0 -309
- qiskit/pulse/instruction_schedule_map.py +0 -424
- qiskit/pulse/instructions/__init__.py +0 -67
- qiskit/pulse/instructions/acquire.py +0 -150
- qiskit/pulse/instructions/delay.py +0 -71
- qiskit/pulse/instructions/directives.py +0 -154
- qiskit/pulse/instructions/frequency.py +0 -135
- qiskit/pulse/instructions/instruction.py +0 -270
- qiskit/pulse/instructions/phase.py +0 -152
- qiskit/pulse/instructions/play.py +0 -99
- qiskit/pulse/instructions/reference.py +0 -100
- qiskit/pulse/instructions/snapshot.py +0 -82
- qiskit/pulse/library/__init__.py +0 -97
- qiskit/pulse/library/continuous.py +0 -430
- qiskit/pulse/library/pulse.py +0 -148
- qiskit/pulse/library/samplers/__init__.py +0 -15
- qiskit/pulse/library/samplers/decorators.py +0 -295
- qiskit/pulse/library/samplers/strategies.py +0 -71
- qiskit/pulse/library/symbolic_pulses.py +0 -1989
- qiskit/pulse/library/waveform.py +0 -136
- qiskit/pulse/macros.py +0 -262
- qiskit/pulse/parameter_manager.py +0 -445
- qiskit/pulse/parser.py +0 -314
- qiskit/pulse/reference_manager.py +0 -58
- qiskit/pulse/schedule.py +0 -1854
- qiskit/pulse/transforms/__init__.py +0 -106
- qiskit/pulse/transforms/alignments.py +0 -406
- qiskit/pulse/transforms/base_transforms.py +0 -71
- qiskit/pulse/transforms/canonicalization.py +0 -498
- qiskit/pulse/transforms/dag.py +0 -122
- qiskit/pulse/utils.py +0 -149
- qiskit/qobj/__init__.py +0 -75
- qiskit/qobj/common.py +0 -81
- qiskit/qobj/converters/__init__.py +0 -18
- qiskit/qobj/converters/lo_config.py +0 -177
- qiskit/qobj/converters/pulse_instruction.py +0 -897
- qiskit/qobj/pulse_qobj.py +0 -709
- qiskit/qobj/qasm_qobj.py +0 -708
- qiskit/qobj/utils.py +0 -46
- qiskit/result/mitigation/base_readout_mitigator.py +0 -79
- qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
- qiskit/result/mitigation/local_readout_mitigator.py +0 -328
- qiskit/result/mitigation/utils.py +0 -217
- qiskit/scheduler/__init__.py +0 -40
- qiskit/scheduler/config.py +0 -37
- qiskit/scheduler/lowering.py +0 -187
- qiskit/scheduler/methods/__init__.py +0 -15
- qiskit/scheduler/methods/basic.py +0 -140
- qiskit/scheduler/schedule_circuit.py +0 -69
- qiskit/scheduler/sequence.py +0 -104
- qiskit/transpiler/passes/calibration/__init__.py +0 -17
- qiskit/transpiler/passes/calibration/base_builder.py +0 -79
- qiskit/transpiler/passes/calibration/builders.py +0 -20
- qiskit/transpiler/passes/calibration/exceptions.py +0 -22
- qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
- qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
- qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
- qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
- qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
- qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
- qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
- qiskit/transpiler/passes/scheduling/alap.py +0 -153
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
- qiskit/transpiler/passes/scheduling/asap.py +0 -175
- qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
- qiskit/utils/deprecate_pulse.py +0 -119
- qiskit/utils/multiprocessing.py +0 -56
- qiskit/visualization/pulse_v2/__init__.py +0 -21
- qiskit/visualization/pulse_v2/core.py +0 -901
- qiskit/visualization/pulse_v2/device_info.py +0 -173
- qiskit/visualization/pulse_v2/drawings.py +0 -253
- qiskit/visualization/pulse_v2/events.py +0 -254
- qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
- qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
- qiskit/visualization/pulse_v2/generators/chart.py +0 -208
- qiskit/visualization/pulse_v2/generators/frame.py +0 -436
- qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
- qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
- qiskit/visualization/pulse_v2/interface.py +0 -459
- qiskit/visualization/pulse_v2/layouts.py +0 -387
- qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
- qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
- qiskit/visualization/pulse_v2/stylesheet.py +0 -312
- qiskit/visualization/pulse_v2/types.py +0 -242
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/top_level.txt +0 -0
qiskit/assembler/run_config.py
DELETED
@@ -1,77 +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
|
-
|
13
|
-
"""Models for RunConfig and its related components."""
|
14
|
-
|
15
|
-
from types import SimpleNamespace
|
16
|
-
|
17
|
-
|
18
|
-
class RunConfig(SimpleNamespace):
|
19
|
-
"""Class for Run Configuration.
|
20
|
-
|
21
|
-
Attributes:
|
22
|
-
shots (int): the number of shots
|
23
|
-
seed_simulator (int): the seed to use in the simulator
|
24
|
-
memory (bool): whether to request memory from backend (per-shot
|
25
|
-
readouts)
|
26
|
-
parameter_binds (list[dict]): List of parameter bindings
|
27
|
-
"""
|
28
|
-
|
29
|
-
def __init__(
|
30
|
-
self,
|
31
|
-
shots=None,
|
32
|
-
seed_simulator=None,
|
33
|
-
memory=None,
|
34
|
-
parameter_binds=None,
|
35
|
-
**kwargs,
|
36
|
-
):
|
37
|
-
"""Initialize a RunConfig object
|
38
|
-
|
39
|
-
Args:
|
40
|
-
shots (int): the number of shots
|
41
|
-
seed_simulator (int): the seed to use in the simulator
|
42
|
-
memory (bool): whether to request memory from backend
|
43
|
-
(per-shot readouts)
|
44
|
-
parameter_binds (list[dict]): List of parameter bindings
|
45
|
-
**kwargs: optional fields
|
46
|
-
"""
|
47
|
-
if shots is not None:
|
48
|
-
self.shots = shots
|
49
|
-
if seed_simulator is not None:
|
50
|
-
self.seed_simulator = seed_simulator
|
51
|
-
if memory is not None:
|
52
|
-
self.memory = memory
|
53
|
-
if parameter_binds is not None:
|
54
|
-
self.parameter_binds = parameter_binds
|
55
|
-
self.__dict__.update(kwargs)
|
56
|
-
|
57
|
-
@classmethod
|
58
|
-
def from_dict(cls, data):
|
59
|
-
"""Create a new RunConfig object from a dictionary.
|
60
|
-
|
61
|
-
Args:
|
62
|
-
data (dict): A dictionary representing the RunConfig to create.
|
63
|
-
It will be in the same format as output by
|
64
|
-
:meth:`to_dict`.
|
65
|
-
|
66
|
-
Returns:
|
67
|
-
RunConfig: The RunConfig from the input dictionary.
|
68
|
-
"""
|
69
|
-
return cls(**data)
|
70
|
-
|
71
|
-
def to_dict(self):
|
72
|
-
"""Return a dictionary format representation of the RunConfig
|
73
|
-
|
74
|
-
Returns:
|
75
|
-
dict: The dictionary form of the RunConfig.
|
76
|
-
"""
|
77
|
-
return self.__dict__
|
qiskit/circuit/bit.py
DELETED
@@ -1,106 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 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
|
-
Quantum bit and Classical bit objects.
|
15
|
-
"""
|
16
|
-
import copy
|
17
|
-
import warnings
|
18
|
-
|
19
|
-
from qiskit.circuit.exceptions import CircuitError
|
20
|
-
|
21
|
-
|
22
|
-
class Bit:
|
23
|
-
"""Implement a generic bit.
|
24
|
-
|
25
|
-
.. note::
|
26
|
-
This class should not be instantiated directly. This is just a superclass
|
27
|
-
for :class:`~.Clbit` and :class:`~.circuit.Qubit`.
|
28
|
-
"""
|
29
|
-
|
30
|
-
__slots__ = {"_register", "_index", "_hash", "_repr"}
|
31
|
-
|
32
|
-
def __init__(self, register=None, index=None):
|
33
|
-
"""Create a new generic bit."""
|
34
|
-
if (register, index) == (None, None):
|
35
|
-
self._register = None
|
36
|
-
self._index = None
|
37
|
-
# To sidestep the overridden Bit.__hash__ and use the default hash
|
38
|
-
# algorithm (only new-style Bits), call default object hash method.
|
39
|
-
self._hash = object.__hash__(self)
|
40
|
-
else:
|
41
|
-
try:
|
42
|
-
index = int(index)
|
43
|
-
except Exception as ex:
|
44
|
-
raise CircuitError(
|
45
|
-
f"index needs to be castable to an int: type {type(index)} was provided"
|
46
|
-
) from ex
|
47
|
-
|
48
|
-
if index < 0:
|
49
|
-
index += register.size
|
50
|
-
|
51
|
-
if index >= register.size:
|
52
|
-
raise CircuitError(
|
53
|
-
f"index must be under the size of the register: {index} was provided"
|
54
|
-
)
|
55
|
-
|
56
|
-
self._register = register
|
57
|
-
self._index = index
|
58
|
-
self._hash = hash((self._register, self._index))
|
59
|
-
self._repr = f"{self.__class__.__name__}({self._register}, {self._index})"
|
60
|
-
|
61
|
-
def __init_subclass__(cls):
|
62
|
-
# In Qiskit 2.0, `Bit` and `Register` will move to Rust space, and the allowable types of
|
63
|
-
# them will be fixed, similar to if the classes had been marked as `final`.
|
64
|
-
if cls.__module__.split(".", 2)[0] != __name__.split(".", 2)[0]:
|
65
|
-
warnings.warn(
|
66
|
-
"subclassing 'Bit' is not supported, and may not be possible in Qiskit 2.0",
|
67
|
-
category=DeprecationWarning,
|
68
|
-
stacklevel=2,
|
69
|
-
)
|
70
|
-
return cls
|
71
|
-
|
72
|
-
def __repr__(self):
|
73
|
-
"""Return the official string representing the bit."""
|
74
|
-
if (self._register, self._index) == (None, None):
|
75
|
-
# Similar to __hash__, use default repr method for new-style Bits.
|
76
|
-
return object.__repr__(self)
|
77
|
-
return self._repr
|
78
|
-
|
79
|
-
def __hash__(self):
|
80
|
-
return self._hash
|
81
|
-
|
82
|
-
def __eq__(self, other):
|
83
|
-
if (self._register, self._index) == (None, None):
|
84
|
-
return other is self
|
85
|
-
|
86
|
-
try:
|
87
|
-
return self._repr == other._repr
|
88
|
-
except AttributeError:
|
89
|
-
return False
|
90
|
-
|
91
|
-
def __copy__(self):
|
92
|
-
# Bits are immutable.
|
93
|
-
return self
|
94
|
-
|
95
|
-
def __deepcopy__(self, memo=None):
|
96
|
-
if (self._register, self._index) == (None, None):
|
97
|
-
return self
|
98
|
-
|
99
|
-
# Old-style bits need special handling for now, since some code seems
|
100
|
-
# to rely on their registers getting deep-copied.
|
101
|
-
bit = type(self).__new__(type(self))
|
102
|
-
bit._register = copy.deepcopy(self._register, memo)
|
103
|
-
bit._index = self._index
|
104
|
-
bit._hash = self._hash
|
105
|
-
bit._repr = self._repr
|
106
|
-
return bit
|
@@ -1,152 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 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
|
-
"""
|
14
|
-
====================================================================
|
15
|
-
ClassicalFunction compiler (:mod:`qiskit.circuit.classicalfunction`)
|
16
|
-
====================================================================
|
17
|
-
|
18
|
-
.. currentmodule:: qiskit.circuit.classicalfunction
|
19
|
-
|
20
|
-
Overview
|
21
|
-
========
|
22
|
-
|
23
|
-
.. warning::
|
24
|
-
|
25
|
-
This module is deprecated as of Qiskit 1.4.0. It will be removed in the Qiskit 2.0 release.
|
26
|
-
|
27
|
-
The classical function compiler provides the necessary tools to map a classical
|
28
|
-
potentially irreversible functions into quantum circuits. Below is a simple example of
|
29
|
-
how to synthesize a simple boolean function defined using Python into a
|
30
|
-
QuantumCircuit:
|
31
|
-
|
32
|
-
.. code-block::
|
33
|
-
|
34
|
-
from qiskit.circuit.classicalfunction import classical_function
|
35
|
-
from qiskit.circuit.classicalfunction.types import Int1
|
36
|
-
|
37
|
-
@classical_function
|
38
|
-
def grover_oracle(a: Int1, b: Int1, c: Int1, d: Int1) -> Int1:
|
39
|
-
return (not a and b and not c and d)
|
40
|
-
|
41
|
-
quantum_circuit = grover_oracle.synth(registerless=False)
|
42
|
-
quantum_circuit.draw('text')
|
43
|
-
|
44
|
-
a: ──o──
|
45
|
-
│
|
46
|
-
b: ──■──
|
47
|
-
│
|
48
|
-
c: ──o──
|
49
|
-
│
|
50
|
-
d: ──■──
|
51
|
-
┌─┴─┐
|
52
|
-
return: ┤ X ├
|
53
|
-
└───┘
|
54
|
-
|
55
|
-
Following Qiskit's little-endian bit ordering convention, the left-most bit (``a``) is the most
|
56
|
-
significant bit and the right-most bit (``d``) is the least significant bit.
|
57
|
-
|
58
|
-
.. warning::
|
59
|
-
|
60
|
-
The functionality of `qiskit.circuit.classicalfunction` requires `tweedledum`,
|
61
|
-
which isn't available on all platforms (up to Python version 3.11).
|
62
|
-
See `tweedledum installation guide
|
63
|
-
<https://github.com/boschmitt/tweedledum/tree/master?tab=readme-ov-file#installation>`_
|
64
|
-
for more details.
|
65
|
-
|
66
|
-
Supplementary Information
|
67
|
-
=========================
|
68
|
-
|
69
|
-
Tweedledum
|
70
|
-
----------
|
71
|
-
|
72
|
-
Tweedledum is a C++-17 header-only library that implements a large set of
|
73
|
-
reversible (and quantum) synthesis, optimization, and mapping algorithms.
|
74
|
-
The classical function compiler relies on it and its dependencies to both represent logic
|
75
|
-
networks and synthesize them into quantum circuits.
|
76
|
-
|
77
|
-
ClassicalFunction data types
|
78
|
-
----------------------------
|
79
|
-
|
80
|
-
At the moment, the only type supported by the classical_function compilers is
|
81
|
-
``qiskit.circuit.classicalfunction.types.Int1``. The classical function function
|
82
|
-
to parse *must* include type hints (just ``Int1`` for now). The resulting gate
|
83
|
-
will be a gate in the size of the sum of all the parameters and the return.
|
84
|
-
|
85
|
-
The type ``Int1`` means the classical function will only operate at bit level.
|
86
|
-
|
87
|
-
|
88
|
-
ClassicalFunction compiler API
|
89
|
-
==============================
|
90
|
-
|
91
|
-
classical_function
|
92
|
-
------------------
|
93
|
-
|
94
|
-
Decorator for a classical function that returns a `ClassicalFunction` object.
|
95
|
-
|
96
|
-
.. autofunction:: classical_function
|
97
|
-
|
98
|
-
ClassicalFunction
|
99
|
-
-----------------
|
100
|
-
|
101
|
-
.. autosummary::
|
102
|
-
:toctree: ../stubs/
|
103
|
-
|
104
|
-
ClassicalFunction
|
105
|
-
BooleanExpression
|
106
|
-
|
107
|
-
Exceptions
|
108
|
-
----------
|
109
|
-
|
110
|
-
.. autosummary::
|
111
|
-
:toctree: ../stubs/
|
112
|
-
|
113
|
-
ClassicalFunctionCompilerTypeError
|
114
|
-
ClassicalFunctionParseError
|
115
|
-
ClassicalFunctionCompilerTypeError
|
116
|
-
|
117
|
-
"""
|
118
|
-
from qiskit.utils.deprecation import deprecate_func
|
119
|
-
from .classicalfunction import ClassicalFunction
|
120
|
-
from .exceptions import (
|
121
|
-
ClassicalFunctionParseError,
|
122
|
-
ClassicalFunctionCompilerError,
|
123
|
-
ClassicalFunctionCompilerTypeError,
|
124
|
-
)
|
125
|
-
from .boolean_expression import BooleanExpression
|
126
|
-
|
127
|
-
|
128
|
-
@deprecate_func(
|
129
|
-
since="1.4",
|
130
|
-
removal_timeline="in Qiskit 2.0",
|
131
|
-
additional_msg="Use `PhaseOracle` instead, which can be turned into a "
|
132
|
-
"bit-flip oracle by applying Hadamard gates on the target "
|
133
|
-
"qubit before and after the instruction, and conditioning."
|
134
|
-
"the instruction on the target qubit.",
|
135
|
-
)
|
136
|
-
def classical_function(func):
|
137
|
-
"""
|
138
|
-
Parses and type checks the callable ``func`` to compile it into an ``ClassicalFunction``
|
139
|
-
that can be synthesized into a ``QuantumCircuit``.
|
140
|
-
|
141
|
-
Args:
|
142
|
-
func (callable): A callable (with type hints) to compile into an ``ClassicalFunction``.
|
143
|
-
|
144
|
-
Returns:
|
145
|
-
ClassicalFunction: An object that can synthesis into a QuantumCircuit (via ``synth()``
|
146
|
-
method).
|
147
|
-
"""
|
148
|
-
import inspect
|
149
|
-
from textwrap import dedent
|
150
|
-
|
151
|
-
source = dedent(inspect.getsource(func))
|
152
|
-
return ClassicalFunction(source, name=func.__name__)
|
@@ -1,138 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2021.
|
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 quantum oracle constructed from a logical expression or a string in the DIMACS format."""
|
14
|
-
|
15
|
-
from os.path import basename, isfile
|
16
|
-
from typing import Callable, Optional
|
17
|
-
|
18
|
-
from qiskit.utils.deprecation import deprecate_func
|
19
|
-
from qiskit.circuit import QuantumCircuit
|
20
|
-
from qiskit.utils.optionals import HAS_TWEEDLEDUM
|
21
|
-
from .classical_element import ClassicalElement
|
22
|
-
|
23
|
-
|
24
|
-
class BooleanExpression(ClassicalElement):
|
25
|
-
"""The Boolean Expression gate."""
|
26
|
-
|
27
|
-
@HAS_TWEEDLEDUM.require_in_instance
|
28
|
-
@deprecate_func(
|
29
|
-
since="1.4",
|
30
|
-
removal_timeline="in Qiskit 2.0",
|
31
|
-
additional_msg="Use `PhaseOracle` instead, which can be turned into a "
|
32
|
-
"bit-flip oracle by applying Hadamard gates on the target "
|
33
|
-
"qubit before and after the instruction, and conditioning."
|
34
|
-
"the instruction on the target qubit.",
|
35
|
-
)
|
36
|
-
def __init__(self, expression: str, name: str = None, var_order: list = None) -> None:
|
37
|
-
"""
|
38
|
-
Args:
|
39
|
-
expression (str): The logical expression string.
|
40
|
-
name (str): Optional. Instruction gate name. Otherwise part of the expression is
|
41
|
-
going to be used.
|
42
|
-
var_order(list): A list with the order in which variables will be created.
|
43
|
-
(default: by appearance)
|
44
|
-
"""
|
45
|
-
|
46
|
-
from tweedledum import BoolFunction # pylint: disable=import-error
|
47
|
-
|
48
|
-
self._tweedledum_bool_expression = BoolFunction.from_expression(
|
49
|
-
expression, var_order=var_order
|
50
|
-
)
|
51
|
-
|
52
|
-
short_expr_for_name = (expression[:10] + "...") if len(expression) > 13 else expression
|
53
|
-
num_qubits = (
|
54
|
-
self._tweedledum_bool_expression.num_outputs()
|
55
|
-
+ self._tweedledum_bool_expression.num_inputs()
|
56
|
-
)
|
57
|
-
super().__init__(name or short_expr_for_name, num_qubits=num_qubits, params=[])
|
58
|
-
|
59
|
-
def simulate(self, bitstring: str) -> bool:
|
60
|
-
"""Evaluate the expression on a bitstring.
|
61
|
-
|
62
|
-
This evaluation is done classically.
|
63
|
-
|
64
|
-
Args:
|
65
|
-
bitstring: The bitstring for which to evaluate.
|
66
|
-
|
67
|
-
Returns:
|
68
|
-
bool: result of the evaluation.
|
69
|
-
"""
|
70
|
-
from tweedledum import BitVec # pylint: disable=import-error
|
71
|
-
|
72
|
-
bits = []
|
73
|
-
for bit in bitstring:
|
74
|
-
bits.append(BitVec(1, bit))
|
75
|
-
return bool(self._tweedledum_bool_expression.simulate(*bits))
|
76
|
-
|
77
|
-
def synth(
|
78
|
-
self,
|
79
|
-
registerless: bool = True,
|
80
|
-
synthesizer: Optional[Callable[["BooleanExpression"], QuantumCircuit]] = None,
|
81
|
-
):
|
82
|
-
"""Synthesis the logic network into a :class:`~qiskit.circuit.QuantumCircuit`.
|
83
|
-
|
84
|
-
Args:
|
85
|
-
registerless: Default ``True``. If ``False`` uses the parameter names
|
86
|
-
to create registers with those names. Otherwise, creates a circuit with a flat
|
87
|
-
quantum register.
|
88
|
-
synthesizer: A callable that takes self and returns a Tweedledum
|
89
|
-
circuit.
|
90
|
-
Returns:
|
91
|
-
QuantumCircuit: A circuit implementing the logic network.
|
92
|
-
"""
|
93
|
-
if registerless:
|
94
|
-
qregs = None
|
95
|
-
else:
|
96
|
-
qregs = None # TODO: Probably from self._tweedledum_bool_expression._signature
|
97
|
-
|
98
|
-
if synthesizer is None:
|
99
|
-
from .utils import tweedledum2qiskit # Avoid an import cycle
|
100
|
-
from tweedledum.synthesis import pkrm_synth # pylint: disable=import-error
|
101
|
-
|
102
|
-
truth_table = self._tweedledum_bool_expression.truth_table(output_bit=0)
|
103
|
-
return tweedledum2qiskit(pkrm_synth(truth_table), name=self.name, qregs=qregs)
|
104
|
-
return synthesizer(self)
|
105
|
-
|
106
|
-
def _define(self):
|
107
|
-
"""The definition of the boolean expression is its synthesis"""
|
108
|
-
self.definition = self.synth()
|
109
|
-
|
110
|
-
@classmethod
|
111
|
-
def from_dimacs_file(cls, filename: str):
|
112
|
-
"""Create a BooleanExpression from the string in the DIMACS format.
|
113
|
-
Args:
|
114
|
-
filename: A file in DIMACS format.
|
115
|
-
|
116
|
-
Returns:
|
117
|
-
BooleanExpression: A gate for the input string
|
118
|
-
|
119
|
-
Raises:
|
120
|
-
FileNotFoundError: If filename is not found.
|
121
|
-
"""
|
122
|
-
HAS_TWEEDLEDUM.require_now("BooleanExpression")
|
123
|
-
|
124
|
-
from tweedledum import BoolFunction # pylint: disable=import-error
|
125
|
-
|
126
|
-
expr_obj = cls.__new__(cls)
|
127
|
-
if not isfile(filename):
|
128
|
-
raise FileNotFoundError(f"The file {filename} does not exists.")
|
129
|
-
expr_obj._tweedledum_bool_expression = BoolFunction.from_dimacs_file(filename)
|
130
|
-
|
131
|
-
num_qubits = (
|
132
|
-
expr_obj._tweedledum_bool_expression.num_inputs()
|
133
|
-
+ expr_obj._tweedledum_bool_expression.num_outputs()
|
134
|
-
)
|
135
|
-
super(BooleanExpression, expr_obj).__init__(
|
136
|
-
name=basename(filename), num_qubits=num_qubits, params=[]
|
137
|
-
)
|
138
|
-
return expr_obj
|
@@ -1,54 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2021.
|
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 quantum oracle constructed from a logical expression or a string in the DIMACS format."""
|
14
|
-
|
15
|
-
from abc import ABCMeta, abstractmethod
|
16
|
-
|
17
|
-
from qiskit.circuit import Gate
|
18
|
-
|
19
|
-
|
20
|
-
class ClassicalElement(Gate, metaclass=ABCMeta):
|
21
|
-
"""The classical element gate."""
|
22
|
-
|
23
|
-
@abstractmethod
|
24
|
-
def simulate(self, bitstring: str) -> bool:
|
25
|
-
"""Evaluate the expression on a bitstring.
|
26
|
-
|
27
|
-
This evaluation is done classically.
|
28
|
-
|
29
|
-
Args:
|
30
|
-
bitstring: The bitstring for which to evaluate.
|
31
|
-
|
32
|
-
Returns:
|
33
|
-
bool: result of the evaluation.
|
34
|
-
"""
|
35
|
-
pass
|
36
|
-
|
37
|
-
@abstractmethod
|
38
|
-
def synth(self, registerless=True, synthesizer=None):
|
39
|
-
"""Synthesis the logic network into a :class:`~qiskit.circuit.QuantumCircuit`.
|
40
|
-
|
41
|
-
Args:
|
42
|
-
registerless (bool): Default ``True``. If ``False`` uses the parameter names
|
43
|
-
to create registers with those names. Otherwise, creates a circuit with a flat
|
44
|
-
quantum register.
|
45
|
-
synthesizer (callable): A callable that takes a Logic Network and returns a Tweedledum
|
46
|
-
circuit.
|
47
|
-
Returns:
|
48
|
-
QuantumCircuit: A circuit implementing the logic network.
|
49
|
-
"""
|
50
|
-
pass
|
51
|
-
|
52
|
-
def _define(self):
|
53
|
-
"""The definition of the boolean expression is its synthesis"""
|
54
|
-
self.definition = self.synth()
|
@@ -1,155 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 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
|
-
"""Node visitor as defined in https://docs.python.org/3/library/ast.html#ast.NodeVisitor
|
14
|
-
This module is used internally by ``qiskit.transpiler.classicalfunction.ClassicalFunction``.
|
15
|
-
"""
|
16
|
-
|
17
|
-
import ast
|
18
|
-
import _ast
|
19
|
-
|
20
|
-
from qiskit.utils.optionals import HAS_TWEEDLEDUM
|
21
|
-
from .exceptions import ClassicalFunctionParseError, ClassicalFunctionCompilerTypeError
|
22
|
-
|
23
|
-
|
24
|
-
@HAS_TWEEDLEDUM.require_in_instance
|
25
|
-
class ClassicalFunctionVisitor(ast.NodeVisitor):
|
26
|
-
"""Node visitor as defined in https://docs.python.org/3/library/ast.html#ast.NodeVisitor"""
|
27
|
-
|
28
|
-
# pylint: disable=invalid-name
|
29
|
-
bitops = {
|
30
|
-
_ast.BitAnd: "create_and",
|
31
|
-
_ast.BitOr: "create_or",
|
32
|
-
_ast.BitXor: "create_xor",
|
33
|
-
_ast.And: "create_and",
|
34
|
-
_ast.Or: "create_or",
|
35
|
-
_ast.Not: "create_not",
|
36
|
-
}
|
37
|
-
|
38
|
-
def __init__(self):
|
39
|
-
self.scopes = []
|
40
|
-
self.args = []
|
41
|
-
self._network = None
|
42
|
-
self.name = None
|
43
|
-
super().__init__()
|
44
|
-
|
45
|
-
def visit_Module(self, node):
|
46
|
-
"""The full snippet should contain a single function"""
|
47
|
-
if len(node.body) != 1 and not isinstance(node.body[0], ast.FunctionDef):
|
48
|
-
raise ClassicalFunctionParseError("just functions, sorry!")
|
49
|
-
self.name = node.body[0].name
|
50
|
-
self.visit(node.body[0])
|
51
|
-
|
52
|
-
def visit_FunctionDef(self, node):
|
53
|
-
"""The function definition should have type hints"""
|
54
|
-
if node.returns is None:
|
55
|
-
raise ClassicalFunctionParseError("return type is needed")
|
56
|
-
scope = {"return": (node.returns.id, None), node.returns.id: ("type", None)}
|
57
|
-
|
58
|
-
# Extend scope with the decorator's names
|
59
|
-
scope.update({decorator.id: ("decorator", None) for decorator in node.decorator_list})
|
60
|
-
|
61
|
-
from tweedledum.classical import LogicNetwork # pylint: disable=import-error
|
62
|
-
|
63
|
-
self.scopes.append(scope)
|
64
|
-
self._network = LogicNetwork()
|
65
|
-
self.extend_scope(node.args)
|
66
|
-
return super().generic_visit(node)
|
67
|
-
|
68
|
-
def visit_Return(self, node):
|
69
|
-
"""The return type should match the return type hint."""
|
70
|
-
_type, signal = self.visit(node.value)
|
71
|
-
if _type != self.scopes[-1]["return"][0]:
|
72
|
-
raise ClassicalFunctionParseError("return type error")
|
73
|
-
self._network.create_po(signal)
|
74
|
-
|
75
|
-
def visit_Assign(self, node):
|
76
|
-
"""When assign, the scope needs to be updated with the right type"""
|
77
|
-
type_value, signal_value = self.visit(node.value)
|
78
|
-
for target in node.targets:
|
79
|
-
self.scopes[-1][target.id] = (type_value, signal_value)
|
80
|
-
return (type_value, signal_value)
|
81
|
-
|
82
|
-
def bit_binop(self, op, values):
|
83
|
-
"""Uses ClassicalFunctionVisitor.bitops to extend self._network"""
|
84
|
-
bitop = ClassicalFunctionVisitor.bitops.get(type(op))
|
85
|
-
if not bitop:
|
86
|
-
raise ClassicalFunctionParseError(f"Unknown binop.op {op}")
|
87
|
-
binop = getattr(self._network, bitop)
|
88
|
-
|
89
|
-
left_type, left_signal = values[0]
|
90
|
-
if left_type != "Int1":
|
91
|
-
raise ClassicalFunctionParseError("binop type error")
|
92
|
-
|
93
|
-
for right_type, right_signal in values[1:]:
|
94
|
-
if right_type != "Int1":
|
95
|
-
raise ClassicalFunctionParseError("binop type error")
|
96
|
-
left_signal = binop(left_signal, right_signal)
|
97
|
-
|
98
|
-
return "Int1", left_signal
|
99
|
-
|
100
|
-
def visit_BoolOp(self, node):
|
101
|
-
"""Handles ``and`` and ``or``.
|
102
|
-
node.left=Int1 and node.right=Int1 return Int1"""
|
103
|
-
return self.bit_binop(node.op, [self.visit(value) for value in node.values])
|
104
|
-
|
105
|
-
def visit_BinOp(self, node):
|
106
|
-
"""Handles ``&``, ``^``, and ``|``.
|
107
|
-
node.left=Int1 and node.right=Int1 return Int1"""
|
108
|
-
return self.bit_binop(node.op, [self.visit(node.left), self.visit(node.right)])
|
109
|
-
|
110
|
-
def visit_UnaryOp(self, node):
|
111
|
-
"""Handles ``~``. Cannot operate on Int1s."""
|
112
|
-
operand_type, operand_signal = self.visit(node.operand)
|
113
|
-
if operand_type != "Int1":
|
114
|
-
raise ClassicalFunctionCompilerTypeError(
|
115
|
-
f"UntaryOp.op {node.op} only support operation on Int1s for now"
|
116
|
-
)
|
117
|
-
bitop = ClassicalFunctionVisitor.bitops.get(type(node.op))
|
118
|
-
if not bitop:
|
119
|
-
raise ClassicalFunctionCompilerTypeError(
|
120
|
-
f"UntaryOp.op {node.op} does not operate with Int1 type "
|
121
|
-
)
|
122
|
-
return "Int1", getattr(self._network, bitop)(operand_signal)
|
123
|
-
|
124
|
-
def visit_Name(self, node):
|
125
|
-
"""Reduce variable names."""
|
126
|
-
if node.id not in self.scopes[-1]:
|
127
|
-
raise ClassicalFunctionParseError(f"out of scope: {node.id}")
|
128
|
-
return self.scopes[-1][node.id]
|
129
|
-
|
130
|
-
def generic_visit(self, node):
|
131
|
-
"""Catch all for the unhandled nodes."""
|
132
|
-
if isinstance(
|
133
|
-
node,
|
134
|
-
(
|
135
|
-
_ast.arguments,
|
136
|
-
_ast.arg,
|
137
|
-
_ast.Load,
|
138
|
-
_ast.BitAnd,
|
139
|
-
_ast.BitOr,
|
140
|
-
_ast.BitXor,
|
141
|
-
_ast.BoolOp,
|
142
|
-
_ast.Or,
|
143
|
-
),
|
144
|
-
):
|
145
|
-
return super().generic_visit(node)
|
146
|
-
raise ClassicalFunctionParseError(f"Unknown node: {type(node)}")
|
147
|
-
|
148
|
-
def extend_scope(self, args_node: _ast.arguments) -> None:
|
149
|
-
"""Add the arguments to the scope"""
|
150
|
-
for arg in args_node.args:
|
151
|
-
if arg.annotation is None:
|
152
|
-
raise ClassicalFunctionParseError("argument type is needed")
|
153
|
-
self.args.append(arg.arg)
|
154
|
-
self.scopes[-1][arg.annotation.id] = ("type", None)
|
155
|
-
self.scopes[-1][arg.arg] = (arg.annotation.id, self._network.create_pi())
|