cirq-core 1.5.0.dev20250409222543__py3-none-any.whl → 1.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of cirq-core might be problematic. Click here for more details.
- cirq/__init__.py +16 -17
- cirq/_compat.py +21 -20
- cirq/_compat_test.py +14 -34
- cirq/_doc.py +4 -2
- cirq/_import.py +8 -6
- cirq/_import_test.py +4 -2
- cirq/_version.py +6 -6
- cirq/_version_test.py +2 -2
- cirq/circuits/_block_diagram_drawer.py +11 -10
- cirq/circuits/_block_diagram_drawer_test.py +8 -6
- cirq/circuits/_box_drawing_character_data.py +8 -8
- cirq/circuits/_box_drawing_character_data_test.py +3 -1
- cirq/circuits/_bucket_priority_queue.py +9 -7
- cirq/circuits/_bucket_priority_queue_test.py +22 -20
- cirq/circuits/circuit.py +248 -172
- cirq/circuits/circuit_operation.py +73 -83
- cirq/circuits/circuit_operation_test.py +128 -90
- cirq/circuits/circuit_test.py +211 -151
- cirq/circuits/frozen_circuit.py +23 -60
- cirq/circuits/frozen_circuit_test.py +31 -8
- cirq/circuits/insert_strategy.py +7 -5
- cirq/circuits/insert_strategy_test.py +4 -2
- cirq/circuits/moment.py +88 -40
- cirq/circuits/moment_test.py +128 -51
- cirq/circuits/optimization_pass.py +5 -5
- cirq/circuits/optimization_pass_test.py +10 -10
- cirq/circuits/qasm_output.py +11 -11
- cirq/circuits/qasm_output_test.py +25 -22
- cirq/circuits/text_diagram_drawer.py +23 -38
- cirq/circuits/text_diagram_drawer_test.py +19 -17
- cirq/conftest.py +4 -3
- cirq/contrib/__init__.py +4 -4
- cirq/contrib/acquaintance/__init__.py +1 -1
- cirq/contrib/acquaintance/bipartite.py +5 -8
- cirq/contrib/acquaintance/bipartite_test.py +18 -13
- cirq/contrib/acquaintance/devices.py +2 -2
- cirq/contrib/acquaintance/devices_test.py +5 -3
- cirq/contrib/acquaintance/executor.py +5 -5
- cirq/contrib/acquaintance/executor_test.py +13 -9
- cirq/contrib/acquaintance/gates.py +18 -28
- cirq/contrib/acquaintance/gates_test.py +24 -20
- cirq/contrib/acquaintance/inspection_utils.py +8 -4
- cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
- cirq/contrib/acquaintance/mutation_utils.py +4 -4
- cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
- cirq/contrib/acquaintance/optimizers.py +4 -4
- cirq/contrib/acquaintance/optimizers_test.py +4 -1
- cirq/contrib/acquaintance/permutation.py +15 -27
- cirq/contrib/acquaintance/permutation_test.py +26 -17
- cirq/contrib/acquaintance/shift.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
- cirq/contrib/acquaintance/shift_test.py +8 -6
- cirq/contrib/acquaintance/strategies/cubic.py +2 -2
- cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
- cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
- cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
- cirq/contrib/acquaintance/testing.py +2 -0
- cirq/contrib/acquaintance/topological_sort.py +2 -2
- cirq/contrib/acquaintance/topological_sort_test.py +3 -1
- cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
- cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
- cirq/contrib/circuitdag/circuit_dag.py +4 -4
- cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
- cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
- cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
- cirq/contrib/graph_device/graph_device.py +12 -11
- cirq/contrib/graph_device/graph_device_test.py +18 -14
- cirq/contrib/graph_device/hypergraph.py +16 -14
- cirq/contrib/graph_device/hypergraph_test.py +13 -11
- cirq/contrib/graph_device/uniform_graph_device.py +6 -4
- cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
- cirq/contrib/hacks/disable_validation.py +6 -1
- cirq/contrib/hacks/disable_validation_test.py +3 -1
- cirq/contrib/json.py +31 -5
- cirq/contrib/json_test.py +6 -3
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/__init__.py +17 -0
- cirq/contrib/json_test_data/spec.py +32 -0
- cirq/contrib/noise_models/noise_models.py +119 -5
- cirq/contrib/noise_models/noise_models_test.py +37 -9
- cirq/contrib/paulistring/clifford_optimize.py +6 -4
- cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
- cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
- cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
- cirq/contrib/paulistring/optimize.py +2 -0
- cirq/contrib/paulistring/optimize_test.py +4 -3
- cirq/contrib/paulistring/pauli_string_dag.py +2 -0
- cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
- cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
- cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
- cirq/contrib/paulistring/recombine.py +6 -4
- cirq/contrib/paulistring/recombine_test.py +3 -1
- cirq/contrib/paulistring/separate.py +9 -6
- cirq/contrib/paulistring/separate_test.py +3 -1
- cirq/contrib/qasm_import/_lexer.py +3 -2
- cirq/contrib/qasm_import/_lexer_test.py +49 -13
- cirq/contrib/qasm_import/_parser.py +547 -83
- cirq/contrib/qasm_import/_parser_test.py +988 -97
- cirq/contrib/qasm_import/exception.py +2 -0
- cirq/contrib/qasm_import/qasm.py +8 -2
- cirq/contrib/qasm_import/qasm_test.py +7 -4
- cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
- cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
- cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
- cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
- cirq/contrib/qcircuit/qcircuit_test.py +10 -8
- cirq/contrib/quantum_volume/quantum_volume.py +31 -27
- cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
- cirq/contrib/quimb/density_matrix.py +15 -14
- cirq/contrib/quimb/density_matrix_test.py +10 -7
- cirq/contrib/quimb/grid_circuits.py +5 -2
- cirq/contrib/quimb/grid_circuits_test.py +3 -0
- cirq/contrib/quimb/mps_simulator.py +20 -20
- cirq/contrib/quimb/mps_simulator_test.py +3 -0
- cirq/contrib/quimb/state_vector.py +12 -11
- cirq/contrib/quimb/state_vector_test.py +3 -0
- cirq/contrib/quirk/export_to_quirk.py +5 -3
- cirq/contrib/quirk/export_to_quirk_test.py +18 -16
- cirq/contrib/quirk/linearize_circuit.py +2 -0
- cirq/contrib/quirk/quirk_gate.py +18 -17
- cirq/contrib/routing/device.py +5 -3
- cirq/contrib/routing/device_test.py +2 -0
- cirq/contrib/routing/greedy.py +10 -21
- cirq/contrib/routing/greedy_test.py +4 -2
- cirq/contrib/routing/initialization.py +2 -2
- cirq/contrib/routing/initialization_test.py +5 -3
- cirq/contrib/routing/router.py +9 -5
- cirq/contrib/routing/router_test.py +2 -0
- cirq/contrib/routing/swap_network.py +3 -3
- cirq/contrib/routing/swap_network_test.py +3 -1
- cirq/contrib/routing/utils.py +2 -2
- cirq/contrib/routing/utils_test.py +3 -0
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
- cirq/contrib/svg/svg.py +3 -3
- cirq/contrib/svg/svg_test.py +8 -5
- cirq/devices/device.py +4 -4
- cirq/devices/device_test.py +7 -4
- cirq/devices/grid_device_metadata.py +10 -10
- cirq/devices/grid_device_metadata_test.py +3 -0
- cirq/devices/grid_qubit.py +29 -21
- cirq/devices/grid_qubit_test.py +3 -0
- cirq/devices/insertion_noise_model.py +7 -7
- cirq/devices/insertion_noise_model_test.py +7 -5
- cirq/devices/line_qubit.py +13 -13
- cirq/devices/line_qubit_test.py +2 -0
- cirq/devices/named_topologies.py +18 -29
- cirq/devices/named_topologies_test.py +13 -10
- cirq/devices/noise_model.py +3 -3
- cirq/devices/noise_model_test.py +19 -15
- cirq/devices/noise_properties.py +15 -6
- cirq/devices/noise_properties_test.py +34 -3
- cirq/devices/noise_utils.py +11 -9
- cirq/devices/noise_utils_test.py +2 -0
- cirq/devices/superconducting_qubits_noise_properties.py +23 -22
- cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
- cirq/devices/thermal_noise_model.py +107 -37
- cirq/devices/thermal_noise_model_test.py +21 -0
- cirq/devices/unconstrained_device.py +5 -3
- cirq/devices/unconstrained_device_test.py +2 -0
- cirq/experiments/__init__.py +4 -2
- cirq/experiments/benchmarking/__init__.py +17 -0
- cirq/experiments/benchmarking/parallel_xeb.py +677 -0
- cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
- cirq/experiments/fidelity_estimation.py +14 -8
- cirq/experiments/fidelity_estimation_test.py +3 -0
- cirq/experiments/n_qubit_tomography.py +17 -16
- cirq/experiments/n_qubit_tomography_test.py +8 -5
- cirq/experiments/purity_estimation.py +2 -0
- cirq/experiments/purity_estimation_test.py +2 -0
- cirq/experiments/qubit_characterizations.py +207 -103
- cirq/experiments/qubit_characterizations_test.py +40 -12
- cirq/experiments/random_quantum_circuit_generation.py +56 -70
- cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
- cirq/experiments/readout_confusion_matrix.py +24 -22
- cirq/experiments/readout_confusion_matrix_test.py +2 -0
- cirq/experiments/single_qubit_readout_calibration.py +30 -15
- cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
- cirq/experiments/t1_decay_experiment.py +9 -7
- cirq/experiments/t1_decay_experiment_test.py +13 -11
- cirq/experiments/t2_decay_experiment.py +16 -13
- cirq/experiments/t2_decay_experiment_test.py +2 -0
- cirq/experiments/two_qubit_xeb.py +64 -57
- cirq/experiments/two_qubit_xeb_test.py +10 -6
- cirq/experiments/xeb_fitting.py +39 -35
- cirq/experiments/xeb_sampling.py +37 -44
- cirq/experiments/xeb_sampling_test.py +3 -0
- cirq/experiments/xeb_simulation.py +14 -10
- cirq/experiments/xeb_simulation_test.py +5 -5
- cirq/experiments/z_phase_calibration.py +32 -29
- cirq/experiments/z_phase_calibration_test.py +3 -4
- cirq/interop/quirk/cells/__init__.py +1 -1
- cirq/interop/quirk/cells/all_cells.py +7 -2
- cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
- cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
- cirq/interop/quirk/cells/cell.py +19 -28
- cirq/interop/quirk/cells/cell_test.py +3 -0
- cirq/interop/quirk/cells/composite_cell.py +13 -28
- cirq/interop/quirk/cells/composite_cell_test.py +2 -0
- cirq/interop/quirk/cells/control_cells.py +15 -15
- cirq/interop/quirk/cells/control_cells_test.py +7 -5
- cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
- cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
- cirq/interop/quirk/cells/ignored_cells.py +3 -0
- cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
- cirq/interop/quirk/cells/input_cells.py +7 -5
- cirq/interop/quirk/cells/input_cells_test.py +7 -5
- cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
- cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
- cirq/interop/quirk/cells/measurement_cells.py +5 -2
- cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
- cirq/interop/quirk/cells/parse.py +22 -23
- cirq/interop/quirk/cells/parse_test.py +12 -10
- cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
- cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
- cirq/interop/quirk/cells/scalar_cells.py +4 -1
- cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
- cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
- cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
- cirq/interop/quirk/cells/swap_cell.py +8 -6
- cirq/interop/quirk/cells/swap_cell_test.py +6 -4
- cirq/interop/quirk/cells/testing.py +6 -6
- cirq/interop/quirk/cells/testing_test.py +8 -6
- cirq/interop/quirk/cells/unsupported_cells.py +3 -0
- cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
- cirq/interop/quirk/url_to_circuit.py +23 -36
- cirq/interop/quirk/url_to_circuit_test.py +4 -1
- cirq/json_resolver_cache.py +14 -12
- cirq/linalg/__init__.py +4 -6
- cirq/linalg/combinators.py +7 -5
- cirq/linalg/combinators_test.py +10 -7
- cirq/linalg/decompositions.py +24 -35
- cirq/linalg/decompositions_test.py +3 -1
- cirq/linalg/diagonalize.py +6 -4
- cirq/linalg/diagonalize_test.py +15 -14
- cirq/linalg/operator_spaces.py +14 -14
- cirq/linalg/operator_spaces_test.py +13 -11
- cirq/linalg/predicates.py +18 -9
- cirq/linalg/predicates_test.py +5 -0
- cirq/linalg/tolerance.py +6 -3
- cirq/linalg/tolerance_test.py +6 -4
- cirq/linalg/transformations.py +23 -20
- cirq/linalg/transformations_test.py +73 -43
- cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
- cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
- cirq/neutral_atoms/neutral_atom_devices.py +2 -0
- cirq/ops/__init__.py +2 -0
- cirq/ops/arithmetic_operation.py +21 -21
- cirq/ops/arithmetic_operation_test.py +7 -8
- cirq/ops/boolean_hamiltonian.py +23 -22
- cirq/ops/boolean_hamiltonian_test.py +12 -9
- cirq/ops/classically_controlled_operation.py +31 -36
- cirq/ops/classically_controlled_operation_test.py +121 -117
- cirq/ops/clifford_gate.py +98 -81
- cirq/ops/clifford_gate_test.py +72 -57
- cirq/ops/common_channels.py +44 -44
- cirq/ops/common_channels_test.py +83 -81
- cirq/ops/common_gate_families.py +9 -7
- cirq/ops/common_gate_families_test.py +11 -7
- cirq/ops/common_gates.py +164 -183
- cirq/ops/common_gates_test.py +135 -95
- cirq/ops/control_values.py +23 -26
- cirq/ops/control_values_test.py +22 -20
- cirq/ops/controlled_gate.py +64 -112
- cirq/ops/controlled_gate_test.py +130 -35
- cirq/ops/controlled_operation.py +24 -35
- cirq/ops/controlled_operation_test.py +8 -6
- cirq/ops/dense_pauli_string.py +38 -49
- cirq/ops/dense_pauli_string_test.py +4 -2
- cirq/ops/diagonal_gate.py +18 -31
- cirq/ops/diagonal_gate_test.py +13 -13
- cirq/ops/eigen_gate.py +29 -29
- cirq/ops/eigen_gate_test.py +45 -28
- cirq/ops/fourier_transform.py +14 -20
- cirq/ops/fourier_transform_test.py +15 -12
- cirq/ops/fsim_gate.py +43 -42
- cirq/ops/fsim_gate_test.py +29 -29
- cirq/ops/gate_features.py +2 -0
- cirq/ops/gate_features_test.py +5 -3
- cirq/ops/gate_operation.py +43 -65
- cirq/ops/gate_operation_test.py +46 -42
- cirq/ops/gateset.py +28 -40
- cirq/ops/gateset_test.py +4 -2
- cirq/ops/global_phase_op.py +45 -20
- cirq/ops/global_phase_op_test.py +44 -20
- cirq/ops/greedy_qubit_manager.py +10 -8
- cirq/ops/greedy_qubit_manager_test.py +5 -3
- cirq/ops/identity.py +14 -12
- cirq/ops/identity_test.py +24 -20
- cirq/ops/kraus_channel.py +11 -8
- cirq/ops/kraus_channel_test.py +14 -11
- cirq/ops/linear_combinations.py +65 -77
- cirq/ops/linear_combinations_test.py +14 -9
- cirq/ops/matrix_gates.py +21 -18
- cirq/ops/matrix_gates_test.py +16 -0
- cirq/ops/measure_util.py +15 -20
- cirq/ops/measure_util_test.py +2 -0
- cirq/ops/measurement_gate.py +26 -37
- cirq/ops/measurement_gate_test.py +2 -0
- cirq/ops/mixed_unitary_channel.py +12 -9
- cirq/ops/mixed_unitary_channel_test.py +14 -11
- cirq/ops/named_qubit.py +16 -13
- cirq/ops/named_qubit_test.py +15 -13
- cirq/ops/op_tree.py +9 -7
- cirq/ops/op_tree_test.py +22 -19
- cirq/ops/parallel_gate.py +15 -17
- cirq/ops/parallel_gate_test.py +18 -16
- cirq/ops/parity_gates.py +23 -25
- cirq/ops/parity_gates_test.py +36 -32
- cirq/ops/pauli_gates.py +22 -21
- cirq/ops/pauli_gates_test.py +29 -20
- cirq/ops/pauli_interaction_gate.py +15 -19
- cirq/ops/pauli_interaction_gate_test.py +10 -8
- cirq/ops/pauli_measurement_gate.py +23 -35
- cirq/ops/pauli_measurement_gate_test.py +2 -0
- cirq/ops/pauli_string.py +92 -120
- cirq/ops/pauli_string_phasor.py +52 -45
- cirq/ops/pauli_string_phasor_test.py +4 -5
- cirq/ops/pauli_string_raw_types.py +9 -7
- cirq/ops/pauli_string_raw_types_test.py +2 -0
- cirq/ops/pauli_string_test.py +31 -154
- cirq/ops/pauli_sum_exponential.py +12 -12
- cirq/ops/pauli_sum_exponential_test.py +12 -10
- cirq/ops/permutation_gate.py +8 -6
- cirq/ops/permutation_gate_test.py +10 -8
- cirq/ops/phased_iswap_gate.py +16 -16
- cirq/ops/phased_iswap_gate_test.py +17 -15
- cirq/ops/phased_x_gate.py +16 -17
- cirq/ops/phased_x_gate_test.py +18 -16
- cirq/ops/phased_x_z_gate.py +24 -22
- cirq/ops/phased_x_z_gate_test.py +17 -11
- cirq/ops/projector.py +16 -11
- cirq/ops/projector_test.py +19 -16
- cirq/ops/qid_util.py +7 -5
- cirq/ops/qid_util_test.py +2 -0
- cirq/ops/qubit_manager.py +11 -9
- cirq/ops/qubit_manager_test.py +6 -4
- cirq/ops/qubit_order.py +11 -14
- cirq/ops/qubit_order_or_list.py +4 -2
- cirq/ops/qubit_order_test.py +12 -10
- cirq/ops/random_gate_channel.py +12 -10
- cirq/ops/random_gate_channel_test.py +14 -11
- cirq/ops/raw_types.py +109 -129
- cirq/ops/raw_types_test.py +63 -57
- cirq/ops/state_preparation_channel.py +7 -7
- cirq/ops/state_preparation_channel_test.py +11 -9
- cirq/ops/swap_gates.py +13 -15
- cirq/ops/swap_gates_test.py +19 -17
- cirq/ops/tags.py +5 -3
- cirq/ops/tags_test.py +4 -2
- cirq/ops/three_qubit_gates.py +43 -76
- cirq/ops/three_qubit_gates_test.py +19 -17
- cirq/ops/two_qubit_diagonal_gate.py +13 -13
- cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
- cirq/ops/uniform_superposition_gate.py +5 -3
- cirq/ops/uniform_superposition_gate_test.py +5 -3
- cirq/ops/wait_gate.py +17 -14
- cirq/ops/wait_gate_test.py +9 -6
- cirq/protocols/__init__.py +0 -3
- cirq/protocols/act_on_protocol.py +8 -6
- cirq/protocols/act_on_protocol_test.py +15 -12
- cirq/protocols/apply_channel_protocol.py +10 -14
- cirq/protocols/apply_channel_protocol_test.py +2 -0
- cirq/protocols/apply_mixture_protocol.py +13 -42
- cirq/protocols/apply_mixture_protocol_test.py +7 -5
- cirq/protocols/apply_unitary_protocol.py +39 -34
- cirq/protocols/apply_unitary_protocol_test.py +4 -1
- cirq/protocols/approximate_equality_protocol.py +2 -0
- cirq/protocols/approximate_equality_protocol_test.py +2 -0
- cirq/protocols/circuit_diagram_info_protocol.py +58 -42
- cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
- cirq/protocols/commutes_protocol.py +8 -7
- cirq/protocols/commutes_protocol_test.py +2 -0
- cirq/protocols/control_key_protocol.py +6 -4
- cirq/protocols/control_key_protocol_test.py +3 -1
- cirq/protocols/decompose_protocol.py +49 -48
- cirq/protocols/decompose_protocol_test.py +27 -16
- cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
- cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
- cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
- cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
- cirq/protocols/has_unitary_protocol.py +10 -6
- cirq/protocols/has_unitary_protocol_test.py +13 -8
- cirq/protocols/hash_from_pickle_test.py +2 -11
- cirq/protocols/inverse_protocol.py +13 -16
- cirq/protocols/inverse_protocol_test.py +5 -3
- cirq/protocols/json_serialization.py +35 -54
- cirq/protocols/json_serialization_test.py +14 -21
- cirq/protocols/json_test_data/CXSWAP.json +46 -0
- cirq/protocols/json_test_data/CXSWAP.repr +13 -0
- cirq/protocols/json_test_data/CZSWAP.json +46 -0
- cirq/protocols/json_test_data/CZSWAP.repr +13 -0
- cirq/protocols/json_test_data/CircuitOperation.json +6 -3
- cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
- cirq/protocols/json_test_data/Moment.json +24 -1
- cirq/protocols/json_test_data/Moment.repr +6 -1
- cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
- cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
- cirq/protocols/json_test_data/spec.py +6 -2
- cirq/protocols/kraus_protocol.py +47 -7
- cirq/protocols/kraus_protocol_test.py +86 -12
- cirq/protocols/measurement_key_protocol.py +15 -16
- cirq/protocols/measurement_key_protocol_test.py +13 -11
- cirq/protocols/mixture_protocol.py +7 -5
- cirq/protocols/mixture_protocol_test.py +4 -2
- cirq/protocols/mul_protocol.py +2 -3
- cirq/protocols/mul_protocol_test.py +2 -0
- cirq/protocols/pauli_expansion_protocol.py +6 -3
- cirq/protocols/pauli_expansion_protocol_test.py +5 -3
- cirq/protocols/phase_protocol.py +2 -0
- cirq/protocols/phase_protocol_test.py +3 -1
- cirq/protocols/pow_protocol.py +11 -16
- cirq/protocols/pow_protocol_test.py +2 -0
- cirq/protocols/qasm.py +14 -20
- cirq/protocols/qasm_test.py +6 -3
- cirq/protocols/qid_shape_protocol.py +8 -8
- cirq/protocols/qid_shape_protocol_test.py +3 -1
- cirq/protocols/resolve_parameters.py +5 -3
- cirq/protocols/resolve_parameters_test.py +8 -7
- cirq/protocols/trace_distance_bound.py +6 -4
- cirq/protocols/trace_distance_bound_test.py +3 -1
- cirq/protocols/unitary_protocol.py +17 -7
- cirq/protocols/unitary_protocol_test.py +12 -2
- cirq/qis/channels.py +6 -2
- cirq/qis/channels_test.py +20 -16
- cirq/qis/clifford_tableau.py +21 -19
- cirq/qis/clifford_tableau_test.py +2 -2
- cirq/qis/entropy.py +14 -3
- cirq/qis/entropy_test.py +3 -1
- cirq/qis/measures.py +13 -13
- cirq/qis/measures_test.py +20 -14
- cirq/qis/noise_utils.py +2 -0
- cirq/qis/noise_utils_test.py +9 -7
- cirq/qis/quantum_state_representation.py +7 -8
- cirq/qis/states.py +58 -56
- cirq/qis/states_test.py +2 -0
- cirq/sim/classical_simulator.py +23 -22
- cirq/sim/classical_simulator_test.py +2 -0
- cirq/sim/clifford/clifford_simulator.py +23 -21
- cirq/sim/clifford/clifford_simulator_test.py +7 -4
- cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
- cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
- cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
- cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
- cirq/sim/clifford/stabilizer_sampler.py +9 -7
- cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
- cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
- cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
- cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
- cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
- cirq/sim/density_matrix_simulation_state.py +26 -27
- cirq/sim/density_matrix_simulation_state_test.py +10 -8
- cirq/sim/density_matrix_simulator.py +30 -28
- cirq/sim/density_matrix_simulator_test.py +48 -48
- cirq/sim/density_matrix_utils.py +13 -11
- cirq/sim/density_matrix_utils_test.py +38 -36
- cirq/sim/mux.py +33 -31
- cirq/sim/mux_test.py +3 -0
- cirq/sim/simulation_product_state.py +15 -15
- cirq/sim/simulation_product_state_test.py +29 -26
- cirq/sim/simulation_state.py +29 -38
- cirq/sim/simulation_state_base.py +21 -32
- cirq/sim/simulation_state_test.py +15 -13
- cirq/sim/simulation_utils.py +5 -2
- cirq/sim/simulation_utils_test.py +5 -2
- cirq/sim/simulator.py +90 -106
- cirq/sim/simulator_base.py +33 -45
- cirq/sim/simulator_base_test.py +20 -15
- cirq/sim/simulator_test.py +23 -14
- cirq/sim/sparse_simulator.py +19 -17
- cirq/sim/sparse_simulator_test.py +41 -40
- cirq/sim/state_vector.py +15 -12
- cirq/sim/state_vector_simulation_state.py +31 -31
- cirq/sim/state_vector_simulation_state_test.py +16 -14
- cirq/sim/state_vector_simulator.py +17 -14
- cirq/sim/state_vector_simulator_test.py +2 -0
- cirq/sim/state_vector_test.py +6 -3
- cirq/study/flatten_expressions.py +16 -15
- cirq/study/flatten_expressions_test.py +13 -11
- cirq/study/resolver.py +18 -17
- cirq/study/resolver_test.py +22 -20
- cirq/study/result.py +17 -27
- cirq/study/result_test.py +2 -0
- cirq/study/sweepable.py +12 -10
- cirq/study/sweepable_test.py +3 -0
- cirq/study/sweeps.py +42 -61
- cirq/study/sweeps_test.py +33 -0
- cirq/testing/__init__.py +7 -11
- cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
- cirq/testing/circuit_compare.py +8 -17
- cirq/testing/circuit_compare_test.py +2 -0
- cirq/testing/consistent_act_on.py +13 -11
- cirq/testing/consistent_act_on_test.py +5 -3
- cirq/testing/consistent_channels.py +2 -0
- cirq/testing/consistent_channels_test.py +10 -8
- cirq/testing/consistent_controlled_gate_op.py +5 -5
- cirq/testing/consistent_controlled_gate_op_test.py +18 -18
- cirq/testing/consistent_decomposition.py +2 -2
- cirq/testing/consistent_decomposition_test.py +4 -2
- cirq/testing/consistent_pauli_expansion.py +2 -0
- cirq/testing/consistent_pauli_expansion_test.py +3 -1
- cirq/testing/consistent_phase_by.py +2 -0
- cirq/testing/consistent_phase_by_test.py +3 -1
- cirq/testing/consistent_protocols.py +14 -20
- cirq/testing/consistent_protocols_test.py +13 -11
- cirq/testing/consistent_qasm.py +6 -4
- cirq/testing/consistent_qasm_test.py +7 -7
- cirq/testing/consistent_resolve_parameters.py +2 -0
- cirq/testing/consistent_specified_has_unitary.py +2 -2
- cirq/testing/consistent_specified_has_unitary_test.py +6 -4
- cirq/testing/consistent_unitary.py +1 -0
- cirq/testing/consistent_unitary_test.py +4 -2
- cirq/testing/deprecation.py +5 -2
- cirq/testing/deprecation_test.py +5 -2
- cirq/testing/devices.py +7 -4
- cirq/testing/devices_test.py +7 -4
- cirq/testing/equals_tester.py +4 -2
- cirq/testing/equals_tester_test.py +21 -17
- cirq/testing/equivalent_basis_map.py +6 -4
- cirq/testing/equivalent_basis_map_test.py +6 -4
- cirq/testing/equivalent_repr_eval.py +6 -4
- cirq/testing/equivalent_repr_eval_test.py +5 -3
- cirq/testing/gate_features.py +2 -0
- cirq/testing/gate_features_test.py +7 -5
- cirq/testing/json.py +19 -15
- cirq/testing/json_test.py +5 -3
- cirq/testing/lin_alg_utils.py +10 -11
- cirq/testing/lin_alg_utils_test.py +14 -12
- cirq/testing/logs.py +7 -6
- cirq/testing/logs_test.py +9 -7
- cirq/testing/no_identifier_qubit.py +4 -2
- cirq/testing/no_identifier_qubit_test.py +5 -3
- cirq/testing/op_tree.py +2 -0
- cirq/testing/op_tree_test.py +4 -1
- cirq/testing/order_tester.py +2 -0
- cirq/testing/order_tester_test.py +8 -6
- cirq/testing/pytest_utils.py +2 -0
- cirq/testing/pytest_utils_test.py +4 -2
- cirq/testing/random_circuit.py +21 -20
- cirq/testing/random_circuit_test.py +12 -9
- cirq/testing/repr_pretty_tester.py +1 -0
- cirq/testing/repr_pretty_tester_test.py +5 -3
- cirq/testing/routing_devices.py +4 -1
- cirq/testing/routing_devices_test.py +9 -6
- cirq/testing/sample_circuits.py +4 -1
- cirq/testing/sample_circuits_test.py +3 -1
- cirq/testing/sample_gates.py +3 -0
- cirq/testing/sample_gates_test.py +5 -2
- cirq/transformers/__init__.py +11 -4
- cirq/transformers/align.py +9 -7
- cirq/transformers/align_test.py +2 -0
- cirq/transformers/analytical_decompositions/__init__.py +3 -6
- cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
- cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
- cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
- cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
- cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
- cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
- cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
- cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
- cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
- cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
- cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
- cirq/transformers/drop_empty_moments.py +5 -3
- cirq/transformers/drop_empty_moments_test.py +4 -2
- cirq/transformers/drop_negligible_operations.py +7 -5
- cirq/transformers/drop_negligible_operations_test.py +2 -0
- cirq/transformers/dynamical_decoupling.py +49 -42
- cirq/transformers/dynamical_decoupling_test.py +223 -205
- cirq/transformers/eject_phased_paulis.py +28 -26
- cirq/transformers/eject_phased_paulis_test.py +12 -9
- cirq/transformers/eject_z.py +12 -12
- cirq/transformers/eject_z_test.py +2 -2
- cirq/transformers/expand_composite.py +6 -4
- cirq/transformers/expand_composite_test.py +3 -1
- cirq/transformers/gauge_compiling/__init__.py +3 -1
- cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
- cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
- cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
- cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
- cirq/transformers/insertion_sort.py +8 -6
- cirq/transformers/insertion_sort_test.py +3 -1
- cirq/transformers/measurement_transformers.py +29 -29
- cirq/transformers/measurement_transformers_test.py +2 -0
- cirq/transformers/merge_k_qubit_gates.py +12 -10
- cirq/transformers/merge_k_qubit_gates_test.py +18 -18
- cirq/transformers/merge_single_qubit_gates.py +197 -20
- cirq/transformers/merge_single_qubit_gates_test.py +177 -5
- cirq/transformers/noise_adding.py +5 -3
- cirq/transformers/noise_adding_test.py +2 -0
- cirq/transformers/optimize_for_target_gateset.py +19 -17
- cirq/transformers/optimize_for_target_gateset_test.py +11 -8
- cirq/transformers/qubit_management_transformers.py +13 -11
- cirq/transformers/qubit_management_transformers_test.py +5 -3
- cirq/transformers/randomized_measurements.py +16 -14
- cirq/transformers/randomized_measurements_test.py +10 -4
- cirq/transformers/routing/initial_mapper.py +6 -4
- cirq/transformers/routing/initial_mapper_test.py +2 -0
- cirq/transformers/routing/line_initial_mapper.py +16 -14
- cirq/transformers/routing/line_initial_mapper_test.py +9 -7
- cirq/transformers/routing/mapping_manager.py +10 -10
- cirq/transformers/routing/mapping_manager_test.py +2 -0
- cirq/transformers/routing/route_circuit_cqc.py +33 -31
- cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
- cirq/transformers/routing/visualize_routed_circuit.py +8 -7
- cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
- cirq/transformers/stratify.py +17 -15
- cirq/transformers/stratify_test.py +3 -0
- cirq/transformers/symbolize.py +103 -0
- cirq/transformers/symbolize_test.py +62 -0
- cirq/transformers/synchronize_terminal_measurements.py +10 -10
- cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
- cirq/transformers/tag_transformers.py +97 -0
- cirq/transformers/tag_transformers_test.py +103 -0
- cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
- cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
- cirq/transformers/target_gatesets/cz_gateset.py +7 -5
- cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
- cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
- cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
- cirq/transformers/transformer_api.py +34 -47
- cirq/transformers/transformer_api_test.py +9 -8
- cirq/transformers/transformer_primitives.py +39 -49
- cirq/transformers/transformer_primitives_test.py +10 -17
- cirq/value/abc_alt.py +6 -4
- cirq/value/abc_alt_test.py +5 -3
- cirq/value/angle.py +11 -12
- cirq/value/angle_test.py +5 -3
- cirq/value/classical_data.py +27 -27
- cirq/value/classical_data_test.py +11 -8
- cirq/value/condition.py +26 -24
- cirq/value/condition_test.py +2 -0
- cirq/value/digits.py +14 -11
- cirq/value/digits_test.py +2 -0
- cirq/value/duration.py +23 -20
- cirq/value/duration_test.py +2 -0
- cirq/value/linear_dict.py +25 -30
- cirq/value/linear_dict_test.py +10 -8
- cirq/value/measurement_key.py +12 -12
- cirq/value/measurement_key_test.py +2 -0
- cirq/value/periodic_value.py +4 -4
- cirq/value/periodic_value_test.py +11 -7
- cirq/value/probability.py +3 -1
- cirq/value/probability_test.py +4 -2
- cirq/value/product_state.py +15 -13
- cirq/value/product_state_test.py +4 -1
- cirq/value/random_state.py +2 -0
- cirq/value/random_state_test.py +5 -3
- cirq/value/timestamp.py +11 -7
- cirq/value/timestamp_test.py +14 -12
- cirq/value/type_alias.py +4 -4
- cirq/value/value_equality_attr.py +8 -9
- cirq/value/value_equality_attr_test.py +14 -11
- cirq/vis/density_matrix.py +3 -3
- cirq/vis/density_matrix_test.py +20 -17
- cirq/vis/heatmap.py +24 -37
- cirq/vis/heatmap_test.py +3 -0
- cirq/vis/histogram.py +9 -6
- cirq/vis/histogram_test.py +5 -2
- cirq/vis/state_histogram.py +10 -8
- cirq/vis/state_histogram_test.py +7 -5
- cirq/vis/vis_utils.py +4 -1
- cirq/vis/vis_utils_test.py +4 -1
- cirq/work/collector.py +12 -18
- cirq/work/collector_test.py +15 -10
- cirq/work/observable_grouping.py +6 -7
- cirq/work/observable_grouping_test.py +10 -9
- cirq/work/observable_measurement.py +47 -45
- cirq/work/observable_measurement_data.py +22 -17
- cirq/work/observable_measurement_data_test.py +4 -1
- cirq/work/observable_measurement_test.py +48 -29
- cirq/work/observable_readout_calibration.py +5 -2
- cirq/work/observable_readout_calibration_test.py +5 -2
- cirq/work/observable_settings.py +13 -22
- cirq/work/observable_settings_test.py +9 -7
- cirq/work/pauli_sum_collector.py +12 -10
- cirq/work/pauli_sum_collector_test.py +9 -9
- cirq/work/sampler.py +42 -43
- cirq/work/sampler_test.py +31 -24
- cirq/work/zeros_sampler.py +6 -4
- cirq/work/zeros_sampler_test.py +7 -5
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
- cirq_core-1.6.0.dist-info/RECORD +1241 -0
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
- cirq_core-1.5.0.dev20250409222543.dist-info/RECORD +0 -1216
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
cirq/experiments/xeb_fitting.py
CHANGED
|
@@ -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
|
"""Estimation of fidelity associated with experimental circuit executions."""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
15
19
|
import dataclasses
|
|
16
20
|
from abc import ABC, abstractmethod
|
|
17
|
-
from typing import
|
|
21
|
+
from typing import Iterable, Sequence, TYPE_CHECKING
|
|
18
22
|
|
|
19
23
|
import numpy as np
|
|
20
24
|
import pandas as pd
|
|
@@ -41,10 +45,10 @@ THETA_SYMBOL, ZETA_SYMBOL, CHI_SYMBOL, GAMMA_SYMBOL, PHI_SYMBOL = sympy.symbols(
|
|
|
41
45
|
|
|
42
46
|
def benchmark_2q_xeb_fidelities(
|
|
43
47
|
sampled_df: pd.DataFrame,
|
|
44
|
-
circuits: Sequence[
|
|
45
|
-
cycle_depths:
|
|
46
|
-
param_resolver:
|
|
47
|
-
pool:
|
|
48
|
+
circuits: Sequence[cirq.Circuit],
|
|
49
|
+
cycle_depths: Sequence[int] | None = None,
|
|
50
|
+
param_resolver: cirq.ParamResolverOrSimilarType = None,
|
|
51
|
+
pool: multiprocessing.pool.Pool | None = None,
|
|
48
52
|
) -> pd.DataFrame:
|
|
49
53
|
"""Simulate and benchmark two-qubit XEB circuits.
|
|
50
54
|
|
|
@@ -144,21 +148,21 @@ def benchmark_2q_xeb_fidelities(
|
|
|
144
148
|
class XEBCharacterizationOptions(ABC):
|
|
145
149
|
@staticmethod
|
|
146
150
|
@abstractmethod
|
|
147
|
-
def should_parameterize(op:
|
|
151
|
+
def should_parameterize(op: cirq.Operation) -> bool:
|
|
148
152
|
"""Whether to replace `op` with a parameterized version."""
|
|
149
153
|
|
|
150
154
|
@abstractmethod
|
|
151
|
-
def get_parameterized_gate(self) ->
|
|
155
|
+
def get_parameterized_gate(self) -> cirq.Gate:
|
|
152
156
|
"""The parameterized gate to use."""
|
|
153
157
|
|
|
154
158
|
@abstractmethod
|
|
155
159
|
def get_initial_simplex_and_names(
|
|
156
160
|
self, initial_simplex_step_size: float = 0.1
|
|
157
|
-
) ->
|
|
161
|
+
) -> tuple[np.ndarray, list[str]]:
|
|
158
162
|
"""Return an initial Nelder-Mead simplex and the names for each parameter."""
|
|
159
163
|
|
|
160
164
|
|
|
161
|
-
def _try_defaults_from_unitary(gate:
|
|
165
|
+
def _try_defaults_from_unitary(gate: cirq.Gate) -> dict[str, cirq.TParamVal] | None:
|
|
162
166
|
r"""Try to figure out the PhasedFSim angles from the unitary of the gate.
|
|
163
167
|
|
|
164
168
|
The unitary of a PhasedFSimGate has the form:
|
|
@@ -221,10 +225,10 @@ def _try_defaults_from_unitary(gate: 'cirq.Gate') -> Optional[Dict[str, 'cirq.TP
|
|
|
221
225
|
return None
|
|
222
226
|
|
|
223
227
|
|
|
224
|
-
def phased_fsim_angles_from_gate(gate:
|
|
228
|
+
def phased_fsim_angles_from_gate(gate: cirq.Gate) -> dict[str, cirq.TParamVal]:
|
|
225
229
|
"""For a given gate, return a dictionary mapping '{angle}_default' to its noiseless value
|
|
226
230
|
for the five PhasedFSim angles."""
|
|
227
|
-
defaults:
|
|
231
|
+
defaults: dict[str, cirq.TParamVal] = {
|
|
228
232
|
'theta_default': 0.0,
|
|
229
233
|
'zeta_default': 0.0,
|
|
230
234
|
'chi_default': 0.0,
|
|
@@ -284,13 +288,13 @@ class XEBPhasedFSimCharacterizationOptions(XEBCharacterizationOptions):
|
|
|
284
288
|
characterize_gamma: bool = True
|
|
285
289
|
characterize_phi: bool = True
|
|
286
290
|
|
|
287
|
-
theta_default:
|
|
288
|
-
zeta_default:
|
|
289
|
-
chi_default:
|
|
290
|
-
gamma_default:
|
|
291
|
-
phi_default:
|
|
291
|
+
theta_default: float | None = None
|
|
292
|
+
zeta_default: float | None = None
|
|
293
|
+
chi_default: float | None = None
|
|
294
|
+
gamma_default: float | None = None
|
|
295
|
+
phi_default: float | None = None
|
|
292
296
|
|
|
293
|
-
def _iter_angles(self) -> Iterable[
|
|
297
|
+
def _iter_angles(self) -> Iterable[tuple[bool, float | None, sympy.Symbol]]:
|
|
294
298
|
yield from (
|
|
295
299
|
(self.characterize_theta, self.theta_default, THETA_SYMBOL),
|
|
296
300
|
(self.characterize_zeta, self.zeta_default, ZETA_SYMBOL),
|
|
@@ -299,7 +303,7 @@ class XEBPhasedFSimCharacterizationOptions(XEBCharacterizationOptions):
|
|
|
299
303
|
(self.characterize_phi, self.phi_default, PHI_SYMBOL),
|
|
300
304
|
)
|
|
301
305
|
|
|
302
|
-
def _iter_angles_for_characterization(self) -> Iterable[
|
|
306
|
+
def _iter_angles_for_characterization(self) -> Iterable[tuple[float | None, sympy.Symbol]]:
|
|
303
307
|
yield from (
|
|
304
308
|
(default, symbol)
|
|
305
309
|
for characterize, default, symbol in self._iter_angles()
|
|
@@ -308,7 +312,7 @@ class XEBPhasedFSimCharacterizationOptions(XEBCharacterizationOptions):
|
|
|
308
312
|
|
|
309
313
|
def get_initial_simplex_and_names(
|
|
310
314
|
self, initial_simplex_step_size: float = 0.1
|
|
311
|
-
) ->
|
|
315
|
+
) -> tuple[np.ndarray, list[str]]:
|
|
312
316
|
"""Get an initial simplex and parameter names for the optimization implied by these options.
|
|
313
317
|
|
|
314
318
|
The initial simplex initiates the Nelder-Mead optimization parameter. We
|
|
@@ -347,7 +351,7 @@ class XEBPhasedFSimCharacterizationOptions(XEBCharacterizationOptions):
|
|
|
347
351
|
return ops.PhasedFSimGate(theta=theta, zeta=zeta, chi=chi, gamma=gamma, phi=phi)
|
|
348
352
|
|
|
349
353
|
@staticmethod
|
|
350
|
-
def should_parameterize(op:
|
|
354
|
+
def should_parameterize(op: cirq.Operation) -> bool:
|
|
351
355
|
return isinstance(op.gate, (ops.PhasedFSimGate, ops.ISwapPowGate, ops.FSimGate))
|
|
352
356
|
|
|
353
357
|
def defaults_set(self) -> bool:
|
|
@@ -369,7 +373,7 @@ class XEBPhasedFSimCharacterizationOptions(XEBCharacterizationOptions):
|
|
|
369
373
|
return False
|
|
370
374
|
|
|
371
375
|
def with_defaults_from_gate(
|
|
372
|
-
self, gate:
|
|
376
|
+
self, gate: cirq.Gate, gate_to_angles_func=phased_fsim_angles_from_gate
|
|
373
377
|
):
|
|
374
378
|
"""A new Options class with {angle}_defaults inferred from `gate`.
|
|
375
379
|
|
|
@@ -397,10 +401,10 @@ def SqrtISwapXEBOptions(*args, **kwargs):
|
|
|
397
401
|
|
|
398
402
|
|
|
399
403
|
def parameterize_circuit(
|
|
400
|
-
circuit:
|
|
404
|
+
circuit: cirq.Circuit,
|
|
401
405
|
options: XEBCharacterizationOptions,
|
|
402
|
-
target_gatefamily:
|
|
403
|
-
) ->
|
|
406
|
+
target_gatefamily: ops.GateFamily | None = None,
|
|
407
|
+
) -> cirq.Circuit:
|
|
404
408
|
"""Parameterize PhasedFSim-like gates in a given circuit according to
|
|
405
409
|
`phased_fsim_options`.
|
|
406
410
|
"""
|
|
@@ -417,7 +421,7 @@ def parameterize_circuit(
|
|
|
417
421
|
)
|
|
418
422
|
|
|
419
423
|
|
|
420
|
-
QPair_T =
|
|
424
|
+
QPair_T = tuple['cirq.Qid', 'cirq.Qid']
|
|
421
425
|
|
|
422
426
|
|
|
423
427
|
@dataclasses.dataclass(frozen=True)
|
|
@@ -432,21 +436,21 @@ class XEBCharacterizationResult:
|
|
|
432
436
|
fitting the characterization.
|
|
433
437
|
"""
|
|
434
438
|
|
|
435
|
-
optimization_results:
|
|
436
|
-
final_params:
|
|
439
|
+
optimization_results: dict[QPair_T, scipy.optimize.OptimizeResult]
|
|
440
|
+
final_params: dict[QPair_T, dict[str, float]]
|
|
437
441
|
fidelities_df: pd.DataFrame
|
|
438
442
|
|
|
439
443
|
|
|
440
444
|
def characterize_phased_fsim_parameters_with_xeb(
|
|
441
445
|
sampled_df: pd.DataFrame,
|
|
442
|
-
parameterized_circuits:
|
|
446
|
+
parameterized_circuits: list[cirq.Circuit],
|
|
443
447
|
cycle_depths: Sequence[int],
|
|
444
448
|
options: XEBCharacterizationOptions,
|
|
445
449
|
initial_simplex_step_size: float = 0.1,
|
|
446
450
|
xatol: float = 1e-3,
|
|
447
451
|
fatol: float = 1e-3,
|
|
448
452
|
verbose: bool = True,
|
|
449
|
-
pool:
|
|
453
|
+
pool: multiprocessing.pool.Pool | None = None,
|
|
450
454
|
) -> XEBCharacterizationResult:
|
|
451
455
|
"""Run a classical optimization to fit phased fsim parameters to experimental data, and
|
|
452
456
|
thereby characterize PhasedFSim-like gates.
|
|
@@ -496,13 +500,13 @@ def characterize_phased_fsim_parameters_with_xeb(
|
|
|
496
500
|
method='nelder-mead',
|
|
497
501
|
)
|
|
498
502
|
|
|
499
|
-
final_params:
|
|
503
|
+
final_params: cirq.ParamDictType = dict(zip(names, optimization_result.x))
|
|
500
504
|
fidelities_df = benchmark_2q_xeb_fidelities(
|
|
501
505
|
sampled_df, parameterized_circuits, cycle_depths, param_resolver=final_params
|
|
502
506
|
)
|
|
503
507
|
return XEBCharacterizationResult(
|
|
504
508
|
optimization_results={pair: optimization_result},
|
|
505
|
-
final_params={pair: final_params},
|
|
509
|
+
final_params={pair: final_params},
|
|
506
510
|
fidelities_df=fidelities_df,
|
|
507
511
|
)
|
|
508
512
|
|
|
@@ -512,7 +516,7 @@ class _CharacterizePhasedFsimParametersWithXebClosure:
|
|
|
512
516
|
"""A closure object to wrap `characterize_phased_fsim_parameters_with_xeb` for use in
|
|
513
517
|
multiprocessing."""
|
|
514
518
|
|
|
515
|
-
parameterized_circuits:
|
|
519
|
+
parameterized_circuits: list[cirq.Circuit]
|
|
516
520
|
cycle_depths: Sequence[int]
|
|
517
521
|
options: XEBCharacterizationOptions
|
|
518
522
|
initial_simplex_step_size: float = 0.1
|
|
@@ -535,13 +539,13 @@ class _CharacterizePhasedFsimParametersWithXebClosure:
|
|
|
535
539
|
|
|
536
540
|
def characterize_phased_fsim_parameters_with_xeb_by_pair(
|
|
537
541
|
sampled_df: pd.DataFrame,
|
|
538
|
-
parameterized_circuits:
|
|
542
|
+
parameterized_circuits: list[cirq.Circuit],
|
|
539
543
|
cycle_depths: Sequence[int],
|
|
540
544
|
options: XEBCharacterizationOptions,
|
|
541
545
|
initial_simplex_step_size: float = 0.1,
|
|
542
546
|
xatol: float = 1e-3,
|
|
543
547
|
fatol: float = 1e-3,
|
|
544
|
-
pool:
|
|
548
|
+
pool: multiprocessing.pool.Pool | None = None,
|
|
545
549
|
) -> XEBCharacterizationResult:
|
|
546
550
|
"""Run a classical optimization to fit phased fsim parameters to experimental data, and
|
|
547
551
|
thereby characterize PhasedFSim-like gates grouped by pairs.
|
|
@@ -614,7 +618,7 @@ def exponential_decay(cycle_depths: np.ndarray, a: float, layer_fid: float) -> n
|
|
|
614
618
|
|
|
615
619
|
def _fit_exponential_decay(
|
|
616
620
|
cycle_depths: np.ndarray, fidelities: np.ndarray
|
|
617
|
-
) ->
|
|
621
|
+
) -> tuple[float, float, float, float]:
|
|
618
622
|
"""Fit an exponential model fidelity = a * layer_fid**x using nonlinear least squares.
|
|
619
623
|
|
|
620
624
|
This uses `exponential_decay` as the function to fit with parameters `a` and `layer_fid`.
|
cirq/experiments/xeb_sampling.py
CHANGED
|
@@ -11,23 +11,16 @@
|
|
|
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
|
"""Estimation of fidelity associated with experimental circuit executions."""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
15
19
|
import os
|
|
16
20
|
import time
|
|
17
21
|
import uuid
|
|
18
22
|
from dataclasses import dataclass
|
|
19
|
-
from typing import
|
|
20
|
-
Any,
|
|
21
|
-
Callable,
|
|
22
|
-
ContextManager,
|
|
23
|
-
Dict,
|
|
24
|
-
List,
|
|
25
|
-
Optional,
|
|
26
|
-
Sequence,
|
|
27
|
-
Set,
|
|
28
|
-
Tuple,
|
|
29
|
-
TYPE_CHECKING,
|
|
30
|
-
)
|
|
23
|
+
from typing import Any, Callable, ContextManager, Sequence, TYPE_CHECKING
|
|
31
24
|
|
|
32
25
|
import numpy as np
|
|
33
26
|
import pandas as pd
|
|
@@ -52,16 +45,16 @@ class _Sample2qXEBTask:
|
|
|
52
45
|
cycle_depth: int
|
|
53
46
|
layer_i: int
|
|
54
47
|
combination_i: int
|
|
55
|
-
prepared_circuit:
|
|
56
|
-
combination:
|
|
48
|
+
prepared_circuit: cirq.AbstractCircuit
|
|
49
|
+
combination: list[int]
|
|
57
50
|
|
|
58
51
|
|
|
59
52
|
class _SampleInBatches:
|
|
60
53
|
def __init__(
|
|
61
54
|
self,
|
|
62
|
-
sampler:
|
|
55
|
+
sampler: cirq.Sampler,
|
|
63
56
|
repetitions: int,
|
|
64
|
-
combinations_by_layer:
|
|
57
|
+
combinations_by_layer: list[CircuitLibraryCombination],
|
|
65
58
|
):
|
|
66
59
|
"""This closure will execute a list of `tasks` with one call to
|
|
67
60
|
`run_batch` on the provided sampler for a given number of repetitions.
|
|
@@ -76,7 +69,7 @@ class _SampleInBatches:
|
|
|
76
69
|
self.repetitions = repetitions
|
|
77
70
|
self.combinations_by_layer = combinations_by_layer
|
|
78
71
|
|
|
79
|
-
def __call__(self, tasks:
|
|
72
|
+
def __call__(self, tasks: list[_Sample2qXEBTask]) -> list[dict[str, Any]]:
|
|
80
73
|
prepared_circuits = [task.prepared_circuit for task in tasks]
|
|
81
74
|
results = self.sampler.run_batch(prepared_circuits, repetitions=self.repetitions)
|
|
82
75
|
timestamp = time.time()
|
|
@@ -107,9 +100,9 @@ class _SampleInBatches:
|
|
|
107
100
|
return records
|
|
108
101
|
|
|
109
102
|
|
|
110
|
-
def _verify_and_get_two_qubits_from_circuits(circuits: Sequence[
|
|
103
|
+
def _verify_and_get_two_qubits_from_circuits(circuits: Sequence[cirq.Circuit]):
|
|
111
104
|
"""Make sure each of the provided circuits uses the same two qubits and return them."""
|
|
112
|
-
all_qubits_set:
|
|
105
|
+
all_qubits_set: set[cirq.Qid] = set()
|
|
113
106
|
all_qubits_set = all_qubits_set.union(*(circuit.all_qubits() for circuit in circuits))
|
|
114
107
|
all_qubits_list = sorted(all_qubits_set)
|
|
115
108
|
if len(all_qubits_list) != 2:
|
|
@@ -119,7 +112,7 @@ def _verify_and_get_two_qubits_from_circuits(circuits: Sequence['cirq.Circuit'])
|
|
|
119
112
|
return all_qubits_list
|
|
120
113
|
|
|
121
114
|
|
|
122
|
-
def _verify_two_line_qubits_from_circuits(circuits: Sequence[
|
|
115
|
+
def _verify_two_line_qubits_from_circuits(circuits: Sequence[cirq.Circuit]):
|
|
123
116
|
if _verify_and_get_two_qubits_from_circuits(circuits) != devices.LineQubit.range(2):
|
|
124
117
|
raise ValueError(
|
|
125
118
|
"`circuits` should be a sequence of circuits each operating "
|
|
@@ -165,16 +158,16 @@ class _ZippedCircuit:
|
|
|
165
158
|
any behavior. It is propagated to the output result object.
|
|
166
159
|
"""
|
|
167
160
|
|
|
168
|
-
wide_circuit:
|
|
169
|
-
pairs:
|
|
170
|
-
combination:
|
|
161
|
+
wide_circuit: cirq.Circuit
|
|
162
|
+
pairs: list[tuple[cirq.Qid, cirq.Qid]]
|
|
163
|
+
combination: list[int]
|
|
171
164
|
layer_i: int
|
|
172
165
|
combination_i: int
|
|
173
166
|
|
|
174
167
|
|
|
175
168
|
def _get_combinations_by_layer_for_isolated_xeb(
|
|
176
|
-
circuits: Sequence[
|
|
177
|
-
) ->
|
|
169
|
+
circuits: Sequence[cirq.Circuit],
|
|
170
|
+
) -> tuple[list[CircuitLibraryCombination], list[cirq.Circuit]]:
|
|
178
171
|
"""Helper function used in `sample_2q_xeb_circuits`.
|
|
179
172
|
|
|
180
173
|
This creates a CircuitLibraryCombination object for isolated XEB. First, the qubits
|
|
@@ -195,8 +188,8 @@ def _get_combinations_by_layer_for_isolated_xeb(
|
|
|
195
188
|
|
|
196
189
|
|
|
197
190
|
def _zip_circuits(
|
|
198
|
-
circuits: Sequence[
|
|
199
|
-
) ->
|
|
191
|
+
circuits: Sequence[cirq.Circuit], combinations_by_layer: list[CircuitLibraryCombination]
|
|
192
|
+
) -> list[_ZippedCircuit]:
|
|
200
193
|
"""Helper function used in `sample_2q_xeb_circuits` to zip together circuits.
|
|
201
194
|
|
|
202
195
|
This takes a sequence of narrow `circuits` and "zips" them together according to the
|
|
@@ -210,7 +203,7 @@ def _zip_circuits(
|
|
|
210
203
|
):
|
|
211
204
|
raise ValueError("`combinations_by_layer` has invalid indices.")
|
|
212
205
|
|
|
213
|
-
zipped_circuits:
|
|
206
|
+
zipped_circuits: list[_ZippedCircuit] = []
|
|
214
207
|
for layer_i, layer_combinations in enumerate(combinations_by_layer):
|
|
215
208
|
for combination_i, combination in enumerate(layer_combinations.combinations):
|
|
216
209
|
wide_circuit = Circuit.zip(
|
|
@@ -232,10 +225,10 @@ def _zip_circuits(
|
|
|
232
225
|
|
|
233
226
|
|
|
234
227
|
def _generate_sample_2q_xeb_tasks(
|
|
235
|
-
zipped_circuits:
|
|
236
|
-
) ->
|
|
228
|
+
zipped_circuits: list[_ZippedCircuit], cycle_depths: Sequence[int]
|
|
229
|
+
) -> list[_Sample2qXEBTask]:
|
|
237
230
|
"""Helper function used in `sample_2q_xeb_circuits` to prepare circuits in sampling tasks."""
|
|
238
|
-
tasks:
|
|
231
|
+
tasks: list[_Sample2qXEBTask] = []
|
|
239
232
|
for cycle_depth in cycle_depths:
|
|
240
233
|
for zipped_circuit in zipped_circuits:
|
|
241
234
|
circuit_depth = cycle_depth * 2 + 1
|
|
@@ -259,14 +252,14 @@ def _generate_sample_2q_xeb_tasks(
|
|
|
259
252
|
|
|
260
253
|
|
|
261
254
|
def _execute_sample_2q_xeb_tasks_in_batches(
|
|
262
|
-
tasks:
|
|
263
|
-
sampler:
|
|
264
|
-
combinations_by_layer:
|
|
255
|
+
tasks: list[_Sample2qXEBTask],
|
|
256
|
+
sampler: cirq.Sampler,
|
|
257
|
+
combinations_by_layer: list[CircuitLibraryCombination],
|
|
265
258
|
repetitions: int,
|
|
266
259
|
batch_size: int,
|
|
267
260
|
progress_bar: Callable[..., ContextManager],
|
|
268
|
-
dataset_directory:
|
|
269
|
-
) ->
|
|
261
|
+
dataset_directory: str | None = None,
|
|
262
|
+
) -> list[dict[str, Any]]:
|
|
270
263
|
"""Helper function used in `sample_2q_xeb_circuits` to batch and execute sampling tasks."""
|
|
271
264
|
n_tasks = len(tasks)
|
|
272
265
|
batched_tasks = [tasks[i : i + batch_size] for i in range(0, n_tasks, batch_size)]
|
|
@@ -288,16 +281,16 @@ def _execute_sample_2q_xeb_tasks_in_batches(
|
|
|
288
281
|
|
|
289
282
|
|
|
290
283
|
def sample_2q_xeb_circuits(
|
|
291
|
-
sampler:
|
|
292
|
-
circuits: Sequence[
|
|
284
|
+
sampler: cirq.Sampler,
|
|
285
|
+
circuits: Sequence[cirq.Circuit],
|
|
293
286
|
cycle_depths: Sequence[int],
|
|
294
287
|
*,
|
|
295
288
|
repetitions: int = 10_000,
|
|
296
289
|
batch_size: int = 9,
|
|
297
|
-
progress_bar:
|
|
298
|
-
combinations_by_layer:
|
|
299
|
-
shuffle:
|
|
300
|
-
dataset_directory:
|
|
290
|
+
progress_bar: Callable[..., ContextManager] | None = tqdm.tqdm,
|
|
291
|
+
combinations_by_layer: list[CircuitLibraryCombination] | None = None,
|
|
292
|
+
shuffle: cirq.RANDOM_STATE_OR_SEED_LIKE | None = None,
|
|
293
|
+
dataset_directory: str | None = None,
|
|
301
294
|
):
|
|
302
295
|
"""Sample two-qubit XEB circuits given a sampler.
|
|
303
296
|
|
|
@@ -348,8 +341,8 @@ def sample_2q_xeb_circuits(
|
|
|
348
341
|
# Construct truncated-with-measurement circuits to run.
|
|
349
342
|
tasks = _generate_sample_2q_xeb_tasks(zipped_circuits, cycle_depths)
|
|
350
343
|
if shuffle is not None:
|
|
351
|
-
|
|
352
|
-
|
|
344
|
+
prng = value.parse_random_state(shuffle)
|
|
345
|
+
prng.shuffle(tasks) # type: ignore[arg-type]
|
|
353
346
|
|
|
354
347
|
# Batch and run tasks.
|
|
355
348
|
records = _execute_sample_2q_xeb_tasks_in_batches(
|
|
@@ -11,6 +11,9 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
14
17
|
import glob
|
|
15
18
|
import itertools
|
|
16
19
|
from typing import Iterable
|
|
@@ -11,9 +11,13 @@
|
|
|
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
|
"""Estimation of fidelity associated with experimental circuit executions."""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
15
19
|
from dataclasses import dataclass
|
|
16
|
-
from typing import Any,
|
|
20
|
+
from typing import Any, Sequence, TYPE_CHECKING
|
|
17
21
|
|
|
18
22
|
import numpy as np
|
|
19
23
|
import pandas as pd
|
|
@@ -32,17 +36,17 @@ class _Simulate2qXEBTask:
|
|
|
32
36
|
|
|
33
37
|
circuit_i: int
|
|
34
38
|
cycle_depths: Sequence[int]
|
|
35
|
-
circuit:
|
|
36
|
-
param_resolver:
|
|
39
|
+
circuit: cirq.Circuit
|
|
40
|
+
param_resolver: cirq.ParamResolverOrSimilarType
|
|
37
41
|
|
|
38
42
|
|
|
39
43
|
class _Simulate_2q_XEB_Circuit:
|
|
40
44
|
"""Closure used in `simulate_2q_xeb_circuits` so it works with multiprocessing."""
|
|
41
45
|
|
|
42
|
-
def __init__(self, simulator:
|
|
46
|
+
def __init__(self, simulator: cirq.SimulatesIntermediateState):
|
|
43
47
|
self.simulator = simulator
|
|
44
48
|
|
|
45
|
-
def __call__(self, task: _Simulate2qXEBTask) ->
|
|
49
|
+
def __call__(self, task: _Simulate2qXEBTask) -> list[dict[str, Any]]:
|
|
46
50
|
"""Helper function for simulating a given (circuit, cycle_depth)."""
|
|
47
51
|
circuit_i = task.circuit_i
|
|
48
52
|
cycle_depths = set(task.cycle_depths)
|
|
@@ -53,7 +57,7 @@ class _Simulate_2q_XEB_Circuit:
|
|
|
53
57
|
if max(cycle_depths) > circuit_max_cycle_depth:
|
|
54
58
|
raise ValueError("`circuit` was not long enough to compute all `cycle_depths`.")
|
|
55
59
|
|
|
56
|
-
records:
|
|
60
|
+
records: list[dict[str, Any]] = []
|
|
57
61
|
for moment_i, step_result in enumerate(
|
|
58
62
|
self.simulator.simulate_moment_steps(circuit=circuit, param_resolver=param_resolver)
|
|
59
63
|
):
|
|
@@ -77,11 +81,11 @@ class _Simulate_2q_XEB_Circuit:
|
|
|
77
81
|
|
|
78
82
|
|
|
79
83
|
def simulate_2q_xeb_circuits(
|
|
80
|
-
circuits: Sequence[
|
|
84
|
+
circuits: Sequence[cirq.Circuit],
|
|
81
85
|
cycle_depths: Sequence[int],
|
|
82
|
-
param_resolver:
|
|
83
|
-
pool:
|
|
84
|
-
simulator:
|
|
86
|
+
param_resolver: cirq.ParamResolverOrSimilarType = None,
|
|
87
|
+
pool: multiprocessing.pool.Pool | None = None,
|
|
88
|
+
simulator: cirq.SimulatesIntermediateState | None = None,
|
|
85
89
|
):
|
|
86
90
|
"""Simulate two-qubit XEB circuits.
|
|
87
91
|
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
from __future__ import annotations
|
|
16
16
|
|
|
17
17
|
import multiprocessing
|
|
18
|
-
from typing import Any,
|
|
18
|
+
from typing import Any, Iterator, Sequence
|
|
19
19
|
|
|
20
20
|
import numpy as np
|
|
21
21
|
import pandas as pd
|
|
@@ -74,7 +74,7 @@ def test_simulate_circuit_length_validation():
|
|
|
74
74
|
_ = simulate_2q_xeb_circuits(circuits=circuits, cycle_depths=cycle_depths)
|
|
75
75
|
|
|
76
76
|
|
|
77
|
-
def _ref_simulate_2q_xeb_circuit(task:
|
|
77
|
+
def _ref_simulate_2q_xeb_circuit(task: dict[str, Any]):
|
|
78
78
|
"""Helper function for simulating a given (circuit, cycle_depth)."""
|
|
79
79
|
circuit_i = task['circuit_i']
|
|
80
80
|
cycle_depth = task['cycle_depth']
|
|
@@ -95,10 +95,10 @@ def _ref_simulate_2q_xeb_circuit(task: Dict[str, Any]):
|
|
|
95
95
|
|
|
96
96
|
|
|
97
97
|
def _ref_simulate_2q_xeb_circuits(
|
|
98
|
-
circuits: Sequence[
|
|
98
|
+
circuits: Sequence[cirq.Circuit],
|
|
99
99
|
cycle_depths: Sequence[int],
|
|
100
|
-
param_resolver:
|
|
101
|
-
pool:
|
|
100
|
+
param_resolver: cirq.ParamResolverOrSimilarType = None,
|
|
101
|
+
pool: multiprocessing.pool.Pool | None = None,
|
|
102
102
|
):
|
|
103
103
|
"""Reference implementation for `simulate_2q_xeb_circuits` that
|
|
104
104
|
does each circuit independently instead of using intermediate states.
|
|
@@ -13,9 +13,12 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
"""Provides a method to do z-phase calibration for excitation-preserving gates."""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
16
19
|
import multiprocessing
|
|
17
20
|
import multiprocessing.pool
|
|
18
|
-
from typing import Any,
|
|
21
|
+
from typing import Any, Sequence, TYPE_CHECKING
|
|
19
22
|
|
|
20
23
|
import matplotlib.pyplot as plt
|
|
21
24
|
import numpy as np
|
|
@@ -32,20 +35,20 @@ if TYPE_CHECKING:
|
|
|
32
35
|
|
|
33
36
|
|
|
34
37
|
def z_phase_calibration_workflow(
|
|
35
|
-
sampler:
|
|
36
|
-
qubits:
|
|
37
|
-
two_qubit_gate:
|
|
38
|
-
options:
|
|
38
|
+
sampler: cirq.Sampler,
|
|
39
|
+
qubits: Sequence[cirq.GridQubit] | None = None,
|
|
40
|
+
two_qubit_gate: cirq.Gate = ops.CZ,
|
|
41
|
+
options: xeb_fitting.XEBPhasedFSimCharacterizationOptions | None = None,
|
|
39
42
|
n_repetitions: int = 10**4,
|
|
40
43
|
n_combinations: int = 10,
|
|
41
44
|
n_circuits: int = 20,
|
|
42
45
|
cycle_depths: Sequence[int] = tuple(np.arange(3, 100, 20)),
|
|
43
|
-
random_state:
|
|
46
|
+
random_state: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
|
|
44
47
|
atol: float = 1e-3,
|
|
45
|
-
num_workers_or_pool:
|
|
46
|
-
pairs:
|
|
48
|
+
num_workers_or_pool: int | multiprocessing.pool.Pool = -1,
|
|
49
|
+
pairs: Sequence[tuple[cirq.GridQubit, cirq.GridQubit]] | None = None,
|
|
47
50
|
tags: Sequence[Any] = (),
|
|
48
|
-
) ->
|
|
51
|
+
) -> tuple[xeb_fitting.XEBCharacterizationResult, pd.DataFrame]:
|
|
49
52
|
"""Perform z-phase calibration for excitation-preserving gates.
|
|
50
53
|
|
|
51
54
|
For a given excitation-preserving two-qubit gate we assume an error model that can be described
|
|
@@ -88,7 +91,7 @@ def z_phase_calibration_workflow(
|
|
|
88
91
|
- A `pd.DataFrame` comparing the before and after fidelities.
|
|
89
92
|
"""
|
|
90
93
|
|
|
91
|
-
pool:
|
|
94
|
+
pool: multiprocessing.pool.Pool | None = None
|
|
92
95
|
local_pool = False
|
|
93
96
|
if isinstance(num_workers_or_pool, multiprocessing.pool.Pool):
|
|
94
97
|
pool = num_workers_or_pool # pragma: no cover
|
|
@@ -145,20 +148,20 @@ def z_phase_calibration_workflow(
|
|
|
145
148
|
|
|
146
149
|
|
|
147
150
|
def calibrate_z_phases(
|
|
148
|
-
sampler:
|
|
149
|
-
qubits:
|
|
150
|
-
two_qubit_gate:
|
|
151
|
-
options:
|
|
151
|
+
sampler: cirq.Sampler,
|
|
152
|
+
qubits: Sequence[cirq.GridQubit] | None = None,
|
|
153
|
+
two_qubit_gate: cirq.Gate = ops.CZ,
|
|
154
|
+
options: xeb_fitting.XEBPhasedFSimCharacterizationOptions | None = None,
|
|
152
155
|
n_repetitions: int = 10**4,
|
|
153
156
|
n_combinations: int = 10,
|
|
154
157
|
n_circuits: int = 20,
|
|
155
158
|
cycle_depths: Sequence[int] = tuple(np.arange(3, 100, 20)),
|
|
156
|
-
random_state:
|
|
159
|
+
random_state: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
|
|
157
160
|
atol: float = 1e-3,
|
|
158
|
-
num_workers_or_pool:
|
|
159
|
-
pairs:
|
|
161
|
+
num_workers_or_pool: int | multiprocessing.pool.Pool = -1,
|
|
162
|
+
pairs: Sequence[tuple[cirq.GridQubit, cirq.GridQubit]] | None = None,
|
|
160
163
|
tags: Sequence[Any] = (),
|
|
161
|
-
) ->
|
|
164
|
+
) -> dict[tuple[cirq.Qid, cirq.Qid], cirq.PhasedFSimGate]:
|
|
162
165
|
"""Perform z-phase calibration for excitation-preserving gates.
|
|
163
166
|
|
|
164
167
|
For a given excitation-preserving two-qubit gate we assume an error model that can be described
|
|
@@ -238,12 +241,12 @@ def calibrate_z_phases(
|
|
|
238
241
|
|
|
239
242
|
|
|
240
243
|
def plot_z_phase_calibration_result(
|
|
241
|
-
before_after_df:
|
|
242
|
-
axes:
|
|
243
|
-
pairs:
|
|
244
|
+
before_after_df: pd.DataFrame,
|
|
245
|
+
axes: np.ndarray[tuple[int, int], np.dtype[np.object_]] | None = None,
|
|
246
|
+
pairs: Sequence[tuple[cirq.Qid, cirq.Qid]] | None = None,
|
|
244
247
|
*,
|
|
245
248
|
with_error_bars: bool = False,
|
|
246
|
-
) -> np.ndarray[
|
|
249
|
+
) -> np.ndarray[tuple[int, int], np.dtype[np.object_]]:
|
|
247
250
|
"""A helper method to plot the result of running z-phase calibration.
|
|
248
251
|
|
|
249
252
|
Note that the plotted fidelity is a statistical estimate of the true fidelity and as a result
|
|
@@ -287,7 +290,7 @@ def plot_z_phase_calibration_result(
|
|
|
287
290
|
return axes
|
|
288
291
|
|
|
289
292
|
|
|
290
|
-
def _z_angles(old: ops.PhasedFSimGate, new: ops.PhasedFSimGate) ->
|
|
293
|
+
def _z_angles(old: ops.PhasedFSimGate, new: ops.PhasedFSimGate) -> tuple[float, float, float]:
|
|
291
294
|
"""Computes a set of possible 3 z-phases that result in the change in gamma, zeta, and chi."""
|
|
292
295
|
# This procedure is the inverse of PhasedFSimGate.from_fsim_rz
|
|
293
296
|
delta_gamma = new.gamma - old.gamma
|
|
@@ -301,8 +304,8 @@ class CalibrationTransformer:
|
|
|
301
304
|
|
|
302
305
|
def __init__(
|
|
303
306
|
self,
|
|
304
|
-
target:
|
|
305
|
-
calibration_map:
|
|
307
|
+
target: cirq.Gate,
|
|
308
|
+
calibration_map: dict[tuple[cirq.Qid, cirq.Qid], cirq.PhasedFSimGate],
|
|
306
309
|
):
|
|
307
310
|
"""Create a CalibrationTransformer.
|
|
308
311
|
|
|
@@ -327,10 +330,10 @@ class CalibrationTransformer:
|
|
|
327
330
|
|
|
328
331
|
def __call__(
|
|
329
332
|
self,
|
|
330
|
-
circuit:
|
|
333
|
+
circuit: cirq.AbstractCircuit,
|
|
331
334
|
*,
|
|
332
|
-
context:
|
|
333
|
-
) ->
|
|
335
|
+
context: transformer_api.TransformerContext | None = None,
|
|
336
|
+
) -> cirq.Circuit:
|
|
334
337
|
"""Adds 3 ZPowGates around each calibrated gate to cancel the effect of Z phases.
|
|
335
338
|
|
|
336
339
|
Args:
|
|
@@ -340,7 +343,7 @@ class CalibrationTransformer:
|
|
|
340
343
|
Returns:
|
|
341
344
|
New circuit with the extra ZPowGates.
|
|
342
345
|
"""
|
|
343
|
-
new_moments:
|
|
346
|
+
new_moments: list[list[cirq.Operation] | cirq.Moment] = []
|
|
344
347
|
for moment in circuit:
|
|
345
348
|
before = []
|
|
346
349
|
after = []
|