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
|
@@ -23,6 +23,7 @@ if TYPE_CHECKING:
|
|
|
23
23
|
import cirq
|
|
24
24
|
|
|
25
25
|
|
|
26
|
+
@value.value_equality()
|
|
26
27
|
class DepolarizingNoiseModel(devices.NoiseModel):
|
|
27
28
|
"""Applies depolarizing noise to each qubit individually at the end of
|
|
28
29
|
every moment.
|
|
@@ -39,10 +40,25 @@ class DepolarizingNoiseModel(devices.NoiseModel):
|
|
|
39
40
|
prepend: If True, put noise before affected gates. Default: False.
|
|
40
41
|
"""
|
|
41
42
|
value.validate_probability(depol_prob, 'depol prob')
|
|
43
|
+
self._depol_prob = depol_prob
|
|
42
44
|
self.qubit_noise_gate = ops.DepolarizingChannel(depol_prob)
|
|
43
45
|
self._prepend = prepend
|
|
44
46
|
|
|
45
|
-
|
|
47
|
+
@property
|
|
48
|
+
def depol_prob(self):
|
|
49
|
+
"""The depolarizing probability."""
|
|
50
|
+
return self._depol_prob
|
|
51
|
+
|
|
52
|
+
def _value_equality_values_(self):
|
|
53
|
+
return self.depol_prob, self._prepend
|
|
54
|
+
|
|
55
|
+
def __repr__(self) -> str:
|
|
56
|
+
return (
|
|
57
|
+
f'cirq.contrib.noise_models.DepolarizingNoiseModel('
|
|
58
|
+
f'{self.depol_prob!r}, prepend={self._prepend!r})'
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
def noisy_moment(self, moment: cirq.Moment, system_qubits: Sequence[cirq.Qid]) -> cirq.OP_TREE:
|
|
46
62
|
if validate_all_measurements(moment) or self.is_virtual_moment(moment): # pragma: no cover
|
|
47
63
|
return moment
|
|
48
64
|
|
|
@@ -54,7 +70,11 @@ class DepolarizingNoiseModel(devices.NoiseModel):
|
|
|
54
70
|
]
|
|
55
71
|
return output[::-1] if self._prepend else output
|
|
56
72
|
|
|
73
|
+
def _json_dict_(self) -> dict[str, object]:
|
|
74
|
+
return {'depol_prob': self.depol_prob, 'prepend': self._prepend}
|
|
57
75
|
|
|
76
|
+
|
|
77
|
+
@value.value_equality()
|
|
58
78
|
class ReadoutNoiseModel(devices.NoiseModel):
|
|
59
79
|
"""NoiseModel with probabilistic bit flips preceding measurement.
|
|
60
80
|
|
|
@@ -75,10 +95,23 @@ class ReadoutNoiseModel(devices.NoiseModel):
|
|
|
75
95
|
prepend: If True, put noise before affected gates. Default: True.
|
|
76
96
|
"""
|
|
77
97
|
value.validate_probability(bitflip_prob, 'bitflip prob')
|
|
98
|
+
self._bitflip_prob = bitflip_prob
|
|
78
99
|
self.readout_noise_gate = ops.BitFlipChannel(bitflip_prob)
|
|
79
100
|
self._prepend = prepend
|
|
80
101
|
|
|
81
|
-
|
|
102
|
+
@property
|
|
103
|
+
def bitflip_prob(self):
|
|
104
|
+
"""The probability of a bit-flip during measurement."""
|
|
105
|
+
return self._bitflip_prob
|
|
106
|
+
|
|
107
|
+
def _value_equality_values_(self):
|
|
108
|
+
return self.bitflip_prob, self._prepend
|
|
109
|
+
|
|
110
|
+
def __repr__(self) -> str:
|
|
111
|
+
p = self.bitflip_prob
|
|
112
|
+
return f'cirq.contrib.noise_models.ReadoutNoiseModel({p!r}, prepend={self._prepend!r})'
|
|
113
|
+
|
|
114
|
+
def noisy_moment(self, moment: cirq.Moment, system_qubits: Sequence[cirq.Qid]) -> cirq.OP_TREE:
|
|
82
115
|
if self.is_virtual_moment(moment):
|
|
83
116
|
return moment
|
|
84
117
|
if validate_all_measurements(moment):
|
|
@@ -91,7 +124,11 @@ class ReadoutNoiseModel(devices.NoiseModel):
|
|
|
91
124
|
return output if self._prepend else output[::-1]
|
|
92
125
|
return moment
|
|
93
126
|
|
|
127
|
+
def _json_dict_(self) -> dict[str, object]:
|
|
128
|
+
return {'bitflip_prob': self.bitflip_prob, 'prepend': self._prepend}
|
|
129
|
+
|
|
94
130
|
|
|
131
|
+
@value.value_equality()
|
|
95
132
|
class DampedReadoutNoiseModel(devices.NoiseModel):
|
|
96
133
|
"""NoiseModel with T1 decay preceding measurement.
|
|
97
134
|
|
|
@@ -112,10 +149,25 @@ class DampedReadoutNoiseModel(devices.NoiseModel):
|
|
|
112
149
|
prepend: If True, put noise before affected gates. Default: True.
|
|
113
150
|
"""
|
|
114
151
|
value.validate_probability(decay_prob, 'decay_prob')
|
|
152
|
+
self._decay_prob = decay_prob
|
|
115
153
|
self.readout_decay_gate = ops.AmplitudeDampingChannel(decay_prob)
|
|
116
154
|
self._prepend = prepend
|
|
117
155
|
|
|
118
|
-
|
|
156
|
+
@property
|
|
157
|
+
def decay_prob(self):
|
|
158
|
+
"""The probability of T1 decay during measurement."""
|
|
159
|
+
return self._decay_prob
|
|
160
|
+
|
|
161
|
+
def _value_equality_values_(self):
|
|
162
|
+
return self.decay_prob, self._prepend
|
|
163
|
+
|
|
164
|
+
def __repr__(self) -> str:
|
|
165
|
+
return (
|
|
166
|
+
f'cirq.contrib.noise_models.DampedReadoutNoiseModel('
|
|
167
|
+
f'{self.decay_prob!r}, prepend={self._prepend!r})'
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
def noisy_moment(self, moment: cirq.Moment, system_qubits: Sequence[cirq.Qid]) -> cirq.OP_TREE:
|
|
119
171
|
if self.is_virtual_moment(moment):
|
|
120
172
|
return moment
|
|
121
173
|
if validate_all_measurements(moment):
|
|
@@ -128,7 +180,11 @@ class DampedReadoutNoiseModel(devices.NoiseModel):
|
|
|
128
180
|
return output if self._prepend else output[::-1]
|
|
129
181
|
return moment
|
|
130
182
|
|
|
183
|
+
def _json_dict_(self) -> dict[str, object]:
|
|
184
|
+
return {'decay_prob': self.decay_prob, 'prepend': self._prepend}
|
|
185
|
+
|
|
131
186
|
|
|
187
|
+
@value.value_equality()
|
|
132
188
|
class DepolarizingWithReadoutNoiseModel(devices.NoiseModel):
|
|
133
189
|
"""DepolarizingNoiseModel with probabilistic bit flips preceding
|
|
134
190
|
measurement.
|
|
@@ -145,15 +201,39 @@ class DepolarizingWithReadoutNoiseModel(devices.NoiseModel):
|
|
|
145
201
|
"""
|
|
146
202
|
value.validate_probability(depol_prob, 'depol prob')
|
|
147
203
|
value.validate_probability(bitflip_prob, 'bitflip prob')
|
|
204
|
+
self._depol_prob = depol_prob
|
|
205
|
+
self._bitflip_prob = bitflip_prob
|
|
148
206
|
self.qubit_noise_gate = ops.DepolarizingChannel(depol_prob)
|
|
149
207
|
self.readout_noise_gate = ops.BitFlipChannel(bitflip_prob)
|
|
150
208
|
|
|
151
|
-
|
|
209
|
+
@property
|
|
210
|
+
def depol_prob(self):
|
|
211
|
+
"""The depolarizing probability."""
|
|
212
|
+
return self._depol_prob
|
|
213
|
+
|
|
214
|
+
@property
|
|
215
|
+
def bitflip_prob(self):
|
|
216
|
+
"""The probability of a bit-flip during measurement."""
|
|
217
|
+
return self._bitflip_prob
|
|
218
|
+
|
|
219
|
+
def _value_equality_values_(self):
|
|
220
|
+
return self.depol_prob, self.bitflip_prob
|
|
221
|
+
|
|
222
|
+
def __repr__(self) -> str:
|
|
223
|
+
p = self.depol_prob
|
|
224
|
+
b = self.bitflip_prob
|
|
225
|
+
return f'cirq.contrib.noise_models.DepolarizingWithReadoutNoiseModel({p!r}, {b!r})'
|
|
226
|
+
|
|
227
|
+
def noisy_moment(self, moment: cirq.Moment, system_qubits: Sequence[cirq.Qid]) -> cirq.OP_TREE:
|
|
152
228
|
if validate_all_measurements(moment):
|
|
153
229
|
return [circuits.Moment(self.readout_noise_gate(q) for q in system_qubits), moment]
|
|
154
230
|
return [moment, circuits.Moment(self.qubit_noise_gate(q) for q in system_qubits)]
|
|
155
231
|
|
|
232
|
+
def _json_dict_(self) -> dict[str, object]:
|
|
233
|
+
return {'depol_prob': self.depol_prob, 'bitflip_prob': self.bitflip_prob}
|
|
234
|
+
|
|
156
235
|
|
|
236
|
+
@value.value_equality()
|
|
157
237
|
class DepolarizingWithDampedReadoutNoiseModel(devices.NoiseModel):
|
|
158
238
|
"""DepolarizingWithReadoutNoiseModel with T1 decay preceding
|
|
159
239
|
measurement.
|
|
@@ -174,11 +254,38 @@ class DepolarizingWithDampedReadoutNoiseModel(devices.NoiseModel):
|
|
|
174
254
|
value.validate_probability(depol_prob, 'depol prob')
|
|
175
255
|
value.validate_probability(bitflip_prob, 'bitflip prob')
|
|
176
256
|
value.validate_probability(decay_prob, 'decay_prob')
|
|
257
|
+
self._depol_prob = depol_prob
|
|
258
|
+
self._bitflip_prob = bitflip_prob
|
|
259
|
+
self._decay_prob = decay_prob
|
|
177
260
|
self.qubit_noise_gate = ops.DepolarizingChannel(depol_prob)
|
|
178
261
|
self.readout_noise_gate = ops.BitFlipChannel(bitflip_prob)
|
|
179
262
|
self.readout_decay_gate = ops.AmplitudeDampingChannel(decay_prob)
|
|
180
263
|
|
|
181
|
-
|
|
264
|
+
@property
|
|
265
|
+
def depol_prob(self):
|
|
266
|
+
"""The depolarizing probability."""
|
|
267
|
+
return self._depol_prob
|
|
268
|
+
|
|
269
|
+
@property
|
|
270
|
+
def bitflip_prob(self):
|
|
271
|
+
"""Probability of a bit-flip during measurement."""
|
|
272
|
+
return self._bitflip_prob
|
|
273
|
+
|
|
274
|
+
@property
|
|
275
|
+
def decay_prob(self):
|
|
276
|
+
"""The probability of T1 decay during measurement."""
|
|
277
|
+
return self._decay_prob
|
|
278
|
+
|
|
279
|
+
def _value_equality_values_(self):
|
|
280
|
+
return self.depol_prob, self.bitflip_prob, self.decay_prob
|
|
281
|
+
|
|
282
|
+
def __repr__(self) -> str:
|
|
283
|
+
return (
|
|
284
|
+
'cirq.contrib.noise_models.DepolarizingWithDampedReadoutNoiseModel('
|
|
285
|
+
f'{self.depol_prob!r}, {self.bitflip_prob!r}, {self.decay_prob!r})'
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
def noisy_moment(self, moment: cirq.Moment, system_qubits: Sequence[cirq.Qid]) -> cirq.OP_TREE:
|
|
182
289
|
if validate_all_measurements(moment):
|
|
183
290
|
return [
|
|
184
291
|
circuits.Moment(self.readout_decay_gate(q) for q in system_qubits),
|
|
@@ -187,3 +294,10 @@ class DepolarizingWithDampedReadoutNoiseModel(devices.NoiseModel):
|
|
|
187
294
|
]
|
|
188
295
|
else:
|
|
189
296
|
return [moment, circuits.Moment(self.qubit_noise_gate(q) for q in system_qubits)]
|
|
297
|
+
|
|
298
|
+
def _json_dict_(self) -> dict[str, object]:
|
|
299
|
+
return {
|
|
300
|
+
'depol_prob': self.depol_prob,
|
|
301
|
+
'bitflip_prob': self.bitflip_prob,
|
|
302
|
+
'decay_prob': self.decay_prob,
|
|
303
|
+
}
|
|
@@ -12,28 +12,34 @@
|
|
|
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
|
+
|
|
17
|
+
import pytest
|
|
18
|
+
|
|
15
19
|
import cirq
|
|
16
20
|
import cirq.contrib.noise_models as ccn
|
|
17
21
|
from cirq import ops
|
|
18
|
-
from cirq.testing import assert_equivalent_op_tree
|
|
22
|
+
from cirq.testing import assert_equivalent_op_tree, assert_equivalent_repr
|
|
19
23
|
|
|
20
24
|
|
|
21
|
-
def test_depol_noise():
|
|
25
|
+
def test_depol_noise() -> None:
|
|
22
26
|
noise_model = ccn.DepolarizingNoiseModel(depol_prob=0.005)
|
|
23
27
|
qubits = cirq.LineQubit.range(2)
|
|
24
28
|
moment = cirq.Moment([cirq.X(qubits[0]), cirq.Y(qubits[1])])
|
|
25
29
|
noisy_mom = noise_model.noisy_moment(moment, system_qubits=qubits)
|
|
30
|
+
assert isinstance(noisy_mom, list)
|
|
26
31
|
assert len(noisy_mom) == 2
|
|
27
32
|
assert noisy_mom[0] == moment
|
|
28
33
|
for g in noisy_mom[1]:
|
|
29
34
|
assert isinstance(g.gate, cirq.DepolarizingChannel)
|
|
30
35
|
|
|
31
36
|
|
|
32
|
-
def test_depol_noise_prepend():
|
|
37
|
+
def test_depol_noise_prepend() -> None:
|
|
33
38
|
noise_model = ccn.DepolarizingNoiseModel(depol_prob=0.005, prepend=True)
|
|
34
39
|
qubits = cirq.LineQubit.range(2)
|
|
35
40
|
moment = cirq.Moment([cirq.X(qubits[0]), cirq.Y(qubits[1])])
|
|
36
41
|
noisy_mom = noise_model.noisy_moment(moment, system_qubits=qubits)
|
|
42
|
+
assert isinstance(noisy_mom, list)
|
|
37
43
|
assert len(noisy_mom) == 2
|
|
38
44
|
assert noisy_mom[1] == moment
|
|
39
45
|
for g in noisy_mom[0]:
|
|
@@ -41,7 +47,7 @@ def test_depol_noise_prepend():
|
|
|
41
47
|
|
|
42
48
|
|
|
43
49
|
# Composes depolarization noise with readout noise.
|
|
44
|
-
def test_readout_noise_after_moment():
|
|
50
|
+
def test_readout_noise_after_moment() -> None:
|
|
45
51
|
program = cirq.Circuit()
|
|
46
52
|
qubits = cirq.LineQubit.range(3)
|
|
47
53
|
program.append(
|
|
@@ -92,11 +98,32 @@ def test_readout_noise_after_moment():
|
|
|
92
98
|
assert_equivalent_op_tree(true_noisy_program, noisy_circuit)
|
|
93
99
|
|
|
94
100
|
|
|
95
|
-
|
|
101
|
+
@pytest.mark.parametrize(
|
|
102
|
+
'model',
|
|
103
|
+
[
|
|
104
|
+
ccn.DepolarizingNoiseModel(0.1),
|
|
105
|
+
ccn.DepolarizingNoiseModel(0.1, prepend=False),
|
|
106
|
+
ccn.DepolarizingNoiseModel(0.1, prepend=True),
|
|
107
|
+
ccn.ReadoutNoiseModel(0.2),
|
|
108
|
+
ccn.ReadoutNoiseModel(0.2, prepend=False),
|
|
109
|
+
ccn.ReadoutNoiseModel(0.2, prepend=True),
|
|
110
|
+
ccn.DampedReadoutNoiseModel(0.3),
|
|
111
|
+
ccn.DampedReadoutNoiseModel(0.3, prepend=False),
|
|
112
|
+
ccn.DampedReadoutNoiseModel(0.3, prepend=True),
|
|
113
|
+
ccn.DepolarizingWithReadoutNoiseModel(0.1, 0.2),
|
|
114
|
+
ccn.DepolarizingWithDampedReadoutNoiseModel(0.1, 0.2, 0.3),
|
|
115
|
+
],
|
|
116
|
+
)
|
|
117
|
+
def test_repr(model) -> None:
|
|
118
|
+
assert_equivalent_repr(model)
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def test_readout_noise_no_prepend() -> None:
|
|
96
122
|
noise_model = ccn.ReadoutNoiseModel(bitflip_prob=0.005, prepend=False)
|
|
97
123
|
qubits = cirq.LineQubit.range(2)
|
|
98
124
|
moment = cirq.Moment([cirq.measure(*qubits, key="meas")])
|
|
99
125
|
noisy_mom = noise_model.noisy_moment(moment, system_qubits=qubits)
|
|
126
|
+
assert isinstance(noisy_mom, list)
|
|
100
127
|
assert len(noisy_mom) == 2
|
|
101
128
|
assert noisy_mom[0] == moment
|
|
102
129
|
for g in noisy_mom[1]:
|
|
@@ -104,7 +131,7 @@ def test_readout_noise_no_prepend():
|
|
|
104
131
|
|
|
105
132
|
|
|
106
133
|
# Composes depolarization, damping, and readout noise (in that order).
|
|
107
|
-
def test_decay_noise_after_moment():
|
|
134
|
+
def test_decay_noise_after_moment() -> None:
|
|
108
135
|
program = cirq.Circuit()
|
|
109
136
|
qubits = cirq.LineQubit.range(3)
|
|
110
137
|
program.append(
|
|
@@ -160,11 +187,12 @@ def test_decay_noise_after_moment():
|
|
|
160
187
|
assert_equivalent_op_tree(true_noisy_program, noisy_circuit)
|
|
161
188
|
|
|
162
189
|
|
|
163
|
-
def test_damped_readout_noise_no_prepend():
|
|
190
|
+
def test_damped_readout_noise_no_prepend() -> None:
|
|
164
191
|
noise_model = ccn.DampedReadoutNoiseModel(decay_prob=0.005, prepend=False)
|
|
165
192
|
qubits = cirq.LineQubit.range(2)
|
|
166
193
|
moment = cirq.Moment([cirq.measure(*qubits, key="meas")])
|
|
167
194
|
noisy_mom = noise_model.noisy_moment(moment, system_qubits=qubits)
|
|
195
|
+
assert isinstance(noisy_mom, list)
|
|
168
196
|
assert len(noisy_mom) == 2
|
|
169
197
|
assert noisy_mom[0] == moment
|
|
170
198
|
for g in noisy_mom[1]:
|
|
@@ -172,7 +200,7 @@ def test_damped_readout_noise_no_prepend():
|
|
|
172
200
|
|
|
173
201
|
|
|
174
202
|
# Test the aggregate noise models.
|
|
175
|
-
def test_aggregate_readout_noise_after_moment():
|
|
203
|
+
def test_aggregate_readout_noise_after_moment() -> None:
|
|
176
204
|
program = cirq.Circuit()
|
|
177
205
|
qubits = cirq.LineQubit.range(3)
|
|
178
206
|
program.append(
|
|
@@ -219,7 +247,7 @@ def test_aggregate_readout_noise_after_moment():
|
|
|
219
247
|
assert_equivalent_op_tree(true_noisy_program, noisy_circuit)
|
|
220
248
|
|
|
221
249
|
|
|
222
|
-
def test_aggregate_decay_noise_after_moment():
|
|
250
|
+
def test_aggregate_decay_noise_after_moment() -> None:
|
|
223
251
|
program = cirq.Circuit()
|
|
224
252
|
qubits = cirq.LineQubit.range(3)
|
|
225
253
|
program.append(
|
|
@@ -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 cast
|
|
16
18
|
|
|
17
19
|
from cirq import circuits, ops, protocols, transformers
|
|
18
20
|
from cirq.contrib.paulistring.clifford_target_gateset import CliffordTargetGateset
|
|
@@ -29,7 +31,7 @@ def clifford_optimized_circuit(circuit: circuits.Circuit, atol: float = 1e-8) ->
|
|
|
29
31
|
|
|
30
32
|
def find_merge_point(
|
|
31
33
|
start_i: int, string_op: ops.PauliStringPhasor, stop_at_cz: bool
|
|
32
|
-
) ->
|
|
34
|
+
) -> tuple[int, ops.PauliStringPhasor, int]:
|
|
33
35
|
STOP = 0
|
|
34
36
|
CONTINUE = 1
|
|
35
37
|
SKIP = 2
|
|
@@ -65,7 +67,7 @@ def clifford_optimized_circuit(circuit: circuits.Circuit, atol: float = 1e-8) ->
|
|
|
65
67
|
furthest_i = i
|
|
66
68
|
break
|
|
67
69
|
if cont_cond == CONTINUE:
|
|
68
|
-
modified_op = modified_op.
|
|
70
|
+
modified_op = modified_op.conjugated_by(protocols.inverse(op))
|
|
69
71
|
num_passed_over += 1
|
|
70
72
|
if len(modified_op.pauli_string) == 1:
|
|
71
73
|
furthest_op = modified_op
|
|
@@ -122,7 +124,7 @@ def clifford_optimized_circuit(circuit: circuits.Circuit, atol: float = 1e-8) ->
|
|
|
122
124
|
all_ops.insert(merge_i + 1, part_cliff_gate(qubit))
|
|
123
125
|
elif isinstance(other_op, ops.PauliStringPhasor):
|
|
124
126
|
# Pass over a non-Clifford gate
|
|
125
|
-
mod_op = other_op.
|
|
127
|
+
mod_op = other_op.conjugated_by([part_cliff_gate(qubit)])
|
|
126
128
|
all_ops[merge_i] = mod_op
|
|
127
129
|
all_ops.insert(merge_i + 1, part_cliff_gate(qubit))
|
|
128
130
|
elif merge_i > start_i + 1 and num_passed > 0:
|
|
@@ -12,12 +12,13 @@
|
|
|
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
|
|
15
16
|
|
|
16
17
|
import cirq
|
|
17
18
|
from cirq.contrib.paulistring import clifford_optimized_circuit, CliffordTargetGateset
|
|
18
19
|
|
|
19
20
|
|
|
20
|
-
def test_optimize():
|
|
21
|
+
def test_optimize() -> None:
|
|
21
22
|
q0, q1 = cirq.LineQubit.range(2)
|
|
22
23
|
c_orig = cirq.Circuit(
|
|
23
24
|
cirq.X(q1) ** 0.5,
|
|
@@ -49,7 +50,7 @@ def test_optimize():
|
|
|
49
50
|
)
|
|
50
51
|
|
|
51
52
|
|
|
52
|
-
def test_remove_czs():
|
|
53
|
+
def test_remove_czs() -> None:
|
|
53
54
|
q0, q1 = cirq.LineQubit.range(2)
|
|
54
55
|
c_orig = cirq.Circuit(cirq.CZ(q0, q1), cirq.Z(q0) ** 0.5, cirq.CZ(q0, q1))
|
|
55
56
|
c_expected = cirq.optimize_for_target_gateset(
|
|
@@ -72,7 +73,7 @@ def test_remove_czs():
|
|
|
72
73
|
)
|
|
73
74
|
|
|
74
75
|
|
|
75
|
-
def test_remove_staggered_czs():
|
|
76
|
+
def test_remove_staggered_czs() -> None:
|
|
76
77
|
q0, q1, q2 = cirq.LineQubit.range(3)
|
|
77
78
|
c_orig = cirq.Circuit(cirq.CZ(q0, q1), cirq.CZ(q1, q2), cirq.CZ(q0, q1))
|
|
78
79
|
c_expected = cirq.optimize_for_target_gateset(
|
|
@@ -97,7 +98,7 @@ def test_remove_staggered_czs():
|
|
|
97
98
|
)
|
|
98
99
|
|
|
99
100
|
|
|
100
|
-
def test_with_measurements():
|
|
101
|
+
def test_with_measurements() -> None:
|
|
101
102
|
q0, q1 = cirq.LineQubit.range(2)
|
|
102
103
|
c_orig = cirq.Circuit(cirq.X(q0), cirq.CZ(q0, q1), cirq.measure(q0, q1, key='m'))
|
|
103
104
|
c_expected = cirq.optimize_for_target_gateset(
|
|
@@ -121,7 +122,7 @@ def test_with_measurements():
|
|
|
121
122
|
)
|
|
122
123
|
|
|
123
124
|
|
|
124
|
-
def test_optimize_large_circuit():
|
|
125
|
+
def test_optimize_large_circuit() -> None:
|
|
125
126
|
q0, q1, q2 = cirq.LineQubit.range(3)
|
|
126
127
|
c_orig = cirq.testing.nonoptimal_toffoli_circuit(q0, q1, q2)
|
|
127
128
|
|
|
@@ -16,19 +16,19 @@ from __future__ import annotations
|
|
|
16
16
|
|
|
17
17
|
from enum import Enum
|
|
18
18
|
from types import NotImplementedType
|
|
19
|
-
from typing import cast,
|
|
20
|
-
|
|
21
|
-
import numpy as np
|
|
19
|
+
from typing import cast, TYPE_CHECKING
|
|
22
20
|
|
|
23
21
|
from cirq import linalg, ops, protocols, transformers
|
|
24
22
|
|
|
25
23
|
if TYPE_CHECKING:
|
|
24
|
+
import numpy as np
|
|
25
|
+
|
|
26
26
|
import cirq
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
def _matrix_to_clifford_op(
|
|
30
30
|
mat: np.ndarray, qubit: cirq.Qid, *, atol: float
|
|
31
|
-
) ->
|
|
31
|
+
) -> ops.Operation | NotImplementedType:
|
|
32
32
|
rotations = transformers.single_qubit_matrix_to_pauli_rotations(mat, atol)
|
|
33
33
|
clifford_gate = ops.SingleQubitCliffordGate.I
|
|
34
34
|
for pauli, half_turns in rotations:
|
|
@@ -48,7 +48,7 @@ def _matrix_to_pauli_string_phasors(
|
|
|
48
48
|
mat: np.ndarray, qubit: cirq.Qid, *, keep_clifford: bool, atol: float
|
|
49
49
|
) -> ops.OP_TREE:
|
|
50
50
|
rotations = transformers.single_qubit_matrix_to_pauli_rotations(mat, atol)
|
|
51
|
-
out_ops:
|
|
51
|
+
out_ops: list[ops.GateOperation] = []
|
|
52
52
|
for pauli, half_turns in rotations:
|
|
53
53
|
if keep_clifford and linalg.all_near_zero_mod(half_turns, 0.5):
|
|
54
54
|
cliff_gate = ops.SingleQubitCliffordGate.from_quarter_turns(
|
|
@@ -79,7 +79,7 @@ class CliffordTargetGateset(transformers.TwoQubitCompilationTargetGateset):
|
|
|
79
79
|
def __init__(
|
|
80
80
|
self,
|
|
81
81
|
*,
|
|
82
|
-
single_qubit_target: SingleQubitTarget = SingleQubitTarget.PAULI_STRING_PHASORS_AND_CLIFFORDS, #
|
|
82
|
+
single_qubit_target: SingleQubitTarget = SingleQubitTarget.PAULI_STRING_PHASORS_AND_CLIFFORDS, # noqa: E501
|
|
83
83
|
atol: float = 1e-8,
|
|
84
84
|
):
|
|
85
85
|
"""Initializes CliffordTargetGateset
|
|
@@ -97,7 +97,7 @@ class CliffordTargetGateset(transformers.TwoQubitCompilationTargetGateset):
|
|
|
97
97
|
"""
|
|
98
98
|
self.atol = atol
|
|
99
99
|
self.single_qubit_target = single_qubit_target
|
|
100
|
-
gates:
|
|
100
|
+
gates: list[cirq.Gate | type[cirq.Gate]] = [ops.CZ, ops.MeasurementGate]
|
|
101
101
|
if single_qubit_target in [
|
|
102
102
|
self.SingleQubitTarget.SINGLE_QUBIT_CLIFFORDS,
|
|
103
103
|
self.SingleQubitTarget.PAULI_STRING_PHASORS_AND_CLIFFORDS,
|
|
@@ -112,7 +112,7 @@ class CliffordTargetGateset(transformers.TwoQubitCompilationTargetGateset):
|
|
|
112
112
|
|
|
113
113
|
def _decompose_single_qubit_operation(
|
|
114
114
|
self, op: cirq.Operation, _
|
|
115
|
-
) ->
|
|
115
|
+
) -> NotImplementedType | cirq.OP_TREE:
|
|
116
116
|
if not protocols.has_unitary(op):
|
|
117
117
|
return NotImplemented
|
|
118
118
|
mat = protocols.unitary(op)
|
|
@@ -129,7 +129,7 @@ class CliffordTargetGateset(transformers.TwoQubitCompilationTargetGateset):
|
|
|
129
129
|
|
|
130
130
|
def _decompose_two_qubit_operation(
|
|
131
131
|
self, op: cirq.Operation, _
|
|
132
|
-
) ->
|
|
132
|
+
) -> NotImplementedType | cirq.OP_TREE:
|
|
133
133
|
if not protocols.has_unitary(op):
|
|
134
134
|
return NotImplemented
|
|
135
135
|
return transformers.two_qubit_matrix_to_cz_operations(
|
|
@@ -141,7 +141,7 @@ class CliffordTargetGateset(transformers.TwoQubitCompilationTargetGateset):
|
|
|
141
141
|
)
|
|
142
142
|
|
|
143
143
|
@property
|
|
144
|
-
def postprocess_transformers(self) ->
|
|
144
|
+
def postprocess_transformers(self) -> list[cirq.TRANSFORMER]:
|
|
145
145
|
"""List of transformers which should be run after decomposing individual operations."""
|
|
146
146
|
|
|
147
147
|
def rewriter(o: cirq.CircuitOperation):
|
|
@@ -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 pytest
|
|
16
18
|
import sympy
|
|
17
19
|
|
|
@@ -41,7 +43,7 @@ from cirq.contrib.paulistring.clifford_target_gateset import CliffordTargetGates
|
|
|
41
43
|
)
|
|
42
44
|
)(cirq.LineQubit(0), cirq.LineQubit(1)),
|
|
43
45
|
)
|
|
44
|
-
def test_converts_various_ops(op, expected_ops):
|
|
46
|
+
def test_converts_various_ops(op, expected_ops) -> None:
|
|
45
47
|
before = cirq.Circuit(op)
|
|
46
48
|
expected = cirq.Circuit(expected_ops, strategy=cirq.InsertStrategy.EARLIEST)
|
|
47
49
|
after = cirq.optimize_for_target_gateset(
|
|
@@ -58,7 +60,7 @@ def test_converts_various_ops(op, expected_ops):
|
|
|
58
60
|
)
|
|
59
61
|
|
|
60
62
|
|
|
61
|
-
def test_degenerate_single_qubit_decompose():
|
|
63
|
+
def test_degenerate_single_qubit_decompose() -> None:
|
|
62
64
|
q0 = cirq.LineQubit(0)
|
|
63
65
|
|
|
64
66
|
before = cirq.Circuit(cirq.Z(q0) ** 0.1, cirq.X(q0) ** 1.0000000001, cirq.Z(q0) ** 0.1)
|
|
@@ -72,7 +74,7 @@ def test_degenerate_single_qubit_decompose():
|
|
|
72
74
|
cirq.testing.assert_allclose_up_to_global_phase(after.unitary(), expected.unitary(), atol=1e-7)
|
|
73
75
|
|
|
74
76
|
|
|
75
|
-
def test_converts_single_qubit_series():
|
|
77
|
+
def test_converts_single_qubit_series() -> None:
|
|
76
78
|
q0 = cirq.LineQubit(0)
|
|
77
79
|
|
|
78
80
|
before = cirq.Circuit(
|
|
@@ -96,7 +98,7 @@ def test_converts_single_qubit_series():
|
|
|
96
98
|
cirq.testing.assert_allclose_up_to_global_phase(before.unitary(), after.unitary(), atol=1e-7)
|
|
97
99
|
|
|
98
100
|
|
|
99
|
-
def test_converts_single_qubit_then_two():
|
|
101
|
+
def test_converts_single_qubit_then_two() -> None:
|
|
100
102
|
q0, q1 = cirq.LineQubit.range(2)
|
|
101
103
|
|
|
102
104
|
before = cirq.Circuit(cirq.X(q0), cirq.Y(q0), cirq.CZ(q0, q1))
|
|
@@ -107,7 +109,7 @@ def test_converts_single_qubit_then_two():
|
|
|
107
109
|
cirq.testing.assert_allclose_up_to_global_phase(before.unitary(), after.unitary(), atol=1e-7)
|
|
108
110
|
|
|
109
111
|
|
|
110
|
-
def test_converts_large_circuit():
|
|
112
|
+
def test_converts_large_circuit() -> None:
|
|
111
113
|
q0, q1, q2 = cirq.LineQubit.range(3)
|
|
112
114
|
|
|
113
115
|
before = cirq.Circuit(
|
|
@@ -147,7 +149,7 @@ def test_converts_large_circuit():
|
|
|
147
149
|
)
|
|
148
150
|
|
|
149
151
|
|
|
150
|
-
def test_convert_to_pauli_string_phasors():
|
|
152
|
+
def test_convert_to_pauli_string_phasors() -> None:
|
|
151
153
|
q0, q1 = cirq.LineQubit.range(2)
|
|
152
154
|
c_orig = cirq.Circuit(cirq.X(q0), cirq.Y(q1) ** 0.25, cirq.Z(q0) ** 0.125, cirq.H(q1))
|
|
153
155
|
c_new = cirq.optimize_for_target_gateset(
|
|
@@ -168,7 +170,7 @@ def test_convert_to_pauli_string_phasors():
|
|
|
168
170
|
)
|
|
169
171
|
|
|
170
172
|
|
|
171
|
-
def test_already_converted():
|
|
173
|
+
def test_already_converted() -> None:
|
|
172
174
|
q0 = cirq.LineQubit(0)
|
|
173
175
|
c_orig = cirq.Circuit(cirq.PauliStringPhasor(cirq.X.on(q0)))
|
|
174
176
|
c_new = cirq.optimize_for_target_gateset(
|
|
@@ -181,7 +183,7 @@ def test_already_converted():
|
|
|
181
183
|
assert c_new == c_orig
|
|
182
184
|
|
|
183
185
|
|
|
184
|
-
def test_ignore_unsupported_gate():
|
|
186
|
+
def test_ignore_unsupported_gate() -> None:
|
|
185
187
|
class UnsupportedGate(cirq.testing.TwoQubitGate):
|
|
186
188
|
pass
|
|
187
189
|
|
|
@@ -193,7 +195,7 @@ def test_ignore_unsupported_gate():
|
|
|
193
195
|
assert c_new == c_orig
|
|
194
196
|
|
|
195
197
|
|
|
196
|
-
def test_fail_unsupported_gate():
|
|
198
|
+
def test_fail_unsupported_gate() -> None:
|
|
197
199
|
class UnsupportedGate(cirq.testing.TwoQubitGate):
|
|
198
200
|
pass
|
|
199
201
|
|
|
@@ -205,7 +207,7 @@ def test_fail_unsupported_gate():
|
|
|
205
207
|
)
|
|
206
208
|
|
|
207
209
|
|
|
208
|
-
def test_convert_to_single_qubit_cliffords():
|
|
210
|
+
def test_convert_to_single_qubit_cliffords() -> None:
|
|
209
211
|
q0, q1 = cirq.LineQubit.range(2)
|
|
210
212
|
c_orig = cirq.Circuit(
|
|
211
213
|
cirq.X(q0), cirq.Y(q1) ** 0.5, cirq.Z(q0) ** -0.5, cirq.Z(q1) ** 0, cirq.H(q0)
|
|
@@ -232,7 +234,7 @@ def test_convert_to_single_qubit_cliffords():
|
|
|
232
234
|
)
|
|
233
235
|
|
|
234
236
|
|
|
235
|
-
def test_convert_to_single_qubit_cliffords_ignores_non_clifford():
|
|
237
|
+
def test_convert_to_single_qubit_cliffords_ignores_non_clifford() -> None:
|
|
236
238
|
q0 = cirq.LineQubit(0)
|
|
237
239
|
c_orig = cirq.Circuit(cirq.Z(q0) ** 0.25)
|
|
238
240
|
c_new = cirq.optimize_for_target_gateset(
|
|
@@ -12,12 +12,13 @@
|
|
|
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
|
|
15
16
|
|
|
16
17
|
import cirq
|
|
17
18
|
from cirq.contrib.paulistring import optimized_circuit
|
|
18
19
|
|
|
19
20
|
|
|
20
|
-
def test_optimize():
|
|
21
|
+
def test_optimize() -> None:
|
|
21
22
|
q0, q1, q2 = cirq.LineQubit.range(3)
|
|
22
23
|
c_orig = cirq.Circuit(
|
|
23
24
|
cirq.X(q0) ** 0.5,
|
|
@@ -61,7 +62,7 @@ def test_optimize():
|
|
|
61
62
|
)
|
|
62
63
|
|
|
63
64
|
|
|
64
|
-
def test_optimize_large_circuit():
|
|
65
|
+
def test_optimize_large_circuit() -> None:
|
|
65
66
|
q0, q1, q2 = cirq.LineQubit.range(3)
|
|
66
67
|
c_orig = cirq.testing.nonoptimal_toffoli_circuit(q0, q1, q2)
|
|
67
68
|
|
|
@@ -79,7 +80,7 @@ def test_optimize_large_circuit():
|
|
|
79
80
|
)
|
|
80
81
|
|
|
81
82
|
|
|
82
|
-
def test_repeat_limit():
|
|
83
|
+
def test_repeat_limit() -> None:
|
|
83
84
|
q0, q1, q2 = cirq.LineQubit.range(3)
|
|
84
85
|
c_orig = cirq.testing.nonoptimal_toffoli_circuit(q0, q1, q2)
|
|
85
86
|
|
|
@@ -12,11 +12,13 @@
|
|
|
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.contrib.paulistring import convert_and_separate_circuit, pauli_string_dag_from_circuit
|
|
17
19
|
|
|
18
20
|
|
|
19
|
-
def test_pauli_string_dag_from_circuit():
|
|
21
|
+
def test_pauli_string_dag_from_circuit() -> None:
|
|
20
22
|
q0, q1, q2 = cirq.LineQubit.range(3)
|
|
21
23
|
c_orig = cirq.testing.nonoptimal_toffoli_circuit(q0, q1, q2)
|
|
22
24
|
c_left, _ = convert_and_separate_circuit(c_orig)
|