cirq-core 1.5.0.dev20250409225226__py3-none-any.whl → 1.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of cirq-core might be problematic. Click here for more details.
- cirq/__init__.py +16 -17
- cirq/_compat.py +21 -20
- cirq/_compat_test.py +14 -34
- cirq/_doc.py +4 -2
- cirq/_import.py +8 -6
- cirq/_import_test.py +4 -2
- cirq/_version.py +6 -6
- cirq/_version_test.py +2 -2
- cirq/circuits/_block_diagram_drawer.py +11 -10
- cirq/circuits/_block_diagram_drawer_test.py +8 -6
- cirq/circuits/_box_drawing_character_data.py +8 -8
- cirq/circuits/_box_drawing_character_data_test.py +3 -1
- cirq/circuits/_bucket_priority_queue.py +9 -7
- cirq/circuits/_bucket_priority_queue_test.py +22 -20
- cirq/circuits/circuit.py +248 -172
- cirq/circuits/circuit_operation.py +73 -83
- cirq/circuits/circuit_operation_test.py +128 -90
- cirq/circuits/circuit_test.py +211 -151
- cirq/circuits/frozen_circuit.py +23 -60
- cirq/circuits/frozen_circuit_test.py +31 -8
- cirq/circuits/insert_strategy.py +7 -5
- cirq/circuits/insert_strategy_test.py +4 -2
- cirq/circuits/moment.py +88 -40
- cirq/circuits/moment_test.py +128 -51
- cirq/circuits/optimization_pass.py +5 -5
- cirq/circuits/optimization_pass_test.py +10 -10
- cirq/circuits/qasm_output.py +11 -11
- cirq/circuits/qasm_output_test.py +25 -22
- cirq/circuits/text_diagram_drawer.py +23 -38
- cirq/circuits/text_diagram_drawer_test.py +19 -17
- cirq/conftest.py +4 -3
- cirq/contrib/__init__.py +4 -4
- cirq/contrib/acquaintance/__init__.py +1 -1
- cirq/contrib/acquaintance/bipartite.py +5 -8
- cirq/contrib/acquaintance/bipartite_test.py +18 -13
- cirq/contrib/acquaintance/devices.py +2 -2
- cirq/contrib/acquaintance/devices_test.py +5 -3
- cirq/contrib/acquaintance/executor.py +5 -5
- cirq/contrib/acquaintance/executor_test.py +13 -9
- cirq/contrib/acquaintance/gates.py +18 -28
- cirq/contrib/acquaintance/gates_test.py +24 -20
- cirq/contrib/acquaintance/inspection_utils.py +8 -4
- cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
- cirq/contrib/acquaintance/mutation_utils.py +4 -4
- cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
- cirq/contrib/acquaintance/optimizers.py +4 -4
- cirq/contrib/acquaintance/optimizers_test.py +4 -1
- cirq/contrib/acquaintance/permutation.py +15 -27
- cirq/contrib/acquaintance/permutation_test.py +26 -17
- cirq/contrib/acquaintance/shift.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
- cirq/contrib/acquaintance/shift_test.py +8 -6
- cirq/contrib/acquaintance/strategies/cubic.py +2 -2
- cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
- cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
- cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
- cirq/contrib/acquaintance/testing.py +2 -0
- cirq/contrib/acquaintance/topological_sort.py +2 -2
- cirq/contrib/acquaintance/topological_sort_test.py +3 -1
- cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
- cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
- cirq/contrib/circuitdag/circuit_dag.py +4 -4
- cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
- cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
- cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
- cirq/contrib/graph_device/graph_device.py +12 -11
- cirq/contrib/graph_device/graph_device_test.py +18 -14
- cirq/contrib/graph_device/hypergraph.py +16 -14
- cirq/contrib/graph_device/hypergraph_test.py +13 -11
- cirq/contrib/graph_device/uniform_graph_device.py +6 -4
- cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
- cirq/contrib/hacks/disable_validation.py +6 -1
- cirq/contrib/hacks/disable_validation_test.py +3 -1
- cirq/contrib/json.py +31 -5
- cirq/contrib/json_test.py +6 -3
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/__init__.py +17 -0
- cirq/contrib/json_test_data/spec.py +32 -0
- cirq/contrib/noise_models/noise_models.py +119 -5
- cirq/contrib/noise_models/noise_models_test.py +37 -9
- cirq/contrib/paulistring/clifford_optimize.py +6 -4
- cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
- cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
- cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
- cirq/contrib/paulistring/optimize.py +2 -0
- cirq/contrib/paulistring/optimize_test.py +4 -3
- cirq/contrib/paulistring/pauli_string_dag.py +2 -0
- cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
- cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
- cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
- cirq/contrib/paulistring/recombine.py +6 -4
- cirq/contrib/paulistring/recombine_test.py +3 -1
- cirq/contrib/paulistring/separate.py +9 -6
- cirq/contrib/paulistring/separate_test.py +3 -1
- cirq/contrib/qasm_import/_lexer.py +3 -2
- cirq/contrib/qasm_import/_lexer_test.py +49 -13
- cirq/contrib/qasm_import/_parser.py +547 -83
- cirq/contrib/qasm_import/_parser_test.py +988 -97
- cirq/contrib/qasm_import/exception.py +2 -0
- cirq/contrib/qasm_import/qasm.py +8 -2
- cirq/contrib/qasm_import/qasm_test.py +7 -4
- cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
- cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
- cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
- cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
- cirq/contrib/qcircuit/qcircuit_test.py +10 -8
- cirq/contrib/quantum_volume/quantum_volume.py +31 -27
- cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
- cirq/contrib/quimb/density_matrix.py +15 -14
- cirq/contrib/quimb/density_matrix_test.py +10 -7
- cirq/contrib/quimb/grid_circuits.py +5 -2
- cirq/contrib/quimb/grid_circuits_test.py +3 -0
- cirq/contrib/quimb/mps_simulator.py +20 -20
- cirq/contrib/quimb/mps_simulator_test.py +3 -0
- cirq/contrib/quimb/state_vector.py +12 -11
- cirq/contrib/quimb/state_vector_test.py +3 -0
- cirq/contrib/quirk/export_to_quirk.py +5 -3
- cirq/contrib/quirk/export_to_quirk_test.py +18 -16
- cirq/contrib/quirk/linearize_circuit.py +2 -0
- cirq/contrib/quirk/quirk_gate.py +18 -17
- cirq/contrib/routing/device.py +5 -3
- cirq/contrib/routing/device_test.py +2 -0
- cirq/contrib/routing/greedy.py +10 -21
- cirq/contrib/routing/greedy_test.py +4 -2
- cirq/contrib/routing/initialization.py +2 -2
- cirq/contrib/routing/initialization_test.py +5 -3
- cirq/contrib/routing/router.py +9 -5
- cirq/contrib/routing/router_test.py +2 -0
- cirq/contrib/routing/swap_network.py +3 -3
- cirq/contrib/routing/swap_network_test.py +3 -1
- cirq/contrib/routing/utils.py +2 -2
- cirq/contrib/routing/utils_test.py +3 -0
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
- cirq/contrib/svg/svg.py +3 -3
- cirq/contrib/svg/svg_test.py +8 -5
- cirq/devices/device.py +4 -4
- cirq/devices/device_test.py +7 -4
- cirq/devices/grid_device_metadata.py +10 -10
- cirq/devices/grid_device_metadata_test.py +3 -0
- cirq/devices/grid_qubit.py +29 -21
- cirq/devices/grid_qubit_test.py +3 -0
- cirq/devices/insertion_noise_model.py +7 -7
- cirq/devices/insertion_noise_model_test.py +7 -5
- cirq/devices/line_qubit.py +13 -13
- cirq/devices/line_qubit_test.py +2 -0
- cirq/devices/named_topologies.py +18 -29
- cirq/devices/named_topologies_test.py +13 -10
- cirq/devices/noise_model.py +3 -3
- cirq/devices/noise_model_test.py +19 -15
- cirq/devices/noise_properties.py +15 -6
- cirq/devices/noise_properties_test.py +34 -3
- cirq/devices/noise_utils.py +11 -9
- cirq/devices/noise_utils_test.py +2 -0
- cirq/devices/superconducting_qubits_noise_properties.py +23 -22
- cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
- cirq/devices/thermal_noise_model.py +107 -37
- cirq/devices/thermal_noise_model_test.py +21 -0
- cirq/devices/unconstrained_device.py +5 -3
- cirq/devices/unconstrained_device_test.py +2 -0
- cirq/experiments/__init__.py +4 -2
- cirq/experiments/benchmarking/__init__.py +17 -0
- cirq/experiments/benchmarking/parallel_xeb.py +677 -0
- cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
- cirq/experiments/fidelity_estimation.py +14 -8
- cirq/experiments/fidelity_estimation_test.py +3 -0
- cirq/experiments/n_qubit_tomography.py +17 -16
- cirq/experiments/n_qubit_tomography_test.py +8 -5
- cirq/experiments/purity_estimation.py +2 -0
- cirq/experiments/purity_estimation_test.py +2 -0
- cirq/experiments/qubit_characterizations.py +207 -103
- cirq/experiments/qubit_characterizations_test.py +40 -12
- cirq/experiments/random_quantum_circuit_generation.py +56 -70
- cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
- cirq/experiments/readout_confusion_matrix.py +24 -22
- cirq/experiments/readout_confusion_matrix_test.py +2 -0
- cirq/experiments/single_qubit_readout_calibration.py +30 -15
- cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
- cirq/experiments/t1_decay_experiment.py +9 -7
- cirq/experiments/t1_decay_experiment_test.py +13 -11
- cirq/experiments/t2_decay_experiment.py +16 -13
- cirq/experiments/t2_decay_experiment_test.py +2 -0
- cirq/experiments/two_qubit_xeb.py +64 -57
- cirq/experiments/two_qubit_xeb_test.py +10 -6
- cirq/experiments/xeb_fitting.py +39 -35
- cirq/experiments/xeb_sampling.py +37 -44
- cirq/experiments/xeb_sampling_test.py +3 -0
- cirq/experiments/xeb_simulation.py +14 -10
- cirq/experiments/xeb_simulation_test.py +5 -5
- cirq/experiments/z_phase_calibration.py +32 -29
- cirq/experiments/z_phase_calibration_test.py +3 -4
- cirq/interop/quirk/cells/__init__.py +1 -1
- cirq/interop/quirk/cells/all_cells.py +7 -2
- cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
- cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
- cirq/interop/quirk/cells/cell.py +19 -28
- cirq/interop/quirk/cells/cell_test.py +3 -0
- cirq/interop/quirk/cells/composite_cell.py +13 -28
- cirq/interop/quirk/cells/composite_cell_test.py +2 -0
- cirq/interop/quirk/cells/control_cells.py +15 -15
- cirq/interop/quirk/cells/control_cells_test.py +7 -5
- cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
- cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
- cirq/interop/quirk/cells/ignored_cells.py +3 -0
- cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
- cirq/interop/quirk/cells/input_cells.py +7 -5
- cirq/interop/quirk/cells/input_cells_test.py +7 -5
- cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
- cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
- cirq/interop/quirk/cells/measurement_cells.py +5 -2
- cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
- cirq/interop/quirk/cells/parse.py +22 -23
- cirq/interop/quirk/cells/parse_test.py +12 -10
- cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
- cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
- cirq/interop/quirk/cells/scalar_cells.py +4 -1
- cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
- cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
- cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
- cirq/interop/quirk/cells/swap_cell.py +8 -6
- cirq/interop/quirk/cells/swap_cell_test.py +6 -4
- cirq/interop/quirk/cells/testing.py +6 -6
- cirq/interop/quirk/cells/testing_test.py +8 -6
- cirq/interop/quirk/cells/unsupported_cells.py +3 -0
- cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
- cirq/interop/quirk/url_to_circuit.py +23 -36
- cirq/interop/quirk/url_to_circuit_test.py +4 -1
- cirq/json_resolver_cache.py +14 -12
- cirq/linalg/__init__.py +4 -6
- cirq/linalg/combinators.py +7 -5
- cirq/linalg/combinators_test.py +10 -7
- cirq/linalg/decompositions.py +24 -35
- cirq/linalg/decompositions_test.py +3 -1
- cirq/linalg/diagonalize.py +6 -4
- cirq/linalg/diagonalize_test.py +15 -14
- cirq/linalg/operator_spaces.py +14 -14
- cirq/linalg/operator_spaces_test.py +13 -11
- cirq/linalg/predicates.py +18 -9
- cirq/linalg/predicates_test.py +5 -0
- cirq/linalg/tolerance.py +6 -3
- cirq/linalg/tolerance_test.py +6 -4
- cirq/linalg/transformations.py +23 -20
- cirq/linalg/transformations_test.py +73 -43
- cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
- cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
- cirq/neutral_atoms/neutral_atom_devices.py +2 -0
- cirq/ops/__init__.py +2 -0
- cirq/ops/arithmetic_operation.py +21 -21
- cirq/ops/arithmetic_operation_test.py +7 -8
- cirq/ops/boolean_hamiltonian.py +23 -22
- cirq/ops/boolean_hamiltonian_test.py +12 -9
- cirq/ops/classically_controlled_operation.py +31 -36
- cirq/ops/classically_controlled_operation_test.py +121 -117
- cirq/ops/clifford_gate.py +98 -81
- cirq/ops/clifford_gate_test.py +72 -57
- cirq/ops/common_channels.py +44 -44
- cirq/ops/common_channels_test.py +83 -81
- cirq/ops/common_gate_families.py +9 -7
- cirq/ops/common_gate_families_test.py +11 -7
- cirq/ops/common_gates.py +164 -183
- cirq/ops/common_gates_test.py +135 -95
- cirq/ops/control_values.py +23 -26
- cirq/ops/control_values_test.py +22 -20
- cirq/ops/controlled_gate.py +64 -112
- cirq/ops/controlled_gate_test.py +130 -35
- cirq/ops/controlled_operation.py +24 -35
- cirq/ops/controlled_operation_test.py +8 -6
- cirq/ops/dense_pauli_string.py +38 -49
- cirq/ops/dense_pauli_string_test.py +4 -2
- cirq/ops/diagonal_gate.py +18 -31
- cirq/ops/diagonal_gate_test.py +13 -13
- cirq/ops/eigen_gate.py +29 -29
- cirq/ops/eigen_gate_test.py +45 -28
- cirq/ops/fourier_transform.py +14 -20
- cirq/ops/fourier_transform_test.py +15 -12
- cirq/ops/fsim_gate.py +43 -42
- cirq/ops/fsim_gate_test.py +29 -29
- cirq/ops/gate_features.py +2 -0
- cirq/ops/gate_features_test.py +5 -3
- cirq/ops/gate_operation.py +43 -65
- cirq/ops/gate_operation_test.py +46 -42
- cirq/ops/gateset.py +28 -40
- cirq/ops/gateset_test.py +4 -2
- cirq/ops/global_phase_op.py +45 -20
- cirq/ops/global_phase_op_test.py +44 -20
- cirq/ops/greedy_qubit_manager.py +10 -8
- cirq/ops/greedy_qubit_manager_test.py +5 -3
- cirq/ops/identity.py +14 -12
- cirq/ops/identity_test.py +24 -20
- cirq/ops/kraus_channel.py +11 -8
- cirq/ops/kraus_channel_test.py +14 -11
- cirq/ops/linear_combinations.py +65 -77
- cirq/ops/linear_combinations_test.py +14 -9
- cirq/ops/matrix_gates.py +21 -18
- cirq/ops/matrix_gates_test.py +16 -0
- cirq/ops/measure_util.py +15 -20
- cirq/ops/measure_util_test.py +2 -0
- cirq/ops/measurement_gate.py +26 -37
- cirq/ops/measurement_gate_test.py +2 -0
- cirq/ops/mixed_unitary_channel.py +12 -9
- cirq/ops/mixed_unitary_channel_test.py +14 -11
- cirq/ops/named_qubit.py +16 -13
- cirq/ops/named_qubit_test.py +15 -13
- cirq/ops/op_tree.py +9 -7
- cirq/ops/op_tree_test.py +22 -19
- cirq/ops/parallel_gate.py +15 -17
- cirq/ops/parallel_gate_test.py +18 -16
- cirq/ops/parity_gates.py +23 -25
- cirq/ops/parity_gates_test.py +36 -32
- cirq/ops/pauli_gates.py +22 -21
- cirq/ops/pauli_gates_test.py +29 -20
- cirq/ops/pauli_interaction_gate.py +15 -19
- cirq/ops/pauli_interaction_gate_test.py +10 -8
- cirq/ops/pauli_measurement_gate.py +23 -35
- cirq/ops/pauli_measurement_gate_test.py +2 -0
- cirq/ops/pauli_string.py +92 -120
- cirq/ops/pauli_string_phasor.py +52 -45
- cirq/ops/pauli_string_phasor_test.py +4 -5
- cirq/ops/pauli_string_raw_types.py +9 -7
- cirq/ops/pauli_string_raw_types_test.py +2 -0
- cirq/ops/pauli_string_test.py +31 -154
- cirq/ops/pauli_sum_exponential.py +12 -12
- cirq/ops/pauli_sum_exponential_test.py +12 -10
- cirq/ops/permutation_gate.py +8 -6
- cirq/ops/permutation_gate_test.py +10 -8
- cirq/ops/phased_iswap_gate.py +16 -16
- cirq/ops/phased_iswap_gate_test.py +17 -15
- cirq/ops/phased_x_gate.py +16 -17
- cirq/ops/phased_x_gate_test.py +18 -16
- cirq/ops/phased_x_z_gate.py +24 -22
- cirq/ops/phased_x_z_gate_test.py +17 -11
- cirq/ops/projector.py +16 -11
- cirq/ops/projector_test.py +19 -16
- cirq/ops/qid_util.py +7 -5
- cirq/ops/qid_util_test.py +2 -0
- cirq/ops/qubit_manager.py +11 -9
- cirq/ops/qubit_manager_test.py +6 -4
- cirq/ops/qubit_order.py +11 -14
- cirq/ops/qubit_order_or_list.py +4 -2
- cirq/ops/qubit_order_test.py +12 -10
- cirq/ops/random_gate_channel.py +12 -10
- cirq/ops/random_gate_channel_test.py +14 -11
- cirq/ops/raw_types.py +109 -129
- cirq/ops/raw_types_test.py +63 -57
- cirq/ops/state_preparation_channel.py +7 -7
- cirq/ops/state_preparation_channel_test.py +11 -9
- cirq/ops/swap_gates.py +13 -15
- cirq/ops/swap_gates_test.py +19 -17
- cirq/ops/tags.py +5 -3
- cirq/ops/tags_test.py +4 -2
- cirq/ops/three_qubit_gates.py +43 -76
- cirq/ops/three_qubit_gates_test.py +19 -17
- cirq/ops/two_qubit_diagonal_gate.py +13 -13
- cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
- cirq/ops/uniform_superposition_gate.py +5 -3
- cirq/ops/uniform_superposition_gate_test.py +5 -3
- cirq/ops/wait_gate.py +17 -14
- cirq/ops/wait_gate_test.py +9 -6
- cirq/protocols/__init__.py +0 -3
- cirq/protocols/act_on_protocol.py +8 -6
- cirq/protocols/act_on_protocol_test.py +15 -12
- cirq/protocols/apply_channel_protocol.py +10 -14
- cirq/protocols/apply_channel_protocol_test.py +2 -0
- cirq/protocols/apply_mixture_protocol.py +13 -42
- cirq/protocols/apply_mixture_protocol_test.py +7 -5
- cirq/protocols/apply_unitary_protocol.py +39 -34
- cirq/protocols/apply_unitary_protocol_test.py +4 -1
- cirq/protocols/approximate_equality_protocol.py +2 -0
- cirq/protocols/approximate_equality_protocol_test.py +2 -0
- cirq/protocols/circuit_diagram_info_protocol.py +58 -42
- cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
- cirq/protocols/commutes_protocol.py +8 -7
- cirq/protocols/commutes_protocol_test.py +2 -0
- cirq/protocols/control_key_protocol.py +6 -4
- cirq/protocols/control_key_protocol_test.py +3 -1
- cirq/protocols/decompose_protocol.py +49 -48
- cirq/protocols/decompose_protocol_test.py +27 -16
- cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
- cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
- cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
- cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
- cirq/protocols/has_unitary_protocol.py +10 -6
- cirq/protocols/has_unitary_protocol_test.py +13 -8
- cirq/protocols/hash_from_pickle_test.py +2 -11
- cirq/protocols/inverse_protocol.py +13 -16
- cirq/protocols/inverse_protocol_test.py +5 -3
- cirq/protocols/json_serialization.py +35 -54
- cirq/protocols/json_serialization_test.py +14 -21
- cirq/protocols/json_test_data/CXSWAP.json +46 -0
- cirq/protocols/json_test_data/CXSWAP.repr +13 -0
- cirq/protocols/json_test_data/CZSWAP.json +46 -0
- cirq/protocols/json_test_data/CZSWAP.repr +13 -0
- cirq/protocols/json_test_data/CircuitOperation.json +6 -3
- cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
- cirq/protocols/json_test_data/Moment.json +24 -1
- cirq/protocols/json_test_data/Moment.repr +6 -1
- cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
- cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
- cirq/protocols/json_test_data/spec.py +6 -2
- cirq/protocols/kraus_protocol.py +47 -7
- cirq/protocols/kraus_protocol_test.py +86 -12
- cirq/protocols/measurement_key_protocol.py +15 -16
- cirq/protocols/measurement_key_protocol_test.py +13 -11
- cirq/protocols/mixture_protocol.py +7 -5
- cirq/protocols/mixture_protocol_test.py +4 -2
- cirq/protocols/mul_protocol.py +2 -3
- cirq/protocols/mul_protocol_test.py +2 -0
- cirq/protocols/pauli_expansion_protocol.py +6 -3
- cirq/protocols/pauli_expansion_protocol_test.py +5 -3
- cirq/protocols/phase_protocol.py +2 -0
- cirq/protocols/phase_protocol_test.py +3 -1
- cirq/protocols/pow_protocol.py +11 -16
- cirq/protocols/pow_protocol_test.py +2 -0
- cirq/protocols/qasm.py +14 -20
- cirq/protocols/qasm_test.py +6 -3
- cirq/protocols/qid_shape_protocol.py +8 -8
- cirq/protocols/qid_shape_protocol_test.py +3 -1
- cirq/protocols/resolve_parameters.py +5 -3
- cirq/protocols/resolve_parameters_test.py +8 -7
- cirq/protocols/trace_distance_bound.py +6 -4
- cirq/protocols/trace_distance_bound_test.py +3 -1
- cirq/protocols/unitary_protocol.py +17 -7
- cirq/protocols/unitary_protocol_test.py +12 -2
- cirq/qis/channels.py +6 -2
- cirq/qis/channels_test.py +20 -16
- cirq/qis/clifford_tableau.py +21 -19
- cirq/qis/clifford_tableau_test.py +2 -2
- cirq/qis/entropy.py +14 -3
- cirq/qis/entropy_test.py +3 -1
- cirq/qis/measures.py +13 -13
- cirq/qis/measures_test.py +20 -14
- cirq/qis/noise_utils.py +2 -0
- cirq/qis/noise_utils_test.py +9 -7
- cirq/qis/quantum_state_representation.py +7 -8
- cirq/qis/states.py +58 -56
- cirq/qis/states_test.py +2 -0
- cirq/sim/classical_simulator.py +23 -22
- cirq/sim/classical_simulator_test.py +2 -0
- cirq/sim/clifford/clifford_simulator.py +23 -21
- cirq/sim/clifford/clifford_simulator_test.py +7 -4
- cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
- cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
- cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
- cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
- cirq/sim/clifford/stabilizer_sampler.py +9 -7
- cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
- cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
- cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
- cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
- cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
- cirq/sim/density_matrix_simulation_state.py +26 -27
- cirq/sim/density_matrix_simulation_state_test.py +10 -8
- cirq/sim/density_matrix_simulator.py +30 -28
- cirq/sim/density_matrix_simulator_test.py +48 -48
- cirq/sim/density_matrix_utils.py +13 -11
- cirq/sim/density_matrix_utils_test.py +38 -36
- cirq/sim/mux.py +33 -31
- cirq/sim/mux_test.py +3 -0
- cirq/sim/simulation_product_state.py +15 -15
- cirq/sim/simulation_product_state_test.py +29 -26
- cirq/sim/simulation_state.py +29 -38
- cirq/sim/simulation_state_base.py +21 -32
- cirq/sim/simulation_state_test.py +15 -13
- cirq/sim/simulation_utils.py +5 -2
- cirq/sim/simulation_utils_test.py +5 -2
- cirq/sim/simulator.py +90 -106
- cirq/sim/simulator_base.py +33 -45
- cirq/sim/simulator_base_test.py +20 -15
- cirq/sim/simulator_test.py +23 -14
- cirq/sim/sparse_simulator.py +19 -17
- cirq/sim/sparse_simulator_test.py +41 -40
- cirq/sim/state_vector.py +15 -12
- cirq/sim/state_vector_simulation_state.py +31 -31
- cirq/sim/state_vector_simulation_state_test.py +16 -14
- cirq/sim/state_vector_simulator.py +17 -14
- cirq/sim/state_vector_simulator_test.py +2 -0
- cirq/sim/state_vector_test.py +6 -3
- cirq/study/flatten_expressions.py +16 -15
- cirq/study/flatten_expressions_test.py +13 -11
- cirq/study/resolver.py +18 -17
- cirq/study/resolver_test.py +22 -20
- cirq/study/result.py +17 -27
- cirq/study/result_test.py +2 -0
- cirq/study/sweepable.py +12 -10
- cirq/study/sweepable_test.py +3 -0
- cirq/study/sweeps.py +42 -61
- cirq/study/sweeps_test.py +33 -0
- cirq/testing/__init__.py +7 -11
- cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
- cirq/testing/circuit_compare.py +8 -17
- cirq/testing/circuit_compare_test.py +2 -0
- cirq/testing/consistent_act_on.py +13 -11
- cirq/testing/consistent_act_on_test.py +5 -3
- cirq/testing/consistent_channels.py +2 -0
- cirq/testing/consistent_channels_test.py +10 -8
- cirq/testing/consistent_controlled_gate_op.py +5 -5
- cirq/testing/consistent_controlled_gate_op_test.py +18 -18
- cirq/testing/consistent_decomposition.py +2 -2
- cirq/testing/consistent_decomposition_test.py +4 -2
- cirq/testing/consistent_pauli_expansion.py +2 -0
- cirq/testing/consistent_pauli_expansion_test.py +3 -1
- cirq/testing/consistent_phase_by.py +2 -0
- cirq/testing/consistent_phase_by_test.py +3 -1
- cirq/testing/consistent_protocols.py +14 -20
- cirq/testing/consistent_protocols_test.py +13 -11
- cirq/testing/consistent_qasm.py +6 -4
- cirq/testing/consistent_qasm_test.py +7 -7
- cirq/testing/consistent_resolve_parameters.py +2 -0
- cirq/testing/consistent_specified_has_unitary.py +2 -2
- cirq/testing/consistent_specified_has_unitary_test.py +6 -4
- cirq/testing/consistent_unitary.py +1 -0
- cirq/testing/consistent_unitary_test.py +4 -2
- cirq/testing/deprecation.py +5 -2
- cirq/testing/deprecation_test.py +5 -2
- cirq/testing/devices.py +7 -4
- cirq/testing/devices_test.py +7 -4
- cirq/testing/equals_tester.py +4 -2
- cirq/testing/equals_tester_test.py +21 -17
- cirq/testing/equivalent_basis_map.py +6 -4
- cirq/testing/equivalent_basis_map_test.py +6 -4
- cirq/testing/equivalent_repr_eval.py +6 -4
- cirq/testing/equivalent_repr_eval_test.py +5 -3
- cirq/testing/gate_features.py +2 -0
- cirq/testing/gate_features_test.py +7 -5
- cirq/testing/json.py +19 -15
- cirq/testing/json_test.py +5 -3
- cirq/testing/lin_alg_utils.py +10 -11
- cirq/testing/lin_alg_utils_test.py +14 -12
- cirq/testing/logs.py +7 -6
- cirq/testing/logs_test.py +9 -7
- cirq/testing/no_identifier_qubit.py +4 -2
- cirq/testing/no_identifier_qubit_test.py +5 -3
- cirq/testing/op_tree.py +2 -0
- cirq/testing/op_tree_test.py +4 -1
- cirq/testing/order_tester.py +2 -0
- cirq/testing/order_tester_test.py +8 -6
- cirq/testing/pytest_utils.py +2 -0
- cirq/testing/pytest_utils_test.py +4 -2
- cirq/testing/random_circuit.py +21 -20
- cirq/testing/random_circuit_test.py +12 -9
- cirq/testing/repr_pretty_tester.py +1 -0
- cirq/testing/repr_pretty_tester_test.py +5 -3
- cirq/testing/routing_devices.py +4 -1
- cirq/testing/routing_devices_test.py +9 -6
- cirq/testing/sample_circuits.py +4 -1
- cirq/testing/sample_circuits_test.py +3 -1
- cirq/testing/sample_gates.py +3 -0
- cirq/testing/sample_gates_test.py +5 -2
- cirq/transformers/__init__.py +11 -4
- cirq/transformers/align.py +9 -7
- cirq/transformers/align_test.py +2 -0
- cirq/transformers/analytical_decompositions/__init__.py +3 -6
- cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
- cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
- cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
- cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
- cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
- cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
- cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
- cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
- cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
- cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
- cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
- cirq/transformers/drop_empty_moments.py +5 -3
- cirq/transformers/drop_empty_moments_test.py +4 -2
- cirq/transformers/drop_negligible_operations.py +7 -5
- cirq/transformers/drop_negligible_operations_test.py +2 -0
- cirq/transformers/dynamical_decoupling.py +49 -42
- cirq/transformers/dynamical_decoupling_test.py +223 -205
- cirq/transformers/eject_phased_paulis.py +28 -26
- cirq/transformers/eject_phased_paulis_test.py +12 -9
- cirq/transformers/eject_z.py +12 -12
- cirq/transformers/eject_z_test.py +2 -2
- cirq/transformers/expand_composite.py +6 -4
- cirq/transformers/expand_composite_test.py +3 -1
- cirq/transformers/gauge_compiling/__init__.py +3 -1
- cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
- cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
- cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
- cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
- cirq/transformers/insertion_sort.py +8 -6
- cirq/transformers/insertion_sort_test.py +3 -1
- cirq/transformers/measurement_transformers.py +29 -29
- cirq/transformers/measurement_transformers_test.py +2 -0
- cirq/transformers/merge_k_qubit_gates.py +12 -10
- cirq/transformers/merge_k_qubit_gates_test.py +18 -18
- cirq/transformers/merge_single_qubit_gates.py +197 -20
- cirq/transformers/merge_single_qubit_gates_test.py +177 -5
- cirq/transformers/noise_adding.py +5 -3
- cirq/transformers/noise_adding_test.py +2 -0
- cirq/transformers/optimize_for_target_gateset.py +19 -17
- cirq/transformers/optimize_for_target_gateset_test.py +11 -8
- cirq/transformers/qubit_management_transformers.py +13 -11
- cirq/transformers/qubit_management_transformers_test.py +5 -3
- cirq/transformers/randomized_measurements.py +16 -14
- cirq/transformers/randomized_measurements_test.py +10 -4
- cirq/transformers/routing/initial_mapper.py +6 -4
- cirq/transformers/routing/initial_mapper_test.py +2 -0
- cirq/transformers/routing/line_initial_mapper.py +16 -14
- cirq/transformers/routing/line_initial_mapper_test.py +9 -7
- cirq/transformers/routing/mapping_manager.py +10 -10
- cirq/transformers/routing/mapping_manager_test.py +2 -0
- cirq/transformers/routing/route_circuit_cqc.py +33 -31
- cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
- cirq/transformers/routing/visualize_routed_circuit.py +8 -7
- cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
- cirq/transformers/stratify.py +17 -15
- cirq/transformers/stratify_test.py +3 -0
- cirq/transformers/symbolize.py +103 -0
- cirq/transformers/symbolize_test.py +62 -0
- cirq/transformers/synchronize_terminal_measurements.py +10 -10
- cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
- cirq/transformers/tag_transformers.py +97 -0
- cirq/transformers/tag_transformers_test.py +103 -0
- cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
- cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
- cirq/transformers/target_gatesets/cz_gateset.py +7 -5
- cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
- cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
- cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
- cirq/transformers/transformer_api.py +34 -47
- cirq/transformers/transformer_api_test.py +9 -8
- cirq/transformers/transformer_primitives.py +39 -49
- cirq/transformers/transformer_primitives_test.py +10 -17
- cirq/value/abc_alt.py +6 -4
- cirq/value/abc_alt_test.py +5 -3
- cirq/value/angle.py +11 -12
- cirq/value/angle_test.py +5 -3
- cirq/value/classical_data.py +27 -27
- cirq/value/classical_data_test.py +11 -8
- cirq/value/condition.py +26 -24
- cirq/value/condition_test.py +2 -0
- cirq/value/digits.py +14 -11
- cirq/value/digits_test.py +2 -0
- cirq/value/duration.py +23 -20
- cirq/value/duration_test.py +2 -0
- cirq/value/linear_dict.py +25 -30
- cirq/value/linear_dict_test.py +10 -8
- cirq/value/measurement_key.py +12 -12
- cirq/value/measurement_key_test.py +2 -0
- cirq/value/periodic_value.py +4 -4
- cirq/value/periodic_value_test.py +11 -7
- cirq/value/probability.py +3 -1
- cirq/value/probability_test.py +4 -2
- cirq/value/product_state.py +15 -13
- cirq/value/product_state_test.py +4 -1
- cirq/value/random_state.py +2 -0
- cirq/value/random_state_test.py +5 -3
- cirq/value/timestamp.py +11 -7
- cirq/value/timestamp_test.py +14 -12
- cirq/value/type_alias.py +4 -4
- cirq/value/value_equality_attr.py +8 -9
- cirq/value/value_equality_attr_test.py +14 -11
- cirq/vis/density_matrix.py +3 -3
- cirq/vis/density_matrix_test.py +20 -17
- cirq/vis/heatmap.py +24 -37
- cirq/vis/heatmap_test.py +3 -0
- cirq/vis/histogram.py +9 -6
- cirq/vis/histogram_test.py +5 -2
- cirq/vis/state_histogram.py +10 -8
- cirq/vis/state_histogram_test.py +7 -5
- cirq/vis/vis_utils.py +4 -1
- cirq/vis/vis_utils_test.py +4 -1
- cirq/work/collector.py +12 -18
- cirq/work/collector_test.py +15 -10
- cirq/work/observable_grouping.py +6 -7
- cirq/work/observable_grouping_test.py +10 -9
- cirq/work/observable_measurement.py +47 -45
- cirq/work/observable_measurement_data.py +22 -17
- cirq/work/observable_measurement_data_test.py +4 -1
- cirq/work/observable_measurement_test.py +48 -29
- cirq/work/observable_readout_calibration.py +5 -2
- cirq/work/observable_readout_calibration_test.py +5 -2
- cirq/work/observable_settings.py +13 -22
- cirq/work/observable_settings_test.py +9 -7
- cirq/work/pauli_sum_collector.py +12 -10
- cirq/work/pauli_sum_collector_test.py +9 -9
- cirq/work/sampler.py +42 -43
- cirq/work/sampler_test.py +31 -24
- cirq/work/zeros_sampler.py +6 -4
- cirq/work/zeros_sampler_test.py +7 -5
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
- cirq_core-1.6.0.dist-info/RECORD +1241 -0
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
- cirq_core-1.5.0.dev20250409225226.dist-info/RECORD +0 -1216
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
|
@@ -11,6 +11,9 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
14
17
|
import itertools
|
|
15
18
|
|
|
16
19
|
import numpy as np
|
|
@@ -273,7 +276,7 @@ def test_clifford_trial_result_repr_pretty():
|
|
|
273
276
|
final_simulator_state=final_simulator_state,
|
|
274
277
|
)
|
|
275
278
|
|
|
276
|
-
cirq.testing.assert_repr_pretty(result, "measurements: m=1\
|
|
279
|
+
cirq.testing.assert_repr_pretty(result, "measurements: m=1\noutput state: |0⟩")
|
|
277
280
|
cirq.testing.assert_repr_pretty(result, "cirq.CliffordTrialResult(...)", cycle=True)
|
|
278
281
|
|
|
279
282
|
|
|
@@ -282,7 +285,7 @@ def test_clifford_step_result_str():
|
|
|
282
285
|
result = next(
|
|
283
286
|
cirq.CliffordSimulator().simulate_moment_steps(cirq.Circuit(cirq.measure(q0, key='m')))
|
|
284
287
|
)
|
|
285
|
-
assert str(result) == "m=0\n
|
|
288
|
+
assert str(result) == "m=0\n|0⟩"
|
|
286
289
|
|
|
287
290
|
|
|
288
291
|
def test_clifford_step_result_repr_pretty():
|
|
@@ -290,7 +293,7 @@ def test_clifford_step_result_repr_pretty():
|
|
|
290
293
|
result = next(
|
|
291
294
|
cirq.CliffordSimulator().simulate_moment_steps(cirq.Circuit(cirq.measure(q0, key='m')))
|
|
292
295
|
)
|
|
293
|
-
cirq.testing.assert_repr_pretty(result, "m=0\n
|
|
296
|
+
cirq.testing.assert_repr_pretty(result, "m=0\n|0⟩")
|
|
294
297
|
cirq.testing.assert_repr_pretty(result, "cirq.CliffordSimulatorStateResult(...)", cycle=True)
|
|
295
298
|
|
|
296
299
|
|
|
@@ -567,7 +570,7 @@ def test_valid_apply_measurement():
|
|
|
567
570
|
q0 = cirq.LineQubit(0)
|
|
568
571
|
state = cirq.CliffordState(qubit_map={q0: 0}, initial_state=1)
|
|
569
572
|
measurements = {}
|
|
570
|
-
|
|
573
|
+
state.apply_measurement(
|
|
571
574
|
cirq.measure(q0), measurements, np.random.RandomState(), collapse_state_vector=False
|
|
572
575
|
)
|
|
573
576
|
assert measurements == {'q(0)': [1]}
|
|
@@ -11,17 +11,20 @@
|
|
|
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
|
"""A protocol for implementing high performance clifford tableau evolutions
|
|
15
16
|
for Clifford Simulator."""
|
|
16
17
|
|
|
17
|
-
from
|
|
18
|
+
from __future__ import annotations
|
|
18
19
|
|
|
19
|
-
import
|
|
20
|
+
from typing import Sequence, TYPE_CHECKING
|
|
20
21
|
|
|
21
22
|
from cirq.qis import clifford_tableau
|
|
22
23
|
from cirq.sim.clifford.stabilizer_simulation_state import StabilizerSimulationState
|
|
23
24
|
|
|
24
25
|
if TYPE_CHECKING:
|
|
26
|
+
import numpy as np
|
|
27
|
+
|
|
25
28
|
import cirq
|
|
26
29
|
|
|
27
30
|
|
|
@@ -30,10 +33,10 @@ class CliffordTableauSimulationState(StabilizerSimulationState[clifford_tableau.
|
|
|
30
33
|
|
|
31
34
|
def __init__(
|
|
32
35
|
self,
|
|
33
|
-
tableau:
|
|
34
|
-
prng:
|
|
35
|
-
qubits:
|
|
36
|
-
classical_data:
|
|
36
|
+
tableau: cirq.CliffordTableau,
|
|
37
|
+
prng: np.random.RandomState | None = None,
|
|
38
|
+
qubits: Sequence[cirq.Qid] | None = None,
|
|
39
|
+
classical_data: cirq.ClassicalDataStore | None = None,
|
|
37
40
|
):
|
|
38
41
|
"""Inits CliffordTableauSimulationState.
|
|
39
42
|
|
|
@@ -51,5 +54,5 @@ class CliffordTableauSimulationState(StabilizerSimulationState[clifford_tableau.
|
|
|
51
54
|
super().__init__(state=tableau, prng=prng, qubits=qubits, classical_data=classical_data)
|
|
52
55
|
|
|
53
56
|
@property
|
|
54
|
-
def tableau(self) ->
|
|
57
|
+
def tableau(self) -> cirq.CliffordTableau:
|
|
55
58
|
return self.state
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from
|
|
15
|
+
from __future__ import annotations
|
|
16
16
|
|
|
17
17
|
import numpy as np
|
|
18
18
|
import pytest
|
|
@@ -20,13 +20,13 @@ import pytest
|
|
|
20
20
|
import cirq
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
def test_unitary_fallback():
|
|
23
|
+
def test_unitary_fallback() -> None:
|
|
24
24
|
class UnitaryXGate(cirq.testing.SingleQubitGate):
|
|
25
25
|
def _unitary_(self):
|
|
26
26
|
return np.array([[0, 1], [1, 0]])
|
|
27
27
|
|
|
28
28
|
class UnitaryYGate(cirq.Gate):
|
|
29
|
-
def _qid_shape_(self) ->
|
|
29
|
+
def _qid_shape_(self) -> tuple[int, ...]:
|
|
30
30
|
return (2,)
|
|
31
31
|
|
|
32
32
|
def _unitary_(self):
|
|
@@ -57,7 +57,7 @@ def test_unitary_fallback():
|
|
|
57
57
|
assert args.tableau == expected_args.tableau
|
|
58
58
|
|
|
59
59
|
|
|
60
|
-
def test_cannot_act():
|
|
60
|
+
def test_cannot_act() -> None:
|
|
61
61
|
class NoDetails:
|
|
62
62
|
pass
|
|
63
63
|
|
|
@@ -77,7 +77,7 @@ def test_cannot_act():
|
|
|
77
77
|
cirq.act_on(NoDetailsSingleQubitGate(), args, [cirq.LineQubit(1)])
|
|
78
78
|
|
|
79
79
|
|
|
80
|
-
def test_copy():
|
|
80
|
+
def test_copy() -> None:
|
|
81
81
|
args = cirq.CliffordTableauSimulationState(
|
|
82
82
|
tableau=cirq.CliffordTableau(num_qubits=3),
|
|
83
83
|
qubits=cirq.LineQubit.range(3),
|
|
@@ -12,15 +12,17 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from
|
|
15
|
+
from __future__ import annotations
|
|
16
16
|
|
|
17
|
-
import
|
|
17
|
+
from typing import Sequence, TYPE_CHECKING
|
|
18
18
|
|
|
19
19
|
from cirq._compat import proper_repr
|
|
20
20
|
from cirq.sim.clifford import stabilizer_state_ch_form
|
|
21
21
|
from cirq.sim.clifford.stabilizer_simulation_state import StabilizerSimulationState
|
|
22
22
|
|
|
23
23
|
if TYPE_CHECKING:
|
|
24
|
+
import numpy as np
|
|
25
|
+
|
|
24
26
|
import cirq
|
|
25
27
|
|
|
26
28
|
|
|
@@ -32,10 +34,10 @@ class StabilizerChFormSimulationState(
|
|
|
32
34
|
def __init__(
|
|
33
35
|
self,
|
|
34
36
|
*,
|
|
35
|
-
prng:
|
|
36
|
-
qubits:
|
|
37
|
-
initial_state:
|
|
38
|
-
classical_data:
|
|
37
|
+
prng: np.random.RandomState | None = None,
|
|
38
|
+
qubits: Sequence[cirq.Qid] | None = None,
|
|
39
|
+
initial_state: int | cirq.StabilizerStateChForm = 0,
|
|
40
|
+
classical_data: cirq.ClassicalDataStore | None = None,
|
|
39
41
|
):
|
|
40
42
|
"""Initializes with the given state and the axes for the operation.
|
|
41
43
|
|
|
@@ -12,20 +12,22 @@
|
|
|
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 numpy as np
|
|
16
18
|
import pytest
|
|
17
19
|
|
|
18
20
|
import cirq
|
|
19
21
|
|
|
20
22
|
|
|
21
|
-
def test_init_state():
|
|
23
|
+
def test_init_state() -> None:
|
|
22
24
|
args = cirq.StabilizerChFormSimulationState(qubits=cirq.LineQubit.range(1), initial_state=1)
|
|
23
25
|
np.testing.assert_allclose(args.state.state_vector(), [0, 1])
|
|
24
26
|
with pytest.raises(ValueError, match='Must specify qubits'):
|
|
25
27
|
_ = cirq.StabilizerChFormSimulationState(initial_state=1)
|
|
26
28
|
|
|
27
29
|
|
|
28
|
-
def test_cannot_act():
|
|
30
|
+
def test_cannot_act() -> None:
|
|
29
31
|
class NoDetails(cirq.testing.SingleQubitGate):
|
|
30
32
|
pass
|
|
31
33
|
|
|
@@ -35,7 +37,7 @@ def test_cannot_act():
|
|
|
35
37
|
cirq.act_on(NoDetails(), args, qubits=())
|
|
36
38
|
|
|
37
39
|
|
|
38
|
-
def test_gate_with_act_on():
|
|
40
|
+
def test_gate_with_act_on() -> None:
|
|
39
41
|
class CustomGate(cirq.testing.SingleQubitGate):
|
|
40
42
|
def _act_on_(self, sim_state, qubits):
|
|
41
43
|
if isinstance(sim_state, cirq.StabilizerChFormSimulationState):
|
|
@@ -53,7 +55,7 @@ def test_gate_with_act_on():
|
|
|
53
55
|
np.testing.assert_allclose(state.gamma, [0, 1, 0])
|
|
54
56
|
|
|
55
57
|
|
|
56
|
-
def test_unitary_fallback_y():
|
|
58
|
+
def test_unitary_fallback_y() -> None:
|
|
57
59
|
class UnitaryYGate(cirq.Gate):
|
|
58
60
|
def num_qubits(self) -> int:
|
|
59
61
|
return 1
|
|
@@ -72,7 +74,7 @@ def test_unitary_fallback_y():
|
|
|
72
74
|
np.testing.assert_allclose(args.state.state_vector(), expected_args.state.state_vector())
|
|
73
75
|
|
|
74
76
|
|
|
75
|
-
def test_unitary_fallback_h():
|
|
77
|
+
def test_unitary_fallback_h() -> None:
|
|
76
78
|
class UnitaryHGate(cirq.Gate):
|
|
77
79
|
def num_qubits(self) -> int:
|
|
78
80
|
return 1
|
|
@@ -91,7 +93,7 @@ def test_unitary_fallback_h():
|
|
|
91
93
|
np.testing.assert_allclose(args.state.state_vector(), expected_args.state.state_vector())
|
|
92
94
|
|
|
93
95
|
|
|
94
|
-
def test_copy():
|
|
96
|
+
def test_copy() -> None:
|
|
95
97
|
args = cirq.StabilizerChFormSimulationState(
|
|
96
98
|
qubits=cirq.LineQubit.range(3), prng=np.random.RandomState()
|
|
97
99
|
)
|
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import Sequence
|
|
16
18
|
|
|
17
19
|
import numpy as np
|
|
18
20
|
|
|
@@ -26,7 +28,7 @@ from cirq.work import sampler
|
|
|
26
28
|
class StabilizerSampler(sampler.Sampler):
|
|
27
29
|
"""An efficient sampler for stabilizer circuits."""
|
|
28
30
|
|
|
29
|
-
def __init__(self, *, seed:
|
|
31
|
+
def __init__(self, *, seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None):
|
|
30
32
|
"""Inits StabilizerSampler.
|
|
31
33
|
|
|
32
34
|
Args:
|
|
@@ -36,18 +38,18 @@ class StabilizerSampler(sampler.Sampler):
|
|
|
36
38
|
self._prng = value.parse_random_state(seed)
|
|
37
39
|
|
|
38
40
|
def run_sweep(
|
|
39
|
-
self, program:
|
|
40
|
-
) -> Sequence[
|
|
41
|
-
results:
|
|
41
|
+
self, program: cirq.AbstractCircuit, params: cirq.Sweepable, repetitions: int = 1
|
|
42
|
+
) -> Sequence[cirq.Result]:
|
|
43
|
+
results: list[cirq.Result] = []
|
|
42
44
|
for param_resolver in cirq.to_resolvers(params):
|
|
43
45
|
resolved_circuit = cirq.resolve_parameters(program, param_resolver)
|
|
44
46
|
measurements = self._run(resolved_circuit, repetitions=repetitions)
|
|
45
47
|
results.append(cirq.ResultDict(params=param_resolver, measurements=measurements))
|
|
46
48
|
return results
|
|
47
49
|
|
|
48
|
-
def _run(self, circuit:
|
|
50
|
+
def _run(self, circuit: cirq.AbstractCircuit, repetitions: int) -> dict[str, np.ndarray]:
|
|
49
51
|
|
|
50
|
-
measurements:
|
|
52
|
+
measurements: dict[str, list[np.ndarray]] = {
|
|
51
53
|
key: [] for key in protocols.measurement_key_names(circuit)
|
|
52
54
|
}
|
|
53
55
|
qubits = circuit.all_qubits()
|
|
@@ -12,12 +12,14 @@
|
|
|
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 numpy as np
|
|
16
18
|
|
|
17
19
|
import cirq
|
|
18
20
|
|
|
19
21
|
|
|
20
|
-
def test_produces_samples():
|
|
22
|
+
def test_produces_samples() -> None:
|
|
21
23
|
a, b = cirq.LineQubit.range(2)
|
|
22
24
|
c = cirq.Circuit(cirq.H(a), cirq.CNOT(a, b), cirq.measure(a, key='a'), cirq.measure(b, key='b'))
|
|
23
25
|
|
|
@@ -26,7 +28,7 @@ def test_produces_samples():
|
|
|
26
28
|
assert np.all(result['a'] ^ result['b'] == 0)
|
|
27
29
|
|
|
28
30
|
|
|
29
|
-
def test_reset():
|
|
31
|
+
def test_reset() -> None:
|
|
30
32
|
q = cirq.LineQubit(0)
|
|
31
33
|
sampler = cirq.StabilizerSampler()
|
|
32
34
|
c = cirq.Circuit(cirq.X(q), cirq.reset(q), cirq.measure(q))
|
|
@@ -12,11 +12,12 @@
|
|
|
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 abc
|
|
16
18
|
from types import NotImplementedType
|
|
17
|
-
from typing import Any, cast, Generic,
|
|
19
|
+
from typing import Any, cast, Generic, Sequence, TYPE_CHECKING, TypeVar
|
|
18
20
|
|
|
19
|
-
import numpy as np
|
|
20
21
|
import sympy
|
|
21
22
|
|
|
22
23
|
from cirq import linalg, ops, protocols
|
|
@@ -26,6 +27,8 @@ from cirq.protocols import has_unitary, num_qubits, unitary
|
|
|
26
27
|
from cirq.sim.simulation_state import SimulationState
|
|
27
28
|
|
|
28
29
|
if TYPE_CHECKING:
|
|
30
|
+
import numpy as np
|
|
31
|
+
|
|
29
32
|
import cirq
|
|
30
33
|
|
|
31
34
|
|
|
@@ -41,9 +44,9 @@ class StabilizerSimulationState(
|
|
|
41
44
|
self,
|
|
42
45
|
*,
|
|
43
46
|
state: TStabilizerState,
|
|
44
|
-
prng:
|
|
45
|
-
qubits:
|
|
46
|
-
classical_data:
|
|
47
|
+
prng: np.random.RandomState | None = None,
|
|
48
|
+
qubits: Sequence[cirq.Qid] | None = None,
|
|
49
|
+
classical_data: cirq.ClassicalDataStore | None = None,
|
|
47
50
|
):
|
|
48
51
|
"""Initializes the StabilizerSimulationState.
|
|
49
52
|
|
|
@@ -65,8 +68,8 @@ class StabilizerSimulationState(
|
|
|
65
68
|
return self._state
|
|
66
69
|
|
|
67
70
|
def _act_on_fallback_(
|
|
68
|
-
self, action: Any, qubits: Sequence[
|
|
69
|
-
) ->
|
|
71
|
+
self, action: Any, qubits: Sequence[cirq.Qid], allow_decompose: bool = True
|
|
72
|
+
) -> bool | NotImplementedType:
|
|
70
73
|
strats = [self._strat_apply_gate, self._strat_apply_mixture]
|
|
71
74
|
if allow_decompose:
|
|
72
75
|
strats.append(self._strat_decompose)
|
|
@@ -89,7 +92,7 @@ class StabilizerSimulationState(
|
|
|
89
92
|
self._state.apply_cx(target_axis, control_axis, exponent, global_shift)
|
|
90
93
|
self._state.apply_cx(control_axis, target_axis)
|
|
91
94
|
|
|
92
|
-
def _strat_apply_gate(self, val: Any, qubits: Sequence[
|
|
95
|
+
def _strat_apply_gate(self, val: Any, qubits: Sequence[cirq.Qid]) -> bool:
|
|
93
96
|
if not protocols.has_stabilizer_effect(val):
|
|
94
97
|
return NotImplemented
|
|
95
98
|
gate = val.gate if isinstance(val, ops.Operation) else val
|
|
@@ -117,7 +120,7 @@ class StabilizerSimulationState(
|
|
|
117
120
|
return NotImplemented
|
|
118
121
|
return True
|
|
119
122
|
|
|
120
|
-
def _strat_apply_mixture(self, val: Any, qubits: Sequence[
|
|
123
|
+
def _strat_apply_mixture(self, val: Any, qubits: Sequence[cirq.Qid]) -> bool:
|
|
121
124
|
mixture = protocols.mixture(val, None)
|
|
122
125
|
if mixture is None:
|
|
123
126
|
return NotImplemented
|
|
@@ -129,9 +132,7 @@ class StabilizerSimulationState(
|
|
|
129
132
|
matrix_gates.MatrixGate(unitaries[index]), qubits
|
|
130
133
|
)
|
|
131
134
|
|
|
132
|
-
def _strat_act_from_single_qubit_decompose(
|
|
133
|
-
self, val: Any, qubits: Sequence['cirq.Qid']
|
|
134
|
-
) -> bool:
|
|
135
|
+
def _strat_act_from_single_qubit_decompose(self, val: Any, qubits: Sequence[cirq.Qid]) -> bool:
|
|
135
136
|
if num_qubits(val) == 1:
|
|
136
137
|
if not has_unitary(val):
|
|
137
138
|
return NotImplemented
|
|
@@ -148,7 +149,7 @@ class StabilizerSimulationState(
|
|
|
148
149
|
|
|
149
150
|
return NotImplemented
|
|
150
151
|
|
|
151
|
-
def _strat_decompose(self, val: Any, qubits: Sequence[
|
|
152
|
+
def _strat_decompose(self, val: Any, qubits: Sequence[cirq.Qid]) -> bool:
|
|
152
153
|
gate = val.gate if isinstance(val, ops.Operation) else val
|
|
153
154
|
operations = protocols.decompose_once_with_qubits(gate, qubits, None)
|
|
154
155
|
if operations is None or not all(protocols.has_stabilizer_effect(op) for op in operations):
|
|
@@ -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 unittest.mock as mock
|
|
16
18
|
|
|
17
19
|
import numpy as np
|
|
@@ -20,7 +22,7 @@ import sympy
|
|
|
20
22
|
import cirq
|
|
21
23
|
|
|
22
24
|
|
|
23
|
-
def test_apply_gate():
|
|
25
|
+
def test_apply_gate() -> None:
|
|
24
26
|
q0, q1 = cirq.LineQubit.range(2)
|
|
25
27
|
state = mock.Mock()
|
|
26
28
|
args = cirq.StabilizerSimulationState(state=state, qubits=[q0, q1])
|
|
@@ -89,7 +91,7 @@ def test_apply_gate():
|
|
|
89
91
|
state.apply_x.assert_not_called()
|
|
90
92
|
|
|
91
93
|
|
|
92
|
-
def test_apply_mixture():
|
|
94
|
+
def test_apply_mixture() -> None:
|
|
93
95
|
q0 = cirq.LineQubit(0)
|
|
94
96
|
state = mock.Mock()
|
|
95
97
|
args = cirq.StabilizerSimulationState(state=state, qubits=[q0])
|
|
@@ -100,7 +102,7 @@ def test_apply_mixture():
|
|
|
100
102
|
assert 10 < state.apply_x.call_count < 90
|
|
101
103
|
|
|
102
104
|
|
|
103
|
-
def test_act_from_single_qubit_decompose():
|
|
105
|
+
def test_act_from_single_qubit_decompose() -> None:
|
|
104
106
|
q0 = cirq.LineQubit(0)
|
|
105
107
|
state = mock.Mock()
|
|
106
108
|
args = cirq.StabilizerSimulationState(state=state, qubits=[q0])
|
|
@@ -113,7 +115,7 @@ def test_act_from_single_qubit_decompose():
|
|
|
113
115
|
state.apply_x.assert_called_with(0, 1.0, 0.0)
|
|
114
116
|
|
|
115
117
|
|
|
116
|
-
def test_decompose():
|
|
118
|
+
def test_decompose() -> None:
|
|
117
119
|
class XContainer(cirq.Gate):
|
|
118
120
|
def _decompose_(self, qs):
|
|
119
121
|
return [cirq.X(*qs)]
|
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import Any, Sequence
|
|
16
18
|
|
|
17
19
|
import numpy as np
|
|
18
20
|
|
|
@@ -61,7 +63,7 @@ class StabilizerStateChForm(qis.StabilizerState):
|
|
|
61
63
|
if val:
|
|
62
64
|
self.apply_x(i)
|
|
63
65
|
|
|
64
|
-
def _json_dict_(self) ->
|
|
66
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
65
67
|
return protocols.obj_to_dict_helper(self, ['n', 'G', 'F', 'M', 'gamma', 'v', 's', 'omega'])
|
|
66
68
|
|
|
67
69
|
@classmethod
|
|
@@ -81,7 +83,7 @@ class StabilizerStateChForm(qis.StabilizerState):
|
|
|
81
83
|
def _value_equality_values_(self) -> Any:
|
|
82
84
|
return (self.n, self.G, self.F, self.M, self.gamma, self.v, self.s, self.omega)
|
|
83
85
|
|
|
84
|
-
def copy(self, deep_copy_buffers: bool = True) ->
|
|
86
|
+
def copy(self, deep_copy_buffers: bool = True) -> cirq.StabilizerStateChForm:
|
|
85
87
|
copy = StabilizerStateChForm(self.n)
|
|
86
88
|
|
|
87
89
|
copy.G = self.G.copy()
|
|
@@ -267,7 +269,7 @@ class StabilizerStateChForm(qis.StabilizerState):
|
|
|
267
269
|
|
|
268
270
|
self.update_sum(t, u, delta=delta)
|
|
269
271
|
|
|
270
|
-
def kron(self, other:
|
|
272
|
+
def kron(self, other: cirq.StabilizerStateChForm) -> cirq.StabilizerStateChForm:
|
|
271
273
|
n = self.n + other.n
|
|
272
274
|
copy = StabilizerStateChForm(n)
|
|
273
275
|
copy.G[: self.n, : self.n] = self.G
|
|
@@ -282,14 +284,14 @@ class StabilizerStateChForm(qis.StabilizerState):
|
|
|
282
284
|
copy.omega = self.omega * other.omega
|
|
283
285
|
return copy
|
|
284
286
|
|
|
285
|
-
def reindex(self, axes: Sequence[int]) ->
|
|
287
|
+
def reindex(self, axes: Sequence[int]) -> cirq.StabilizerStateChForm:
|
|
286
288
|
copy = StabilizerStateChForm(self.n)
|
|
287
289
|
copy.G = self.G[axes][:, axes]
|
|
288
290
|
copy.F = self.F[axes][:, axes]
|
|
289
|
-
copy.M = self.M[axes][:, axes]
|
|
290
|
-
copy.gamma = self.gamma[axes]
|
|
291
|
-
copy.v = self.v[axes]
|
|
292
|
-
copy.s = self.s[axes]
|
|
291
|
+
copy.M = self.M[axes][:, axes] # type: ignore[assignment]
|
|
292
|
+
copy.gamma = self.gamma[axes] # type: ignore[assignment]
|
|
293
|
+
copy.v = self.v[axes] # type: ignore[assignment]
|
|
294
|
+
copy.s = self.s[axes] # type: ignore[assignment]
|
|
293
295
|
copy.omega = self.omega
|
|
294
296
|
return copy
|
|
295
297
|
|
|
@@ -387,8 +389,8 @@ class StabilizerStateChForm(qis.StabilizerState):
|
|
|
387
389
|
self.omega *= coefficient
|
|
388
390
|
|
|
389
391
|
def measure(
|
|
390
|
-
self, axes: Sequence[int], seed:
|
|
391
|
-
) ->
|
|
392
|
+
self, axes: Sequence[int], seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None
|
|
393
|
+
) -> list[int]:
|
|
392
394
|
return [self._measure(axis, random_state.parse_random_state(seed)) for axis in axes]
|
|
393
395
|
|
|
394
396
|
|
|
@@ -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 numpy as np
|
|
16
18
|
import pytest
|
|
17
19
|
|
|
@@ -22,7 +24,7 @@ import cirq.testing
|
|
|
22
24
|
# Github issue: https://github.com/quantumlib/Cirq/issues/3021
|
|
23
25
|
|
|
24
26
|
|
|
25
|
-
def test_initial_state():
|
|
27
|
+
def test_initial_state() -> None:
|
|
26
28
|
with pytest.raises(ValueError, match='Out of range'):
|
|
27
29
|
_ = cirq.StabilizerStateChForm(initial_state=-31, num_qubits=5)
|
|
28
30
|
with pytest.raises(ValueError, match='Out of range'):
|
|
@@ -33,7 +35,7 @@ def test_initial_state():
|
|
|
33
35
|
np.testing.assert_allclose(state.state_vector(), expected_state_vector)
|
|
34
36
|
|
|
35
37
|
|
|
36
|
-
def test_run():
|
|
38
|
+
def test_run() -> None:
|
|
37
39
|
(q0, q1, q2) = (cirq.LineQubit(0), cirq.LineQubit(1), cirq.LineQubit(2))
|
|
38
40
|
|
|
39
41
|
"""
|
|
@@ -14,7 +14,9 @@
|
|
|
14
14
|
|
|
15
15
|
"""Objects and methods for acting efficiently on a density matrix."""
|
|
16
16
|
|
|
17
|
-
from
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
from typing import Any, Callable, Sequence, TYPE_CHECKING
|
|
18
20
|
|
|
19
21
|
import numpy as np
|
|
20
22
|
|
|
@@ -30,7 +32,7 @@ if TYPE_CHECKING:
|
|
|
30
32
|
class _BufferedDensityMatrix(qis.QuantumStateRepresentation):
|
|
31
33
|
"""Contains the density matrix and buffers for efficient state evolution."""
|
|
32
34
|
|
|
33
|
-
def __init__(self, density_matrix: np.ndarray, buffer:
|
|
35
|
+
def __init__(self, density_matrix: np.ndarray, buffer: list[np.ndarray] | None = None):
|
|
34
36
|
"""Initializes the object with the inputs.
|
|
35
37
|
|
|
36
38
|
This initializer creates the buffer if necessary.
|
|
@@ -55,10 +57,10 @@ class _BufferedDensityMatrix(qis.QuantumStateRepresentation):
|
|
|
55
57
|
def create(
|
|
56
58
|
cls,
|
|
57
59
|
*,
|
|
58
|
-
initial_state:
|
|
59
|
-
qid_shape:
|
|
60
|
-
dtype:
|
|
61
|
-
buffer:
|
|
60
|
+
initial_state: np.ndarray | cirq.STATE_VECTOR_LIKE = 0,
|
|
61
|
+
qid_shape: tuple[int, ...] | None = None,
|
|
62
|
+
dtype: type[np.complexfloating] | None = None,
|
|
63
|
+
buffer: list[np.ndarray] | None = None,
|
|
62
64
|
):
|
|
63
65
|
"""Creates a buffered density matrix with the requested state.
|
|
64
66
|
|
|
@@ -91,7 +93,7 @@ class _BufferedDensityMatrix(qis.QuantumStateRepresentation):
|
|
|
91
93
|
density_matrix = density_matrix.astype(dtype, copy=False)
|
|
92
94
|
return cls(density_matrix, buffer)
|
|
93
95
|
|
|
94
|
-
def copy(self, deep_copy_buffers: bool = True) ->
|
|
96
|
+
def copy(self, deep_copy_buffers: bool = True) -> _BufferedDensityMatrix:
|
|
95
97
|
"""Copies the object.
|
|
96
98
|
|
|
97
99
|
Args:
|
|
@@ -104,7 +106,7 @@ class _BufferedDensityMatrix(qis.QuantumStateRepresentation):
|
|
|
104
106
|
buffer=[b.copy() for b in self._buffer] if deep_copy_buffers else self._buffer,
|
|
105
107
|
)
|
|
106
108
|
|
|
107
|
-
def kron(self, other:
|
|
109
|
+
def kron(self, other: _BufferedDensityMatrix) -> _BufferedDensityMatrix:
|
|
108
110
|
"""Creates the Kronecker product with the other density matrix.
|
|
109
111
|
|
|
110
112
|
Args:
|
|
@@ -119,7 +121,7 @@ class _BufferedDensityMatrix(qis.QuantumStateRepresentation):
|
|
|
119
121
|
|
|
120
122
|
def factor(
|
|
121
123
|
self, axes: Sequence[int], *, validate=True, atol=1e-07
|
|
122
|
-
) ->
|
|
124
|
+
) -> tuple[_BufferedDensityMatrix, _BufferedDensityMatrix]:
|
|
123
125
|
"""Factors out the desired axes.
|
|
124
126
|
|
|
125
127
|
Args:
|
|
@@ -141,7 +143,7 @@ class _BufferedDensityMatrix(qis.QuantumStateRepresentation):
|
|
|
141
143
|
remainder = _BufferedDensityMatrix(density_matrix=remainder_tensor)
|
|
142
144
|
return extracted, remainder
|
|
143
145
|
|
|
144
|
-
def reindex(self, axes: Sequence[int]) ->
|
|
146
|
+
def reindex(self, axes: Sequence[int]) -> _BufferedDensityMatrix:
|
|
145
147
|
"""Transposes the axes of a density matrix to a specified order.
|
|
146
148
|
|
|
147
149
|
Args:
|
|
@@ -185,8 +187,8 @@ class _BufferedDensityMatrix(qis.QuantumStateRepresentation):
|
|
|
185
187
|
return True
|
|
186
188
|
|
|
187
189
|
def measure(
|
|
188
|
-
self, axes: Sequence[int], seed:
|
|
189
|
-
) ->
|
|
190
|
+
self, axes: Sequence[int], seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None
|
|
191
|
+
) -> list[int]:
|
|
190
192
|
"""Measures the density matrix.
|
|
191
193
|
|
|
192
194
|
Args:
|
|
@@ -205,10 +207,7 @@ class _BufferedDensityMatrix(qis.QuantumStateRepresentation):
|
|
|
205
207
|
return bits
|
|
206
208
|
|
|
207
209
|
def sample(
|
|
208
|
-
self,
|
|
209
|
-
axes: Sequence[int],
|
|
210
|
-
repetitions: int = 1,
|
|
211
|
-
seed: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
|
|
210
|
+
self, axes: Sequence[int], repetitions: int = 1, seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None
|
|
212
211
|
) -> np.ndarray:
|
|
213
212
|
"""Samples the density matrix.
|
|
214
213
|
|
|
@@ -246,12 +245,12 @@ class DensityMatrixSimulationState(SimulationState[_BufferedDensityMatrix]):
|
|
|
246
245
|
def __init__(
|
|
247
246
|
self,
|
|
248
247
|
*,
|
|
249
|
-
available_buffer:
|
|
250
|
-
prng:
|
|
251
|
-
qubits:
|
|
252
|
-
initial_state:
|
|
253
|
-
dtype:
|
|
254
|
-
classical_data:
|
|
248
|
+
available_buffer: list[np.ndarray] | None = None,
|
|
249
|
+
prng: np.random.RandomState | None = None,
|
|
250
|
+
qubits: Sequence[cirq.Qid] | None = None,
|
|
251
|
+
initial_state: np.ndarray | cirq.STATE_VECTOR_LIKE = 0,
|
|
252
|
+
dtype: type[np.complexfloating] = np.complex64,
|
|
253
|
+
classical_data: cirq.ClassicalDataStore | None = None,
|
|
255
254
|
):
|
|
256
255
|
"""Inits DensityMatrixSimulationState.
|
|
257
256
|
|
|
@@ -285,7 +284,7 @@ class DensityMatrixSimulationState(SimulationState[_BufferedDensityMatrix]):
|
|
|
285
284
|
)
|
|
286
285
|
super().__init__(state=state, prng=prng, qubits=qubits, classical_data=classical_data)
|
|
287
286
|
|
|
288
|
-
def add_qubits(self, qubits: Sequence[
|
|
287
|
+
def add_qubits(self, qubits: Sequence[cirq.Qid]):
|
|
289
288
|
ret = super().add_qubits(qubits)
|
|
290
289
|
return (
|
|
291
290
|
self.kronecker_product(type(self)(qubits=qubits), inplace=True)
|
|
@@ -293,7 +292,7 @@ class DensityMatrixSimulationState(SimulationState[_BufferedDensityMatrix]):
|
|
|
293
292
|
else ret
|
|
294
293
|
)
|
|
295
294
|
|
|
296
|
-
def remove_qubits(self, qubits: Sequence[
|
|
295
|
+
def remove_qubits(self, qubits: Sequence[cirq.Qid]):
|
|
297
296
|
ret = super().remove_qubits(qubits)
|
|
298
297
|
if ret is not NotImplemented:
|
|
299
298
|
return ret
|
|
@@ -302,9 +301,9 @@ class DensityMatrixSimulationState(SimulationState[_BufferedDensityMatrix]):
|
|
|
302
301
|
return remainder
|
|
303
302
|
|
|
304
303
|
def _act_on_fallback_(
|
|
305
|
-
self, action: Any, qubits: Sequence[
|
|
304
|
+
self, action: Any, qubits: Sequence[cirq.Qid], allow_decompose: bool = True
|
|
306
305
|
) -> bool:
|
|
307
|
-
strats:
|
|
306
|
+
strats: list[Callable[[Any, Any, Sequence[cirq.Qid]], bool]] = [
|
|
308
307
|
_strat_apply_channel_to_state
|
|
309
308
|
]
|
|
310
309
|
if allow_decompose:
|
|
@@ -346,7 +345,7 @@ class DensityMatrixSimulationState(SimulationState[_BufferedDensityMatrix]):
|
|
|
346
345
|
|
|
347
346
|
|
|
348
347
|
def _strat_apply_channel_to_state(
|
|
349
|
-
action: Any, args:
|
|
348
|
+
action: Any, args: cirq.DensityMatrixSimulationState, qubits: Sequence[cirq.Qid]
|
|
350
349
|
) -> bool:
|
|
351
350
|
"""Apply channel to state."""
|
|
352
351
|
if not args._state.apply_channel(action, args.get_axes(qubits)):
|