cirq-core 1.5.0.dev20250409222543__py3-none-any.whl → 1.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of cirq-core might be problematic. Click here for more details.
- cirq/__init__.py +16 -17
- cirq/_compat.py +21 -20
- cirq/_compat_test.py +14 -34
- cirq/_doc.py +4 -2
- cirq/_import.py +8 -6
- cirq/_import_test.py +4 -2
- cirq/_version.py +6 -6
- cirq/_version_test.py +2 -2
- cirq/circuits/_block_diagram_drawer.py +11 -10
- cirq/circuits/_block_diagram_drawer_test.py +8 -6
- cirq/circuits/_box_drawing_character_data.py +8 -8
- cirq/circuits/_box_drawing_character_data_test.py +3 -1
- cirq/circuits/_bucket_priority_queue.py +9 -7
- cirq/circuits/_bucket_priority_queue_test.py +22 -20
- cirq/circuits/circuit.py +248 -172
- cirq/circuits/circuit_operation.py +73 -83
- cirq/circuits/circuit_operation_test.py +128 -90
- cirq/circuits/circuit_test.py +211 -151
- cirq/circuits/frozen_circuit.py +23 -60
- cirq/circuits/frozen_circuit_test.py +31 -8
- cirq/circuits/insert_strategy.py +7 -5
- cirq/circuits/insert_strategy_test.py +4 -2
- cirq/circuits/moment.py +88 -40
- cirq/circuits/moment_test.py +128 -51
- cirq/circuits/optimization_pass.py +5 -5
- cirq/circuits/optimization_pass_test.py +10 -10
- cirq/circuits/qasm_output.py +11 -11
- cirq/circuits/qasm_output_test.py +25 -22
- cirq/circuits/text_diagram_drawer.py +23 -38
- cirq/circuits/text_diagram_drawer_test.py +19 -17
- cirq/conftest.py +4 -3
- cirq/contrib/__init__.py +4 -4
- cirq/contrib/acquaintance/__init__.py +1 -1
- cirq/contrib/acquaintance/bipartite.py +5 -8
- cirq/contrib/acquaintance/bipartite_test.py +18 -13
- cirq/contrib/acquaintance/devices.py +2 -2
- cirq/contrib/acquaintance/devices_test.py +5 -3
- cirq/contrib/acquaintance/executor.py +5 -5
- cirq/contrib/acquaintance/executor_test.py +13 -9
- cirq/contrib/acquaintance/gates.py +18 -28
- cirq/contrib/acquaintance/gates_test.py +24 -20
- cirq/contrib/acquaintance/inspection_utils.py +8 -4
- cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
- cirq/contrib/acquaintance/mutation_utils.py +4 -4
- cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
- cirq/contrib/acquaintance/optimizers.py +4 -4
- cirq/contrib/acquaintance/optimizers_test.py +4 -1
- cirq/contrib/acquaintance/permutation.py +15 -27
- cirq/contrib/acquaintance/permutation_test.py +26 -17
- cirq/contrib/acquaintance/shift.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
- cirq/contrib/acquaintance/shift_test.py +8 -6
- cirq/contrib/acquaintance/strategies/cubic.py +2 -2
- cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
- cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
- cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
- cirq/contrib/acquaintance/testing.py +2 -0
- cirq/contrib/acquaintance/topological_sort.py +2 -2
- cirq/contrib/acquaintance/topological_sort_test.py +3 -1
- cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
- cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
- cirq/contrib/circuitdag/circuit_dag.py +4 -4
- cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
- cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
- cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
- cirq/contrib/graph_device/graph_device.py +12 -11
- cirq/contrib/graph_device/graph_device_test.py +18 -14
- cirq/contrib/graph_device/hypergraph.py +16 -14
- cirq/contrib/graph_device/hypergraph_test.py +13 -11
- cirq/contrib/graph_device/uniform_graph_device.py +6 -4
- cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
- cirq/contrib/hacks/disable_validation.py +6 -1
- cirq/contrib/hacks/disable_validation_test.py +3 -1
- cirq/contrib/json.py +31 -5
- cirq/contrib/json_test.py +6 -3
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/__init__.py +17 -0
- cirq/contrib/json_test_data/spec.py +32 -0
- cirq/contrib/noise_models/noise_models.py +119 -5
- cirq/contrib/noise_models/noise_models_test.py +37 -9
- cirq/contrib/paulistring/clifford_optimize.py +6 -4
- cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
- cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
- cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
- cirq/contrib/paulistring/optimize.py +2 -0
- cirq/contrib/paulistring/optimize_test.py +4 -3
- cirq/contrib/paulistring/pauli_string_dag.py +2 -0
- cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
- cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
- cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
- cirq/contrib/paulistring/recombine.py +6 -4
- cirq/contrib/paulistring/recombine_test.py +3 -1
- cirq/contrib/paulistring/separate.py +9 -6
- cirq/contrib/paulistring/separate_test.py +3 -1
- cirq/contrib/qasm_import/_lexer.py +3 -2
- cirq/contrib/qasm_import/_lexer_test.py +49 -13
- cirq/contrib/qasm_import/_parser.py +547 -83
- cirq/contrib/qasm_import/_parser_test.py +988 -97
- cirq/contrib/qasm_import/exception.py +2 -0
- cirq/contrib/qasm_import/qasm.py +8 -2
- cirq/contrib/qasm_import/qasm_test.py +7 -4
- cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
- cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
- cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
- cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
- cirq/contrib/qcircuit/qcircuit_test.py +10 -8
- cirq/contrib/quantum_volume/quantum_volume.py +31 -27
- cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
- cirq/contrib/quimb/density_matrix.py +15 -14
- cirq/contrib/quimb/density_matrix_test.py +10 -7
- cirq/contrib/quimb/grid_circuits.py +5 -2
- cirq/contrib/quimb/grid_circuits_test.py +3 -0
- cirq/contrib/quimb/mps_simulator.py +20 -20
- cirq/contrib/quimb/mps_simulator_test.py +3 -0
- cirq/contrib/quimb/state_vector.py +12 -11
- cirq/contrib/quimb/state_vector_test.py +3 -0
- cirq/contrib/quirk/export_to_quirk.py +5 -3
- cirq/contrib/quirk/export_to_quirk_test.py +18 -16
- cirq/contrib/quirk/linearize_circuit.py +2 -0
- cirq/contrib/quirk/quirk_gate.py +18 -17
- cirq/contrib/routing/device.py +5 -3
- cirq/contrib/routing/device_test.py +2 -0
- cirq/contrib/routing/greedy.py +10 -21
- cirq/contrib/routing/greedy_test.py +4 -2
- cirq/contrib/routing/initialization.py +2 -2
- cirq/contrib/routing/initialization_test.py +5 -3
- cirq/contrib/routing/router.py +9 -5
- cirq/contrib/routing/router_test.py +2 -0
- cirq/contrib/routing/swap_network.py +3 -3
- cirq/contrib/routing/swap_network_test.py +3 -1
- cirq/contrib/routing/utils.py +2 -2
- cirq/contrib/routing/utils_test.py +3 -0
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
- cirq/contrib/svg/svg.py +3 -3
- cirq/contrib/svg/svg_test.py +8 -5
- cirq/devices/device.py +4 -4
- cirq/devices/device_test.py +7 -4
- cirq/devices/grid_device_metadata.py +10 -10
- cirq/devices/grid_device_metadata_test.py +3 -0
- cirq/devices/grid_qubit.py +29 -21
- cirq/devices/grid_qubit_test.py +3 -0
- cirq/devices/insertion_noise_model.py +7 -7
- cirq/devices/insertion_noise_model_test.py +7 -5
- cirq/devices/line_qubit.py +13 -13
- cirq/devices/line_qubit_test.py +2 -0
- cirq/devices/named_topologies.py +18 -29
- cirq/devices/named_topologies_test.py +13 -10
- cirq/devices/noise_model.py +3 -3
- cirq/devices/noise_model_test.py +19 -15
- cirq/devices/noise_properties.py +15 -6
- cirq/devices/noise_properties_test.py +34 -3
- cirq/devices/noise_utils.py +11 -9
- cirq/devices/noise_utils_test.py +2 -0
- cirq/devices/superconducting_qubits_noise_properties.py +23 -22
- cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
- cirq/devices/thermal_noise_model.py +107 -37
- cirq/devices/thermal_noise_model_test.py +21 -0
- cirq/devices/unconstrained_device.py +5 -3
- cirq/devices/unconstrained_device_test.py +2 -0
- cirq/experiments/__init__.py +4 -2
- cirq/experiments/benchmarking/__init__.py +17 -0
- cirq/experiments/benchmarking/parallel_xeb.py +677 -0
- cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
- cirq/experiments/fidelity_estimation.py +14 -8
- cirq/experiments/fidelity_estimation_test.py +3 -0
- cirq/experiments/n_qubit_tomography.py +17 -16
- cirq/experiments/n_qubit_tomography_test.py +8 -5
- cirq/experiments/purity_estimation.py +2 -0
- cirq/experiments/purity_estimation_test.py +2 -0
- cirq/experiments/qubit_characterizations.py +207 -103
- cirq/experiments/qubit_characterizations_test.py +40 -12
- cirq/experiments/random_quantum_circuit_generation.py +56 -70
- cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
- cirq/experiments/readout_confusion_matrix.py +24 -22
- cirq/experiments/readout_confusion_matrix_test.py +2 -0
- cirq/experiments/single_qubit_readout_calibration.py +30 -15
- cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
- cirq/experiments/t1_decay_experiment.py +9 -7
- cirq/experiments/t1_decay_experiment_test.py +13 -11
- cirq/experiments/t2_decay_experiment.py +16 -13
- cirq/experiments/t2_decay_experiment_test.py +2 -0
- cirq/experiments/two_qubit_xeb.py +64 -57
- cirq/experiments/two_qubit_xeb_test.py +10 -6
- cirq/experiments/xeb_fitting.py +39 -35
- cirq/experiments/xeb_sampling.py +37 -44
- cirq/experiments/xeb_sampling_test.py +3 -0
- cirq/experiments/xeb_simulation.py +14 -10
- cirq/experiments/xeb_simulation_test.py +5 -5
- cirq/experiments/z_phase_calibration.py +32 -29
- cirq/experiments/z_phase_calibration_test.py +3 -4
- cirq/interop/quirk/cells/__init__.py +1 -1
- cirq/interop/quirk/cells/all_cells.py +7 -2
- cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
- cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
- cirq/interop/quirk/cells/cell.py +19 -28
- cirq/interop/quirk/cells/cell_test.py +3 -0
- cirq/interop/quirk/cells/composite_cell.py +13 -28
- cirq/interop/quirk/cells/composite_cell_test.py +2 -0
- cirq/interop/quirk/cells/control_cells.py +15 -15
- cirq/interop/quirk/cells/control_cells_test.py +7 -5
- cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
- cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
- cirq/interop/quirk/cells/ignored_cells.py +3 -0
- cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
- cirq/interop/quirk/cells/input_cells.py +7 -5
- cirq/interop/quirk/cells/input_cells_test.py +7 -5
- cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
- cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
- cirq/interop/quirk/cells/measurement_cells.py +5 -2
- cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
- cirq/interop/quirk/cells/parse.py +22 -23
- cirq/interop/quirk/cells/parse_test.py +12 -10
- cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
- cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
- cirq/interop/quirk/cells/scalar_cells.py +4 -1
- cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
- cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
- cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
- cirq/interop/quirk/cells/swap_cell.py +8 -6
- cirq/interop/quirk/cells/swap_cell_test.py +6 -4
- cirq/interop/quirk/cells/testing.py +6 -6
- cirq/interop/quirk/cells/testing_test.py +8 -6
- cirq/interop/quirk/cells/unsupported_cells.py +3 -0
- cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
- cirq/interop/quirk/url_to_circuit.py +23 -36
- cirq/interop/quirk/url_to_circuit_test.py +4 -1
- cirq/json_resolver_cache.py +14 -12
- cirq/linalg/__init__.py +4 -6
- cirq/linalg/combinators.py +7 -5
- cirq/linalg/combinators_test.py +10 -7
- cirq/linalg/decompositions.py +24 -35
- cirq/linalg/decompositions_test.py +3 -1
- cirq/linalg/diagonalize.py +6 -4
- cirq/linalg/diagonalize_test.py +15 -14
- cirq/linalg/operator_spaces.py +14 -14
- cirq/linalg/operator_spaces_test.py +13 -11
- cirq/linalg/predicates.py +18 -9
- cirq/linalg/predicates_test.py +5 -0
- cirq/linalg/tolerance.py +6 -3
- cirq/linalg/tolerance_test.py +6 -4
- cirq/linalg/transformations.py +23 -20
- cirq/linalg/transformations_test.py +73 -43
- cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
- cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
- cirq/neutral_atoms/neutral_atom_devices.py +2 -0
- cirq/ops/__init__.py +2 -0
- cirq/ops/arithmetic_operation.py +21 -21
- cirq/ops/arithmetic_operation_test.py +7 -8
- cirq/ops/boolean_hamiltonian.py +23 -22
- cirq/ops/boolean_hamiltonian_test.py +12 -9
- cirq/ops/classically_controlled_operation.py +31 -36
- cirq/ops/classically_controlled_operation_test.py +121 -117
- cirq/ops/clifford_gate.py +98 -81
- cirq/ops/clifford_gate_test.py +72 -57
- cirq/ops/common_channels.py +44 -44
- cirq/ops/common_channels_test.py +83 -81
- cirq/ops/common_gate_families.py +9 -7
- cirq/ops/common_gate_families_test.py +11 -7
- cirq/ops/common_gates.py +164 -183
- cirq/ops/common_gates_test.py +135 -95
- cirq/ops/control_values.py +23 -26
- cirq/ops/control_values_test.py +22 -20
- cirq/ops/controlled_gate.py +64 -112
- cirq/ops/controlled_gate_test.py +130 -35
- cirq/ops/controlled_operation.py +24 -35
- cirq/ops/controlled_operation_test.py +8 -6
- cirq/ops/dense_pauli_string.py +38 -49
- cirq/ops/dense_pauli_string_test.py +4 -2
- cirq/ops/diagonal_gate.py +18 -31
- cirq/ops/diagonal_gate_test.py +13 -13
- cirq/ops/eigen_gate.py +29 -29
- cirq/ops/eigen_gate_test.py +45 -28
- cirq/ops/fourier_transform.py +14 -20
- cirq/ops/fourier_transform_test.py +15 -12
- cirq/ops/fsim_gate.py +43 -42
- cirq/ops/fsim_gate_test.py +29 -29
- cirq/ops/gate_features.py +2 -0
- cirq/ops/gate_features_test.py +5 -3
- cirq/ops/gate_operation.py +43 -65
- cirq/ops/gate_operation_test.py +46 -42
- cirq/ops/gateset.py +28 -40
- cirq/ops/gateset_test.py +4 -2
- cirq/ops/global_phase_op.py +45 -20
- cirq/ops/global_phase_op_test.py +44 -20
- cirq/ops/greedy_qubit_manager.py +10 -8
- cirq/ops/greedy_qubit_manager_test.py +5 -3
- cirq/ops/identity.py +14 -12
- cirq/ops/identity_test.py +24 -20
- cirq/ops/kraus_channel.py +11 -8
- cirq/ops/kraus_channel_test.py +14 -11
- cirq/ops/linear_combinations.py +65 -77
- cirq/ops/linear_combinations_test.py +14 -9
- cirq/ops/matrix_gates.py +21 -18
- cirq/ops/matrix_gates_test.py +16 -0
- cirq/ops/measure_util.py +15 -20
- cirq/ops/measure_util_test.py +2 -0
- cirq/ops/measurement_gate.py +26 -37
- cirq/ops/measurement_gate_test.py +2 -0
- cirq/ops/mixed_unitary_channel.py +12 -9
- cirq/ops/mixed_unitary_channel_test.py +14 -11
- cirq/ops/named_qubit.py +16 -13
- cirq/ops/named_qubit_test.py +15 -13
- cirq/ops/op_tree.py +9 -7
- cirq/ops/op_tree_test.py +22 -19
- cirq/ops/parallel_gate.py +15 -17
- cirq/ops/parallel_gate_test.py +18 -16
- cirq/ops/parity_gates.py +23 -25
- cirq/ops/parity_gates_test.py +36 -32
- cirq/ops/pauli_gates.py +22 -21
- cirq/ops/pauli_gates_test.py +29 -20
- cirq/ops/pauli_interaction_gate.py +15 -19
- cirq/ops/pauli_interaction_gate_test.py +10 -8
- cirq/ops/pauli_measurement_gate.py +23 -35
- cirq/ops/pauli_measurement_gate_test.py +2 -0
- cirq/ops/pauli_string.py +92 -120
- cirq/ops/pauli_string_phasor.py +52 -45
- cirq/ops/pauli_string_phasor_test.py +4 -5
- cirq/ops/pauli_string_raw_types.py +9 -7
- cirq/ops/pauli_string_raw_types_test.py +2 -0
- cirq/ops/pauli_string_test.py +31 -154
- cirq/ops/pauli_sum_exponential.py +12 -12
- cirq/ops/pauli_sum_exponential_test.py +12 -10
- cirq/ops/permutation_gate.py +8 -6
- cirq/ops/permutation_gate_test.py +10 -8
- cirq/ops/phased_iswap_gate.py +16 -16
- cirq/ops/phased_iswap_gate_test.py +17 -15
- cirq/ops/phased_x_gate.py +16 -17
- cirq/ops/phased_x_gate_test.py +18 -16
- cirq/ops/phased_x_z_gate.py +24 -22
- cirq/ops/phased_x_z_gate_test.py +17 -11
- cirq/ops/projector.py +16 -11
- cirq/ops/projector_test.py +19 -16
- cirq/ops/qid_util.py +7 -5
- cirq/ops/qid_util_test.py +2 -0
- cirq/ops/qubit_manager.py +11 -9
- cirq/ops/qubit_manager_test.py +6 -4
- cirq/ops/qubit_order.py +11 -14
- cirq/ops/qubit_order_or_list.py +4 -2
- cirq/ops/qubit_order_test.py +12 -10
- cirq/ops/random_gate_channel.py +12 -10
- cirq/ops/random_gate_channel_test.py +14 -11
- cirq/ops/raw_types.py +109 -129
- cirq/ops/raw_types_test.py +63 -57
- cirq/ops/state_preparation_channel.py +7 -7
- cirq/ops/state_preparation_channel_test.py +11 -9
- cirq/ops/swap_gates.py +13 -15
- cirq/ops/swap_gates_test.py +19 -17
- cirq/ops/tags.py +5 -3
- cirq/ops/tags_test.py +4 -2
- cirq/ops/three_qubit_gates.py +43 -76
- cirq/ops/three_qubit_gates_test.py +19 -17
- cirq/ops/two_qubit_diagonal_gate.py +13 -13
- cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
- cirq/ops/uniform_superposition_gate.py +5 -3
- cirq/ops/uniform_superposition_gate_test.py +5 -3
- cirq/ops/wait_gate.py +17 -14
- cirq/ops/wait_gate_test.py +9 -6
- cirq/protocols/__init__.py +0 -3
- cirq/protocols/act_on_protocol.py +8 -6
- cirq/protocols/act_on_protocol_test.py +15 -12
- cirq/protocols/apply_channel_protocol.py +10 -14
- cirq/protocols/apply_channel_protocol_test.py +2 -0
- cirq/protocols/apply_mixture_protocol.py +13 -42
- cirq/protocols/apply_mixture_protocol_test.py +7 -5
- cirq/protocols/apply_unitary_protocol.py +39 -34
- cirq/protocols/apply_unitary_protocol_test.py +4 -1
- cirq/protocols/approximate_equality_protocol.py +2 -0
- cirq/protocols/approximate_equality_protocol_test.py +2 -0
- cirq/protocols/circuit_diagram_info_protocol.py +58 -42
- cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
- cirq/protocols/commutes_protocol.py +8 -7
- cirq/protocols/commutes_protocol_test.py +2 -0
- cirq/protocols/control_key_protocol.py +6 -4
- cirq/protocols/control_key_protocol_test.py +3 -1
- cirq/protocols/decompose_protocol.py +49 -48
- cirq/protocols/decompose_protocol_test.py +27 -16
- cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
- cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
- cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
- cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
- cirq/protocols/has_unitary_protocol.py +10 -6
- cirq/protocols/has_unitary_protocol_test.py +13 -8
- cirq/protocols/hash_from_pickle_test.py +2 -11
- cirq/protocols/inverse_protocol.py +13 -16
- cirq/protocols/inverse_protocol_test.py +5 -3
- cirq/protocols/json_serialization.py +35 -54
- cirq/protocols/json_serialization_test.py +14 -21
- cirq/protocols/json_test_data/CXSWAP.json +46 -0
- cirq/protocols/json_test_data/CXSWAP.repr +13 -0
- cirq/protocols/json_test_data/CZSWAP.json +46 -0
- cirq/protocols/json_test_data/CZSWAP.repr +13 -0
- cirq/protocols/json_test_data/CircuitOperation.json +6 -3
- cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
- cirq/protocols/json_test_data/Moment.json +24 -1
- cirq/protocols/json_test_data/Moment.repr +6 -1
- cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
- cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
- cirq/protocols/json_test_data/spec.py +6 -2
- cirq/protocols/kraus_protocol.py +47 -7
- cirq/protocols/kraus_protocol_test.py +86 -12
- cirq/protocols/measurement_key_protocol.py +15 -16
- cirq/protocols/measurement_key_protocol_test.py +13 -11
- cirq/protocols/mixture_protocol.py +7 -5
- cirq/protocols/mixture_protocol_test.py +4 -2
- cirq/protocols/mul_protocol.py +2 -3
- cirq/protocols/mul_protocol_test.py +2 -0
- cirq/protocols/pauli_expansion_protocol.py +6 -3
- cirq/protocols/pauli_expansion_protocol_test.py +5 -3
- cirq/protocols/phase_protocol.py +2 -0
- cirq/protocols/phase_protocol_test.py +3 -1
- cirq/protocols/pow_protocol.py +11 -16
- cirq/protocols/pow_protocol_test.py +2 -0
- cirq/protocols/qasm.py +14 -20
- cirq/protocols/qasm_test.py +6 -3
- cirq/protocols/qid_shape_protocol.py +8 -8
- cirq/protocols/qid_shape_protocol_test.py +3 -1
- cirq/protocols/resolve_parameters.py +5 -3
- cirq/protocols/resolve_parameters_test.py +8 -7
- cirq/protocols/trace_distance_bound.py +6 -4
- cirq/protocols/trace_distance_bound_test.py +3 -1
- cirq/protocols/unitary_protocol.py +17 -7
- cirq/protocols/unitary_protocol_test.py +12 -2
- cirq/qis/channels.py +6 -2
- cirq/qis/channels_test.py +20 -16
- cirq/qis/clifford_tableau.py +21 -19
- cirq/qis/clifford_tableau_test.py +2 -2
- cirq/qis/entropy.py +14 -3
- cirq/qis/entropy_test.py +3 -1
- cirq/qis/measures.py +13 -13
- cirq/qis/measures_test.py +20 -14
- cirq/qis/noise_utils.py +2 -0
- cirq/qis/noise_utils_test.py +9 -7
- cirq/qis/quantum_state_representation.py +7 -8
- cirq/qis/states.py +58 -56
- cirq/qis/states_test.py +2 -0
- cirq/sim/classical_simulator.py +23 -22
- cirq/sim/classical_simulator_test.py +2 -0
- cirq/sim/clifford/clifford_simulator.py +23 -21
- cirq/sim/clifford/clifford_simulator_test.py +7 -4
- cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
- cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
- cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
- cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
- cirq/sim/clifford/stabilizer_sampler.py +9 -7
- cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
- cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
- cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
- cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
- cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
- cirq/sim/density_matrix_simulation_state.py +26 -27
- cirq/sim/density_matrix_simulation_state_test.py +10 -8
- cirq/sim/density_matrix_simulator.py +30 -28
- cirq/sim/density_matrix_simulator_test.py +48 -48
- cirq/sim/density_matrix_utils.py +13 -11
- cirq/sim/density_matrix_utils_test.py +38 -36
- cirq/sim/mux.py +33 -31
- cirq/sim/mux_test.py +3 -0
- cirq/sim/simulation_product_state.py +15 -15
- cirq/sim/simulation_product_state_test.py +29 -26
- cirq/sim/simulation_state.py +29 -38
- cirq/sim/simulation_state_base.py +21 -32
- cirq/sim/simulation_state_test.py +15 -13
- cirq/sim/simulation_utils.py +5 -2
- cirq/sim/simulation_utils_test.py +5 -2
- cirq/sim/simulator.py +90 -106
- cirq/sim/simulator_base.py +33 -45
- cirq/sim/simulator_base_test.py +20 -15
- cirq/sim/simulator_test.py +23 -14
- cirq/sim/sparse_simulator.py +19 -17
- cirq/sim/sparse_simulator_test.py +41 -40
- cirq/sim/state_vector.py +15 -12
- cirq/sim/state_vector_simulation_state.py +31 -31
- cirq/sim/state_vector_simulation_state_test.py +16 -14
- cirq/sim/state_vector_simulator.py +17 -14
- cirq/sim/state_vector_simulator_test.py +2 -0
- cirq/sim/state_vector_test.py +6 -3
- cirq/study/flatten_expressions.py +16 -15
- cirq/study/flatten_expressions_test.py +13 -11
- cirq/study/resolver.py +18 -17
- cirq/study/resolver_test.py +22 -20
- cirq/study/result.py +17 -27
- cirq/study/result_test.py +2 -0
- cirq/study/sweepable.py +12 -10
- cirq/study/sweepable_test.py +3 -0
- cirq/study/sweeps.py +42 -61
- cirq/study/sweeps_test.py +33 -0
- cirq/testing/__init__.py +7 -11
- cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
- cirq/testing/circuit_compare.py +8 -17
- cirq/testing/circuit_compare_test.py +2 -0
- cirq/testing/consistent_act_on.py +13 -11
- cirq/testing/consistent_act_on_test.py +5 -3
- cirq/testing/consistent_channels.py +2 -0
- cirq/testing/consistent_channels_test.py +10 -8
- cirq/testing/consistent_controlled_gate_op.py +5 -5
- cirq/testing/consistent_controlled_gate_op_test.py +18 -18
- cirq/testing/consistent_decomposition.py +2 -2
- cirq/testing/consistent_decomposition_test.py +4 -2
- cirq/testing/consistent_pauli_expansion.py +2 -0
- cirq/testing/consistent_pauli_expansion_test.py +3 -1
- cirq/testing/consistent_phase_by.py +2 -0
- cirq/testing/consistent_phase_by_test.py +3 -1
- cirq/testing/consistent_protocols.py +14 -20
- cirq/testing/consistent_protocols_test.py +13 -11
- cirq/testing/consistent_qasm.py +6 -4
- cirq/testing/consistent_qasm_test.py +7 -7
- cirq/testing/consistent_resolve_parameters.py +2 -0
- cirq/testing/consistent_specified_has_unitary.py +2 -2
- cirq/testing/consistent_specified_has_unitary_test.py +6 -4
- cirq/testing/consistent_unitary.py +1 -0
- cirq/testing/consistent_unitary_test.py +4 -2
- cirq/testing/deprecation.py +5 -2
- cirq/testing/deprecation_test.py +5 -2
- cirq/testing/devices.py +7 -4
- cirq/testing/devices_test.py +7 -4
- cirq/testing/equals_tester.py +4 -2
- cirq/testing/equals_tester_test.py +21 -17
- cirq/testing/equivalent_basis_map.py +6 -4
- cirq/testing/equivalent_basis_map_test.py +6 -4
- cirq/testing/equivalent_repr_eval.py +6 -4
- cirq/testing/equivalent_repr_eval_test.py +5 -3
- cirq/testing/gate_features.py +2 -0
- cirq/testing/gate_features_test.py +7 -5
- cirq/testing/json.py +19 -15
- cirq/testing/json_test.py +5 -3
- cirq/testing/lin_alg_utils.py +10 -11
- cirq/testing/lin_alg_utils_test.py +14 -12
- cirq/testing/logs.py +7 -6
- cirq/testing/logs_test.py +9 -7
- cirq/testing/no_identifier_qubit.py +4 -2
- cirq/testing/no_identifier_qubit_test.py +5 -3
- cirq/testing/op_tree.py +2 -0
- cirq/testing/op_tree_test.py +4 -1
- cirq/testing/order_tester.py +2 -0
- cirq/testing/order_tester_test.py +8 -6
- cirq/testing/pytest_utils.py +2 -0
- cirq/testing/pytest_utils_test.py +4 -2
- cirq/testing/random_circuit.py +21 -20
- cirq/testing/random_circuit_test.py +12 -9
- cirq/testing/repr_pretty_tester.py +1 -0
- cirq/testing/repr_pretty_tester_test.py +5 -3
- cirq/testing/routing_devices.py +4 -1
- cirq/testing/routing_devices_test.py +9 -6
- cirq/testing/sample_circuits.py +4 -1
- cirq/testing/sample_circuits_test.py +3 -1
- cirq/testing/sample_gates.py +3 -0
- cirq/testing/sample_gates_test.py +5 -2
- cirq/transformers/__init__.py +11 -4
- cirq/transformers/align.py +9 -7
- cirq/transformers/align_test.py +2 -0
- cirq/transformers/analytical_decompositions/__init__.py +3 -6
- cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
- cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
- cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
- cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
- cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
- cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
- cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
- cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
- cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
- cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
- cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
- cirq/transformers/drop_empty_moments.py +5 -3
- cirq/transformers/drop_empty_moments_test.py +4 -2
- cirq/transformers/drop_negligible_operations.py +7 -5
- cirq/transformers/drop_negligible_operations_test.py +2 -0
- cirq/transformers/dynamical_decoupling.py +49 -42
- cirq/transformers/dynamical_decoupling_test.py +223 -205
- cirq/transformers/eject_phased_paulis.py +28 -26
- cirq/transformers/eject_phased_paulis_test.py +12 -9
- cirq/transformers/eject_z.py +12 -12
- cirq/transformers/eject_z_test.py +2 -2
- cirq/transformers/expand_composite.py +6 -4
- cirq/transformers/expand_composite_test.py +3 -1
- cirq/transformers/gauge_compiling/__init__.py +3 -1
- cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
- cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
- cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
- cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
- cirq/transformers/insertion_sort.py +8 -6
- cirq/transformers/insertion_sort_test.py +3 -1
- cirq/transformers/measurement_transformers.py +29 -29
- cirq/transformers/measurement_transformers_test.py +2 -0
- cirq/transformers/merge_k_qubit_gates.py +12 -10
- cirq/transformers/merge_k_qubit_gates_test.py +18 -18
- cirq/transformers/merge_single_qubit_gates.py +197 -20
- cirq/transformers/merge_single_qubit_gates_test.py +177 -5
- cirq/transformers/noise_adding.py +5 -3
- cirq/transformers/noise_adding_test.py +2 -0
- cirq/transformers/optimize_for_target_gateset.py +19 -17
- cirq/transformers/optimize_for_target_gateset_test.py +11 -8
- cirq/transformers/qubit_management_transformers.py +13 -11
- cirq/transformers/qubit_management_transformers_test.py +5 -3
- cirq/transformers/randomized_measurements.py +16 -14
- cirq/transformers/randomized_measurements_test.py +10 -4
- cirq/transformers/routing/initial_mapper.py +6 -4
- cirq/transformers/routing/initial_mapper_test.py +2 -0
- cirq/transformers/routing/line_initial_mapper.py +16 -14
- cirq/transformers/routing/line_initial_mapper_test.py +9 -7
- cirq/transformers/routing/mapping_manager.py +10 -10
- cirq/transformers/routing/mapping_manager_test.py +2 -0
- cirq/transformers/routing/route_circuit_cqc.py +33 -31
- cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
- cirq/transformers/routing/visualize_routed_circuit.py +8 -7
- cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
- cirq/transformers/stratify.py +17 -15
- cirq/transformers/stratify_test.py +3 -0
- cirq/transformers/symbolize.py +103 -0
- cirq/transformers/symbolize_test.py +62 -0
- cirq/transformers/synchronize_terminal_measurements.py +10 -10
- cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
- cirq/transformers/tag_transformers.py +97 -0
- cirq/transformers/tag_transformers_test.py +103 -0
- cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
- cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
- cirq/transformers/target_gatesets/cz_gateset.py +7 -5
- cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
- cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
- cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
- cirq/transformers/transformer_api.py +34 -47
- cirq/transformers/transformer_api_test.py +9 -8
- cirq/transformers/transformer_primitives.py +39 -49
- cirq/transformers/transformer_primitives_test.py +10 -17
- cirq/value/abc_alt.py +6 -4
- cirq/value/abc_alt_test.py +5 -3
- cirq/value/angle.py +11 -12
- cirq/value/angle_test.py +5 -3
- cirq/value/classical_data.py +27 -27
- cirq/value/classical_data_test.py +11 -8
- cirq/value/condition.py +26 -24
- cirq/value/condition_test.py +2 -0
- cirq/value/digits.py +14 -11
- cirq/value/digits_test.py +2 -0
- cirq/value/duration.py +23 -20
- cirq/value/duration_test.py +2 -0
- cirq/value/linear_dict.py +25 -30
- cirq/value/linear_dict_test.py +10 -8
- cirq/value/measurement_key.py +12 -12
- cirq/value/measurement_key_test.py +2 -0
- cirq/value/periodic_value.py +4 -4
- cirq/value/periodic_value_test.py +11 -7
- cirq/value/probability.py +3 -1
- cirq/value/probability_test.py +4 -2
- cirq/value/product_state.py +15 -13
- cirq/value/product_state_test.py +4 -1
- cirq/value/random_state.py +2 -0
- cirq/value/random_state_test.py +5 -3
- cirq/value/timestamp.py +11 -7
- cirq/value/timestamp_test.py +14 -12
- cirq/value/type_alias.py +4 -4
- cirq/value/value_equality_attr.py +8 -9
- cirq/value/value_equality_attr_test.py +14 -11
- cirq/vis/density_matrix.py +3 -3
- cirq/vis/density_matrix_test.py +20 -17
- cirq/vis/heatmap.py +24 -37
- cirq/vis/heatmap_test.py +3 -0
- cirq/vis/histogram.py +9 -6
- cirq/vis/histogram_test.py +5 -2
- cirq/vis/state_histogram.py +10 -8
- cirq/vis/state_histogram_test.py +7 -5
- cirq/vis/vis_utils.py +4 -1
- cirq/vis/vis_utils_test.py +4 -1
- cirq/work/collector.py +12 -18
- cirq/work/collector_test.py +15 -10
- cirq/work/observable_grouping.py +6 -7
- cirq/work/observable_grouping_test.py +10 -9
- cirq/work/observable_measurement.py +47 -45
- cirq/work/observable_measurement_data.py +22 -17
- cirq/work/observable_measurement_data_test.py +4 -1
- cirq/work/observable_measurement_test.py +48 -29
- cirq/work/observable_readout_calibration.py +5 -2
- cirq/work/observable_readout_calibration_test.py +5 -2
- cirq/work/observable_settings.py +13 -22
- cirq/work/observable_settings_test.py +9 -7
- cirq/work/pauli_sum_collector.py +12 -10
- cirq/work/pauli_sum_collector_test.py +9 -9
- cirq/work/sampler.py +42 -43
- cirq/work/sampler_test.py +31 -24
- cirq/work/zeros_sampler.py +6 -4
- cirq/work/zeros_sampler_test.py +7 -5
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
- cirq_core-1.6.0.dist-info/RECORD +1241 -0
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
- cirq_core-1.5.0.dev20250409222543.dist-info/RECORD +0 -1216
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
# pylint: disable=wrong-or-nonexistent-copyright-notice
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
2
5
|
from typing import Sequence
|
|
3
6
|
|
|
4
7
|
import numpy as np
|
|
@@ -19,7 +22,7 @@ class DepolarizingWithDampedReadoutNoiseModel(cirq.NoiseModel):
|
|
|
19
22
|
self.readout_noise_gate = cirq.BitFlipChannel(bitflip_prob)
|
|
20
23
|
self.readout_decay_gate = cirq.AmplitudeDampingChannel(decay_prob)
|
|
21
24
|
|
|
22
|
-
def noisy_moment(self, moment:
|
|
25
|
+
def noisy_moment(self, moment: cirq.Moment, system_qubits: Sequence[cirq.Qid]):
|
|
23
26
|
if cirq.devices.noise_model.validate_all_measurements(moment):
|
|
24
27
|
return [
|
|
25
28
|
cirq.Moment(self.readout_decay_gate(q) for q in system_qubits),
|
|
@@ -30,7 +33,7 @@ class DepolarizingWithDampedReadoutNoiseModel(cirq.NoiseModel):
|
|
|
30
33
|
return [moment, cirq.Moment(self.qubit_noise_gate(q) for q in system_qubits)]
|
|
31
34
|
|
|
32
35
|
|
|
33
|
-
def test_calibrate_readout_error():
|
|
36
|
+
def test_calibrate_readout_error() -> None:
|
|
34
37
|
sampler = cirq.DensityMatrixSimulator(
|
|
35
38
|
noise=DepolarizingWithDampedReadoutNoiseModel(
|
|
36
39
|
depol_prob=1e-3, bitflip_prob=0.03, decay_prob=0.03
|
cirq/work/observable_settings.py
CHANGED
|
@@ -12,19 +12,11 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import dataclasses
|
|
16
18
|
import numbers
|
|
17
|
-
from typing import
|
|
18
|
-
AbstractSet,
|
|
19
|
-
Dict,
|
|
20
|
-
FrozenSet,
|
|
21
|
-
Iterable,
|
|
22
|
-
Mapping,
|
|
23
|
-
Optional,
|
|
24
|
-
Tuple,
|
|
25
|
-
TYPE_CHECKING,
|
|
26
|
-
Union,
|
|
27
|
-
)
|
|
19
|
+
from typing import Iterable, Mapping, TYPE_CHECKING
|
|
28
20
|
|
|
29
21
|
import sympy
|
|
30
22
|
|
|
@@ -72,7 +64,7 @@ class InitObsSetting:
|
|
|
72
64
|
return protocols.dataclass_json_dict(self)
|
|
73
65
|
|
|
74
66
|
|
|
75
|
-
def _max_weight_observable(observables: Iterable[ops.PauliString]) ->
|
|
67
|
+
def _max_weight_observable(observables: Iterable[ops.PauliString]) -> ops.PauliString | None:
|
|
76
68
|
"""Create a new observable that is compatible with all input observables
|
|
77
69
|
and has the maximum non-identity elements.
|
|
78
70
|
|
|
@@ -88,7 +80,7 @@ def _max_weight_observable(observables: Iterable[ops.PauliString]) -> Optional[o
|
|
|
88
80
|
The returned value need not actually be present in the input observables.
|
|
89
81
|
Coefficients from input observables will be dropped.
|
|
90
82
|
"""
|
|
91
|
-
qubit_pauli_map:
|
|
83
|
+
qubit_pauli_map: dict[ops.Qid, ops.Pauli] = {}
|
|
92
84
|
for observable in observables:
|
|
93
85
|
for qubit, pauli in observable.items():
|
|
94
86
|
if qubit in qubit_pauli_map:
|
|
@@ -99,7 +91,7 @@ def _max_weight_observable(observables: Iterable[ops.PauliString]) -> Optional[o
|
|
|
99
91
|
return ops.PauliString(qubit_pauli_map)
|
|
100
92
|
|
|
101
93
|
|
|
102
|
-
def _max_weight_state(states: Iterable[value.ProductState]) ->
|
|
94
|
+
def _max_weight_state(states: Iterable[value.ProductState]) -> value.ProductState | None:
|
|
103
95
|
"""Create a new state that is compatible with all input states
|
|
104
96
|
and has the maximum weight.
|
|
105
97
|
|
|
@@ -112,7 +104,7 @@ def _max_weight_state(states: Iterable[value.ProductState]) -> Optional[value.Pr
|
|
|
112
104
|
"+X(0) * -Z(1)". Asking for the max weight state of something like
|
|
113
105
|
[+X(0), +Z(0)] will return None.
|
|
114
106
|
"""
|
|
115
|
-
qubit_state_map:
|
|
107
|
+
qubit_state_map: dict[ops.Qid, _NamedOneQubitState] = {}
|
|
116
108
|
for state in states:
|
|
117
109
|
for qubit, named_state in state:
|
|
118
110
|
if qubit in qubit_state_map:
|
|
@@ -123,13 +115,13 @@ def _max_weight_state(states: Iterable[value.ProductState]) -> Optional[value.Pr
|
|
|
123
115
|
return value.ProductState(qubit_state_map)
|
|
124
116
|
|
|
125
117
|
|
|
126
|
-
def zeros_state(qubits: Iterable[
|
|
118
|
+
def zeros_state(qubits: Iterable[cirq.Qid]):
|
|
127
119
|
"""Return the ProductState that is |00..00> on all qubits."""
|
|
128
120
|
return value.ProductState({q: value.KET_ZERO for q in qubits})
|
|
129
121
|
|
|
130
122
|
|
|
131
123
|
def observables_to_settings(
|
|
132
|
-
observables: Iterable[
|
|
124
|
+
observables: Iterable[cirq.PauliString], qubits: Iterable[cirq.Qid]
|
|
133
125
|
) -> Iterable[InitObsSetting]:
|
|
134
126
|
"""Transform an observable to an InitObsSetting initialized in the
|
|
135
127
|
all-zeros state.
|
|
@@ -138,7 +130,7 @@ def observables_to_settings(
|
|
|
138
130
|
yield InitObsSetting(init_state=zeros_state(qubits), observable=observable)
|
|
139
131
|
|
|
140
132
|
|
|
141
|
-
def _fix_precision(val:
|
|
133
|
+
def _fix_precision(val: value.Scalar | sympy.Expr, precision) -> int | tuple[int, int]:
|
|
142
134
|
"""Convert floating point or complex numbers to (implicitly) fixed point
|
|
143
135
|
integers. Complex numbers will return fixed-point (real, imag) tuples.
|
|
144
136
|
|
|
@@ -154,9 +146,8 @@ def _fix_precision(val: Union[value.Scalar, sympy.Expr], precision) -> Union[int
|
|
|
154
146
|
|
|
155
147
|
|
|
156
148
|
def _hashable_param(
|
|
157
|
-
param_tuples:
|
|
158
|
-
|
|
159
|
-
) -> FrozenSet[Tuple[str, Union[int, Tuple[int, int]]]]:
|
|
149
|
+
param_tuples: Iterable[tuple[str | sympy.Expr, value.Scalar | sympy.Expr]], precision=1e7
|
|
150
|
+
) -> frozenset[tuple[str, int | tuple[int, int]]]:
|
|
160
151
|
"""Hash circuit parameters using fixed precision.
|
|
161
152
|
|
|
162
153
|
Circuit parameters can be complex but we also need to use them as
|
|
@@ -178,7 +169,7 @@ class _MeasurementSpec:
|
|
|
178
169
|
"""
|
|
179
170
|
|
|
180
171
|
max_setting: InitObsSetting
|
|
181
|
-
circuit_params: Mapping[
|
|
172
|
+
circuit_params: Mapping[str | sympy.Expr, value.Scalar | sympy.Expr]
|
|
182
173
|
|
|
183
174
|
def __hash__(self):
|
|
184
175
|
return hash((self.max_setting, _hashable_param(self.circuit_params.items())))
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import pytest
|
|
16
18
|
import sympy
|
|
17
19
|
|
|
@@ -20,7 +22,7 @@ from cirq.work import _MeasurementSpec, InitObsSetting, observables_to_settings
|
|
|
20
22
|
from cirq.work.observable_settings import _hashable_param, _max_weight_observable, _max_weight_state
|
|
21
23
|
|
|
22
24
|
|
|
23
|
-
def test_init_obs_setting():
|
|
25
|
+
def test_init_obs_setting() -> None:
|
|
24
26
|
q0, q1 = cirq.LineQubit.range(2)
|
|
25
27
|
setting = InitObsSetting(
|
|
26
28
|
init_state=cirq.KET_ZERO(q0) * cirq.KET_ZERO(q1), observable=cirq.X(q0) * cirq.Y(q1)
|
|
@@ -32,7 +34,7 @@ def test_init_obs_setting():
|
|
|
32
34
|
setting = InitObsSetting(init_state=cirq.KET_ZERO(q0), observable=cirq.X(q0) * cirq.Y(q1))
|
|
33
35
|
|
|
34
36
|
|
|
35
|
-
def test_max_weight_observable():
|
|
37
|
+
def test_max_weight_observable() -> None:
|
|
36
38
|
q0, q1 = cirq.LineQubit.range(2)
|
|
37
39
|
observables = [cirq.X(q0), cirq.X(q1)]
|
|
38
40
|
assert _max_weight_observable(observables) == cirq.X(q0) * cirq.X(q1)
|
|
@@ -41,7 +43,7 @@ def test_max_weight_observable():
|
|
|
41
43
|
assert _max_weight_observable(observables) is None
|
|
42
44
|
|
|
43
45
|
|
|
44
|
-
def test_max_weight_state():
|
|
46
|
+
def test_max_weight_state() -> None:
|
|
45
47
|
q0, q1 = cirq.LineQubit.range(2)
|
|
46
48
|
states = [cirq.KET_PLUS(q0), cirq.KET_PLUS(q1)]
|
|
47
49
|
assert _max_weight_state(states) == cirq.KET_PLUS(q0) * cirq.KET_PLUS(q1)
|
|
@@ -50,7 +52,7 @@ def test_max_weight_state():
|
|
|
50
52
|
assert _max_weight_state(states) is None
|
|
51
53
|
|
|
52
54
|
|
|
53
|
-
def test_observable_to_setting():
|
|
55
|
+
def test_observable_to_setting() -> None:
|
|
54
56
|
q0, q1, q2 = cirq.LineQubit.range(3)
|
|
55
57
|
observables = [cirq.X(q0) * cirq.Y(q1), cirq.Z(q2) * 1]
|
|
56
58
|
|
|
@@ -62,7 +64,7 @@ def test_observable_to_setting():
|
|
|
62
64
|
assert list(observables_to_settings(observables, qubits=[q0, q1, q2])) == settings_should_be
|
|
63
65
|
|
|
64
66
|
|
|
65
|
-
def test_param_hash():
|
|
67
|
+
def test_param_hash() -> None:
|
|
66
68
|
params1 = [('beta', 1.23), ('gamma', 4.56)]
|
|
67
69
|
params2 = [('beta', 1.23), ('gamma', 4.56)]
|
|
68
70
|
params3 = [('beta', 1.24), ('gamma', 4.57)]
|
|
@@ -81,7 +83,7 @@ def test_param_hash():
|
|
|
81
83
|
assert hash(_hashable_param(params4)) == hash(_hashable_param(params5))
|
|
82
84
|
|
|
83
85
|
|
|
84
|
-
def test_measurement_spec():
|
|
86
|
+
def test_measurement_spec() -> None:
|
|
85
87
|
q0, q1 = cirq.LineQubit.range(2)
|
|
86
88
|
setting = InitObsSetting(
|
|
87
89
|
init_state=cirq.KET_ZERO(q0) * cirq.KET_ZERO(q1), observable=cirq.X(q0) * cirq.Y(q1)
|
|
@@ -96,7 +98,7 @@ def test_measurement_spec():
|
|
|
96
98
|
cirq.testing.assert_equivalent_repr(meas_spec)
|
|
97
99
|
|
|
98
100
|
|
|
99
|
-
def test_measurement_spec_no_symbols():
|
|
101
|
+
def test_measurement_spec_no_symbols() -> None:
|
|
100
102
|
q0, q1 = cirq.LineQubit.range(2)
|
|
101
103
|
setting = InitObsSetting(
|
|
102
104
|
init_state=cirq.KET_ZERO(q0) * cirq.KET_ZERO(q1), observable=cirq.X(q0) * cirq.Y(q1)
|
cirq/work/pauli_sum_collector.py
CHANGED
|
@@ -12,8 +12,10 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import collections
|
|
16
|
-
from typing import cast,
|
|
18
|
+
from typing import cast, TYPE_CHECKING
|
|
17
19
|
|
|
18
20
|
import numpy as np
|
|
19
21
|
|
|
@@ -29,8 +31,8 @@ class PauliSumCollector(collector.Collector):
|
|
|
29
31
|
|
|
30
32
|
def __init__(
|
|
31
33
|
self,
|
|
32
|
-
circuit:
|
|
33
|
-
observable:
|
|
34
|
+
circuit: cirq.AbstractCircuit,
|
|
35
|
+
observable: cirq.PauliSumLike,
|
|
34
36
|
*,
|
|
35
37
|
samples_per_term: int,
|
|
36
38
|
max_samples_per_job: int = 1000000,
|
|
@@ -58,12 +60,12 @@ class PauliSumCollector(collector.Collector):
|
|
|
58
60
|
if not p:
|
|
59
61
|
self._identity_offset += p.coefficient
|
|
60
62
|
|
|
61
|
-
self._zeros:
|
|
62
|
-
self._ones:
|
|
63
|
+
self._zeros: dict[ops.PauliString, int] = collections.defaultdict(lambda: 0)
|
|
64
|
+
self._ones: dict[ops.PauliString, int] = collections.defaultdict(lambda: 0)
|
|
63
65
|
self._samples_per_term = samples_per_term
|
|
64
66
|
self._total_samples_requested = 0
|
|
65
67
|
|
|
66
|
-
def next_job(self) ->
|
|
68
|
+
def next_job(self) -> cirq.CircuitSampleJob | None:
|
|
67
69
|
i = self._total_samples_requested // self._samples_per_term
|
|
68
70
|
if i >= len(self._pauli_coef_terms):
|
|
69
71
|
return None
|
|
@@ -77,13 +79,13 @@ class PauliSumCollector(collector.Collector):
|
|
|
77
79
|
tag=pauli,
|
|
78
80
|
)
|
|
79
81
|
|
|
80
|
-
def on_job_result(self, job:
|
|
82
|
+
def on_job_result(self, job: cirq.CircuitSampleJob, result: cirq.Result):
|
|
81
83
|
job_id = cast(ops.PauliString, job.tag)
|
|
82
84
|
parities = result.histogram(key='out', fold_func=lambda bits: np.sum(bits) % 2)
|
|
83
85
|
self._zeros[job_id] += parities[0]
|
|
84
86
|
self._ones[job_id] += parities[1]
|
|
85
87
|
|
|
86
|
-
def estimated_energy(self) ->
|
|
88
|
+
def estimated_energy(self) -> float | complex:
|
|
87
89
|
"""Sums up the sampled expectations, weighted by their coefficients."""
|
|
88
90
|
energy = 0j
|
|
89
91
|
for pauli_string, coef in self._pauli_coef_terms:
|
|
@@ -99,8 +101,8 @@ class PauliSumCollector(collector.Collector):
|
|
|
99
101
|
|
|
100
102
|
|
|
101
103
|
def _circuit_plus_pauli_string_measurements(
|
|
102
|
-
circuit:
|
|
103
|
-
) ->
|
|
104
|
+
circuit: cirq.AbstractCircuit, pauli_string: cirq.PauliString
|
|
105
|
+
) -> cirq.AbstractCircuit:
|
|
104
106
|
"""A circuit measuring the given observable at the end of the given circuit."""
|
|
105
107
|
assert pauli_string
|
|
106
108
|
return circuit.from_moments(
|
|
@@ -12,13 +12,15 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import duet
|
|
16
18
|
|
|
17
19
|
import cirq
|
|
18
20
|
|
|
19
21
|
|
|
20
22
|
@duet.sync
|
|
21
|
-
async def test_pauli_string_sample_collector():
|
|
23
|
+
async def test_pauli_string_sample_collector() -> None:
|
|
22
24
|
a, b = cirq.LineQubit.range(2)
|
|
23
25
|
p = cirq.PauliSumCollector(
|
|
24
26
|
circuit=cirq.Circuit(cirq.H(a), cirq.CNOT(a, b), cirq.X(a), cirq.Z(b)),
|
|
@@ -28,26 +30,24 @@ async def test_pauli_string_sample_collector():
|
|
|
28
30
|
+ (1 - 0j),
|
|
29
31
|
samples_per_term=100,
|
|
30
32
|
)
|
|
31
|
-
|
|
32
|
-
assert result is None
|
|
33
|
+
await p.collect_async(sampler=cirq.Simulator())
|
|
33
34
|
energy = p.estimated_energy()
|
|
34
35
|
assert isinstance(energy, float) and energy == 12
|
|
35
36
|
|
|
36
37
|
|
|
37
38
|
@duet.sync
|
|
38
|
-
async def test_pauli_string_sample_single():
|
|
39
|
+
async def test_pauli_string_sample_single() -> None:
|
|
39
40
|
a, b = cirq.LineQubit.range(2)
|
|
40
41
|
p = cirq.PauliSumCollector(
|
|
41
42
|
circuit=cirq.Circuit(cirq.H(a), cirq.CNOT(a, b), cirq.X(a), cirq.Z(b)),
|
|
42
43
|
observable=cirq.X(a) * cirq.X(b),
|
|
43
44
|
samples_per_term=100,
|
|
44
45
|
)
|
|
45
|
-
|
|
46
|
-
assert result is None
|
|
46
|
+
await p.collect_async(sampler=cirq.Simulator())
|
|
47
47
|
assert p.estimated_energy() == -1
|
|
48
48
|
|
|
49
49
|
|
|
50
|
-
def test_pauli_string_sample_collector_identity():
|
|
50
|
+
def test_pauli_string_sample_collector_identity() -> None:
|
|
51
51
|
p = cirq.PauliSumCollector(
|
|
52
52
|
circuit=cirq.Circuit(), observable=cirq.PauliSum() + 2j, samples_per_term=100
|
|
53
53
|
)
|
|
@@ -55,7 +55,7 @@ def test_pauli_string_sample_collector_identity():
|
|
|
55
55
|
assert p.estimated_energy() == 2j
|
|
56
56
|
|
|
57
57
|
|
|
58
|
-
def test_pauli_string_sample_collector_extra_qubit_z():
|
|
58
|
+
def test_pauli_string_sample_collector_extra_qubit_z() -> None:
|
|
59
59
|
a, b = cirq.LineQubit.range(2)
|
|
60
60
|
p = cirq.PauliSumCollector(
|
|
61
61
|
circuit=cirq.Circuit(cirq.H(a)), observable=3 * cirq.Z(b), samples_per_term=100
|
|
@@ -64,7 +64,7 @@ def test_pauli_string_sample_collector_extra_qubit_z():
|
|
|
64
64
|
assert p.estimated_energy() == 3
|
|
65
65
|
|
|
66
66
|
|
|
67
|
-
def test_pauli_string_sample_collector_extra_qubit_x():
|
|
67
|
+
def test_pauli_string_sample_collector_extra_qubit_x() -> None:
|
|
68
68
|
a, b = cirq.LineQubit.range(2)
|
|
69
69
|
p = cirq.PauliSumCollector(
|
|
70
70
|
circuit=cirq.Circuit(cirq.H(a)), observable=3 * cirq.X(b), samples_per_term=10000
|
cirq/work/sampler.py
CHANGED
|
@@ -11,10 +11,13 @@
|
|
|
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
|
+
|
|
14
15
|
"""Abstract base class for things sampling quantum circuits."""
|
|
15
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
16
19
|
import collections
|
|
17
|
-
from typing import
|
|
20
|
+
from typing import Sequence, TYPE_CHECKING, TypeVar
|
|
18
21
|
|
|
19
22
|
import duet
|
|
20
23
|
import pandas as pd
|
|
@@ -38,10 +41,10 @@ class Sampler(metaclass=value.ABCMetaImplementAnyOneOf):
|
|
|
38
41
|
|
|
39
42
|
def run(
|
|
40
43
|
self,
|
|
41
|
-
program:
|
|
42
|
-
param_resolver:
|
|
44
|
+
program: cirq.AbstractCircuit,
|
|
45
|
+
param_resolver: cirq.ParamResolverOrSimilarType = None,
|
|
43
46
|
repetitions: int = 1,
|
|
44
|
-
) ->
|
|
47
|
+
) -> cirq.Result:
|
|
45
48
|
"""Samples from the given `Circuit`.
|
|
46
49
|
|
|
47
50
|
This mode of operation for a sampler will provide results
|
|
@@ -66,10 +69,10 @@ class Sampler(metaclass=value.ABCMetaImplementAnyOneOf):
|
|
|
66
69
|
|
|
67
70
|
async def run_async(
|
|
68
71
|
self,
|
|
69
|
-
program:
|
|
70
|
-
param_resolver:
|
|
72
|
+
program: cirq.AbstractCircuit,
|
|
73
|
+
param_resolver: cirq.ParamResolverOrSimilarType = None,
|
|
71
74
|
repetitions: int = 1,
|
|
72
|
-
) ->
|
|
75
|
+
) -> cirq.Result:
|
|
73
76
|
"""Asynchronously samples from the given Circuit.
|
|
74
77
|
|
|
75
78
|
Provides measurement outcomes as a `cirq.Result` object. This
|
|
@@ -88,12 +91,8 @@ class Sampler(metaclass=value.ABCMetaImplementAnyOneOf):
|
|
|
88
91
|
return results[0]
|
|
89
92
|
|
|
90
93
|
def sample(
|
|
91
|
-
self,
|
|
92
|
-
|
|
93
|
-
*,
|
|
94
|
-
repetitions: int = 1,
|
|
95
|
-
params: 'cirq.Sweepable' = None,
|
|
96
|
-
) -> 'pd.DataFrame':
|
|
94
|
+
self, program: cirq.AbstractCircuit, *, repetitions: int = 1, params: cirq.Sweepable = None
|
|
95
|
+
) -> pd.DataFrame:
|
|
97
96
|
"""Samples the given Circuit, producing a pandas data frame.
|
|
98
97
|
|
|
99
98
|
This interface will operate in a similar way to the `run` method
|
|
@@ -180,21 +179,21 @@ class Sampler(metaclass=value.ABCMetaImplementAnyOneOf):
|
|
|
180
179
|
return pd.concat(results)
|
|
181
180
|
|
|
182
181
|
def _run_sweep_impl(
|
|
183
|
-
self, program:
|
|
184
|
-
) -> Sequence[
|
|
182
|
+
self, program: cirq.AbstractCircuit, params: cirq.Sweepable, repetitions: int = 1
|
|
183
|
+
) -> Sequence[cirq.Result]:
|
|
185
184
|
"""Implements run_sweep using run_sweep_async"""
|
|
186
185
|
return duet.run(self.run_sweep_async, program, params, repetitions)
|
|
187
186
|
|
|
188
187
|
async def _run_sweep_async_impl(
|
|
189
|
-
self, program:
|
|
190
|
-
) -> Sequence[
|
|
188
|
+
self, program: cirq.AbstractCircuit, params: cirq.Sweepable, repetitions: int = 1
|
|
189
|
+
) -> Sequence[cirq.Result]:
|
|
191
190
|
"""Implements run_sweep_async using run_sweep"""
|
|
192
191
|
return self.run_sweep(program, params=params, repetitions=repetitions)
|
|
193
192
|
|
|
194
193
|
@value.alternative(requires='run_sweep_async', implementation=_run_sweep_impl)
|
|
195
194
|
def run_sweep(
|
|
196
|
-
self, program:
|
|
197
|
-
) -> Sequence[
|
|
195
|
+
self, program: cirq.AbstractCircuit, params: cirq.Sweepable, repetitions: int = 1
|
|
196
|
+
) -> Sequence[cirq.Result]:
|
|
198
197
|
"""Samples from the given Circuit.
|
|
199
198
|
|
|
200
199
|
This allows for sweeping over different parameter values,
|
|
@@ -217,8 +216,8 @@ class Sampler(metaclass=value.ABCMetaImplementAnyOneOf):
|
|
|
217
216
|
|
|
218
217
|
@value.alternative(requires='run_sweep', implementation=_run_sweep_async_impl)
|
|
219
218
|
async def run_sweep_async(
|
|
220
|
-
self, program:
|
|
221
|
-
) -> Sequence[
|
|
219
|
+
self, program: cirq.AbstractCircuit, params: cirq.Sweepable, repetitions: int = 1
|
|
220
|
+
) -> Sequence[cirq.Result]:
|
|
222
221
|
"""Asynchronously samples from the given Circuit.
|
|
223
222
|
|
|
224
223
|
By default, this method invokes `run_sweep` synchronously and simply
|
|
@@ -237,10 +236,10 @@ class Sampler(metaclass=value.ABCMetaImplementAnyOneOf):
|
|
|
237
236
|
|
|
238
237
|
async def run_batch_async(
|
|
239
238
|
self,
|
|
240
|
-
programs: Sequence[
|
|
241
|
-
params_list:
|
|
242
|
-
repetitions:
|
|
243
|
-
) -> Sequence[Sequence[
|
|
239
|
+
programs: Sequence[cirq.AbstractCircuit],
|
|
240
|
+
params_list: Sequence[cirq.Sweepable] | None = None,
|
|
241
|
+
repetitions: int | Sequence[int] = 1,
|
|
242
|
+
) -> Sequence[Sequence[cirq.Result]]:
|
|
244
243
|
"""Runs the supplied circuits asynchronously.
|
|
245
244
|
|
|
246
245
|
Each circuit provided in `programs` will pair with the optional
|
|
@@ -288,10 +287,10 @@ class Sampler(metaclass=value.ABCMetaImplementAnyOneOf):
|
|
|
288
287
|
|
|
289
288
|
def _normalize_batch_args(
|
|
290
289
|
self,
|
|
291
|
-
programs: Sequence[
|
|
292
|
-
params_list:
|
|
293
|
-
repetitions:
|
|
294
|
-
) ->
|
|
290
|
+
programs: Sequence[cirq.AbstractCircuit],
|
|
291
|
+
params_list: Sequence[cirq.Sweepable] | None = None,
|
|
292
|
+
repetitions: int | Sequence[int] = 1,
|
|
293
|
+
) -> tuple[Sequence[cirq.Sweepable], Sequence[int]]:
|
|
295
294
|
if params_list is None:
|
|
296
295
|
params_list = [None] * len(programs)
|
|
297
296
|
if len(programs) != len(params_list):
|
|
@@ -310,11 +309,11 @@ class Sampler(metaclass=value.ABCMetaImplementAnyOneOf):
|
|
|
310
309
|
|
|
311
310
|
def sample_expectation_values(
|
|
312
311
|
self,
|
|
313
|
-
program:
|
|
314
|
-
observables:
|
|
312
|
+
program: cirq.AbstractCircuit,
|
|
313
|
+
observables: cirq.PauliSumLike | list[cirq.PauliSumLike],
|
|
315
314
|
*,
|
|
316
315
|
num_samples: int,
|
|
317
|
-
params:
|
|
316
|
+
params: cirq.Sweepable = None,
|
|
318
317
|
permit_terminal_measurements: bool = False,
|
|
319
318
|
) -> Sequence[Sequence[float]]:
|
|
320
319
|
"""Calculates estimated expectation values from samples of a circuit.
|
|
@@ -360,17 +359,17 @@ class Sampler(metaclass=value.ABCMetaImplementAnyOneOf):
|
|
|
360
359
|
)
|
|
361
360
|
|
|
362
361
|
# Wrap input into a list of pauli sum
|
|
363
|
-
pauli_sums:
|
|
362
|
+
pauli_sums: list[cirq.PauliSum] = (
|
|
364
363
|
[ops.PauliSum.wrap(o) for o in observables]
|
|
365
|
-
if isinstance(observables,
|
|
364
|
+
if isinstance(observables, list)
|
|
366
365
|
else [ops.PauliSum.wrap(observables)]
|
|
367
366
|
)
|
|
368
367
|
del observables
|
|
369
368
|
|
|
370
369
|
# Flatten Pauli Sum into one big list of Pauli String
|
|
371
370
|
# Keep track of which Pauli Sum each one was from.
|
|
372
|
-
flat_pstrings:
|
|
373
|
-
pstring_to_psum_i:
|
|
371
|
+
flat_pstrings: list[cirq.PauliString] = []
|
|
372
|
+
pstring_to_psum_i: dict[cirq.PauliString, int] = {}
|
|
374
373
|
for psum_i, pauli_sum in enumerate(pauli_sums):
|
|
375
374
|
for pstring in pauli_sum:
|
|
376
375
|
flat_pstrings.append(pstring)
|
|
@@ -378,10 +377,10 @@ class Sampler(metaclass=value.ABCMetaImplementAnyOneOf):
|
|
|
378
377
|
|
|
379
378
|
# Flatten Circuit Sweep into one big list of Params.
|
|
380
379
|
# Keep track of their indices so we can map back.
|
|
381
|
-
flat_params:
|
|
380
|
+
flat_params: list[cirq.ParamMappingType] = [
|
|
382
381
|
pr.param_dict for pr in study.to_resolvers(params)
|
|
383
382
|
]
|
|
384
|
-
circuit_param_to_sweep_i:
|
|
383
|
+
circuit_param_to_sweep_i: dict[frozenset[tuple[str, int | tuple[int, int]]], int] = {
|
|
385
384
|
_hashable_param(param.items()): i for i, param in enumerate(flat_params)
|
|
386
385
|
}
|
|
387
386
|
|
|
@@ -399,7 +398,7 @@ class Sampler(metaclass=value.ABCMetaImplementAnyOneOf):
|
|
|
399
398
|
# nesting structure, we place the measured values according to the back-mappings we set up
|
|
400
399
|
# above. We also do the sum operation to aggregate multiple PauliString measured values
|
|
401
400
|
# for a given PauliSum.
|
|
402
|
-
nested_results:
|
|
401
|
+
nested_results: list[list[float]] = [[0] * len(pauli_sums) for _ in range(len(flat_params))]
|
|
403
402
|
for res in obs_meas_results:
|
|
404
403
|
param_i = circuit_param_to_sweep_i[_hashable_param(res.circuit_params.items())]
|
|
405
404
|
psum_i = pstring_to_psum_i[res.setting.observable]
|
|
@@ -409,8 +408,8 @@ class Sampler(metaclass=value.ABCMetaImplementAnyOneOf):
|
|
|
409
408
|
|
|
410
409
|
@staticmethod
|
|
411
410
|
def _get_measurement_shapes(
|
|
412
|
-
circuit:
|
|
413
|
-
) ->
|
|
411
|
+
circuit: cirq.AbstractCircuit,
|
|
412
|
+
) -> dict[str, tuple[int, tuple[int, ...]]]:
|
|
414
413
|
"""Gets the shapes of measurements in the given circuit.
|
|
415
414
|
|
|
416
415
|
Returns:
|
|
@@ -423,8 +422,8 @@ class Sampler(metaclass=value.ABCMetaImplementAnyOneOf):
|
|
|
423
422
|
ValueError: if the qid_shape of different instances of the same measurement
|
|
424
423
|
key disagree.
|
|
425
424
|
"""
|
|
426
|
-
qid_shapes:
|
|
427
|
-
num_instances:
|
|
425
|
+
qid_shapes: dict[str, tuple[int, ...]] = {}
|
|
426
|
+
num_instances: dict[str, int] = collections.Counter()
|
|
428
427
|
for op in circuit.all_operations():
|
|
429
428
|
key = protocols.measurement_key_name(op, default=None)
|
|
430
429
|
if key is not None:
|