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/testing/routing_devices.py
CHANGED
|
@@ -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
|
"""Provides test devices that can validate circuits during a routing procedure."""
|
|
15
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
16
19
|
from typing import TYPE_CHECKING
|
|
17
20
|
|
|
18
21
|
import networkx as nx
|
|
@@ -39,7 +42,7 @@ class RoutingTestingDevice(devices.Device):
|
|
|
39
42
|
def metadata(self) -> devices.DeviceMetadata:
|
|
40
43
|
return self._metadata
|
|
41
44
|
|
|
42
|
-
def validate_operation(self, operation:
|
|
45
|
+
def validate_operation(self, operation: cirq.Operation) -> None:
|
|
43
46
|
if not self._metadata.qubit_set.issuperset(operation.qubits):
|
|
44
47
|
raise ValueError(f'Qubits not on device: {operation.qubits!r}.')
|
|
45
48
|
|
|
@@ -11,13 +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
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
14
17
|
import networkx as nx
|
|
15
18
|
import pytest
|
|
16
19
|
|
|
17
20
|
import cirq
|
|
18
21
|
|
|
19
22
|
|
|
20
|
-
def test_grid_device():
|
|
23
|
+
def test_grid_device() -> None:
|
|
21
24
|
rect_device = cirq.testing.construct_grid_device(5, 7)
|
|
22
25
|
rect_device_graph = rect_device.metadata.nx_graph
|
|
23
26
|
isomorphism_class = nx.Graph()
|
|
@@ -33,7 +36,7 @@ def test_grid_device():
|
|
|
33
36
|
assert nx.is_isomorphic(isomorphism_class, rect_device_graph)
|
|
34
37
|
|
|
35
38
|
|
|
36
|
-
def test_grid_op_validation():
|
|
39
|
+
def test_grid_op_validation() -> None:
|
|
37
40
|
device = cirq.testing.construct_grid_device(5, 7)
|
|
38
41
|
|
|
39
42
|
with pytest.raises(ValueError, match="Qubits not on device"):
|
|
@@ -56,7 +59,7 @@ def test_grid_op_validation():
|
|
|
56
59
|
device.validate_operation(cirq.CNOT(cirq.GridQubit(0, 0), cirq.GridQubit(1, 0)))
|
|
57
60
|
|
|
58
61
|
|
|
59
|
-
def test_ring_device():
|
|
62
|
+
def test_ring_device() -> None:
|
|
60
63
|
undirected_device = cirq.testing.construct_ring_device(5)
|
|
61
64
|
undirected_device_graph = undirected_device.metadata.nx_graph
|
|
62
65
|
assert all(q in undirected_device_graph.nodes for q in cirq.LineQubit.range(5))
|
|
@@ -74,7 +77,7 @@ def test_ring_device():
|
|
|
74
77
|
assert nx.is_isomorphic(isomorphism_class, directed_device_graph)
|
|
75
78
|
|
|
76
79
|
|
|
77
|
-
def test_ring_op_validation():
|
|
80
|
+
def test_ring_op_validation() -> None:
|
|
78
81
|
directed_device = cirq.testing.construct_ring_device(5, directed=True)
|
|
79
82
|
undirected_device = cirq.testing.construct_ring_device(5, directed=False)
|
|
80
83
|
|
|
@@ -93,7 +96,7 @@ def test_ring_op_validation():
|
|
|
93
96
|
directed_device.validate_operation(cirq.CNOT(cirq.LineQubit(0), cirq.LineQubit(1)))
|
|
94
97
|
|
|
95
98
|
|
|
96
|
-
def test_allowed_multi_qubit_gates():
|
|
99
|
+
def test_allowed_multi_qubit_gates() -> None:
|
|
97
100
|
device = cirq.testing.construct_ring_device(5)
|
|
98
101
|
|
|
99
102
|
device.validate_operation(cirq.MeasurementGate(1).on(cirq.LineQubit(0)))
|
|
@@ -106,7 +109,7 @@ def test_allowed_multi_qubit_gates():
|
|
|
106
109
|
device.validate_operation(cirq.CNOT(*cirq.LineQubit.range(2)))
|
|
107
110
|
|
|
108
111
|
|
|
109
|
-
def test_namedqubit_device():
|
|
112
|
+
def test_namedqubit_device() -> None:
|
|
110
113
|
# 4-star graph
|
|
111
114
|
nx_graph = nx.Graph([("a", "b"), ("a", "c"), ("a", "d")])
|
|
112
115
|
|
cirq/testing/sample_circuits.py
CHANGED
|
@@ -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
|
from typing import TYPE_CHECKING
|
|
15
18
|
|
|
16
19
|
from cirq import circuits, ops
|
|
@@ -19,7 +22,7 @@ if TYPE_CHECKING:
|
|
|
19
22
|
import cirq
|
|
20
23
|
|
|
21
24
|
|
|
22
|
-
def nonoptimal_toffoli_circuit(q0:
|
|
25
|
+
def nonoptimal_toffoli_circuit(q0: cirq.Qid, q1: cirq.Qid, q2: cirq.Qid) -> circuits.Circuit:
|
|
23
26
|
ret = circuits.Circuit(
|
|
24
27
|
ops.Y(q2) ** 0.5,
|
|
25
28
|
ops.X(q2),
|
|
@@ -12,10 +12,12 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import cirq
|
|
16
18
|
|
|
17
19
|
|
|
18
|
-
def test_nonoptimal_toffoli_circuit():
|
|
20
|
+
def test_nonoptimal_toffoli_circuit() -> None:
|
|
19
21
|
q0, q1, q2 = cirq.LineQubit.range(3)
|
|
20
22
|
cirq.testing.assert_allclose_up_to_global_phase(
|
|
21
23
|
cirq.testing.nonoptimal_toffoli_circuit(q0, q1, q2).unitary(),
|
cirq/testing/sample_gates.py
CHANGED
|
@@ -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 dataclasses
|
|
15
18
|
|
|
16
19
|
import numpy as np
|
|
@@ -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 numpy as np
|
|
15
18
|
import pytest
|
|
16
19
|
|
|
@@ -19,7 +22,7 @@ from cirq.testing import sample_gates
|
|
|
19
22
|
|
|
20
23
|
|
|
21
24
|
@pytest.mark.parametrize('theta', np.linspace(0, 2 * np.pi, 20))
|
|
22
|
-
def test_phase_using_clean_ancilla(theta: float):
|
|
25
|
+
def test_phase_using_clean_ancilla(theta: float) -> None:
|
|
23
26
|
g = sample_gates.PhaseUsingCleanAncilla(theta)
|
|
24
27
|
q = cirq.LineQubit(0)
|
|
25
28
|
qubit_order = cirq.QubitOrder.explicit([q], fallback=cirq.QubitOrder.DEFAULT)
|
|
@@ -45,7 +48,7 @@ def test_phase_using_clean_ancilla(theta: float):
|
|
|
45
48
|
'target_bitsize, phase_state', [(1, 0), (1, 1), (2, 0), (2, 1), (2, 2), (2, 3)]
|
|
46
49
|
)
|
|
47
50
|
@pytest.mark.parametrize('ancilla_bitsize', [1, 4])
|
|
48
|
-
def test_phase_using_dirty_ancilla(target_bitsize, phase_state, ancilla_bitsize):
|
|
51
|
+
def test_phase_using_dirty_ancilla(target_bitsize, phase_state, ancilla_bitsize) -> None:
|
|
49
52
|
g = sample_gates.PhaseUsingDirtyAncilla(phase_state, target_bitsize, ancilla_bitsize)
|
|
50
53
|
q = cirq.LineQubit.range(target_bitsize)
|
|
51
54
|
qubit_order = cirq.QubitOrder.explicit(q, fallback=cirq.QubitOrder.DEFAULT)
|
cirq/transformers/__init__.py
CHANGED
|
@@ -15,13 +15,12 @@
|
|
|
15
15
|
"""Classes and methods for transforming circuits."""
|
|
16
16
|
|
|
17
17
|
from cirq.transformers.analytical_decompositions import (
|
|
18
|
-
#
|
|
19
|
-
compute_cphase_exponents_for_fsim_decomposition as compute_cphase_exponents_for_fsim_decomposition,
|
|
18
|
+
compute_cphase_exponents_for_fsim_decomposition as compute_cphase_exponents_for_fsim_decomposition, # noqa: E501
|
|
20
19
|
decompose_cphase_into_two_fsim as decompose_cphase_into_two_fsim,
|
|
21
20
|
decompose_clifford_tableau_to_operations as decompose_clifford_tableau_to_operations,
|
|
22
21
|
decompose_multi_controlled_x as decompose_multi_controlled_x,
|
|
23
22
|
decompose_multi_controlled_rotation as decompose_multi_controlled_rotation,
|
|
24
|
-
decompose_two_qubit_interaction_into_four_fsim_gates as decompose_two_qubit_interaction_into_four_fsim_gates,
|
|
23
|
+
decompose_two_qubit_interaction_into_four_fsim_gates as decompose_two_qubit_interaction_into_four_fsim_gates, # noqa: E501
|
|
25
24
|
is_negligible_turn as is_negligible_turn,
|
|
26
25
|
parameterized_2q_op_to_sqrt_iswap_operations as parameterized_2q_op_to_sqrt_iswap_operations,
|
|
27
26
|
prepare_two_qubit_state_using_cz as prepare_two_qubit_state_using_cz,
|
|
@@ -36,7 +35,7 @@ from cirq.transformers.analytical_decompositions import (
|
|
|
36
35
|
three_qubit_matrix_to_operations as three_qubit_matrix_to_operations,
|
|
37
36
|
two_qubit_matrix_to_cz_isometry as two_qubit_matrix_to_cz_isometry,
|
|
38
37
|
two_qubit_matrix_to_cz_operations as two_qubit_matrix_to_cz_operations,
|
|
39
|
-
two_qubit_matrix_to_diagonal_and_cz_operations as two_qubit_matrix_to_diagonal_and_cz_operations,
|
|
38
|
+
two_qubit_matrix_to_diagonal_and_cz_operations as two_qubit_matrix_to_diagonal_and_cz_operations, # noqa: E501
|
|
40
39
|
two_qubit_matrix_to_ion_operations as two_qubit_matrix_to_ion_operations,
|
|
41
40
|
two_qubit_matrix_to_sqrt_iswap_operations as two_qubit_matrix_to_sqrt_iswap_operations,
|
|
42
41
|
unitary_to_pauli_string as unitary_to_pauli_string,
|
|
@@ -101,6 +100,7 @@ from cirq.transformers.merge_single_qubit_gates import (
|
|
|
101
100
|
merge_single_qubit_gates_to_phased_x_and_z as merge_single_qubit_gates_to_phased_x_and_z,
|
|
102
101
|
merge_single_qubit_gates_to_phxz as merge_single_qubit_gates_to_phxz,
|
|
103
102
|
merge_single_qubit_moments_to_phxz as merge_single_qubit_moments_to_phxz,
|
|
103
|
+
merge_single_qubit_gates_to_phxz_symbolized as merge_single_qubit_gates_to_phxz_symbolized,
|
|
104
104
|
)
|
|
105
105
|
|
|
106
106
|
from cirq.transformers.qubit_management_transformers import (
|
|
@@ -119,6 +119,8 @@ from cirq.transformers.transformer_api import (
|
|
|
119
119
|
transformer as transformer,
|
|
120
120
|
)
|
|
121
121
|
|
|
122
|
+
from cirq.transformers.tag_transformers import index_tags as index_tags, remove_tags as remove_tags
|
|
123
|
+
|
|
122
124
|
from cirq.transformers.transformer_primitives import (
|
|
123
125
|
map_moments as map_moments,
|
|
124
126
|
map_operations as map_operations,
|
|
@@ -133,6 +135,11 @@ from cirq.transformers.transformer_primitives import (
|
|
|
133
135
|
unroll_circuit_op_greedy_frontier as unroll_circuit_op_greedy_frontier,
|
|
134
136
|
)
|
|
135
137
|
|
|
138
|
+
from cirq.transformers.symbolize import (
|
|
139
|
+
SymbolizeTag as SymbolizeTag,
|
|
140
|
+
symbolize_single_qubit_gates_by_indexed_tags as symbolize_single_qubit_gates_by_indexed_tags,
|
|
141
|
+
)
|
|
142
|
+
|
|
136
143
|
from cirq.transformers.gauge_compiling import (
|
|
137
144
|
CZGaugeTransformer as CZGaugeTransformer,
|
|
138
145
|
ConstantGauge as ConstantGauge,
|
cirq/transformers/align.py
CHANGED
|
@@ -14,8 +14,10 @@
|
|
|
14
14
|
|
|
15
15
|
"""Transformer passes which align operations to the left or right of the circuit."""
|
|
16
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
17
19
|
import dataclasses
|
|
18
|
-
from typing import
|
|
20
|
+
from typing import TYPE_CHECKING
|
|
19
21
|
|
|
20
22
|
from cirq import circuits, ops
|
|
21
23
|
from cirq.transformers import transformer_api
|
|
@@ -26,9 +28,9 @@ if TYPE_CHECKING:
|
|
|
26
28
|
|
|
27
29
|
@transformer_api.transformer(add_deep_support=True)
|
|
28
30
|
def align_left(
|
|
29
|
-
circuit:
|
|
30
|
-
) ->
|
|
31
|
-
"""
|
|
31
|
+
circuit: cirq.AbstractCircuit, *, context: cirq.TransformerContext | None = None
|
|
32
|
+
) -> cirq.Circuit:
|
|
33
|
+
"""Aligns gates to the left of the circuit.
|
|
32
34
|
|
|
33
35
|
Note that tagged operations with tag in `context.tags_to_ignore` will continue to stay in their
|
|
34
36
|
original position and will not be aligned.
|
|
@@ -58,9 +60,9 @@ def align_left(
|
|
|
58
60
|
|
|
59
61
|
@transformer_api.transformer(add_deep_support=True)
|
|
60
62
|
def align_right(
|
|
61
|
-
circuit:
|
|
62
|
-
) ->
|
|
63
|
-
"""
|
|
63
|
+
circuit: cirq.AbstractCircuit, *, context: cirq.TransformerContext | None = None
|
|
64
|
+
) -> cirq.Circuit:
|
|
65
|
+
"""Aligns gates to the right of the circuit.
|
|
64
66
|
|
|
65
67
|
Note that tagged operations with tag in `context.tags_to_ignore` will continue to stay in their
|
|
66
68
|
original position and will not be aligned.
|
cirq/transformers/align_test.py
CHANGED
|
@@ -24,8 +24,7 @@ from cirq.transformers.analytical_decompositions.controlled_gate_decomposition i
|
|
|
24
24
|
)
|
|
25
25
|
|
|
26
26
|
from cirq.transformers.analytical_decompositions.cphase_to_fsim import (
|
|
27
|
-
#
|
|
28
|
-
compute_cphase_exponents_for_fsim_decomposition as compute_cphase_exponents_for_fsim_decomposition,
|
|
27
|
+
compute_cphase_exponents_for_fsim_decomposition as compute_cphase_exponents_for_fsim_decomposition, # noqa: E501
|
|
29
28
|
decompose_cphase_into_two_fsim as decompose_cphase_into_two_fsim,
|
|
30
29
|
)
|
|
31
30
|
|
|
@@ -47,14 +46,12 @@ from cirq.transformers.analytical_decompositions.three_qubit_decomposition impor
|
|
|
47
46
|
)
|
|
48
47
|
|
|
49
48
|
from cirq.transformers.analytical_decompositions.two_qubit_to_cz import (
|
|
50
|
-
# pylint: disable=line-too-long
|
|
51
49
|
two_qubit_matrix_to_cz_operations as two_qubit_matrix_to_cz_operations,
|
|
52
|
-
two_qubit_matrix_to_diagonal_and_cz_operations as two_qubit_matrix_to_diagonal_and_cz_operations,
|
|
50
|
+
two_qubit_matrix_to_diagonal_and_cz_operations as two_qubit_matrix_to_diagonal_and_cz_operations, # noqa: E501
|
|
53
51
|
)
|
|
54
52
|
|
|
55
53
|
from cirq.transformers.analytical_decompositions.two_qubit_to_fsim import (
|
|
56
|
-
#
|
|
57
|
-
decompose_two_qubit_interaction_into_four_fsim_gates as decompose_two_qubit_interaction_into_four_fsim_gates,
|
|
54
|
+
decompose_two_qubit_interaction_into_four_fsim_gates as decompose_two_qubit_interaction_into_four_fsim_gates, # noqa: E501
|
|
58
55
|
)
|
|
59
56
|
|
|
60
57
|
from cirq.transformers.analytical_decompositions.two_qubit_to_ms import (
|
|
@@ -14,8 +14,10 @@
|
|
|
14
14
|
|
|
15
15
|
"""Utility methods to decompose Clifford gates into circuits."""
|
|
16
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
17
19
|
import functools
|
|
18
|
-
from typing import
|
|
20
|
+
from typing import TYPE_CHECKING
|
|
19
21
|
|
|
20
22
|
import numpy as np
|
|
21
23
|
|
|
@@ -28,8 +30,8 @@ if TYPE_CHECKING:
|
|
|
28
30
|
def _X(
|
|
29
31
|
q: int,
|
|
30
32
|
args: sim.CliffordTableauSimulationState,
|
|
31
|
-
operations:
|
|
32
|
-
qubits:
|
|
33
|
+
operations: list[ops.Operation],
|
|
34
|
+
qubits: list[cirq.Qid],
|
|
33
35
|
):
|
|
34
36
|
protocols.act_on(ops.X, args, qubits=[qubits[q]], allow_decompose=False)
|
|
35
37
|
operations.append(ops.X(qubits[q]))
|
|
@@ -38,8 +40,8 @@ def _X(
|
|
|
38
40
|
def _Z(
|
|
39
41
|
q: int,
|
|
40
42
|
args: sim.CliffordTableauSimulationState,
|
|
41
|
-
operations:
|
|
42
|
-
qubits:
|
|
43
|
+
operations: list[ops.Operation],
|
|
44
|
+
qubits: list[cirq.Qid],
|
|
43
45
|
):
|
|
44
46
|
protocols.act_on(ops.Z, args, qubits=[qubits[q]], allow_decompose=False)
|
|
45
47
|
operations.append(ops.Z(qubits[q]))
|
|
@@ -48,8 +50,8 @@ def _Z(
|
|
|
48
50
|
def _Sdg(
|
|
49
51
|
q: int,
|
|
50
52
|
args: sim.CliffordTableauSimulationState,
|
|
51
|
-
operations:
|
|
52
|
-
qubits:
|
|
53
|
+
operations: list[ops.Operation],
|
|
54
|
+
qubits: list[cirq.Qid],
|
|
53
55
|
):
|
|
54
56
|
# Apply the tableau with S^\{dagger}
|
|
55
57
|
protocols.act_on(ops.S**-1, args, qubits=[qubits[q]], allow_decompose=False)
|
|
@@ -59,8 +61,8 @@ def _Sdg(
|
|
|
59
61
|
def _H(
|
|
60
62
|
q: int,
|
|
61
63
|
args: sim.CliffordTableauSimulationState,
|
|
62
|
-
operations:
|
|
63
|
-
qubits:
|
|
64
|
+
operations: list[ops.Operation],
|
|
65
|
+
qubits: list[cirq.Qid],
|
|
64
66
|
):
|
|
65
67
|
protocols.act_on(ops.H, args, qubits=[qubits[q]], allow_decompose=False)
|
|
66
68
|
operations.append(ops.H(qubits[q]))
|
|
@@ -70,8 +72,8 @@ def _CNOT(
|
|
|
70
72
|
q1: int,
|
|
71
73
|
q2: int,
|
|
72
74
|
args: sim.CliffordTableauSimulationState,
|
|
73
|
-
operations:
|
|
74
|
-
qubits:
|
|
75
|
+
operations: list[ops.Operation],
|
|
76
|
+
qubits: list[cirq.Qid],
|
|
75
77
|
):
|
|
76
78
|
protocols.act_on(ops.CNOT, args, qubits=[qubits[q1], qubits[q2]], allow_decompose=False)
|
|
77
79
|
operations.append(ops.CNOT(qubits[q1], qubits[q2]))
|
|
@@ -81,16 +83,16 @@ def _SWAP(
|
|
|
81
83
|
q1: int,
|
|
82
84
|
q2: int,
|
|
83
85
|
args: sim.CliffordTableauSimulationState,
|
|
84
|
-
operations:
|
|
85
|
-
qubits:
|
|
86
|
+
operations: list[ops.Operation],
|
|
87
|
+
qubits: list[cirq.Qid],
|
|
86
88
|
):
|
|
87
89
|
protocols.act_on(ops.SWAP, args, qubits=[qubits[q1], qubits[q2]], allow_decompose=False)
|
|
88
90
|
operations.append(ops.SWAP(qubits[q1], qubits[q2]))
|
|
89
91
|
|
|
90
92
|
|
|
91
93
|
def decompose_clifford_tableau_to_operations(
|
|
92
|
-
qubits:
|
|
93
|
-
) ->
|
|
94
|
+
qubits: list[cirq.Qid], clifford_tableau: qis.CliffordTableau
|
|
95
|
+
) -> list[ops.Operation]:
|
|
94
96
|
"""Decompose an n-qubit Clifford Tableau into a list of one/two qubit operations.
|
|
95
97
|
|
|
96
98
|
The implementation is based on Theorem 8 in [1].
|
|
@@ -114,7 +116,7 @@ def decompose_clifford_tableau_to_operations(
|
|
|
114
116
|
), "The provided clifford_tableau must satisfy the symplectic property."
|
|
115
117
|
|
|
116
118
|
t: qis.CliffordTableau = clifford_tableau.copy()
|
|
117
|
-
operations:
|
|
119
|
+
operations: list[ops.Operation] = []
|
|
118
120
|
args = sim.CliffordTableauSimulationState(
|
|
119
121
|
tableau=t, qubits=qubits, prng=np.random.RandomState()
|
|
120
122
|
)
|
|
@@ -12,7 +12,10 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import itertools
|
|
18
|
+
from typing import TYPE_CHECKING
|
|
16
19
|
|
|
17
20
|
import numpy as np
|
|
18
21
|
|
|
@@ -34,10 +37,10 @@ def _is_identity(matrix):
|
|
|
34
37
|
|
|
35
38
|
|
|
36
39
|
def _flatten(x):
|
|
37
|
-
return
|
|
40
|
+
return list(itertools.chain.from_iterable(x))
|
|
38
41
|
|
|
39
42
|
|
|
40
|
-
def _decompose_abc(matrix: np.ndarray) ->
|
|
43
|
+
def _decompose_abc(matrix: np.ndarray) -> tuple[np.ndarray, np.ndarray, np.ndarray, float]:
|
|
41
44
|
"""Decomposes 2x2 unitary matrix.
|
|
42
45
|
|
|
43
46
|
Returns 2x2 special unitary matrices A, B, C and phase delta, such that:
|
|
@@ -70,8 +73,8 @@ def _decompose_abc(matrix: np.ndarray) -> Tuple[np.ndarray, np.ndarray, np.ndarr
|
|
|
70
73
|
|
|
71
74
|
|
|
72
75
|
def _decompose_single_ctrl(
|
|
73
|
-
matrix: np.ndarray, control:
|
|
74
|
-
) ->
|
|
76
|
+
matrix: np.ndarray, control: cirq.Qid, target: cirq.Qid
|
|
77
|
+
) -> list[cirq.Operation]:
|
|
75
78
|
"""Decomposes controlled gate with one control.
|
|
76
79
|
|
|
77
80
|
See [1], chapter 5.1.
|
|
@@ -93,7 +96,7 @@ def _decompose_single_ctrl(
|
|
|
93
96
|
return result
|
|
94
97
|
|
|
95
98
|
|
|
96
|
-
def _ccnot_congruent(c0:
|
|
99
|
+
def _ccnot_congruent(c0: cirq.Qid, c1: cirq.Qid, target: cirq.Qid) -> list[cirq.Operation]:
|
|
97
100
|
"""Implements 3-qubit gate 'congruent' to CCNOT.
|
|
98
101
|
|
|
99
102
|
Returns sequence of operations which is equivalent to applying
|
|
@@ -111,8 +114,8 @@ def _ccnot_congruent(c0: 'cirq.Qid', c1: 'cirq.Qid', target: 'cirq.Qid') -> List
|
|
|
111
114
|
|
|
112
115
|
|
|
113
116
|
def decompose_multi_controlled_x(
|
|
114
|
-
controls:
|
|
115
|
-
) ->
|
|
117
|
+
controls: list[cirq.Qid], target: cirq.Qid, free_qubits: list[cirq.Qid]
|
|
118
|
+
) -> list[cirq.Operation]:
|
|
116
119
|
"""Implements action of multi-controlled Pauli X gate.
|
|
117
120
|
|
|
118
121
|
Result is guaranteed to consist exclusively of 1-qubit, CNOT and CCNOT
|
|
@@ -164,8 +167,8 @@ def decompose_multi_controlled_x(
|
|
|
164
167
|
|
|
165
168
|
|
|
166
169
|
def _decompose_su(
|
|
167
|
-
matrix: np.ndarray, controls:
|
|
168
|
-
) ->
|
|
170
|
+
matrix: np.ndarray, controls: list[cirq.Qid], target: cirq.Qid
|
|
171
|
+
) -> list[cirq.Operation]:
|
|
169
172
|
"""Decomposes controlled special unitary gate into elementary gates.
|
|
170
173
|
|
|
171
174
|
Result has O(len(controls)) operations.
|
|
@@ -190,10 +193,10 @@ def _decompose_su(
|
|
|
190
193
|
def _decompose_recursive(
|
|
191
194
|
matrix: np.ndarray,
|
|
192
195
|
power: float,
|
|
193
|
-
controls:
|
|
194
|
-
target:
|
|
195
|
-
free_qubits:
|
|
196
|
-
) ->
|
|
196
|
+
controls: list[cirq.Qid],
|
|
197
|
+
target: cirq.Qid,
|
|
198
|
+
free_qubits: list[cirq.Qid],
|
|
199
|
+
) -> list[cirq.Operation]:
|
|
197
200
|
"""Decomposes controlled unitary gate into elementary gates.
|
|
198
201
|
|
|
199
202
|
Result has O(len(controls)^2) operations.
|
|
@@ -215,8 +218,8 @@ def _decompose_recursive(
|
|
|
215
218
|
|
|
216
219
|
|
|
217
220
|
def decompose_multi_controlled_rotation(
|
|
218
|
-
matrix: np.ndarray, controls:
|
|
219
|
-
) ->
|
|
221
|
+
matrix: np.ndarray, controls: list[cirq.Qid], target: cirq.Qid
|
|
222
|
+
) -> list[cirq.Operation]:
|
|
220
223
|
"""Implements action of multi-controlled unitary gate.
|
|
221
224
|
|
|
222
225
|
Returns a sequence of operations, which is equivalent to applying
|
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import Sequence, TYPE_CHECKING
|
|
16
18
|
|
|
17
19
|
import numpy as np
|
|
18
20
|
import sympy
|
|
@@ -32,8 +34,8 @@ def _asinsin(x: float) -> float:
|
|
|
32
34
|
|
|
33
35
|
|
|
34
36
|
def compute_cphase_exponents_for_fsim_decomposition(
|
|
35
|
-
fsim_gate:
|
|
36
|
-
) -> Sequence[
|
|
37
|
+
fsim_gate: cirq.FSimGate,
|
|
38
|
+
) -> Sequence[tuple[float, float]]:
|
|
37
39
|
"""Returns intervals of CZPowGate exponents valid for FSim decomposition.
|
|
38
40
|
|
|
39
41
|
Ideal intervals associated with the constraints are closed, but due to
|
|
@@ -56,8 +58,8 @@ def compute_cphase_exponents_for_fsim_decomposition(
|
|
|
56
58
|
"""
|
|
57
59
|
|
|
58
60
|
def nonempty_intervals(
|
|
59
|
-
intervals: Sequence[
|
|
60
|
-
) -> Sequence[
|
|
61
|
+
intervals: Sequence[tuple[float, float]],
|
|
62
|
+
) -> Sequence[tuple[float, float]]:
|
|
61
63
|
return tuple((a, b) for a, b in intervals if a < b)
|
|
62
64
|
|
|
63
65
|
# Each of the two FSimGate parameters sets a bound on phase angle.
|
|
@@ -93,12 +95,12 @@ def compute_cphase_exponents_for_fsim_decomposition(
|
|
|
93
95
|
|
|
94
96
|
|
|
95
97
|
def decompose_cphase_into_two_fsim(
|
|
96
|
-
cphase_gate:
|
|
98
|
+
cphase_gate: cirq.CZPowGate,
|
|
97
99
|
*,
|
|
98
|
-
fsim_gate:
|
|
99
|
-
qubits:
|
|
100
|
+
fsim_gate: cirq.FSimGate,
|
|
101
|
+
qubits: Sequence[cirq.Qid] | None = None,
|
|
100
102
|
atol: float = 1e-8,
|
|
101
|
-
) ->
|
|
103
|
+
) -> cirq.OP_TREE:
|
|
102
104
|
"""Decomposes CZPowGate into two FSimGates.
|
|
103
105
|
|
|
104
106
|
This function implements the decomposition described in section VII F I
|
|
@@ -12,8 +12,10 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import itertools
|
|
16
|
-
from typing import
|
|
18
|
+
from typing import Sequence
|
|
17
19
|
|
|
18
20
|
import numpy as np
|
|
19
21
|
import pytest
|
|
@@ -111,9 +113,9 @@ def test_valid_cphase_exponents(theta, phi):
|
|
|
111
113
|
assert_decomposition_valid(cphase_gate, fsim_gate=fsim_gate)
|
|
112
114
|
|
|
113
115
|
|
|
114
|
-
def complement_intervals(intervals: Sequence[
|
|
116
|
+
def complement_intervals(intervals: Sequence[tuple[float, float]]) -> Sequence[tuple[float, float]]:
|
|
115
117
|
"""Computes complement of union of intervals in [0, 2]."""
|
|
116
|
-
complements:
|
|
118
|
+
complements: list[tuple[float, float]] = []
|
|
117
119
|
a = 0.0
|
|
118
120
|
for b, c in intervals:
|
|
119
121
|
complements.append((a, b))
|
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import cast
|
|
16
18
|
|
|
17
19
|
import numpy as np
|
|
18
20
|
import numpy.typing as npt
|
|
@@ -21,7 +23,7 @@ from cirq import protocols
|
|
|
21
23
|
from cirq.ops import DensePauliString
|
|
22
24
|
|
|
23
25
|
|
|
24
|
-
def _argmax(V: npt.NDArray) ->
|
|
26
|
+
def _argmax(V: npt.NDArray) -> tuple[int, float]:
|
|
25
27
|
"""Returns a tuple (index of max number, max number)."""
|
|
26
28
|
V = (V * V.conj()).real
|
|
27
29
|
idx_max = np.argmax(V)
|
|
@@ -60,7 +62,7 @@ def _conjugate_with_hadamard(U: npt.NDArray) -> npt.NDArray:
|
|
|
60
62
|
return U
|
|
61
63
|
|
|
62
64
|
|
|
63
|
-
def unitary_to_pauli_string(U: npt.NDArray, eps: float = 1e-15) ->
|
|
65
|
+
def unitary_to_pauli_string(U: npt.NDArray, eps: float = 1e-15) -> DensePauliString | None:
|
|
64
66
|
"""Attempts to find a pauli string (with possible phase) equivalent to U up to eps.
|
|
65
67
|
|
|
66
68
|
Based on this answer https://shorturl.at/aA079.
|
|
@@ -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 cmath
|
|
16
18
|
import itertools
|
|
17
19
|
from typing import cast
|
|
@@ -28,7 +30,7 @@ from cirq.transformers.analytical_decompositions import unitary_to_pauli_string
|
|
|
28
30
|
@pytest.mark.parametrize(
|
|
29
31
|
'pauli_string', [''.join(p) for p in itertools.product(['', 'I', 'X', 'Y', 'Z'], repeat=4)]
|
|
30
32
|
)
|
|
31
|
-
def test_unitary_to_pauli_string(pauli_string: str, phase: complex):
|
|
33
|
+
def test_unitary_to_pauli_string(pauli_string: str, phase: complex) -> None:
|
|
32
34
|
want = DensePauliString(pauli_string, coefficient=phase)
|
|
33
35
|
got = unitary_to_pauli_string(protocols.unitary(want))
|
|
34
36
|
assert got is not None
|
|
@@ -36,7 +38,7 @@ def test_unitary_to_pauli_string(pauli_string: str, phase: complex):
|
|
|
36
38
|
assert np.isclose(cast(np.complex128, want.coefficient), cast(np.complex128, got.coefficient))
|
|
37
39
|
|
|
38
40
|
|
|
39
|
-
def test_unitary_to_pauli_string_non_pauli_input():
|
|
41
|
+
def test_unitary_to_pauli_string_non_pauli_input() -> None:
|
|
40
42
|
got = unitary_to_pauli_string(protocols.unitary(T))
|
|
41
43
|
assert got is None
|
|
42
44
|
|
|
@@ -50,7 +52,7 @@ def test_unitary_to_pauli_string_non_pauli_input():
|
|
|
50
52
|
assert got is None
|
|
51
53
|
|
|
52
54
|
|
|
53
|
-
def test_invalid_input():
|
|
55
|
+
def test_invalid_input() -> None:
|
|
54
56
|
with pytest.raises(ValueError, match='Input has a non-square shape.*'):
|
|
55
57
|
_ = unitary_to_pauli_string(np.zeros((2, 3)))
|
|
56
58
|
|