qiskit 1.1.2__cp38-abi3-win32.whl → 1.2.0rc1__cp38-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 +27 -24
- qiskit/_accelerate.pyd +0 -0
- qiskit/_numpy_compat.py +1 -1
- qiskit/assembler/assemble_circuits.py +107 -64
- qiskit/assembler/assemble_schedules.py +5 -12
- qiskit/assembler/disassemble.py +10 -1
- qiskit/circuit/__init__.py +1 -1
- qiskit/circuit/_classical_resource_map.py +5 -5
- qiskit/circuit/_utils.py +0 -13
- qiskit/circuit/add_control.py +1 -1
- qiskit/circuit/annotated_operation.py +23 -1
- qiskit/circuit/classical/expr/expr.py +4 -4
- qiskit/circuit/classical/expr/visitors.py +1 -1
- qiskit/circuit/classical/types/__init__.py +1 -1
- qiskit/circuit/classical/types/types.py +2 -2
- qiskit/circuit/classicalfunction/boolean_expression.py +1 -1
- qiskit/circuit/classicalfunction/classical_function_visitor.py +5 -5
- qiskit/circuit/classicalfunction/utils.py +1 -1
- qiskit/circuit/classicalregister.py +1 -1
- qiskit/circuit/commutation_checker.py +83 -35
- qiskit/circuit/controlflow/_builder_utils.py +1 -1
- qiskit/circuit/controlflow/builder.py +10 -6
- qiskit/circuit/controlflow/if_else.py +2 -2
- qiskit/circuit/controlflow/switch_case.py +1 -1
- qiskit/circuit/delay.py +1 -1
- qiskit/circuit/duration.py +2 -2
- qiskit/circuit/equivalence.py +5 -7
- qiskit/circuit/gate.py +11 -8
- qiskit/circuit/instruction.py +31 -13
- qiskit/circuit/instructionset.py +2 -5
- qiskit/circuit/library/__init__.py +2 -1
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +1 -1
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +1 -1
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +1 -1
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +3 -3
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +1 -1
- qiskit/circuit/library/basis_change/__init__.py +1 -1
- qiskit/circuit/library/basis_change/qft.py +40 -6
- qiskit/circuit/library/blueprintcircuit.py +3 -5
- qiskit/circuit/library/data_preparation/__init__.py +9 -2
- qiskit/circuit/library/data_preparation/initializer.py +8 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +98 -178
- qiskit/circuit/library/generalized_gates/isometry.py +8 -8
- qiskit/circuit/library/generalized_gates/linear_function.py +3 -2
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +4 -4
- qiskit/circuit/library/generalized_gates/permutation.py +8 -9
- qiskit/circuit/library/generalized_gates/uc.py +3 -3
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +2 -2
- qiskit/circuit/library/generalized_gates/unitary.py +13 -11
- qiskit/circuit/library/graph_state.py +1 -1
- qiskit/circuit/library/hamiltonian_gate.py +1 -2
- qiskit/circuit/library/hidden_linear_function.py +1 -1
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +3 -2
- qiskit/circuit/library/n_local/n_local.py +4 -5
- qiskit/circuit/library/n_local/pauli_two_design.py +1 -1
- qiskit/circuit/library/n_local/qaoa_ansatz.py +6 -8
- qiskit/circuit/library/n_local/two_local.py +1 -1
- qiskit/circuit/library/overlap.py +11 -5
- qiskit/circuit/library/pauli_evolution.py +7 -3
- qiskit/circuit/library/standard_gates/dcx.py +3 -0
- qiskit/circuit/library/standard_gates/ecr.py +3 -0
- qiskit/circuit/library/standard_gates/global_phase.py +3 -0
- qiskit/circuit/library/standard_gates/h.py +13 -5
- qiskit/circuit/library/standard_gates/i.py +3 -0
- qiskit/circuit/library/standard_gates/iswap.py +3 -0
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +19 -10
- qiskit/circuit/library/standard_gates/p.py +14 -9
- qiskit/circuit/library/standard_gates/r.py +3 -0
- qiskit/circuit/library/standard_gates/rx.py +21 -6
- qiskit/circuit/library/standard_gates/rxx.py +40 -1
- qiskit/circuit/library/standard_gates/ry.py +21 -6
- qiskit/circuit/library/standard_gates/ryy.py +40 -1
- qiskit/circuit/library/standard_gates/rz.py +22 -6
- qiskit/circuit/library/standard_gates/rzx.py +40 -1
- qiskit/circuit/library/standard_gates/rzz.py +41 -2
- qiskit/circuit/library/standard_gates/s.py +77 -0
- qiskit/circuit/library/standard_gates/swap.py +12 -5
- qiskit/circuit/library/standard_gates/sx.py +14 -5
- qiskit/circuit/library/standard_gates/t.py +5 -0
- qiskit/circuit/library/standard_gates/u.py +22 -7
- qiskit/circuit/library/standard_gates/u1.py +8 -3
- qiskit/circuit/library/standard_gates/u2.py +3 -0
- qiskit/circuit/library/standard_gates/u3.py +22 -7
- qiskit/circuit/library/standard_gates/x.py +156 -92
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +40 -1
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +52 -11
- qiskit/circuit/library/standard_gates/y.py +6 -1
- qiskit/circuit/library/standard_gates/z.py +8 -1
- qiskit/circuit/operation.py +1 -1
- qiskit/circuit/parameter.py +9 -10
- qiskit/circuit/parameterexpression.py +16 -13
- qiskit/circuit/parametertable.py +1 -190
- qiskit/circuit/parametervector.py +1 -1
- qiskit/circuit/quantumcircuit.py +392 -384
- qiskit/circuit/quantumcircuitdata.py +3 -5
- qiskit/circuit/quantumregister.py +1 -1
- qiskit/circuit/random/__init__.py +1 -1
- qiskit/circuit/random/utils.py +175 -26
- qiskit/circuit/register.py +5 -7
- qiskit/circuit/singleton.py +3 -3
- qiskit/circuit/tools/pi_check.py +4 -4
- qiskit/compiler/assembler.py +95 -24
- qiskit/compiler/scheduler.py +2 -2
- qiskit/compiler/transpiler.py +41 -127
- qiskit/converters/circuit_to_dag.py +4 -6
- qiskit/converters/circuit_to_gate.py +4 -8
- qiskit/converters/circuit_to_instruction.py +5 -17
- qiskit/converters/dag_to_circuit.py +2 -6
- qiskit/dagcircuit/collect_blocks.py +2 -2
- qiskit/dagcircuit/dagcircuit.py +190 -187
- qiskit/dagcircuit/dagdependency.py +4 -4
- qiskit/dagcircuit/dagdependency_v2.py +4 -4
- qiskit/dagcircuit/dagdepnode.py +1 -1
- qiskit/dagcircuit/dagnode.py +66 -157
- qiskit/passmanager/flow_controllers.py +1 -1
- qiskit/passmanager/passmanager.py +3 -3
- qiskit/primitives/__init__.py +1 -5
- qiskit/primitives/backend_estimator.py +25 -15
- qiskit/primitives/backend_estimator_v2.py +31 -7
- qiskit/primitives/backend_sampler.py +21 -12
- qiskit/primitives/backend_sampler_v2.py +12 -3
- qiskit/primitives/base/base_estimator.py +31 -4
- qiskit/primitives/base/base_primitive.py +2 -2
- qiskit/primitives/base/base_result.py +2 -2
- qiskit/primitives/base/base_sampler.py +26 -2
- qiskit/primitives/base/estimator_result.py +2 -2
- qiskit/primitives/base/sampler_result.py +2 -2
- qiskit/primitives/containers/__init__.py +0 -1
- qiskit/primitives/containers/bindings_array.py +2 -2
- qiskit/primitives/containers/bit_array.py +108 -10
- qiskit/primitives/containers/shape.py +3 -3
- qiskit/primitives/estimator.py +9 -2
- qiskit/primitives/primitive_job.py +1 -1
- qiskit/primitives/sampler.py +10 -3
- qiskit/primitives/statevector_estimator.py +5 -3
- qiskit/primitives/statevector_sampler.py +11 -5
- qiskit/primitives/utils.py +16 -0
- qiskit/providers/backend.py +15 -6
- qiskit/providers/backend_compat.py +7 -4
- qiskit/providers/basic_provider/basic_provider_tools.py +1 -1
- qiskit/providers/basic_provider/basic_simulator.py +32 -24
- qiskit/providers/fake_provider/fake_backend.py +10 -3
- qiskit/providers/fake_provider/fake_openpulse_2q.py +154 -146
- qiskit/providers/fake_provider/fake_openpulse_3q.py +226 -217
- qiskit/providers/fake_provider/fake_qasm_backend.py +5 -1
- qiskit/providers/fake_provider/generic_backend_v2.py +80 -50
- qiskit/providers/models/__init__.py +11 -0
- qiskit/providers/models/backendconfiguration.py +50 -4
- qiskit/providers/models/backendproperties.py +13 -2
- qiskit/providers/models/pulsedefaults.py +10 -11
- qiskit/providers/options.py +13 -13
- qiskit/providers/providerutils.py +3 -1
- qiskit/pulse/configuration.py +8 -12
- qiskit/pulse/instruction_schedule_map.py +3 -5
- qiskit/pulse/instructions/acquire.py +7 -8
- qiskit/pulse/instructions/instruction.py +2 -3
- qiskit/pulse/library/samplers/decorators.py +5 -9
- qiskit/pulse/library/symbolic_pulses.py +4 -7
- qiskit/pulse/library/waveform.py +2 -5
- qiskit/pulse/macros.py +11 -6
- qiskit/pulse/parser.py +8 -10
- qiskit/pulse/schedule.py +9 -17
- qiskit/pulse/transforms/alignments.py +1 -3
- qiskit/pulse/utils.py +1 -2
- qiskit/qasm/libs/stdgates.inc +35 -28
- qiskit/qasm2/__init__.py +7 -7
- qiskit/qasm2/export.py +5 -9
- qiskit/qasm2/parse.py +1 -1
- qiskit/qasm3/ast.py +9 -25
- qiskit/qasm3/exporter.py +578 -481
- qiskit/qasm3/printer.py +7 -16
- qiskit/qobj/common.py +10 -0
- qiskit/qobj/converters/lo_config.py +9 -0
- qiskit/qobj/converters/pulse_instruction.py +13 -6
- qiskit/qobj/pulse_qobj.py +69 -15
- qiskit/qobj/qasm_qobj.py +72 -20
- qiskit/qobj/utils.py +9 -0
- qiskit/qpy/binary_io/circuits.py +8 -5
- qiskit/qpy/binary_io/schedules.py +1 -1
- qiskit/qpy/binary_io/value.py +3 -3
- qiskit/qpy/interface.py +3 -2
- qiskit/qpy/type_keys.py +2 -2
- qiskit/quantum_info/operators/channel/quantum_channel.py +3 -6
- qiskit/quantum_info/operators/channel/superop.py +2 -2
- qiskit/quantum_info/operators/channel/transformations.py +1 -1
- qiskit/quantum_info/operators/dihedral/dihedral.py +3 -4
- qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +1 -3
- qiskit/quantum_info/operators/dihedral/random.py +6 -3
- qiskit/quantum_info/operators/measures.py +2 -2
- qiskit/quantum_info/operators/op_shape.py +12 -20
- qiskit/quantum_info/operators/operator.py +14 -21
- qiskit/quantum_info/operators/predicates.py +1 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +7 -11
- qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +3 -3
- qiskit/quantum_info/operators/symplectic/pauli_list.py +9 -10
- qiskit/quantum_info/operators/symplectic/random.py +1 -1
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +14 -16
- qiskit/quantum_info/quaternion.py +1 -1
- qiskit/quantum_info/states/densitymatrix.py +5 -8
- qiskit/quantum_info/states/stabilizerstate.py +128 -37
- qiskit/quantum_info/states/statevector.py +4 -8
- qiskit/result/counts.py +2 -2
- qiskit/result/mitigation/correlated_readout_mitigator.py +2 -2
- qiskit/result/mitigation/local_readout_mitigator.py +2 -2
- qiskit/result/mitigation/utils.py +1 -3
- qiskit/result/models.py +17 -16
- qiskit/result/result.py +15 -20
- qiskit/scheduler/lowering.py +2 -2
- qiskit/synthesis/__init__.py +2 -1
- qiskit/synthesis/clifford/__init__.py +1 -1
- qiskit/synthesis/clifford/clifford_decompose_ag.py +2 -2
- qiskit/synthesis/clifford/clifford_decompose_bm.py +10 -240
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +9 -303
- qiskit/synthesis/clifford/clifford_decompose_layers.py +25 -23
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +1 -1
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +1 -1
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +1 -1
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +2 -2
- qiskit/synthesis/evolution/evolution_synthesis.py +4 -2
- qiskit/synthesis/evolution/lie_trotter.py +46 -19
- qiskit/synthesis/evolution/product_formula.py +111 -55
- qiskit/synthesis/evolution/qdrift.py +40 -10
- qiskit/synthesis/evolution/suzuki_trotter.py +43 -33
- qiskit/synthesis/linear/__init__.py +1 -0
- qiskit/synthesis/linear/cnot_synth.py +22 -96
- qiskit/synthesis/linear/linear_depth_lnn.py +8 -8
- qiskit/synthesis/linear/linear_matrix_utils.py +13 -161
- qiskit/synthesis/linear_phase/cnot_phase_synth.py +1 -1
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +3 -3
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +1 -1
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +29 -29
- qiskit/synthesis/permutation/permutation_full.py +5 -29
- qiskit/synthesis/permutation/permutation_lnn.py +2 -24
- qiskit/synthesis/permutation/permutation_utils.py +2 -59
- qiskit/synthesis/qft/__init__.py +1 -0
- qiskit/synthesis/qft/qft_decompose_full.py +79 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +17 -9
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +6 -6
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -2
- qiskit/synthesis/two_qubit/local_invariance.py +8 -38
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +48 -129
- qiskit/synthesis/unitary/aqc/cnot_structures.py +1 -1
- qiskit/synthesis/unitary/qsd.py +5 -3
- qiskit/transpiler/__init__.py +1 -0
- qiskit/transpiler/basepasses.py +1 -1
- qiskit/transpiler/coupling.py +3 -3
- qiskit/transpiler/instruction_durations.py +1 -2
- qiskit/transpiler/layout.py +3 -3
- qiskit/transpiler/passes/__init__.py +2 -0
- qiskit/transpiler/passes/basis/basis_translator.py +82 -63
- qiskit/transpiler/passes/basis/translate_parameterized.py +3 -5
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +10 -10
- qiskit/transpiler/passes/calibration/rx_builder.py +3 -3
- qiskit/transpiler/passes/calibration/rzx_builder.py +3 -3
- qiskit/transpiler/passes/layout/apply_layout.py +13 -3
- qiskit/transpiler/passes/layout/sabre_layout.py +10 -8
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +4 -1
- qiskit/transpiler/passes/layout/set_layout.py +2 -2
- qiskit/transpiler/passes/layout/vf2_layout.py +1 -1
- qiskit/transpiler/passes/layout/vf2_utils.py +3 -3
- qiskit/transpiler/passes/optimization/__init__.py +1 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
- qiskit/transpiler/passes/optimization/commutation_analysis.py +7 -10
- qiskit/transpiler/passes/optimization/commutative_cancellation.py +35 -19
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +11 -8
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +6 -6
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +64 -41
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +83 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +1 -1
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +2 -2
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -2
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
- qiskit/transpiler/passes/routing/layout_transformation.py +2 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +35 -26
- qiskit/transpiler/passes/routing/star_prerouting.py +80 -105
- qiskit/transpiler/passes/routing/stochastic_swap.py +1 -3
- qiskit/transpiler/passes/scheduling/alap.py +1 -2
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -2
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +1 -1
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +1 -1
- qiskit/transpiler/passes/scheduling/asap.py +1 -2
- qiskit/transpiler/passes/scheduling/base_scheduler.py +5 -5
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +3 -3
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +11 -11
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +7 -6
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +4 -3
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +211 -36
- qiskit/transpiler/passes/synthesis/plugin.py +2 -2
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +80 -40
- qiskit/transpiler/passes/utils/__init__.py +0 -1
- qiskit/transpiler/passes/utils/check_gate_direction.py +4 -4
- qiskit/transpiler/passes/utils/check_map.py +3 -6
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +3 -4
- qiskit/transpiler/passes/utils/error.py +2 -2
- qiskit/transpiler/passes/utils/fixed_point.py +3 -3
- qiskit/transpiler/passes/utils/gate_direction.py +1 -1
- qiskit/transpiler/passes/utils/gates_basis.py +1 -2
- qiskit/transpiler/passmanager.py +7 -6
- qiskit/transpiler/preset_passmanagers/__init__.py +4 -228
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +117 -18
- qiskit/transpiler/preset_passmanagers/common.py +3 -6
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +518 -0
- qiskit/transpiler/preset_passmanagers/level0.py +1 -1
- qiskit/transpiler/target.py +27 -8
- qiskit/user_config.py +29 -6
- qiskit/utils/classtools.py +3 -3
- qiskit/utils/deprecation.py +3 -2
- qiskit/utils/lazy_tester.py +2 -2
- qiskit/utils/optionals.py +8 -8
- qiskit/visualization/bloch.py +19 -67
- qiskit/visualization/circuit/_utils.py +34 -10
- qiskit/visualization/circuit/circuit_visualization.py +23 -16
- qiskit/visualization/circuit/latex.py +29 -27
- qiskit/visualization/circuit/matplotlib.py +4 -2
- qiskit/visualization/circuit/qcstyle.py +2 -2
- qiskit/visualization/circuit/text.py +9 -15
- qiskit/visualization/dag_visualization.py +5 -12
- qiskit/visualization/pulse_v2/core.py +1 -1
- qiskit/visualization/pulse_v2/events.py +1 -1
- qiskit/visualization/pulse_v2/generators/frame.py +3 -4
- qiskit/visualization/pulse_v2/generators/waveform.py +5 -9
- qiskit/visualization/pulse_v2/layouts.py +1 -5
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +1 -2
- qiskit/visualization/state_visualization.py +5 -6
- qiskit/visualization/timeline/plotters/matplotlib.py +1 -2
- qiskit/visualization/transition_visualization.py +7 -2
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/METADATA +26 -26
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/RECORD +340 -338
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/WHEEL +1 -1
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/entry_points.txt +3 -0
- qiskit/transpiler/passes/utils/block_to_matrix.py +0 -47
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/top_level.txt +0 -0
qiskit/user_config.py
CHANGED
@@ -31,9 +31,11 @@ class UserConfig:
|
|
31
31
|
circuit_mpl_style = default
|
32
32
|
circuit_mpl_style_path = ~/.qiskit:<default location>
|
33
33
|
circuit_reverse_bits = True
|
34
|
+
circuit_idle_wires = False
|
34
35
|
transpile_optimization_level = 1
|
35
36
|
parallel = False
|
36
37
|
num_processes = 4
|
38
|
+
sabre_all_threads = true
|
37
39
|
|
38
40
|
"""
|
39
41
|
|
@@ -62,9 +64,9 @@ class UserConfig:
|
|
62
64
|
if circuit_drawer:
|
63
65
|
if circuit_drawer not in ["text", "mpl", "latex", "latex_source", "auto"]:
|
64
66
|
raise exceptions.QiskitUserConfigError(
|
65
|
-
"
|
67
|
+
f"{circuit_drawer} is not a valid circuit drawer backend. Must be "
|
66
68
|
"either 'text', 'mpl', 'latex', 'latex_source', or "
|
67
|
-
"'auto'."
|
69
|
+
"'auto'."
|
68
70
|
)
|
69
71
|
self.settings["circuit_drawer"] = circuit_drawer
|
70
72
|
|
@@ -95,8 +97,8 @@ class UserConfig:
|
|
95
97
|
if circuit_mpl_style:
|
96
98
|
if not isinstance(circuit_mpl_style, str):
|
97
99
|
warn(
|
98
|
-
"
|
99
|
-
"a text string. Will not load style."
|
100
|
+
f"{circuit_mpl_style} is not a valid mpl circuit style. Must be "
|
101
|
+
"a text string. Will not load style.",
|
100
102
|
UserWarning,
|
101
103
|
2,
|
102
104
|
)
|
@@ -111,8 +113,8 @@ class UserConfig:
|
|
111
113
|
for path in cpath_list:
|
112
114
|
if not os.path.exists(os.path.expanduser(path)):
|
113
115
|
warn(
|
114
|
-
"
|
115
|
-
" Correct the path in ~/.qiskit/settings.conf."
|
116
|
+
f"{path} is not a valid circuit mpl style path."
|
117
|
+
" Correct the path in ~/.qiskit/settings.conf.",
|
116
118
|
UserWarning,
|
117
119
|
2,
|
118
120
|
)
|
@@ -130,6 +132,18 @@ class UserConfig:
|
|
130
132
|
if circuit_reverse_bits is not None:
|
131
133
|
self.settings["circuit_reverse_bits"] = circuit_reverse_bits
|
132
134
|
|
135
|
+
# Parse circuit_idle_wires
|
136
|
+
try:
|
137
|
+
circuit_idle_wires = self.config_parser.getboolean(
|
138
|
+
"default", "circuit_idle_wires", fallback=None
|
139
|
+
)
|
140
|
+
except ValueError as err:
|
141
|
+
raise exceptions.QiskitUserConfigError(
|
142
|
+
f"Value assigned to circuit_idle_wires is not valid. {str(err)}"
|
143
|
+
)
|
144
|
+
if circuit_idle_wires is not None:
|
145
|
+
self.settings["circuit_idle_wires"] = circuit_idle_wires
|
146
|
+
|
133
147
|
# Parse transpile_optimization_level
|
134
148
|
transpile_optimization_level = self.config_parser.getint(
|
135
149
|
"default", "transpile_optimization_level", fallback=-1
|
@@ -155,6 +169,13 @@ class UserConfig:
|
|
155
169
|
)
|
156
170
|
self.settings["num_processes"] = num_processes
|
157
171
|
|
172
|
+
# Parse sabre_all_threads
|
173
|
+
sabre_all_threads = self.config_parser.getboolean(
|
174
|
+
"default", "sabre_all_threads", fallback=None
|
175
|
+
)
|
176
|
+
if sabre_all_threads is not None:
|
177
|
+
self.settings["sabre_all_threads"] = sabre_all_threads
|
178
|
+
|
158
179
|
|
159
180
|
def set_config(key, value, section=None, file_path=None):
|
160
181
|
"""Adds or modifies a user configuration
|
@@ -191,9 +212,11 @@ def set_config(key, value, section=None, file_path=None):
|
|
191
212
|
"circuit_mpl_style",
|
192
213
|
"circuit_mpl_style_path",
|
193
214
|
"circuit_reverse_bits",
|
215
|
+
"circuit_idle_wires",
|
194
216
|
"transpile_optimization_level",
|
195
217
|
"parallel",
|
196
218
|
"num_processes",
|
219
|
+
"sabre_all_threads",
|
197
220
|
}
|
198
221
|
|
199
222
|
if section in [None, "default"]:
|
qiskit/utils/classtools.py
CHANGED
@@ -31,7 +31,7 @@ class _lift_to_method: # pylint: disable=invalid-name
|
|
31
31
|
returned unchanged if so, otherwise it is turned into the default implementation for functions,
|
32
32
|
which makes them bindable to instances.
|
33
33
|
|
34
|
-
Python-space functions and lambdas already have this
|
34
|
+
Python-space functions and lambdas already have this behavior, but builtins like ``print``
|
35
35
|
don't; using this class allows us to do::
|
36
36
|
|
37
37
|
wrap_method(MyClass, "maybe_mutates_arguments", before=print, after=print)
|
@@ -49,7 +49,7 @@ class _lift_to_method: # pylint: disable=invalid-name
|
|
49
49
|
|
50
50
|
def __init__(self, method):
|
51
51
|
if method is self:
|
52
|
-
# Prevent double-
|
52
|
+
# Prevent double-initialization if we are passed an instance of this object to lift.
|
53
53
|
return
|
54
54
|
self._method = method
|
55
55
|
|
@@ -118,7 +118,7 @@ class _WrappedMethod:
|
|
118
118
|
|
119
119
|
|
120
120
|
def wrap_method(cls: Type, name: str, *, before: Callable = None, after: Callable = None):
|
121
|
-
"""Wrap the functionality the instance- or class method ``cls.name`` with additional
|
121
|
+
"""Wrap the functionality the instance- or class method ``cls.name`` with additional behavior
|
122
122
|
``before`` and ``after``.
|
123
123
|
|
124
124
|
This mutates ``cls``, replacing the attribute ``name`` with the new functionality. This is
|
qiskit/utils/deprecation.py
CHANGED
@@ -29,6 +29,7 @@ def deprecate_func(
|
|
29
29
|
package_name: str = "qiskit",
|
30
30
|
removal_timeline: str = "no earlier than 3 months after the release date",
|
31
31
|
is_property: bool = False,
|
32
|
+
stacklevel: int = 2,
|
32
33
|
):
|
33
34
|
"""Decorator to indicate a function has been deprecated.
|
34
35
|
|
@@ -50,7 +51,7 @@ def deprecate_func(
|
|
50
51
|
is_property: If the deprecated function is a `@property`, set this to True so that the
|
51
52
|
generated message correctly describes it as such. (This isn't necessary for
|
52
53
|
property setters, as their docstring is ignored by Python.)
|
53
|
-
|
54
|
+
stacklevel: Stack level passed to :func:`warnings.warn`.
|
54
55
|
Returns:
|
55
56
|
Callable: The decorated callable.
|
56
57
|
"""
|
@@ -92,7 +93,7 @@ def deprecate_func(
|
|
92
93
|
|
93
94
|
@functools.wraps(func)
|
94
95
|
def wrapper(*args, **kwargs):
|
95
|
-
warnings.warn(msg, category=category, stacklevel=
|
96
|
+
warnings.warn(msg, category=category, stacklevel=stacklevel)
|
96
97
|
return func(*args, **kwargs)
|
97
98
|
|
98
99
|
add_deprecation_to_docstring(wrapper, msg, since=since, pending=pending)
|
qiskit/utils/lazy_tester.py
CHANGED
@@ -174,7 +174,7 @@ class LazyDependencyManager(abc.ABC):
|
|
174
174
|
|
175
175
|
def require_in_instance(self, feature_or_class):
|
176
176
|
"""A class decorator that requires the dependency is available when the class is
|
177
|
-
|
177
|
+
initialized. This decorator can be used even if the class does not define an ``__init__``
|
178
178
|
method.
|
179
179
|
|
180
180
|
Args:
|
@@ -186,7 +186,7 @@ class LazyDependencyManager(abc.ABC):
|
|
186
186
|
|
187
187
|
Returns:
|
188
188
|
Callable: a class decorator that ensures that the wrapped feature is present if the
|
189
|
-
class is
|
189
|
+
class is initialized.
|
190
190
|
"""
|
191
191
|
if isinstance(feature_or_class, str):
|
192
192
|
feature = feature_or_class
|
qiskit/utils/optionals.py
CHANGED
@@ -79,7 +79,7 @@ External Python Libraries
|
|
79
79
|
|
80
80
|
* - .. py:data:: HAS_IPYTHON
|
81
81
|
- If `the IPython kernel <https://ipython.org/>`__ is available, certain additional
|
82
|
-
|
82
|
+
visualizations and line magics are made available.
|
83
83
|
|
84
84
|
* - .. py:data:: HAS_IPYWIDGETS
|
85
85
|
- Monitoring widgets for jobs running on external backends can be provided if `ipywidgets
|
@@ -94,7 +94,7 @@ External Python Libraries
|
|
94
94
|
interactivity features.
|
95
95
|
|
96
96
|
* - .. py:data:: HAS_MATPLOTLIB
|
97
|
-
- Qiskit provides several
|
97
|
+
- Qiskit provides several visualization tools in the :mod:`.visualization` module.
|
98
98
|
Almost all of these are built using `Matplotlib <https://matplotlib.org/>`__, which must
|
99
99
|
be installed in order to use them.
|
100
100
|
|
@@ -116,7 +116,7 @@ External Python Libraries
|
|
116
116
|
:class:`.DAGCircuit` in certain modes.
|
117
117
|
|
118
118
|
* - .. py:data:: HAS_PYDOT
|
119
|
-
- For some graph
|
119
|
+
- For some graph visualizations, Qiskit uses `pydot <https://github.com/pydot/pydot>`__ as an
|
120
120
|
interface to GraphViz (see :data:`HAS_GRAPHVIZ`).
|
121
121
|
|
122
122
|
* - .. py:data:: HAS_PYGMENTS
|
@@ -134,7 +134,7 @@ External Python Libraries
|
|
134
134
|
<https://qiskit.github.io/qiskit-qasm3-import>`__.
|
135
135
|
|
136
136
|
* - .. py:data:: HAS_SEABORN
|
137
|
-
- Qiskit provides several
|
137
|
+
- Qiskit provides several visualization tools in the :mod:`.visualization` module. Some
|
138
138
|
of these are built using `Seaborn <https://seaborn.pydata.org/>`__, which must be installed
|
139
139
|
in order to use them.
|
140
140
|
|
@@ -179,16 +179,16 @@ External Command-Line Tools
|
|
179
179
|
:widths: 25 75
|
180
180
|
|
181
181
|
* - .. py:data:: HAS_GRAPHVIZ
|
182
|
-
- For some graph
|
183
|
-
|
182
|
+
- For some graph visualizations, Qiskit uses the `GraphViz <https://graphviz.org/>`__
|
183
|
+
visualization tool via its ``pydot`` interface (see :data:`HAS_PYDOT`).
|
184
184
|
|
185
185
|
* - .. py:data:: HAS_PDFLATEX
|
186
|
-
-
|
186
|
+
- Visualization tools that use LaTeX in their output, such as the circuit drawers, require
|
187
187
|
``pdflatex`` to be available. You will generally need to ensure that you have a working
|
188
188
|
LaTeX installation available, and the ``qcircuit.tex`` package.
|
189
189
|
|
190
190
|
* - .. py:data:: HAS_PDFTOCAIRO
|
191
|
-
-
|
191
|
+
- Visualization tools that convert LaTeX-generated files into rasterized images use the
|
192
192
|
``pdftocairo`` tool. This is part of the `Poppler suite of PDF tools
|
193
193
|
<https://poppler.freedesktop.org/>`__.
|
194
194
|
|
qiskit/visualization/bloch.py
CHANGED
@@ -50,7 +50,6 @@ __all__ = ["Bloch"]
|
|
50
50
|
|
51
51
|
import math
|
52
52
|
import os
|
53
|
-
import re
|
54
53
|
import numpy as np
|
55
54
|
import matplotlib
|
56
55
|
import matplotlib.pyplot as plt
|
@@ -61,47 +60,6 @@ from mpl_toolkits.mplot3d.art3d import Patch3D
|
|
61
60
|
from .utils import matplotlib_close_if_inline
|
62
61
|
|
63
62
|
|
64
|
-
# This version pattern is taken from the pypa packaging project:
|
65
|
-
# https://github.com/pypa/packaging/blob/21.3/packaging/version.py#L223-L254
|
66
|
-
# which is dual licensed Apache 2.0 and BSD see the source for the original
|
67
|
-
# authors and other details
|
68
|
-
VERSION_PATTERN = (
|
69
|
-
"^"
|
70
|
-
+ r"""
|
71
|
-
v?
|
72
|
-
(?:
|
73
|
-
(?:(?P<epoch>[0-9]+)!)? # epoch
|
74
|
-
(?P<release>[0-9]+(?:\.[0-9]+)*) # release segment
|
75
|
-
(?P<pre> # pre-release
|
76
|
-
[-_\.]?
|
77
|
-
(?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview))
|
78
|
-
[-_\.]?
|
79
|
-
(?P<pre_n>[0-9]+)?
|
80
|
-
)?
|
81
|
-
(?P<post> # post release
|
82
|
-
(?:-(?P<post_n1>[0-9]+))
|
83
|
-
|
|
84
|
-
(?:
|
85
|
-
[-_\.]?
|
86
|
-
(?P<post_l>post|rev|r)
|
87
|
-
[-_\.]?
|
88
|
-
(?P<post_n2>[0-9]+)?
|
89
|
-
)
|
90
|
-
)?
|
91
|
-
(?P<dev> # dev release
|
92
|
-
[-_\.]?
|
93
|
-
(?P<dev_l>dev)
|
94
|
-
[-_\.]?
|
95
|
-
(?P<dev_n>[0-9]+)?
|
96
|
-
)?
|
97
|
-
)
|
98
|
-
(?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version
|
99
|
-
"""
|
100
|
-
+ "$"
|
101
|
-
)
|
102
|
-
VERSION_PATTERN_REGEX = re.compile(VERSION_PATTERN, re.VERBOSE | re.IGNORECASE)
|
103
|
-
|
104
|
-
|
105
63
|
class Arrow3D(Patch3D, FancyArrowPatch):
|
106
64
|
"""Makes a fancy arrow"""
|
107
65
|
|
@@ -332,7 +290,7 @@ class Bloch:
|
|
332
290
|
self.zlabel = ["$\\circlearrowleft$", "$\\circlearrowright$"]
|
333
291
|
self.xlabel = ["$\\leftrightarrow$", "$\\updownarrow$"]
|
334
292
|
else:
|
335
|
-
raise
|
293
|
+
raise ValueError("No such convention.")
|
336
294
|
|
337
295
|
def __str__(self):
|
338
296
|
string = ""
|
@@ -438,7 +396,7 @@ class Bloch:
|
|
438
396
|
if isinstance(state_or_vector, (list, np.ndarray, tuple)) and len(state_or_vector) == 3:
|
439
397
|
vec = state_or_vector
|
440
398
|
else:
|
441
|
-
raise
|
399
|
+
raise TypeError("Position needs to be specified by a qubit state or a 3D vector.")
|
442
400
|
self.annotations.append({"position": vec, "text": text, "opts": kwargs})
|
443
401
|
|
444
402
|
def make_sphere(self):
|
@@ -461,8 +419,7 @@ class Bloch:
|
|
461
419
|
self.fig = plt.figure(figsize=self.figsize)
|
462
420
|
|
463
421
|
if not self._ext_axes:
|
464
|
-
|
465
|
-
if tuple(int(x) for x in version_match.group("release").split(".")) >= (3, 4, 0):
|
422
|
+
if tuple(int(x) for x in matplotlib.__version__.split(".")) >= (3, 4, 0):
|
466
423
|
self.axes = Axes3D(
|
467
424
|
self.fig, azim=self.view[0], elev=self.view[1], auto_add_to_figure=False
|
468
425
|
)
|
@@ -630,11 +587,11 @@ class Bloch:
|
|
630
587
|
def plot_vectors(self):
|
631
588
|
"""Plot vector"""
|
632
589
|
# -X and Y data are switched for plotting purposes
|
633
|
-
for k in
|
590
|
+
for k, vector in enumerate(self.vectors):
|
634
591
|
|
635
|
-
xs3d =
|
636
|
-
ys3d = -
|
637
|
-
zs3d =
|
592
|
+
xs3d = vector[1] * np.array([0, 1])
|
593
|
+
ys3d = -vector[0] * np.array([0, 1])
|
594
|
+
zs3d = vector[2] * np.array([0, 1])
|
638
595
|
|
639
596
|
color = self.vector_color[np.mod(k, len(self.vector_color))]
|
640
597
|
|
@@ -660,15 +617,10 @@ class Bloch:
|
|
660
617
|
def plot_points(self):
|
661
618
|
"""Plot points"""
|
662
619
|
# -X and Y data are switched for plotting purposes
|
663
|
-
for k in
|
664
|
-
num = len(
|
620
|
+
for k, point in enumerate(self.points):
|
621
|
+
num = len(point[0])
|
665
622
|
dist = [
|
666
|
-
np.sqrt(
|
667
|
-
self.points[k][0][j] ** 2
|
668
|
-
+ self.points[k][1][j] ** 2
|
669
|
-
+ self.points[k][2][j] ** 2
|
670
|
-
)
|
671
|
-
for j in range(num)
|
623
|
+
np.sqrt(point[0][j] ** 2 + point[1][j] ** 2 + point[2][j] ** 2) for j in range(num)
|
672
624
|
]
|
673
625
|
if any(abs(dist - dist[0]) / dist[0] > 1e-12):
|
674
626
|
# combine arrays so that they can be sorted together
|
@@ -680,9 +632,9 @@ class Bloch:
|
|
680
632
|
indperm = np.arange(num)
|
681
633
|
if self.point_style[k] == "s":
|
682
634
|
self.axes.scatter(
|
683
|
-
np.real(
|
684
|
-
-np.real(
|
685
|
-
np.real(
|
635
|
+
np.real(point[1][indperm]),
|
636
|
+
-np.real(point[0][indperm]),
|
637
|
+
np.real(point[2][indperm]),
|
686
638
|
s=self.point_size[np.mod(k, len(self.point_size))],
|
687
639
|
alpha=1,
|
688
640
|
edgecolor=None,
|
@@ -699,9 +651,9 @@ class Bloch:
|
|
699
651
|
marker = self.point_marker[np.mod(k, len(self.point_marker))]
|
700
652
|
pnt_size = self.point_size[np.mod(k, len(self.point_size))]
|
701
653
|
self.axes.scatter(
|
702
|
-
np.real(
|
703
|
-
-np.real(
|
704
|
-
np.real(
|
654
|
+
np.real(point[1][indperm]),
|
655
|
+
-np.real(point[0][indperm]),
|
656
|
+
np.real(point[2][indperm]),
|
705
657
|
s=pnt_size,
|
706
658
|
alpha=1,
|
707
659
|
edgecolor=None,
|
@@ -713,9 +665,9 @@ class Bloch:
|
|
713
665
|
elif self.point_style[k] == "l":
|
714
666
|
color = self.point_color[np.mod(k, len(self.point_color))]
|
715
667
|
self.axes.plot(
|
716
|
-
np.real(
|
717
|
-
-np.real(
|
718
|
-
np.real(
|
668
|
+
np.real(point[1]),
|
669
|
+
-np.real(point[0]),
|
670
|
+
np.real(point[2]),
|
719
671
|
alpha=0.75,
|
720
672
|
zdir="z",
|
721
673
|
color=color,
|
@@ -14,21 +14,25 @@
|
|
14
14
|
|
15
15
|
import re
|
16
16
|
from collections import OrderedDict
|
17
|
+
from warnings import warn
|
17
18
|
|
18
19
|
import numpy as np
|
19
20
|
|
20
21
|
from qiskit.circuit import (
|
22
|
+
ClassicalRegister,
|
21
23
|
Clbit,
|
24
|
+
ControlFlowOp,
|
22
25
|
ControlledGate,
|
23
26
|
Delay,
|
24
27
|
Gate,
|
25
28
|
Instruction,
|
26
29
|
Measure,
|
30
|
+
QuantumCircuit,
|
31
|
+
Qubit,
|
27
32
|
)
|
33
|
+
from qiskit.circuit.annotated_operation import AnnotatedOperation, InverseModifier, PowerModifier
|
28
34
|
from qiskit.circuit.controlflow import condition_resources
|
29
35
|
from qiskit.circuit.library import PauliEvolutionGate
|
30
|
-
from qiskit.circuit import ClassicalRegister, QuantumCircuit, Qubit, ControlFlowOp
|
31
|
-
from qiskit.circuit.annotated_operation import AnnotatedOperation, InverseModifier, PowerModifier
|
32
36
|
from qiskit.circuit.tools import pi_check
|
33
37
|
from qiskit.converters import circuit_to_dag
|
34
38
|
from qiskit.utils import optionals as _optionals
|
@@ -112,7 +116,7 @@ def get_gate_ctrl_text(op, drawer, style=None, calibrations=None):
|
|
112
116
|
gate_text = gate_text.replace("-", "\\mbox{-}")
|
113
117
|
ctrl_text = f"$\\mathrm{{{ctrl_text}}}$"
|
114
118
|
|
115
|
-
# Only
|
119
|
+
# Only capitalize internally-created gate or instruction names
|
116
120
|
elif (
|
117
121
|
(gate_text == op.name and op_type not in (Gate, Instruction))
|
118
122
|
or (gate_text == base_name and base_type not in (Gate, Instruction))
|
@@ -370,6 +374,29 @@ def generate_latex_label(label):
|
|
370
374
|
return final_str.replace(" ", "\\,") # Put in proper spaces
|
371
375
|
|
372
376
|
|
377
|
+
def _get_valid_justify_arg(justify):
|
378
|
+
"""Returns a valid `justify` argument, warning if necessary."""
|
379
|
+
if isinstance(justify, str):
|
380
|
+
justify = justify.lower()
|
381
|
+
|
382
|
+
if justify is None:
|
383
|
+
justify = "left"
|
384
|
+
|
385
|
+
if justify not in ("left", "right", "none"):
|
386
|
+
# This code should be changed to an error raise, once the deprecation is complete.
|
387
|
+
warn(
|
388
|
+
f"Setting QuantumCircuit.draw()’s or circuit_drawer()'s justify argument: {justify}, to a "
|
389
|
+
"value other than 'left', 'right', 'none' or None (='left'). Default 'left' will be used. "
|
390
|
+
"Support for invalid justify arguments is deprecated as of Qiskit 1.2.0. Starting no "
|
391
|
+
"earlier than 3 months after the release date, invalid arguments will error.",
|
392
|
+
DeprecationWarning,
|
393
|
+
2,
|
394
|
+
)
|
395
|
+
justify = "left"
|
396
|
+
|
397
|
+
return justify
|
398
|
+
|
399
|
+
|
373
400
|
def _get_layered_instructions(
|
374
401
|
circuit, reverse_bits=False, justify=None, idle_wires=True, wire_order=None, wire_map=None
|
375
402
|
):
|
@@ -384,9 +411,10 @@ def _get_layered_instructions(
|
|
384
411
|
reverse_bits (bool): If true the order of the bits in the registers is
|
385
412
|
reversed.
|
386
413
|
justify (str) : `left`, `right` or `none`. Defaults to `left`. Says how
|
387
|
-
the circuit should be justified.
|
414
|
+
the circuit should be justified. If an invalid value is provided,
|
415
|
+
default `left` will be used.
|
388
416
|
idle_wires (bool): Include idle wires. Default is True.
|
389
|
-
wire_order (list): A list of ints that modifies the order of the bits
|
417
|
+
wire_order (list): A list of ints that modifies the order of the bits.
|
390
418
|
|
391
419
|
Returns:
|
392
420
|
Tuple(list,list,list): To be consumed by the visualizer directly.
|
@@ -394,11 +422,7 @@ def _get_layered_instructions(
|
|
394
422
|
Raises:
|
395
423
|
VisualizationError: if both reverse_bits and wire_order are entered.
|
396
424
|
"""
|
397
|
-
|
398
|
-
justify = justify.lower()
|
399
|
-
|
400
|
-
# default to left
|
401
|
-
justify = justify if justify in ("right", "none") else "left"
|
425
|
+
justify = _get_valid_justify_arg(justify)
|
402
426
|
|
403
427
|
if wire_map is not None:
|
404
428
|
qubits = [bit for bit in wire_map if isinstance(bit, Qubit)]
|
@@ -28,21 +28,22 @@ from __future__ import annotations
|
|
28
28
|
|
29
29
|
import logging
|
30
30
|
import os
|
31
|
+
import shutil
|
31
32
|
import subprocess
|
32
33
|
import tempfile
|
33
|
-
import shutil
|
34
34
|
import typing
|
35
35
|
from warnings import warn
|
36
36
|
|
37
37
|
from qiskit import user_config
|
38
|
-
from qiskit.utils import optionals as _optionals
|
39
38
|
from qiskit.circuit import ControlFlowOp, Measure
|
39
|
+
from qiskit.utils import optionals as _optionals
|
40
|
+
|
41
|
+
from ..exceptions import VisualizationError
|
42
|
+
from ..utils import _trim as trim_image
|
43
|
+
from . import _utils
|
40
44
|
from . import latex as _latex
|
41
|
-
from . import text as _text
|
42
45
|
from . import matplotlib as _matplotlib
|
43
|
-
from . import
|
44
|
-
from ..utils import _trim as trim_image
|
45
|
-
from ..exceptions import VisualizationError
|
46
|
+
from . import text as _text
|
46
47
|
|
47
48
|
if typing.TYPE_CHECKING:
|
48
49
|
from typing import Any
|
@@ -63,7 +64,7 @@ def circuit_drawer(
|
|
63
64
|
reverse_bits: bool | None = None,
|
64
65
|
justify: str | None = None,
|
65
66
|
vertical_compression: str | None = "medium",
|
66
|
-
idle_wires: bool =
|
67
|
+
idle_wires: bool | None = None,
|
67
68
|
with_layout: bool = True,
|
68
69
|
fold: int | None = None,
|
69
70
|
# The type of ax is matplotlib.axes.Axes, but this is not a fixed dependency, so cannot be
|
@@ -115,7 +116,7 @@ def circuit_drawer(
|
|
115
116
|
|
116
117
|
output: Select the output method to use for drawing the circuit.
|
117
118
|
Valid choices are ``text``, ``mpl``, ``latex``, ``latex_source``.
|
118
|
-
By default the
|
119
|
+
By default, the ``text`` drawer is used unless the user config file
|
119
120
|
(usually ``~/.qiskit/settings.conf``) has an alternative backend set
|
120
121
|
as the default. For example, ``circuit_drawer = latex``. If the output
|
121
122
|
kwarg is set, that backend will always be used over the default in
|
@@ -131,17 +132,19 @@ def circuit_drawer(
|
|
131
132
|
alternative value set. For example, ``circuit_reverse_bits = True``.
|
132
133
|
plot_barriers: Enable/disable drawing barriers in the output
|
133
134
|
circuit. Defaults to ``True``.
|
134
|
-
justify: Options are ``left``, ``right`` or ``none
|
135
|
-
anything else is supplied,
|
136
|
-
to where gates should be placed in the output circuit if
|
137
|
-
an option. ``none`` results in each gate being placed in
|
138
|
-
column.
|
135
|
+
justify: Options are ``"left"``, ``"right"`` or ``"none"`` (str).
|
136
|
+
If anything else is supplied, left justified will be used instead.
|
137
|
+
It refers to where gates should be placed in the output circuit if
|
138
|
+
there is an option. ``none`` results in each gate being placed in
|
139
|
+
its own column. Defaults to ``left``.
|
139
140
|
vertical_compression: ``high``, ``medium`` or ``low``. It
|
140
141
|
merges the lines generated by the `text` output so the drawing
|
141
142
|
will take less vertical room. Default is ``medium``. Only used by
|
142
143
|
the ``text`` output, will be silently ignored otherwise.
|
143
144
|
idle_wires: Include idle wires (wires with no circuit elements)
|
144
|
-
in output visualization. Default is ``True
|
145
|
+
in output visualization. Default is ``True`` unless the
|
146
|
+
user config file (usually ``~/.qiskit/settings.conf``) has an
|
147
|
+
alternative value set. For example, ``circuit_idle_wires = False``.
|
145
148
|
with_layout: Include layout information, with labels on the
|
146
149
|
physical layout. Default is ``True``.
|
147
150
|
fold: Sets pagination. It can be disabled using -1. In ``text``,
|
@@ -200,6 +203,7 @@ def circuit_drawer(
|
|
200
203
|
# Get default from config file else use text
|
201
204
|
default_output = "text"
|
202
205
|
default_reverse_bits = False
|
206
|
+
default_idle_wires = config.get("circuit_idle_wires", True)
|
203
207
|
if config:
|
204
208
|
default_output = config.get("circuit_drawer", "text")
|
205
209
|
if default_output == "auto":
|
@@ -215,6 +219,9 @@ def circuit_drawer(
|
|
215
219
|
if reverse_bits is None:
|
216
220
|
reverse_bits = default_reverse_bits
|
217
221
|
|
222
|
+
if idle_wires is None:
|
223
|
+
idle_wires = default_idle_wires
|
224
|
+
|
218
225
|
if wire_order is not None and reverse_bits:
|
219
226
|
raise VisualizationError(
|
220
227
|
"The wire_order option cannot be set when the reverse_bits option is True."
|
@@ -339,8 +346,8 @@ def circuit_drawer(
|
|
339
346
|
)
|
340
347
|
else:
|
341
348
|
raise VisualizationError(
|
342
|
-
"Invalid output type
|
343
|
-
"are text, latex, latex_source, and mpl"
|
349
|
+
f"Invalid output type {output} selected. The only valid choices "
|
350
|
+
"are text, latex, latex_source, and mpl"
|
344
351
|
)
|
345
352
|
if image and interactive:
|
346
353
|
image.show()
|