cirq-core 1.5.0.dev20250409225226__py3-none-any.whl → 1.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of cirq-core might be problematic. Click here for more details.
- cirq/__init__.py +16 -17
- cirq/_compat.py +21 -20
- cirq/_compat_test.py +14 -34
- cirq/_doc.py +4 -2
- cirq/_import.py +8 -6
- cirq/_import_test.py +4 -2
- cirq/_version.py +6 -6
- cirq/_version_test.py +2 -2
- cirq/circuits/_block_diagram_drawer.py +11 -10
- cirq/circuits/_block_diagram_drawer_test.py +8 -6
- cirq/circuits/_box_drawing_character_data.py +8 -8
- cirq/circuits/_box_drawing_character_data_test.py +3 -1
- cirq/circuits/_bucket_priority_queue.py +9 -7
- cirq/circuits/_bucket_priority_queue_test.py +22 -20
- cirq/circuits/circuit.py +248 -172
- cirq/circuits/circuit_operation.py +73 -83
- cirq/circuits/circuit_operation_test.py +128 -90
- cirq/circuits/circuit_test.py +211 -151
- cirq/circuits/frozen_circuit.py +23 -60
- cirq/circuits/frozen_circuit_test.py +31 -8
- cirq/circuits/insert_strategy.py +7 -5
- cirq/circuits/insert_strategy_test.py +4 -2
- cirq/circuits/moment.py +88 -40
- cirq/circuits/moment_test.py +128 -51
- cirq/circuits/optimization_pass.py +5 -5
- cirq/circuits/optimization_pass_test.py +10 -10
- cirq/circuits/qasm_output.py +11 -11
- cirq/circuits/qasm_output_test.py +25 -22
- cirq/circuits/text_diagram_drawer.py +23 -38
- cirq/circuits/text_diagram_drawer_test.py +19 -17
- cirq/conftest.py +4 -3
- cirq/contrib/__init__.py +4 -4
- cirq/contrib/acquaintance/__init__.py +1 -1
- cirq/contrib/acquaintance/bipartite.py +5 -8
- cirq/contrib/acquaintance/bipartite_test.py +18 -13
- cirq/contrib/acquaintance/devices.py +2 -2
- cirq/contrib/acquaintance/devices_test.py +5 -3
- cirq/contrib/acquaintance/executor.py +5 -5
- cirq/contrib/acquaintance/executor_test.py +13 -9
- cirq/contrib/acquaintance/gates.py +18 -28
- cirq/contrib/acquaintance/gates_test.py +24 -20
- cirq/contrib/acquaintance/inspection_utils.py +8 -4
- cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
- cirq/contrib/acquaintance/mutation_utils.py +4 -4
- cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
- cirq/contrib/acquaintance/optimizers.py +4 -4
- cirq/contrib/acquaintance/optimizers_test.py +4 -1
- cirq/contrib/acquaintance/permutation.py +15 -27
- cirq/contrib/acquaintance/permutation_test.py +26 -17
- cirq/contrib/acquaintance/shift.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
- cirq/contrib/acquaintance/shift_test.py +8 -6
- cirq/contrib/acquaintance/strategies/cubic.py +2 -2
- cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
- cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
- cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
- cirq/contrib/acquaintance/testing.py +2 -0
- cirq/contrib/acquaintance/topological_sort.py +2 -2
- cirq/contrib/acquaintance/topological_sort_test.py +3 -1
- cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
- cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
- cirq/contrib/circuitdag/circuit_dag.py +4 -4
- cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
- cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
- cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
- cirq/contrib/graph_device/graph_device.py +12 -11
- cirq/contrib/graph_device/graph_device_test.py +18 -14
- cirq/contrib/graph_device/hypergraph.py +16 -14
- cirq/contrib/graph_device/hypergraph_test.py +13 -11
- cirq/contrib/graph_device/uniform_graph_device.py +6 -4
- cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
- cirq/contrib/hacks/disable_validation.py +6 -1
- cirq/contrib/hacks/disable_validation_test.py +3 -1
- cirq/contrib/json.py +31 -5
- cirq/contrib/json_test.py +6 -3
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/__init__.py +17 -0
- cirq/contrib/json_test_data/spec.py +32 -0
- cirq/contrib/noise_models/noise_models.py +119 -5
- cirq/contrib/noise_models/noise_models_test.py +37 -9
- cirq/contrib/paulistring/clifford_optimize.py +6 -4
- cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
- cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
- cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
- cirq/contrib/paulistring/optimize.py +2 -0
- cirq/contrib/paulistring/optimize_test.py +4 -3
- cirq/contrib/paulistring/pauli_string_dag.py +2 -0
- cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
- cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
- cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
- cirq/contrib/paulistring/recombine.py +6 -4
- cirq/contrib/paulistring/recombine_test.py +3 -1
- cirq/contrib/paulistring/separate.py +9 -6
- cirq/contrib/paulistring/separate_test.py +3 -1
- cirq/contrib/qasm_import/_lexer.py +3 -2
- cirq/contrib/qasm_import/_lexer_test.py +49 -13
- cirq/contrib/qasm_import/_parser.py +547 -83
- cirq/contrib/qasm_import/_parser_test.py +988 -97
- cirq/contrib/qasm_import/exception.py +2 -0
- cirq/contrib/qasm_import/qasm.py +8 -2
- cirq/contrib/qasm_import/qasm_test.py +7 -4
- cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
- cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
- cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
- cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
- cirq/contrib/qcircuit/qcircuit_test.py +10 -8
- cirq/contrib/quantum_volume/quantum_volume.py +31 -27
- cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
- cirq/contrib/quimb/density_matrix.py +15 -14
- cirq/contrib/quimb/density_matrix_test.py +10 -7
- cirq/contrib/quimb/grid_circuits.py +5 -2
- cirq/contrib/quimb/grid_circuits_test.py +3 -0
- cirq/contrib/quimb/mps_simulator.py +20 -20
- cirq/contrib/quimb/mps_simulator_test.py +3 -0
- cirq/contrib/quimb/state_vector.py +12 -11
- cirq/contrib/quimb/state_vector_test.py +3 -0
- cirq/contrib/quirk/export_to_quirk.py +5 -3
- cirq/contrib/quirk/export_to_quirk_test.py +18 -16
- cirq/contrib/quirk/linearize_circuit.py +2 -0
- cirq/contrib/quirk/quirk_gate.py +18 -17
- cirq/contrib/routing/device.py +5 -3
- cirq/contrib/routing/device_test.py +2 -0
- cirq/contrib/routing/greedy.py +10 -21
- cirq/contrib/routing/greedy_test.py +4 -2
- cirq/contrib/routing/initialization.py +2 -2
- cirq/contrib/routing/initialization_test.py +5 -3
- cirq/contrib/routing/router.py +9 -5
- cirq/contrib/routing/router_test.py +2 -0
- cirq/contrib/routing/swap_network.py +3 -3
- cirq/contrib/routing/swap_network_test.py +3 -1
- cirq/contrib/routing/utils.py +2 -2
- cirq/contrib/routing/utils_test.py +3 -0
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
- cirq/contrib/svg/svg.py +3 -3
- cirq/contrib/svg/svg_test.py +8 -5
- cirq/devices/device.py +4 -4
- cirq/devices/device_test.py +7 -4
- cirq/devices/grid_device_metadata.py +10 -10
- cirq/devices/grid_device_metadata_test.py +3 -0
- cirq/devices/grid_qubit.py +29 -21
- cirq/devices/grid_qubit_test.py +3 -0
- cirq/devices/insertion_noise_model.py +7 -7
- cirq/devices/insertion_noise_model_test.py +7 -5
- cirq/devices/line_qubit.py +13 -13
- cirq/devices/line_qubit_test.py +2 -0
- cirq/devices/named_topologies.py +18 -29
- cirq/devices/named_topologies_test.py +13 -10
- cirq/devices/noise_model.py +3 -3
- cirq/devices/noise_model_test.py +19 -15
- cirq/devices/noise_properties.py +15 -6
- cirq/devices/noise_properties_test.py +34 -3
- cirq/devices/noise_utils.py +11 -9
- cirq/devices/noise_utils_test.py +2 -0
- cirq/devices/superconducting_qubits_noise_properties.py +23 -22
- cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
- cirq/devices/thermal_noise_model.py +107 -37
- cirq/devices/thermal_noise_model_test.py +21 -0
- cirq/devices/unconstrained_device.py +5 -3
- cirq/devices/unconstrained_device_test.py +2 -0
- cirq/experiments/__init__.py +4 -2
- cirq/experiments/benchmarking/__init__.py +17 -0
- cirq/experiments/benchmarking/parallel_xeb.py +677 -0
- cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
- cirq/experiments/fidelity_estimation.py +14 -8
- cirq/experiments/fidelity_estimation_test.py +3 -0
- cirq/experiments/n_qubit_tomography.py +17 -16
- cirq/experiments/n_qubit_tomography_test.py +8 -5
- cirq/experiments/purity_estimation.py +2 -0
- cirq/experiments/purity_estimation_test.py +2 -0
- cirq/experiments/qubit_characterizations.py +207 -103
- cirq/experiments/qubit_characterizations_test.py +40 -12
- cirq/experiments/random_quantum_circuit_generation.py +56 -70
- cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
- cirq/experiments/readout_confusion_matrix.py +24 -22
- cirq/experiments/readout_confusion_matrix_test.py +2 -0
- cirq/experiments/single_qubit_readout_calibration.py +30 -15
- cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
- cirq/experiments/t1_decay_experiment.py +9 -7
- cirq/experiments/t1_decay_experiment_test.py +13 -11
- cirq/experiments/t2_decay_experiment.py +16 -13
- cirq/experiments/t2_decay_experiment_test.py +2 -0
- cirq/experiments/two_qubit_xeb.py +64 -57
- cirq/experiments/two_qubit_xeb_test.py +10 -6
- cirq/experiments/xeb_fitting.py +39 -35
- cirq/experiments/xeb_sampling.py +37 -44
- cirq/experiments/xeb_sampling_test.py +3 -0
- cirq/experiments/xeb_simulation.py +14 -10
- cirq/experiments/xeb_simulation_test.py +5 -5
- cirq/experiments/z_phase_calibration.py +32 -29
- cirq/experiments/z_phase_calibration_test.py +3 -4
- cirq/interop/quirk/cells/__init__.py +1 -1
- cirq/interop/quirk/cells/all_cells.py +7 -2
- cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
- cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
- cirq/interop/quirk/cells/cell.py +19 -28
- cirq/interop/quirk/cells/cell_test.py +3 -0
- cirq/interop/quirk/cells/composite_cell.py +13 -28
- cirq/interop/quirk/cells/composite_cell_test.py +2 -0
- cirq/interop/quirk/cells/control_cells.py +15 -15
- cirq/interop/quirk/cells/control_cells_test.py +7 -5
- cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
- cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
- cirq/interop/quirk/cells/ignored_cells.py +3 -0
- cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
- cirq/interop/quirk/cells/input_cells.py +7 -5
- cirq/interop/quirk/cells/input_cells_test.py +7 -5
- cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
- cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
- cirq/interop/quirk/cells/measurement_cells.py +5 -2
- cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
- cirq/interop/quirk/cells/parse.py +22 -23
- cirq/interop/quirk/cells/parse_test.py +12 -10
- cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
- cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
- cirq/interop/quirk/cells/scalar_cells.py +4 -1
- cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
- cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
- cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
- cirq/interop/quirk/cells/swap_cell.py +8 -6
- cirq/interop/quirk/cells/swap_cell_test.py +6 -4
- cirq/interop/quirk/cells/testing.py +6 -6
- cirq/interop/quirk/cells/testing_test.py +8 -6
- cirq/interop/quirk/cells/unsupported_cells.py +3 -0
- cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
- cirq/interop/quirk/url_to_circuit.py +23 -36
- cirq/interop/quirk/url_to_circuit_test.py +4 -1
- cirq/json_resolver_cache.py +14 -12
- cirq/linalg/__init__.py +4 -6
- cirq/linalg/combinators.py +7 -5
- cirq/linalg/combinators_test.py +10 -7
- cirq/linalg/decompositions.py +24 -35
- cirq/linalg/decompositions_test.py +3 -1
- cirq/linalg/diagonalize.py +6 -4
- cirq/linalg/diagonalize_test.py +15 -14
- cirq/linalg/operator_spaces.py +14 -14
- cirq/linalg/operator_spaces_test.py +13 -11
- cirq/linalg/predicates.py +18 -9
- cirq/linalg/predicates_test.py +5 -0
- cirq/linalg/tolerance.py +6 -3
- cirq/linalg/tolerance_test.py +6 -4
- cirq/linalg/transformations.py +23 -20
- cirq/linalg/transformations_test.py +73 -43
- cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
- cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
- cirq/neutral_atoms/neutral_atom_devices.py +2 -0
- cirq/ops/__init__.py +2 -0
- cirq/ops/arithmetic_operation.py +21 -21
- cirq/ops/arithmetic_operation_test.py +7 -8
- cirq/ops/boolean_hamiltonian.py +23 -22
- cirq/ops/boolean_hamiltonian_test.py +12 -9
- cirq/ops/classically_controlled_operation.py +31 -36
- cirq/ops/classically_controlled_operation_test.py +121 -117
- cirq/ops/clifford_gate.py +98 -81
- cirq/ops/clifford_gate_test.py +72 -57
- cirq/ops/common_channels.py +44 -44
- cirq/ops/common_channels_test.py +83 -81
- cirq/ops/common_gate_families.py +9 -7
- cirq/ops/common_gate_families_test.py +11 -7
- cirq/ops/common_gates.py +164 -183
- cirq/ops/common_gates_test.py +135 -95
- cirq/ops/control_values.py +23 -26
- cirq/ops/control_values_test.py +22 -20
- cirq/ops/controlled_gate.py +64 -112
- cirq/ops/controlled_gate_test.py +130 -35
- cirq/ops/controlled_operation.py +24 -35
- cirq/ops/controlled_operation_test.py +8 -6
- cirq/ops/dense_pauli_string.py +38 -49
- cirq/ops/dense_pauli_string_test.py +4 -2
- cirq/ops/diagonal_gate.py +18 -31
- cirq/ops/diagonal_gate_test.py +13 -13
- cirq/ops/eigen_gate.py +29 -29
- cirq/ops/eigen_gate_test.py +45 -28
- cirq/ops/fourier_transform.py +14 -20
- cirq/ops/fourier_transform_test.py +15 -12
- cirq/ops/fsim_gate.py +43 -42
- cirq/ops/fsim_gate_test.py +29 -29
- cirq/ops/gate_features.py +2 -0
- cirq/ops/gate_features_test.py +5 -3
- cirq/ops/gate_operation.py +43 -65
- cirq/ops/gate_operation_test.py +46 -42
- cirq/ops/gateset.py +28 -40
- cirq/ops/gateset_test.py +4 -2
- cirq/ops/global_phase_op.py +45 -20
- cirq/ops/global_phase_op_test.py +44 -20
- cirq/ops/greedy_qubit_manager.py +10 -8
- cirq/ops/greedy_qubit_manager_test.py +5 -3
- cirq/ops/identity.py +14 -12
- cirq/ops/identity_test.py +24 -20
- cirq/ops/kraus_channel.py +11 -8
- cirq/ops/kraus_channel_test.py +14 -11
- cirq/ops/linear_combinations.py +65 -77
- cirq/ops/linear_combinations_test.py +14 -9
- cirq/ops/matrix_gates.py +21 -18
- cirq/ops/matrix_gates_test.py +16 -0
- cirq/ops/measure_util.py +15 -20
- cirq/ops/measure_util_test.py +2 -0
- cirq/ops/measurement_gate.py +26 -37
- cirq/ops/measurement_gate_test.py +2 -0
- cirq/ops/mixed_unitary_channel.py +12 -9
- cirq/ops/mixed_unitary_channel_test.py +14 -11
- cirq/ops/named_qubit.py +16 -13
- cirq/ops/named_qubit_test.py +15 -13
- cirq/ops/op_tree.py +9 -7
- cirq/ops/op_tree_test.py +22 -19
- cirq/ops/parallel_gate.py +15 -17
- cirq/ops/parallel_gate_test.py +18 -16
- cirq/ops/parity_gates.py +23 -25
- cirq/ops/parity_gates_test.py +36 -32
- cirq/ops/pauli_gates.py +22 -21
- cirq/ops/pauli_gates_test.py +29 -20
- cirq/ops/pauli_interaction_gate.py +15 -19
- cirq/ops/pauli_interaction_gate_test.py +10 -8
- cirq/ops/pauli_measurement_gate.py +23 -35
- cirq/ops/pauli_measurement_gate_test.py +2 -0
- cirq/ops/pauli_string.py +92 -120
- cirq/ops/pauli_string_phasor.py +52 -45
- cirq/ops/pauli_string_phasor_test.py +4 -5
- cirq/ops/pauli_string_raw_types.py +9 -7
- cirq/ops/pauli_string_raw_types_test.py +2 -0
- cirq/ops/pauli_string_test.py +31 -154
- cirq/ops/pauli_sum_exponential.py +12 -12
- cirq/ops/pauli_sum_exponential_test.py +12 -10
- cirq/ops/permutation_gate.py +8 -6
- cirq/ops/permutation_gate_test.py +10 -8
- cirq/ops/phased_iswap_gate.py +16 -16
- cirq/ops/phased_iswap_gate_test.py +17 -15
- cirq/ops/phased_x_gate.py +16 -17
- cirq/ops/phased_x_gate_test.py +18 -16
- cirq/ops/phased_x_z_gate.py +24 -22
- cirq/ops/phased_x_z_gate_test.py +17 -11
- cirq/ops/projector.py +16 -11
- cirq/ops/projector_test.py +19 -16
- cirq/ops/qid_util.py +7 -5
- cirq/ops/qid_util_test.py +2 -0
- cirq/ops/qubit_manager.py +11 -9
- cirq/ops/qubit_manager_test.py +6 -4
- cirq/ops/qubit_order.py +11 -14
- cirq/ops/qubit_order_or_list.py +4 -2
- cirq/ops/qubit_order_test.py +12 -10
- cirq/ops/random_gate_channel.py +12 -10
- cirq/ops/random_gate_channel_test.py +14 -11
- cirq/ops/raw_types.py +109 -129
- cirq/ops/raw_types_test.py +63 -57
- cirq/ops/state_preparation_channel.py +7 -7
- cirq/ops/state_preparation_channel_test.py +11 -9
- cirq/ops/swap_gates.py +13 -15
- cirq/ops/swap_gates_test.py +19 -17
- cirq/ops/tags.py +5 -3
- cirq/ops/tags_test.py +4 -2
- cirq/ops/three_qubit_gates.py +43 -76
- cirq/ops/three_qubit_gates_test.py +19 -17
- cirq/ops/two_qubit_diagonal_gate.py +13 -13
- cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
- cirq/ops/uniform_superposition_gate.py +5 -3
- cirq/ops/uniform_superposition_gate_test.py +5 -3
- cirq/ops/wait_gate.py +17 -14
- cirq/ops/wait_gate_test.py +9 -6
- cirq/protocols/__init__.py +0 -3
- cirq/protocols/act_on_protocol.py +8 -6
- cirq/protocols/act_on_protocol_test.py +15 -12
- cirq/protocols/apply_channel_protocol.py +10 -14
- cirq/protocols/apply_channel_protocol_test.py +2 -0
- cirq/protocols/apply_mixture_protocol.py +13 -42
- cirq/protocols/apply_mixture_protocol_test.py +7 -5
- cirq/protocols/apply_unitary_protocol.py +39 -34
- cirq/protocols/apply_unitary_protocol_test.py +4 -1
- cirq/protocols/approximate_equality_protocol.py +2 -0
- cirq/protocols/approximate_equality_protocol_test.py +2 -0
- cirq/protocols/circuit_diagram_info_protocol.py +58 -42
- cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
- cirq/protocols/commutes_protocol.py +8 -7
- cirq/protocols/commutes_protocol_test.py +2 -0
- cirq/protocols/control_key_protocol.py +6 -4
- cirq/protocols/control_key_protocol_test.py +3 -1
- cirq/protocols/decompose_protocol.py +49 -48
- cirq/protocols/decompose_protocol_test.py +27 -16
- cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
- cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
- cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
- cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
- cirq/protocols/has_unitary_protocol.py +10 -6
- cirq/protocols/has_unitary_protocol_test.py +13 -8
- cirq/protocols/hash_from_pickle_test.py +2 -11
- cirq/protocols/inverse_protocol.py +13 -16
- cirq/protocols/inverse_protocol_test.py +5 -3
- cirq/protocols/json_serialization.py +35 -54
- cirq/protocols/json_serialization_test.py +14 -21
- cirq/protocols/json_test_data/CXSWAP.json +46 -0
- cirq/protocols/json_test_data/CXSWAP.repr +13 -0
- cirq/protocols/json_test_data/CZSWAP.json +46 -0
- cirq/protocols/json_test_data/CZSWAP.repr +13 -0
- cirq/protocols/json_test_data/CircuitOperation.json +6 -3
- cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
- cirq/protocols/json_test_data/Moment.json +24 -1
- cirq/protocols/json_test_data/Moment.repr +6 -1
- cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
- cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
- cirq/protocols/json_test_data/spec.py +6 -2
- cirq/protocols/kraus_protocol.py +47 -7
- cirq/protocols/kraus_protocol_test.py +86 -12
- cirq/protocols/measurement_key_protocol.py +15 -16
- cirq/protocols/measurement_key_protocol_test.py +13 -11
- cirq/protocols/mixture_protocol.py +7 -5
- cirq/protocols/mixture_protocol_test.py +4 -2
- cirq/protocols/mul_protocol.py +2 -3
- cirq/protocols/mul_protocol_test.py +2 -0
- cirq/protocols/pauli_expansion_protocol.py +6 -3
- cirq/protocols/pauli_expansion_protocol_test.py +5 -3
- cirq/protocols/phase_protocol.py +2 -0
- cirq/protocols/phase_protocol_test.py +3 -1
- cirq/protocols/pow_protocol.py +11 -16
- cirq/protocols/pow_protocol_test.py +2 -0
- cirq/protocols/qasm.py +14 -20
- cirq/protocols/qasm_test.py +6 -3
- cirq/protocols/qid_shape_protocol.py +8 -8
- cirq/protocols/qid_shape_protocol_test.py +3 -1
- cirq/protocols/resolve_parameters.py +5 -3
- cirq/protocols/resolve_parameters_test.py +8 -7
- cirq/protocols/trace_distance_bound.py +6 -4
- cirq/protocols/trace_distance_bound_test.py +3 -1
- cirq/protocols/unitary_protocol.py +17 -7
- cirq/protocols/unitary_protocol_test.py +12 -2
- cirq/qis/channels.py +6 -2
- cirq/qis/channels_test.py +20 -16
- cirq/qis/clifford_tableau.py +21 -19
- cirq/qis/clifford_tableau_test.py +2 -2
- cirq/qis/entropy.py +14 -3
- cirq/qis/entropy_test.py +3 -1
- cirq/qis/measures.py +13 -13
- cirq/qis/measures_test.py +20 -14
- cirq/qis/noise_utils.py +2 -0
- cirq/qis/noise_utils_test.py +9 -7
- cirq/qis/quantum_state_representation.py +7 -8
- cirq/qis/states.py +58 -56
- cirq/qis/states_test.py +2 -0
- cirq/sim/classical_simulator.py +23 -22
- cirq/sim/classical_simulator_test.py +2 -0
- cirq/sim/clifford/clifford_simulator.py +23 -21
- cirq/sim/clifford/clifford_simulator_test.py +7 -4
- cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
- cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
- cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
- cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
- cirq/sim/clifford/stabilizer_sampler.py +9 -7
- cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
- cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
- cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
- cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
- cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
- cirq/sim/density_matrix_simulation_state.py +26 -27
- cirq/sim/density_matrix_simulation_state_test.py +10 -8
- cirq/sim/density_matrix_simulator.py +30 -28
- cirq/sim/density_matrix_simulator_test.py +48 -48
- cirq/sim/density_matrix_utils.py +13 -11
- cirq/sim/density_matrix_utils_test.py +38 -36
- cirq/sim/mux.py +33 -31
- cirq/sim/mux_test.py +3 -0
- cirq/sim/simulation_product_state.py +15 -15
- cirq/sim/simulation_product_state_test.py +29 -26
- cirq/sim/simulation_state.py +29 -38
- cirq/sim/simulation_state_base.py +21 -32
- cirq/sim/simulation_state_test.py +15 -13
- cirq/sim/simulation_utils.py +5 -2
- cirq/sim/simulation_utils_test.py +5 -2
- cirq/sim/simulator.py +90 -106
- cirq/sim/simulator_base.py +33 -45
- cirq/sim/simulator_base_test.py +20 -15
- cirq/sim/simulator_test.py +23 -14
- cirq/sim/sparse_simulator.py +19 -17
- cirq/sim/sparse_simulator_test.py +41 -40
- cirq/sim/state_vector.py +15 -12
- cirq/sim/state_vector_simulation_state.py +31 -31
- cirq/sim/state_vector_simulation_state_test.py +16 -14
- cirq/sim/state_vector_simulator.py +17 -14
- cirq/sim/state_vector_simulator_test.py +2 -0
- cirq/sim/state_vector_test.py +6 -3
- cirq/study/flatten_expressions.py +16 -15
- cirq/study/flatten_expressions_test.py +13 -11
- cirq/study/resolver.py +18 -17
- cirq/study/resolver_test.py +22 -20
- cirq/study/result.py +17 -27
- cirq/study/result_test.py +2 -0
- cirq/study/sweepable.py +12 -10
- cirq/study/sweepable_test.py +3 -0
- cirq/study/sweeps.py +42 -61
- cirq/study/sweeps_test.py +33 -0
- cirq/testing/__init__.py +7 -11
- cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
- cirq/testing/circuit_compare.py +8 -17
- cirq/testing/circuit_compare_test.py +2 -0
- cirq/testing/consistent_act_on.py +13 -11
- cirq/testing/consistent_act_on_test.py +5 -3
- cirq/testing/consistent_channels.py +2 -0
- cirq/testing/consistent_channels_test.py +10 -8
- cirq/testing/consistent_controlled_gate_op.py +5 -5
- cirq/testing/consistent_controlled_gate_op_test.py +18 -18
- cirq/testing/consistent_decomposition.py +2 -2
- cirq/testing/consistent_decomposition_test.py +4 -2
- cirq/testing/consistent_pauli_expansion.py +2 -0
- cirq/testing/consistent_pauli_expansion_test.py +3 -1
- cirq/testing/consistent_phase_by.py +2 -0
- cirq/testing/consistent_phase_by_test.py +3 -1
- cirq/testing/consistent_protocols.py +14 -20
- cirq/testing/consistent_protocols_test.py +13 -11
- cirq/testing/consistent_qasm.py +6 -4
- cirq/testing/consistent_qasm_test.py +7 -7
- cirq/testing/consistent_resolve_parameters.py +2 -0
- cirq/testing/consistent_specified_has_unitary.py +2 -2
- cirq/testing/consistent_specified_has_unitary_test.py +6 -4
- cirq/testing/consistent_unitary.py +1 -0
- cirq/testing/consistent_unitary_test.py +4 -2
- cirq/testing/deprecation.py +5 -2
- cirq/testing/deprecation_test.py +5 -2
- cirq/testing/devices.py +7 -4
- cirq/testing/devices_test.py +7 -4
- cirq/testing/equals_tester.py +4 -2
- cirq/testing/equals_tester_test.py +21 -17
- cirq/testing/equivalent_basis_map.py +6 -4
- cirq/testing/equivalent_basis_map_test.py +6 -4
- cirq/testing/equivalent_repr_eval.py +6 -4
- cirq/testing/equivalent_repr_eval_test.py +5 -3
- cirq/testing/gate_features.py +2 -0
- cirq/testing/gate_features_test.py +7 -5
- cirq/testing/json.py +19 -15
- cirq/testing/json_test.py +5 -3
- cirq/testing/lin_alg_utils.py +10 -11
- cirq/testing/lin_alg_utils_test.py +14 -12
- cirq/testing/logs.py +7 -6
- cirq/testing/logs_test.py +9 -7
- cirq/testing/no_identifier_qubit.py +4 -2
- cirq/testing/no_identifier_qubit_test.py +5 -3
- cirq/testing/op_tree.py +2 -0
- cirq/testing/op_tree_test.py +4 -1
- cirq/testing/order_tester.py +2 -0
- cirq/testing/order_tester_test.py +8 -6
- cirq/testing/pytest_utils.py +2 -0
- cirq/testing/pytest_utils_test.py +4 -2
- cirq/testing/random_circuit.py +21 -20
- cirq/testing/random_circuit_test.py +12 -9
- cirq/testing/repr_pretty_tester.py +1 -0
- cirq/testing/repr_pretty_tester_test.py +5 -3
- cirq/testing/routing_devices.py +4 -1
- cirq/testing/routing_devices_test.py +9 -6
- cirq/testing/sample_circuits.py +4 -1
- cirq/testing/sample_circuits_test.py +3 -1
- cirq/testing/sample_gates.py +3 -0
- cirq/testing/sample_gates_test.py +5 -2
- cirq/transformers/__init__.py +11 -4
- cirq/transformers/align.py +9 -7
- cirq/transformers/align_test.py +2 -0
- cirq/transformers/analytical_decompositions/__init__.py +3 -6
- cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
- cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
- cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
- cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
- cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
- cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
- cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
- cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
- cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
- cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
- cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
- cirq/transformers/drop_empty_moments.py +5 -3
- cirq/transformers/drop_empty_moments_test.py +4 -2
- cirq/transformers/drop_negligible_operations.py +7 -5
- cirq/transformers/drop_negligible_operations_test.py +2 -0
- cirq/transformers/dynamical_decoupling.py +49 -42
- cirq/transformers/dynamical_decoupling_test.py +223 -205
- cirq/transformers/eject_phased_paulis.py +28 -26
- cirq/transformers/eject_phased_paulis_test.py +12 -9
- cirq/transformers/eject_z.py +12 -12
- cirq/transformers/eject_z_test.py +2 -2
- cirq/transformers/expand_composite.py +6 -4
- cirq/transformers/expand_composite_test.py +3 -1
- cirq/transformers/gauge_compiling/__init__.py +3 -1
- cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
- cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
- cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
- cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
- cirq/transformers/insertion_sort.py +8 -6
- cirq/transformers/insertion_sort_test.py +3 -1
- cirq/transformers/measurement_transformers.py +29 -29
- cirq/transformers/measurement_transformers_test.py +2 -0
- cirq/transformers/merge_k_qubit_gates.py +12 -10
- cirq/transformers/merge_k_qubit_gates_test.py +18 -18
- cirq/transformers/merge_single_qubit_gates.py +197 -20
- cirq/transformers/merge_single_qubit_gates_test.py +177 -5
- cirq/transformers/noise_adding.py +5 -3
- cirq/transformers/noise_adding_test.py +2 -0
- cirq/transformers/optimize_for_target_gateset.py +19 -17
- cirq/transformers/optimize_for_target_gateset_test.py +11 -8
- cirq/transformers/qubit_management_transformers.py +13 -11
- cirq/transformers/qubit_management_transformers_test.py +5 -3
- cirq/transformers/randomized_measurements.py +16 -14
- cirq/transformers/randomized_measurements_test.py +10 -4
- cirq/transformers/routing/initial_mapper.py +6 -4
- cirq/transformers/routing/initial_mapper_test.py +2 -0
- cirq/transformers/routing/line_initial_mapper.py +16 -14
- cirq/transformers/routing/line_initial_mapper_test.py +9 -7
- cirq/transformers/routing/mapping_manager.py +10 -10
- cirq/transformers/routing/mapping_manager_test.py +2 -0
- cirq/transformers/routing/route_circuit_cqc.py +33 -31
- cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
- cirq/transformers/routing/visualize_routed_circuit.py +8 -7
- cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
- cirq/transformers/stratify.py +17 -15
- cirq/transformers/stratify_test.py +3 -0
- cirq/transformers/symbolize.py +103 -0
- cirq/transformers/symbolize_test.py +62 -0
- cirq/transformers/synchronize_terminal_measurements.py +10 -10
- cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
- cirq/transformers/tag_transformers.py +97 -0
- cirq/transformers/tag_transformers_test.py +103 -0
- cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
- cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
- cirq/transformers/target_gatesets/cz_gateset.py +7 -5
- cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
- cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
- cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
- cirq/transformers/transformer_api.py +34 -47
- cirq/transformers/transformer_api_test.py +9 -8
- cirq/transformers/transformer_primitives.py +39 -49
- cirq/transformers/transformer_primitives_test.py +10 -17
- cirq/value/abc_alt.py +6 -4
- cirq/value/abc_alt_test.py +5 -3
- cirq/value/angle.py +11 -12
- cirq/value/angle_test.py +5 -3
- cirq/value/classical_data.py +27 -27
- cirq/value/classical_data_test.py +11 -8
- cirq/value/condition.py +26 -24
- cirq/value/condition_test.py +2 -0
- cirq/value/digits.py +14 -11
- cirq/value/digits_test.py +2 -0
- cirq/value/duration.py +23 -20
- cirq/value/duration_test.py +2 -0
- cirq/value/linear_dict.py +25 -30
- cirq/value/linear_dict_test.py +10 -8
- cirq/value/measurement_key.py +12 -12
- cirq/value/measurement_key_test.py +2 -0
- cirq/value/periodic_value.py +4 -4
- cirq/value/periodic_value_test.py +11 -7
- cirq/value/probability.py +3 -1
- cirq/value/probability_test.py +4 -2
- cirq/value/product_state.py +15 -13
- cirq/value/product_state_test.py +4 -1
- cirq/value/random_state.py +2 -0
- cirq/value/random_state_test.py +5 -3
- cirq/value/timestamp.py +11 -7
- cirq/value/timestamp_test.py +14 -12
- cirq/value/type_alias.py +4 -4
- cirq/value/value_equality_attr.py +8 -9
- cirq/value/value_equality_attr_test.py +14 -11
- cirq/vis/density_matrix.py +3 -3
- cirq/vis/density_matrix_test.py +20 -17
- cirq/vis/heatmap.py +24 -37
- cirq/vis/heatmap_test.py +3 -0
- cirq/vis/histogram.py +9 -6
- cirq/vis/histogram_test.py +5 -2
- cirq/vis/state_histogram.py +10 -8
- cirq/vis/state_histogram_test.py +7 -5
- cirq/vis/vis_utils.py +4 -1
- cirq/vis/vis_utils_test.py +4 -1
- cirq/work/collector.py +12 -18
- cirq/work/collector_test.py +15 -10
- cirq/work/observable_grouping.py +6 -7
- cirq/work/observable_grouping_test.py +10 -9
- cirq/work/observable_measurement.py +47 -45
- cirq/work/observable_measurement_data.py +22 -17
- cirq/work/observable_measurement_data_test.py +4 -1
- cirq/work/observable_measurement_test.py +48 -29
- cirq/work/observable_readout_calibration.py +5 -2
- cirq/work/observable_readout_calibration_test.py +5 -2
- cirq/work/observable_settings.py +13 -22
- cirq/work/observable_settings_test.py +9 -7
- cirq/work/pauli_sum_collector.py +12 -10
- cirq/work/pauli_sum_collector_test.py +9 -9
- cirq/work/sampler.py +42 -43
- cirq/work/sampler_test.py +31 -24
- cirq/work/zeros_sampler.py +6 -4
- cirq/work/zeros_sampler_test.py +7 -5
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
- cirq_core-1.6.0.dist-info/RECORD +1241 -0
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
- cirq_core-1.5.0.dev20250409225226.dist-info/RECORD +0 -1216
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
cirq/devices/noise_model_test.py
CHANGED
|
@@ -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
|
from typing import Sequence
|
|
16
18
|
|
|
17
19
|
import numpy as np
|
|
@@ -23,13 +25,15 @@ from cirq.devices.noise_model import validate_all_measurements
|
|
|
23
25
|
from cirq.testing import assert_equivalent_op_tree
|
|
24
26
|
|
|
25
27
|
|
|
26
|
-
def assert_equivalent_op_tree_sequence(
|
|
28
|
+
def assert_equivalent_op_tree_sequence(
|
|
29
|
+
x: Sequence[cirq.OP_TREE], y: Sequence[cirq.OP_TREE]
|
|
30
|
+
) -> None:
|
|
27
31
|
assert len(x) == len(y)
|
|
28
32
|
for a, b in zip(x, y):
|
|
29
33
|
assert_equivalent_op_tree(a, b)
|
|
30
34
|
|
|
31
35
|
|
|
32
|
-
def test_requires_one_override():
|
|
36
|
+
def test_requires_one_override() -> None:
|
|
33
37
|
class C(cirq.NoiseModel):
|
|
34
38
|
pass
|
|
35
39
|
|
|
@@ -37,7 +41,7 @@ def test_requires_one_override():
|
|
|
37
41
|
_ = C()
|
|
38
42
|
|
|
39
43
|
|
|
40
|
-
def test_infers_other_methods():
|
|
44
|
+
def test_infers_other_methods() -> None:
|
|
41
45
|
q = cirq.LineQubit(0)
|
|
42
46
|
|
|
43
47
|
class NoiseModelWithNoisyMomentListMethod(cirq.NoiseModel):
|
|
@@ -77,7 +81,7 @@ def test_infers_other_methods():
|
|
|
77
81
|
)
|
|
78
82
|
|
|
79
83
|
class NoiseModelWithNoisyOperationMethod(cirq.NoiseModel):
|
|
80
|
-
def noisy_operation(self, operation:
|
|
84
|
+
def noisy_operation(self, operation: cirq.Operation):
|
|
81
85
|
return cirq.Z(operation.qubits[0]).with_tags(ops.VirtualTag())
|
|
82
86
|
|
|
83
87
|
c = NoiseModelWithNoisyOperationMethod()
|
|
@@ -91,7 +95,7 @@ def test_infers_other_methods():
|
|
|
91
95
|
)
|
|
92
96
|
|
|
93
97
|
|
|
94
|
-
def test_no_noise():
|
|
98
|
+
def test_no_noise() -> None:
|
|
95
99
|
q = cirq.LineQubit(0)
|
|
96
100
|
m = cirq.Moment([cirq.X(q)])
|
|
97
101
|
assert cirq.NO_NOISE.noisy_operation(cirq.X(q)) == cirq.X(q)
|
|
@@ -102,7 +106,7 @@ def test_no_noise():
|
|
|
102
106
|
cirq.testing.assert_equivalent_repr(cirq.NO_NOISE)
|
|
103
107
|
|
|
104
108
|
|
|
105
|
-
def test_constant_qubit_noise():
|
|
109
|
+
def test_constant_qubit_noise() -> None:
|
|
106
110
|
a, b, c = cirq.LineQubit.range(3)
|
|
107
111
|
damp = cirq.amplitude_damp(0.5)
|
|
108
112
|
damp_all = cirq.ConstantQubitNoiseModel(damp)
|
|
@@ -124,7 +128,7 @@ def test_constant_qubit_noise():
|
|
|
124
128
|
_ = cirq.ConstantQubitNoiseModel(cirq.CNOT**0.01)
|
|
125
129
|
|
|
126
130
|
|
|
127
|
-
def test_constant_qubit_noise_prepend():
|
|
131
|
+
def test_constant_qubit_noise_prepend() -> None:
|
|
128
132
|
a, b, c = cirq.LineQubit.range(3)
|
|
129
133
|
damp = cirq.amplitude_damp(0.5)
|
|
130
134
|
damp_all = cirq.ConstantQubitNoiseModel(damp, prepend=True)
|
|
@@ -143,7 +147,7 @@ def test_constant_qubit_noise_prepend():
|
|
|
143
147
|
cirq.testing.assert_equivalent_repr(damp_all)
|
|
144
148
|
|
|
145
149
|
|
|
146
|
-
def test_noise_composition():
|
|
150
|
+
def test_noise_composition() -> None:
|
|
147
151
|
# Verify that noise models can be composed without regard to ordering, as
|
|
148
152
|
# long as the noise operators commute with one another.
|
|
149
153
|
a, b, c = cirq.LineQubit.range(3)
|
|
@@ -172,11 +176,11 @@ def test_noise_composition():
|
|
|
172
176
|
assert_equivalent_op_tree(actual_zs, expected_circuit)
|
|
173
177
|
|
|
174
178
|
|
|
175
|
-
def test_constant_qubit_noise_repr():
|
|
179
|
+
def test_constant_qubit_noise_repr() -> None:
|
|
176
180
|
cirq.testing.assert_equivalent_repr(cirq.ConstantQubitNoiseModel(cirq.X**0.01))
|
|
177
181
|
|
|
178
182
|
|
|
179
|
-
def test_wrap():
|
|
183
|
+
def test_wrap() -> None:
|
|
180
184
|
class Forget(cirq.NoiseModel):
|
|
181
185
|
def noisy_operation(self, operation):
|
|
182
186
|
raise NotImplementedError()
|
|
@@ -193,13 +197,13 @@ def test_wrap():
|
|
|
193
197
|
assert cirq.NoiseModel.from_noise_model_like(forget) is forget
|
|
194
198
|
|
|
195
199
|
with pytest.raises(TypeError, match='Expected a NOISE_MODEL_LIKE'):
|
|
196
|
-
_ = cirq.NoiseModel.from_noise_model_like('test')
|
|
200
|
+
_ = cirq.NoiseModel.from_noise_model_like('test') # type: ignore[arg-type]
|
|
197
201
|
|
|
198
202
|
with pytest.raises(ValueError, match='Multi-qubit gate'):
|
|
199
203
|
_ = cirq.NoiseModel.from_noise_model_like(cirq.CZ**0.01)
|
|
200
204
|
|
|
201
205
|
|
|
202
|
-
def test_gate_substitution_noise_model():
|
|
206
|
+
def test_gate_substitution_noise_model() -> None:
|
|
203
207
|
def _overrotation(op):
|
|
204
208
|
if isinstance(op.gate, cirq.XPowGate):
|
|
205
209
|
return cirq.XPowGate(exponent=op.gate.exponent + 0.1).on(*op.qubits)
|
|
@@ -215,14 +219,14 @@ def test_gate_substitution_noise_model():
|
|
|
215
219
|
np.testing.assert_allclose(rho1, rho2)
|
|
216
220
|
|
|
217
221
|
|
|
218
|
-
def test_moment_is_measurements():
|
|
222
|
+
def test_moment_is_measurements() -> None:
|
|
219
223
|
q = cirq.LineQubit.range(2)
|
|
220
224
|
circ = cirq.Circuit([cirq.X(q[0]), cirq.X(q[1]), cirq.measure(*q, key='z')])
|
|
221
225
|
assert not validate_all_measurements(circ[0])
|
|
222
226
|
assert validate_all_measurements(circ[1])
|
|
223
227
|
|
|
224
228
|
|
|
225
|
-
def test_moment_is_measurements_mixed1():
|
|
229
|
+
def test_moment_is_measurements_mixed1() -> None:
|
|
226
230
|
q = cirq.LineQubit.range(2)
|
|
227
231
|
circ = cirq.Circuit([cirq.X(q[0]), cirq.X(q[1]), cirq.measure(q[0], key='z'), cirq.Z(q[1])])
|
|
228
232
|
assert not validate_all_measurements(circ[0])
|
|
@@ -231,7 +235,7 @@ def test_moment_is_measurements_mixed1():
|
|
|
231
235
|
assert e.match(".*must be homogeneous: all measurements.*")
|
|
232
236
|
|
|
233
237
|
|
|
234
|
-
def test_moment_is_measurements_mixed2():
|
|
238
|
+
def test_moment_is_measurements_mixed2() -> None:
|
|
235
239
|
q = cirq.LineQubit.range(2)
|
|
236
240
|
circ = cirq.Circuit([cirq.X(q[0]), cirq.X(q[1]), cirq.Z(q[0]), cirq.measure(q[1], key='z')])
|
|
237
241
|
assert not validate_all_measurements(circ[0])
|
cirq/devices/noise_properties.py
CHANGED
|
@@ -19,10 +19,12 @@ be translated into noise models. NoiseModelFromNoiseProperties consumes those
|
|
|
19
19
|
noise models to produce a single noise model which replicates device noise.
|
|
20
20
|
"""
|
|
21
21
|
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
22
24
|
import abc
|
|
23
|
-
from typing import Iterable,
|
|
25
|
+
from typing import Iterable, Sequence, TYPE_CHECKING
|
|
24
26
|
|
|
25
|
-
from cirq import _import, devices, ops, protocols
|
|
27
|
+
from cirq import _import, devices, ops, protocols, value
|
|
26
28
|
from cirq.devices.noise_utils import PHYSICAL_GATE_TAG
|
|
27
29
|
|
|
28
30
|
circuits = _import.LazyLoader("circuits", globals(), "cirq.circuits.circuit")
|
|
@@ -35,10 +37,11 @@ class NoiseProperties(abc.ABC):
|
|
|
35
37
|
"""Noise-defining properties for a quantum device."""
|
|
36
38
|
|
|
37
39
|
@abc.abstractmethod
|
|
38
|
-
def build_noise_models(self) ->
|
|
40
|
+
def build_noise_models(self) -> list[cirq.NoiseModel]:
|
|
39
41
|
"""Construct all NoiseModels associated with this NoiseProperties."""
|
|
40
42
|
|
|
41
43
|
|
|
44
|
+
@value.value_equality
|
|
42
45
|
class NoiseModelFromNoiseProperties(devices.NoiseModel):
|
|
43
46
|
def __init__(self, noise_properties: NoiseProperties) -> None:
|
|
44
47
|
"""Creates a Noise Model from a NoiseProperties object that can be used with a Simulator.
|
|
@@ -52,7 +55,10 @@ class NoiseModelFromNoiseProperties(devices.NoiseModel):
|
|
|
52
55
|
self._noise_properties = noise_properties
|
|
53
56
|
self.noise_models = self._noise_properties.build_noise_models()
|
|
54
57
|
|
|
55
|
-
def
|
|
58
|
+
def _value_equality_values_(self):
|
|
59
|
+
return self._noise_properties
|
|
60
|
+
|
|
61
|
+
def is_virtual(self, op: cirq.Operation) -> bool:
|
|
56
62
|
"""Returns True if an operation is virtual.
|
|
57
63
|
|
|
58
64
|
Device-specific subclasses should implement this method to mark any
|
|
@@ -67,8 +73,8 @@ class NoiseModelFromNoiseProperties(devices.NoiseModel):
|
|
|
67
73
|
return False
|
|
68
74
|
|
|
69
75
|
def noisy_moments(
|
|
70
|
-
self, moments: Iterable[
|
|
71
|
-
) -> Sequence[
|
|
76
|
+
self, moments: Iterable[cirq.Moment], system_qubits: Sequence[cirq.Qid]
|
|
77
|
+
) -> Sequence[cirq.OP_TREE]:
|
|
72
78
|
# Split multi-qubit measurements into single-qubit measurements.
|
|
73
79
|
# These will be recombined after noise is applied.
|
|
74
80
|
split_measure_moments = []
|
|
@@ -124,3 +130,6 @@ class NoiseModelFromNoiseProperties(devices.NoiseModel):
|
|
|
124
130
|
combined_measure_ops.append(multi_measurements[key])
|
|
125
131
|
final_moments.append(circuits.Moment(combined_measure_ops))
|
|
126
132
|
return final_moments
|
|
133
|
+
|
|
134
|
+
def _json_dict_(self) -> dict[str, object]:
|
|
135
|
+
return {'noise_properties': self._noise_properties}
|
|
@@ -12,18 +12,25 @@
|
|
|
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 TYPE_CHECKING
|
|
16
18
|
|
|
17
19
|
import cirq
|
|
20
|
+
import cirq.testing
|
|
18
21
|
from cirq.devices.insertion_noise_model import InsertionNoiseModel
|
|
19
22
|
from cirq.devices.noise_properties import NoiseModelFromNoiseProperties, NoiseProperties
|
|
20
23
|
from cirq.devices.noise_utils import OpIdentifier, PHYSICAL_GATE_TAG
|
|
21
24
|
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from cirq.protocols.json_serialization import ObjectFactory
|
|
27
|
+
|
|
22
28
|
|
|
23
29
|
# These properties are for testing purposes only - they are not representative
|
|
24
30
|
# of device behavior for any existing hardware.
|
|
31
|
+
@cirq.value_equality
|
|
25
32
|
class SampleNoiseProperties(NoiseProperties):
|
|
26
|
-
def __init__(self, system_qubits:
|
|
33
|
+
def __init__(self, system_qubits: list[cirq.Qid], qubit_pairs: list[tuple[cirq.Qid, cirq.Qid]]):
|
|
27
34
|
self.qubits = system_qubits
|
|
28
35
|
self.qubit_pairs = qubit_pairs
|
|
29
36
|
|
|
@@ -34,8 +41,18 @@ class SampleNoiseProperties(NoiseProperties):
|
|
|
34
41
|
)
|
|
35
42
|
return [add_h, add_iswap]
|
|
36
43
|
|
|
44
|
+
def _value_equality_values_(self):
|
|
45
|
+
return (self.qubits, self.qubit_pairs)
|
|
46
|
+
|
|
47
|
+
def _json_dict_(self) -> dict[str, object]:
|
|
48
|
+
return {'system_qubits': self.qubits, 'qubit_pairs': self.qubit_pairs}
|
|
37
49
|
|
|
38
|
-
|
|
50
|
+
@classmethod
|
|
51
|
+
def _from_json_dict_(cls, system_qubits, qubit_pairs, **kwargs):
|
|
52
|
+
return cls(system_qubits=system_qubits, qubit_pairs=[tuple(pair) for pair in qubit_pairs])
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def test_sample_model() -> None:
|
|
39
56
|
q0, q1 = cirq.LineQubit.range(2)
|
|
40
57
|
props = SampleNoiseProperties([q0, q1], [(q0, q1), (q1, q0)])
|
|
41
58
|
model = NoiseModelFromNoiseProperties(props)
|
|
@@ -54,3 +71,17 @@ def test_sample_model():
|
|
|
54
71
|
cirq.Moment(cirq.H(q0), cirq.H(q1)),
|
|
55
72
|
)
|
|
56
73
|
assert noisy_circuit == expected_circuit
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def custom_resolver(cirq_type: str) -> ObjectFactory | None:
|
|
77
|
+
if cirq_type == "SampleNoiseProperties":
|
|
78
|
+
return SampleNoiseProperties
|
|
79
|
+
return None
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def test_noise_model_from_noise_properties_json() -> None:
|
|
83
|
+
q0, q1 = cirq.LineQubit.range(2)
|
|
84
|
+
props = SampleNoiseProperties([q0, q1], [(q0, q1), (q1, q0)])
|
|
85
|
+
model = NoiseModelFromNoiseProperties(props)
|
|
86
|
+
resolvers = [custom_resolver] + cirq.DEFAULT_RESOLVERS
|
|
87
|
+
cirq.testing.assert_json_roundtrip_works(model, resolvers=resolvers)
|
cirq/devices/noise_utils.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 Any, TYPE_CHECKING
|
|
16
18
|
|
|
17
19
|
from cirq import ops, protocols, qis, value
|
|
18
20
|
from cirq._compat import deprecated, proper_repr
|
|
@@ -29,24 +31,24 @@ PHYSICAL_GATE_TAG = 'physical_gate'
|
|
|
29
31
|
class OpIdentifier:
|
|
30
32
|
"""Identifies an operation by gate and (optionally) target qubits."""
|
|
31
33
|
|
|
32
|
-
def __init__(self, gate_type:
|
|
34
|
+
def __init__(self, gate_type: type[cirq.Gate], *qubits: cirq.Qid):
|
|
33
35
|
self._gate_type = gate_type
|
|
34
36
|
self._gate_family = ops.GateFamily(gate_type)
|
|
35
|
-
self._qubits:
|
|
37
|
+
self._qubits: tuple[cirq.Qid, ...] = tuple(qubits)
|
|
36
38
|
|
|
37
39
|
@property
|
|
38
|
-
def gate_type(self) ->
|
|
40
|
+
def gate_type(self) -> type[cirq.Gate]:
|
|
39
41
|
# set to a type during initialization, never modified
|
|
40
42
|
return self._gate_type
|
|
41
43
|
|
|
42
44
|
@property
|
|
43
|
-
def qubits(self) ->
|
|
45
|
+
def qubits(self) -> tuple[cirq.Qid, ...]:
|
|
44
46
|
return self._qubits
|
|
45
47
|
|
|
46
48
|
def _predicate(self, *args, **kwargs):
|
|
47
49
|
return self._gate_family._predicate(*args, **kwargs)
|
|
48
50
|
|
|
49
|
-
def is_proper_subtype_of(self, op_id:
|
|
51
|
+
def is_proper_subtype_of(self, op_id: OpIdentifier):
|
|
50
52
|
"""Returns true if this is contained within op_id, but not equal to it.
|
|
51
53
|
|
|
52
54
|
If this returns true, (x in self) implies (x in op_id), but the reverse
|
|
@@ -65,7 +67,7 @@ class OpIdentifier:
|
|
|
65
67
|
else:
|
|
66
68
|
return False
|
|
67
69
|
|
|
68
|
-
def __contains__(self, item:
|
|
70
|
+
def __contains__(self, item: ops.Gate | ops.Operation) -> bool:
|
|
69
71
|
if isinstance(item, ops.Gate):
|
|
70
72
|
return (not self._qubits) and self._predicate(item)
|
|
71
73
|
return (
|
|
@@ -84,13 +86,13 @@ class OpIdentifier:
|
|
|
84
86
|
def _value_equality_values_(self) -> Any:
|
|
85
87
|
return (self.gate_type, self.qubits)
|
|
86
88
|
|
|
87
|
-
def _json_dict_(self) ->
|
|
89
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
88
90
|
if hasattr(self.gate_type, '__name__'):
|
|
89
91
|
return {'gate_type': protocols.json_cirq_type(self._gate_type), 'qubits': self._qubits}
|
|
90
92
|
return {'gate_type': self._gate_type, 'qubits': self._qubits}
|
|
91
93
|
|
|
92
94
|
@classmethod
|
|
93
|
-
def _from_json_dict_(cls, gate_type, qubits, **kwargs) ->
|
|
95
|
+
def _from_json_dict_(cls, gate_type, qubits, **kwargs) -> OpIdentifier:
|
|
94
96
|
if isinstance(gate_type, str):
|
|
95
97
|
gate_type = protocols.cirq_type_from_json(gate_type)
|
|
96
98
|
return cls(gate_type, *qubits)
|
cirq/devices/noise_utils_test.py
CHANGED
|
@@ -12,13 +12,14 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
|
|
16
15
|
"""Class for representing noise on a superconducting qubit device."""
|
|
17
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
18
19
|
import abc
|
|
19
20
|
from dataclasses import dataclass, field
|
|
20
21
|
from functools import cached_property
|
|
21
|
-
from typing import
|
|
22
|
+
from typing import TYPE_CHECKING
|
|
22
23
|
|
|
23
24
|
from cirq import devices, ops, qis
|
|
24
25
|
from cirq.devices import noise_utils
|
|
@@ -33,11 +34,11 @@ class SuperconductingQubitsNoiseProperties(devices.NoiseProperties, abc.ABC):
|
|
|
33
34
|
"""Noise-defining properties for a superconducting-qubit-based device.
|
|
34
35
|
|
|
35
36
|
Args:
|
|
36
|
-
gate_times_ns:
|
|
37
|
+
gate_times_ns: dict[type, float] of gate types to their duration on
|
|
37
38
|
quantum hardware. Used with t(1|phi)_ns to specify thermal noise.
|
|
38
|
-
t1_ns:
|
|
39
|
-
tphi_ns:
|
|
40
|
-
readout_errors:
|
|
39
|
+
t1_ns: dict[cirq.Qid, float] of qubits to their T_1 time, in ns.
|
|
40
|
+
tphi_ns: dict[cirq.Qid, float] of qubits to their T_phi time, in ns.
|
|
41
|
+
readout_errors: dict[cirq.Qid, list[float]] of qubits to their readout
|
|
41
42
|
errors in matrix form: [P(read |1> from |0>), P(read |0> from |1>)].
|
|
42
43
|
Used to prepend amplitude damping errors to measurements.
|
|
43
44
|
gate_pauli_errors: dict of noise_utils.OpIdentifiers (a gate and the qubits it
|
|
@@ -48,14 +49,14 @@ class SuperconductingQubitsNoiseProperties(devices.NoiseProperties, abc.ABC):
|
|
|
48
49
|
symmetric over the qubits they affect. Defaults to True.
|
|
49
50
|
"""
|
|
50
51
|
|
|
51
|
-
gate_times_ns:
|
|
52
|
-
t1_ns:
|
|
53
|
-
tphi_ns:
|
|
54
|
-
readout_errors:
|
|
55
|
-
gate_pauli_errors:
|
|
52
|
+
gate_times_ns: dict[type, float]
|
|
53
|
+
t1_ns: dict[cirq.Qid, float]
|
|
54
|
+
tphi_ns: dict[cirq.Qid, float]
|
|
55
|
+
readout_errors: dict[cirq.Qid, list[float]]
|
|
56
|
+
gate_pauli_errors: dict[noise_utils.OpIdentifier, float]
|
|
56
57
|
|
|
57
58
|
validate: bool = True
|
|
58
|
-
_qubits:
|
|
59
|
+
_qubits: list[cirq.Qid] = field(init=False, default_factory=list)
|
|
59
60
|
|
|
60
61
|
def __post_init__(self):
|
|
61
62
|
if not self.validate:
|
|
@@ -95,7 +96,7 @@ class SuperconductingQubitsNoiseProperties(devices.NoiseProperties, abc.ABC):
|
|
|
95
96
|
)
|
|
96
97
|
|
|
97
98
|
@property
|
|
98
|
-
def qubits(self) ->
|
|
99
|
+
def qubits(self) -> list[cirq.Qid]:
|
|
99
100
|
"""Qubits for which we have data"""
|
|
100
101
|
if not self._qubits:
|
|
101
102
|
self._qubits = sorted(self.t1_ns)
|
|
@@ -103,26 +104,26 @@ class SuperconductingQubitsNoiseProperties(devices.NoiseProperties, abc.ABC):
|
|
|
103
104
|
|
|
104
105
|
@classmethod
|
|
105
106
|
@abc.abstractmethod
|
|
106
|
-
def single_qubit_gates(cls) ->
|
|
107
|
+
def single_qubit_gates(cls) -> set[type[ops.Gate]]:
|
|
107
108
|
"""Returns the set of single-qubit gates this class supports."""
|
|
108
109
|
|
|
109
110
|
@classmethod
|
|
110
111
|
@abc.abstractmethod
|
|
111
|
-
def symmetric_two_qubit_gates(cls) ->
|
|
112
|
+
def symmetric_two_qubit_gates(cls) -> set[type[ops.Gate]]:
|
|
112
113
|
"""Returns the set of symmetric two-qubit gates this class supports."""
|
|
113
114
|
|
|
114
115
|
@classmethod
|
|
115
116
|
@abc.abstractmethod
|
|
116
|
-
def asymmetric_two_qubit_gates(cls) ->
|
|
117
|
+
def asymmetric_two_qubit_gates(cls) -> set[type[ops.Gate]]:
|
|
117
118
|
"""Returns the set of asymmetric two-qubit gates this class supports."""
|
|
118
119
|
|
|
119
120
|
@classmethod
|
|
120
|
-
def two_qubit_gates(cls) ->
|
|
121
|
+
def two_qubit_gates(cls) -> set[type[ops.Gate]]:
|
|
121
122
|
"""Returns the set of all two-qubit gates this class supports."""
|
|
122
123
|
return cls.symmetric_two_qubit_gates() | cls.asymmetric_two_qubit_gates()
|
|
123
124
|
|
|
124
125
|
@classmethod
|
|
125
|
-
def expected_gates(cls) ->
|
|
126
|
+
def expected_gates(cls) -> set[type[ops.Gate]]:
|
|
126
127
|
"""Returns the set of all gates this class supports."""
|
|
127
128
|
return cls.single_qubit_gates() | cls.two_qubit_gates()
|
|
128
129
|
|
|
@@ -133,7 +134,7 @@ class SuperconductingQubitsNoiseProperties(devices.NoiseProperties, abc.ABC):
|
|
|
133
134
|
return p_error
|
|
134
135
|
|
|
135
136
|
@cached_property
|
|
136
|
-
def _depolarizing_error(self) ->
|
|
137
|
+
def _depolarizing_error(self) -> dict[noise_utils.OpIdentifier, float]:
|
|
137
138
|
"""Returns the portion of Pauli error from depolarization."""
|
|
138
139
|
depol_errors = {}
|
|
139
140
|
for op_id, p_error in self.gate_pauli_errors.items():
|
|
@@ -150,8 +151,8 @@ class SuperconductingQubitsNoiseProperties(devices.NoiseProperties, abc.ABC):
|
|
|
150
151
|
depol_errors[op_id] = self._get_pauli_error(p_error, op_id)
|
|
151
152
|
return depol_errors
|
|
152
153
|
|
|
153
|
-
def build_noise_models(self) ->
|
|
154
|
-
noise_models:
|
|
154
|
+
def build_noise_models(self) -> list[cirq.NoiseModel]:
|
|
155
|
+
noise_models: list[cirq.NoiseModel] = []
|
|
155
156
|
|
|
156
157
|
if self.t1_ns:
|
|
157
158
|
noise_models.append(
|
|
@@ -175,7 +176,7 @@ class SuperconductingQubitsNoiseProperties(devices.NoiseProperties, abc.ABC):
|
|
|
175
176
|
|
|
176
177
|
# This adds per-qubit measurement error BEFORE measurement on those qubits.
|
|
177
178
|
if self.readout_errors:
|
|
178
|
-
added_measure_errors:
|
|
179
|
+
added_measure_errors: dict[noise_utils.OpIdentifier, cirq.Operation] = {}
|
|
179
180
|
for qubit in self.readout_errors:
|
|
180
181
|
p_00, p_11 = self.readout_errors[qubit]
|
|
181
182
|
p = p_11 / (p_00 + p_11)
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from
|
|
15
|
+
from __future__ import annotations
|
|
16
16
|
|
|
17
17
|
import numpy as np
|
|
18
18
|
import pytest
|
|
@@ -24,7 +24,7 @@ from cirq.devices.superconducting_qubits_noise_properties import (
|
|
|
24
24
|
SuperconductingQubitsNoiseProperties,
|
|
25
25
|
)
|
|
26
26
|
|
|
27
|
-
DEFAULT_GATE_NS:
|
|
27
|
+
DEFAULT_GATE_NS: dict[type, float] = {
|
|
28
28
|
cirq.ZPowGate: 25.0,
|
|
29
29
|
cirq.MeasurementGate: 4000.0,
|
|
30
30
|
cirq.ResetChannel: 250.0,
|
|
@@ -37,7 +37,7 @@ DEFAULT_GATE_NS: Dict[type, float] = {
|
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
|
|
40
|
-
def default_props(system_qubits:
|
|
40
|
+
def default_props(system_qubits: list[cirq.Qid], qubit_pairs: list[tuple[cirq.Qid, cirq.Qid]]):
|
|
41
41
|
return {
|
|
42
42
|
'gate_times_ns': DEFAULT_GATE_NS,
|
|
43
43
|
't1_ns': {q: 1e5 for q in system_qubits},
|
|
@@ -63,15 +63,15 @@ class ExampleNoiseProperties(SuperconductingQubitsNoiseProperties):
|
|
|
63
63
|
super().__init__(*args, **kwargs)
|
|
64
64
|
|
|
65
65
|
@classmethod
|
|
66
|
-
def single_qubit_gates(cls) ->
|
|
66
|
+
def single_qubit_gates(cls) -> set[type]:
|
|
67
67
|
return {cirq.ZPowGate, cirq.PhasedXZGate, cirq.MeasurementGate, cirq.ResetChannel}
|
|
68
68
|
|
|
69
69
|
@classmethod
|
|
70
|
-
def symmetric_two_qubit_gates(cls) ->
|
|
70
|
+
def symmetric_two_qubit_gates(cls) -> set[type]:
|
|
71
71
|
return {cirq.FSimGate, cirq.PhasedFSimGate, cirq.ISwapPowGate, cirq.CZPowGate}
|
|
72
72
|
|
|
73
73
|
@classmethod
|
|
74
|
-
def asymmetric_two_qubit_gates(cls) ->
|
|
74
|
+
def asymmetric_two_qubit_gates(cls) -> set[type]:
|
|
75
75
|
return set()
|
|
76
76
|
|
|
77
77
|
|