cirq-core 1.5.0.dev20250409225226__py3-none-any.whl → 1.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of cirq-core might be problematic. Click here for more details.
- cirq/__init__.py +16 -17
- cirq/_compat.py +21 -20
- cirq/_compat_test.py +14 -34
- cirq/_doc.py +4 -2
- cirq/_import.py +8 -6
- cirq/_import_test.py +4 -2
- cirq/_version.py +6 -6
- cirq/_version_test.py +2 -2
- cirq/circuits/_block_diagram_drawer.py +11 -10
- cirq/circuits/_block_diagram_drawer_test.py +8 -6
- cirq/circuits/_box_drawing_character_data.py +8 -8
- cirq/circuits/_box_drawing_character_data_test.py +3 -1
- cirq/circuits/_bucket_priority_queue.py +9 -7
- cirq/circuits/_bucket_priority_queue_test.py +22 -20
- cirq/circuits/circuit.py +248 -172
- cirq/circuits/circuit_operation.py +73 -83
- cirq/circuits/circuit_operation_test.py +128 -90
- cirq/circuits/circuit_test.py +211 -151
- cirq/circuits/frozen_circuit.py +23 -60
- cirq/circuits/frozen_circuit_test.py +31 -8
- cirq/circuits/insert_strategy.py +7 -5
- cirq/circuits/insert_strategy_test.py +4 -2
- cirq/circuits/moment.py +88 -40
- cirq/circuits/moment_test.py +128 -51
- cirq/circuits/optimization_pass.py +5 -5
- cirq/circuits/optimization_pass_test.py +10 -10
- cirq/circuits/qasm_output.py +11 -11
- cirq/circuits/qasm_output_test.py +25 -22
- cirq/circuits/text_diagram_drawer.py +23 -38
- cirq/circuits/text_diagram_drawer_test.py +19 -17
- cirq/conftest.py +4 -3
- cirq/contrib/__init__.py +4 -4
- cirq/contrib/acquaintance/__init__.py +1 -1
- cirq/contrib/acquaintance/bipartite.py +5 -8
- cirq/contrib/acquaintance/bipartite_test.py +18 -13
- cirq/contrib/acquaintance/devices.py +2 -2
- cirq/contrib/acquaintance/devices_test.py +5 -3
- cirq/contrib/acquaintance/executor.py +5 -5
- cirq/contrib/acquaintance/executor_test.py +13 -9
- cirq/contrib/acquaintance/gates.py +18 -28
- cirq/contrib/acquaintance/gates_test.py +24 -20
- cirq/contrib/acquaintance/inspection_utils.py +8 -4
- cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
- cirq/contrib/acquaintance/mutation_utils.py +4 -4
- cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
- cirq/contrib/acquaintance/optimizers.py +4 -4
- cirq/contrib/acquaintance/optimizers_test.py +4 -1
- cirq/contrib/acquaintance/permutation.py +15 -27
- cirq/contrib/acquaintance/permutation_test.py +26 -17
- cirq/contrib/acquaintance/shift.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
- cirq/contrib/acquaintance/shift_test.py +8 -6
- cirq/contrib/acquaintance/strategies/cubic.py +2 -2
- cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
- cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
- cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
- cirq/contrib/acquaintance/testing.py +2 -0
- cirq/contrib/acquaintance/topological_sort.py +2 -2
- cirq/contrib/acquaintance/topological_sort_test.py +3 -1
- cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
- cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
- cirq/contrib/circuitdag/circuit_dag.py +4 -4
- cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
- cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
- cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
- cirq/contrib/graph_device/graph_device.py +12 -11
- cirq/contrib/graph_device/graph_device_test.py +18 -14
- cirq/contrib/graph_device/hypergraph.py +16 -14
- cirq/contrib/graph_device/hypergraph_test.py +13 -11
- cirq/contrib/graph_device/uniform_graph_device.py +6 -4
- cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
- cirq/contrib/hacks/disable_validation.py +6 -1
- cirq/contrib/hacks/disable_validation_test.py +3 -1
- cirq/contrib/json.py +31 -5
- cirq/contrib/json_test.py +6 -3
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/__init__.py +17 -0
- cirq/contrib/json_test_data/spec.py +32 -0
- cirq/contrib/noise_models/noise_models.py +119 -5
- cirq/contrib/noise_models/noise_models_test.py +37 -9
- cirq/contrib/paulistring/clifford_optimize.py +6 -4
- cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
- cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
- cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
- cirq/contrib/paulistring/optimize.py +2 -0
- cirq/contrib/paulistring/optimize_test.py +4 -3
- cirq/contrib/paulistring/pauli_string_dag.py +2 -0
- cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
- cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
- cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
- cirq/contrib/paulistring/recombine.py +6 -4
- cirq/contrib/paulistring/recombine_test.py +3 -1
- cirq/contrib/paulistring/separate.py +9 -6
- cirq/contrib/paulistring/separate_test.py +3 -1
- cirq/contrib/qasm_import/_lexer.py +3 -2
- cirq/contrib/qasm_import/_lexer_test.py +49 -13
- cirq/contrib/qasm_import/_parser.py +547 -83
- cirq/contrib/qasm_import/_parser_test.py +988 -97
- cirq/contrib/qasm_import/exception.py +2 -0
- cirq/contrib/qasm_import/qasm.py +8 -2
- cirq/contrib/qasm_import/qasm_test.py +7 -4
- cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
- cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
- cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
- cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
- cirq/contrib/qcircuit/qcircuit_test.py +10 -8
- cirq/contrib/quantum_volume/quantum_volume.py +31 -27
- cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
- cirq/contrib/quimb/density_matrix.py +15 -14
- cirq/contrib/quimb/density_matrix_test.py +10 -7
- cirq/contrib/quimb/grid_circuits.py +5 -2
- cirq/contrib/quimb/grid_circuits_test.py +3 -0
- cirq/contrib/quimb/mps_simulator.py +20 -20
- cirq/contrib/quimb/mps_simulator_test.py +3 -0
- cirq/contrib/quimb/state_vector.py +12 -11
- cirq/contrib/quimb/state_vector_test.py +3 -0
- cirq/contrib/quirk/export_to_quirk.py +5 -3
- cirq/contrib/quirk/export_to_quirk_test.py +18 -16
- cirq/contrib/quirk/linearize_circuit.py +2 -0
- cirq/contrib/quirk/quirk_gate.py +18 -17
- cirq/contrib/routing/device.py +5 -3
- cirq/contrib/routing/device_test.py +2 -0
- cirq/contrib/routing/greedy.py +10 -21
- cirq/contrib/routing/greedy_test.py +4 -2
- cirq/contrib/routing/initialization.py +2 -2
- cirq/contrib/routing/initialization_test.py +5 -3
- cirq/contrib/routing/router.py +9 -5
- cirq/contrib/routing/router_test.py +2 -0
- cirq/contrib/routing/swap_network.py +3 -3
- cirq/contrib/routing/swap_network_test.py +3 -1
- cirq/contrib/routing/utils.py +2 -2
- cirq/contrib/routing/utils_test.py +3 -0
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
- cirq/contrib/svg/svg.py +3 -3
- cirq/contrib/svg/svg_test.py +8 -5
- cirq/devices/device.py +4 -4
- cirq/devices/device_test.py +7 -4
- cirq/devices/grid_device_metadata.py +10 -10
- cirq/devices/grid_device_metadata_test.py +3 -0
- cirq/devices/grid_qubit.py +29 -21
- cirq/devices/grid_qubit_test.py +3 -0
- cirq/devices/insertion_noise_model.py +7 -7
- cirq/devices/insertion_noise_model_test.py +7 -5
- cirq/devices/line_qubit.py +13 -13
- cirq/devices/line_qubit_test.py +2 -0
- cirq/devices/named_topologies.py +18 -29
- cirq/devices/named_topologies_test.py +13 -10
- cirq/devices/noise_model.py +3 -3
- cirq/devices/noise_model_test.py +19 -15
- cirq/devices/noise_properties.py +15 -6
- cirq/devices/noise_properties_test.py +34 -3
- cirq/devices/noise_utils.py +11 -9
- cirq/devices/noise_utils_test.py +2 -0
- cirq/devices/superconducting_qubits_noise_properties.py +23 -22
- cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
- cirq/devices/thermal_noise_model.py +107 -37
- cirq/devices/thermal_noise_model_test.py +21 -0
- cirq/devices/unconstrained_device.py +5 -3
- cirq/devices/unconstrained_device_test.py +2 -0
- cirq/experiments/__init__.py +4 -2
- cirq/experiments/benchmarking/__init__.py +17 -0
- cirq/experiments/benchmarking/parallel_xeb.py +677 -0
- cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
- cirq/experiments/fidelity_estimation.py +14 -8
- cirq/experiments/fidelity_estimation_test.py +3 -0
- cirq/experiments/n_qubit_tomography.py +17 -16
- cirq/experiments/n_qubit_tomography_test.py +8 -5
- cirq/experiments/purity_estimation.py +2 -0
- cirq/experiments/purity_estimation_test.py +2 -0
- cirq/experiments/qubit_characterizations.py +207 -103
- cirq/experiments/qubit_characterizations_test.py +40 -12
- cirq/experiments/random_quantum_circuit_generation.py +56 -70
- cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
- cirq/experiments/readout_confusion_matrix.py +24 -22
- cirq/experiments/readout_confusion_matrix_test.py +2 -0
- cirq/experiments/single_qubit_readout_calibration.py +30 -15
- cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
- cirq/experiments/t1_decay_experiment.py +9 -7
- cirq/experiments/t1_decay_experiment_test.py +13 -11
- cirq/experiments/t2_decay_experiment.py +16 -13
- cirq/experiments/t2_decay_experiment_test.py +2 -0
- cirq/experiments/two_qubit_xeb.py +64 -57
- cirq/experiments/two_qubit_xeb_test.py +10 -6
- cirq/experiments/xeb_fitting.py +39 -35
- cirq/experiments/xeb_sampling.py +37 -44
- cirq/experiments/xeb_sampling_test.py +3 -0
- cirq/experiments/xeb_simulation.py +14 -10
- cirq/experiments/xeb_simulation_test.py +5 -5
- cirq/experiments/z_phase_calibration.py +32 -29
- cirq/experiments/z_phase_calibration_test.py +3 -4
- cirq/interop/quirk/cells/__init__.py +1 -1
- cirq/interop/quirk/cells/all_cells.py +7 -2
- cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
- cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
- cirq/interop/quirk/cells/cell.py +19 -28
- cirq/interop/quirk/cells/cell_test.py +3 -0
- cirq/interop/quirk/cells/composite_cell.py +13 -28
- cirq/interop/quirk/cells/composite_cell_test.py +2 -0
- cirq/interop/quirk/cells/control_cells.py +15 -15
- cirq/interop/quirk/cells/control_cells_test.py +7 -5
- cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
- cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
- cirq/interop/quirk/cells/ignored_cells.py +3 -0
- cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
- cirq/interop/quirk/cells/input_cells.py +7 -5
- cirq/interop/quirk/cells/input_cells_test.py +7 -5
- cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
- cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
- cirq/interop/quirk/cells/measurement_cells.py +5 -2
- cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
- cirq/interop/quirk/cells/parse.py +22 -23
- cirq/interop/quirk/cells/parse_test.py +12 -10
- cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
- cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
- cirq/interop/quirk/cells/scalar_cells.py +4 -1
- cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
- cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
- cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
- cirq/interop/quirk/cells/swap_cell.py +8 -6
- cirq/interop/quirk/cells/swap_cell_test.py +6 -4
- cirq/interop/quirk/cells/testing.py +6 -6
- cirq/interop/quirk/cells/testing_test.py +8 -6
- cirq/interop/quirk/cells/unsupported_cells.py +3 -0
- cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
- cirq/interop/quirk/url_to_circuit.py +23 -36
- cirq/interop/quirk/url_to_circuit_test.py +4 -1
- cirq/json_resolver_cache.py +14 -12
- cirq/linalg/__init__.py +4 -6
- cirq/linalg/combinators.py +7 -5
- cirq/linalg/combinators_test.py +10 -7
- cirq/linalg/decompositions.py +24 -35
- cirq/linalg/decompositions_test.py +3 -1
- cirq/linalg/diagonalize.py +6 -4
- cirq/linalg/diagonalize_test.py +15 -14
- cirq/linalg/operator_spaces.py +14 -14
- cirq/linalg/operator_spaces_test.py +13 -11
- cirq/linalg/predicates.py +18 -9
- cirq/linalg/predicates_test.py +5 -0
- cirq/linalg/tolerance.py +6 -3
- cirq/linalg/tolerance_test.py +6 -4
- cirq/linalg/transformations.py +23 -20
- cirq/linalg/transformations_test.py +73 -43
- cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
- cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
- cirq/neutral_atoms/neutral_atom_devices.py +2 -0
- cirq/ops/__init__.py +2 -0
- cirq/ops/arithmetic_operation.py +21 -21
- cirq/ops/arithmetic_operation_test.py +7 -8
- cirq/ops/boolean_hamiltonian.py +23 -22
- cirq/ops/boolean_hamiltonian_test.py +12 -9
- cirq/ops/classically_controlled_operation.py +31 -36
- cirq/ops/classically_controlled_operation_test.py +121 -117
- cirq/ops/clifford_gate.py +98 -81
- cirq/ops/clifford_gate_test.py +72 -57
- cirq/ops/common_channels.py +44 -44
- cirq/ops/common_channels_test.py +83 -81
- cirq/ops/common_gate_families.py +9 -7
- cirq/ops/common_gate_families_test.py +11 -7
- cirq/ops/common_gates.py +164 -183
- cirq/ops/common_gates_test.py +135 -95
- cirq/ops/control_values.py +23 -26
- cirq/ops/control_values_test.py +22 -20
- cirq/ops/controlled_gate.py +64 -112
- cirq/ops/controlled_gate_test.py +130 -35
- cirq/ops/controlled_operation.py +24 -35
- cirq/ops/controlled_operation_test.py +8 -6
- cirq/ops/dense_pauli_string.py +38 -49
- cirq/ops/dense_pauli_string_test.py +4 -2
- cirq/ops/diagonal_gate.py +18 -31
- cirq/ops/diagonal_gate_test.py +13 -13
- cirq/ops/eigen_gate.py +29 -29
- cirq/ops/eigen_gate_test.py +45 -28
- cirq/ops/fourier_transform.py +14 -20
- cirq/ops/fourier_transform_test.py +15 -12
- cirq/ops/fsim_gate.py +43 -42
- cirq/ops/fsim_gate_test.py +29 -29
- cirq/ops/gate_features.py +2 -0
- cirq/ops/gate_features_test.py +5 -3
- cirq/ops/gate_operation.py +43 -65
- cirq/ops/gate_operation_test.py +46 -42
- cirq/ops/gateset.py +28 -40
- cirq/ops/gateset_test.py +4 -2
- cirq/ops/global_phase_op.py +45 -20
- cirq/ops/global_phase_op_test.py +44 -20
- cirq/ops/greedy_qubit_manager.py +10 -8
- cirq/ops/greedy_qubit_manager_test.py +5 -3
- cirq/ops/identity.py +14 -12
- cirq/ops/identity_test.py +24 -20
- cirq/ops/kraus_channel.py +11 -8
- cirq/ops/kraus_channel_test.py +14 -11
- cirq/ops/linear_combinations.py +65 -77
- cirq/ops/linear_combinations_test.py +14 -9
- cirq/ops/matrix_gates.py +21 -18
- cirq/ops/matrix_gates_test.py +16 -0
- cirq/ops/measure_util.py +15 -20
- cirq/ops/measure_util_test.py +2 -0
- cirq/ops/measurement_gate.py +26 -37
- cirq/ops/measurement_gate_test.py +2 -0
- cirq/ops/mixed_unitary_channel.py +12 -9
- cirq/ops/mixed_unitary_channel_test.py +14 -11
- cirq/ops/named_qubit.py +16 -13
- cirq/ops/named_qubit_test.py +15 -13
- cirq/ops/op_tree.py +9 -7
- cirq/ops/op_tree_test.py +22 -19
- cirq/ops/parallel_gate.py +15 -17
- cirq/ops/parallel_gate_test.py +18 -16
- cirq/ops/parity_gates.py +23 -25
- cirq/ops/parity_gates_test.py +36 -32
- cirq/ops/pauli_gates.py +22 -21
- cirq/ops/pauli_gates_test.py +29 -20
- cirq/ops/pauli_interaction_gate.py +15 -19
- cirq/ops/pauli_interaction_gate_test.py +10 -8
- cirq/ops/pauli_measurement_gate.py +23 -35
- cirq/ops/pauli_measurement_gate_test.py +2 -0
- cirq/ops/pauli_string.py +92 -120
- cirq/ops/pauli_string_phasor.py +52 -45
- cirq/ops/pauli_string_phasor_test.py +4 -5
- cirq/ops/pauli_string_raw_types.py +9 -7
- cirq/ops/pauli_string_raw_types_test.py +2 -0
- cirq/ops/pauli_string_test.py +31 -154
- cirq/ops/pauli_sum_exponential.py +12 -12
- cirq/ops/pauli_sum_exponential_test.py +12 -10
- cirq/ops/permutation_gate.py +8 -6
- cirq/ops/permutation_gate_test.py +10 -8
- cirq/ops/phased_iswap_gate.py +16 -16
- cirq/ops/phased_iswap_gate_test.py +17 -15
- cirq/ops/phased_x_gate.py +16 -17
- cirq/ops/phased_x_gate_test.py +18 -16
- cirq/ops/phased_x_z_gate.py +24 -22
- cirq/ops/phased_x_z_gate_test.py +17 -11
- cirq/ops/projector.py +16 -11
- cirq/ops/projector_test.py +19 -16
- cirq/ops/qid_util.py +7 -5
- cirq/ops/qid_util_test.py +2 -0
- cirq/ops/qubit_manager.py +11 -9
- cirq/ops/qubit_manager_test.py +6 -4
- cirq/ops/qubit_order.py +11 -14
- cirq/ops/qubit_order_or_list.py +4 -2
- cirq/ops/qubit_order_test.py +12 -10
- cirq/ops/random_gate_channel.py +12 -10
- cirq/ops/random_gate_channel_test.py +14 -11
- cirq/ops/raw_types.py +109 -129
- cirq/ops/raw_types_test.py +63 -57
- cirq/ops/state_preparation_channel.py +7 -7
- cirq/ops/state_preparation_channel_test.py +11 -9
- cirq/ops/swap_gates.py +13 -15
- cirq/ops/swap_gates_test.py +19 -17
- cirq/ops/tags.py +5 -3
- cirq/ops/tags_test.py +4 -2
- cirq/ops/three_qubit_gates.py +43 -76
- cirq/ops/three_qubit_gates_test.py +19 -17
- cirq/ops/two_qubit_diagonal_gate.py +13 -13
- cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
- cirq/ops/uniform_superposition_gate.py +5 -3
- cirq/ops/uniform_superposition_gate_test.py +5 -3
- cirq/ops/wait_gate.py +17 -14
- cirq/ops/wait_gate_test.py +9 -6
- cirq/protocols/__init__.py +0 -3
- cirq/protocols/act_on_protocol.py +8 -6
- cirq/protocols/act_on_protocol_test.py +15 -12
- cirq/protocols/apply_channel_protocol.py +10 -14
- cirq/protocols/apply_channel_protocol_test.py +2 -0
- cirq/protocols/apply_mixture_protocol.py +13 -42
- cirq/protocols/apply_mixture_protocol_test.py +7 -5
- cirq/protocols/apply_unitary_protocol.py +39 -34
- cirq/protocols/apply_unitary_protocol_test.py +4 -1
- cirq/protocols/approximate_equality_protocol.py +2 -0
- cirq/protocols/approximate_equality_protocol_test.py +2 -0
- cirq/protocols/circuit_diagram_info_protocol.py +58 -42
- cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
- cirq/protocols/commutes_protocol.py +8 -7
- cirq/protocols/commutes_protocol_test.py +2 -0
- cirq/protocols/control_key_protocol.py +6 -4
- cirq/protocols/control_key_protocol_test.py +3 -1
- cirq/protocols/decompose_protocol.py +49 -48
- cirq/protocols/decompose_protocol_test.py +27 -16
- cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
- cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
- cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
- cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
- cirq/protocols/has_unitary_protocol.py +10 -6
- cirq/protocols/has_unitary_protocol_test.py +13 -8
- cirq/protocols/hash_from_pickle_test.py +2 -11
- cirq/protocols/inverse_protocol.py +13 -16
- cirq/protocols/inverse_protocol_test.py +5 -3
- cirq/protocols/json_serialization.py +35 -54
- cirq/protocols/json_serialization_test.py +14 -21
- cirq/protocols/json_test_data/CXSWAP.json +46 -0
- cirq/protocols/json_test_data/CXSWAP.repr +13 -0
- cirq/protocols/json_test_data/CZSWAP.json +46 -0
- cirq/protocols/json_test_data/CZSWAP.repr +13 -0
- cirq/protocols/json_test_data/CircuitOperation.json +6 -3
- cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
- cirq/protocols/json_test_data/Moment.json +24 -1
- cirq/protocols/json_test_data/Moment.repr +6 -1
- cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
- cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
- cirq/protocols/json_test_data/spec.py +6 -2
- cirq/protocols/kraus_protocol.py +47 -7
- cirq/protocols/kraus_protocol_test.py +86 -12
- cirq/protocols/measurement_key_protocol.py +15 -16
- cirq/protocols/measurement_key_protocol_test.py +13 -11
- cirq/protocols/mixture_protocol.py +7 -5
- cirq/protocols/mixture_protocol_test.py +4 -2
- cirq/protocols/mul_protocol.py +2 -3
- cirq/protocols/mul_protocol_test.py +2 -0
- cirq/protocols/pauli_expansion_protocol.py +6 -3
- cirq/protocols/pauli_expansion_protocol_test.py +5 -3
- cirq/protocols/phase_protocol.py +2 -0
- cirq/protocols/phase_protocol_test.py +3 -1
- cirq/protocols/pow_protocol.py +11 -16
- cirq/protocols/pow_protocol_test.py +2 -0
- cirq/protocols/qasm.py +14 -20
- cirq/protocols/qasm_test.py +6 -3
- cirq/protocols/qid_shape_protocol.py +8 -8
- cirq/protocols/qid_shape_protocol_test.py +3 -1
- cirq/protocols/resolve_parameters.py +5 -3
- cirq/protocols/resolve_parameters_test.py +8 -7
- cirq/protocols/trace_distance_bound.py +6 -4
- cirq/protocols/trace_distance_bound_test.py +3 -1
- cirq/protocols/unitary_protocol.py +17 -7
- cirq/protocols/unitary_protocol_test.py +12 -2
- cirq/qis/channels.py +6 -2
- cirq/qis/channels_test.py +20 -16
- cirq/qis/clifford_tableau.py +21 -19
- cirq/qis/clifford_tableau_test.py +2 -2
- cirq/qis/entropy.py +14 -3
- cirq/qis/entropy_test.py +3 -1
- cirq/qis/measures.py +13 -13
- cirq/qis/measures_test.py +20 -14
- cirq/qis/noise_utils.py +2 -0
- cirq/qis/noise_utils_test.py +9 -7
- cirq/qis/quantum_state_representation.py +7 -8
- cirq/qis/states.py +58 -56
- cirq/qis/states_test.py +2 -0
- cirq/sim/classical_simulator.py +23 -22
- cirq/sim/classical_simulator_test.py +2 -0
- cirq/sim/clifford/clifford_simulator.py +23 -21
- cirq/sim/clifford/clifford_simulator_test.py +7 -4
- cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
- cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
- cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
- cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
- cirq/sim/clifford/stabilizer_sampler.py +9 -7
- cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
- cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
- cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
- cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
- cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
- cirq/sim/density_matrix_simulation_state.py +26 -27
- cirq/sim/density_matrix_simulation_state_test.py +10 -8
- cirq/sim/density_matrix_simulator.py +30 -28
- cirq/sim/density_matrix_simulator_test.py +48 -48
- cirq/sim/density_matrix_utils.py +13 -11
- cirq/sim/density_matrix_utils_test.py +38 -36
- cirq/sim/mux.py +33 -31
- cirq/sim/mux_test.py +3 -0
- cirq/sim/simulation_product_state.py +15 -15
- cirq/sim/simulation_product_state_test.py +29 -26
- cirq/sim/simulation_state.py +29 -38
- cirq/sim/simulation_state_base.py +21 -32
- cirq/sim/simulation_state_test.py +15 -13
- cirq/sim/simulation_utils.py +5 -2
- cirq/sim/simulation_utils_test.py +5 -2
- cirq/sim/simulator.py +90 -106
- cirq/sim/simulator_base.py +33 -45
- cirq/sim/simulator_base_test.py +20 -15
- cirq/sim/simulator_test.py +23 -14
- cirq/sim/sparse_simulator.py +19 -17
- cirq/sim/sparse_simulator_test.py +41 -40
- cirq/sim/state_vector.py +15 -12
- cirq/sim/state_vector_simulation_state.py +31 -31
- cirq/sim/state_vector_simulation_state_test.py +16 -14
- cirq/sim/state_vector_simulator.py +17 -14
- cirq/sim/state_vector_simulator_test.py +2 -0
- cirq/sim/state_vector_test.py +6 -3
- cirq/study/flatten_expressions.py +16 -15
- cirq/study/flatten_expressions_test.py +13 -11
- cirq/study/resolver.py +18 -17
- cirq/study/resolver_test.py +22 -20
- cirq/study/result.py +17 -27
- cirq/study/result_test.py +2 -0
- cirq/study/sweepable.py +12 -10
- cirq/study/sweepable_test.py +3 -0
- cirq/study/sweeps.py +42 -61
- cirq/study/sweeps_test.py +33 -0
- cirq/testing/__init__.py +7 -11
- cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
- cirq/testing/circuit_compare.py +8 -17
- cirq/testing/circuit_compare_test.py +2 -0
- cirq/testing/consistent_act_on.py +13 -11
- cirq/testing/consistent_act_on_test.py +5 -3
- cirq/testing/consistent_channels.py +2 -0
- cirq/testing/consistent_channels_test.py +10 -8
- cirq/testing/consistent_controlled_gate_op.py +5 -5
- cirq/testing/consistent_controlled_gate_op_test.py +18 -18
- cirq/testing/consistent_decomposition.py +2 -2
- cirq/testing/consistent_decomposition_test.py +4 -2
- cirq/testing/consistent_pauli_expansion.py +2 -0
- cirq/testing/consistent_pauli_expansion_test.py +3 -1
- cirq/testing/consistent_phase_by.py +2 -0
- cirq/testing/consistent_phase_by_test.py +3 -1
- cirq/testing/consistent_protocols.py +14 -20
- cirq/testing/consistent_protocols_test.py +13 -11
- cirq/testing/consistent_qasm.py +6 -4
- cirq/testing/consistent_qasm_test.py +7 -7
- cirq/testing/consistent_resolve_parameters.py +2 -0
- cirq/testing/consistent_specified_has_unitary.py +2 -2
- cirq/testing/consistent_specified_has_unitary_test.py +6 -4
- cirq/testing/consistent_unitary.py +1 -0
- cirq/testing/consistent_unitary_test.py +4 -2
- cirq/testing/deprecation.py +5 -2
- cirq/testing/deprecation_test.py +5 -2
- cirq/testing/devices.py +7 -4
- cirq/testing/devices_test.py +7 -4
- cirq/testing/equals_tester.py +4 -2
- cirq/testing/equals_tester_test.py +21 -17
- cirq/testing/equivalent_basis_map.py +6 -4
- cirq/testing/equivalent_basis_map_test.py +6 -4
- cirq/testing/equivalent_repr_eval.py +6 -4
- cirq/testing/equivalent_repr_eval_test.py +5 -3
- cirq/testing/gate_features.py +2 -0
- cirq/testing/gate_features_test.py +7 -5
- cirq/testing/json.py +19 -15
- cirq/testing/json_test.py +5 -3
- cirq/testing/lin_alg_utils.py +10 -11
- cirq/testing/lin_alg_utils_test.py +14 -12
- cirq/testing/logs.py +7 -6
- cirq/testing/logs_test.py +9 -7
- cirq/testing/no_identifier_qubit.py +4 -2
- cirq/testing/no_identifier_qubit_test.py +5 -3
- cirq/testing/op_tree.py +2 -0
- cirq/testing/op_tree_test.py +4 -1
- cirq/testing/order_tester.py +2 -0
- cirq/testing/order_tester_test.py +8 -6
- cirq/testing/pytest_utils.py +2 -0
- cirq/testing/pytest_utils_test.py +4 -2
- cirq/testing/random_circuit.py +21 -20
- cirq/testing/random_circuit_test.py +12 -9
- cirq/testing/repr_pretty_tester.py +1 -0
- cirq/testing/repr_pretty_tester_test.py +5 -3
- cirq/testing/routing_devices.py +4 -1
- cirq/testing/routing_devices_test.py +9 -6
- cirq/testing/sample_circuits.py +4 -1
- cirq/testing/sample_circuits_test.py +3 -1
- cirq/testing/sample_gates.py +3 -0
- cirq/testing/sample_gates_test.py +5 -2
- cirq/transformers/__init__.py +11 -4
- cirq/transformers/align.py +9 -7
- cirq/transformers/align_test.py +2 -0
- cirq/transformers/analytical_decompositions/__init__.py +3 -6
- cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
- cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
- cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
- cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
- cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
- cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
- cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
- cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
- cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
- cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
- cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
- cirq/transformers/drop_empty_moments.py +5 -3
- cirq/transformers/drop_empty_moments_test.py +4 -2
- cirq/transformers/drop_negligible_operations.py +7 -5
- cirq/transformers/drop_negligible_operations_test.py +2 -0
- cirq/transformers/dynamical_decoupling.py +49 -42
- cirq/transformers/dynamical_decoupling_test.py +223 -205
- cirq/transformers/eject_phased_paulis.py +28 -26
- cirq/transformers/eject_phased_paulis_test.py +12 -9
- cirq/transformers/eject_z.py +12 -12
- cirq/transformers/eject_z_test.py +2 -2
- cirq/transformers/expand_composite.py +6 -4
- cirq/transformers/expand_composite_test.py +3 -1
- cirq/transformers/gauge_compiling/__init__.py +3 -1
- cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
- cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
- cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
- cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
- cirq/transformers/insertion_sort.py +8 -6
- cirq/transformers/insertion_sort_test.py +3 -1
- cirq/transformers/measurement_transformers.py +29 -29
- cirq/transformers/measurement_transformers_test.py +2 -0
- cirq/transformers/merge_k_qubit_gates.py +12 -10
- cirq/transformers/merge_k_qubit_gates_test.py +18 -18
- cirq/transformers/merge_single_qubit_gates.py +197 -20
- cirq/transformers/merge_single_qubit_gates_test.py +177 -5
- cirq/transformers/noise_adding.py +5 -3
- cirq/transformers/noise_adding_test.py +2 -0
- cirq/transformers/optimize_for_target_gateset.py +19 -17
- cirq/transformers/optimize_for_target_gateset_test.py +11 -8
- cirq/transformers/qubit_management_transformers.py +13 -11
- cirq/transformers/qubit_management_transformers_test.py +5 -3
- cirq/transformers/randomized_measurements.py +16 -14
- cirq/transformers/randomized_measurements_test.py +10 -4
- cirq/transformers/routing/initial_mapper.py +6 -4
- cirq/transformers/routing/initial_mapper_test.py +2 -0
- cirq/transformers/routing/line_initial_mapper.py +16 -14
- cirq/transformers/routing/line_initial_mapper_test.py +9 -7
- cirq/transformers/routing/mapping_manager.py +10 -10
- cirq/transformers/routing/mapping_manager_test.py +2 -0
- cirq/transformers/routing/route_circuit_cqc.py +33 -31
- cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
- cirq/transformers/routing/visualize_routed_circuit.py +8 -7
- cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
- cirq/transformers/stratify.py +17 -15
- cirq/transformers/stratify_test.py +3 -0
- cirq/transformers/symbolize.py +103 -0
- cirq/transformers/symbolize_test.py +62 -0
- cirq/transformers/synchronize_terminal_measurements.py +10 -10
- cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
- cirq/transformers/tag_transformers.py +97 -0
- cirq/transformers/tag_transformers_test.py +103 -0
- cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
- cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
- cirq/transformers/target_gatesets/cz_gateset.py +7 -5
- cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
- cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
- cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
- cirq/transformers/transformer_api.py +34 -47
- cirq/transformers/transformer_api_test.py +9 -8
- cirq/transformers/transformer_primitives.py +39 -49
- cirq/transformers/transformer_primitives_test.py +10 -17
- cirq/value/abc_alt.py +6 -4
- cirq/value/abc_alt_test.py +5 -3
- cirq/value/angle.py +11 -12
- cirq/value/angle_test.py +5 -3
- cirq/value/classical_data.py +27 -27
- cirq/value/classical_data_test.py +11 -8
- cirq/value/condition.py +26 -24
- cirq/value/condition_test.py +2 -0
- cirq/value/digits.py +14 -11
- cirq/value/digits_test.py +2 -0
- cirq/value/duration.py +23 -20
- cirq/value/duration_test.py +2 -0
- cirq/value/linear_dict.py +25 -30
- cirq/value/linear_dict_test.py +10 -8
- cirq/value/measurement_key.py +12 -12
- cirq/value/measurement_key_test.py +2 -0
- cirq/value/periodic_value.py +4 -4
- cirq/value/periodic_value_test.py +11 -7
- cirq/value/probability.py +3 -1
- cirq/value/probability_test.py +4 -2
- cirq/value/product_state.py +15 -13
- cirq/value/product_state_test.py +4 -1
- cirq/value/random_state.py +2 -0
- cirq/value/random_state_test.py +5 -3
- cirq/value/timestamp.py +11 -7
- cirq/value/timestamp_test.py +14 -12
- cirq/value/type_alias.py +4 -4
- cirq/value/value_equality_attr.py +8 -9
- cirq/value/value_equality_attr_test.py +14 -11
- cirq/vis/density_matrix.py +3 -3
- cirq/vis/density_matrix_test.py +20 -17
- cirq/vis/heatmap.py +24 -37
- cirq/vis/heatmap_test.py +3 -0
- cirq/vis/histogram.py +9 -6
- cirq/vis/histogram_test.py +5 -2
- cirq/vis/state_histogram.py +10 -8
- cirq/vis/state_histogram_test.py +7 -5
- cirq/vis/vis_utils.py +4 -1
- cirq/vis/vis_utils_test.py +4 -1
- cirq/work/collector.py +12 -18
- cirq/work/collector_test.py +15 -10
- cirq/work/observable_grouping.py +6 -7
- cirq/work/observable_grouping_test.py +10 -9
- cirq/work/observable_measurement.py +47 -45
- cirq/work/observable_measurement_data.py +22 -17
- cirq/work/observable_measurement_data_test.py +4 -1
- cirq/work/observable_measurement_test.py +48 -29
- cirq/work/observable_readout_calibration.py +5 -2
- cirq/work/observable_readout_calibration_test.py +5 -2
- cirq/work/observable_settings.py +13 -22
- cirq/work/observable_settings_test.py +9 -7
- cirq/work/pauli_sum_collector.py +12 -10
- cirq/work/pauli_sum_collector_test.py +9 -9
- cirq/work/sampler.py +42 -43
- cirq/work/sampler_test.py +31 -24
- cirq/work/zeros_sampler.py +6 -4
- cirq/work/zeros_sampler_test.py +7 -5
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
- cirq_core-1.6.0.dist-info/RECORD +1241 -0
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
- cirq_core-1.5.0.dev20250409225226.dist-info/RECORD +0 -1216
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
cirq/ops/dense_pauli_string.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 abc
|
|
16
18
|
import numbers
|
|
17
19
|
from types import NotImplementedType
|
|
@@ -20,16 +22,11 @@ from typing import (
|
|
|
20
22
|
Any,
|
|
21
23
|
Callable,
|
|
22
24
|
cast,
|
|
23
|
-
Dict,
|
|
24
25
|
Iterable,
|
|
25
26
|
Iterator,
|
|
26
|
-
List,
|
|
27
|
-
Optional,
|
|
28
27
|
overload,
|
|
29
28
|
Sequence,
|
|
30
|
-
Tuple,
|
|
31
29
|
TYPE_CHECKING,
|
|
32
|
-
Union,
|
|
33
30
|
)
|
|
34
31
|
|
|
35
32
|
import numpy as np
|
|
@@ -45,7 +42,7 @@ if TYPE_CHECKING:
|
|
|
45
42
|
|
|
46
43
|
# Order is important! Index equals numeric value.
|
|
47
44
|
PAULI_CHARS = 'IXYZ'
|
|
48
|
-
PAULI_GATES:
|
|
45
|
+
PAULI_GATES: list[cirq.Pauli | cirq.IdentityGate] = [
|
|
49
46
|
identity.I,
|
|
50
47
|
pauli_gates.X,
|
|
51
48
|
pauli_gates.Y,
|
|
@@ -84,9 +81,9 @@ class BaseDensePauliString(raw_types.Gate, metaclass=abc.ABCMeta):
|
|
|
84
81
|
|
|
85
82
|
def __init__(
|
|
86
83
|
self,
|
|
87
|
-
pauli_mask:
|
|
84
|
+
pauli_mask: Iterable[cirq.PAULI_GATE_LIKE] | np.ndarray,
|
|
88
85
|
*,
|
|
89
|
-
coefficient:
|
|
86
|
+
coefficient: cirq.TParamValComplex = 1,
|
|
90
87
|
):
|
|
91
88
|
"""Initializes a new dense pauli string.
|
|
92
89
|
|
|
@@ -103,7 +100,7 @@ class BaseDensePauliString(raw_types.Gate, metaclass=abc.ABCMeta):
|
|
|
103
100
|
values are supported.
|
|
104
101
|
"""
|
|
105
102
|
self._pauli_mask = _as_pauli_mask(pauli_mask)
|
|
106
|
-
self._coefficient:
|
|
103
|
+
self._coefficient: complex | sympy.Expr = (
|
|
107
104
|
coefficient if isinstance(coefficient, sympy.Expr) else complex(coefficient)
|
|
108
105
|
)
|
|
109
106
|
if type(self) != MutableDensePauliString:
|
|
@@ -116,11 +113,11 @@ class BaseDensePauliString(raw_types.Gate, metaclass=abc.ABCMeta):
|
|
|
116
113
|
return self._pauli_mask
|
|
117
114
|
|
|
118
115
|
@property
|
|
119
|
-
def coefficient(self) ->
|
|
116
|
+
def coefficient(self) -> cirq.TParamValComplex:
|
|
120
117
|
"""A complex coefficient or symbol."""
|
|
121
118
|
return self._coefficient
|
|
122
119
|
|
|
123
|
-
def _json_dict_(self) ->
|
|
120
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
124
121
|
return protocols.obj_to_dict_helper(self, ['pauli_mask', 'coefficient'])
|
|
125
122
|
|
|
126
123
|
def _value_equality_values_(self):
|
|
@@ -129,7 +126,7 @@ class BaseDensePauliString(raw_types.Gate, metaclass=abc.ABCMeta):
|
|
|
129
126
|
return self.coefficient, tuple(PAULI_CHARS[p] for p in self.pauli_mask)
|
|
130
127
|
|
|
131
128
|
@classmethod
|
|
132
|
-
def one_hot(cls, *, index: int, length: int, pauli:
|
|
129
|
+
def one_hot(cls, *, index: int, length: int, pauli: cirq.PAULI_GATE_LIKE) -> Self:
|
|
133
130
|
"""Creates a dense pauli string with only one non-identity Pauli.
|
|
134
131
|
|
|
135
132
|
Args:
|
|
@@ -163,14 +160,14 @@ class BaseDensePauliString(raw_types.Gate, metaclass=abc.ABCMeta):
|
|
|
163
160
|
return False
|
|
164
161
|
return abs(1 - abs(cast(complex, self.coefficient))) < 1e-8
|
|
165
162
|
|
|
166
|
-
def _unitary_(self) ->
|
|
163
|
+
def _unitary_(self) -> np.ndarray | NotImplementedType:
|
|
167
164
|
if not self._has_unitary_():
|
|
168
165
|
return NotImplemented
|
|
169
166
|
return self.coefficient * linalg.kron(
|
|
170
167
|
*[protocols.unitary(PAULI_GATES[p]) for p in self.pauli_mask]
|
|
171
168
|
)
|
|
172
169
|
|
|
173
|
-
def _apply_unitary_(self, args) ->
|
|
170
|
+
def _apply_unitary_(self, args) -> np.ndarray | None | NotImplementedType:
|
|
174
171
|
if not self._has_unitary_():
|
|
175
172
|
return NotImplemented
|
|
176
173
|
from cirq import devices
|
|
@@ -179,9 +176,7 @@ class BaseDensePauliString(raw_types.Gate, metaclass=abc.ABCMeta):
|
|
|
179
176
|
decomposed_ops = cast(Iterable['cirq.OP_TREE'], self._decompose_(qubits))
|
|
180
177
|
return protocols.apply_unitaries(decomposed_ops, qubits, args)
|
|
181
178
|
|
|
182
|
-
def _decompose_(
|
|
183
|
-
self, qubits: Sequence['cirq.Qid']
|
|
184
|
-
) -> Union[NotImplementedType, 'cirq.OP_TREE']:
|
|
179
|
+
def _decompose_(self, qubits: Sequence[cirq.Qid]) -> NotImplementedType | cirq.OP_TREE:
|
|
185
180
|
if not self._has_unitary_():
|
|
186
181
|
return NotImplemented
|
|
187
182
|
result = [PAULI_GATES[p].on(q) for p, q in zip(self.pauli_mask, qubits) if p]
|
|
@@ -195,7 +190,7 @@ class BaseDensePauliString(raw_types.Gate, metaclass=abc.ABCMeta):
|
|
|
195
190
|
def _parameter_names_(self) -> AbstractSet[str]:
|
|
196
191
|
return protocols.parameter_names(self.coefficient)
|
|
197
192
|
|
|
198
|
-
def _resolve_parameters_(self, resolver:
|
|
193
|
+
def _resolve_parameters_(self, resolver: cirq.ParamResolver, recursive: bool) -> Self:
|
|
199
194
|
return self.copy(
|
|
200
195
|
coefficient=protocols.resolve_parameters(self.coefficient, resolver, recursive)
|
|
201
196
|
)
|
|
@@ -203,7 +198,7 @@ class BaseDensePauliString(raw_types.Gate, metaclass=abc.ABCMeta):
|
|
|
203
198
|
def __pos__(self):
|
|
204
199
|
return self
|
|
205
200
|
|
|
206
|
-
def __pow__(self, power: float) ->
|
|
201
|
+
def __pow__(self, power: float) -> NotImplementedType | Self:
|
|
207
202
|
concrete_class = type(self)
|
|
208
203
|
if isinstance(power, int):
|
|
209
204
|
i_group = [1, +1j, -1, -1j]
|
|
@@ -218,7 +213,7 @@ class BaseDensePauliString(raw_types.Gate, metaclass=abc.ABCMeta):
|
|
|
218
213
|
return NotImplemented
|
|
219
214
|
|
|
220
215
|
@overload
|
|
221
|
-
def __getitem__(self, item: int) ->
|
|
216
|
+
def __getitem__(self, item: int) -> cirq.Pauli | cirq.IdentityGate:
|
|
222
217
|
pass
|
|
223
218
|
|
|
224
219
|
@overload
|
|
@@ -234,7 +229,7 @@ class BaseDensePauliString(raw_types.Gate, metaclass=abc.ABCMeta):
|
|
|
234
229
|
|
|
235
230
|
raise TypeError(f'indices must be integers or slices, not {type(item)}')
|
|
236
231
|
|
|
237
|
-
def __iter__(self) -> Iterator[
|
|
232
|
+
def __iter__(self) -> Iterator[cirq.Pauli | cirq.IdentityGate]:
|
|
238
233
|
for i in range(len(self)):
|
|
239
234
|
yield self[i]
|
|
240
235
|
|
|
@@ -301,7 +296,7 @@ class BaseDensePauliString(raw_types.Gate, metaclass=abc.ABCMeta):
|
|
|
301
296
|
|
|
302
297
|
return NotImplemented
|
|
303
298
|
|
|
304
|
-
def tensor_product(self, other:
|
|
299
|
+
def tensor_product(self, other: BaseDensePauliString) -> Self:
|
|
305
300
|
"""Concatenates dense pauli strings and multiplies their coefficients.
|
|
306
301
|
|
|
307
302
|
Args:
|
|
@@ -323,10 +318,10 @@ class BaseDensePauliString(raw_types.Gate, metaclass=abc.ABCMeta):
|
|
|
323
318
|
pauli_mask=self.pauli_mask,
|
|
324
319
|
)
|
|
325
320
|
|
|
326
|
-
def on(self, *qubits:
|
|
321
|
+
def on(self, *qubits: cirq.Qid) -> cirq.PauliString:
|
|
327
322
|
return self.sparse(qubits)
|
|
328
323
|
|
|
329
|
-
def sparse(self, qubits:
|
|
324
|
+
def sparse(self, qubits: Sequence[cirq.Qid] | None = None) -> cirq.PauliString:
|
|
330
325
|
"""A `cirq.PauliString` version of this dense pauli string.
|
|
331
326
|
|
|
332
327
|
Args:
|
|
@@ -373,9 +368,7 @@ class BaseDensePauliString(raw_types.Gate, metaclass=abc.ABCMeta):
|
|
|
373
368
|
f'coefficient={proper_repr(self.coefficient)})'
|
|
374
369
|
)
|
|
375
370
|
|
|
376
|
-
def _commutes_(
|
|
377
|
-
self, other: Any, *, atol: float = 1e-8
|
|
378
|
-
) -> Union[bool, NotImplementedType, None]:
|
|
371
|
+
def _commutes_(self, other: Any, *, atol: float = 1e-8) -> bool | NotImplementedType | None:
|
|
379
372
|
if isinstance(other, BaseDensePauliString):
|
|
380
373
|
n = min(len(self.pauli_mask), len(other.pauli_mask))
|
|
381
374
|
phase = _vectorized_pauli_mul_phase(self.pauli_mask[:n], other.pauli_mask[:n])
|
|
@@ -390,11 +383,11 @@ class BaseDensePauliString(raw_types.Gate, metaclass=abc.ABCMeta):
|
|
|
390
383
|
|
|
391
384
|
return NotImplemented
|
|
392
385
|
|
|
393
|
-
def frozen(self) ->
|
|
386
|
+
def frozen(self) -> DensePauliString:
|
|
394
387
|
"""A `cirq.DensePauliString` with the same contents."""
|
|
395
388
|
return DensePauliString(coefficient=self.coefficient, pauli_mask=self.pauli_mask)
|
|
396
389
|
|
|
397
|
-
def mutable_copy(self) ->
|
|
390
|
+
def mutable_copy(self) -> MutableDensePauliString:
|
|
398
391
|
"""A `cirq.MutableDensePauliString` with the same contents."""
|
|
399
392
|
return MutableDensePauliString(
|
|
400
393
|
coefficient=self.coefficient, pauli_mask=np.copy(self.pauli_mask)
|
|
@@ -403,8 +396,8 @@ class BaseDensePauliString(raw_types.Gate, metaclass=abc.ABCMeta):
|
|
|
403
396
|
@abc.abstractmethod
|
|
404
397
|
def copy(
|
|
405
398
|
self,
|
|
406
|
-
coefficient:
|
|
407
|
-
pauli_mask:
|
|
399
|
+
coefficient: cirq.TParamValComplex | None = None,
|
|
400
|
+
pauli_mask: None | str | Iterable[int] | np.ndarray = None,
|
|
408
401
|
) -> Self:
|
|
409
402
|
"""Returns a copy with possibly modified contents.
|
|
410
403
|
|
|
@@ -454,14 +447,14 @@ class DensePauliString(BaseDensePauliString):
|
|
|
454
447
|
dense pauli strings, see `cirq.MutableDensePauliString`.
|
|
455
448
|
"""
|
|
456
449
|
|
|
457
|
-
def frozen(self) ->
|
|
450
|
+
def frozen(self) -> DensePauliString:
|
|
458
451
|
return self
|
|
459
452
|
|
|
460
453
|
def copy(
|
|
461
454
|
self,
|
|
462
|
-
coefficient:
|
|
463
|
-
pauli_mask:
|
|
464
|
-
) ->
|
|
455
|
+
coefficient: cirq.TParamValComplex | None = None,
|
|
456
|
+
pauli_mask: None | str | Iterable[int] | np.ndarray = None,
|
|
457
|
+
) -> DensePauliString:
|
|
465
458
|
if pauli_mask is None and (coefficient is None or coefficient == self.coefficient):
|
|
466
459
|
return self
|
|
467
460
|
return DensePauliString(
|
|
@@ -489,14 +482,12 @@ class MutableDensePauliString(BaseDensePauliString):
|
|
|
489
482
|
"""
|
|
490
483
|
|
|
491
484
|
@overload
|
|
492
|
-
def __setitem__(self, key: int, value:
|
|
485
|
+
def __setitem__(self, key: int, value: cirq.PAULI_GATE_LIKE) -> Self:
|
|
493
486
|
pass
|
|
494
487
|
|
|
495
488
|
@overload
|
|
496
489
|
def __setitem__(
|
|
497
|
-
self,
|
|
498
|
-
key: slice,
|
|
499
|
-
value: Union[Iterable['cirq.PAULI_GATE_LIKE'], np.ndarray, BaseDensePauliString],
|
|
490
|
+
self, key: slice, value: Iterable[cirq.PAULI_GATE_LIKE] | np.ndarray | BaseDensePauliString
|
|
500
491
|
) -> Self:
|
|
501
492
|
pass
|
|
502
493
|
|
|
@@ -559,9 +550,9 @@ class MutableDensePauliString(BaseDensePauliString):
|
|
|
559
550
|
|
|
560
551
|
def copy(
|
|
561
552
|
self,
|
|
562
|
-
coefficient:
|
|
563
|
-
pauli_mask:
|
|
564
|
-
) ->
|
|
553
|
+
coefficient: cirq.TParamValComplex | None = None,
|
|
554
|
+
pauli_mask: None | str | Iterable[int] | np.ndarray = None,
|
|
555
|
+
) -> MutableDensePauliString:
|
|
565
556
|
return MutableDensePauliString(
|
|
566
557
|
coefficient=self.coefficient if coefficient is None else coefficient,
|
|
567
558
|
pauli_mask=np.copy(self.pauli_mask) if pauli_mask is None else pauli_mask,
|
|
@@ -574,7 +565,7 @@ class MutableDensePauliString(BaseDensePauliString):
|
|
|
574
565
|
return self.coefficient, tuple(PAULI_CHARS[p] for p in self.pauli_mask)
|
|
575
566
|
|
|
576
567
|
@classmethod
|
|
577
|
-
def inline_gaussian_elimination(cls, rows:
|
|
568
|
+
def inline_gaussian_elimination(cls, rows: list[MutableDensePauliString]) -> None:
|
|
578
569
|
if not rows:
|
|
579
570
|
return
|
|
580
571
|
|
|
@@ -605,7 +596,7 @@ class MutableDensePauliString(BaseDensePauliString):
|
|
|
605
596
|
next_row += 1
|
|
606
597
|
|
|
607
598
|
|
|
608
|
-
def _pauli_index(val:
|
|
599
|
+
def _pauli_index(val: cirq.PAULI_GATE_LIKE) -> int:
|
|
609
600
|
m = pauli_string.PAULI_GATE_LIKE_TO_INDEX_MAP
|
|
610
601
|
if val not in m:
|
|
611
602
|
raise TypeError(
|
|
@@ -616,13 +607,13 @@ def _pauli_index(val: 'cirq.PAULI_GATE_LIKE') -> int:
|
|
|
616
607
|
return m[val]
|
|
617
608
|
|
|
618
609
|
|
|
619
|
-
def _as_pauli_mask(val:
|
|
610
|
+
def _as_pauli_mask(val: Iterable[cirq.PAULI_GATE_LIKE] | np.ndarray) -> np.ndarray:
|
|
620
611
|
if isinstance(val, np.ndarray):
|
|
621
612
|
return np.asarray(val, dtype=np.uint8)
|
|
622
613
|
return np.array([_pauli_index(v) for v in val], dtype=np.uint8)
|
|
623
614
|
|
|
624
615
|
|
|
625
|
-
def _attempt_value_to_pauli_index(v:
|
|
616
|
+
def _attempt_value_to_pauli_index(v: cirq.Operation) -> tuple[int, int] | None:
|
|
626
617
|
if not isinstance(v, raw_types.Operation):
|
|
627
618
|
return None
|
|
628
619
|
|
|
@@ -641,9 +632,7 @@ def _attempt_value_to_pauli_index(v: 'cirq.Operation') -> Optional[Tuple[int, in
|
|
|
641
632
|
return pauli_string.PAULI_GATE_LIKE_TO_INDEX_MAP[v.gate], q.x
|
|
642
633
|
|
|
643
634
|
|
|
644
|
-
def _vectorized_pauli_mul_phase(
|
|
645
|
-
lhs: Union[int, np.ndarray], rhs: Union[int, np.ndarray]
|
|
646
|
-
) -> complex:
|
|
635
|
+
def _vectorized_pauli_mul_phase(lhs: int | np.ndarray, rhs: int | np.ndarray) -> complex:
|
|
647
636
|
"""Computes the leading coefficient of a pauli string multiplication.
|
|
648
637
|
|
|
649
638
|
The two inputs must have the same length. They must follow the convention
|
|
@@ -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
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
14
17
|
import numbers
|
|
15
|
-
from typing import List
|
|
16
18
|
|
|
17
19
|
import numpy as np
|
|
18
20
|
import pytest
|
|
@@ -544,7 +546,7 @@ def test_copy():
|
|
|
544
546
|
|
|
545
547
|
|
|
546
548
|
def test_gaussian_elimination():
|
|
547
|
-
def table(*rows: str) ->
|
|
549
|
+
def table(*rows: str) -> list[cirq.MutableDensePauliString]:
|
|
548
550
|
coefs = {'i': 1j, '-': -1, '+': 1}
|
|
549
551
|
return [
|
|
550
552
|
cirq.MutableDensePauliString(row[1:].replace('.', 'I'), coefficient=coefs[row[0]])
|
cirq/ops/diagonal_gate.py
CHANGED
|
@@ -18,18 +18,9 @@ The gate is used to create a (2^n)x(2^n) matrix with the diagonal elements
|
|
|
18
18
|
passed as a list.
|
|
19
19
|
"""
|
|
20
20
|
|
|
21
|
-
from
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
Dict,
|
|
25
|
-
Iterator,
|
|
26
|
-
List,
|
|
27
|
-
Optional,
|
|
28
|
-
Sequence,
|
|
29
|
-
Tuple,
|
|
30
|
-
TYPE_CHECKING,
|
|
31
|
-
Union,
|
|
32
|
-
)
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
from typing import AbstractSet, Any, Iterator, Sequence, TYPE_CHECKING
|
|
33
24
|
|
|
34
25
|
import numpy as np
|
|
35
26
|
import sympy
|
|
@@ -42,7 +33,7 @@ if TYPE_CHECKING:
|
|
|
42
33
|
import cirq
|
|
43
34
|
|
|
44
35
|
|
|
45
|
-
def _fast_walsh_hadamard_transform(a:
|
|
36
|
+
def _fast_walsh_hadamard_transform(a: tuple[Any, ...]) -> np.ndarray:
|
|
46
37
|
"""Fast Walsh–Hadamard Transform of an array."""
|
|
47
38
|
h = 1
|
|
48
39
|
a_ = np.array(a)
|
|
@@ -57,7 +48,7 @@ def _fast_walsh_hadamard_transform(a: Tuple[Any, ...]) -> np.ndarray:
|
|
|
57
48
|
return a_
|
|
58
49
|
|
|
59
50
|
|
|
60
|
-
def _gen_gray_code(n: int) -> Iterator[
|
|
51
|
+
def _gen_gray_code(n: int) -> Iterator[tuple[int, int]]:
|
|
61
52
|
"""Generate the Gray Code from 0 to 2^n-1.
|
|
62
53
|
|
|
63
54
|
Each iteration yields a two-tuple, `(gray_code, bit_flip)`. `gray_code` is the decimal
|
|
@@ -81,7 +72,7 @@ class DiagonalGate(raw_types.Gate):
|
|
|
81
72
|
all phases.
|
|
82
73
|
"""
|
|
83
74
|
|
|
84
|
-
def __init__(self, diag_angles_radians: Sequence[
|
|
75
|
+
def __init__(self, diag_angles_radians: Sequence[cirq.TParamVal]) -> None:
|
|
85
76
|
r"""A n-qubit gate with only diagonal elements.
|
|
86
77
|
|
|
87
78
|
This gate's off-diagonal elements are zero and its on-diagonal
|
|
@@ -92,10 +83,10 @@ class DiagonalGate(raw_types.Gate):
|
|
|
92
83
|
If these values are $(x_0, x_1, \ldots , x_N)$ then the unitary
|
|
93
84
|
has diagonal values $(e^{i x_0}, e^{i x_1}, \ldots, e^{i x_N})$.
|
|
94
85
|
"""
|
|
95
|
-
self._diag_angles_radians:
|
|
86
|
+
self._diag_angles_radians: tuple[cirq.TParamVal, ...] = tuple(diag_angles_radians)
|
|
96
87
|
|
|
97
88
|
@property
|
|
98
|
-
def diag_angles_radians(self) ->
|
|
89
|
+
def diag_angles_radians(self) -> tuple[cirq.TParamVal, ...]:
|
|
99
90
|
return self._diag_angles_radians
|
|
100
91
|
|
|
101
92
|
def _num_qubits_(self):
|
|
@@ -109,9 +100,7 @@ class DiagonalGate(raw_types.Gate):
|
|
|
109
100
|
name for angle in self._diag_angles_radians for name in protocols.parameter_names(angle)
|
|
110
101
|
}
|
|
111
102
|
|
|
112
|
-
def _resolve_parameters_(
|
|
113
|
-
self, resolver: 'cirq.ParamResolver', recursive: bool
|
|
114
|
-
) -> 'DiagonalGate':
|
|
103
|
+
def _resolve_parameters_(self, resolver: cirq.ParamResolver, recursive: bool) -> DiagonalGate:
|
|
115
104
|
return DiagonalGate(
|
|
116
105
|
protocols.resolve_parameters(self._diag_angles_radians, resolver, recursive)
|
|
117
106
|
)
|
|
@@ -119,12 +108,12 @@ class DiagonalGate(raw_types.Gate):
|
|
|
119
108
|
def _has_unitary_(self) -> bool:
|
|
120
109
|
return not self._is_parameterized_()
|
|
121
110
|
|
|
122
|
-
def _unitary_(self) ->
|
|
111
|
+
def _unitary_(self) -> np.ndarray | None:
|
|
123
112
|
if self._is_parameterized_():
|
|
124
113
|
return None
|
|
125
114
|
return np.diag([np.exp(1j * angle) for angle in self._diag_angles_radians])
|
|
126
115
|
|
|
127
|
-
def _apply_unitary_(self, args:
|
|
116
|
+
def _apply_unitary_(self, args: protocols.ApplyUnitaryArgs) -> np.ndarray:
|
|
128
117
|
if self._is_parameterized_():
|
|
129
118
|
return NotImplemented
|
|
130
119
|
for index, angle in enumerate(self._diag_angles_radians):
|
|
@@ -132,9 +121,7 @@ class DiagonalGate(raw_types.Gate):
|
|
|
132
121
|
args.target_tensor[subspace_index] *= np.exp(1j * angle)
|
|
133
122
|
return args.target_tensor
|
|
134
123
|
|
|
135
|
-
def _circuit_diagram_info_(
|
|
136
|
-
self, args: 'cirq.CircuitDiagramInfoArgs'
|
|
137
|
-
) -> 'cirq.CircuitDiagramInfo':
|
|
124
|
+
def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> cirq.CircuitDiagramInfo:
|
|
138
125
|
rounded_angles = np.array(self._diag_angles_radians)
|
|
139
126
|
if args.precision is not None:
|
|
140
127
|
rounded_angles = rounded_angles.round(args.precision)
|
|
@@ -150,7 +137,7 @@ class DiagonalGate(raw_types.Gate):
|
|
|
150
137
|
[diag_str] + [f"#{i}" for i in range(2, self._num_qubits_() + 1)]
|
|
151
138
|
)
|
|
152
139
|
|
|
153
|
-
def __pow__(self, exponent: Any) ->
|
|
140
|
+
def __pow__(self, exponent: Any) -> DiagonalGate:
|
|
154
141
|
if not isinstance(exponent, (int, float, sympy.Basic)):
|
|
155
142
|
return NotImplemented
|
|
156
143
|
angles = []
|
|
@@ -163,8 +150,8 @@ class DiagonalGate(raw_types.Gate):
|
|
|
163
150
|
return tuple(self._diag_angles_radians)
|
|
164
151
|
|
|
165
152
|
def _decompose_for_basis(
|
|
166
|
-
self, index: int, bit_flip: int, theta:
|
|
167
|
-
) -> Iterator[
|
|
153
|
+
self, index: int, bit_flip: int, theta: cirq.TParamVal, qubits: Sequence[cirq.Qid]
|
|
154
|
+
) -> Iterator[cirq.ZPowGate | cirq.CXPowGate]:
|
|
168
155
|
if index == 0:
|
|
169
156
|
return
|
|
170
157
|
largest_digit = self._num_qubits_() - (len(bin(index)) - 2)
|
|
@@ -175,7 +162,7 @@ class DiagonalGate(raw_types.Gate):
|
|
|
175
162
|
elif _flip_bit > largest_digit:
|
|
176
163
|
yield common_gates.CNOT(qubits[_flip_bit], qubits[largest_digit])
|
|
177
164
|
|
|
178
|
-
def _decompose_(self, qubits: Sequence[
|
|
165
|
+
def _decompose_(self, qubits: Sequence[cirq.Qid]) -> cirq.OP_TREE:
|
|
179
166
|
"""Decompose the n-qubit diagonal gates into CNOT and Rz gates.
|
|
180
167
|
|
|
181
168
|
A 3 qubits decomposition looks like
|
|
@@ -202,14 +189,14 @@ class DiagonalGate(raw_types.Gate):
|
|
|
202
189
|
# decomposed gates. On its own it is not physically observable. However, if using this
|
|
203
190
|
# diagonal gate for sub-system like controlled gate, it is no longer equivalent. Hence,
|
|
204
191
|
# we add global phase.
|
|
205
|
-
decomposed_circ:
|
|
192
|
+
decomposed_circ: list[Any] = [
|
|
206
193
|
global_phase_op.global_phase_operation(1j ** (2 * hat_angles[0] / np.pi))
|
|
207
194
|
]
|
|
208
195
|
for i, bit_flip in _gen_gray_code(n):
|
|
209
196
|
decomposed_circ.extend(self._decompose_for_basis(i, bit_flip, -hat_angles[i], qubits))
|
|
210
197
|
return decomposed_circ
|
|
211
198
|
|
|
212
|
-
def _json_dict_(self) ->
|
|
199
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
213
200
|
return protocols.obj_to_dict_helper(self, attribute_names=["diag_angles_radians"])
|
|
214
201
|
|
|
215
202
|
def __repr__(self) -> str:
|
cirq/ops/diagonal_gate_test.py
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
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
16
|
|
|
17
17
|
import numpy as np
|
|
18
18
|
import pytest
|
|
@@ -20,7 +20,7 @@ import sympy
|
|
|
20
20
|
|
|
21
21
|
import cirq
|
|
22
22
|
|
|
23
|
-
_candidate_angles:
|
|
23
|
+
_candidate_angles: list[float] = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53]
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
@pytest.mark.parametrize(
|
|
@@ -36,18 +36,18 @@ _candidate_angles: List[float] = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41
|
|
|
36
36
|
)
|
|
37
37
|
),
|
|
38
38
|
)
|
|
39
|
-
def test_consistent_protocols(gate):
|
|
39
|
+
def test_consistent_protocols(gate) -> None:
|
|
40
40
|
cirq.testing.assert_implements_consistent_protocols(gate)
|
|
41
41
|
|
|
42
42
|
|
|
43
|
-
def test_property():
|
|
43
|
+
def test_property() -> None:
|
|
44
44
|
assert cirq.DiagonalGate([2, 3, 5, 7]).diag_angles_radians == (2, 3, 5, 7)
|
|
45
45
|
|
|
46
46
|
|
|
47
47
|
@pytest.mark.parametrize('n', [1, 2, 3, 4, 5, 6, 7, 8, 9])
|
|
48
|
-
def test_decomposition_unitary(n):
|
|
48
|
+
def test_decomposition_unitary(n) -> None:
|
|
49
49
|
diagonal_angles = np.random.randn(2**n)
|
|
50
|
-
diagonal_gate = cirq.DiagonalGate(diagonal_angles)
|
|
50
|
+
diagonal_gate = cirq.DiagonalGate(list(diagonal_angles))
|
|
51
51
|
decomposed_circ = cirq.Circuit(cirq.decompose(diagonal_gate(*cirq.LineQubit.range(n))))
|
|
52
52
|
|
|
53
53
|
expected_f = [np.exp(1j * angle) for angle in diagonal_angles]
|
|
@@ -59,7 +59,7 @@ def test_decomposition_unitary(n):
|
|
|
59
59
|
|
|
60
60
|
|
|
61
61
|
@pytest.mark.parametrize('n', [1, 2, 3, 4])
|
|
62
|
-
def test_diagonal_exponent(n):
|
|
62
|
+
def test_diagonal_exponent(n) -> None:
|
|
63
63
|
diagonal_angles = _candidate_angles[: 2**n]
|
|
64
64
|
diagonal_gate = cirq.DiagonalGate(diagonal_angles)
|
|
65
65
|
|
|
@@ -72,9 +72,9 @@ def test_diagonal_exponent(n):
|
|
|
72
72
|
|
|
73
73
|
|
|
74
74
|
@pytest.mark.parametrize('n', [1, 2, 3, 4])
|
|
75
|
-
def test_decomposition_diagonal_exponent(n):
|
|
75
|
+
def test_decomposition_diagonal_exponent(n) -> None:
|
|
76
76
|
diagonal_angles = np.random.randn(2**n)
|
|
77
|
-
diagonal_gate = cirq.DiagonalGate(diagonal_angles)
|
|
77
|
+
diagonal_gate = cirq.DiagonalGate(list(diagonal_angles))
|
|
78
78
|
sqrt_diagonal_gate = diagonal_gate**0.5
|
|
79
79
|
decomposed_circ = cirq.Circuit(cirq.decompose(sqrt_diagonal_gate(*cirq.LineQubit.range(n))))
|
|
80
80
|
|
|
@@ -85,7 +85,7 @@ def test_decomposition_diagonal_exponent(n):
|
|
|
85
85
|
|
|
86
86
|
|
|
87
87
|
@pytest.mark.parametrize('n', [1, 2, 3, 4])
|
|
88
|
-
def test_decomposition_with_parameterization(n):
|
|
88
|
+
def test_decomposition_with_parameterization(n) -> None:
|
|
89
89
|
angles = sympy.symbols([f'x_{i}' for i in range(2**n)])
|
|
90
90
|
exponent = sympy.Symbol('e')
|
|
91
91
|
diagonal_gate = cirq.DiagonalGate(angles) ** exponent
|
|
@@ -104,7 +104,7 @@ def test_decomposition_with_parameterization(n):
|
|
|
104
104
|
)
|
|
105
105
|
|
|
106
106
|
|
|
107
|
-
def test_diagram():
|
|
107
|
+
def test_diagram() -> None:
|
|
108
108
|
a, b, c, d = cirq.LineQubit.range(4)
|
|
109
109
|
|
|
110
110
|
diagonal_circuit = cirq.Circuit(cirq.DiagonalGate(_candidate_angles[:16])(a, b, c, d))
|
|
@@ -145,7 +145,7 @@ def test_diagram():
|
|
|
145
145
|
|
|
146
146
|
|
|
147
147
|
@pytest.mark.parametrize('n', [1, 2, 3, 4])
|
|
148
|
-
def test_unitary(n):
|
|
148
|
+
def test_unitary(n) -> None:
|
|
149
149
|
diagonal_angles = _candidate_angles[: 2**n]
|
|
150
150
|
assert cirq.has_unitary(cirq.DiagonalGate(diagonal_angles))
|
|
151
151
|
np.testing.assert_allclose(
|
|
@@ -156,7 +156,7 @@ def test_unitary(n):
|
|
|
156
156
|
|
|
157
157
|
|
|
158
158
|
@pytest.mark.parametrize('resolve_fn', [cirq.resolve_parameters, cirq.resolve_parameters_once])
|
|
159
|
-
def test_resolve(resolve_fn):
|
|
159
|
+
def test_resolve(resolve_fn) -> None:
|
|
160
160
|
diagonal_angles = [2, 3, 5, 7, 11, 13, 17, 19]
|
|
161
161
|
diagonal_gate = cirq.DiagonalGate(diagonal_angles[:6] + [sympy.Symbol('a'), sympy.Symbol('b')])
|
|
162
162
|
assert cirq.is_parameterized(diagonal_gate)
|