cirq-core 1.5.0.dev20250409222543__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.dev20250409222543.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.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
- cirq_core-1.5.0.dev20250409222543.dist-info/RECORD +0 -1216
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
|
@@ -14,22 +14,12 @@
|
|
|
14
14
|
|
|
15
15
|
"""Defines primitives for common transformer patterns."""
|
|
16
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
17
19
|
import bisect
|
|
18
20
|
import dataclasses
|
|
19
21
|
from collections import defaultdict
|
|
20
|
-
from typing import
|
|
21
|
-
Callable,
|
|
22
|
-
cast,
|
|
23
|
-
Dict,
|
|
24
|
-
Hashable,
|
|
25
|
-
List,
|
|
26
|
-
Optional,
|
|
27
|
-
Sequence,
|
|
28
|
-
Set,
|
|
29
|
-
Tuple,
|
|
30
|
-
TYPE_CHECKING,
|
|
31
|
-
Union,
|
|
32
|
-
)
|
|
22
|
+
from typing import Callable, cast, Hashable, Sequence, TYPE_CHECKING
|
|
33
23
|
|
|
34
24
|
from cirq import circuits, ops, protocols
|
|
35
25
|
from cirq.circuits.circuit import CIRCUIT_TYPE
|
|
@@ -61,7 +51,7 @@ def _create_target_circuit_type(ops: ops.OP_TREE, target_circuit: CIRCUIT_TYPE)
|
|
|
61
51
|
|
|
62
52
|
def map_moments(
|
|
63
53
|
circuit: CIRCUIT_TYPE,
|
|
64
|
-
map_func: Callable[[circuits.Moment, int],
|
|
54
|
+
map_func: Callable[[circuits.Moment, int], circuits.Moment | Sequence[circuits.Moment]],
|
|
65
55
|
*,
|
|
66
56
|
tags_to_ignore: Sequence[Hashable] = (),
|
|
67
57
|
deep: bool = False,
|
|
@@ -135,7 +125,7 @@ def _map_operations_impl(
|
|
|
135
125
|
resulting optree spans more than 1 moment, it's either wrapped in a tagged circuit
|
|
136
126
|
operation and inserted in-place in the same moment (if `wrap_in_circuit_op` is True)
|
|
137
127
|
OR the mapped operations are inserted directly in the circuit, preserving moment
|
|
138
|
-
|
|
128
|
+
structure. The effect is equivalent to (but much faster) a two-step approach of first
|
|
139
129
|
wrapping the operations in a circuit operation and then calling `cirq.unroll_circuit_op`
|
|
140
130
|
to unroll the corresponding circuit ops.
|
|
141
131
|
deep: If true, `map_func` will be recursively applied to circuits wrapped inside
|
|
@@ -157,7 +147,7 @@ def _map_operations_impl(
|
|
|
157
147
|
"""
|
|
158
148
|
tags_to_ignore_set = set(tags_to_ignore)
|
|
159
149
|
|
|
160
|
-
def apply_map_func(op:
|
|
150
|
+
def apply_map_func(op: cirq.Operation, idx: int) -> list[cirq.Operation]:
|
|
161
151
|
if tags_to_ignore_set.intersection(op.tags):
|
|
162
152
|
return [op]
|
|
163
153
|
if deep and isinstance(op.untagged, circuits.CircuitOperation):
|
|
@@ -173,7 +163,7 @@ def _map_operations_impl(
|
|
|
173
163
|
).with_tags(*op.tags)
|
|
174
164
|
mapped_ops = [*ops.flatten_to_ops(map_func(op, idx))]
|
|
175
165
|
op_qubits = set(op.qubits)
|
|
176
|
-
mapped_ops_qubits:
|
|
166
|
+
mapped_ops_qubits: set[cirq.Qid] = set()
|
|
177
167
|
has_overlapping_ops = False
|
|
178
168
|
for mapped_op in mapped_ops:
|
|
179
169
|
if raise_if_add_qubits and not op_qubits.issuperset(mapped_op.qubits):
|
|
@@ -194,9 +184,9 @@ def _map_operations_impl(
|
|
|
194
184
|
]
|
|
195
185
|
return mapped_ops
|
|
196
186
|
|
|
197
|
-
new_moments:
|
|
187
|
+
new_moments: list[list[cirq.Operation]] = []
|
|
198
188
|
for idx, moment in enumerate(circuit):
|
|
199
|
-
curr_moments:
|
|
189
|
+
curr_moments: list[list[cirq.Operation]] = [[]] if wrap_in_circuit_op else []
|
|
200
190
|
placement_cache = circuits.circuit._PlacementCache()
|
|
201
191
|
for op in moment:
|
|
202
192
|
mapped_ops = apply_map_func(op, idx)
|
|
@@ -305,21 +295,21 @@ class _MergedCircuit:
|
|
|
305
295
|
of a set to store operations to preserve insertion order.
|
|
306
296
|
"""
|
|
307
297
|
|
|
308
|
-
qubit_indexes:
|
|
298
|
+
qubit_indexes: dict[cirq.Qid, list[int]] = dataclasses.field(
|
|
309
299
|
default_factory=lambda: defaultdict(lambda: [-1])
|
|
310
300
|
)
|
|
311
|
-
mkey_indexes:
|
|
301
|
+
mkey_indexes: dict[cirq.MeasurementKey, list[int]] = dataclasses.field(
|
|
312
302
|
default_factory=lambda: defaultdict(lambda: [-1])
|
|
313
303
|
)
|
|
314
|
-
ckey_indexes:
|
|
304
|
+
ckey_indexes: dict[cirq.MeasurementKey, list[int]] = dataclasses.field(
|
|
315
305
|
default_factory=lambda: defaultdict(lambda: [-1])
|
|
316
306
|
)
|
|
317
|
-
ops_by_index:
|
|
307
|
+
ops_by_index: list[dict[cirq.Operation, int]] = dataclasses.field(default_factory=list)
|
|
318
308
|
|
|
319
309
|
def append_empty_moment(self) -> None:
|
|
320
310
|
self.ops_by_index.append({})
|
|
321
311
|
|
|
322
|
-
def add_op_to_moment(self, moment_index: int, op:
|
|
312
|
+
def add_op_to_moment(self, moment_index: int, op: cirq.Operation) -> None:
|
|
323
313
|
self.ops_by_index[moment_index][op] = 0
|
|
324
314
|
for q in op.qubits:
|
|
325
315
|
if moment_index > self.qubit_indexes[q][-1]:
|
|
@@ -331,7 +321,7 @@ class _MergedCircuit:
|
|
|
331
321
|
for ckey in protocols.control_keys(op):
|
|
332
322
|
bisect.insort(self.ckey_indexes[ckey], moment_index)
|
|
333
323
|
|
|
334
|
-
def remove_op_from_moment(self, moment_index: int, op:
|
|
324
|
+
def remove_op_from_moment(self, moment_index: int, op: cirq.Operation) -> None:
|
|
335
325
|
self.ops_by_index[moment_index].pop(op)
|
|
336
326
|
for q in op.qubits:
|
|
337
327
|
if self.qubit_indexes[q][-1] == moment_index:
|
|
@@ -344,8 +334,8 @@ class _MergedCircuit:
|
|
|
344
334
|
self.ckey_indexes[ckey].remove(moment_index)
|
|
345
335
|
|
|
346
336
|
def get_mergeable_ops(
|
|
347
|
-
self, op:
|
|
348
|
-
) ->
|
|
337
|
+
self, op: cirq.Operation, op_qs: set[cirq.Qid]
|
|
338
|
+
) -> tuple[int, list[cirq.Operation]]:
|
|
349
339
|
# Find the index of previous moment which can be merged with `op`.
|
|
350
340
|
idx = max([self.qubit_indexes[q][-1] for q in op_qs], default=-1)
|
|
351
341
|
idx = max([idx] + [self.mkey_indexes[ckey][-1] for ckey in protocols.control_keys(op)])
|
|
@@ -360,13 +350,13 @@ class _MergedCircuit:
|
|
|
360
350
|
left_op for left_op in self.ops_by_index[idx] if not op_qs.isdisjoint(left_op.qubits)
|
|
361
351
|
]
|
|
362
352
|
|
|
363
|
-
def get_cirq_circuit(self) ->
|
|
353
|
+
def get_cirq_circuit(self) -> cirq.Circuit:
|
|
364
354
|
return circuits.Circuit(circuits.Moment(m.keys()) for m in self.ops_by_index)
|
|
365
355
|
|
|
366
356
|
|
|
367
357
|
def merge_operations(
|
|
368
358
|
circuit: CIRCUIT_TYPE,
|
|
369
|
-
merge_func: Callable[[ops.Operation, ops.Operation],
|
|
359
|
+
merge_func: Callable[[ops.Operation, ops.Operation], ops.Operation | None],
|
|
370
360
|
*,
|
|
371
361
|
tags_to_ignore: Sequence[Hashable] = (),
|
|
372
362
|
deep: bool = False,
|
|
@@ -374,13 +364,13 @@ def merge_operations(
|
|
|
374
364
|
"""Merges operations in a circuit by calling `merge_func` iteratively on operations.
|
|
375
365
|
|
|
376
366
|
Two operations op1 and op2 are merge-able if
|
|
377
|
-
- There is no other
|
|
367
|
+
- There is no other operation between op1 and op2 in the circuit
|
|
378
368
|
- is_subset(op1.qubits, op2.qubits) or is_subset(op2.qubits, op1.qubits)
|
|
379
369
|
|
|
380
370
|
The `merge_func` is a callable which, given two merge-able operations
|
|
381
371
|
op1 and op2, decides whether they should be merged into a single operation
|
|
382
372
|
or not. If not, it should return None, else it should return the single merged
|
|
383
|
-
|
|
373
|
+
operation `op`.
|
|
384
374
|
|
|
385
375
|
The method iterates on the input circuit moment-by-moment from left to right and attempts
|
|
386
376
|
to repeatedly merge each operation in the latest moment with all the corresponding merge-able
|
|
@@ -393,7 +383,7 @@ def merge_operations(
|
|
|
393
383
|
|
|
394
384
|
The number of calls to `merge_func` is O(N), where N = Total no. of operations, because:
|
|
395
385
|
- Every time the `merge_func` returns a new operation, the number of operations in the
|
|
396
|
-
circuit
|
|
386
|
+
circuit reduces by 1 and hence this can happen at most O(N) times
|
|
397
387
|
- Every time the `merge_func` returns None, the current operation is inserted into the
|
|
398
388
|
frontier and we go on to process the next operation, which can also happen at-most
|
|
399
389
|
O(N) times.
|
|
@@ -420,7 +410,7 @@ def merge_operations(
|
|
|
420
410
|
_circuit_op_tag = "_internal_tag_to_mark_circuit_ops_in_circuit"
|
|
421
411
|
tags_to_ignore_set = set(tags_to_ignore) | {_circuit_op_tag}
|
|
422
412
|
|
|
423
|
-
def apply_merge_func(op1: ops.Operation, op2: ops.Operation) ->
|
|
413
|
+
def apply_merge_func(op1: ops.Operation, op2: ops.Operation) -> ops.Operation | None:
|
|
424
414
|
if not all(tags_to_ignore_set.isdisjoint(op.tags) for op in [op1, op2]):
|
|
425
415
|
return None
|
|
426
416
|
new_op = merge_func(op1, op2)
|
|
@@ -433,7 +423,7 @@ def merge_operations(
|
|
|
433
423
|
return new_op
|
|
434
424
|
|
|
435
425
|
merged_circuit = _MergedCircuit()
|
|
436
|
-
for moment_idx, current_moment in enumerate(cast(
|
|
426
|
+
for moment_idx, current_moment in enumerate(cast(list['cirq.Moment'], circuit)):
|
|
437
427
|
merged_circuit.append_empty_moment()
|
|
438
428
|
for op in sorted(current_moment.operations, key=lambda op: op.qubits):
|
|
439
429
|
if (
|
|
@@ -493,7 +483,7 @@ def merge_operations(
|
|
|
493
483
|
|
|
494
484
|
def merge_operations_to_circuit_op(
|
|
495
485
|
circuit: CIRCUIT_TYPE,
|
|
496
|
-
can_merge: Callable[[Sequence[
|
|
486
|
+
can_merge: Callable[[Sequence[cirq.Operation], Sequence[cirq.Operation]], bool],
|
|
497
487
|
*,
|
|
498
488
|
tags_to_ignore: Sequence[Hashable] = (),
|
|
499
489
|
merged_circuit_op_tag: str = "Merged connected component",
|
|
@@ -511,7 +501,7 @@ def merge_operations_to_circuit_op(
|
|
|
511
501
|
Args:
|
|
512
502
|
circuit: Input circuit to apply the transformations on. The input circuit is not mutated.
|
|
513
503
|
can_merge: Callable to determine whether a new operation `right_op` can be merged into an
|
|
514
|
-
existing connected component of operations `left_ops` based on
|
|
504
|
+
existing connected component of operations `left_ops` based on boolean returned by
|
|
515
505
|
`can_merge(left_ops, right_op)`.
|
|
516
506
|
tags_to_ignore: Tagged operations marked any of `tags_to_ignore` will not be considered as
|
|
517
507
|
potential candidates for any connected component.
|
|
@@ -524,8 +514,8 @@ def merge_operations_to_circuit_op(
|
|
|
524
514
|
Copy of input circuit with valid connected components wrapped in tagged circuit operations.
|
|
525
515
|
"""
|
|
526
516
|
|
|
527
|
-
def merge_func(op1:
|
|
528
|
-
def get_ops(op:
|
|
517
|
+
def merge_func(op1: cirq.Operation, op2: cirq.Operation) -> cirq.Operation | None:
|
|
518
|
+
def get_ops(op: cirq.Operation):
|
|
529
519
|
op_untagged = op.untagged
|
|
530
520
|
return (
|
|
531
521
|
[*op_untagged.circuit.all_operations()]
|
|
@@ -549,7 +539,7 @@ def merge_k_qubit_unitaries_to_circuit_op(
|
|
|
549
539
|
k: int,
|
|
550
540
|
*,
|
|
551
541
|
tags_to_ignore: Sequence[Hashable] = (),
|
|
552
|
-
merged_circuit_op_tag:
|
|
542
|
+
merged_circuit_op_tag: str | None = None,
|
|
553
543
|
deep: bool = False,
|
|
554
544
|
) -> CIRCUIT_TYPE:
|
|
555
545
|
"""Merges connected components of operations, acting on <= k qubits, into circuit operations.
|
|
@@ -573,7 +563,7 @@ def merge_k_qubit_unitaries_to_circuit_op(
|
|
|
573
563
|
Copy of input circuit with valid connected components wrapped in tagged circuit operations.
|
|
574
564
|
"""
|
|
575
565
|
|
|
576
|
-
def can_merge(ops1: Sequence[
|
|
566
|
+
def can_merge(ops1: Sequence[cirq.Operation], ops2: Sequence[cirq.Operation]) -> bool:
|
|
577
567
|
return all(
|
|
578
568
|
protocols.num_qubits(op) <= k and protocols.has_unitary(op)
|
|
579
569
|
for op_list in [ops1, ops2]
|
|
@@ -591,7 +581,7 @@ def merge_k_qubit_unitaries_to_circuit_op(
|
|
|
591
581
|
|
|
592
582
|
def merge_moments(
|
|
593
583
|
circuit: CIRCUIT_TYPE,
|
|
594
|
-
merge_func: Callable[[circuits.Moment, circuits.Moment],
|
|
584
|
+
merge_func: Callable[[circuits.Moment, circuits.Moment], circuits.Moment | None],
|
|
595
585
|
*,
|
|
596
586
|
tags_to_ignore: Sequence[Hashable] = (),
|
|
597
587
|
deep: bool = False,
|
|
@@ -626,7 +616,7 @@ def merge_moments(
|
|
|
626
616
|
),
|
|
627
617
|
tags_to_ignore=tags_to_ignore,
|
|
628
618
|
)
|
|
629
|
-
merged_moments:
|
|
619
|
+
merged_moments: list[circuits.Moment] = [circuit[0]]
|
|
630
620
|
for current_moment in circuit[1:]:
|
|
631
621
|
merged_moment = merge_func(merged_moments[-1], current_moment)
|
|
632
622
|
if merged_moment is None:
|
|
@@ -640,7 +630,7 @@ def unroll_circuit_op(
|
|
|
640
630
|
circuit: CIRCUIT_TYPE,
|
|
641
631
|
*,
|
|
642
632
|
deep: bool = False,
|
|
643
|
-
tags_to_check:
|
|
633
|
+
tags_to_check: Sequence[Hashable] | None = (MAPPED_CIRCUIT_OP_TAG,),
|
|
644
634
|
) -> CIRCUIT_TYPE:
|
|
645
635
|
"""Unrolls (tagged) `cirq.CircuitOperation`s while preserving the moment structure.
|
|
646
636
|
|
|
@@ -659,7 +649,7 @@ def unroll_circuit_op(
|
|
|
659
649
|
"""
|
|
660
650
|
|
|
661
651
|
def map_func(m: circuits.Moment, _: int):
|
|
662
|
-
to_zip:
|
|
652
|
+
to_zip: list[cirq.AbstractCircuit] = []
|
|
663
653
|
for op in m:
|
|
664
654
|
op_untagged = op.untagged
|
|
665
655
|
if isinstance(op_untagged, circuits.CircuitOperation):
|
|
@@ -685,7 +675,7 @@ def unroll_circuit_op_greedy_earliest(
|
|
|
685
675
|
circuit: CIRCUIT_TYPE,
|
|
686
676
|
*,
|
|
687
677
|
deep: bool = False,
|
|
688
|
-
tags_to_check:
|
|
678
|
+
tags_to_check: Sequence[Hashable] | None = (MAPPED_CIRCUIT_OP_TAG,),
|
|
689
679
|
) -> CIRCUIT_TYPE:
|
|
690
680
|
"""Unrolls (tagged) `cirq.CircuitOperation`s by inserting operations using EARLIEST strategy.
|
|
691
681
|
|
|
@@ -732,7 +722,7 @@ def unroll_circuit_op_greedy_frontier(
|
|
|
732
722
|
circuit: CIRCUIT_TYPE,
|
|
733
723
|
*,
|
|
734
724
|
deep: bool = False,
|
|
735
|
-
tags_to_check:
|
|
725
|
+
tags_to_check: Sequence[Hashable] | None = (MAPPED_CIRCUIT_OP_TAG,),
|
|
736
726
|
) -> CIRCUIT_TYPE:
|
|
737
727
|
"""Unrolls (tagged) `cirq.CircuitOperation`s by inserting operations inline at qubit frontier.
|
|
738
728
|
|
|
@@ -751,7 +741,7 @@ def unroll_circuit_op_greedy_frontier(
|
|
|
751
741
|
Copy of input circuit with (Tagged) CircuitOperation's expanded inline at qubit frontier.
|
|
752
742
|
"""
|
|
753
743
|
unrolled_circuit = circuit.unfreeze(copy=True)
|
|
754
|
-
frontier:
|
|
744
|
+
frontier: dict[cirq.Qid, int] = defaultdict(lambda: 0)
|
|
755
745
|
idx = 0
|
|
756
746
|
while idx < len(unrolled_circuit):
|
|
757
747
|
for op in unrolled_circuit[idx].operations:
|
|
@@ -781,7 +771,7 @@ def unroll_circuit_op_greedy_frontier(
|
|
|
781
771
|
def toggle_tags(circuit: CIRCUIT_TYPE, tags: Sequence[Hashable], *, deep: bool = False):
|
|
782
772
|
"""Toggles tags applied on each operation in the circuit, via `op.tags ^= tags`
|
|
783
773
|
|
|
784
|
-
For every
|
|
774
|
+
For every operation `op` in the input circuit, the tags on `op` are replaced by a symmetric
|
|
785
775
|
difference of `op.tags` and `tags` -- this is useful in scenarios where you mark a small subset
|
|
786
776
|
of operations with a specific tag and then toggle the set of marked operations s.t. every
|
|
787
777
|
marked operation is now unmarked and vice versa.
|
|
@@ -799,7 +789,7 @@ def toggle_tags(circuit: CIRCUIT_TYPE, tags: Sequence[Hashable], *, deep: bool =
|
|
|
799
789
|
"""
|
|
800
790
|
tags_to_xor = set(tags)
|
|
801
791
|
|
|
802
|
-
def map_func(op:
|
|
792
|
+
def map_func(op: cirq.Operation, _) -> cirq.Operation:
|
|
803
793
|
return (
|
|
804
794
|
op
|
|
805
795
|
if deep and isinstance(op, circuits.CircuitOperation)
|
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import Iterator
|
|
16
18
|
|
|
17
19
|
import pytest
|
|
18
20
|
|
|
@@ -114,7 +116,6 @@ def test_map_operations_does_not_insert_too_many_moments():
|
|
|
114
116
|
)
|
|
115
117
|
|
|
116
118
|
|
|
117
|
-
# pylint: disable=line-too-long
|
|
118
119
|
def test_map_operations_deep_subcircuits():
|
|
119
120
|
q = cirq.LineQubit.range(5)
|
|
120
121
|
c_orig = cirq.Circuit(cirq.CX(q[0], q[1]), cirq.CX(q[3], q[2]), cirq.CX(q[3], q[4]))
|
|
@@ -164,7 +165,7 @@ def test_map_operations_deep_subcircuits():
|
|
|
164
165
|
3: ───#4──────────────────────────────────────────────────────────────────────────────────────────────────────
|
|
165
166
|
│
|
|
166
167
|
4: ───#5──────────────────────────────────────────────────────────────────────────────────────────────────────
|
|
167
|
-
''',
|
|
168
|
+
''', # noqa: E501
|
|
168
169
|
)
|
|
169
170
|
|
|
170
171
|
c_mapped = cirq.map_operations(c_orig_with_circuit_ops, map_func, deep=True)
|
|
@@ -199,13 +200,10 @@ def test_map_operations_deep_subcircuits():
|
|
|
199
200
|
3: ───#4──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
|
200
201
|
│
|
|
201
202
|
4: ───#5──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
|
202
|
-
''',
|
|
203
|
+
''', # noqa: E501
|
|
203
204
|
)
|
|
204
205
|
|
|
205
206
|
|
|
206
|
-
# pylint: enable=line-too-long
|
|
207
|
-
|
|
208
|
-
|
|
209
207
|
@pytest.mark.parametrize("deep", [False, True])
|
|
210
208
|
def test_map_operations_preserves_circuit_tags(deep: bool) -> None:
|
|
211
209
|
tag = "should be preserved"
|
|
@@ -501,7 +499,7 @@ def test_map_moments_drop_empty_moments_deep():
|
|
|
501
499
|
cirq.testing.assert_same_circuits(c_mapped, c_expected)
|
|
502
500
|
|
|
503
501
|
|
|
504
|
-
def _merge_z_moments_func(m1: cirq.Moment, m2: cirq.Moment) ->
|
|
502
|
+
def _merge_z_moments_func(m1: cirq.Moment, m2: cirq.Moment) -> cirq.Moment | None:
|
|
505
503
|
if any(op.gate != cirq.Z for m in [m1, m2] for op in m):
|
|
506
504
|
return None
|
|
507
505
|
return cirq.Moment(
|
|
@@ -705,9 +703,6 @@ def test_merge_operations_deep():
|
|
|
705
703
|
)
|
|
706
704
|
|
|
707
705
|
|
|
708
|
-
# pylint: disable=line-too-long
|
|
709
|
-
|
|
710
|
-
|
|
711
706
|
def test_merge_operations_to_circuit_op_merges_connected_component():
|
|
712
707
|
c_orig = _create_circuit_to_merge()
|
|
713
708
|
cirq.testing.assert_has_diagram(
|
|
@@ -721,7 +716,7 @@ def test_merge_operations_to_circuit_op_merges_connected_component():
|
|
|
721
716
|
''',
|
|
722
717
|
)
|
|
723
718
|
|
|
724
|
-
def can_merge(ops1:
|
|
719
|
+
def can_merge(ops1: list[cirq.Operation], ops2: list[cirq.Operation]) -> bool:
|
|
725
720
|
"""Artificial example where a CZ will absorb any merge-able operation."""
|
|
726
721
|
return any(o.gate == cirq.CZ for op_list in [ops1, ops2] for o in op_list)
|
|
727
722
|
|
|
@@ -738,7 +733,7 @@ def test_merge_operations_to_circuit_op_merges_connected_component():
|
|
|
738
733
|
1: ───────┼───────────#2───────────────────────────────────────────────────────────@───────Y───────────X───
|
|
739
734
|
│ │
|
|
740
735
|
2: ───H───X────────────────────────────────────────────────────────────────────────X───────────────────────
|
|
741
|
-
''',
|
|
736
|
+
''', # noqa: E501
|
|
742
737
|
)
|
|
743
738
|
|
|
744
739
|
|
|
@@ -770,13 +765,11 @@ def test_merge_2q_unitaries_to_circuit_op():
|
|
|
770
765
|
1: ───┼────────────────────────────#2───────────────────────────────────────────────[ │ ]───────────────────────X───
|
|
771
766
|
│ [ 2: ───X─────── ][merged]
|
|
772
767
|
│ │
|
|
773
|
-
2: ───#2────────────────────────────────────────────────────────────────────────────#2───────────────────────────────────────M───
|
|
768
|
+
2: ───#2────────────────────────────────────────────────────────────────────────────#2───────────────────────────────────────M───
|
|
769
|
+
''', # noqa: E501
|
|
774
770
|
)
|
|
775
771
|
|
|
776
772
|
|
|
777
|
-
# pylint: enable=line-too-long
|
|
778
|
-
|
|
779
|
-
|
|
780
773
|
def test_merge_operations_respects_tags_to_ignore():
|
|
781
774
|
q = cirq.LineQubit.range(2)
|
|
782
775
|
c = cirq.Circuit(
|
cirq/value/abc_alt.py
CHANGED
|
@@ -14,9 +14,11 @@
|
|
|
14
14
|
|
|
15
15
|
"""A more flexible abstract base class metaclass ABCMetaImplementAnyOneOf."""
|
|
16
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
17
19
|
import abc
|
|
18
20
|
import functools
|
|
19
|
-
from typing import Callable, cast,
|
|
21
|
+
from typing import Callable, cast, TypeVar
|
|
20
22
|
|
|
21
23
|
T = TypeVar('T')
|
|
22
24
|
|
|
@@ -80,8 +82,8 @@ class ABCMetaImplementAnyOneOf(abc.ABCMeta):
|
|
|
80
82
|
`@alternative(...)` may be used.
|
|
81
83
|
"""
|
|
82
84
|
|
|
83
|
-
def __new__(
|
|
84
|
-
cls = super().__new__(
|
|
85
|
+
def __new__(mcs, name, bases, namespace, **kwargs):
|
|
86
|
+
cls = super().__new__(mcs, name, bases, namespace, **kwargs)
|
|
85
87
|
implemented_by = {}
|
|
86
88
|
|
|
87
89
|
def has_some_implementation(name: str) -> bool:
|
|
@@ -101,7 +103,7 @@ class ABCMetaImplementAnyOneOf(abc.ABCMeta):
|
|
|
101
103
|
return False
|
|
102
104
|
return True
|
|
103
105
|
|
|
104
|
-
def find_next_implementations(all_names:
|
|
106
|
+
def find_next_implementations(all_names: set[str]) -> bool:
|
|
105
107
|
next_implemented_by = {}
|
|
106
108
|
for name in all_names:
|
|
107
109
|
if has_some_implementation(name):
|
cirq/value/abc_alt_test.py
CHANGED
|
@@ -12,8 +12,10 @@
|
|
|
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
|
import abc
|
|
16
|
-
from typing import NoReturn
|
|
18
|
+
from typing import NoReturn
|
|
17
19
|
|
|
18
20
|
import pytest
|
|
19
21
|
|
|
@@ -158,11 +160,11 @@ def test_two_alternatives():
|
|
|
158
160
|
raise NotImplementedError
|
|
159
161
|
|
|
160
162
|
@abc.abstractmethod
|
|
161
|
-
def alt1(self) ->
|
|
163
|
+
def alt1(self) -> str | None:
|
|
162
164
|
pass
|
|
163
165
|
|
|
164
166
|
@abc.abstractmethod
|
|
165
|
-
def alt2(self) ->
|
|
167
|
+
def alt2(self) -> str | None:
|
|
166
168
|
pass
|
|
167
169
|
|
|
168
170
|
class TwoAlternativesChild(TwoAlternatives):
|
cirq/value/angle.py
CHANGED
|
@@ -12,18 +12,21 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import overload, TYPE_CHECKING
|
|
16
18
|
|
|
17
19
|
import numpy as np
|
|
18
20
|
import sympy
|
|
19
21
|
|
|
20
|
-
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from cirq.value import type_alias
|
|
21
24
|
|
|
22
25
|
|
|
23
26
|
def chosen_angle_to_half_turns(
|
|
24
|
-
half_turns:
|
|
25
|
-
rads:
|
|
26
|
-
degs:
|
|
27
|
+
half_turns: type_alias.TParamVal | None = None,
|
|
28
|
+
rads: float | None = None,
|
|
29
|
+
degs: float | None = None,
|
|
27
30
|
default: float = 1.0,
|
|
28
31
|
) -> type_alias.TParamVal:
|
|
29
32
|
"""Returns a half_turns value based on the given arguments.
|
|
@@ -60,9 +63,9 @@ def chosen_angle_to_half_turns(
|
|
|
60
63
|
|
|
61
64
|
|
|
62
65
|
def chosen_angle_to_canonical_half_turns(
|
|
63
|
-
half_turns:
|
|
64
|
-
rads:
|
|
65
|
-
degs:
|
|
66
|
+
half_turns: type_alias.TParamVal | None = None,
|
|
67
|
+
rads: float | None = None,
|
|
68
|
+
degs: float | None = None,
|
|
66
69
|
default: float = 1.0,
|
|
67
70
|
) -> type_alias.TParamVal:
|
|
68
71
|
"""Returns a canonicalized half_turns based on the given arguments.
|
|
@@ -84,7 +87,6 @@ def chosen_angle_to_canonical_half_turns(
|
|
|
84
87
|
)
|
|
85
88
|
|
|
86
89
|
|
|
87
|
-
# pylint: disable=function-redefined
|
|
88
90
|
@overload
|
|
89
91
|
def canonicalize_half_turns(half_turns: float) -> float:
|
|
90
92
|
pass
|
|
@@ -105,6 +107,3 @@ def canonicalize_half_turns(half_turns: type_alias.TParamVal) -> type_alias.TPar
|
|
|
105
107
|
if half_turns > 1:
|
|
106
108
|
half_turns -= 2
|
|
107
109
|
return half_turns
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
# pylint: enable=function-redefined
|
cirq/value/angle_test.py
CHANGED
|
@@ -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
|
import numpy as np
|
|
16
18
|
import pytest
|
|
17
19
|
import sympy
|
|
@@ -19,7 +21,7 @@ import sympy
|
|
|
19
21
|
import cirq
|
|
20
22
|
|
|
21
23
|
|
|
22
|
-
def test_canonicalize_half_turns():
|
|
24
|
+
def test_canonicalize_half_turns() -> None:
|
|
23
25
|
assert cirq.canonicalize_half_turns(0) == 0
|
|
24
26
|
assert cirq.canonicalize_half_turns(1) == +1
|
|
25
27
|
assert cirq.canonicalize_half_turns(-1) == +1
|
|
@@ -34,7 +36,7 @@ def test_canonicalize_half_turns():
|
|
|
34
36
|
assert cirq.canonicalize_half_turns(sympy.Symbol('a') * 0 + 3) == 1
|
|
35
37
|
|
|
36
38
|
|
|
37
|
-
def test_chosen_angle_to_half_turns():
|
|
39
|
+
def test_chosen_angle_to_half_turns() -> None:
|
|
38
40
|
assert cirq.chosen_angle_to_half_turns() == 1
|
|
39
41
|
assert cirq.chosen_angle_to_half_turns(default=0.5) == 0.5
|
|
40
42
|
assert cirq.chosen_angle_to_half_turns(half_turns=0.25, default=0.75) == 0.25
|
|
@@ -54,7 +56,7 @@ def test_chosen_angle_to_half_turns():
|
|
|
54
56
|
_ = cirq.chosen_angle_to_half_turns(half_turns=0, rads=0, degs=0)
|
|
55
57
|
|
|
56
58
|
|
|
57
|
-
def test_chosen_angle_to_canonical_half_turns():
|
|
59
|
+
def test_chosen_angle_to_canonical_half_turns() -> None:
|
|
58
60
|
assert cirq.chosen_angle_to_canonical_half_turns() == 1
|
|
59
61
|
assert cirq.chosen_angle_to_canonical_half_turns(default=0.5) == 0.5
|
|
60
62
|
assert cirq.chosen_angle_to_canonical_half_turns(half_turns=0.25, default=0.75) == 0.25
|