cirq-core 1.5.0.dev20250409222543__py3-none-any.whl → 1.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of cirq-core might be problematic. Click here for more details.
- cirq/__init__.py +16 -17
- cirq/_compat.py +21 -20
- cirq/_compat_test.py +14 -34
- cirq/_doc.py +4 -2
- cirq/_import.py +8 -6
- cirq/_import_test.py +4 -2
- cirq/_version.py +6 -6
- cirq/_version_test.py +2 -2
- cirq/circuits/_block_diagram_drawer.py +11 -10
- cirq/circuits/_block_diagram_drawer_test.py +8 -6
- cirq/circuits/_box_drawing_character_data.py +8 -8
- cirq/circuits/_box_drawing_character_data_test.py +3 -1
- cirq/circuits/_bucket_priority_queue.py +9 -7
- cirq/circuits/_bucket_priority_queue_test.py +22 -20
- cirq/circuits/circuit.py +248 -172
- cirq/circuits/circuit_operation.py +73 -83
- cirq/circuits/circuit_operation_test.py +128 -90
- cirq/circuits/circuit_test.py +211 -151
- cirq/circuits/frozen_circuit.py +23 -60
- cirq/circuits/frozen_circuit_test.py +31 -8
- cirq/circuits/insert_strategy.py +7 -5
- cirq/circuits/insert_strategy_test.py +4 -2
- cirq/circuits/moment.py +88 -40
- cirq/circuits/moment_test.py +128 -51
- cirq/circuits/optimization_pass.py +5 -5
- cirq/circuits/optimization_pass_test.py +10 -10
- cirq/circuits/qasm_output.py +11 -11
- cirq/circuits/qasm_output_test.py +25 -22
- cirq/circuits/text_diagram_drawer.py +23 -38
- cirq/circuits/text_diagram_drawer_test.py +19 -17
- cirq/conftest.py +4 -3
- cirq/contrib/__init__.py +4 -4
- cirq/contrib/acquaintance/__init__.py +1 -1
- cirq/contrib/acquaintance/bipartite.py +5 -8
- cirq/contrib/acquaintance/bipartite_test.py +18 -13
- cirq/contrib/acquaintance/devices.py +2 -2
- cirq/contrib/acquaintance/devices_test.py +5 -3
- cirq/contrib/acquaintance/executor.py +5 -5
- cirq/contrib/acquaintance/executor_test.py +13 -9
- cirq/contrib/acquaintance/gates.py +18 -28
- cirq/contrib/acquaintance/gates_test.py +24 -20
- cirq/contrib/acquaintance/inspection_utils.py +8 -4
- cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
- cirq/contrib/acquaintance/mutation_utils.py +4 -4
- cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
- cirq/contrib/acquaintance/optimizers.py +4 -4
- cirq/contrib/acquaintance/optimizers_test.py +4 -1
- cirq/contrib/acquaintance/permutation.py +15 -27
- cirq/contrib/acquaintance/permutation_test.py +26 -17
- cirq/contrib/acquaintance/shift.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
- cirq/contrib/acquaintance/shift_test.py +8 -6
- cirq/contrib/acquaintance/strategies/cubic.py +2 -2
- cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
- cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
- cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
- cirq/contrib/acquaintance/testing.py +2 -0
- cirq/contrib/acquaintance/topological_sort.py +2 -2
- cirq/contrib/acquaintance/topological_sort_test.py +3 -1
- cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
- cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
- cirq/contrib/circuitdag/circuit_dag.py +4 -4
- cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
- cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
- cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
- cirq/contrib/graph_device/graph_device.py +12 -11
- cirq/contrib/graph_device/graph_device_test.py +18 -14
- cirq/contrib/graph_device/hypergraph.py +16 -14
- cirq/contrib/graph_device/hypergraph_test.py +13 -11
- cirq/contrib/graph_device/uniform_graph_device.py +6 -4
- cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
- cirq/contrib/hacks/disable_validation.py +6 -1
- cirq/contrib/hacks/disable_validation_test.py +3 -1
- cirq/contrib/json.py +31 -5
- cirq/contrib/json_test.py +6 -3
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/__init__.py +17 -0
- cirq/contrib/json_test_data/spec.py +32 -0
- cirq/contrib/noise_models/noise_models.py +119 -5
- cirq/contrib/noise_models/noise_models_test.py +37 -9
- cirq/contrib/paulistring/clifford_optimize.py +6 -4
- cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
- cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
- cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
- cirq/contrib/paulistring/optimize.py +2 -0
- cirq/contrib/paulistring/optimize_test.py +4 -3
- cirq/contrib/paulistring/pauli_string_dag.py +2 -0
- cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
- cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
- cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
- cirq/contrib/paulistring/recombine.py +6 -4
- cirq/contrib/paulistring/recombine_test.py +3 -1
- cirq/contrib/paulistring/separate.py +9 -6
- cirq/contrib/paulistring/separate_test.py +3 -1
- cirq/contrib/qasm_import/_lexer.py +3 -2
- cirq/contrib/qasm_import/_lexer_test.py +49 -13
- cirq/contrib/qasm_import/_parser.py +547 -83
- cirq/contrib/qasm_import/_parser_test.py +988 -97
- cirq/contrib/qasm_import/exception.py +2 -0
- cirq/contrib/qasm_import/qasm.py +8 -2
- cirq/contrib/qasm_import/qasm_test.py +7 -4
- cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
- cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
- cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
- cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
- cirq/contrib/qcircuit/qcircuit_test.py +10 -8
- cirq/contrib/quantum_volume/quantum_volume.py +31 -27
- cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
- cirq/contrib/quimb/density_matrix.py +15 -14
- cirq/contrib/quimb/density_matrix_test.py +10 -7
- cirq/contrib/quimb/grid_circuits.py +5 -2
- cirq/contrib/quimb/grid_circuits_test.py +3 -0
- cirq/contrib/quimb/mps_simulator.py +20 -20
- cirq/contrib/quimb/mps_simulator_test.py +3 -0
- cirq/contrib/quimb/state_vector.py +12 -11
- cirq/contrib/quimb/state_vector_test.py +3 -0
- cirq/contrib/quirk/export_to_quirk.py +5 -3
- cirq/contrib/quirk/export_to_quirk_test.py +18 -16
- cirq/contrib/quirk/linearize_circuit.py +2 -0
- cirq/contrib/quirk/quirk_gate.py +18 -17
- cirq/contrib/routing/device.py +5 -3
- cirq/contrib/routing/device_test.py +2 -0
- cirq/contrib/routing/greedy.py +10 -21
- cirq/contrib/routing/greedy_test.py +4 -2
- cirq/contrib/routing/initialization.py +2 -2
- cirq/contrib/routing/initialization_test.py +5 -3
- cirq/contrib/routing/router.py +9 -5
- cirq/contrib/routing/router_test.py +2 -0
- cirq/contrib/routing/swap_network.py +3 -3
- cirq/contrib/routing/swap_network_test.py +3 -1
- cirq/contrib/routing/utils.py +2 -2
- cirq/contrib/routing/utils_test.py +3 -0
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
- cirq/contrib/svg/svg.py +3 -3
- cirq/contrib/svg/svg_test.py +8 -5
- cirq/devices/device.py +4 -4
- cirq/devices/device_test.py +7 -4
- cirq/devices/grid_device_metadata.py +10 -10
- cirq/devices/grid_device_metadata_test.py +3 -0
- cirq/devices/grid_qubit.py +29 -21
- cirq/devices/grid_qubit_test.py +3 -0
- cirq/devices/insertion_noise_model.py +7 -7
- cirq/devices/insertion_noise_model_test.py +7 -5
- cirq/devices/line_qubit.py +13 -13
- cirq/devices/line_qubit_test.py +2 -0
- cirq/devices/named_topologies.py +18 -29
- cirq/devices/named_topologies_test.py +13 -10
- cirq/devices/noise_model.py +3 -3
- cirq/devices/noise_model_test.py +19 -15
- cirq/devices/noise_properties.py +15 -6
- cirq/devices/noise_properties_test.py +34 -3
- cirq/devices/noise_utils.py +11 -9
- cirq/devices/noise_utils_test.py +2 -0
- cirq/devices/superconducting_qubits_noise_properties.py +23 -22
- cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
- cirq/devices/thermal_noise_model.py +107 -37
- cirq/devices/thermal_noise_model_test.py +21 -0
- cirq/devices/unconstrained_device.py +5 -3
- cirq/devices/unconstrained_device_test.py +2 -0
- cirq/experiments/__init__.py +4 -2
- cirq/experiments/benchmarking/__init__.py +17 -0
- cirq/experiments/benchmarking/parallel_xeb.py +677 -0
- cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
- cirq/experiments/fidelity_estimation.py +14 -8
- cirq/experiments/fidelity_estimation_test.py +3 -0
- cirq/experiments/n_qubit_tomography.py +17 -16
- cirq/experiments/n_qubit_tomography_test.py +8 -5
- cirq/experiments/purity_estimation.py +2 -0
- cirq/experiments/purity_estimation_test.py +2 -0
- cirq/experiments/qubit_characterizations.py +207 -103
- cirq/experiments/qubit_characterizations_test.py +40 -12
- cirq/experiments/random_quantum_circuit_generation.py +56 -70
- cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
- cirq/experiments/readout_confusion_matrix.py +24 -22
- cirq/experiments/readout_confusion_matrix_test.py +2 -0
- cirq/experiments/single_qubit_readout_calibration.py +30 -15
- cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
- cirq/experiments/t1_decay_experiment.py +9 -7
- cirq/experiments/t1_decay_experiment_test.py +13 -11
- cirq/experiments/t2_decay_experiment.py +16 -13
- cirq/experiments/t2_decay_experiment_test.py +2 -0
- cirq/experiments/two_qubit_xeb.py +64 -57
- cirq/experiments/two_qubit_xeb_test.py +10 -6
- cirq/experiments/xeb_fitting.py +39 -35
- cirq/experiments/xeb_sampling.py +37 -44
- cirq/experiments/xeb_sampling_test.py +3 -0
- cirq/experiments/xeb_simulation.py +14 -10
- cirq/experiments/xeb_simulation_test.py +5 -5
- cirq/experiments/z_phase_calibration.py +32 -29
- cirq/experiments/z_phase_calibration_test.py +3 -4
- cirq/interop/quirk/cells/__init__.py +1 -1
- cirq/interop/quirk/cells/all_cells.py +7 -2
- cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
- cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
- cirq/interop/quirk/cells/cell.py +19 -28
- cirq/interop/quirk/cells/cell_test.py +3 -0
- cirq/interop/quirk/cells/composite_cell.py +13 -28
- cirq/interop/quirk/cells/composite_cell_test.py +2 -0
- cirq/interop/quirk/cells/control_cells.py +15 -15
- cirq/interop/quirk/cells/control_cells_test.py +7 -5
- cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
- cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
- cirq/interop/quirk/cells/ignored_cells.py +3 -0
- cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
- cirq/interop/quirk/cells/input_cells.py +7 -5
- cirq/interop/quirk/cells/input_cells_test.py +7 -5
- cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
- cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
- cirq/interop/quirk/cells/measurement_cells.py +5 -2
- cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
- cirq/interop/quirk/cells/parse.py +22 -23
- cirq/interop/quirk/cells/parse_test.py +12 -10
- cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
- cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
- cirq/interop/quirk/cells/scalar_cells.py +4 -1
- cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
- cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
- cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
- cirq/interop/quirk/cells/swap_cell.py +8 -6
- cirq/interop/quirk/cells/swap_cell_test.py +6 -4
- cirq/interop/quirk/cells/testing.py +6 -6
- cirq/interop/quirk/cells/testing_test.py +8 -6
- cirq/interop/quirk/cells/unsupported_cells.py +3 -0
- cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
- cirq/interop/quirk/url_to_circuit.py +23 -36
- cirq/interop/quirk/url_to_circuit_test.py +4 -1
- cirq/json_resolver_cache.py +14 -12
- cirq/linalg/__init__.py +4 -6
- cirq/linalg/combinators.py +7 -5
- cirq/linalg/combinators_test.py +10 -7
- cirq/linalg/decompositions.py +24 -35
- cirq/linalg/decompositions_test.py +3 -1
- cirq/linalg/diagonalize.py +6 -4
- cirq/linalg/diagonalize_test.py +15 -14
- cirq/linalg/operator_spaces.py +14 -14
- cirq/linalg/operator_spaces_test.py +13 -11
- cirq/linalg/predicates.py +18 -9
- cirq/linalg/predicates_test.py +5 -0
- cirq/linalg/tolerance.py +6 -3
- cirq/linalg/tolerance_test.py +6 -4
- cirq/linalg/transformations.py +23 -20
- cirq/linalg/transformations_test.py +73 -43
- cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
- cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
- cirq/neutral_atoms/neutral_atom_devices.py +2 -0
- cirq/ops/__init__.py +2 -0
- cirq/ops/arithmetic_operation.py +21 -21
- cirq/ops/arithmetic_operation_test.py +7 -8
- cirq/ops/boolean_hamiltonian.py +23 -22
- cirq/ops/boolean_hamiltonian_test.py +12 -9
- cirq/ops/classically_controlled_operation.py +31 -36
- cirq/ops/classically_controlled_operation_test.py +121 -117
- cirq/ops/clifford_gate.py +98 -81
- cirq/ops/clifford_gate_test.py +72 -57
- cirq/ops/common_channels.py +44 -44
- cirq/ops/common_channels_test.py +83 -81
- cirq/ops/common_gate_families.py +9 -7
- cirq/ops/common_gate_families_test.py +11 -7
- cirq/ops/common_gates.py +164 -183
- cirq/ops/common_gates_test.py +135 -95
- cirq/ops/control_values.py +23 -26
- cirq/ops/control_values_test.py +22 -20
- cirq/ops/controlled_gate.py +64 -112
- cirq/ops/controlled_gate_test.py +130 -35
- cirq/ops/controlled_operation.py +24 -35
- cirq/ops/controlled_operation_test.py +8 -6
- cirq/ops/dense_pauli_string.py +38 -49
- cirq/ops/dense_pauli_string_test.py +4 -2
- cirq/ops/diagonal_gate.py +18 -31
- cirq/ops/diagonal_gate_test.py +13 -13
- cirq/ops/eigen_gate.py +29 -29
- cirq/ops/eigen_gate_test.py +45 -28
- cirq/ops/fourier_transform.py +14 -20
- cirq/ops/fourier_transform_test.py +15 -12
- cirq/ops/fsim_gate.py +43 -42
- cirq/ops/fsim_gate_test.py +29 -29
- cirq/ops/gate_features.py +2 -0
- cirq/ops/gate_features_test.py +5 -3
- cirq/ops/gate_operation.py +43 -65
- cirq/ops/gate_operation_test.py +46 -42
- cirq/ops/gateset.py +28 -40
- cirq/ops/gateset_test.py +4 -2
- cirq/ops/global_phase_op.py +45 -20
- cirq/ops/global_phase_op_test.py +44 -20
- cirq/ops/greedy_qubit_manager.py +10 -8
- cirq/ops/greedy_qubit_manager_test.py +5 -3
- cirq/ops/identity.py +14 -12
- cirq/ops/identity_test.py +24 -20
- cirq/ops/kraus_channel.py +11 -8
- cirq/ops/kraus_channel_test.py +14 -11
- cirq/ops/linear_combinations.py +65 -77
- cirq/ops/linear_combinations_test.py +14 -9
- cirq/ops/matrix_gates.py +21 -18
- cirq/ops/matrix_gates_test.py +16 -0
- cirq/ops/measure_util.py +15 -20
- cirq/ops/measure_util_test.py +2 -0
- cirq/ops/measurement_gate.py +26 -37
- cirq/ops/measurement_gate_test.py +2 -0
- cirq/ops/mixed_unitary_channel.py +12 -9
- cirq/ops/mixed_unitary_channel_test.py +14 -11
- cirq/ops/named_qubit.py +16 -13
- cirq/ops/named_qubit_test.py +15 -13
- cirq/ops/op_tree.py +9 -7
- cirq/ops/op_tree_test.py +22 -19
- cirq/ops/parallel_gate.py +15 -17
- cirq/ops/parallel_gate_test.py +18 -16
- cirq/ops/parity_gates.py +23 -25
- cirq/ops/parity_gates_test.py +36 -32
- cirq/ops/pauli_gates.py +22 -21
- cirq/ops/pauli_gates_test.py +29 -20
- cirq/ops/pauli_interaction_gate.py +15 -19
- cirq/ops/pauli_interaction_gate_test.py +10 -8
- cirq/ops/pauli_measurement_gate.py +23 -35
- cirq/ops/pauli_measurement_gate_test.py +2 -0
- cirq/ops/pauli_string.py +92 -120
- cirq/ops/pauli_string_phasor.py +52 -45
- cirq/ops/pauli_string_phasor_test.py +4 -5
- cirq/ops/pauli_string_raw_types.py +9 -7
- cirq/ops/pauli_string_raw_types_test.py +2 -0
- cirq/ops/pauli_string_test.py +31 -154
- cirq/ops/pauli_sum_exponential.py +12 -12
- cirq/ops/pauli_sum_exponential_test.py +12 -10
- cirq/ops/permutation_gate.py +8 -6
- cirq/ops/permutation_gate_test.py +10 -8
- cirq/ops/phased_iswap_gate.py +16 -16
- cirq/ops/phased_iswap_gate_test.py +17 -15
- cirq/ops/phased_x_gate.py +16 -17
- cirq/ops/phased_x_gate_test.py +18 -16
- cirq/ops/phased_x_z_gate.py +24 -22
- cirq/ops/phased_x_z_gate_test.py +17 -11
- cirq/ops/projector.py +16 -11
- cirq/ops/projector_test.py +19 -16
- cirq/ops/qid_util.py +7 -5
- cirq/ops/qid_util_test.py +2 -0
- cirq/ops/qubit_manager.py +11 -9
- cirq/ops/qubit_manager_test.py +6 -4
- cirq/ops/qubit_order.py +11 -14
- cirq/ops/qubit_order_or_list.py +4 -2
- cirq/ops/qubit_order_test.py +12 -10
- cirq/ops/random_gate_channel.py +12 -10
- cirq/ops/random_gate_channel_test.py +14 -11
- cirq/ops/raw_types.py +109 -129
- cirq/ops/raw_types_test.py +63 -57
- cirq/ops/state_preparation_channel.py +7 -7
- cirq/ops/state_preparation_channel_test.py +11 -9
- cirq/ops/swap_gates.py +13 -15
- cirq/ops/swap_gates_test.py +19 -17
- cirq/ops/tags.py +5 -3
- cirq/ops/tags_test.py +4 -2
- cirq/ops/three_qubit_gates.py +43 -76
- cirq/ops/three_qubit_gates_test.py +19 -17
- cirq/ops/two_qubit_diagonal_gate.py +13 -13
- cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
- cirq/ops/uniform_superposition_gate.py +5 -3
- cirq/ops/uniform_superposition_gate_test.py +5 -3
- cirq/ops/wait_gate.py +17 -14
- cirq/ops/wait_gate_test.py +9 -6
- cirq/protocols/__init__.py +0 -3
- cirq/protocols/act_on_protocol.py +8 -6
- cirq/protocols/act_on_protocol_test.py +15 -12
- cirq/protocols/apply_channel_protocol.py +10 -14
- cirq/protocols/apply_channel_protocol_test.py +2 -0
- cirq/protocols/apply_mixture_protocol.py +13 -42
- cirq/protocols/apply_mixture_protocol_test.py +7 -5
- cirq/protocols/apply_unitary_protocol.py +39 -34
- cirq/protocols/apply_unitary_protocol_test.py +4 -1
- cirq/protocols/approximate_equality_protocol.py +2 -0
- cirq/protocols/approximate_equality_protocol_test.py +2 -0
- cirq/protocols/circuit_diagram_info_protocol.py +58 -42
- cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
- cirq/protocols/commutes_protocol.py +8 -7
- cirq/protocols/commutes_protocol_test.py +2 -0
- cirq/protocols/control_key_protocol.py +6 -4
- cirq/protocols/control_key_protocol_test.py +3 -1
- cirq/protocols/decompose_protocol.py +49 -48
- cirq/protocols/decompose_protocol_test.py +27 -16
- cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
- cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
- cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
- cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
- cirq/protocols/has_unitary_protocol.py +10 -6
- cirq/protocols/has_unitary_protocol_test.py +13 -8
- cirq/protocols/hash_from_pickle_test.py +2 -11
- cirq/protocols/inverse_protocol.py +13 -16
- cirq/protocols/inverse_protocol_test.py +5 -3
- cirq/protocols/json_serialization.py +35 -54
- cirq/protocols/json_serialization_test.py +14 -21
- cirq/protocols/json_test_data/CXSWAP.json +46 -0
- cirq/protocols/json_test_data/CXSWAP.repr +13 -0
- cirq/protocols/json_test_data/CZSWAP.json +46 -0
- cirq/protocols/json_test_data/CZSWAP.repr +13 -0
- cirq/protocols/json_test_data/CircuitOperation.json +6 -3
- cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
- cirq/protocols/json_test_data/Moment.json +24 -1
- cirq/protocols/json_test_data/Moment.repr +6 -1
- cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
- cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
- cirq/protocols/json_test_data/spec.py +6 -2
- cirq/protocols/kraus_protocol.py +47 -7
- cirq/protocols/kraus_protocol_test.py +86 -12
- cirq/protocols/measurement_key_protocol.py +15 -16
- cirq/protocols/measurement_key_protocol_test.py +13 -11
- cirq/protocols/mixture_protocol.py +7 -5
- cirq/protocols/mixture_protocol_test.py +4 -2
- cirq/protocols/mul_protocol.py +2 -3
- cirq/protocols/mul_protocol_test.py +2 -0
- cirq/protocols/pauli_expansion_protocol.py +6 -3
- cirq/protocols/pauli_expansion_protocol_test.py +5 -3
- cirq/protocols/phase_protocol.py +2 -0
- cirq/protocols/phase_protocol_test.py +3 -1
- cirq/protocols/pow_protocol.py +11 -16
- cirq/protocols/pow_protocol_test.py +2 -0
- cirq/protocols/qasm.py +14 -20
- cirq/protocols/qasm_test.py +6 -3
- cirq/protocols/qid_shape_protocol.py +8 -8
- cirq/protocols/qid_shape_protocol_test.py +3 -1
- cirq/protocols/resolve_parameters.py +5 -3
- cirq/protocols/resolve_parameters_test.py +8 -7
- cirq/protocols/trace_distance_bound.py +6 -4
- cirq/protocols/trace_distance_bound_test.py +3 -1
- cirq/protocols/unitary_protocol.py +17 -7
- cirq/protocols/unitary_protocol_test.py +12 -2
- cirq/qis/channels.py +6 -2
- cirq/qis/channels_test.py +20 -16
- cirq/qis/clifford_tableau.py +21 -19
- cirq/qis/clifford_tableau_test.py +2 -2
- cirq/qis/entropy.py +14 -3
- cirq/qis/entropy_test.py +3 -1
- cirq/qis/measures.py +13 -13
- cirq/qis/measures_test.py +20 -14
- cirq/qis/noise_utils.py +2 -0
- cirq/qis/noise_utils_test.py +9 -7
- cirq/qis/quantum_state_representation.py +7 -8
- cirq/qis/states.py +58 -56
- cirq/qis/states_test.py +2 -0
- cirq/sim/classical_simulator.py +23 -22
- cirq/sim/classical_simulator_test.py +2 -0
- cirq/sim/clifford/clifford_simulator.py +23 -21
- cirq/sim/clifford/clifford_simulator_test.py +7 -4
- cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
- cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
- cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
- cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
- cirq/sim/clifford/stabilizer_sampler.py +9 -7
- cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
- cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
- cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
- cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
- cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
- cirq/sim/density_matrix_simulation_state.py +26 -27
- cirq/sim/density_matrix_simulation_state_test.py +10 -8
- cirq/sim/density_matrix_simulator.py +30 -28
- cirq/sim/density_matrix_simulator_test.py +48 -48
- cirq/sim/density_matrix_utils.py +13 -11
- cirq/sim/density_matrix_utils_test.py +38 -36
- cirq/sim/mux.py +33 -31
- cirq/sim/mux_test.py +3 -0
- cirq/sim/simulation_product_state.py +15 -15
- cirq/sim/simulation_product_state_test.py +29 -26
- cirq/sim/simulation_state.py +29 -38
- cirq/sim/simulation_state_base.py +21 -32
- cirq/sim/simulation_state_test.py +15 -13
- cirq/sim/simulation_utils.py +5 -2
- cirq/sim/simulation_utils_test.py +5 -2
- cirq/sim/simulator.py +90 -106
- cirq/sim/simulator_base.py +33 -45
- cirq/sim/simulator_base_test.py +20 -15
- cirq/sim/simulator_test.py +23 -14
- cirq/sim/sparse_simulator.py +19 -17
- cirq/sim/sparse_simulator_test.py +41 -40
- cirq/sim/state_vector.py +15 -12
- cirq/sim/state_vector_simulation_state.py +31 -31
- cirq/sim/state_vector_simulation_state_test.py +16 -14
- cirq/sim/state_vector_simulator.py +17 -14
- cirq/sim/state_vector_simulator_test.py +2 -0
- cirq/sim/state_vector_test.py +6 -3
- cirq/study/flatten_expressions.py +16 -15
- cirq/study/flatten_expressions_test.py +13 -11
- cirq/study/resolver.py +18 -17
- cirq/study/resolver_test.py +22 -20
- cirq/study/result.py +17 -27
- cirq/study/result_test.py +2 -0
- cirq/study/sweepable.py +12 -10
- cirq/study/sweepable_test.py +3 -0
- cirq/study/sweeps.py +42 -61
- cirq/study/sweeps_test.py +33 -0
- cirq/testing/__init__.py +7 -11
- cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
- cirq/testing/circuit_compare.py +8 -17
- cirq/testing/circuit_compare_test.py +2 -0
- cirq/testing/consistent_act_on.py +13 -11
- cirq/testing/consistent_act_on_test.py +5 -3
- cirq/testing/consistent_channels.py +2 -0
- cirq/testing/consistent_channels_test.py +10 -8
- cirq/testing/consistent_controlled_gate_op.py +5 -5
- cirq/testing/consistent_controlled_gate_op_test.py +18 -18
- cirq/testing/consistent_decomposition.py +2 -2
- cirq/testing/consistent_decomposition_test.py +4 -2
- cirq/testing/consistent_pauli_expansion.py +2 -0
- cirq/testing/consistent_pauli_expansion_test.py +3 -1
- cirq/testing/consistent_phase_by.py +2 -0
- cirq/testing/consistent_phase_by_test.py +3 -1
- cirq/testing/consistent_protocols.py +14 -20
- cirq/testing/consistent_protocols_test.py +13 -11
- cirq/testing/consistent_qasm.py +6 -4
- cirq/testing/consistent_qasm_test.py +7 -7
- cirq/testing/consistent_resolve_parameters.py +2 -0
- cirq/testing/consistent_specified_has_unitary.py +2 -2
- cirq/testing/consistent_specified_has_unitary_test.py +6 -4
- cirq/testing/consistent_unitary.py +1 -0
- cirq/testing/consistent_unitary_test.py +4 -2
- cirq/testing/deprecation.py +5 -2
- cirq/testing/deprecation_test.py +5 -2
- cirq/testing/devices.py +7 -4
- cirq/testing/devices_test.py +7 -4
- cirq/testing/equals_tester.py +4 -2
- cirq/testing/equals_tester_test.py +21 -17
- cirq/testing/equivalent_basis_map.py +6 -4
- cirq/testing/equivalent_basis_map_test.py +6 -4
- cirq/testing/equivalent_repr_eval.py +6 -4
- cirq/testing/equivalent_repr_eval_test.py +5 -3
- cirq/testing/gate_features.py +2 -0
- cirq/testing/gate_features_test.py +7 -5
- cirq/testing/json.py +19 -15
- cirq/testing/json_test.py +5 -3
- cirq/testing/lin_alg_utils.py +10 -11
- cirq/testing/lin_alg_utils_test.py +14 -12
- cirq/testing/logs.py +7 -6
- cirq/testing/logs_test.py +9 -7
- cirq/testing/no_identifier_qubit.py +4 -2
- cirq/testing/no_identifier_qubit_test.py +5 -3
- cirq/testing/op_tree.py +2 -0
- cirq/testing/op_tree_test.py +4 -1
- cirq/testing/order_tester.py +2 -0
- cirq/testing/order_tester_test.py +8 -6
- cirq/testing/pytest_utils.py +2 -0
- cirq/testing/pytest_utils_test.py +4 -2
- cirq/testing/random_circuit.py +21 -20
- cirq/testing/random_circuit_test.py +12 -9
- cirq/testing/repr_pretty_tester.py +1 -0
- cirq/testing/repr_pretty_tester_test.py +5 -3
- cirq/testing/routing_devices.py +4 -1
- cirq/testing/routing_devices_test.py +9 -6
- cirq/testing/sample_circuits.py +4 -1
- cirq/testing/sample_circuits_test.py +3 -1
- cirq/testing/sample_gates.py +3 -0
- cirq/testing/sample_gates_test.py +5 -2
- cirq/transformers/__init__.py +11 -4
- cirq/transformers/align.py +9 -7
- cirq/transformers/align_test.py +2 -0
- cirq/transformers/analytical_decompositions/__init__.py +3 -6
- cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
- cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
- cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
- cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
- cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
- cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
- cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
- cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
- cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
- cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
- cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
- cirq/transformers/drop_empty_moments.py +5 -3
- cirq/transformers/drop_empty_moments_test.py +4 -2
- cirq/transformers/drop_negligible_operations.py +7 -5
- cirq/transformers/drop_negligible_operations_test.py +2 -0
- cirq/transformers/dynamical_decoupling.py +49 -42
- cirq/transformers/dynamical_decoupling_test.py +223 -205
- cirq/transformers/eject_phased_paulis.py +28 -26
- cirq/transformers/eject_phased_paulis_test.py +12 -9
- cirq/transformers/eject_z.py +12 -12
- cirq/transformers/eject_z_test.py +2 -2
- cirq/transformers/expand_composite.py +6 -4
- cirq/transformers/expand_composite_test.py +3 -1
- cirq/transformers/gauge_compiling/__init__.py +3 -1
- cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
- cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
- cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
- cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
- cirq/transformers/insertion_sort.py +8 -6
- cirq/transformers/insertion_sort_test.py +3 -1
- cirq/transformers/measurement_transformers.py +29 -29
- cirq/transformers/measurement_transformers_test.py +2 -0
- cirq/transformers/merge_k_qubit_gates.py +12 -10
- cirq/transformers/merge_k_qubit_gates_test.py +18 -18
- cirq/transformers/merge_single_qubit_gates.py +197 -20
- cirq/transformers/merge_single_qubit_gates_test.py +177 -5
- cirq/transformers/noise_adding.py +5 -3
- cirq/transformers/noise_adding_test.py +2 -0
- cirq/transformers/optimize_for_target_gateset.py +19 -17
- cirq/transformers/optimize_for_target_gateset_test.py +11 -8
- cirq/transformers/qubit_management_transformers.py +13 -11
- cirq/transformers/qubit_management_transformers_test.py +5 -3
- cirq/transformers/randomized_measurements.py +16 -14
- cirq/transformers/randomized_measurements_test.py +10 -4
- cirq/transformers/routing/initial_mapper.py +6 -4
- cirq/transformers/routing/initial_mapper_test.py +2 -0
- cirq/transformers/routing/line_initial_mapper.py +16 -14
- cirq/transformers/routing/line_initial_mapper_test.py +9 -7
- cirq/transformers/routing/mapping_manager.py +10 -10
- cirq/transformers/routing/mapping_manager_test.py +2 -0
- cirq/transformers/routing/route_circuit_cqc.py +33 -31
- cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
- cirq/transformers/routing/visualize_routed_circuit.py +8 -7
- cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
- cirq/transformers/stratify.py +17 -15
- cirq/transformers/stratify_test.py +3 -0
- cirq/transformers/symbolize.py +103 -0
- cirq/transformers/symbolize_test.py +62 -0
- cirq/transformers/synchronize_terminal_measurements.py +10 -10
- cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
- cirq/transformers/tag_transformers.py +97 -0
- cirq/transformers/tag_transformers_test.py +103 -0
- cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
- cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
- cirq/transformers/target_gatesets/cz_gateset.py +7 -5
- cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
- cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
- cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
- cirq/transformers/transformer_api.py +34 -47
- cirq/transformers/transformer_api_test.py +9 -8
- cirq/transformers/transformer_primitives.py +39 -49
- cirq/transformers/transformer_primitives_test.py +10 -17
- cirq/value/abc_alt.py +6 -4
- cirq/value/abc_alt_test.py +5 -3
- cirq/value/angle.py +11 -12
- cirq/value/angle_test.py +5 -3
- cirq/value/classical_data.py +27 -27
- cirq/value/classical_data_test.py +11 -8
- cirq/value/condition.py +26 -24
- cirq/value/condition_test.py +2 -0
- cirq/value/digits.py +14 -11
- cirq/value/digits_test.py +2 -0
- cirq/value/duration.py +23 -20
- cirq/value/duration_test.py +2 -0
- cirq/value/linear_dict.py +25 -30
- cirq/value/linear_dict_test.py +10 -8
- cirq/value/measurement_key.py +12 -12
- cirq/value/measurement_key_test.py +2 -0
- cirq/value/periodic_value.py +4 -4
- cirq/value/periodic_value_test.py +11 -7
- cirq/value/probability.py +3 -1
- cirq/value/probability_test.py +4 -2
- cirq/value/product_state.py +15 -13
- cirq/value/product_state_test.py +4 -1
- cirq/value/random_state.py +2 -0
- cirq/value/random_state_test.py +5 -3
- cirq/value/timestamp.py +11 -7
- cirq/value/timestamp_test.py +14 -12
- cirq/value/type_alias.py +4 -4
- cirq/value/value_equality_attr.py +8 -9
- cirq/value/value_equality_attr_test.py +14 -11
- cirq/vis/density_matrix.py +3 -3
- cirq/vis/density_matrix_test.py +20 -17
- cirq/vis/heatmap.py +24 -37
- cirq/vis/heatmap_test.py +3 -0
- cirq/vis/histogram.py +9 -6
- cirq/vis/histogram_test.py +5 -2
- cirq/vis/state_histogram.py +10 -8
- cirq/vis/state_histogram_test.py +7 -5
- cirq/vis/vis_utils.py +4 -1
- cirq/vis/vis_utils_test.py +4 -1
- cirq/work/collector.py +12 -18
- cirq/work/collector_test.py +15 -10
- cirq/work/observable_grouping.py +6 -7
- cirq/work/observable_grouping_test.py +10 -9
- cirq/work/observable_measurement.py +47 -45
- cirq/work/observable_measurement_data.py +22 -17
- cirq/work/observable_measurement_data_test.py +4 -1
- cirq/work/observable_measurement_test.py +48 -29
- cirq/work/observable_readout_calibration.py +5 -2
- cirq/work/observable_readout_calibration_test.py +5 -2
- cirq/work/observable_settings.py +13 -22
- cirq/work/observable_settings_test.py +9 -7
- cirq/work/pauli_sum_collector.py +12 -10
- cirq/work/pauli_sum_collector_test.py +9 -9
- cirq/work/sampler.py +42 -43
- cirq/work/sampler_test.py +31 -24
- cirq/work/zeros_sampler.py +6 -4
- cirq/work/zeros_sampler_test.py +7 -5
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
- cirq_core-1.6.0.dist-info/RECORD +1241 -0
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
- cirq_core-1.5.0.dev20250409222543.dist-info/RECORD +0 -1216
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
cirq/sim/density_matrix_utils.py
CHANGED
|
@@ -14,7 +14,9 @@
|
|
|
14
14
|
|
|
15
15
|
"""Code to handle density matrices."""
|
|
16
16
|
|
|
17
|
-
from
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
from typing import Sequence, TYPE_CHECKING
|
|
18
20
|
|
|
19
21
|
import numpy as np
|
|
20
22
|
|
|
@@ -29,9 +31,9 @@ def sample_density_matrix(
|
|
|
29
31
|
density_matrix: np.ndarray,
|
|
30
32
|
indices: Sequence[int],
|
|
31
33
|
*, # Force keyword arguments
|
|
32
|
-
qid_shape:
|
|
34
|
+
qid_shape: tuple[int, ...] | None = None,
|
|
33
35
|
repetitions: int = 1,
|
|
34
|
-
seed:
|
|
36
|
+
seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
|
|
35
37
|
) -> np.ndarray:
|
|
36
38
|
"""Samples repeatedly from measurements in the computational basis.
|
|
37
39
|
|
|
@@ -94,10 +96,10 @@ def sample_density_matrix(
|
|
|
94
96
|
def measure_density_matrix(
|
|
95
97
|
density_matrix: np.ndarray,
|
|
96
98
|
indices: Sequence[int],
|
|
97
|
-
qid_shape:
|
|
98
|
-
out:
|
|
99
|
-
seed:
|
|
100
|
-
) ->
|
|
99
|
+
qid_shape: tuple[int, ...] | None = None,
|
|
100
|
+
out: np.ndarray | None = None,
|
|
101
|
+
seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
|
|
102
|
+
) -> tuple[list[int], np.ndarray]:
|
|
101
103
|
"""Performs a measurement of the density matrix in the computational basis.
|
|
102
104
|
|
|
103
105
|
This does not modify `density_matrix` unless the optional `out` is
|
|
@@ -185,7 +187,7 @@ def measure_density_matrix(
|
|
|
185
187
|
|
|
186
188
|
|
|
187
189
|
def _probs(
|
|
188
|
-
density_matrix: np.ndarray, indices: Sequence[int], qid_shape:
|
|
190
|
+
density_matrix: np.ndarray, indices: Sequence[int], qid_shape: tuple[int, ...]
|
|
189
191
|
) -> np.ndarray:
|
|
190
192
|
"""Returns the probabilities for a measurement on the given indices."""
|
|
191
193
|
# Only diagonal elements matter.
|
|
@@ -195,8 +197,8 @@ def _probs(
|
|
|
195
197
|
|
|
196
198
|
|
|
197
199
|
def _validate_density_matrix_qid_shape(
|
|
198
|
-
density_matrix: np.ndarray, qid_shape:
|
|
199
|
-
) ->
|
|
200
|
+
density_matrix: np.ndarray, qid_shape: tuple[int, ...]
|
|
201
|
+
) -> tuple[int, ...]:
|
|
200
202
|
"""Validates that a tensor's shape is a valid shape for qids and returns the
|
|
201
203
|
qid shape.
|
|
202
204
|
"""
|
|
@@ -242,7 +244,7 @@ def _validate_num_qubits(density_matrix: np.ndarray) -> int:
|
|
|
242
244
|
return int(row_size).bit_length() - 1
|
|
243
245
|
|
|
244
246
|
|
|
245
|
-
def _indices_shape(qid_shape:
|
|
247
|
+
def _indices_shape(qid_shape: tuple[int, ...], indices: Sequence[int]) -> tuple[int, ...]:
|
|
246
248
|
"""Validates that the indices have values within range of `len(qid_shape)`."""
|
|
247
249
|
if any(index < 0 for index in indices):
|
|
248
250
|
raise IndexError(f'Negative index in indices: {indices}')
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import itertools
|
|
16
18
|
|
|
17
19
|
import numpy as np
|
|
@@ -21,7 +23,7 @@ import cirq
|
|
|
21
23
|
import cirq.testing
|
|
22
24
|
|
|
23
25
|
|
|
24
|
-
def test_sample_density_matrix_big_endian():
|
|
26
|
+
def test_sample_density_matrix_big_endian() -> None:
|
|
25
27
|
results = []
|
|
26
28
|
for x in range(8):
|
|
27
29
|
matrix = cirq.to_valid_density_matrix(x, 3)
|
|
@@ -32,7 +34,7 @@ def test_sample_density_matrix_big_endian():
|
|
|
32
34
|
np.testing.assert_equal(result, expected)
|
|
33
35
|
|
|
34
36
|
|
|
35
|
-
def test_sample_density_matrix_partial_indices():
|
|
37
|
+
def test_sample_density_matrix_partial_indices() -> None:
|
|
36
38
|
for index in range(3):
|
|
37
39
|
for x in range(8):
|
|
38
40
|
matrix = cirq.to_valid_density_matrix(x, 3)
|
|
@@ -41,14 +43,14 @@ def test_sample_density_matrix_partial_indices():
|
|
|
41
43
|
)
|
|
42
44
|
|
|
43
45
|
|
|
44
|
-
def test_sample_density_matrix_partial_indices_oder():
|
|
46
|
+
def test_sample_density_matrix_partial_indices_oder() -> None:
|
|
45
47
|
for x in range(8):
|
|
46
48
|
matrix = cirq.to_valid_density_matrix(x, 3)
|
|
47
49
|
expected = [[bool(1 & (x >> 0)), bool(1 & (x >> 1))]]
|
|
48
50
|
np.testing.assert_equal(cirq.sample_density_matrix(matrix, [2, 1]), expected)
|
|
49
51
|
|
|
50
52
|
|
|
51
|
-
def test_sample_density_matrix_partial_indices_all_orders():
|
|
53
|
+
def test_sample_density_matrix_partial_indices_all_orders() -> None:
|
|
52
54
|
for perm in itertools.permutations([0, 1, 2]):
|
|
53
55
|
for x in range(8):
|
|
54
56
|
matrix = cirq.to_valid_density_matrix(x, 3)
|
|
@@ -56,7 +58,7 @@ def test_sample_density_matrix_partial_indices_all_orders():
|
|
|
56
58
|
np.testing.assert_equal(cirq.sample_density_matrix(matrix, perm), expected)
|
|
57
59
|
|
|
58
60
|
|
|
59
|
-
def test_sample_density_matrix():
|
|
61
|
+
def test_sample_density_matrix() -> None:
|
|
60
62
|
state = np.zeros(8, dtype=np.complex64)
|
|
61
63
|
state[0] = 1 / np.sqrt(2)
|
|
62
64
|
state[2] = 1 / np.sqrt(2)
|
|
@@ -72,7 +74,7 @@ def test_sample_density_matrix():
|
|
|
72
74
|
np.testing.assert_equal(cirq.sample_density_matrix(matrix, [0]), [[False]])
|
|
73
75
|
|
|
74
76
|
|
|
75
|
-
def test_sample_density_matrix_seed():
|
|
77
|
+
def test_sample_density_matrix_seed() -> None:
|
|
76
78
|
density_matrix = 0.5 * np.eye(2)
|
|
77
79
|
|
|
78
80
|
samples = cirq.sample_density_matrix(density_matrix, [0], repetitions=10, seed=1234)
|
|
@@ -90,12 +92,12 @@ def test_sample_density_matrix_seed():
|
|
|
90
92
|
)
|
|
91
93
|
|
|
92
94
|
|
|
93
|
-
def test_sample_empty_density_matrix():
|
|
95
|
+
def test_sample_empty_density_matrix() -> None:
|
|
94
96
|
matrix = np.zeros(shape=())
|
|
95
97
|
np.testing.assert_almost_equal(cirq.sample_density_matrix(matrix, []), [[]])
|
|
96
98
|
|
|
97
99
|
|
|
98
|
-
def test_sample_density_matrix_no_repetitions():
|
|
100
|
+
def test_sample_density_matrix_no_repetitions() -> None:
|
|
99
101
|
matrix = cirq.to_valid_density_matrix(0, 3)
|
|
100
102
|
np.testing.assert_almost_equal(
|
|
101
103
|
cirq.sample_density_matrix(matrix, [1], repetitions=0), np.zeros(shape=(0, 1))
|
|
@@ -105,7 +107,7 @@ def test_sample_density_matrix_no_repetitions():
|
|
|
105
107
|
)
|
|
106
108
|
|
|
107
109
|
|
|
108
|
-
def test_sample_density_matrix_repetitions():
|
|
110
|
+
def test_sample_density_matrix_repetitions() -> None:
|
|
109
111
|
for perm in itertools.permutations([0, 1, 2]):
|
|
110
112
|
for x in range(8):
|
|
111
113
|
matrix = cirq.to_valid_density_matrix(x, 3)
|
|
@@ -115,30 +117,30 @@ def test_sample_density_matrix_repetitions():
|
|
|
115
117
|
np.testing.assert_equal(result, expected)
|
|
116
118
|
|
|
117
119
|
|
|
118
|
-
def test_sample_density_matrix_negative_repetitions():
|
|
120
|
+
def test_sample_density_matrix_negative_repetitions() -> None:
|
|
119
121
|
matrix = cirq.to_valid_density_matrix(0, 3)
|
|
120
122
|
with pytest.raises(ValueError, match='-1'):
|
|
121
123
|
cirq.sample_density_matrix(matrix, [1], repetitions=-1)
|
|
122
124
|
|
|
123
125
|
|
|
124
|
-
def test_sample_density_matrix_not_square():
|
|
126
|
+
def test_sample_density_matrix_not_square() -> None:
|
|
125
127
|
with pytest.raises(ValueError, match='not square'):
|
|
126
128
|
cirq.sample_density_matrix(np.array([1, 0, 0]), [1])
|
|
127
129
|
|
|
128
130
|
|
|
129
|
-
def test_sample_density_matrix_not_power_of_two():
|
|
131
|
+
def test_sample_density_matrix_not_power_of_two() -> None:
|
|
130
132
|
with pytest.raises(ValueError, match='power of two'):
|
|
131
133
|
cirq.sample_density_matrix(np.ones((3, 3)) / 3, [1])
|
|
132
134
|
with pytest.raises(ValueError, match='power of two'):
|
|
133
135
|
cirq.sample_density_matrix(np.ones((2, 3, 2, 3)) / 6, [1])
|
|
134
136
|
|
|
135
137
|
|
|
136
|
-
def test_sample_density_matrix_higher_powers_of_two():
|
|
138
|
+
def test_sample_density_matrix_higher_powers_of_two() -> None:
|
|
137
139
|
with pytest.raises(ValueError, match='powers of two'):
|
|
138
140
|
cirq.sample_density_matrix(np.ones((2, 4, 2, 4)) / 8, [1])
|
|
139
141
|
|
|
140
142
|
|
|
141
|
-
def test_sample_density_matrix_out_of_range():
|
|
143
|
+
def test_sample_density_matrix_out_of_range() -> None:
|
|
142
144
|
matrix = cirq.to_valid_density_matrix(0, 3)
|
|
143
145
|
with pytest.raises(IndexError, match='-2'):
|
|
144
146
|
cirq.sample_density_matrix(matrix, [-2])
|
|
@@ -146,13 +148,13 @@ def test_sample_density_matrix_out_of_range():
|
|
|
146
148
|
cirq.sample_density_matrix(matrix, [3])
|
|
147
149
|
|
|
148
150
|
|
|
149
|
-
def test_sample_density_matrix_no_indices():
|
|
151
|
+
def test_sample_density_matrix_no_indices() -> None:
|
|
150
152
|
matrix = cirq.to_valid_density_matrix(0, 3)
|
|
151
153
|
bits = cirq.sample_density_matrix(matrix, [])
|
|
152
154
|
np.testing.assert_almost_equal(bits, np.zeros(shape=(1, 0)))
|
|
153
155
|
|
|
154
156
|
|
|
155
|
-
def test_sample_density_matrix_validate_qid_shape():
|
|
157
|
+
def test_sample_density_matrix_validate_qid_shape() -> None:
|
|
156
158
|
matrix = cirq.to_valid_density_matrix(0, 3)
|
|
157
159
|
cirq.sample_density_matrix(matrix, [], qid_shape=(2, 2, 2))
|
|
158
160
|
with pytest.raises(ValueError, match='Matrix size does not match qid shape'):
|
|
@@ -163,7 +165,7 @@ def test_sample_density_matrix_validate_qid_shape():
|
|
|
163
165
|
cirq.sample_density_matrix(matrix2, [], qid_shape=(2, 2, 2))
|
|
164
166
|
|
|
165
167
|
|
|
166
|
-
def test_measure_density_matrix_computational_basis():
|
|
168
|
+
def test_measure_density_matrix_computational_basis() -> None:
|
|
167
169
|
results = []
|
|
168
170
|
for x in range(8):
|
|
169
171
|
matrix = cirq.to_valid_density_matrix(x, 3)
|
|
@@ -174,7 +176,7 @@ def test_measure_density_matrix_computational_basis():
|
|
|
174
176
|
assert results == expected
|
|
175
177
|
|
|
176
178
|
|
|
177
|
-
def test_measure_density_matrix_computational_basis_reversed():
|
|
179
|
+
def test_measure_density_matrix_computational_basis_reversed() -> None:
|
|
178
180
|
results = []
|
|
179
181
|
for x in range(8):
|
|
180
182
|
matrix = cirq.to_valid_density_matrix(x, 3)
|
|
@@ -185,7 +187,7 @@ def test_measure_density_matrix_computational_basis_reversed():
|
|
|
185
187
|
assert results == expected
|
|
186
188
|
|
|
187
189
|
|
|
188
|
-
def test_measure_density_matrix_computational_basis_reshaped():
|
|
190
|
+
def test_measure_density_matrix_computational_basis_reshaped() -> None:
|
|
189
191
|
results = []
|
|
190
192
|
for x in range(8):
|
|
191
193
|
matrix = np.reshape(cirq.to_valid_density_matrix(x, 3), (2,) * 6)
|
|
@@ -196,7 +198,7 @@ def test_measure_density_matrix_computational_basis_reshaped():
|
|
|
196
198
|
assert results == expected
|
|
197
199
|
|
|
198
200
|
|
|
199
|
-
def test_measure_density_matrix_partial_indices():
|
|
201
|
+
def test_measure_density_matrix_partial_indices() -> None:
|
|
200
202
|
for index in range(3):
|
|
201
203
|
for x in range(8):
|
|
202
204
|
matrix = cirq.to_valid_density_matrix(x, 3)
|
|
@@ -205,7 +207,7 @@ def test_measure_density_matrix_partial_indices():
|
|
|
205
207
|
assert bits == [bool(1 & (x >> (2 - index)))]
|
|
206
208
|
|
|
207
209
|
|
|
208
|
-
def test_measure_density_matrix_partial_indices_all_orders():
|
|
210
|
+
def test_measure_density_matrix_partial_indices_all_orders() -> None:
|
|
209
211
|
for perm in itertools.permutations([0, 1, 2]):
|
|
210
212
|
for x in range(8):
|
|
211
213
|
matrix = cirq.to_valid_density_matrix(x, 3)
|
|
@@ -221,7 +223,7 @@ def matrix_000_plus_010():
|
|
|
221
223
|
return cirq.to_valid_density_matrix(state, num_qubits=3)
|
|
222
224
|
|
|
223
225
|
|
|
224
|
-
def test_measure_density_matrix_collapse():
|
|
226
|
+
def test_measure_density_matrix_collapse() -> None:
|
|
225
227
|
matrix = matrix_000_plus_010()
|
|
226
228
|
for _ in range(10):
|
|
227
229
|
bits, out_matrix = cirq.measure_density_matrix(matrix, [2, 1, 0])
|
|
@@ -246,7 +248,7 @@ def test_measure_density_matrix_collapse():
|
|
|
246
248
|
assert bits == [False]
|
|
247
249
|
|
|
248
250
|
|
|
249
|
-
def test_measure_density_matrix_seed():
|
|
251
|
+
def test_measure_density_matrix_seed() -> None:
|
|
250
252
|
n = 5
|
|
251
253
|
matrix = np.eye(2**n) / 2**n
|
|
252
254
|
|
|
@@ -261,7 +263,7 @@ def test_measure_density_matrix_seed():
|
|
|
261
263
|
np.testing.assert_allclose(out_matrix1, out_matrix2)
|
|
262
264
|
|
|
263
265
|
|
|
264
|
-
def test_measure_density_matrix_out_is_matrix():
|
|
266
|
+
def test_measure_density_matrix_out_is_matrix() -> None:
|
|
265
267
|
matrix = matrix_000_plus_010()
|
|
266
268
|
bits, out_matrix = cirq.measure_density_matrix(matrix, [2, 1, 0], out=matrix)
|
|
267
269
|
expected_state = np.zeros(8, dtype=np.complex64)
|
|
@@ -271,7 +273,7 @@ def test_measure_density_matrix_out_is_matrix():
|
|
|
271
273
|
assert out_matrix is matrix
|
|
272
274
|
|
|
273
275
|
|
|
274
|
-
def test_measure_state_out_is_not_matrix():
|
|
276
|
+
def test_measure_state_out_is_not_matrix() -> None:
|
|
275
277
|
matrix = matrix_000_plus_010()
|
|
276
278
|
out = np.zeros_like(matrix)
|
|
277
279
|
_, out_matrix = cirq.measure_density_matrix(matrix, [2, 1, 0], out=out)
|
|
@@ -279,7 +281,7 @@ def test_measure_state_out_is_not_matrix():
|
|
|
279
281
|
assert out is out_matrix
|
|
280
282
|
|
|
281
283
|
|
|
282
|
-
def test_measure_density_matrix_not_square():
|
|
284
|
+
def test_measure_density_matrix_not_square() -> None:
|
|
283
285
|
with pytest.raises(ValueError, match='not square'):
|
|
284
286
|
cirq.measure_density_matrix(np.array([1, 0, 0]), [1])
|
|
285
287
|
with pytest.raises(ValueError, match='not square'):
|
|
@@ -288,26 +290,26 @@ def test_measure_density_matrix_not_square():
|
|
|
288
290
|
)
|
|
289
291
|
|
|
290
292
|
|
|
291
|
-
def test_measure_density_matrix_not_power_of_two():
|
|
293
|
+
def test_measure_density_matrix_not_power_of_two() -> None:
|
|
292
294
|
with pytest.raises(ValueError, match='power of two'):
|
|
293
295
|
cirq.measure_density_matrix(np.ones((3, 3)) / 3, [1])
|
|
294
296
|
with pytest.raises(ValueError, match='power of two'):
|
|
295
297
|
cirq.measure_density_matrix(np.ones((2, 3, 2, 3)) / 6, [1])
|
|
296
298
|
|
|
297
299
|
|
|
298
|
-
def test_measure_density_matrix_higher_powers_of_two():
|
|
300
|
+
def test_measure_density_matrix_higher_powers_of_two() -> None:
|
|
299
301
|
with pytest.raises(ValueError, match='powers of two'):
|
|
300
302
|
cirq.measure_density_matrix(np.ones((2, 4, 2, 4)) / 8, [1])
|
|
301
303
|
|
|
302
304
|
|
|
303
|
-
def test_measure_density_matrix_tensor_different_left_right_shape():
|
|
305
|
+
def test_measure_density_matrix_tensor_different_left_right_shape() -> None:
|
|
304
306
|
with pytest.raises(ValueError, match='not equal'):
|
|
305
307
|
cirq.measure_density_matrix(
|
|
306
308
|
np.array([1, 0, 0, 0]).reshape((2, 2, 1, 1)), [1], qid_shape=(2, 1)
|
|
307
309
|
)
|
|
308
310
|
|
|
309
311
|
|
|
310
|
-
def test_measure_density_matrix_out_of_range():
|
|
312
|
+
def test_measure_density_matrix_out_of_range() -> None:
|
|
311
313
|
matrix = cirq.to_valid_density_matrix(0, 3)
|
|
312
314
|
with pytest.raises(IndexError, match='-2'):
|
|
313
315
|
cirq.measure_density_matrix(matrix, [-2])
|
|
@@ -315,14 +317,14 @@ def test_measure_density_matrix_out_of_range():
|
|
|
315
317
|
cirq.measure_density_matrix(matrix, [3])
|
|
316
318
|
|
|
317
319
|
|
|
318
|
-
def test_measure_state_no_indices():
|
|
320
|
+
def test_measure_state_no_indices() -> None:
|
|
319
321
|
matrix = cirq.to_valid_density_matrix(0, 3)
|
|
320
322
|
bits, out_matrix = cirq.measure_density_matrix(matrix, [])
|
|
321
323
|
assert [] == bits
|
|
322
324
|
np.testing.assert_almost_equal(out_matrix, matrix)
|
|
323
325
|
|
|
324
326
|
|
|
325
|
-
def test_measure_state_no_indices_out_is_matrix():
|
|
327
|
+
def test_measure_state_no_indices_out_is_matrix() -> None:
|
|
326
328
|
matrix = cirq.to_valid_density_matrix(0, 3)
|
|
327
329
|
bits, out_matrix = cirq.measure_density_matrix(matrix, [], out=matrix)
|
|
328
330
|
assert [] == bits
|
|
@@ -330,7 +332,7 @@ def test_measure_state_no_indices_out_is_matrix():
|
|
|
330
332
|
assert out_matrix is matrix
|
|
331
333
|
|
|
332
334
|
|
|
333
|
-
def test_measure_state_no_indices_out_is_not_matrix():
|
|
335
|
+
def test_measure_state_no_indices_out_is_not_matrix() -> None:
|
|
334
336
|
matrix = cirq.to_valid_density_matrix(0, 3)
|
|
335
337
|
out = np.zeros_like(matrix)
|
|
336
338
|
bits, out_matrix = cirq.measure_density_matrix(matrix, [], out=out)
|
|
@@ -340,7 +342,7 @@ def test_measure_state_no_indices_out_is_not_matrix():
|
|
|
340
342
|
assert out is not matrix
|
|
341
343
|
|
|
342
344
|
|
|
343
|
-
def test_measure_state_empty_density_matrix():
|
|
345
|
+
def test_measure_state_empty_density_matrix() -> None:
|
|
344
346
|
matrix = np.zeros(shape=())
|
|
345
347
|
bits, out_matrix = cirq.measure_density_matrix(matrix, [])
|
|
346
348
|
assert [] == bits
|
|
@@ -350,14 +352,14 @@ def test_measure_state_empty_density_matrix():
|
|
|
350
352
|
@pytest.mark.parametrize('seed', [17, 35, 48])
|
|
351
353
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
352
354
|
@pytest.mark.parametrize('split', [False, True])
|
|
353
|
-
def test_to_valid_density_matrix_on_simulator_output(seed, dtype, split):
|
|
355
|
+
def test_to_valid_density_matrix_on_simulator_output(seed, dtype, split) -> None:
|
|
354
356
|
circuit = cirq.testing.random_circuit(qubits=5, n_moments=20, op_density=0.9, random_state=seed)
|
|
355
357
|
simulator = cirq.DensityMatrixSimulator(split_untangled_states=split, dtype=dtype)
|
|
356
358
|
result = simulator.simulate(circuit)
|
|
357
359
|
_ = cirq.to_valid_density_matrix(result.final_density_matrix, num_qubits=5, atol=1e-6)
|
|
358
360
|
|
|
359
361
|
|
|
360
|
-
def test_factor_validation():
|
|
362
|
+
def test_factor_validation() -> None:
|
|
361
363
|
args = cirq.DensityMatrixSimulator()._create_simulation_state(0, qubits=cirq.LineQubit.range(2))
|
|
362
364
|
args.apply_operation(cirq.H(cirq.LineQubit(0)))
|
|
363
365
|
t = args.create_merged_state().target_tensor
|
cirq/sim/mux.py
CHANGED
|
@@ -17,7 +17,9 @@
|
|
|
17
17
|
Filename is a reference to multiplexing.
|
|
18
18
|
"""
|
|
19
19
|
|
|
20
|
-
from
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
from typing import Sequence, TYPE_CHECKING
|
|
21
23
|
|
|
22
24
|
import numpy as np
|
|
23
25
|
|
|
@@ -30,7 +32,7 @@ from cirq.transformers import measurement_transformers
|
|
|
30
32
|
if TYPE_CHECKING:
|
|
31
33
|
import cirq
|
|
32
34
|
|
|
33
|
-
CIRCUIT_LIKE =
|
|
35
|
+
CIRCUIT_LIKE = circuits.Circuit | ops.Gate | ops.OP_TREE
|
|
34
36
|
document(
|
|
35
37
|
CIRCUIT_LIKE,
|
|
36
38
|
"""A `circuits.Circuit` or a value that can be trivially converted into it:
|
|
@@ -39,7 +41,7 @@ document(
|
|
|
39
41
|
)
|
|
40
42
|
|
|
41
43
|
|
|
42
|
-
def _is_clifford_circuit(program:
|
|
44
|
+
def _is_clifford_circuit(program: cirq.Circuit) -> bool:
|
|
43
45
|
return all(
|
|
44
46
|
clifford_simulator.CliffordSimulator.is_supported_operation(op)
|
|
45
47
|
for op in program.all_operations()
|
|
@@ -47,14 +49,14 @@ def _is_clifford_circuit(program: 'cirq.Circuit') -> bool:
|
|
|
47
49
|
|
|
48
50
|
|
|
49
51
|
def sample(
|
|
50
|
-
program:
|
|
52
|
+
program: cirq.Circuit,
|
|
51
53
|
*,
|
|
52
|
-
noise:
|
|
53
|
-
param_resolver:
|
|
54
|
+
noise: cirq.NOISE_MODEL_LIKE = None,
|
|
55
|
+
param_resolver: cirq.ParamResolver | None = None,
|
|
54
56
|
repetitions: int = 1,
|
|
55
|
-
dtype:
|
|
56
|
-
seed:
|
|
57
|
-
) ->
|
|
57
|
+
dtype: type[np.complexfloating] = np.complex64,
|
|
58
|
+
seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
|
|
59
|
+
) -> cirq.Result:
|
|
58
60
|
"""Simulates sampling from the given circuit.
|
|
59
61
|
|
|
60
62
|
Args:
|
|
@@ -90,7 +92,7 @@ def sample(
|
|
|
90
92
|
).run(program=program, param_resolver=param_resolver, repetitions=repetitions)
|
|
91
93
|
|
|
92
94
|
|
|
93
|
-
def _to_circuit(program:
|
|
95
|
+
def _to_circuit(program: cirq.CIRCUIT_LIKE) -> cirq.Circuit:
|
|
94
96
|
if isinstance(program, circuits.Circuit):
|
|
95
97
|
# No change needed.
|
|
96
98
|
result = program
|
|
@@ -103,14 +105,14 @@ def _to_circuit(program: 'cirq.CIRCUIT_LIKE') -> 'cirq.Circuit':
|
|
|
103
105
|
|
|
104
106
|
|
|
105
107
|
def final_state_vector(
|
|
106
|
-
program:
|
|
108
|
+
program: cirq.CIRCUIT_LIKE,
|
|
107
109
|
*,
|
|
108
|
-
initial_state:
|
|
109
|
-
param_resolver:
|
|
110
|
-
qubit_order:
|
|
110
|
+
initial_state: cirq.STATE_VECTOR_LIKE = 0,
|
|
111
|
+
param_resolver: cirq.ParamResolverOrSimilarType = None,
|
|
112
|
+
qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
|
|
111
113
|
ignore_terminal_measurements: bool = False,
|
|
112
|
-
dtype:
|
|
113
|
-
seed:
|
|
114
|
+
dtype: type[np.complexfloating] = np.complex64,
|
|
115
|
+
seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
|
|
114
116
|
) -> np.ndarray:
|
|
115
117
|
"""Returns the state vector resulting from acting operations on a state.
|
|
116
118
|
|
|
@@ -174,14 +176,14 @@ def final_state_vector(
|
|
|
174
176
|
|
|
175
177
|
|
|
176
178
|
def sample_sweep(
|
|
177
|
-
program:
|
|
178
|
-
params:
|
|
179
|
+
program: cirq.Circuit,
|
|
180
|
+
params: cirq.Sweepable,
|
|
179
181
|
*,
|
|
180
|
-
noise:
|
|
182
|
+
noise: cirq.NOISE_MODEL_LIKE = None,
|
|
181
183
|
repetitions: int = 1,
|
|
182
|
-
dtype:
|
|
183
|
-
seed:
|
|
184
|
-
) -> Sequence[
|
|
184
|
+
dtype: type[np.complexfloating] = np.complex64,
|
|
185
|
+
seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
|
|
186
|
+
) -> Sequence[cirq.Result]:
|
|
185
187
|
"""Runs the supplied Circuit, mimicking quantum hardware.
|
|
186
188
|
|
|
187
189
|
In contrast to run, this allows for sweeping over different parameter
|
|
@@ -204,7 +206,7 @@ def sample_sweep(
|
|
|
204
206
|
"""
|
|
205
207
|
prng = value.parse_random_state(seed)
|
|
206
208
|
|
|
207
|
-
trial_results:
|
|
209
|
+
trial_results: list[study.Result] = []
|
|
208
210
|
for param_resolver in study.to_resolvers(params):
|
|
209
211
|
measurements = sample(
|
|
210
212
|
program,
|
|
@@ -219,16 +221,16 @@ def sample_sweep(
|
|
|
219
221
|
|
|
220
222
|
|
|
221
223
|
def final_density_matrix(
|
|
222
|
-
program:
|
|
224
|
+
program: cirq.CIRCUIT_LIKE,
|
|
223
225
|
*,
|
|
224
|
-
noise:
|
|
225
|
-
initial_state:
|
|
226
|
-
param_resolver:
|
|
227
|
-
qubit_order:
|
|
228
|
-
dtype:
|
|
229
|
-
seed:
|
|
226
|
+
noise: cirq.NOISE_MODEL_LIKE = None,
|
|
227
|
+
initial_state: cirq.STATE_VECTOR_LIKE = 0,
|
|
228
|
+
param_resolver: cirq.ParamResolverOrSimilarType = None,
|
|
229
|
+
qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
|
|
230
|
+
dtype: type[np.complexfloating] = np.complex64,
|
|
231
|
+
seed: int | np.random.RandomState | None = None,
|
|
230
232
|
ignore_measurement_results: bool = True,
|
|
231
|
-
) ->
|
|
233
|
+
) -> np.ndarray:
|
|
232
234
|
"""Returns the density matrix resulting from simulating the circuit.
|
|
233
235
|
|
|
234
236
|
Note that, unlike `cirq.final_state_vector`, terminal measurements
|
cirq/sim/mux_test.py
CHANGED
|
@@ -12,8 +12,10 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
from collections import abc
|
|
16
|
-
from typing import Any,
|
|
18
|
+
from typing import Any, Generic, Iterator, Mapping, Sequence, TYPE_CHECKING
|
|
17
19
|
|
|
18
20
|
import numpy as np
|
|
19
21
|
|
|
@@ -32,10 +34,10 @@ class SimulationProductState(
|
|
|
32
34
|
|
|
33
35
|
def __init__(
|
|
34
36
|
self,
|
|
35
|
-
sim_states:
|
|
36
|
-
qubits: Sequence[
|
|
37
|
+
sim_states: dict[cirq.Qid | None, TSimulationState],
|
|
38
|
+
qubits: Sequence[cirq.Qid],
|
|
37
39
|
split_untangled_states: bool,
|
|
38
|
-
classical_data:
|
|
40
|
+
classical_data: cirq.ClassicalDataStore | None = None,
|
|
39
41
|
):
|
|
40
42
|
"""Initializes the class.
|
|
41
43
|
|
|
@@ -55,7 +57,7 @@ class SimulationProductState(
|
|
|
55
57
|
self._split_untangled_states = split_untangled_states
|
|
56
58
|
|
|
57
59
|
@property
|
|
58
|
-
def sim_states(self) -> Mapping[
|
|
60
|
+
def sim_states(self) -> Mapping[cirq.Qid | None, TSimulationState]:
|
|
59
61
|
return self._sim_states
|
|
60
62
|
|
|
61
63
|
@property
|
|
@@ -78,7 +80,7 @@ class SimulationProductState(
|
|
|
78
80
|
return merged_state.transpose_to_qubit_order(self.qubits, inplace=True)
|
|
79
81
|
|
|
80
82
|
def _act_on_fallback_(
|
|
81
|
-
self, action: Any, qubits: Sequence[
|
|
83
|
+
self, action: Any, qubits: Sequence[cirq.Qid], allow_decompose: bool = True
|
|
82
84
|
) -> bool:
|
|
83
85
|
gate_opt = (
|
|
84
86
|
action
|
|
@@ -106,7 +108,7 @@ class SimulationProductState(
|
|
|
106
108
|
|
|
107
109
|
# Go through the op's qubits and join any disparate SimulationState states
|
|
108
110
|
# into a new combined state.
|
|
109
|
-
op_args_opt:
|
|
111
|
+
op_args_opt: TSimulationState | None = None
|
|
110
112
|
for q in qubits:
|
|
111
113
|
if op_args_opt is None:
|
|
112
114
|
op_args_opt = self.sim_states[q]
|
|
@@ -136,9 +138,7 @@ class SimulationProductState(
|
|
|
136
138
|
self._sim_states[q] = op_args
|
|
137
139
|
return True
|
|
138
140
|
|
|
139
|
-
def copy(
|
|
140
|
-
self, deep_copy_buffers: bool = True
|
|
141
|
-
) -> 'cirq.SimulationProductState[TSimulationState]':
|
|
141
|
+
def copy(self, deep_copy_buffers: bool = True) -> cirq.SimulationProductState[TSimulationState]:
|
|
142
142
|
classical_data = self._classical_data.copy()
|
|
143
143
|
copies = {}
|
|
144
144
|
for sim_state in set(self.sim_states.values()):
|
|
@@ -152,12 +152,12 @@ class SimulationProductState(
|
|
|
152
152
|
|
|
153
153
|
def sample(
|
|
154
154
|
self,
|
|
155
|
-
qubits:
|
|
155
|
+
qubits: list[cirq.Qid],
|
|
156
156
|
repetitions: int = 1,
|
|
157
|
-
seed:
|
|
157
|
+
seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
|
|
158
158
|
) -> np.ndarray:
|
|
159
159
|
columns = []
|
|
160
|
-
selected_order:
|
|
160
|
+
selected_order: list[ops.Qid] = []
|
|
161
161
|
q_set = set(qubits)
|
|
162
162
|
for v in dict.fromkeys(self.sim_states.values()):
|
|
163
163
|
qs = [q for q in v.qubits if q in q_set]
|
|
@@ -170,11 +170,11 @@ class SimulationProductState(
|
|
|
170
170
|
index_order = [qubit_map[q] for q in qubits]
|
|
171
171
|
return stacked[:, index_order]
|
|
172
172
|
|
|
173
|
-
def __getitem__(self, item:
|
|
173
|
+
def __getitem__(self, item: cirq.Qid | None) -> TSimulationState:
|
|
174
174
|
return self.sim_states[item]
|
|
175
175
|
|
|
176
176
|
def __len__(self) -> int:
|
|
177
177
|
return len(self.sim_states)
|
|
178
178
|
|
|
179
|
-
def __iter__(self) -> Iterator[
|
|
179
|
+
def __iter__(self) -> Iterator[cirq.Qid | None]:
|
|
180
180
|
return iter(self.sim_states)
|