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/ops/op_tree.py
CHANGED
|
@@ -14,7 +14,9 @@
|
|
|
14
14
|
|
|
15
15
|
"""A recursive type describing trees of operations, and utility methods for it."""
|
|
16
16
|
|
|
17
|
-
from
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
from typing import Callable, Iterable, Iterator, NoReturn, TYPE_CHECKING
|
|
18
20
|
|
|
19
21
|
from cirq._doc import document
|
|
20
22
|
from cirq._import import LazyLoader
|
|
@@ -26,7 +28,7 @@ if TYPE_CHECKING:
|
|
|
26
28
|
moment = LazyLoader("moment", globals(), "cirq.circuits.moment")
|
|
27
29
|
|
|
28
30
|
|
|
29
|
-
OP_TREE =
|
|
31
|
+
OP_TREE = Operation | Iterable['OP_TREE']
|
|
30
32
|
document(
|
|
31
33
|
OP_TREE,
|
|
32
34
|
"""An operation or nested collections of operations.
|
|
@@ -35,10 +37,10 @@ document(
|
|
|
35
37
|
`cirq.OP_TREE` argument:
|
|
36
38
|
|
|
37
39
|
- A single operation (a `cirq.Operation`).
|
|
38
|
-
- A list of operations (a `
|
|
39
|
-
- A list of lists of operations (a `
|
|
40
|
+
- A list of operations (a `list[cirq.Operation]`).
|
|
41
|
+
- A list of lists of operations (a `list[list[cirq.Operation]]`).
|
|
40
42
|
- A list mixing operations and generators of operations
|
|
41
|
-
(a `
|
|
43
|
+
(a `list[cirq.Operation | Iterator[cirq.Operation]]`).
|
|
42
44
|
- Generally anything that can be iterated, and its items iterated, and
|
|
43
45
|
so forth recursively until a bottom layer of operations is found.
|
|
44
46
|
""",
|
|
@@ -47,7 +49,7 @@ document(
|
|
|
47
49
|
|
|
48
50
|
def flatten_op_tree(
|
|
49
51
|
root: OP_TREE, preserve_moments: bool = False
|
|
50
|
-
) -> Iterator[
|
|
52
|
+
) -> Iterator[Operation | cirq.Moment]:
|
|
51
53
|
"""Performs an in-order iteration of the operations (leaves) in an OP_TREE.
|
|
52
54
|
|
|
53
55
|
Args:
|
|
@@ -88,7 +90,7 @@ def flatten_to_ops(root: OP_TREE) -> Iterator[Operation]:
|
|
|
88
90
|
_bad_op_tree(root)
|
|
89
91
|
|
|
90
92
|
|
|
91
|
-
def flatten_to_ops_or_moments(root: OP_TREE) -> Iterator[
|
|
93
|
+
def flatten_to_ops_or_moments(root: OP_TREE) -> Iterator[Operation | cirq.Moment]:
|
|
92
94
|
"""Performs an in-order iteration OP_TREE, yielding ops and moments.
|
|
93
95
|
|
|
94
96
|
Args:
|
cirq/ops/op_tree_test.py
CHANGED
|
@@ -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
|
from typing import cast
|
|
15
18
|
|
|
16
19
|
import pytest
|
|
@@ -18,7 +21,7 @@ import pytest
|
|
|
18
21
|
import cirq
|
|
19
22
|
|
|
20
23
|
|
|
21
|
-
def test_flatten_op_tree():
|
|
24
|
+
def test_flatten_op_tree() -> None:
|
|
22
25
|
operations = [
|
|
23
26
|
cirq.GateOperation(cirq.testing.SingleQubitGate(), [cirq.NamedQubit(str(i))])
|
|
24
27
|
for i in range(10)
|
|
@@ -46,33 +49,33 @@ def test_flatten_op_tree():
|
|
|
46
49
|
|
|
47
50
|
# Bad trees.
|
|
48
51
|
with pytest.raises(TypeError):
|
|
49
|
-
_ = list(cirq.flatten_op_tree(None))
|
|
52
|
+
_ = list(cirq.flatten_op_tree(None)) # type: ignore[arg-type]
|
|
50
53
|
with pytest.raises(TypeError):
|
|
51
|
-
_ = list(cirq.flatten_op_tree(5))
|
|
54
|
+
_ = list(cirq.flatten_op_tree(5)) # type: ignore[arg-type]
|
|
52
55
|
with pytest.raises(TypeError):
|
|
53
|
-
_ = list(cirq.flatten_op_tree([operations[0], (4,)]))
|
|
56
|
+
_ = list(cirq.flatten_op_tree([operations[0], (4,)])) # type: ignore[list-item]
|
|
54
57
|
|
|
55
58
|
|
|
56
|
-
def test_flatten_to_ops_or_moments():
|
|
59
|
+
def test_flatten_to_ops_or_moments() -> None:
|
|
57
60
|
operations = [
|
|
58
61
|
cirq.GateOperation(cirq.testing.SingleQubitGate(), [cirq.NamedQubit(str(i))])
|
|
59
62
|
for i in range(10)
|
|
60
63
|
]
|
|
61
|
-
op_tree = [operations[0], cirq.Moment(operations[1:5]), operations[5:]]
|
|
64
|
+
op_tree: cirq.OP_TREE = [operations[0], cirq.Moment(operations[1:5]), operations[5:]]
|
|
62
65
|
output = [operations[0], cirq.Moment(operations[1:5])] + operations[5:]
|
|
63
66
|
assert list(cirq.flatten_to_ops_or_moments(op_tree)) == output
|
|
64
67
|
assert list(cirq.flatten_op_tree(op_tree, preserve_moments=True)) == output
|
|
65
68
|
|
|
66
69
|
# Bad trees.
|
|
67
70
|
with pytest.raises(TypeError):
|
|
68
|
-
_ = list(cirq.flatten_to_ops_or_moments(None))
|
|
71
|
+
_ = list(cirq.flatten_to_ops_or_moments(None)) # type: ignore[arg-type]
|
|
69
72
|
with pytest.raises(TypeError):
|
|
70
|
-
_ = list(cirq.flatten_to_ops_or_moments(5))
|
|
73
|
+
_ = list(cirq.flatten_to_ops_or_moments(5)) # type: ignore[arg-type]
|
|
71
74
|
with pytest.raises(TypeError):
|
|
72
|
-
_ = list(cirq.flatten_to_ops_or_moments([operations[0], (4,)]))
|
|
75
|
+
_ = list(cirq.flatten_to_ops_or_moments([operations[0], (4,)])) # type: ignore[list-item]
|
|
73
76
|
|
|
74
77
|
|
|
75
|
-
def test_freeze_op_tree():
|
|
78
|
+
def test_freeze_op_tree() -> None:
|
|
76
79
|
operations = [
|
|
77
80
|
cirq.GateOperation(cirq.testing.SingleQubitGate(), [cirq.NamedQubit(str(i))])
|
|
78
81
|
for i in range(10)
|
|
@@ -94,29 +97,29 @@ def test_freeze_op_tree():
|
|
|
94
97
|
|
|
95
98
|
# Bad trees.
|
|
96
99
|
with pytest.raises(TypeError):
|
|
97
|
-
cirq.freeze_op_tree(None)
|
|
100
|
+
cirq.freeze_op_tree(None) # type: ignore[arg-type]
|
|
98
101
|
with pytest.raises(TypeError):
|
|
99
|
-
cirq.freeze_op_tree(5)
|
|
102
|
+
cirq.freeze_op_tree(5) # type: ignore[arg-type]
|
|
100
103
|
with pytest.raises(TypeError):
|
|
101
|
-
_ = cirq.freeze_op_tree([operations[0], (4,)])
|
|
104
|
+
_ = cirq.freeze_op_tree([operations[0], (4,)]) # type: ignore[list-item]
|
|
102
105
|
|
|
103
106
|
|
|
104
|
-
def test_transform_bad_tree():
|
|
107
|
+
def test_transform_bad_tree() -> None:
|
|
105
108
|
with pytest.raises(TypeError):
|
|
106
|
-
_ = list(cirq.transform_op_tree(None))
|
|
109
|
+
_ = list(cirq.transform_op_tree(None)) # type: ignore[arg-type]
|
|
107
110
|
with pytest.raises(TypeError):
|
|
108
|
-
_ = list(cirq.transform_op_tree(5))
|
|
111
|
+
_ = list(cirq.transform_op_tree(5)) # type: ignore[arg-type]
|
|
109
112
|
with pytest.raises(TypeError):
|
|
110
113
|
_ = list(
|
|
111
114
|
cirq.flatten_op_tree(
|
|
112
115
|
cirq.transform_op_tree(
|
|
113
|
-
[cirq.GateOperation(cirq.Gate(), [cirq.NamedQubit('q')]), (4,)]
|
|
116
|
+
[cirq.GateOperation(cirq.Gate(), [cirq.NamedQubit('q')]), (4,)] # type: ignore
|
|
114
117
|
)
|
|
115
118
|
)
|
|
116
119
|
)
|
|
117
120
|
|
|
118
121
|
|
|
119
|
-
def test_transform_leaves():
|
|
122
|
+
def test_transform_leaves() -> None:
|
|
120
123
|
gs = [cirq.testing.SingleQubitGate() for _ in range(10)]
|
|
121
124
|
operations = [cirq.GateOperation(gs[i], [cirq.NamedQubit(str(i))]) for i in range(10)]
|
|
122
125
|
expected = [cirq.GateOperation(gs[i], [cirq.NamedQubit(str(i) + 'a')]) for i in range(10)]
|
|
@@ -150,7 +153,7 @@ def test_transform_leaves():
|
|
|
150
153
|
)
|
|
151
154
|
|
|
152
155
|
|
|
153
|
-
def test_transform_internal_nodes():
|
|
156
|
+
def test_transform_internal_nodes() -> None:
|
|
154
157
|
operations = [
|
|
155
158
|
cirq.GateOperation(cirq.testing.SingleQubitGate(), [cirq.LineQubit(2 * i)])
|
|
156
159
|
for i in range(10)
|
cirq/ops/parallel_gate.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
|
from types import NotImplementedType
|
|
16
|
-
from typing import AbstractSet, Any,
|
|
18
|
+
from typing import AbstractSet, Any, TYPE_CHECKING
|
|
17
19
|
|
|
18
20
|
import numpy as np
|
|
19
21
|
|
|
@@ -29,7 +31,7 @@ if TYPE_CHECKING:
|
|
|
29
31
|
class ParallelGate(raw_types.Gate):
|
|
30
32
|
"""Augments existing gates to be applied on one or more groups of qubits."""
|
|
31
33
|
|
|
32
|
-
def __init__(self, sub_gate:
|
|
34
|
+
def __init__(self, sub_gate: cirq.Gate, num_copies: int) -> None:
|
|
33
35
|
"""Inits ParallelGate.
|
|
34
36
|
|
|
35
37
|
Args:
|
|
@@ -52,24 +54,24 @@ class ParallelGate(raw_types.Gate):
|
|
|
52
54
|
return self.sub_gate.num_qubits() * self._num_copies
|
|
53
55
|
|
|
54
56
|
@property
|
|
55
|
-
def sub_gate(self) ->
|
|
57
|
+
def sub_gate(self) -> cirq.Gate:
|
|
56
58
|
return self._sub_gate
|
|
57
59
|
|
|
58
60
|
@property
|
|
59
61
|
def num_copies(self) -> int:
|
|
60
62
|
return self._num_copies
|
|
61
63
|
|
|
62
|
-
def _decompose_(self, qubits:
|
|
64
|
+
def _decompose_(self, qubits: tuple[cirq.Qid, ...]) -> DecomposeResult:
|
|
63
65
|
if len(qubits) != self.num_qubits():
|
|
64
66
|
raise ValueError(f"len(qubits)={len(qubits)} should be {self.num_qubits()}")
|
|
65
67
|
step = self.sub_gate.num_qubits()
|
|
66
68
|
return [self.sub_gate(*qubits[i : i + step]) for i in range(0, len(qubits), step)]
|
|
67
69
|
|
|
68
|
-
def with_gate(self, sub_gate:
|
|
70
|
+
def with_gate(self, sub_gate: cirq.Gate) -> ParallelGate:
|
|
69
71
|
"""ParallelGate with same number of copies but a new gate"""
|
|
70
72
|
return ParallelGate(sub_gate, self._num_copies)
|
|
71
73
|
|
|
72
|
-
def with_num_copies(self, num_copies: int) ->
|
|
74
|
+
def with_num_copies(self, num_copies: int) -> ParallelGate:
|
|
73
75
|
"""ParallelGate with same sub_gate but different num_copies"""
|
|
74
76
|
return ParallelGate(self.sub_gate, num_copies)
|
|
75
77
|
|
|
@@ -91,14 +93,12 @@ class ParallelGate(raw_types.Gate):
|
|
|
91
93
|
def _parameter_names_(self) -> AbstractSet[str]:
|
|
92
94
|
return protocols.parameter_names(self.sub_gate)
|
|
93
95
|
|
|
94
|
-
def _resolve_parameters_(
|
|
95
|
-
self, resolver: 'cirq.ParamResolver', recursive: bool
|
|
96
|
-
) -> 'ParallelGate':
|
|
96
|
+
def _resolve_parameters_(self, resolver: cirq.ParamResolver, recursive: bool) -> ParallelGate:
|
|
97
97
|
return self.with_gate(
|
|
98
98
|
sub_gate=protocols.resolve_parameters(self.sub_gate, resolver, recursive)
|
|
99
99
|
)
|
|
100
100
|
|
|
101
|
-
def _unitary_(self) ->
|
|
101
|
+
def _unitary_(self) -> np.ndarray | NotImplementedType:
|
|
102
102
|
# Obtain the unitary for the single qubit gate
|
|
103
103
|
single_unitary = protocols.unitary(self.sub_gate, NotImplemented)
|
|
104
104
|
|
|
@@ -114,7 +114,7 @@ class ParallelGate(raw_types.Gate):
|
|
|
114
114
|
|
|
115
115
|
return unitary
|
|
116
116
|
|
|
117
|
-
def _trace_distance_bound_(self) ->
|
|
117
|
+
def _trace_distance_bound_(self) -> float | None:
|
|
118
118
|
if protocols.is_parameterized(self.sub_gate):
|
|
119
119
|
return None
|
|
120
120
|
angle = self._num_copies * np.arcsin(protocols.trace_distance_bound(self.sub_gate))
|
|
@@ -122,9 +122,7 @@ class ParallelGate(raw_types.Gate):
|
|
|
122
122
|
return 1.0
|
|
123
123
|
return np.sin(angle)
|
|
124
124
|
|
|
125
|
-
def _circuit_diagram_info_(
|
|
126
|
-
self, args: 'cirq.CircuitDiagramInfoArgs'
|
|
127
|
-
) -> 'cirq.CircuitDiagramInfo':
|
|
125
|
+
def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> cirq.CircuitDiagramInfo:
|
|
128
126
|
diagram_info = protocols.circuit_diagram_info(self.sub_gate, args, NotImplemented)
|
|
129
127
|
if diagram_info == NotImplemented:
|
|
130
128
|
return diagram_info
|
|
@@ -136,7 +134,7 @@ class ParallelGate(raw_types.Gate):
|
|
|
136
134
|
wire_symbols=wire_symbols, exponent=diagram_info.exponent, connected=False
|
|
137
135
|
)
|
|
138
136
|
|
|
139
|
-
def __pow__(self, exponent: Any) ->
|
|
137
|
+
def __pow__(self, exponent: Any) -> ParallelGate:
|
|
140
138
|
"""Raises underlying gate to a power, applying same number of copies.
|
|
141
139
|
|
|
142
140
|
For extrapolatable gate G this means the following two are equivalent:
|
|
@@ -154,11 +152,11 @@ class ParallelGate(raw_types.Gate):
|
|
|
154
152
|
return NotImplemented
|
|
155
153
|
return self.with_gate(new_gate)
|
|
156
154
|
|
|
157
|
-
def _json_dict_(self) ->
|
|
155
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
158
156
|
return protocols.obj_to_dict_helper(self, attribute_names=["sub_gate", "num_copies"])
|
|
159
157
|
|
|
160
158
|
|
|
161
|
-
def parallel_gate_op(gate:
|
|
159
|
+
def parallel_gate_op(gate: cirq.Gate, *targets: cirq.Qid) -> cirq.Operation:
|
|
162
160
|
"""Constructs a ParallelGate using gate and applies to all given qubits
|
|
163
161
|
|
|
164
162
|
Args:
|
cirq/ops/parallel_gate_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
|
|
@@ -26,7 +28,7 @@ import cirq
|
|
|
26
28
|
(cirq.X**0.5, 4, cirq.LineQubit.range(4)),
|
|
27
29
|
],
|
|
28
30
|
)
|
|
29
|
-
def test_parallel_gate_operation_init(gate, num_copies, qubits):
|
|
31
|
+
def test_parallel_gate_operation_init(gate, num_copies, qubits) -> None:
|
|
30
32
|
v = cirq.ParallelGate(gate, num_copies)
|
|
31
33
|
assert v.sub_gate == gate
|
|
32
34
|
assert v.num_copies == num_copies
|
|
@@ -52,7 +54,7 @@ def test_parallel_gate_operation_init(gate, num_copies, qubits):
|
|
|
52
54
|
(cirq.testing.TwoQubitGate(), 2, cirq.LineQubit.range(4), "must be a single qubit gate"),
|
|
53
55
|
],
|
|
54
56
|
)
|
|
55
|
-
def test_invalid_parallel_gate_operation(gate, num_copies, qubits, error_msg):
|
|
57
|
+
def test_invalid_parallel_gate_operation(gate, num_copies, qubits, error_msg) -> None:
|
|
56
58
|
with pytest.raises(ValueError, match=error_msg):
|
|
57
59
|
cirq.ParallelGate(gate, num_copies)(*qubits)
|
|
58
60
|
|
|
@@ -61,27 +63,27 @@ def test_invalid_parallel_gate_operation(gate, num_copies, qubits, error_msg):
|
|
|
61
63
|
'gate, num_copies, qubits',
|
|
62
64
|
[(cirq.X, 2, cirq.LineQubit.range(2)), (cirq.H**0.5, 4, cirq.LineQubit.range(4))],
|
|
63
65
|
)
|
|
64
|
-
def test_decompose(gate, num_copies, qubits):
|
|
66
|
+
def test_decompose(gate, num_copies, qubits) -> None:
|
|
65
67
|
g = cirq.ParallelGate(gate, num_copies)
|
|
66
68
|
step = gate.num_qubits()
|
|
67
69
|
qubit_lists = [qubits[i * step : (i + 1) * step] for i in range(num_copies)]
|
|
68
70
|
assert set(cirq.decompose_once(g(*qubits))) == set(gate.on_each(qubit_lists))
|
|
69
71
|
|
|
70
72
|
|
|
71
|
-
def test_decompose_raises():
|
|
73
|
+
def test_decompose_raises() -> None:
|
|
72
74
|
g = cirq.ParallelGate(cirq.X, 2)
|
|
73
75
|
qubits = cirq.LineQubit.range(4)
|
|
74
76
|
with pytest.raises(ValueError, match=r'len\(qubits\)=4 should be 2'):
|
|
75
77
|
cirq.decompose_once_with_qubits(g, qubits)
|
|
76
78
|
|
|
77
79
|
|
|
78
|
-
def test_with_num_copies():
|
|
80
|
+
def test_with_num_copies() -> None:
|
|
79
81
|
g = cirq.testing.SingleQubitGate()
|
|
80
82
|
pg = cirq.ParallelGate(g, 3)
|
|
81
83
|
assert pg.with_num_copies(5) == cirq.ParallelGate(g, 5)
|
|
82
84
|
|
|
83
85
|
|
|
84
|
-
def test_extrapolate():
|
|
86
|
+
def test_extrapolate() -> None:
|
|
85
87
|
# If the gate isn't extrapolatable, you get a type error.
|
|
86
88
|
g = cirq.ParallelGate(cirq.testing.SingleQubitGate(), 2)
|
|
87
89
|
with pytest.raises(TypeError):
|
|
@@ -93,7 +95,7 @@ def test_extrapolate():
|
|
|
93
95
|
|
|
94
96
|
|
|
95
97
|
@pytest.mark.parametrize('resolve_fn', [cirq.resolve_parameters, cirq.resolve_parameters_once])
|
|
96
|
-
def test_parameterizable_gates(resolve_fn):
|
|
98
|
+
def test_parameterizable_gates(resolve_fn) -> None:
|
|
97
99
|
r = cirq.ParamResolver({'a': 0.5})
|
|
98
100
|
g1 = cirq.ParallelGate(cirq.Z ** sympy.Symbol('a'), 2)
|
|
99
101
|
assert cirq.is_parameterized(g1)
|
|
@@ -102,7 +104,7 @@ def test_parameterizable_gates(resolve_fn):
|
|
|
102
104
|
|
|
103
105
|
|
|
104
106
|
@pytest.mark.parametrize('gate', [cirq.X ** sympy.Symbol("a"), cirq.testing.SingleQubitGate()])
|
|
105
|
-
def test_no_unitary(gate):
|
|
107
|
+
def test_no_unitary(gate) -> None:
|
|
106
108
|
g = cirq.ParallelGate(gate, 2)
|
|
107
109
|
assert not cirq.has_unitary(g)
|
|
108
110
|
assert cirq.unitary(g, None) is None
|
|
@@ -115,7 +117,7 @@ def test_no_unitary(gate):
|
|
|
115
117
|
(cirq.MatrixGate(cirq.unitary(cirq.H**0.25)), 6, cirq.LineQubit.range(6)),
|
|
116
118
|
],
|
|
117
119
|
)
|
|
118
|
-
def test_unitary(gate, num_copies, qubits):
|
|
120
|
+
def test_unitary(gate, num_copies, qubits) -> None:
|
|
119
121
|
g = cirq.ParallelGate(gate, num_copies)
|
|
120
122
|
step = gate.num_qubits()
|
|
121
123
|
qubit_lists = [qubits[i * step : (i + 1) * step] for i in range(num_copies)]
|
|
@@ -124,7 +126,7 @@ def test_unitary(gate, num_copies, qubits):
|
|
|
124
126
|
)
|
|
125
127
|
|
|
126
128
|
|
|
127
|
-
def test_not_implemented_diagram():
|
|
129
|
+
def test_not_implemented_diagram() -> None:
|
|
128
130
|
q = cirq.LineQubit.range(2)
|
|
129
131
|
g = cirq.testing.SingleQubitGate()
|
|
130
132
|
c = cirq.Circuit()
|
|
@@ -132,15 +134,15 @@ def test_not_implemented_diagram():
|
|
|
132
134
|
assert 'cirq.testing.gate_features.SingleQubitGate ' in str(c)
|
|
133
135
|
|
|
134
136
|
|
|
135
|
-
def test_repr():
|
|
137
|
+
def test_repr() -> None:
|
|
136
138
|
assert repr(cirq.ParallelGate(cirq.X, 2)) == 'cirq.ParallelGate(sub_gate=cirq.X, num_copies=2)'
|
|
137
139
|
|
|
138
140
|
|
|
139
|
-
def test_str():
|
|
141
|
+
def test_str() -> None:
|
|
140
142
|
assert str(cirq.ParallelGate(cirq.X**0.5, 10)) == 'X**0.5 x 10'
|
|
141
143
|
|
|
142
144
|
|
|
143
|
-
def test_equivalent_circuit():
|
|
145
|
+
def test_equivalent_circuit() -> None:
|
|
144
146
|
qreg = cirq.LineQubit.range(4)
|
|
145
147
|
oldc = cirq.Circuit()
|
|
146
148
|
newc = cirq.Circuit()
|
|
@@ -154,11 +156,11 @@ def test_equivalent_circuit():
|
|
|
154
156
|
|
|
155
157
|
|
|
156
158
|
@pytest.mark.parametrize('gate, num_copies', [(cirq.X, 1), (cirq.Y, 2), (cirq.Z, 3), (cirq.H, 4)])
|
|
157
|
-
def test_parallel_gate_operation_is_consistent(gate, num_copies):
|
|
159
|
+
def test_parallel_gate_operation_is_consistent(gate, num_copies) -> None:
|
|
158
160
|
cirq.testing.assert_implements_consistent_protocols(cirq.ParallelGate(gate, num_copies))
|
|
159
161
|
|
|
160
162
|
|
|
161
|
-
def test_trace_distance():
|
|
163
|
+
def test_trace_distance() -> None:
|
|
162
164
|
s = cirq.X**0.25
|
|
163
165
|
two_g = cirq.ParallelGate(s, 2)
|
|
164
166
|
three_g = cirq.ParallelGate(s, 3)
|
|
@@ -171,6 +173,6 @@ def test_trace_distance():
|
|
|
171
173
|
|
|
172
174
|
|
|
173
175
|
@pytest.mark.parametrize('gate, num_copies', [(cirq.X, 1), (cirq.Y, 2), (cirq.Z, 3), (cirq.H, 4)])
|
|
174
|
-
def test_parallel_gate_op(gate, num_copies):
|
|
176
|
+
def test_parallel_gate_op(gate, num_copies) -> None:
|
|
175
177
|
qubits = cirq.LineQubit.range(num_copies * gate.num_qubits())
|
|
176
178
|
assert cirq.parallel_gate_op(gate, *qubits) == cirq.ParallelGate(gate, num_copies).on(*qubits)
|
cirq/ops/parity_gates.py
CHANGED
|
@@ -14,7 +14,9 @@
|
|
|
14
14
|
|
|
15
15
|
"""Quantum gates that phase with respect to product-of-pauli observables."""
|
|
16
16
|
|
|
17
|
-
from
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
from typing import Any, Iterator, Sequence, TYPE_CHECKING
|
|
18
20
|
|
|
19
21
|
import numpy as np
|
|
20
22
|
from typing_extensions import Self
|
|
@@ -71,7 +73,7 @@ class XXPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
|
|
|
71
73
|
def _num_qubits_(self) -> int:
|
|
72
74
|
return 2
|
|
73
75
|
|
|
74
|
-
def _eigen_components(self) ->
|
|
76
|
+
def _eigen_components(self) -> list[tuple[float, np.ndarray]]:
|
|
75
77
|
return [
|
|
76
78
|
(
|
|
77
79
|
0.0,
|
|
@@ -88,7 +90,7 @@ class XXPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
|
|
|
88
90
|
def _eigen_shifts(self):
|
|
89
91
|
return [0, 1]
|
|
90
92
|
|
|
91
|
-
def _trace_distance_bound_(self) ->
|
|
93
|
+
def _trace_distance_bound_(self) -> float | None:
|
|
92
94
|
if self._is_parameterized_():
|
|
93
95
|
return None
|
|
94
96
|
return abs(np.sin(self._exponent * 0.5 * np.pi))
|
|
@@ -117,14 +119,14 @@ class XXPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
|
|
|
117
119
|
def _has_stabilizer_effect_(self) -> bool:
|
|
118
120
|
return self.exponent % 2 in (0, 0.5, 1, 1.5)
|
|
119
121
|
|
|
120
|
-
def _decompose_(self, qubits:
|
|
122
|
+
def _decompose_(self, qubits: tuple[cirq.Qid, ...]) -> Iterator[cirq.OP_TREE]:
|
|
121
123
|
yield common_gates.YPowGate(exponent=-0.5).on_each(*qubits)
|
|
122
124
|
yield ZZPowGate(exponent=self.exponent, global_shift=self.global_shift)(*qubits)
|
|
123
125
|
yield common_gates.YPowGate(exponent=0.5).on_each(*qubits)
|
|
124
126
|
|
|
125
127
|
def _circuit_diagram_info_(
|
|
126
|
-
self, args:
|
|
127
|
-
) ->
|
|
128
|
+
self, args: cirq.CircuitDiagramInfoArgs
|
|
129
|
+
) -> str | protocols.CircuitDiagramInfo:
|
|
128
130
|
return protocols.CircuitDiagramInfo(
|
|
129
131
|
wire_symbols=('XX', 'XX'), exponent=self._diagram_exponent(args)
|
|
130
132
|
)
|
|
@@ -178,7 +180,7 @@ class YYPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
|
|
|
178
180
|
def _num_qubits_(self) -> int:
|
|
179
181
|
return 2
|
|
180
182
|
|
|
181
|
-
def _eigen_components(self) ->
|
|
183
|
+
def _eigen_components(self) -> list[tuple[float, np.ndarray]]:
|
|
182
184
|
return [
|
|
183
185
|
(
|
|
184
186
|
0.0,
|
|
@@ -197,7 +199,7 @@ class YYPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
|
|
|
197
199
|
def _eigen_shifts(self):
|
|
198
200
|
return [0, 1]
|
|
199
201
|
|
|
200
|
-
def _trace_distance_bound_(self) ->
|
|
202
|
+
def _trace_distance_bound_(self) -> float | None:
|
|
201
203
|
if self._is_parameterized_():
|
|
202
204
|
return None
|
|
203
205
|
return abs(np.sin(self._exponent * 0.5 * np.pi))
|
|
@@ -226,14 +228,12 @@ class YYPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
|
|
|
226
228
|
def _has_stabilizer_effect_(self) -> bool:
|
|
227
229
|
return self.exponent % 2 in (0, 0.5, 1, 1.5)
|
|
228
230
|
|
|
229
|
-
def _decompose_(self, qubits:
|
|
231
|
+
def _decompose_(self, qubits: tuple[cirq.Qid, ...]) -> Iterator[cirq.OP_TREE]:
|
|
230
232
|
yield common_gates.XPowGate(exponent=0.5).on_each(*qubits)
|
|
231
233
|
yield ZZPowGate(exponent=self.exponent, global_shift=self.global_shift)(*qubits)
|
|
232
234
|
yield common_gates.XPowGate(exponent=-0.5).on_each(*qubits)
|
|
233
235
|
|
|
234
|
-
def _circuit_diagram_info_(
|
|
235
|
-
self, args: 'cirq.CircuitDiagramInfoArgs'
|
|
236
|
-
) -> 'cirq.CircuitDiagramInfo':
|
|
236
|
+
def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> cirq.CircuitDiagramInfo:
|
|
237
237
|
return protocols.CircuitDiagramInfo(
|
|
238
238
|
wire_symbols=('YY', 'YY'), exponent=self._diagram_exponent(args)
|
|
239
239
|
)
|
|
@@ -281,8 +281,8 @@ class ZZPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
|
|
|
281
281
|
)(qubits[0], qubits[1])
|
|
282
282
|
|
|
283
283
|
def _decompose_into_clifford_with_qubits_(
|
|
284
|
-
self, qubits: Sequence[
|
|
285
|
-
) -> Sequence[
|
|
284
|
+
self, qubits: Sequence[cirq.Qid]
|
|
285
|
+
) -> Sequence[cirq.Operation | Sequence[cirq.Operation]]:
|
|
286
286
|
if not self._has_stabilizer_effect_():
|
|
287
287
|
return NotImplemented
|
|
288
288
|
if self.exponent % 2 == 0:
|
|
@@ -308,25 +308,23 @@ class ZZPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
|
|
|
308
308
|
def _has_stabilizer_effect_(self) -> bool:
|
|
309
309
|
return self.exponent % 2 in (0, 0.5, 1, 1.5)
|
|
310
310
|
|
|
311
|
-
def _eigen_components(self) ->
|
|
311
|
+
def _eigen_components(self) -> list[tuple[float, np.ndarray]]:
|
|
312
312
|
return [(0, np.diag([1, 0, 0, 1])), (1, np.diag([0, 1, 1, 0]))]
|
|
313
313
|
|
|
314
314
|
def _eigen_shifts(self):
|
|
315
315
|
return [0, 1]
|
|
316
316
|
|
|
317
|
-
def _trace_distance_bound_(self) ->
|
|
317
|
+
def _trace_distance_bound_(self) -> float | None:
|
|
318
318
|
if self._is_parameterized_():
|
|
319
319
|
return None
|
|
320
320
|
return abs(np.sin(self._exponent * 0.5 * np.pi))
|
|
321
321
|
|
|
322
|
-
def _circuit_diagram_info_(
|
|
323
|
-
self, args: 'cirq.CircuitDiagramInfoArgs'
|
|
324
|
-
) -> 'cirq.CircuitDiagramInfo':
|
|
322
|
+
def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> cirq.CircuitDiagramInfo:
|
|
325
323
|
return protocols.CircuitDiagramInfo(
|
|
326
324
|
wire_symbols=('ZZ', 'ZZ'), exponent=self._diagram_exponent(args)
|
|
327
325
|
)
|
|
328
326
|
|
|
329
|
-
def _apply_unitary_(self, args:
|
|
327
|
+
def _apply_unitary_(self, args: protocols.ApplyUnitaryArgs) -> np.ndarray | None:
|
|
330
328
|
if protocols.is_parameterized(self):
|
|
331
329
|
return None
|
|
332
330
|
|
|
@@ -342,7 +340,7 @@ class ZZPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
|
|
|
342
340
|
|
|
343
341
|
return args.target_tensor
|
|
344
342
|
|
|
345
|
-
def _phase_by_(self, phase_turns: float, qubit_index: int) ->
|
|
343
|
+
def _phase_by_(self, phase_turns: float, qubit_index: int) -> ZZPowGate:
|
|
346
344
|
return self
|
|
347
345
|
|
|
348
346
|
def __str__(self) -> str:
|
|
@@ -382,8 +380,8 @@ class MSGate(XXPowGate):
|
|
|
382
380
|
return type(self)(rads=exponent * np.pi / 2)
|
|
383
381
|
|
|
384
382
|
def _circuit_diagram_info_(
|
|
385
|
-
self, args:
|
|
386
|
-
) ->
|
|
383
|
+
self, args: cirq.CircuitDiagramInfoArgs
|
|
384
|
+
) -> str | protocols.CircuitDiagramInfo:
|
|
387
385
|
angle_str = self._format_exponent_as_angle(args, order=4)
|
|
388
386
|
symbol = f'MS({angle_str})'
|
|
389
387
|
return protocols.CircuitDiagramInfo(wire_symbols=(symbol, symbol))
|
|
@@ -403,11 +401,11 @@ class MSGate(XXPowGate):
|
|
|
403
401
|
def _json_namespace_(cls) -> str:
|
|
404
402
|
return 'cirq'
|
|
405
403
|
|
|
406
|
-
def _json_dict_(self) ->
|
|
404
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
407
405
|
return protocols.obj_to_dict_helper(self, ["rads"])
|
|
408
406
|
|
|
409
407
|
@classmethod
|
|
410
|
-
def _from_json_dict_(cls, rads: float, **kwargs: Any) ->
|
|
408
|
+
def _from_json_dict_(cls, rads: float, **kwargs: Any) -> MSGate:
|
|
411
409
|
return cls(rads=rads)
|
|
412
410
|
|
|
413
411
|
|