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/ops/measure_util.py
CHANGED
|
@@ -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 Callable, Iterable, overload, TYPE_CHECKING
|
|
16
18
|
|
|
17
19
|
import numpy as np
|
|
18
20
|
|
|
@@ -30,8 +32,7 @@ def _default_measurement_key(qubits: Iterable[raw_types.Qid]) -> str:
|
|
|
30
32
|
|
|
31
33
|
|
|
32
34
|
def measure_single_paulistring(
|
|
33
|
-
pauli_observable: pauli_string.PauliString,
|
|
34
|
-
key: Optional[Union[str, 'cirq.MeasurementKey']] = None,
|
|
35
|
+
pauli_observable: pauli_string.PauliString, key: str | cirq.MeasurementKey | None = None
|
|
35
36
|
) -> raw_types.Operation:
|
|
36
37
|
"""Returns a single PauliMeasurementGate which measures the pauli observable
|
|
37
38
|
|
|
@@ -66,7 +67,7 @@ def measure_single_paulistring(
|
|
|
66
67
|
|
|
67
68
|
def measure_paulistring_terms(
|
|
68
69
|
pauli_basis: pauli_string.PauliString, key_func: Callable[[raw_types.Qid], str] = str
|
|
69
|
-
) ->
|
|
70
|
+
) -> list[raw_types.Operation]:
|
|
70
71
|
"""Returns a list of operations individually measuring qubits in the pauli basis.
|
|
71
72
|
|
|
72
73
|
Args:
|
|
@@ -89,14 +90,11 @@ def measure_paulistring_terms(
|
|
|
89
90
|
return [PauliMeasurementGate([pauli_basis[q]], key=key_func(q)).on(q) for q in pauli_basis]
|
|
90
91
|
|
|
91
92
|
|
|
92
|
-
# pylint: disable=function-redefined
|
|
93
|
-
|
|
94
|
-
|
|
95
93
|
@overload
|
|
96
94
|
def measure(
|
|
97
95
|
*target: raw_types.Qid,
|
|
98
|
-
key:
|
|
99
|
-
invert_mask:
|
|
96
|
+
key: str | cirq.MeasurementKey | None = None,
|
|
97
|
+
invert_mask: tuple[bool, ...] = (),
|
|
100
98
|
) -> raw_types.Operation:
|
|
101
99
|
pass
|
|
102
100
|
|
|
@@ -105,17 +103,17 @@ def measure(
|
|
|
105
103
|
def measure(
|
|
106
104
|
__target: Iterable[raw_types.Qid],
|
|
107
105
|
*,
|
|
108
|
-
key:
|
|
109
|
-
invert_mask:
|
|
106
|
+
key: str | cirq.MeasurementKey | None = None,
|
|
107
|
+
invert_mask: tuple[bool, ...] = (),
|
|
110
108
|
) -> raw_types.Operation:
|
|
111
109
|
pass
|
|
112
110
|
|
|
113
111
|
|
|
114
112
|
def measure(
|
|
115
113
|
*target,
|
|
116
|
-
key:
|
|
117
|
-
invert_mask:
|
|
118
|
-
confusion_map:
|
|
114
|
+
key: str | cirq.MeasurementKey | None = None,
|
|
115
|
+
invert_mask: tuple[bool, ...] = (),
|
|
116
|
+
confusion_map: dict[tuple[int, ...], np.ndarray] | None = None,
|
|
119
117
|
) -> raw_types.Operation:
|
|
120
118
|
"""Returns a single MeasurementGate applied to all the given qubits.
|
|
121
119
|
|
|
@@ -170,20 +168,20 @@ M = measure
|
|
|
170
168
|
@overload
|
|
171
169
|
def measure_each(
|
|
172
170
|
*qubits: raw_types.Qid, key_func: Callable[[raw_types.Qid], str] = str
|
|
173
|
-
) ->
|
|
171
|
+
) -> list[raw_types.Operation]:
|
|
174
172
|
pass
|
|
175
173
|
|
|
176
174
|
|
|
177
175
|
@overload
|
|
178
176
|
def measure_each(
|
|
179
177
|
__qubits: Iterable[raw_types.Qid], *, key_func: Callable[[raw_types.Qid], str] = str
|
|
180
|
-
) ->
|
|
178
|
+
) -> list[raw_types.Operation]:
|
|
181
179
|
pass
|
|
182
180
|
|
|
183
181
|
|
|
184
182
|
def measure_each(
|
|
185
183
|
*qubits, key_func: Callable[[raw_types.Qid], str] = str
|
|
186
|
-
) ->
|
|
184
|
+
) -> list[raw_types.Operation]:
|
|
187
185
|
"""Returns a list of operations individually measuring the given qubits.
|
|
188
186
|
|
|
189
187
|
The qubits are measured in the computational basis.
|
|
@@ -204,6 +202,3 @@ def measure_each(
|
|
|
204
202
|
)
|
|
205
203
|
qubitsequence = qubits[0] if one_iterable_arg else qubits
|
|
206
204
|
return [MeasurementGate(1, key_func(q), qid_shape=(q.dimension,)).on(q) for q in qubitsequence]
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
# pylint: enable=function-redefined
|
cirq/ops/measure_util_test.py
CHANGED
cirq/ops/measurement_gate.py
CHANGED
|
@@ -12,18 +12,9 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
FrozenSet,
|
|
19
|
-
Iterable,
|
|
20
|
-
Mapping,
|
|
21
|
-
Optional,
|
|
22
|
-
Sequence,
|
|
23
|
-
Tuple,
|
|
24
|
-
TYPE_CHECKING,
|
|
25
|
-
Union,
|
|
26
|
-
)
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import Any, Iterable, Mapping, Sequence, TYPE_CHECKING
|
|
27
18
|
|
|
28
19
|
import numpy as np
|
|
29
20
|
|
|
@@ -47,11 +38,11 @@ class MeasurementGate(raw_types.Gate):
|
|
|
47
38
|
|
|
48
39
|
def __init__(
|
|
49
40
|
self,
|
|
50
|
-
num_qubits:
|
|
51
|
-
key:
|
|
52
|
-
invert_mask:
|
|
53
|
-
qid_shape:
|
|
54
|
-
confusion_map:
|
|
41
|
+
num_qubits: int | None = None,
|
|
42
|
+
key: str | cirq.MeasurementKey = '',
|
|
43
|
+
invert_mask: tuple[bool, ...] = (),
|
|
44
|
+
qid_shape: tuple[int, ...] | None = None,
|
|
45
|
+
confusion_map: dict[tuple[int, ...], np.ndarray] | None = None,
|
|
55
46
|
) -> None:
|
|
56
47
|
"""Inits MeasurementGate.
|
|
57
48
|
|
|
@@ -100,24 +91,24 @@ class MeasurementGate(raw_types.Gate):
|
|
|
100
91
|
return str(self.mkey)
|
|
101
92
|
|
|
102
93
|
@property
|
|
103
|
-
def mkey(self) ->
|
|
94
|
+
def mkey(self) -> cirq.MeasurementKey:
|
|
104
95
|
return self._mkey
|
|
105
96
|
|
|
106
97
|
@property
|
|
107
|
-
def invert_mask(self) ->
|
|
98
|
+
def invert_mask(self) -> tuple[bool, ...]:
|
|
108
99
|
return self._invert_mask
|
|
109
100
|
|
|
110
101
|
@property
|
|
111
|
-
def confusion_map(self) ->
|
|
102
|
+
def confusion_map(self) -> dict[tuple[int, ...], np.ndarray]:
|
|
112
103
|
return self._confusion_map
|
|
113
104
|
|
|
114
|
-
def _qid_shape_(self) ->
|
|
105
|
+
def _qid_shape_(self) -> tuple[int, ...]:
|
|
115
106
|
return self._qid_shape
|
|
116
107
|
|
|
117
108
|
def _has_unitary_(self) -> bool:
|
|
118
109
|
return False
|
|
119
110
|
|
|
120
|
-
def with_key(self, key:
|
|
111
|
+
def with_key(self, key: str | cirq.MeasurementKey) -> MeasurementGate:
|
|
121
112
|
"""Creates a measurement gate with a new key but otherwise identical."""
|
|
122
113
|
if key == self.key:
|
|
123
114
|
return self
|
|
@@ -129,21 +120,21 @@ class MeasurementGate(raw_types.Gate):
|
|
|
129
120
|
confusion_map=self.confusion_map,
|
|
130
121
|
)
|
|
131
122
|
|
|
132
|
-
def _with_key_path_(self, path:
|
|
123
|
+
def _with_key_path_(self, path: tuple[str, ...]):
|
|
133
124
|
return self.with_key(self.mkey._with_key_path_(path))
|
|
134
125
|
|
|
135
|
-
def _with_key_path_prefix_(self, prefix:
|
|
126
|
+
def _with_key_path_prefix_(self, prefix: tuple[str, ...]):
|
|
136
127
|
return self.with_key(self.mkey._with_key_path_prefix_(prefix))
|
|
137
128
|
|
|
138
129
|
def _with_rescoped_keys_(
|
|
139
|
-
self, path:
|
|
130
|
+
self, path: tuple[str, ...], bindable_keys: frozenset[cirq.MeasurementKey]
|
|
140
131
|
):
|
|
141
132
|
return self.with_key(protocols.with_rescoped_keys(self.mkey, path, bindable_keys))
|
|
142
133
|
|
|
143
134
|
def _with_measurement_key_mapping_(self, key_map: Mapping[str, str]):
|
|
144
135
|
return self.with_key(protocols.with_measurement_key_mapping(self.mkey, key_map))
|
|
145
136
|
|
|
146
|
-
def with_bits_flipped(self, *bit_positions: int) ->
|
|
137
|
+
def with_bits_flipped(self, *bit_positions: int) -> MeasurementGate:
|
|
147
138
|
"""Toggles whether or not the measurement inverts various outputs.
|
|
148
139
|
|
|
149
140
|
This only affects the invert_mask, which is applied after confusion
|
|
@@ -162,7 +153,7 @@ class MeasurementGate(raw_types.Gate):
|
|
|
162
153
|
confusion_map=self.confusion_map,
|
|
163
154
|
)
|
|
164
155
|
|
|
165
|
-
def full_invert_mask(self) ->
|
|
156
|
+
def full_invert_mask(self) -> tuple[bool, ...]:
|
|
166
157
|
"""Returns the invert mask for all qubits.
|
|
167
158
|
|
|
168
159
|
If the user supplies a partial invert_mask, this returns that mask
|
|
@@ -182,7 +173,7 @@ class MeasurementGate(raw_types.Gate):
|
|
|
182
173
|
def _measurement_key_name_(self) -> str:
|
|
183
174
|
return self.key
|
|
184
175
|
|
|
185
|
-
def _measurement_key_obj_(self) ->
|
|
176
|
+
def _measurement_key_obj_(self) -> cirq.MeasurementKey:
|
|
186
177
|
return self.mkey
|
|
187
178
|
|
|
188
179
|
def _kraus_(self):
|
|
@@ -198,9 +189,7 @@ class MeasurementGate(raw_types.Gate):
|
|
|
198
189
|
def _has_kraus_(self):
|
|
199
190
|
return True
|
|
200
191
|
|
|
201
|
-
def _circuit_diagram_info_(
|
|
202
|
-
self, args: 'cirq.CircuitDiagramInfoArgs'
|
|
203
|
-
) -> 'cirq.CircuitDiagramInfo':
|
|
192
|
+
def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> cirq.CircuitDiagramInfo:
|
|
204
193
|
symbols = ['M'] * self.num_qubits()
|
|
205
194
|
flipped_indices = {i for i, x in enumerate(self.full_invert_mask()) if x}
|
|
206
195
|
confused_indices = {x for idxs in self.confusion_map for x in idxs}
|
|
@@ -224,7 +213,7 @@ class MeasurementGate(raw_types.Gate):
|
|
|
224
213
|
|
|
225
214
|
return protocols.CircuitDiagramInfo(symbols)
|
|
226
215
|
|
|
227
|
-
def _qasm_(self, args:
|
|
216
|
+
def _qasm_(self, args: cirq.QasmArgs, qubits: tuple[cirq.Qid, ...]) -> str | None:
|
|
228
217
|
if self.confusion_map or not all(d == 2 for d in self._qid_shape):
|
|
229
218
|
return NotImplemented
|
|
230
219
|
args.validate_version('2.0', '3.0')
|
|
@@ -243,7 +232,7 @@ class MeasurementGate(raw_types.Gate):
|
|
|
243
232
|
lines.append(args.format('x {0}; // Undo the inversion\n', qubit))
|
|
244
233
|
return ''.join(lines)
|
|
245
234
|
|
|
246
|
-
def _op_repr_(self, qubits: Sequence[
|
|
235
|
+
def _op_repr_(self, qubits: Sequence[cirq.Qid]) -> str:
|
|
247
236
|
args = list(repr(q) for q in qubits)
|
|
248
237
|
if self.key != _default_measurement_key(qubits):
|
|
249
238
|
args.append(f'key={self.mkey!r}')
|
|
@@ -275,8 +264,8 @@ class MeasurementGate(raw_types.Gate):
|
|
|
275
264
|
)
|
|
276
265
|
return self.key, self.full_invert_mask(), self._qid_shape, hashable_cmap
|
|
277
266
|
|
|
278
|
-
def _json_dict_(self) ->
|
|
279
|
-
other:
|
|
267
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
268
|
+
other: dict[str, Any] = {}
|
|
280
269
|
if not all(d == 2 for d in self._qid_shape):
|
|
281
270
|
other['qid_shape'] = self._qid_shape
|
|
282
271
|
if self.confusion_map:
|
|
@@ -301,10 +290,10 @@ class MeasurementGate(raw_types.Gate):
|
|
|
301
290
|
confusion_map={tuple(k): np.array(v) for k, v in confusion_map or []},
|
|
302
291
|
)
|
|
303
292
|
|
|
304
|
-
def _has_stabilizer_effect_(self) ->
|
|
293
|
+
def _has_stabilizer_effect_(self) -> bool | None:
|
|
305
294
|
return True
|
|
306
295
|
|
|
307
|
-
def _act_on_(self, sim_state:
|
|
296
|
+
def _act_on_(self, sim_state: cirq.SimulationStateBase, qubits: Sequence[cirq.Qid]) -> bool:
|
|
308
297
|
from cirq.sim import SimulationState
|
|
309
298
|
|
|
310
299
|
if not isinstance(sim_state, SimulationState):
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
# pylint: disable=wrong-or-nonexistent-copyright-notice
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any, Iterable, Mapping, TYPE_CHECKING
|
|
3
6
|
|
|
4
7
|
import numpy as np
|
|
5
8
|
|
|
@@ -27,8 +30,8 @@ class MixedUnitaryChannel(raw_types.Gate):
|
|
|
27
30
|
|
|
28
31
|
def __init__(
|
|
29
32
|
self,
|
|
30
|
-
mixture: Iterable[
|
|
31
|
-
key:
|
|
33
|
+
mixture: Iterable[tuple[float, np.ndarray]],
|
|
34
|
+
key: str | cirq.MeasurementKey | None = None,
|
|
32
35
|
validate: bool = False,
|
|
33
36
|
):
|
|
34
37
|
mixture = list(mixture)
|
|
@@ -58,7 +61,7 @@ class MixedUnitaryChannel(raw_types.Gate):
|
|
|
58
61
|
|
|
59
62
|
@staticmethod
|
|
60
63
|
def from_mixture(
|
|
61
|
-
mixture:
|
|
64
|
+
mixture: protocols.SupportsMixture, key: str | cirq.MeasurementKey | None = None
|
|
62
65
|
):
|
|
63
66
|
"""Creates a copy of a mixture with the given measurement key."""
|
|
64
67
|
return MixedUnitaryChannel(mixture=list(protocols.mixture(mixture)), key=key)
|
|
@@ -85,7 +88,7 @@ class MixedUnitaryChannel(raw_types.Gate):
|
|
|
85
88
|
return NotImplemented
|
|
86
89
|
return str(self._key)
|
|
87
90
|
|
|
88
|
-
def _measurement_key_obj_(self) ->
|
|
91
|
+
def _measurement_key_obj_(self) -> cirq.MeasurementKey:
|
|
89
92
|
if self._key is None:
|
|
90
93
|
return NotImplemented
|
|
91
94
|
return self._key
|
|
@@ -97,18 +100,18 @@ class MixedUnitaryChannel(raw_types.Gate):
|
|
|
97
100
|
return self
|
|
98
101
|
return MixedUnitaryChannel(mixture=self._mixture, key=key_map[str(self._key)])
|
|
99
102
|
|
|
100
|
-
def _with_key_path_(self, path:
|
|
103
|
+
def _with_key_path_(self, path: tuple[str, ...]):
|
|
101
104
|
return MixedUnitaryChannel(
|
|
102
105
|
mixture=self._mixture, key=protocols.with_key_path(self._key, path)
|
|
103
106
|
)
|
|
104
107
|
|
|
105
|
-
def _with_key_path_prefix_(self, prefix:
|
|
108
|
+
def _with_key_path_prefix_(self, prefix: tuple[str, ...]):
|
|
106
109
|
return MixedUnitaryChannel(
|
|
107
110
|
mixture=self._mixture, key=protocols.with_key_path_prefix(self._key, prefix)
|
|
108
111
|
)
|
|
109
112
|
|
|
110
113
|
def _with_rescoped_keys_(
|
|
111
|
-
self, path:
|
|
114
|
+
self, path: tuple[str, ...], bindable_keys: frozenset[cirq.MeasurementKey]
|
|
112
115
|
):
|
|
113
116
|
return MixedUnitaryChannel(
|
|
114
117
|
mixture=self._mixture, key=protocols.with_rescoped_keys(self._key, path, bindable_keys)
|
|
@@ -128,7 +131,7 @@ class MixedUnitaryChannel(raw_types.Gate):
|
|
|
128
131
|
args.append(f'key=\'{self._key}\'')
|
|
129
132
|
return f'cirq.MixedUnitaryChannel({", ".join(args)})'
|
|
130
133
|
|
|
131
|
-
def _json_dict_(self) ->
|
|
134
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
132
135
|
return protocols.obj_to_dict_helper(self, ['_mixture', '_key'])
|
|
133
136
|
|
|
134
137
|
@classmethod
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
# pylint: disable=wrong-or-nonexistent-copyright-notice
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
2
5
|
import numpy as np
|
|
3
6
|
import pytest
|
|
4
7
|
|
|
5
8
|
import cirq
|
|
6
9
|
|
|
7
10
|
|
|
8
|
-
def test_matrix_mixture_from_mixture():
|
|
11
|
+
def test_matrix_mixture_from_mixture() -> None:
|
|
9
12
|
q0 = cirq.LineQubit(0)
|
|
10
13
|
dp = cirq.depolarize(0.1)
|
|
11
14
|
mm = cirq.MixedUnitaryChannel.from_mixture(dp, key='dp')
|
|
@@ -22,7 +25,7 @@ def test_matrix_mixture_from_mixture():
|
|
|
22
25
|
assert results.measurements['dp'] in range(4)
|
|
23
26
|
|
|
24
27
|
|
|
25
|
-
def test_matrix_mixture_equality():
|
|
28
|
+
def test_matrix_mixture_equality() -> None:
|
|
26
29
|
dp_pt1 = cirq.depolarize(0.1)
|
|
27
30
|
dp_pt2 = cirq.depolarize(0.2)
|
|
28
31
|
mm_a1 = cirq.MixedUnitaryChannel.from_mixture(dp_pt1, key='a')
|
|
@@ -45,7 +48,7 @@ def test_matrix_mixture_equality():
|
|
|
45
48
|
assert half_flip != half_flip_inv
|
|
46
49
|
|
|
47
50
|
|
|
48
|
-
def test_matrix_mixture_remap_keys():
|
|
51
|
+
def test_matrix_mixture_remap_keys() -> None:
|
|
49
52
|
dp = cirq.depolarize(0.1)
|
|
50
53
|
mm = cirq.MixedUnitaryChannel.from_mixture(dp)
|
|
51
54
|
with pytest.raises(TypeError):
|
|
@@ -63,7 +66,7 @@ def test_matrix_mixture_remap_keys():
|
|
|
63
66
|
assert cirq.with_measurement_key_mapping(mm_a, {'a': 'b'}) == mm_b
|
|
64
67
|
|
|
65
68
|
|
|
66
|
-
def test_matrix_mixture_from_unitaries():
|
|
69
|
+
def test_matrix_mixture_from_unitaries() -> None:
|
|
67
70
|
q0 = cirq.LineQubit(0)
|
|
68
71
|
mix = [(0.5, np.array([[1, 0], [0, 1]])), (0.5, np.array([[0, 1], [1, 0]]))]
|
|
69
72
|
half_flip = cirq.MixedUnitaryChannel(mix, key='flip')
|
|
@@ -77,7 +80,7 @@ def test_matrix_mixture_from_unitaries():
|
|
|
77
80
|
assert results.measurements['flip'] == results.measurements['m']
|
|
78
81
|
|
|
79
82
|
|
|
80
|
-
def test_matrix_mixture_str():
|
|
83
|
+
def test_matrix_mixture_str() -> None:
|
|
81
84
|
mix = [(0.5, np.array([[1, 0], [0, 1]])), (0.5, np.array([[0, 1], [1, 0]]))]
|
|
82
85
|
half_flip = cirq.MixedUnitaryChannel(mix)
|
|
83
86
|
assert (
|
|
@@ -95,7 +98,7 @@ def test_matrix_mixture_str():
|
|
|
95
98
|
)
|
|
96
99
|
|
|
97
100
|
|
|
98
|
-
def test_matrix_mixture_repr():
|
|
101
|
+
def test_matrix_mixture_repr() -> None:
|
|
99
102
|
mix = [
|
|
100
103
|
(0.5, np.array([[1, 0], [0, 1]], dtype=np.dtype('complex64'))),
|
|
101
104
|
(0.5, np.array([[0, 1], [1, 0]], dtype=np.dtype('complex64'))),
|
|
@@ -111,19 +114,19 @@ key='flip')"""
|
|
|
111
114
|
)
|
|
112
115
|
|
|
113
116
|
|
|
114
|
-
def test_mix_no_unitaries_fails():
|
|
117
|
+
def test_mix_no_unitaries_fails() -> None:
|
|
115
118
|
with pytest.raises(ValueError, match='must have at least one unitary'):
|
|
116
119
|
_ = cirq.MixedUnitaryChannel(mixture=[], key='m')
|
|
117
120
|
|
|
118
121
|
|
|
119
|
-
def test_mix_bad_prob_fails():
|
|
122
|
+
def test_mix_bad_prob_fails() -> None:
|
|
120
123
|
mix = [(0.5, np.array([[1, 0], [0, 0]]))]
|
|
121
124
|
|
|
122
125
|
with pytest.raises(ValueError, match='Unitary probabilities must sum to 1'):
|
|
123
126
|
_ = cirq.MixedUnitaryChannel(mixture=mix, key='m')
|
|
124
127
|
|
|
125
128
|
|
|
126
|
-
def test_mix_mismatch_fails():
|
|
129
|
+
def test_mix_mismatch_fails() -> None:
|
|
127
130
|
op2 = np.zeros((4, 4))
|
|
128
131
|
op2[1][1] = 1
|
|
129
132
|
mix = [(0.5, np.array([[1, 0], [0, 0]])), (0.5, op2)]
|
|
@@ -132,14 +135,14 @@ def test_mix_mismatch_fails():
|
|
|
132
135
|
_ = cirq.MixedUnitaryChannel(mixture=mix, key='m')
|
|
133
136
|
|
|
134
137
|
|
|
135
|
-
def test_nonqubit_mixture_fails():
|
|
138
|
+
def test_nonqubit_mixture_fails() -> None:
|
|
136
139
|
mix = [(0.5, np.array([[1, 0, 0], [0, 1, 0]])), (0.5, np.array([[0, 1, 0], [1, 0, 0]]))]
|
|
137
140
|
|
|
138
141
|
with pytest.raises(ValueError, match='Input mixture'):
|
|
139
142
|
_ = cirq.MixedUnitaryChannel(mixture=mix, key='m')
|
|
140
143
|
|
|
141
144
|
|
|
142
|
-
def test_validate():
|
|
145
|
+
def test_validate() -> None:
|
|
143
146
|
mix = [(0.5, np.array([[1, 0], [0, 0]])), (0.5, np.array([[0, 0], [0, 1]]))]
|
|
144
147
|
with pytest.raises(ValueError, match='non-unitary'):
|
|
145
148
|
_ = cirq.MixedUnitaryChannel(mixture=mix, key='m', validate=True)
|
cirq/ops/named_qubit.py
CHANGED
|
@@ -11,9 +11,12 @@
|
|
|
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 functools
|
|
15
18
|
import weakref
|
|
16
|
-
from typing import Any,
|
|
19
|
+
from typing import Any, TYPE_CHECKING
|
|
17
20
|
|
|
18
21
|
from cirq import protocols
|
|
19
22
|
from cirq.ops import raw_types
|
|
@@ -28,8 +31,8 @@ class _BaseNamedQid(raw_types.Qid):
|
|
|
28
31
|
|
|
29
32
|
_name: str
|
|
30
33
|
_dimension: int
|
|
31
|
-
_comp_key:
|
|
32
|
-
_hash:
|
|
34
|
+
_comp_key: str | None = None
|
|
35
|
+
_hash: int | None = None
|
|
33
36
|
|
|
34
37
|
def __hash__(self) -> int:
|
|
35
38
|
if self._hash is None:
|
|
@@ -93,7 +96,7 @@ class _BaseNamedQid(raw_types.Qid):
|
|
|
93
96
|
def dimension(self) -> int:
|
|
94
97
|
return self._dimension
|
|
95
98
|
|
|
96
|
-
def with_dimension(self, dimension: int) ->
|
|
99
|
+
def with_dimension(self, dimension: int) -> NamedQid:
|
|
97
100
|
return NamedQid(self._name, dimension=dimension)
|
|
98
101
|
|
|
99
102
|
|
|
@@ -109,9 +112,9 @@ class NamedQid(_BaseNamedQid):
|
|
|
109
112
|
|
|
110
113
|
# Cache of existing NamedQid instances, returned by __new__ if available.
|
|
111
114
|
# Holds weak references so instances can still be garbage collected.
|
|
112
|
-
_cache = weakref.WeakValueDictionary[
|
|
115
|
+
_cache = weakref.WeakValueDictionary[tuple[str, int], 'cirq.NamedQid']()
|
|
113
116
|
|
|
114
|
-
def __new__(cls, name: str, dimension: int) ->
|
|
117
|
+
def __new__(cls, name: str, dimension: int) -> cirq.NamedQid:
|
|
115
118
|
"""Initializes a `NamedQid` with a given name and dimension.
|
|
116
119
|
|
|
117
120
|
Args:
|
|
@@ -134,7 +137,7 @@ class NamedQid(_BaseNamedQid):
|
|
|
134
137
|
return (self._name, self._dimension)
|
|
135
138
|
|
|
136
139
|
# avoid pickling the _hash value, attributes are already stored with __getnewargs__
|
|
137
|
-
def __getstate__(self) ->
|
|
140
|
+
def __getstate__(self) -> dict[str, Any]:
|
|
138
141
|
return {}
|
|
139
142
|
|
|
140
143
|
def __repr__(self) -> str:
|
|
@@ -144,7 +147,7 @@ class NamedQid(_BaseNamedQid):
|
|
|
144
147
|
return f'{self._name} (d={self._dimension})'
|
|
145
148
|
|
|
146
149
|
@staticmethod
|
|
147
|
-
def range(*args, prefix: str, dimension: int) ->
|
|
150
|
+
def range(*args, prefix: str, dimension: int) -> list[NamedQid]:
|
|
148
151
|
"""Returns a range of ``NamedQid``\\s.
|
|
149
152
|
|
|
150
153
|
The range returned starts with the prefix, and followed by a qid for
|
|
@@ -167,7 +170,7 @@ class NamedQid(_BaseNamedQid):
|
|
|
167
170
|
"""
|
|
168
171
|
return [NamedQid(f"{prefix}{i}", dimension=dimension) for i in range(*args)]
|
|
169
172
|
|
|
170
|
-
def _json_dict_(self) ->
|
|
173
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
171
174
|
return protocols.obj_to_dict_helper(self, ['name', 'dimension'])
|
|
172
175
|
|
|
173
176
|
|
|
@@ -186,7 +189,7 @@ class NamedQubit(_BaseNamedQid):
|
|
|
186
189
|
# Holds weak references so instances can still be garbage collected.
|
|
187
190
|
_cache = weakref.WeakValueDictionary[str, 'cirq.NamedQubit']()
|
|
188
191
|
|
|
189
|
-
def __new__(cls, name: str) ->
|
|
192
|
+
def __new__(cls, name: str) -> cirq.NamedQubit:
|
|
190
193
|
"""Initializes a `NamedQid` with a given name and dimension.
|
|
191
194
|
|
|
192
195
|
Args:
|
|
@@ -206,7 +209,7 @@ class NamedQubit(_BaseNamedQid):
|
|
|
206
209
|
return (self._name,)
|
|
207
210
|
|
|
208
211
|
# avoid pickling the _hash value, attributes are already stored with __getnewargs__
|
|
209
|
-
def __getstate__(self) ->
|
|
212
|
+
def __getstate__(self) -> dict[str, Any]:
|
|
210
213
|
return {}
|
|
211
214
|
|
|
212
215
|
def __str__(self) -> str:
|
|
@@ -216,7 +219,7 @@ class NamedQubit(_BaseNamedQid):
|
|
|
216
219
|
return f'cirq.NamedQubit({self._name!r})'
|
|
217
220
|
|
|
218
221
|
@staticmethod
|
|
219
|
-
def range(*args, prefix: str) ->
|
|
222
|
+
def range(*args, prefix: str) -> list[NamedQubit]:
|
|
220
223
|
r"""Returns a range of `cirq.NamedQubit`s.
|
|
221
224
|
|
|
222
225
|
The range returned starts with the prefix, and followed by a qubit for
|
|
@@ -238,7 +241,7 @@ class NamedQubit(_BaseNamedQid):
|
|
|
238
241
|
"""
|
|
239
242
|
return [NamedQubit(f"{prefix}{i}") for i in range(*args)]
|
|
240
243
|
|
|
241
|
-
def _json_dict_(self) ->
|
|
244
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
242
245
|
return protocols.obj_to_dict_helper(self, ['name'])
|
|
243
246
|
|
|
244
247
|
|
cirq/ops/named_qubit_test.py
CHANGED
|
@@ -12,21 +12,23 @@
|
|
|
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 cirq
|
|
16
18
|
from cirq.devices.grid_qubit_test import _test_qid_pickled_hash
|
|
17
19
|
from cirq.ops.named_qubit import _pad_digits
|
|
18
20
|
|
|
19
21
|
|
|
20
|
-
def test_init():
|
|
22
|
+
def test_init() -> None:
|
|
21
23
|
q = cirq.NamedQubit('a')
|
|
22
24
|
assert q.name == 'a'
|
|
23
25
|
|
|
24
|
-
|
|
25
|
-
assert
|
|
26
|
-
assert
|
|
26
|
+
qid = cirq.NamedQid('a', dimension=3)
|
|
27
|
+
assert qid.name == 'a'
|
|
28
|
+
assert qid.dimension == 3
|
|
27
29
|
|
|
28
30
|
|
|
29
|
-
def test_named_qubit_str():
|
|
31
|
+
def test_named_qubit_str() -> None:
|
|
30
32
|
q = cirq.NamedQubit('a')
|
|
31
33
|
assert q.name == 'a'
|
|
32
34
|
assert str(q) == 'a'
|
|
@@ -35,14 +37,14 @@ def test_named_qubit_str():
|
|
|
35
37
|
assert str(qid) == 'a (d=3)'
|
|
36
38
|
|
|
37
39
|
|
|
38
|
-
def test_named_qubit_repr():
|
|
40
|
+
def test_named_qubit_repr() -> None:
|
|
39
41
|
q = cirq.NamedQubit('a')
|
|
40
42
|
assert repr(q) == "cirq.NamedQubit('a')"
|
|
41
43
|
qid = cirq.NamedQid('a', dimension=3)
|
|
42
44
|
assert repr(qid) == "cirq.NamedQid('a', dimension=3)"
|
|
43
45
|
|
|
44
46
|
|
|
45
|
-
def test_named_qubit_pickled_hash():
|
|
47
|
+
def test_named_qubit_pickled_hash() -> None:
|
|
46
48
|
# Use a name that is unlikely to be used by any other tests.
|
|
47
49
|
x = "test_named_qubit_pickled_hash"
|
|
48
50
|
q_bad = cirq.NamedQubit(x)
|
|
@@ -51,7 +53,7 @@ def test_named_qubit_pickled_hash():
|
|
|
51
53
|
_test_qid_pickled_hash(q, q_bad)
|
|
52
54
|
|
|
53
55
|
|
|
54
|
-
def test_named_qid_pickled_hash():
|
|
56
|
+
def test_named_qid_pickled_hash() -> None:
|
|
55
57
|
# Use a name that is unlikely to be used by any other tests.
|
|
56
58
|
x = "test_named_qid_pickled_hash"
|
|
57
59
|
q_bad = cirq.NamedQid(x, dimension=3)
|
|
@@ -60,7 +62,7 @@ def test_named_qid_pickled_hash():
|
|
|
60
62
|
_test_qid_pickled_hash(q, q_bad)
|
|
61
63
|
|
|
62
64
|
|
|
63
|
-
def test_named_qubit_order():
|
|
65
|
+
def test_named_qubit_order() -> None:
|
|
64
66
|
order = cirq.testing.OrderTester()
|
|
65
67
|
order.add_ascending(
|
|
66
68
|
cirq.NamedQid('', dimension=1),
|
|
@@ -108,7 +110,7 @@ def test_named_qubit_order():
|
|
|
108
110
|
)
|
|
109
111
|
|
|
110
112
|
|
|
111
|
-
def test_pad_digits():
|
|
113
|
+
def test_pad_digits() -> None:
|
|
112
114
|
assert _pad_digits('') == ''
|
|
113
115
|
assert _pad_digits('a') == 'a'
|
|
114
116
|
assert _pad_digits('a0') == 'a00000000:1'
|
|
@@ -119,7 +121,7 @@ def test_pad_digits():
|
|
|
119
121
|
assert _pad_digits('a00000000:8') == 'a00000000:8:00000008:1'
|
|
120
122
|
|
|
121
123
|
|
|
122
|
-
def test_named_qubit_range():
|
|
124
|
+
def test_named_qubit_range() -> None:
|
|
123
125
|
qubits = cirq.NamedQubit.range(2, prefix='a')
|
|
124
126
|
assert qubits == [cirq.NamedQubit('a0'), cirq.NamedQubit('a1')]
|
|
125
127
|
|
|
@@ -127,7 +129,7 @@ def test_named_qubit_range():
|
|
|
127
129
|
assert qubits == [cirq.NamedQubit('a-1'), cirq.NamedQubit('a1'), cirq.NamedQubit('a3')]
|
|
128
130
|
|
|
129
131
|
|
|
130
|
-
def test_named_qid_range():
|
|
132
|
+
def test_named_qid_range() -> None:
|
|
131
133
|
qids = cirq.NamedQid.range(2, prefix='a', dimension=3)
|
|
132
134
|
assert qids == [cirq.NamedQid('a0', dimension=3), cirq.NamedQid('a1', dimension=3)]
|
|
133
135
|
|
|
@@ -149,7 +151,7 @@ def test_named_qid_range():
|
|
|
149
151
|
]
|
|
150
152
|
|
|
151
153
|
|
|
152
|
-
def test_to_json():
|
|
154
|
+
def test_to_json() -> None:
|
|
153
155
|
assert cirq.NamedQubit('c')._json_dict_() == {'name': 'c'}
|
|
154
156
|
|
|
155
157
|
assert cirq.NamedQid('c', dimension=3)._json_dict_() == {'name': 'c', 'dimension': 3}
|