cirq-core 1.5.0.dev20250409225226__py3-none-any.whl → 1.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of cirq-core might be problematic. Click here for more details.
- cirq/__init__.py +16 -17
- cirq/_compat.py +21 -20
- cirq/_compat_test.py +14 -34
- cirq/_doc.py +4 -2
- cirq/_import.py +8 -6
- cirq/_import_test.py +4 -2
- cirq/_version.py +6 -6
- cirq/_version_test.py +2 -2
- cirq/circuits/_block_diagram_drawer.py +11 -10
- cirq/circuits/_block_diagram_drawer_test.py +8 -6
- cirq/circuits/_box_drawing_character_data.py +8 -8
- cirq/circuits/_box_drawing_character_data_test.py +3 -1
- cirq/circuits/_bucket_priority_queue.py +9 -7
- cirq/circuits/_bucket_priority_queue_test.py +22 -20
- cirq/circuits/circuit.py +248 -172
- cirq/circuits/circuit_operation.py +73 -83
- cirq/circuits/circuit_operation_test.py +128 -90
- cirq/circuits/circuit_test.py +211 -151
- cirq/circuits/frozen_circuit.py +23 -60
- cirq/circuits/frozen_circuit_test.py +31 -8
- cirq/circuits/insert_strategy.py +7 -5
- cirq/circuits/insert_strategy_test.py +4 -2
- cirq/circuits/moment.py +88 -40
- cirq/circuits/moment_test.py +128 -51
- cirq/circuits/optimization_pass.py +5 -5
- cirq/circuits/optimization_pass_test.py +10 -10
- cirq/circuits/qasm_output.py +11 -11
- cirq/circuits/qasm_output_test.py +25 -22
- cirq/circuits/text_diagram_drawer.py +23 -38
- cirq/circuits/text_diagram_drawer_test.py +19 -17
- cirq/conftest.py +4 -3
- cirq/contrib/__init__.py +4 -4
- cirq/contrib/acquaintance/__init__.py +1 -1
- cirq/contrib/acquaintance/bipartite.py +5 -8
- cirq/contrib/acquaintance/bipartite_test.py +18 -13
- cirq/contrib/acquaintance/devices.py +2 -2
- cirq/contrib/acquaintance/devices_test.py +5 -3
- cirq/contrib/acquaintance/executor.py +5 -5
- cirq/contrib/acquaintance/executor_test.py +13 -9
- cirq/contrib/acquaintance/gates.py +18 -28
- cirq/contrib/acquaintance/gates_test.py +24 -20
- cirq/contrib/acquaintance/inspection_utils.py +8 -4
- cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
- cirq/contrib/acquaintance/mutation_utils.py +4 -4
- cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
- cirq/contrib/acquaintance/optimizers.py +4 -4
- cirq/contrib/acquaintance/optimizers_test.py +4 -1
- cirq/contrib/acquaintance/permutation.py +15 -27
- cirq/contrib/acquaintance/permutation_test.py +26 -17
- cirq/contrib/acquaintance/shift.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
- cirq/contrib/acquaintance/shift_test.py +8 -6
- cirq/contrib/acquaintance/strategies/cubic.py +2 -2
- cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
- cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
- cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
- cirq/contrib/acquaintance/testing.py +2 -0
- cirq/contrib/acquaintance/topological_sort.py +2 -2
- cirq/contrib/acquaintance/topological_sort_test.py +3 -1
- cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
- cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
- cirq/contrib/circuitdag/circuit_dag.py +4 -4
- cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
- cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
- cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
- cirq/contrib/graph_device/graph_device.py +12 -11
- cirq/contrib/graph_device/graph_device_test.py +18 -14
- cirq/contrib/graph_device/hypergraph.py +16 -14
- cirq/contrib/graph_device/hypergraph_test.py +13 -11
- cirq/contrib/graph_device/uniform_graph_device.py +6 -4
- cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
- cirq/contrib/hacks/disable_validation.py +6 -1
- cirq/contrib/hacks/disable_validation_test.py +3 -1
- cirq/contrib/json.py +31 -5
- cirq/contrib/json_test.py +6 -3
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/__init__.py +17 -0
- cirq/contrib/json_test_data/spec.py +32 -0
- cirq/contrib/noise_models/noise_models.py +119 -5
- cirq/contrib/noise_models/noise_models_test.py +37 -9
- cirq/contrib/paulistring/clifford_optimize.py +6 -4
- cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
- cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
- cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
- cirq/contrib/paulistring/optimize.py +2 -0
- cirq/contrib/paulistring/optimize_test.py +4 -3
- cirq/contrib/paulistring/pauli_string_dag.py +2 -0
- cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
- cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
- cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
- cirq/contrib/paulistring/recombine.py +6 -4
- cirq/contrib/paulistring/recombine_test.py +3 -1
- cirq/contrib/paulistring/separate.py +9 -6
- cirq/contrib/paulistring/separate_test.py +3 -1
- cirq/contrib/qasm_import/_lexer.py +3 -2
- cirq/contrib/qasm_import/_lexer_test.py +49 -13
- cirq/contrib/qasm_import/_parser.py +547 -83
- cirq/contrib/qasm_import/_parser_test.py +988 -97
- cirq/contrib/qasm_import/exception.py +2 -0
- cirq/contrib/qasm_import/qasm.py +8 -2
- cirq/contrib/qasm_import/qasm_test.py +7 -4
- cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
- cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
- cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
- cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
- cirq/contrib/qcircuit/qcircuit_test.py +10 -8
- cirq/contrib/quantum_volume/quantum_volume.py +31 -27
- cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
- cirq/contrib/quimb/density_matrix.py +15 -14
- cirq/contrib/quimb/density_matrix_test.py +10 -7
- cirq/contrib/quimb/grid_circuits.py +5 -2
- cirq/contrib/quimb/grid_circuits_test.py +3 -0
- cirq/contrib/quimb/mps_simulator.py +20 -20
- cirq/contrib/quimb/mps_simulator_test.py +3 -0
- cirq/contrib/quimb/state_vector.py +12 -11
- cirq/contrib/quimb/state_vector_test.py +3 -0
- cirq/contrib/quirk/export_to_quirk.py +5 -3
- cirq/contrib/quirk/export_to_quirk_test.py +18 -16
- cirq/contrib/quirk/linearize_circuit.py +2 -0
- cirq/contrib/quirk/quirk_gate.py +18 -17
- cirq/contrib/routing/device.py +5 -3
- cirq/contrib/routing/device_test.py +2 -0
- cirq/contrib/routing/greedy.py +10 -21
- cirq/contrib/routing/greedy_test.py +4 -2
- cirq/contrib/routing/initialization.py +2 -2
- cirq/contrib/routing/initialization_test.py +5 -3
- cirq/contrib/routing/router.py +9 -5
- cirq/contrib/routing/router_test.py +2 -0
- cirq/contrib/routing/swap_network.py +3 -3
- cirq/contrib/routing/swap_network_test.py +3 -1
- cirq/contrib/routing/utils.py +2 -2
- cirq/contrib/routing/utils_test.py +3 -0
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
- cirq/contrib/svg/svg.py +3 -3
- cirq/contrib/svg/svg_test.py +8 -5
- cirq/devices/device.py +4 -4
- cirq/devices/device_test.py +7 -4
- cirq/devices/grid_device_metadata.py +10 -10
- cirq/devices/grid_device_metadata_test.py +3 -0
- cirq/devices/grid_qubit.py +29 -21
- cirq/devices/grid_qubit_test.py +3 -0
- cirq/devices/insertion_noise_model.py +7 -7
- cirq/devices/insertion_noise_model_test.py +7 -5
- cirq/devices/line_qubit.py +13 -13
- cirq/devices/line_qubit_test.py +2 -0
- cirq/devices/named_topologies.py +18 -29
- cirq/devices/named_topologies_test.py +13 -10
- cirq/devices/noise_model.py +3 -3
- cirq/devices/noise_model_test.py +19 -15
- cirq/devices/noise_properties.py +15 -6
- cirq/devices/noise_properties_test.py +34 -3
- cirq/devices/noise_utils.py +11 -9
- cirq/devices/noise_utils_test.py +2 -0
- cirq/devices/superconducting_qubits_noise_properties.py +23 -22
- cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
- cirq/devices/thermal_noise_model.py +107 -37
- cirq/devices/thermal_noise_model_test.py +21 -0
- cirq/devices/unconstrained_device.py +5 -3
- cirq/devices/unconstrained_device_test.py +2 -0
- cirq/experiments/__init__.py +4 -2
- cirq/experiments/benchmarking/__init__.py +17 -0
- cirq/experiments/benchmarking/parallel_xeb.py +677 -0
- cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
- cirq/experiments/fidelity_estimation.py +14 -8
- cirq/experiments/fidelity_estimation_test.py +3 -0
- cirq/experiments/n_qubit_tomography.py +17 -16
- cirq/experiments/n_qubit_tomography_test.py +8 -5
- cirq/experiments/purity_estimation.py +2 -0
- cirq/experiments/purity_estimation_test.py +2 -0
- cirq/experiments/qubit_characterizations.py +207 -103
- cirq/experiments/qubit_characterizations_test.py +40 -12
- cirq/experiments/random_quantum_circuit_generation.py +56 -70
- cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
- cirq/experiments/readout_confusion_matrix.py +24 -22
- cirq/experiments/readout_confusion_matrix_test.py +2 -0
- cirq/experiments/single_qubit_readout_calibration.py +30 -15
- cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
- cirq/experiments/t1_decay_experiment.py +9 -7
- cirq/experiments/t1_decay_experiment_test.py +13 -11
- cirq/experiments/t2_decay_experiment.py +16 -13
- cirq/experiments/t2_decay_experiment_test.py +2 -0
- cirq/experiments/two_qubit_xeb.py +64 -57
- cirq/experiments/two_qubit_xeb_test.py +10 -6
- cirq/experiments/xeb_fitting.py +39 -35
- cirq/experiments/xeb_sampling.py +37 -44
- cirq/experiments/xeb_sampling_test.py +3 -0
- cirq/experiments/xeb_simulation.py +14 -10
- cirq/experiments/xeb_simulation_test.py +5 -5
- cirq/experiments/z_phase_calibration.py +32 -29
- cirq/experiments/z_phase_calibration_test.py +3 -4
- cirq/interop/quirk/cells/__init__.py +1 -1
- cirq/interop/quirk/cells/all_cells.py +7 -2
- cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
- cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
- cirq/interop/quirk/cells/cell.py +19 -28
- cirq/interop/quirk/cells/cell_test.py +3 -0
- cirq/interop/quirk/cells/composite_cell.py +13 -28
- cirq/interop/quirk/cells/composite_cell_test.py +2 -0
- cirq/interop/quirk/cells/control_cells.py +15 -15
- cirq/interop/quirk/cells/control_cells_test.py +7 -5
- cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
- cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
- cirq/interop/quirk/cells/ignored_cells.py +3 -0
- cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
- cirq/interop/quirk/cells/input_cells.py +7 -5
- cirq/interop/quirk/cells/input_cells_test.py +7 -5
- cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
- cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
- cirq/interop/quirk/cells/measurement_cells.py +5 -2
- cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
- cirq/interop/quirk/cells/parse.py +22 -23
- cirq/interop/quirk/cells/parse_test.py +12 -10
- cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
- cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
- cirq/interop/quirk/cells/scalar_cells.py +4 -1
- cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
- cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
- cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
- cirq/interop/quirk/cells/swap_cell.py +8 -6
- cirq/interop/quirk/cells/swap_cell_test.py +6 -4
- cirq/interop/quirk/cells/testing.py +6 -6
- cirq/interop/quirk/cells/testing_test.py +8 -6
- cirq/interop/quirk/cells/unsupported_cells.py +3 -0
- cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
- cirq/interop/quirk/url_to_circuit.py +23 -36
- cirq/interop/quirk/url_to_circuit_test.py +4 -1
- cirq/json_resolver_cache.py +14 -12
- cirq/linalg/__init__.py +4 -6
- cirq/linalg/combinators.py +7 -5
- cirq/linalg/combinators_test.py +10 -7
- cirq/linalg/decompositions.py +24 -35
- cirq/linalg/decompositions_test.py +3 -1
- cirq/linalg/diagonalize.py +6 -4
- cirq/linalg/diagonalize_test.py +15 -14
- cirq/linalg/operator_spaces.py +14 -14
- cirq/linalg/operator_spaces_test.py +13 -11
- cirq/linalg/predicates.py +18 -9
- cirq/linalg/predicates_test.py +5 -0
- cirq/linalg/tolerance.py +6 -3
- cirq/linalg/tolerance_test.py +6 -4
- cirq/linalg/transformations.py +23 -20
- cirq/linalg/transformations_test.py +73 -43
- cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
- cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
- cirq/neutral_atoms/neutral_atom_devices.py +2 -0
- cirq/ops/__init__.py +2 -0
- cirq/ops/arithmetic_operation.py +21 -21
- cirq/ops/arithmetic_operation_test.py +7 -8
- cirq/ops/boolean_hamiltonian.py +23 -22
- cirq/ops/boolean_hamiltonian_test.py +12 -9
- cirq/ops/classically_controlled_operation.py +31 -36
- cirq/ops/classically_controlled_operation_test.py +121 -117
- cirq/ops/clifford_gate.py +98 -81
- cirq/ops/clifford_gate_test.py +72 -57
- cirq/ops/common_channels.py +44 -44
- cirq/ops/common_channels_test.py +83 -81
- cirq/ops/common_gate_families.py +9 -7
- cirq/ops/common_gate_families_test.py +11 -7
- cirq/ops/common_gates.py +164 -183
- cirq/ops/common_gates_test.py +135 -95
- cirq/ops/control_values.py +23 -26
- cirq/ops/control_values_test.py +22 -20
- cirq/ops/controlled_gate.py +64 -112
- cirq/ops/controlled_gate_test.py +130 -35
- cirq/ops/controlled_operation.py +24 -35
- cirq/ops/controlled_operation_test.py +8 -6
- cirq/ops/dense_pauli_string.py +38 -49
- cirq/ops/dense_pauli_string_test.py +4 -2
- cirq/ops/diagonal_gate.py +18 -31
- cirq/ops/diagonal_gate_test.py +13 -13
- cirq/ops/eigen_gate.py +29 -29
- cirq/ops/eigen_gate_test.py +45 -28
- cirq/ops/fourier_transform.py +14 -20
- cirq/ops/fourier_transform_test.py +15 -12
- cirq/ops/fsim_gate.py +43 -42
- cirq/ops/fsim_gate_test.py +29 -29
- cirq/ops/gate_features.py +2 -0
- cirq/ops/gate_features_test.py +5 -3
- cirq/ops/gate_operation.py +43 -65
- cirq/ops/gate_operation_test.py +46 -42
- cirq/ops/gateset.py +28 -40
- cirq/ops/gateset_test.py +4 -2
- cirq/ops/global_phase_op.py +45 -20
- cirq/ops/global_phase_op_test.py +44 -20
- cirq/ops/greedy_qubit_manager.py +10 -8
- cirq/ops/greedy_qubit_manager_test.py +5 -3
- cirq/ops/identity.py +14 -12
- cirq/ops/identity_test.py +24 -20
- cirq/ops/kraus_channel.py +11 -8
- cirq/ops/kraus_channel_test.py +14 -11
- cirq/ops/linear_combinations.py +65 -77
- cirq/ops/linear_combinations_test.py +14 -9
- cirq/ops/matrix_gates.py +21 -18
- cirq/ops/matrix_gates_test.py +16 -0
- cirq/ops/measure_util.py +15 -20
- cirq/ops/measure_util_test.py +2 -0
- cirq/ops/measurement_gate.py +26 -37
- cirq/ops/measurement_gate_test.py +2 -0
- cirq/ops/mixed_unitary_channel.py +12 -9
- cirq/ops/mixed_unitary_channel_test.py +14 -11
- cirq/ops/named_qubit.py +16 -13
- cirq/ops/named_qubit_test.py +15 -13
- cirq/ops/op_tree.py +9 -7
- cirq/ops/op_tree_test.py +22 -19
- cirq/ops/parallel_gate.py +15 -17
- cirq/ops/parallel_gate_test.py +18 -16
- cirq/ops/parity_gates.py +23 -25
- cirq/ops/parity_gates_test.py +36 -32
- cirq/ops/pauli_gates.py +22 -21
- cirq/ops/pauli_gates_test.py +29 -20
- cirq/ops/pauli_interaction_gate.py +15 -19
- cirq/ops/pauli_interaction_gate_test.py +10 -8
- cirq/ops/pauli_measurement_gate.py +23 -35
- cirq/ops/pauli_measurement_gate_test.py +2 -0
- cirq/ops/pauli_string.py +92 -120
- cirq/ops/pauli_string_phasor.py +52 -45
- cirq/ops/pauli_string_phasor_test.py +4 -5
- cirq/ops/pauli_string_raw_types.py +9 -7
- cirq/ops/pauli_string_raw_types_test.py +2 -0
- cirq/ops/pauli_string_test.py +31 -154
- cirq/ops/pauli_sum_exponential.py +12 -12
- cirq/ops/pauli_sum_exponential_test.py +12 -10
- cirq/ops/permutation_gate.py +8 -6
- cirq/ops/permutation_gate_test.py +10 -8
- cirq/ops/phased_iswap_gate.py +16 -16
- cirq/ops/phased_iswap_gate_test.py +17 -15
- cirq/ops/phased_x_gate.py +16 -17
- cirq/ops/phased_x_gate_test.py +18 -16
- cirq/ops/phased_x_z_gate.py +24 -22
- cirq/ops/phased_x_z_gate_test.py +17 -11
- cirq/ops/projector.py +16 -11
- cirq/ops/projector_test.py +19 -16
- cirq/ops/qid_util.py +7 -5
- cirq/ops/qid_util_test.py +2 -0
- cirq/ops/qubit_manager.py +11 -9
- cirq/ops/qubit_manager_test.py +6 -4
- cirq/ops/qubit_order.py +11 -14
- cirq/ops/qubit_order_or_list.py +4 -2
- cirq/ops/qubit_order_test.py +12 -10
- cirq/ops/random_gate_channel.py +12 -10
- cirq/ops/random_gate_channel_test.py +14 -11
- cirq/ops/raw_types.py +109 -129
- cirq/ops/raw_types_test.py +63 -57
- cirq/ops/state_preparation_channel.py +7 -7
- cirq/ops/state_preparation_channel_test.py +11 -9
- cirq/ops/swap_gates.py +13 -15
- cirq/ops/swap_gates_test.py +19 -17
- cirq/ops/tags.py +5 -3
- cirq/ops/tags_test.py +4 -2
- cirq/ops/three_qubit_gates.py +43 -76
- cirq/ops/three_qubit_gates_test.py +19 -17
- cirq/ops/two_qubit_diagonal_gate.py +13 -13
- cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
- cirq/ops/uniform_superposition_gate.py +5 -3
- cirq/ops/uniform_superposition_gate_test.py +5 -3
- cirq/ops/wait_gate.py +17 -14
- cirq/ops/wait_gate_test.py +9 -6
- cirq/protocols/__init__.py +0 -3
- cirq/protocols/act_on_protocol.py +8 -6
- cirq/protocols/act_on_protocol_test.py +15 -12
- cirq/protocols/apply_channel_protocol.py +10 -14
- cirq/protocols/apply_channel_protocol_test.py +2 -0
- cirq/protocols/apply_mixture_protocol.py +13 -42
- cirq/protocols/apply_mixture_protocol_test.py +7 -5
- cirq/protocols/apply_unitary_protocol.py +39 -34
- cirq/protocols/apply_unitary_protocol_test.py +4 -1
- cirq/protocols/approximate_equality_protocol.py +2 -0
- cirq/protocols/approximate_equality_protocol_test.py +2 -0
- cirq/protocols/circuit_diagram_info_protocol.py +58 -42
- cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
- cirq/protocols/commutes_protocol.py +8 -7
- cirq/protocols/commutes_protocol_test.py +2 -0
- cirq/protocols/control_key_protocol.py +6 -4
- cirq/protocols/control_key_protocol_test.py +3 -1
- cirq/protocols/decompose_protocol.py +49 -48
- cirq/protocols/decompose_protocol_test.py +27 -16
- cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
- cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
- cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
- cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
- cirq/protocols/has_unitary_protocol.py +10 -6
- cirq/protocols/has_unitary_protocol_test.py +13 -8
- cirq/protocols/hash_from_pickle_test.py +2 -11
- cirq/protocols/inverse_protocol.py +13 -16
- cirq/protocols/inverse_protocol_test.py +5 -3
- cirq/protocols/json_serialization.py +35 -54
- cirq/protocols/json_serialization_test.py +14 -21
- cirq/protocols/json_test_data/CXSWAP.json +46 -0
- cirq/protocols/json_test_data/CXSWAP.repr +13 -0
- cirq/protocols/json_test_data/CZSWAP.json +46 -0
- cirq/protocols/json_test_data/CZSWAP.repr +13 -0
- cirq/protocols/json_test_data/CircuitOperation.json +6 -3
- cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
- cirq/protocols/json_test_data/Moment.json +24 -1
- cirq/protocols/json_test_data/Moment.repr +6 -1
- cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
- cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
- cirq/protocols/json_test_data/spec.py +6 -2
- cirq/protocols/kraus_protocol.py +47 -7
- cirq/protocols/kraus_protocol_test.py +86 -12
- cirq/protocols/measurement_key_protocol.py +15 -16
- cirq/protocols/measurement_key_protocol_test.py +13 -11
- cirq/protocols/mixture_protocol.py +7 -5
- cirq/protocols/mixture_protocol_test.py +4 -2
- cirq/protocols/mul_protocol.py +2 -3
- cirq/protocols/mul_protocol_test.py +2 -0
- cirq/protocols/pauli_expansion_protocol.py +6 -3
- cirq/protocols/pauli_expansion_protocol_test.py +5 -3
- cirq/protocols/phase_protocol.py +2 -0
- cirq/protocols/phase_protocol_test.py +3 -1
- cirq/protocols/pow_protocol.py +11 -16
- cirq/protocols/pow_protocol_test.py +2 -0
- cirq/protocols/qasm.py +14 -20
- cirq/protocols/qasm_test.py +6 -3
- cirq/protocols/qid_shape_protocol.py +8 -8
- cirq/protocols/qid_shape_protocol_test.py +3 -1
- cirq/protocols/resolve_parameters.py +5 -3
- cirq/protocols/resolve_parameters_test.py +8 -7
- cirq/protocols/trace_distance_bound.py +6 -4
- cirq/protocols/trace_distance_bound_test.py +3 -1
- cirq/protocols/unitary_protocol.py +17 -7
- cirq/protocols/unitary_protocol_test.py +12 -2
- cirq/qis/channels.py +6 -2
- cirq/qis/channels_test.py +20 -16
- cirq/qis/clifford_tableau.py +21 -19
- cirq/qis/clifford_tableau_test.py +2 -2
- cirq/qis/entropy.py +14 -3
- cirq/qis/entropy_test.py +3 -1
- cirq/qis/measures.py +13 -13
- cirq/qis/measures_test.py +20 -14
- cirq/qis/noise_utils.py +2 -0
- cirq/qis/noise_utils_test.py +9 -7
- cirq/qis/quantum_state_representation.py +7 -8
- cirq/qis/states.py +58 -56
- cirq/qis/states_test.py +2 -0
- cirq/sim/classical_simulator.py +23 -22
- cirq/sim/classical_simulator_test.py +2 -0
- cirq/sim/clifford/clifford_simulator.py +23 -21
- cirq/sim/clifford/clifford_simulator_test.py +7 -4
- cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
- cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
- cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
- cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
- cirq/sim/clifford/stabilizer_sampler.py +9 -7
- cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
- cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
- cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
- cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
- cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
- cirq/sim/density_matrix_simulation_state.py +26 -27
- cirq/sim/density_matrix_simulation_state_test.py +10 -8
- cirq/sim/density_matrix_simulator.py +30 -28
- cirq/sim/density_matrix_simulator_test.py +48 -48
- cirq/sim/density_matrix_utils.py +13 -11
- cirq/sim/density_matrix_utils_test.py +38 -36
- cirq/sim/mux.py +33 -31
- cirq/sim/mux_test.py +3 -0
- cirq/sim/simulation_product_state.py +15 -15
- cirq/sim/simulation_product_state_test.py +29 -26
- cirq/sim/simulation_state.py +29 -38
- cirq/sim/simulation_state_base.py +21 -32
- cirq/sim/simulation_state_test.py +15 -13
- cirq/sim/simulation_utils.py +5 -2
- cirq/sim/simulation_utils_test.py +5 -2
- cirq/sim/simulator.py +90 -106
- cirq/sim/simulator_base.py +33 -45
- cirq/sim/simulator_base_test.py +20 -15
- cirq/sim/simulator_test.py +23 -14
- cirq/sim/sparse_simulator.py +19 -17
- cirq/sim/sparse_simulator_test.py +41 -40
- cirq/sim/state_vector.py +15 -12
- cirq/sim/state_vector_simulation_state.py +31 -31
- cirq/sim/state_vector_simulation_state_test.py +16 -14
- cirq/sim/state_vector_simulator.py +17 -14
- cirq/sim/state_vector_simulator_test.py +2 -0
- cirq/sim/state_vector_test.py +6 -3
- cirq/study/flatten_expressions.py +16 -15
- cirq/study/flatten_expressions_test.py +13 -11
- cirq/study/resolver.py +18 -17
- cirq/study/resolver_test.py +22 -20
- cirq/study/result.py +17 -27
- cirq/study/result_test.py +2 -0
- cirq/study/sweepable.py +12 -10
- cirq/study/sweepable_test.py +3 -0
- cirq/study/sweeps.py +42 -61
- cirq/study/sweeps_test.py +33 -0
- cirq/testing/__init__.py +7 -11
- cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
- cirq/testing/circuit_compare.py +8 -17
- cirq/testing/circuit_compare_test.py +2 -0
- cirq/testing/consistent_act_on.py +13 -11
- cirq/testing/consistent_act_on_test.py +5 -3
- cirq/testing/consistent_channels.py +2 -0
- cirq/testing/consistent_channels_test.py +10 -8
- cirq/testing/consistent_controlled_gate_op.py +5 -5
- cirq/testing/consistent_controlled_gate_op_test.py +18 -18
- cirq/testing/consistent_decomposition.py +2 -2
- cirq/testing/consistent_decomposition_test.py +4 -2
- cirq/testing/consistent_pauli_expansion.py +2 -0
- cirq/testing/consistent_pauli_expansion_test.py +3 -1
- cirq/testing/consistent_phase_by.py +2 -0
- cirq/testing/consistent_phase_by_test.py +3 -1
- cirq/testing/consistent_protocols.py +14 -20
- cirq/testing/consistent_protocols_test.py +13 -11
- cirq/testing/consistent_qasm.py +6 -4
- cirq/testing/consistent_qasm_test.py +7 -7
- cirq/testing/consistent_resolve_parameters.py +2 -0
- cirq/testing/consistent_specified_has_unitary.py +2 -2
- cirq/testing/consistent_specified_has_unitary_test.py +6 -4
- cirq/testing/consistent_unitary.py +1 -0
- cirq/testing/consistent_unitary_test.py +4 -2
- cirq/testing/deprecation.py +5 -2
- cirq/testing/deprecation_test.py +5 -2
- cirq/testing/devices.py +7 -4
- cirq/testing/devices_test.py +7 -4
- cirq/testing/equals_tester.py +4 -2
- cirq/testing/equals_tester_test.py +21 -17
- cirq/testing/equivalent_basis_map.py +6 -4
- cirq/testing/equivalent_basis_map_test.py +6 -4
- cirq/testing/equivalent_repr_eval.py +6 -4
- cirq/testing/equivalent_repr_eval_test.py +5 -3
- cirq/testing/gate_features.py +2 -0
- cirq/testing/gate_features_test.py +7 -5
- cirq/testing/json.py +19 -15
- cirq/testing/json_test.py +5 -3
- cirq/testing/lin_alg_utils.py +10 -11
- cirq/testing/lin_alg_utils_test.py +14 -12
- cirq/testing/logs.py +7 -6
- cirq/testing/logs_test.py +9 -7
- cirq/testing/no_identifier_qubit.py +4 -2
- cirq/testing/no_identifier_qubit_test.py +5 -3
- cirq/testing/op_tree.py +2 -0
- cirq/testing/op_tree_test.py +4 -1
- cirq/testing/order_tester.py +2 -0
- cirq/testing/order_tester_test.py +8 -6
- cirq/testing/pytest_utils.py +2 -0
- cirq/testing/pytest_utils_test.py +4 -2
- cirq/testing/random_circuit.py +21 -20
- cirq/testing/random_circuit_test.py +12 -9
- cirq/testing/repr_pretty_tester.py +1 -0
- cirq/testing/repr_pretty_tester_test.py +5 -3
- cirq/testing/routing_devices.py +4 -1
- cirq/testing/routing_devices_test.py +9 -6
- cirq/testing/sample_circuits.py +4 -1
- cirq/testing/sample_circuits_test.py +3 -1
- cirq/testing/sample_gates.py +3 -0
- cirq/testing/sample_gates_test.py +5 -2
- cirq/transformers/__init__.py +11 -4
- cirq/transformers/align.py +9 -7
- cirq/transformers/align_test.py +2 -0
- cirq/transformers/analytical_decompositions/__init__.py +3 -6
- cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
- cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
- cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
- cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
- cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
- cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
- cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
- cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
- cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
- cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
- cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
- cirq/transformers/drop_empty_moments.py +5 -3
- cirq/transformers/drop_empty_moments_test.py +4 -2
- cirq/transformers/drop_negligible_operations.py +7 -5
- cirq/transformers/drop_negligible_operations_test.py +2 -0
- cirq/transformers/dynamical_decoupling.py +49 -42
- cirq/transformers/dynamical_decoupling_test.py +223 -205
- cirq/transformers/eject_phased_paulis.py +28 -26
- cirq/transformers/eject_phased_paulis_test.py +12 -9
- cirq/transformers/eject_z.py +12 -12
- cirq/transformers/eject_z_test.py +2 -2
- cirq/transformers/expand_composite.py +6 -4
- cirq/transformers/expand_composite_test.py +3 -1
- cirq/transformers/gauge_compiling/__init__.py +3 -1
- cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
- cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
- cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
- cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
- cirq/transformers/insertion_sort.py +8 -6
- cirq/transformers/insertion_sort_test.py +3 -1
- cirq/transformers/measurement_transformers.py +29 -29
- cirq/transformers/measurement_transformers_test.py +2 -0
- cirq/transformers/merge_k_qubit_gates.py +12 -10
- cirq/transformers/merge_k_qubit_gates_test.py +18 -18
- cirq/transformers/merge_single_qubit_gates.py +197 -20
- cirq/transformers/merge_single_qubit_gates_test.py +177 -5
- cirq/transformers/noise_adding.py +5 -3
- cirq/transformers/noise_adding_test.py +2 -0
- cirq/transformers/optimize_for_target_gateset.py +19 -17
- cirq/transformers/optimize_for_target_gateset_test.py +11 -8
- cirq/transformers/qubit_management_transformers.py +13 -11
- cirq/transformers/qubit_management_transformers_test.py +5 -3
- cirq/transformers/randomized_measurements.py +16 -14
- cirq/transformers/randomized_measurements_test.py +10 -4
- cirq/transformers/routing/initial_mapper.py +6 -4
- cirq/transformers/routing/initial_mapper_test.py +2 -0
- cirq/transformers/routing/line_initial_mapper.py +16 -14
- cirq/transformers/routing/line_initial_mapper_test.py +9 -7
- cirq/transformers/routing/mapping_manager.py +10 -10
- cirq/transformers/routing/mapping_manager_test.py +2 -0
- cirq/transformers/routing/route_circuit_cqc.py +33 -31
- cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
- cirq/transformers/routing/visualize_routed_circuit.py +8 -7
- cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
- cirq/transformers/stratify.py +17 -15
- cirq/transformers/stratify_test.py +3 -0
- cirq/transformers/symbolize.py +103 -0
- cirq/transformers/symbolize_test.py +62 -0
- cirq/transformers/synchronize_terminal_measurements.py +10 -10
- cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
- cirq/transformers/tag_transformers.py +97 -0
- cirq/transformers/tag_transformers_test.py +103 -0
- cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
- cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
- cirq/transformers/target_gatesets/cz_gateset.py +7 -5
- cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
- cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
- cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
- cirq/transformers/transformer_api.py +34 -47
- cirq/transformers/transformer_api_test.py +9 -8
- cirq/transformers/transformer_primitives.py +39 -49
- cirq/transformers/transformer_primitives_test.py +10 -17
- cirq/value/abc_alt.py +6 -4
- cirq/value/abc_alt_test.py +5 -3
- cirq/value/angle.py +11 -12
- cirq/value/angle_test.py +5 -3
- cirq/value/classical_data.py +27 -27
- cirq/value/classical_data_test.py +11 -8
- cirq/value/condition.py +26 -24
- cirq/value/condition_test.py +2 -0
- cirq/value/digits.py +14 -11
- cirq/value/digits_test.py +2 -0
- cirq/value/duration.py +23 -20
- cirq/value/duration_test.py +2 -0
- cirq/value/linear_dict.py +25 -30
- cirq/value/linear_dict_test.py +10 -8
- cirq/value/measurement_key.py +12 -12
- cirq/value/measurement_key_test.py +2 -0
- cirq/value/periodic_value.py +4 -4
- cirq/value/periodic_value_test.py +11 -7
- cirq/value/probability.py +3 -1
- cirq/value/probability_test.py +4 -2
- cirq/value/product_state.py +15 -13
- cirq/value/product_state_test.py +4 -1
- cirq/value/random_state.py +2 -0
- cirq/value/random_state_test.py +5 -3
- cirq/value/timestamp.py +11 -7
- cirq/value/timestamp_test.py +14 -12
- cirq/value/type_alias.py +4 -4
- cirq/value/value_equality_attr.py +8 -9
- cirq/value/value_equality_attr_test.py +14 -11
- cirq/vis/density_matrix.py +3 -3
- cirq/vis/density_matrix_test.py +20 -17
- cirq/vis/heatmap.py +24 -37
- cirq/vis/heatmap_test.py +3 -0
- cirq/vis/histogram.py +9 -6
- cirq/vis/histogram_test.py +5 -2
- cirq/vis/state_histogram.py +10 -8
- cirq/vis/state_histogram_test.py +7 -5
- cirq/vis/vis_utils.py +4 -1
- cirq/vis/vis_utils_test.py +4 -1
- cirq/work/collector.py +12 -18
- cirq/work/collector_test.py +15 -10
- cirq/work/observable_grouping.py +6 -7
- cirq/work/observable_grouping_test.py +10 -9
- cirq/work/observable_measurement.py +47 -45
- cirq/work/observable_measurement_data.py +22 -17
- cirq/work/observable_measurement_data_test.py +4 -1
- cirq/work/observable_measurement_test.py +48 -29
- cirq/work/observable_readout_calibration.py +5 -2
- cirq/work/observable_readout_calibration_test.py +5 -2
- cirq/work/observable_settings.py +13 -22
- cirq/work/observable_settings_test.py +9 -7
- cirq/work/pauli_sum_collector.py +12 -10
- cirq/work/pauli_sum_collector_test.py +9 -9
- cirq/work/sampler.py +42 -43
- cirq/work/sampler_test.py +31 -24
- cirq/work/zeros_sampler.py +6 -4
- cirq/work/zeros_sampler_test.py +7 -5
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
- cirq_core-1.6.0.dist-info/RECORD +1241 -0
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
- cirq_core-1.5.0.dev20250409225226.dist-info/RECORD +0 -1216
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
|
@@ -18,7 +18,9 @@ The gate is used to create a 4x4 matrix with the diagonal elements
|
|
|
18
18
|
passed as a list.
|
|
19
19
|
"""
|
|
20
20
|
|
|
21
|
-
from
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
from typing import AbstractSet, Any, Iterator, Sequence, TYPE_CHECKING
|
|
22
24
|
|
|
23
25
|
import numpy as np
|
|
24
26
|
import sympy
|
|
@@ -62,10 +64,10 @@ class TwoQubitDiagonalGate(raw_types.Gate):
|
|
|
62
64
|
If these values are $(x_0, x_1, \ldots , x_3)$ then the unitary
|
|
63
65
|
has diagonal values $(e^{i x_0}, e^{i x_1}, \ldots, e^{i x_3})$.
|
|
64
66
|
"""
|
|
65
|
-
self._diag_angles_radians:
|
|
67
|
+
self._diag_angles_radians: tuple[value.TParamVal, ...] = tuple(diag_angles_radians)
|
|
66
68
|
|
|
67
69
|
@property
|
|
68
|
-
def diag_angles_radians(self) ->
|
|
70
|
+
def diag_angles_radians(self) -> tuple[value.TParamVal, ...]:
|
|
69
71
|
return self._diag_angles_radians
|
|
70
72
|
|
|
71
73
|
def _num_qubits_(self) -> int:
|
|
@@ -80,8 +82,8 @@ class TwoQubitDiagonalGate(raw_types.Gate):
|
|
|
80
82
|
}
|
|
81
83
|
|
|
82
84
|
def _resolve_parameters_(
|
|
83
|
-
self, resolver:
|
|
84
|
-
) ->
|
|
85
|
+
self, resolver: cirq.ParamResolver, recursive: bool
|
|
86
|
+
) -> TwoQubitDiagonalGate:
|
|
85
87
|
return TwoQubitDiagonalGate(
|
|
86
88
|
protocols.resolve_parameters(self._diag_angles_radians, resolver, recursive)
|
|
87
89
|
)
|
|
@@ -89,12 +91,12 @@ class TwoQubitDiagonalGate(raw_types.Gate):
|
|
|
89
91
|
def _has_unitary_(self) -> bool:
|
|
90
92
|
return not self._is_parameterized_()
|
|
91
93
|
|
|
92
|
-
def _unitary_(self) ->
|
|
94
|
+
def _unitary_(self) -> np.ndarray | None:
|
|
93
95
|
if self._is_parameterized_():
|
|
94
96
|
return None
|
|
95
97
|
return np.diag([np.exp(1j * angle) for angle in self._diag_angles_radians])
|
|
96
98
|
|
|
97
|
-
def _decompose_(self, qubits: Sequence[
|
|
99
|
+
def _decompose_(self, qubits: Sequence[cirq.Qid]) -> Iterator[cirq.OP_TREE]:
|
|
98
100
|
x0, x1, x2, x3 = self._diag_angles_radians
|
|
99
101
|
q0, q1 = qubits
|
|
100
102
|
yield common_gates.ZPowGate(exponent=x2 / np.pi).on(q0)
|
|
@@ -104,7 +106,7 @@ class TwoQubitDiagonalGate(raw_types.Gate):
|
|
|
104
106
|
yield common_gates.CZPowGate(exponent=x0 / np.pi).on(q0, q1)
|
|
105
107
|
yield common_gates.XPowGate().on_each(q0, q1)
|
|
106
108
|
|
|
107
|
-
def _apply_unitary_(self, args:
|
|
109
|
+
def _apply_unitary_(self, args: protocols.ApplyUnitaryArgs) -> np.ndarray:
|
|
108
110
|
if self._is_parameterized_():
|
|
109
111
|
return NotImplemented
|
|
110
112
|
for index, angle in enumerate(self._diag_angles_radians):
|
|
@@ -112,16 +114,14 @@ class TwoQubitDiagonalGate(raw_types.Gate):
|
|
|
112
114
|
args.target_tensor[subspace_index] *= np.exp(1j * angle)
|
|
113
115
|
return args.target_tensor
|
|
114
116
|
|
|
115
|
-
def _circuit_diagram_info_(
|
|
116
|
-
self, args: 'cirq.CircuitDiagramInfoArgs'
|
|
117
|
-
) -> 'cirq.CircuitDiagramInfo':
|
|
117
|
+
def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> cirq.CircuitDiagramInfo:
|
|
118
118
|
rounded_angles = np.array(self._diag_angles_radians)
|
|
119
119
|
if args.precision is not None:
|
|
120
120
|
rounded_angles = rounded_angles.round(args.precision)
|
|
121
121
|
diag_str = f"diag({', '.join(proper_repr(angle) for angle in rounded_angles)})"
|
|
122
122
|
return protocols.CircuitDiagramInfo((diag_str, '#2'))
|
|
123
123
|
|
|
124
|
-
def __pow__(self, exponent: Any) ->
|
|
124
|
+
def __pow__(self, exponent: Any) -> TwoQubitDiagonalGate:
|
|
125
125
|
if not isinstance(exponent, (int, float, sympy.Basic)):
|
|
126
126
|
return NotImplemented
|
|
127
127
|
angles = []
|
|
@@ -139,5 +139,5 @@ class TwoQubitDiagonalGate(raw_types.Gate):
|
|
|
139
139
|
angles = ','.join(proper_repr(angle) for angle in self._diag_angles_radians)
|
|
140
140
|
return f'cirq.TwoQubitDiagonalGate([{angles}])'
|
|
141
141
|
|
|
142
|
-
def _json_dict_(self) ->
|
|
142
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
143
143
|
return protocols.obj_to_dict_helper(self, attribute_names=["diag_angles_radians"])
|
|
@@ -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
|
|
@@ -30,15 +32,15 @@ import cirq
|
|
|
30
32
|
)
|
|
31
33
|
),
|
|
32
34
|
)
|
|
33
|
-
def test_consistent_protocols(gate):
|
|
35
|
+
def test_consistent_protocols(gate) -> None:
|
|
34
36
|
cirq.testing.assert_implements_consistent_protocols(gate)
|
|
35
37
|
|
|
36
38
|
|
|
37
|
-
def test_property():
|
|
39
|
+
def test_property() -> None:
|
|
38
40
|
assert cirq.TwoQubitDiagonalGate([2, 3, 5, 7]).diag_angles_radians == (2, 3, 5, 7)
|
|
39
41
|
|
|
40
42
|
|
|
41
|
-
def test_parameterized_decompose():
|
|
43
|
+
def test_parameterized_decompose() -> None:
|
|
42
44
|
angles = sympy.symbols('x0, x1, x2, x3')
|
|
43
45
|
parameterized_op = cirq.TwoQubitDiagonalGate(angles).on(*cirq.LineQubit.range(2))
|
|
44
46
|
decomposed_circuit = cirq.Circuit(cirq.decompose(parameterized_op))
|
|
@@ -54,7 +56,7 @@ def test_parameterized_decompose():
|
|
|
54
56
|
)
|
|
55
57
|
|
|
56
58
|
|
|
57
|
-
def test_unitary():
|
|
59
|
+
def test_unitary() -> None:
|
|
58
60
|
diagonal_angles = [2, 3, 5, 7]
|
|
59
61
|
assert cirq.has_unitary(cirq.TwoQubitDiagonalGate(diagonal_angles))
|
|
60
62
|
np.testing.assert_allclose(
|
|
@@ -64,7 +66,7 @@ def test_unitary():
|
|
|
64
66
|
)
|
|
65
67
|
|
|
66
68
|
|
|
67
|
-
def test_diagram():
|
|
69
|
+
def test_diagram() -> None:
|
|
68
70
|
a, b = cirq.LineQubit.range(2)
|
|
69
71
|
|
|
70
72
|
diagonal_circuit = cirq.Circuit(cirq.TwoQubitDiagonalGate([2, 3, 5, 7])(a, b))
|
|
@@ -87,7 +89,7 @@ def test_diagram():
|
|
|
87
89
|
)
|
|
88
90
|
|
|
89
91
|
|
|
90
|
-
def test_diagonal_exponent():
|
|
92
|
+
def test_diagonal_exponent() -> None:
|
|
91
93
|
diagonal_angles = [2, 3, 5, 7]
|
|
92
94
|
diagonal_gate = cirq.TwoQubitDiagonalGate(diagonal_angles)
|
|
93
95
|
|
|
@@ -99,7 +101,7 @@ def test_diagonal_exponent():
|
|
|
99
101
|
assert cirq.pow(cirq.TwoQubitDiagonalGate(diagonal_angles), "test", None) is None
|
|
100
102
|
|
|
101
103
|
|
|
102
|
-
def test_protocols_mul_not_implemented():
|
|
104
|
+
def test_protocols_mul_not_implemented() -> None:
|
|
103
105
|
diagonal_angles = [2, 3, None, 7]
|
|
104
106
|
diagonal_gate = cirq.TwoQubitDiagonalGate(diagonal_angles)
|
|
105
107
|
with pytest.raises(TypeError):
|
|
@@ -107,7 +109,7 @@ def test_protocols_mul_not_implemented():
|
|
|
107
109
|
|
|
108
110
|
|
|
109
111
|
@pytest.mark.parametrize('resolve_fn', [cirq.resolve_parameters, cirq.resolve_parameters_once])
|
|
110
|
-
def test_resolve(resolve_fn):
|
|
112
|
+
def test_resolve(resolve_fn) -> None:
|
|
111
113
|
diagonal_angles = [2, 3, 5, 7]
|
|
112
114
|
diagonal_gate = cirq.TwoQubitDiagonalGate(
|
|
113
115
|
diagonal_angles[:2] + [sympy.Symbol('a'), sympy.Symbol('b')]
|
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import Any, Iterator, Sequence, TYPE_CHECKING
|
|
16
18
|
|
|
17
19
|
import numpy as np
|
|
18
20
|
|
|
@@ -58,7 +60,7 @@ class UniformSuperpositionGate(raw_types.Gate):
|
|
|
58
60
|
self._m_value = m_value
|
|
59
61
|
self._num_qubits = num_qubits
|
|
60
62
|
|
|
61
|
-
def _decompose_(self, qubits: Sequence[
|
|
63
|
+
def _decompose_(self, qubits: Sequence[cirq.Qid]) -> Iterator[cirq.OP_TREE]:
|
|
62
64
|
"""Decomposes the gate into a sequence of standard gates.
|
|
63
65
|
Implements the construction from https://arxiv.org/pdf/2306.11747.
|
|
64
66
|
"""
|
|
@@ -113,7 +115,7 @@ class UniformSuperpositionGate(raw_types.Gate):
|
|
|
113
115
|
def __repr__(self) -> str:
|
|
114
116
|
return f'UniformSuperpositionGate(m_value={self._m_value}, num_qubits={self._num_qubits})'
|
|
115
117
|
|
|
116
|
-
def _json_dict_(self) ->
|
|
118
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
117
119
|
d = {}
|
|
118
120
|
d['m_value'] = self._m_value
|
|
119
121
|
d['num_qubits'] = self._num_qubits
|
|
@@ -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
|
|
|
@@ -65,18 +67,18 @@ def test_incompatible_m_value_and_qubit_args(m: int, n: int) -> None:
|
|
|
65
67
|
cirq.UniformSuperpositionGate(m, n)
|
|
66
68
|
|
|
67
69
|
|
|
68
|
-
def test_repr():
|
|
70
|
+
def test_repr() -> None:
|
|
69
71
|
assert (
|
|
70
72
|
repr(cirq.UniformSuperpositionGate(7, 3))
|
|
71
73
|
== 'UniformSuperpositionGate(m_value=7, num_qubits=3)'
|
|
72
74
|
)
|
|
73
75
|
|
|
74
76
|
|
|
75
|
-
def test_uniform_superposition_gate_json_dict():
|
|
77
|
+
def test_uniform_superposition_gate_json_dict() -> None:
|
|
76
78
|
assert cirq.UniformSuperpositionGate(7, 3)._json_dict_() == {'m_value': 7, 'num_qubits': 3}
|
|
77
79
|
|
|
78
80
|
|
|
79
|
-
def test_str():
|
|
81
|
+
def test_str() -> None:
|
|
80
82
|
assert (
|
|
81
83
|
str(cirq.UniformSuperpositionGate(7, 3))
|
|
82
84
|
== 'UniformSuperpositionGate(m_value=7, num_qubits=3)'
|
cirq/ops/wait_gate.py
CHANGED
|
@@ -11,7 +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
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import AbstractSet, Any, TYPE_CHECKING
|
|
15
18
|
|
|
16
19
|
from cirq import protocols, value
|
|
17
20
|
from cirq.ops import raw_types
|
|
@@ -30,9 +33,9 @@ class WaitGate(raw_types.Gate):
|
|
|
30
33
|
|
|
31
34
|
def __init__(
|
|
32
35
|
self,
|
|
33
|
-
duration:
|
|
34
|
-
num_qubits:
|
|
35
|
-
qid_shape:
|
|
36
|
+
duration: cirq.DURATION_LIKE | int,
|
|
37
|
+
num_qubits: int | None = None,
|
|
38
|
+
qid_shape: tuple[int, ...] | None = None,
|
|
36
39
|
) -> None:
|
|
37
40
|
"""Initialize a wait gate with the given duration.
|
|
38
41
|
|
|
@@ -66,7 +69,7 @@ class WaitGate(raw_types.Gate):
|
|
|
66
69
|
self._qid_shape = qid_shape
|
|
67
70
|
|
|
68
71
|
@property
|
|
69
|
-
def duration(self) ->
|
|
72
|
+
def duration(self) -> cirq.Duration:
|
|
70
73
|
return self._duration
|
|
71
74
|
|
|
72
75
|
def _is_parameterized_(self) -> bool:
|
|
@@ -75,13 +78,13 @@ class WaitGate(raw_types.Gate):
|
|
|
75
78
|
def _parameter_names_(self) -> AbstractSet[str]:
|
|
76
79
|
return protocols.parameter_names(self.duration)
|
|
77
80
|
|
|
78
|
-
def _resolve_parameters_(self, resolver:
|
|
81
|
+
def _resolve_parameters_(self, resolver: cirq.ParamResolver, recursive: bool) -> WaitGate:
|
|
79
82
|
return WaitGate(
|
|
80
83
|
protocols.resolve_parameters(self.duration, resolver, recursive),
|
|
81
84
|
qid_shape=self._qid_shape,
|
|
82
85
|
)
|
|
83
86
|
|
|
84
|
-
def _qid_shape_(self) ->
|
|
87
|
+
def _qid_shape_(self) -> tuple[int, ...]:
|
|
85
88
|
return self._qid_shape
|
|
86
89
|
|
|
87
90
|
def _has_unitary_(self) -> bool:
|
|
@@ -111,7 +114,7 @@ class WaitGate(raw_types.Gate):
|
|
|
111
114
|
def __repr__(self) -> str:
|
|
112
115
|
return f'cirq.WaitGate({repr(self.duration)})'
|
|
113
116
|
|
|
114
|
-
def _json_dict_(self) ->
|
|
117
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
115
118
|
d = protocols.obj_to_dict_helper(self, ['duration'])
|
|
116
119
|
if len(self._qid_shape) != 1:
|
|
117
120
|
d['num_qubits'] = len(self._qid_shape)
|
|
@@ -132,12 +135,12 @@ class WaitGate(raw_types.Gate):
|
|
|
132
135
|
|
|
133
136
|
|
|
134
137
|
def wait(
|
|
135
|
-
*target:
|
|
136
|
-
duration:
|
|
137
|
-
picos:
|
|
138
|
-
nanos:
|
|
139
|
-
micros:
|
|
140
|
-
millis:
|
|
138
|
+
*target: cirq.Qid,
|
|
139
|
+
duration: cirq.DURATION_LIKE = None,
|
|
140
|
+
picos: cirq.TParamVal = 0,
|
|
141
|
+
nanos: cirq.TParamVal = 0,
|
|
142
|
+
micros: cirq.TParamVal = 0,
|
|
143
|
+
millis: cirq.TParamVal = 0,
|
|
141
144
|
) -> raw_types.Operation:
|
|
142
145
|
"""Creates a WaitGate applied to all the given qubits.
|
|
143
146
|
|
cirq/ops/wait_gate_test.py
CHANGED
|
@@ -11,6 +11,9 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
14
17
|
import datetime
|
|
15
18
|
|
|
16
19
|
import pytest
|
|
@@ -19,7 +22,7 @@ import sympy
|
|
|
19
22
|
import cirq
|
|
20
23
|
|
|
21
24
|
|
|
22
|
-
def test_init():
|
|
25
|
+
def test_init() -> None:
|
|
23
26
|
g = cirq.WaitGate(datetime.timedelta(0, 0, 5))
|
|
24
27
|
assert g.duration == cirq.Duration(micros=5)
|
|
25
28
|
|
|
@@ -36,13 +39,13 @@ def test_init():
|
|
|
36
39
|
_ = cirq.WaitGate(2)
|
|
37
40
|
|
|
38
41
|
|
|
39
|
-
def test_eq():
|
|
42
|
+
def test_eq() -> None:
|
|
40
43
|
eq = cirq.testing.EqualsTester()
|
|
41
44
|
eq.add_equality_group(cirq.WaitGate(0), cirq.WaitGate(cirq.Duration()))
|
|
42
45
|
eq.make_equality_group(lambda: cirq.WaitGate(cirq.Duration(nanos=4)))
|
|
43
46
|
|
|
44
47
|
|
|
45
|
-
def test_protocols():
|
|
48
|
+
def test_protocols() -> None:
|
|
46
49
|
t = sympy.Symbol('t')
|
|
47
50
|
p = cirq.WaitGate(cirq.Duration(millis=5 * t))
|
|
48
51
|
c = cirq.WaitGate(cirq.Duration(millis=2))
|
|
@@ -67,7 +70,7 @@ def test_protocols():
|
|
|
67
70
|
assert cirq.decompose(p.on(q)) == []
|
|
68
71
|
|
|
69
72
|
|
|
70
|
-
def test_qid_shape():
|
|
73
|
+
def test_qid_shape() -> None:
|
|
71
74
|
assert cirq.qid_shape(cirq.WaitGate(0, qid_shape=(2, 3))) == (2, 3)
|
|
72
75
|
assert cirq.qid_shape(cirq.WaitGate(0, num_qubits=3)) == (2, 2, 2)
|
|
73
76
|
with pytest.raises(ValueError, match='empty set of qubits'):
|
|
@@ -84,7 +87,7 @@ def test_resolve_parameters(num_qubits: int) -> None:
|
|
|
84
87
|
assert cirq.num_qubits(resolved) == num_qubits
|
|
85
88
|
|
|
86
89
|
|
|
87
|
-
def test_json():
|
|
90
|
+
def test_json() -> None:
|
|
88
91
|
q0, q1 = cirq.GridQubit.rect(1, 2)
|
|
89
92
|
qtrit = cirq.GridQid(1, 2, dimension=3)
|
|
90
93
|
cirq.testing.assert_json_roundtrip_works(cirq.wait(q0, nanos=10))
|
|
@@ -93,5 +96,5 @@ def test_json():
|
|
|
93
96
|
cirq.testing.assert_json_roundtrip_works(cirq.wait(qtrit, q1, nanos=10))
|
|
94
97
|
|
|
95
98
|
|
|
96
|
-
def test_str():
|
|
99
|
+
def test_str() -> None:
|
|
97
100
|
assert str(cirq.WaitGate(cirq.Duration(nanos=5))) == 'WaitGate(5 ns)'
|
cirq/protocols/__init__.py
CHANGED
|
@@ -139,11 +139,8 @@ from cirq.protocols.pauli_expansion_protocol import (
|
|
|
139
139
|
SupportsPauliExpansion as SupportsPauliExpansion,
|
|
140
140
|
)
|
|
141
141
|
|
|
142
|
-
# pylint: disable=redefined-builtin
|
|
143
142
|
from cirq.protocols.pow_protocol import pow as pow
|
|
144
143
|
|
|
145
|
-
# pylint: enable=redefined-builtin
|
|
146
|
-
|
|
147
144
|
from cirq.protocols.qasm import (
|
|
148
145
|
qasm as qasm,
|
|
149
146
|
QasmArgs as QasmArgs,
|
|
@@ -12,8 +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
|
from types import NotImplementedType
|
|
16
|
-
from typing import Any,
|
|
18
|
+
from typing import Any, Sequence, TYPE_CHECKING
|
|
17
19
|
|
|
18
20
|
from typing_extensions import Protocol
|
|
19
21
|
|
|
@@ -28,7 +30,7 @@ class SupportsActOn(Protocol):
|
|
|
28
30
|
"""An object that explicitly specifies how to act on simulator states."""
|
|
29
31
|
|
|
30
32
|
@doc_private
|
|
31
|
-
def _act_on_(self, sim_state:
|
|
33
|
+
def _act_on_(self, sim_state: cirq.SimulationStateBase) -> NotImplementedType | bool:
|
|
32
34
|
"""Applies an action to the given argument, if it is a supported type.
|
|
33
35
|
|
|
34
36
|
For example, unitary operations can implement an `_act_on_` method that
|
|
@@ -59,8 +61,8 @@ class SupportsActOnQubits(Protocol):
|
|
|
59
61
|
|
|
60
62
|
@doc_private
|
|
61
63
|
def _act_on_(
|
|
62
|
-
self, sim_state:
|
|
63
|
-
) ->
|
|
64
|
+
self, sim_state: cirq.SimulationStateBase, qubits: Sequence[cirq.Qid]
|
|
65
|
+
) -> NotImplementedType | bool:
|
|
64
66
|
"""Applies an action to the given argument, if it is a supported type.
|
|
65
67
|
|
|
66
68
|
For example, unitary operations can implement an `_act_on_` method that
|
|
@@ -88,8 +90,8 @@ class SupportsActOnQubits(Protocol):
|
|
|
88
90
|
|
|
89
91
|
def act_on(
|
|
90
92
|
action: Any,
|
|
91
|
-
sim_state:
|
|
92
|
-
qubits:
|
|
93
|
+
sim_state: cirq.SimulationStateBase,
|
|
94
|
+
qubits: Sequence[cirq.Qid] | None = None,
|
|
93
95
|
*,
|
|
94
96
|
allow_decompose: bool = True,
|
|
95
97
|
):
|
|
@@ -11,7 +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
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import Any, Sequence
|
|
15
18
|
|
|
16
19
|
import numpy as np
|
|
17
20
|
import pytest
|
|
@@ -34,7 +37,7 @@ class ExampleSimulationState(cirq.SimulationState):
|
|
|
34
37
|
self.fallback_result = fallback_result
|
|
35
38
|
|
|
36
39
|
def _act_on_fallback_(
|
|
37
|
-
self, action: Any, qubits: Sequence[
|
|
40
|
+
self, action: Any, qubits: Sequence[cirq.Qid], allow_decompose: bool = True
|
|
38
41
|
):
|
|
39
42
|
return self.fallback_result
|
|
40
43
|
|
|
@@ -42,30 +45,30 @@ class ExampleSimulationState(cirq.SimulationState):
|
|
|
42
45
|
op = cirq.X(cirq.LineQubit(0))
|
|
43
46
|
|
|
44
47
|
|
|
45
|
-
def test_act_on_fallback_succeeds():
|
|
48
|
+
def test_act_on_fallback_succeeds() -> None:
|
|
46
49
|
state = ExampleSimulationState(fallback_result=True)
|
|
47
50
|
cirq.act_on(op, state)
|
|
48
51
|
|
|
49
52
|
|
|
50
|
-
def test_act_on_fallback_fails():
|
|
53
|
+
def test_act_on_fallback_fails() -> None:
|
|
51
54
|
state = ExampleSimulationState(fallback_result=NotImplemented)
|
|
52
55
|
with pytest.raises(TypeError, match='Failed to act'):
|
|
53
56
|
cirq.act_on(op, state)
|
|
54
57
|
|
|
55
58
|
|
|
56
|
-
def test_act_on_fallback_errors():
|
|
59
|
+
def test_act_on_fallback_errors() -> None:
|
|
57
60
|
state = ExampleSimulationState(fallback_result=False)
|
|
58
61
|
with pytest.raises(ValueError, match='_act_on_fallback_ must return True or NotImplemented'):
|
|
59
62
|
cirq.act_on(op, state)
|
|
60
63
|
|
|
61
64
|
|
|
62
|
-
def test_act_on_errors():
|
|
65
|
+
def test_act_on_errors() -> None:
|
|
63
66
|
class Op(cirq.Operation):
|
|
64
67
|
@property
|
|
65
|
-
def qubits(self) ->
|
|
68
|
+
def qubits(self) -> tuple[cirq.Qid, ...]: # type: ignore[empty-body]
|
|
66
69
|
pass
|
|
67
70
|
|
|
68
|
-
def with_qubits(self, *new_qubits:
|
|
71
|
+
def with_qubits(self, *new_qubits: cirq.Qid) -> Self: # type: ignore[empty-body]
|
|
69
72
|
pass
|
|
70
73
|
|
|
71
74
|
def _act_on_(self, sim_state):
|
|
@@ -76,13 +79,13 @@ def test_act_on_errors():
|
|
|
76
79
|
cirq.act_on(Op(), state)
|
|
77
80
|
|
|
78
81
|
|
|
79
|
-
def test_qubits_not_allowed_for_operations():
|
|
82
|
+
def test_qubits_not_allowed_for_operations() -> None:
|
|
80
83
|
class Op(cirq.Operation):
|
|
81
84
|
@property
|
|
82
|
-
def qubits(self) ->
|
|
85
|
+
def qubits(self) -> tuple[cirq.Qid, ...]: # type: ignore[empty-body]
|
|
83
86
|
pass
|
|
84
87
|
|
|
85
|
-
def with_qubits(self, *new_qubits:
|
|
88
|
+
def with_qubits(self, *new_qubits: cirq.Qid) -> Self: # type: ignore[empty-body]
|
|
86
89
|
pass
|
|
87
90
|
|
|
88
91
|
state = ExampleSimulationState()
|
|
@@ -92,7 +95,7 @@ def test_qubits_not_allowed_for_operations():
|
|
|
92
95
|
cirq.act_on(Op(), state, qubits=[])
|
|
93
96
|
|
|
94
97
|
|
|
95
|
-
def test_qubits_should_be_defined_for_operations():
|
|
98
|
+
def test_qubits_should_be_defined_for_operations() -> None:
|
|
96
99
|
state = ExampleSimulationState()
|
|
97
100
|
with pytest.raises(ValueError, match='Calls to act_on should'):
|
|
98
101
|
cirq.act_on(cirq.KrausChannel([np.array([[1, 0], [0, 0]])]), state, qubits=None)
|
|
@@ -14,8 +14,10 @@
|
|
|
14
14
|
|
|
15
15
|
"""A protocol for implementing high performance channel evolutions."""
|
|
16
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
17
19
|
from types import NotImplementedType
|
|
18
|
-
from typing import Any, Iterable,
|
|
20
|
+
from typing import Any, Iterable, Sequence, TypeVar
|
|
19
21
|
|
|
20
22
|
import numpy as np
|
|
21
23
|
from typing_extensions import Protocol
|
|
@@ -124,9 +126,7 @@ class SupportsApplyChannel(Protocol):
|
|
|
124
126
|
"""An object that can efficiently implement a channel."""
|
|
125
127
|
|
|
126
128
|
@doc_private
|
|
127
|
-
def _apply_channel_(
|
|
128
|
-
self, args: ApplyChannelArgs
|
|
129
|
-
) -> Union[np.ndarray, None, NotImplementedType]:
|
|
129
|
+
def _apply_channel_(self, args: ApplyChannelArgs) -> np.ndarray | None | NotImplementedType:
|
|
130
130
|
"""Efficiently applies a channel.
|
|
131
131
|
|
|
132
132
|
This method is given both the target tensor and workspace of the same
|
|
@@ -166,10 +166,8 @@ class SupportsApplyChannel(Protocol):
|
|
|
166
166
|
|
|
167
167
|
|
|
168
168
|
def apply_channel(
|
|
169
|
-
val: Any,
|
|
170
|
-
|
|
171
|
-
default: Union[np.ndarray, TDefault] = RaiseTypeErrorIfNotProvided,
|
|
172
|
-
) -> Union[np.ndarray, TDefault]:
|
|
169
|
+
val: Any, args: ApplyChannelArgs, default: np.ndarray | TDefault = RaiseTypeErrorIfNotProvided
|
|
170
|
+
) -> np.ndarray | TDefault:
|
|
173
171
|
"""High performance evolution under a channel evolution.
|
|
174
172
|
|
|
175
173
|
If `val` defines an `_apply_channel_` method, that method will be
|
|
@@ -273,7 +271,7 @@ def apply_channel(
|
|
|
273
271
|
)
|
|
274
272
|
|
|
275
273
|
|
|
276
|
-
def _apply_unitary(val: Any, args:
|
|
274
|
+
def _apply_unitary(val: Any, args: ApplyChannelArgs) -> np.ndarray | None:
|
|
277
275
|
"""Attempt to use `apply_unitary` and return the result.
|
|
278
276
|
|
|
279
277
|
If `val` does not support `apply_unitary` returns None.
|
|
@@ -296,9 +294,7 @@ def _apply_unitary(val: Any, args: 'ApplyChannelArgs') -> Optional[np.ndarray]:
|
|
|
296
294
|
return right_result
|
|
297
295
|
|
|
298
296
|
|
|
299
|
-
def _apply_kraus(
|
|
300
|
-
kraus: Union[Tuple[np.ndarray], Sequence[Any]], args: 'ApplyChannelArgs'
|
|
301
|
-
) -> np.ndarray:
|
|
297
|
+
def _apply_kraus(kraus: tuple[np.ndarray] | Sequence[Any], args: ApplyChannelArgs) -> np.ndarray:
|
|
302
298
|
"""Directly apply the kraus operators to the target tensor."""
|
|
303
299
|
# Initialize output.
|
|
304
300
|
args.out_buffer[:] = 0
|
|
@@ -313,7 +309,7 @@ def _apply_kraus(
|
|
|
313
309
|
|
|
314
310
|
|
|
315
311
|
def _apply_kraus_single_qubit(
|
|
316
|
-
kraus:
|
|
312
|
+
kraus: tuple[Any] | Sequence[Any], args: ApplyChannelArgs
|
|
317
313
|
) -> np.ndarray:
|
|
318
314
|
"""Use slicing to apply single qubit channel. Only for two-level qubits."""
|
|
319
315
|
zero_left = linalg.slice_for_qubits_equal_to(args.left_axes, 0)
|
|
@@ -338,7 +334,7 @@ def _apply_kraus_single_qubit(
|
|
|
338
334
|
|
|
339
335
|
|
|
340
336
|
def _apply_kraus_multi_qubit(
|
|
341
|
-
kraus:
|
|
337
|
+
kraus: tuple[Any] | Sequence[Any], args: ApplyChannelArgs
|
|
342
338
|
) -> np.ndarray:
|
|
343
339
|
"""Use numpy's einsum to apply a multi-qubit channel."""
|
|
344
340
|
qid_shape = tuple(args.target_tensor.shape[i] for i in args.left_axes)
|