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_test.py
CHANGED
|
@@ -12,9 +12,10 @@
|
|
|
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
|
import itertools
|
|
17
|
-
from typing import Tuple, Type
|
|
18
19
|
|
|
19
20
|
import numpy as np
|
|
20
21
|
import pytest
|
|
@@ -59,7 +60,7 @@ def _all_rotation_pairs():
|
|
|
59
60
|
|
|
60
61
|
|
|
61
62
|
@functools.lru_cache()
|
|
62
|
-
def _all_clifford_gates() ->
|
|
63
|
+
def _all_clifford_gates() -> tuple[cirq.SingleQubitCliffordGate, ...]:
|
|
63
64
|
return tuple(
|
|
64
65
|
cirq.SingleQubitCliffordGate.from_xz_map(trans_x, trans_z)
|
|
65
66
|
for trans_x, trans_z in _all_rotation_pairs()
|
|
@@ -67,13 +68,13 @@ def _all_clifford_gates() -> Tuple['cirq.SingleQubitCliffordGate', ...]:
|
|
|
67
68
|
|
|
68
69
|
|
|
69
70
|
@pytest.mark.parametrize('pauli,flip_x,flip_z', itertools.product(_paulis, _bools, _bools))
|
|
70
|
-
def test_init_value_error(pauli, flip_x, flip_z):
|
|
71
|
+
def test_init_value_error(pauli, flip_x, flip_z) -> None:
|
|
71
72
|
with pytest.raises(ValueError):
|
|
72
73
|
cirq.SingleQubitCliffordGate.from_xz_map((pauli, flip_x), (pauli, flip_z))
|
|
73
74
|
|
|
74
75
|
|
|
75
76
|
@pytest.mark.parametrize('trans_x,trans_z', _all_rotation_pairs())
|
|
76
|
-
def test_init_from_xz(trans_x, trans_z):
|
|
77
|
+
def test_init_from_xz(trans_x, trans_z) -> None:
|
|
77
78
|
gate = cirq.SingleQubitCliffordGate.from_xz_map(trans_x, trans_z)
|
|
78
79
|
assert gate.pauli_tuple(cirq.X) == trans_x
|
|
79
80
|
assert gate.pauli_tuple(cirq.Z) == trans_z
|
|
@@ -81,7 +82,7 @@ def test_init_from_xz(trans_x, trans_z):
|
|
|
81
82
|
_assert_no_collision(gate)
|
|
82
83
|
|
|
83
84
|
|
|
84
|
-
def test_dense_pauli_string():
|
|
85
|
+
def test_dense_pauli_string() -> None:
|
|
85
86
|
gate = cirq.SingleQubitCliffordGate.from_xz_map((cirq.X, True), (cirq.Y, False))
|
|
86
87
|
assert gate.dense_pauli_string(cirq.X) == cirq.DensePauliString('X', coefficient=-1)
|
|
87
88
|
assert gate.dense_pauli_string(cirq.Z) == cirq.DensePauliString('Y')
|
|
@@ -95,7 +96,7 @@ def test_dense_pauli_string():
|
|
|
95
96
|
if trans1[0] != trans2[0]
|
|
96
97
|
),
|
|
97
98
|
)
|
|
98
|
-
def test_init_from_double_map_vs_kwargs(trans1, trans2, from1):
|
|
99
|
+
def test_init_from_double_map_vs_kwargs(trans1, trans2, from1) -> None:
|
|
99
100
|
from2 = cirq.Pauli.by_relative_index(from1, 1)
|
|
100
101
|
from1_str, from2_str = (str(frm).lower() + '_to' for frm in (from1, from2))
|
|
101
102
|
gate_kw = cirq.SingleQubitCliffordGate.from_double_map(**{from1_str: trans1, from2_str: trans2})
|
|
@@ -114,7 +115,7 @@ def test_init_from_double_map_vs_kwargs(trans1, trans2, from1):
|
|
|
114
115
|
'trans1,from1',
|
|
115
116
|
((trans1, from1) for trans1, from1 in itertools.product(_all_rotations(), _paulis)),
|
|
116
117
|
)
|
|
117
|
-
def test_init_from_double_invalid(trans1, from1):
|
|
118
|
+
def test_init_from_double_invalid(trans1, from1) -> None:
|
|
118
119
|
from2 = cirq.Pauli.by_relative_index(from1, 1)
|
|
119
120
|
# Test throws on invalid arguments
|
|
120
121
|
with pytest.raises(ValueError):
|
|
@@ -122,9 +123,8 @@ def test_init_from_double_invalid(trans1, from1):
|
|
|
122
123
|
|
|
123
124
|
|
|
124
125
|
@pytest.mark.parametrize('trans,frm', itertools.product(_all_rotations(), _paulis))
|
|
125
|
-
def test_init_from_single_map_vs_kwargs(trans, frm):
|
|
126
|
+
def test_init_from_single_map_vs_kwargs(trans, frm) -> None:
|
|
126
127
|
from_str = str(frm).lower() + '_to'
|
|
127
|
-
# pylint: disable=unexpected-keyword-arg
|
|
128
128
|
gate_kw = cirq.SingleQubitCliffordGate.from_single_map(**{from_str: trans})
|
|
129
129
|
gate_map = cirq.SingleQubitCliffordGate.from_single_map({frm: trans})
|
|
130
130
|
assert gate_kw == gate_map
|
|
@@ -138,7 +138,7 @@ def test_init_from_single_map_vs_kwargs(trans, frm):
|
|
|
138
138
|
if trans[0] != frm
|
|
139
139
|
),
|
|
140
140
|
)
|
|
141
|
-
def test_init_90rot_from_single(trans, frm):
|
|
141
|
+
def test_init_90rot_from_single(trans, frm) -> None:
|
|
142
142
|
gate = cirq.SingleQubitCliffordGate.from_single_map({frm: trans})
|
|
143
143
|
assert gate.pauli_tuple(frm) == trans
|
|
144
144
|
_assert_not_mirror(gate)
|
|
@@ -163,7 +163,7 @@ def test_init_90rot_from_single(trans, frm):
|
|
|
163
163
|
if trans[0] == frm and trans[1]
|
|
164
164
|
),
|
|
165
165
|
)
|
|
166
|
-
def test_init_180rot_from_single(trans, frm):
|
|
166
|
+
def test_init_180rot_from_single(trans, frm) -> None:
|
|
167
167
|
gate = cirq.SingleQubitCliffordGate.from_single_map({frm: trans})
|
|
168
168
|
assert gate.pauli_tuple(frm) == trans
|
|
169
169
|
_assert_not_mirror(gate)
|
|
@@ -182,7 +182,7 @@ def test_init_180rot_from_single(trans, frm):
|
|
|
182
182
|
if trans[0] == frm and not trans[1]
|
|
183
183
|
),
|
|
184
184
|
)
|
|
185
|
-
def test_init_ident_from_single(trans, frm):
|
|
185
|
+
def test_init_ident_from_single(trans, frm) -> None:
|
|
186
186
|
gate = cirq.SingleQubitCliffordGate.from_single_map({frm: trans})
|
|
187
187
|
assert gate.pauli_tuple(frm) == trans
|
|
188
188
|
_assert_not_mirror(gate)
|
|
@@ -204,12 +204,12 @@ def test_init_ident_from_single(trans, frm):
|
|
|
204
204
|
(cirq.Z, True, cirq.SingleQubitCliffordGate.Z_sqrt),
|
|
205
205
|
),
|
|
206
206
|
)
|
|
207
|
-
def test_init_from_pauli(pauli, sqrt, expected):
|
|
207
|
+
def test_init_from_pauli(pauli, sqrt, expected) -> None:
|
|
208
208
|
gate = cirq.SingleQubitCliffordGate.from_pauli(pauli, sqrt=sqrt)
|
|
209
209
|
assert gate == expected
|
|
210
210
|
|
|
211
211
|
|
|
212
|
-
def test_pow():
|
|
212
|
+
def test_pow() -> None:
|
|
213
213
|
assert cirq.SingleQubitCliffordGate.X**-1 == cirq.SingleQubitCliffordGate.X
|
|
214
214
|
assert cirq.SingleQubitCliffordGate.H**-1 == cirq.SingleQubitCliffordGate.H
|
|
215
215
|
assert cirq.SingleQubitCliffordGate.X_sqrt == cirq.SingleQubitCliffordGate.X**0.5
|
|
@@ -228,7 +228,7 @@ def test_pow():
|
|
|
228
228
|
_ = cirq.SingleQubitCliffordGate.Z**0.25
|
|
229
229
|
|
|
230
230
|
|
|
231
|
-
def test_init_from_quarter_turns():
|
|
231
|
+
def test_init_from_quarter_turns() -> None:
|
|
232
232
|
eq = cirq.testing.EqualsTester()
|
|
233
233
|
eq.add_equality_group(
|
|
234
234
|
cirq.SingleQubitCliffordGate.from_quarter_turns(cirq.X, 0),
|
|
@@ -273,7 +273,7 @@ def test_init_from_quarter_turns():
|
|
|
273
273
|
|
|
274
274
|
|
|
275
275
|
@pytest.mark.parametrize('gate', _all_clifford_gates())
|
|
276
|
-
def test_init_from_quarter_turns_reconstruct(gate):
|
|
276
|
+
def test_init_from_quarter_turns_reconstruct(gate) -> None:
|
|
277
277
|
new_gate = functools.reduce(
|
|
278
278
|
cirq.SingleQubitCliffordGate.merged_with,
|
|
279
279
|
(
|
|
@@ -285,7 +285,7 @@ def test_init_from_quarter_turns_reconstruct(gate):
|
|
|
285
285
|
assert gate == new_gate
|
|
286
286
|
|
|
287
287
|
|
|
288
|
-
def test_init_invalid():
|
|
288
|
+
def test_init_invalid() -> None:
|
|
289
289
|
with pytest.raises(ValueError):
|
|
290
290
|
cirq.SingleQubitCliffordGate.from_single_map()
|
|
291
291
|
with pytest.raises(ValueError):
|
|
@@ -316,7 +316,7 @@ def test_init_invalid():
|
|
|
316
316
|
)
|
|
317
317
|
|
|
318
318
|
|
|
319
|
-
def test_eq_ne_and_hash():
|
|
319
|
+
def test_eq_ne_and_hash() -> None:
|
|
320
320
|
eq = EqualsTester()
|
|
321
321
|
for trans_x, trans_z in _all_rotation_pairs():
|
|
322
322
|
gate_gen = lambda: cirq.SingleQubitCliffordGate.from_xz_map(trans_x, trans_z)
|
|
@@ -332,11 +332,11 @@ def test_eq_ne_and_hash():
|
|
|
332
332
|
cirq.SingleQubitCliffordGate.X_sqrt,
|
|
333
333
|
),
|
|
334
334
|
)
|
|
335
|
-
def test_repr_gate(gate):
|
|
335
|
+
def test_repr_gate(gate) -> None:
|
|
336
336
|
cirq.testing.assert_equivalent_repr(gate)
|
|
337
337
|
|
|
338
338
|
|
|
339
|
-
def test_repr_operation():
|
|
339
|
+
def test_repr_operation() -> None:
|
|
340
340
|
cirq.testing.assert_equivalent_repr(
|
|
341
341
|
cirq.SingleQubitCliffordGate.from_pauli(cirq.Z).on(cirq.LineQubit(2))
|
|
342
342
|
)
|
|
@@ -358,7 +358,7 @@ def test_repr_operation():
|
|
|
358
358
|
(cirq.SingleQubitCliffordGate.Z_nsqrt, (cirq.X, False)),
|
|
359
359
|
),
|
|
360
360
|
)
|
|
361
|
-
def test_y_rotation(gate, trans_y):
|
|
361
|
+
def test_y_rotation(gate, trans_y) -> None:
|
|
362
362
|
assert gate.pauli_tuple(cirq.Y) == trans_y
|
|
363
363
|
|
|
364
364
|
|
|
@@ -378,7 +378,7 @@ def test_y_rotation(gate, trans_y):
|
|
|
378
378
|
(cirq.SingleQubitCliffordGate.Z_nsqrt, cirq.Z**-0.5),
|
|
379
379
|
),
|
|
380
380
|
)
|
|
381
|
-
def test_decompose(gate, gate_equiv):
|
|
381
|
+
def test_decompose(gate, gate_equiv) -> None:
|
|
382
382
|
q0 = cirq.NamedQubit('q0')
|
|
383
383
|
mat = cirq.Circuit(gate(q0)).unitary()
|
|
384
384
|
mat_check = cirq.Circuit(gate_equiv(q0)).unitary()
|
|
@@ -401,7 +401,7 @@ def test_decompose(gate, gate_equiv):
|
|
|
401
401
|
(cirq.SingleQubitCliffordGate.Z_nsqrt, cirq.Z**-0.5),
|
|
402
402
|
),
|
|
403
403
|
)
|
|
404
|
-
def test_known_matrix(gate, gate_equiv):
|
|
404
|
+
def test_known_matrix(gate, gate_equiv) -> None:
|
|
405
405
|
assert cirq.has_unitary(gate)
|
|
406
406
|
mat = cirq.unitary(gate)
|
|
407
407
|
mat_check = cirq.unitary(gate_equiv)
|
|
@@ -428,25 +428,25 @@ def test_known_matrix(gate, gate_equiv):
|
|
|
428
428
|
('SWAP', cirq.CliffordGate),
|
|
429
429
|
],
|
|
430
430
|
)
|
|
431
|
-
def test_common_clifford_types(name: str, expected_cls:
|
|
431
|
+
def test_common_clifford_types(name: str, expected_cls: type) -> None:
|
|
432
432
|
assert isinstance(getattr(cirq.CliffordGate, name), expected_cls)
|
|
433
433
|
assert isinstance(getattr(cirq.SingleQubitCliffordGate, name), expected_cls)
|
|
434
434
|
|
|
435
435
|
|
|
436
436
|
@pytest.mark.parametrize('gate', _all_clifford_gates())
|
|
437
|
-
def test_inverse(gate):
|
|
437
|
+
def test_inverse(gate) -> None:
|
|
438
438
|
assert gate == cirq.inverse(cirq.inverse(gate))
|
|
439
439
|
|
|
440
440
|
|
|
441
441
|
@pytest.mark.parametrize('gate', _all_clifford_gates())
|
|
442
|
-
def test_inverse_matrix(gate):
|
|
442
|
+
def test_inverse_matrix(gate) -> None:
|
|
443
443
|
q0 = cirq.NamedQubit('q0')
|
|
444
444
|
mat = cirq.Circuit(gate(q0)).unitary()
|
|
445
445
|
mat_inv = cirq.Circuit(cirq.inverse(gate)(q0)).unitary()
|
|
446
446
|
assert_allclose_up_to_global_phase(mat, mat_inv.T.conj(), rtol=1e-7, atol=1e-7)
|
|
447
447
|
|
|
448
448
|
|
|
449
|
-
def test_commutes_notimplemented_type():
|
|
449
|
+
def test_commutes_notimplemented_type() -> None:
|
|
450
450
|
with pytest.raises(TypeError):
|
|
451
451
|
cirq.commutes(cirq.SingleQubitCliffordGate.X, 'X')
|
|
452
452
|
assert cirq.commutes(cirq.SingleQubitCliffordGate.X, 'X', default='default') == 'default'
|
|
@@ -457,7 +457,7 @@ def test_commutes_notimplemented_type():
|
|
|
457
457
|
|
|
458
458
|
|
|
459
459
|
@pytest.mark.parametrize('gate,other', itertools.combinations(_all_clifford_gates(), r=2))
|
|
460
|
-
def test_commutes_single_qubit_gate(gate, other):
|
|
460
|
+
def test_commutes_single_qubit_gate(gate, other) -> None:
|
|
461
461
|
q0 = cirq.NamedQubit('q0')
|
|
462
462
|
gate_op = gate(q0)
|
|
463
463
|
other_op = other(q0)
|
|
@@ -473,7 +473,7 @@ def test_commutes_single_qubit_gate(gate, other):
|
|
|
473
473
|
|
|
474
474
|
|
|
475
475
|
@pytest.mark.parametrize('gate', _all_clifford_gates())
|
|
476
|
-
def test_parses_single_qubit_gate(gate):
|
|
476
|
+
def test_parses_single_qubit_gate(gate) -> None:
|
|
477
477
|
assert gate == cirq.read_json(json_text=(cirq.to_json(gate)))
|
|
478
478
|
|
|
479
479
|
|
|
@@ -481,7 +481,7 @@ def test_parses_single_qubit_gate(gate):
|
|
|
481
481
|
'gate,pauli,half_turns',
|
|
482
482
|
itertools.product(_all_clifford_gates(), _paulis, (1.0, 0.25, 0.5, -0.5)),
|
|
483
483
|
)
|
|
484
|
-
def test_commutes_pauli(gate, pauli, half_turns):
|
|
484
|
+
def test_commutes_pauli(gate, pauli, half_turns) -> None:
|
|
485
485
|
pauli_gate = pauli if half_turns == 1 else pauli**half_turns
|
|
486
486
|
q0 = cirq.NamedQubit('q0')
|
|
487
487
|
mat = cirq.Circuit(gate(q0), pauli_gate(q0)).unitary()
|
|
@@ -491,7 +491,7 @@ def test_commutes_pauli(gate, pauli, half_turns):
|
|
|
491
491
|
assert commutes == commutes_check, f"gate: {gate}, pauli {pauli}"
|
|
492
492
|
|
|
493
493
|
|
|
494
|
-
def test_to_clifford_tableau_util_function():
|
|
494
|
+
def test_to_clifford_tableau_util_function() -> None:
|
|
495
495
|
tableau = cirq.ops.clifford_gate._to_clifford_tableau(
|
|
496
496
|
x_to=(cirq.X, False), z_to=(cirq.Z, False)
|
|
497
497
|
)
|
|
@@ -529,35 +529,39 @@ def test_to_clifford_tableau_util_function():
|
|
|
529
529
|
),
|
|
530
530
|
),
|
|
531
531
|
)
|
|
532
|
-
def test_text_diagram_info(gate, sym, exp):
|
|
532
|
+
def test_text_diagram_info(gate, sym, exp) -> None:
|
|
533
533
|
assert cirq.circuit_diagram_info(gate) == cirq.CircuitDiagramInfo(
|
|
534
534
|
wire_symbols=(sym,), exponent=exp
|
|
535
535
|
)
|
|
536
536
|
|
|
537
537
|
|
|
538
538
|
@pytest.mark.parametrize("clifford_gate", cirq.SingleQubitCliffordGate.all_single_qubit_cliffords)
|
|
539
|
-
def test_from_unitary(clifford_gate):
|
|
539
|
+
def test_from_unitary(clifford_gate) -> None:
|
|
540
540
|
u = cirq.unitary(clifford_gate)
|
|
541
541
|
result_gate = cirq.SingleQubitCliffordGate.from_unitary(u)
|
|
542
542
|
assert result_gate == clifford_gate
|
|
543
543
|
|
|
544
|
-
|
|
544
|
+
result = cirq.SingleQubitCliffordGate.from_unitary_with_global_phase(u)
|
|
545
|
+
assert result is not None
|
|
546
|
+
result_gate2, global_phase = result
|
|
545
547
|
assert result_gate2 == result_gate
|
|
546
548
|
assert np.allclose(cirq.unitary(result_gate2) * global_phase, u)
|
|
547
549
|
|
|
548
550
|
|
|
549
|
-
def test_from_unitary_with_phase_shift():
|
|
551
|
+
def test_from_unitary_with_phase_shift() -> None:
|
|
550
552
|
u = np.exp(0.42j) * cirq.unitary(cirq.SingleQubitCliffordGate.Y_sqrt)
|
|
551
553
|
gate = cirq.SingleQubitCliffordGate.from_unitary(u)
|
|
552
554
|
|
|
553
555
|
assert gate == cirq.SingleQubitCliffordGate.Y_sqrt
|
|
554
556
|
|
|
555
|
-
|
|
557
|
+
result = cirq.SingleQubitCliffordGate.from_unitary_with_global_phase(u)
|
|
558
|
+
assert result is not None
|
|
559
|
+
gate2, global_phase = result
|
|
556
560
|
assert gate2 == gate
|
|
557
561
|
assert np.allclose(cirq.unitary(gate2) * global_phase, u)
|
|
558
562
|
|
|
559
563
|
|
|
560
|
-
def test_from_unitary_not_clifford():
|
|
564
|
+
def test_from_unitary_not_clifford() -> None:
|
|
561
565
|
# Not a single-qubit gate.
|
|
562
566
|
u = cirq.unitary(cirq.CNOT)
|
|
563
567
|
assert cirq.SingleQubitCliffordGate.from_unitary(u) is None
|
|
@@ -575,14 +579,14 @@ def test_from_unitary_not_clifford():
|
|
|
575
579
|
|
|
576
580
|
|
|
577
581
|
@pytest.mark.parametrize("clifford_gate", cirq.SingleQubitCliffordGate.all_single_qubit_cliffords)
|
|
578
|
-
def test_decompose_gate(clifford_gate):
|
|
582
|
+
def test_decompose_gate(clifford_gate) -> None:
|
|
579
583
|
gates = clifford_gate.decompose_gate()
|
|
580
584
|
u = functools.reduce(np.dot, [np.eye(2), *(cirq.unitary(gate) for gate in reversed(gates))])
|
|
581
585
|
assert np.allclose(u, cirq.unitary(clifford_gate)) # No global phase difference.
|
|
582
586
|
|
|
583
587
|
|
|
584
588
|
@pytest.mark.parametrize('trans_x,trans_z', _all_rotation_pairs())
|
|
585
|
-
def test_to_phased_xz_gate(trans_x, trans_z):
|
|
589
|
+
def test_to_phased_xz_gate(trans_x, trans_z) -> None:
|
|
586
590
|
gate = cirq.SingleQubitCliffordGate.from_xz_map(trans_x, trans_z)
|
|
587
591
|
actual_phased_xz_gate = gate.to_phased_xz_gate()._canonical()
|
|
588
592
|
expect_phased_xz_gates = cirq.PhasedXZGate.from_matrix(cirq.unitary(gate))
|
|
@@ -594,7 +598,7 @@ def test_to_phased_xz_gate(trans_x, trans_z):
|
|
|
594
598
|
)
|
|
595
599
|
|
|
596
600
|
|
|
597
|
-
def test_from_xz_to_clifford_tableau():
|
|
601
|
+
def test_from_xz_to_clifford_tableau() -> None:
|
|
598
602
|
seen_tableau = []
|
|
599
603
|
for trans_x, trans_z in _all_rotation_pairs():
|
|
600
604
|
tableau = cirq.SingleQubitCliffordGate.from_xz_map(trans_x, trans_z).clifford_tableau
|
|
@@ -622,7 +626,7 @@ def test_from_xz_to_clifford_tableau():
|
|
|
622
626
|
(cirq.CliffordGate.SWAP, cirq.SWAP),
|
|
623
627
|
],
|
|
624
628
|
)
|
|
625
|
-
def test_common_clifford_gate(clifford_gate, standard_gate):
|
|
629
|
+
def test_common_clifford_gate(clifford_gate, standard_gate) -> None:
|
|
626
630
|
# cirq.unitary is relied on the _decompose_ methods.
|
|
627
631
|
u_c = cirq.unitary(clifford_gate)
|
|
628
632
|
u_s = cirq.unitary(standard_gate)
|
|
@@ -630,7 +634,7 @@ def test_common_clifford_gate(clifford_gate, standard_gate):
|
|
|
630
634
|
|
|
631
635
|
|
|
632
636
|
@pytest.mark.parametrize('property_name', ("all_single_qubit_cliffords", "CNOT", "CZ", "SWAP"))
|
|
633
|
-
def test_common_clifford_gate_caching(property_name):
|
|
637
|
+
def test_common_clifford_gate_caching(property_name) -> None:
|
|
634
638
|
cache_name = f"_{property_name}"
|
|
635
639
|
delattr(cirq.CliffordGate, cache_name)
|
|
636
640
|
assert not hasattr(cirq.CliffordGate, cache_name)
|
|
@@ -638,7 +642,7 @@ def test_common_clifford_gate_caching(property_name):
|
|
|
638
642
|
assert hasattr(cirq.CliffordGate, cache_name)
|
|
639
643
|
|
|
640
644
|
|
|
641
|
-
def test_multi_qubit_clifford_pow():
|
|
645
|
+
def test_multi_qubit_clifford_pow() -> None:
|
|
642
646
|
assert cirq.CliffordGate.X**-1 == cirq.CliffordGate.X
|
|
643
647
|
assert cirq.CliffordGate.H**-1 == cirq.CliffordGate.H
|
|
644
648
|
assert cirq.CliffordGate.S**2 == cirq.CliffordGate.Z
|
|
@@ -650,7 +654,7 @@ def test_multi_qubit_clifford_pow():
|
|
|
650
654
|
_ = cirq.CliffordGate.Z**0.25
|
|
651
655
|
|
|
652
656
|
|
|
653
|
-
def test_stabilizer_effec():
|
|
657
|
+
def test_stabilizer_effec() -> None:
|
|
654
658
|
assert cirq.has_stabilizer_effect(cirq.CliffordGate.X)
|
|
655
659
|
assert cirq.has_stabilizer_effect(cirq.CliffordGate.H)
|
|
656
660
|
assert cirq.has_stabilizer_effect(cirq.CliffordGate.S)
|
|
@@ -663,7 +667,7 @@ def test_stabilizer_effec():
|
|
|
663
667
|
assert cirq.has_stabilizer_effect(gate)
|
|
664
668
|
|
|
665
669
|
|
|
666
|
-
def test_clifford_gate_from_op_list():
|
|
670
|
+
def test_clifford_gate_from_op_list() -> None:
|
|
667
671
|
# Since from_op_list() ==> _act_on_() ==> tableau.then() and then() has already covered
|
|
668
672
|
# lots of random circuit cases, here we just test a few well-known relationships.
|
|
669
673
|
qubit = cirq.NamedQubit('test')
|
|
@@ -708,7 +712,7 @@ def test_clifford_gate_from_op_list():
|
|
|
708
712
|
cirq.CliffordGate.from_op_list([cirq.T(qubit)], [qubit])
|
|
709
713
|
|
|
710
714
|
|
|
711
|
-
def test_clifford_gate_from_tableau():
|
|
715
|
+
def test_clifford_gate_from_tableau() -> None:
|
|
712
716
|
t = cirq.CliffordGate.X.clifford_tableau
|
|
713
717
|
assert cirq.CliffordGate.from_clifford_tableau(t) == cirq.CliffordGate.X
|
|
714
718
|
|
|
@@ -732,10 +736,10 @@ def test_clifford_gate_from_tableau():
|
|
|
732
736
|
cirq.CliffordGate.from_clifford_tableau(t)
|
|
733
737
|
|
|
734
738
|
with pytest.raises(ValueError, match="Input argument has to be a CliffordTableau instance."):
|
|
735
|
-
cirq.CliffordGate.from_clifford_tableau(1)
|
|
739
|
+
cirq.CliffordGate.from_clifford_tableau(1) # type: ignore[arg-type]
|
|
736
740
|
|
|
737
741
|
|
|
738
|
-
def test_multi_clifford_decompose_by_unitary():
|
|
742
|
+
def test_multi_clifford_decompose_by_unitary() -> None:
|
|
739
743
|
# Construct a random clifford gate:
|
|
740
744
|
n, num_ops = 5, 20 # because we relied on unitary cannot test large-scale qubits
|
|
741
745
|
gate_candidate = [cirq.X, cirq.Y, cirq.Z, cirq.H, cirq.S, cirq.CNOT, cirq.CZ]
|
|
@@ -755,7 +759,7 @@ def test_multi_clifford_decompose_by_unitary():
|
|
|
755
759
|
)
|
|
756
760
|
|
|
757
761
|
|
|
758
|
-
def test_pad_tableau_bad_input():
|
|
762
|
+
def test_pad_tableau_bad_input() -> None:
|
|
759
763
|
with pytest.raises(
|
|
760
764
|
ValueError, match="Input axes of padding should match with the number of qubits"
|
|
761
765
|
):
|
|
@@ -769,7 +773,7 @@ def test_pad_tableau_bad_input():
|
|
|
769
773
|
cirq.ops.clifford_gate._pad_tableau(tableau, num_qubits_after_padding=2, axes=[0, 1, 2])
|
|
770
774
|
|
|
771
775
|
|
|
772
|
-
def test_pad_tableau():
|
|
776
|
+
def test_pad_tableau() -> None:
|
|
773
777
|
tableau = cirq.CliffordTableau(num_qubits=1)
|
|
774
778
|
padded_tableau = cirq.ops.clifford_gate._pad_tableau(
|
|
775
779
|
tableau, num_qubits_after_padding=2, axes=[0]
|
|
@@ -810,7 +814,7 @@ def test_pad_tableau():
|
|
|
810
814
|
np.testing.assert_equal(padded_tableau.rs.astype(np.int64), np.zeros(4))
|
|
811
815
|
|
|
812
816
|
|
|
813
|
-
def test_clifford_gate_act_on_small_case():
|
|
817
|
+
def test_clifford_gate_act_on_small_case() -> None:
|
|
814
818
|
# Note this is also covered by the `from_op_list` one, etc.
|
|
815
819
|
|
|
816
820
|
qubits = cirq.LineQubit.range(5)
|
|
@@ -841,7 +845,7 @@ def test_clifford_gate_act_on_small_case():
|
|
|
841
845
|
assert args.tableau == expected_args.tableau
|
|
842
846
|
|
|
843
847
|
|
|
844
|
-
def test_clifford_gate_act_on_large_case():
|
|
848
|
+
def test_clifford_gate_act_on_large_case() -> None:
|
|
845
849
|
n, num_ops = 50, 1000 # because we don't need unitary, it is fast.
|
|
846
850
|
gate_candidate = [cirq.X, cirq.Y, cirq.Z, cirq.H, cirq.S, cirq.CNOT, cirq.CZ]
|
|
847
851
|
for seed in range(10):
|
|
@@ -865,7 +869,7 @@ def test_clifford_gate_act_on_large_case():
|
|
|
865
869
|
assert args1.tableau == args2.tableau
|
|
866
870
|
|
|
867
871
|
|
|
868
|
-
def test_clifford_gate_act_on_ch_form():
|
|
872
|
+
def test_clifford_gate_act_on_ch_form() -> None:
|
|
869
873
|
# Although we don't support CH_form from the _act_on_, it will fall back
|
|
870
874
|
# to the decomposititon method and apply it through decomposed ops.
|
|
871
875
|
# Here we run it for the coverage only.
|
|
@@ -878,12 +882,12 @@ def test_clifford_gate_act_on_ch_form():
|
|
|
878
882
|
np.testing.assert_allclose(args.state.state_vector(), np.array([0, 0, 0, 1]))
|
|
879
883
|
|
|
880
884
|
|
|
881
|
-
def test_clifford_gate_act_on_fail():
|
|
885
|
+
def test_clifford_gate_act_on_fail() -> None:
|
|
882
886
|
with pytest.raises(TypeError, match="Failed to act"):
|
|
883
887
|
cirq.act_on(cirq.CliffordGate.X, ExampleSimulationState(), qubits=())
|
|
884
888
|
|
|
885
889
|
|
|
886
|
-
def test_all_single_qubit_clifford_unitaries():
|
|
890
|
+
def test_all_single_qubit_clifford_unitaries() -> None:
|
|
887
891
|
i = np.eye(2)
|
|
888
892
|
x = np.array([[0, 1], [1, 0]])
|
|
889
893
|
y = np.array([[0, -1j], [1j, 0]])
|
|
@@ -923,7 +927,7 @@ def test_all_single_qubit_clifford_unitaries():
|
|
|
923
927
|
assert cirq.equal_up_to_global_phase(cs[23], (i - 1j * (-x - y - z)) / 2)
|
|
924
928
|
|
|
925
929
|
|
|
926
|
-
def test_clifford_gate_repr():
|
|
930
|
+
def test_clifford_gate_repr() -> None:
|
|
927
931
|
q0, q1, q2 = cirq.LineQubit.range(3)
|
|
928
932
|
assert (
|
|
929
933
|
repr(cirq.ops.CliffordGate.from_op_list([cirq.ops.X(q0), cirq.CZ(q1, q2)], [q0, q1, q2]))
|
|
@@ -946,7 +950,7 @@ stable | destable
|
|
|
946
950
|
)
|
|
947
951
|
|
|
948
952
|
|
|
949
|
-
def test_single_qubit_clifford_gate_repr():
|
|
953
|
+
def test_single_qubit_clifford_gate_repr() -> None:
|
|
950
954
|
# Common gates
|
|
951
955
|
assert repr(cirq.ops.SingleQubitCliffordGate.X) == (
|
|
952
956
|
'cirq.ops.SingleQubitCliffordGate(_clifford_tableau=cirq.CliffordTableau(1, '
|
|
@@ -993,3 +997,14 @@ def test_single_qubit_clifford_gate_repr():
|
|
|
993
997
|
'rs=np.array([False, True]), xs=np.array([[True], [False]]), '
|
|
994
998
|
'zs=np.array([[True], [True]])))'
|
|
995
999
|
)
|
|
1000
|
+
|
|
1001
|
+
|
|
1002
|
+
def test_cxswap_czswap() -> None:
|
|
1003
|
+
|
|
1004
|
+
# cirq unitary for CNOT then SWAP (big endian)
|
|
1005
|
+
cxswap_expected = np.asarray([[1, 0, 0, 0], [0, 0, 0, 1], [0, 1, 0, 0], [0, 0, 1, 0]])
|
|
1006
|
+
print(cirq.unitary(cirq.CXSWAP))
|
|
1007
|
+
assert np.allclose(cirq.unitary(cirq.CXSWAP), cxswap_expected)
|
|
1008
|
+
|
|
1009
|
+
czswap_expected = np.asarray([[1, 0, 0, 0], [0, 0, 1, 0], [0, 1, 0, 0], [0, 0, 0, -1]])
|
|
1010
|
+
assert np.allclose(cirq.unitary(cirq.CZSWAP), czswap_expected)
|