cirq-core 1.5.0.dev20250409225226__py3-none-any.whl → 1.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of cirq-core might be problematic. Click here for more details.
- cirq/__init__.py +16 -17
- cirq/_compat.py +21 -20
- cirq/_compat_test.py +14 -34
- cirq/_doc.py +4 -2
- cirq/_import.py +8 -6
- cirq/_import_test.py +4 -2
- cirq/_version.py +6 -6
- cirq/_version_test.py +2 -2
- cirq/circuits/_block_diagram_drawer.py +11 -10
- cirq/circuits/_block_diagram_drawer_test.py +8 -6
- cirq/circuits/_box_drawing_character_data.py +8 -8
- cirq/circuits/_box_drawing_character_data_test.py +3 -1
- cirq/circuits/_bucket_priority_queue.py +9 -7
- cirq/circuits/_bucket_priority_queue_test.py +22 -20
- cirq/circuits/circuit.py +248 -172
- cirq/circuits/circuit_operation.py +73 -83
- cirq/circuits/circuit_operation_test.py +128 -90
- cirq/circuits/circuit_test.py +211 -151
- cirq/circuits/frozen_circuit.py +23 -60
- cirq/circuits/frozen_circuit_test.py +31 -8
- cirq/circuits/insert_strategy.py +7 -5
- cirq/circuits/insert_strategy_test.py +4 -2
- cirq/circuits/moment.py +88 -40
- cirq/circuits/moment_test.py +128 -51
- cirq/circuits/optimization_pass.py +5 -5
- cirq/circuits/optimization_pass_test.py +10 -10
- cirq/circuits/qasm_output.py +11 -11
- cirq/circuits/qasm_output_test.py +25 -22
- cirq/circuits/text_diagram_drawer.py +23 -38
- cirq/circuits/text_diagram_drawer_test.py +19 -17
- cirq/conftest.py +4 -3
- cirq/contrib/__init__.py +4 -4
- cirq/contrib/acquaintance/__init__.py +1 -1
- cirq/contrib/acquaintance/bipartite.py +5 -8
- cirq/contrib/acquaintance/bipartite_test.py +18 -13
- cirq/contrib/acquaintance/devices.py +2 -2
- cirq/contrib/acquaintance/devices_test.py +5 -3
- cirq/contrib/acquaintance/executor.py +5 -5
- cirq/contrib/acquaintance/executor_test.py +13 -9
- cirq/contrib/acquaintance/gates.py +18 -28
- cirq/contrib/acquaintance/gates_test.py +24 -20
- cirq/contrib/acquaintance/inspection_utils.py +8 -4
- cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
- cirq/contrib/acquaintance/mutation_utils.py +4 -4
- cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
- cirq/contrib/acquaintance/optimizers.py +4 -4
- cirq/contrib/acquaintance/optimizers_test.py +4 -1
- cirq/contrib/acquaintance/permutation.py +15 -27
- cirq/contrib/acquaintance/permutation_test.py +26 -17
- cirq/contrib/acquaintance/shift.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
- cirq/contrib/acquaintance/shift_test.py +8 -6
- cirq/contrib/acquaintance/strategies/cubic.py +2 -2
- cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
- cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
- cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
- cirq/contrib/acquaintance/testing.py +2 -0
- cirq/contrib/acquaintance/topological_sort.py +2 -2
- cirq/contrib/acquaintance/topological_sort_test.py +3 -1
- cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
- cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
- cirq/contrib/circuitdag/circuit_dag.py +4 -4
- cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
- cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
- cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
- cirq/contrib/graph_device/graph_device.py +12 -11
- cirq/contrib/graph_device/graph_device_test.py +18 -14
- cirq/contrib/graph_device/hypergraph.py +16 -14
- cirq/contrib/graph_device/hypergraph_test.py +13 -11
- cirq/contrib/graph_device/uniform_graph_device.py +6 -4
- cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
- cirq/contrib/hacks/disable_validation.py +6 -1
- cirq/contrib/hacks/disable_validation_test.py +3 -1
- cirq/contrib/json.py +31 -5
- cirq/contrib/json_test.py +6 -3
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/__init__.py +17 -0
- cirq/contrib/json_test_data/spec.py +32 -0
- cirq/contrib/noise_models/noise_models.py +119 -5
- cirq/contrib/noise_models/noise_models_test.py +37 -9
- cirq/contrib/paulistring/clifford_optimize.py +6 -4
- cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
- cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
- cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
- cirq/contrib/paulistring/optimize.py +2 -0
- cirq/contrib/paulistring/optimize_test.py +4 -3
- cirq/contrib/paulistring/pauli_string_dag.py +2 -0
- cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
- cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
- cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
- cirq/contrib/paulistring/recombine.py +6 -4
- cirq/contrib/paulistring/recombine_test.py +3 -1
- cirq/contrib/paulistring/separate.py +9 -6
- cirq/contrib/paulistring/separate_test.py +3 -1
- cirq/contrib/qasm_import/_lexer.py +3 -2
- cirq/contrib/qasm_import/_lexer_test.py +49 -13
- cirq/contrib/qasm_import/_parser.py +547 -83
- cirq/contrib/qasm_import/_parser_test.py +988 -97
- cirq/contrib/qasm_import/exception.py +2 -0
- cirq/contrib/qasm_import/qasm.py +8 -2
- cirq/contrib/qasm_import/qasm_test.py +7 -4
- cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
- cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
- cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
- cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
- cirq/contrib/qcircuit/qcircuit_test.py +10 -8
- cirq/contrib/quantum_volume/quantum_volume.py +31 -27
- cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
- cirq/contrib/quimb/density_matrix.py +15 -14
- cirq/contrib/quimb/density_matrix_test.py +10 -7
- cirq/contrib/quimb/grid_circuits.py +5 -2
- cirq/contrib/quimb/grid_circuits_test.py +3 -0
- cirq/contrib/quimb/mps_simulator.py +20 -20
- cirq/contrib/quimb/mps_simulator_test.py +3 -0
- cirq/contrib/quimb/state_vector.py +12 -11
- cirq/contrib/quimb/state_vector_test.py +3 -0
- cirq/contrib/quirk/export_to_quirk.py +5 -3
- cirq/contrib/quirk/export_to_quirk_test.py +18 -16
- cirq/contrib/quirk/linearize_circuit.py +2 -0
- cirq/contrib/quirk/quirk_gate.py +18 -17
- cirq/contrib/routing/device.py +5 -3
- cirq/contrib/routing/device_test.py +2 -0
- cirq/contrib/routing/greedy.py +10 -21
- cirq/contrib/routing/greedy_test.py +4 -2
- cirq/contrib/routing/initialization.py +2 -2
- cirq/contrib/routing/initialization_test.py +5 -3
- cirq/contrib/routing/router.py +9 -5
- cirq/contrib/routing/router_test.py +2 -0
- cirq/contrib/routing/swap_network.py +3 -3
- cirq/contrib/routing/swap_network_test.py +3 -1
- cirq/contrib/routing/utils.py +2 -2
- cirq/contrib/routing/utils_test.py +3 -0
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
- cirq/contrib/svg/svg.py +3 -3
- cirq/contrib/svg/svg_test.py +8 -5
- cirq/devices/device.py +4 -4
- cirq/devices/device_test.py +7 -4
- cirq/devices/grid_device_metadata.py +10 -10
- cirq/devices/grid_device_metadata_test.py +3 -0
- cirq/devices/grid_qubit.py +29 -21
- cirq/devices/grid_qubit_test.py +3 -0
- cirq/devices/insertion_noise_model.py +7 -7
- cirq/devices/insertion_noise_model_test.py +7 -5
- cirq/devices/line_qubit.py +13 -13
- cirq/devices/line_qubit_test.py +2 -0
- cirq/devices/named_topologies.py +18 -29
- cirq/devices/named_topologies_test.py +13 -10
- cirq/devices/noise_model.py +3 -3
- cirq/devices/noise_model_test.py +19 -15
- cirq/devices/noise_properties.py +15 -6
- cirq/devices/noise_properties_test.py +34 -3
- cirq/devices/noise_utils.py +11 -9
- cirq/devices/noise_utils_test.py +2 -0
- cirq/devices/superconducting_qubits_noise_properties.py +23 -22
- cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
- cirq/devices/thermal_noise_model.py +107 -37
- cirq/devices/thermal_noise_model_test.py +21 -0
- cirq/devices/unconstrained_device.py +5 -3
- cirq/devices/unconstrained_device_test.py +2 -0
- cirq/experiments/__init__.py +4 -2
- cirq/experiments/benchmarking/__init__.py +17 -0
- cirq/experiments/benchmarking/parallel_xeb.py +677 -0
- cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
- cirq/experiments/fidelity_estimation.py +14 -8
- cirq/experiments/fidelity_estimation_test.py +3 -0
- cirq/experiments/n_qubit_tomography.py +17 -16
- cirq/experiments/n_qubit_tomography_test.py +8 -5
- cirq/experiments/purity_estimation.py +2 -0
- cirq/experiments/purity_estimation_test.py +2 -0
- cirq/experiments/qubit_characterizations.py +207 -103
- cirq/experiments/qubit_characterizations_test.py +40 -12
- cirq/experiments/random_quantum_circuit_generation.py +56 -70
- cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
- cirq/experiments/readout_confusion_matrix.py +24 -22
- cirq/experiments/readout_confusion_matrix_test.py +2 -0
- cirq/experiments/single_qubit_readout_calibration.py +30 -15
- cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
- cirq/experiments/t1_decay_experiment.py +9 -7
- cirq/experiments/t1_decay_experiment_test.py +13 -11
- cirq/experiments/t2_decay_experiment.py +16 -13
- cirq/experiments/t2_decay_experiment_test.py +2 -0
- cirq/experiments/two_qubit_xeb.py +64 -57
- cirq/experiments/two_qubit_xeb_test.py +10 -6
- cirq/experiments/xeb_fitting.py +39 -35
- cirq/experiments/xeb_sampling.py +37 -44
- cirq/experiments/xeb_sampling_test.py +3 -0
- cirq/experiments/xeb_simulation.py +14 -10
- cirq/experiments/xeb_simulation_test.py +5 -5
- cirq/experiments/z_phase_calibration.py +32 -29
- cirq/experiments/z_phase_calibration_test.py +3 -4
- cirq/interop/quirk/cells/__init__.py +1 -1
- cirq/interop/quirk/cells/all_cells.py +7 -2
- cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
- cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
- cirq/interop/quirk/cells/cell.py +19 -28
- cirq/interop/quirk/cells/cell_test.py +3 -0
- cirq/interop/quirk/cells/composite_cell.py +13 -28
- cirq/interop/quirk/cells/composite_cell_test.py +2 -0
- cirq/interop/quirk/cells/control_cells.py +15 -15
- cirq/interop/quirk/cells/control_cells_test.py +7 -5
- cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
- cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
- cirq/interop/quirk/cells/ignored_cells.py +3 -0
- cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
- cirq/interop/quirk/cells/input_cells.py +7 -5
- cirq/interop/quirk/cells/input_cells_test.py +7 -5
- cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
- cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
- cirq/interop/quirk/cells/measurement_cells.py +5 -2
- cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
- cirq/interop/quirk/cells/parse.py +22 -23
- cirq/interop/quirk/cells/parse_test.py +12 -10
- cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
- cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
- cirq/interop/quirk/cells/scalar_cells.py +4 -1
- cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
- cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
- cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
- cirq/interop/quirk/cells/swap_cell.py +8 -6
- cirq/interop/quirk/cells/swap_cell_test.py +6 -4
- cirq/interop/quirk/cells/testing.py +6 -6
- cirq/interop/quirk/cells/testing_test.py +8 -6
- cirq/interop/quirk/cells/unsupported_cells.py +3 -0
- cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
- cirq/interop/quirk/url_to_circuit.py +23 -36
- cirq/interop/quirk/url_to_circuit_test.py +4 -1
- cirq/json_resolver_cache.py +14 -12
- cirq/linalg/__init__.py +4 -6
- cirq/linalg/combinators.py +7 -5
- cirq/linalg/combinators_test.py +10 -7
- cirq/linalg/decompositions.py +24 -35
- cirq/linalg/decompositions_test.py +3 -1
- cirq/linalg/diagonalize.py +6 -4
- cirq/linalg/diagonalize_test.py +15 -14
- cirq/linalg/operator_spaces.py +14 -14
- cirq/linalg/operator_spaces_test.py +13 -11
- cirq/linalg/predicates.py +18 -9
- cirq/linalg/predicates_test.py +5 -0
- cirq/linalg/tolerance.py +6 -3
- cirq/linalg/tolerance_test.py +6 -4
- cirq/linalg/transformations.py +23 -20
- cirq/linalg/transformations_test.py +73 -43
- cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
- cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
- cirq/neutral_atoms/neutral_atom_devices.py +2 -0
- cirq/ops/__init__.py +2 -0
- cirq/ops/arithmetic_operation.py +21 -21
- cirq/ops/arithmetic_operation_test.py +7 -8
- cirq/ops/boolean_hamiltonian.py +23 -22
- cirq/ops/boolean_hamiltonian_test.py +12 -9
- cirq/ops/classically_controlled_operation.py +31 -36
- cirq/ops/classically_controlled_operation_test.py +121 -117
- cirq/ops/clifford_gate.py +98 -81
- cirq/ops/clifford_gate_test.py +72 -57
- cirq/ops/common_channels.py +44 -44
- cirq/ops/common_channels_test.py +83 -81
- cirq/ops/common_gate_families.py +9 -7
- cirq/ops/common_gate_families_test.py +11 -7
- cirq/ops/common_gates.py +164 -183
- cirq/ops/common_gates_test.py +135 -95
- cirq/ops/control_values.py +23 -26
- cirq/ops/control_values_test.py +22 -20
- cirq/ops/controlled_gate.py +64 -112
- cirq/ops/controlled_gate_test.py +130 -35
- cirq/ops/controlled_operation.py +24 -35
- cirq/ops/controlled_operation_test.py +8 -6
- cirq/ops/dense_pauli_string.py +38 -49
- cirq/ops/dense_pauli_string_test.py +4 -2
- cirq/ops/diagonal_gate.py +18 -31
- cirq/ops/diagonal_gate_test.py +13 -13
- cirq/ops/eigen_gate.py +29 -29
- cirq/ops/eigen_gate_test.py +45 -28
- cirq/ops/fourier_transform.py +14 -20
- cirq/ops/fourier_transform_test.py +15 -12
- cirq/ops/fsim_gate.py +43 -42
- cirq/ops/fsim_gate_test.py +29 -29
- cirq/ops/gate_features.py +2 -0
- cirq/ops/gate_features_test.py +5 -3
- cirq/ops/gate_operation.py +43 -65
- cirq/ops/gate_operation_test.py +46 -42
- cirq/ops/gateset.py +28 -40
- cirq/ops/gateset_test.py +4 -2
- cirq/ops/global_phase_op.py +45 -20
- cirq/ops/global_phase_op_test.py +44 -20
- cirq/ops/greedy_qubit_manager.py +10 -8
- cirq/ops/greedy_qubit_manager_test.py +5 -3
- cirq/ops/identity.py +14 -12
- cirq/ops/identity_test.py +24 -20
- cirq/ops/kraus_channel.py +11 -8
- cirq/ops/kraus_channel_test.py +14 -11
- cirq/ops/linear_combinations.py +65 -77
- cirq/ops/linear_combinations_test.py +14 -9
- cirq/ops/matrix_gates.py +21 -18
- cirq/ops/matrix_gates_test.py +16 -0
- cirq/ops/measure_util.py +15 -20
- cirq/ops/measure_util_test.py +2 -0
- cirq/ops/measurement_gate.py +26 -37
- cirq/ops/measurement_gate_test.py +2 -0
- cirq/ops/mixed_unitary_channel.py +12 -9
- cirq/ops/mixed_unitary_channel_test.py +14 -11
- cirq/ops/named_qubit.py +16 -13
- cirq/ops/named_qubit_test.py +15 -13
- cirq/ops/op_tree.py +9 -7
- cirq/ops/op_tree_test.py +22 -19
- cirq/ops/parallel_gate.py +15 -17
- cirq/ops/parallel_gate_test.py +18 -16
- cirq/ops/parity_gates.py +23 -25
- cirq/ops/parity_gates_test.py +36 -32
- cirq/ops/pauli_gates.py +22 -21
- cirq/ops/pauli_gates_test.py +29 -20
- cirq/ops/pauli_interaction_gate.py +15 -19
- cirq/ops/pauli_interaction_gate_test.py +10 -8
- cirq/ops/pauli_measurement_gate.py +23 -35
- cirq/ops/pauli_measurement_gate_test.py +2 -0
- cirq/ops/pauli_string.py +92 -120
- cirq/ops/pauli_string_phasor.py +52 -45
- cirq/ops/pauli_string_phasor_test.py +4 -5
- cirq/ops/pauli_string_raw_types.py +9 -7
- cirq/ops/pauli_string_raw_types_test.py +2 -0
- cirq/ops/pauli_string_test.py +31 -154
- cirq/ops/pauli_sum_exponential.py +12 -12
- cirq/ops/pauli_sum_exponential_test.py +12 -10
- cirq/ops/permutation_gate.py +8 -6
- cirq/ops/permutation_gate_test.py +10 -8
- cirq/ops/phased_iswap_gate.py +16 -16
- cirq/ops/phased_iswap_gate_test.py +17 -15
- cirq/ops/phased_x_gate.py +16 -17
- cirq/ops/phased_x_gate_test.py +18 -16
- cirq/ops/phased_x_z_gate.py +24 -22
- cirq/ops/phased_x_z_gate_test.py +17 -11
- cirq/ops/projector.py +16 -11
- cirq/ops/projector_test.py +19 -16
- cirq/ops/qid_util.py +7 -5
- cirq/ops/qid_util_test.py +2 -0
- cirq/ops/qubit_manager.py +11 -9
- cirq/ops/qubit_manager_test.py +6 -4
- cirq/ops/qubit_order.py +11 -14
- cirq/ops/qubit_order_or_list.py +4 -2
- cirq/ops/qubit_order_test.py +12 -10
- cirq/ops/random_gate_channel.py +12 -10
- cirq/ops/random_gate_channel_test.py +14 -11
- cirq/ops/raw_types.py +109 -129
- cirq/ops/raw_types_test.py +63 -57
- cirq/ops/state_preparation_channel.py +7 -7
- cirq/ops/state_preparation_channel_test.py +11 -9
- cirq/ops/swap_gates.py +13 -15
- cirq/ops/swap_gates_test.py +19 -17
- cirq/ops/tags.py +5 -3
- cirq/ops/tags_test.py +4 -2
- cirq/ops/three_qubit_gates.py +43 -76
- cirq/ops/three_qubit_gates_test.py +19 -17
- cirq/ops/two_qubit_diagonal_gate.py +13 -13
- cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
- cirq/ops/uniform_superposition_gate.py +5 -3
- cirq/ops/uniform_superposition_gate_test.py +5 -3
- cirq/ops/wait_gate.py +17 -14
- cirq/ops/wait_gate_test.py +9 -6
- cirq/protocols/__init__.py +0 -3
- cirq/protocols/act_on_protocol.py +8 -6
- cirq/protocols/act_on_protocol_test.py +15 -12
- cirq/protocols/apply_channel_protocol.py +10 -14
- cirq/protocols/apply_channel_protocol_test.py +2 -0
- cirq/protocols/apply_mixture_protocol.py +13 -42
- cirq/protocols/apply_mixture_protocol_test.py +7 -5
- cirq/protocols/apply_unitary_protocol.py +39 -34
- cirq/protocols/apply_unitary_protocol_test.py +4 -1
- cirq/protocols/approximate_equality_protocol.py +2 -0
- cirq/protocols/approximate_equality_protocol_test.py +2 -0
- cirq/protocols/circuit_diagram_info_protocol.py +58 -42
- cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
- cirq/protocols/commutes_protocol.py +8 -7
- cirq/protocols/commutes_protocol_test.py +2 -0
- cirq/protocols/control_key_protocol.py +6 -4
- cirq/protocols/control_key_protocol_test.py +3 -1
- cirq/protocols/decompose_protocol.py +49 -48
- cirq/protocols/decompose_protocol_test.py +27 -16
- cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
- cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
- cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
- cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
- cirq/protocols/has_unitary_protocol.py +10 -6
- cirq/protocols/has_unitary_protocol_test.py +13 -8
- cirq/protocols/hash_from_pickle_test.py +2 -11
- cirq/protocols/inverse_protocol.py +13 -16
- cirq/protocols/inverse_protocol_test.py +5 -3
- cirq/protocols/json_serialization.py +35 -54
- cirq/protocols/json_serialization_test.py +14 -21
- cirq/protocols/json_test_data/CXSWAP.json +46 -0
- cirq/protocols/json_test_data/CXSWAP.repr +13 -0
- cirq/protocols/json_test_data/CZSWAP.json +46 -0
- cirq/protocols/json_test_data/CZSWAP.repr +13 -0
- cirq/protocols/json_test_data/CircuitOperation.json +6 -3
- cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
- cirq/protocols/json_test_data/Moment.json +24 -1
- cirq/protocols/json_test_data/Moment.repr +6 -1
- cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
- cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
- cirq/protocols/json_test_data/spec.py +6 -2
- cirq/protocols/kraus_protocol.py +47 -7
- cirq/protocols/kraus_protocol_test.py +86 -12
- cirq/protocols/measurement_key_protocol.py +15 -16
- cirq/protocols/measurement_key_protocol_test.py +13 -11
- cirq/protocols/mixture_protocol.py +7 -5
- cirq/protocols/mixture_protocol_test.py +4 -2
- cirq/protocols/mul_protocol.py +2 -3
- cirq/protocols/mul_protocol_test.py +2 -0
- cirq/protocols/pauli_expansion_protocol.py +6 -3
- cirq/protocols/pauli_expansion_protocol_test.py +5 -3
- cirq/protocols/phase_protocol.py +2 -0
- cirq/protocols/phase_protocol_test.py +3 -1
- cirq/protocols/pow_protocol.py +11 -16
- cirq/protocols/pow_protocol_test.py +2 -0
- cirq/protocols/qasm.py +14 -20
- cirq/protocols/qasm_test.py +6 -3
- cirq/protocols/qid_shape_protocol.py +8 -8
- cirq/protocols/qid_shape_protocol_test.py +3 -1
- cirq/protocols/resolve_parameters.py +5 -3
- cirq/protocols/resolve_parameters_test.py +8 -7
- cirq/protocols/trace_distance_bound.py +6 -4
- cirq/protocols/trace_distance_bound_test.py +3 -1
- cirq/protocols/unitary_protocol.py +17 -7
- cirq/protocols/unitary_protocol_test.py +12 -2
- cirq/qis/channels.py +6 -2
- cirq/qis/channels_test.py +20 -16
- cirq/qis/clifford_tableau.py +21 -19
- cirq/qis/clifford_tableau_test.py +2 -2
- cirq/qis/entropy.py +14 -3
- cirq/qis/entropy_test.py +3 -1
- cirq/qis/measures.py +13 -13
- cirq/qis/measures_test.py +20 -14
- cirq/qis/noise_utils.py +2 -0
- cirq/qis/noise_utils_test.py +9 -7
- cirq/qis/quantum_state_representation.py +7 -8
- cirq/qis/states.py +58 -56
- cirq/qis/states_test.py +2 -0
- cirq/sim/classical_simulator.py +23 -22
- cirq/sim/classical_simulator_test.py +2 -0
- cirq/sim/clifford/clifford_simulator.py +23 -21
- cirq/sim/clifford/clifford_simulator_test.py +7 -4
- cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
- cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
- cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
- cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
- cirq/sim/clifford/stabilizer_sampler.py +9 -7
- cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
- cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
- cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
- cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
- cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
- cirq/sim/density_matrix_simulation_state.py +26 -27
- cirq/sim/density_matrix_simulation_state_test.py +10 -8
- cirq/sim/density_matrix_simulator.py +30 -28
- cirq/sim/density_matrix_simulator_test.py +48 -48
- cirq/sim/density_matrix_utils.py +13 -11
- cirq/sim/density_matrix_utils_test.py +38 -36
- cirq/sim/mux.py +33 -31
- cirq/sim/mux_test.py +3 -0
- cirq/sim/simulation_product_state.py +15 -15
- cirq/sim/simulation_product_state_test.py +29 -26
- cirq/sim/simulation_state.py +29 -38
- cirq/sim/simulation_state_base.py +21 -32
- cirq/sim/simulation_state_test.py +15 -13
- cirq/sim/simulation_utils.py +5 -2
- cirq/sim/simulation_utils_test.py +5 -2
- cirq/sim/simulator.py +90 -106
- cirq/sim/simulator_base.py +33 -45
- cirq/sim/simulator_base_test.py +20 -15
- cirq/sim/simulator_test.py +23 -14
- cirq/sim/sparse_simulator.py +19 -17
- cirq/sim/sparse_simulator_test.py +41 -40
- cirq/sim/state_vector.py +15 -12
- cirq/sim/state_vector_simulation_state.py +31 -31
- cirq/sim/state_vector_simulation_state_test.py +16 -14
- cirq/sim/state_vector_simulator.py +17 -14
- cirq/sim/state_vector_simulator_test.py +2 -0
- cirq/sim/state_vector_test.py +6 -3
- cirq/study/flatten_expressions.py +16 -15
- cirq/study/flatten_expressions_test.py +13 -11
- cirq/study/resolver.py +18 -17
- cirq/study/resolver_test.py +22 -20
- cirq/study/result.py +17 -27
- cirq/study/result_test.py +2 -0
- cirq/study/sweepable.py +12 -10
- cirq/study/sweepable_test.py +3 -0
- cirq/study/sweeps.py +42 -61
- cirq/study/sweeps_test.py +33 -0
- cirq/testing/__init__.py +7 -11
- cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
- cirq/testing/circuit_compare.py +8 -17
- cirq/testing/circuit_compare_test.py +2 -0
- cirq/testing/consistent_act_on.py +13 -11
- cirq/testing/consistent_act_on_test.py +5 -3
- cirq/testing/consistent_channels.py +2 -0
- cirq/testing/consistent_channels_test.py +10 -8
- cirq/testing/consistent_controlled_gate_op.py +5 -5
- cirq/testing/consistent_controlled_gate_op_test.py +18 -18
- cirq/testing/consistent_decomposition.py +2 -2
- cirq/testing/consistent_decomposition_test.py +4 -2
- cirq/testing/consistent_pauli_expansion.py +2 -0
- cirq/testing/consistent_pauli_expansion_test.py +3 -1
- cirq/testing/consistent_phase_by.py +2 -0
- cirq/testing/consistent_phase_by_test.py +3 -1
- cirq/testing/consistent_protocols.py +14 -20
- cirq/testing/consistent_protocols_test.py +13 -11
- cirq/testing/consistent_qasm.py +6 -4
- cirq/testing/consistent_qasm_test.py +7 -7
- cirq/testing/consistent_resolve_parameters.py +2 -0
- cirq/testing/consistent_specified_has_unitary.py +2 -2
- cirq/testing/consistent_specified_has_unitary_test.py +6 -4
- cirq/testing/consistent_unitary.py +1 -0
- cirq/testing/consistent_unitary_test.py +4 -2
- cirq/testing/deprecation.py +5 -2
- cirq/testing/deprecation_test.py +5 -2
- cirq/testing/devices.py +7 -4
- cirq/testing/devices_test.py +7 -4
- cirq/testing/equals_tester.py +4 -2
- cirq/testing/equals_tester_test.py +21 -17
- cirq/testing/equivalent_basis_map.py +6 -4
- cirq/testing/equivalent_basis_map_test.py +6 -4
- cirq/testing/equivalent_repr_eval.py +6 -4
- cirq/testing/equivalent_repr_eval_test.py +5 -3
- cirq/testing/gate_features.py +2 -0
- cirq/testing/gate_features_test.py +7 -5
- cirq/testing/json.py +19 -15
- cirq/testing/json_test.py +5 -3
- cirq/testing/lin_alg_utils.py +10 -11
- cirq/testing/lin_alg_utils_test.py +14 -12
- cirq/testing/logs.py +7 -6
- cirq/testing/logs_test.py +9 -7
- cirq/testing/no_identifier_qubit.py +4 -2
- cirq/testing/no_identifier_qubit_test.py +5 -3
- cirq/testing/op_tree.py +2 -0
- cirq/testing/op_tree_test.py +4 -1
- cirq/testing/order_tester.py +2 -0
- cirq/testing/order_tester_test.py +8 -6
- cirq/testing/pytest_utils.py +2 -0
- cirq/testing/pytest_utils_test.py +4 -2
- cirq/testing/random_circuit.py +21 -20
- cirq/testing/random_circuit_test.py +12 -9
- cirq/testing/repr_pretty_tester.py +1 -0
- cirq/testing/repr_pretty_tester_test.py +5 -3
- cirq/testing/routing_devices.py +4 -1
- cirq/testing/routing_devices_test.py +9 -6
- cirq/testing/sample_circuits.py +4 -1
- cirq/testing/sample_circuits_test.py +3 -1
- cirq/testing/sample_gates.py +3 -0
- cirq/testing/sample_gates_test.py +5 -2
- cirq/transformers/__init__.py +11 -4
- cirq/transformers/align.py +9 -7
- cirq/transformers/align_test.py +2 -0
- cirq/transformers/analytical_decompositions/__init__.py +3 -6
- cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
- cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
- cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
- cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
- cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
- cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
- cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
- cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
- cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
- cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
- cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
- cirq/transformers/drop_empty_moments.py +5 -3
- cirq/transformers/drop_empty_moments_test.py +4 -2
- cirq/transformers/drop_negligible_operations.py +7 -5
- cirq/transformers/drop_negligible_operations_test.py +2 -0
- cirq/transformers/dynamical_decoupling.py +49 -42
- cirq/transformers/dynamical_decoupling_test.py +223 -205
- cirq/transformers/eject_phased_paulis.py +28 -26
- cirq/transformers/eject_phased_paulis_test.py +12 -9
- cirq/transformers/eject_z.py +12 -12
- cirq/transformers/eject_z_test.py +2 -2
- cirq/transformers/expand_composite.py +6 -4
- cirq/transformers/expand_composite_test.py +3 -1
- cirq/transformers/gauge_compiling/__init__.py +3 -1
- cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
- cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
- cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
- cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
- cirq/transformers/insertion_sort.py +8 -6
- cirq/transformers/insertion_sort_test.py +3 -1
- cirq/transformers/measurement_transformers.py +29 -29
- cirq/transformers/measurement_transformers_test.py +2 -0
- cirq/transformers/merge_k_qubit_gates.py +12 -10
- cirq/transformers/merge_k_qubit_gates_test.py +18 -18
- cirq/transformers/merge_single_qubit_gates.py +197 -20
- cirq/transformers/merge_single_qubit_gates_test.py +177 -5
- cirq/transformers/noise_adding.py +5 -3
- cirq/transformers/noise_adding_test.py +2 -0
- cirq/transformers/optimize_for_target_gateset.py +19 -17
- cirq/transformers/optimize_for_target_gateset_test.py +11 -8
- cirq/transformers/qubit_management_transformers.py +13 -11
- cirq/transformers/qubit_management_transformers_test.py +5 -3
- cirq/transformers/randomized_measurements.py +16 -14
- cirq/transformers/randomized_measurements_test.py +10 -4
- cirq/transformers/routing/initial_mapper.py +6 -4
- cirq/transformers/routing/initial_mapper_test.py +2 -0
- cirq/transformers/routing/line_initial_mapper.py +16 -14
- cirq/transformers/routing/line_initial_mapper_test.py +9 -7
- cirq/transformers/routing/mapping_manager.py +10 -10
- cirq/transformers/routing/mapping_manager_test.py +2 -0
- cirq/transformers/routing/route_circuit_cqc.py +33 -31
- cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
- cirq/transformers/routing/visualize_routed_circuit.py +8 -7
- cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
- cirq/transformers/stratify.py +17 -15
- cirq/transformers/stratify_test.py +3 -0
- cirq/transformers/symbolize.py +103 -0
- cirq/transformers/symbolize_test.py +62 -0
- cirq/transformers/synchronize_terminal_measurements.py +10 -10
- cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
- cirq/transformers/tag_transformers.py +97 -0
- cirq/transformers/tag_transformers_test.py +103 -0
- cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
- cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
- cirq/transformers/target_gatesets/cz_gateset.py +7 -5
- cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
- cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
- cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
- cirq/transformers/transformer_api.py +34 -47
- cirq/transformers/transformer_api_test.py +9 -8
- cirq/transformers/transformer_primitives.py +39 -49
- cirq/transformers/transformer_primitives_test.py +10 -17
- cirq/value/abc_alt.py +6 -4
- cirq/value/abc_alt_test.py +5 -3
- cirq/value/angle.py +11 -12
- cirq/value/angle_test.py +5 -3
- cirq/value/classical_data.py +27 -27
- cirq/value/classical_data_test.py +11 -8
- cirq/value/condition.py +26 -24
- cirq/value/condition_test.py +2 -0
- cirq/value/digits.py +14 -11
- cirq/value/digits_test.py +2 -0
- cirq/value/duration.py +23 -20
- cirq/value/duration_test.py +2 -0
- cirq/value/linear_dict.py +25 -30
- cirq/value/linear_dict_test.py +10 -8
- cirq/value/measurement_key.py +12 -12
- cirq/value/measurement_key_test.py +2 -0
- cirq/value/periodic_value.py +4 -4
- cirq/value/periodic_value_test.py +11 -7
- cirq/value/probability.py +3 -1
- cirq/value/probability_test.py +4 -2
- cirq/value/product_state.py +15 -13
- cirq/value/product_state_test.py +4 -1
- cirq/value/random_state.py +2 -0
- cirq/value/random_state_test.py +5 -3
- cirq/value/timestamp.py +11 -7
- cirq/value/timestamp_test.py +14 -12
- cirq/value/type_alias.py +4 -4
- cirq/value/value_equality_attr.py +8 -9
- cirq/value/value_equality_attr_test.py +14 -11
- cirq/vis/density_matrix.py +3 -3
- cirq/vis/density_matrix_test.py +20 -17
- cirq/vis/heatmap.py +24 -37
- cirq/vis/heatmap_test.py +3 -0
- cirq/vis/histogram.py +9 -6
- cirq/vis/histogram_test.py +5 -2
- cirq/vis/state_histogram.py +10 -8
- cirq/vis/state_histogram_test.py +7 -5
- cirq/vis/vis_utils.py +4 -1
- cirq/vis/vis_utils_test.py +4 -1
- cirq/work/collector.py +12 -18
- cirq/work/collector_test.py +15 -10
- cirq/work/observable_grouping.py +6 -7
- cirq/work/observable_grouping_test.py +10 -9
- cirq/work/observable_measurement.py +47 -45
- cirq/work/observable_measurement_data.py +22 -17
- cirq/work/observable_measurement_data_test.py +4 -1
- cirq/work/observable_measurement_test.py +48 -29
- cirq/work/observable_readout_calibration.py +5 -2
- cirq/work/observable_readout_calibration_test.py +5 -2
- cirq/work/observable_settings.py +13 -22
- cirq/work/observable_settings_test.py +9 -7
- cirq/work/pauli_sum_collector.py +12 -10
- cirq/work/pauli_sum_collector_test.py +9 -9
- cirq/work/sampler.py +42 -43
- cirq/work/sampler_test.py +31 -24
- cirq/work/zeros_sampler.py +6 -4
- cirq/work/zeros_sampler_test.py +7 -5
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
- cirq_core-1.6.0.dist-info/RECORD +1241 -0
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
- cirq_core-1.5.0.dev20250409225226.dist-info/RECORD +0 -1216
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
cirq/contrib/routing/greedy.py
CHANGED
|
@@ -15,18 +15,7 @@
|
|
|
15
15
|
from __future__ import annotations
|
|
16
16
|
|
|
17
17
|
import itertools
|
|
18
|
-
from typing import
|
|
19
|
-
Callable,
|
|
20
|
-
cast,
|
|
21
|
-
Dict,
|
|
22
|
-
Iterable,
|
|
23
|
-
List,
|
|
24
|
-
Optional,
|
|
25
|
-
Sequence,
|
|
26
|
-
Set,
|
|
27
|
-
Tuple,
|
|
28
|
-
TYPE_CHECKING,
|
|
29
|
-
)
|
|
18
|
+
from typing import Callable, cast, Iterable, Sequence, TYPE_CHECKING
|
|
30
19
|
|
|
31
20
|
import networkx as nx
|
|
32
21
|
import numpy as np
|
|
@@ -42,7 +31,7 @@ if TYPE_CHECKING:
|
|
|
42
31
|
import cirq
|
|
43
32
|
|
|
44
33
|
SWAP = cca.SwapPermutationGate()
|
|
45
|
-
QidPair =
|
|
34
|
+
QidPair = tuple[ops.Qid, ops.Qid]
|
|
46
35
|
|
|
47
36
|
|
|
48
37
|
def route_circuit_greedily(
|
|
@@ -106,7 +95,7 @@ class _GreedyRouter:
|
|
|
106
95
|
*,
|
|
107
96
|
max_search_radius: int = 1,
|
|
108
97
|
max_num_empty_steps: int = 5,
|
|
109
|
-
initial_mapping:
|
|
98
|
+
initial_mapping: dict[ops.Qid, ops.Qid] | None = None,
|
|
110
99
|
can_reorder: Callable[[ops.Operation, ops.Operation], bool] = lambda op1, op2: not set(
|
|
111
100
|
op1.qubits
|
|
112
101
|
)
|
|
@@ -117,7 +106,7 @@ class _GreedyRouter:
|
|
|
117
106
|
self.prng = value.parse_random_state(random_state)
|
|
118
107
|
|
|
119
108
|
self.device_graph = device_graph
|
|
120
|
-
self.physical_distances:
|
|
109
|
+
self.physical_distances: dict[QidPair, int] = {
|
|
121
110
|
(a, b): d
|
|
122
111
|
for a, neighbor_distances in nx.shortest_path_length(device_graph)
|
|
123
112
|
for b, d in neighbor_distances.items()
|
|
@@ -126,9 +115,9 @@ class _GreedyRouter:
|
|
|
126
115
|
self.remaining_dag = circuitdag.CircuitDag.from_circuit(circuit, can_reorder=can_reorder)
|
|
127
116
|
self.logical_qubits = list(self.remaining_dag.all_qubits())
|
|
128
117
|
self.physical_qubits = list(self.device_graph.nodes)
|
|
129
|
-
self.edge_sets:
|
|
118
|
+
self.edge_sets: dict[int, list[Sequence[QidPair]]] = {}
|
|
130
119
|
|
|
131
|
-
self.physical_ops:
|
|
120
|
+
self.physical_ops: list[ops.Operation] = []
|
|
132
121
|
|
|
133
122
|
self.set_initial_mapping(initial_mapping)
|
|
134
123
|
|
|
@@ -155,7 +144,7 @@ class _GreedyRouter:
|
|
|
155
144
|
logical qubits."""
|
|
156
145
|
return (self._log_to_phys[q] for q in qubits)
|
|
157
146
|
|
|
158
|
-
def phys_to_log(self, *qubits: cirq.Qid) -> Iterable[
|
|
147
|
+
def phys_to_log(self, *qubits: cirq.Qid) -> Iterable[ops.Qid | None]:
|
|
159
148
|
"""Returns an iterator over the logical qubits that map to the given
|
|
160
149
|
physical qubits."""
|
|
161
150
|
return (self._phys_to_log[q] for q in qubits)
|
|
@@ -176,7 +165,7 @@ class _GreedyRouter:
|
|
|
176
165
|
if l is not None:
|
|
177
166
|
self._log_to_phys[l] = p
|
|
178
167
|
|
|
179
|
-
def set_initial_mapping(self, initial_mapping:
|
|
168
|
+
def set_initial_mapping(self, initial_mapping: dict[ops.Qid, ops.Qid] | None = None):
|
|
180
169
|
"""Sets the internal state according to an initial mapping.
|
|
181
170
|
|
|
182
171
|
Args:
|
|
@@ -237,7 +226,7 @@ class _GreedyRouter:
|
|
|
237
226
|
logical qubits."""
|
|
238
227
|
return self.physical_distances[cast(QidPair, tuple(self.log_to_phys(*edge)))]
|
|
239
228
|
|
|
240
|
-
def swap_along_path(self, path:
|
|
229
|
+
def swap_along_path(self, path: tuple[ops.Qid]):
|
|
241
230
|
"""Adds SWAPs to move a logical qubit along a specified path."""
|
|
242
231
|
for i in range(len(path) - 1):
|
|
243
232
|
self.apply_swap(cast(QidPair, path[i : i + 2]))
|
|
@@ -317,7 +306,7 @@ class _GreedyRouter:
|
|
|
317
306
|
assert ops_are_consistent_with_device_graph(self.physical_ops, self.device_graph)
|
|
318
307
|
|
|
319
308
|
|
|
320
|
-
def _get_dominated_indices(vectors:
|
|
309
|
+
def _get_dominated_indices(vectors: list[np.ndarray]) -> set[int]:
|
|
321
310
|
"""Get the indices of vectors that are element-wise at least some other
|
|
322
311
|
vector.
|
|
323
312
|
"""
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
from multiprocessing import Process
|
|
16
18
|
|
|
17
19
|
import pytest
|
|
@@ -21,7 +23,7 @@ import cirq.contrib.routing as ccr
|
|
|
21
23
|
from cirq.contrib.routing.greedy import route_circuit_greedily
|
|
22
24
|
|
|
23
25
|
|
|
24
|
-
def test_bad_args():
|
|
26
|
+
def test_bad_args() -> None:
|
|
25
27
|
"""Test zero valued arguments in greedy router."""
|
|
26
28
|
circuit = cirq.testing.random_circuit(4, 2, 0.5, random_state=5)
|
|
27
29
|
device_graph = ccr.get_grid_device_graph(3, 2)
|
|
@@ -50,7 +52,7 @@ def create_hanging_routing_instance(circuit, device_graph):
|
|
|
50
52
|
)
|
|
51
53
|
|
|
52
54
|
|
|
53
|
-
def test_router_hanging():
|
|
55
|
+
def test_router_hanging() -> None:
|
|
54
56
|
"""Run a separate process and check if greedy router hits timeout (20s)."""
|
|
55
57
|
circuit, device_graph = create_circuit_and_device()
|
|
56
58
|
process = Process(target=create_hanging_routing_instance, args=[circuit, device_graph])
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
from __future__ import annotations
|
|
16
16
|
|
|
17
17
|
import itertools
|
|
18
|
-
from typing import cast,
|
|
18
|
+
from typing import cast, Hashable, TYPE_CHECKING
|
|
19
19
|
|
|
20
20
|
import networkx as nx
|
|
21
21
|
from sortedcontainers import SortedDict, SortedSet
|
|
@@ -35,7 +35,7 @@ def get_initial_mapping(
|
|
|
35
35
|
logical_graph: nx.Graph,
|
|
36
36
|
device_graph: nx.Graph,
|
|
37
37
|
random_state: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
|
|
38
|
-
) ->
|
|
38
|
+
) -> dict[ops.Qid, ops.Qid]:
|
|
39
39
|
"""Gets an initial mapping of logical to physical qubits for routing.
|
|
40
40
|
|
|
41
41
|
Args:
|
|
@@ -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 random
|
|
16
18
|
|
|
17
19
|
import networkx as nx
|
|
@@ -30,7 +32,7 @@ def get_seeded_initial_mapping(graph_seed, init_seed):
|
|
|
30
32
|
|
|
31
33
|
|
|
32
34
|
@pytest.mark.parametrize('seed', [random.randint(0, 2**32) for _ in range(10)])
|
|
33
|
-
def test_initialization_reproducible_with_seed(seed):
|
|
35
|
+
def test_initialization_reproducible_with_seed(seed) -> None:
|
|
34
36
|
wrappers = (lambda s: s, np.random.RandomState)
|
|
35
37
|
mappings = [
|
|
36
38
|
get_seeded_initial_mapping(seed, wrapper(seed)) for wrapper in wrappers for _ in range(5)
|
|
@@ -39,7 +41,7 @@ def test_initialization_reproducible_with_seed(seed):
|
|
|
39
41
|
eq.add_equality_group(*mappings)
|
|
40
42
|
|
|
41
43
|
|
|
42
|
-
def test_initialization_with_no_seed():
|
|
44
|
+
def test_initialization_with_no_seed() -> None:
|
|
43
45
|
graph_seed = random.randint(0, 2**32)
|
|
44
46
|
state = np.random.get_state()
|
|
45
47
|
mappings = []
|
|
@@ -50,7 +52,7 @@ def test_initialization_with_no_seed():
|
|
|
50
52
|
eq.add_equality_group(*mappings)
|
|
51
53
|
|
|
52
54
|
|
|
53
|
-
def test_initialization_reproducible_between_runs():
|
|
55
|
+
def test_initialization_reproducible_between_runs() -> None:
|
|
54
56
|
seed = 45
|
|
55
57
|
logical_graph = nx.erdos_renyi_graph(6, 0.5, seed=seed)
|
|
56
58
|
logical_graph = nx.relabel_nodes(logical_graph, cirq.LineQubit)
|
cirq/contrib/routing/router.py
CHANGED
|
@@ -12,13 +12,17 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from
|
|
15
|
+
from __future__ import annotations
|
|
16
16
|
|
|
17
|
-
import
|
|
17
|
+
from typing import Callable, TYPE_CHECKING
|
|
18
18
|
|
|
19
19
|
from cirq import circuits, protocols
|
|
20
20
|
from cirq.contrib.routing.greedy import route_circuit_greedily
|
|
21
|
-
|
|
21
|
+
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
import networkx as nx
|
|
24
|
+
|
|
25
|
+
from cirq.contrib.routing.swap_network import SwapNetwork
|
|
22
26
|
|
|
23
27
|
ROUTERS = {'greedy': route_circuit_greedily}
|
|
24
28
|
|
|
@@ -27,8 +31,8 @@ def route_circuit(
|
|
|
27
31
|
circuit: circuits.Circuit,
|
|
28
32
|
device_graph: nx.Graph,
|
|
29
33
|
*,
|
|
30
|
-
algo_name:
|
|
31
|
-
router:
|
|
34
|
+
algo_name: str | None = None,
|
|
35
|
+
router: Callable[..., SwapNetwork] | None = None,
|
|
32
36
|
**kwargs,
|
|
33
37
|
) -> SwapNetwork:
|
|
34
38
|
"""Routes a circuit on a given device.
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
from __future__ import annotations
|
|
16
16
|
|
|
17
|
-
from typing import
|
|
17
|
+
from typing import Iterable, TYPE_CHECKING
|
|
18
18
|
|
|
19
19
|
import cirq.contrib.acquaintance as cca
|
|
20
20
|
from cirq import ops
|
|
@@ -37,13 +37,13 @@ class SwapNetwork:
|
|
|
37
37
|
initial_mapping: The initial mapping from physical to logical qubits.
|
|
38
38
|
"""
|
|
39
39
|
|
|
40
|
-
def __init__(self, circuit: cirq.Circuit, initial_mapping:
|
|
40
|
+
def __init__(self, circuit: cirq.Circuit, initial_mapping: dict[cirq.Qid, cirq.Qid]) -> None:
|
|
41
41
|
if not all(isinstance(i, ops.Qid) for I in initial_mapping.items() for i in I):
|
|
42
42
|
raise ValueError('Mapping must be from Qids to Qids.')
|
|
43
43
|
self.circuit = circuit
|
|
44
44
|
self.initial_mapping = initial_mapping
|
|
45
45
|
|
|
46
|
-
def final_mapping(self) ->
|
|
46
|
+
def final_mapping(self) -> dict[cirq.Qid, cirq.Qid]:
|
|
47
47
|
mapping = dict(self.initial_mapping)
|
|
48
48
|
cca.update_mapping(mapping, self.circuit.all_operations())
|
|
49
49
|
return mapping
|
|
@@ -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 itertools
|
|
16
18
|
|
|
17
19
|
import pytest
|
|
@@ -79,5 +81,5 @@ def test_swap_network_str():
|
|
|
79
81
|
(3, 0): ───q(3)───ZZ───q(3)───╱1╲───q(2)───ZZ───q(2)───╲0╱───q(4)───ZZ───q(4)───╱1╲───q(0)───ZZ───q(0)───╲0╱───q(2)───ZZ───q(2)───╱1╲───q(1)───
|
|
80
82
|
│ │ │ │
|
|
81
83
|
(4, 0): ───q(4)────────q(4)─────────q(4)───ZZ───q(4)───╱1╲───q(2)────────q(2)─────────q(2)───ZZ───q(2)───╱1╲───q(0)────────q(0)─────────q(0)───
|
|
82
|
-
""".strip()
|
|
84
|
+
""".strip() # noqa: E501
|
|
83
85
|
assert actual_str == expected_str
|
cirq/contrib/routing/utils.py
CHANGED
|
@@ -16,7 +16,7 @@ from __future__ import annotations
|
|
|
16
16
|
|
|
17
17
|
import operator
|
|
18
18
|
import re
|
|
19
|
-
from typing import Callable, Iterable,
|
|
19
|
+
from typing import Callable, Iterable, TYPE_CHECKING
|
|
20
20
|
|
|
21
21
|
import networkx as nx
|
|
22
22
|
|
|
@@ -31,7 +31,7 @@ if TYPE_CHECKING:
|
|
|
31
31
|
BINARY_OP_PREDICATE = Callable[[ops.Operation, ops.Operation], bool]
|
|
32
32
|
|
|
33
33
|
|
|
34
|
-
def get_time_slices(dag: CircuitDag) ->
|
|
34
|
+
def get_time_slices(dag: CircuitDag) -> list[nx.Graph]:
|
|
35
35
|
"""Slices the DAG into logical graphs.
|
|
36
36
|
|
|
37
37
|
Each time slice is a graph whose vertices are qubits and whose edges
|
|
@@ -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 networkx as nx
|
|
15
18
|
import pytest
|
|
16
19
|
|
|
@@ -11,21 +11,27 @@
|
|
|
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
|
"""Tools for running circuits in a shuffled order with readout error benchmarking."""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
15
19
|
import time
|
|
16
|
-
from typing import
|
|
20
|
+
from typing import TYPE_CHECKING
|
|
17
21
|
|
|
18
22
|
import numpy as np
|
|
19
23
|
|
|
20
24
|
from cirq import circuits, ops, protocols, work
|
|
21
25
|
from cirq.experiments import SingleQubitReadoutCalibrationResult
|
|
22
|
-
|
|
26
|
+
|
|
27
|
+
if TYPE_CHECKING:
|
|
28
|
+
from cirq.study import ResultDict
|
|
23
29
|
|
|
24
30
|
|
|
25
31
|
def _validate_input(
|
|
26
32
|
input_circuits: list[circuits.Circuit],
|
|
27
|
-
circuit_repetitions:
|
|
28
|
-
rng_or_seed:
|
|
33
|
+
circuit_repetitions: int | list[int],
|
|
34
|
+
rng_or_seed: np.random.Generator | int,
|
|
29
35
|
num_random_bitstrings: int,
|
|
30
36
|
readout_repetitions: int,
|
|
31
37
|
):
|
|
@@ -153,12 +159,12 @@ def _analyze_readout_results(
|
|
|
153
159
|
def run_shuffled_with_readout_benchmarking(
|
|
154
160
|
input_circuits: list[circuits.Circuit],
|
|
155
161
|
sampler: work.Sampler,
|
|
156
|
-
circuit_repetitions:
|
|
157
|
-
rng_or_seed:
|
|
162
|
+
circuit_repetitions: int | list[int],
|
|
163
|
+
rng_or_seed: np.random.Generator | int,
|
|
158
164
|
num_random_bitstrings: int = 100,
|
|
159
165
|
readout_repetitions: int = 1000,
|
|
160
|
-
qubits:
|
|
161
|
-
) -> tuple[list[ResultDict],
|
|
166
|
+
qubits: list[ops.Qid] | list[list[ops.Qid]] | None = None,
|
|
167
|
+
) -> tuple[list[ResultDict], dict[tuple[ops.Qid, ...], SingleQubitReadoutCalibrationResult]]:
|
|
162
168
|
"""Run the circuits in a shuffled order with readout error benchmarking.
|
|
163
169
|
|
|
164
170
|
Args:
|
|
@@ -186,7 +192,7 @@ def run_shuffled_with_readout_benchmarking(
|
|
|
186
192
|
)
|
|
187
193
|
|
|
188
194
|
# If input qubits is None, extract qubits from input circuits
|
|
189
|
-
qubits_to_measure:
|
|
195
|
+
qubits_to_measure: list[list[ops.Qid]] = []
|
|
190
196
|
if qubits is None:
|
|
191
197
|
qubits_set: set[ops.Qid] = set()
|
|
192
198
|
for circuit in input_circuits:
|
|
@@ -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 itertools
|
|
15
18
|
|
|
16
19
|
import numpy as np
|
cirq/contrib/svg/svg.py
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
from typing import cast,
|
|
5
|
+
from typing import cast, TYPE_CHECKING
|
|
6
6
|
|
|
7
7
|
import matplotlib.font_manager
|
|
8
8
|
import matplotlib.textpath
|
|
@@ -63,7 +63,7 @@ def _text(x: float, y: float, text: str, fontsize: int = 14):
|
|
|
63
63
|
|
|
64
64
|
def _fit_horizontal(
|
|
65
65
|
tdd: cirq.TextDiagramDrawer, ref_boxwidth: float, col_padding: float
|
|
66
|
-
) ->
|
|
66
|
+
) -> tuple[list[float], list[float]]:
|
|
67
67
|
"""Figure out the horizontal spacing of columns to fit everything in.
|
|
68
68
|
|
|
69
69
|
Returns:
|
|
@@ -93,7 +93,7 @@ def _fit_horizontal(
|
|
|
93
93
|
|
|
94
94
|
def _fit_vertical(
|
|
95
95
|
tdd: cirq.TextDiagramDrawer, ref_boxheight: float, row_padding: float
|
|
96
|
-
) ->
|
|
96
|
+
) -> tuple[list[float], list[float], dict[float, int]]:
|
|
97
97
|
"""Return data structures used to turn tdd vertical coordinates into
|
|
98
98
|
well-spaced SVG coordinates.
|
|
99
99
|
|
cirq/contrib/svg/svg_test.py
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
# pylint: disable=wrong-or-nonexistent-copyright-notice
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
2
5
|
import IPython.display
|
|
3
6
|
import numpy as np
|
|
4
7
|
import pytest
|
|
@@ -7,7 +10,7 @@ import cirq
|
|
|
7
10
|
from cirq.contrib.svg import circuit_to_svg, SVGCircuit
|
|
8
11
|
|
|
9
12
|
|
|
10
|
-
def test_svg():
|
|
13
|
+
def test_svg() -> None:
|
|
11
14
|
a, b, c = cirq.LineQubit.range(3)
|
|
12
15
|
|
|
13
16
|
svg_text = circuit_to_svg(
|
|
@@ -26,7 +29,7 @@ def test_svg():
|
|
|
26
29
|
assert '</svg>' in svg_text
|
|
27
30
|
|
|
28
31
|
|
|
29
|
-
def test_svg_noise():
|
|
32
|
+
def test_svg_noise() -> None:
|
|
30
33
|
noise_model = cirq.ConstantQubitNoiseModel(cirq.DepolarizingChannel(p=1e-3))
|
|
31
34
|
q = cirq.LineQubit(0)
|
|
32
35
|
circuit = cirq.Circuit(cirq.X(q))
|
|
@@ -35,12 +38,12 @@ def test_svg_noise():
|
|
|
35
38
|
assert '>D(0.001)</text>' in svg
|
|
36
39
|
|
|
37
40
|
|
|
38
|
-
def test_validation():
|
|
41
|
+
def test_validation() -> None:
|
|
39
42
|
with pytest.raises(ValueError):
|
|
40
43
|
circuit_to_svg(cirq.Circuit())
|
|
41
44
|
|
|
42
45
|
|
|
43
|
-
def test_empty_moments():
|
|
46
|
+
def test_empty_moments() -> None:
|
|
44
47
|
a, b = cirq.LineQubit.range(2)
|
|
45
48
|
svg_1 = circuit_to_svg(
|
|
46
49
|
cirq.Circuit(
|
|
@@ -73,7 +76,7 @@ def test_empty_moments():
|
|
|
73
76
|
('A[<virtual>]B[cirq.VirtualTag()]C>D<E', 'ABC>D<E'),
|
|
74
77
|
],
|
|
75
78
|
)
|
|
76
|
-
def test_gate_with_less_greater_str(symbol, svg_symbol):
|
|
79
|
+
def test_gate_with_less_greater_str(symbol, svg_symbol) -> None:
|
|
77
80
|
class CustomGate(cirq.Gate):
|
|
78
81
|
def _num_qubits_(self) -> int:
|
|
79
82
|
return 1
|
cirq/devices/device.py
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
from __future__ import annotations
|
|
16
16
|
|
|
17
17
|
import abc
|
|
18
|
-
from typing import
|
|
18
|
+
from typing import Iterable, TYPE_CHECKING
|
|
19
19
|
|
|
20
20
|
import networkx as nx
|
|
21
21
|
|
|
@@ -59,7 +59,7 @@ class Device(metaclass=abc.ABCMeta):
|
|
|
59
59
|
"""
|
|
60
60
|
|
|
61
61
|
@property
|
|
62
|
-
def metadata(self) ->
|
|
62
|
+
def metadata(self) -> DeviceMetadata | None:
|
|
63
63
|
"""Returns the associated Metadata with the device if applicable.
|
|
64
64
|
|
|
65
65
|
Returns:
|
|
@@ -116,11 +116,11 @@ class DeviceMetadata:
|
|
|
116
116
|
directional coupling, undirected edges indicate bi-directional
|
|
117
117
|
coupling.
|
|
118
118
|
"""
|
|
119
|
-
self._qubits_set:
|
|
119
|
+
self._qubits_set: frozenset[cirq.Qid] = frozenset(qubits)
|
|
120
120
|
self._nx_graph = nx_graph
|
|
121
121
|
|
|
122
122
|
@property
|
|
123
|
-
def qubit_set(self) ->
|
|
123
|
+
def qubit_set(self) -> frozenset[cirq.Qid]:
|
|
124
124
|
"""Returns the set of qubits on the device.
|
|
125
125
|
|
|
126
126
|
Returns:
|
cirq/devices/device_test.py
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
# pylint: disable=wrong-or-nonexistent-copyright-notice
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
2
5
|
import networkx as nx
|
|
3
6
|
|
|
4
7
|
import cirq
|
|
5
8
|
|
|
6
9
|
|
|
7
|
-
def test_device_metadata():
|
|
10
|
+
def test_device_metadata() -> None:
|
|
8
11
|
class RawDevice(cirq.Device):
|
|
9
12
|
pass
|
|
10
13
|
|
|
11
14
|
assert RawDevice().metadata is None
|
|
12
15
|
|
|
13
16
|
|
|
14
|
-
def test_metadata():
|
|
17
|
+
def test_metadata() -> None:
|
|
15
18
|
qubits = cirq.LineQubit.range(4)
|
|
16
19
|
graph = nx.star_graph(3)
|
|
17
20
|
metadata = cirq.DeviceMetadata(qubits, graph)
|
|
@@ -19,7 +22,7 @@ def test_metadata():
|
|
|
19
22
|
assert metadata.nx_graph == graph
|
|
20
23
|
|
|
21
24
|
|
|
22
|
-
def test_metadata_json_load_logic():
|
|
25
|
+
def test_metadata_json_load_logic() -> None:
|
|
23
26
|
qubits = cirq.LineQubit.range(4)
|
|
24
27
|
graph = nx.star_graph(3)
|
|
25
28
|
metadata = cirq.DeviceMetadata(qubits, graph)
|
|
@@ -27,7 +30,7 @@ def test_metadata_json_load_logic():
|
|
|
27
30
|
assert metadata == cirq.read_json(json_text=str_rep)
|
|
28
31
|
|
|
29
32
|
|
|
30
|
-
def test_metadata_equality():
|
|
33
|
+
def test_metadata_equality() -> None:
|
|
31
34
|
qubits = cirq.LineQubit.range(4)
|
|
32
35
|
graph = nx.star_graph(3)
|
|
33
36
|
graph2 = nx.star_graph(3)
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
from __future__ import annotations
|
|
18
18
|
|
|
19
|
-
from typing import cast,
|
|
19
|
+
from typing import cast, Iterable, Mapping, TYPE_CHECKING
|
|
20
20
|
|
|
21
21
|
import networkx as nx
|
|
22
22
|
|
|
@@ -33,10 +33,10 @@ class GridDeviceMetadata(device.DeviceMetadata):
|
|
|
33
33
|
|
|
34
34
|
def __init__(
|
|
35
35
|
self,
|
|
36
|
-
qubit_pairs: Iterable[
|
|
36
|
+
qubit_pairs: Iterable[tuple[cirq.GridQubit, cirq.GridQubit]],
|
|
37
37
|
gateset: cirq.Gateset,
|
|
38
|
-
gate_durations:
|
|
39
|
-
all_qubits:
|
|
38
|
+
gate_durations: Mapping[cirq.GateFamily, cirq.Duration] | None = None,
|
|
39
|
+
all_qubits: Iterable[cirq.GridQubit] | None = None,
|
|
40
40
|
compilation_target_gatesets: Iterable[cirq.CompilationTargetGateset] = (),
|
|
41
41
|
):
|
|
42
42
|
"""Create a GridDeviceMetadata object.
|
|
@@ -118,16 +118,16 @@ class GridDeviceMetadata(device.DeviceMetadata):
|
|
|
118
118
|
self._gate_durations = gate_durations
|
|
119
119
|
|
|
120
120
|
@property
|
|
121
|
-
def qubit_set(self) ->
|
|
121
|
+
def qubit_set(self) -> frozenset[cirq.GridQubit]:
|
|
122
122
|
"""Returns the set of grid qubits on the device.
|
|
123
123
|
|
|
124
124
|
Returns:
|
|
125
125
|
Frozenset of qubits on device.
|
|
126
126
|
"""
|
|
127
|
-
return cast(
|
|
127
|
+
return cast(frozenset['cirq.GridQubit'], super().qubit_set)
|
|
128
128
|
|
|
129
129
|
@property
|
|
130
|
-
def qubit_pairs(self) ->
|
|
130
|
+
def qubit_pairs(self) -> frozenset[frozenset[cirq.GridQubit]]:
|
|
131
131
|
"""Returns the set of all couple-able qubits on the device.
|
|
132
132
|
|
|
133
133
|
Each element in the outer frozenset is a 2-element frozenset representing a bidirectional
|
|
@@ -136,7 +136,7 @@ class GridDeviceMetadata(device.DeviceMetadata):
|
|
|
136
136
|
return self._qubit_pairs
|
|
137
137
|
|
|
138
138
|
@property
|
|
139
|
-
def isolated_qubits(self) ->
|
|
139
|
+
def isolated_qubits(self) -> frozenset[cirq.GridQubit]:
|
|
140
140
|
"""Returns the set of all isolated qubits on the device (if applicable)."""
|
|
141
141
|
return self._isolated_qubits
|
|
142
142
|
|
|
@@ -146,12 +146,12 @@ class GridDeviceMetadata(device.DeviceMetadata):
|
|
|
146
146
|
return self._gateset
|
|
147
147
|
|
|
148
148
|
@property
|
|
149
|
-
def compilation_target_gatesets(self) ->
|
|
149
|
+
def compilation_target_gatesets(self) -> tuple[cirq.CompilationTargetGateset, ...]:
|
|
150
150
|
"""Returns a sequence of valid `cirq.CompilationTargetGateset`s for this device."""
|
|
151
151
|
return self._compilation_target_gatesets
|
|
152
152
|
|
|
153
153
|
@property
|
|
154
|
-
def gate_durations(self) ->
|
|
154
|
+
def gate_durations(self) -> Mapping[cirq.GateFamily, cirq.Duration] | None:
|
|
155
155
|
"""Get a dictionary mapping from gate family to duration for gates.
|
|
156
156
|
|
|
157
157
|
To look up the duration of a specific gate instance / gate type / operation which is part of
|
|
@@ -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
|
+
|
|
14
15
|
"""Tests for GridDevicemetadata."""
|
|
15
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
16
19
|
import networkx as nx
|
|
17
20
|
import pytest
|
|
18
21
|
|