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
|
@@ -22,40 +22,26 @@ component operations in order, including any nested CircuitOperations.
|
|
|
22
22
|
from __future__ import annotations
|
|
23
23
|
|
|
24
24
|
import math
|
|
25
|
-
import warnings
|
|
26
25
|
from functools import cached_property
|
|
27
|
-
from typing import
|
|
28
|
-
Any,
|
|
29
|
-
Callable,
|
|
30
|
-
cast,
|
|
31
|
-
Dict,
|
|
32
|
-
FrozenSet,
|
|
33
|
-
Iterator,
|
|
34
|
-
List,
|
|
35
|
-
Mapping,
|
|
36
|
-
Optional,
|
|
37
|
-
Sequence,
|
|
38
|
-
Tuple,
|
|
39
|
-
TYPE_CHECKING,
|
|
40
|
-
Union,
|
|
41
|
-
)
|
|
26
|
+
from typing import Any, Callable, cast, Iterator, Mapping, Sequence, TYPE_CHECKING, TypeAlias
|
|
42
27
|
|
|
43
28
|
import numpy as np
|
|
44
29
|
import sympy
|
|
45
30
|
|
|
46
31
|
from cirq import circuits, ops, protocols, study, value
|
|
47
|
-
from cirq._compat import proper_repr
|
|
32
|
+
from cirq._compat import cached_method, proper_repr
|
|
48
33
|
|
|
49
34
|
if TYPE_CHECKING:
|
|
50
35
|
import cirq
|
|
51
36
|
|
|
37
|
+
|
|
52
38
|
INT_CLASSES = (int, np.integer)
|
|
53
|
-
INT_TYPE =
|
|
54
|
-
IntParam =
|
|
39
|
+
INT_TYPE: TypeAlias = int | np.integer
|
|
40
|
+
IntParam: TypeAlias = INT_TYPE | sympy.Expr
|
|
55
41
|
REPETITION_ID_SEPARATOR = '-'
|
|
56
42
|
|
|
57
43
|
|
|
58
|
-
def default_repetition_ids(repetitions: IntParam) ->
|
|
44
|
+
def default_repetition_ids(repetitions: IntParam) -> list[str] | None:
|
|
59
45
|
if isinstance(repetitions, INT_CLASSES) and abs(repetitions) != 1:
|
|
60
46
|
abs_repetitions: int = abs(int(repetitions))
|
|
61
47
|
return [str(i) for i in range(abs_repetitions)]
|
|
@@ -63,8 +49,8 @@ def default_repetition_ids(repetitions: IntParam) -> Optional[List[str]]:
|
|
|
63
49
|
|
|
64
50
|
|
|
65
51
|
def _full_join_string_lists(
|
|
66
|
-
list1:
|
|
67
|
-
) ->
|
|
52
|
+
list1: Sequence[str] | None, list2: Sequence[str] | None
|
|
53
|
+
) -> Sequence[str] | None:
|
|
68
54
|
if list1 is None and list2 is None:
|
|
69
55
|
return None # pragma: no cover
|
|
70
56
|
if list1 is None:
|
|
@@ -86,14 +72,14 @@ class CircuitOperation(ops.Operation):
|
|
|
86
72
|
self,
|
|
87
73
|
circuit: cirq.FrozenCircuit,
|
|
88
74
|
repetitions: INT_TYPE = 1,
|
|
89
|
-
qubit_map:
|
|
90
|
-
measurement_key_map:
|
|
91
|
-
param_resolver:
|
|
92
|
-
repetition_ids:
|
|
93
|
-
parent_path:
|
|
94
|
-
extern_keys:
|
|
95
|
-
use_repetition_ids:
|
|
96
|
-
repeat_until:
|
|
75
|
+
qubit_map: dict[cirq.Qid, cirq.Qid] | None = None,
|
|
76
|
+
measurement_key_map: dict[str, str] | None = None,
|
|
77
|
+
param_resolver: study.ParamResolverOrSimilarType | None = None,
|
|
78
|
+
repetition_ids: Sequence[str] | None = None,
|
|
79
|
+
parent_path: tuple[str, ...] = (),
|
|
80
|
+
extern_keys: frozenset[cirq.MeasurementKey] = frozenset(),
|
|
81
|
+
use_repetition_ids: bool | None = None,
|
|
82
|
+
repeat_until: cirq.Condition | None = None,
|
|
97
83
|
):
|
|
98
84
|
"""Initializes a CircuitOperation.
|
|
99
85
|
|
|
@@ -123,9 +109,8 @@ class CircuitOperation(ops.Operation):
|
|
|
123
109
|
use_repetition_ids: When True, any measurement key in the subcircuit
|
|
124
110
|
will have its path prepended with the repetition id for each
|
|
125
111
|
repetition. When False, this will not happen and the measurement
|
|
126
|
-
key will be repeated.
|
|
127
|
-
|
|
128
|
-
``use_repetition_ids=True`` to preserve the current behavior.
|
|
112
|
+
key will be repeated. When None, default to False unless the caller
|
|
113
|
+
passes `repetition_ids` explicitly.
|
|
129
114
|
repeat_until: A condition that will be tested after each iteration of
|
|
130
115
|
the subcircuit. The subcircuit will repeat until condition returns
|
|
131
116
|
True, but will always run at least once, and the measurement key
|
|
@@ -162,18 +147,8 @@ class CircuitOperation(ops.Operation):
|
|
|
162
147
|
self._repetitions = repetitions
|
|
163
148
|
self._repetition_ids = None if repetition_ids is None else list(repetition_ids)
|
|
164
149
|
if use_repetition_ids is None:
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
"In cirq 1.6 the default value of `use_repetition_ids` will change to\n"
|
|
168
|
-
"`use_repetition_ids=False`. To make this warning go away, please pass\n"
|
|
169
|
-
"explicit `use_repetition_ids`, e.g., to preserve current behavior, use\n"
|
|
170
|
-
"\n"
|
|
171
|
-
" CircuitOperations(..., use_repetition_ids=True)"
|
|
172
|
-
)
|
|
173
|
-
warnings.warn(msg, FutureWarning)
|
|
174
|
-
self._use_repetition_ids = True
|
|
175
|
-
else:
|
|
176
|
-
self._use_repetition_ids = use_repetition_ids
|
|
150
|
+
use_repetition_ids = repetition_ids is not None
|
|
151
|
+
self._use_repetition_ids = use_repetition_ids
|
|
177
152
|
if isinstance(self._repetitions, float):
|
|
178
153
|
if math.isclose(self._repetitions, round(self._repetitions)):
|
|
179
154
|
self._repetitions = round(self._repetitions)
|
|
@@ -236,7 +211,7 @@ class CircuitOperation(ops.Operation):
|
|
|
236
211
|
return self._repetitions
|
|
237
212
|
|
|
238
213
|
@property
|
|
239
|
-
def repetition_ids(self) ->
|
|
214
|
+
def repetition_ids(self) -> Sequence[str] | None:
|
|
240
215
|
return self._repetition_ids
|
|
241
216
|
|
|
242
217
|
@property
|
|
@@ -244,7 +219,7 @@ class CircuitOperation(ops.Operation):
|
|
|
244
219
|
return self._use_repetition_ids
|
|
245
220
|
|
|
246
221
|
@property
|
|
247
|
-
def repeat_until(self) ->
|
|
222
|
+
def repeat_until(self) -> cirq.Condition | None:
|
|
248
223
|
return self._repeat_until
|
|
249
224
|
|
|
250
225
|
@property
|
|
@@ -260,7 +235,7 @@ class CircuitOperation(ops.Operation):
|
|
|
260
235
|
return self._param_resolver
|
|
261
236
|
|
|
262
237
|
@property
|
|
263
|
-
def parent_path(self) ->
|
|
238
|
+
def parent_path(self) -> tuple[str, ...]:
|
|
264
239
|
return self._parent_path
|
|
265
240
|
|
|
266
241
|
def base_operation(self) -> cirq.CircuitOperation:
|
|
@@ -281,7 +256,9 @@ class CircuitOperation(ops.Operation):
|
|
|
281
256
|
'repetition_ids': self.repetition_ids,
|
|
282
257
|
'parent_path': self.parent_path,
|
|
283
258
|
'extern_keys': self._extern_keys,
|
|
284
|
-
'use_repetition_ids':
|
|
259
|
+
'use_repetition_ids': (
|
|
260
|
+
True if changes.get('repetition_ids') is not None else self.use_repetition_ids
|
|
261
|
+
),
|
|
285
262
|
'repeat_until': self.repeat_until,
|
|
286
263
|
**changes,
|
|
287
264
|
}
|
|
@@ -305,33 +282,34 @@ class CircuitOperation(ops.Operation):
|
|
|
305
282
|
# Methods for getting post-mapping properties of the contained circuit.
|
|
306
283
|
|
|
307
284
|
@property
|
|
308
|
-
def qubits(self) ->
|
|
285
|
+
def qubits(self) -> tuple[cirq.Qid, ...]:
|
|
309
286
|
"""Returns the qubits operated on by this object."""
|
|
310
287
|
ordered_qubits = ops.QubitOrder.DEFAULT.order_for(self.circuit.all_qubits())
|
|
311
288
|
return tuple(self.qubit_map.get(q, q) for q in ordered_qubits)
|
|
312
289
|
|
|
313
|
-
def _default_repetition_ids(self) ->
|
|
290
|
+
def _default_repetition_ids(self) -> list[str] | None:
|
|
314
291
|
return default_repetition_ids(self.repetitions) if self.use_repetition_ids else None
|
|
315
292
|
|
|
316
|
-
def _qid_shape_(self) ->
|
|
293
|
+
def _qid_shape_(self) -> tuple[int, ...]:
|
|
317
294
|
return tuple(q.dimension for q in self.qubits)
|
|
318
295
|
|
|
319
296
|
def _is_measurement_(self) -> bool:
|
|
320
297
|
return self.circuit._is_measurement_()
|
|
321
298
|
|
|
299
|
+
@cached_method
|
|
322
300
|
def _has_unitary_(self) -> bool:
|
|
323
301
|
# Return false if parameterized for early exit of has_unitary protocol.
|
|
324
|
-
# Otherwise return NotImplemented instructing the protocol to try alternate strategies
|
|
325
302
|
if self._is_parameterized_() or self.repeat_until:
|
|
326
303
|
return False
|
|
327
|
-
|
|
304
|
+
operations = self._mapped_any_loop.all_operations()
|
|
305
|
+
return all(protocols.has_unitary(op) for op in operations)
|
|
328
306
|
|
|
329
307
|
def _ensure_deterministic_loop_count(self):
|
|
330
308
|
if self.repeat_until or isinstance(self.repetitions, sympy.Expr):
|
|
331
309
|
raise ValueError('Cannot unroll circuit due to nondeterministic repetitions')
|
|
332
310
|
|
|
333
311
|
@cached_property
|
|
334
|
-
def _measurement_key_objs(self) ->
|
|
312
|
+
def _measurement_key_objs(self) -> frozenset[cirq.MeasurementKey]:
|
|
335
313
|
circuit_keys = protocols.measurement_key_objs(self.circuit)
|
|
336
314
|
if circuit_keys and self.use_repetition_ids:
|
|
337
315
|
self._ensure_deterministic_loop_count()
|
|
@@ -349,14 +327,14 @@ class CircuitOperation(ops.Operation):
|
|
|
349
327
|
for key in circuit_keys
|
|
350
328
|
)
|
|
351
329
|
|
|
352
|
-
def _measurement_key_objs_(self) ->
|
|
330
|
+
def _measurement_key_objs_(self) -> frozenset[cirq.MeasurementKey]:
|
|
353
331
|
return self._measurement_key_objs
|
|
354
332
|
|
|
355
|
-
def _measurement_key_names_(self) ->
|
|
333
|
+
def _measurement_key_names_(self) -> frozenset[str]:
|
|
356
334
|
return frozenset(str(key) for key in self._measurement_key_objs_())
|
|
357
335
|
|
|
358
336
|
@cached_property
|
|
359
|
-
def _control_keys(self) ->
|
|
337
|
+
def _control_keys(self) -> frozenset[cirq.MeasurementKey]:
|
|
360
338
|
keys = (
|
|
361
339
|
frozenset()
|
|
362
340
|
if not protocols.control_keys(self.circuit)
|
|
@@ -367,13 +345,13 @@ class CircuitOperation(ops.Operation):
|
|
|
367
345
|
keys |= frozenset(mapped_repeat_until.keys) - self._measurement_key_objs_()
|
|
368
346
|
return keys
|
|
369
347
|
|
|
370
|
-
def _control_keys_(self) ->
|
|
348
|
+
def _control_keys_(self) -> frozenset[cirq.MeasurementKey]:
|
|
371
349
|
return self._control_keys
|
|
372
350
|
|
|
373
351
|
def _is_parameterized_(self) -> bool:
|
|
374
352
|
return any(self._parameter_names_generator())
|
|
375
353
|
|
|
376
|
-
def _parameter_names_(self) ->
|
|
354
|
+
def _parameter_names_(self) -> frozenset[str]:
|
|
377
355
|
return frozenset(self._parameter_names_generator())
|
|
378
356
|
|
|
379
357
|
def _parameter_names_generator(self) -> Iterator[str]:
|
|
@@ -394,7 +372,7 @@ class CircuitOperation(ops.Operation):
|
|
|
394
372
|
circuit = protocols.resolve_parameters(circuit, self.param_resolver, recursive=False)
|
|
395
373
|
return circuit.unfreeze(copy=False)
|
|
396
374
|
|
|
397
|
-
def _mapped_single_loop(self, repetition_id:
|
|
375
|
+
def _mapped_single_loop(self, repetition_id: str | None = None) -> cirq.Circuit:
|
|
398
376
|
circuit = self._mapped_any_loop
|
|
399
377
|
if repetition_id:
|
|
400
378
|
circuit = protocols.with_rescoped_keys(circuit, (repetition_id,))
|
|
@@ -403,7 +381,7 @@ class CircuitOperation(ops.Operation):
|
|
|
403
381
|
)
|
|
404
382
|
|
|
405
383
|
@cached_property
|
|
406
|
-
def _mapped_repeat_until(self) ->
|
|
384
|
+
def _mapped_repeat_until(self) -> cirq.Condition | None:
|
|
407
385
|
"""Applies measurement_key_map, param_resolver, and current scope to repeat_until."""
|
|
408
386
|
repeat_until = self.repeat_until
|
|
409
387
|
if not repeat_until:
|
|
@@ -485,11 +463,9 @@ class CircuitOperation(ops.Operation):
|
|
|
485
463
|
args += f'param_resolver={proper_repr(self.param_resolver)},\n'
|
|
486
464
|
if self.parent_path:
|
|
487
465
|
args += f'parent_path={proper_repr(self.parent_path)},\n'
|
|
488
|
-
if self.
|
|
466
|
+
if self.use_repetition_ids:
|
|
489
467
|
# Default repetition_ids need not be specified.
|
|
490
468
|
args += f'repetition_ids={proper_repr(self.repetition_ids)},\n'
|
|
491
|
-
if not self.use_repetition_ids:
|
|
492
|
-
args += 'use_repetition_ids=False,\n'
|
|
493
469
|
if self.repeat_until:
|
|
494
470
|
args += f'repeat_until={self.repeat_until!r},\n'
|
|
495
471
|
indented_args = args.replace('\n', '\n ')
|
|
@@ -514,14 +490,15 @@ class CircuitOperation(ops.Operation):
|
|
|
514
490
|
args.append(f'params={self.param_resolver.param_dict}')
|
|
515
491
|
if self.parent_path:
|
|
516
492
|
args.append(f'parent_path={self.parent_path}')
|
|
517
|
-
if self.
|
|
518
|
-
|
|
519
|
-
|
|
493
|
+
if self.use_repetition_ids:
|
|
494
|
+
if self.repetition_ids != self._default_repetition_ids():
|
|
495
|
+
args.append(f'repetition_ids={self.repetition_ids}')
|
|
496
|
+
else:
|
|
497
|
+
# Default repetition_ids need not be specified.
|
|
498
|
+
args.append(f'loops={self.repetitions}, use_repetition_ids=True')
|
|
520
499
|
elif self.repetitions != 1:
|
|
521
|
-
#
|
|
500
|
+
# Add loops if not using repetition_ids.
|
|
522
501
|
args.append(f'loops={self.repetitions}')
|
|
523
|
-
if not self.use_repetition_ids:
|
|
524
|
-
args.append('no_rep_ids')
|
|
525
502
|
if self.repeat_until:
|
|
526
503
|
args.append(f'until={self.repeat_until}')
|
|
527
504
|
if not args:
|
|
@@ -546,7 +523,7 @@ class CircuitOperation(ops.Operation):
|
|
|
546
523
|
def __hash__(self) -> int:
|
|
547
524
|
return self._hash
|
|
548
525
|
|
|
549
|
-
def __getstate__(self) ->
|
|
526
|
+
def __getstate__(self) -> dict[str, Any]:
|
|
550
527
|
# clear cached hash value when pickling, see #6674
|
|
551
528
|
state = self.__dict__
|
|
552
529
|
# cached_property stores value in the property-named attribute
|
|
@@ -566,10 +543,9 @@ class CircuitOperation(ops.Operation):
|
|
|
566
543
|
'measurement_key_map': self.measurement_key_map,
|
|
567
544
|
'param_resolver': self.param_resolver,
|
|
568
545
|
'repetition_ids': self.repetition_ids,
|
|
546
|
+
'use_repetition_ids': self.use_repetition_ids,
|
|
569
547
|
'parent_path': self.parent_path,
|
|
570
548
|
}
|
|
571
|
-
if not self.use_repetition_ids:
|
|
572
|
-
resp['use_repetition_ids'] = False
|
|
573
549
|
if self.repeat_until:
|
|
574
550
|
resp['repeat_until'] = self.repeat_until
|
|
575
551
|
return resp
|
|
@@ -603,7 +579,10 @@ class CircuitOperation(ops.Operation):
|
|
|
603
579
|
# Methods for constructing a similar object with one field modified.
|
|
604
580
|
|
|
605
581
|
def repeat(
|
|
606
|
-
self,
|
|
582
|
+
self,
|
|
583
|
+
repetitions: IntParam | None = None,
|
|
584
|
+
repetition_ids: Sequence[str] | None = None,
|
|
585
|
+
use_repetition_ids: bool | None = None,
|
|
607
586
|
) -> CircuitOperation:
|
|
608
587
|
"""Returns a copy of this operation repeated 'repetitions' times.
|
|
609
588
|
Each repetition instance will be identified by a single repetition_id.
|
|
@@ -614,6 +593,10 @@ class CircuitOperation(ops.Operation):
|
|
|
614
593
|
defaults to the length of `repetition_ids`.
|
|
615
594
|
repetition_ids: List of IDs, one for each repetition. If unset,
|
|
616
595
|
defaults to `default_repetition_ids(repetitions)`.
|
|
596
|
+
use_repetition_ids: If given, this specifies the value for `use_repetition_ids`
|
|
597
|
+
of the resulting circuit operation. If not given, we enable ids if
|
|
598
|
+
`repetition_ids` is not None, and otherwise fall back to
|
|
599
|
+
`self.use_repetition_ids`.
|
|
617
600
|
|
|
618
601
|
Returns:
|
|
619
602
|
A copy of this operation repeated `repetitions` times with the
|
|
@@ -628,6 +611,9 @@ class CircuitOperation(ops.Operation):
|
|
|
628
611
|
ValueError: Unexpected length of `repetition_ids`.
|
|
629
612
|
ValueError: Both `repetitions` and `repetition_ids` are None.
|
|
630
613
|
"""
|
|
614
|
+
if use_repetition_ids is None:
|
|
615
|
+
use_repetition_ids = True if repetition_ids is not None else self.use_repetition_ids
|
|
616
|
+
|
|
631
617
|
if repetitions is None:
|
|
632
618
|
if repetition_ids is None:
|
|
633
619
|
raise ValueError('At least one of repetitions and repetition_ids must be set')
|
|
@@ -641,7 +627,7 @@ class CircuitOperation(ops.Operation):
|
|
|
641
627
|
expected_repetition_id_length: int = np.abs(repetitions)
|
|
642
628
|
|
|
643
629
|
if repetition_ids is None:
|
|
644
|
-
if
|
|
630
|
+
if use_repetition_ids:
|
|
645
631
|
repetition_ids = default_repetition_ids(expected_repetition_id_length)
|
|
646
632
|
elif len(repetition_ids) != expected_repetition_id_length:
|
|
647
633
|
raise ValueError(
|
|
@@ -654,19 +640,23 @@ class CircuitOperation(ops.Operation):
|
|
|
654
640
|
|
|
655
641
|
# The eventual number of repetitions of the returned CircuitOperation.
|
|
656
642
|
final_repetitions = protocols.mul(self.repetitions, repetitions)
|
|
657
|
-
return self.replace(
|
|
643
|
+
return self.replace(
|
|
644
|
+
repetitions=final_repetitions,
|
|
645
|
+
repetition_ids=repetition_ids,
|
|
646
|
+
use_repetition_ids=use_repetition_ids,
|
|
647
|
+
)
|
|
658
648
|
|
|
659
649
|
def __pow__(self, power: IntParam) -> cirq.CircuitOperation:
|
|
660
650
|
return self.repeat(power)
|
|
661
651
|
|
|
662
|
-
def _with_key_path_(self, path:
|
|
652
|
+
def _with_key_path_(self, path: tuple[str, ...]) -> cirq.CircuitOperation:
|
|
663
653
|
return self.replace(parent_path=path)
|
|
664
654
|
|
|
665
|
-
def _with_key_path_prefix_(self, prefix:
|
|
655
|
+
def _with_key_path_prefix_(self, prefix: tuple[str, ...]):
|
|
666
656
|
return self.replace(parent_path=prefix + self.parent_path)
|
|
667
657
|
|
|
668
658
|
def _with_rescoped_keys_(
|
|
669
|
-
self, path:
|
|
659
|
+
self, path: tuple[str, ...], bindable_keys: frozenset[cirq.MeasurementKey]
|
|
670
660
|
):
|
|
671
661
|
# The following line prevents binding to measurement keys in previous repeated subcircuits
|
|
672
662
|
# "just because their repetition ids matched". If we eventually decide to change that
|
|
@@ -678,7 +668,7 @@ class CircuitOperation(ops.Operation):
|
|
|
678
668
|
path += self.parent_path
|
|
679
669
|
return self.replace(parent_path=path, extern_keys=bindable_keys)
|
|
680
670
|
|
|
681
|
-
def with_key_path(self, path:
|
|
671
|
+
def with_key_path(self, path: tuple[str, ...]) -> cirq.CircuitOperation:
|
|
682
672
|
"""Alias for `cirq.with_key_path(self, path)`.
|
|
683
673
|
|
|
684
674
|
Args:
|
|
@@ -690,7 +680,7 @@ class CircuitOperation(ops.Operation):
|
|
|
690
680
|
"""
|
|
691
681
|
return self._with_key_path_(path)
|
|
692
682
|
|
|
693
|
-
def with_repetition_ids(self, repetition_ids:
|
|
683
|
+
def with_repetition_ids(self, repetition_ids: list[str]) -> cirq.CircuitOperation:
|
|
694
684
|
"""Returns a copy of this `CircuitOperation` with the given repetition IDs.
|
|
695
685
|
|
|
696
686
|
Args:
|
|
@@ -703,7 +693,7 @@ class CircuitOperation(ops.Operation):
|
|
|
703
693
|
return self.replace(repetition_ids=repetition_ids)
|
|
704
694
|
|
|
705
695
|
def with_qubit_mapping(
|
|
706
|
-
self, qubit_map:
|
|
696
|
+
self, qubit_map: Mapping[cirq.Qid, cirq.Qid] | Callable[[cirq.Qid], cirq.Qid]
|
|
707
697
|
) -> cirq.CircuitOperation:
|
|
708
698
|
"""Returns a copy of this operation with an updated qubit mapping.
|
|
709
699
|
|