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
|
@@ -11,6 +11,9 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
14
17
|
import numpy as np
|
|
15
18
|
import pytest
|
|
16
19
|
|
|
@@ -19,11 +22,11 @@ from cirq.sim import simulation_utils
|
|
|
19
22
|
|
|
20
23
|
|
|
21
24
|
@pytest.mark.parametrize('n,m', [(n, m) for n in range(1, 4) for m in range(1, n + 1)])
|
|
22
|
-
def test_state_probabilities_by_indices(n: int, m: int):
|
|
25
|
+
def test_state_probabilities_by_indices(n: int, m: int) -> None:
|
|
23
26
|
np.random.seed(0)
|
|
24
27
|
state = testing.random_superposition(1 << n)
|
|
25
28
|
d = (state.conj() * state).real
|
|
26
|
-
desired_axes =
|
|
29
|
+
desired_axes = np.random.choice(n, m, replace=False).tolist()
|
|
27
30
|
not_wanted = [i for i in range(n) if i not in desired_axes]
|
|
28
31
|
got = simulation_utils.state_probabilities_by_indices(d, desired_axes, (2,) * n)
|
|
29
32
|
want = np.transpose(d.reshape((2,) * n), desired_axes + not_wanted)
|
cirq/sim/simulator.py
CHANGED
|
@@ -27,24 +27,11 @@ Simulator types include:
|
|
|
27
27
|
as the simulation iterates through the moments of a cirq.
|
|
28
28
|
"""
|
|
29
29
|
|
|
30
|
+
from __future__ import annotations
|
|
31
|
+
|
|
30
32
|
import abc
|
|
31
33
|
import collections
|
|
32
|
-
from typing import
|
|
33
|
-
Any,
|
|
34
|
-
Callable,
|
|
35
|
-
cast,
|
|
36
|
-
Dict,
|
|
37
|
-
Generic,
|
|
38
|
-
Iterator,
|
|
39
|
-
List,
|
|
40
|
-
Mapping,
|
|
41
|
-
Sequence,
|
|
42
|
-
Set,
|
|
43
|
-
Tuple,
|
|
44
|
-
TYPE_CHECKING,
|
|
45
|
-
TypeVar,
|
|
46
|
-
Union,
|
|
47
|
-
)
|
|
34
|
+
from typing import Any, Callable, cast, Generic, Iterator, Mapping, Sequence, TYPE_CHECKING, TypeVar
|
|
48
35
|
|
|
49
36
|
import numpy as np
|
|
50
37
|
|
|
@@ -67,13 +54,13 @@ class SimulatesSamples(work.Sampler, metaclass=abc.ABCMeta):
|
|
|
67
54
|
"""
|
|
68
55
|
|
|
69
56
|
def run_sweep(
|
|
70
|
-
self, program:
|
|
71
|
-
) -> Sequence[
|
|
57
|
+
self, program: cirq.AbstractCircuit, params: cirq.Sweepable, repetitions: int = 1
|
|
58
|
+
) -> Sequence[cirq.Result]:
|
|
72
59
|
return list(self.run_sweep_iter(program, params, repetitions))
|
|
73
60
|
|
|
74
61
|
def run_sweep_iter(
|
|
75
|
-
self, program:
|
|
76
|
-
) -> Iterator[
|
|
62
|
+
self, program: cirq.AbstractCircuit, params: cirq.Sweepable, repetitions: int = 1
|
|
63
|
+
) -> Iterator[cirq.Result]:
|
|
77
64
|
"""Runs the supplied Circuit, mimicking quantum hardware.
|
|
78
65
|
|
|
79
66
|
In contrast to run, this allows for sweeping over different parameter
|
|
@@ -107,11 +94,8 @@ class SimulatesSamples(work.Sampler, metaclass=abc.ABCMeta):
|
|
|
107
94
|
|
|
108
95
|
@abc.abstractmethod
|
|
109
96
|
def _run(
|
|
110
|
-
self,
|
|
111
|
-
|
|
112
|
-
param_resolver: 'cirq.ParamResolver',
|
|
113
|
-
repetitions: int,
|
|
114
|
-
) -> Dict[str, np.ndarray]:
|
|
97
|
+
self, circuit: cirq.AbstractCircuit, param_resolver: cirq.ParamResolver, repetitions: int
|
|
98
|
+
) -> dict[str, np.ndarray]:
|
|
115
99
|
"""Run a simulation, mimicking quantum hardware.
|
|
116
100
|
|
|
117
101
|
Args:
|
|
@@ -142,10 +126,10 @@ class SimulatesAmplitudes(metaclass=value.ABCMetaImplementAnyOneOf):
|
|
|
142
126
|
|
|
143
127
|
def compute_amplitudes(
|
|
144
128
|
self,
|
|
145
|
-
program:
|
|
129
|
+
program: cirq.AbstractCircuit,
|
|
146
130
|
bitstrings: Sequence[int],
|
|
147
|
-
param_resolver:
|
|
148
|
-
qubit_order:
|
|
131
|
+
param_resolver: cirq.ParamResolverOrSimilarType = None,
|
|
132
|
+
qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
|
|
149
133
|
) -> Sequence[complex]:
|
|
150
134
|
"""Computes the desired amplitudes.
|
|
151
135
|
|
|
@@ -173,10 +157,10 @@ class SimulatesAmplitudes(metaclass=value.ABCMetaImplementAnyOneOf):
|
|
|
173
157
|
|
|
174
158
|
def compute_amplitudes_sweep(
|
|
175
159
|
self,
|
|
176
|
-
program:
|
|
160
|
+
program: cirq.AbstractCircuit,
|
|
177
161
|
bitstrings: Sequence[int],
|
|
178
|
-
params:
|
|
179
|
-
qubit_order:
|
|
162
|
+
params: cirq.Sweepable,
|
|
163
|
+
qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
|
|
180
164
|
) -> Sequence[Sequence[complex]]:
|
|
181
165
|
"""Wraps computed amplitudes in a list.
|
|
182
166
|
|
|
@@ -186,10 +170,10 @@ class SimulatesAmplitudes(metaclass=value.ABCMetaImplementAnyOneOf):
|
|
|
186
170
|
|
|
187
171
|
def _compute_amplitudes_sweep_to_iter(
|
|
188
172
|
self,
|
|
189
|
-
program:
|
|
173
|
+
program: cirq.AbstractCircuit,
|
|
190
174
|
bitstrings: Sequence[int],
|
|
191
|
-
params:
|
|
192
|
-
qubit_order:
|
|
175
|
+
params: cirq.Sweepable,
|
|
176
|
+
qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
|
|
193
177
|
) -> Iterator[Sequence[complex]]:
|
|
194
178
|
if type(self).compute_amplitudes_sweep == SimulatesAmplitudes.compute_amplitudes_sweep:
|
|
195
179
|
raise RecursionError(
|
|
@@ -202,10 +186,10 @@ class SimulatesAmplitudes(metaclass=value.ABCMetaImplementAnyOneOf):
|
|
|
202
186
|
)
|
|
203
187
|
def compute_amplitudes_sweep_iter(
|
|
204
188
|
self,
|
|
205
|
-
program:
|
|
189
|
+
program: cirq.AbstractCircuit,
|
|
206
190
|
bitstrings: Sequence[int],
|
|
207
|
-
params:
|
|
208
|
-
qubit_order:
|
|
191
|
+
params: cirq.Sweepable,
|
|
192
|
+
qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
|
|
209
193
|
) -> Iterator[Sequence[complex]]:
|
|
210
194
|
"""Computes the desired amplitudes.
|
|
211
195
|
|
|
@@ -232,12 +216,12 @@ class SimulatesAmplitudes(metaclass=value.ABCMetaImplementAnyOneOf):
|
|
|
232
216
|
|
|
233
217
|
def sample_from_amplitudes(
|
|
234
218
|
self,
|
|
235
|
-
circuit:
|
|
236
|
-
param_resolver:
|
|
237
|
-
seed:
|
|
219
|
+
circuit: cirq.AbstractCircuit,
|
|
220
|
+
param_resolver: cirq.ParamResolver,
|
|
221
|
+
seed: cirq.RANDOM_STATE_OR_SEED_LIKE,
|
|
238
222
|
repetitions: int = 1,
|
|
239
|
-
qubit_order:
|
|
240
|
-
) ->
|
|
223
|
+
qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
|
|
224
|
+
) -> dict[int, int]:
|
|
241
225
|
"""Uses amplitude simulation to sample from the given circuit.
|
|
242
226
|
|
|
243
227
|
This implements the algorithm outlined by Bravyi, Gosset, and Liu in
|
|
@@ -280,7 +264,7 @@ class SimulatesAmplitudes(metaclass=value.ABCMetaImplementAnyOneOf):
|
|
|
280
264
|
for m_id, moment in enumerate(solved_circuit[1:]):
|
|
281
265
|
circuit_prefix = solved_circuit[: m_id + 1]
|
|
282
266
|
for t, op in enumerate(moment.operations):
|
|
283
|
-
new_samples:
|
|
267
|
+
new_samples: dict[tuple[int, ...], int] = collections.defaultdict(int)
|
|
284
268
|
qubit_indices = {qmap[q] for q in op.qubits}
|
|
285
269
|
subcircuit = circuit_prefix + circuits.Moment(moment.operations[: t + 1])
|
|
286
270
|
for current_sample, count in current_samples.items():
|
|
@@ -315,13 +299,13 @@ class SimulatesExpectationValues(metaclass=value.ABCMetaImplementAnyOneOf):
|
|
|
315
299
|
|
|
316
300
|
def simulate_expectation_values(
|
|
317
301
|
self,
|
|
318
|
-
program:
|
|
319
|
-
observables:
|
|
320
|
-
param_resolver:
|
|
321
|
-
qubit_order:
|
|
302
|
+
program: cirq.AbstractCircuit,
|
|
303
|
+
observables: cirq.PauliSumLike | list[cirq.PauliSumLike],
|
|
304
|
+
param_resolver: cirq.ParamResolverOrSimilarType = None,
|
|
305
|
+
qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
|
|
322
306
|
initial_state: Any = None,
|
|
323
307
|
permit_terminal_measurements: bool = False,
|
|
324
|
-
) ->
|
|
308
|
+
) -> list[float]:
|
|
325
309
|
"""Simulates the supplied circuit and calculates exact expectation
|
|
326
310
|
values for the given observables on its final state.
|
|
327
311
|
|
|
@@ -363,13 +347,13 @@ class SimulatesExpectationValues(metaclass=value.ABCMetaImplementAnyOneOf):
|
|
|
363
347
|
|
|
364
348
|
def simulate_expectation_values_sweep(
|
|
365
349
|
self,
|
|
366
|
-
program:
|
|
367
|
-
observables:
|
|
368
|
-
params:
|
|
369
|
-
qubit_order:
|
|
350
|
+
program: cirq.AbstractCircuit,
|
|
351
|
+
observables: cirq.PauliSumLike | list[cirq.PauliSumLike],
|
|
352
|
+
params: cirq.Sweepable,
|
|
353
|
+
qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
|
|
370
354
|
initial_state: Any = None,
|
|
371
355
|
permit_terminal_measurements: bool = False,
|
|
372
|
-
) ->
|
|
356
|
+
) -> list[list[float]]:
|
|
373
357
|
"""Wraps computed expectation values in a list.
|
|
374
358
|
|
|
375
359
|
Prefer overriding `simulate_expectation_values_sweep_iter`.
|
|
@@ -387,13 +371,13 @@ class SimulatesExpectationValues(metaclass=value.ABCMetaImplementAnyOneOf):
|
|
|
387
371
|
|
|
388
372
|
def _simulate_expectation_values_sweep_to_iter(
|
|
389
373
|
self,
|
|
390
|
-
program:
|
|
391
|
-
observables:
|
|
392
|
-
params:
|
|
393
|
-
qubit_order:
|
|
374
|
+
program: cirq.AbstractCircuit,
|
|
375
|
+
observables: cirq.PauliSumLike | list[cirq.PauliSumLike],
|
|
376
|
+
params: cirq.Sweepable,
|
|
377
|
+
qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
|
|
394
378
|
initial_state: Any = None,
|
|
395
379
|
permit_terminal_measurements: bool = False,
|
|
396
|
-
) -> Iterator[
|
|
380
|
+
) -> Iterator[list[float]]:
|
|
397
381
|
if (
|
|
398
382
|
type(self).simulate_expectation_values_sweep
|
|
399
383
|
== SimulatesExpectationValues.simulate_expectation_values_sweep
|
|
@@ -412,13 +396,13 @@ class SimulatesExpectationValues(metaclass=value.ABCMetaImplementAnyOneOf):
|
|
|
412
396
|
)
|
|
413
397
|
def simulate_expectation_values_sweep_iter(
|
|
414
398
|
self,
|
|
415
|
-
program:
|
|
416
|
-
observables:
|
|
417
|
-
params:
|
|
418
|
-
qubit_order:
|
|
399
|
+
program: cirq.AbstractCircuit,
|
|
400
|
+
observables: cirq.PauliSumLike | list[cirq.PauliSumLike],
|
|
401
|
+
params: cirq.Sweepable,
|
|
402
|
+
qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
|
|
419
403
|
initial_state: Any = None,
|
|
420
404
|
permit_terminal_measurements: bool = False,
|
|
421
|
-
) -> Iterator[
|
|
405
|
+
) -> Iterator[list[float]]:
|
|
422
406
|
"""Simulates the supplied circuit and calculates exact expectation
|
|
423
407
|
values for the given observables on its final state, sweeping over the
|
|
424
408
|
given params.
|
|
@@ -470,9 +454,9 @@ class SimulatesFinalState(
|
|
|
470
454
|
|
|
471
455
|
def simulate(
|
|
472
456
|
self,
|
|
473
|
-
program:
|
|
474
|
-
param_resolver:
|
|
475
|
-
qubit_order:
|
|
457
|
+
program: cirq.AbstractCircuit,
|
|
458
|
+
param_resolver: cirq.ParamResolverOrSimilarType = None,
|
|
459
|
+
qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
|
|
476
460
|
initial_state: Any = None,
|
|
477
461
|
) -> TSimulationTrialResult:
|
|
478
462
|
"""Simulates the supplied Circuit.
|
|
@@ -499,11 +483,11 @@ class SimulatesFinalState(
|
|
|
499
483
|
|
|
500
484
|
def simulate_sweep(
|
|
501
485
|
self,
|
|
502
|
-
program:
|
|
503
|
-
params:
|
|
504
|
-
qubit_order:
|
|
486
|
+
program: cirq.AbstractCircuit,
|
|
487
|
+
params: cirq.Sweepable,
|
|
488
|
+
qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
|
|
505
489
|
initial_state: Any = None,
|
|
506
|
-
) ->
|
|
490
|
+
) -> list[TSimulationTrialResult]:
|
|
507
491
|
"""Wraps computed states in a list.
|
|
508
492
|
|
|
509
493
|
Prefer overriding `simulate_sweep_iter`.
|
|
@@ -512,9 +496,9 @@ class SimulatesFinalState(
|
|
|
512
496
|
|
|
513
497
|
def _simulate_sweep_to_iter(
|
|
514
498
|
self,
|
|
515
|
-
program:
|
|
516
|
-
params:
|
|
517
|
-
qubit_order:
|
|
499
|
+
program: cirq.AbstractCircuit,
|
|
500
|
+
params: cirq.Sweepable,
|
|
501
|
+
qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
|
|
518
502
|
initial_state: Any = None,
|
|
519
503
|
) -> Iterator[TSimulationTrialResult]:
|
|
520
504
|
if type(self).simulate_sweep == SimulatesFinalState.simulate_sweep:
|
|
@@ -524,9 +508,9 @@ class SimulatesFinalState(
|
|
|
524
508
|
@value.alternative(requires='simulate_sweep', implementation=_simulate_sweep_to_iter)
|
|
525
509
|
def simulate_sweep_iter(
|
|
526
510
|
self,
|
|
527
|
-
program:
|
|
528
|
-
params:
|
|
529
|
-
qubit_order:
|
|
511
|
+
program: cirq.AbstractCircuit,
|
|
512
|
+
params: cirq.Sweepable,
|
|
513
|
+
qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
|
|
530
514
|
initial_state: Any = None,
|
|
531
515
|
) -> Iterator[TSimulationTrialResult]:
|
|
532
516
|
"""Simulates the supplied Circuit.
|
|
@@ -572,9 +556,9 @@ class SimulatesIntermediateState(
|
|
|
572
556
|
|
|
573
557
|
def simulate_sweep_iter(
|
|
574
558
|
self,
|
|
575
|
-
program:
|
|
576
|
-
params:
|
|
577
|
-
qubit_order:
|
|
559
|
+
program: cirq.AbstractCircuit,
|
|
560
|
+
params: cirq.Sweepable,
|
|
561
|
+
qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
|
|
578
562
|
initial_state: Any = None,
|
|
579
563
|
) -> Iterator[TSimulationTrialResult]:
|
|
580
564
|
"""Simulates the supplied Circuit.
|
|
@@ -609,7 +593,7 @@ class SimulatesIntermediateState(
|
|
|
609
593
|
all_step_results = self.simulate_moment_steps(
|
|
610
594
|
program, param_resolver, qubit_order, state
|
|
611
595
|
)
|
|
612
|
-
measurements:
|
|
596
|
+
measurements: dict[str, np.ndarray] = {}
|
|
613
597
|
for step_result in all_step_results:
|
|
614
598
|
for k, v in step_result.measurements.items():
|
|
615
599
|
measurements[k] = np.array(v, dtype=np.uint8)
|
|
@@ -621,9 +605,9 @@ class SimulatesIntermediateState(
|
|
|
621
605
|
|
|
622
606
|
def simulate_moment_steps(
|
|
623
607
|
self,
|
|
624
|
-
circuit:
|
|
625
|
-
param_resolver:
|
|
626
|
-
qubit_order:
|
|
608
|
+
circuit: cirq.AbstractCircuit,
|
|
609
|
+
param_resolver: cirq.ParamResolverOrSimilarType = None,
|
|
610
|
+
qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
|
|
627
611
|
initial_state: Any = None,
|
|
628
612
|
) -> Iterator[TStepResult]:
|
|
629
613
|
"""Returns an iterator of StepResults for each moment simulated.
|
|
@@ -655,7 +639,7 @@ class SimulatesIntermediateState(
|
|
|
655
639
|
|
|
656
640
|
@abc.abstractmethod
|
|
657
641
|
def _base_iterator(
|
|
658
|
-
self, circuit:
|
|
642
|
+
self, circuit: cirq.AbstractCircuit, qubits: tuple[cirq.Qid, ...], initial_state: Any
|
|
659
643
|
) -> Iterator[TStepResult]:
|
|
660
644
|
"""Iterator over StepResult from Moments of a Circuit.
|
|
661
645
|
|
|
@@ -675,8 +659,8 @@ class SimulatesIntermediateState(
|
|
|
675
659
|
@abc.abstractmethod
|
|
676
660
|
def _create_simulator_trial_result(
|
|
677
661
|
self,
|
|
678
|
-
params:
|
|
679
|
-
measurements:
|
|
662
|
+
params: cirq.ParamResolver,
|
|
663
|
+
measurements: dict[str, np.ndarray],
|
|
680
664
|
final_simulator_state: TSimulatorState,
|
|
681
665
|
) -> TSimulationTrialResult:
|
|
682
666
|
"""This method can be implemented to create a trial result.
|
|
@@ -723,9 +707,9 @@ class StepResult(Generic[TSimulatorState], metaclass=abc.ABCMeta):
|
|
|
723
707
|
@abc.abstractmethod
|
|
724
708
|
def sample(
|
|
725
709
|
self,
|
|
726
|
-
qubits:
|
|
710
|
+
qubits: list[cirq.Qid],
|
|
727
711
|
repetitions: int = 1,
|
|
728
|
-
seed:
|
|
712
|
+
seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
|
|
729
713
|
) -> np.ndarray:
|
|
730
714
|
"""Samples from the system at this point in the computation.
|
|
731
715
|
|
|
@@ -747,12 +731,12 @@ class StepResult(Generic[TSimulatorState], metaclass=abc.ABCMeta):
|
|
|
747
731
|
|
|
748
732
|
def sample_measurement_ops(
|
|
749
733
|
self,
|
|
750
|
-
measurement_ops:
|
|
734
|
+
measurement_ops: list[cirq.GateOperation],
|
|
751
735
|
repetitions: int = 1,
|
|
752
|
-
seed:
|
|
736
|
+
seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
|
|
753
737
|
*,
|
|
754
738
|
_allow_repeated=False,
|
|
755
|
-
) ->
|
|
739
|
+
) -> dict[str, np.ndarray]:
|
|
756
740
|
"""Samples from the system at this point in the computation.
|
|
757
741
|
|
|
758
742
|
Note that this does not collapse the state vector.
|
|
@@ -798,7 +782,7 @@ class StepResult(Generic[TSimulatorState], metaclass=abc.ABCMeta):
|
|
|
798
782
|
|
|
799
783
|
# Find measured qubits, ensuring a consistent ordering.
|
|
800
784
|
measured_qubits = []
|
|
801
|
-
seen_qubits:
|
|
785
|
+
seen_qubits: set[cirq.Qid] = set()
|
|
802
786
|
for op in measurement_ops:
|
|
803
787
|
for q in op.qubits:
|
|
804
788
|
if q not in seen_qubits:
|
|
@@ -809,7 +793,7 @@ class StepResult(Generic[TSimulatorState], metaclass=abc.ABCMeta):
|
|
|
809
793
|
indexed_sample = self.sample(measured_qubits, repetitions, seed=seed)
|
|
810
794
|
|
|
811
795
|
# Extract results for each measurement.
|
|
812
|
-
results:
|
|
796
|
+
results: dict[str, Any] = {}
|
|
813
797
|
qubits_to_index = {q: i for i, q in enumerate(measured_qubits)}
|
|
814
798
|
for op in measurement_ops:
|
|
815
799
|
gate = cast(ops.MeasurementGate, op.gate)
|
|
@@ -837,9 +821,9 @@ class StepResult(Generic[TSimulatorState], metaclass=abc.ABCMeta):
|
|
|
837
821
|
def _confuse_results(
|
|
838
822
|
self,
|
|
839
823
|
bits: np.ndarray,
|
|
840
|
-
qubits: Sequence[
|
|
841
|
-
confusion_map:
|
|
842
|
-
seed:
|
|
824
|
+
qubits: Sequence[cirq.Qid],
|
|
825
|
+
confusion_map: dict[tuple[int, ...], np.ndarray],
|
|
826
|
+
seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
|
|
843
827
|
) -> None:
|
|
844
828
|
"""Mutates `bits` using the confusion_map.
|
|
845
829
|
|
|
@@ -876,7 +860,7 @@ class SimulationTrialResult(Generic[TSimulatorState]):
|
|
|
876
860
|
|
|
877
861
|
def __init__(
|
|
878
862
|
self,
|
|
879
|
-
params:
|
|
863
|
+
params: cirq.ParamResolver,
|
|
880
864
|
measurements: Mapping[str, np.ndarray],
|
|
881
865
|
final_simulator_state: TSimulatorState,
|
|
882
866
|
) -> None:
|
|
@@ -895,7 +879,7 @@ class SimulationTrialResult(Generic[TSimulatorState]):
|
|
|
895
879
|
self._final_simulator_state = final_simulator_state
|
|
896
880
|
|
|
897
881
|
@property
|
|
898
|
-
def params(self) ->
|
|
882
|
+
def params(self) -> cirq.ParamResolver:
|
|
899
883
|
return self._params
|
|
900
884
|
|
|
901
885
|
@property
|
|
@@ -932,18 +916,18 @@ class SimulationTrialResult(Generic[TSimulatorState]):
|
|
|
932
916
|
return self.params, measurements, self._final_simulator_state
|
|
933
917
|
|
|
934
918
|
@property
|
|
935
|
-
def qubit_map(self) -> Mapping[
|
|
919
|
+
def qubit_map(self) -> Mapping[cirq.Qid, int]:
|
|
936
920
|
"""A map from Qid to index used to define the ordering of the basis in
|
|
937
921
|
the result.
|
|
938
922
|
"""
|
|
939
923
|
return self._final_simulator_state.qubit_map
|
|
940
924
|
|
|
941
|
-
def _qid_shape_(self) ->
|
|
925
|
+
def _qid_shape_(self) -> tuple[int, ...]:
|
|
942
926
|
return _qubit_map_to_shape(self.qubit_map)
|
|
943
927
|
|
|
944
928
|
|
|
945
|
-
def _qubit_map_to_shape(qubit_map: Mapping[
|
|
946
|
-
qid_shape:
|
|
929
|
+
def _qubit_map_to_shape(qubit_map: Mapping[cirq.Qid, int]) -> tuple[int, ...]:
|
|
930
|
+
qid_shape: list[int] = [-1] * len(qubit_map)
|
|
947
931
|
try:
|
|
948
932
|
for q, i in qubit_map.items():
|
|
949
933
|
qid_shape[i] = q.dimension
|
|
@@ -965,8 +949,8 @@ def check_all_resolved(circuit):
|
|
|
965
949
|
|
|
966
950
|
|
|
967
951
|
def split_into_matching_protocol_then_general(
|
|
968
|
-
circuit:
|
|
969
|
-
) ->
|
|
952
|
+
circuit: cirq.AbstractCircuit, predicate: Callable[[cirq.Operation], bool]
|
|
953
|
+
) -> tuple[cirq.AbstractCircuit, cirq.AbstractCircuit]:
|
|
970
954
|
"""Splits the circuit into a matching prefix and non-matching suffix.
|
|
971
955
|
|
|
972
956
|
The splitting happens in a per-qubit fashion. A non-matching operation on
|
|
@@ -975,8 +959,8 @@ def split_into_matching_protocol_then_general(
|
|
|
975
959
|
the matching part (as long as those qubits have had no non-matching operation
|
|
976
960
|
up to that point). Measurement keys are handled equivalently.
|
|
977
961
|
"""
|
|
978
|
-
blocked_qubits:
|
|
979
|
-
blocked_keys:
|
|
962
|
+
blocked_qubits: set[cirq.Qid] = set()
|
|
963
|
+
blocked_keys: set[cirq.MeasurementKey] = set()
|
|
980
964
|
matching_prefix = circuits.Circuit()
|
|
981
965
|
general_suffix = circuits.Circuit()
|
|
982
966
|
for moment in circuit:
|