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
|
@@ -12,8 +12,10 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import warnings
|
|
16
|
-
from typing import Any, cast,
|
|
18
|
+
from typing import Any, cast, Sequence, TYPE_CHECKING
|
|
17
19
|
|
|
18
20
|
import numpy as np
|
|
19
21
|
import pandas as pd
|
|
@@ -31,14 +33,14 @@ optimize = _import.LazyLoader("optimize", globals(), "scipy.optimize")
|
|
|
31
33
|
|
|
32
34
|
|
|
33
35
|
def t1_decay(
|
|
34
|
-
sampler:
|
|
36
|
+
sampler: cirq.Sampler,
|
|
35
37
|
*,
|
|
36
|
-
qubit:
|
|
38
|
+
qubit: cirq.Qid,
|
|
37
39
|
num_points: int,
|
|
38
|
-
max_delay:
|
|
39
|
-
min_delay:
|
|
40
|
+
max_delay: cirq.DURATION_LIKE,
|
|
41
|
+
min_delay: cirq.DURATION_LIKE = None,
|
|
40
42
|
repetitions: int = 1000,
|
|
41
|
-
) ->
|
|
43
|
+
) -> cirq.experiments.T1DecayResult:
|
|
42
44
|
"""Runs a t1 decay experiment.
|
|
43
45
|
|
|
44
46
|
Initializes a qubit into the |1⟩ state, waits for a variable amount of time,
|
|
@@ -144,7 +146,7 @@ class T1DecayResult:
|
|
|
144
146
|
return np.nan
|
|
145
147
|
|
|
146
148
|
def plot(
|
|
147
|
-
self, ax:
|
|
149
|
+
self, ax: plt.Axes | None = None, include_fit: bool = False, **plot_kwargs: Any
|
|
148
150
|
) -> plt.Axes:
|
|
149
151
|
"""Plots the excited state probability vs the amount of delay.
|
|
150
152
|
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import numpy as np
|
|
16
18
|
import pandas as pd
|
|
17
19
|
import pytest
|
|
@@ -20,7 +22,7 @@ import sympy
|
|
|
20
22
|
import cirq
|
|
21
23
|
|
|
22
24
|
|
|
23
|
-
def test_init_result():
|
|
25
|
+
def test_init_result() -> None:
|
|
24
26
|
data = pd.DataFrame(
|
|
25
27
|
columns=['delay_ns', 'false_count', 'true_count'],
|
|
26
28
|
index=range(2),
|
|
@@ -31,7 +33,7 @@ def test_init_result():
|
|
|
31
33
|
|
|
32
34
|
|
|
33
35
|
@pytest.mark.usefixtures('closefigures')
|
|
34
|
-
def test_plot_does_not_raise_error():
|
|
36
|
+
def test_plot_does_not_raise_error() -> None:
|
|
35
37
|
class _TimeDependentDecay(cirq.NoiseModel):
|
|
36
38
|
def noisy_moment(self, moment, system_qubits):
|
|
37
39
|
duration = max(
|
|
@@ -55,7 +57,7 @@ def test_plot_does_not_raise_error():
|
|
|
55
57
|
results.plot(include_fit=True)
|
|
56
58
|
|
|
57
59
|
|
|
58
|
-
def test_result_eq():
|
|
60
|
+
def test_result_eq() -> None:
|
|
59
61
|
eq = cirq.testing.EqualsTester()
|
|
60
62
|
eq.make_equality_group(
|
|
61
63
|
lambda: cirq.experiments.T1DecayResult(
|
|
@@ -75,7 +77,7 @@ def test_result_eq():
|
|
|
75
77
|
)
|
|
76
78
|
|
|
77
79
|
|
|
78
|
-
def test_sudden_decay_results():
|
|
80
|
+
def test_sudden_decay_results() -> None:
|
|
79
81
|
class _SuddenDecay(cirq.NoiseModel):
|
|
80
82
|
def noisy_moment(self, moment, system_qubits):
|
|
81
83
|
duration = max(
|
|
@@ -107,7 +109,7 @@ def test_sudden_decay_results():
|
|
|
107
109
|
)
|
|
108
110
|
|
|
109
111
|
|
|
110
|
-
def test_all_on_results():
|
|
112
|
+
def test_all_on_results() -> None:
|
|
111
113
|
results = cirq.experiments.t1_decay(
|
|
112
114
|
sampler=cirq.Simulator(),
|
|
113
115
|
qubit=cirq.GridQubit(0, 0),
|
|
@@ -126,7 +128,7 @@ def test_all_on_results():
|
|
|
126
128
|
assert results == desired, f'{results.data=} {desired.data=}'
|
|
127
129
|
|
|
128
130
|
|
|
129
|
-
def test_all_off_results():
|
|
131
|
+
def test_all_off_results() -> None:
|
|
130
132
|
results = cirq.experiments.t1_decay(
|
|
131
133
|
sampler=cirq.DensityMatrixSimulator(noise=cirq.amplitude_damp(1)),
|
|
132
134
|
qubit=cirq.GridQubit(0, 0),
|
|
@@ -146,7 +148,7 @@ def test_all_off_results():
|
|
|
146
148
|
|
|
147
149
|
|
|
148
150
|
@pytest.mark.usefixtures('closefigures')
|
|
149
|
-
def test_curve_fit_plot_works():
|
|
151
|
+
def test_curve_fit_plot_works() -> None:
|
|
150
152
|
good_fit = cirq.experiments.T1DecayResult(
|
|
151
153
|
data=pd.DataFrame(
|
|
152
154
|
columns=['delay_ns', 'false_count', 'true_count'],
|
|
@@ -159,7 +161,7 @@ def test_curve_fit_plot_works():
|
|
|
159
161
|
|
|
160
162
|
|
|
161
163
|
@pytest.mark.parametrize('t1', [200.0, 500.0, 700.0])
|
|
162
|
-
def test_noise_model_continous(t1):
|
|
164
|
+
def test_noise_model_continous(t1) -> None:
|
|
163
165
|
class GradualDecay(cirq.NoiseModel):
|
|
164
166
|
def __init__(self, t1: float):
|
|
165
167
|
self.t1 = t1
|
|
@@ -193,7 +195,7 @@ def test_noise_model_continous(t1):
|
|
|
193
195
|
|
|
194
196
|
|
|
195
197
|
@pytest.mark.parametrize('gamma', [0.01, 0.05, 0.1])
|
|
196
|
-
def test_noise_model_discrete(gamma):
|
|
198
|
+
def test_noise_model_discrete(gamma) -> None:
|
|
197
199
|
results = cirq.experiments.t1_decay(
|
|
198
200
|
sampler=cirq.DensityMatrixSimulator(
|
|
199
201
|
noise=cirq.NoiseModel.from_noise_model_like(cirq.amplitude_damp(gamma))
|
|
@@ -212,7 +214,7 @@ def test_noise_model_discrete(gamma):
|
|
|
212
214
|
np.testing.assert_allclose(probs, np.mean(probs), atol=0.2)
|
|
213
215
|
|
|
214
216
|
|
|
215
|
-
def test_bad_args():
|
|
217
|
+
def test_bad_args() -> None:
|
|
216
218
|
with pytest.raises(ValueError, match='repetitions <= 0'):
|
|
217
219
|
_ = cirq.experiments.t1_decay(
|
|
218
220
|
sampler=cirq.Simulator(),
|
|
@@ -253,7 +255,7 @@ def test_bad_args():
|
|
|
253
255
|
)
|
|
254
256
|
|
|
255
257
|
|
|
256
|
-
def test_str():
|
|
258
|
+
def test_str() -> None:
|
|
257
259
|
result = cirq.experiments.T1DecayResult(
|
|
258
260
|
data=pd.DataFrame(
|
|
259
261
|
columns=['delay_ns', 'false_count', 'true_count'],
|
|
@@ -11,8 +11,11 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
14
17
|
import enum
|
|
15
|
-
from typing import Any,
|
|
18
|
+
from typing import Any, TYPE_CHECKING
|
|
16
19
|
|
|
17
20
|
import pandas as pd
|
|
18
21
|
import sympy
|
|
@@ -35,17 +38,17 @@ _T2_COLUMNS = ['delay_ns', 0, 1]
|
|
|
35
38
|
|
|
36
39
|
|
|
37
40
|
def t2_decay(
|
|
38
|
-
sampler:
|
|
41
|
+
sampler: cirq.Sampler,
|
|
39
42
|
*,
|
|
40
|
-
qubit:
|
|
41
|
-
experiment_type:
|
|
43
|
+
qubit: cirq.Qid,
|
|
44
|
+
experiment_type: ExperimentType = ExperimentType.RAMSEY,
|
|
42
45
|
num_points: int,
|
|
43
|
-
max_delay:
|
|
44
|
-
min_delay:
|
|
46
|
+
max_delay: cirq.DURATION_LIKE,
|
|
47
|
+
min_delay: cirq.DURATION_LIKE = None,
|
|
45
48
|
repetitions: int = 1000,
|
|
46
|
-
delay_sweep:
|
|
47
|
-
num_pulses:
|
|
48
|
-
) ->
|
|
49
|
+
delay_sweep: study.Sweep | None = None,
|
|
50
|
+
num_pulses: list[int] | None = None,
|
|
51
|
+
) -> cirq.experiments.T2DecayResult | list[cirq.experiments.T2DecayResult]:
|
|
49
52
|
"""Runs a t2 transverse relaxation experiment.
|
|
50
53
|
|
|
51
54
|
Initializes a qubit into a superposition state, evolves the system using
|
|
@@ -234,7 +237,7 @@ def _create_tabulation(measurements: pd.DataFrame) -> pd.DataFrame:
|
|
|
234
237
|
return tabulation
|
|
235
238
|
|
|
236
239
|
|
|
237
|
-
def _cpmg_circuit(qubit:
|
|
240
|
+
def _cpmg_circuit(qubit: cirq.Qid, delay_var: sympy.Symbol, max_pulses: int) -> cirq.Circuit:
|
|
238
241
|
"""Creates a CPMG circuit for a given qubit.
|
|
239
242
|
|
|
240
243
|
The circuit will look like:
|
|
@@ -256,7 +259,7 @@ def _cpmg_circuit(qubit: 'cirq.Qid', delay_var: sympy.Symbol, max_pulses: int) -
|
|
|
256
259
|
return circuit
|
|
257
260
|
|
|
258
261
|
|
|
259
|
-
def _cpmg_sweep(num_pulses:
|
|
262
|
+
def _cpmg_sweep(num_pulses: list[int]):
|
|
260
263
|
"""Returns a sweep for a circuit created by _cpmg_circuit.
|
|
261
264
|
|
|
262
265
|
The circuit in _cpmg_circuit parameterizes the pulses, so this function
|
|
@@ -351,7 +354,7 @@ class T2DecayResult:
|
|
|
351
354
|
"""
|
|
352
355
|
return self._expectation_pauli_y
|
|
353
356
|
|
|
354
|
-
def plot_expectations(self, ax:
|
|
357
|
+
def plot_expectations(self, ax: plt.Axes | None = None, **plot_kwargs: Any) -> plt.Axes:
|
|
355
358
|
"""Plots the expectation values of Pauli operators versus delay time.
|
|
356
359
|
|
|
357
360
|
Args:
|
|
@@ -392,7 +395,7 @@ class T2DecayResult:
|
|
|
392
395
|
fig.show()
|
|
393
396
|
return ax
|
|
394
397
|
|
|
395
|
-
def plot_bloch_vector(self, ax:
|
|
398
|
+
def plot_bloch_vector(self, ax: plt.Axes | None = None, **plot_kwargs: Any) -> plt.Axes:
|
|
396
399
|
"""Plots the estimated length of the Bloch vector versus time.
|
|
397
400
|
|
|
398
401
|
This plot estimates the Bloch Vector by squaring the Pauli expectation
|
|
@@ -13,23 +13,26 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
"""Provides functions for running and analyzing two-qubit XEB experiments."""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
16
19
|
import functools
|
|
17
20
|
import itertools
|
|
18
21
|
from dataclasses import dataclass
|
|
19
22
|
from types import MappingProxyType
|
|
20
|
-
from typing import Any, cast,
|
|
23
|
+
from typing import Any, cast, Mapping, Sequence, TYPE_CHECKING
|
|
21
24
|
|
|
22
25
|
import networkx as nx
|
|
23
26
|
import numpy as np
|
|
24
|
-
import pandas as pd
|
|
25
27
|
from matplotlib import pyplot as plt
|
|
26
28
|
|
|
27
29
|
from cirq import ops, value, vis
|
|
28
30
|
from cirq._compat import cached_method
|
|
29
31
|
from cirq.experiments import random_quantum_circuit_generation as rqcg
|
|
30
32
|
from cirq.experiments.qubit_characterizations import (
|
|
31
|
-
|
|
33
|
+
parallel_single_qubit_rb,
|
|
32
34
|
ParallelRandomizedBenchmarkingResult,
|
|
35
|
+
RBParameters,
|
|
33
36
|
)
|
|
34
37
|
from cirq.experiments.xeb_fitting import (
|
|
35
38
|
benchmark_2q_xeb_fidelities,
|
|
@@ -42,25 +45,27 @@ from cirq.qis import noise_utils
|
|
|
42
45
|
if TYPE_CHECKING:
|
|
43
46
|
import multiprocessing
|
|
44
47
|
|
|
48
|
+
import pandas as pd
|
|
49
|
+
|
|
45
50
|
import cirq
|
|
46
51
|
|
|
47
52
|
|
|
48
|
-
def _grid_qubits_for_sampler(sampler:
|
|
53
|
+
def _grid_qubits_for_sampler(sampler: cirq.Sampler) -> Sequence[cirq.GridQubit] | None:
|
|
49
54
|
if hasattr(sampler, 'processor'):
|
|
50
55
|
device = sampler.processor.get_device()
|
|
51
56
|
return sorted(device.metadata.qubit_set)
|
|
52
57
|
return None
|
|
53
58
|
|
|
54
59
|
|
|
55
|
-
def _manhattan_distance(qubit1:
|
|
60
|
+
def _manhattan_distance(qubit1: cirq.GridQubit, qubit2: cirq.GridQubit) -> int:
|
|
56
61
|
return abs(qubit1.row - qubit2.row) + abs(qubit1.col - qubit2.col)
|
|
57
62
|
|
|
58
63
|
|
|
59
64
|
def qubits_and_pairs(
|
|
60
|
-
sampler:
|
|
61
|
-
qubits:
|
|
62
|
-
pairs:
|
|
63
|
-
) ->
|
|
65
|
+
sampler: cirq.Sampler,
|
|
66
|
+
qubits: Sequence[cirq.GridQubit] | None = None,
|
|
67
|
+
pairs: Sequence[tuple[cirq.GridQubit, cirq.GridQubit]] | None = None,
|
|
68
|
+
) -> tuple[Sequence[cirq.GridQubit], Sequence[tuple[cirq.GridQubit, cirq.GridQubit]]]:
|
|
64
69
|
"""Extract qubits and pairs from sampler.
|
|
65
70
|
|
|
66
71
|
|
|
@@ -103,17 +108,21 @@ class TwoQubitXEBResult:
|
|
|
103
108
|
fidelities: pd.DataFrame
|
|
104
109
|
|
|
105
110
|
@functools.cached_property
|
|
106
|
-
def _qubit_pair_map(self) ->
|
|
111
|
+
def _qubit_pair_map(self) -> dict[tuple[cirq.GridQubit, cirq.GridQubit], int]:
|
|
112
|
+
if isinstance(self.fidelities.index[0][0], ops.Qid):
|
|
113
|
+
return {
|
|
114
|
+
(min(q0, q1), max(q0, q1)): i for i, (q0, q1) in enumerate(self.fidelities.index)
|
|
115
|
+
}
|
|
107
116
|
return {
|
|
108
117
|
(min(q0, q1), max(q0, q1)): i
|
|
109
118
|
for i, (_, _, (q0, q1)) in enumerate(self.fidelities.index)
|
|
110
119
|
}
|
|
111
120
|
|
|
112
121
|
@functools.cached_property
|
|
113
|
-
def all_qubit_pairs(self) ->
|
|
122
|
+
def all_qubit_pairs(self) -> tuple[tuple[cirq.GridQubit, cirq.GridQubit], ...]:
|
|
114
123
|
return tuple(sorted(self._qubit_pair_map.keys()))
|
|
115
124
|
|
|
116
|
-
def plot_heatmap(self, ax:
|
|
125
|
+
def plot_heatmap(self, ax: plt.Axes | None = None, **plot_kwargs) -> plt.Axes:
|
|
117
126
|
"""plot the heatmap of XEB errors.
|
|
118
127
|
|
|
119
128
|
Args:
|
|
@@ -127,7 +136,7 @@ class TwoQubitXEBResult:
|
|
|
127
136
|
show_plot = not ax
|
|
128
137
|
if not isinstance(ax, plt.Axes):
|
|
129
138
|
fig, ax = plt.subplots(1, 1, figsize=(8, 8))
|
|
130
|
-
heatmap_data:
|
|
139
|
+
heatmap_data: dict[tuple[cirq.GridQubit, ...], float] = {
|
|
131
140
|
pair: self.xeb_error(*pair) for pair in self.all_qubit_pairs
|
|
132
141
|
}
|
|
133
142
|
|
|
@@ -139,11 +148,7 @@ class TwoQubitXEBResult:
|
|
|
139
148
|
return ax
|
|
140
149
|
|
|
141
150
|
def plot_fitted_exponential(
|
|
142
|
-
self,
|
|
143
|
-
q0: 'cirq.GridQubit',
|
|
144
|
-
q1: 'cirq.GridQubit',
|
|
145
|
-
ax: Optional[plt.Axes] = None,
|
|
146
|
-
**plot_kwargs,
|
|
151
|
+
self, q0: cirq.GridQubit, q1: cirq.GridQubit, ax: plt.Axes | None = None, **plot_kwargs
|
|
147
152
|
) -> plt.Axes:
|
|
148
153
|
"""plot the fitted model to for xeb error of a qubit pair.
|
|
149
154
|
|
|
@@ -185,21 +190,21 @@ class TwoQubitXEBResult:
|
|
|
185
190
|
q0, q1 = q1, q0
|
|
186
191
|
return self.fidelities.iloc[self._qubit_pair_map[(q0, q1)]]
|
|
187
192
|
|
|
188
|
-
def xeb_fidelity(self, q0:
|
|
193
|
+
def xeb_fidelity(self, q0: cirq.GridQubit, q1: cirq.GridQubit) -> float:
|
|
189
194
|
"""Return the XEB fidelity of a qubit pair."""
|
|
190
195
|
return noise_utils.decay_constant_to_xeb_fidelity(
|
|
191
196
|
self._record(q0, q1).layer_fid, num_qubits=2
|
|
192
197
|
)
|
|
193
198
|
|
|
194
|
-
def xeb_error(self, q0:
|
|
199
|
+
def xeb_error(self, q0: cirq.GridQubit, q1: cirq.GridQubit) -> float:
|
|
195
200
|
"""Return the XEB error of a qubit pair."""
|
|
196
201
|
return 1 - self.xeb_fidelity(q0, q1)
|
|
197
202
|
|
|
198
|
-
def all_errors(self) ->
|
|
203
|
+
def all_errors(self) -> dict[tuple[cirq.GridQubit, cirq.GridQubit], float]:
|
|
199
204
|
"""Return the XEB error of all qubit pairs."""
|
|
200
205
|
return {(q0, q1): self.xeb_error(q0, q1) for q0, q1 in self.all_qubit_pairs}
|
|
201
206
|
|
|
202
|
-
def plot_histogram(self, ax:
|
|
207
|
+
def plot_histogram(self, ax: plt.Axes | None = None, **plot_kwargs) -> plt.Axes:
|
|
203
208
|
"""plot a histogram of all xeb errors.
|
|
204
209
|
|
|
205
210
|
Args:
|
|
@@ -219,7 +224,7 @@ class TwoQubitXEBResult:
|
|
|
219
224
|
return ax
|
|
220
225
|
|
|
221
226
|
@cached_method
|
|
222
|
-
def pauli_error(self) ->
|
|
227
|
+
def pauli_error(self) -> dict[tuple[cirq.GridQubit, cirq.GridQubit], float]:
|
|
223
228
|
"""Return the Pauli error of all qubit pairs."""
|
|
224
229
|
return {
|
|
225
230
|
pair: noise_utils.decay_constant_to_pauli_error(
|
|
@@ -242,33 +247,33 @@ class InferredXEBResult:
|
|
|
242
247
|
xeb_result: TwoQubitXEBResult
|
|
243
248
|
|
|
244
249
|
@property
|
|
245
|
-
def all_qubit_pairs(self) -> Sequence[
|
|
250
|
+
def all_qubit_pairs(self) -> Sequence[tuple[cirq.GridQubit, cirq.GridQubit]]:
|
|
246
251
|
return self.xeb_result.all_qubit_pairs
|
|
247
252
|
|
|
248
253
|
@cached_method
|
|
249
|
-
def single_qubit_pauli_error(self) -> Mapping[
|
|
254
|
+
def single_qubit_pauli_error(self) -> Mapping[cirq.Qid, float]:
|
|
250
255
|
"""Return the single-qubit Pauli error for all qubits (RB results)."""
|
|
251
256
|
return self.rb_result.pauli_error()
|
|
252
257
|
|
|
253
258
|
@cached_method
|
|
254
|
-
def two_qubit_pauli_error(self) -> Mapping[
|
|
259
|
+
def two_qubit_pauli_error(self) -> Mapping[tuple[cirq.GridQubit, cirq.GridQubit], float]:
|
|
255
260
|
"""Return the two-qubit Pauli error for all pairs."""
|
|
256
261
|
return MappingProxyType(self.xeb_result.pauli_error())
|
|
257
262
|
|
|
258
263
|
@cached_method
|
|
259
|
-
def inferred_pauli_error(self) -> Mapping[
|
|
264
|
+
def inferred_pauli_error(self) -> Mapping[tuple[cirq.GridQubit, cirq.GridQubit], float]:
|
|
260
265
|
"""Return the inferred Pauli error for all pairs."""
|
|
261
266
|
single_q_paulis = self.rb_result.pauli_error()
|
|
262
267
|
xeb = self.xeb_result.pauli_error()
|
|
263
268
|
|
|
264
|
-
def _pauli_error(q0:
|
|
269
|
+
def _pauli_error(q0: cirq.GridQubit, q1: cirq.GridQubit) -> float:
|
|
265
270
|
q0, q1 = sorted([q0, q1])
|
|
266
271
|
return xeb[(q0, q1)] - single_q_paulis[q0] - single_q_paulis[q1]
|
|
267
272
|
|
|
268
273
|
return MappingProxyType({pair: _pauli_error(*pair) for pair in self.all_qubit_pairs})
|
|
269
274
|
|
|
270
275
|
@cached_method
|
|
271
|
-
def inferred_decay_constant(self) -> Mapping[
|
|
276
|
+
def inferred_decay_constant(self) -> Mapping[tuple[cirq.GridQubit, cirq.GridQubit], float]:
|
|
272
277
|
"""Return the inferred decay constant for all pairs."""
|
|
273
278
|
return MappingProxyType(
|
|
274
279
|
{
|
|
@@ -278,7 +283,7 @@ class InferredXEBResult:
|
|
|
278
283
|
)
|
|
279
284
|
|
|
280
285
|
@cached_method
|
|
281
|
-
def inferred_xeb_error(self) -> Mapping[
|
|
286
|
+
def inferred_xeb_error(self) -> Mapping[tuple[cirq.GridQubit, cirq.GridQubit], float]:
|
|
282
287
|
"""Return the inferred XEB error for all pairs."""
|
|
283
288
|
return MappingProxyType(
|
|
284
289
|
{
|
|
@@ -289,7 +294,7 @@ class InferredXEBResult:
|
|
|
289
294
|
|
|
290
295
|
def _target_errors(
|
|
291
296
|
self, target_error: str
|
|
292
|
-
) -> Mapping[
|
|
297
|
+
) -> Mapping[tuple[cirq.GridQubit, cirq.GridQubit], float]:
|
|
293
298
|
"""Returns requested error.
|
|
294
299
|
|
|
295
300
|
The requested error must be one of 'pauli', 'decay_constant', or 'xeb'.
|
|
@@ -311,7 +316,7 @@ class InferredXEBResult:
|
|
|
311
316
|
return error_funcs[target_error]()
|
|
312
317
|
|
|
313
318
|
def plot_heatmap(
|
|
314
|
-
self, target_error: str = 'pauli', ax:
|
|
319
|
+
self, target_error: str = 'pauli', ax: plt.Axes | None = None, **plot_kwargs
|
|
315
320
|
) -> plt.Axes:
|
|
316
321
|
"""plot the heatmap of the target errors.
|
|
317
322
|
|
|
@@ -325,7 +330,7 @@ class InferredXEBResult:
|
|
|
325
330
|
if not isinstance(ax, plt.Axes):
|
|
326
331
|
fig, ax = plt.subplots(1, 1, figsize=(8, 8))
|
|
327
332
|
heatmap_data = cast(
|
|
328
|
-
Mapping[
|
|
333
|
+
Mapping[tuple['cirq.GridQubit', ...], float], self._target_errors(target_error)
|
|
329
334
|
)
|
|
330
335
|
|
|
331
336
|
name = f'{target_error} error' if target_error != 'decay_constant' else 'decay constant'
|
|
@@ -339,7 +344,7 @@ class InferredXEBResult:
|
|
|
339
344
|
def plot_histogram(
|
|
340
345
|
self,
|
|
341
346
|
target_error: str = 'pauli',
|
|
342
|
-
ax:
|
|
347
|
+
ax: plt.Axes | None = None,
|
|
343
348
|
kind: str = 'two_qubit',
|
|
344
349
|
**plot_kwargs,
|
|
345
350
|
) -> plt.Axes:
|
|
@@ -393,21 +398,21 @@ class InferredXEBResult:
|
|
|
393
398
|
|
|
394
399
|
|
|
395
400
|
def parallel_xeb_workflow(
|
|
396
|
-
sampler:
|
|
397
|
-
qubits:
|
|
398
|
-
entangling_gate:
|
|
401
|
+
sampler: cirq.Sampler,
|
|
402
|
+
qubits: Sequence[cirq.GridQubit] | None = None,
|
|
403
|
+
entangling_gate: cirq.Gate = ops.CZ,
|
|
399
404
|
n_repetitions: int = 10**4,
|
|
400
405
|
n_combinations: int = 10,
|
|
401
406
|
n_circuits: int = 20,
|
|
402
407
|
cycle_depths: Sequence[int] = (5, 25, 50, 100, 200, 300),
|
|
403
|
-
random_state:
|
|
404
|
-
ax:
|
|
405
|
-
pairs:
|
|
406
|
-
pool:
|
|
408
|
+
random_state: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
|
|
409
|
+
ax: plt.Axes | None = None,
|
|
410
|
+
pairs: Sequence[tuple[cirq.GridQubit, cirq.GridQubit]] | None = None,
|
|
411
|
+
pool: multiprocessing.pool.Pool | None = None,
|
|
407
412
|
batch_size: int = 9,
|
|
408
413
|
tags: Sequence[Any] = (),
|
|
409
414
|
**plot_kwargs,
|
|
410
|
-
) ->
|
|
415
|
+
) -> tuple[pd.DataFrame, Sequence[cirq.Circuit], pd.DataFrame]:
|
|
411
416
|
"""A utility method that runs the full XEB workflow.
|
|
412
417
|
|
|
413
418
|
Args:
|
|
@@ -483,16 +488,16 @@ def parallel_xeb_workflow(
|
|
|
483
488
|
|
|
484
489
|
|
|
485
490
|
def parallel_two_qubit_xeb(
|
|
486
|
-
sampler:
|
|
487
|
-
qubits:
|
|
488
|
-
entangling_gate:
|
|
491
|
+
sampler: cirq.Sampler,
|
|
492
|
+
qubits: Sequence[cirq.GridQubit] | None = None,
|
|
493
|
+
entangling_gate: cirq.Gate = ops.CZ,
|
|
489
494
|
n_repetitions: int = 10**4,
|
|
490
495
|
n_combinations: int = 10,
|
|
491
496
|
n_circuits: int = 20,
|
|
492
497
|
cycle_depths: Sequence[int] = (5, 25, 50, 100, 200, 300),
|
|
493
|
-
random_state:
|
|
494
|
-
ax:
|
|
495
|
-
pairs:
|
|
498
|
+
random_state: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
|
|
499
|
+
ax: plt.Axes | None = None,
|
|
500
|
+
pairs: Sequence[tuple[cirq.GridQubit, cirq.GridQubit]] | None = None,
|
|
496
501
|
batch_size: int = 9,
|
|
497
502
|
tags: Sequence[Any] = (),
|
|
498
503
|
**plot_kwargs,
|
|
@@ -540,18 +545,18 @@ def parallel_two_qubit_xeb(
|
|
|
540
545
|
|
|
541
546
|
|
|
542
547
|
def run_rb_and_xeb(
|
|
543
|
-
sampler:
|
|
544
|
-
qubits:
|
|
548
|
+
sampler: cirq.Sampler,
|
|
549
|
+
qubits: Sequence[cirq.GridQubit] | None = None,
|
|
545
550
|
repetitions: int = 10**3,
|
|
546
551
|
num_circuits: int = 20,
|
|
547
552
|
num_clifford_range: Sequence[int] = tuple(
|
|
548
553
|
np.logspace(np.log10(5), np.log10(1000), 5, dtype=int)
|
|
549
554
|
),
|
|
550
|
-
entangling_gate:
|
|
555
|
+
entangling_gate: cirq.Gate = ops.CZ,
|
|
551
556
|
depths_xeb: Sequence[int] = (5, 25, 50, 100, 200, 300),
|
|
552
557
|
xeb_combinations: int = 10,
|
|
553
|
-
random_state:
|
|
554
|
-
pairs:
|
|
558
|
+
random_state: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
|
|
559
|
+
pairs: Sequence[tuple[cirq.GridQubit, cirq.GridQubit]] | None = None,
|
|
555
560
|
batch_size: int = 9,
|
|
556
561
|
tags: Sequence[Any] = (),
|
|
557
562
|
) -> InferredXEBResult:
|
|
@@ -582,12 +587,14 @@ def run_rb_and_xeb(
|
|
|
582
587
|
|
|
583
588
|
qubits, pairs = qubits_and_pairs(sampler, qubits, pairs)
|
|
584
589
|
|
|
585
|
-
rb =
|
|
590
|
+
rb = parallel_single_qubit_rb(
|
|
586
591
|
sampler=sampler,
|
|
587
592
|
qubits=qubits,
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
593
|
+
parameters=RBParameters(
|
|
594
|
+
num_circuits=num_circuits,
|
|
595
|
+
repetitions=repetitions,
|
|
596
|
+
num_clifford_range=num_clifford_range,
|
|
597
|
+
),
|
|
591
598
|
)
|
|
592
599
|
|
|
593
600
|
xeb = parallel_two_qubit_xeb(
|
|
@@ -11,10 +11,14 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
+
|
|
14
15
|
"""Wraps Parallel Two Qubit XEB into a few convenience methods."""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
15
19
|
import io
|
|
16
20
|
import itertools
|
|
17
|
-
from typing import
|
|
21
|
+
from typing import Sequence
|
|
18
22
|
|
|
19
23
|
import matplotlib.pyplot as plt
|
|
20
24
|
import networkx as nx
|
|
@@ -26,7 +30,7 @@ import cirq
|
|
|
26
30
|
from cirq.experiments.qubit_characterizations import ParallelRandomizedBenchmarkingResult
|
|
27
31
|
|
|
28
32
|
|
|
29
|
-
def _manhattan_distance(qubit1:
|
|
33
|
+
def _manhattan_distance(qubit1: cirq.GridQubit, qubit2: cirq.GridQubit) -> int:
|
|
30
34
|
return abs(qubit1.row - qubit2.row) + abs(qubit1.col - qubit2.col)
|
|
31
35
|
|
|
32
36
|
|
|
@@ -86,7 +90,7 @@ def test_parallel_two_qubit_xeb_simulator_without_processor_fails():
|
|
|
86
90
|
),
|
|
87
91
|
],
|
|
88
92
|
)
|
|
89
|
-
def test_parallel_two_qubit_xeb(sampler: cirq.Sampler, qubits:
|
|
93
|
+
def test_parallel_two_qubit_xeb(sampler: cirq.Sampler, qubits: Sequence[cirq.GridQubit] | None):
|
|
90
94
|
res = cirq.experiments.parallel_two_qubit_xeb(
|
|
91
95
|
sampler=sampler,
|
|
92
96
|
qubits=qubits,
|
|
@@ -158,7 +162,7 @@ def test_pauli_error(q0: cirq.GridQubit, q1: cirq.GridQubit, pauli: float):
|
|
|
158
162
|
|
|
159
163
|
|
|
160
164
|
class MockParallelRandomizedBenchmarkingResult(ParallelRandomizedBenchmarkingResult):
|
|
161
|
-
def pauli_error(self) ->
|
|
165
|
+
def pauli_error(self) -> dict[cirq.Qid, float]:
|
|
162
166
|
return {
|
|
163
167
|
cirq.GridQubit(4, 4): 0.01,
|
|
164
168
|
cirq.GridQubit(5, 4): 0.02,
|
|
@@ -290,8 +294,8 @@ def test_inferred_plots(ax, target_error, kind):
|
|
|
290
294
|
)
|
|
291
295
|
def test_run_rb_and_xeb(
|
|
292
296
|
sampler: cirq.Sampler,
|
|
293
|
-
qubits:
|
|
294
|
-
pairs:
|
|
297
|
+
qubits: Sequence[cirq.GridQubit] | None,
|
|
298
|
+
pairs: Sequence[tuple[cirq.GridQubit, cirq.GridQubit]] | None,
|
|
295
299
|
):
|
|
296
300
|
res = cirq.experiments.run_rb_and_xeb(
|
|
297
301
|
sampler=sampler,
|