cirq-core 1.5.0.dev20250409222543__py3-none-any.whl → 1.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of cirq-core might be problematic. Click here for more details.
- cirq/__init__.py +16 -17
- cirq/_compat.py +21 -20
- cirq/_compat_test.py +14 -34
- cirq/_doc.py +4 -2
- cirq/_import.py +8 -6
- cirq/_import_test.py +4 -2
- cirq/_version.py +6 -6
- cirq/_version_test.py +2 -2
- cirq/circuits/_block_diagram_drawer.py +11 -10
- cirq/circuits/_block_diagram_drawer_test.py +8 -6
- cirq/circuits/_box_drawing_character_data.py +8 -8
- cirq/circuits/_box_drawing_character_data_test.py +3 -1
- cirq/circuits/_bucket_priority_queue.py +9 -7
- cirq/circuits/_bucket_priority_queue_test.py +22 -20
- cirq/circuits/circuit.py +248 -172
- cirq/circuits/circuit_operation.py +73 -83
- cirq/circuits/circuit_operation_test.py +128 -90
- cirq/circuits/circuit_test.py +211 -151
- cirq/circuits/frozen_circuit.py +23 -60
- cirq/circuits/frozen_circuit_test.py +31 -8
- cirq/circuits/insert_strategy.py +7 -5
- cirq/circuits/insert_strategy_test.py +4 -2
- cirq/circuits/moment.py +88 -40
- cirq/circuits/moment_test.py +128 -51
- cirq/circuits/optimization_pass.py +5 -5
- cirq/circuits/optimization_pass_test.py +10 -10
- cirq/circuits/qasm_output.py +11 -11
- cirq/circuits/qasm_output_test.py +25 -22
- cirq/circuits/text_diagram_drawer.py +23 -38
- cirq/circuits/text_diagram_drawer_test.py +19 -17
- cirq/conftest.py +4 -3
- cirq/contrib/__init__.py +4 -4
- cirq/contrib/acquaintance/__init__.py +1 -1
- cirq/contrib/acquaintance/bipartite.py +5 -8
- cirq/contrib/acquaintance/bipartite_test.py +18 -13
- cirq/contrib/acquaintance/devices.py +2 -2
- cirq/contrib/acquaintance/devices_test.py +5 -3
- cirq/contrib/acquaintance/executor.py +5 -5
- cirq/contrib/acquaintance/executor_test.py +13 -9
- cirq/contrib/acquaintance/gates.py +18 -28
- cirq/contrib/acquaintance/gates_test.py +24 -20
- cirq/contrib/acquaintance/inspection_utils.py +8 -4
- cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
- cirq/contrib/acquaintance/mutation_utils.py +4 -4
- cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
- cirq/contrib/acquaintance/optimizers.py +4 -4
- cirq/contrib/acquaintance/optimizers_test.py +4 -1
- cirq/contrib/acquaintance/permutation.py +15 -27
- cirq/contrib/acquaintance/permutation_test.py +26 -17
- cirq/contrib/acquaintance/shift.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
- cirq/contrib/acquaintance/shift_test.py +8 -6
- cirq/contrib/acquaintance/strategies/cubic.py +2 -2
- cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
- cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
- cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
- cirq/contrib/acquaintance/testing.py +2 -0
- cirq/contrib/acquaintance/topological_sort.py +2 -2
- cirq/contrib/acquaintance/topological_sort_test.py +3 -1
- cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
- cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
- cirq/contrib/circuitdag/circuit_dag.py +4 -4
- cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
- cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
- cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
- cirq/contrib/graph_device/graph_device.py +12 -11
- cirq/contrib/graph_device/graph_device_test.py +18 -14
- cirq/contrib/graph_device/hypergraph.py +16 -14
- cirq/contrib/graph_device/hypergraph_test.py +13 -11
- cirq/contrib/graph_device/uniform_graph_device.py +6 -4
- cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
- cirq/contrib/hacks/disable_validation.py +6 -1
- cirq/contrib/hacks/disable_validation_test.py +3 -1
- cirq/contrib/json.py +31 -5
- cirq/contrib/json_test.py +6 -3
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/__init__.py +17 -0
- cirq/contrib/json_test_data/spec.py +32 -0
- cirq/contrib/noise_models/noise_models.py +119 -5
- cirq/contrib/noise_models/noise_models_test.py +37 -9
- cirq/contrib/paulistring/clifford_optimize.py +6 -4
- cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
- cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
- cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
- cirq/contrib/paulistring/optimize.py +2 -0
- cirq/contrib/paulistring/optimize_test.py +4 -3
- cirq/contrib/paulistring/pauli_string_dag.py +2 -0
- cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
- cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
- cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
- cirq/contrib/paulistring/recombine.py +6 -4
- cirq/contrib/paulistring/recombine_test.py +3 -1
- cirq/contrib/paulistring/separate.py +9 -6
- cirq/contrib/paulistring/separate_test.py +3 -1
- cirq/contrib/qasm_import/_lexer.py +3 -2
- cirq/contrib/qasm_import/_lexer_test.py +49 -13
- cirq/contrib/qasm_import/_parser.py +547 -83
- cirq/contrib/qasm_import/_parser_test.py +988 -97
- cirq/contrib/qasm_import/exception.py +2 -0
- cirq/contrib/qasm_import/qasm.py +8 -2
- cirq/contrib/qasm_import/qasm_test.py +7 -4
- cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
- cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
- cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
- cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
- cirq/contrib/qcircuit/qcircuit_test.py +10 -8
- cirq/contrib/quantum_volume/quantum_volume.py +31 -27
- cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
- cirq/contrib/quimb/density_matrix.py +15 -14
- cirq/contrib/quimb/density_matrix_test.py +10 -7
- cirq/contrib/quimb/grid_circuits.py +5 -2
- cirq/contrib/quimb/grid_circuits_test.py +3 -0
- cirq/contrib/quimb/mps_simulator.py +20 -20
- cirq/contrib/quimb/mps_simulator_test.py +3 -0
- cirq/contrib/quimb/state_vector.py +12 -11
- cirq/contrib/quimb/state_vector_test.py +3 -0
- cirq/contrib/quirk/export_to_quirk.py +5 -3
- cirq/contrib/quirk/export_to_quirk_test.py +18 -16
- cirq/contrib/quirk/linearize_circuit.py +2 -0
- cirq/contrib/quirk/quirk_gate.py +18 -17
- cirq/contrib/routing/device.py +5 -3
- cirq/contrib/routing/device_test.py +2 -0
- cirq/contrib/routing/greedy.py +10 -21
- cirq/contrib/routing/greedy_test.py +4 -2
- cirq/contrib/routing/initialization.py +2 -2
- cirq/contrib/routing/initialization_test.py +5 -3
- cirq/contrib/routing/router.py +9 -5
- cirq/contrib/routing/router_test.py +2 -0
- cirq/contrib/routing/swap_network.py +3 -3
- cirq/contrib/routing/swap_network_test.py +3 -1
- cirq/contrib/routing/utils.py +2 -2
- cirq/contrib/routing/utils_test.py +3 -0
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
- cirq/contrib/svg/svg.py +3 -3
- cirq/contrib/svg/svg_test.py +8 -5
- cirq/devices/device.py +4 -4
- cirq/devices/device_test.py +7 -4
- cirq/devices/grid_device_metadata.py +10 -10
- cirq/devices/grid_device_metadata_test.py +3 -0
- cirq/devices/grid_qubit.py +29 -21
- cirq/devices/grid_qubit_test.py +3 -0
- cirq/devices/insertion_noise_model.py +7 -7
- cirq/devices/insertion_noise_model_test.py +7 -5
- cirq/devices/line_qubit.py +13 -13
- cirq/devices/line_qubit_test.py +2 -0
- cirq/devices/named_topologies.py +18 -29
- cirq/devices/named_topologies_test.py +13 -10
- cirq/devices/noise_model.py +3 -3
- cirq/devices/noise_model_test.py +19 -15
- cirq/devices/noise_properties.py +15 -6
- cirq/devices/noise_properties_test.py +34 -3
- cirq/devices/noise_utils.py +11 -9
- cirq/devices/noise_utils_test.py +2 -0
- cirq/devices/superconducting_qubits_noise_properties.py +23 -22
- cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
- cirq/devices/thermal_noise_model.py +107 -37
- cirq/devices/thermal_noise_model_test.py +21 -0
- cirq/devices/unconstrained_device.py +5 -3
- cirq/devices/unconstrained_device_test.py +2 -0
- cirq/experiments/__init__.py +4 -2
- cirq/experiments/benchmarking/__init__.py +17 -0
- cirq/experiments/benchmarking/parallel_xeb.py +677 -0
- cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
- cirq/experiments/fidelity_estimation.py +14 -8
- cirq/experiments/fidelity_estimation_test.py +3 -0
- cirq/experiments/n_qubit_tomography.py +17 -16
- cirq/experiments/n_qubit_tomography_test.py +8 -5
- cirq/experiments/purity_estimation.py +2 -0
- cirq/experiments/purity_estimation_test.py +2 -0
- cirq/experiments/qubit_characterizations.py +207 -103
- cirq/experiments/qubit_characterizations_test.py +40 -12
- cirq/experiments/random_quantum_circuit_generation.py +56 -70
- cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
- cirq/experiments/readout_confusion_matrix.py +24 -22
- cirq/experiments/readout_confusion_matrix_test.py +2 -0
- cirq/experiments/single_qubit_readout_calibration.py +30 -15
- cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
- cirq/experiments/t1_decay_experiment.py +9 -7
- cirq/experiments/t1_decay_experiment_test.py +13 -11
- cirq/experiments/t2_decay_experiment.py +16 -13
- cirq/experiments/t2_decay_experiment_test.py +2 -0
- cirq/experiments/two_qubit_xeb.py +64 -57
- cirq/experiments/two_qubit_xeb_test.py +10 -6
- cirq/experiments/xeb_fitting.py +39 -35
- cirq/experiments/xeb_sampling.py +37 -44
- cirq/experiments/xeb_sampling_test.py +3 -0
- cirq/experiments/xeb_simulation.py +14 -10
- cirq/experiments/xeb_simulation_test.py +5 -5
- cirq/experiments/z_phase_calibration.py +32 -29
- cirq/experiments/z_phase_calibration_test.py +3 -4
- cirq/interop/quirk/cells/__init__.py +1 -1
- cirq/interop/quirk/cells/all_cells.py +7 -2
- cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
- cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
- cirq/interop/quirk/cells/cell.py +19 -28
- cirq/interop/quirk/cells/cell_test.py +3 -0
- cirq/interop/quirk/cells/composite_cell.py +13 -28
- cirq/interop/quirk/cells/composite_cell_test.py +2 -0
- cirq/interop/quirk/cells/control_cells.py +15 -15
- cirq/interop/quirk/cells/control_cells_test.py +7 -5
- cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
- cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
- cirq/interop/quirk/cells/ignored_cells.py +3 -0
- cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
- cirq/interop/quirk/cells/input_cells.py +7 -5
- cirq/interop/quirk/cells/input_cells_test.py +7 -5
- cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
- cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
- cirq/interop/quirk/cells/measurement_cells.py +5 -2
- cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
- cirq/interop/quirk/cells/parse.py +22 -23
- cirq/interop/quirk/cells/parse_test.py +12 -10
- cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
- cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
- cirq/interop/quirk/cells/scalar_cells.py +4 -1
- cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
- cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
- cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
- cirq/interop/quirk/cells/swap_cell.py +8 -6
- cirq/interop/quirk/cells/swap_cell_test.py +6 -4
- cirq/interop/quirk/cells/testing.py +6 -6
- cirq/interop/quirk/cells/testing_test.py +8 -6
- cirq/interop/quirk/cells/unsupported_cells.py +3 -0
- cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
- cirq/interop/quirk/url_to_circuit.py +23 -36
- cirq/interop/quirk/url_to_circuit_test.py +4 -1
- cirq/json_resolver_cache.py +14 -12
- cirq/linalg/__init__.py +4 -6
- cirq/linalg/combinators.py +7 -5
- cirq/linalg/combinators_test.py +10 -7
- cirq/linalg/decompositions.py +24 -35
- cirq/linalg/decompositions_test.py +3 -1
- cirq/linalg/diagonalize.py +6 -4
- cirq/linalg/diagonalize_test.py +15 -14
- cirq/linalg/operator_spaces.py +14 -14
- cirq/linalg/operator_spaces_test.py +13 -11
- cirq/linalg/predicates.py +18 -9
- cirq/linalg/predicates_test.py +5 -0
- cirq/linalg/tolerance.py +6 -3
- cirq/linalg/tolerance_test.py +6 -4
- cirq/linalg/transformations.py +23 -20
- cirq/linalg/transformations_test.py +73 -43
- cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
- cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
- cirq/neutral_atoms/neutral_atom_devices.py +2 -0
- cirq/ops/__init__.py +2 -0
- cirq/ops/arithmetic_operation.py +21 -21
- cirq/ops/arithmetic_operation_test.py +7 -8
- cirq/ops/boolean_hamiltonian.py +23 -22
- cirq/ops/boolean_hamiltonian_test.py +12 -9
- cirq/ops/classically_controlled_operation.py +31 -36
- cirq/ops/classically_controlled_operation_test.py +121 -117
- cirq/ops/clifford_gate.py +98 -81
- cirq/ops/clifford_gate_test.py +72 -57
- cirq/ops/common_channels.py +44 -44
- cirq/ops/common_channels_test.py +83 -81
- cirq/ops/common_gate_families.py +9 -7
- cirq/ops/common_gate_families_test.py +11 -7
- cirq/ops/common_gates.py +164 -183
- cirq/ops/common_gates_test.py +135 -95
- cirq/ops/control_values.py +23 -26
- cirq/ops/control_values_test.py +22 -20
- cirq/ops/controlled_gate.py +64 -112
- cirq/ops/controlled_gate_test.py +130 -35
- cirq/ops/controlled_operation.py +24 -35
- cirq/ops/controlled_operation_test.py +8 -6
- cirq/ops/dense_pauli_string.py +38 -49
- cirq/ops/dense_pauli_string_test.py +4 -2
- cirq/ops/diagonal_gate.py +18 -31
- cirq/ops/diagonal_gate_test.py +13 -13
- cirq/ops/eigen_gate.py +29 -29
- cirq/ops/eigen_gate_test.py +45 -28
- cirq/ops/fourier_transform.py +14 -20
- cirq/ops/fourier_transform_test.py +15 -12
- cirq/ops/fsim_gate.py +43 -42
- cirq/ops/fsim_gate_test.py +29 -29
- cirq/ops/gate_features.py +2 -0
- cirq/ops/gate_features_test.py +5 -3
- cirq/ops/gate_operation.py +43 -65
- cirq/ops/gate_operation_test.py +46 -42
- cirq/ops/gateset.py +28 -40
- cirq/ops/gateset_test.py +4 -2
- cirq/ops/global_phase_op.py +45 -20
- cirq/ops/global_phase_op_test.py +44 -20
- cirq/ops/greedy_qubit_manager.py +10 -8
- cirq/ops/greedy_qubit_manager_test.py +5 -3
- cirq/ops/identity.py +14 -12
- cirq/ops/identity_test.py +24 -20
- cirq/ops/kraus_channel.py +11 -8
- cirq/ops/kraus_channel_test.py +14 -11
- cirq/ops/linear_combinations.py +65 -77
- cirq/ops/linear_combinations_test.py +14 -9
- cirq/ops/matrix_gates.py +21 -18
- cirq/ops/matrix_gates_test.py +16 -0
- cirq/ops/measure_util.py +15 -20
- cirq/ops/measure_util_test.py +2 -0
- cirq/ops/measurement_gate.py +26 -37
- cirq/ops/measurement_gate_test.py +2 -0
- cirq/ops/mixed_unitary_channel.py +12 -9
- cirq/ops/mixed_unitary_channel_test.py +14 -11
- cirq/ops/named_qubit.py +16 -13
- cirq/ops/named_qubit_test.py +15 -13
- cirq/ops/op_tree.py +9 -7
- cirq/ops/op_tree_test.py +22 -19
- cirq/ops/parallel_gate.py +15 -17
- cirq/ops/parallel_gate_test.py +18 -16
- cirq/ops/parity_gates.py +23 -25
- cirq/ops/parity_gates_test.py +36 -32
- cirq/ops/pauli_gates.py +22 -21
- cirq/ops/pauli_gates_test.py +29 -20
- cirq/ops/pauli_interaction_gate.py +15 -19
- cirq/ops/pauli_interaction_gate_test.py +10 -8
- cirq/ops/pauli_measurement_gate.py +23 -35
- cirq/ops/pauli_measurement_gate_test.py +2 -0
- cirq/ops/pauli_string.py +92 -120
- cirq/ops/pauli_string_phasor.py +52 -45
- cirq/ops/pauli_string_phasor_test.py +4 -5
- cirq/ops/pauli_string_raw_types.py +9 -7
- cirq/ops/pauli_string_raw_types_test.py +2 -0
- cirq/ops/pauli_string_test.py +31 -154
- cirq/ops/pauli_sum_exponential.py +12 -12
- cirq/ops/pauli_sum_exponential_test.py +12 -10
- cirq/ops/permutation_gate.py +8 -6
- cirq/ops/permutation_gate_test.py +10 -8
- cirq/ops/phased_iswap_gate.py +16 -16
- cirq/ops/phased_iswap_gate_test.py +17 -15
- cirq/ops/phased_x_gate.py +16 -17
- cirq/ops/phased_x_gate_test.py +18 -16
- cirq/ops/phased_x_z_gate.py +24 -22
- cirq/ops/phased_x_z_gate_test.py +17 -11
- cirq/ops/projector.py +16 -11
- cirq/ops/projector_test.py +19 -16
- cirq/ops/qid_util.py +7 -5
- cirq/ops/qid_util_test.py +2 -0
- cirq/ops/qubit_manager.py +11 -9
- cirq/ops/qubit_manager_test.py +6 -4
- cirq/ops/qubit_order.py +11 -14
- cirq/ops/qubit_order_or_list.py +4 -2
- cirq/ops/qubit_order_test.py +12 -10
- cirq/ops/random_gate_channel.py +12 -10
- cirq/ops/random_gate_channel_test.py +14 -11
- cirq/ops/raw_types.py +109 -129
- cirq/ops/raw_types_test.py +63 -57
- cirq/ops/state_preparation_channel.py +7 -7
- cirq/ops/state_preparation_channel_test.py +11 -9
- cirq/ops/swap_gates.py +13 -15
- cirq/ops/swap_gates_test.py +19 -17
- cirq/ops/tags.py +5 -3
- cirq/ops/tags_test.py +4 -2
- cirq/ops/three_qubit_gates.py +43 -76
- cirq/ops/three_qubit_gates_test.py +19 -17
- cirq/ops/two_qubit_diagonal_gate.py +13 -13
- cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
- cirq/ops/uniform_superposition_gate.py +5 -3
- cirq/ops/uniform_superposition_gate_test.py +5 -3
- cirq/ops/wait_gate.py +17 -14
- cirq/ops/wait_gate_test.py +9 -6
- cirq/protocols/__init__.py +0 -3
- cirq/protocols/act_on_protocol.py +8 -6
- cirq/protocols/act_on_protocol_test.py +15 -12
- cirq/protocols/apply_channel_protocol.py +10 -14
- cirq/protocols/apply_channel_protocol_test.py +2 -0
- cirq/protocols/apply_mixture_protocol.py +13 -42
- cirq/protocols/apply_mixture_protocol_test.py +7 -5
- cirq/protocols/apply_unitary_protocol.py +39 -34
- cirq/protocols/apply_unitary_protocol_test.py +4 -1
- cirq/protocols/approximate_equality_protocol.py +2 -0
- cirq/protocols/approximate_equality_protocol_test.py +2 -0
- cirq/protocols/circuit_diagram_info_protocol.py +58 -42
- cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
- cirq/protocols/commutes_protocol.py +8 -7
- cirq/protocols/commutes_protocol_test.py +2 -0
- cirq/protocols/control_key_protocol.py +6 -4
- cirq/protocols/control_key_protocol_test.py +3 -1
- cirq/protocols/decompose_protocol.py +49 -48
- cirq/protocols/decompose_protocol_test.py +27 -16
- cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
- cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
- cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
- cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
- cirq/protocols/has_unitary_protocol.py +10 -6
- cirq/protocols/has_unitary_protocol_test.py +13 -8
- cirq/protocols/hash_from_pickle_test.py +2 -11
- cirq/protocols/inverse_protocol.py +13 -16
- cirq/protocols/inverse_protocol_test.py +5 -3
- cirq/protocols/json_serialization.py +35 -54
- cirq/protocols/json_serialization_test.py +14 -21
- cirq/protocols/json_test_data/CXSWAP.json +46 -0
- cirq/protocols/json_test_data/CXSWAP.repr +13 -0
- cirq/protocols/json_test_data/CZSWAP.json +46 -0
- cirq/protocols/json_test_data/CZSWAP.repr +13 -0
- cirq/protocols/json_test_data/CircuitOperation.json +6 -3
- cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
- cirq/protocols/json_test_data/Moment.json +24 -1
- cirq/protocols/json_test_data/Moment.repr +6 -1
- cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
- cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
- cirq/protocols/json_test_data/spec.py +6 -2
- cirq/protocols/kraus_protocol.py +47 -7
- cirq/protocols/kraus_protocol_test.py +86 -12
- cirq/protocols/measurement_key_protocol.py +15 -16
- cirq/protocols/measurement_key_protocol_test.py +13 -11
- cirq/protocols/mixture_protocol.py +7 -5
- cirq/protocols/mixture_protocol_test.py +4 -2
- cirq/protocols/mul_protocol.py +2 -3
- cirq/protocols/mul_protocol_test.py +2 -0
- cirq/protocols/pauli_expansion_protocol.py +6 -3
- cirq/protocols/pauli_expansion_protocol_test.py +5 -3
- cirq/protocols/phase_protocol.py +2 -0
- cirq/protocols/phase_protocol_test.py +3 -1
- cirq/protocols/pow_protocol.py +11 -16
- cirq/protocols/pow_protocol_test.py +2 -0
- cirq/protocols/qasm.py +14 -20
- cirq/protocols/qasm_test.py +6 -3
- cirq/protocols/qid_shape_protocol.py +8 -8
- cirq/protocols/qid_shape_protocol_test.py +3 -1
- cirq/protocols/resolve_parameters.py +5 -3
- cirq/protocols/resolve_parameters_test.py +8 -7
- cirq/protocols/trace_distance_bound.py +6 -4
- cirq/protocols/trace_distance_bound_test.py +3 -1
- cirq/protocols/unitary_protocol.py +17 -7
- cirq/protocols/unitary_protocol_test.py +12 -2
- cirq/qis/channels.py +6 -2
- cirq/qis/channels_test.py +20 -16
- cirq/qis/clifford_tableau.py +21 -19
- cirq/qis/clifford_tableau_test.py +2 -2
- cirq/qis/entropy.py +14 -3
- cirq/qis/entropy_test.py +3 -1
- cirq/qis/measures.py +13 -13
- cirq/qis/measures_test.py +20 -14
- cirq/qis/noise_utils.py +2 -0
- cirq/qis/noise_utils_test.py +9 -7
- cirq/qis/quantum_state_representation.py +7 -8
- cirq/qis/states.py +58 -56
- cirq/qis/states_test.py +2 -0
- cirq/sim/classical_simulator.py +23 -22
- cirq/sim/classical_simulator_test.py +2 -0
- cirq/sim/clifford/clifford_simulator.py +23 -21
- cirq/sim/clifford/clifford_simulator_test.py +7 -4
- cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
- cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
- cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
- cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
- cirq/sim/clifford/stabilizer_sampler.py +9 -7
- cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
- cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
- cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
- cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
- cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
- cirq/sim/density_matrix_simulation_state.py +26 -27
- cirq/sim/density_matrix_simulation_state_test.py +10 -8
- cirq/sim/density_matrix_simulator.py +30 -28
- cirq/sim/density_matrix_simulator_test.py +48 -48
- cirq/sim/density_matrix_utils.py +13 -11
- cirq/sim/density_matrix_utils_test.py +38 -36
- cirq/sim/mux.py +33 -31
- cirq/sim/mux_test.py +3 -0
- cirq/sim/simulation_product_state.py +15 -15
- cirq/sim/simulation_product_state_test.py +29 -26
- cirq/sim/simulation_state.py +29 -38
- cirq/sim/simulation_state_base.py +21 -32
- cirq/sim/simulation_state_test.py +15 -13
- cirq/sim/simulation_utils.py +5 -2
- cirq/sim/simulation_utils_test.py +5 -2
- cirq/sim/simulator.py +90 -106
- cirq/sim/simulator_base.py +33 -45
- cirq/sim/simulator_base_test.py +20 -15
- cirq/sim/simulator_test.py +23 -14
- cirq/sim/sparse_simulator.py +19 -17
- cirq/sim/sparse_simulator_test.py +41 -40
- cirq/sim/state_vector.py +15 -12
- cirq/sim/state_vector_simulation_state.py +31 -31
- cirq/sim/state_vector_simulation_state_test.py +16 -14
- cirq/sim/state_vector_simulator.py +17 -14
- cirq/sim/state_vector_simulator_test.py +2 -0
- cirq/sim/state_vector_test.py +6 -3
- cirq/study/flatten_expressions.py +16 -15
- cirq/study/flatten_expressions_test.py +13 -11
- cirq/study/resolver.py +18 -17
- cirq/study/resolver_test.py +22 -20
- cirq/study/result.py +17 -27
- cirq/study/result_test.py +2 -0
- cirq/study/sweepable.py +12 -10
- cirq/study/sweepable_test.py +3 -0
- cirq/study/sweeps.py +42 -61
- cirq/study/sweeps_test.py +33 -0
- cirq/testing/__init__.py +7 -11
- cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
- cirq/testing/circuit_compare.py +8 -17
- cirq/testing/circuit_compare_test.py +2 -0
- cirq/testing/consistent_act_on.py +13 -11
- cirq/testing/consistent_act_on_test.py +5 -3
- cirq/testing/consistent_channels.py +2 -0
- cirq/testing/consistent_channels_test.py +10 -8
- cirq/testing/consistent_controlled_gate_op.py +5 -5
- cirq/testing/consistent_controlled_gate_op_test.py +18 -18
- cirq/testing/consistent_decomposition.py +2 -2
- cirq/testing/consistent_decomposition_test.py +4 -2
- cirq/testing/consistent_pauli_expansion.py +2 -0
- cirq/testing/consistent_pauli_expansion_test.py +3 -1
- cirq/testing/consistent_phase_by.py +2 -0
- cirq/testing/consistent_phase_by_test.py +3 -1
- cirq/testing/consistent_protocols.py +14 -20
- cirq/testing/consistent_protocols_test.py +13 -11
- cirq/testing/consistent_qasm.py +6 -4
- cirq/testing/consistent_qasm_test.py +7 -7
- cirq/testing/consistent_resolve_parameters.py +2 -0
- cirq/testing/consistent_specified_has_unitary.py +2 -2
- cirq/testing/consistent_specified_has_unitary_test.py +6 -4
- cirq/testing/consistent_unitary.py +1 -0
- cirq/testing/consistent_unitary_test.py +4 -2
- cirq/testing/deprecation.py +5 -2
- cirq/testing/deprecation_test.py +5 -2
- cirq/testing/devices.py +7 -4
- cirq/testing/devices_test.py +7 -4
- cirq/testing/equals_tester.py +4 -2
- cirq/testing/equals_tester_test.py +21 -17
- cirq/testing/equivalent_basis_map.py +6 -4
- cirq/testing/equivalent_basis_map_test.py +6 -4
- cirq/testing/equivalent_repr_eval.py +6 -4
- cirq/testing/equivalent_repr_eval_test.py +5 -3
- cirq/testing/gate_features.py +2 -0
- cirq/testing/gate_features_test.py +7 -5
- cirq/testing/json.py +19 -15
- cirq/testing/json_test.py +5 -3
- cirq/testing/lin_alg_utils.py +10 -11
- cirq/testing/lin_alg_utils_test.py +14 -12
- cirq/testing/logs.py +7 -6
- cirq/testing/logs_test.py +9 -7
- cirq/testing/no_identifier_qubit.py +4 -2
- cirq/testing/no_identifier_qubit_test.py +5 -3
- cirq/testing/op_tree.py +2 -0
- cirq/testing/op_tree_test.py +4 -1
- cirq/testing/order_tester.py +2 -0
- cirq/testing/order_tester_test.py +8 -6
- cirq/testing/pytest_utils.py +2 -0
- cirq/testing/pytest_utils_test.py +4 -2
- cirq/testing/random_circuit.py +21 -20
- cirq/testing/random_circuit_test.py +12 -9
- cirq/testing/repr_pretty_tester.py +1 -0
- cirq/testing/repr_pretty_tester_test.py +5 -3
- cirq/testing/routing_devices.py +4 -1
- cirq/testing/routing_devices_test.py +9 -6
- cirq/testing/sample_circuits.py +4 -1
- cirq/testing/sample_circuits_test.py +3 -1
- cirq/testing/sample_gates.py +3 -0
- cirq/testing/sample_gates_test.py +5 -2
- cirq/transformers/__init__.py +11 -4
- cirq/transformers/align.py +9 -7
- cirq/transformers/align_test.py +2 -0
- cirq/transformers/analytical_decompositions/__init__.py +3 -6
- cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
- cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
- cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
- cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
- cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
- cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
- cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
- cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
- cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
- cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
- cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
- cirq/transformers/drop_empty_moments.py +5 -3
- cirq/transformers/drop_empty_moments_test.py +4 -2
- cirq/transformers/drop_negligible_operations.py +7 -5
- cirq/transformers/drop_negligible_operations_test.py +2 -0
- cirq/transformers/dynamical_decoupling.py +49 -42
- cirq/transformers/dynamical_decoupling_test.py +223 -205
- cirq/transformers/eject_phased_paulis.py +28 -26
- cirq/transformers/eject_phased_paulis_test.py +12 -9
- cirq/transformers/eject_z.py +12 -12
- cirq/transformers/eject_z_test.py +2 -2
- cirq/transformers/expand_composite.py +6 -4
- cirq/transformers/expand_composite_test.py +3 -1
- cirq/transformers/gauge_compiling/__init__.py +3 -1
- cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
- cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
- cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
- cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
- cirq/transformers/insertion_sort.py +8 -6
- cirq/transformers/insertion_sort_test.py +3 -1
- cirq/transformers/measurement_transformers.py +29 -29
- cirq/transformers/measurement_transformers_test.py +2 -0
- cirq/transformers/merge_k_qubit_gates.py +12 -10
- cirq/transformers/merge_k_qubit_gates_test.py +18 -18
- cirq/transformers/merge_single_qubit_gates.py +197 -20
- cirq/transformers/merge_single_qubit_gates_test.py +177 -5
- cirq/transformers/noise_adding.py +5 -3
- cirq/transformers/noise_adding_test.py +2 -0
- cirq/transformers/optimize_for_target_gateset.py +19 -17
- cirq/transformers/optimize_for_target_gateset_test.py +11 -8
- cirq/transformers/qubit_management_transformers.py +13 -11
- cirq/transformers/qubit_management_transformers_test.py +5 -3
- cirq/transformers/randomized_measurements.py +16 -14
- cirq/transformers/randomized_measurements_test.py +10 -4
- cirq/transformers/routing/initial_mapper.py +6 -4
- cirq/transformers/routing/initial_mapper_test.py +2 -0
- cirq/transformers/routing/line_initial_mapper.py +16 -14
- cirq/transformers/routing/line_initial_mapper_test.py +9 -7
- cirq/transformers/routing/mapping_manager.py +10 -10
- cirq/transformers/routing/mapping_manager_test.py +2 -0
- cirq/transformers/routing/route_circuit_cqc.py +33 -31
- cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
- cirq/transformers/routing/visualize_routed_circuit.py +8 -7
- cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
- cirq/transformers/stratify.py +17 -15
- cirq/transformers/stratify_test.py +3 -0
- cirq/transformers/symbolize.py +103 -0
- cirq/transformers/symbolize_test.py +62 -0
- cirq/transformers/synchronize_terminal_measurements.py +10 -10
- cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
- cirq/transformers/tag_transformers.py +97 -0
- cirq/transformers/tag_transformers_test.py +103 -0
- cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
- cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
- cirq/transformers/target_gatesets/cz_gateset.py +7 -5
- cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
- cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
- cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
- cirq/transformers/transformer_api.py +34 -47
- cirq/transformers/transformer_api_test.py +9 -8
- cirq/transformers/transformer_primitives.py +39 -49
- cirq/transformers/transformer_primitives_test.py +10 -17
- cirq/value/abc_alt.py +6 -4
- cirq/value/abc_alt_test.py +5 -3
- cirq/value/angle.py +11 -12
- cirq/value/angle_test.py +5 -3
- cirq/value/classical_data.py +27 -27
- cirq/value/classical_data_test.py +11 -8
- cirq/value/condition.py +26 -24
- cirq/value/condition_test.py +2 -0
- cirq/value/digits.py +14 -11
- cirq/value/digits_test.py +2 -0
- cirq/value/duration.py +23 -20
- cirq/value/duration_test.py +2 -0
- cirq/value/linear_dict.py +25 -30
- cirq/value/linear_dict_test.py +10 -8
- cirq/value/measurement_key.py +12 -12
- cirq/value/measurement_key_test.py +2 -0
- cirq/value/periodic_value.py +4 -4
- cirq/value/periodic_value_test.py +11 -7
- cirq/value/probability.py +3 -1
- cirq/value/probability_test.py +4 -2
- cirq/value/product_state.py +15 -13
- cirq/value/product_state_test.py +4 -1
- cirq/value/random_state.py +2 -0
- cirq/value/random_state_test.py +5 -3
- cirq/value/timestamp.py +11 -7
- cirq/value/timestamp_test.py +14 -12
- cirq/value/type_alias.py +4 -4
- cirq/value/value_equality_attr.py +8 -9
- cirq/value/value_equality_attr_test.py +14 -11
- cirq/vis/density_matrix.py +3 -3
- cirq/vis/density_matrix_test.py +20 -17
- cirq/vis/heatmap.py +24 -37
- cirq/vis/heatmap_test.py +3 -0
- cirq/vis/histogram.py +9 -6
- cirq/vis/histogram_test.py +5 -2
- cirq/vis/state_histogram.py +10 -8
- cirq/vis/state_histogram_test.py +7 -5
- cirq/vis/vis_utils.py +4 -1
- cirq/vis/vis_utils_test.py +4 -1
- cirq/work/collector.py +12 -18
- cirq/work/collector_test.py +15 -10
- cirq/work/observable_grouping.py +6 -7
- cirq/work/observable_grouping_test.py +10 -9
- cirq/work/observable_measurement.py +47 -45
- cirq/work/observable_measurement_data.py +22 -17
- cirq/work/observable_measurement_data_test.py +4 -1
- cirq/work/observable_measurement_test.py +48 -29
- cirq/work/observable_readout_calibration.py +5 -2
- cirq/work/observable_readout_calibration_test.py +5 -2
- cirq/work/observable_settings.py +13 -22
- cirq/work/observable_settings_test.py +9 -7
- cirq/work/pauli_sum_collector.py +12 -10
- cirq/work/pauli_sum_collector_test.py +9 -9
- cirq/work/sampler.py +42 -43
- cirq/work/sampler_test.py +31 -24
- cirq/work/zeros_sampler.py +6 -4
- cirq/work/zeros_sampler_test.py +7 -5
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
- cirq_core-1.6.0.dist-info/RECORD +1241 -0
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
- cirq_core-1.5.0.dev20250409222543.dist-info/RECORD +0 -1216
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
cirq/ops/clifford_gate.py
CHANGED
|
@@ -12,10 +12,12 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import functools
|
|
16
18
|
from dataclasses import dataclass
|
|
17
19
|
from types import NotImplementedType
|
|
18
|
-
from typing import Any,
|
|
20
|
+
from typing import Any, Sequence, TYPE_CHECKING
|
|
19
21
|
|
|
20
22
|
import numpy as np
|
|
21
23
|
|
|
@@ -34,7 +36,7 @@ sim = LazyLoader("sim", globals(), "cirq.sim")
|
|
|
34
36
|
transformers = LazyLoader("transformers", globals(), "cirq.transformers")
|
|
35
37
|
|
|
36
38
|
|
|
37
|
-
def _to_pauli_tuple(matrix: np.ndarray) ->
|
|
39
|
+
def _to_pauli_tuple(matrix: np.ndarray) -> tuple[Pauli, bool] | None:
|
|
38
40
|
"""Converts matrix to Pauli gate.
|
|
39
41
|
|
|
40
42
|
If matrix is not ±Pauli matrix, returns None.
|
|
@@ -49,10 +51,10 @@ def _to_pauli_tuple(matrix: np.ndarray) -> Optional[Tuple[Pauli, bool]]:
|
|
|
49
51
|
|
|
50
52
|
|
|
51
53
|
def _to_clifford_tableau(
|
|
52
|
-
rotation_map:
|
|
54
|
+
rotation_map: dict[Pauli, tuple[Pauli, bool]] | None = None,
|
|
53
55
|
*,
|
|
54
|
-
x_to:
|
|
55
|
-
z_to:
|
|
56
|
+
x_to: tuple[Pauli, bool] | None = None,
|
|
57
|
+
z_to: tuple[Pauli, bool] | None = None,
|
|
56
58
|
) -> qis.CliffordTableau:
|
|
57
59
|
"""Transfer the rotation map to clifford tableau representation"""
|
|
58
60
|
if x_to is None and z_to is None and rotation_map is None:
|
|
@@ -79,11 +81,11 @@ def _to_clifford_tableau(
|
|
|
79
81
|
|
|
80
82
|
def _validate_map_input(
|
|
81
83
|
required_transform_count: int,
|
|
82
|
-
pauli_map_to:
|
|
83
|
-
x_to:
|
|
84
|
-
y_to:
|
|
85
|
-
z_to:
|
|
86
|
-
) ->
|
|
84
|
+
pauli_map_to: dict[Pauli, tuple[Pauli, bool]] | None,
|
|
85
|
+
x_to: tuple[Pauli, bool] | None,
|
|
86
|
+
y_to: tuple[Pauli, bool] | None,
|
|
87
|
+
z_to: tuple[Pauli, bool] | None,
|
|
88
|
+
) -> dict[Pauli, tuple[Pauli, bool]]:
|
|
87
89
|
if pauli_map_to is None:
|
|
88
90
|
xyz_to = {pauli_gates.X: x_to, pauli_gates.Y: y_to, pauli_gates.Z: z_to}
|
|
89
91
|
pauli_map_to = {p: trans for p, trans in xyz_to.items() if trans is not None}
|
|
@@ -108,7 +110,7 @@ def _validate_map_input(
|
|
|
108
110
|
|
|
109
111
|
|
|
110
112
|
def _pad_tableau(
|
|
111
|
-
clifford_tableau: qis.CliffordTableau, num_qubits_after_padding: int, axes:
|
|
113
|
+
clifford_tableau: qis.CliffordTableau, num_qubits_after_padding: int, axes: list[int]
|
|
112
114
|
) -> qis.CliffordTableau:
|
|
113
115
|
"""Roughly, this function copies self.tableau into the "identity" matrix."""
|
|
114
116
|
# Sanity check
|
|
@@ -136,7 +138,7 @@ class CommonCliffordGateMetaClass(value.ABCMetaImplementAnyOneOf):
|
|
|
136
138
|
# These are class properties so we define them as properties on a metaclass.
|
|
137
139
|
|
|
138
140
|
@property
|
|
139
|
-
def all_single_qubit_cliffords(cls) -> Sequence[
|
|
141
|
+
def all_single_qubit_cliffords(cls) -> Sequence[cirq.SingleQubitCliffordGate]:
|
|
140
142
|
"""All 24 single-qubit Clifford gates."""
|
|
141
143
|
if not hasattr(cls, '_all_single_qubit_cliffords'):
|
|
142
144
|
pX = (pauli_gates.X, False)
|
|
@@ -187,31 +189,31 @@ class CommonCliffordGateMetaClass(value.ABCMetaImplementAnyOneOf):
|
|
|
187
189
|
return cls._all_single_qubit_cliffords
|
|
188
190
|
|
|
189
191
|
@property
|
|
190
|
-
def I(cls) ->
|
|
192
|
+
def I(cls) -> cirq.SingleQubitCliffordGate:
|
|
191
193
|
return cls.all_single_qubit_cliffords[0]
|
|
192
194
|
|
|
193
195
|
@property
|
|
194
|
-
def X(cls) ->
|
|
196
|
+
def X(cls) -> cirq.SingleQubitCliffordGate:
|
|
195
197
|
return cls.all_single_qubit_cliffords[1]
|
|
196
198
|
|
|
197
199
|
@property
|
|
198
|
-
def Y(cls) ->
|
|
200
|
+
def Y(cls) -> cirq.SingleQubitCliffordGate:
|
|
199
201
|
return cls.all_single_qubit_cliffords[2]
|
|
200
202
|
|
|
201
203
|
@property
|
|
202
|
-
def Z(cls) ->
|
|
204
|
+
def Z(cls) -> cirq.SingleQubitCliffordGate:
|
|
203
205
|
return cls.all_single_qubit_cliffords[3]
|
|
204
206
|
|
|
205
207
|
@property
|
|
206
|
-
def H(cls) ->
|
|
208
|
+
def H(cls) -> cirq.SingleQubitCliffordGate:
|
|
207
209
|
return cls.all_single_qubit_cliffords[10]
|
|
208
210
|
|
|
209
211
|
@property
|
|
210
|
-
def S(cls) ->
|
|
212
|
+
def S(cls) -> cirq.SingleQubitCliffordGate:
|
|
211
213
|
return cls.all_single_qubit_cliffords[6]
|
|
212
214
|
|
|
213
215
|
@property
|
|
214
|
-
def CNOT(cls) ->
|
|
216
|
+
def CNOT(cls) -> cirq.CliffordGate:
|
|
215
217
|
if not hasattr(cls, '_CNOT'):
|
|
216
218
|
t = qis.CliffordTableau(num_qubits=2)
|
|
217
219
|
t.xs = np.array([[1, 1], [0, 1], [0, 0], [0, 0]])
|
|
@@ -220,7 +222,7 @@ class CommonCliffordGateMetaClass(value.ABCMetaImplementAnyOneOf):
|
|
|
220
222
|
return cls._CNOT
|
|
221
223
|
|
|
222
224
|
@property
|
|
223
|
-
def CZ(cls) ->
|
|
225
|
+
def CZ(cls) -> cirq.CliffordGate:
|
|
224
226
|
if not hasattr(cls, '_CZ'):
|
|
225
227
|
t = qis.CliffordTableau(num_qubits=2)
|
|
226
228
|
t.xs = np.array([[1, 0], [0, 1], [0, 0], [0, 0]])
|
|
@@ -229,7 +231,7 @@ class CommonCliffordGateMetaClass(value.ABCMetaImplementAnyOneOf):
|
|
|
229
231
|
return cls._CZ
|
|
230
232
|
|
|
231
233
|
@property
|
|
232
|
-
def SWAP(cls) ->
|
|
234
|
+
def SWAP(cls) -> cirq.CliffordGate:
|
|
233
235
|
if not hasattr(cls, '_SWAP'):
|
|
234
236
|
t = qis.CliffordTableau(num_qubits=2)
|
|
235
237
|
t.xs = np.array([[0, 1], [1, 0], [0, 0], [0, 0]])
|
|
@@ -238,33 +240,33 @@ class CommonCliffordGateMetaClass(value.ABCMetaImplementAnyOneOf):
|
|
|
238
240
|
return cls._SWAP
|
|
239
241
|
|
|
240
242
|
@property
|
|
241
|
-
def X_sqrt(cls) ->
|
|
243
|
+
def X_sqrt(cls) -> cirq.SingleQubitCliffordGate:
|
|
242
244
|
return cls.all_single_qubit_cliffords[4]
|
|
243
245
|
|
|
244
246
|
@property
|
|
245
|
-
def X_nsqrt(cls) ->
|
|
247
|
+
def X_nsqrt(cls) -> cirq.SingleQubitCliffordGate:
|
|
246
248
|
return cls.all_single_qubit_cliffords[7]
|
|
247
249
|
|
|
248
250
|
@property
|
|
249
|
-
def Y_sqrt(cls) ->
|
|
251
|
+
def Y_sqrt(cls) -> cirq.SingleQubitCliffordGate:
|
|
250
252
|
return cls.all_single_qubit_cliffords[5]
|
|
251
253
|
|
|
252
254
|
@property
|
|
253
|
-
def Y_nsqrt(cls) ->
|
|
255
|
+
def Y_nsqrt(cls) -> cirq.SingleQubitCliffordGate:
|
|
254
256
|
return cls.all_single_qubit_cliffords[8]
|
|
255
257
|
|
|
256
258
|
@property
|
|
257
|
-
def Z_sqrt(cls) ->
|
|
259
|
+
def Z_sqrt(cls) -> cirq.SingleQubitCliffordGate:
|
|
258
260
|
return cls.all_single_qubit_cliffords[6]
|
|
259
261
|
|
|
260
262
|
@property
|
|
261
|
-
def Z_nsqrt(cls) ->
|
|
263
|
+
def Z_nsqrt(cls) -> cirq.SingleQubitCliffordGate:
|
|
262
264
|
return cls.all_single_qubit_cliffords[9]
|
|
263
265
|
|
|
264
266
|
|
|
265
267
|
class CommonCliffordGates(metaclass=CommonCliffordGateMetaClass):
|
|
266
268
|
@classmethod
|
|
267
|
-
def from_clifford_tableau(cls, tableau: qis.CliffordTableau) ->
|
|
269
|
+
def from_clifford_tableau(cls, tableau: qis.CliffordTableau) -> CliffordGate:
|
|
268
270
|
"""Create the CliffordGate instance from Clifford Tableau.
|
|
269
271
|
|
|
270
272
|
Args:
|
|
@@ -293,7 +295,7 @@ class CommonCliffordGates(metaclass=CommonCliffordGateMetaClass):
|
|
|
293
295
|
@classmethod
|
|
294
296
|
def from_op_list(
|
|
295
297
|
cls, operations: Sequence[raw_types.Operation], qubit_order: Sequence[raw_types.Qid]
|
|
296
|
-
) ->
|
|
298
|
+
) -> CliffordGate:
|
|
297
299
|
"""Construct a new Clifford gates from several known operations.
|
|
298
300
|
|
|
299
301
|
Args:
|
|
@@ -332,9 +334,7 @@ class CommonCliffordGates(metaclass=CommonCliffordGateMetaClass):
|
|
|
332
334
|
return cls(_clifford_tableau=_clifford_tableau)
|
|
333
335
|
|
|
334
336
|
@classmethod
|
|
335
|
-
def _get_sqrt_map(
|
|
336
|
-
cls,
|
|
337
|
-
) -> Dict[float, Dict['SingleQubitCliffordGate', 'SingleQubitCliffordGate']]:
|
|
337
|
+
def _get_sqrt_map(cls) -> dict[float, dict[SingleQubitCliffordGate, SingleQubitCliffordGate]]:
|
|
338
338
|
"""Returns a map containing two keys 0.5 and -0.5 for the sqrt mapping of Pauli gates."""
|
|
339
339
|
return {
|
|
340
340
|
0.5: {cls.X: cls.X_sqrt, cls.Y: cls.Y_sqrt, cls.Z: cls.Z_sqrt},
|
|
@@ -377,7 +377,7 @@ class CliffordGate(raw_types.Gate, CommonCliffordGates):
|
|
|
377
377
|
def clifford_tableau(self):
|
|
378
378
|
return self._clifford_tableau
|
|
379
379
|
|
|
380
|
-
def _json_dict_(self) ->
|
|
380
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
381
381
|
json_dict = self._clifford_tableau._json_dict_()
|
|
382
382
|
return json_dict
|
|
383
383
|
|
|
@@ -387,11 +387,11 @@ class CliffordGate(raw_types.Gate, CommonCliffordGates):
|
|
|
387
387
|
def _num_qubits_(self):
|
|
388
388
|
return self.clifford_tableau.n
|
|
389
389
|
|
|
390
|
-
def _has_stabilizer_effect_(self) ->
|
|
390
|
+
def _has_stabilizer_effect_(self) -> bool | None:
|
|
391
391
|
# By definition, Clifford Gate should always return True.
|
|
392
392
|
return True
|
|
393
393
|
|
|
394
|
-
def __pow__(self, exponent: float) ->
|
|
394
|
+
def __pow__(self, exponent: float) -> CliffordGate:
|
|
395
395
|
if exponent != int(exponent):
|
|
396
396
|
return NotImplemented # pragma: no cover
|
|
397
397
|
exponent = int(exponent)
|
|
@@ -426,9 +426,7 @@ class CliffordGate(raw_types.Gate, CommonCliffordGates):
|
|
|
426
426
|
def __repr__(self) -> str:
|
|
427
427
|
return f"Clifford Gate with Tableau:\n{self.clifford_tableau._str_full_()}"
|
|
428
428
|
|
|
429
|
-
def _commutes_(
|
|
430
|
-
self, other: Any, *, atol: float = 1e-8
|
|
431
|
-
) -> Union[bool, NotImplementedType, None]:
|
|
429
|
+
def _commutes_(self, other: Any, *, atol: float = 1e-8) -> bool | NotImplementedType | None:
|
|
432
430
|
# Note even if we assume two gates define the tableau based on the same qubit order,
|
|
433
431
|
# the following approach cannot judge it:
|
|
434
432
|
# self.clifford_tableau.then(other.clifford_tableau) == other.clifford_tableau.then(
|
|
@@ -438,14 +436,14 @@ class CliffordGate(raw_types.Gate, CommonCliffordGates):
|
|
|
438
436
|
# it is because Clifford tableau ignores the global phase information.
|
|
439
437
|
return NotImplemented # pragma: no cover
|
|
440
438
|
|
|
441
|
-
def _decompose_(self, qubits: Sequence[
|
|
439
|
+
def _decompose_(self, qubits: Sequence[cirq.Qid]) -> cirq.OP_TREE:
|
|
442
440
|
return transformers.analytical_decompositions.decompose_clifford_tableau_to_operations(
|
|
443
441
|
list(qubits), self.clifford_tableau
|
|
444
442
|
)
|
|
445
443
|
|
|
446
444
|
def _act_on_(
|
|
447
|
-
self, sim_state:
|
|
448
|
-
) ->
|
|
445
|
+
self, sim_state: cirq.SimulationStateBase, qubits: Sequence[cirq.Qid]
|
|
446
|
+
) -> NotImplementedType | bool:
|
|
449
447
|
# Note the computation complexity difference between _decompose_ and _act_on_.
|
|
450
448
|
# Suppose this Gate has `m` qubits, args has `n` qubits, and the decomposition of
|
|
451
449
|
# this operation into `k` operations:
|
|
@@ -481,7 +479,7 @@ class SingleQubitCliffordGate(CliffordGate):
|
|
|
481
479
|
|
|
482
480
|
@staticmethod
|
|
483
481
|
@functools.cache
|
|
484
|
-
def from_clifford_tableau(tableau: qis.CliffordTableau) ->
|
|
482
|
+
def from_clifford_tableau(tableau: qis.CliffordTableau) -> SingleQubitCliffordGate:
|
|
485
483
|
if not isinstance(tableau, qis.CliffordTableau):
|
|
486
484
|
raise ValueError('Input argument has to be a CliffordTableau instance.')
|
|
487
485
|
if not tableau._validate():
|
|
@@ -493,9 +491,7 @@ class SingleQubitCliffordGate(CliffordGate):
|
|
|
493
491
|
return SingleQubitCliffordGate(_clifford_tableau=tableau)
|
|
494
492
|
|
|
495
493
|
@staticmethod
|
|
496
|
-
def from_xz_map(
|
|
497
|
-
x_to: Tuple[Pauli, bool], z_to: Tuple[Pauli, bool]
|
|
498
|
-
) -> 'SingleQubitCliffordGate':
|
|
494
|
+
def from_xz_map(x_to: tuple[Pauli, bool], z_to: tuple[Pauli, bool]) -> SingleQubitCliffordGate:
|
|
499
495
|
"""Returns a SingleQubitCliffordGate for the specified transforms.
|
|
500
496
|
The Y transform is derived from the X and Z.
|
|
501
497
|
|
|
@@ -509,12 +505,12 @@ class SingleQubitCliffordGate(CliffordGate):
|
|
|
509
505
|
|
|
510
506
|
@staticmethod
|
|
511
507
|
def from_single_map(
|
|
512
|
-
pauli_map_to:
|
|
508
|
+
pauli_map_to: dict[Pauli, tuple[Pauli, bool]] | None = None,
|
|
513
509
|
*,
|
|
514
|
-
x_to:
|
|
515
|
-
y_to:
|
|
516
|
-
z_to:
|
|
517
|
-
) ->
|
|
510
|
+
x_to: tuple[Pauli, bool] | None = None,
|
|
511
|
+
y_to: tuple[Pauli, bool] | None = None,
|
|
512
|
+
z_to: tuple[Pauli, bool] | None = None,
|
|
513
|
+
) -> SingleQubitCliffordGate:
|
|
518
514
|
"""Returns a SingleQubitCliffordGate for the
|
|
519
515
|
specified transform with a 90 or 180 degree rotation.
|
|
520
516
|
|
|
@@ -542,12 +538,12 @@ class SingleQubitCliffordGate(CliffordGate):
|
|
|
542
538
|
|
|
543
539
|
@staticmethod
|
|
544
540
|
def from_double_map(
|
|
545
|
-
pauli_map_to:
|
|
541
|
+
pauli_map_to: dict[Pauli, tuple[Pauli, bool]] | None = None,
|
|
546
542
|
*,
|
|
547
|
-
x_to:
|
|
548
|
-
y_to:
|
|
549
|
-
z_to:
|
|
550
|
-
) ->
|
|
543
|
+
x_to: tuple[Pauli, bool] | None = None,
|
|
544
|
+
y_to: tuple[Pauli, bool] | None = None,
|
|
545
|
+
z_to: tuple[Pauli, bool] | None = None,
|
|
546
|
+
) -> SingleQubitCliffordGate:
|
|
551
547
|
"""Returns a SingleQubitCliffordGate for the
|
|
552
548
|
specified transform with a 90 or 180 degree rotation.
|
|
553
549
|
|
|
@@ -570,7 +566,7 @@ class SingleQubitCliffordGate(CliffordGate):
|
|
|
570
566
|
return SingleQubitCliffordGate.from_clifford_tableau(_to_clifford_tableau(rotation_map))
|
|
571
567
|
|
|
572
568
|
@staticmethod
|
|
573
|
-
def from_pauli(pauli: Pauli, sqrt: bool = False) ->
|
|
569
|
+
def from_pauli(pauli: Pauli, sqrt: bool = False) -> SingleQubitCliffordGate:
|
|
574
570
|
prev_pauli = Pauli.by_relative_index(pauli, -1)
|
|
575
571
|
next_pauli = Pauli.by_relative_index(pauli, 1)
|
|
576
572
|
if sqrt:
|
|
@@ -588,7 +584,7 @@ class SingleQubitCliffordGate(CliffordGate):
|
|
|
588
584
|
return SingleQubitCliffordGate.from_clifford_tableau(_to_clifford_tableau(rotation_map))
|
|
589
585
|
|
|
590
586
|
@staticmethod
|
|
591
|
-
def from_quarter_turns(pauli: Pauli, quarter_turns: int) ->
|
|
587
|
+
def from_quarter_turns(pauli: Pauli, quarter_turns: int) -> SingleQubitCliffordGate:
|
|
592
588
|
quarter_turns = quarter_turns % 4
|
|
593
589
|
if quarter_turns == 0:
|
|
594
590
|
return SingleQubitCliffordGate.I
|
|
@@ -600,7 +596,7 @@ class SingleQubitCliffordGate(CliffordGate):
|
|
|
600
596
|
return SingleQubitCliffordGate.from_pauli(pauli, True) ** -1
|
|
601
597
|
|
|
602
598
|
@staticmethod
|
|
603
|
-
def from_unitary(u: np.ndarray) ->
|
|
599
|
+
def from_unitary(u: np.ndarray) -> SingleQubitCliffordGate | None:
|
|
604
600
|
"""Creates Clifford gate with given unitary (up to global phase).
|
|
605
601
|
|
|
606
602
|
Args:
|
|
@@ -626,7 +622,7 @@ class SingleQubitCliffordGate(CliffordGate):
|
|
|
626
622
|
@classmethod
|
|
627
623
|
def from_unitary_with_global_phase(
|
|
628
624
|
cls, u: np.ndarray
|
|
629
|
-
) ->
|
|
625
|
+
) -> tuple[SingleQubitCliffordGate, complex] | None:
|
|
630
626
|
"""Creates Clifford gate with given unitary, including global phase.
|
|
631
627
|
|
|
632
628
|
Args:
|
|
@@ -646,7 +642,7 @@ class SingleQubitCliffordGate(CliffordGate):
|
|
|
646
642
|
k = max(np.ndindex(*u.shape), key=lambda t: abs(u[t]))
|
|
647
643
|
return gate, u[k] / protocols.unitary(gate)[k]
|
|
648
644
|
|
|
649
|
-
def pauli_tuple(self, pauli: Pauli) ->
|
|
645
|
+
def pauli_tuple(self, pauli: Pauli) -> tuple[Pauli, bool]:
|
|
650
646
|
"""Returns a tuple of a Pauli operator and a boolean.
|
|
651
647
|
|
|
652
648
|
The pauli is the operator of the transform and the boolean
|
|
@@ -667,7 +663,7 @@ class SingleQubitCliffordGate(CliffordGate):
|
|
|
667
663
|
to_gate = Pauli._XYZ[to.pauli_mask[0] - 1]
|
|
668
664
|
return (to_gate, bool(to.coefficient != 1.0))
|
|
669
665
|
|
|
670
|
-
def dense_pauli_string(self, pauli: Pauli) ->
|
|
666
|
+
def dense_pauli_string(self, pauli: Pauli) -> cirq.DensePauliString:
|
|
671
667
|
from cirq.ops import dense_pauli_string
|
|
672
668
|
|
|
673
669
|
pauli_tuple = self.pauli_tuple(pauli)
|
|
@@ -733,7 +729,7 @@ class SingleQubitCliffordGate(CliffordGate):
|
|
|
733
729
|
z = -0.5 if x_to_flip else 0.5
|
|
734
730
|
return phased_x_z_gate.PhasedXZGate(x_exponent=x, z_exponent=z, axis_phase_exponent=a)
|
|
735
731
|
|
|
736
|
-
def __pow__(self, exponent: float) ->
|
|
732
|
+
def __pow__(self, exponent: float) -> SingleQubitCliffordGate:
|
|
737
733
|
if int(exponent) == exponent:
|
|
738
734
|
# The single qubit Clifford gates are a group of size 24
|
|
739
735
|
exp = int(exponent) % 24
|
|
@@ -751,29 +747,23 @@ class SingleQubitCliffordGate(CliffordGate):
|
|
|
751
747
|
|
|
752
748
|
return NotImplemented
|
|
753
749
|
|
|
754
|
-
def _act_on_(
|
|
755
|
-
self,
|
|
756
|
-
sim_state: 'cirq.SimulationStateBase', # pylint: disable=unused-argument
|
|
757
|
-
qubits: Sequence['cirq.Qid'], # pylint: disable=unused-argument
|
|
758
|
-
):
|
|
750
|
+
def _act_on_(self, sim_state: cirq.SimulationStateBase, qubits: Sequence[cirq.Qid]):
|
|
759
751
|
# TODO(#5256) Add the implementation of _act_on_ with CliffordTableauSimulationState.
|
|
760
752
|
return NotImplemented
|
|
761
753
|
|
|
762
754
|
# Single Clifford Gate decomposition is more efficient than the general Tableau decomposition.
|
|
763
|
-
def _decompose_(self, qubits: Sequence[
|
|
755
|
+
def _decompose_(self, qubits: Sequence[cirq.Qid]) -> cirq.OP_TREE:
|
|
764
756
|
(qubit,) = qubits
|
|
765
757
|
return tuple(gate.on(qubit) for gate in self.decompose_gate())
|
|
766
758
|
|
|
767
|
-
def _commutes_(
|
|
768
|
-
self, other: Any, *, atol: float = 1e-8
|
|
769
|
-
) -> Union[bool, NotImplementedType, None]:
|
|
759
|
+
def _commutes_(self, other: Any, *, atol: float = 1e-8) -> bool | NotImplementedType | None:
|
|
770
760
|
if isinstance(other, SingleQubitCliffordGate):
|
|
771
761
|
return self.commutes_with_single_qubit_gate(other)
|
|
772
762
|
if isinstance(other, Pauli):
|
|
773
763
|
return self.commutes_with_pauli(other)
|
|
774
764
|
return NotImplemented
|
|
775
765
|
|
|
776
|
-
def commutes_with_single_qubit_gate(self, gate:
|
|
766
|
+
def commutes_with_single_qubit_gate(self, gate: SingleQubitCliffordGate) -> bool:
|
|
777
767
|
"""Tests if the two circuits would be equivalent up to global phase:
|
|
778
768
|
--self--gate-- and --gate--self--"""
|
|
779
769
|
self_then_gate = self.clifford_tableau.then(gate.clifford_tableau)
|
|
@@ -785,7 +775,7 @@ class SingleQubitCliffordGate(CliffordGate):
|
|
|
785
775
|
return to == pauli and not flip
|
|
786
776
|
|
|
787
777
|
@cached_method
|
|
788
|
-
def merged_with(self, second:
|
|
778
|
+
def merged_with(self, second: SingleQubitCliffordGate) -> SingleQubitCliffordGate:
|
|
789
779
|
"""Returns a SingleQubitCliffordGate such that the circuits
|
|
790
780
|
--output-- and --self--second--
|
|
791
781
|
are equivalent up to global phase."""
|
|
@@ -807,7 +797,7 @@ class SingleQubitCliffordGate(CliffordGate):
|
|
|
807
797
|
mat = protocols.unitary(op).dot(mat)
|
|
808
798
|
return mat
|
|
809
799
|
|
|
810
|
-
def decompose_gate(self) -> Sequence[
|
|
800
|
+
def decompose_gate(self) -> Sequence[cirq.Gate]:
|
|
811
801
|
"""Decomposes this clifford into a series of H and pauli rotation gates.
|
|
812
802
|
|
|
813
803
|
Returns:
|
|
@@ -818,13 +808,13 @@ class SingleQubitCliffordGate(CliffordGate):
|
|
|
818
808
|
return self._decompose_gate
|
|
819
809
|
|
|
820
810
|
@functools.cached_property
|
|
821
|
-
def _decompose_gate(self) -> Sequence[
|
|
811
|
+
def _decompose_gate(self) -> Sequence[cirq.Gate]:
|
|
822
812
|
if self == SingleQubitCliffordGate.H:
|
|
823
813
|
return [common_gates.H]
|
|
824
814
|
rotations = self.decompose_rotation()
|
|
825
815
|
return [r ** (qt / 2) for r, qt in rotations]
|
|
826
816
|
|
|
827
|
-
def decompose_rotation(self) -> Sequence[
|
|
817
|
+
def decompose_rotation(self) -> Sequence[tuple[Pauli, int]]:
|
|
828
818
|
"""Decomposes this clifford into a series of pauli rotations.
|
|
829
819
|
|
|
830
820
|
Each rotation is given as a tuple of (axis, quarter_turns),
|
|
@@ -837,7 +827,7 @@ class SingleQubitCliffordGate(CliffordGate):
|
|
|
837
827
|
return self._decompose_rotation
|
|
838
828
|
|
|
839
829
|
@functools.cached_property
|
|
840
|
-
def _decompose_rotation(self) -> Sequence[
|
|
830
|
+
def _decompose_rotation(self) -> Sequence[tuple[Pauli, int]]:
|
|
841
831
|
x_rot = self.pauli_tuple(pauli_gates.X)
|
|
842
832
|
y_rot = self.pauli_tuple(pauli_gates.Y)
|
|
843
833
|
z_rot = self.pauli_tuple(pauli_gates.Z)
|
|
@@ -887,7 +877,7 @@ class SingleQubitCliffordGate(CliffordGate):
|
|
|
887
877
|
False
|
|
888
878
|
), 'Impossible condition where this gate only rotates one Pauli to a different Pauli.'
|
|
889
879
|
|
|
890
|
-
def equivalent_gate_before(self, after:
|
|
880
|
+
def equivalent_gate_before(self, after: SingleQubitCliffordGate) -> SingleQubitCliffordGate:
|
|
891
881
|
"""Returns a SingleQubitCliffordGate such that the circuits
|
|
892
882
|
--output--self-- and --self--gate--
|
|
893
883
|
are equivalent up to global phase."""
|
|
@@ -901,9 +891,7 @@ class SingleQubitCliffordGate(CliffordGate):
|
|
|
901
891
|
f'zs=np.array({self._clifford_tableau.zs.tolist()!r})))'
|
|
902
892
|
)
|
|
903
893
|
|
|
904
|
-
def _circuit_diagram_info_(
|
|
905
|
-
self, args: 'cirq.CircuitDiagramInfoArgs'
|
|
906
|
-
) -> 'cirq.CircuitDiagramInfo':
|
|
894
|
+
def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> cirq.CircuitDiagramInfo:
|
|
907
895
|
well_known_map = {
|
|
908
896
|
SingleQubitCliffordGate.I: 'I',
|
|
909
897
|
SingleQubitCliffordGate.H: 'H',
|
|
@@ -945,3 +933,32 @@ class SingleQubitCliffordGate(CliffordGate):
|
|
|
945
933
|
def _value_equality_values_cls_(self):
|
|
946
934
|
"""To make it with compatible to compare with clifford gate."""
|
|
947
935
|
return CliffordGate
|
|
936
|
+
|
|
937
|
+
|
|
938
|
+
CXSWAP = CliffordGate.from_clifford_tableau(
|
|
939
|
+
qis.CliffordTableau(
|
|
940
|
+
2,
|
|
941
|
+
rs=np.array([False, False, False, False], dtype=np.dtype('bool')),
|
|
942
|
+
xs=np.array(
|
|
943
|
+
[[True, True], [True, False], [False, False], [False, False]], dtype=np.dtype('bool')
|
|
944
|
+
),
|
|
945
|
+
zs=np.array(
|
|
946
|
+
[[False, False], [False, False], [False, True], [True, True]], dtype=np.dtype('bool')
|
|
947
|
+
),
|
|
948
|
+
initial_state=0,
|
|
949
|
+
)
|
|
950
|
+
)
|
|
951
|
+
|
|
952
|
+
CZSWAP = CliffordGate.from_clifford_tableau(
|
|
953
|
+
qis.CliffordTableau(
|
|
954
|
+
2,
|
|
955
|
+
rs=np.array([False, False, False, False], dtype=np.dtype('bool')),
|
|
956
|
+
xs=np.array(
|
|
957
|
+
[[False, True], [True, False], [False, False], [False, False]], dtype=np.dtype('bool')
|
|
958
|
+
),
|
|
959
|
+
zs=np.array(
|
|
960
|
+
[[True, False], [False, True], [False, True], [True, False]], dtype=np.dtype('bool')
|
|
961
|
+
),
|
|
962
|
+
initial_state=0,
|
|
963
|
+
)
|
|
964
|
+
)
|