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
|
@@ -14,18 +14,20 @@
|
|
|
14
14
|
|
|
15
15
|
"""Base class for creating custom target gatesets which can be used for compilation."""
|
|
16
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
17
19
|
import abc
|
|
18
|
-
from typing import Hashable,
|
|
20
|
+
from typing import Hashable, TYPE_CHECKING
|
|
19
21
|
|
|
20
22
|
from cirq import circuits, ops, protocols, transformers
|
|
21
|
-
from cirq.protocols.decompose_protocol import DecomposeResult
|
|
22
23
|
from cirq.transformers import merge_k_qubit_gates, merge_single_qubit_gates
|
|
23
24
|
|
|
24
25
|
if TYPE_CHECKING:
|
|
25
26
|
import cirq
|
|
27
|
+
from cirq.protocols.decompose_protocol import DecomposeResult
|
|
26
28
|
|
|
27
29
|
|
|
28
|
-
def create_transformer_with_kwargs(transformer:
|
|
30
|
+
def create_transformer_with_kwargs(transformer: cirq.TRANSFORMER, **kwargs) -> cirq.TRANSFORMER:
|
|
29
31
|
"""Method to capture additional keyword arguments to transformers while preserving mypy type.
|
|
30
32
|
|
|
31
33
|
Returns a `cirq.TRANSFORMER` which, when called with a circuit and transformer context, is
|
|
@@ -33,13 +35,13 @@ def create_transformer_with_kwargs(transformer: 'cirq.TRANSFORMER', **kwargs) ->
|
|
|
33
35
|
capture keyword arguments of a transformer before passing them as an argument to an API that
|
|
34
36
|
expects `cirq.TRANSFORMER`. For example:
|
|
35
37
|
|
|
36
|
-
>>> def run_transformers(transformers:
|
|
38
|
+
>>> def run_transformers(transformers: list[cirq.TRANSFORMER]):
|
|
37
39
|
... circuit = cirq.Circuit(cirq.X(cirq.q(0)))
|
|
38
40
|
... context = cirq.TransformerContext()
|
|
39
41
|
... for transformer in transformers:
|
|
40
42
|
... transformer(circuit, context=context)
|
|
41
43
|
...
|
|
42
|
-
>>> transformers:
|
|
44
|
+
>>> transformers: list[cirq.TRANSFORMER] = []
|
|
43
45
|
>>> transformers.append(
|
|
44
46
|
... cirq.create_transformer_with_kwargs(
|
|
45
47
|
... cirq.expand_composite, no_decomp=lambda op: cirq.num_qubits(op) <= 2
|
|
@@ -65,8 +67,8 @@ def create_transformer_with_kwargs(transformer: 'cirq.TRANSFORMER', **kwargs) ->
|
|
|
65
67
|
raise SyntaxError('**kwargs to be captured must not contain `context`.')
|
|
66
68
|
|
|
67
69
|
def transformer_with_kwargs(
|
|
68
|
-
circuit:
|
|
69
|
-
) ->
|
|
70
|
+
circuit: cirq.AbstractCircuit, *, context: cirq.TransformerContext | None = None
|
|
71
|
+
) -> cirq.AbstractCircuit:
|
|
70
72
|
return transformer(circuit, context=context, **kwargs)
|
|
71
73
|
|
|
72
74
|
return transformer_with_kwargs
|
|
@@ -81,8 +83,8 @@ class CompilationTargetGateset(ops.Gateset, metaclass=abc.ABCMeta):
|
|
|
81
83
|
|
|
82
84
|
def __init__(
|
|
83
85
|
self,
|
|
84
|
-
*gates:
|
|
85
|
-
name:
|
|
86
|
+
*gates: type[cirq.Gate] | cirq.Gate | cirq.GateFamily,
|
|
87
|
+
name: str | None = None,
|
|
86
88
|
unroll_circuit_op: bool = True,
|
|
87
89
|
preserve_moment_structure: bool = True,
|
|
88
90
|
reorder_operations: bool = False,
|
|
@@ -116,7 +118,7 @@ class CompilationTargetGateset(ops.Gateset, metaclass=abc.ABCMeta):
|
|
|
116
118
|
"""Maximum number of qubits on which a gate from this gateset can act upon."""
|
|
117
119
|
|
|
118
120
|
@abc.abstractmethod
|
|
119
|
-
def decompose_to_target_gateset(self, op:
|
|
121
|
+
def decompose_to_target_gateset(self, op: cirq.Operation, moment_idx: int) -> DecomposeResult:
|
|
120
122
|
"""Method to rewrite the given operation using gates from this gateset.
|
|
121
123
|
|
|
122
124
|
Args:
|
|
@@ -128,7 +130,7 @@ class CompilationTargetGateset(ops.Gateset, metaclass=abc.ABCMeta):
|
|
|
128
130
|
- `None` or `NotImplemented` if does not know how to decompose `op`.
|
|
129
131
|
"""
|
|
130
132
|
|
|
131
|
-
def _validate_operation(self, op:
|
|
133
|
+
def _validate_operation(self, op: cirq.Operation) -> bool:
|
|
132
134
|
"""Validates whether the given `cirq.Operation` is contained in this Gateset.
|
|
133
135
|
|
|
134
136
|
Overrides the method on the base gateset class to ensure that operations which created
|
|
@@ -153,7 +155,7 @@ class CompilationTargetGateset(ops.Gateset, metaclass=abc.ABCMeta):
|
|
|
153
155
|
return "_default_merged_k_qubit_unitaries"
|
|
154
156
|
|
|
155
157
|
@property
|
|
156
|
-
def preprocess_transformers(self) ->
|
|
158
|
+
def preprocess_transformers(self) -> list[cirq.TRANSFORMER]:
|
|
157
159
|
"""List of transformers which should be run before decomposing individual operations."""
|
|
158
160
|
reorder_transfomers = (
|
|
159
161
|
[transformers.insertion_sort_transformer] if self._reorder_operations else []
|
|
@@ -172,9 +174,9 @@ class CompilationTargetGateset(ops.Gateset, metaclass=abc.ABCMeta):
|
|
|
172
174
|
]
|
|
173
175
|
|
|
174
176
|
@property
|
|
175
|
-
def postprocess_transformers(self) ->
|
|
177
|
+
def postprocess_transformers(self) -> list[cirq.TRANSFORMER]:
|
|
176
178
|
"""List of transformers which should be run after decomposing individual operations."""
|
|
177
|
-
processors:
|
|
179
|
+
processors: list[cirq.TRANSFORMER] = [
|
|
178
180
|
merge_single_qubit_gates.merge_single_qubit_moments_to_phxz,
|
|
179
181
|
transformers.drop_negligible_operations,
|
|
180
182
|
transformers.drop_empty_moments,
|
|
@@ -221,7 +223,7 @@ class TwoQubitCompilationTargetGateset(CompilationTargetGateset):
|
|
|
221
223
|
def num_qubits(self) -> int:
|
|
222
224
|
return 2
|
|
223
225
|
|
|
224
|
-
def decompose_to_target_gateset(self, op:
|
|
226
|
+
def decompose_to_target_gateset(self, op: cirq.Operation, moment_idx: int) -> DecomposeResult:
|
|
225
227
|
if not 1 <= protocols.num_qubits(op) <= 2:
|
|
226
228
|
return self._decompose_multi_qubit_operation(op, moment_idx)
|
|
227
229
|
if protocols.num_qubits(op) == 1:
|
|
@@ -248,7 +250,7 @@ class TwoQubitCompilationTargetGateset(CompilationTargetGateset):
|
|
|
248
250
|
)
|
|
249
251
|
if switch_to_new:
|
|
250
252
|
return new_optree
|
|
251
|
-
mapped_old_optree:
|
|
253
|
+
mapped_old_optree: list[cirq.OP_TREE] = []
|
|
252
254
|
for old_op in ops.flatten_to_ops(old_optree):
|
|
253
255
|
if old_op in self:
|
|
254
256
|
mapped_old_optree.append(old_op)
|
|
@@ -260,7 +262,7 @@ class TwoQubitCompilationTargetGateset(CompilationTargetGateset):
|
|
|
260
262
|
return mapped_old_optree
|
|
261
263
|
|
|
262
264
|
def _decompose_single_qubit_operation(
|
|
263
|
-
self, op:
|
|
265
|
+
self, op: cirq.Operation, moment_idx: int
|
|
264
266
|
) -> DecomposeResult:
|
|
265
267
|
"""Decomposes (connected component of) 1-qubit operations using gates from this gateset.
|
|
266
268
|
|
|
@@ -282,7 +284,7 @@ class TwoQubitCompilationTargetGateset(CompilationTargetGateset):
|
|
|
282
284
|
)
|
|
283
285
|
|
|
284
286
|
def _decompose_multi_qubit_operation(
|
|
285
|
-
self, op:
|
|
287
|
+
self, op: cirq.Operation, moment_idx: int
|
|
286
288
|
) -> DecomposeResult:
|
|
287
289
|
"""Decomposes operations acting on more than 2 qubits using gates from this gateset.
|
|
288
290
|
|
|
@@ -298,7 +300,7 @@ class TwoQubitCompilationTargetGateset(CompilationTargetGateset):
|
|
|
298
300
|
|
|
299
301
|
@abc.abstractmethod
|
|
300
302
|
def _decompose_two_qubit_operation(
|
|
301
|
-
self, op:
|
|
303
|
+
self, op: cirq.Operation, moment_idx: int
|
|
302
304
|
) -> DecomposeResult:
|
|
303
305
|
"""Decomposes (connected component of) 2-qubit operations using gates from this gateset.
|
|
304
306
|
|
|
@@ -12,15 +12,19 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import TYPE_CHECKING
|
|
16
18
|
|
|
17
19
|
import pytest
|
|
18
20
|
|
|
19
21
|
import cirq
|
|
20
|
-
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from cirq.protocols.decompose_protocol import DecomposeResult
|
|
21
25
|
|
|
22
26
|
|
|
23
|
-
def test_compilation_target_gateset():
|
|
27
|
+
def test_compilation_target_gateset() -> None:
|
|
24
28
|
class ExampleTargetGateset(cirq.CompilationTargetGateset):
|
|
25
29
|
def __init__(self):
|
|
26
30
|
super().__init__(cirq.AnyUnitaryGateFamily(2))
|
|
@@ -29,11 +33,11 @@ def test_compilation_target_gateset():
|
|
|
29
33
|
def num_qubits(self) -> int:
|
|
30
34
|
return 2
|
|
31
35
|
|
|
32
|
-
def decompose_to_target_gateset(self, op:
|
|
36
|
+
def decompose_to_target_gateset(self, op: cirq.Operation, _) -> DecomposeResult:
|
|
33
37
|
return op if cirq.num_qubits(op) == 2 and cirq.has_unitary(op) else NotImplemented
|
|
34
38
|
|
|
35
39
|
@property
|
|
36
|
-
def preprocess_transformers(self) ->
|
|
40
|
+
def preprocess_transformers(self) -> list[cirq.TRANSFORMER]:
|
|
37
41
|
return []
|
|
38
42
|
|
|
39
43
|
gateset = ExampleTargetGateset()
|
|
@@ -63,7 +67,7 @@ class ExampleCXTargetGateset(cirq.TwoQubitCompilationTargetGateset):
|
|
|
63
67
|
def __init__(self):
|
|
64
68
|
super().__init__(cirq.AnyUnitaryGateFamily(1), cirq.CNOT)
|
|
65
69
|
|
|
66
|
-
def _decompose_two_qubit_operation(self, op:
|
|
70
|
+
def _decompose_two_qubit_operation(self, op: cirq.Operation, _) -> DecomposeResult:
|
|
67
71
|
if not cirq.has_unitary(op):
|
|
68
72
|
return NotImplemented
|
|
69
73
|
|
|
@@ -77,7 +81,7 @@ class ExampleCXTargetGateset(cirq.TwoQubitCompilationTargetGateset):
|
|
|
77
81
|
cirq.Z.on_each(q0, q1),
|
|
78
82
|
]
|
|
79
83
|
|
|
80
|
-
def _decompose_single_qubit_operation(self, op:
|
|
84
|
+
def _decompose_single_qubit_operation(self, op: cirq.Operation, _) -> DecomposeResult:
|
|
81
85
|
if not cirq.has_unitary(op):
|
|
82
86
|
return NotImplemented
|
|
83
87
|
assert self._intermediate_result_tag in op.tags
|
|
@@ -90,7 +94,7 @@ class ExampleCXTargetGateset(cirq.TwoQubitCompilationTargetGateset):
|
|
|
90
94
|
)
|
|
91
95
|
|
|
92
96
|
|
|
93
|
-
def test_two_qubit_compilation_leaves_single_gates_in_gateset():
|
|
97
|
+
def test_two_qubit_compilation_leaves_single_gates_in_gateset() -> None:
|
|
94
98
|
q = cirq.LineQubit.range(2)
|
|
95
99
|
gateset = ExampleCXTargetGateset()
|
|
96
100
|
|
|
@@ -101,7 +105,7 @@ def test_two_qubit_compilation_leaves_single_gates_in_gateset():
|
|
|
101
105
|
cirq.testing.assert_same_circuits(cirq.optimize_for_target_gateset(c, gateset=gateset), c)
|
|
102
106
|
|
|
103
107
|
|
|
104
|
-
def test_two_qubit_compilation_merges_runs_of_single_qubit_gates():
|
|
108
|
+
def test_two_qubit_compilation_merges_runs_of_single_qubit_gates() -> None:
|
|
105
109
|
q = cirq.LineQubit.range(2)
|
|
106
110
|
c = cirq.Circuit(cirq.CNOT(*q), cirq.X(q[0]), cirq.Y(q[0]), cirq.CNOT(*q))
|
|
107
111
|
cirq.testing.assert_same_circuits(
|
|
@@ -114,7 +118,7 @@ def test_two_qubit_compilation_merges_runs_of_single_qubit_gates():
|
|
|
114
118
|
)
|
|
115
119
|
|
|
116
120
|
|
|
117
|
-
def test_two_qubit_compilation_decompose_operation_not_implemented():
|
|
121
|
+
def test_two_qubit_compilation_decompose_operation_not_implemented() -> None:
|
|
118
122
|
gateset = ExampleCXTargetGateset()
|
|
119
123
|
q = cirq.LineQubit.range(3)
|
|
120
124
|
assert gateset.decompose_to_target_gateset(cirq.measure(q[0]), 1) is NotImplemented
|
|
@@ -126,7 +130,7 @@ def test_two_qubit_compilation_decompose_operation_not_implemented():
|
|
|
126
130
|
assert gateset.decompose_to_target_gateset(cirq.CCZ(*q), 1) is NotImplemented
|
|
127
131
|
|
|
128
132
|
|
|
129
|
-
def test_two_qubit_compilation_merge_and_replace_to_target_gateset():
|
|
133
|
+
def test_two_qubit_compilation_merge_and_replace_to_target_gateset() -> None:
|
|
130
134
|
q = cirq.LineQubit.range(2)
|
|
131
135
|
c_orig = cirq.Circuit(
|
|
132
136
|
cirq.Moment(cirq.Z(q[1]), cirq.X(q[0])),
|
|
@@ -160,7 +164,7 @@ def test_two_qubit_compilation_merge_and_replace_to_target_gateset():
|
|
|
160
164
|
)
|
|
161
165
|
|
|
162
166
|
|
|
163
|
-
def test_two_qubit_compilation_merge_and_replace_inefficient_component():
|
|
167
|
+
def test_two_qubit_compilation_merge_and_replace_inefficient_component() -> None:
|
|
164
168
|
q = cirq.LineQubit.range(2)
|
|
165
169
|
c_orig = cirq.Circuit(
|
|
166
170
|
cirq.Moment(cirq.X(q[0])),
|
|
@@ -204,16 +208,16 @@ m: ═════════════════════════
|
|
|
204
208
|
)
|
|
205
209
|
|
|
206
210
|
|
|
207
|
-
def test_two_qubit_compilation_replaces_only_if_2q_gate_count_is_less():
|
|
211
|
+
def test_two_qubit_compilation_replaces_only_if_2q_gate_count_is_less() -> None:
|
|
208
212
|
class ExampleTargetGateset(cirq.TwoQubitCompilationTargetGateset):
|
|
209
213
|
def __init__(self):
|
|
210
214
|
super().__init__(cirq.X, cirq.CNOT)
|
|
211
215
|
|
|
212
|
-
def _decompose_two_qubit_operation(self, op:
|
|
216
|
+
def _decompose_two_qubit_operation(self, op: cirq.Operation, _) -> DecomposeResult:
|
|
213
217
|
q0, q1 = op.qubits
|
|
214
218
|
return [cirq.X.on_each(q0, q1), cirq.CNOT(q0, q1)] * 10
|
|
215
219
|
|
|
216
|
-
def _decompose_single_qubit_operation(self, op:
|
|
220
|
+
def _decompose_single_qubit_operation(self, op: cirq.Operation, _) -> DecomposeResult:
|
|
217
221
|
return cirq.X(*op.qubits) if op.gate == cirq.Y else NotImplemented
|
|
218
222
|
|
|
219
223
|
q = cirq.LineQubit.range(2)
|
|
@@ -224,7 +228,7 @@ def test_two_qubit_compilation_replaces_only_if_2q_gate_count_is_less():
|
|
|
224
228
|
cirq.testing.assert_same_circuits(c_new, c_expected)
|
|
225
229
|
|
|
226
230
|
|
|
227
|
-
def test_create_transformer_with_kwargs_raises():
|
|
231
|
+
def test_create_transformer_with_kwargs_raises() -> None:
|
|
228
232
|
with pytest.raises(SyntaxError, match="must not contain `context`"):
|
|
229
233
|
cirq.create_transformer_with_kwargs(
|
|
230
234
|
cirq.merge_k_qubit_unitaries, k=2, context=cirq.TransformerContext()
|
|
@@ -14,7 +14,9 @@
|
|
|
14
14
|
|
|
15
15
|
"""Target gateset used for compiling circuits to CZ + 1-q rotations + measurement gates."""
|
|
16
16
|
|
|
17
|
-
from
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
from typing import Any, Sequence, TYPE_CHECKING
|
|
18
20
|
|
|
19
21
|
from cirq import ops, protocols
|
|
20
22
|
from cirq.transformers.analytical_decompositions import two_qubit_to_cz
|
|
@@ -47,7 +49,7 @@ class CZTargetGateset(compilation_target_gateset.TwoQubitCompilationTargetGatese
|
|
|
47
49
|
*,
|
|
48
50
|
atol: float = 1e-8,
|
|
49
51
|
allow_partial_czs: bool = False,
|
|
50
|
-
additional_gates: Sequence[
|
|
52
|
+
additional_gates: Sequence[type[cirq.Gate] | cirq.Gate | cirq.GateFamily] = (),
|
|
51
53
|
preserve_moment_structure: bool = True,
|
|
52
54
|
reorder_operations: bool = False,
|
|
53
55
|
) -> None:
|
|
@@ -83,7 +85,7 @@ class CZTargetGateset(compilation_target_gateset.TwoQubitCompilationTargetGatese
|
|
|
83
85
|
self.atol = atol
|
|
84
86
|
self.allow_partial_czs = allow_partial_czs
|
|
85
87
|
|
|
86
|
-
def _decompose_two_qubit_operation(self, op:
|
|
88
|
+
def _decompose_two_qubit_operation(self, op: cirq.Operation, _) -> cirq.OP_TREE:
|
|
87
89
|
if not protocols.has_unitary(op):
|
|
88
90
|
return NotImplemented
|
|
89
91
|
return two_qubit_to_cz.two_qubit_matrix_to_cz_operations(
|
|
@@ -106,8 +108,8 @@ class CZTargetGateset(compilation_target_gateset.TwoQubitCompilationTargetGatese
|
|
|
106
108
|
def _value_equality_values_(self) -> Any:
|
|
107
109
|
return self.atol, self.allow_partial_czs, frozenset(self.additional_gates)
|
|
108
110
|
|
|
109
|
-
def _json_dict_(self) ->
|
|
110
|
-
d:
|
|
111
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
112
|
+
d: dict[str, Any] = {'atol': self.atol, 'allow_partial_czs': self.allow_partial_czs}
|
|
111
113
|
if self.additional_gates:
|
|
112
114
|
d['additional_gates'] = list(self.additional_gates)
|
|
113
115
|
return d
|
|
@@ -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
|
|
16
18
|
|
|
17
19
|
import numpy as np
|
|
18
20
|
import pytest
|
|
@@ -31,7 +33,7 @@ def all_gates_of_type(m: cirq.Moment, g: cirq.Gateset):
|
|
|
31
33
|
def assert_optimizes(
|
|
32
34
|
before: cirq.Circuit,
|
|
33
35
|
expected: cirq.Circuit,
|
|
34
|
-
additional_gates:
|
|
36
|
+
additional_gates: Sequence[type[cirq.Gate]] | None = None,
|
|
35
37
|
):
|
|
36
38
|
if additional_gates is None:
|
|
37
39
|
gateset = cirq.CZTargetGateset()
|
|
@@ -56,7 +58,7 @@ def assert_optimization_not_broken(circuit: cirq.Circuit):
|
|
|
56
58
|
)
|
|
57
59
|
|
|
58
60
|
|
|
59
|
-
def test_convert_to_cz_preserving_moment_structure():
|
|
61
|
+
def test_convert_to_cz_preserving_moment_structure() -> None:
|
|
60
62
|
q = cirq.LineQubit.range(5)
|
|
61
63
|
op = lambda q0, q1: cirq.H(q1).controlled_by(q0)
|
|
62
64
|
c_orig = cirq.Circuit(
|
|
@@ -100,7 +102,7 @@ def test_convert_to_cz_preserving_moment_structure():
|
|
|
100
102
|
)
|
|
101
103
|
|
|
102
104
|
|
|
103
|
-
def test_clears_paired_cnot():
|
|
105
|
+
def test_clears_paired_cnot() -> None:
|
|
104
106
|
a, b = cirq.LineQubit.range(2)
|
|
105
107
|
assert_optimizes(
|
|
106
108
|
before=cirq.Circuit(cirq.Moment(cirq.CNOT(a, b)), cirq.Moment(cirq.CNOT(a, b))),
|
|
@@ -108,7 +110,7 @@ def test_clears_paired_cnot():
|
|
|
108
110
|
)
|
|
109
111
|
|
|
110
112
|
|
|
111
|
-
def test_ignores_czs_separated_by_parameterized():
|
|
113
|
+
def test_ignores_czs_separated_by_parameterized() -> None:
|
|
112
114
|
a, b = cirq.LineQubit.range(2)
|
|
113
115
|
assert_optimizes(
|
|
114
116
|
before=cirq.Circuit(
|
|
@@ -129,19 +131,19 @@ def test_ignores_czs_separated_by_parameterized():
|
|
|
129
131
|
)
|
|
130
132
|
|
|
131
133
|
|
|
132
|
-
def test_cnots_separated_by_single_gates_correct():
|
|
134
|
+
def test_cnots_separated_by_single_gates_correct() -> None:
|
|
133
135
|
a, b = cirq.LineQubit.range(2)
|
|
134
136
|
assert_optimization_not_broken(cirq.Circuit(cirq.CNOT(a, b), cirq.H(b), cirq.CNOT(a, b)))
|
|
135
137
|
|
|
136
138
|
|
|
137
|
-
def test_czs_separated_by_single_gates_correct():
|
|
139
|
+
def test_czs_separated_by_single_gates_correct() -> None:
|
|
138
140
|
a, b = cirq.LineQubit.range(2)
|
|
139
141
|
assert_optimization_not_broken(
|
|
140
142
|
cirq.Circuit(cirq.CZ(a, b), cirq.X(b), cirq.X(b), cirq.X(b), cirq.CZ(a, b))
|
|
141
143
|
)
|
|
142
144
|
|
|
143
145
|
|
|
144
|
-
def test_inefficient_circuit_correct():
|
|
146
|
+
def test_inefficient_circuit_correct() -> None:
|
|
145
147
|
t = 0.1
|
|
146
148
|
v = 0.11
|
|
147
149
|
a, b = cirq.LineQubit.range(2)
|
|
@@ -166,7 +168,7 @@ def test_inefficient_circuit_correct():
|
|
|
166
168
|
)
|
|
167
169
|
|
|
168
170
|
|
|
169
|
-
def test_optimizes_single_iswap():
|
|
171
|
+
def test_optimizes_single_iswap() -> None:
|
|
170
172
|
a, b = cirq.LineQubit.range(2)
|
|
171
173
|
c = cirq.Circuit(cirq.ISWAP(a, b))
|
|
172
174
|
assert_optimization_not_broken(c)
|
|
@@ -174,7 +176,7 @@ def test_optimizes_single_iswap():
|
|
|
174
176
|
assert len([1 for op in c.all_operations() if len(op.qubits) == 2]) == 2
|
|
175
177
|
|
|
176
178
|
|
|
177
|
-
def test_optimizes_tagged_partial_cz():
|
|
179
|
+
def test_optimizes_tagged_partial_cz() -> None:
|
|
178
180
|
a, b = cirq.LineQubit.range(2)
|
|
179
181
|
c = cirq.Circuit((cirq.CZ**0.5)(a, b).with_tags('mytag'))
|
|
180
182
|
assert_optimization_not_broken(c)
|
|
@@ -184,7 +186,7 @@ def test_optimizes_tagged_partial_cz():
|
|
|
184
186
|
), 'It should take 2 CZ gates to decompose a CZ**0.5 gate'
|
|
185
187
|
|
|
186
188
|
|
|
187
|
-
def test_not_decompose_czs():
|
|
189
|
+
def test_not_decompose_czs() -> None:
|
|
188
190
|
circuit = cirq.Circuit(
|
|
189
191
|
cirq.CZPowGate(exponent=1, global_shift=-0.5).on(*cirq.LineQubit.range(2))
|
|
190
192
|
)
|
|
@@ -201,7 +203,7 @@ def test_not_decompose_czs():
|
|
|
201
203
|
),
|
|
202
204
|
),
|
|
203
205
|
)
|
|
204
|
-
def test_decompose_partial_czs(circuit):
|
|
206
|
+
def test_decompose_partial_czs(circuit) -> None:
|
|
205
207
|
circuit = cirq.optimize_for_target_gateset(
|
|
206
208
|
circuit, gateset=cirq.CZTargetGateset(), ignore_failures=False
|
|
207
209
|
)
|
|
@@ -216,7 +218,7 @@ def test_decompose_partial_czs(circuit):
|
|
|
216
218
|
assert num_part_cz == 0
|
|
217
219
|
|
|
218
220
|
|
|
219
|
-
def test_not_decompose_partial_czs():
|
|
221
|
+
def test_not_decompose_partial_czs() -> None:
|
|
220
222
|
circuit = cirq.Circuit(
|
|
221
223
|
cirq.CZPowGate(exponent=0.1, global_shift=-0.5)(*cirq.LineQubit.range(2))
|
|
222
224
|
)
|
|
@@ -232,7 +234,7 @@ def test_not_decompose_partial_czs():
|
|
|
232
234
|
assert num_part_cz == 1
|
|
233
235
|
|
|
234
236
|
|
|
235
|
-
def test_avoids_decompose_when_matrix_available():
|
|
237
|
+
def test_avoids_decompose_when_matrix_available() -> None:
|
|
236
238
|
class OtherXX(cirq.testing.TwoQubitGate): # pragma: no cover
|
|
237
239
|
def _has_unitary_(self) -> bool:
|
|
238
240
|
return True
|
|
@@ -261,7 +263,7 @@ def test_avoids_decompose_when_matrix_available():
|
|
|
261
263
|
assert len(c) == 0
|
|
262
264
|
|
|
263
265
|
|
|
264
|
-
def test_composite_gates_without_matrix():
|
|
266
|
+
def test_composite_gates_without_matrix() -> None:
|
|
265
267
|
class CompositeExample(cirq.testing.SingleQubitGate):
|
|
266
268
|
def _decompose_(self, qubits):
|
|
267
269
|
yield cirq.X(qubits[0])
|
|
@@ -289,7 +291,7 @@ def test_composite_gates_without_matrix():
|
|
|
289
291
|
)
|
|
290
292
|
|
|
291
293
|
|
|
292
|
-
def test_unsupported_gate():
|
|
294
|
+
def test_unsupported_gate() -> None:
|
|
293
295
|
class UnsupportedExample(cirq.testing.TwoQubitGate):
|
|
294
296
|
pass
|
|
295
297
|
|
|
@@ -319,11 +321,11 @@ def test_unsupported_gate():
|
|
|
319
321
|
cirq.CZTargetGateset(additional_gates=()),
|
|
320
322
|
],
|
|
321
323
|
)
|
|
322
|
-
def test_repr(gateset):
|
|
324
|
+
def test_repr(gateset) -> None:
|
|
323
325
|
cirq.testing.assert_equivalent_repr(gateset)
|
|
324
326
|
|
|
325
327
|
|
|
326
|
-
def test_with_commutation():
|
|
328
|
+
def test_with_commutation() -> None:
|
|
327
329
|
c = cirq.Circuit(
|
|
328
330
|
cirq.CZ(cirq.q(0), cirq.q(1)), cirq.CZ(cirq.q(1), cirq.q(2)), cirq.CZ(cirq.q(0), cirq.q(1))
|
|
329
331
|
)
|
|
@@ -335,7 +337,7 @@ def test_with_commutation():
|
|
|
335
337
|
assert got == cirq.Circuit(cirq.CZ(cirq.q(1), cirq.q(2)))
|
|
336
338
|
|
|
337
339
|
|
|
338
|
-
def test_reorder_operations_and_preserve_moment_structure_raises():
|
|
340
|
+
def test_reorder_operations_and_preserve_moment_structure_raises() -> None:
|
|
339
341
|
with pytest.raises(
|
|
340
342
|
ValueError, match='reorder_operations and preserve_moment_structure can not both be True'
|
|
341
343
|
):
|
|
@@ -14,15 +14,17 @@
|
|
|
14
14
|
|
|
15
15
|
"""Target gateset used for compiling circuits to √iSWAP + 1-q rotations + measurement gates."""
|
|
16
16
|
|
|
17
|
-
from
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
from typing import Any, Sequence, TYPE_CHECKING
|
|
18
20
|
|
|
19
21
|
from cirq import ops, protocols
|
|
20
|
-
from cirq.protocols.decompose_protocol import DecomposeResult
|
|
21
22
|
from cirq.transformers.analytical_decompositions import two_qubit_to_sqrt_iswap
|
|
22
23
|
from cirq.transformers.target_gatesets import compilation_target_gateset
|
|
23
24
|
|
|
24
25
|
if TYPE_CHECKING:
|
|
25
26
|
import cirq
|
|
27
|
+
from cirq.protocols.decompose_protocol import DecomposeResult
|
|
26
28
|
|
|
27
29
|
|
|
28
30
|
class SqrtIswapTargetGateset(compilation_target_gateset.TwoQubitCompilationTargetGateset):
|
|
@@ -47,9 +49,9 @@ class SqrtIswapTargetGateset(compilation_target_gateset.TwoQubitCompilationTarge
|
|
|
47
49
|
self,
|
|
48
50
|
*,
|
|
49
51
|
atol: float = 1e-8,
|
|
50
|
-
required_sqrt_iswap_count:
|
|
52
|
+
required_sqrt_iswap_count: int | None = None,
|
|
51
53
|
use_sqrt_iswap_inv: bool = False,
|
|
52
|
-
additional_gates: Sequence[
|
|
54
|
+
additional_gates: Sequence[type[cirq.Gate] | cirq.Gate | cirq.GateFamily] = (),
|
|
53
55
|
):
|
|
54
56
|
"""Initializes `cirq.SqrtIswapTargetGateset`
|
|
55
57
|
|
|
@@ -87,7 +89,7 @@ class SqrtIswapTargetGateset(compilation_target_gateset.TwoQubitCompilationTarge
|
|
|
87
89
|
self.required_sqrt_iswap_count = required_sqrt_iswap_count
|
|
88
90
|
self.use_sqrt_iswap_inv = use_sqrt_iswap_inv
|
|
89
91
|
|
|
90
|
-
def _decompose_two_qubit_operation(self, op:
|
|
92
|
+
def _decompose_two_qubit_operation(self, op: cirq.Operation, _) -> DecomposeResult:
|
|
91
93
|
if protocols.has_unitary(op):
|
|
92
94
|
return two_qubit_to_sqrt_iswap.two_qubit_matrix_to_sqrt_iswap_operations(
|
|
93
95
|
op.qubits[0],
|
|
@@ -123,8 +125,8 @@ class SqrtIswapTargetGateset(compilation_target_gateset.TwoQubitCompilationTarge
|
|
|
123
125
|
frozenset(self.additional_gates),
|
|
124
126
|
)
|
|
125
127
|
|
|
126
|
-
def _json_dict_(self) ->
|
|
127
|
-
d:
|
|
128
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
129
|
+
d: dict[str, Any] = {
|
|
128
130
|
'atol': self.atol,
|
|
129
131
|
'required_sqrt_iswap_count': self.required_sqrt_iswap_count,
|
|
130
132
|
'use_sqrt_iswap_inv': self.use_sqrt_iswap_inv,
|