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
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from
|
|
15
|
+
from __future__ import annotations
|
|
16
16
|
|
|
17
17
|
import numpy as np
|
|
18
18
|
import pytest
|
|
@@ -38,7 +38,7 @@ def assert_optimizes(before: cirq.Circuit, expected: cirq.Circuit, **kwargs):
|
|
|
38
38
|
|
|
39
39
|
|
|
40
40
|
def assert_optimization_not_broken(
|
|
41
|
-
circuit: cirq.Circuit, required_sqrt_iswap_count:
|
|
41
|
+
circuit: cirq.Circuit, required_sqrt_iswap_count: int | None = None
|
|
42
42
|
):
|
|
43
43
|
c_new = cirq.optimize_for_target_gateset(
|
|
44
44
|
circuit,
|
|
@@ -60,7 +60,7 @@ def assert_optimization_not_broken(
|
|
|
60
60
|
)
|
|
61
61
|
|
|
62
62
|
|
|
63
|
-
def test_convert_to_sqrt_iswap_preserving_moment_structure():
|
|
63
|
+
def test_convert_to_sqrt_iswap_preserving_moment_structure() -> None:
|
|
64
64
|
q = cirq.LineQubit.range(5)
|
|
65
65
|
op = lambda q0, q1: cirq.H(q1).controlled_by(q0)
|
|
66
66
|
c_orig = cirq.Circuit(
|
|
@@ -112,7 +112,7 @@ def test_convert_to_sqrt_iswap_preserving_moment_structure():
|
|
|
112
112
|
],
|
|
113
113
|
)
|
|
114
114
|
@pytest.mark.parametrize('use_sqrt_iswap_inv', [True, False])
|
|
115
|
-
def test_two_qubit_gates_with_symbols(gate: cirq.Gate, use_sqrt_iswap_inv: bool):
|
|
115
|
+
def test_two_qubit_gates_with_symbols(gate: cirq.Gate, use_sqrt_iswap_inv: bool) -> None:
|
|
116
116
|
# Note that even though these gates are not natively supported by
|
|
117
117
|
# `cirq.parameterized_2q_op_to_sqrt_iswap_operations`, the transformation succeeds because
|
|
118
118
|
# `cirq.optimize_for_target_gateset` also relies on `cirq.decompose` as a fallback.
|
|
@@ -142,12 +142,12 @@ def test_two_qubit_gates_with_symbols(gate: cirq.Gate, use_sqrt_iswap_inv: bool)
|
|
|
142
142
|
)
|
|
143
143
|
|
|
144
144
|
|
|
145
|
-
def test_sqrt_iswap_gateset_raises():
|
|
145
|
+
def test_sqrt_iswap_gateset_raises() -> None:
|
|
146
146
|
with pytest.raises(ValueError, match="`required_sqrt_iswap_count` must be 0, 1, 2, or 3"):
|
|
147
147
|
_ = cirq.SqrtIswapTargetGateset(required_sqrt_iswap_count=4)
|
|
148
148
|
|
|
149
149
|
|
|
150
|
-
def test_sqrt_iswap_gateset_eq():
|
|
150
|
+
def test_sqrt_iswap_gateset_eq() -> None:
|
|
151
151
|
eq = cirq.testing.EqualsTester()
|
|
152
152
|
eq.add_equality_group(
|
|
153
153
|
cirq.SqrtIswapTargetGateset(), cirq.SqrtIswapTargetGateset(use_sqrt_iswap_inv=False)
|
|
@@ -179,11 +179,11 @@ def test_sqrt_iswap_gateset_eq():
|
|
|
179
179
|
cirq.SqrtIswapTargetGateset(additional_gates=()),
|
|
180
180
|
],
|
|
181
181
|
)
|
|
182
|
-
def test_sqrt_iswap_gateset_repr(gateset):
|
|
182
|
+
def test_sqrt_iswap_gateset_repr(gateset) -> None:
|
|
183
183
|
cirq.testing.assert_equivalent_repr(gateset)
|
|
184
184
|
|
|
185
185
|
|
|
186
|
-
def test_simplifies_sqrt_iswap():
|
|
186
|
+
def test_simplifies_sqrt_iswap() -> None:
|
|
187
187
|
a, b = cirq.LineQubit.range(2)
|
|
188
188
|
assert_optimizes(
|
|
189
189
|
before=cirq.Circuit(
|
|
@@ -204,7 +204,7 @@ def test_simplifies_sqrt_iswap():
|
|
|
204
204
|
)
|
|
205
205
|
|
|
206
206
|
|
|
207
|
-
def test_simplifies_sqrt_iswap_inv():
|
|
207
|
+
def test_simplifies_sqrt_iswap_inv() -> None:
|
|
208
208
|
a, b = cirq.LineQubit.range(2)
|
|
209
209
|
assert_optimizes(
|
|
210
210
|
use_sqrt_iswap_inv=True,
|
|
@@ -226,7 +226,7 @@ def test_simplifies_sqrt_iswap_inv():
|
|
|
226
226
|
)
|
|
227
227
|
|
|
228
228
|
|
|
229
|
-
def test_works_with_tags():
|
|
229
|
+
def test_works_with_tags() -> None:
|
|
230
230
|
a, b = cirq.LineQubit.range(2)
|
|
231
231
|
assert_optimizes(
|
|
232
232
|
before=cirq.Circuit(
|
|
@@ -240,7 +240,7 @@ def test_works_with_tags():
|
|
|
240
240
|
)
|
|
241
241
|
|
|
242
242
|
|
|
243
|
-
def test_no_touch_single_sqrt_iswap():
|
|
243
|
+
def test_no_touch_single_sqrt_iswap() -> None:
|
|
244
244
|
a, b = cirq.LineQubit.range(2)
|
|
245
245
|
circuit = cirq.Circuit(
|
|
246
246
|
[
|
|
@@ -252,7 +252,7 @@ def test_no_touch_single_sqrt_iswap():
|
|
|
252
252
|
assert_optimizes(before=circuit, expected=circuit)
|
|
253
253
|
|
|
254
254
|
|
|
255
|
-
def test_no_touch_single_sqrt_iswap_inv():
|
|
255
|
+
def test_no_touch_single_sqrt_iswap_inv() -> None:
|
|
256
256
|
a, b = cirq.LineQubit.range(2)
|
|
257
257
|
circuit = cirq.Circuit(
|
|
258
258
|
[
|
|
@@ -264,19 +264,19 @@ def test_no_touch_single_sqrt_iswap_inv():
|
|
|
264
264
|
assert_optimizes(before=circuit, expected=circuit, use_sqrt_iswap_inv=True)
|
|
265
265
|
|
|
266
266
|
|
|
267
|
-
def test_cnots_separated_by_single_gates_correct():
|
|
267
|
+
def test_cnots_separated_by_single_gates_correct() -> None:
|
|
268
268
|
a, b = cirq.LineQubit.range(2)
|
|
269
269
|
assert_optimization_not_broken(cirq.Circuit(cirq.CNOT(a, b), cirq.H(b), cirq.CNOT(a, b)))
|
|
270
270
|
|
|
271
271
|
|
|
272
|
-
def test_czs_separated_by_single_gates_correct():
|
|
272
|
+
def test_czs_separated_by_single_gates_correct() -> None:
|
|
273
273
|
a, b = cirq.LineQubit.range(2)
|
|
274
274
|
assert_optimization_not_broken(
|
|
275
275
|
cirq.Circuit(cirq.CZ(a, b), cirq.X(b), cirq.X(b), cirq.X(b), cirq.CZ(a, b))
|
|
276
276
|
)
|
|
277
277
|
|
|
278
278
|
|
|
279
|
-
def test_inefficient_circuit_correct():
|
|
279
|
+
def test_inefficient_circuit_correct() -> None:
|
|
280
280
|
t = 0.1
|
|
281
281
|
v = 0.11
|
|
282
282
|
a, b = cirq.LineQubit.range(2)
|
|
@@ -301,7 +301,7 @@ def test_inefficient_circuit_correct():
|
|
|
301
301
|
)
|
|
302
302
|
|
|
303
303
|
|
|
304
|
-
def test_optimizes_single_iswap():
|
|
304
|
+
def test_optimizes_single_iswap() -> None:
|
|
305
305
|
a, b = cirq.LineQubit.range(2)
|
|
306
306
|
c = cirq.Circuit(cirq.ISWAP(a, b))
|
|
307
307
|
assert_optimization_not_broken(c)
|
|
@@ -311,7 +311,7 @@ def test_optimizes_single_iswap():
|
|
|
311
311
|
assert len([1 for op in c.all_operations() if len(op.qubits) == 2]) == 2
|
|
312
312
|
|
|
313
313
|
|
|
314
|
-
def test_optimizes_single_inv_sqrt_iswap():
|
|
314
|
+
def test_optimizes_single_inv_sqrt_iswap() -> None:
|
|
315
315
|
a, b = cirq.LineQubit.range(2)
|
|
316
316
|
c = cirq.Circuit(cirq.SQRT_ISWAP_INV(a, b))
|
|
317
317
|
assert_optimization_not_broken(c)
|
|
@@ -321,7 +321,7 @@ def test_optimizes_single_inv_sqrt_iswap():
|
|
|
321
321
|
assert len([1 for op in c.all_operations() if len(op.qubits) == 2]) == 1
|
|
322
322
|
|
|
323
323
|
|
|
324
|
-
def test_optimizes_single_iswap_require0():
|
|
324
|
+
def test_optimizes_single_iswap_require0() -> None:
|
|
325
325
|
a, b = cirq.LineQubit.range(2)
|
|
326
326
|
c = cirq.Circuit(cirq.CNOT(a, b), cirq.CNOT(a, b)) # Minimum 0 sqrt-iSWAP
|
|
327
327
|
assert_optimization_not_broken(c, required_sqrt_iswap_count=0)
|
|
@@ -331,7 +331,7 @@ def test_optimizes_single_iswap_require0():
|
|
|
331
331
|
assert len([1 for op in c.all_operations() if len(op.qubits) == 2]) == 0
|
|
332
332
|
|
|
333
333
|
|
|
334
|
-
def test_optimizes_single_iswap_require0_raises():
|
|
334
|
+
def test_optimizes_single_iswap_require0_raises() -> None:
|
|
335
335
|
a, b = cirq.LineQubit.range(2)
|
|
336
336
|
c = cirq.Circuit(cirq.CNOT(a, b)) # Minimum 2 sqrt-iSWAP
|
|
337
337
|
with pytest.raises(ValueError, match='cannot be decomposed into exactly 0 sqrt-iSWAP gates'):
|
|
@@ -342,7 +342,7 @@ def test_optimizes_single_iswap_require0_raises():
|
|
|
342
342
|
)
|
|
343
343
|
|
|
344
344
|
|
|
345
|
-
def test_optimizes_single_iswap_require1():
|
|
345
|
+
def test_optimizes_single_iswap_require1() -> None:
|
|
346
346
|
a, b = cirq.LineQubit.range(2)
|
|
347
347
|
c = cirq.Circuit(cirq.SQRT_ISWAP_INV(a, b)) # Minimum 1 sqrt-iSWAP
|
|
348
348
|
assert_optimization_not_broken(c, required_sqrt_iswap_count=1)
|
|
@@ -352,7 +352,7 @@ def test_optimizes_single_iswap_require1():
|
|
|
352
352
|
assert len([1 for op in c.all_operations() if len(op.qubits) == 2]) == 1
|
|
353
353
|
|
|
354
354
|
|
|
355
|
-
def test_optimizes_single_iswap_require1_raises():
|
|
355
|
+
def test_optimizes_single_iswap_require1_raises() -> None:
|
|
356
356
|
a, b = cirq.LineQubit.range(2)
|
|
357
357
|
c = cirq.Circuit(cirq.CNOT(a, b)) # Minimum 2 sqrt-iSWAP
|
|
358
358
|
with pytest.raises(ValueError, match='cannot be decomposed into exactly 1 sqrt-iSWAP gates'):
|
|
@@ -363,7 +363,7 @@ def test_optimizes_single_iswap_require1_raises():
|
|
|
363
363
|
)
|
|
364
364
|
|
|
365
365
|
|
|
366
|
-
def test_optimizes_single_iswap_require2():
|
|
366
|
+
def test_optimizes_single_iswap_require2() -> None:
|
|
367
367
|
a, b = cirq.LineQubit.range(2)
|
|
368
368
|
c = cirq.Circuit(cirq.SQRT_ISWAP_INV(a, b)) # Minimum 1 sqrt-iSWAP but 2 possible
|
|
369
369
|
assert_optimization_not_broken(c, required_sqrt_iswap_count=2)
|
|
@@ -373,7 +373,7 @@ def test_optimizes_single_iswap_require2():
|
|
|
373
373
|
assert len([1 for op in c.all_operations() if len(op.qubits) == 2]) == 2
|
|
374
374
|
|
|
375
375
|
|
|
376
|
-
def test_optimizes_single_iswap_require2_raises():
|
|
376
|
+
def test_optimizes_single_iswap_require2_raises() -> None:
|
|
377
377
|
a, b = cirq.LineQubit.range(2)
|
|
378
378
|
c = cirq.Circuit(cirq.SWAP(a, b)) # Minimum 3 sqrt-iSWAP
|
|
379
379
|
with pytest.raises(ValueError, match='cannot be decomposed into exactly 2 sqrt-iSWAP gates'):
|
|
@@ -384,7 +384,7 @@ def test_optimizes_single_iswap_require2_raises():
|
|
|
384
384
|
)
|
|
385
385
|
|
|
386
386
|
|
|
387
|
-
def test_optimizes_single_iswap_require3():
|
|
387
|
+
def test_optimizes_single_iswap_require3() -> None:
|
|
388
388
|
a, b = cirq.LineQubit.range(2)
|
|
389
389
|
c = cirq.Circuit(cirq.ISWAP(a, b)) # Minimum 2 sqrt-iSWAP but 3 possible
|
|
390
390
|
assert_optimization_not_broken(c, required_sqrt_iswap_count=3)
|
|
@@ -394,7 +394,7 @@ def test_optimizes_single_iswap_require3():
|
|
|
394
394
|
assert len([1 for op in c.all_operations() if len(op.qubits) == 2]) == 3
|
|
395
395
|
|
|
396
396
|
|
|
397
|
-
def test_optimizes_single_inv_sqrt_iswap_require3():
|
|
397
|
+
def test_optimizes_single_inv_sqrt_iswap_require3() -> None:
|
|
398
398
|
a, b = cirq.LineQubit.range(2)
|
|
399
399
|
c = cirq.Circuit(cirq.SQRT_ISWAP_INV(a, b))
|
|
400
400
|
assert_optimization_not_broken(c, required_sqrt_iswap_count=3)
|
|
@@ -14,25 +14,14 @@
|
|
|
14
14
|
|
|
15
15
|
"""Defines the API for circuit transformers in Cirq."""
|
|
16
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
17
19
|
import dataclasses
|
|
18
20
|
import enum
|
|
19
21
|
import functools
|
|
20
22
|
import inspect
|
|
21
23
|
import textwrap
|
|
22
|
-
from typing import
|
|
23
|
-
Any,
|
|
24
|
-
Callable,
|
|
25
|
-
cast,
|
|
26
|
-
Hashable,
|
|
27
|
-
List,
|
|
28
|
-
Optional,
|
|
29
|
-
overload,
|
|
30
|
-
Tuple,
|
|
31
|
-
Type,
|
|
32
|
-
TYPE_CHECKING,
|
|
33
|
-
TypeVar,
|
|
34
|
-
Union,
|
|
35
|
-
)
|
|
24
|
+
from typing import Any, Callable, cast, Hashable, overload, TYPE_CHECKING, TypeVar
|
|
36
25
|
|
|
37
26
|
from typing_extensions import Protocol
|
|
38
27
|
|
|
@@ -83,10 +72,10 @@ class _LoggerNode:
|
|
|
83
72
|
|
|
84
73
|
transformer_id: int
|
|
85
74
|
transformer_name: str
|
|
86
|
-
initial_circuit:
|
|
87
|
-
final_circuit:
|
|
88
|
-
logs:
|
|
89
|
-
nested_loggers:
|
|
75
|
+
initial_circuit: cirq.AbstractCircuit
|
|
76
|
+
final_circuit: cirq.AbstractCircuit
|
|
77
|
+
logs: list[tuple[LogLevel, tuple[str, ...]]] = dataclasses.field(default_factory=list)
|
|
78
|
+
nested_loggers: list[int] = dataclasses.field(default_factory=list)
|
|
90
79
|
|
|
91
80
|
|
|
92
81
|
class TransformerLogger:
|
|
@@ -99,8 +88,8 @@ class TransformerLogger:
|
|
|
99
88
|
|
|
100
89
|
The logger assumes that
|
|
101
90
|
- Transformers are run sequentially.
|
|
102
|
-
- Nested transformers are allowed, in which case the behavior would be similar to
|
|
103
|
-
doing a depth
|
|
91
|
+
- Nested transformers are allowed, in which case the behavior would be similar to
|
|
92
|
+
doing a depth-first search on the graph of transformers -- i.e. the top level transformer
|
|
104
93
|
would end (i.e. receive a `register_final` call) once all nested transformers (i.e. all
|
|
105
94
|
`register_initial` calls received while the top level transformer was active) have
|
|
106
95
|
finished (i.e. corresponding `register_final` calls have also been received).
|
|
@@ -113,10 +102,10 @@ class TransformerLogger:
|
|
|
113
102
|
def __init__(self) -> None:
|
|
114
103
|
"""Initializes TransformerLogger."""
|
|
115
104
|
self._curr_id: int = 0
|
|
116
|
-
self._logs:
|
|
117
|
-
self._stack:
|
|
105
|
+
self._logs: list[_LoggerNode] = []
|
|
106
|
+
self._stack: list[int] = []
|
|
118
107
|
|
|
119
|
-
def register_initial(self, circuit:
|
|
108
|
+
def register_initial(self, circuit: cirq.AbstractCircuit, transformer_name: str) -> None:
|
|
120
109
|
"""Register the beginning of a new transformer stage.
|
|
121
110
|
|
|
122
111
|
Args:
|
|
@@ -143,7 +132,7 @@ class TransformerLogger:
|
|
|
143
132
|
raise ValueError('No active transformer found.')
|
|
144
133
|
self._logs[self._stack[-1]].logs.append((level, args))
|
|
145
134
|
|
|
146
|
-
def register_final(self, circuit:
|
|
135
|
+
def register_final(self, circuit: cirq.AbstractCircuit, transformer_name: str) -> None:
|
|
147
136
|
"""Register the end of the currently active transformer stage.
|
|
148
137
|
|
|
149
138
|
Args:
|
|
@@ -195,13 +184,13 @@ class TransformerLogger:
|
|
|
195
184
|
class NoOpTransformerLogger(TransformerLogger):
|
|
196
185
|
"""All calls to this logger are a no-op"""
|
|
197
186
|
|
|
198
|
-
def register_initial(self, circuit:
|
|
187
|
+
def register_initial(self, circuit: cirq.AbstractCircuit, transformer_name: str) -> None:
|
|
199
188
|
pass
|
|
200
189
|
|
|
201
190
|
def log(self, *args: str, level: LogLevel = LogLevel.INFO) -> None:
|
|
202
191
|
pass
|
|
203
192
|
|
|
204
|
-
def register_final(self, circuit:
|
|
193
|
+
def register_final(self, circuit: cirq.AbstractCircuit, transformer_name: str) -> None:
|
|
205
194
|
pass
|
|
206
195
|
|
|
207
196
|
def show(self, level: LogLevel = LogLevel.INFO) -> None:
|
|
@@ -225,7 +214,7 @@ class TransformerContext:
|
|
|
225
214
|
"""
|
|
226
215
|
|
|
227
216
|
logger: TransformerLogger = NoOpTransformerLogger()
|
|
228
|
-
tags_to_ignore:
|
|
217
|
+
tags_to_ignore: tuple[Hashable, ...] = ()
|
|
229
218
|
deep: bool = False
|
|
230
219
|
|
|
231
220
|
|
|
@@ -242,7 +231,7 @@ class TRANSFORMER(Protocol):
|
|
|
242
231
|
>>> def convert_to_cz(
|
|
243
232
|
... circuit: cirq.AbstractCircuit,
|
|
244
233
|
... *,
|
|
245
|
-
... context:
|
|
234
|
+
... context: cirq.TransformerContext | None = None,
|
|
246
235
|
... atol: float = 1e-8,
|
|
247
236
|
... ) -> cirq.Circuit:
|
|
248
237
|
... ...
|
|
@@ -256,21 +245,19 @@ class TRANSFORMER(Protocol):
|
|
|
256
245
|
... self,
|
|
257
246
|
... circuit: cirq.AbstractCircuit,
|
|
258
247
|
... *,
|
|
259
|
-
... context:
|
|
248
|
+
... context: cirq.TransformerContext | None = None,
|
|
260
249
|
... ) -> cirq.AbstractCircuit:
|
|
261
250
|
... ...
|
|
262
251
|
"""
|
|
263
252
|
|
|
264
253
|
def __call__(
|
|
265
|
-
self, circuit:
|
|
266
|
-
) ->
|
|
254
|
+
self, circuit: cirq.AbstractCircuit, *, context: TransformerContext | None = None
|
|
255
|
+
) -> cirq.AbstractCircuit: ...
|
|
267
256
|
|
|
268
257
|
|
|
269
258
|
_TRANSFORMER_T = TypeVar('_TRANSFORMER_T', bound=TRANSFORMER)
|
|
270
|
-
_TRANSFORMER_CLS_T = TypeVar('_TRANSFORMER_CLS_T', bound=
|
|
271
|
-
_TRANSFORMER_OR_CLS_T = TypeVar(
|
|
272
|
-
'_TRANSFORMER_OR_CLS_T', bound=Union[TRANSFORMER, Type[TRANSFORMER]]
|
|
273
|
-
)
|
|
259
|
+
_TRANSFORMER_CLS_T = TypeVar('_TRANSFORMER_CLS_T', bound=type[TRANSFORMER])
|
|
260
|
+
_TRANSFORMER_OR_CLS_T = TypeVar('_TRANSFORMER_OR_CLS_T', bound=TRANSFORMER | type[TRANSFORMER])
|
|
274
261
|
|
|
275
262
|
|
|
276
263
|
@overload
|
|
@@ -301,7 +288,7 @@ def transformer(cls_or_func: Any = None, *, add_deep_support: bool = False) -> A
|
|
|
301
288
|
|
|
302
289
|
>>> @cirq.transformer
|
|
303
290
|
... def convert_to_cz(
|
|
304
|
-
... circuit: cirq.AbstractCircuit, *, context:
|
|
291
|
+
... circuit: cirq.AbstractCircuit, *, context: cirq.TransformerContext | None = None
|
|
305
292
|
... ) -> cirq.Circuit:
|
|
306
293
|
... ...
|
|
307
294
|
|
|
@@ -315,7 +302,7 @@ def transformer(cls_or_func: Any = None, *, add_deep_support: bool = False) -> A
|
|
|
315
302
|
... self,
|
|
316
303
|
... circuit: cirq.AbstractCircuit,
|
|
317
304
|
... *,
|
|
318
|
-
... context:
|
|
305
|
+
... context: cirq.TransformerContext | None = None,
|
|
319
306
|
... ) -> cirq.Circuit:
|
|
320
307
|
... ...
|
|
321
308
|
|
|
@@ -326,7 +313,7 @@ def transformer(cls_or_func: Any = None, *, add_deep_support: bool = False) -> A
|
|
|
326
313
|
... def convert_to_sqrt_iswap(
|
|
327
314
|
... circuit: cirq.AbstractCircuit,
|
|
328
315
|
... *,
|
|
329
|
-
... context:
|
|
316
|
+
... context: cirq.TransformerContext | None = None,
|
|
330
317
|
... atol: float = 1e-8,
|
|
331
318
|
... sqrt_iswap_gate: cirq.ISwapPowGate = cirq.SQRT_ISWAP_INV,
|
|
332
319
|
... cleanup_operations: bool = True,
|
|
@@ -357,8 +344,8 @@ def transformer(cls_or_func: Any = None, *, add_deep_support: bool = False) -> A
|
|
|
357
344
|
|
|
358
345
|
@functools.wraps(method)
|
|
359
346
|
def method_with_logging(
|
|
360
|
-
self, circuit:
|
|
361
|
-
) ->
|
|
347
|
+
self, circuit: cirq.AbstractCircuit, **kwargs
|
|
348
|
+
) -> cirq.AbstractCircuit:
|
|
362
349
|
return _transform_and_log(
|
|
363
350
|
add_deep_support,
|
|
364
351
|
lambda circuit, **kwargs: method(self, circuit, **kwargs),
|
|
@@ -376,7 +363,7 @@ def transformer(cls_or_func: Any = None, *, add_deep_support: bool = False) -> A
|
|
|
376
363
|
default_context = _get_default_context(func)
|
|
377
364
|
|
|
378
365
|
@functools.wraps(func)
|
|
379
|
-
def func_with_logging(circuit:
|
|
366
|
+
def func_with_logging(circuit: cirq.AbstractCircuit, **kwargs) -> cirq.AbstractCircuit:
|
|
380
367
|
return _transform_and_log(
|
|
381
368
|
add_deep_support,
|
|
382
369
|
func,
|
|
@@ -401,10 +388,10 @@ def _get_default_context(func: TRANSFORMER) -> TransformerContext:
|
|
|
401
388
|
def _run_transformer_on_circuit(
|
|
402
389
|
add_deep_support: bool,
|
|
403
390
|
func: TRANSFORMER,
|
|
404
|
-
circuit:
|
|
405
|
-
extracted_context:
|
|
391
|
+
circuit: cirq.AbstractCircuit,
|
|
392
|
+
extracted_context: TransformerContext | None,
|
|
406
393
|
**kwargs,
|
|
407
|
-
) ->
|
|
394
|
+
) -> cirq.AbstractCircuit:
|
|
408
395
|
mutable_circuit = None
|
|
409
396
|
if extracted_context and extracted_context.deep and add_deep_support:
|
|
410
397
|
batch_replace = []
|
|
@@ -429,10 +416,10 @@ def _transform_and_log(
|
|
|
429
416
|
add_deep_support: bool,
|
|
430
417
|
func: TRANSFORMER,
|
|
431
418
|
transformer_name: str,
|
|
432
|
-
circuit:
|
|
433
|
-
extracted_context:
|
|
419
|
+
circuit: cirq.AbstractCircuit,
|
|
420
|
+
extracted_context: TransformerContext | None,
|
|
434
421
|
**kwargs,
|
|
435
|
-
) ->
|
|
422
|
+
) -> cirq.AbstractCircuit:
|
|
436
423
|
"""Helper to log initial and final circuits before and after calling the transformer."""
|
|
437
424
|
if extracted_context:
|
|
438
425
|
extracted_context.logger.register_initial(circuit, transformer_name)
|
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
16
17
|
from unittest import mock
|
|
17
18
|
|
|
18
19
|
import pytest
|
|
@@ -27,7 +28,7 @@ class MockTransformerClass:
|
|
|
27
28
|
self.mock = mock.Mock()
|
|
28
29
|
|
|
29
30
|
def __call__(
|
|
30
|
-
self, circuit: cirq.AbstractCircuit, *, context:
|
|
31
|
+
self, circuit: cirq.AbstractCircuit, *, context: cirq.TransformerContext | None = None
|
|
31
32
|
) -> cirq.Circuit:
|
|
32
33
|
self.mock(circuit, context)
|
|
33
34
|
return circuit.unfreeze()
|
|
@@ -51,7 +52,7 @@ class MockTransformerClassWithDefaults:
|
|
|
51
52
|
self,
|
|
52
53
|
circuit: cirq.AbstractCircuit,
|
|
53
54
|
*,
|
|
54
|
-
context:
|
|
55
|
+
context: cirq.TransformerContext | None = cirq.TransformerContext(),
|
|
55
56
|
atol: float = 1e-4,
|
|
56
57
|
custom_arg: CustomArg = CustomArg(),
|
|
57
58
|
) -> cirq.AbstractCircuit:
|
|
@@ -71,7 +72,7 @@ def make_transformer_func_with_defaults() -> cirq.TRANSFORMER:
|
|
|
71
72
|
def func(
|
|
72
73
|
circuit: cirq.AbstractCircuit,
|
|
73
74
|
*,
|
|
74
|
-
context:
|
|
75
|
+
context: cirq.TransformerContext | None = cirq.TransformerContext(),
|
|
75
76
|
atol: float = 1e-4,
|
|
76
77
|
custom_arg: CustomArg = CustomArg(),
|
|
77
78
|
) -> cirq.FrozenCircuit:
|
|
@@ -87,7 +88,7 @@ def make_transformer_func(add_deep_support: bool = False) -> cirq.TRANSFORMER:
|
|
|
87
88
|
|
|
88
89
|
@cirq.transformer(add_deep_support=add_deep_support)
|
|
89
90
|
def mock_tranformer_func(
|
|
90
|
-
circuit: cirq.AbstractCircuit, *, context:
|
|
91
|
+
circuit: cirq.AbstractCircuit, *, context: cirq.TransformerContext | None = None
|
|
91
92
|
) -> cirq.Circuit:
|
|
92
93
|
my_mock(circuit, context)
|
|
93
94
|
return circuit.unfreeze()
|
|
@@ -177,7 +178,7 @@ def test_transformer_decorator_adds_support_for_deep(transformer, supports_deep)
|
|
|
177
178
|
@cirq.transformer
|
|
178
179
|
class T1:
|
|
179
180
|
def __call__(
|
|
180
|
-
self, circuit: cirq.AbstractCircuit, context:
|
|
181
|
+
self, circuit: cirq.AbstractCircuit, context: cirq.TransformerContext | None = None
|
|
181
182
|
) -> cirq.AbstractCircuit:
|
|
182
183
|
assert context is not None
|
|
183
184
|
context.logger.log("First Verbose Log", "of T1", level=LogLevel.DEBUG)
|
|
@@ -191,7 +192,7 @@ t1 = T1()
|
|
|
191
192
|
|
|
192
193
|
@cirq.transformer
|
|
193
194
|
def t2(
|
|
194
|
-
circuit: cirq.AbstractCircuit, context:
|
|
195
|
+
circuit: cirq.AbstractCircuit, context: cirq.TransformerContext | None = None
|
|
195
196
|
) -> cirq.FrozenCircuit:
|
|
196
197
|
assert context is not None
|
|
197
198
|
context.logger.log("First INFO Log", "of T2 Start")
|
|
@@ -202,7 +203,7 @@ def t2(
|
|
|
202
203
|
|
|
203
204
|
@cirq.transformer
|
|
204
205
|
def t3(
|
|
205
|
-
circuit: cirq.AbstractCircuit, context:
|
|
206
|
+
circuit: cirq.AbstractCircuit, context: cirq.TransformerContext | None = None
|
|
206
207
|
) -> cirq.Circuit:
|
|
207
208
|
assert context is not None
|
|
208
209
|
context.logger.log("First INFO Log", "of T3 Start")
|