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
cirq/ops/parity_gates_test.py
CHANGED
|
@@ -14,6 +14,8 @@
|
|
|
14
14
|
|
|
15
15
|
"""Tests for `parity_gates.py`."""
|
|
16
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
17
19
|
import numpy as np
|
|
18
20
|
import pytest
|
|
19
21
|
import sympy
|
|
@@ -22,17 +24,17 @@ import cirq
|
|
|
22
24
|
|
|
23
25
|
|
|
24
26
|
@pytest.mark.parametrize('eigen_gate_type', [cirq.XXPowGate, cirq.YYPowGate, cirq.ZZPowGate])
|
|
25
|
-
def test_eigen_gates_consistent_protocols(eigen_gate_type):
|
|
27
|
+
def test_eigen_gates_consistent_protocols(eigen_gate_type) -> None:
|
|
26
28
|
cirq.testing.assert_eigengate_implements_consistent_protocols(eigen_gate_type)
|
|
27
29
|
|
|
28
30
|
|
|
29
|
-
def test_xx_init():
|
|
31
|
+
def test_xx_init() -> None:
|
|
30
32
|
assert cirq.XXPowGate(exponent=1).exponent == 1
|
|
31
33
|
v = cirq.XXPowGate(exponent=0.5)
|
|
32
34
|
assert v.exponent == 0.5
|
|
33
35
|
|
|
34
36
|
|
|
35
|
-
def test_xx_eq():
|
|
37
|
+
def test_xx_eq() -> None:
|
|
36
38
|
eq = cirq.testing.EqualsTester()
|
|
37
39
|
eq.add_equality_group(
|
|
38
40
|
cirq.XX,
|
|
@@ -49,24 +51,24 @@ def test_xx_eq():
|
|
|
49
51
|
eq.add_equality_group(iXX**2.5, iXX**6.5)
|
|
50
52
|
|
|
51
53
|
|
|
52
|
-
def test_xx_pow():
|
|
54
|
+
def test_xx_pow() -> None:
|
|
53
55
|
assert cirq.XX**0.5 != cirq.XX**-0.5
|
|
54
56
|
assert cirq.XX**-1 == cirq.XX
|
|
55
57
|
assert (cirq.XX**-1) ** 0.5 == cirq.XX**-0.5
|
|
56
58
|
|
|
57
59
|
|
|
58
|
-
def test_xx_str():
|
|
60
|
+
def test_xx_str() -> None:
|
|
59
61
|
assert str(cirq.XX) == 'XX'
|
|
60
62
|
assert str(cirq.XX**0.5) == 'XX**0.5'
|
|
61
63
|
assert str(cirq.XXPowGate(global_shift=0.1)) == 'XX'
|
|
62
64
|
|
|
63
65
|
|
|
64
|
-
def test_xx_repr():
|
|
66
|
+
def test_xx_repr() -> None:
|
|
65
67
|
assert repr(cirq.XXPowGate()) == 'cirq.XX'
|
|
66
68
|
assert repr(cirq.XXPowGate(exponent=0.5)) == '(cirq.XX**0.5)'
|
|
67
69
|
|
|
68
70
|
|
|
69
|
-
def test_xx_matrix():
|
|
71
|
+
def test_xx_matrix() -> None:
|
|
70
72
|
np.testing.assert_allclose(
|
|
71
73
|
cirq.unitary(cirq.XX),
|
|
72
74
|
np.array([[0, 0, 0, 1], [0, 0, 1, 0], [0, 1, 0, 0], [1, 0, 0, 0]]),
|
|
@@ -82,7 +84,7 @@ def test_xx_matrix():
|
|
|
82
84
|
)
|
|
83
85
|
|
|
84
86
|
|
|
85
|
-
def test_xx_diagrams():
|
|
87
|
+
def test_xx_diagrams() -> None:
|
|
86
88
|
a = cirq.NamedQubit('a')
|
|
87
89
|
b = cirq.NamedQubit('b')
|
|
88
90
|
circuit = cirq.Circuit(cirq.XX(a, b), cirq.XX(a, b) ** 3, cirq.XX(a, b) ** 0.5)
|
|
@@ -96,13 +98,13 @@ b: ───XX───XX───XX^0.5───
|
|
|
96
98
|
)
|
|
97
99
|
|
|
98
100
|
|
|
99
|
-
def test_yy_init():
|
|
101
|
+
def test_yy_init() -> None:
|
|
100
102
|
assert cirq.YYPowGate(exponent=1).exponent == 1
|
|
101
103
|
v = cirq.YYPowGate(exponent=0.5)
|
|
102
104
|
assert v.exponent == 0.5
|
|
103
105
|
|
|
104
106
|
|
|
105
|
-
def test_yy_eq():
|
|
107
|
+
def test_yy_eq() -> None:
|
|
106
108
|
eq = cirq.testing.EqualsTester()
|
|
107
109
|
eq.add_equality_group(
|
|
108
110
|
cirq.YY,
|
|
@@ -118,13 +120,13 @@ def test_yy_eq():
|
|
|
118
120
|
eq.add_equality_group(iYY**2.5, iYY**6.5)
|
|
119
121
|
|
|
120
122
|
|
|
121
|
-
def test_yy_pow():
|
|
123
|
+
def test_yy_pow() -> None:
|
|
122
124
|
assert cirq.YY**0.5 != cirq.YY**-0.5
|
|
123
125
|
assert cirq.YY**-1 == cirq.YY
|
|
124
126
|
assert (cirq.YY**-1) ** 0.5 == cirq.YY**-0.5
|
|
125
127
|
|
|
126
128
|
|
|
127
|
-
def test_yy_str():
|
|
129
|
+
def test_yy_str() -> None:
|
|
128
130
|
assert str(cirq.YY) == 'YY'
|
|
129
131
|
assert str(cirq.YY**0.5) == 'YY**0.5'
|
|
130
132
|
assert str(cirq.YYPowGate(global_shift=0.1)) == 'YY'
|
|
@@ -133,12 +135,12 @@ def test_yy_str():
|
|
|
133
135
|
assert str(iYY) == 'YY'
|
|
134
136
|
|
|
135
137
|
|
|
136
|
-
def test_yy_repr():
|
|
138
|
+
def test_yy_repr() -> None:
|
|
137
139
|
assert repr(cirq.YYPowGate()) == 'cirq.YY'
|
|
138
140
|
assert repr(cirq.YYPowGate(exponent=0.5)) == '(cirq.YY**0.5)'
|
|
139
141
|
|
|
140
142
|
|
|
141
|
-
def test_yy_matrix():
|
|
143
|
+
def test_yy_matrix() -> None:
|
|
142
144
|
np.testing.assert_allclose(
|
|
143
145
|
cirq.unitary(cirq.YY),
|
|
144
146
|
np.array([[0, 0, 0, -1], [0, 0, 1, 0], [0, 1, 0, 0], [-1, 0, 0, 0]]),
|
|
@@ -154,7 +156,7 @@ def test_yy_matrix():
|
|
|
154
156
|
)
|
|
155
157
|
|
|
156
158
|
|
|
157
|
-
def test_yy_diagrams():
|
|
159
|
+
def test_yy_diagrams() -> None:
|
|
158
160
|
a = cirq.NamedQubit('a')
|
|
159
161
|
b = cirq.NamedQubit('b')
|
|
160
162
|
circuit = cirq.Circuit(cirq.YY(a, b), cirq.YY(a, b) ** 3, cirq.YY(a, b) ** 0.5)
|
|
@@ -168,13 +170,13 @@ b: ───YY───YY───YY^0.5───
|
|
|
168
170
|
)
|
|
169
171
|
|
|
170
172
|
|
|
171
|
-
def test_zz_init():
|
|
173
|
+
def test_zz_init() -> None:
|
|
172
174
|
assert cirq.ZZPowGate(exponent=1).exponent == 1
|
|
173
175
|
v = cirq.ZZPowGate(exponent=0.5)
|
|
174
176
|
assert v.exponent == 0.5
|
|
175
177
|
|
|
176
178
|
|
|
177
|
-
def test_zz_eq():
|
|
179
|
+
def test_zz_eq() -> None:
|
|
178
180
|
eq = cirq.testing.EqualsTester()
|
|
179
181
|
eq.add_equality_group(
|
|
180
182
|
cirq.ZZ,
|
|
@@ -190,19 +192,19 @@ def test_zz_eq():
|
|
|
190
192
|
eq.add_equality_group(iZZ**2.5, iZZ**6.5)
|
|
191
193
|
|
|
192
194
|
|
|
193
|
-
def test_zz_pow():
|
|
195
|
+
def test_zz_pow() -> None:
|
|
194
196
|
assert cirq.ZZ**0.5 != cirq.ZZ**-0.5
|
|
195
197
|
assert cirq.ZZ**-1 == cirq.ZZ
|
|
196
198
|
assert (cirq.ZZ**-1) ** 0.5 == cirq.ZZ**-0.5
|
|
197
199
|
|
|
198
200
|
|
|
199
|
-
def test_zz_phase_by():
|
|
201
|
+
def test_zz_phase_by() -> None:
|
|
200
202
|
assert cirq.phase_by(cirq.ZZ, 0.25, 0) == cirq.phase_by(cirq.ZZ, 0.25, 1) == cirq.ZZ
|
|
201
203
|
assert cirq.phase_by(cirq.ZZ**0.5, 0.25, 0) == cirq.ZZ**0.5
|
|
202
204
|
assert cirq.phase_by(cirq.ZZ**-0.5, 0.25, 1) == cirq.ZZ**-0.5
|
|
203
205
|
|
|
204
206
|
|
|
205
|
-
def test_zz_str():
|
|
207
|
+
def test_zz_str() -> None:
|
|
206
208
|
assert str(cirq.ZZ) == 'ZZ'
|
|
207
209
|
assert str(cirq.ZZ**0.5) == 'ZZ**0.5'
|
|
208
210
|
assert str(cirq.ZZPowGate(global_shift=0.1)) == 'ZZ'
|
|
@@ -211,12 +213,12 @@ def test_zz_str():
|
|
|
211
213
|
assert str(iZZ) == 'ZZ'
|
|
212
214
|
|
|
213
215
|
|
|
214
|
-
def test_zz_repr():
|
|
216
|
+
def test_zz_repr() -> None:
|
|
215
217
|
assert repr(cirq.ZZPowGate()) == 'cirq.ZZ'
|
|
216
218
|
assert repr(cirq.ZZPowGate(exponent=0.5)) == '(cirq.ZZ**0.5)'
|
|
217
219
|
|
|
218
220
|
|
|
219
|
-
def test_zz_matrix():
|
|
221
|
+
def test_zz_matrix() -> None:
|
|
220
222
|
np.testing.assert_allclose(
|
|
221
223
|
cirq.unitary(cirq.ZZ),
|
|
222
224
|
np.array([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]]),
|
|
@@ -232,7 +234,7 @@ def test_zz_matrix():
|
|
|
232
234
|
)
|
|
233
235
|
|
|
234
236
|
|
|
235
|
-
def test_zz_diagrams():
|
|
237
|
+
def test_zz_diagrams() -> None:
|
|
236
238
|
a = cirq.NamedQubit('a')
|
|
237
239
|
b = cirq.NamedQubit('b')
|
|
238
240
|
circuit = cirq.Circuit(cirq.ZZ(a, b), cirq.ZZ(a, b) ** 3, cirq.ZZ(a, b) ** 0.5)
|
|
@@ -246,7 +248,7 @@ b: ───ZZ───ZZ───ZZ^0.5───
|
|
|
246
248
|
)
|
|
247
249
|
|
|
248
250
|
|
|
249
|
-
def test_trace_distance():
|
|
251
|
+
def test_trace_distance() -> None:
|
|
250
252
|
foo = sympy.Symbol('foo')
|
|
251
253
|
assert cirq.trace_distance_bound(cirq.XX**foo) == 1.0
|
|
252
254
|
assert cirq.trace_distance_bound(cirq.YY**foo) == 1.0
|
|
@@ -256,7 +258,7 @@ def test_trace_distance():
|
|
|
256
258
|
assert cirq.approx_eq(cirq.trace_distance_bound(cirq.ZZ ** (1 / 3)), np.sin(np.pi / 6))
|
|
257
259
|
|
|
258
260
|
|
|
259
|
-
def test_ms_arguments():
|
|
261
|
+
def test_ms_arguments() -> None:
|
|
260
262
|
eq_tester = cirq.testing.EqualsTester()
|
|
261
263
|
eq_tester.add_equality_group(
|
|
262
264
|
cirq.ms(np.pi / 2), cirq.MSGate(rads=np.pi / 2), cirq.XXPowGate(global_shift=-0.5)
|
|
@@ -268,7 +270,7 @@ def test_ms_arguments():
|
|
|
268
270
|
eq_tester.add_equality_group(cirq.XX**0.5)
|
|
269
271
|
|
|
270
272
|
|
|
271
|
-
def test_ms_equal_up_to_global_phase():
|
|
273
|
+
def test_ms_equal_up_to_global_phase() -> None:
|
|
272
274
|
assert cirq.equal_up_to_global_phase(cirq.ms(np.pi / 2), cirq.XX)
|
|
273
275
|
assert cirq.equal_up_to_global_phase(cirq.ms(np.pi / 4), cirq.XX**0.5)
|
|
274
276
|
assert not cirq.equal_up_to_global_phase(cirq.ms(np.pi / 4), cirq.XX)
|
|
@@ -278,7 +280,7 @@ def test_ms_equal_up_to_global_phase():
|
|
|
278
280
|
assert cirq.ms(np.pi / 4) not in cirq.GateFamily(cirq.XX)
|
|
279
281
|
|
|
280
282
|
|
|
281
|
-
def test_ms_str():
|
|
283
|
+
def test_ms_str() -> None:
|
|
282
284
|
ms = cirq.ms(np.pi / 2)
|
|
283
285
|
assert str(ms) == 'MS(π/2)'
|
|
284
286
|
assert str(cirq.ms(np.pi)) == 'MS(2.0π/2)'
|
|
@@ -287,7 +289,7 @@ def test_ms_str():
|
|
|
287
289
|
assert str(ms**-1) == 'MS(-1.0π/2)'
|
|
288
290
|
|
|
289
291
|
|
|
290
|
-
def test_ms_matrix():
|
|
292
|
+
def test_ms_matrix() -> None:
|
|
291
293
|
s = np.sqrt(0.5)
|
|
292
294
|
# yapf: disable
|
|
293
295
|
np.testing.assert_allclose(cirq.unitary(cirq.ms(np.pi/4)),
|
|
@@ -300,7 +302,7 @@ def test_ms_matrix():
|
|
|
300
302
|
np.testing.assert_allclose(cirq.unitary(cirq.ms(np.pi)), np.diag([-1, -1, -1, -1]), atol=1e-8)
|
|
301
303
|
|
|
302
304
|
|
|
303
|
-
def test_ms_repr():
|
|
305
|
+
def test_ms_repr() -> None:
|
|
304
306
|
assert repr(cirq.ms(np.pi / 2)) == 'cirq.ms(np.pi/2)'
|
|
305
307
|
assert repr(cirq.ms(np.pi / 4)) == 'cirq.ms(0.5*np.pi/2)'
|
|
306
308
|
cirq.testing.assert_equivalent_repr(cirq.ms(np.pi / 4))
|
|
@@ -309,7 +311,7 @@ def test_ms_repr():
|
|
|
309
311
|
assert repr(ms**-0.5) == 'cirq.ms(-0.5*np.pi/2)'
|
|
310
312
|
|
|
311
313
|
|
|
312
|
-
def test_ms_diagrams():
|
|
314
|
+
def test_ms_diagrams() -> None:
|
|
313
315
|
a = cirq.NamedQubit('a')
|
|
314
316
|
b = cirq.NamedQubit('b')
|
|
315
317
|
circuit = cirq.Circuit(cirq.SWAP(a, b), cirq.X(a), cirq.Y(a), cirq.ms(np.pi).on(a, b))
|
|
@@ -323,7 +325,7 @@ b: ───×───────────MS(π)───
|
|
|
323
325
|
)
|
|
324
326
|
|
|
325
327
|
|
|
326
|
-
def test_json_serialization():
|
|
328
|
+
def test_json_serialization() -> None:
|
|
327
329
|
assert cirq.read_json(json_text=cirq.to_json(cirq.ms(np.pi / 2))) == cirq.ms(np.pi / 2)
|
|
328
330
|
|
|
329
331
|
|
|
@@ -332,7 +334,9 @@ def test_json_serialization():
|
|
|
332
334
|
'exponent,is_clifford',
|
|
333
335
|
((0, True), (0.5, True), (0.75, False), (1, True), (1.5, True), (-1.5, True)),
|
|
334
336
|
)
|
|
335
|
-
def test_clifford_protocols(
|
|
337
|
+
def test_clifford_protocols(
|
|
338
|
+
gate_cls: type[cirq.EigenGate], exponent: float, is_clifford: bool
|
|
339
|
+
) -> None:
|
|
336
340
|
gate = gate_cls(exponent=exponent)
|
|
337
341
|
assert hasattr(gate, '_decompose_into_clifford_with_qubits_')
|
|
338
342
|
if is_clifford:
|
cirq/ops/pauli_gates.py
CHANGED
|
@@ -11,9 +11,12 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
14
17
|
import abc
|
|
15
18
|
from types import NotImplementedType
|
|
16
|
-
from typing import Any, cast,
|
|
19
|
+
from typing import Any, cast, TYPE_CHECKING
|
|
17
20
|
|
|
18
21
|
from cirq._doc import document
|
|
19
22
|
from cirq._import import LazyLoader
|
|
@@ -39,14 +42,14 @@ class Pauli(raw_types.Gate, metaclass=abc.ABCMeta):
|
|
|
39
42
|
of private subclasses are the X, Y, or Z Pauli gates defined below.
|
|
40
43
|
"""
|
|
41
44
|
|
|
42
|
-
_XYZ:
|
|
45
|
+
_XYZ: tuple[Pauli, Pauli, Pauli]
|
|
43
46
|
|
|
44
47
|
@staticmethod
|
|
45
|
-
def by_index(index: int) ->
|
|
48
|
+
def by_index(index: int) -> Pauli:
|
|
46
49
|
return Pauli._XYZ[index % 3]
|
|
47
50
|
|
|
48
51
|
@staticmethod
|
|
49
|
-
def by_relative_index(p:
|
|
52
|
+
def by_relative_index(p: Pauli, relative_index: int) -> Pauli:
|
|
50
53
|
return Pauli._XYZ[(p._index + relative_index) % 3]
|
|
51
54
|
|
|
52
55
|
def __init__(self, index: int, name: str) -> None:
|
|
@@ -56,23 +59,21 @@ class Pauli(raw_types.Gate, metaclass=abc.ABCMeta):
|
|
|
56
59
|
def num_qubits(self):
|
|
57
60
|
return 1
|
|
58
61
|
|
|
59
|
-
def _commutes_(
|
|
60
|
-
self, other: Any, *, atol: float = 1e-8
|
|
61
|
-
) -> Union[bool, NotImplementedType, None]:
|
|
62
|
+
def _commutes_(self, other: Any, *, atol: float = 1e-8) -> bool | NotImplementedType | None:
|
|
62
63
|
if not isinstance(other, Pauli):
|
|
63
64
|
return NotImplemented
|
|
64
65
|
return self is other
|
|
65
66
|
|
|
66
|
-
def third(self, second:
|
|
67
|
+
def third(self, second: Pauli) -> Pauli:
|
|
67
68
|
return Pauli._XYZ[(-self._index - second._index) % 3]
|
|
68
69
|
|
|
69
|
-
def relative_index(self, second:
|
|
70
|
+
def relative_index(self, second: Pauli) -> int:
|
|
70
71
|
"""Relative index of self w.r.t. second in the (X, Y, Z) cycle."""
|
|
71
72
|
return (self._index - second._index + 1) % 3 - 1
|
|
72
73
|
|
|
73
74
|
def phased_pauli_product(
|
|
74
|
-
self, other:
|
|
75
|
-
) ->
|
|
75
|
+
self, other: cirq.Pauli | identity.IdentityGate
|
|
76
|
+
) -> tuple[complex, cirq.Pauli | identity.IdentityGate]:
|
|
76
77
|
if self == other:
|
|
77
78
|
return 1, identity.I
|
|
78
79
|
if other is identity.I:
|
|
@@ -89,7 +90,7 @@ class Pauli(raw_types.Gate, metaclass=abc.ABCMeta):
|
|
|
89
90
|
return NotImplemented
|
|
90
91
|
return (other._index - self._index) % 3 == 1
|
|
91
92
|
|
|
92
|
-
def on(self, *qubits:
|
|
93
|
+
def on(self, *qubits: cirq.Qid) -> SingleQubitPauliStringGateOperation:
|
|
93
94
|
"""Returns an application of this gate to the given qubits.
|
|
94
95
|
|
|
95
96
|
Args:
|
|
@@ -109,10 +110,10 @@ class _PauliX(Pauli, common_gates.XPowGate):
|
|
|
109
110
|
Pauli.__init__(self, index=0, name='X')
|
|
110
111
|
common_gates.XPowGate.__init__(self, exponent=1.0)
|
|
111
112
|
|
|
112
|
-
def __pow__(self, exponent:
|
|
113
|
+
def __pow__(self, exponent: cirq.TParamVal) -> common_gates.XPowGate:
|
|
113
114
|
return common_gates.XPowGate(exponent=exponent) if exponent != 1 else _PauliX()
|
|
114
115
|
|
|
115
|
-
def _with_exponent(self, exponent:
|
|
116
|
+
def _with_exponent(self, exponent: cirq.TParamVal) -> common_gates.XPowGate:
|
|
116
117
|
return self.__pow__(exponent)
|
|
117
118
|
|
|
118
119
|
@classmethod
|
|
@@ -122,7 +123,7 @@ class _PauliX(Pauli, common_gates.XPowGate):
|
|
|
122
123
|
return Pauli._XYZ[0]
|
|
123
124
|
|
|
124
125
|
@property
|
|
125
|
-
def basis(self) ->
|
|
126
|
+
def basis(self) -> dict[int, _XEigenState]:
|
|
126
127
|
from cirq.value.product_state import _XEigenState
|
|
127
128
|
|
|
128
129
|
return {+1: _XEigenState(+1), -1: _XEigenState(-1)}
|
|
@@ -133,10 +134,10 @@ class _PauliY(Pauli, common_gates.YPowGate):
|
|
|
133
134
|
Pauli.__init__(self, index=1, name='Y')
|
|
134
135
|
common_gates.YPowGate.__init__(self, exponent=1.0)
|
|
135
136
|
|
|
136
|
-
def __pow__(self, exponent:
|
|
137
|
+
def __pow__(self, exponent: cirq.TParamVal) -> common_gates.YPowGate:
|
|
137
138
|
return common_gates.YPowGate(exponent=exponent) if exponent != 1 else _PauliY()
|
|
138
139
|
|
|
139
|
-
def _with_exponent(self, exponent:
|
|
140
|
+
def _with_exponent(self, exponent: cirq.TParamVal) -> common_gates.YPowGate:
|
|
140
141
|
return self.__pow__(exponent)
|
|
141
142
|
|
|
142
143
|
@classmethod
|
|
@@ -146,7 +147,7 @@ class _PauliY(Pauli, common_gates.YPowGate):
|
|
|
146
147
|
return Pauli._XYZ[1]
|
|
147
148
|
|
|
148
149
|
@property
|
|
149
|
-
def basis(self) ->
|
|
150
|
+
def basis(self) -> dict[int, _YEigenState]:
|
|
150
151
|
from cirq.value.product_state import _YEigenState
|
|
151
152
|
|
|
152
153
|
return {+1: _YEigenState(+1), -1: _YEigenState(-1)}
|
|
@@ -157,10 +158,10 @@ class _PauliZ(Pauli, common_gates.ZPowGate):
|
|
|
157
158
|
Pauli.__init__(self, index=2, name='Z')
|
|
158
159
|
common_gates.ZPowGate.__init__(self, exponent=1.0)
|
|
159
160
|
|
|
160
|
-
def __pow__(self, exponent:
|
|
161
|
+
def __pow__(self, exponent: cirq.TParamVal) -> common_gates.ZPowGate:
|
|
161
162
|
return common_gates.ZPowGate(exponent=exponent) if exponent != 1 else _PauliZ()
|
|
162
163
|
|
|
163
|
-
def _with_exponent(self, exponent:
|
|
164
|
+
def _with_exponent(self, exponent: cirq.TParamVal) -> common_gates.ZPowGate:
|
|
164
165
|
return self.__pow__(exponent)
|
|
165
166
|
|
|
166
167
|
@classmethod
|
|
@@ -170,7 +171,7 @@ class _PauliZ(Pauli, common_gates.ZPowGate):
|
|
|
170
171
|
return Pauli._XYZ[2]
|
|
171
172
|
|
|
172
173
|
@property
|
|
173
|
-
def basis(self) ->
|
|
174
|
+
def basis(self) -> dict[int, _ZEigenState]:
|
|
174
175
|
from cirq.value.product_state import _ZEigenState
|
|
175
176
|
|
|
176
177
|
return {+1: _ZEigenState(+1), -1: _ZEigenState(-1)}
|
cirq/ops/pauli_gates_test.py
CHANGED
|
@@ -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 itertools
|
|
16
18
|
|
|
17
19
|
import numpy as np
|
|
@@ -20,14 +22,14 @@ import pytest
|
|
|
20
22
|
import cirq
|
|
21
23
|
|
|
22
24
|
|
|
23
|
-
def test_equals():
|
|
25
|
+
def test_equals() -> None:
|
|
24
26
|
eq = cirq.testing.EqualsTester()
|
|
25
27
|
eq.add_equality_group(cirq.X, cirq.ops.pauli_gates.X, cirq.XPowGate())
|
|
26
28
|
eq.add_equality_group(cirq.Y, cirq.ops.pauli_gates.Y, cirq.YPowGate())
|
|
27
29
|
eq.add_equality_group(cirq.Z, cirq.ops.pauli_gates.Z, cirq.ZPowGate())
|
|
28
30
|
|
|
29
31
|
|
|
30
|
-
def test_phased_pauli_product():
|
|
32
|
+
def test_phased_pauli_product() -> None:
|
|
31
33
|
assert cirq.X.phased_pauli_product(cirq.I) == (1, cirq.X)
|
|
32
34
|
assert cirq.X.phased_pauli_product(cirq.X) == (1, cirq.I)
|
|
33
35
|
assert cirq.X.phased_pauli_product(cirq.Y) == (1j, cirq.Z)
|
|
@@ -44,7 +46,7 @@ def test_phased_pauli_product():
|
|
|
44
46
|
assert cirq.Z.phased_pauli_product(cirq.Z) == (1, cirq.I)
|
|
45
47
|
|
|
46
48
|
|
|
47
|
-
def test_isinstance():
|
|
49
|
+
def test_isinstance() -> None:
|
|
48
50
|
assert isinstance(cirq.X, cirq.XPowGate)
|
|
49
51
|
assert isinstance(cirq.Y, cirq.YPowGate)
|
|
50
52
|
assert isinstance(cirq.Z, cirq.ZPowGate)
|
|
@@ -59,14 +61,14 @@ def test_isinstance():
|
|
|
59
61
|
assert not isinstance(cirq.Z, cirq.YPowGate)
|
|
60
62
|
|
|
61
63
|
|
|
62
|
-
def test_by_index():
|
|
64
|
+
def test_by_index() -> None:
|
|
63
65
|
eq = cirq.testing.EqualsTester()
|
|
64
66
|
eq.add_equality_group(cirq.X, *[cirq.Pauli.by_index(i) for i in (-3, 0, 3, 6)])
|
|
65
67
|
eq.add_equality_group(cirq.Y, *[cirq.Pauli.by_index(i) for i in (-2, 1, 4, 7)])
|
|
66
68
|
eq.add_equality_group(cirq.Z, *[cirq.Pauli.by_index(i) for i in (-1, 2, 5, 8)])
|
|
67
69
|
|
|
68
70
|
|
|
69
|
-
def test_relative_index():
|
|
71
|
+
def test_relative_index() -> None:
|
|
70
72
|
assert cirq.X.relative_index(cirq.X) == 0
|
|
71
73
|
assert cirq.X.relative_index(cirq.Y) == -1
|
|
72
74
|
assert cirq.X.relative_index(cirq.Z) == 1
|
|
@@ -78,7 +80,7 @@ def test_relative_index():
|
|
|
78
80
|
assert cirq.Z.relative_index(cirq.Z) == 0
|
|
79
81
|
|
|
80
82
|
|
|
81
|
-
def test_by_relative_index():
|
|
83
|
+
def test_by_relative_index() -> None:
|
|
82
84
|
assert cirq.Pauli.by_relative_index(cirq.X, -1) == cirq.Z
|
|
83
85
|
assert cirq.Pauli.by_relative_index(cirq.X, 0) == cirq.X
|
|
84
86
|
assert cirq.Pauli.by_relative_index(cirq.X, 1) == cirq.Y
|
|
@@ -96,7 +98,7 @@ def test_by_relative_index():
|
|
|
96
98
|
assert cirq.Pauli.by_relative_index(cirq.Z, 3) == cirq.Z
|
|
97
99
|
|
|
98
100
|
|
|
99
|
-
def test_too_many_qubits():
|
|
101
|
+
def test_too_many_qubits() -> None:
|
|
100
102
|
a, b = cirq.LineQubit.range(2)
|
|
101
103
|
with pytest.raises(ValueError, match='single qubit'):
|
|
102
104
|
_ = cirq.X.on(a, b)
|
|
@@ -106,14 +108,14 @@ def test_too_many_qubits():
|
|
|
106
108
|
_ = x.with_qubits(a, b)
|
|
107
109
|
|
|
108
110
|
|
|
109
|
-
def test_relative_index_consistency():
|
|
111
|
+
def test_relative_index_consistency() -> None:
|
|
110
112
|
for pauli_1 in (cirq.X, cirq.Y, cirq.Z):
|
|
111
113
|
for pauli_2 in (cirq.X, cirq.Y, cirq.Z):
|
|
112
114
|
shift = pauli_2.relative_index(pauli_1)
|
|
113
115
|
assert cirq.Pauli.by_relative_index(pauli_1, shift) == pauli_2
|
|
114
116
|
|
|
115
117
|
|
|
116
|
-
def test_gt():
|
|
118
|
+
def test_gt() -> None:
|
|
117
119
|
assert not cirq.X > cirq.X
|
|
118
120
|
assert not cirq.X > cirq.Y
|
|
119
121
|
assert cirq.X > cirq.Z
|
|
@@ -125,12 +127,12 @@ def test_gt():
|
|
|
125
127
|
assert not cirq.Z > cirq.Z
|
|
126
128
|
|
|
127
129
|
|
|
128
|
-
def test_gt_other_type():
|
|
130
|
+
def test_gt_other_type() -> None:
|
|
129
131
|
with pytest.raises(TypeError):
|
|
130
132
|
_ = cirq.X > object()
|
|
131
133
|
|
|
132
134
|
|
|
133
|
-
def test_lt():
|
|
135
|
+
def test_lt() -> None:
|
|
134
136
|
assert not cirq.X < cirq.X
|
|
135
137
|
assert cirq.X < cirq.Y
|
|
136
138
|
assert not cirq.X < cirq.Z
|
|
@@ -142,24 +144,24 @@ def test_lt():
|
|
|
142
144
|
assert not cirq.Z < cirq.Z
|
|
143
145
|
|
|
144
146
|
|
|
145
|
-
def test_lt_other_type():
|
|
147
|
+
def test_lt_other_type() -> None:
|
|
146
148
|
with pytest.raises(TypeError):
|
|
147
149
|
_ = cirq.X < object()
|
|
148
150
|
|
|
149
151
|
|
|
150
|
-
def test_str():
|
|
152
|
+
def test_str() -> None:
|
|
151
153
|
assert str(cirq.X) == 'X'
|
|
152
154
|
assert str(cirq.Y) == 'Y'
|
|
153
155
|
assert str(cirq.Z) == 'Z'
|
|
154
156
|
|
|
155
157
|
|
|
156
|
-
def test_repr():
|
|
158
|
+
def test_repr() -> None:
|
|
157
159
|
assert repr(cirq.X) == 'cirq.X'
|
|
158
160
|
assert repr(cirq.Y) == 'cirq.Y'
|
|
159
161
|
assert repr(cirq.Z) == 'cirq.Z'
|
|
160
162
|
|
|
161
163
|
|
|
162
|
-
def test_third():
|
|
164
|
+
def test_third() -> None:
|
|
163
165
|
assert cirq.X.third(cirq.Y) == cirq.Z
|
|
164
166
|
assert cirq.Y.third(cirq.X) == cirq.Z
|
|
165
167
|
assert cirq.Y.third(cirq.Z) == cirq.X
|
|
@@ -172,7 +174,7 @@ def test_third():
|
|
|
172
174
|
assert cirq.Z.third(cirq.Z) == cirq.Z
|
|
173
175
|
|
|
174
176
|
|
|
175
|
-
def test_commutes():
|
|
177
|
+
def test_commutes() -> None:
|
|
176
178
|
for A, B in itertools.product([cirq.X, cirq.Y, cirq.Z], repeat=2):
|
|
177
179
|
assert cirq.commutes(A, B) == (A == B)
|
|
178
180
|
with pytest.raises(TypeError):
|
|
@@ -181,19 +183,19 @@ def test_commutes():
|
|
|
181
183
|
assert cirq.commutes(cirq.Z, cirq.read_json(json_text=cirq.to_json(cirq.Z)))
|
|
182
184
|
|
|
183
185
|
|
|
184
|
-
def test_unitary():
|
|
186
|
+
def test_unitary() -> None:
|
|
185
187
|
np.testing.assert_equal(cirq.unitary(cirq.X), cirq.unitary(cirq.X))
|
|
186
188
|
np.testing.assert_equal(cirq.unitary(cirq.Y), cirq.unitary(cirq.Y))
|
|
187
189
|
np.testing.assert_equal(cirq.unitary(cirq.Z), cirq.unitary(cirq.Z))
|
|
188
190
|
|
|
189
191
|
|
|
190
|
-
def test_apply_unitary():
|
|
192
|
+
def test_apply_unitary() -> None:
|
|
191
193
|
cirq.testing.assert_has_consistent_apply_unitary(cirq.X)
|
|
192
194
|
cirq.testing.assert_has_consistent_apply_unitary(cirq.Y)
|
|
193
195
|
cirq.testing.assert_has_consistent_apply_unitary(cirq.Z)
|
|
194
196
|
|
|
195
197
|
|
|
196
|
-
def test_identity_multiplication():
|
|
198
|
+
def test_identity_multiplication() -> None:
|
|
197
199
|
a, b, c = cirq.LineQubit.range(3)
|
|
198
200
|
assert cirq.X(a) * cirq.I(a) == cirq.X(a)
|
|
199
201
|
assert cirq.X(a) * cirq.I(b) == cirq.X(a)
|
|
@@ -207,7 +209,7 @@ def test_identity_multiplication():
|
|
|
207
209
|
_ = cirq.I(a) * str(cirq.Y(b))
|
|
208
210
|
|
|
209
211
|
|
|
210
|
-
def test_powers():
|
|
212
|
+
def test_powers() -> None:
|
|
211
213
|
assert isinstance(cirq.X, cirq.Pauli)
|
|
212
214
|
assert isinstance(cirq.Y, cirq.Pauli)
|
|
213
215
|
assert isinstance(cirq.Z, cirq.Pauli)
|
|
@@ -221,3 +223,10 @@ def test_powers():
|
|
|
221
223
|
assert isinstance(cirq.X**1, cirq.Pauli)
|
|
222
224
|
assert isinstance(cirq.Y**1, cirq.Pauli)
|
|
223
225
|
assert isinstance(cirq.Z**1, cirq.Pauli)
|
|
226
|
+
|
|
227
|
+
with pytest.raises(TypeError, match="Gate exponent must be a number or sympy expression."):
|
|
228
|
+
assert cirq.X ** 'text'
|
|
229
|
+
with pytest.raises(TypeError, match="Gate exponent must be a number or sympy expression."):
|
|
230
|
+
assert cirq.Y ** 'text'
|
|
231
|
+
with pytest.raises(TypeError, match="Gate exponent must be a number or sympy expression."):
|
|
232
|
+
assert cirq.Z ** 'text'
|
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import Any, Iterator, Sequence, TYPE_CHECKING
|
|
16
18
|
|
|
17
19
|
import numpy as np
|
|
18
20
|
|
|
@@ -24,7 +26,7 @@ from cirq.ops.clifford_gate import SingleQubitCliffordGate
|
|
|
24
26
|
if TYPE_CHECKING:
|
|
25
27
|
import cirq
|
|
26
28
|
|
|
27
|
-
PAULI_EIGEN_MAP:
|
|
29
|
+
PAULI_EIGEN_MAP: dict[pauli_gates.Pauli, tuple[np.ndarray, np.ndarray]] = {
|
|
28
30
|
pauli_gates.X: (np.array([[0.5, 0.5], [0.5, 0.5]]), np.array([[0.5, -0.5], [-0.5, 0.5]])),
|
|
29
31
|
pauli_gates.Y: (np.array([[0.5, -0.5j], [0.5j, 0.5]]), np.array([[0.5, 0.5j], [-0.5j, 0.5]])),
|
|
30
32
|
pauli_gates.Z: (np.diag([1, 0]), np.diag([0, 1])),
|
|
@@ -35,8 +37,8 @@ PAULI_EIGEN_MAP: Dict[pauli_gates.Pauli, Tuple[np.ndarray, np.ndarray]] = {
|
|
|
35
37
|
class PauliInteractionGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
|
|
36
38
|
"""A CZ conjugated by arbitrary single qubit Cliffords."""
|
|
37
39
|
|
|
38
|
-
CZ:
|
|
39
|
-
CNOT:
|
|
40
|
+
CZ: PauliInteractionGate
|
|
41
|
+
CNOT: PauliInteractionGate
|
|
40
42
|
|
|
41
43
|
def __init__(
|
|
42
44
|
self,
|
|
@@ -66,7 +68,7 @@ class PauliInteractionGate(gate_features.InterchangeableQubitsGate, eigen_gate.E
|
|
|
66
68
|
self._invert1 = invert1
|
|
67
69
|
|
|
68
70
|
@property
|
|
69
|
-
def pauli0(self) ->
|
|
71
|
+
def pauli0(self) -> cirq.Pauli:
|
|
70
72
|
return self._pauli0
|
|
71
73
|
|
|
72
74
|
@property
|
|
@@ -74,7 +76,7 @@ class PauliInteractionGate(gate_features.InterchangeableQubitsGate, eigen_gate.E
|
|
|
74
76
|
return self._invert0
|
|
75
77
|
|
|
76
78
|
@property
|
|
77
|
-
def pauli1(self) ->
|
|
79
|
+
def pauli1(self) -> cirq.Pauli:
|
|
78
80
|
return self._pauli1
|
|
79
81
|
|
|
80
82
|
@property
|
|
@@ -98,15 +100,15 @@ class PauliInteractionGate(gate_features.InterchangeableQubitsGate, eigen_gate.E
|
|
|
98
100
|
return 0
|
|
99
101
|
return index
|
|
100
102
|
|
|
101
|
-
def _with_exponent(self, exponent: value.TParamVal) ->
|
|
103
|
+
def _with_exponent(self, exponent: value.TParamVal) -> PauliInteractionGate:
|
|
102
104
|
return PauliInteractionGate(
|
|
103
105
|
self.pauli0, self.invert0, self.pauli1, self.invert1, exponent=exponent
|
|
104
106
|
)
|
|
105
107
|
|
|
106
|
-
def _eigen_shifts(self) ->
|
|
108
|
+
def _eigen_shifts(self) -> list[float]:
|
|
107
109
|
return [0.0, 1.0]
|
|
108
110
|
|
|
109
|
-
def _eigen_components(self) ->
|
|
111
|
+
def _eigen_components(self) -> list[tuple[float, np.ndarray]]:
|
|
110
112
|
comp1 = np.kron(
|
|
111
113
|
PAULI_EIGEN_MAP[self.pauli0][not self.invert0],
|
|
112
114
|
PAULI_EIGEN_MAP[self.pauli1][not self.invert1],
|
|
@@ -114,7 +116,7 @@ class PauliInteractionGate(gate_features.InterchangeableQubitsGate, eigen_gate.E
|
|
|
114
116
|
comp0 = np.eye(4) - comp1
|
|
115
117
|
return [(0, comp0), (1, comp1)]
|
|
116
118
|
|
|
117
|
-
def _decompose_(self, qubits: Sequence[
|
|
119
|
+
def _decompose_(self, qubits: Sequence[cirq.Qid]) -> Iterator[cirq.OP_TREE]:
|
|
118
120
|
q0, q1 = qubits
|
|
119
121
|
right_gate0 = SingleQubitCliffordGate.from_single_map(z_to=(self.pauli0, self.invert0))
|
|
120
122
|
right_gate1 = SingleQubitCliffordGate.from_single_map(z_to=(self.pauli1, self.invert1))
|
|
@@ -127,14 +129,8 @@ class PauliInteractionGate(gate_features.InterchangeableQubitsGate, eigen_gate.E
|
|
|
127
129
|
yield right_gate0(q0)
|
|
128
130
|
yield right_gate1(q1)
|
|
129
131
|
|
|
130
|
-
def _circuit_diagram_info_(
|
|
131
|
-
|
|
132
|
-
) -> 'cirq.CircuitDiagramInfo':
|
|
133
|
-
labels: Dict['cirq.Pauli', str] = {
|
|
134
|
-
pauli_gates.X: 'X',
|
|
135
|
-
pauli_gates.Y: 'Y',
|
|
136
|
-
pauli_gates.Z: '@',
|
|
137
|
-
}
|
|
132
|
+
def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> cirq.CircuitDiagramInfo:
|
|
133
|
+
labels: dict[cirq.Pauli, str] = {pauli_gates.X: 'X', pauli_gates.Y: 'Y', pauli_gates.Z: '@'}
|
|
138
134
|
l0 = labels[self.pauli0]
|
|
139
135
|
l1 = labels[self.pauli1]
|
|
140
136
|
# Add brackets around letter if inverted
|
|
@@ -153,7 +149,7 @@ class PauliInteractionGate(gate_features.InterchangeableQubitsGate, eigen_gate.E
|
|
|
153
149
|
return base
|
|
154
150
|
return f'({base}**{proper_repr(self._exponent)})'
|
|
155
151
|
|
|
156
|
-
def _json_dict_(self) ->
|
|
152
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
157
153
|
return protocols.obj_to_dict_helper(self, ["pauli0", "invert0", "pauli1", "invert1"])
|
|
158
154
|
|
|
159
155
|
|