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,12 +14,14 @@
|
|
|
14
14
|
|
|
15
15
|
"""Creates the abstraction for gauge compiling as a cirq transformer."""
|
|
16
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
17
19
|
import abc
|
|
18
20
|
import functools
|
|
19
21
|
import itertools
|
|
20
22
|
from dataclasses import dataclass
|
|
21
23
|
from numbers import Real
|
|
22
|
-
from typing import Callable,
|
|
24
|
+
from typing import Callable, Sequence, TYPE_CHECKING
|
|
23
25
|
|
|
24
26
|
import numpy as np
|
|
25
27
|
import sympy
|
|
@@ -28,11 +30,13 @@ from attrs import field, frozen
|
|
|
28
30
|
from cirq import circuits, ops
|
|
29
31
|
from cirq.protocols import unitary_protocol
|
|
30
32
|
from cirq.protocols.has_unitary_protocol import has_unitary
|
|
31
|
-
from cirq.study import sweepable
|
|
32
33
|
from cirq.study.sweeps import Points, Zip
|
|
33
34
|
from cirq.transformers import transformer_api
|
|
34
35
|
from cirq.transformers.analytical_decompositions import single_qubit_decompositions
|
|
35
36
|
|
|
37
|
+
if TYPE_CHECKING:
|
|
38
|
+
import cirq
|
|
39
|
+
|
|
36
40
|
|
|
37
41
|
class Gauge(abc.ABC):
|
|
38
42
|
"""A gauge replaces a two qubit gate with an equivalent subcircuit.
|
|
@@ -49,7 +53,7 @@ class Gauge(abc.ABC):
|
|
|
49
53
|
return 1.0
|
|
50
54
|
|
|
51
55
|
@abc.abstractmethod
|
|
52
|
-
def sample(self, gate: ops.Gate, prng: np.random.Generator) ->
|
|
56
|
+
def sample(self, gate: ops.Gate, prng: np.random.Generator) -> ConstantGauge:
|
|
53
57
|
"""Returns a ConstantGauge sampled from a family of gauges.
|
|
54
58
|
|
|
55
59
|
Args:
|
|
@@ -66,30 +70,30 @@ class ConstantGauge(Gauge):
|
|
|
66
70
|
"""A gauge that replaces a two qubit gate with a constant gauge."""
|
|
67
71
|
|
|
68
72
|
two_qubit_gate: ops.Gate
|
|
69
|
-
pre_q0:
|
|
73
|
+
pre_q0: tuple[ops.Gate, ...] = field(
|
|
70
74
|
default=(), converter=lambda g: (g,) if isinstance(g, ops.Gate) else tuple(g)
|
|
71
75
|
)
|
|
72
|
-
pre_q1:
|
|
76
|
+
pre_q1: tuple[ops.Gate, ...] = field(
|
|
73
77
|
default=(), converter=lambda g: (g,) if isinstance(g, ops.Gate) else tuple(g)
|
|
74
78
|
)
|
|
75
|
-
post_q0:
|
|
79
|
+
post_q0: tuple[ops.Gate, ...] = field(
|
|
76
80
|
default=(), converter=lambda g: (g,) if isinstance(g, ops.Gate) else tuple(g)
|
|
77
81
|
)
|
|
78
|
-
post_q1:
|
|
82
|
+
post_q1: tuple[ops.Gate, ...] = field(
|
|
79
83
|
default=(), converter=lambda g: (g,) if isinstance(g, ops.Gate) else tuple(g)
|
|
80
84
|
)
|
|
81
85
|
swap_qubits: bool = False
|
|
82
86
|
|
|
83
|
-
def sample(self, gate: ops.Gate, prng: np.random.Generator) ->
|
|
87
|
+
def sample(self, gate: ops.Gate, prng: np.random.Generator) -> ConstantGauge:
|
|
84
88
|
return self
|
|
85
89
|
|
|
86
90
|
@property
|
|
87
|
-
def pre(self) ->
|
|
91
|
+
def pre(self) -> tuple[tuple[ops.Gate, ...], tuple[ops.Gate, ...]]:
|
|
88
92
|
"""A tuple (ops to apply to q0, ops to apply to q1)."""
|
|
89
93
|
return self.pre_q0, self.pre_q1
|
|
90
94
|
|
|
91
95
|
@property
|
|
92
|
-
def post(self) ->
|
|
96
|
+
def post(self) -> tuple[tuple[ops.Gate, ...], tuple[ops.Gate, ...]]:
|
|
93
97
|
"""A tuple (ops to apply to q0, ops to apply to q1)."""
|
|
94
98
|
return self.post_q0, self.post_q1
|
|
95
99
|
|
|
@@ -104,16 +108,16 @@ class ConstantGauge(Gauge):
|
|
|
104
108
|
class SameGateGauge(Gauge):
|
|
105
109
|
"""Same as ConstantGauge but the new two-qubit gate equals the old gate."""
|
|
106
110
|
|
|
107
|
-
pre_q0:
|
|
111
|
+
pre_q0: tuple[ops.Gate, ...] = field(
|
|
108
112
|
default=(), converter=lambda g: (g,) if isinstance(g, ops.Gate) else tuple(g)
|
|
109
113
|
)
|
|
110
|
-
pre_q1:
|
|
114
|
+
pre_q1: tuple[ops.Gate, ...] = field(
|
|
111
115
|
default=(), converter=lambda g: (g,) if isinstance(g, ops.Gate) else tuple(g)
|
|
112
116
|
)
|
|
113
|
-
post_q0:
|
|
117
|
+
post_q0: tuple[ops.Gate, ...] = field(
|
|
114
118
|
default=(), converter=lambda g: (g,) if isinstance(g, ops.Gate) else tuple(g)
|
|
115
119
|
)
|
|
116
|
-
post_q1:
|
|
120
|
+
post_q1: tuple[ops.Gate, ...] = field(
|
|
117
121
|
default=(), converter=lambda g: (g,) if isinstance(g, ops.Gate) else tuple(g)
|
|
118
122
|
)
|
|
119
123
|
swap_qubits: bool = False
|
|
@@ -140,12 +144,12 @@ class TwoQubitGateSymbolizer:
|
|
|
140
144
|
n_symbols: The number of symbols to use for parameterization.
|
|
141
145
|
"""
|
|
142
146
|
|
|
143
|
-
symbolizer_fn: Callable[[ops.Gate, Sequence[sympy.Symbol]],
|
|
147
|
+
symbolizer_fn: Callable[[ops.Gate, Sequence[sympy.Symbol]], tuple[ops.Gate, dict[str, Real]]]
|
|
144
148
|
n_symbols: int
|
|
145
149
|
|
|
146
150
|
def __call__(
|
|
147
151
|
self, two_qubit_gate: ops.Gate, symbols: Sequence[sympy.Symbol]
|
|
148
|
-
) ->
|
|
152
|
+
) -> tuple[ops.Gate, dict[str, Real]]:
|
|
149
153
|
"""Symbolizes a two qubit gate to a parameterized gate.
|
|
150
154
|
|
|
151
155
|
Args:
|
|
@@ -193,9 +197,9 @@ class GaugeTransformer:
|
|
|
193
197
|
self,
|
|
194
198
|
# target can be either a specific gate, gatefamily or gateset
|
|
195
199
|
# which allows matching parametric gates.
|
|
196
|
-
target:
|
|
200
|
+
target: ops.Gate | ops.Gateset | ops.GateFamily,
|
|
197
201
|
gauge_selector: Callable[[np.random.Generator], Gauge],
|
|
198
|
-
two_qubit_gate_symbolizer:
|
|
202
|
+
two_qubit_gate_symbolizer: TwoQubitGateSymbolizer | None = None,
|
|
199
203
|
) -> None:
|
|
200
204
|
"""Constructs a GaugeTransformer.
|
|
201
205
|
|
|
@@ -213,8 +217,8 @@ class GaugeTransformer:
|
|
|
213
217
|
self,
|
|
214
218
|
circuit: circuits.AbstractCircuit,
|
|
215
219
|
*,
|
|
216
|
-
context:
|
|
217
|
-
prng:
|
|
220
|
+
context: transformer_api.TransformerContext | None = None,
|
|
221
|
+
prng: np.random.Generator | None = None,
|
|
218
222
|
) -> circuits.AbstractCircuit:
|
|
219
223
|
rng = np.random.default_rng() if prng is None else prng
|
|
220
224
|
if context is None:
|
|
@@ -222,12 +226,12 @@ class GaugeTransformer:
|
|
|
222
226
|
if context.deep:
|
|
223
227
|
raise ValueError('GaugeTransformer cannot be used with deep=True')
|
|
224
228
|
new_moments = []
|
|
225
|
-
left:
|
|
226
|
-
right:
|
|
229
|
+
left: list[list[ops.Operation]] = []
|
|
230
|
+
right: list[list[ops.Operation]] = []
|
|
227
231
|
for moment in circuit:
|
|
228
232
|
left.clear()
|
|
229
233
|
right.clear()
|
|
230
|
-
center:
|
|
234
|
+
center: list[ops.Operation] = []
|
|
231
235
|
for op in moment:
|
|
232
236
|
if isinstance(op, ops.TaggedOperation) and set(op.tags).intersection(
|
|
233
237
|
context.tags_to_ignore
|
|
@@ -254,9 +258,9 @@ class GaugeTransformer:
|
|
|
254
258
|
circuit: circuits.AbstractCircuit,
|
|
255
259
|
*,
|
|
256
260
|
N: int,
|
|
257
|
-
context:
|
|
258
|
-
prng:
|
|
259
|
-
) ->
|
|
261
|
+
context: transformer_api.TransformerContext | None = None,
|
|
262
|
+
prng: np.random.Generator | None = None,
|
|
263
|
+
) -> tuple[circuits.AbstractCircuit, cirq.Sweepable]:
|
|
260
264
|
"""Generates a parameterized circuit with *N* sets of sweepable parameters.
|
|
261
265
|
|
|
262
266
|
Args:
|
|
@@ -272,31 +276,31 @@ class GaugeTransformer:
|
|
|
272
276
|
context = transformer_api.TransformerContext(deep=False)
|
|
273
277
|
if context.deep:
|
|
274
278
|
raise ValueError('GaugeTransformer cannot be used with deep=True')
|
|
275
|
-
new_moments:
|
|
279
|
+
new_moments: list[list[ops.Operation]] = [] # Store parameterized circuits.
|
|
276
280
|
phxz_sid = itertools.count()
|
|
277
281
|
two_qubit_gate_sid = itertools.count()
|
|
278
282
|
# Map from "((pre|post),$qid,$moment_id)" to gate parameters.
|
|
279
283
|
# E.g., {(post,q1,2): {"x_exponent": "x1", "z_exponent": "z1", "axis_phase": "a1"}}
|
|
280
|
-
phxz_symbols_by_locs:
|
|
284
|
+
phxz_symbols_by_locs: dict[tuple[str, ops.Qid, int], dict[str, sympy.Symbol]] = {}
|
|
281
285
|
# Map from "($q0,$q1,$moment_id)" to gate parameters.
|
|
282
286
|
# E.g., {(q0,q1,0): ["s0"]}.
|
|
283
|
-
two_qubit_gate_symbols_by_locs:
|
|
287
|
+
two_qubit_gate_symbols_by_locs: dict[tuple[ops.Qid, ops.Qid, int], list[sympy.Symbol]] = {}
|
|
284
288
|
|
|
285
|
-
def single_qubit_next_symbol() ->
|
|
289
|
+
def single_qubit_next_symbol() -> dict[str, sympy.Symbol]:
|
|
286
290
|
sid = next(phxz_sid)
|
|
287
291
|
return _parameterize_to_phxz(sid)
|
|
288
292
|
|
|
289
|
-
def two_qubit_gate_next_symbol_list(n: int) ->
|
|
293
|
+
def two_qubit_gate_next_symbol_list(n: int) -> list[sympy.Symbol]:
|
|
290
294
|
"""Returns symbols for 2 qubit gate parameterization."""
|
|
291
295
|
sid = next(two_qubit_gate_sid)
|
|
292
|
-
symbols:
|
|
296
|
+
symbols: list[sympy.Symbol] = [sympy.Symbol(f"s{sid}_{sub}") for sub in range(n)]
|
|
293
297
|
return symbols
|
|
294
298
|
|
|
295
299
|
# Build parameterized circuit.
|
|
296
300
|
for moment_id, moment in enumerate(circuit):
|
|
297
|
-
center_moment:
|
|
298
|
-
left_moment:
|
|
299
|
-
right_moment:
|
|
301
|
+
center_moment: list[ops.Operation] = []
|
|
302
|
+
left_moment: list[ops.Operation] = []
|
|
303
|
+
right_moment: list[ops.Operation] = []
|
|
300
304
|
for op in moment:
|
|
301
305
|
if isinstance(op, ops.TaggedOperation) and set(op.tags).intersection(
|
|
302
306
|
context.tags_to_ignore
|
|
@@ -338,7 +342,7 @@ class GaugeTransformer:
|
|
|
338
342
|
)
|
|
339
343
|
|
|
340
344
|
# Initialize the map from symbol names to their N values.
|
|
341
|
-
values_by_params:
|
|
345
|
+
values_by_params: dict[str, list[float]] = {
|
|
342
346
|
**{
|
|
343
347
|
str(symbol): []
|
|
344
348
|
for symbols_by_names in phxz_symbols_by_locs.values()
|
|
@@ -385,14 +389,14 @@ class GaugeTransformer:
|
|
|
385
389
|
for key, value in phxz_params.items():
|
|
386
390
|
values_by_params[key].append(float(value))
|
|
387
391
|
|
|
388
|
-
sweeps:
|
|
392
|
+
sweeps: list[Points] = [
|
|
389
393
|
Points(key=key, points=values) for key, values in values_by_params.items()
|
|
390
394
|
]
|
|
391
395
|
|
|
392
396
|
return circuits.Circuit.from_moments(*new_moments), Zip(*sweeps)
|
|
393
397
|
|
|
394
398
|
|
|
395
|
-
def _build_moments(operation_by_qubits:
|
|
399
|
+
def _build_moments(operation_by_qubits: list[list[ops.Operation]]) -> list[list[ops.Operation]]:
|
|
396
400
|
"""Builds moments from a list of operations grouped by qubits.
|
|
397
401
|
|
|
398
402
|
Returns a list of moments from a list whose ith element is a list of operations applied
|
|
@@ -404,7 +408,7 @@ def _build_moments(operation_by_qubits: List[List[ops.Operation]]) -> List[List[
|
|
|
404
408
|
return moments
|
|
405
409
|
|
|
406
410
|
|
|
407
|
-
def _parameterize_to_phxz(symbol_id: int) ->
|
|
411
|
+
def _parameterize_to_phxz(symbol_id: int) -> dict[str, sympy.Symbol]:
|
|
408
412
|
"""Returns symbolized parameters for the gate."""
|
|
409
413
|
|
|
410
414
|
# Parameterize single qubit gate to parameterized PhasedXZGate.
|
|
@@ -417,8 +421,8 @@ def _parameterize_to_phxz(symbol_id: int) -> Dict[str, sympy.Symbol]:
|
|
|
417
421
|
|
|
418
422
|
|
|
419
423
|
def _gate_sequence_to_phxz_params(
|
|
420
|
-
gates:
|
|
421
|
-
) ->
|
|
424
|
+
gates: tuple[ops.Gate, ...], xza_by_symbols: dict[str, sympy.Symbol]
|
|
425
|
+
) -> dict[str, float]:
|
|
422
426
|
identity_gate_in_phxz = {
|
|
423
427
|
str(xza_by_symbols["x_exponent"]): 0.0,
|
|
424
428
|
str(xza_by_symbols["z_exponent"]): 0.0,
|
|
@@ -12,13 +12,17 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
15
16
|
|
|
16
|
-
|
|
17
|
+
from typing import TYPE_CHECKING
|
|
17
18
|
|
|
18
19
|
import cirq
|
|
19
20
|
from cirq.transformers import ConstantGauge, GaugeSelector, GaugeTransformer
|
|
20
21
|
from cirq.transformers.gauge_compiling.gauge_compiling_test_utils import GaugeTester
|
|
21
22
|
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
import numpy as np
|
|
25
|
+
|
|
22
26
|
|
|
23
27
|
class ExampleGate(cirq.testing.TwoQubitGate):
|
|
24
28
|
unitary = cirq.unitary(cirq.CZ**0.123)
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import cirq
|
|
16
18
|
from cirq.transformers.gauge_compiling import SpinInversionGaugeTransformer
|
|
17
19
|
from cirq.transformers.gauge_compiling.gauge_compiling_test_utils import GaugeTester
|
|
@@ -14,12 +14,10 @@
|
|
|
14
14
|
|
|
15
15
|
"""A Gauge transformer for CZ**0.5 and CZ**-0.5 gates."""
|
|
16
16
|
|
|
17
|
+
from __future__ import annotations
|
|
17
18
|
|
|
18
19
|
from numbers import Real
|
|
19
|
-
from typing import
|
|
20
|
-
|
|
21
|
-
import numpy as np
|
|
22
|
-
import sympy
|
|
20
|
+
from typing import Sequence, TYPE_CHECKING
|
|
23
21
|
|
|
24
22
|
from cirq.ops import CZ, CZPowGate, Gate, Gateset, S, X
|
|
25
23
|
from cirq.transformers.gauge_compiling.gauge_compiling import (
|
|
@@ -31,6 +29,9 @@ from cirq.transformers.gauge_compiling.gauge_compiling import (
|
|
|
31
29
|
)
|
|
32
30
|
|
|
33
31
|
if TYPE_CHECKING:
|
|
32
|
+
import numpy as np
|
|
33
|
+
import sympy
|
|
34
|
+
|
|
34
35
|
import cirq
|
|
35
36
|
|
|
36
37
|
_SQRT_CZ = CZ**0.5
|
|
@@ -42,7 +43,7 @@ class SqrtCZGauge(Gauge):
|
|
|
42
43
|
def weight(self) -> float:
|
|
43
44
|
return 3.0
|
|
44
45
|
|
|
45
|
-
def sample(self, gate:
|
|
46
|
+
def sample(self, gate: cirq.Gate, prng: np.random.Generator) -> ConstantGauge:
|
|
46
47
|
if prng.choice([True, False]):
|
|
47
48
|
return ConstantGauge(two_qubit_gate=gate)
|
|
48
49
|
swap_qubits = prng.choice([True, False])
|
|
@@ -65,7 +66,7 @@ class SqrtCZGauge(Gauge):
|
|
|
65
66
|
|
|
66
67
|
def _symbolize_as_cz_pow(
|
|
67
68
|
two_qubit_gate: Gate, symbols: Sequence[sympy.Symbol]
|
|
68
|
-
) ->
|
|
69
|
+
) -> tuple[Gate, dict[str, Real]]:
|
|
69
70
|
"""Symbolizes a CZPowGate to a parameterized CZPowGate."""
|
|
70
71
|
|
|
71
72
|
if not isinstance(two_qubit_gate, CZPowGate) or not isinstance(two_qubit_gate.exponent, Real):
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import cirq
|
|
16
18
|
from cirq.transformers.gauge_compiling import SqrtCZGaugeTransformer
|
|
17
19
|
from cirq.transformers.gauge_compiling.gauge_compiling_test_utils import GaugeTester
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import cirq
|
|
16
18
|
from cirq.transformers.gauge_compiling import SqrtISWAPGaugeTransformer
|
|
17
19
|
from cirq.transformers.gauge_compiling.gauge_compiling_test_utils import GaugeTester
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
# pylint: disable=wrong-or-nonexistent-copyright-notice
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
2
5
|
import itertools
|
|
3
|
-
from typing import
|
|
6
|
+
from typing import Sequence
|
|
4
7
|
|
|
5
8
|
import numpy as np
|
|
6
9
|
|
|
7
10
|
from cirq.value import random_state
|
|
8
11
|
|
|
9
|
-
_RealArraylike =
|
|
12
|
+
_RealArraylike = np.ndarray | float
|
|
10
13
|
|
|
11
14
|
|
|
12
15
|
def _single_qubit_unitary(
|
|
@@ -45,7 +48,7 @@ def _single_qubit_unitary(
|
|
|
45
48
|
def random_qubit_unitary(
|
|
46
49
|
shape: Sequence[int] = (),
|
|
47
50
|
randomize_global_phase: bool = False,
|
|
48
|
-
rng:
|
|
51
|
+
rng: np.random.RandomState | None = None,
|
|
49
52
|
) -> np.ndarray:
|
|
50
53
|
"""Random qubit unitary distributed over the Haar measure.
|
|
51
54
|
|
|
@@ -14,9 +14,12 @@
|
|
|
14
14
|
|
|
15
15
|
"""Attempt to tabulate single qubit gates required to generate a target 2Q gate
|
|
16
16
|
with a product A k A."""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
17
20
|
from dataclasses import dataclass
|
|
18
21
|
from functools import reduce
|
|
19
|
-
from typing import
|
|
22
|
+
from typing import NamedTuple, Sequence
|
|
20
23
|
|
|
21
24
|
import numpy as np
|
|
22
25
|
|
|
@@ -31,7 +34,7 @@ from cirq.transformers.heuristic_decompositions.gate_tabulation_math_utils impor
|
|
|
31
34
|
weyl_chamber_mesh,
|
|
32
35
|
)
|
|
33
36
|
|
|
34
|
-
_SingleQubitGatePair =
|
|
37
|
+
_SingleQubitGatePair = tuple[np.ndarray, np.ndarray]
|
|
35
38
|
|
|
36
39
|
|
|
37
40
|
class TwoQubitGateTabulationResult(NamedTuple):
|
|
@@ -58,7 +61,7 @@ class TwoQubitGateTabulationResult(NamedTuple):
|
|
|
58
61
|
|
|
59
62
|
base_gate_unitary: np.ndarray
|
|
60
63
|
target_gate: np.ndarray
|
|
61
|
-
local_unitaries:
|
|
64
|
+
local_unitaries: tuple[_SingleQubitGatePair, ...]
|
|
62
65
|
actual_gate: np.ndarray
|
|
63
66
|
success: bool
|
|
64
67
|
|
|
@@ -79,7 +82,7 @@ class TwoQubitGateTabulation:
|
|
|
79
82
|
summary: str # Text summarizing the results of the tabulation procedure.
|
|
80
83
|
# Any KAK vectors which are expected to be compilable (within infidelity
|
|
81
84
|
# max_expected_infidelity) using 2 or 3 base gates.
|
|
82
|
-
missed_points:
|
|
85
|
+
missed_points: tuple[np.ndarray, ...]
|
|
83
86
|
|
|
84
87
|
def compile_two_qubit_gate(self, unitary: np.ndarray) -> TwoQubitGateTabulationResult:
|
|
85
88
|
r"""Compute single qubit gates required to compile a desired unitary.
|
|
@@ -198,7 +201,7 @@ class TwoQubitGateTabulation:
|
|
|
198
201
|
|
|
199
202
|
def _outer_locals_for_unitary(
|
|
200
203
|
target: np.ndarray, base: np.ndarray
|
|
201
|
-
) ->
|
|
204
|
+
) -> tuple[_SingleQubitGatePair, _SingleQubitGatePair, np.ndarray]:
|
|
202
205
|
"""Local unitaries mapping between locally equivalent 2-local unitaries.
|
|
203
206
|
|
|
204
207
|
Finds the left and right 1-local unitaries kL, kR such that
|
|
@@ -243,10 +246,10 @@ def _outer_locals_for_unitary(
|
|
|
243
246
|
|
|
244
247
|
class _TabulationStepResult(NamedTuple):
|
|
245
248
|
# Generated KAK vectors that are uniquely close to at least one mesh point.
|
|
246
|
-
kept_kaks:
|
|
249
|
+
kept_kaks: list[np.ndarray]
|
|
247
250
|
# The corresponding single qubit unitaries required to obtain the desired
|
|
248
251
|
# KAK vectors.
|
|
249
|
-
kept_cycles:
|
|
252
|
+
kept_cycles: list[tuple[_SingleQubitGatePair, ...]]
|
|
250
253
|
|
|
251
254
|
|
|
252
255
|
def _tabulate_kak_vectors(
|
|
@@ -316,7 +319,7 @@ def two_qubit_gate_product_tabulation(
|
|
|
316
319
|
*,
|
|
317
320
|
sample_scaling: int = 50,
|
|
318
321
|
allow_missed_points: bool = True,
|
|
319
|
-
random_state:
|
|
322
|
+
random_state: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
|
|
320
323
|
) -> TwoQubitGateTabulation:
|
|
321
324
|
r"""Generate a TwoQubitGateTabulation for a base two qubit unitary.
|
|
322
325
|
|
|
@@ -358,7 +361,7 @@ def two_qubit_gate_product_tabulation(
|
|
|
358
361
|
|
|
359
362
|
# include the base gate itself
|
|
360
363
|
kak_vecs = [cirq.kak_vector(base_gate, check_preconditions=False)]
|
|
361
|
-
sq_cycles:
|
|
364
|
+
sq_cycles: list[tuple[_SingleQubitGatePair, ...]] = [()]
|
|
362
365
|
|
|
363
366
|
# Tabulate gates that are close to gates in the mesh
|
|
364
367
|
u_locals_0 = random_qubit_unitary((num_samples,), rng=rng)
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import numpy as np
|
|
16
18
|
import pytest
|
|
17
19
|
|
|
@@ -41,7 +43,7 @@ _random_2Q_unitaries = np.array([random_special_unitary(4, random_state=_rng) fo
|
|
|
41
43
|
|
|
42
44
|
@pytest.mark.parametrize('tabulation', [sycamore_tabulation, sqrt_iswap_tabulation])
|
|
43
45
|
@pytest.mark.parametrize('target', _random_2Q_unitaries)
|
|
44
|
-
def test_gate_compilation_matches_expected_max_infidelity(tabulation, target):
|
|
46
|
+
def test_gate_compilation_matches_expected_max_infidelity(tabulation, target) -> None:
|
|
45
47
|
result = tabulation.compile_two_qubit_gate(target)
|
|
46
48
|
|
|
47
49
|
assert result.success
|
|
@@ -50,7 +52,7 @@ def test_gate_compilation_matches_expected_max_infidelity(tabulation, target):
|
|
|
50
52
|
|
|
51
53
|
|
|
52
54
|
@pytest.mark.parametrize('tabulation', [sycamore_tabulation, sqrt_iswap_tabulation])
|
|
53
|
-
def test_gate_compilation_on_base_gate_standard(tabulation):
|
|
55
|
+
def test_gate_compilation_on_base_gate_standard(tabulation) -> None:
|
|
54
56
|
base_gate = tabulation.base_gate
|
|
55
57
|
|
|
56
58
|
result = tabulation.compile_two_qubit_gate(base_gate)
|
|
@@ -61,7 +63,7 @@ def test_gate_compilation_on_base_gate_standard(tabulation):
|
|
|
61
63
|
assert fidelity > 0.99999
|
|
62
64
|
|
|
63
65
|
|
|
64
|
-
def test_gate_compilation_on_base_gate_identity():
|
|
66
|
+
def test_gate_compilation_on_base_gate_identity() -> None:
|
|
65
67
|
tabulation = two_qubit_gate_product_tabulation(np.eye(4), 0.25)
|
|
66
68
|
base_gate = tabulation.base_gate
|
|
67
69
|
|
|
@@ -73,7 +75,7 @@ def test_gate_compilation_on_base_gate_identity():
|
|
|
73
75
|
assert fidelity > 0.99999
|
|
74
76
|
|
|
75
77
|
|
|
76
|
-
def test_gate_compilation_missing_points_raises_error():
|
|
78
|
+
def test_gate_compilation_missing_points_raises_error() -> None:
|
|
77
79
|
with pytest.raises(ValueError, match='Failed to tabulate a'):
|
|
78
80
|
two_qubit_gate_product_tabulation(
|
|
79
81
|
np.eye(4), 0.4, allow_missed_points=False, random_state=_rng
|
|
@@ -81,7 +83,7 @@ def test_gate_compilation_missing_points_raises_error():
|
|
|
81
83
|
|
|
82
84
|
|
|
83
85
|
@pytest.mark.parametrize('seed', [0, 1])
|
|
84
|
-
def test_sycamore_gate_tabulation(seed):
|
|
86
|
+
def test_sycamore_gate_tabulation(seed) -> None:
|
|
85
87
|
base_gate = cirq.unitary(cirq.FSimGate(np.pi / 2, np.pi / 6))
|
|
86
88
|
tab = two_qubit_gate_product_tabulation(
|
|
87
89
|
base_gate, 0.1, sample_scaling=2, random_state=np.random.RandomState(seed)
|
|
@@ -90,7 +92,7 @@ def test_sycamore_gate_tabulation(seed):
|
|
|
90
92
|
assert result.success
|
|
91
93
|
|
|
92
94
|
|
|
93
|
-
def test_sycamore_gate_tabulation_repr():
|
|
95
|
+
def test_sycamore_gate_tabulation_repr() -> None:
|
|
94
96
|
simple_tabulation = TwoQubitGateTabulation(
|
|
95
97
|
np.array([[(1 + 0j), 0j, 0j, 0j]], dtype=np.complex128),
|
|
96
98
|
np.array([[(1 + 0j), 0j, 0j, 0j]], dtype=np.complex128),
|
|
@@ -102,7 +104,7 @@ def test_sycamore_gate_tabulation_repr():
|
|
|
102
104
|
assert_equivalent_repr(simple_tabulation)
|
|
103
105
|
|
|
104
106
|
|
|
105
|
-
def test_sycamore_gate_tabulation_eq():
|
|
107
|
+
def test_sycamore_gate_tabulation_eq() -> None:
|
|
106
108
|
assert sycamore_tabulation == sycamore_tabulation
|
|
107
109
|
assert sycamore_tabulation != sqrt_iswap_tabulation
|
|
108
110
|
assert sycamore_tabulation != 1
|
|
@@ -14,7 +14,9 @@
|
|
|
14
14
|
|
|
15
15
|
"""Transformer that sorts commuting operations in increasing order of their `.qubits` tuple."""
|
|
16
16
|
|
|
17
|
-
from
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
from typing import TYPE_CHECKING
|
|
18
20
|
|
|
19
21
|
from cirq import circuits, protocols
|
|
20
22
|
from cirq.transformers import transformer_api
|
|
@@ -25,8 +27,8 @@ if TYPE_CHECKING:
|
|
|
25
27
|
|
|
26
28
|
@transformer_api.transformer(add_deep_support=True)
|
|
27
29
|
def insertion_sort_transformer(
|
|
28
|
-
circuit:
|
|
29
|
-
) ->
|
|
30
|
+
circuit: cirq.AbstractCircuit, *, context: cirq.TransformerContext | None = None
|
|
31
|
+
) -> cirq.Circuit:
|
|
30
32
|
"""Sorts the operations using their sorted `.qubits` property as comparison key.
|
|
31
33
|
|
|
32
34
|
Operations are swapped only if they commute.
|
|
@@ -35,11 +37,11 @@ def insertion_sort_transformer(
|
|
|
35
37
|
circuit: input circuit.
|
|
36
38
|
context: optional TransformerContext (not used),
|
|
37
39
|
"""
|
|
38
|
-
final_operations:
|
|
39
|
-
qubit_index:
|
|
40
|
+
final_operations: list[cirq.Operation] = []
|
|
41
|
+
qubit_index: dict[cirq.Qid, int] = {
|
|
40
42
|
q: idx for idx, q in enumerate(sorted(circuit.all_qubits()))
|
|
41
43
|
}
|
|
42
|
-
cached_qubit_indices:
|
|
44
|
+
cached_qubit_indices: dict[int, list[int]] = {}
|
|
43
45
|
for pos, op in enumerate(circuit.all_operations()):
|
|
44
46
|
# here `pos` is at the append position of final_operations
|
|
45
47
|
if (op_qubit_indices := cached_qubit_indices.get(id(op))) is None:
|
|
@@ -12,11 +12,13 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import cirq
|
|
16
18
|
import cirq.transformers
|
|
17
19
|
|
|
18
20
|
|
|
19
|
-
def test_insertion_sort():
|
|
21
|
+
def test_insertion_sort() -> None:
|
|
20
22
|
c = cirq.Circuit(
|
|
21
23
|
cirq.CZ(cirq.q(2), cirq.q(1)),
|
|
22
24
|
cirq.CZ(cirq.q(2), cirq.q(4)),
|