cirq-core 1.5.0.dev20250409225226__py3-none-any.whl → 1.6.0__py3-none-any.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.
Potentially problematic release.
This version of cirq-core might be problematic. Click here for more details.
- cirq/__init__.py +16 -17
- cirq/_compat.py +21 -20
- cirq/_compat_test.py +14 -34
- cirq/_doc.py +4 -2
- cirq/_import.py +8 -6
- cirq/_import_test.py +4 -2
- cirq/_version.py +6 -6
- cirq/_version_test.py +2 -2
- cirq/circuits/_block_diagram_drawer.py +11 -10
- cirq/circuits/_block_diagram_drawer_test.py +8 -6
- cirq/circuits/_box_drawing_character_data.py +8 -8
- cirq/circuits/_box_drawing_character_data_test.py +3 -1
- cirq/circuits/_bucket_priority_queue.py +9 -7
- cirq/circuits/_bucket_priority_queue_test.py +22 -20
- cirq/circuits/circuit.py +248 -172
- cirq/circuits/circuit_operation.py +73 -83
- cirq/circuits/circuit_operation_test.py +128 -90
- cirq/circuits/circuit_test.py +211 -151
- cirq/circuits/frozen_circuit.py +23 -60
- cirq/circuits/frozen_circuit_test.py +31 -8
- cirq/circuits/insert_strategy.py +7 -5
- cirq/circuits/insert_strategy_test.py +4 -2
- cirq/circuits/moment.py +88 -40
- cirq/circuits/moment_test.py +128 -51
- cirq/circuits/optimization_pass.py +5 -5
- cirq/circuits/optimization_pass_test.py +10 -10
- cirq/circuits/qasm_output.py +11 -11
- cirq/circuits/qasm_output_test.py +25 -22
- cirq/circuits/text_diagram_drawer.py +23 -38
- cirq/circuits/text_diagram_drawer_test.py +19 -17
- cirq/conftest.py +4 -3
- cirq/contrib/__init__.py +4 -4
- cirq/contrib/acquaintance/__init__.py +1 -1
- cirq/contrib/acquaintance/bipartite.py +5 -8
- cirq/contrib/acquaintance/bipartite_test.py +18 -13
- cirq/contrib/acquaintance/devices.py +2 -2
- cirq/contrib/acquaintance/devices_test.py +5 -3
- cirq/contrib/acquaintance/executor.py +5 -5
- cirq/contrib/acquaintance/executor_test.py +13 -9
- cirq/contrib/acquaintance/gates.py +18 -28
- cirq/contrib/acquaintance/gates_test.py +24 -20
- cirq/contrib/acquaintance/inspection_utils.py +8 -4
- cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
- cirq/contrib/acquaintance/mutation_utils.py +4 -4
- cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
- cirq/contrib/acquaintance/optimizers.py +4 -4
- cirq/contrib/acquaintance/optimizers_test.py +4 -1
- cirq/contrib/acquaintance/permutation.py +15 -27
- cirq/contrib/acquaintance/permutation_test.py +26 -17
- cirq/contrib/acquaintance/shift.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
- cirq/contrib/acquaintance/shift_test.py +8 -6
- cirq/contrib/acquaintance/strategies/cubic.py +2 -2
- cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
- cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
- cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
- cirq/contrib/acquaintance/testing.py +2 -0
- cirq/contrib/acquaintance/topological_sort.py +2 -2
- cirq/contrib/acquaintance/topological_sort_test.py +3 -1
- cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
- cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
- cirq/contrib/circuitdag/circuit_dag.py +4 -4
- cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
- cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
- cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
- cirq/contrib/graph_device/graph_device.py +12 -11
- cirq/contrib/graph_device/graph_device_test.py +18 -14
- cirq/contrib/graph_device/hypergraph.py +16 -14
- cirq/contrib/graph_device/hypergraph_test.py +13 -11
- cirq/contrib/graph_device/uniform_graph_device.py +6 -4
- cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
- cirq/contrib/hacks/disable_validation.py +6 -1
- cirq/contrib/hacks/disable_validation_test.py +3 -1
- cirq/contrib/json.py +31 -5
- cirq/contrib/json_test.py +6 -3
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/__init__.py +17 -0
- cirq/contrib/json_test_data/spec.py +32 -0
- cirq/contrib/noise_models/noise_models.py +119 -5
- cirq/contrib/noise_models/noise_models_test.py +37 -9
- cirq/contrib/paulistring/clifford_optimize.py +6 -4
- cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
- cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
- cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
- cirq/contrib/paulistring/optimize.py +2 -0
- cirq/contrib/paulistring/optimize_test.py +4 -3
- cirq/contrib/paulistring/pauli_string_dag.py +2 -0
- cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
- cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
- cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
- cirq/contrib/paulistring/recombine.py +6 -4
- cirq/contrib/paulistring/recombine_test.py +3 -1
- cirq/contrib/paulistring/separate.py +9 -6
- cirq/contrib/paulistring/separate_test.py +3 -1
- cirq/contrib/qasm_import/_lexer.py +3 -2
- cirq/contrib/qasm_import/_lexer_test.py +49 -13
- cirq/contrib/qasm_import/_parser.py +547 -83
- cirq/contrib/qasm_import/_parser_test.py +988 -97
- cirq/contrib/qasm_import/exception.py +2 -0
- cirq/contrib/qasm_import/qasm.py +8 -2
- cirq/contrib/qasm_import/qasm_test.py +7 -4
- cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
- cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
- cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
- cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
- cirq/contrib/qcircuit/qcircuit_test.py +10 -8
- cirq/contrib/quantum_volume/quantum_volume.py +31 -27
- cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
- cirq/contrib/quimb/density_matrix.py +15 -14
- cirq/contrib/quimb/density_matrix_test.py +10 -7
- cirq/contrib/quimb/grid_circuits.py +5 -2
- cirq/contrib/quimb/grid_circuits_test.py +3 -0
- cirq/contrib/quimb/mps_simulator.py +20 -20
- cirq/contrib/quimb/mps_simulator_test.py +3 -0
- cirq/contrib/quimb/state_vector.py +12 -11
- cirq/contrib/quimb/state_vector_test.py +3 -0
- cirq/contrib/quirk/export_to_quirk.py +5 -3
- cirq/contrib/quirk/export_to_quirk_test.py +18 -16
- cirq/contrib/quirk/linearize_circuit.py +2 -0
- cirq/contrib/quirk/quirk_gate.py +18 -17
- cirq/contrib/routing/device.py +5 -3
- cirq/contrib/routing/device_test.py +2 -0
- cirq/contrib/routing/greedy.py +10 -21
- cirq/contrib/routing/greedy_test.py +4 -2
- cirq/contrib/routing/initialization.py +2 -2
- cirq/contrib/routing/initialization_test.py +5 -3
- cirq/contrib/routing/router.py +9 -5
- cirq/contrib/routing/router_test.py +2 -0
- cirq/contrib/routing/swap_network.py +3 -3
- cirq/contrib/routing/swap_network_test.py +3 -1
- cirq/contrib/routing/utils.py +2 -2
- cirq/contrib/routing/utils_test.py +3 -0
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
- cirq/contrib/svg/svg.py +3 -3
- cirq/contrib/svg/svg_test.py +8 -5
- cirq/devices/device.py +4 -4
- cirq/devices/device_test.py +7 -4
- cirq/devices/grid_device_metadata.py +10 -10
- cirq/devices/grid_device_metadata_test.py +3 -0
- cirq/devices/grid_qubit.py +29 -21
- cirq/devices/grid_qubit_test.py +3 -0
- cirq/devices/insertion_noise_model.py +7 -7
- cirq/devices/insertion_noise_model_test.py +7 -5
- cirq/devices/line_qubit.py +13 -13
- cirq/devices/line_qubit_test.py +2 -0
- cirq/devices/named_topologies.py +18 -29
- cirq/devices/named_topologies_test.py +13 -10
- cirq/devices/noise_model.py +3 -3
- cirq/devices/noise_model_test.py +19 -15
- cirq/devices/noise_properties.py +15 -6
- cirq/devices/noise_properties_test.py +34 -3
- cirq/devices/noise_utils.py +11 -9
- cirq/devices/noise_utils_test.py +2 -0
- cirq/devices/superconducting_qubits_noise_properties.py +23 -22
- cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
- cirq/devices/thermal_noise_model.py +107 -37
- cirq/devices/thermal_noise_model_test.py +21 -0
- cirq/devices/unconstrained_device.py +5 -3
- cirq/devices/unconstrained_device_test.py +2 -0
- cirq/experiments/__init__.py +4 -2
- cirq/experiments/benchmarking/__init__.py +17 -0
- cirq/experiments/benchmarking/parallel_xeb.py +677 -0
- cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
- cirq/experiments/fidelity_estimation.py +14 -8
- cirq/experiments/fidelity_estimation_test.py +3 -0
- cirq/experiments/n_qubit_tomography.py +17 -16
- cirq/experiments/n_qubit_tomography_test.py +8 -5
- cirq/experiments/purity_estimation.py +2 -0
- cirq/experiments/purity_estimation_test.py +2 -0
- cirq/experiments/qubit_characterizations.py +207 -103
- cirq/experiments/qubit_characterizations_test.py +40 -12
- cirq/experiments/random_quantum_circuit_generation.py +56 -70
- cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
- cirq/experiments/readout_confusion_matrix.py +24 -22
- cirq/experiments/readout_confusion_matrix_test.py +2 -0
- cirq/experiments/single_qubit_readout_calibration.py +30 -15
- cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
- cirq/experiments/t1_decay_experiment.py +9 -7
- cirq/experiments/t1_decay_experiment_test.py +13 -11
- cirq/experiments/t2_decay_experiment.py +16 -13
- cirq/experiments/t2_decay_experiment_test.py +2 -0
- cirq/experiments/two_qubit_xeb.py +64 -57
- cirq/experiments/two_qubit_xeb_test.py +10 -6
- cirq/experiments/xeb_fitting.py +39 -35
- cirq/experiments/xeb_sampling.py +37 -44
- cirq/experiments/xeb_sampling_test.py +3 -0
- cirq/experiments/xeb_simulation.py +14 -10
- cirq/experiments/xeb_simulation_test.py +5 -5
- cirq/experiments/z_phase_calibration.py +32 -29
- cirq/experiments/z_phase_calibration_test.py +3 -4
- cirq/interop/quirk/cells/__init__.py +1 -1
- cirq/interop/quirk/cells/all_cells.py +7 -2
- cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
- cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
- cirq/interop/quirk/cells/cell.py +19 -28
- cirq/interop/quirk/cells/cell_test.py +3 -0
- cirq/interop/quirk/cells/composite_cell.py +13 -28
- cirq/interop/quirk/cells/composite_cell_test.py +2 -0
- cirq/interop/quirk/cells/control_cells.py +15 -15
- cirq/interop/quirk/cells/control_cells_test.py +7 -5
- cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
- cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
- cirq/interop/quirk/cells/ignored_cells.py +3 -0
- cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
- cirq/interop/quirk/cells/input_cells.py +7 -5
- cirq/interop/quirk/cells/input_cells_test.py +7 -5
- cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
- cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
- cirq/interop/quirk/cells/measurement_cells.py +5 -2
- cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
- cirq/interop/quirk/cells/parse.py +22 -23
- cirq/interop/quirk/cells/parse_test.py +12 -10
- cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
- cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
- cirq/interop/quirk/cells/scalar_cells.py +4 -1
- cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
- cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
- cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
- cirq/interop/quirk/cells/swap_cell.py +8 -6
- cirq/interop/quirk/cells/swap_cell_test.py +6 -4
- cirq/interop/quirk/cells/testing.py +6 -6
- cirq/interop/quirk/cells/testing_test.py +8 -6
- cirq/interop/quirk/cells/unsupported_cells.py +3 -0
- cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
- cirq/interop/quirk/url_to_circuit.py +23 -36
- cirq/interop/quirk/url_to_circuit_test.py +4 -1
- cirq/json_resolver_cache.py +14 -12
- cirq/linalg/__init__.py +4 -6
- cirq/linalg/combinators.py +7 -5
- cirq/linalg/combinators_test.py +10 -7
- cirq/linalg/decompositions.py +24 -35
- cirq/linalg/decompositions_test.py +3 -1
- cirq/linalg/diagonalize.py +6 -4
- cirq/linalg/diagonalize_test.py +15 -14
- cirq/linalg/operator_spaces.py +14 -14
- cirq/linalg/operator_spaces_test.py +13 -11
- cirq/linalg/predicates.py +18 -9
- cirq/linalg/predicates_test.py +5 -0
- cirq/linalg/tolerance.py +6 -3
- cirq/linalg/tolerance_test.py +6 -4
- cirq/linalg/transformations.py +23 -20
- cirq/linalg/transformations_test.py +73 -43
- cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
- cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
- cirq/neutral_atoms/neutral_atom_devices.py +2 -0
- cirq/ops/__init__.py +2 -0
- cirq/ops/arithmetic_operation.py +21 -21
- cirq/ops/arithmetic_operation_test.py +7 -8
- cirq/ops/boolean_hamiltonian.py +23 -22
- cirq/ops/boolean_hamiltonian_test.py +12 -9
- cirq/ops/classically_controlled_operation.py +31 -36
- cirq/ops/classically_controlled_operation_test.py +121 -117
- cirq/ops/clifford_gate.py +98 -81
- cirq/ops/clifford_gate_test.py +72 -57
- cirq/ops/common_channels.py +44 -44
- cirq/ops/common_channels_test.py +83 -81
- cirq/ops/common_gate_families.py +9 -7
- cirq/ops/common_gate_families_test.py +11 -7
- cirq/ops/common_gates.py +164 -183
- cirq/ops/common_gates_test.py +135 -95
- cirq/ops/control_values.py +23 -26
- cirq/ops/control_values_test.py +22 -20
- cirq/ops/controlled_gate.py +64 -112
- cirq/ops/controlled_gate_test.py +130 -35
- cirq/ops/controlled_operation.py +24 -35
- cirq/ops/controlled_operation_test.py +8 -6
- cirq/ops/dense_pauli_string.py +38 -49
- cirq/ops/dense_pauli_string_test.py +4 -2
- cirq/ops/diagonal_gate.py +18 -31
- cirq/ops/diagonal_gate_test.py +13 -13
- cirq/ops/eigen_gate.py +29 -29
- cirq/ops/eigen_gate_test.py +45 -28
- cirq/ops/fourier_transform.py +14 -20
- cirq/ops/fourier_transform_test.py +15 -12
- cirq/ops/fsim_gate.py +43 -42
- cirq/ops/fsim_gate_test.py +29 -29
- cirq/ops/gate_features.py +2 -0
- cirq/ops/gate_features_test.py +5 -3
- cirq/ops/gate_operation.py +43 -65
- cirq/ops/gate_operation_test.py +46 -42
- cirq/ops/gateset.py +28 -40
- cirq/ops/gateset_test.py +4 -2
- cirq/ops/global_phase_op.py +45 -20
- cirq/ops/global_phase_op_test.py +44 -20
- cirq/ops/greedy_qubit_manager.py +10 -8
- cirq/ops/greedy_qubit_manager_test.py +5 -3
- cirq/ops/identity.py +14 -12
- cirq/ops/identity_test.py +24 -20
- cirq/ops/kraus_channel.py +11 -8
- cirq/ops/kraus_channel_test.py +14 -11
- cirq/ops/linear_combinations.py +65 -77
- cirq/ops/linear_combinations_test.py +14 -9
- cirq/ops/matrix_gates.py +21 -18
- cirq/ops/matrix_gates_test.py +16 -0
- cirq/ops/measure_util.py +15 -20
- cirq/ops/measure_util_test.py +2 -0
- cirq/ops/measurement_gate.py +26 -37
- cirq/ops/measurement_gate_test.py +2 -0
- cirq/ops/mixed_unitary_channel.py +12 -9
- cirq/ops/mixed_unitary_channel_test.py +14 -11
- cirq/ops/named_qubit.py +16 -13
- cirq/ops/named_qubit_test.py +15 -13
- cirq/ops/op_tree.py +9 -7
- cirq/ops/op_tree_test.py +22 -19
- cirq/ops/parallel_gate.py +15 -17
- cirq/ops/parallel_gate_test.py +18 -16
- cirq/ops/parity_gates.py +23 -25
- cirq/ops/parity_gates_test.py +36 -32
- cirq/ops/pauli_gates.py +22 -21
- cirq/ops/pauli_gates_test.py +29 -20
- cirq/ops/pauli_interaction_gate.py +15 -19
- cirq/ops/pauli_interaction_gate_test.py +10 -8
- cirq/ops/pauli_measurement_gate.py +23 -35
- cirq/ops/pauli_measurement_gate_test.py +2 -0
- cirq/ops/pauli_string.py +92 -120
- cirq/ops/pauli_string_phasor.py +52 -45
- cirq/ops/pauli_string_phasor_test.py +4 -5
- cirq/ops/pauli_string_raw_types.py +9 -7
- cirq/ops/pauli_string_raw_types_test.py +2 -0
- cirq/ops/pauli_string_test.py +31 -154
- cirq/ops/pauli_sum_exponential.py +12 -12
- cirq/ops/pauli_sum_exponential_test.py +12 -10
- cirq/ops/permutation_gate.py +8 -6
- cirq/ops/permutation_gate_test.py +10 -8
- cirq/ops/phased_iswap_gate.py +16 -16
- cirq/ops/phased_iswap_gate_test.py +17 -15
- cirq/ops/phased_x_gate.py +16 -17
- cirq/ops/phased_x_gate_test.py +18 -16
- cirq/ops/phased_x_z_gate.py +24 -22
- cirq/ops/phased_x_z_gate_test.py +17 -11
- cirq/ops/projector.py +16 -11
- cirq/ops/projector_test.py +19 -16
- cirq/ops/qid_util.py +7 -5
- cirq/ops/qid_util_test.py +2 -0
- cirq/ops/qubit_manager.py +11 -9
- cirq/ops/qubit_manager_test.py +6 -4
- cirq/ops/qubit_order.py +11 -14
- cirq/ops/qubit_order_or_list.py +4 -2
- cirq/ops/qubit_order_test.py +12 -10
- cirq/ops/random_gate_channel.py +12 -10
- cirq/ops/random_gate_channel_test.py +14 -11
- cirq/ops/raw_types.py +109 -129
- cirq/ops/raw_types_test.py +63 -57
- cirq/ops/state_preparation_channel.py +7 -7
- cirq/ops/state_preparation_channel_test.py +11 -9
- cirq/ops/swap_gates.py +13 -15
- cirq/ops/swap_gates_test.py +19 -17
- cirq/ops/tags.py +5 -3
- cirq/ops/tags_test.py +4 -2
- cirq/ops/three_qubit_gates.py +43 -76
- cirq/ops/three_qubit_gates_test.py +19 -17
- cirq/ops/two_qubit_diagonal_gate.py +13 -13
- cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
- cirq/ops/uniform_superposition_gate.py +5 -3
- cirq/ops/uniform_superposition_gate_test.py +5 -3
- cirq/ops/wait_gate.py +17 -14
- cirq/ops/wait_gate_test.py +9 -6
- cirq/protocols/__init__.py +0 -3
- cirq/protocols/act_on_protocol.py +8 -6
- cirq/protocols/act_on_protocol_test.py +15 -12
- cirq/protocols/apply_channel_protocol.py +10 -14
- cirq/protocols/apply_channel_protocol_test.py +2 -0
- cirq/protocols/apply_mixture_protocol.py +13 -42
- cirq/protocols/apply_mixture_protocol_test.py +7 -5
- cirq/protocols/apply_unitary_protocol.py +39 -34
- cirq/protocols/apply_unitary_protocol_test.py +4 -1
- cirq/protocols/approximate_equality_protocol.py +2 -0
- cirq/protocols/approximate_equality_protocol_test.py +2 -0
- cirq/protocols/circuit_diagram_info_protocol.py +58 -42
- cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
- cirq/protocols/commutes_protocol.py +8 -7
- cirq/protocols/commutes_protocol_test.py +2 -0
- cirq/protocols/control_key_protocol.py +6 -4
- cirq/protocols/control_key_protocol_test.py +3 -1
- cirq/protocols/decompose_protocol.py +49 -48
- cirq/protocols/decompose_protocol_test.py +27 -16
- cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
- cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
- cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
- cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
- cirq/protocols/has_unitary_protocol.py +10 -6
- cirq/protocols/has_unitary_protocol_test.py +13 -8
- cirq/protocols/hash_from_pickle_test.py +2 -11
- cirq/protocols/inverse_protocol.py +13 -16
- cirq/protocols/inverse_protocol_test.py +5 -3
- cirq/protocols/json_serialization.py +35 -54
- cirq/protocols/json_serialization_test.py +14 -21
- cirq/protocols/json_test_data/CXSWAP.json +46 -0
- cirq/protocols/json_test_data/CXSWAP.repr +13 -0
- cirq/protocols/json_test_data/CZSWAP.json +46 -0
- cirq/protocols/json_test_data/CZSWAP.repr +13 -0
- cirq/protocols/json_test_data/CircuitOperation.json +6 -3
- cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
- cirq/protocols/json_test_data/Moment.json +24 -1
- cirq/protocols/json_test_data/Moment.repr +6 -1
- cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
- cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
- cirq/protocols/json_test_data/spec.py +6 -2
- cirq/protocols/kraus_protocol.py +47 -7
- cirq/protocols/kraus_protocol_test.py +86 -12
- cirq/protocols/measurement_key_protocol.py +15 -16
- cirq/protocols/measurement_key_protocol_test.py +13 -11
- cirq/protocols/mixture_protocol.py +7 -5
- cirq/protocols/mixture_protocol_test.py +4 -2
- cirq/protocols/mul_protocol.py +2 -3
- cirq/protocols/mul_protocol_test.py +2 -0
- cirq/protocols/pauli_expansion_protocol.py +6 -3
- cirq/protocols/pauli_expansion_protocol_test.py +5 -3
- cirq/protocols/phase_protocol.py +2 -0
- cirq/protocols/phase_protocol_test.py +3 -1
- cirq/protocols/pow_protocol.py +11 -16
- cirq/protocols/pow_protocol_test.py +2 -0
- cirq/protocols/qasm.py +14 -20
- cirq/protocols/qasm_test.py +6 -3
- cirq/protocols/qid_shape_protocol.py +8 -8
- cirq/protocols/qid_shape_protocol_test.py +3 -1
- cirq/protocols/resolve_parameters.py +5 -3
- cirq/protocols/resolve_parameters_test.py +8 -7
- cirq/protocols/trace_distance_bound.py +6 -4
- cirq/protocols/trace_distance_bound_test.py +3 -1
- cirq/protocols/unitary_protocol.py +17 -7
- cirq/protocols/unitary_protocol_test.py +12 -2
- cirq/qis/channels.py +6 -2
- cirq/qis/channels_test.py +20 -16
- cirq/qis/clifford_tableau.py +21 -19
- cirq/qis/clifford_tableau_test.py +2 -2
- cirq/qis/entropy.py +14 -3
- cirq/qis/entropy_test.py +3 -1
- cirq/qis/measures.py +13 -13
- cirq/qis/measures_test.py +20 -14
- cirq/qis/noise_utils.py +2 -0
- cirq/qis/noise_utils_test.py +9 -7
- cirq/qis/quantum_state_representation.py +7 -8
- cirq/qis/states.py +58 -56
- cirq/qis/states_test.py +2 -0
- cirq/sim/classical_simulator.py +23 -22
- cirq/sim/classical_simulator_test.py +2 -0
- cirq/sim/clifford/clifford_simulator.py +23 -21
- cirq/sim/clifford/clifford_simulator_test.py +7 -4
- cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
- cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
- cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
- cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
- cirq/sim/clifford/stabilizer_sampler.py +9 -7
- cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
- cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
- cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
- cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
- cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
- cirq/sim/density_matrix_simulation_state.py +26 -27
- cirq/sim/density_matrix_simulation_state_test.py +10 -8
- cirq/sim/density_matrix_simulator.py +30 -28
- cirq/sim/density_matrix_simulator_test.py +48 -48
- cirq/sim/density_matrix_utils.py +13 -11
- cirq/sim/density_matrix_utils_test.py +38 -36
- cirq/sim/mux.py +33 -31
- cirq/sim/mux_test.py +3 -0
- cirq/sim/simulation_product_state.py +15 -15
- cirq/sim/simulation_product_state_test.py +29 -26
- cirq/sim/simulation_state.py +29 -38
- cirq/sim/simulation_state_base.py +21 -32
- cirq/sim/simulation_state_test.py +15 -13
- cirq/sim/simulation_utils.py +5 -2
- cirq/sim/simulation_utils_test.py +5 -2
- cirq/sim/simulator.py +90 -106
- cirq/sim/simulator_base.py +33 -45
- cirq/sim/simulator_base_test.py +20 -15
- cirq/sim/simulator_test.py +23 -14
- cirq/sim/sparse_simulator.py +19 -17
- cirq/sim/sparse_simulator_test.py +41 -40
- cirq/sim/state_vector.py +15 -12
- cirq/sim/state_vector_simulation_state.py +31 -31
- cirq/sim/state_vector_simulation_state_test.py +16 -14
- cirq/sim/state_vector_simulator.py +17 -14
- cirq/sim/state_vector_simulator_test.py +2 -0
- cirq/sim/state_vector_test.py +6 -3
- cirq/study/flatten_expressions.py +16 -15
- cirq/study/flatten_expressions_test.py +13 -11
- cirq/study/resolver.py +18 -17
- cirq/study/resolver_test.py +22 -20
- cirq/study/result.py +17 -27
- cirq/study/result_test.py +2 -0
- cirq/study/sweepable.py +12 -10
- cirq/study/sweepable_test.py +3 -0
- cirq/study/sweeps.py +42 -61
- cirq/study/sweeps_test.py +33 -0
- cirq/testing/__init__.py +7 -11
- cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
- cirq/testing/circuit_compare.py +8 -17
- cirq/testing/circuit_compare_test.py +2 -0
- cirq/testing/consistent_act_on.py +13 -11
- cirq/testing/consistent_act_on_test.py +5 -3
- cirq/testing/consistent_channels.py +2 -0
- cirq/testing/consistent_channels_test.py +10 -8
- cirq/testing/consistent_controlled_gate_op.py +5 -5
- cirq/testing/consistent_controlled_gate_op_test.py +18 -18
- cirq/testing/consistent_decomposition.py +2 -2
- cirq/testing/consistent_decomposition_test.py +4 -2
- cirq/testing/consistent_pauli_expansion.py +2 -0
- cirq/testing/consistent_pauli_expansion_test.py +3 -1
- cirq/testing/consistent_phase_by.py +2 -0
- cirq/testing/consistent_phase_by_test.py +3 -1
- cirq/testing/consistent_protocols.py +14 -20
- cirq/testing/consistent_protocols_test.py +13 -11
- cirq/testing/consistent_qasm.py +6 -4
- cirq/testing/consistent_qasm_test.py +7 -7
- cirq/testing/consistent_resolve_parameters.py +2 -0
- cirq/testing/consistent_specified_has_unitary.py +2 -2
- cirq/testing/consistent_specified_has_unitary_test.py +6 -4
- cirq/testing/consistent_unitary.py +1 -0
- cirq/testing/consistent_unitary_test.py +4 -2
- cirq/testing/deprecation.py +5 -2
- cirq/testing/deprecation_test.py +5 -2
- cirq/testing/devices.py +7 -4
- cirq/testing/devices_test.py +7 -4
- cirq/testing/equals_tester.py +4 -2
- cirq/testing/equals_tester_test.py +21 -17
- cirq/testing/equivalent_basis_map.py +6 -4
- cirq/testing/equivalent_basis_map_test.py +6 -4
- cirq/testing/equivalent_repr_eval.py +6 -4
- cirq/testing/equivalent_repr_eval_test.py +5 -3
- cirq/testing/gate_features.py +2 -0
- cirq/testing/gate_features_test.py +7 -5
- cirq/testing/json.py +19 -15
- cirq/testing/json_test.py +5 -3
- cirq/testing/lin_alg_utils.py +10 -11
- cirq/testing/lin_alg_utils_test.py +14 -12
- cirq/testing/logs.py +7 -6
- cirq/testing/logs_test.py +9 -7
- cirq/testing/no_identifier_qubit.py +4 -2
- cirq/testing/no_identifier_qubit_test.py +5 -3
- cirq/testing/op_tree.py +2 -0
- cirq/testing/op_tree_test.py +4 -1
- cirq/testing/order_tester.py +2 -0
- cirq/testing/order_tester_test.py +8 -6
- cirq/testing/pytest_utils.py +2 -0
- cirq/testing/pytest_utils_test.py +4 -2
- cirq/testing/random_circuit.py +21 -20
- cirq/testing/random_circuit_test.py +12 -9
- cirq/testing/repr_pretty_tester.py +1 -0
- cirq/testing/repr_pretty_tester_test.py +5 -3
- cirq/testing/routing_devices.py +4 -1
- cirq/testing/routing_devices_test.py +9 -6
- cirq/testing/sample_circuits.py +4 -1
- cirq/testing/sample_circuits_test.py +3 -1
- cirq/testing/sample_gates.py +3 -0
- cirq/testing/sample_gates_test.py +5 -2
- cirq/transformers/__init__.py +11 -4
- cirq/transformers/align.py +9 -7
- cirq/transformers/align_test.py +2 -0
- cirq/transformers/analytical_decompositions/__init__.py +3 -6
- cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
- cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
- cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
- cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
- cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
- cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
- cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
- cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
- cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
- cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
- cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
- cirq/transformers/drop_empty_moments.py +5 -3
- cirq/transformers/drop_empty_moments_test.py +4 -2
- cirq/transformers/drop_negligible_operations.py +7 -5
- cirq/transformers/drop_negligible_operations_test.py +2 -0
- cirq/transformers/dynamical_decoupling.py +49 -42
- cirq/transformers/dynamical_decoupling_test.py +223 -205
- cirq/transformers/eject_phased_paulis.py +28 -26
- cirq/transformers/eject_phased_paulis_test.py +12 -9
- cirq/transformers/eject_z.py +12 -12
- cirq/transformers/eject_z_test.py +2 -2
- cirq/transformers/expand_composite.py +6 -4
- cirq/transformers/expand_composite_test.py +3 -1
- cirq/transformers/gauge_compiling/__init__.py +3 -1
- cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
- cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
- cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
- cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
- cirq/transformers/insertion_sort.py +8 -6
- cirq/transformers/insertion_sort_test.py +3 -1
- cirq/transformers/measurement_transformers.py +29 -29
- cirq/transformers/measurement_transformers_test.py +2 -0
- cirq/transformers/merge_k_qubit_gates.py +12 -10
- cirq/transformers/merge_k_qubit_gates_test.py +18 -18
- cirq/transformers/merge_single_qubit_gates.py +197 -20
- cirq/transformers/merge_single_qubit_gates_test.py +177 -5
- cirq/transformers/noise_adding.py +5 -3
- cirq/transformers/noise_adding_test.py +2 -0
- cirq/transformers/optimize_for_target_gateset.py +19 -17
- cirq/transformers/optimize_for_target_gateset_test.py +11 -8
- cirq/transformers/qubit_management_transformers.py +13 -11
- cirq/transformers/qubit_management_transformers_test.py +5 -3
- cirq/transformers/randomized_measurements.py +16 -14
- cirq/transformers/randomized_measurements_test.py +10 -4
- cirq/transformers/routing/initial_mapper.py +6 -4
- cirq/transformers/routing/initial_mapper_test.py +2 -0
- cirq/transformers/routing/line_initial_mapper.py +16 -14
- cirq/transformers/routing/line_initial_mapper_test.py +9 -7
- cirq/transformers/routing/mapping_manager.py +10 -10
- cirq/transformers/routing/mapping_manager_test.py +2 -0
- cirq/transformers/routing/route_circuit_cqc.py +33 -31
- cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
- cirq/transformers/routing/visualize_routed_circuit.py +8 -7
- cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
- cirq/transformers/stratify.py +17 -15
- cirq/transformers/stratify_test.py +3 -0
- cirq/transformers/symbolize.py +103 -0
- cirq/transformers/symbolize_test.py +62 -0
- cirq/transformers/synchronize_terminal_measurements.py +10 -10
- cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
- cirq/transformers/tag_transformers.py +97 -0
- cirq/transformers/tag_transformers_test.py +103 -0
- cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
- cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
- cirq/transformers/target_gatesets/cz_gateset.py +7 -5
- cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
- cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
- cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
- cirq/transformers/transformer_api.py +34 -47
- cirq/transformers/transformer_api_test.py +9 -8
- cirq/transformers/transformer_primitives.py +39 -49
- cirq/transformers/transformer_primitives_test.py +10 -17
- cirq/value/abc_alt.py +6 -4
- cirq/value/abc_alt_test.py +5 -3
- cirq/value/angle.py +11 -12
- cirq/value/angle_test.py +5 -3
- cirq/value/classical_data.py +27 -27
- cirq/value/classical_data_test.py +11 -8
- cirq/value/condition.py +26 -24
- cirq/value/condition_test.py +2 -0
- cirq/value/digits.py +14 -11
- cirq/value/digits_test.py +2 -0
- cirq/value/duration.py +23 -20
- cirq/value/duration_test.py +2 -0
- cirq/value/linear_dict.py +25 -30
- cirq/value/linear_dict_test.py +10 -8
- cirq/value/measurement_key.py +12 -12
- cirq/value/measurement_key_test.py +2 -0
- cirq/value/periodic_value.py +4 -4
- cirq/value/periodic_value_test.py +11 -7
- cirq/value/probability.py +3 -1
- cirq/value/probability_test.py +4 -2
- cirq/value/product_state.py +15 -13
- cirq/value/product_state_test.py +4 -1
- cirq/value/random_state.py +2 -0
- cirq/value/random_state_test.py +5 -3
- cirq/value/timestamp.py +11 -7
- cirq/value/timestamp_test.py +14 -12
- cirq/value/type_alias.py +4 -4
- cirq/value/value_equality_attr.py +8 -9
- cirq/value/value_equality_attr_test.py +14 -11
- cirq/vis/density_matrix.py +3 -3
- cirq/vis/density_matrix_test.py +20 -17
- cirq/vis/heatmap.py +24 -37
- cirq/vis/heatmap_test.py +3 -0
- cirq/vis/histogram.py +9 -6
- cirq/vis/histogram_test.py +5 -2
- cirq/vis/state_histogram.py +10 -8
- cirq/vis/state_histogram_test.py +7 -5
- cirq/vis/vis_utils.py +4 -1
- cirq/vis/vis_utils_test.py +4 -1
- cirq/work/collector.py +12 -18
- cirq/work/collector_test.py +15 -10
- cirq/work/observable_grouping.py +6 -7
- cirq/work/observable_grouping_test.py +10 -9
- cirq/work/observable_measurement.py +47 -45
- cirq/work/observable_measurement_data.py +22 -17
- cirq/work/observable_measurement_data_test.py +4 -1
- cirq/work/observable_measurement_test.py +48 -29
- cirq/work/observable_readout_calibration.py +5 -2
- cirq/work/observable_readout_calibration_test.py +5 -2
- cirq/work/observable_settings.py +13 -22
- cirq/work/observable_settings_test.py +9 -7
- cirq/work/pauli_sum_collector.py +12 -10
- cirq/work/pauli_sum_collector_test.py +9 -9
- cirq/work/sampler.py +42 -43
- cirq/work/sampler_test.py +31 -24
- cirq/work/zeros_sampler.py +6 -4
- cirq/work/zeros_sampler_test.py +7 -5
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
- cirq_core-1.6.0.dist-info/RECORD +1241 -0
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
- cirq_core-1.5.0.dev20250409225226.dist-info/RECORD +0 -1216
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
cirq/circuits/qasm_output.py
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
from __future__ import annotations
|
|
18
18
|
|
|
19
19
|
import re
|
|
20
|
-
from typing import Callable,
|
|
20
|
+
from typing import Callable, Iterator, Sequence, TYPE_CHECKING
|
|
21
21
|
|
|
22
22
|
import numpy as np
|
|
23
23
|
|
|
@@ -55,7 +55,7 @@ class QasmUGate(ops.Gate):
|
|
|
55
55
|
def _has_unitary_(self):
|
|
56
56
|
return True
|
|
57
57
|
|
|
58
|
-
def _qasm_(self, qubits:
|
|
58
|
+
def _qasm_(self, qubits: tuple[cirq.Qid, ...], args: cirq.QasmArgs) -> str:
|
|
59
59
|
args.validate_version('2.0', '3.0')
|
|
60
60
|
return args.format(
|
|
61
61
|
'u3({0:half_turns},{1:half_turns},{2:half_turns}) {3};\n',
|
|
@@ -84,7 +84,7 @@ class QasmUGate(ops.Gate):
|
|
|
84
84
|
def _value_equality_values_(self):
|
|
85
85
|
return self.lmda, self.theta, self.phi
|
|
86
86
|
|
|
87
|
-
def _json_dict_(self) ->
|
|
87
|
+
def _json_dict_(self) -> dict[str, float]:
|
|
88
88
|
return {'theta': self.theta, 'phi': self.phi, 'lmda': self.lmda}
|
|
89
89
|
|
|
90
90
|
@classmethod
|
|
@@ -173,7 +173,7 @@ class QasmOutput:
|
|
|
173
173
|
def __init__(
|
|
174
174
|
self,
|
|
175
175
|
operations: cirq.OP_TREE,
|
|
176
|
-
qubits:
|
|
176
|
+
qubits: tuple[cirq.Qid, ...],
|
|
177
177
|
header: str = '',
|
|
178
178
|
precision: int = 10,
|
|
179
179
|
version: str = '2.0',
|
|
@@ -208,10 +208,10 @@ class QasmOutput:
|
|
|
208
208
|
meas_key_bitcount={k: v[0] for k, v in self.cregs.items()},
|
|
209
209
|
)
|
|
210
210
|
|
|
211
|
-
def _generate_measurement_ids(self) ->
|
|
211
|
+
def _generate_measurement_ids(self) -> tuple[dict[str, str], dict[str, str | None]]:
|
|
212
212
|
# Pick an id for the creg that will store each measurement
|
|
213
|
-
meas_key_id_map:
|
|
214
|
-
meas_comments:
|
|
213
|
+
meas_key_id_map: dict[str, str] = {}
|
|
214
|
+
meas_comments: dict[str, str | None] = {}
|
|
215
215
|
meas_i = 0
|
|
216
216
|
for meas in self.measurements:
|
|
217
217
|
key = protocols.measurement_key_name(meas)
|
|
@@ -227,10 +227,10 @@ class QasmOutput:
|
|
|
227
227
|
meas_key_id_map[key] = meas_id
|
|
228
228
|
return meas_key_id_map, meas_comments
|
|
229
229
|
|
|
230
|
-
def _generate_qubit_ids(self) ->
|
|
230
|
+
def _generate_qubit_ids(self) -> dict[cirq.Qid, str]:
|
|
231
231
|
return {qubit: f'q[{i}]' for i, qubit in enumerate(self.qubits)}
|
|
232
232
|
|
|
233
|
-
def _generate_cregs(self, meas_key_id_map:
|
|
233
|
+
def _generate_cregs(self, meas_key_id_map: dict[str, str]) -> dict[str, tuple[int, str]]:
|
|
234
234
|
"""Pick an id for the creg that will store each measurement
|
|
235
235
|
|
|
236
236
|
This function finds the largest measurement using each key.
|
|
@@ -239,7 +239,7 @@ class QasmOutput:
|
|
|
239
239
|
|
|
240
240
|
Returns: dictionary with key of measurement id and value of (#qubits, comment).
|
|
241
241
|
"""
|
|
242
|
-
cregs:
|
|
242
|
+
cregs: dict[str, tuple[int, str]] = {}
|
|
243
243
|
for meas in self.measurements:
|
|
244
244
|
key = protocols.measurement_key_name(meas)
|
|
245
245
|
meas_id = meas_key_id_map[key]
|
|
@@ -258,7 +258,7 @@ class QasmOutput:
|
|
|
258
258
|
"""Test if id_str is a valid id in QASM grammar."""
|
|
259
259
|
return self.valid_id_re.match(id_str) is not None
|
|
260
260
|
|
|
261
|
-
def save(self, path:
|
|
261
|
+
def save(self, path: str | bytes | int) -> None:
|
|
262
262
|
"""Write QASM output to a file specified by path."""
|
|
263
263
|
with open(path, 'w') as f:
|
|
264
264
|
|
|
@@ -11,6 +11,9 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
14
17
|
import os
|
|
15
18
|
import re
|
|
16
19
|
|
|
@@ -26,12 +29,12 @@ def _make_qubits(n):
|
|
|
26
29
|
return [cirq.NamedQubit(f'q{i}') for i in range(n)]
|
|
27
30
|
|
|
28
31
|
|
|
29
|
-
def test_u_gate_repr():
|
|
32
|
+
def test_u_gate_repr() -> None:
|
|
30
33
|
gate = QasmUGate(0.1, 0.2, 0.3)
|
|
31
34
|
assert repr(gate) == 'cirq.circuits.qasm_output.QasmUGate(theta=0.1, phi=0.2, lmda=0.3)'
|
|
32
35
|
|
|
33
36
|
|
|
34
|
-
def test_u_gate_eq():
|
|
37
|
+
def test_u_gate_eq() -> None:
|
|
35
38
|
gate = QasmUGate(0.1, 0.2, 0.3)
|
|
36
39
|
gate2 = QasmUGate(0.1, 0.2, 0.3)
|
|
37
40
|
cirq.approx_eq(gate, gate2, atol=1e-16)
|
|
@@ -40,13 +43,13 @@ def test_u_gate_eq():
|
|
|
40
43
|
cirq.approx_eq(gate4, gate3, atol=1e-16)
|
|
41
44
|
|
|
42
45
|
|
|
43
|
-
def test_qasm_two_qubit_gate_repr():
|
|
46
|
+
def test_qasm_two_qubit_gate_repr() -> None:
|
|
44
47
|
cirq.testing.assert_equivalent_repr(
|
|
45
48
|
QasmTwoQubitGate.from_matrix(cirq.testing.random_unitary(4))
|
|
46
49
|
)
|
|
47
50
|
|
|
48
51
|
|
|
49
|
-
def test_qasm_u_qubit_gate_unitary():
|
|
52
|
+
def test_qasm_u_qubit_gate_unitary() -> None:
|
|
50
53
|
u = cirq.testing.random_unitary(2)
|
|
51
54
|
g = QasmUGate.from_matrix(u)
|
|
52
55
|
cirq.testing.assert_allclose_up_to_global_phase(cirq.unitary(g), u, atol=1e-7)
|
|
@@ -59,13 +62,13 @@ def test_qasm_u_qubit_gate_unitary():
|
|
|
59
62
|
cirq.testing.assert_implements_consistent_protocols(g)
|
|
60
63
|
|
|
61
64
|
|
|
62
|
-
def test_qasm_two_qubit_gate_unitary():
|
|
65
|
+
def test_qasm_two_qubit_gate_unitary() -> None:
|
|
63
66
|
u = cirq.testing.random_unitary(4)
|
|
64
67
|
g = QasmTwoQubitGate.from_matrix(u)
|
|
65
68
|
np.testing.assert_allclose(cirq.unitary(g), u)
|
|
66
69
|
|
|
67
70
|
|
|
68
|
-
def test_empty_circuit_one_qubit():
|
|
71
|
+
def test_empty_circuit_one_qubit() -> None:
|
|
69
72
|
(q0,) = _make_qubits(1)
|
|
70
73
|
output = cirq.QasmOutput((), (q0,))
|
|
71
74
|
assert (
|
|
@@ -80,7 +83,7 @@ qreg q[1];
|
|
|
80
83
|
)
|
|
81
84
|
|
|
82
85
|
|
|
83
|
-
def test_empty_circuit_no_qubits():
|
|
86
|
+
def test_empty_circuit_no_qubits() -> None:
|
|
84
87
|
output = cirq.QasmOutput((), ())
|
|
85
88
|
assert (
|
|
86
89
|
str(output)
|
|
@@ -93,7 +96,7 @@ include "qelib1.inc";
|
|
|
93
96
|
)
|
|
94
97
|
|
|
95
98
|
|
|
96
|
-
def test_header():
|
|
99
|
+
def test_header() -> None:
|
|
97
100
|
(q0,) = _make_qubits(1)
|
|
98
101
|
output = cirq.QasmOutput(
|
|
99
102
|
(),
|
|
@@ -140,7 +143,7 @@ qreg q[1];
|
|
|
140
143
|
)
|
|
141
144
|
|
|
142
145
|
|
|
143
|
-
def test_single_gate_no_parameter():
|
|
146
|
+
def test_single_gate_no_parameter() -> None:
|
|
144
147
|
(q0,) = _make_qubits(1)
|
|
145
148
|
output = cirq.QasmOutput((cirq.X(q0),), (q0,))
|
|
146
149
|
assert (
|
|
@@ -158,7 +161,7 @@ x q[0];
|
|
|
158
161
|
)
|
|
159
162
|
|
|
160
163
|
|
|
161
|
-
def test_single_gate_with_parameter():
|
|
164
|
+
def test_single_gate_with_parameter() -> None:
|
|
162
165
|
(q0,) = _make_qubits(1)
|
|
163
166
|
output = cirq.QasmOutput((cirq.X(q0) ** 0.25,), (q0,))
|
|
164
167
|
assert (
|
|
@@ -176,7 +179,7 @@ rx(pi*0.25) q[0];
|
|
|
176
179
|
)
|
|
177
180
|
|
|
178
181
|
|
|
179
|
-
def test_h_gate_with_parameter():
|
|
182
|
+
def test_h_gate_with_parameter() -> None:
|
|
180
183
|
(q0,) = _make_qubits(1)
|
|
181
184
|
output = cirq.QasmOutput((cirq.H(q0) ** 0.25,), (q0,))
|
|
182
185
|
assert (
|
|
@@ -197,7 +200,7 @@ ry(pi*-0.25) q[0];
|
|
|
197
200
|
)
|
|
198
201
|
|
|
199
202
|
|
|
200
|
-
def test_qasm_global_pahse():
|
|
203
|
+
def test_qasm_global_pahse() -> None:
|
|
201
204
|
output = cirq.QasmOutput((cirq.global_phase_operation(np.exp(1j * 5))), ())
|
|
202
205
|
assert (
|
|
203
206
|
str(output)
|
|
@@ -210,7 +213,7 @@ include "qelib1.inc";
|
|
|
210
213
|
)
|
|
211
214
|
|
|
212
215
|
|
|
213
|
-
def test_precision():
|
|
216
|
+
def test_precision() -> None:
|
|
214
217
|
(q0,) = _make_qubits(1)
|
|
215
218
|
output = cirq.QasmOutput((cirq.X(q0) ** 0.1234567,), (q0,), precision=3)
|
|
216
219
|
assert (
|
|
@@ -228,14 +231,14 @@ rx(pi*0.123) q[0];
|
|
|
228
231
|
)
|
|
229
232
|
|
|
230
233
|
|
|
231
|
-
def test_version():
|
|
234
|
+
def test_version() -> None:
|
|
232
235
|
(q0,) = _make_qubits(1)
|
|
233
236
|
with pytest.raises(ValueError):
|
|
234
237
|
output = cirq.QasmOutput((), (q0,), version='4.0')
|
|
235
238
|
_ = str(output)
|
|
236
239
|
|
|
237
240
|
|
|
238
|
-
def test_save_to_file(tmpdir):
|
|
241
|
+
def test_save_to_file(tmpdir) -> None:
|
|
239
242
|
file_path = os.path.join(tmpdir, 'test.qasm')
|
|
240
243
|
(q0,) = _make_qubits(1)
|
|
241
244
|
output = cirq.QasmOutput((), (q0,))
|
|
@@ -254,7 +257,7 @@ qreg q[1];
|
|
|
254
257
|
)
|
|
255
258
|
|
|
256
259
|
|
|
257
|
-
def test_unsupported_operation():
|
|
260
|
+
def test_unsupported_operation() -> None:
|
|
258
261
|
(q0,) = _make_qubits(1)
|
|
259
262
|
|
|
260
263
|
class UnsupportedOperation(cirq.Operation):
|
|
@@ -266,7 +269,7 @@ def test_unsupported_operation():
|
|
|
266
269
|
_ = str(output)
|
|
267
270
|
|
|
268
271
|
|
|
269
|
-
def _all_operations(q0, q1, q2, q3, q4, include_measurements=True):
|
|
272
|
+
def _all_operations(q0, q1, q2, q3, q4, *, include_measurements=True):
|
|
270
273
|
class ExampleOperation(cirq.Operation):
|
|
271
274
|
qubits = (q0,)
|
|
272
275
|
with_qubits = NotImplemented
|
|
@@ -354,7 +357,7 @@ def _all_operations(q0, q1, q2, q3, q4, include_measurements=True):
|
|
|
354
357
|
)
|
|
355
358
|
|
|
356
359
|
|
|
357
|
-
def test_output_unitary_same_as_qiskit():
|
|
360
|
+
def test_output_unitary_same_as_qiskit() -> None:
|
|
358
361
|
qubits = tuple(_make_qubits(5))
|
|
359
362
|
operations = _all_operations(*qubits, include_measurements=False)
|
|
360
363
|
output = cirq.QasmOutput(operations, qubits, header='Generated from Cirq', precision=10)
|
|
@@ -365,7 +368,7 @@ def test_output_unitary_same_as_qiskit():
|
|
|
365
368
|
cq.assert_qiskit_parsed_qasm_consistent_with_unitary(text, cirq_unitary)
|
|
366
369
|
|
|
367
370
|
|
|
368
|
-
def test_fails_on_big_unknowns():
|
|
371
|
+
def test_fails_on_big_unknowns() -> None:
|
|
369
372
|
class UnrecognizedGate(cirq.testing.ThreeQubitGate):
|
|
370
373
|
pass
|
|
371
374
|
|
|
@@ -374,7 +377,7 @@ def test_fails_on_big_unknowns():
|
|
|
374
377
|
_ = c.to_qasm()
|
|
375
378
|
|
|
376
379
|
|
|
377
|
-
def test_output_format():
|
|
380
|
+
def test_output_format() -> None:
|
|
378
381
|
def filter_unpredictable_numbers(text):
|
|
379
382
|
return re.sub(r'u3\(.+\)', r'u3(<not-repeatable>)', text)
|
|
380
383
|
|
|
@@ -568,7 +571,7 @@ x q[0];
|
|
|
568
571
|
)
|
|
569
572
|
|
|
570
573
|
|
|
571
|
-
def test_reset():
|
|
574
|
+
def test_reset() -> None:
|
|
572
575
|
a, b = cirq.LineQubit.range(2)
|
|
573
576
|
c = cirq.Circuit(cirq.H(a), cirq.CNOT(a, b), cirq.reset(a), cirq.reset(b))
|
|
574
577
|
output = cirq.QasmOutput(
|
|
@@ -598,7 +601,7 @@ reset q[1];
|
|
|
598
601
|
)
|
|
599
602
|
|
|
600
603
|
|
|
601
|
-
def test_different_sized_registers():
|
|
604
|
+
def test_different_sized_registers() -> None:
|
|
602
605
|
qubits = cirq.LineQubit.range(2)
|
|
603
606
|
c = cirq.Circuit(cirq.measure(qubits[0], key='c'), cirq.measure(qubits, key='c'))
|
|
604
607
|
output = cirq.QasmOutput(
|
|
@@ -14,20 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
from __future__ import annotations
|
|
16
16
|
|
|
17
|
-
from typing import
|
|
18
|
-
Any,
|
|
19
|
-
Callable,
|
|
20
|
-
cast,
|
|
21
|
-
Dict,
|
|
22
|
-
Iterable,
|
|
23
|
-
List,
|
|
24
|
-
Mapping,
|
|
25
|
-
NamedTuple,
|
|
26
|
-
Optional,
|
|
27
|
-
Sequence,
|
|
28
|
-
Tuple,
|
|
29
|
-
TYPE_CHECKING,
|
|
30
|
-
)
|
|
17
|
+
from typing import Any, Callable, cast, Iterable, Mapping, NamedTuple, Self, Sequence, TYPE_CHECKING
|
|
31
18
|
|
|
32
19
|
import numpy as np
|
|
33
20
|
|
|
@@ -73,25 +60,25 @@ class TextDiagramDrawer:
|
|
|
73
60
|
|
|
74
61
|
def __init__(
|
|
75
62
|
self,
|
|
76
|
-
entries:
|
|
77
|
-
horizontal_lines:
|
|
78
|
-
vertical_lines:
|
|
79
|
-
horizontal_padding:
|
|
80
|
-
vertical_padding:
|
|
63
|
+
entries: Mapping[tuple[int, int], _DiagramText] | None = None,
|
|
64
|
+
horizontal_lines: Iterable[_HorizontalLine] | None = None,
|
|
65
|
+
vertical_lines: Iterable[_VerticalLine] | None = None,
|
|
66
|
+
horizontal_padding: Mapping[int, float] | None = None,
|
|
67
|
+
vertical_padding: Mapping[int, float] | None = None,
|
|
81
68
|
) -> None:
|
|
82
|
-
self.entries:
|
|
69
|
+
self.entries: dict[tuple[int, int], _DiagramText] = (
|
|
83
70
|
dict() if entries is None else dict(entries)
|
|
84
71
|
)
|
|
85
|
-
self.horizontal_lines:
|
|
72
|
+
self.horizontal_lines: list[_HorizontalLine] = (
|
|
86
73
|
[] if horizontal_lines is None else list(horizontal_lines)
|
|
87
74
|
)
|
|
88
|
-
self.vertical_lines:
|
|
75
|
+
self.vertical_lines: list[_VerticalLine] = (
|
|
89
76
|
[] if vertical_lines is None else list(vertical_lines)
|
|
90
77
|
)
|
|
91
|
-
self.horizontal_padding:
|
|
78
|
+
self.horizontal_padding: dict[int, float] = (
|
|
92
79
|
dict() if horizontal_padding is None else dict(horizontal_padding)
|
|
93
80
|
)
|
|
94
|
-
self.vertical_padding:
|
|
81
|
+
self.vertical_padding: dict[int, float] = (
|
|
95
82
|
dict() if vertical_padding is None else dict(vertical_padding)
|
|
96
83
|
)
|
|
97
84
|
|
|
@@ -108,7 +95,7 @@ class TextDiagramDrawer:
|
|
|
108
95
|
def __bool__(self):
|
|
109
96
|
return any(self._value_equality_values_())
|
|
110
97
|
|
|
111
|
-
def write(self, x: int, y: int, text: str, transposed_text:
|
|
98
|
+
def write(self, x: int, y: int, text: str, transposed_text: str | None = None) -> None:
|
|
112
99
|
"""Adds text to the given location.
|
|
113
100
|
|
|
114
101
|
Args:
|
|
@@ -143,7 +130,7 @@ class TextDiagramDrawer:
|
|
|
143
130
|
|
|
144
131
|
def grid_line(
|
|
145
132
|
self, x1: int, y1: int, x2: int, y2: int, emphasize: bool = False, doubled: bool = False
|
|
146
|
-
):
|
|
133
|
+
) -> None:
|
|
147
134
|
"""Adds a vertical or horizontal line from (x1, y1) to (x2, y2).
|
|
148
135
|
|
|
149
136
|
Horizontal line is selected on equality in the second coordinate and
|
|
@@ -215,7 +202,7 @@ class TextDiagramDrawer:
|
|
|
215
202
|
"""Change the padding after the given row."""
|
|
216
203
|
self.vertical_padding[index] = padding
|
|
217
204
|
|
|
218
|
-
def _transform_coordinates(self, func: Callable[[float, float],
|
|
205
|
+
def _transform_coordinates(self, func: Callable[[float, float], tuple[float, float]]) -> None:
|
|
219
206
|
"""Helper method to transformer either row or column coordinates."""
|
|
220
207
|
|
|
221
208
|
def func_x(x: float) -> float:
|
|
@@ -225,7 +212,7 @@ class TextDiagramDrawer:
|
|
|
225
212
|
return func(0, y)[1]
|
|
226
213
|
|
|
227
214
|
self.entries = {
|
|
228
|
-
cast(
|
|
215
|
+
cast(tuple[int, int], func(int(x), int(y))): v for (x, y), v in self.entries.items()
|
|
229
216
|
}
|
|
230
217
|
self.vertical_lines = [
|
|
231
218
|
_VerticalLine(func_x(x), func_y(y1), func_y(y2), emph, doubled)
|
|
@@ -245,7 +232,7 @@ class TextDiagramDrawer:
|
|
|
245
232
|
def insert_empty_columns(self, x: int, amount: int = 1) -> None:
|
|
246
233
|
"""Insert a number of columns after the given column."""
|
|
247
234
|
|
|
248
|
-
def transform_columns(column: float, row: float) ->
|
|
235
|
+
def transform_columns(column: float, row: float) -> tuple[float, float]:
|
|
249
236
|
return column + (amount if column >= x else 0), row
|
|
250
237
|
|
|
251
238
|
self._transform_coordinates(transform_columns)
|
|
@@ -253,7 +240,7 @@ class TextDiagramDrawer:
|
|
|
253
240
|
def insert_empty_rows(self, y: int, amount: int = 1) -> None:
|
|
254
241
|
"""Insert a number of rows after the given row."""
|
|
255
242
|
|
|
256
|
-
def transform_rows(column: float, row: float) ->
|
|
243
|
+
def transform_rows(column: float, row: float) -> tuple[float, float]:
|
|
257
244
|
return column, row + (amount if row >= y else 0)
|
|
258
245
|
|
|
259
246
|
self._transform_coordinates(transform_rows)
|
|
@@ -262,7 +249,7 @@ class TextDiagramDrawer:
|
|
|
262
249
|
self,
|
|
263
250
|
horizontal_spacing: int = 1,
|
|
264
251
|
vertical_spacing: int = 1,
|
|
265
|
-
crossing_char:
|
|
252
|
+
crossing_char: str | None = None,
|
|
266
253
|
use_unicode_characters: bool = True,
|
|
267
254
|
) -> str:
|
|
268
255
|
"""Outputs text containing the diagram."""
|
|
@@ -326,7 +313,7 @@ class TextDiagramDrawer:
|
|
|
326
313
|
|
|
327
314
|
return block_diagram.render()
|
|
328
315
|
|
|
329
|
-
def copy(self):
|
|
316
|
+
def copy(self) -> Self:
|
|
330
317
|
return self.__class__(
|
|
331
318
|
entries=self.entries,
|
|
332
319
|
vertical_lines=self.vertical_lines,
|
|
@@ -357,7 +344,7 @@ class TextDiagramDrawer:
|
|
|
357
344
|
def vstack(
|
|
358
345
|
cls,
|
|
359
346
|
diagrams: Sequence[cirq.TextDiagramDrawer],
|
|
360
|
-
padding_resolver:
|
|
347
|
+
padding_resolver: Callable[[Sequence[int | None]], int] | None = None,
|
|
361
348
|
):
|
|
362
349
|
"""Vertically stack text diagrams.
|
|
363
350
|
|
|
@@ -386,9 +373,7 @@ class TextDiagramDrawer:
|
|
|
386
373
|
dy += diagram.height()
|
|
387
374
|
for x in stacked.horizontal_padding:
|
|
388
375
|
resolved_padding = padding_resolver(
|
|
389
|
-
tuple(
|
|
390
|
-
cast(Optional[int], diagram.horizontal_padding.get(x)) for diagram in diagrams
|
|
391
|
-
)
|
|
376
|
+
tuple(cast(int | None, diagram.horizontal_padding.get(x)) for diagram in diagrams)
|
|
392
377
|
)
|
|
393
378
|
if resolved_padding is not None:
|
|
394
379
|
stacked.horizontal_padding[x] = resolved_padding
|
|
@@ -398,7 +383,7 @@ class TextDiagramDrawer:
|
|
|
398
383
|
def hstack(
|
|
399
384
|
cls,
|
|
400
385
|
diagrams: Sequence[cirq.TextDiagramDrawer],
|
|
401
|
-
padding_resolver:
|
|
386
|
+
padding_resolver: Callable[[Sequence[int | None]], int] | None = None,
|
|
402
387
|
):
|
|
403
388
|
"""Horizontally stack text diagrams.
|
|
404
389
|
|
|
@@ -427,7 +412,7 @@ class TextDiagramDrawer:
|
|
|
427
412
|
dx += diagram.width()
|
|
428
413
|
for y in stacked.vertical_padding:
|
|
429
414
|
resolved_padding = padding_resolver(
|
|
430
|
-
tuple(cast(
|
|
415
|
+
tuple(cast(int | None, diagram.vertical_padding.get(y)) for diagram in diagrams)
|
|
431
416
|
)
|
|
432
417
|
if resolved_padding is not None:
|
|
433
418
|
stacked.vertical_padding[y] = resolved_padding
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
from unittest import mock
|
|
16
18
|
|
|
17
19
|
import pytest
|
|
@@ -57,7 +59,7 @@ def assert_has_rendering(actual: TextDiagramDrawer, desired: str, **kwargs) -> N
|
|
|
57
59
|
)
|
|
58
60
|
|
|
59
61
|
|
|
60
|
-
def test_draw_entries_and_lines_with_options():
|
|
62
|
+
def test_draw_entries_and_lines_with_options() -> None:
|
|
61
63
|
d = TextDiagramDrawer()
|
|
62
64
|
d.write(0, 0, '!')
|
|
63
65
|
d.write(6, 2, 'span')
|
|
@@ -130,7 +132,7 @@ def test_draw_entries_and_lines_with_options():
|
|
|
130
132
|
)
|
|
131
133
|
|
|
132
134
|
|
|
133
|
-
def test_draw_entries_and_lines_with_emphasize():
|
|
135
|
+
def test_draw_entries_and_lines_with_emphasize() -> None:
|
|
134
136
|
d = TextDiagramDrawer()
|
|
135
137
|
d.write(0, 0, '!')
|
|
136
138
|
d.write(6, 2, 'span')
|
|
@@ -159,27 +161,27 @@ def test_draw_entries_and_lines_with_emphasize():
|
|
|
159
161
|
)
|
|
160
162
|
|
|
161
163
|
|
|
162
|
-
def test_line_detects_horizontal():
|
|
164
|
+
def test_line_detects_horizontal() -> None:
|
|
163
165
|
d = TextDiagramDrawer()
|
|
164
166
|
with mock.patch.object(d, 'vertical_line') as vertical_line:
|
|
165
167
|
d.grid_line(1, 2, 1, 5, True)
|
|
166
168
|
vertical_line.assert_called_once_with(1, 2, 5, True, False)
|
|
167
169
|
|
|
168
170
|
|
|
169
|
-
def test_line_detects_vertical():
|
|
171
|
+
def test_line_detects_vertical() -> None:
|
|
170
172
|
d = TextDiagramDrawer()
|
|
171
173
|
with mock.patch.object(d, 'horizontal_line') as horizontal_line:
|
|
172
174
|
d.grid_line(2, 1, 5, 1, True)
|
|
173
175
|
horizontal_line.assert_called_once_with(1, 2, 5, True, False)
|
|
174
176
|
|
|
175
177
|
|
|
176
|
-
def test_line_fails_when_not_aligned():
|
|
178
|
+
def test_line_fails_when_not_aligned() -> None:
|
|
177
179
|
d = TextDiagramDrawer()
|
|
178
180
|
with pytest.raises(ValueError):
|
|
179
181
|
d.grid_line(1, 2, 3, 4)
|
|
180
182
|
|
|
181
183
|
|
|
182
|
-
def test_multiline_entries():
|
|
184
|
+
def test_multiline_entries() -> None:
|
|
183
185
|
d = TextDiagramDrawer()
|
|
184
186
|
d.write(0, 0, 'hello\nthere')
|
|
185
187
|
d.write(0, 1, 'next')
|
|
@@ -223,7 +225,7 @@ short │ │ │
|
|
|
223
225
|
)
|
|
224
226
|
|
|
225
227
|
|
|
226
|
-
def test_drawer_copy():
|
|
228
|
+
def test_drawer_copy() -> None:
|
|
227
229
|
orig_entries = {(0, 0): _DiagramText('entry', '')}
|
|
228
230
|
orig_vertical_lines = [_VerticalLine(1, 1, 3, True, False)]
|
|
229
231
|
orig_horizontal_lines = [_HorizontalLine(0, 0, 3, False, False)]
|
|
@@ -236,9 +238,9 @@ def test_drawer_copy():
|
|
|
236
238
|
'vertical_padding': orig_vertical_padding,
|
|
237
239
|
'horizontal_padding': orig_horizontal_padding,
|
|
238
240
|
}
|
|
239
|
-
orig_drawer = TextDiagramDrawer(**kwargs)
|
|
241
|
+
orig_drawer = TextDiagramDrawer(**kwargs) # type: ignore[arg-type]
|
|
240
242
|
|
|
241
|
-
same_drawer = TextDiagramDrawer(**kwargs)
|
|
243
|
+
same_drawer = TextDiagramDrawer(**kwargs) # type: ignore[arg-type]
|
|
242
244
|
assert orig_drawer == same_drawer
|
|
243
245
|
|
|
244
246
|
copy_drawer = orig_drawer.copy()
|
|
@@ -264,7 +266,7 @@ def test_drawer_copy():
|
|
|
264
266
|
assert copy_drawer != orig_drawer
|
|
265
267
|
|
|
266
268
|
|
|
267
|
-
def test_drawer_stack():
|
|
269
|
+
def test_drawer_stack() -> None:
|
|
268
270
|
d = TextDiagramDrawer()
|
|
269
271
|
d.write(0, 0, 'A')
|
|
270
272
|
d.write(1, 0, 'B')
|
|
@@ -334,7 +336,7 @@ AB D
|
|
|
334
336
|
with pytest.raises(ValueError):
|
|
335
337
|
TextDiagramDrawer.vstack((d, dd))
|
|
336
338
|
|
|
337
|
-
vstacked = TextDiagramDrawer.vstack((dd, d), padding_resolver=max)
|
|
339
|
+
vstacked = TextDiagramDrawer.vstack((dd, d), padding_resolver=max) # type: ignore[arg-type]
|
|
338
340
|
expected = """
|
|
339
341
|
D
|
|
340
342
|
|
|
@@ -348,7 +350,7 @@ A B
|
|
|
348
350
|
""".strip()
|
|
349
351
|
assert_has_rendering(vstacked, expected)
|
|
350
352
|
|
|
351
|
-
hstacked = TextDiagramDrawer.hstack((d, dd), padding_resolver=max)
|
|
353
|
+
hstacked = TextDiagramDrawer.hstack((d, dd), padding_resolver=max) # type: ignore[arg-type]
|
|
352
354
|
expected = """
|
|
353
355
|
AB D
|
|
354
356
|
|
|
@@ -358,7 +360,7 @@ AB D
|
|
|
358
360
|
""".strip()
|
|
359
361
|
assert_has_rendering(hstacked, expected)
|
|
360
362
|
|
|
361
|
-
vstacked_min = TextDiagramDrawer.vstack((dd, d), padding_resolver=min)
|
|
363
|
+
vstacked_min = TextDiagramDrawer.vstack((dd, d), padding_resolver=min) # type: ignore[arg-type]
|
|
362
364
|
expected = """
|
|
363
365
|
D
|
|
364
366
|
|
|
@@ -372,7 +374,7 @@ AB
|
|
|
372
374
|
""".strip()
|
|
373
375
|
assert_has_rendering(vstacked_min, expected)
|
|
374
376
|
|
|
375
|
-
hstacked_min = TextDiagramDrawer.hstack((d, dd), padding_resolver=min)
|
|
377
|
+
hstacked_min = TextDiagramDrawer.hstack((d, dd), padding_resolver=min) # type: ignore[arg-type]
|
|
376
378
|
expected = """
|
|
377
379
|
AB D
|
|
378
380
|
|
|
@@ -381,7 +383,7 @@ AB D
|
|
|
381
383
|
assert_has_rendering(hstacked_min, expected)
|
|
382
384
|
|
|
383
385
|
|
|
384
|
-
def test_drawer_eq():
|
|
386
|
+
def test_drawer_eq() -> None:
|
|
385
387
|
assert TextDiagramDrawer().__eq__(23) == NotImplemented
|
|
386
388
|
|
|
387
389
|
eq = ct.EqualsTester()
|
|
@@ -405,7 +407,7 @@ def test_drawer_eq():
|
|
|
405
407
|
eq.add_equality_group(dd)
|
|
406
408
|
|
|
407
409
|
|
|
408
|
-
def test_drawer_superimposed():
|
|
410
|
+
def test_drawer_superimposed() -> None:
|
|
409
411
|
empty_drawer = TextDiagramDrawer()
|
|
410
412
|
assert not empty_drawer
|
|
411
413
|
drawer_with_something = TextDiagramDrawer()
|
|
@@ -416,7 +418,7 @@ def test_drawer_superimposed():
|
|
|
416
418
|
assert not empty_drawer
|
|
417
419
|
|
|
418
420
|
|
|
419
|
-
def test_pick_charset():
|
|
421
|
+
def test_pick_charset() -> None:
|
|
420
422
|
assert pick_charset(use_unicode=False, emphasize=False, doubled=False) == ASCII_BOX_CHARS
|
|
421
423
|
assert pick_charset(use_unicode=False, emphasize=False, doubled=True) == ASCII_BOX_CHARS
|
|
422
424
|
assert pick_charset(use_unicode=False, emphasize=True, doubled=False) == ASCII_BOX_CHARS
|
cirq/conftest.py
CHANGED
|
@@ -14,18 +14,19 @@
|
|
|
14
14
|
|
|
15
15
|
import inspect
|
|
16
16
|
import os
|
|
17
|
+
from collections.abc import Iterator
|
|
17
18
|
|
|
18
19
|
import matplotlib.pyplot as plt
|
|
19
20
|
import pytest
|
|
20
21
|
|
|
21
22
|
|
|
22
|
-
def pytest_configure(config):
|
|
23
|
+
def pytest_configure(config) -> None:
|
|
23
24
|
# Use matplotlib agg backend which does not require a display.
|
|
24
25
|
plt.switch_backend('agg')
|
|
25
26
|
os.environ['CIRQ_TESTING'] = "true"
|
|
26
27
|
|
|
27
28
|
|
|
28
|
-
def pytest_pyfunc_call(pyfuncitem):
|
|
29
|
+
def pytest_pyfunc_call(pyfuncitem) -> None:
|
|
29
30
|
if inspect.iscoroutinefunction(pyfuncitem._obj):
|
|
30
31
|
raise ValueError( # pragma: no cover
|
|
31
32
|
f'{pyfuncitem._obj.__name__} is a bare async function. '
|
|
@@ -34,6 +35,6 @@ def pytest_pyfunc_call(pyfuncitem):
|
|
|
34
35
|
|
|
35
36
|
|
|
36
37
|
@pytest.fixture
|
|
37
|
-
def closefigures():
|
|
38
|
+
def closefigures() -> Iterator[None]:
|
|
38
39
|
yield
|
|
39
40
|
plt.close('all')
|
cirq/contrib/__init__.py
CHANGED
|
@@ -18,9 +18,9 @@ Any contributions not ready for full production can be put in a subdirectory in
|
|
|
18
18
|
this package.
|
|
19
19
|
"""
|
|
20
20
|
|
|
21
|
-
from cirq.contrib import acquaintance
|
|
22
|
-
from cirq.contrib import graph_device
|
|
23
|
-
from cirq.contrib import quirk
|
|
21
|
+
from cirq.contrib import acquaintance # noqa: F401
|
|
22
|
+
from cirq.contrib import graph_device # noqa: F401
|
|
23
|
+
from cirq.contrib import quirk # noqa: F401
|
|
24
24
|
from cirq.contrib.qcircuit import circuit_to_latex_using_qcircuit as circuit_to_latex_using_qcircuit
|
|
25
|
-
from cirq.contrib import json
|
|
25
|
+
from cirq.contrib import json # noqa: F401
|
|
26
26
|
from cirq.contrib.circuitdag import CircuitDag as CircuitDag, Unique as Unique
|
|
@@ -16,7 +16,7 @@ from __future__ import annotations
|
|
|
16
16
|
|
|
17
17
|
import enum
|
|
18
18
|
import itertools
|
|
19
|
-
from typing import
|
|
19
|
+
from typing import Iterator, Sequence, TYPE_CHECKING
|
|
20
20
|
|
|
21
21
|
from cirq import ops
|
|
22
22
|
from cirq.contrib.acquaintance.gates import acquaint
|
|
@@ -61,10 +61,7 @@ class BipartiteSwapNetworkGate(PermutationGate):
|
|
|
61
61
|
"""
|
|
62
62
|
|
|
63
63
|
def __init__(
|
|
64
|
-
self,
|
|
65
|
-
subgraph: Union[str, BipartiteGraphType],
|
|
66
|
-
part_size: int,
|
|
67
|
-
swap_gate: cirq.Gate = ops.SWAP,
|
|
64
|
+
self, subgraph: str | BipartiteGraphType, part_size: int, swap_gate: cirq.Gate = ops.SWAP
|
|
68
65
|
) -> None:
|
|
69
66
|
super().__init__(2 * part_size, swap_gate)
|
|
70
67
|
self.part_size = part_size
|
|
@@ -106,7 +103,7 @@ class BipartiteSwapNetworkGate(PermutationGate):
|
|
|
106
103
|
return self.decompose_matching(qubits)
|
|
107
104
|
raise NotImplementedError('No decomposition implemented for ' + str(self.subgraph))
|
|
108
105
|
|
|
109
|
-
def permutation(self) ->
|
|
106
|
+
def permutation(self) -> dict[int, int]:
|
|
110
107
|
if self.num_qubits() != 2 * self.part_size:
|
|
111
108
|
raise ValueError('qubit_count != 2 * self.part_size')
|
|
112
109
|
if self.subgraph == BipartiteGraphType.MATCHING:
|
|
@@ -124,7 +121,7 @@ class BipartiteSwapNetworkGate(PermutationGate):
|
|
|
124
121
|
return dict(enumerate(range(2 * self.part_size)))
|
|
125
122
|
raise NotImplementedError(str(self.subgraph) + 'not implemented')
|
|
126
123
|
|
|
127
|
-
def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) ->
|
|
124
|
+
def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> tuple[str, ...]:
|
|
128
125
|
qubit_count = 2 * self.part_size
|
|
129
126
|
if args.known_qubit_count not in (None, qubit_count):
|
|
130
127
|
raise ValueError('args.known_qubit_count not in (None, 2 * self.part_size)')
|
|
@@ -149,7 +146,7 @@ class BipartiteSwapNetworkGate(PermutationGate):
|
|
|
149
146
|
return wire_symbols
|
|
150
147
|
|
|
151
148
|
def __repr__(self) -> str:
|
|
152
|
-
args:
|
|
149
|
+
args: tuple[str, ...] = (repr(self.subgraph), repr(self.part_size))
|
|
153
150
|
if self.swap_gate != ops.SWAP:
|
|
154
151
|
args += (repr(self.swap_gate),)
|
|
155
152
|
args_str = ', '.join(args)
|