cirq-core 1.5.0.dev20250409225226__py3-none-any.whl → 1.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of cirq-core might be problematic. Click here for more details.
- cirq/__init__.py +16 -17
- cirq/_compat.py +21 -20
- cirq/_compat_test.py +14 -34
- cirq/_doc.py +4 -2
- cirq/_import.py +8 -6
- cirq/_import_test.py +4 -2
- cirq/_version.py +6 -6
- cirq/_version_test.py +2 -2
- cirq/circuits/_block_diagram_drawer.py +11 -10
- cirq/circuits/_block_diagram_drawer_test.py +8 -6
- cirq/circuits/_box_drawing_character_data.py +8 -8
- cirq/circuits/_box_drawing_character_data_test.py +3 -1
- cirq/circuits/_bucket_priority_queue.py +9 -7
- cirq/circuits/_bucket_priority_queue_test.py +22 -20
- cirq/circuits/circuit.py +248 -172
- cirq/circuits/circuit_operation.py +73 -83
- cirq/circuits/circuit_operation_test.py +128 -90
- cirq/circuits/circuit_test.py +211 -151
- cirq/circuits/frozen_circuit.py +23 -60
- cirq/circuits/frozen_circuit_test.py +31 -8
- cirq/circuits/insert_strategy.py +7 -5
- cirq/circuits/insert_strategy_test.py +4 -2
- cirq/circuits/moment.py +88 -40
- cirq/circuits/moment_test.py +128 -51
- cirq/circuits/optimization_pass.py +5 -5
- cirq/circuits/optimization_pass_test.py +10 -10
- cirq/circuits/qasm_output.py +11 -11
- cirq/circuits/qasm_output_test.py +25 -22
- cirq/circuits/text_diagram_drawer.py +23 -38
- cirq/circuits/text_diagram_drawer_test.py +19 -17
- cirq/conftest.py +4 -3
- cirq/contrib/__init__.py +4 -4
- cirq/contrib/acquaintance/__init__.py +1 -1
- cirq/contrib/acquaintance/bipartite.py +5 -8
- cirq/contrib/acquaintance/bipartite_test.py +18 -13
- cirq/contrib/acquaintance/devices.py +2 -2
- cirq/contrib/acquaintance/devices_test.py +5 -3
- cirq/contrib/acquaintance/executor.py +5 -5
- cirq/contrib/acquaintance/executor_test.py +13 -9
- cirq/contrib/acquaintance/gates.py +18 -28
- cirq/contrib/acquaintance/gates_test.py +24 -20
- cirq/contrib/acquaintance/inspection_utils.py +8 -4
- cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
- cirq/contrib/acquaintance/mutation_utils.py +4 -4
- cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
- cirq/contrib/acquaintance/optimizers.py +4 -4
- cirq/contrib/acquaintance/optimizers_test.py +4 -1
- cirq/contrib/acquaintance/permutation.py +15 -27
- cirq/contrib/acquaintance/permutation_test.py +26 -17
- cirq/contrib/acquaintance/shift.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
- cirq/contrib/acquaintance/shift_test.py +8 -6
- cirq/contrib/acquaintance/strategies/cubic.py +2 -2
- cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
- cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
- cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
- cirq/contrib/acquaintance/testing.py +2 -0
- cirq/contrib/acquaintance/topological_sort.py +2 -2
- cirq/contrib/acquaintance/topological_sort_test.py +3 -1
- cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
- cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
- cirq/contrib/circuitdag/circuit_dag.py +4 -4
- cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
- cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
- cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
- cirq/contrib/graph_device/graph_device.py +12 -11
- cirq/contrib/graph_device/graph_device_test.py +18 -14
- cirq/contrib/graph_device/hypergraph.py +16 -14
- cirq/contrib/graph_device/hypergraph_test.py +13 -11
- cirq/contrib/graph_device/uniform_graph_device.py +6 -4
- cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
- cirq/contrib/hacks/disable_validation.py +6 -1
- cirq/contrib/hacks/disable_validation_test.py +3 -1
- cirq/contrib/json.py +31 -5
- cirq/contrib/json_test.py +6 -3
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/__init__.py +17 -0
- cirq/contrib/json_test_data/spec.py +32 -0
- cirq/contrib/noise_models/noise_models.py +119 -5
- cirq/contrib/noise_models/noise_models_test.py +37 -9
- cirq/contrib/paulistring/clifford_optimize.py +6 -4
- cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
- cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
- cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
- cirq/contrib/paulistring/optimize.py +2 -0
- cirq/contrib/paulistring/optimize_test.py +4 -3
- cirq/contrib/paulistring/pauli_string_dag.py +2 -0
- cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
- cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
- cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
- cirq/contrib/paulistring/recombine.py +6 -4
- cirq/contrib/paulistring/recombine_test.py +3 -1
- cirq/contrib/paulistring/separate.py +9 -6
- cirq/contrib/paulistring/separate_test.py +3 -1
- cirq/contrib/qasm_import/_lexer.py +3 -2
- cirq/contrib/qasm_import/_lexer_test.py +49 -13
- cirq/contrib/qasm_import/_parser.py +547 -83
- cirq/contrib/qasm_import/_parser_test.py +988 -97
- cirq/contrib/qasm_import/exception.py +2 -0
- cirq/contrib/qasm_import/qasm.py +8 -2
- cirq/contrib/qasm_import/qasm_test.py +7 -4
- cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
- cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
- cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
- cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
- cirq/contrib/qcircuit/qcircuit_test.py +10 -8
- cirq/contrib/quantum_volume/quantum_volume.py +31 -27
- cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
- cirq/contrib/quimb/density_matrix.py +15 -14
- cirq/contrib/quimb/density_matrix_test.py +10 -7
- cirq/contrib/quimb/grid_circuits.py +5 -2
- cirq/contrib/quimb/grid_circuits_test.py +3 -0
- cirq/contrib/quimb/mps_simulator.py +20 -20
- cirq/contrib/quimb/mps_simulator_test.py +3 -0
- cirq/contrib/quimb/state_vector.py +12 -11
- cirq/contrib/quimb/state_vector_test.py +3 -0
- cirq/contrib/quirk/export_to_quirk.py +5 -3
- cirq/contrib/quirk/export_to_quirk_test.py +18 -16
- cirq/contrib/quirk/linearize_circuit.py +2 -0
- cirq/contrib/quirk/quirk_gate.py +18 -17
- cirq/contrib/routing/device.py +5 -3
- cirq/contrib/routing/device_test.py +2 -0
- cirq/contrib/routing/greedy.py +10 -21
- cirq/contrib/routing/greedy_test.py +4 -2
- cirq/contrib/routing/initialization.py +2 -2
- cirq/contrib/routing/initialization_test.py +5 -3
- cirq/contrib/routing/router.py +9 -5
- cirq/contrib/routing/router_test.py +2 -0
- cirq/contrib/routing/swap_network.py +3 -3
- cirq/contrib/routing/swap_network_test.py +3 -1
- cirq/contrib/routing/utils.py +2 -2
- cirq/contrib/routing/utils_test.py +3 -0
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
- cirq/contrib/svg/svg.py +3 -3
- cirq/contrib/svg/svg_test.py +8 -5
- cirq/devices/device.py +4 -4
- cirq/devices/device_test.py +7 -4
- cirq/devices/grid_device_metadata.py +10 -10
- cirq/devices/grid_device_metadata_test.py +3 -0
- cirq/devices/grid_qubit.py +29 -21
- cirq/devices/grid_qubit_test.py +3 -0
- cirq/devices/insertion_noise_model.py +7 -7
- cirq/devices/insertion_noise_model_test.py +7 -5
- cirq/devices/line_qubit.py +13 -13
- cirq/devices/line_qubit_test.py +2 -0
- cirq/devices/named_topologies.py +18 -29
- cirq/devices/named_topologies_test.py +13 -10
- cirq/devices/noise_model.py +3 -3
- cirq/devices/noise_model_test.py +19 -15
- cirq/devices/noise_properties.py +15 -6
- cirq/devices/noise_properties_test.py +34 -3
- cirq/devices/noise_utils.py +11 -9
- cirq/devices/noise_utils_test.py +2 -0
- cirq/devices/superconducting_qubits_noise_properties.py +23 -22
- cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
- cirq/devices/thermal_noise_model.py +107 -37
- cirq/devices/thermal_noise_model_test.py +21 -0
- cirq/devices/unconstrained_device.py +5 -3
- cirq/devices/unconstrained_device_test.py +2 -0
- cirq/experiments/__init__.py +4 -2
- cirq/experiments/benchmarking/__init__.py +17 -0
- cirq/experiments/benchmarking/parallel_xeb.py +677 -0
- cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
- cirq/experiments/fidelity_estimation.py +14 -8
- cirq/experiments/fidelity_estimation_test.py +3 -0
- cirq/experiments/n_qubit_tomography.py +17 -16
- cirq/experiments/n_qubit_tomography_test.py +8 -5
- cirq/experiments/purity_estimation.py +2 -0
- cirq/experiments/purity_estimation_test.py +2 -0
- cirq/experiments/qubit_characterizations.py +207 -103
- cirq/experiments/qubit_characterizations_test.py +40 -12
- cirq/experiments/random_quantum_circuit_generation.py +56 -70
- cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
- cirq/experiments/readout_confusion_matrix.py +24 -22
- cirq/experiments/readout_confusion_matrix_test.py +2 -0
- cirq/experiments/single_qubit_readout_calibration.py +30 -15
- cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
- cirq/experiments/t1_decay_experiment.py +9 -7
- cirq/experiments/t1_decay_experiment_test.py +13 -11
- cirq/experiments/t2_decay_experiment.py +16 -13
- cirq/experiments/t2_decay_experiment_test.py +2 -0
- cirq/experiments/two_qubit_xeb.py +64 -57
- cirq/experiments/two_qubit_xeb_test.py +10 -6
- cirq/experiments/xeb_fitting.py +39 -35
- cirq/experiments/xeb_sampling.py +37 -44
- cirq/experiments/xeb_sampling_test.py +3 -0
- cirq/experiments/xeb_simulation.py +14 -10
- cirq/experiments/xeb_simulation_test.py +5 -5
- cirq/experiments/z_phase_calibration.py +32 -29
- cirq/experiments/z_phase_calibration_test.py +3 -4
- cirq/interop/quirk/cells/__init__.py +1 -1
- cirq/interop/quirk/cells/all_cells.py +7 -2
- cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
- cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
- cirq/interop/quirk/cells/cell.py +19 -28
- cirq/interop/quirk/cells/cell_test.py +3 -0
- cirq/interop/quirk/cells/composite_cell.py +13 -28
- cirq/interop/quirk/cells/composite_cell_test.py +2 -0
- cirq/interop/quirk/cells/control_cells.py +15 -15
- cirq/interop/quirk/cells/control_cells_test.py +7 -5
- cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
- cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
- cirq/interop/quirk/cells/ignored_cells.py +3 -0
- cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
- cirq/interop/quirk/cells/input_cells.py +7 -5
- cirq/interop/quirk/cells/input_cells_test.py +7 -5
- cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
- cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
- cirq/interop/quirk/cells/measurement_cells.py +5 -2
- cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
- cirq/interop/quirk/cells/parse.py +22 -23
- cirq/interop/quirk/cells/parse_test.py +12 -10
- cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
- cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
- cirq/interop/quirk/cells/scalar_cells.py +4 -1
- cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
- cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
- cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
- cirq/interop/quirk/cells/swap_cell.py +8 -6
- cirq/interop/quirk/cells/swap_cell_test.py +6 -4
- cirq/interop/quirk/cells/testing.py +6 -6
- cirq/interop/quirk/cells/testing_test.py +8 -6
- cirq/interop/quirk/cells/unsupported_cells.py +3 -0
- cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
- cirq/interop/quirk/url_to_circuit.py +23 -36
- cirq/interop/quirk/url_to_circuit_test.py +4 -1
- cirq/json_resolver_cache.py +14 -12
- cirq/linalg/__init__.py +4 -6
- cirq/linalg/combinators.py +7 -5
- cirq/linalg/combinators_test.py +10 -7
- cirq/linalg/decompositions.py +24 -35
- cirq/linalg/decompositions_test.py +3 -1
- cirq/linalg/diagonalize.py +6 -4
- cirq/linalg/diagonalize_test.py +15 -14
- cirq/linalg/operator_spaces.py +14 -14
- cirq/linalg/operator_spaces_test.py +13 -11
- cirq/linalg/predicates.py +18 -9
- cirq/linalg/predicates_test.py +5 -0
- cirq/linalg/tolerance.py +6 -3
- cirq/linalg/tolerance_test.py +6 -4
- cirq/linalg/transformations.py +23 -20
- cirq/linalg/transformations_test.py +73 -43
- cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
- cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
- cirq/neutral_atoms/neutral_atom_devices.py +2 -0
- cirq/ops/__init__.py +2 -0
- cirq/ops/arithmetic_operation.py +21 -21
- cirq/ops/arithmetic_operation_test.py +7 -8
- cirq/ops/boolean_hamiltonian.py +23 -22
- cirq/ops/boolean_hamiltonian_test.py +12 -9
- cirq/ops/classically_controlled_operation.py +31 -36
- cirq/ops/classically_controlled_operation_test.py +121 -117
- cirq/ops/clifford_gate.py +98 -81
- cirq/ops/clifford_gate_test.py +72 -57
- cirq/ops/common_channels.py +44 -44
- cirq/ops/common_channels_test.py +83 -81
- cirq/ops/common_gate_families.py +9 -7
- cirq/ops/common_gate_families_test.py +11 -7
- cirq/ops/common_gates.py +164 -183
- cirq/ops/common_gates_test.py +135 -95
- cirq/ops/control_values.py +23 -26
- cirq/ops/control_values_test.py +22 -20
- cirq/ops/controlled_gate.py +64 -112
- cirq/ops/controlled_gate_test.py +130 -35
- cirq/ops/controlled_operation.py +24 -35
- cirq/ops/controlled_operation_test.py +8 -6
- cirq/ops/dense_pauli_string.py +38 -49
- cirq/ops/dense_pauli_string_test.py +4 -2
- cirq/ops/diagonal_gate.py +18 -31
- cirq/ops/diagonal_gate_test.py +13 -13
- cirq/ops/eigen_gate.py +29 -29
- cirq/ops/eigen_gate_test.py +45 -28
- cirq/ops/fourier_transform.py +14 -20
- cirq/ops/fourier_transform_test.py +15 -12
- cirq/ops/fsim_gate.py +43 -42
- cirq/ops/fsim_gate_test.py +29 -29
- cirq/ops/gate_features.py +2 -0
- cirq/ops/gate_features_test.py +5 -3
- cirq/ops/gate_operation.py +43 -65
- cirq/ops/gate_operation_test.py +46 -42
- cirq/ops/gateset.py +28 -40
- cirq/ops/gateset_test.py +4 -2
- cirq/ops/global_phase_op.py +45 -20
- cirq/ops/global_phase_op_test.py +44 -20
- cirq/ops/greedy_qubit_manager.py +10 -8
- cirq/ops/greedy_qubit_manager_test.py +5 -3
- cirq/ops/identity.py +14 -12
- cirq/ops/identity_test.py +24 -20
- cirq/ops/kraus_channel.py +11 -8
- cirq/ops/kraus_channel_test.py +14 -11
- cirq/ops/linear_combinations.py +65 -77
- cirq/ops/linear_combinations_test.py +14 -9
- cirq/ops/matrix_gates.py +21 -18
- cirq/ops/matrix_gates_test.py +16 -0
- cirq/ops/measure_util.py +15 -20
- cirq/ops/measure_util_test.py +2 -0
- cirq/ops/measurement_gate.py +26 -37
- cirq/ops/measurement_gate_test.py +2 -0
- cirq/ops/mixed_unitary_channel.py +12 -9
- cirq/ops/mixed_unitary_channel_test.py +14 -11
- cirq/ops/named_qubit.py +16 -13
- cirq/ops/named_qubit_test.py +15 -13
- cirq/ops/op_tree.py +9 -7
- cirq/ops/op_tree_test.py +22 -19
- cirq/ops/parallel_gate.py +15 -17
- cirq/ops/parallel_gate_test.py +18 -16
- cirq/ops/parity_gates.py +23 -25
- cirq/ops/parity_gates_test.py +36 -32
- cirq/ops/pauli_gates.py +22 -21
- cirq/ops/pauli_gates_test.py +29 -20
- cirq/ops/pauli_interaction_gate.py +15 -19
- cirq/ops/pauli_interaction_gate_test.py +10 -8
- cirq/ops/pauli_measurement_gate.py +23 -35
- cirq/ops/pauli_measurement_gate_test.py +2 -0
- cirq/ops/pauli_string.py +92 -120
- cirq/ops/pauli_string_phasor.py +52 -45
- cirq/ops/pauli_string_phasor_test.py +4 -5
- cirq/ops/pauli_string_raw_types.py +9 -7
- cirq/ops/pauli_string_raw_types_test.py +2 -0
- cirq/ops/pauli_string_test.py +31 -154
- cirq/ops/pauli_sum_exponential.py +12 -12
- cirq/ops/pauli_sum_exponential_test.py +12 -10
- cirq/ops/permutation_gate.py +8 -6
- cirq/ops/permutation_gate_test.py +10 -8
- cirq/ops/phased_iswap_gate.py +16 -16
- cirq/ops/phased_iswap_gate_test.py +17 -15
- cirq/ops/phased_x_gate.py +16 -17
- cirq/ops/phased_x_gate_test.py +18 -16
- cirq/ops/phased_x_z_gate.py +24 -22
- cirq/ops/phased_x_z_gate_test.py +17 -11
- cirq/ops/projector.py +16 -11
- cirq/ops/projector_test.py +19 -16
- cirq/ops/qid_util.py +7 -5
- cirq/ops/qid_util_test.py +2 -0
- cirq/ops/qubit_manager.py +11 -9
- cirq/ops/qubit_manager_test.py +6 -4
- cirq/ops/qubit_order.py +11 -14
- cirq/ops/qubit_order_or_list.py +4 -2
- cirq/ops/qubit_order_test.py +12 -10
- cirq/ops/random_gate_channel.py +12 -10
- cirq/ops/random_gate_channel_test.py +14 -11
- cirq/ops/raw_types.py +109 -129
- cirq/ops/raw_types_test.py +63 -57
- cirq/ops/state_preparation_channel.py +7 -7
- cirq/ops/state_preparation_channel_test.py +11 -9
- cirq/ops/swap_gates.py +13 -15
- cirq/ops/swap_gates_test.py +19 -17
- cirq/ops/tags.py +5 -3
- cirq/ops/tags_test.py +4 -2
- cirq/ops/three_qubit_gates.py +43 -76
- cirq/ops/three_qubit_gates_test.py +19 -17
- cirq/ops/two_qubit_diagonal_gate.py +13 -13
- cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
- cirq/ops/uniform_superposition_gate.py +5 -3
- cirq/ops/uniform_superposition_gate_test.py +5 -3
- cirq/ops/wait_gate.py +17 -14
- cirq/ops/wait_gate_test.py +9 -6
- cirq/protocols/__init__.py +0 -3
- cirq/protocols/act_on_protocol.py +8 -6
- cirq/protocols/act_on_protocol_test.py +15 -12
- cirq/protocols/apply_channel_protocol.py +10 -14
- cirq/protocols/apply_channel_protocol_test.py +2 -0
- cirq/protocols/apply_mixture_protocol.py +13 -42
- cirq/protocols/apply_mixture_protocol_test.py +7 -5
- cirq/protocols/apply_unitary_protocol.py +39 -34
- cirq/protocols/apply_unitary_protocol_test.py +4 -1
- cirq/protocols/approximate_equality_protocol.py +2 -0
- cirq/protocols/approximate_equality_protocol_test.py +2 -0
- cirq/protocols/circuit_diagram_info_protocol.py +58 -42
- cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
- cirq/protocols/commutes_protocol.py +8 -7
- cirq/protocols/commutes_protocol_test.py +2 -0
- cirq/protocols/control_key_protocol.py +6 -4
- cirq/protocols/control_key_protocol_test.py +3 -1
- cirq/protocols/decompose_protocol.py +49 -48
- cirq/protocols/decompose_protocol_test.py +27 -16
- cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
- cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
- cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
- cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
- cirq/protocols/has_unitary_protocol.py +10 -6
- cirq/protocols/has_unitary_protocol_test.py +13 -8
- cirq/protocols/hash_from_pickle_test.py +2 -11
- cirq/protocols/inverse_protocol.py +13 -16
- cirq/protocols/inverse_protocol_test.py +5 -3
- cirq/protocols/json_serialization.py +35 -54
- cirq/protocols/json_serialization_test.py +14 -21
- cirq/protocols/json_test_data/CXSWAP.json +46 -0
- cirq/protocols/json_test_data/CXSWAP.repr +13 -0
- cirq/protocols/json_test_data/CZSWAP.json +46 -0
- cirq/protocols/json_test_data/CZSWAP.repr +13 -0
- cirq/protocols/json_test_data/CircuitOperation.json +6 -3
- cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
- cirq/protocols/json_test_data/Moment.json +24 -1
- cirq/protocols/json_test_data/Moment.repr +6 -1
- cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
- cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
- cirq/protocols/json_test_data/spec.py +6 -2
- cirq/protocols/kraus_protocol.py +47 -7
- cirq/protocols/kraus_protocol_test.py +86 -12
- cirq/protocols/measurement_key_protocol.py +15 -16
- cirq/protocols/measurement_key_protocol_test.py +13 -11
- cirq/protocols/mixture_protocol.py +7 -5
- cirq/protocols/mixture_protocol_test.py +4 -2
- cirq/protocols/mul_protocol.py +2 -3
- cirq/protocols/mul_protocol_test.py +2 -0
- cirq/protocols/pauli_expansion_protocol.py +6 -3
- cirq/protocols/pauli_expansion_protocol_test.py +5 -3
- cirq/protocols/phase_protocol.py +2 -0
- cirq/protocols/phase_protocol_test.py +3 -1
- cirq/protocols/pow_protocol.py +11 -16
- cirq/protocols/pow_protocol_test.py +2 -0
- cirq/protocols/qasm.py +14 -20
- cirq/protocols/qasm_test.py +6 -3
- cirq/protocols/qid_shape_protocol.py +8 -8
- cirq/protocols/qid_shape_protocol_test.py +3 -1
- cirq/protocols/resolve_parameters.py +5 -3
- cirq/protocols/resolve_parameters_test.py +8 -7
- cirq/protocols/trace_distance_bound.py +6 -4
- cirq/protocols/trace_distance_bound_test.py +3 -1
- cirq/protocols/unitary_protocol.py +17 -7
- cirq/protocols/unitary_protocol_test.py +12 -2
- cirq/qis/channels.py +6 -2
- cirq/qis/channels_test.py +20 -16
- cirq/qis/clifford_tableau.py +21 -19
- cirq/qis/clifford_tableau_test.py +2 -2
- cirq/qis/entropy.py +14 -3
- cirq/qis/entropy_test.py +3 -1
- cirq/qis/measures.py +13 -13
- cirq/qis/measures_test.py +20 -14
- cirq/qis/noise_utils.py +2 -0
- cirq/qis/noise_utils_test.py +9 -7
- cirq/qis/quantum_state_representation.py +7 -8
- cirq/qis/states.py +58 -56
- cirq/qis/states_test.py +2 -0
- cirq/sim/classical_simulator.py +23 -22
- cirq/sim/classical_simulator_test.py +2 -0
- cirq/sim/clifford/clifford_simulator.py +23 -21
- cirq/sim/clifford/clifford_simulator_test.py +7 -4
- cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
- cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
- cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
- cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
- cirq/sim/clifford/stabilizer_sampler.py +9 -7
- cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
- cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
- cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
- cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
- cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
- cirq/sim/density_matrix_simulation_state.py +26 -27
- cirq/sim/density_matrix_simulation_state_test.py +10 -8
- cirq/sim/density_matrix_simulator.py +30 -28
- cirq/sim/density_matrix_simulator_test.py +48 -48
- cirq/sim/density_matrix_utils.py +13 -11
- cirq/sim/density_matrix_utils_test.py +38 -36
- cirq/sim/mux.py +33 -31
- cirq/sim/mux_test.py +3 -0
- cirq/sim/simulation_product_state.py +15 -15
- cirq/sim/simulation_product_state_test.py +29 -26
- cirq/sim/simulation_state.py +29 -38
- cirq/sim/simulation_state_base.py +21 -32
- cirq/sim/simulation_state_test.py +15 -13
- cirq/sim/simulation_utils.py +5 -2
- cirq/sim/simulation_utils_test.py +5 -2
- cirq/sim/simulator.py +90 -106
- cirq/sim/simulator_base.py +33 -45
- cirq/sim/simulator_base_test.py +20 -15
- cirq/sim/simulator_test.py +23 -14
- cirq/sim/sparse_simulator.py +19 -17
- cirq/sim/sparse_simulator_test.py +41 -40
- cirq/sim/state_vector.py +15 -12
- cirq/sim/state_vector_simulation_state.py +31 -31
- cirq/sim/state_vector_simulation_state_test.py +16 -14
- cirq/sim/state_vector_simulator.py +17 -14
- cirq/sim/state_vector_simulator_test.py +2 -0
- cirq/sim/state_vector_test.py +6 -3
- cirq/study/flatten_expressions.py +16 -15
- cirq/study/flatten_expressions_test.py +13 -11
- cirq/study/resolver.py +18 -17
- cirq/study/resolver_test.py +22 -20
- cirq/study/result.py +17 -27
- cirq/study/result_test.py +2 -0
- cirq/study/sweepable.py +12 -10
- cirq/study/sweepable_test.py +3 -0
- cirq/study/sweeps.py +42 -61
- cirq/study/sweeps_test.py +33 -0
- cirq/testing/__init__.py +7 -11
- cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
- cirq/testing/circuit_compare.py +8 -17
- cirq/testing/circuit_compare_test.py +2 -0
- cirq/testing/consistent_act_on.py +13 -11
- cirq/testing/consistent_act_on_test.py +5 -3
- cirq/testing/consistent_channels.py +2 -0
- cirq/testing/consistent_channels_test.py +10 -8
- cirq/testing/consistent_controlled_gate_op.py +5 -5
- cirq/testing/consistent_controlled_gate_op_test.py +18 -18
- cirq/testing/consistent_decomposition.py +2 -2
- cirq/testing/consistent_decomposition_test.py +4 -2
- cirq/testing/consistent_pauli_expansion.py +2 -0
- cirq/testing/consistent_pauli_expansion_test.py +3 -1
- cirq/testing/consistent_phase_by.py +2 -0
- cirq/testing/consistent_phase_by_test.py +3 -1
- cirq/testing/consistent_protocols.py +14 -20
- cirq/testing/consistent_protocols_test.py +13 -11
- cirq/testing/consistent_qasm.py +6 -4
- cirq/testing/consistent_qasm_test.py +7 -7
- cirq/testing/consistent_resolve_parameters.py +2 -0
- cirq/testing/consistent_specified_has_unitary.py +2 -2
- cirq/testing/consistent_specified_has_unitary_test.py +6 -4
- cirq/testing/consistent_unitary.py +1 -0
- cirq/testing/consistent_unitary_test.py +4 -2
- cirq/testing/deprecation.py +5 -2
- cirq/testing/deprecation_test.py +5 -2
- cirq/testing/devices.py +7 -4
- cirq/testing/devices_test.py +7 -4
- cirq/testing/equals_tester.py +4 -2
- cirq/testing/equals_tester_test.py +21 -17
- cirq/testing/equivalent_basis_map.py +6 -4
- cirq/testing/equivalent_basis_map_test.py +6 -4
- cirq/testing/equivalent_repr_eval.py +6 -4
- cirq/testing/equivalent_repr_eval_test.py +5 -3
- cirq/testing/gate_features.py +2 -0
- cirq/testing/gate_features_test.py +7 -5
- cirq/testing/json.py +19 -15
- cirq/testing/json_test.py +5 -3
- cirq/testing/lin_alg_utils.py +10 -11
- cirq/testing/lin_alg_utils_test.py +14 -12
- cirq/testing/logs.py +7 -6
- cirq/testing/logs_test.py +9 -7
- cirq/testing/no_identifier_qubit.py +4 -2
- cirq/testing/no_identifier_qubit_test.py +5 -3
- cirq/testing/op_tree.py +2 -0
- cirq/testing/op_tree_test.py +4 -1
- cirq/testing/order_tester.py +2 -0
- cirq/testing/order_tester_test.py +8 -6
- cirq/testing/pytest_utils.py +2 -0
- cirq/testing/pytest_utils_test.py +4 -2
- cirq/testing/random_circuit.py +21 -20
- cirq/testing/random_circuit_test.py +12 -9
- cirq/testing/repr_pretty_tester.py +1 -0
- cirq/testing/repr_pretty_tester_test.py +5 -3
- cirq/testing/routing_devices.py +4 -1
- cirq/testing/routing_devices_test.py +9 -6
- cirq/testing/sample_circuits.py +4 -1
- cirq/testing/sample_circuits_test.py +3 -1
- cirq/testing/sample_gates.py +3 -0
- cirq/testing/sample_gates_test.py +5 -2
- cirq/transformers/__init__.py +11 -4
- cirq/transformers/align.py +9 -7
- cirq/transformers/align_test.py +2 -0
- cirq/transformers/analytical_decompositions/__init__.py +3 -6
- cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
- cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
- cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
- cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
- cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
- cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
- cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
- cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
- cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
- cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
- cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
- cirq/transformers/drop_empty_moments.py +5 -3
- cirq/transformers/drop_empty_moments_test.py +4 -2
- cirq/transformers/drop_negligible_operations.py +7 -5
- cirq/transformers/drop_negligible_operations_test.py +2 -0
- cirq/transformers/dynamical_decoupling.py +49 -42
- cirq/transformers/dynamical_decoupling_test.py +223 -205
- cirq/transformers/eject_phased_paulis.py +28 -26
- cirq/transformers/eject_phased_paulis_test.py +12 -9
- cirq/transformers/eject_z.py +12 -12
- cirq/transformers/eject_z_test.py +2 -2
- cirq/transformers/expand_composite.py +6 -4
- cirq/transformers/expand_composite_test.py +3 -1
- cirq/transformers/gauge_compiling/__init__.py +3 -1
- cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
- cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
- cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
- cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
- cirq/transformers/insertion_sort.py +8 -6
- cirq/transformers/insertion_sort_test.py +3 -1
- cirq/transformers/measurement_transformers.py +29 -29
- cirq/transformers/measurement_transformers_test.py +2 -0
- cirq/transformers/merge_k_qubit_gates.py +12 -10
- cirq/transformers/merge_k_qubit_gates_test.py +18 -18
- cirq/transformers/merge_single_qubit_gates.py +197 -20
- cirq/transformers/merge_single_qubit_gates_test.py +177 -5
- cirq/transformers/noise_adding.py +5 -3
- cirq/transformers/noise_adding_test.py +2 -0
- cirq/transformers/optimize_for_target_gateset.py +19 -17
- cirq/transformers/optimize_for_target_gateset_test.py +11 -8
- cirq/transformers/qubit_management_transformers.py +13 -11
- cirq/transformers/qubit_management_transformers_test.py +5 -3
- cirq/transformers/randomized_measurements.py +16 -14
- cirq/transformers/randomized_measurements_test.py +10 -4
- cirq/transformers/routing/initial_mapper.py +6 -4
- cirq/transformers/routing/initial_mapper_test.py +2 -0
- cirq/transformers/routing/line_initial_mapper.py +16 -14
- cirq/transformers/routing/line_initial_mapper_test.py +9 -7
- cirq/transformers/routing/mapping_manager.py +10 -10
- cirq/transformers/routing/mapping_manager_test.py +2 -0
- cirq/transformers/routing/route_circuit_cqc.py +33 -31
- cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
- cirq/transformers/routing/visualize_routed_circuit.py +8 -7
- cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
- cirq/transformers/stratify.py +17 -15
- cirq/transformers/stratify_test.py +3 -0
- cirq/transformers/symbolize.py +103 -0
- cirq/transformers/symbolize_test.py +62 -0
- cirq/transformers/synchronize_terminal_measurements.py +10 -10
- cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
- cirq/transformers/tag_transformers.py +97 -0
- cirq/transformers/tag_transformers_test.py +103 -0
- cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
- cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
- cirq/transformers/target_gatesets/cz_gateset.py +7 -5
- cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
- cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
- cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
- cirq/transformers/transformer_api.py +34 -47
- cirq/transformers/transformer_api_test.py +9 -8
- cirq/transformers/transformer_primitives.py +39 -49
- cirq/transformers/transformer_primitives_test.py +10 -17
- cirq/value/abc_alt.py +6 -4
- cirq/value/abc_alt_test.py +5 -3
- cirq/value/angle.py +11 -12
- cirq/value/angle_test.py +5 -3
- cirq/value/classical_data.py +27 -27
- cirq/value/classical_data_test.py +11 -8
- cirq/value/condition.py +26 -24
- cirq/value/condition_test.py +2 -0
- cirq/value/digits.py +14 -11
- cirq/value/digits_test.py +2 -0
- cirq/value/duration.py +23 -20
- cirq/value/duration_test.py +2 -0
- cirq/value/linear_dict.py +25 -30
- cirq/value/linear_dict_test.py +10 -8
- cirq/value/measurement_key.py +12 -12
- cirq/value/measurement_key_test.py +2 -0
- cirq/value/periodic_value.py +4 -4
- cirq/value/periodic_value_test.py +11 -7
- cirq/value/probability.py +3 -1
- cirq/value/probability_test.py +4 -2
- cirq/value/product_state.py +15 -13
- cirq/value/product_state_test.py +4 -1
- cirq/value/random_state.py +2 -0
- cirq/value/random_state_test.py +5 -3
- cirq/value/timestamp.py +11 -7
- cirq/value/timestamp_test.py +14 -12
- cirq/value/type_alias.py +4 -4
- cirq/value/value_equality_attr.py +8 -9
- cirq/value/value_equality_attr_test.py +14 -11
- cirq/vis/density_matrix.py +3 -3
- cirq/vis/density_matrix_test.py +20 -17
- cirq/vis/heatmap.py +24 -37
- cirq/vis/heatmap_test.py +3 -0
- cirq/vis/histogram.py +9 -6
- cirq/vis/histogram_test.py +5 -2
- cirq/vis/state_histogram.py +10 -8
- cirq/vis/state_histogram_test.py +7 -5
- cirq/vis/vis_utils.py +4 -1
- cirq/vis/vis_utils_test.py +4 -1
- cirq/work/collector.py +12 -18
- cirq/work/collector_test.py +15 -10
- cirq/work/observable_grouping.py +6 -7
- cirq/work/observable_grouping_test.py +10 -9
- cirq/work/observable_measurement.py +47 -45
- cirq/work/observable_measurement_data.py +22 -17
- cirq/work/observable_measurement_data_test.py +4 -1
- cirq/work/observable_measurement_test.py +48 -29
- cirq/work/observable_readout_calibration.py +5 -2
- cirq/work/observable_readout_calibration_test.py +5 -2
- cirq/work/observable_settings.py +13 -22
- cirq/work/observable_settings_test.py +9 -7
- cirq/work/pauli_sum_collector.py +12 -10
- cirq/work/pauli_sum_collector_test.py +9 -9
- cirq/work/sampler.py +42 -43
- cirq/work/sampler_test.py +31 -24
- cirq/work/zeros_sampler.py +6 -4
- cirq/work/zeros_sampler_test.py +7 -5
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
- cirq_core-1.6.0.dist-info/RECORD +1241 -0
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
- cirq_core-1.5.0.dev20250409225226.dist-info/RECORD +0 -1216
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
|
@@ -11,9 +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 itertools
|
|
15
18
|
import random
|
|
16
|
-
from typing import Type, Union
|
|
17
19
|
from unittest import mock
|
|
18
20
|
|
|
19
21
|
import numpy as np
|
|
@@ -30,7 +32,7 @@ def test_invalid_dtype():
|
|
|
30
32
|
|
|
31
33
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
32
34
|
@pytest.mark.parametrize('split', [True, False])
|
|
33
|
-
def test_run_no_measurements(dtype:
|
|
35
|
+
def test_run_no_measurements(dtype: type[np.complexfloating], split: bool):
|
|
34
36
|
q0, q1 = cirq.LineQubit.range(2)
|
|
35
37
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
36
38
|
|
|
@@ -41,7 +43,7 @@ def test_run_no_measurements(dtype: Type[np.complexfloating], split: bool):
|
|
|
41
43
|
|
|
42
44
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
43
45
|
@pytest.mark.parametrize('split', [True, False])
|
|
44
|
-
def test_run_no_results(dtype:
|
|
46
|
+
def test_run_no_results(dtype: type[np.complexfloating], split: bool):
|
|
45
47
|
q0, q1 = cirq.LineQubit.range(2)
|
|
46
48
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
47
49
|
|
|
@@ -52,7 +54,7 @@ def test_run_no_results(dtype: Type[np.complexfloating], split: bool):
|
|
|
52
54
|
|
|
53
55
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
54
56
|
@pytest.mark.parametrize('split', [True, False])
|
|
55
|
-
def test_run_empty_circuit(dtype:
|
|
57
|
+
def test_run_empty_circuit(dtype: type[np.complexfloating], split: bool):
|
|
56
58
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
57
59
|
with pytest.raises(ValueError, match="no measurements"):
|
|
58
60
|
simulator.run(cirq.Circuit())
|
|
@@ -60,7 +62,7 @@ def test_run_empty_circuit(dtype: Type[np.complexfloating], split: bool):
|
|
|
60
62
|
|
|
61
63
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
62
64
|
@pytest.mark.parametrize('split', [True, False])
|
|
63
|
-
def test_run_reset(dtype:
|
|
65
|
+
def test_run_reset(dtype: type[np.complexfloating], split: bool):
|
|
64
66
|
q0, q1 = cirq.LineQid.for_qid_shape((2, 3))
|
|
65
67
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
66
68
|
circuit = cirq.Circuit(
|
|
@@ -80,7 +82,7 @@ def test_run_reset(dtype: Type[np.complexfloating], split: bool):
|
|
|
80
82
|
|
|
81
83
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
82
84
|
@pytest.mark.parametrize('split', [True, False])
|
|
83
|
-
def test_run_bit_flips(dtype:
|
|
85
|
+
def test_run_bit_flips(dtype: type[np.complexfloating], split: bool):
|
|
84
86
|
q0, q1 = cirq.LineQubit.range(2)
|
|
85
87
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
86
88
|
for b0 in [0, 1]:
|
|
@@ -94,7 +96,7 @@ def test_run_bit_flips(dtype: Type[np.complexfloating], split: bool):
|
|
|
94
96
|
|
|
95
97
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
96
98
|
@pytest.mark.parametrize('split', [True, False])
|
|
97
|
-
def test_run_measure_at_end_no_repetitions(dtype:
|
|
99
|
+
def test_run_measure_at_end_no_repetitions(dtype: type[np.complexfloating], split: bool):
|
|
98
100
|
q0, q1 = cirq.LineQubit.range(2)
|
|
99
101
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
100
102
|
with mock.patch.object(simulator, '_core_iterator', wraps=simulator._core_iterator) as mock_sim:
|
|
@@ -120,7 +122,7 @@ def test_run_repetitions_terminal_measurement_stochastic():
|
|
|
120
122
|
|
|
121
123
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
122
124
|
@pytest.mark.parametrize('split', [True, False])
|
|
123
|
-
def test_run_repetitions_measure_at_end(dtype:
|
|
125
|
+
def test_run_repetitions_measure_at_end(dtype: type[np.complexfloating], split: bool):
|
|
124
126
|
q0, q1 = cirq.LineQubit.range(2)
|
|
125
127
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
126
128
|
with mock.patch.object(simulator, '_core_iterator', wraps=simulator._core_iterator) as mock_sim:
|
|
@@ -140,7 +142,7 @@ def test_run_repetitions_measure_at_end(dtype: Type[np.complexfloating], split:
|
|
|
140
142
|
|
|
141
143
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
142
144
|
@pytest.mark.parametrize('split', [True, False])
|
|
143
|
-
def test_run_invert_mask_measure_not_terminal(dtype:
|
|
145
|
+
def test_run_invert_mask_measure_not_terminal(dtype: type[np.complexfloating], split: bool):
|
|
144
146
|
q0, q1 = cirq.LineQubit.range(2)
|
|
145
147
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
146
148
|
with mock.patch.object(simulator, '_core_iterator', wraps=simulator._core_iterator) as mock_sim:
|
|
@@ -161,7 +163,7 @@ def test_run_invert_mask_measure_not_terminal(dtype: Type[np.complexfloating], s
|
|
|
161
163
|
|
|
162
164
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
163
165
|
@pytest.mark.parametrize('split', [True, False])
|
|
164
|
-
def test_run_partial_invert_mask_measure_not_terminal(dtype:
|
|
166
|
+
def test_run_partial_invert_mask_measure_not_terminal(dtype: type[np.complexfloating], split: bool):
|
|
165
167
|
q0, q1 = cirq.LineQubit.range(2)
|
|
166
168
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
167
169
|
with mock.patch.object(simulator, '_core_iterator', wraps=simulator._core_iterator) as mock_sim:
|
|
@@ -182,7 +184,7 @@ def test_run_partial_invert_mask_measure_not_terminal(dtype: Type[np.complexfloa
|
|
|
182
184
|
|
|
183
185
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
184
186
|
@pytest.mark.parametrize('split', [True, False])
|
|
185
|
-
def test_run_measurement_not_terminal_no_repetitions(dtype:
|
|
187
|
+
def test_run_measurement_not_terminal_no_repetitions(dtype: type[np.complexfloating], split: bool):
|
|
186
188
|
q0, q1 = cirq.LineQubit.range(2)
|
|
187
189
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
188
190
|
with mock.patch.object(simulator, '_core_iterator', wraps=simulator._core_iterator) as mock_sim:
|
|
@@ -206,7 +208,7 @@ def test_run_measurement_not_terminal_no_repetitions(dtype: Type[np.complexfloat
|
|
|
206
208
|
|
|
207
209
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
208
210
|
@pytest.mark.parametrize('split', [True, False])
|
|
209
|
-
def test_run_repetitions_measurement_not_terminal(dtype:
|
|
211
|
+
def test_run_repetitions_measurement_not_terminal(dtype: type[np.complexfloating], split: bool):
|
|
210
212
|
q0, q1 = cirq.LineQubit.range(2)
|
|
211
213
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
212
214
|
with mock.patch.object(simulator, '_core_iterator', wraps=simulator._core_iterator) as mock_sim:
|
|
@@ -231,7 +233,7 @@ def test_run_repetitions_measurement_not_terminal(dtype: Type[np.complexfloating
|
|
|
231
233
|
|
|
232
234
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
233
235
|
@pytest.mark.parametrize('split', [True, False])
|
|
234
|
-
def test_run_param_resolver(dtype:
|
|
236
|
+
def test_run_param_resolver(dtype: type[np.complexfloating], split: bool):
|
|
235
237
|
q0, q1 = cirq.LineQubit.range(2)
|
|
236
238
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
237
239
|
for b0 in [0, 1]:
|
|
@@ -250,7 +252,7 @@ def test_run_param_resolver(dtype: Type[np.complexfloating], split: bool):
|
|
|
250
252
|
|
|
251
253
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
252
254
|
@pytest.mark.parametrize('split', [True, False])
|
|
253
|
-
def test_run_mixture(dtype:
|
|
255
|
+
def test_run_mixture(dtype: type[np.complexfloating], split: bool):
|
|
254
256
|
q0 = cirq.LineQubit(0)
|
|
255
257
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
256
258
|
circuit = cirq.Circuit(cirq.bit_flip(0.5)(q0), cirq.measure(q0))
|
|
@@ -260,7 +262,7 @@ def test_run_mixture(dtype: Type[np.complexfloating], split: bool):
|
|
|
260
262
|
|
|
261
263
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
262
264
|
@pytest.mark.parametrize('split', [True, False])
|
|
263
|
-
def test_run_mixture_with_gates(dtype:
|
|
265
|
+
def test_run_mixture_with_gates(dtype: type[np.complexfloating], split: bool):
|
|
264
266
|
q0 = cirq.LineQubit(0)
|
|
265
267
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split, seed=23)
|
|
266
268
|
circuit = cirq.Circuit(cirq.H(q0), cirq.phase_flip(0.5)(q0), cirq.H(q0), cirq.measure(q0))
|
|
@@ -271,7 +273,7 @@ def test_run_mixture_with_gates(dtype: Type[np.complexfloating], split: bool):
|
|
|
271
273
|
|
|
272
274
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
273
275
|
@pytest.mark.parametrize('split', [True, False])
|
|
274
|
-
def test_run_correlations(dtype:
|
|
276
|
+
def test_run_correlations(dtype: type[np.complexfloating], split: bool):
|
|
275
277
|
q0, q1 = cirq.LineQubit.range(2)
|
|
276
278
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
277
279
|
circuit = cirq.Circuit(cirq.H(q0), cirq.CNOT(q0, q1), cirq.measure(q0, q1))
|
|
@@ -283,7 +285,7 @@ def test_run_correlations(dtype: Type[np.complexfloating], split: bool):
|
|
|
283
285
|
|
|
284
286
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
285
287
|
@pytest.mark.parametrize('split', [True, False])
|
|
286
|
-
def test_run_measure_multiple_qubits(dtype:
|
|
288
|
+
def test_run_measure_multiple_qubits(dtype: type[np.complexfloating], split: bool):
|
|
287
289
|
q0, q1 = cirq.LineQubit.range(2)
|
|
288
290
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
289
291
|
for b0 in [0, 1]:
|
|
@@ -295,7 +297,7 @@ def test_run_measure_multiple_qubits(dtype: Type[np.complexfloating], split: boo
|
|
|
295
297
|
|
|
296
298
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
297
299
|
@pytest.mark.parametrize('split', [True, False])
|
|
298
|
-
def test_run_sweeps_param_resolvers(dtype:
|
|
300
|
+
def test_run_sweeps_param_resolvers(dtype: type[np.complexfloating], split: bool):
|
|
299
301
|
q0, q1 = cirq.LineQubit.range(2)
|
|
300
302
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
301
303
|
for b0 in [0, 1]:
|
|
@@ -321,7 +323,7 @@ def test_run_sweeps_param_resolvers(dtype: Type[np.complexfloating], split: bool
|
|
|
321
323
|
|
|
322
324
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
323
325
|
@pytest.mark.parametrize('split', [True, False])
|
|
324
|
-
def test_simulate_random_unitary(dtype:
|
|
326
|
+
def test_simulate_random_unitary(dtype: type[np.complexfloating], split: bool):
|
|
325
327
|
q0, q1 = cirq.LineQubit.range(2)
|
|
326
328
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
327
329
|
for _ in range(10):
|
|
@@ -339,7 +341,7 @@ def test_simulate_random_unitary(dtype: Type[np.complexfloating], split: bool):
|
|
|
339
341
|
|
|
340
342
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
341
343
|
@pytest.mark.parametrize('split', [True, False])
|
|
342
|
-
def test_simulate_no_circuit(dtype:
|
|
344
|
+
def test_simulate_no_circuit(dtype: type[np.complexfloating], split: bool):
|
|
343
345
|
q0, q1 = cirq.LineQubit.range(2)
|
|
344
346
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
345
347
|
circuit = cirq.Circuit()
|
|
@@ -350,7 +352,7 @@ def test_simulate_no_circuit(dtype: Type[np.complexfloating], split: bool):
|
|
|
350
352
|
|
|
351
353
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
352
354
|
@pytest.mark.parametrize('split', [True, False])
|
|
353
|
-
def test_simulate(dtype:
|
|
355
|
+
def test_simulate(dtype: type[np.complexfloating], split: bool):
|
|
354
356
|
q0, q1 = cirq.LineQubit.range(2)
|
|
355
357
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
356
358
|
circuit = cirq.Circuit(cirq.H(q0), cirq.H(q1))
|
|
@@ -372,7 +374,7 @@ class _TestMixture(cirq.Gate):
|
|
|
372
374
|
|
|
373
375
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
374
376
|
@pytest.mark.parametrize('split', [True, False])
|
|
375
|
-
def test_simulate_qudits(dtype:
|
|
377
|
+
def test_simulate_qudits(dtype: type[np.complexfloating], split: bool):
|
|
376
378
|
q0, q1 = cirq.LineQid.for_qid_shape((3, 4))
|
|
377
379
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
378
380
|
circuit = cirq.Circuit(cirq.XPowGate(dimension=3)(q0), cirq.XPowGate(dimension=4)(q1) ** 3)
|
|
@@ -385,7 +387,7 @@ def test_simulate_qudits(dtype: Type[np.complexfloating], split: bool):
|
|
|
385
387
|
|
|
386
388
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
387
389
|
@pytest.mark.parametrize('split', [True, False])
|
|
388
|
-
def test_simulate_mixtures(dtype:
|
|
390
|
+
def test_simulate_mixtures(dtype: type[np.complexfloating], split: bool):
|
|
389
391
|
q0 = cirq.LineQubit(0)
|
|
390
392
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
391
393
|
circuit = cirq.Circuit(cirq.bit_flip(0.5)(q0), cirq.measure(q0))
|
|
@@ -403,7 +405,7 @@ def test_simulate_mixtures(dtype: Type[np.complexfloating], split: bool):
|
|
|
403
405
|
@pytest.mark.parametrize(
|
|
404
406
|
'dtype, split', itertools.product([np.complex64, np.complex128], [True, False])
|
|
405
407
|
)
|
|
406
|
-
def test_simulate_qudit_mixtures(dtype:
|
|
408
|
+
def test_simulate_qudit_mixtures(dtype: type[np.complexfloating], split: bool):
|
|
407
409
|
q0 = cirq.LineQid(0, 3)
|
|
408
410
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
409
411
|
mixture = _TestMixture(
|
|
@@ -429,7 +431,7 @@ def test_simulate_qudit_mixtures(dtype: Type[np.complexfloating], split: bool):
|
|
|
429
431
|
|
|
430
432
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
431
433
|
@pytest.mark.parametrize('split', [True, False])
|
|
432
|
-
def test_simulate_bit_flips(dtype:
|
|
434
|
+
def test_simulate_bit_flips(dtype: type[np.complexfloating], split: bool):
|
|
433
435
|
q0, q1 = cirq.LineQubit.range(2)
|
|
434
436
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
435
437
|
for b0 in [0, 1]:
|
|
@@ -451,9 +453,9 @@ def test_simulate_bit_flips(dtype: Type[np.complexfloating], split: bool):
|
|
|
451
453
|
[1, cirq.StateVectorSimulationState(initial_state=1, qubits=cirq.LineQubit.range(2))],
|
|
452
454
|
)
|
|
453
455
|
def test_simulate_initial_state(
|
|
454
|
-
dtype:
|
|
456
|
+
dtype: type[np.complexfloating],
|
|
455
457
|
split: bool,
|
|
456
|
-
initial_state:
|
|
458
|
+
initial_state: int | cirq.StateVectorSimulationState,
|
|
457
459
|
):
|
|
458
460
|
q0, q1 = cirq.LineQubit.range(2)
|
|
459
461
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
@@ -468,7 +470,7 @@ def test_simulate_initial_state(
|
|
|
468
470
|
|
|
469
471
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
470
472
|
@pytest.mark.parametrize('split', [True, False])
|
|
471
|
-
def test_simulation_state(dtype:
|
|
473
|
+
def test_simulation_state(dtype: type[np.complexfloating], split: bool):
|
|
472
474
|
q0, q1 = cirq.LineQubit.range(2)
|
|
473
475
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
474
476
|
for b0 in [0, 1]:
|
|
@@ -483,7 +485,7 @@ def test_simulation_state(dtype: Type[np.complexfloating], split: bool):
|
|
|
483
485
|
|
|
484
486
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
485
487
|
@pytest.mark.parametrize('split', [True, False])
|
|
486
|
-
def test_simulate_qubit_order(dtype:
|
|
488
|
+
def test_simulate_qubit_order(dtype: type[np.complexfloating], split: bool):
|
|
487
489
|
q0, q1 = cirq.LineQubit.range(2)
|
|
488
490
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
489
491
|
for b0 in [0, 1]:
|
|
@@ -497,7 +499,7 @@ def test_simulate_qubit_order(dtype: Type[np.complexfloating], split: bool):
|
|
|
497
499
|
|
|
498
500
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
499
501
|
@pytest.mark.parametrize('split', [True, False])
|
|
500
|
-
def test_simulate_param_resolver(dtype:
|
|
502
|
+
def test_simulate_param_resolver(dtype: type[np.complexfloating], split: bool):
|
|
501
503
|
q0, q1 = cirq.LineQubit.range(2)
|
|
502
504
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
503
505
|
for b0 in [0, 1]:
|
|
@@ -516,7 +518,7 @@ def test_simulate_param_resolver(dtype: Type[np.complexfloating], split: bool):
|
|
|
516
518
|
|
|
517
519
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
518
520
|
@pytest.mark.parametrize('split', [True, False])
|
|
519
|
-
def test_simulate_measure_multiple_qubits(dtype:
|
|
521
|
+
def test_simulate_measure_multiple_qubits(dtype: type[np.complexfloating], split: bool):
|
|
520
522
|
q0, q1 = cirq.LineQubit.range(2)
|
|
521
523
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
522
524
|
for b0 in [0, 1]:
|
|
@@ -528,7 +530,7 @@ def test_simulate_measure_multiple_qubits(dtype: Type[np.complexfloating], split
|
|
|
528
530
|
|
|
529
531
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
530
532
|
@pytest.mark.parametrize('split', [True, False])
|
|
531
|
-
def test_simulate_sweeps_param_resolver(dtype:
|
|
533
|
+
def test_simulate_sweeps_param_resolver(dtype: type[np.complexfloating], split: bool):
|
|
532
534
|
q0, q1 = cirq.LineQubit.range(2)
|
|
533
535
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
534
536
|
for b0 in [0, 1]:
|
|
@@ -555,7 +557,7 @@ def test_simulate_sweeps_param_resolver(dtype: Type[np.complexfloating], split:
|
|
|
555
557
|
|
|
556
558
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
557
559
|
@pytest.mark.parametrize('split', [True, False])
|
|
558
|
-
def test_simulate_moment_steps(dtype:
|
|
560
|
+
def test_simulate_moment_steps(dtype: type[np.complexfloating], split: bool):
|
|
559
561
|
q0, q1 = cirq.LineQubit.range(2)
|
|
560
562
|
circuit = cirq.Circuit(cirq.H(q0), cirq.H(q1), cirq.H(q0), cirq.H(q1))
|
|
561
563
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
@@ -568,10 +570,9 @@ def test_simulate_moment_steps(dtype: Type[np.complexfloating], split: bool):
|
|
|
568
570
|
|
|
569
571
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
570
572
|
@pytest.mark.parametrize('split', [True, False])
|
|
571
|
-
def test_simulate_moment_steps_empty_circuit(dtype:
|
|
573
|
+
def test_simulate_moment_steps_empty_circuit(dtype: type[np.complexfloating], split: bool):
|
|
572
574
|
circuit = cirq.Circuit()
|
|
573
575
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
574
|
-
step = None
|
|
575
576
|
for step in simulator.simulate_moment_steps(circuit):
|
|
576
577
|
pass
|
|
577
578
|
assert np.allclose(step.state_vector(copy=True), np.array([1]))
|
|
@@ -580,7 +581,7 @@ def test_simulate_moment_steps_empty_circuit(dtype: Type[np.complexfloating], sp
|
|
|
580
581
|
|
|
581
582
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
582
583
|
@pytest.mark.parametrize('split', [True, False])
|
|
583
|
-
def test_simulate_moment_steps_sample(dtype:
|
|
584
|
+
def test_simulate_moment_steps_sample(dtype: type[np.complexfloating], split: bool):
|
|
584
585
|
q0, q1 = cirq.LineQubit.range(2)
|
|
585
586
|
circuit = cirq.Circuit(cirq.H(q0), cirq.CNOT(q0, q1))
|
|
586
587
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
@@ -602,7 +603,7 @@ def test_simulate_moment_steps_sample(dtype: Type[np.complexfloating], split: bo
|
|
|
602
603
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
603
604
|
@pytest.mark.parametrize('split', [True, False])
|
|
604
605
|
def test_simulate_moment_steps_intermediate_measurement(
|
|
605
|
-
dtype:
|
|
606
|
+
dtype: type[np.complexfloating], split: bool
|
|
606
607
|
):
|
|
607
608
|
q0 = cirq.LineQubit(0)
|
|
608
609
|
circuit = cirq.Circuit(cirq.H(q0), cirq.measure(q0), cirq.H(q0))
|
|
@@ -620,7 +621,7 @@ def test_simulate_moment_steps_intermediate_measurement(
|
|
|
620
621
|
|
|
621
622
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
622
623
|
@pytest.mark.parametrize('split', [True, False])
|
|
623
|
-
def test_simulate_expectation_values(dtype:
|
|
624
|
+
def test_simulate_expectation_values(dtype: type[np.complexfloating], split: bool):
|
|
624
625
|
# Compare with test_expectation_from_state_vector_two_qubit_states
|
|
625
626
|
# in file: cirq/ops/linear_combinations_test.py
|
|
626
627
|
q0, q1 = cirq.LineQubit.range(2)
|
|
@@ -645,7 +646,7 @@ def test_simulate_expectation_values(dtype: Type[np.complexfloating], split: boo
|
|
|
645
646
|
|
|
646
647
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
647
648
|
@pytest.mark.parametrize('split', [True, False])
|
|
648
|
-
def test_simulate_expectation_values_terminal_measure(dtype:
|
|
649
|
+
def test_simulate_expectation_values_terminal_measure(dtype: type[np.complexfloating], split: bool):
|
|
649
650
|
q0 = cirq.LineQubit(0)
|
|
650
651
|
circuit = cirq.Circuit(cirq.H(q0), cirq.measure(q0))
|
|
651
652
|
obs = cirq.Z(q0)
|
|
@@ -683,7 +684,7 @@ def test_simulate_expectation_values_terminal_measure(dtype: Type[np.complexfloa
|
|
|
683
684
|
|
|
684
685
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
685
686
|
@pytest.mark.parametrize('split', [True, False])
|
|
686
|
-
def test_simulate_expectation_values_qubit_order(dtype:
|
|
687
|
+
def test_simulate_expectation_values_qubit_order(dtype: type[np.complexfloating], split: bool):
|
|
687
688
|
q0, q1, q2 = cirq.LineQubit.range(3)
|
|
688
689
|
circuit = cirq.Circuit(cirq.H(q0), cirq.H(q1), cirq.X(q2))
|
|
689
690
|
obs = cirq.X(q0) + cirq.X(q1) - cirq.Z(q2)
|
cirq/sim/state_vector.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
|
"""Helpers for handling quantum state vectors."""
|
|
15
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
16
19
|
import abc
|
|
17
|
-
from typing import
|
|
20
|
+
from typing import Mapping, Sequence, TYPE_CHECKING
|
|
18
21
|
|
|
19
22
|
import numpy as np
|
|
20
23
|
|
|
@@ -31,7 +34,7 @@ if TYPE_CHECKING:
|
|
|
31
34
|
class StateVectorMixin:
|
|
32
35
|
"""A mixin that provide methods for objects that have a state vector."""
|
|
33
36
|
|
|
34
|
-
def __init__(self, qubit_map:
|
|
37
|
+
def __init__(self, qubit_map: Mapping[cirq.Qid, int] | None = None, *args, **kwargs):
|
|
35
38
|
"""Inits StateVectorMixin.
|
|
36
39
|
|
|
37
40
|
Args:
|
|
@@ -47,10 +50,10 @@ class StateVectorMixin:
|
|
|
47
50
|
self._qid_shape = None if qubit_map is None else qid_shape
|
|
48
51
|
|
|
49
52
|
@property
|
|
50
|
-
def qubit_map(self) -> Mapping[
|
|
53
|
+
def qubit_map(self) -> Mapping[cirq.Qid, int]:
|
|
51
54
|
return self._qubit_map
|
|
52
55
|
|
|
53
|
-
def _qid_shape_(self) ->
|
|
56
|
+
def _qid_shape_(self) -> tuple[int, ...]:
|
|
54
57
|
if self._qid_shape is None:
|
|
55
58
|
return NotImplemented
|
|
56
59
|
return self._qid_shape
|
|
@@ -102,7 +105,7 @@ class StateVectorMixin:
|
|
|
102
105
|
and non-zero floats of the specified accuracy."""
|
|
103
106
|
return qis.dirac_notation(self.state_vector(), decimals, qid_shape=self._qid_shape)
|
|
104
107
|
|
|
105
|
-
def density_matrix_of(self, qubits:
|
|
108
|
+
def density_matrix_of(self, qubits: list[cirq.Qid] | None = None) -> np.ndarray:
|
|
106
109
|
r"""Returns the density matrix of the state.
|
|
107
110
|
|
|
108
111
|
Calculate the density matrix for the system on the qubits provided.
|
|
@@ -141,7 +144,7 @@ class StateVectorMixin:
|
|
|
141
144
|
qid_shape=self._qid_shape,
|
|
142
145
|
)
|
|
143
146
|
|
|
144
|
-
def bloch_vector_of(self, qubit:
|
|
147
|
+
def bloch_vector_of(self, qubit: cirq.Qid) -> np.ndarray:
|
|
145
148
|
"""Returns the bloch vector of a qubit in the state.
|
|
146
149
|
|
|
147
150
|
Calculates the bloch vector of the given qubit
|
|
@@ -169,9 +172,9 @@ def sample_state_vector(
|
|
|
169
172
|
state_vector: np.ndarray,
|
|
170
173
|
indices: Sequence[int],
|
|
171
174
|
*, # Force keyword args
|
|
172
|
-
qid_shape:
|
|
175
|
+
qid_shape: tuple[int, ...] | None = None,
|
|
173
176
|
repetitions: int = 1,
|
|
174
|
-
seed:
|
|
177
|
+
seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
|
|
175
178
|
) -> np.ndarray:
|
|
176
179
|
"""Samples repeatedly from measurements in the computational basis.
|
|
177
180
|
|
|
@@ -234,10 +237,10 @@ def measure_state_vector(
|
|
|
234
237
|
state_vector: np.ndarray,
|
|
235
238
|
indices: Sequence[int],
|
|
236
239
|
*, # Force keyword args
|
|
237
|
-
qid_shape:
|
|
238
|
-
out:
|
|
239
|
-
seed:
|
|
240
|
-
) ->
|
|
240
|
+
qid_shape: tuple[int, ...] | None = None,
|
|
241
|
+
out: np.ndarray | None = None,
|
|
242
|
+
seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
|
|
243
|
+
) -> tuple[list[int], np.ndarray]:
|
|
241
244
|
"""Performs a measurement of the state in the computational basis.
|
|
242
245
|
|
|
243
246
|
This does not modify `state` unless the optional `out` is `state`.
|
|
@@ -13,7 +13,10 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
"""Objects and methods for acting efficiently on a state vector."""
|
|
16
|
-
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
from typing import Any, Callable, Sequence, TYPE_CHECKING
|
|
17
20
|
|
|
18
21
|
import numpy as np
|
|
19
22
|
|
|
@@ -29,7 +32,7 @@ if TYPE_CHECKING:
|
|
|
29
32
|
class _BufferedStateVector(qis.QuantumStateRepresentation):
|
|
30
33
|
"""Contains the state vector and buffer for efficient state evolution."""
|
|
31
34
|
|
|
32
|
-
def __init__(self, state_vector: np.ndarray, buffer:
|
|
35
|
+
def __init__(self, state_vector: np.ndarray, buffer: np.ndarray | None = None):
|
|
33
36
|
"""Initializes the object with the inputs.
|
|
34
37
|
|
|
35
38
|
This initializer creates the buffer if necessary.
|
|
@@ -50,10 +53,10 @@ class _BufferedStateVector(qis.QuantumStateRepresentation):
|
|
|
50
53
|
def create(
|
|
51
54
|
cls,
|
|
52
55
|
*,
|
|
53
|
-
initial_state:
|
|
54
|
-
qid_shape:
|
|
55
|
-
dtype:
|
|
56
|
-
buffer:
|
|
56
|
+
initial_state: np.ndarray | cirq.STATE_VECTOR_LIKE = 0,
|
|
57
|
+
qid_shape: tuple[int, ...] | None = None,
|
|
58
|
+
dtype: type[np.complexfloating] | None = None,
|
|
59
|
+
buffer: np.ndarray | None = None,
|
|
57
60
|
):
|
|
58
61
|
"""Initializes the object with the inputs.
|
|
59
62
|
|
|
@@ -85,7 +88,7 @@ class _BufferedStateVector(qis.QuantumStateRepresentation):
|
|
|
85
88
|
state_vector = state_vector.astype(dtype, copy=False)
|
|
86
89
|
return cls(state_vector, buffer)
|
|
87
90
|
|
|
88
|
-
def copy(self, deep_copy_buffers: bool = True) ->
|
|
91
|
+
def copy(self, deep_copy_buffers: bool = True) -> _BufferedStateVector:
|
|
89
92
|
"""Copies the object.
|
|
90
93
|
|
|
91
94
|
Args:
|
|
@@ -98,7 +101,7 @@ class _BufferedStateVector(qis.QuantumStateRepresentation):
|
|
|
98
101
|
buffer=self._buffer.copy() if deep_copy_buffers else self._buffer,
|
|
99
102
|
)
|
|
100
103
|
|
|
101
|
-
def kron(self, other:
|
|
104
|
+
def kron(self, other: _BufferedStateVector) -> _BufferedStateVector:
|
|
102
105
|
"""Creates the Kronecker product with the other state vector.
|
|
103
106
|
|
|
104
107
|
Args:
|
|
@@ -113,7 +116,7 @@ class _BufferedStateVector(qis.QuantumStateRepresentation):
|
|
|
113
116
|
|
|
114
117
|
def factor(
|
|
115
118
|
self, axes: Sequence[int], *, validate=True, atol=1e-07
|
|
116
|
-
) ->
|
|
119
|
+
) -> tuple[_BufferedStateVector, _BufferedStateVector]:
|
|
117
120
|
"""Factors a state vector into two independent state vectors.
|
|
118
121
|
|
|
119
122
|
This function should only be called on state vectors that are known to be separable, such
|
|
@@ -143,7 +146,7 @@ class _BufferedStateVector(qis.QuantumStateRepresentation):
|
|
|
143
146
|
)
|
|
144
147
|
return extracted, remainder
|
|
145
148
|
|
|
146
|
-
def reindex(self, axes: Sequence[int]) ->
|
|
149
|
+
def reindex(self, axes: Sequence[int]) -> _BufferedStateVector:
|
|
147
150
|
"""Transposes the axes of a state vector to a specified order.
|
|
148
151
|
|
|
149
152
|
Args:
|
|
@@ -176,7 +179,7 @@ class _BufferedStateVector(qis.QuantumStateRepresentation):
|
|
|
176
179
|
self._swap_target_tensor_for(new_target_tensor)
|
|
177
180
|
return True
|
|
178
181
|
|
|
179
|
-
def apply_mixture(self, action: Any, axes: Sequence[int], prng) ->
|
|
182
|
+
def apply_mixture(self, action: Any, axes: Sequence[int], prng) -> int | None:
|
|
180
183
|
"""Apply mixture to state.
|
|
181
184
|
|
|
182
185
|
Args:
|
|
@@ -198,7 +201,7 @@ class _BufferedStateVector(qis.QuantumStateRepresentation):
|
|
|
198
201
|
self._swap_target_tensor_for(self._buffer)
|
|
199
202
|
return index
|
|
200
203
|
|
|
201
|
-
def apply_channel(self, action: Any, axes: Sequence[int], prng) ->
|
|
204
|
+
def apply_channel(self, action: Any, axes: Sequence[int], prng) -> int | None:
|
|
202
205
|
"""Apply channel to state.
|
|
203
206
|
|
|
204
207
|
Args:
|
|
@@ -253,8 +256,8 @@ class _BufferedStateVector(qis.QuantumStateRepresentation):
|
|
|
253
256
|
return index
|
|
254
257
|
|
|
255
258
|
def measure(
|
|
256
|
-
self, axes: Sequence[int], seed:
|
|
257
|
-
) ->
|
|
259
|
+
self, axes: Sequence[int], seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None
|
|
260
|
+
) -> list[int]:
|
|
258
261
|
"""Measures the state vector.
|
|
259
262
|
|
|
260
263
|
Args:
|
|
@@ -269,10 +272,7 @@ class _BufferedStateVector(qis.QuantumStateRepresentation):
|
|
|
269
272
|
return bits
|
|
270
273
|
|
|
271
274
|
def sample(
|
|
272
|
-
self,
|
|
273
|
-
axes: Sequence[int],
|
|
274
|
-
repetitions: int = 1,
|
|
275
|
-
seed: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
|
|
275
|
+
self, axes: Sequence[int], repetitions: int = 1, seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None
|
|
276
276
|
) -> np.ndarray:
|
|
277
277
|
"""Samples the state vector.
|
|
278
278
|
|
|
@@ -320,12 +320,12 @@ class StateVectorSimulationState(SimulationState[_BufferedStateVector]):
|
|
|
320
320
|
def __init__(
|
|
321
321
|
self,
|
|
322
322
|
*,
|
|
323
|
-
available_buffer:
|
|
324
|
-
prng:
|
|
325
|
-
qubits:
|
|
326
|
-
initial_state:
|
|
327
|
-
dtype:
|
|
328
|
-
classical_data:
|
|
323
|
+
available_buffer: np.ndarray | None = None,
|
|
324
|
+
prng: np.random.RandomState | None = None,
|
|
325
|
+
qubits: Sequence[cirq.Qid] | None = None,
|
|
326
|
+
initial_state: np.ndarray | cirq.STATE_VECTOR_LIKE = 0,
|
|
327
|
+
dtype: type[np.complexfloating] = np.complex64,
|
|
328
|
+
classical_data: cirq.ClassicalDataStore | None = None,
|
|
329
329
|
):
|
|
330
330
|
"""Inits StateVectorSimulationState.
|
|
331
331
|
|
|
@@ -356,7 +356,7 @@ class StateVectorSimulationState(SimulationState[_BufferedStateVector]):
|
|
|
356
356
|
)
|
|
357
357
|
super().__init__(state=state, prng=prng, qubits=qubits, classical_data=classical_data)
|
|
358
358
|
|
|
359
|
-
def add_qubits(self, qubits: Sequence[
|
|
359
|
+
def add_qubits(self, qubits: Sequence[cirq.Qid]):
|
|
360
360
|
ret = super().add_qubits(qubits)
|
|
361
361
|
return (
|
|
362
362
|
self.kronecker_product(type(self)(qubits=qubits), inplace=True)
|
|
@@ -364,7 +364,7 @@ class StateVectorSimulationState(SimulationState[_BufferedStateVector]):
|
|
|
364
364
|
else ret
|
|
365
365
|
)
|
|
366
366
|
|
|
367
|
-
def remove_qubits(self, qubits: Sequence[
|
|
367
|
+
def remove_qubits(self, qubits: Sequence[cirq.Qid]):
|
|
368
368
|
ret = super().remove_qubits(qubits)
|
|
369
369
|
if ret is not NotImplemented:
|
|
370
370
|
return ret
|
|
@@ -373,9 +373,9 @@ class StateVectorSimulationState(SimulationState[_BufferedStateVector]):
|
|
|
373
373
|
return remainder
|
|
374
374
|
|
|
375
375
|
def _act_on_fallback_(
|
|
376
|
-
self, action: Any, qubits: Sequence[
|
|
376
|
+
self, action: Any, qubits: Sequence[cirq.Qid], allow_decompose: bool = True
|
|
377
377
|
) -> bool:
|
|
378
|
-
strats:
|
|
378
|
+
strats: list[Callable[[Any, Any, Sequence[cirq.Qid]], bool]] = [
|
|
379
379
|
_strat_act_on_state_vector_from_apply_unitary,
|
|
380
380
|
_strat_act_on_state_vector_from_mixture,
|
|
381
381
|
_strat_act_on_state_vector_from_channel,
|
|
@@ -415,7 +415,7 @@ class StateVectorSimulationState(SimulationState[_BufferedStateVector]):
|
|
|
415
415
|
|
|
416
416
|
|
|
417
417
|
def _strat_act_on_state_vector_from_apply_unitary(
|
|
418
|
-
action: Any, args:
|
|
418
|
+
action: Any, args: cirq.StateVectorSimulationState, qubits: Sequence[cirq.Qid]
|
|
419
419
|
) -> bool:
|
|
420
420
|
if not args._state.apply_unitary(action, args.get_axes(qubits)):
|
|
421
421
|
return NotImplemented
|
|
@@ -423,7 +423,7 @@ def _strat_act_on_state_vector_from_apply_unitary(
|
|
|
423
423
|
|
|
424
424
|
|
|
425
425
|
def _strat_act_on_state_vector_from_mixture(
|
|
426
|
-
action: Any, args:
|
|
426
|
+
action: Any, args: cirq.StateVectorSimulationState, qubits: Sequence[cirq.Qid]
|
|
427
427
|
) -> bool:
|
|
428
428
|
index = args._state.apply_mixture(action, args.get_axes(qubits), args.prng)
|
|
429
429
|
if index is None:
|
|
@@ -435,7 +435,7 @@ def _strat_act_on_state_vector_from_mixture(
|
|
|
435
435
|
|
|
436
436
|
|
|
437
437
|
def _strat_act_on_state_vector_from_channel(
|
|
438
|
-
action: Any, args:
|
|
438
|
+
action: Any, args: cirq.StateVectorSimulationState, qubits: Sequence[cirq.Qid]
|
|
439
439
|
) -> bool:
|
|
440
440
|
index = args._state.apply_channel(action, args.get_axes(qubits), args.prng)
|
|
441
441
|
if index is None:
|