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/swap_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 numpy as np
|
|
16
18
|
import pytest
|
|
17
19
|
import sympy
|
|
@@ -21,11 +23,11 @@ import cirq
|
|
|
21
23
|
|
|
22
24
|
|
|
23
25
|
@pytest.mark.parametrize('eigen_gate_type', [cirq.ISwapPowGate, cirq.SwapPowGate])
|
|
24
|
-
def test_phase_sensitive_eigen_gates_consistent_protocols(eigen_gate_type):
|
|
26
|
+
def test_phase_sensitive_eigen_gates_consistent_protocols(eigen_gate_type) -> None:
|
|
25
27
|
cirq.testing.assert_eigengate_implements_consistent_protocols(eigen_gate_type)
|
|
26
28
|
|
|
27
29
|
|
|
28
|
-
def test_interchangeable_qubit_eq():
|
|
30
|
+
def test_interchangeable_qubit_eq() -> None:
|
|
29
31
|
a = cirq.NamedQubit('a')
|
|
30
32
|
b = cirq.NamedQubit('b')
|
|
31
33
|
c = cirq.NamedQubit('c')
|
|
@@ -44,7 +46,7 @@ def test_interchangeable_qubit_eq():
|
|
|
44
46
|
eq.add_equality_group(cirq.ISWAP(a, c) ** 0.3)
|
|
45
47
|
|
|
46
48
|
|
|
47
|
-
def test_text_diagrams():
|
|
49
|
+
def test_text_diagrams() -> None:
|
|
48
50
|
a = cirq.NamedQubit('a')
|
|
49
51
|
b = cirq.NamedQubit('b')
|
|
50
52
|
circuit = cirq.Circuit(cirq.SWAP(a, b), cirq.ISWAP(a, b) ** -1)
|
|
@@ -69,14 +71,14 @@ b: ---Swap---iSwap^-1---
|
|
|
69
71
|
)
|
|
70
72
|
|
|
71
73
|
|
|
72
|
-
def test_swap_has_stabilizer_effect():
|
|
74
|
+
def test_swap_has_stabilizer_effect() -> None:
|
|
73
75
|
assert cirq.has_stabilizer_effect(cirq.SWAP)
|
|
74
76
|
assert cirq.has_stabilizer_effect(cirq.SWAP**2)
|
|
75
77
|
assert not cirq.has_stabilizer_effect(cirq.SWAP**0.5)
|
|
76
78
|
assert not cirq.has_stabilizer_effect(cirq.SWAP ** sympy.Symbol('foo'))
|
|
77
79
|
|
|
78
80
|
|
|
79
|
-
def test_swap_unitary():
|
|
81
|
+
def test_swap_unitary() -> None:
|
|
80
82
|
# yapf: disable
|
|
81
83
|
np.testing.assert_almost_equal(
|
|
82
84
|
cirq.unitary(cirq.SWAP**0.5),
|
|
@@ -89,7 +91,7 @@ def test_swap_unitary():
|
|
|
89
91
|
# yapf: enable
|
|
90
92
|
|
|
91
93
|
|
|
92
|
-
def test_iswap_unitary():
|
|
94
|
+
def test_iswap_unitary() -> None:
|
|
93
95
|
# yapf: disable
|
|
94
96
|
cirq.testing.assert_allclose_up_to_global_phase(
|
|
95
97
|
cirq.unitary(cirq.ISWAP),
|
|
@@ -103,7 +105,7 @@ def test_iswap_unitary():
|
|
|
103
105
|
# yapf: enable
|
|
104
106
|
|
|
105
107
|
|
|
106
|
-
def test_iswap_inv_unitary():
|
|
108
|
+
def test_iswap_inv_unitary() -> None:
|
|
107
109
|
# yapf: disable
|
|
108
110
|
cirq.testing.assert_allclose_up_to_global_phase(
|
|
109
111
|
cirq.unitary(cirq.ISWAP_INV),
|
|
@@ -117,7 +119,7 @@ def test_iswap_inv_unitary():
|
|
|
117
119
|
# yapf: enable
|
|
118
120
|
|
|
119
121
|
|
|
120
|
-
def test_sqrt_iswap_unitary():
|
|
122
|
+
def test_sqrt_iswap_unitary() -> None:
|
|
121
123
|
# yapf: disable
|
|
122
124
|
cirq.testing.assert_allclose_up_to_global_phase(
|
|
123
125
|
cirq.unitary(cirq.SQRT_ISWAP),
|
|
@@ -131,7 +133,7 @@ def test_sqrt_iswap_unitary():
|
|
|
131
133
|
# yapf: enable
|
|
132
134
|
|
|
133
135
|
|
|
134
|
-
def test_sqrt_iswap_inv_unitary():
|
|
136
|
+
def test_sqrt_iswap_inv_unitary() -> None:
|
|
135
137
|
# yapf: disable
|
|
136
138
|
cirq.testing.assert_allclose_up_to_global_phase(
|
|
137
139
|
cirq.unitary(cirq.SQRT_ISWAP_INV),
|
|
@@ -145,7 +147,7 @@ def test_sqrt_iswap_inv_unitary():
|
|
|
145
147
|
# yapf: enable
|
|
146
148
|
|
|
147
149
|
|
|
148
|
-
def test_repr():
|
|
150
|
+
def test_repr() -> None:
|
|
149
151
|
assert repr(cirq.SWAP) == 'cirq.SWAP'
|
|
150
152
|
assert repr(cirq.SWAP**0.5) == '(cirq.SWAP**0.5)'
|
|
151
153
|
|
|
@@ -156,7 +158,7 @@ def test_repr():
|
|
|
156
158
|
assert repr(cirq.ISWAP_INV**0.5) == '(cirq.ISWAP**-0.5)'
|
|
157
159
|
|
|
158
160
|
|
|
159
|
-
def test_str():
|
|
161
|
+
def test_str() -> None:
|
|
160
162
|
assert str(cirq.SWAP) == 'SWAP'
|
|
161
163
|
assert str(cirq.SWAP**0.5) == 'SWAP**0.5'
|
|
162
164
|
|
|
@@ -167,7 +169,7 @@ def test_str():
|
|
|
167
169
|
assert str(cirq.ISWAP_INV**0.5) == 'ISWAP**-0.5'
|
|
168
170
|
|
|
169
171
|
|
|
170
|
-
def test_iswap_decompose_diagram():
|
|
172
|
+
def test_iswap_decompose_diagram() -> None:
|
|
171
173
|
a = cirq.NamedQubit('a')
|
|
172
174
|
b = cirq.NamedQubit('b')
|
|
173
175
|
|
|
@@ -182,7 +184,7 @@ b: ───X───────@───────@───────
|
|
|
182
184
|
)
|
|
183
185
|
|
|
184
186
|
|
|
185
|
-
def test_trace_distance():
|
|
187
|
+
def test_trace_distance() -> None:
|
|
186
188
|
foo = sympy.Symbol('foo')
|
|
187
189
|
sswap = cirq.SWAP**foo
|
|
188
190
|
siswap = cirq.ISWAP**foo
|
|
@@ -194,14 +196,14 @@ def test_trace_distance():
|
|
|
194
196
|
assert cirq.approx_eq(cirq.trace_distance_bound(cirq.ISWAP**0), 0.0)
|
|
195
197
|
|
|
196
198
|
|
|
197
|
-
def test_trace_distance_over_range_of_exponents():
|
|
199
|
+
def test_trace_distance_over_range_of_exponents() -> None:
|
|
198
200
|
for exp in np.linspace(0, 4, 20):
|
|
199
201
|
cirq.testing.assert_has_consistent_trace_distance_bound(cirq.SWAP**exp)
|
|
200
202
|
cirq.testing.assert_has_consistent_trace_distance_bound(cirq.ISWAP**exp)
|
|
201
203
|
|
|
202
204
|
|
|
203
205
|
@pytest.mark.parametrize('angle_rads', (-np.pi, -np.pi / 3, -0.1, np.pi / 5))
|
|
204
|
-
def test_riswap_unitary(angle_rads):
|
|
206
|
+
def test_riswap_unitary(angle_rads) -> None:
|
|
205
207
|
actual = cirq.unitary(cirq.riswap(angle_rads))
|
|
206
208
|
c = np.cos(angle_rads)
|
|
207
209
|
s = 1j * np.sin(angle_rads)
|
|
@@ -215,7 +217,7 @@ def test_riswap_unitary(angle_rads):
|
|
|
215
217
|
|
|
216
218
|
|
|
217
219
|
@pytest.mark.parametrize('angle_rads', (-2 * np.pi / 3, -0.2, 0.4, np.pi / 4))
|
|
218
|
-
def test_riswap_hamiltonian(angle_rads):
|
|
220
|
+
def test_riswap_hamiltonian(angle_rads) -> None:
|
|
219
221
|
actual = cirq.unitary(cirq.riswap(angle_rads))
|
|
220
222
|
x = np.array([[0, 1], [1, 0]])
|
|
221
223
|
y = np.array([[0, -1j], [1j, 0]])
|
|
@@ -226,5 +228,5 @@ def test_riswap_hamiltonian(angle_rads):
|
|
|
226
228
|
|
|
227
229
|
|
|
228
230
|
@pytest.mark.parametrize('angle_rads', (-np.pi / 5, 0.4, 2, np.pi))
|
|
229
|
-
def test_riswap_has_consistent_protocols(angle_rads):
|
|
231
|
+
def test_riswap_has_consistent_protocols(angle_rads) -> None:
|
|
230
232
|
cirq.testing.assert_implements_consistent_protocols(cirq.riswap(angle_rads))
|
cirq/ops/tags.py
CHANGED
|
@@ -11,8 +11,10 @@
|
|
|
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
|
+
|
|
14
15
|
"""Canonical tags for the TaggedOperation class."""
|
|
15
|
-
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
16
18
|
|
|
17
19
|
|
|
18
20
|
class VirtualTag:
|
|
@@ -38,7 +40,7 @@ class VirtualTag:
|
|
|
38
40
|
def __repr__(self) -> str:
|
|
39
41
|
return 'cirq.VirtualTag()'
|
|
40
42
|
|
|
41
|
-
def _json_dict_(self) ->
|
|
43
|
+
def _json_dict_(self) -> dict[str, str]:
|
|
42
44
|
return {}
|
|
43
45
|
|
|
44
46
|
def __hash__(self):
|
|
@@ -61,7 +63,7 @@ class RoutingSwapTag:
|
|
|
61
63
|
def __repr__(self) -> str:
|
|
62
64
|
return 'cirq.RoutingSwapTag()'
|
|
63
65
|
|
|
64
|
-
def _json_dict_(self) ->
|
|
66
|
+
def _json_dict_(self) -> dict[str, str]:
|
|
65
67
|
return {}
|
|
66
68
|
|
|
67
69
|
def __hash__(self):
|
cirq/ops/tags_test.py
CHANGED
|
@@ -12,10 +12,12 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import cirq
|
|
16
18
|
|
|
17
19
|
|
|
18
|
-
def test_virtual_tag():
|
|
20
|
+
def test_virtual_tag() -> None:
|
|
19
21
|
tag1 = cirq.ops.VirtualTag()
|
|
20
22
|
tag2 = cirq.ops.VirtualTag()
|
|
21
23
|
|
|
@@ -26,7 +28,7 @@ def test_virtual_tag():
|
|
|
26
28
|
cirq.testing.assert_equivalent_repr(tag2)
|
|
27
29
|
|
|
28
30
|
|
|
29
|
-
def test_routing_swap_tag():
|
|
31
|
+
def test_routing_swap_tag() -> None:
|
|
30
32
|
tag1 = cirq.ops.RoutingSwapTag()
|
|
31
33
|
tag2 = cirq.ops.RoutingSwapTag()
|
|
32
34
|
|
cirq/ops/three_qubit_gates.py
CHANGED
|
@@ -14,19 +14,9 @@
|
|
|
14
14
|
|
|
15
15
|
"""Common quantum gates that target three qubits."""
|
|
16
16
|
|
|
17
|
-
from
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
Collection,
|
|
21
|
-
Dict,
|
|
22
|
-
Iterator,
|
|
23
|
-
List,
|
|
24
|
-
Optional,
|
|
25
|
-
Sequence,
|
|
26
|
-
Tuple,
|
|
27
|
-
TYPE_CHECKING,
|
|
28
|
-
Union,
|
|
29
|
-
)
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
from typing import AbstractSet, Any, Collection, Iterator, Sequence, TYPE_CHECKING
|
|
30
20
|
|
|
31
21
|
import numpy as np
|
|
32
22
|
import sympy
|
|
@@ -47,7 +37,6 @@ from cirq.ops import (
|
|
|
47
37
|
)
|
|
48
38
|
|
|
49
39
|
if TYPE_CHECKING:
|
|
50
|
-
# pylint: disable=unused-import
|
|
51
40
|
import cirq
|
|
52
41
|
|
|
53
42
|
|
|
@@ -70,10 +59,10 @@ class CCZPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
|
|
|
70
59
|
$$
|
|
71
60
|
"""
|
|
72
61
|
|
|
73
|
-
def _eigen_components(self) ->
|
|
62
|
+
def _eigen_components(self) -> list[tuple[float, np.ndarray]]:
|
|
74
63
|
return [(0, np.diag([1, 1, 1, 1, 1, 1, 1, 0])), (1, np.diag([0, 0, 0, 0, 0, 0, 0, 1]))]
|
|
75
64
|
|
|
76
|
-
def _trace_distance_bound_(self) ->
|
|
65
|
+
def _trace_distance_bound_(self) -> float | None:
|
|
77
66
|
if self._is_parameterized_():
|
|
78
67
|
return None
|
|
79
68
|
return abs(np.sin(self._exponent * 0.5 * np.pi))
|
|
@@ -117,19 +106,11 @@ class CCZPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
|
|
|
117
106
|
elif not b.is_adjacent(c):
|
|
118
107
|
a, b = b, a
|
|
119
108
|
|
|
120
|
-
|
|
109
|
+
exp = self._exponent
|
|
110
|
+
p = common_gates.T**exp
|
|
121
111
|
sweep_abc = [common_gates.CNOT(a, b), common_gates.CNOT(b, c)]
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
complex(global_phase)
|
|
125
|
-
if protocols.is_parameterized(global_phase) and global_phase.is_complex
|
|
126
|
-
else global_phase
|
|
127
|
-
)
|
|
128
|
-
global_phase_operation = (
|
|
129
|
-
[global_phase_op.global_phase_operation(global_phase)]
|
|
130
|
-
if protocols.is_parameterized(global_phase) or abs(global_phase - 1.0) > 0
|
|
131
|
-
else []
|
|
132
|
-
)
|
|
112
|
+
global_phase_gate = global_phase_op.from_phase_and_exponent(self.global_shift, exp)
|
|
113
|
+
global_phase_operation = [] if global_phase_gate.is_identity() else [global_phase_gate()]
|
|
133
114
|
return global_phase_operation + [
|
|
134
115
|
p(a),
|
|
135
116
|
p(b),
|
|
@@ -144,7 +125,7 @@ class CCZPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
|
|
|
144
125
|
sweep_abc,
|
|
145
126
|
]
|
|
146
127
|
|
|
147
|
-
def _apply_unitary_(self, args:
|
|
128
|
+
def _apply_unitary_(self, args: protocols.ApplyUnitaryArgs) -> np.ndarray:
|
|
148
129
|
if protocols.is_parameterized(self):
|
|
149
130
|
return NotImplemented
|
|
150
131
|
ooo = args.subspace_index(0b111)
|
|
@@ -154,12 +135,10 @@ class CCZPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
|
|
|
154
135
|
args.target_tensor *= p
|
|
155
136
|
return args.target_tensor
|
|
156
137
|
|
|
157
|
-
def _circuit_diagram_info_(
|
|
158
|
-
self, args: 'cirq.CircuitDiagramInfoArgs'
|
|
159
|
-
) -> 'cirq.CircuitDiagramInfo':
|
|
138
|
+
def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> cirq.CircuitDiagramInfo:
|
|
160
139
|
return protocols.CircuitDiagramInfo(('@', '@', '@'), exponent=self._diagram_exponent(args))
|
|
161
140
|
|
|
162
|
-
def _qasm_(self, args:
|
|
141
|
+
def _qasm_(self, args: cirq.QasmArgs, qubits: tuple[cirq.Qid, ...]) -> str | None:
|
|
163
142
|
if self._exponent != 1:
|
|
164
143
|
return None
|
|
165
144
|
|
|
@@ -191,11 +170,9 @@ class CCZPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
|
|
|
191
170
|
|
|
192
171
|
def controlled(
|
|
193
172
|
self,
|
|
194
|
-
num_controls:
|
|
195
|
-
control_values:
|
|
196
|
-
|
|
197
|
-
] = None,
|
|
198
|
-
control_qid_shape: Optional[Tuple[int, ...]] = None,
|
|
173
|
+
num_controls: int | None = None,
|
|
174
|
+
control_values: cv.AbstractControlValues | Sequence[int | Collection[int]] | None = None,
|
|
175
|
+
control_qid_shape: tuple[int, ...] | None = None,
|
|
199
176
|
) -> raw_types.Gate:
|
|
200
177
|
"""Returns a controlled `ZPowGate` with two additional controls.
|
|
201
178
|
|
|
@@ -206,7 +183,7 @@ class CCZPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
|
|
|
206
183
|
"""
|
|
207
184
|
if num_controls == 0:
|
|
208
185
|
return self
|
|
209
|
-
sub_gate:
|
|
186
|
+
sub_gate: cirq.Gate = self
|
|
210
187
|
if self._global_shift == 0:
|
|
211
188
|
sub_gate = controlled_gate.ControlledGate(
|
|
212
189
|
common_gates.ZPowGate(exponent=self._exponent), num_controls=2
|
|
@@ -238,10 +215,10 @@ class ThreeQubitDiagonalGate(raw_types.Gate):
|
|
|
238
215
|
If these values are $(x_0, x_1, \ldots , x_7)$ then the unitary
|
|
239
216
|
has diagonal values $(e^{i x_0}, e^{i x_1}, \ldots, e^{i x_7})$.
|
|
240
217
|
"""
|
|
241
|
-
self._diag_angles_radians:
|
|
218
|
+
self._diag_angles_radians: tuple[value.TParamVal, ...] = tuple(diag_angles_radians)
|
|
242
219
|
|
|
243
220
|
@property
|
|
244
|
-
def diag_angles_radians(self) ->
|
|
221
|
+
def diag_angles_radians(self) -> tuple[value.TParamVal, ...]:
|
|
245
222
|
return self._diag_angles_radians
|
|
246
223
|
|
|
247
224
|
def _is_parameterized_(self) -> bool:
|
|
@@ -253,8 +230,8 @@ class ThreeQubitDiagonalGate(raw_types.Gate):
|
|
|
253
230
|
}
|
|
254
231
|
|
|
255
232
|
def _resolve_parameters_(
|
|
256
|
-
self, resolver:
|
|
257
|
-
) ->
|
|
233
|
+
self, resolver: cirq.ParamResolver, recursive: bool
|
|
234
|
+
) -> ThreeQubitDiagonalGate:
|
|
258
235
|
return self.__class__(
|
|
259
236
|
[
|
|
260
237
|
protocols.resolve_parameters(angle, resolver, recursive)
|
|
@@ -270,7 +247,7 @@ class ThreeQubitDiagonalGate(raw_types.Gate):
|
|
|
270
247
|
return NotImplemented
|
|
271
248
|
return np.diag([np.exp(1j * angle) for angle in self._diag_angles_radians])
|
|
272
249
|
|
|
273
|
-
def _apply_unitary_(self, args:
|
|
250
|
+
def _apply_unitary_(self, args: protocols.ApplyUnitaryArgs) -> np.ndarray:
|
|
274
251
|
if self._is_parameterized_():
|
|
275
252
|
return NotImplemented
|
|
276
253
|
for index, angle in enumerate(self._diag_angles_radians):
|
|
@@ -279,16 +256,14 @@ class ThreeQubitDiagonalGate(raw_types.Gate):
|
|
|
279
256
|
args.target_tensor[subspace_index] *= np.exp(1j * angle)
|
|
280
257
|
return args.target_tensor
|
|
281
258
|
|
|
282
|
-
def _circuit_diagram_info_(
|
|
283
|
-
self, args: 'cirq.CircuitDiagramInfoArgs'
|
|
284
|
-
) -> 'cirq.CircuitDiagramInfo':
|
|
259
|
+
def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> cirq.CircuitDiagramInfo:
|
|
285
260
|
rounded_angles = np.array(self._diag_angles_radians)
|
|
286
261
|
if args.precision is not None:
|
|
287
262
|
rounded_angles = rounded_angles.round(args.precision)
|
|
288
263
|
diag_str = f"diag({', '.join(proper_repr(angle) for angle in rounded_angles)})"
|
|
289
264
|
return protocols.CircuitDiagramInfo((diag_str, '#2', '#3'))
|
|
290
265
|
|
|
291
|
-
def __pow__(self, exponent: Any) ->
|
|
266
|
+
def __pow__(self, exponent: Any) -> ThreeQubitDiagonalGate:
|
|
292
267
|
if not isinstance(exponent, (int, float, sympy.Basic)):
|
|
293
268
|
return NotImplemented
|
|
294
269
|
return ThreeQubitDiagonalGate(
|
|
@@ -382,7 +357,7 @@ class ThreeQubitDiagonalGate(raw_types.Gate):
|
|
|
382
357
|
}
|
|
383
358
|
)
|
|
384
359
|
|
|
385
|
-
def _json_dict_(self) ->
|
|
360
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
386
361
|
return protocols.obj_to_dict_helper(self, attribute_names=["diag_angles_radians"])
|
|
387
362
|
|
|
388
363
|
def __repr__(self) -> str:
|
|
@@ -413,7 +388,7 @@ class CCXPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
|
|
|
413
388
|
$$
|
|
414
389
|
"""
|
|
415
390
|
|
|
416
|
-
def _eigen_components(self) ->
|
|
391
|
+
def _eigen_components(self) -> list[tuple[float, np.ndarray]]:
|
|
417
392
|
return [
|
|
418
393
|
(0, linalg.block_diag(np.diag([1, 1, 1, 1, 1, 1]), np.array([[0.5, 0.5], [0.5, 0.5]]))),
|
|
419
394
|
(
|
|
@@ -424,7 +399,7 @@ class CCXPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
|
|
|
424
399
|
),
|
|
425
400
|
]
|
|
426
401
|
|
|
427
|
-
def _trace_distance_bound_(self) ->
|
|
402
|
+
def _trace_distance_bound_(self) -> float | None:
|
|
428
403
|
if self._is_parameterized_():
|
|
429
404
|
return None
|
|
430
405
|
return abs(np.sin(self._exponent * 0.5 * np.pi))
|
|
@@ -451,7 +426,7 @@ class CCXPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
|
|
|
451
426
|
def qubit_index_to_equivalence_group_key(self, index):
|
|
452
427
|
return index < 2
|
|
453
428
|
|
|
454
|
-
def _apply_unitary_(self, args:
|
|
429
|
+
def _apply_unitary_(self, args: protocols.ApplyUnitaryArgs) -> np.ndarray:
|
|
455
430
|
if protocols.is_parameterized(self):
|
|
456
431
|
return NotImplemented
|
|
457
432
|
p = 1j ** (2 * self._exponent * self._global_shift)
|
|
@@ -471,14 +446,12 @@ class CCXPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
|
|
|
471
446
|
yield CCZPowGate(exponent=self._exponent, global_shift=self.global_shift).on(c1, c2, t)
|
|
472
447
|
yield common_gates.H(t)
|
|
473
448
|
|
|
474
|
-
def _circuit_diagram_info_(
|
|
475
|
-
self, args: 'cirq.CircuitDiagramInfoArgs'
|
|
476
|
-
) -> 'cirq.CircuitDiagramInfo':
|
|
449
|
+
def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> cirq.CircuitDiagramInfo:
|
|
477
450
|
return protocols.CircuitDiagramInfo(
|
|
478
451
|
('@', '@', 'X'), exponent=self._diagram_exponent(args), exponent_qubit_index=2
|
|
479
452
|
)
|
|
480
453
|
|
|
481
|
-
def _qasm_(self, args:
|
|
454
|
+
def _qasm_(self, args: cirq.QasmArgs, qubits: tuple[cirq.Qid, ...]) -> str | None:
|
|
482
455
|
if self._exponent != 1:
|
|
483
456
|
return None
|
|
484
457
|
|
|
@@ -505,11 +478,9 @@ class CCXPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
|
|
|
505
478
|
|
|
506
479
|
def controlled(
|
|
507
480
|
self,
|
|
508
|
-
num_controls:
|
|
509
|
-
control_values:
|
|
510
|
-
|
|
511
|
-
] = None,
|
|
512
|
-
control_qid_shape: Optional[Tuple[int, ...]] = None,
|
|
481
|
+
num_controls: int | None = None,
|
|
482
|
+
control_values: cv.AbstractControlValues | Sequence[int | Collection[int]] | None = None,
|
|
483
|
+
control_qid_shape: tuple[int, ...] | None = None,
|
|
513
484
|
) -> raw_types.Gate:
|
|
514
485
|
"""Returns a controlled `XPowGate` with two additional controls.
|
|
515
486
|
|
|
@@ -520,7 +491,7 @@ class CCXPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
|
|
|
520
491
|
"""
|
|
521
492
|
if num_controls == 0:
|
|
522
493
|
return self
|
|
523
|
-
sub_gate:
|
|
494
|
+
sub_gate: cirq.Gate = self
|
|
524
495
|
if self._global_shift == 0:
|
|
525
496
|
sub_gate = controlled_gate.ControlledGate(
|
|
526
497
|
common_gates.XPowGate(exponent=self._exponent), num_controls=2
|
|
@@ -572,8 +543,8 @@ class CSwapGate(gate_features.InterchangeableQubitsGate, raw_types.Gate):
|
|
|
572
543
|
return self._decompose_outside_control(c, t1, t2)
|
|
573
544
|
|
|
574
545
|
def _decompose_inside_control(
|
|
575
|
-
self, target1:
|
|
576
|
-
) -> Iterator[
|
|
546
|
+
self, target1: cirq.Qid, control: cirq.Qid, target2: cirq.Qid
|
|
547
|
+
) -> Iterator[cirq.OP_TREE]:
|
|
577
548
|
"""A decomposition assuming the control separates the targets.
|
|
578
549
|
|
|
579
550
|
target1: ─@─X───────T──────@────────@─────────X───@─────X^-0.5─
|
|
@@ -608,7 +579,7 @@ class CSwapGate(gate_features.InterchangeableQubitsGate, raw_types.Gate):
|
|
|
608
579
|
yield common_gates.S(c) ** -1
|
|
609
580
|
yield pauli_gates.X(a) ** -0.5
|
|
610
581
|
|
|
611
|
-
def _apply_unitary_(self, args:
|
|
582
|
+
def _apply_unitary_(self, args: protocols.ApplyUnitaryArgs) -> np.ndarray:
|
|
612
583
|
return protocols.apply_unitary(
|
|
613
584
|
controlled_gate.ControlledGate(swap_gates.SWAP),
|
|
614
585
|
protocols.ApplyUnitaryArgs(args.target_tensor, args.available_buffer, args.axes),
|
|
@@ -616,8 +587,8 @@ class CSwapGate(gate_features.InterchangeableQubitsGate, raw_types.Gate):
|
|
|
616
587
|
)
|
|
617
588
|
|
|
618
589
|
def _decompose_outside_control(
|
|
619
|
-
self, control:
|
|
620
|
-
) -> Iterator[
|
|
590
|
+
self, control: cirq.Qid, near_target: cirq.Qid, far_target: cirq.Qid
|
|
591
|
+
) -> Iterator[cirq.OP_TREE]:
|
|
621
592
|
"""A decomposition assuming one of the targets is in the middle.
|
|
622
593
|
|
|
623
594
|
control: ───T──────@────────@───@────────────@────────────────
|
|
@@ -652,14 +623,12 @@ class CSwapGate(gate_features.InterchangeableQubitsGate, raw_types.Gate):
|
|
|
652
623
|
def _unitary_(self) -> np.ndarray:
|
|
653
624
|
return linalg.block_diag(np.diag([1, 1, 1, 1, 1]), np.array([[0, 1], [1, 0]]), np.diag([1]))
|
|
654
625
|
|
|
655
|
-
def _circuit_diagram_info_(
|
|
656
|
-
self, args: 'cirq.CircuitDiagramInfoArgs'
|
|
657
|
-
) -> 'cirq.CircuitDiagramInfo':
|
|
626
|
+
def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> cirq.CircuitDiagramInfo:
|
|
658
627
|
if not args.use_unicode_characters:
|
|
659
628
|
return protocols.CircuitDiagramInfo(('@', 'swap', 'swap'))
|
|
660
629
|
return protocols.CircuitDiagramInfo(('@', '×', '×'))
|
|
661
630
|
|
|
662
|
-
def _qasm_(self, args:
|
|
631
|
+
def _qasm_(self, args: cirq.QasmArgs, qubits: tuple[cirq.Qid, ...]) -> str | None:
|
|
663
632
|
args.validate_version('2.0', '3.0')
|
|
664
633
|
return args.format('cswap {0},{1},{2};\n', qubits[0], qubits[1], qubits[2])
|
|
665
634
|
|
|
@@ -682,11 +651,9 @@ class CSwapGate(gate_features.InterchangeableQubitsGate, raw_types.Gate):
|
|
|
682
651
|
|
|
683
652
|
def controlled(
|
|
684
653
|
self,
|
|
685
|
-
num_controls:
|
|
686
|
-
control_values:
|
|
687
|
-
|
|
688
|
-
] = None,
|
|
689
|
-
control_qid_shape: Optional[Tuple[int, ...]] = None,
|
|
654
|
+
num_controls: int | None = None,
|
|
655
|
+
control_values: cv.AbstractControlValues | Sequence[int | Collection[int]] | None = None,
|
|
656
|
+
control_qid_shape: tuple[int, ...] | None = None,
|
|
690
657
|
) -> raw_types.Gate:
|
|
691
658
|
"""Returns a controlled `SWAP` with one additional control.
|
|
692
659
|
|
|
@@ -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
|
|
@@ -22,7 +24,7 @@ import cirq
|
|
|
22
24
|
|
|
23
25
|
|
|
24
26
|
@pytest.mark.parametrize('eigen_gate_type', [cirq.CCXPowGate, cirq.CCZPowGate])
|
|
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
|
|
|
@@ -36,18 +38,18 @@ def test_eigen_gates_consistent_protocols(eigen_gate_type):
|
|
|
36
38
|
(cirq.CCZ),
|
|
37
39
|
),
|
|
38
40
|
)
|
|
39
|
-
def test_consistent_protocols(gate):
|
|
41
|
+
def test_consistent_protocols(gate) -> None:
|
|
40
42
|
cirq.testing.assert_implements_consistent_protocols(gate)
|
|
41
43
|
|
|
42
44
|
|
|
43
|
-
def test_init():
|
|
45
|
+
def test_init() -> None:
|
|
44
46
|
assert (cirq.CCZ**0.5).exponent == 0.5
|
|
45
47
|
assert (cirq.CCZ**0.25).exponent == 0.25
|
|
46
48
|
assert (cirq.CCX**0.5).exponent == 0.5
|
|
47
49
|
assert (cirq.CCX**0.25).exponent == 0.25
|
|
48
50
|
|
|
49
51
|
|
|
50
|
-
def test_unitary():
|
|
52
|
+
def test_unitary() -> None:
|
|
51
53
|
assert cirq.has_unitary(cirq.CCX)
|
|
52
54
|
np.testing.assert_allclose(
|
|
53
55
|
cirq.unitary(cirq.CCX),
|
|
@@ -123,7 +125,7 @@ def test_unitary():
|
|
|
123
125
|
)
|
|
124
126
|
|
|
125
127
|
|
|
126
|
-
def test_str():
|
|
128
|
+
def test_str() -> None:
|
|
127
129
|
assert str(cirq.CCX) == 'TOFFOLI'
|
|
128
130
|
assert str(cirq.TOFFOLI) == 'TOFFOLI'
|
|
129
131
|
assert str(cirq.CSWAP) == 'FREDKIN'
|
|
@@ -134,7 +136,7 @@ def test_str():
|
|
|
134
136
|
assert str(cirq.CCZ**0.5) == 'CCZ**0.5'
|
|
135
137
|
|
|
136
138
|
|
|
137
|
-
def test_repr():
|
|
139
|
+
def test_repr() -> None:
|
|
138
140
|
assert repr(cirq.CCX) == 'cirq.TOFFOLI'
|
|
139
141
|
assert repr(cirq.TOFFOLI) == 'cirq.TOFFOLI'
|
|
140
142
|
assert repr(cirq.CSWAP) == 'cirq.FREDKIN'
|
|
@@ -145,7 +147,7 @@ def test_repr():
|
|
|
145
147
|
assert repr(cirq.CCZ**0.5) == '(cirq.CCZ**0.5)'
|
|
146
148
|
|
|
147
149
|
|
|
148
|
-
def test_eq():
|
|
150
|
+
def test_eq() -> None:
|
|
149
151
|
a, b, c, d = cirq.LineQubit.range(4)
|
|
150
152
|
eq = cirq.testing.EqualsTester()
|
|
151
153
|
eq.add_equality_group(cirq.CCZ(a, b, c), cirq.CCZ(a, c, b), cirq.CCZ(b, c, a))
|
|
@@ -163,7 +165,7 @@ def test_eq():
|
|
|
163
165
|
eq.add_equality_group(cirq.CSWAP(b, a, c), cirq.CSWAP(b, c, a))
|
|
164
166
|
|
|
165
167
|
|
|
166
|
-
def test_gate_equality():
|
|
168
|
+
def test_gate_equality() -> None:
|
|
167
169
|
eq = cirq.testing.EqualsTester()
|
|
168
170
|
eq.add_equality_group(cirq.CSwapGate(), cirq.CSwapGate())
|
|
169
171
|
eq.add_equality_group(cirq.CZPowGate(), cirq.CZPowGate())
|
|
@@ -171,7 +173,7 @@ def test_gate_equality():
|
|
|
171
173
|
eq.add_equality_group(cirq.CCZPowGate(), cirq.CCZPowGate())
|
|
172
174
|
|
|
173
175
|
|
|
174
|
-
def test_identity_multiplication():
|
|
176
|
+
def test_identity_multiplication() -> None:
|
|
175
177
|
a, b, c = cirq.LineQubit.range(3)
|
|
176
178
|
assert cirq.CCX(a, b, c) * cirq.I(a) == cirq.CCX(a, b, c)
|
|
177
179
|
assert cirq.CCX(a, b, c) * cirq.I(b) == cirq.CCX(a, b, c)
|
|
@@ -197,7 +199,7 @@ def test_identity_multiplication():
|
|
|
197
199
|
),
|
|
198
200
|
],
|
|
199
201
|
)
|
|
200
|
-
def test_decomposition_cost(op: cirq.Operation, max_two_cost: int):
|
|
202
|
+
def test_decomposition_cost(op: cirq.Operation, max_two_cost: int) -> None:
|
|
201
203
|
ops = tuple(cirq.flatten_op_tree(cirq.decompose(op)))
|
|
202
204
|
two_cost = len([e for e in ops if len(e.qubits) == 2])
|
|
203
205
|
over_cost = len([e for e in ops if len(e.qubits) > 2])
|
|
@@ -205,12 +207,12 @@ def test_decomposition_cost(op: cirq.Operation, max_two_cost: int):
|
|
|
205
207
|
assert two_cost == max_two_cost
|
|
206
208
|
|
|
207
209
|
|
|
208
|
-
def test_parameterized_ccz_decompose_no_global_phase():
|
|
210
|
+
def test_parameterized_ccz_decompose_no_global_phase() -> None:
|
|
209
211
|
decomposed_ops = cirq.decompose(cirq.CCZ(*cirq.LineQubit.range(3)) ** sympy.Symbol("theta"))
|
|
210
212
|
assert not any(isinstance(op.gate, cirq.GlobalPhaseGate) for op in decomposed_ops)
|
|
211
213
|
|
|
212
214
|
|
|
213
|
-
def test_diagonal_gate_property():
|
|
215
|
+
def test_diagonal_gate_property() -> None:
|
|
214
216
|
assert cirq.ThreeQubitDiagonalGate([2, 3, 5, 7, 0, 0, 0, 1]).diag_angles_radians == (
|
|
215
217
|
(2, 3, 5, 7, 0, 0, 0, 1)
|
|
216
218
|
)
|
|
@@ -220,7 +222,7 @@ def test_diagonal_gate_property():
|
|
|
220
222
|
'gate',
|
|
221
223
|
[cirq.CCX, cirq.CSWAP, cirq.CCZ, cirq.ThreeQubitDiagonalGate([2, 3, 5, 7, 11, 13, 17, 19])],
|
|
222
224
|
)
|
|
223
|
-
def test_decomposition_respects_locality(gate):
|
|
225
|
+
def test_decomposition_respects_locality(gate) -> None:
|
|
224
226
|
a = cirq.GridQubit(0, 0)
|
|
225
227
|
b = cirq.GridQubit(1, 0)
|
|
226
228
|
c = cirq.GridQubit(0, 1)
|
|
@@ -231,7 +233,7 @@ def test_decomposition_respects_locality(gate):
|
|
|
231
233
|
dev.validate_circuit(circuit)
|
|
232
234
|
|
|
233
235
|
|
|
234
|
-
def test_diagram():
|
|
236
|
+
def test_diagram() -> None:
|
|
235
237
|
a, b, c, d = cirq.LineQubit.range(4)
|
|
236
238
|
circuit = cirq.Circuit(
|
|
237
239
|
cirq.TOFFOLI(a, b, c),
|
|
@@ -295,7 +297,7 @@ def test_diagram():
|
|
|
295
297
|
)
|
|
296
298
|
|
|
297
299
|
|
|
298
|
-
def test_diagonal_exponent():
|
|
300
|
+
def test_diagonal_exponent() -> None:
|
|
299
301
|
diagonal_angles = [2, 3, 5, 7, 11, 13, 17, 19]
|
|
300
302
|
diagonal_gate = cirq.ThreeQubitDiagonalGate(diagonal_angles)
|
|
301
303
|
|
|
@@ -308,7 +310,7 @@ def test_diagonal_exponent():
|
|
|
308
310
|
|
|
309
311
|
|
|
310
312
|
@pytest.mark.parametrize('resolve_fn', [cirq.resolve_parameters, cirq.resolve_parameters_once])
|
|
311
|
-
def test_resolve(resolve_fn):
|
|
313
|
+
def test_resolve(resolve_fn) -> None:
|
|
312
314
|
diagonal_angles = [2, 3, 5, 7, 11, 13, 17, 19]
|
|
313
315
|
diagonal_gate = cirq.ThreeQubitDiagonalGate(
|
|
314
316
|
diagonal_angles[:6] + [sympy.Symbol('a'), sympy.Symbol('b')]
|
|
@@ -325,7 +327,7 @@ def test_resolve(resolve_fn):
|
|
|
325
327
|
|
|
326
328
|
|
|
327
329
|
@pytest.mark.parametrize('gate', [cirq.CCX, cirq.CCZ, cirq.CSWAP])
|
|
328
|
-
def test_controlled_ops_consistency(gate):
|
|
330
|
+
def test_controlled_ops_consistency(gate) -> None:
|
|
329
331
|
a, b, c, d = cirq.LineQubit.range(4)
|
|
330
332
|
assert gate.controlled(0) is gate
|
|
331
333
|
assert gate(a, b, c).controlled_by(d) == gate(d, b, c).controlled_by(a)
|