cirq-core 1.5.0.dev20250409225226__py3-none-any.whl → 1.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of cirq-core might be problematic. Click here for more details.
- cirq/__init__.py +16 -17
- cirq/_compat.py +21 -20
- cirq/_compat_test.py +14 -34
- cirq/_doc.py +4 -2
- cirq/_import.py +8 -6
- cirq/_import_test.py +4 -2
- cirq/_version.py +6 -6
- cirq/_version_test.py +2 -2
- cirq/circuits/_block_diagram_drawer.py +11 -10
- cirq/circuits/_block_diagram_drawer_test.py +8 -6
- cirq/circuits/_box_drawing_character_data.py +8 -8
- cirq/circuits/_box_drawing_character_data_test.py +3 -1
- cirq/circuits/_bucket_priority_queue.py +9 -7
- cirq/circuits/_bucket_priority_queue_test.py +22 -20
- cirq/circuits/circuit.py +248 -172
- cirq/circuits/circuit_operation.py +73 -83
- cirq/circuits/circuit_operation_test.py +128 -90
- cirq/circuits/circuit_test.py +211 -151
- cirq/circuits/frozen_circuit.py +23 -60
- cirq/circuits/frozen_circuit_test.py +31 -8
- cirq/circuits/insert_strategy.py +7 -5
- cirq/circuits/insert_strategy_test.py +4 -2
- cirq/circuits/moment.py +88 -40
- cirq/circuits/moment_test.py +128 -51
- cirq/circuits/optimization_pass.py +5 -5
- cirq/circuits/optimization_pass_test.py +10 -10
- cirq/circuits/qasm_output.py +11 -11
- cirq/circuits/qasm_output_test.py +25 -22
- cirq/circuits/text_diagram_drawer.py +23 -38
- cirq/circuits/text_diagram_drawer_test.py +19 -17
- cirq/conftest.py +4 -3
- cirq/contrib/__init__.py +4 -4
- cirq/contrib/acquaintance/__init__.py +1 -1
- cirq/contrib/acquaintance/bipartite.py +5 -8
- cirq/contrib/acquaintance/bipartite_test.py +18 -13
- cirq/contrib/acquaintance/devices.py +2 -2
- cirq/contrib/acquaintance/devices_test.py +5 -3
- cirq/contrib/acquaintance/executor.py +5 -5
- cirq/contrib/acquaintance/executor_test.py +13 -9
- cirq/contrib/acquaintance/gates.py +18 -28
- cirq/contrib/acquaintance/gates_test.py +24 -20
- cirq/contrib/acquaintance/inspection_utils.py +8 -4
- cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
- cirq/contrib/acquaintance/mutation_utils.py +4 -4
- cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
- cirq/contrib/acquaintance/optimizers.py +4 -4
- cirq/contrib/acquaintance/optimizers_test.py +4 -1
- cirq/contrib/acquaintance/permutation.py +15 -27
- cirq/contrib/acquaintance/permutation_test.py +26 -17
- cirq/contrib/acquaintance/shift.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
- cirq/contrib/acquaintance/shift_test.py +8 -6
- cirq/contrib/acquaintance/strategies/cubic.py +2 -2
- cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
- cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
- cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
- cirq/contrib/acquaintance/testing.py +2 -0
- cirq/contrib/acquaintance/topological_sort.py +2 -2
- cirq/contrib/acquaintance/topological_sort_test.py +3 -1
- cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
- cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
- cirq/contrib/circuitdag/circuit_dag.py +4 -4
- cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
- cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
- cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
- cirq/contrib/graph_device/graph_device.py +12 -11
- cirq/contrib/graph_device/graph_device_test.py +18 -14
- cirq/contrib/graph_device/hypergraph.py +16 -14
- cirq/contrib/graph_device/hypergraph_test.py +13 -11
- cirq/contrib/graph_device/uniform_graph_device.py +6 -4
- cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
- cirq/contrib/hacks/disable_validation.py +6 -1
- cirq/contrib/hacks/disable_validation_test.py +3 -1
- cirq/contrib/json.py +31 -5
- cirq/contrib/json_test.py +6 -3
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/__init__.py +17 -0
- cirq/contrib/json_test_data/spec.py +32 -0
- cirq/contrib/noise_models/noise_models.py +119 -5
- cirq/contrib/noise_models/noise_models_test.py +37 -9
- cirq/contrib/paulistring/clifford_optimize.py +6 -4
- cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
- cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
- cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
- cirq/contrib/paulistring/optimize.py +2 -0
- cirq/contrib/paulistring/optimize_test.py +4 -3
- cirq/contrib/paulistring/pauli_string_dag.py +2 -0
- cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
- cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
- cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
- cirq/contrib/paulistring/recombine.py +6 -4
- cirq/contrib/paulistring/recombine_test.py +3 -1
- cirq/contrib/paulistring/separate.py +9 -6
- cirq/contrib/paulistring/separate_test.py +3 -1
- cirq/contrib/qasm_import/_lexer.py +3 -2
- cirq/contrib/qasm_import/_lexer_test.py +49 -13
- cirq/contrib/qasm_import/_parser.py +547 -83
- cirq/contrib/qasm_import/_parser_test.py +988 -97
- cirq/contrib/qasm_import/exception.py +2 -0
- cirq/contrib/qasm_import/qasm.py +8 -2
- cirq/contrib/qasm_import/qasm_test.py +7 -4
- cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
- cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
- cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
- cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
- cirq/contrib/qcircuit/qcircuit_test.py +10 -8
- cirq/contrib/quantum_volume/quantum_volume.py +31 -27
- cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
- cirq/contrib/quimb/density_matrix.py +15 -14
- cirq/contrib/quimb/density_matrix_test.py +10 -7
- cirq/contrib/quimb/grid_circuits.py +5 -2
- cirq/contrib/quimb/grid_circuits_test.py +3 -0
- cirq/contrib/quimb/mps_simulator.py +20 -20
- cirq/contrib/quimb/mps_simulator_test.py +3 -0
- cirq/contrib/quimb/state_vector.py +12 -11
- cirq/contrib/quimb/state_vector_test.py +3 -0
- cirq/contrib/quirk/export_to_quirk.py +5 -3
- cirq/contrib/quirk/export_to_quirk_test.py +18 -16
- cirq/contrib/quirk/linearize_circuit.py +2 -0
- cirq/contrib/quirk/quirk_gate.py +18 -17
- cirq/contrib/routing/device.py +5 -3
- cirq/contrib/routing/device_test.py +2 -0
- cirq/contrib/routing/greedy.py +10 -21
- cirq/contrib/routing/greedy_test.py +4 -2
- cirq/contrib/routing/initialization.py +2 -2
- cirq/contrib/routing/initialization_test.py +5 -3
- cirq/contrib/routing/router.py +9 -5
- cirq/contrib/routing/router_test.py +2 -0
- cirq/contrib/routing/swap_network.py +3 -3
- cirq/contrib/routing/swap_network_test.py +3 -1
- cirq/contrib/routing/utils.py +2 -2
- cirq/contrib/routing/utils_test.py +3 -0
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
- cirq/contrib/svg/svg.py +3 -3
- cirq/contrib/svg/svg_test.py +8 -5
- cirq/devices/device.py +4 -4
- cirq/devices/device_test.py +7 -4
- cirq/devices/grid_device_metadata.py +10 -10
- cirq/devices/grid_device_metadata_test.py +3 -0
- cirq/devices/grid_qubit.py +29 -21
- cirq/devices/grid_qubit_test.py +3 -0
- cirq/devices/insertion_noise_model.py +7 -7
- cirq/devices/insertion_noise_model_test.py +7 -5
- cirq/devices/line_qubit.py +13 -13
- cirq/devices/line_qubit_test.py +2 -0
- cirq/devices/named_topologies.py +18 -29
- cirq/devices/named_topologies_test.py +13 -10
- cirq/devices/noise_model.py +3 -3
- cirq/devices/noise_model_test.py +19 -15
- cirq/devices/noise_properties.py +15 -6
- cirq/devices/noise_properties_test.py +34 -3
- cirq/devices/noise_utils.py +11 -9
- cirq/devices/noise_utils_test.py +2 -0
- cirq/devices/superconducting_qubits_noise_properties.py +23 -22
- cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
- cirq/devices/thermal_noise_model.py +107 -37
- cirq/devices/thermal_noise_model_test.py +21 -0
- cirq/devices/unconstrained_device.py +5 -3
- cirq/devices/unconstrained_device_test.py +2 -0
- cirq/experiments/__init__.py +4 -2
- cirq/experiments/benchmarking/__init__.py +17 -0
- cirq/experiments/benchmarking/parallel_xeb.py +677 -0
- cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
- cirq/experiments/fidelity_estimation.py +14 -8
- cirq/experiments/fidelity_estimation_test.py +3 -0
- cirq/experiments/n_qubit_tomography.py +17 -16
- cirq/experiments/n_qubit_tomography_test.py +8 -5
- cirq/experiments/purity_estimation.py +2 -0
- cirq/experiments/purity_estimation_test.py +2 -0
- cirq/experiments/qubit_characterizations.py +207 -103
- cirq/experiments/qubit_characterizations_test.py +40 -12
- cirq/experiments/random_quantum_circuit_generation.py +56 -70
- cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
- cirq/experiments/readout_confusion_matrix.py +24 -22
- cirq/experiments/readout_confusion_matrix_test.py +2 -0
- cirq/experiments/single_qubit_readout_calibration.py +30 -15
- cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
- cirq/experiments/t1_decay_experiment.py +9 -7
- cirq/experiments/t1_decay_experiment_test.py +13 -11
- cirq/experiments/t2_decay_experiment.py +16 -13
- cirq/experiments/t2_decay_experiment_test.py +2 -0
- cirq/experiments/two_qubit_xeb.py +64 -57
- cirq/experiments/two_qubit_xeb_test.py +10 -6
- cirq/experiments/xeb_fitting.py +39 -35
- cirq/experiments/xeb_sampling.py +37 -44
- cirq/experiments/xeb_sampling_test.py +3 -0
- cirq/experiments/xeb_simulation.py +14 -10
- cirq/experiments/xeb_simulation_test.py +5 -5
- cirq/experiments/z_phase_calibration.py +32 -29
- cirq/experiments/z_phase_calibration_test.py +3 -4
- cirq/interop/quirk/cells/__init__.py +1 -1
- cirq/interop/quirk/cells/all_cells.py +7 -2
- cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
- cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
- cirq/interop/quirk/cells/cell.py +19 -28
- cirq/interop/quirk/cells/cell_test.py +3 -0
- cirq/interop/quirk/cells/composite_cell.py +13 -28
- cirq/interop/quirk/cells/composite_cell_test.py +2 -0
- cirq/interop/quirk/cells/control_cells.py +15 -15
- cirq/interop/quirk/cells/control_cells_test.py +7 -5
- cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
- cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
- cirq/interop/quirk/cells/ignored_cells.py +3 -0
- cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
- cirq/interop/quirk/cells/input_cells.py +7 -5
- cirq/interop/quirk/cells/input_cells_test.py +7 -5
- cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
- cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
- cirq/interop/quirk/cells/measurement_cells.py +5 -2
- cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
- cirq/interop/quirk/cells/parse.py +22 -23
- cirq/interop/quirk/cells/parse_test.py +12 -10
- cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
- cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
- cirq/interop/quirk/cells/scalar_cells.py +4 -1
- cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
- cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
- cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
- cirq/interop/quirk/cells/swap_cell.py +8 -6
- cirq/interop/quirk/cells/swap_cell_test.py +6 -4
- cirq/interop/quirk/cells/testing.py +6 -6
- cirq/interop/quirk/cells/testing_test.py +8 -6
- cirq/interop/quirk/cells/unsupported_cells.py +3 -0
- cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
- cirq/interop/quirk/url_to_circuit.py +23 -36
- cirq/interop/quirk/url_to_circuit_test.py +4 -1
- cirq/json_resolver_cache.py +14 -12
- cirq/linalg/__init__.py +4 -6
- cirq/linalg/combinators.py +7 -5
- cirq/linalg/combinators_test.py +10 -7
- cirq/linalg/decompositions.py +24 -35
- cirq/linalg/decompositions_test.py +3 -1
- cirq/linalg/diagonalize.py +6 -4
- cirq/linalg/diagonalize_test.py +15 -14
- cirq/linalg/operator_spaces.py +14 -14
- cirq/linalg/operator_spaces_test.py +13 -11
- cirq/linalg/predicates.py +18 -9
- cirq/linalg/predicates_test.py +5 -0
- cirq/linalg/tolerance.py +6 -3
- cirq/linalg/tolerance_test.py +6 -4
- cirq/linalg/transformations.py +23 -20
- cirq/linalg/transformations_test.py +73 -43
- cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
- cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
- cirq/neutral_atoms/neutral_atom_devices.py +2 -0
- cirq/ops/__init__.py +2 -0
- cirq/ops/arithmetic_operation.py +21 -21
- cirq/ops/arithmetic_operation_test.py +7 -8
- cirq/ops/boolean_hamiltonian.py +23 -22
- cirq/ops/boolean_hamiltonian_test.py +12 -9
- cirq/ops/classically_controlled_operation.py +31 -36
- cirq/ops/classically_controlled_operation_test.py +121 -117
- cirq/ops/clifford_gate.py +98 -81
- cirq/ops/clifford_gate_test.py +72 -57
- cirq/ops/common_channels.py +44 -44
- cirq/ops/common_channels_test.py +83 -81
- cirq/ops/common_gate_families.py +9 -7
- cirq/ops/common_gate_families_test.py +11 -7
- cirq/ops/common_gates.py +164 -183
- cirq/ops/common_gates_test.py +135 -95
- cirq/ops/control_values.py +23 -26
- cirq/ops/control_values_test.py +22 -20
- cirq/ops/controlled_gate.py +64 -112
- cirq/ops/controlled_gate_test.py +130 -35
- cirq/ops/controlled_operation.py +24 -35
- cirq/ops/controlled_operation_test.py +8 -6
- cirq/ops/dense_pauli_string.py +38 -49
- cirq/ops/dense_pauli_string_test.py +4 -2
- cirq/ops/diagonal_gate.py +18 -31
- cirq/ops/diagonal_gate_test.py +13 -13
- cirq/ops/eigen_gate.py +29 -29
- cirq/ops/eigen_gate_test.py +45 -28
- cirq/ops/fourier_transform.py +14 -20
- cirq/ops/fourier_transform_test.py +15 -12
- cirq/ops/fsim_gate.py +43 -42
- cirq/ops/fsim_gate_test.py +29 -29
- cirq/ops/gate_features.py +2 -0
- cirq/ops/gate_features_test.py +5 -3
- cirq/ops/gate_operation.py +43 -65
- cirq/ops/gate_operation_test.py +46 -42
- cirq/ops/gateset.py +28 -40
- cirq/ops/gateset_test.py +4 -2
- cirq/ops/global_phase_op.py +45 -20
- cirq/ops/global_phase_op_test.py +44 -20
- cirq/ops/greedy_qubit_manager.py +10 -8
- cirq/ops/greedy_qubit_manager_test.py +5 -3
- cirq/ops/identity.py +14 -12
- cirq/ops/identity_test.py +24 -20
- cirq/ops/kraus_channel.py +11 -8
- cirq/ops/kraus_channel_test.py +14 -11
- cirq/ops/linear_combinations.py +65 -77
- cirq/ops/linear_combinations_test.py +14 -9
- cirq/ops/matrix_gates.py +21 -18
- cirq/ops/matrix_gates_test.py +16 -0
- cirq/ops/measure_util.py +15 -20
- cirq/ops/measure_util_test.py +2 -0
- cirq/ops/measurement_gate.py +26 -37
- cirq/ops/measurement_gate_test.py +2 -0
- cirq/ops/mixed_unitary_channel.py +12 -9
- cirq/ops/mixed_unitary_channel_test.py +14 -11
- cirq/ops/named_qubit.py +16 -13
- cirq/ops/named_qubit_test.py +15 -13
- cirq/ops/op_tree.py +9 -7
- cirq/ops/op_tree_test.py +22 -19
- cirq/ops/parallel_gate.py +15 -17
- cirq/ops/parallel_gate_test.py +18 -16
- cirq/ops/parity_gates.py +23 -25
- cirq/ops/parity_gates_test.py +36 -32
- cirq/ops/pauli_gates.py +22 -21
- cirq/ops/pauli_gates_test.py +29 -20
- cirq/ops/pauli_interaction_gate.py +15 -19
- cirq/ops/pauli_interaction_gate_test.py +10 -8
- cirq/ops/pauli_measurement_gate.py +23 -35
- cirq/ops/pauli_measurement_gate_test.py +2 -0
- cirq/ops/pauli_string.py +92 -120
- cirq/ops/pauli_string_phasor.py +52 -45
- cirq/ops/pauli_string_phasor_test.py +4 -5
- cirq/ops/pauli_string_raw_types.py +9 -7
- cirq/ops/pauli_string_raw_types_test.py +2 -0
- cirq/ops/pauli_string_test.py +31 -154
- cirq/ops/pauli_sum_exponential.py +12 -12
- cirq/ops/pauli_sum_exponential_test.py +12 -10
- cirq/ops/permutation_gate.py +8 -6
- cirq/ops/permutation_gate_test.py +10 -8
- cirq/ops/phased_iswap_gate.py +16 -16
- cirq/ops/phased_iswap_gate_test.py +17 -15
- cirq/ops/phased_x_gate.py +16 -17
- cirq/ops/phased_x_gate_test.py +18 -16
- cirq/ops/phased_x_z_gate.py +24 -22
- cirq/ops/phased_x_z_gate_test.py +17 -11
- cirq/ops/projector.py +16 -11
- cirq/ops/projector_test.py +19 -16
- cirq/ops/qid_util.py +7 -5
- cirq/ops/qid_util_test.py +2 -0
- cirq/ops/qubit_manager.py +11 -9
- cirq/ops/qubit_manager_test.py +6 -4
- cirq/ops/qubit_order.py +11 -14
- cirq/ops/qubit_order_or_list.py +4 -2
- cirq/ops/qubit_order_test.py +12 -10
- cirq/ops/random_gate_channel.py +12 -10
- cirq/ops/random_gate_channel_test.py +14 -11
- cirq/ops/raw_types.py +109 -129
- cirq/ops/raw_types_test.py +63 -57
- cirq/ops/state_preparation_channel.py +7 -7
- cirq/ops/state_preparation_channel_test.py +11 -9
- cirq/ops/swap_gates.py +13 -15
- cirq/ops/swap_gates_test.py +19 -17
- cirq/ops/tags.py +5 -3
- cirq/ops/tags_test.py +4 -2
- cirq/ops/three_qubit_gates.py +43 -76
- cirq/ops/three_qubit_gates_test.py +19 -17
- cirq/ops/two_qubit_diagonal_gate.py +13 -13
- cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
- cirq/ops/uniform_superposition_gate.py +5 -3
- cirq/ops/uniform_superposition_gate_test.py +5 -3
- cirq/ops/wait_gate.py +17 -14
- cirq/ops/wait_gate_test.py +9 -6
- cirq/protocols/__init__.py +0 -3
- cirq/protocols/act_on_protocol.py +8 -6
- cirq/protocols/act_on_protocol_test.py +15 -12
- cirq/protocols/apply_channel_protocol.py +10 -14
- cirq/protocols/apply_channel_protocol_test.py +2 -0
- cirq/protocols/apply_mixture_protocol.py +13 -42
- cirq/protocols/apply_mixture_protocol_test.py +7 -5
- cirq/protocols/apply_unitary_protocol.py +39 -34
- cirq/protocols/apply_unitary_protocol_test.py +4 -1
- cirq/protocols/approximate_equality_protocol.py +2 -0
- cirq/protocols/approximate_equality_protocol_test.py +2 -0
- cirq/protocols/circuit_diagram_info_protocol.py +58 -42
- cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
- cirq/protocols/commutes_protocol.py +8 -7
- cirq/protocols/commutes_protocol_test.py +2 -0
- cirq/protocols/control_key_protocol.py +6 -4
- cirq/protocols/control_key_protocol_test.py +3 -1
- cirq/protocols/decompose_protocol.py +49 -48
- cirq/protocols/decompose_protocol_test.py +27 -16
- cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
- cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
- cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
- cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
- cirq/protocols/has_unitary_protocol.py +10 -6
- cirq/protocols/has_unitary_protocol_test.py +13 -8
- cirq/protocols/hash_from_pickle_test.py +2 -11
- cirq/protocols/inverse_protocol.py +13 -16
- cirq/protocols/inverse_protocol_test.py +5 -3
- cirq/protocols/json_serialization.py +35 -54
- cirq/protocols/json_serialization_test.py +14 -21
- cirq/protocols/json_test_data/CXSWAP.json +46 -0
- cirq/protocols/json_test_data/CXSWAP.repr +13 -0
- cirq/protocols/json_test_data/CZSWAP.json +46 -0
- cirq/protocols/json_test_data/CZSWAP.repr +13 -0
- cirq/protocols/json_test_data/CircuitOperation.json +6 -3
- cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
- cirq/protocols/json_test_data/Moment.json +24 -1
- cirq/protocols/json_test_data/Moment.repr +6 -1
- cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
- cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
- cirq/protocols/json_test_data/spec.py +6 -2
- cirq/protocols/kraus_protocol.py +47 -7
- cirq/protocols/kraus_protocol_test.py +86 -12
- cirq/protocols/measurement_key_protocol.py +15 -16
- cirq/protocols/measurement_key_protocol_test.py +13 -11
- cirq/protocols/mixture_protocol.py +7 -5
- cirq/protocols/mixture_protocol_test.py +4 -2
- cirq/protocols/mul_protocol.py +2 -3
- cirq/protocols/mul_protocol_test.py +2 -0
- cirq/protocols/pauli_expansion_protocol.py +6 -3
- cirq/protocols/pauli_expansion_protocol_test.py +5 -3
- cirq/protocols/phase_protocol.py +2 -0
- cirq/protocols/phase_protocol_test.py +3 -1
- cirq/protocols/pow_protocol.py +11 -16
- cirq/protocols/pow_protocol_test.py +2 -0
- cirq/protocols/qasm.py +14 -20
- cirq/protocols/qasm_test.py +6 -3
- cirq/protocols/qid_shape_protocol.py +8 -8
- cirq/protocols/qid_shape_protocol_test.py +3 -1
- cirq/protocols/resolve_parameters.py +5 -3
- cirq/protocols/resolve_parameters_test.py +8 -7
- cirq/protocols/trace_distance_bound.py +6 -4
- cirq/protocols/trace_distance_bound_test.py +3 -1
- cirq/protocols/unitary_protocol.py +17 -7
- cirq/protocols/unitary_protocol_test.py +12 -2
- cirq/qis/channels.py +6 -2
- cirq/qis/channels_test.py +20 -16
- cirq/qis/clifford_tableau.py +21 -19
- cirq/qis/clifford_tableau_test.py +2 -2
- cirq/qis/entropy.py +14 -3
- cirq/qis/entropy_test.py +3 -1
- cirq/qis/measures.py +13 -13
- cirq/qis/measures_test.py +20 -14
- cirq/qis/noise_utils.py +2 -0
- cirq/qis/noise_utils_test.py +9 -7
- cirq/qis/quantum_state_representation.py +7 -8
- cirq/qis/states.py +58 -56
- cirq/qis/states_test.py +2 -0
- cirq/sim/classical_simulator.py +23 -22
- cirq/sim/classical_simulator_test.py +2 -0
- cirq/sim/clifford/clifford_simulator.py +23 -21
- cirq/sim/clifford/clifford_simulator_test.py +7 -4
- cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
- cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
- cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
- cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
- cirq/sim/clifford/stabilizer_sampler.py +9 -7
- cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
- cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
- cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
- cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
- cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
- cirq/sim/density_matrix_simulation_state.py +26 -27
- cirq/sim/density_matrix_simulation_state_test.py +10 -8
- cirq/sim/density_matrix_simulator.py +30 -28
- cirq/sim/density_matrix_simulator_test.py +48 -48
- cirq/sim/density_matrix_utils.py +13 -11
- cirq/sim/density_matrix_utils_test.py +38 -36
- cirq/sim/mux.py +33 -31
- cirq/sim/mux_test.py +3 -0
- cirq/sim/simulation_product_state.py +15 -15
- cirq/sim/simulation_product_state_test.py +29 -26
- cirq/sim/simulation_state.py +29 -38
- cirq/sim/simulation_state_base.py +21 -32
- cirq/sim/simulation_state_test.py +15 -13
- cirq/sim/simulation_utils.py +5 -2
- cirq/sim/simulation_utils_test.py +5 -2
- cirq/sim/simulator.py +90 -106
- cirq/sim/simulator_base.py +33 -45
- cirq/sim/simulator_base_test.py +20 -15
- cirq/sim/simulator_test.py +23 -14
- cirq/sim/sparse_simulator.py +19 -17
- cirq/sim/sparse_simulator_test.py +41 -40
- cirq/sim/state_vector.py +15 -12
- cirq/sim/state_vector_simulation_state.py +31 -31
- cirq/sim/state_vector_simulation_state_test.py +16 -14
- cirq/sim/state_vector_simulator.py +17 -14
- cirq/sim/state_vector_simulator_test.py +2 -0
- cirq/sim/state_vector_test.py +6 -3
- cirq/study/flatten_expressions.py +16 -15
- cirq/study/flatten_expressions_test.py +13 -11
- cirq/study/resolver.py +18 -17
- cirq/study/resolver_test.py +22 -20
- cirq/study/result.py +17 -27
- cirq/study/result_test.py +2 -0
- cirq/study/sweepable.py +12 -10
- cirq/study/sweepable_test.py +3 -0
- cirq/study/sweeps.py +42 -61
- cirq/study/sweeps_test.py +33 -0
- cirq/testing/__init__.py +7 -11
- cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
- cirq/testing/circuit_compare.py +8 -17
- cirq/testing/circuit_compare_test.py +2 -0
- cirq/testing/consistent_act_on.py +13 -11
- cirq/testing/consistent_act_on_test.py +5 -3
- cirq/testing/consistent_channels.py +2 -0
- cirq/testing/consistent_channels_test.py +10 -8
- cirq/testing/consistent_controlled_gate_op.py +5 -5
- cirq/testing/consistent_controlled_gate_op_test.py +18 -18
- cirq/testing/consistent_decomposition.py +2 -2
- cirq/testing/consistent_decomposition_test.py +4 -2
- cirq/testing/consistent_pauli_expansion.py +2 -0
- cirq/testing/consistent_pauli_expansion_test.py +3 -1
- cirq/testing/consistent_phase_by.py +2 -0
- cirq/testing/consistent_phase_by_test.py +3 -1
- cirq/testing/consistent_protocols.py +14 -20
- cirq/testing/consistent_protocols_test.py +13 -11
- cirq/testing/consistent_qasm.py +6 -4
- cirq/testing/consistent_qasm_test.py +7 -7
- cirq/testing/consistent_resolve_parameters.py +2 -0
- cirq/testing/consistent_specified_has_unitary.py +2 -2
- cirq/testing/consistent_specified_has_unitary_test.py +6 -4
- cirq/testing/consistent_unitary.py +1 -0
- cirq/testing/consistent_unitary_test.py +4 -2
- cirq/testing/deprecation.py +5 -2
- cirq/testing/deprecation_test.py +5 -2
- cirq/testing/devices.py +7 -4
- cirq/testing/devices_test.py +7 -4
- cirq/testing/equals_tester.py +4 -2
- cirq/testing/equals_tester_test.py +21 -17
- cirq/testing/equivalent_basis_map.py +6 -4
- cirq/testing/equivalent_basis_map_test.py +6 -4
- cirq/testing/equivalent_repr_eval.py +6 -4
- cirq/testing/equivalent_repr_eval_test.py +5 -3
- cirq/testing/gate_features.py +2 -0
- cirq/testing/gate_features_test.py +7 -5
- cirq/testing/json.py +19 -15
- cirq/testing/json_test.py +5 -3
- cirq/testing/lin_alg_utils.py +10 -11
- cirq/testing/lin_alg_utils_test.py +14 -12
- cirq/testing/logs.py +7 -6
- cirq/testing/logs_test.py +9 -7
- cirq/testing/no_identifier_qubit.py +4 -2
- cirq/testing/no_identifier_qubit_test.py +5 -3
- cirq/testing/op_tree.py +2 -0
- cirq/testing/op_tree_test.py +4 -1
- cirq/testing/order_tester.py +2 -0
- cirq/testing/order_tester_test.py +8 -6
- cirq/testing/pytest_utils.py +2 -0
- cirq/testing/pytest_utils_test.py +4 -2
- cirq/testing/random_circuit.py +21 -20
- cirq/testing/random_circuit_test.py +12 -9
- cirq/testing/repr_pretty_tester.py +1 -0
- cirq/testing/repr_pretty_tester_test.py +5 -3
- cirq/testing/routing_devices.py +4 -1
- cirq/testing/routing_devices_test.py +9 -6
- cirq/testing/sample_circuits.py +4 -1
- cirq/testing/sample_circuits_test.py +3 -1
- cirq/testing/sample_gates.py +3 -0
- cirq/testing/sample_gates_test.py +5 -2
- cirq/transformers/__init__.py +11 -4
- cirq/transformers/align.py +9 -7
- cirq/transformers/align_test.py +2 -0
- cirq/transformers/analytical_decompositions/__init__.py +3 -6
- cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
- cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
- cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
- cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
- cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
- cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
- cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
- cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
- cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
- cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
- cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
- cirq/transformers/drop_empty_moments.py +5 -3
- cirq/transformers/drop_empty_moments_test.py +4 -2
- cirq/transformers/drop_negligible_operations.py +7 -5
- cirq/transformers/drop_negligible_operations_test.py +2 -0
- cirq/transformers/dynamical_decoupling.py +49 -42
- cirq/transformers/dynamical_decoupling_test.py +223 -205
- cirq/transformers/eject_phased_paulis.py +28 -26
- cirq/transformers/eject_phased_paulis_test.py +12 -9
- cirq/transformers/eject_z.py +12 -12
- cirq/transformers/eject_z_test.py +2 -2
- cirq/transformers/expand_composite.py +6 -4
- cirq/transformers/expand_composite_test.py +3 -1
- cirq/transformers/gauge_compiling/__init__.py +3 -1
- cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
- cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
- cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
- cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
- cirq/transformers/insertion_sort.py +8 -6
- cirq/transformers/insertion_sort_test.py +3 -1
- cirq/transformers/measurement_transformers.py +29 -29
- cirq/transformers/measurement_transformers_test.py +2 -0
- cirq/transformers/merge_k_qubit_gates.py +12 -10
- cirq/transformers/merge_k_qubit_gates_test.py +18 -18
- cirq/transformers/merge_single_qubit_gates.py +197 -20
- cirq/transformers/merge_single_qubit_gates_test.py +177 -5
- cirq/transformers/noise_adding.py +5 -3
- cirq/transformers/noise_adding_test.py +2 -0
- cirq/transformers/optimize_for_target_gateset.py +19 -17
- cirq/transformers/optimize_for_target_gateset_test.py +11 -8
- cirq/transformers/qubit_management_transformers.py +13 -11
- cirq/transformers/qubit_management_transformers_test.py +5 -3
- cirq/transformers/randomized_measurements.py +16 -14
- cirq/transformers/randomized_measurements_test.py +10 -4
- cirq/transformers/routing/initial_mapper.py +6 -4
- cirq/transformers/routing/initial_mapper_test.py +2 -0
- cirq/transformers/routing/line_initial_mapper.py +16 -14
- cirq/transformers/routing/line_initial_mapper_test.py +9 -7
- cirq/transformers/routing/mapping_manager.py +10 -10
- cirq/transformers/routing/mapping_manager_test.py +2 -0
- cirq/transformers/routing/route_circuit_cqc.py +33 -31
- cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
- cirq/transformers/routing/visualize_routed_circuit.py +8 -7
- cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
- cirq/transformers/stratify.py +17 -15
- cirq/transformers/stratify_test.py +3 -0
- cirq/transformers/symbolize.py +103 -0
- cirq/transformers/symbolize_test.py +62 -0
- cirq/transformers/synchronize_terminal_measurements.py +10 -10
- cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
- cirq/transformers/tag_transformers.py +97 -0
- cirq/transformers/tag_transformers_test.py +103 -0
- cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
- cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
- cirq/transformers/target_gatesets/cz_gateset.py +7 -5
- cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
- cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
- cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
- cirq/transformers/transformer_api.py +34 -47
- cirq/transformers/transformer_api_test.py +9 -8
- cirq/transformers/transformer_primitives.py +39 -49
- cirq/transformers/transformer_primitives_test.py +10 -17
- cirq/value/abc_alt.py +6 -4
- cirq/value/abc_alt_test.py +5 -3
- cirq/value/angle.py +11 -12
- cirq/value/angle_test.py +5 -3
- cirq/value/classical_data.py +27 -27
- cirq/value/classical_data_test.py +11 -8
- cirq/value/condition.py +26 -24
- cirq/value/condition_test.py +2 -0
- cirq/value/digits.py +14 -11
- cirq/value/digits_test.py +2 -0
- cirq/value/duration.py +23 -20
- cirq/value/duration_test.py +2 -0
- cirq/value/linear_dict.py +25 -30
- cirq/value/linear_dict_test.py +10 -8
- cirq/value/measurement_key.py +12 -12
- cirq/value/measurement_key_test.py +2 -0
- cirq/value/periodic_value.py +4 -4
- cirq/value/periodic_value_test.py +11 -7
- cirq/value/probability.py +3 -1
- cirq/value/probability_test.py +4 -2
- cirq/value/product_state.py +15 -13
- cirq/value/product_state_test.py +4 -1
- cirq/value/random_state.py +2 -0
- cirq/value/random_state_test.py +5 -3
- cirq/value/timestamp.py +11 -7
- cirq/value/timestamp_test.py +14 -12
- cirq/value/type_alias.py +4 -4
- cirq/value/value_equality_attr.py +8 -9
- cirq/value/value_equality_attr_test.py +14 -11
- cirq/vis/density_matrix.py +3 -3
- cirq/vis/density_matrix_test.py +20 -17
- cirq/vis/heatmap.py +24 -37
- cirq/vis/heatmap_test.py +3 -0
- cirq/vis/histogram.py +9 -6
- cirq/vis/histogram_test.py +5 -2
- cirq/vis/state_histogram.py +10 -8
- cirq/vis/state_histogram_test.py +7 -5
- cirq/vis/vis_utils.py +4 -1
- cirq/vis/vis_utils_test.py +4 -1
- cirq/work/collector.py +12 -18
- cirq/work/collector_test.py +15 -10
- cirq/work/observable_grouping.py +6 -7
- cirq/work/observable_grouping_test.py +10 -9
- cirq/work/observable_measurement.py +47 -45
- cirq/work/observable_measurement_data.py +22 -17
- cirq/work/observable_measurement_data_test.py +4 -1
- cirq/work/observable_measurement_test.py +48 -29
- cirq/work/observable_readout_calibration.py +5 -2
- cirq/work/observable_readout_calibration_test.py +5 -2
- cirq/work/observable_settings.py +13 -22
- cirq/work/observable_settings_test.py +9 -7
- cirq/work/pauli_sum_collector.py +12 -10
- cirq/work/pauli_sum_collector_test.py +9 -9
- cirq/work/sampler.py +42 -43
- cirq/work/sampler_test.py +31 -24
- cirq/work/zeros_sampler.py +6 -4
- cirq/work/zeros_sampler_test.py +7 -5
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
- cirq_core-1.6.0.dist-info/RECORD +1241 -0
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
- cirq_core-1.5.0.dev20250409225226.dist-info/RECORD +0 -1216
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
cirq/sim/simulator_base.py
CHANGED
|
@@ -14,22 +14,11 @@
|
|
|
14
14
|
|
|
15
15
|
"""Batteries-included class for Cirq's built-in simulators."""
|
|
16
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
17
19
|
import abc
|
|
18
20
|
import collections
|
|
19
|
-
from typing import
|
|
20
|
-
Any,
|
|
21
|
-
cast,
|
|
22
|
-
Dict,
|
|
23
|
-
Generic,
|
|
24
|
-
Iterator,
|
|
25
|
-
List,
|
|
26
|
-
Optional,
|
|
27
|
-
Sequence,
|
|
28
|
-
Tuple,
|
|
29
|
-
Type,
|
|
30
|
-
TYPE_CHECKING,
|
|
31
|
-
TypeVar,
|
|
32
|
-
)
|
|
21
|
+
from typing import Any, cast, Generic, Iterator, Sequence, TYPE_CHECKING, TypeVar
|
|
33
22
|
|
|
34
23
|
import numpy as np
|
|
35
24
|
|
|
@@ -91,9 +80,9 @@ class SimulatorBase(
|
|
|
91
80
|
def __init__(
|
|
92
81
|
self,
|
|
93
82
|
*,
|
|
94
|
-
dtype:
|
|
95
|
-
noise:
|
|
96
|
-
seed:
|
|
83
|
+
dtype: type[np.complexfloating] = np.complex64,
|
|
84
|
+
noise: cirq.NOISE_MODEL_LIKE = None,
|
|
85
|
+
seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
|
|
97
86
|
split_untangled_states: bool = False,
|
|
98
87
|
):
|
|
99
88
|
"""Initializes the simulator.
|
|
@@ -112,15 +101,15 @@ class SimulatorBase(
|
|
|
112
101
|
self._split_untangled_states = split_untangled_states
|
|
113
102
|
|
|
114
103
|
@property
|
|
115
|
-
def noise(self) ->
|
|
104
|
+
def noise(self) -> cirq.NoiseModel:
|
|
116
105
|
return self._noise
|
|
117
106
|
|
|
118
107
|
@abc.abstractmethod
|
|
119
108
|
def _create_partial_simulation_state(
|
|
120
109
|
self,
|
|
121
110
|
initial_state: Any,
|
|
122
|
-
qubits: Sequence[
|
|
123
|
-
classical_data:
|
|
111
|
+
qubits: Sequence[cirq.Qid],
|
|
112
|
+
classical_data: cirq.ClassicalDataStore,
|
|
124
113
|
) -> TSimulationState:
|
|
125
114
|
"""Creates an instance of the TSimulationState class for the simulator.
|
|
126
115
|
|
|
@@ -171,14 +160,14 @@ class SimulatorBase(
|
|
|
171
160
|
return protocols.has_unitary(val)
|
|
172
161
|
|
|
173
162
|
def _base_iterator(
|
|
174
|
-
self, circuit:
|
|
163
|
+
self, circuit: cirq.AbstractCircuit, qubits: tuple[cirq.Qid, ...], initial_state: Any
|
|
175
164
|
) -> Iterator[TStepResultBase]:
|
|
176
165
|
sim_state = self._create_simulation_state(initial_state, qubits)
|
|
177
166
|
return self._core_iterator(circuit, sim_state)
|
|
178
167
|
|
|
179
168
|
def _core_iterator(
|
|
180
169
|
self,
|
|
181
|
-
circuit:
|
|
170
|
+
circuit: cirq.AbstractCircuit,
|
|
182
171
|
sim_state: SimulationStateBase[TSimulationState],
|
|
183
172
|
all_measurements_are_terminal: bool = False,
|
|
184
173
|
) -> Iterator[TStepResultBase]:
|
|
@@ -204,7 +193,7 @@ class SimulatorBase(
|
|
|
204
193
|
return
|
|
205
194
|
|
|
206
195
|
noisy_moments = self.noise.noisy_moments(circuit, sorted(circuit.all_qubits()))
|
|
207
|
-
measured:
|
|
196
|
+
measured: dict[tuple[cirq.Qid, ...], bool] = collections.defaultdict(bool)
|
|
208
197
|
for moment in noisy_moments:
|
|
209
198
|
for op in ops.flatten_to_ops(moment):
|
|
210
199
|
try:
|
|
@@ -224,11 +213,8 @@ class SimulatorBase(
|
|
|
224
213
|
yield self._create_step_result(sim_state)
|
|
225
214
|
|
|
226
215
|
def _run(
|
|
227
|
-
self,
|
|
228
|
-
|
|
229
|
-
param_resolver: 'cirq.ParamResolver',
|
|
230
|
-
repetitions: int,
|
|
231
|
-
) -> Dict[str, np.ndarray]:
|
|
216
|
+
self, circuit: cirq.AbstractCircuit, param_resolver: cirq.ParamResolver, repetitions: int
|
|
217
|
+
) -> dict[str, np.ndarray]:
|
|
232
218
|
"""See definition in `cirq.SimulatesSamples`."""
|
|
233
219
|
param_resolver = param_resolver or study.ParamResolver({})
|
|
234
220
|
resolved_circuit = protocols.resolve_parameters(circuit, param_resolver)
|
|
@@ -241,9 +227,10 @@ class SimulatorBase(
|
|
|
241
227
|
if self._can_be_in_run_prefix(self.noise)
|
|
242
228
|
else (resolved_circuit[0:0], resolved_circuit)
|
|
243
229
|
)
|
|
244
|
-
step_result = None
|
|
230
|
+
step_result: TStepResultBase | None = None
|
|
245
231
|
for step_result in self._core_iterator(circuit=prefix, sim_state=sim_state):
|
|
246
232
|
pass
|
|
233
|
+
assert step_result is not None
|
|
247
234
|
|
|
248
235
|
general_ops = list(general_suffix.all_operations())
|
|
249
236
|
if all(isinstance(op.gate, ops.MeasurementGate) for op in general_ops):
|
|
@@ -257,7 +244,7 @@ class SimulatorBase(
|
|
|
257
244
|
measurement_ops, repetitions, seed=self._prng, _allow_repeated=True
|
|
258
245
|
)
|
|
259
246
|
|
|
260
|
-
records:
|
|
247
|
+
records: dict[cirq.MeasurementKey, list[Sequence[Sequence[int]]]] = {}
|
|
261
248
|
for i in range(repetitions):
|
|
262
249
|
for step_result in self._core_iterator(
|
|
263
250
|
general_suffix,
|
|
@@ -286,9 +273,9 @@ class SimulatorBase(
|
|
|
286
273
|
|
|
287
274
|
def simulate_sweep_iter(
|
|
288
275
|
self,
|
|
289
|
-
program:
|
|
290
|
-
params:
|
|
291
|
-
qubit_order:
|
|
276
|
+
program: cirq.AbstractCircuit,
|
|
277
|
+
params: cirq.Sweepable,
|
|
278
|
+
qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
|
|
292
279
|
initial_state: Any = None,
|
|
293
280
|
) -> Iterator[TSimulationTrialResult]:
|
|
294
281
|
"""Simulates the supplied Circuit.
|
|
@@ -313,7 +300,7 @@ class SimulatorBase(
|
|
|
313
300
|
possible parameter resolver.
|
|
314
301
|
"""
|
|
315
302
|
|
|
316
|
-
def sweep_prefixable(op:
|
|
303
|
+
def sweep_prefixable(op: cirq.Operation):
|
|
317
304
|
return self._can_be_in_run_prefix(op) and not protocols.is_parameterized(op)
|
|
318
305
|
|
|
319
306
|
qubits = ops.QubitOrder.as_qubit_order(qubit_order).order_for(program.all_qubits())
|
|
@@ -324,21 +311,22 @@ class SimulatorBase(
|
|
|
324
311
|
if self._can_be_in_run_prefix(self.noise)
|
|
325
312
|
else (program[0:0], program)
|
|
326
313
|
)
|
|
327
|
-
step_result = None
|
|
314
|
+
step_result: TStepResultBase | None = None
|
|
328
315
|
for step_result in self._core_iterator(circuit=prefix, sim_state=sim_state):
|
|
329
316
|
pass
|
|
317
|
+
assert step_result is not None
|
|
330
318
|
sim_state = step_result._sim_state
|
|
331
319
|
yield from super().simulate_sweep_iter(suffix, params, qubit_order, sim_state)
|
|
332
320
|
|
|
333
321
|
def _create_simulation_state(
|
|
334
|
-
self, initial_state: Any, qubits: Sequence[
|
|
322
|
+
self, initial_state: Any, qubits: Sequence[cirq.Qid]
|
|
335
323
|
) -> SimulationStateBase[TSimulationState]:
|
|
336
324
|
if isinstance(initial_state, SimulationStateBase):
|
|
337
325
|
return initial_state
|
|
338
326
|
|
|
339
327
|
classical_data = value.ClassicalDataDictionaryStore()
|
|
340
328
|
if self._split_untangled_states:
|
|
341
|
-
args_map:
|
|
329
|
+
args_map: dict[cirq.Qid | None, TSimulationState] = {}
|
|
342
330
|
if isinstance(initial_state, int):
|
|
343
331
|
for q in reversed(qubits):
|
|
344
332
|
args_map[q] = self._create_partial_simulation_state(
|
|
@@ -375,7 +363,7 @@ class StepResultBase(
|
|
|
375
363
|
sim_state: The `SimulationStateBase` for this step.
|
|
376
364
|
"""
|
|
377
365
|
super().__init__(sim_state)
|
|
378
|
-
self._merged_sim_state_cache:
|
|
366
|
+
self._merged_sim_state_cache: TSimulationState | None = None
|
|
379
367
|
qubits = sim_state.qubits
|
|
380
368
|
self._qubits = qubits
|
|
381
369
|
self._qubit_mapping = {q: i for i, q in enumerate(qubits)}
|
|
@@ -393,9 +381,9 @@ class StepResultBase(
|
|
|
393
381
|
|
|
394
382
|
def sample(
|
|
395
383
|
self,
|
|
396
|
-
qubits:
|
|
384
|
+
qubits: list[cirq.Qid],
|
|
397
385
|
repetitions: int = 1,
|
|
398
|
-
seed:
|
|
386
|
+
seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
|
|
399
387
|
) -> np.ndarray:
|
|
400
388
|
return self._sim_state.sample(qubits, repetitions, seed)
|
|
401
389
|
|
|
@@ -408,8 +396,8 @@ class SimulationTrialResultBase(
|
|
|
408
396
|
def __init__(
|
|
409
397
|
self,
|
|
410
398
|
params: study.ParamResolver,
|
|
411
|
-
measurements:
|
|
412
|
-
final_simulator_state:
|
|
399
|
+
measurements: dict[str, np.ndarray],
|
|
400
|
+
final_simulator_state: cirq.SimulationStateBase[TSimulationState],
|
|
413
401
|
) -> None:
|
|
414
402
|
"""Initializes the `SimulationTrialResultBase` class.
|
|
415
403
|
|
|
@@ -423,9 +411,9 @@ class SimulationTrialResultBase(
|
|
|
423
411
|
trial finishes.
|
|
424
412
|
"""
|
|
425
413
|
super().__init__(params, measurements, final_simulator_state=final_simulator_state)
|
|
426
|
-
self._merged_sim_state_cache:
|
|
414
|
+
self._merged_sim_state_cache: TSimulationState | None = None
|
|
427
415
|
|
|
428
|
-
def get_state_containing_qubit(self, qubit:
|
|
416
|
+
def get_state_containing_qubit(self, qubit: cirq.Qid) -> TSimulationState:
|
|
429
417
|
"""Returns the independent state space containing the qubit.
|
|
430
418
|
|
|
431
419
|
Args:
|
|
@@ -438,7 +426,7 @@ class SimulationTrialResultBase(
|
|
|
438
426
|
def _get_substates(self) -> Sequence[TSimulationState]:
|
|
439
427
|
state = self._final_simulator_state
|
|
440
428
|
if isinstance(state, SimulationProductState):
|
|
441
|
-
substates:
|
|
429
|
+
substates: dict[TSimulationState, int] = {}
|
|
442
430
|
for q in state.qubits:
|
|
443
431
|
substates[self.get_state_containing_qubit(q)] = 0
|
|
444
432
|
substates[state[None]] = 0
|
cirq/sim/simulator_base_test.py
CHANGED
|
@@ -11,8 +11,11 @@
|
|
|
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 math
|
|
15
|
-
from typing import Any,
|
|
18
|
+
from typing import Any, Sequence
|
|
16
19
|
|
|
17
20
|
import numpy as np
|
|
18
21
|
import pytest
|
|
@@ -29,12 +32,12 @@ class CountingState(cirq.qis.QuantumStateRepresentation):
|
|
|
29
32
|
self.copy_count = copy_count
|
|
30
33
|
|
|
31
34
|
def measure(
|
|
32
|
-
self, axes: Sequence[int], seed:
|
|
33
|
-
) ->
|
|
35
|
+
self, axes: Sequence[int], seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None
|
|
36
|
+
) -> list[int]:
|
|
34
37
|
self.measurement_count += 1
|
|
35
38
|
return [self.gate_count]
|
|
36
39
|
|
|
37
|
-
def kron(self, other:
|
|
40
|
+
def kron(self, other: CountingState) -> CountingState:
|
|
38
41
|
return CountingState(
|
|
39
42
|
self.data,
|
|
40
43
|
self.gate_count + other.gate_count,
|
|
@@ -44,15 +47,15 @@ class CountingState(cirq.qis.QuantumStateRepresentation):
|
|
|
44
47
|
|
|
45
48
|
def factor(
|
|
46
49
|
self, axes: Sequence[int], *, validate=True, atol=1e-07
|
|
47
|
-
) ->
|
|
50
|
+
) -> tuple[CountingState, CountingState]:
|
|
48
51
|
return CountingState(
|
|
49
52
|
self.data, self.gate_count, self.measurement_count, self.copy_count
|
|
50
53
|
), CountingState(self.data)
|
|
51
54
|
|
|
52
|
-
def reindex(self, axes: Sequence[int]) ->
|
|
55
|
+
def reindex(self, axes: Sequence[int]) -> CountingState:
|
|
53
56
|
return CountingState(self.data, self.gate_count, self.measurement_count, self.copy_count)
|
|
54
57
|
|
|
55
|
-
def copy(self, deep_copy_buffers: bool = True) ->
|
|
58
|
+
def copy(self, deep_copy_buffers: bool = True) -> CountingState:
|
|
56
59
|
return CountingState(
|
|
57
60
|
self.data, self.gate_count, self.measurement_count, self.copy_count + 1
|
|
58
61
|
)
|
|
@@ -64,7 +67,7 @@ class CountingSimulationState(cirq.SimulationState[CountingState]):
|
|
|
64
67
|
super().__init__(state=state_obj, qubits=qubits, classical_data=classical_data)
|
|
65
68
|
|
|
66
69
|
def _act_on_fallback_(
|
|
67
|
-
self, action: Any, qubits: Sequence[
|
|
70
|
+
self, action: Any, qubits: Sequence[cirq.Qid], allow_decompose: bool = True
|
|
68
71
|
) -> bool:
|
|
69
72
|
self._state.gate_count += 1
|
|
70
73
|
return True
|
|
@@ -95,11 +98,11 @@ class SplittableCountingSimulationState(CountingSimulationState):
|
|
|
95
98
|
class CountingStepResult(cirq.StepResultBase[CountingSimulationState]):
|
|
96
99
|
def sample(
|
|
97
100
|
self,
|
|
98
|
-
qubits:
|
|
101
|
+
qubits: list[cirq.Qid],
|
|
99
102
|
repetitions: int = 1,
|
|
100
103
|
seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
|
|
101
104
|
) -> np.ndarray:
|
|
102
|
-
measurements:
|
|
105
|
+
measurements: list[list[int]] = []
|
|
103
106
|
for _ in range(repetitions):
|
|
104
107
|
measurements.append(self._merged_sim_state._perform_measurement(qubits))
|
|
105
108
|
return np.array(measurements, dtype=int)
|
|
@@ -121,7 +124,7 @@ class CountingSimulator(
|
|
|
121
124
|
def _create_partial_simulation_state(
|
|
122
125
|
self,
|
|
123
126
|
initial_state: Any,
|
|
124
|
-
qubits: Sequence[
|
|
127
|
+
qubits: Sequence[cirq.Qid],
|
|
125
128
|
classical_data: cirq.ClassicalDataStore,
|
|
126
129
|
) -> CountingSimulationState:
|
|
127
130
|
return CountingSimulationState(
|
|
@@ -131,8 +134,8 @@ class CountingSimulator(
|
|
|
131
134
|
def _create_simulator_trial_result(
|
|
132
135
|
self,
|
|
133
136
|
params: cirq.ParamResolver,
|
|
134
|
-
measurements:
|
|
135
|
-
final_simulator_state:
|
|
137
|
+
measurements: dict[str, np.ndarray],
|
|
138
|
+
final_simulator_state: cirq.SimulationStateBase[CountingSimulationState],
|
|
136
139
|
) -> CountingTrialResult:
|
|
137
140
|
return CountingTrialResult(
|
|
138
141
|
params, measurements, final_simulator_state=final_simulator_state
|
|
@@ -151,7 +154,7 @@ class SplittableCountingSimulator(CountingSimulator):
|
|
|
151
154
|
def _create_partial_simulation_state(
|
|
152
155
|
self,
|
|
153
156
|
initial_state: Any,
|
|
154
|
-
qubits: Sequence[
|
|
157
|
+
qubits: Sequence[cirq.Qid],
|
|
155
158
|
classical_data: cirq.ClassicalDataStore,
|
|
156
159
|
) -> CountingSimulationState:
|
|
157
160
|
return SplittableCountingSimulationState(
|
|
@@ -219,7 +222,9 @@ def test_noise_applied_measurement_gate():
|
|
|
219
222
|
def test_parameterized_copies_all_but_last():
|
|
220
223
|
sim = CountingSimulator()
|
|
221
224
|
n = 4
|
|
222
|
-
rs = sim.simulate_sweep(
|
|
225
|
+
rs = sim.simulate_sweep(
|
|
226
|
+
cirq.Circuit(cirq.X(q0) ** sympy.Symbol('a')), [{'a': i} for i in range(n)]
|
|
227
|
+
)
|
|
223
228
|
for i in range(n):
|
|
224
229
|
r = rs[i]
|
|
225
230
|
assert r._final_simulator_state.gate_count == 1
|
cirq/sim/simulator_test.py
CHANGED
|
@@ -11,9 +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
|
"""Tests for simulator.py"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
15
19
|
import abc
|
|
16
|
-
from typing import Any,
|
|
20
|
+
from typing import Any, Generic, Iterator, Sequence
|
|
17
21
|
from unittest import mock
|
|
18
22
|
|
|
19
23
|
import duet
|
|
@@ -37,10 +41,10 @@ from cirq.sim.simulator import (
|
|
|
37
41
|
class FakeSimulatesSamples(SimulatesSamples):
|
|
38
42
|
"""A SimulatesSamples that returns specified values from _run."""
|
|
39
43
|
|
|
40
|
-
def __init__(self, run_output:
|
|
44
|
+
def __init__(self, run_output: dict[str, np.ndarray]):
|
|
41
45
|
self._run_output = run_output
|
|
42
46
|
|
|
43
|
-
def _run(self, *args, **kwargs) ->
|
|
47
|
+
def _run(self, *args, **kwargs) -> dict[str, np.ndarray]:
|
|
44
48
|
return self._run_output
|
|
45
49
|
|
|
46
50
|
|
|
@@ -64,17 +68,22 @@ class FakeStepResult(cirq.StepResult):
|
|
|
64
68
|
|
|
65
69
|
class SimulatesIntermediateStateImpl(
|
|
66
70
|
Generic[TStepResult, TSimulationState],
|
|
67
|
-
SimulatesIntermediateState[TStepResult,
|
|
71
|
+
SimulatesIntermediateState[TStepResult, SimulationTrialResult, TSimulationState],
|
|
68
72
|
metaclass=abc.ABCMeta,
|
|
69
73
|
):
|
|
70
74
|
"""A SimulatesIntermediateState that uses the default SimulationTrialResult type."""
|
|
71
75
|
|
|
76
|
+
def _base_iterator(
|
|
77
|
+
self, circuit: cirq.AbstractCircuit, qubits: tuple[cirq.Qid, ...], initial_state: Any
|
|
78
|
+
) -> Iterator[TStepResult]:
|
|
79
|
+
raise NotImplementedError
|
|
80
|
+
|
|
72
81
|
def _create_simulator_trial_result(
|
|
73
82
|
self,
|
|
74
83
|
params: study.ParamResolver,
|
|
75
|
-
measurements:
|
|
76
|
-
final_simulator_state:
|
|
77
|
-
) ->
|
|
84
|
+
measurements: dict[str, np.ndarray],
|
|
85
|
+
final_simulator_state: cirq.SimulationStateBase[TSimulationState],
|
|
86
|
+
) -> SimulationTrialResult:
|
|
78
87
|
"""This method creates a default trial result.
|
|
79
88
|
|
|
80
89
|
Args:
|
|
@@ -455,7 +464,7 @@ def test_iter_definitions():
|
|
|
455
464
|
|
|
456
465
|
def compute_amplitudes_sweep(
|
|
457
466
|
self,
|
|
458
|
-
program:
|
|
467
|
+
program: cirq.AbstractCircuit,
|
|
459
468
|
bitstrings: Sequence[int],
|
|
460
469
|
params: study.Sweepable,
|
|
461
470
|
qubit_order: cirq.QubitOrderOrList = cirq.QubitOrder.DEFAULT,
|
|
@@ -464,22 +473,22 @@ def test_iter_definitions():
|
|
|
464
473
|
|
|
465
474
|
def simulate_expectation_values_sweep(
|
|
466
475
|
self,
|
|
467
|
-
program:
|
|
468
|
-
observables:
|
|
469
|
-
params:
|
|
476
|
+
program: cirq.AbstractCircuit,
|
|
477
|
+
observables: cirq.PauliSumLike | list[cirq.PauliSumLike],
|
|
478
|
+
params: study.Sweepable,
|
|
470
479
|
qubit_order: cirq.QubitOrderOrList = cirq.QubitOrder.DEFAULT,
|
|
471
480
|
initial_state: Any = None,
|
|
472
481
|
permit_terminal_measurements: bool = False,
|
|
473
|
-
) ->
|
|
482
|
+
) -> list[list[float]]:
|
|
474
483
|
return [[1.0]]
|
|
475
484
|
|
|
476
485
|
def simulate_sweep(
|
|
477
486
|
self,
|
|
478
|
-
program:
|
|
487
|
+
program: cirq.AbstractCircuit,
|
|
479
488
|
params: study.Sweepable,
|
|
480
489
|
qubit_order: cirq.QubitOrderOrList = cirq.QubitOrder.DEFAULT,
|
|
481
490
|
initial_state: Any = None,
|
|
482
|
-
) ->
|
|
491
|
+
) -> list[SimulationTrialResult]:
|
|
483
492
|
return [mock_trial_result]
|
|
484
493
|
|
|
485
494
|
non_iter_sim = FakeNonIterSimulatorImpl()
|
cirq/sim/sparse_simulator.py
CHANGED
|
@@ -14,7 +14,9 @@
|
|
|
14
14
|
|
|
15
15
|
"""A simulator that uses numpy's einsum for sparse matrix operations."""
|
|
16
16
|
|
|
17
|
-
from
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
from typing import Any, Iterator, Sequence, TYPE_CHECKING
|
|
18
20
|
|
|
19
21
|
import numpy as np
|
|
20
22
|
|
|
@@ -125,9 +127,9 @@ class Simulator(
|
|
|
125
127
|
def __init__(
|
|
126
128
|
self,
|
|
127
129
|
*,
|
|
128
|
-
dtype:
|
|
129
|
-
noise:
|
|
130
|
-
seed:
|
|
130
|
+
dtype: type[np.complexfloating] = np.complex64,
|
|
131
|
+
noise: cirq.NOISE_MODEL_LIKE = None,
|
|
132
|
+
seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
|
|
131
133
|
split_untangled_states: bool = True,
|
|
132
134
|
):
|
|
133
135
|
"""A sparse matrix simulator.
|
|
@@ -152,9 +154,9 @@ class Simulator(
|
|
|
152
154
|
|
|
153
155
|
def _create_partial_simulation_state(
|
|
154
156
|
self,
|
|
155
|
-
initial_state:
|
|
156
|
-
qubits: Sequence[
|
|
157
|
-
classical_data:
|
|
157
|
+
initial_state: cirq.STATE_VECTOR_LIKE | cirq.StateVectorSimulationState,
|
|
158
|
+
qubits: Sequence[cirq.Qid],
|
|
159
|
+
classical_data: cirq.ClassicalDataStore,
|
|
158
160
|
):
|
|
159
161
|
"""Creates the StateVectorSimulationState for a circuit.
|
|
160
162
|
|
|
@@ -183,19 +185,19 @@ class Simulator(
|
|
|
183
185
|
)
|
|
184
186
|
|
|
185
187
|
def _create_step_result(
|
|
186
|
-
self, sim_state:
|
|
188
|
+
self, sim_state: cirq.SimulationStateBase[cirq.StateVectorSimulationState]
|
|
187
189
|
):
|
|
188
190
|
return SparseSimulatorStep(sim_state=sim_state, dtype=self._dtype)
|
|
189
191
|
|
|
190
192
|
def simulate_expectation_values_sweep_iter(
|
|
191
193
|
self,
|
|
192
|
-
program:
|
|
193
|
-
observables:
|
|
194
|
-
params:
|
|
195
|
-
qubit_order:
|
|
194
|
+
program: cirq.AbstractCircuit,
|
|
195
|
+
observables: cirq.PauliSumLike | list[cirq.PauliSumLike],
|
|
196
|
+
params: cirq.Sweepable,
|
|
197
|
+
qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
|
|
196
198
|
initial_state: Any = None,
|
|
197
199
|
permit_terminal_measurements: bool = False,
|
|
198
|
-
) -> Iterator[
|
|
200
|
+
) -> Iterator[list[float]]:
|
|
199
201
|
if not permit_terminal_measurements and program.are_any_measurements_terminal():
|
|
200
202
|
raise ValueError(
|
|
201
203
|
'Provided circuit has terminal measurements, which may '
|
|
@@ -204,7 +206,7 @@ class Simulator(
|
|
|
204
206
|
)
|
|
205
207
|
qubit_order = ops.QubitOrder.as_qubit_order(qubit_order)
|
|
206
208
|
qmap = {q: i for i, q in enumerate(qubit_order.order_for(program.all_qubits()))}
|
|
207
|
-
if not isinstance(observables,
|
|
209
|
+
if not isinstance(observables, list):
|
|
208
210
|
observables = [observables]
|
|
209
211
|
pslist = [ops.PauliSum.wrap(pslike) for pslike in observables]
|
|
210
212
|
yield from (
|
|
@@ -222,8 +224,8 @@ class SparseSimulatorStep(
|
|
|
222
224
|
|
|
223
225
|
def __init__(
|
|
224
226
|
self,
|
|
225
|
-
sim_state:
|
|
226
|
-
dtype:
|
|
227
|
+
sim_state: cirq.SimulationStateBase[cirq.StateVectorSimulationState],
|
|
228
|
+
dtype: type[np.complexfloating] = np.complex64,
|
|
227
229
|
):
|
|
228
230
|
"""Results of a step of the simulator.
|
|
229
231
|
|
|
@@ -235,7 +237,7 @@ class SparseSimulatorStep(
|
|
|
235
237
|
qubit_map = {q: i for i, q in enumerate(sim_state.qubits)}
|
|
236
238
|
super().__init__(sim_state=sim_state, qubit_map=qubit_map)
|
|
237
239
|
self._dtype = dtype
|
|
238
|
-
self._state_vector:
|
|
240
|
+
self._state_vector: np.ndarray | None = None
|
|
239
241
|
|
|
240
242
|
def state_vector(self, copy: bool = False):
|
|
241
243
|
"""Return the state vector at this point in the computation.
|