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/gateset.py
CHANGED
|
@@ -14,20 +14,9 @@
|
|
|
14
14
|
|
|
15
15
|
"""Functionality for grouping and validating Cirq gates."""
|
|
16
16
|
|
|
17
|
-
from
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
cast,
|
|
21
|
-
Dict,
|
|
22
|
-
FrozenSet,
|
|
23
|
-
Hashable,
|
|
24
|
-
List,
|
|
25
|
-
Optional,
|
|
26
|
-
Sequence,
|
|
27
|
-
Type,
|
|
28
|
-
TYPE_CHECKING,
|
|
29
|
-
Union,
|
|
30
|
-
)
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
from typing import Any, Callable, cast, Hashable, Sequence, TYPE_CHECKING
|
|
31
20
|
|
|
32
21
|
from cirq import protocols, value
|
|
33
22
|
from cirq.ops import global_phase_op, op_tree, raw_types
|
|
@@ -37,8 +26,7 @@ if TYPE_CHECKING:
|
|
|
37
26
|
|
|
38
27
|
|
|
39
28
|
def _gate_str(
|
|
40
|
-
gate:
|
|
41
|
-
gettr: Callable[[Any], str] = str,
|
|
29
|
+
gate: raw_types.Gate | type[raw_types.Gate] | cirq.GateFamily, gettr: Callable[[Any], str] = str
|
|
42
30
|
) -> str:
|
|
43
31
|
return gettr(gate) if not isinstance(gate, type) else f'{gate.__module__}.{gate.__name__}'
|
|
44
32
|
|
|
@@ -112,10 +100,10 @@ class GateFamily:
|
|
|
112
100
|
|
|
113
101
|
def __init__(
|
|
114
102
|
self,
|
|
115
|
-
gate:
|
|
103
|
+
gate: type[raw_types.Gate] | raw_types.Gate,
|
|
116
104
|
*,
|
|
117
|
-
name:
|
|
118
|
-
description:
|
|
105
|
+
name: str | None = None,
|
|
106
|
+
description: str | None = None,
|
|
119
107
|
ignore_global_phase: bool = True,
|
|
120
108
|
tags_to_accept: Sequence[Hashable] = (),
|
|
121
109
|
tags_to_ignore: Sequence[Hashable] = (),
|
|
@@ -164,7 +152,7 @@ class GateFamily:
|
|
|
164
152
|
def _gate_str(self, gettr: Callable[[Any], str] = str) -> str:
|
|
165
153
|
return _gate_str(self.gate, gettr)
|
|
166
154
|
|
|
167
|
-
def _gate_json(self) ->
|
|
155
|
+
def _gate_json(self) -> raw_types.Gate | str:
|
|
168
156
|
return self.gate if not isinstance(self.gate, type) else protocols.json_cirq_type(self.gate)
|
|
169
157
|
|
|
170
158
|
def _default_name(self) -> str:
|
|
@@ -186,7 +174,7 @@ class GateFamily:
|
|
|
186
174
|
)
|
|
187
175
|
|
|
188
176
|
@property
|
|
189
|
-
def gate(self) ->
|
|
177
|
+
def gate(self) -> type[raw_types.Gate] | raw_types.Gate:
|
|
190
178
|
return self._gate
|
|
191
179
|
|
|
192
180
|
@property
|
|
@@ -198,11 +186,11 @@ class GateFamily:
|
|
|
198
186
|
return self._description
|
|
199
187
|
|
|
200
188
|
@property
|
|
201
|
-
def tags_to_accept(self) ->
|
|
189
|
+
def tags_to_accept(self) -> frozenset[Hashable]:
|
|
202
190
|
return self._tags_to_accept
|
|
203
191
|
|
|
204
192
|
@property
|
|
205
|
-
def tags_to_ignore(self) ->
|
|
193
|
+
def tags_to_ignore(self) -> frozenset[Hashable]:
|
|
206
194
|
return self._tags_to_ignore
|
|
207
195
|
|
|
208
196
|
def _predicate(self, gate: raw_types.Gate) -> bool:
|
|
@@ -225,7 +213,7 @@ class GateFamily:
|
|
|
225
213
|
)
|
|
226
214
|
return isinstance(gate, self.gate)
|
|
227
215
|
|
|
228
|
-
def __contains__(self, item:
|
|
216
|
+
def __contains__(self, item: raw_types.Gate | raw_types.Operation) -> bool:
|
|
229
217
|
if self._tags_to_accept and (
|
|
230
218
|
not isinstance(item, raw_types.Operation) or self._tags_to_accept.isdisjoint(item.tags)
|
|
231
219
|
):
|
|
@@ -268,8 +256,8 @@ class GateFamily:
|
|
|
268
256
|
self._tags_to_ignore,
|
|
269
257
|
)
|
|
270
258
|
|
|
271
|
-
def _json_dict_(self) ->
|
|
272
|
-
d:
|
|
259
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
260
|
+
d: dict[str, Any] = {
|
|
273
261
|
'gate': self._gate_json(),
|
|
274
262
|
'name': self.name,
|
|
275
263
|
'description': self.description,
|
|
@@ -291,7 +279,7 @@ class GateFamily:
|
|
|
291
279
|
tags_to_accept=(),
|
|
292
280
|
tags_to_ignore=(),
|
|
293
281
|
**kwargs,
|
|
294
|
-
) ->
|
|
282
|
+
) -> GateFamily:
|
|
295
283
|
if isinstance(gate, str):
|
|
296
284
|
gate = protocols.cirq_type_from_json(gate)
|
|
297
285
|
return cls(
|
|
@@ -319,8 +307,8 @@ class Gateset:
|
|
|
319
307
|
|
|
320
308
|
def __init__(
|
|
321
309
|
self,
|
|
322
|
-
*gates:
|
|
323
|
-
name:
|
|
310
|
+
*gates: type[raw_types.Gate] | raw_types.Gate | GateFamily,
|
|
311
|
+
name: str | None = None,
|
|
324
312
|
unroll_circuit_op: bool = True,
|
|
325
313
|
) -> None:
|
|
326
314
|
"""Init Gateset.
|
|
@@ -344,10 +332,10 @@ class Gateset:
|
|
|
344
332
|
"""
|
|
345
333
|
self._name = name
|
|
346
334
|
self._unroll_circuit_op = unroll_circuit_op
|
|
347
|
-
self._instance_gate_families:
|
|
348
|
-
self._type_gate_families:
|
|
335
|
+
self._instance_gate_families: dict[raw_types.Gate, GateFamily] = {}
|
|
336
|
+
self._type_gate_families: dict[type[raw_types.Gate], GateFamily] = {}
|
|
349
337
|
self._gates_repr_str = ", ".join([_gate_str(g, repr) for g in gates])
|
|
350
|
-
unique_gate_list:
|
|
338
|
+
unique_gate_list: list[GateFamily] = list(
|
|
351
339
|
dict.fromkeys(g if isinstance(g, GateFamily) else GateFamily(gate=g) for g in gates)
|
|
352
340
|
)
|
|
353
341
|
|
|
@@ -361,16 +349,16 @@ class Gateset:
|
|
|
361
349
|
self._gates = frozenset(unique_gate_list)
|
|
362
350
|
|
|
363
351
|
@property
|
|
364
|
-
def name(self) ->
|
|
352
|
+
def name(self) -> str | None:
|
|
365
353
|
return self._name
|
|
366
354
|
|
|
367
355
|
@property
|
|
368
|
-
def gates(self) ->
|
|
356
|
+
def gates(self) -> frozenset[GateFamily]:
|
|
369
357
|
return self._gates
|
|
370
358
|
|
|
371
359
|
def with_params(
|
|
372
|
-
self, *, name:
|
|
373
|
-
) ->
|
|
360
|
+
self, *, name: str | None = None, unroll_circuit_op: bool | None = None
|
|
361
|
+
) -> Gateset:
|
|
374
362
|
"""Returns a copy of this Gateset with identical gates and new values for named arguments.
|
|
375
363
|
|
|
376
364
|
If a named argument is None then corresponding value of this Gateset is used instead.
|
|
@@ -395,7 +383,7 @@ class Gateset:
|
|
|
395
383
|
gates = self.gates
|
|
396
384
|
return Gateset(*gates, name=name, unroll_circuit_op=cast(bool, unroll_circuit_op))
|
|
397
385
|
|
|
398
|
-
def __contains__(self, item:
|
|
386
|
+
def __contains__(self, item: raw_types.Gate | raw_types.Operation) -> bool:
|
|
399
387
|
r"""Check for containment of a given Gate/Operation in this Gateset.
|
|
400
388
|
|
|
401
389
|
Containment checks are handled as follows:
|
|
@@ -445,7 +433,7 @@ class Gateset:
|
|
|
445
433
|
|
|
446
434
|
return any(item in gate_family for gate_family in self._gates)
|
|
447
435
|
|
|
448
|
-
def validate(self, circuit_or_optree:
|
|
436
|
+
def validate(self, circuit_or_optree: cirq.AbstractCircuit | op_tree.OP_TREE) -> bool:
|
|
449
437
|
"""Validates gates forming `circuit_or_optree` should be contained in Gateset.
|
|
450
438
|
|
|
451
439
|
Args:
|
|
@@ -510,7 +498,7 @@ class Gateset:
|
|
|
510
498
|
header += self.name
|
|
511
499
|
return f'{header}\n' + "\n\n".join([str(g) for g in self._unique_gate_list])
|
|
512
500
|
|
|
513
|
-
def _json_dict_(self) ->
|
|
501
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
514
502
|
return {
|
|
515
503
|
'gates': self._unique_gate_list,
|
|
516
504
|
'name': self.name,
|
|
@@ -518,7 +506,7 @@ class Gateset:
|
|
|
518
506
|
}
|
|
519
507
|
|
|
520
508
|
@classmethod
|
|
521
|
-
def _from_json_dict_(cls, gates, name, unroll_circuit_op, **kwargs) ->
|
|
509
|
+
def _from_json_dict_(cls, gates, name, unroll_circuit_op, **kwargs) -> Gateset:
|
|
522
510
|
# This parameter was deprecated in 0.16, but we keep this logic here for backwards
|
|
523
511
|
# compatibility.
|
|
524
512
|
if 'accept_global_phase_op' in kwargs:
|
cirq/ops/gateset_test.py
CHANGED
|
@@ -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
|
import re
|
|
16
|
-
from typing import cast
|
|
18
|
+
from typing import cast
|
|
17
19
|
|
|
18
20
|
import numpy as np
|
|
19
21
|
import pytest
|
|
@@ -24,7 +26,7 @@ from cirq._compat import proper_repr
|
|
|
24
26
|
|
|
25
27
|
|
|
26
28
|
class CustomXPowGate(cirq.EigenGate):
|
|
27
|
-
def _eigen_components(self) ->
|
|
29
|
+
def _eigen_components(self) -> list[tuple[float, np.ndarray]]:
|
|
28
30
|
return [(0, np.array([[0.5, 0.5], [0.5, 0.5]])), (1, np.array([[0.5, -0.5], [-0.5, 0.5]]))]
|
|
29
31
|
|
|
30
32
|
def __str__(self) -> str:
|
cirq/ops/global_phase_op.py
CHANGED
|
@@ -13,8 +13,10 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
"""A no-qubit global phase operation."""
|
|
15
15
|
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
16
18
|
from types import NotImplementedType
|
|
17
|
-
from typing import AbstractSet, Any, cast, Collection,
|
|
19
|
+
from typing import AbstractSet, Any, cast, Collection, Sequence
|
|
18
20
|
|
|
19
21
|
import numpy as np
|
|
20
22
|
import sympy
|
|
@@ -27,14 +29,14 @@ from cirq.ops import control_values as cv, controlled_gate, raw_types
|
|
|
27
29
|
|
|
28
30
|
@value.value_equality(approximate=True)
|
|
29
31
|
class GlobalPhaseGate(raw_types.Gate):
|
|
30
|
-
def __init__(self, coefficient:
|
|
32
|
+
def __init__(self, coefficient: cirq.TParamValComplex, atol: float = 1e-8) -> None:
|
|
31
33
|
if not isinstance(coefficient, sympy.Basic):
|
|
32
34
|
if abs(1 - abs(coefficient)) > atol:
|
|
33
35
|
raise ValueError(f'Coefficient is not unitary: {coefficient!r}')
|
|
34
36
|
self._coefficient = coefficient
|
|
35
37
|
|
|
36
38
|
@property
|
|
37
|
-
def coefficient(self) ->
|
|
39
|
+
def coefficient(self) -> cirq.TParamValComplex:
|
|
38
40
|
return self._coefficient
|
|
39
41
|
|
|
40
42
|
def _value_equality_values_(self) -> Any:
|
|
@@ -43,19 +45,17 @@ class GlobalPhaseGate(raw_types.Gate):
|
|
|
43
45
|
def _has_unitary_(self) -> bool:
|
|
44
46
|
return not self._is_parameterized_()
|
|
45
47
|
|
|
46
|
-
def __pow__(self, power) ->
|
|
48
|
+
def __pow__(self, power) -> cirq.GlobalPhaseGate:
|
|
47
49
|
if isinstance(power, (int, float)):
|
|
48
50
|
return GlobalPhaseGate(self.coefficient**power)
|
|
49
51
|
return NotImplemented
|
|
50
52
|
|
|
51
|
-
def _unitary_(self) ->
|
|
53
|
+
def _unitary_(self) -> np.ndarray | NotImplementedType:
|
|
52
54
|
if not self._has_unitary_():
|
|
53
55
|
return NotImplemented
|
|
54
56
|
return np.array([[self.coefficient]])
|
|
55
57
|
|
|
56
|
-
def _apply_unitary_(
|
|
57
|
-
self, args: 'cirq.ApplyUnitaryArgs'
|
|
58
|
-
) -> Union[np.ndarray, NotImplementedType]:
|
|
58
|
+
def _apply_unitary_(self, args: cirq.ApplyUnitaryArgs) -> np.ndarray | NotImplementedType:
|
|
59
59
|
if not self._has_unitary_():
|
|
60
60
|
return NotImplemented
|
|
61
61
|
assert not cirq.is_parameterized(self)
|
|
@@ -71,13 +71,13 @@ class GlobalPhaseGate(raw_types.Gate):
|
|
|
71
71
|
def __repr__(self) -> str:
|
|
72
72
|
return f'cirq.GlobalPhaseGate({proper_repr(self.coefficient)})'
|
|
73
73
|
|
|
74
|
-
def _op_repr_(self, qubits: Sequence[
|
|
74
|
+
def _op_repr_(self, qubits: Sequence[cirq.Qid]) -> str:
|
|
75
75
|
return f'cirq.global_phase_operation({proper_repr(self.coefficient)})'
|
|
76
76
|
|
|
77
|
-
def _json_dict_(self) ->
|
|
77
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
78
78
|
return protocols.obj_to_dict_helper(self, ['coefficient'])
|
|
79
79
|
|
|
80
|
-
def _qid_shape_(self) ->
|
|
80
|
+
def _qid_shape_(self) -> tuple[int, ...]:
|
|
81
81
|
return tuple()
|
|
82
82
|
|
|
83
83
|
def _is_parameterized_(self) -> bool:
|
|
@@ -87,18 +87,23 @@ class GlobalPhaseGate(raw_types.Gate):
|
|
|
87
87
|
return protocols.parameter_names(self.coefficient)
|
|
88
88
|
|
|
89
89
|
def _resolve_parameters_(
|
|
90
|
-
self, resolver:
|
|
91
|
-
) ->
|
|
90
|
+
self, resolver: cirq.ParamResolver, recursive: bool
|
|
91
|
+
) -> cirq.GlobalPhaseGate:
|
|
92
92
|
coefficient = protocols.resolve_parameters(self.coefficient, resolver, recursive)
|
|
93
93
|
return GlobalPhaseGate(coefficient=coefficient)
|
|
94
94
|
|
|
95
|
+
def is_identity(self) -> bool:
|
|
96
|
+
"""Checks if gate is equivalent to an identity.
|
|
97
|
+
|
|
98
|
+
Returns: True if the coefficient is within rounding error of 1.
|
|
99
|
+
"""
|
|
100
|
+
return not protocols.is_parameterized(self._coefficient) and np.isclose(self.coefficient, 1)
|
|
101
|
+
|
|
95
102
|
def controlled(
|
|
96
103
|
self,
|
|
97
|
-
num_controls:
|
|
98
|
-
control_values:
|
|
99
|
-
|
|
100
|
-
] = None,
|
|
101
|
-
control_qid_shape: Optional[Tuple[int, ...]] = None,
|
|
104
|
+
num_controls: int | None = None,
|
|
105
|
+
control_values: cv.AbstractControlValues | Sequence[int | Collection[int]] | None = None,
|
|
106
|
+
control_qid_shape: tuple[int, ...] | None = None,
|
|
102
107
|
) -> raw_types.Gate:
|
|
103
108
|
result = super().controlled(num_controls, control_values, control_qid_shape)
|
|
104
109
|
if (
|
|
@@ -120,7 +125,27 @@ class GlobalPhaseGate(raw_types.Gate):
|
|
|
120
125
|
|
|
121
126
|
|
|
122
127
|
def global_phase_operation(
|
|
123
|
-
coefficient:
|
|
124
|
-
) ->
|
|
128
|
+
coefficient: cirq.TParamValComplex, atol: float = 1e-8
|
|
129
|
+
) -> cirq.GateOperation:
|
|
125
130
|
"""Creates an operation that represents a global phase on the state."""
|
|
126
131
|
return GlobalPhaseGate(coefficient, atol)()
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def from_phase_and_exponent(
|
|
135
|
+
half_turns: cirq.TParamVal, exponent: cirq.TParamVal
|
|
136
|
+
) -> cirq.GlobalPhaseGate:
|
|
137
|
+
"""Creates a GlobalPhaseGate from the global phase and exponent.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
half_turns: The number of half turns to rotate by.
|
|
141
|
+
exponent: The power to raise the phase to.
|
|
142
|
+
|
|
143
|
+
Returns: A `GlobalPhaseGate` with the corresponding coefficient.
|
|
144
|
+
"""
|
|
145
|
+
coefficient = 1j ** (2 * half_turns * exponent)
|
|
146
|
+
coefficient = (
|
|
147
|
+
complex(coefficient)
|
|
148
|
+
if isinstance(coefficient, sympy.Expr) and coefficient.is_complex
|
|
149
|
+
else coefficient
|
|
150
|
+
)
|
|
151
|
+
return GlobalPhaseGate(coefficient)
|
cirq/ops/global_phase_op_test.py
CHANGED
|
@@ -12,16 +12,21 @@
|
|
|
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
|
|
18
20
|
|
|
19
21
|
import cirq
|
|
22
|
+
from cirq.ops import global_phase_op
|
|
20
23
|
|
|
21
24
|
|
|
22
|
-
def test_init():
|
|
25
|
+
def test_init() -> None:
|
|
23
26
|
op = cirq.global_phase_operation(1j)
|
|
24
|
-
|
|
27
|
+
gate = op.gate
|
|
28
|
+
assert isinstance(gate, cirq.GlobalPhaseGate)
|
|
29
|
+
assert gate.coefficient == 1j
|
|
25
30
|
assert op.qubits == ()
|
|
26
31
|
assert op.with_qubits() == op
|
|
27
32
|
assert cirq.has_stabilizer_effect(op)
|
|
@@ -32,7 +37,7 @@ def test_init():
|
|
|
32
37
|
_ = cirq.global_phase_operation(1j).with_qubits(cirq.LineQubit(0))
|
|
33
38
|
|
|
34
39
|
|
|
35
|
-
def test_protocols():
|
|
40
|
+
def test_protocols() -> None:
|
|
36
41
|
for p in [1, 1j, -1, sympy.Symbol('s')]:
|
|
37
42
|
cirq.testing.assert_implements_consistent_protocols(cirq.global_phase_operation(p))
|
|
38
43
|
|
|
@@ -42,7 +47,7 @@ def test_protocols():
|
|
|
42
47
|
|
|
43
48
|
|
|
44
49
|
@pytest.mark.parametrize('phase', [1, 1j, -1])
|
|
45
|
-
def test_act_on_tableau(phase):
|
|
50
|
+
def test_act_on_tableau(phase) -> None:
|
|
46
51
|
original_tableau = cirq.CliffordTableau(0)
|
|
47
52
|
args = cirq.CliffordTableauSimulationState(original_tableau.copy(), np.random.RandomState())
|
|
48
53
|
cirq.act_on(cirq.global_phase_operation(phase), args, allow_decompose=False)
|
|
@@ -50,7 +55,7 @@ def test_act_on_tableau(phase):
|
|
|
50
55
|
|
|
51
56
|
|
|
52
57
|
@pytest.mark.parametrize('phase', [1, 1j, -1])
|
|
53
|
-
def test_act_on_ch_form(phase):
|
|
58
|
+
def test_act_on_ch_form(phase) -> None:
|
|
54
59
|
state = cirq.StabilizerStateChForm(0)
|
|
55
60
|
args = cirq.StabilizerChFormSimulationState(
|
|
56
61
|
qubits=[], prng=np.random.RandomState(), initial_state=state
|
|
@@ -59,16 +64,16 @@ def test_act_on_ch_form(phase):
|
|
|
59
64
|
assert state.state_vector() == [[phase]]
|
|
60
65
|
|
|
61
66
|
|
|
62
|
-
def test_str():
|
|
67
|
+
def test_str() -> None:
|
|
63
68
|
assert str(cirq.global_phase_operation(1j)) == '1j'
|
|
64
69
|
|
|
65
70
|
|
|
66
|
-
def test_repr():
|
|
71
|
+
def test_repr() -> None:
|
|
67
72
|
op = cirq.global_phase_operation(1j)
|
|
68
73
|
cirq.testing.assert_equivalent_repr(op)
|
|
69
74
|
|
|
70
75
|
|
|
71
|
-
def test_diagram():
|
|
76
|
+
def test_diagram() -> None:
|
|
72
77
|
a, b = cirq.LineQubit.range(2)
|
|
73
78
|
x, y = cirq.LineQubit.range(10, 12)
|
|
74
79
|
|
|
@@ -200,7 +205,7 @@ global phase: -0.5π
|
|
|
200
205
|
)
|
|
201
206
|
|
|
202
207
|
|
|
203
|
-
def test_gate_init():
|
|
208
|
+
def test_gate_init() -> None:
|
|
204
209
|
gate = cirq.GlobalPhaseGate(1j)
|
|
205
210
|
assert gate.coefficient == 1j
|
|
206
211
|
assert isinstance(gate.on(), cirq.GateOperation)
|
|
@@ -213,7 +218,7 @@ def test_gate_init():
|
|
|
213
218
|
_ = gate.on(cirq.LineQubit(0))
|
|
214
219
|
|
|
215
220
|
|
|
216
|
-
def test_gate_protocols():
|
|
221
|
+
def test_gate_protocols() -> None:
|
|
217
222
|
for p in [1, 1j, -1]:
|
|
218
223
|
cirq.testing.assert_implements_consistent_protocols(cirq.GlobalPhaseGate(p))
|
|
219
224
|
|
|
@@ -221,7 +226,7 @@ def test_gate_protocols():
|
|
|
221
226
|
|
|
222
227
|
|
|
223
228
|
@pytest.mark.parametrize('phase', [1, 1j, -1])
|
|
224
|
-
def test_gate_act_on_tableau(phase):
|
|
229
|
+
def test_gate_act_on_tableau(phase) -> None:
|
|
225
230
|
original_tableau = cirq.CliffordTableau(0)
|
|
226
231
|
args = cirq.CliffordTableauSimulationState(original_tableau.copy(), np.random.RandomState())
|
|
227
232
|
cirq.act_on(cirq.GlobalPhaseGate(phase), args, qubits=(), allow_decompose=False)
|
|
@@ -229,7 +234,7 @@ def test_gate_act_on_tableau(phase):
|
|
|
229
234
|
|
|
230
235
|
|
|
231
236
|
@pytest.mark.parametrize('phase', [1, 1j, -1])
|
|
232
|
-
def test_gate_act_on_ch_form(phase):
|
|
237
|
+
def test_gate_act_on_ch_form(phase) -> None:
|
|
233
238
|
state = cirq.StabilizerStateChForm(0)
|
|
234
239
|
args = cirq.StabilizerChFormSimulationState(
|
|
235
240
|
qubits=[], prng=np.random.RandomState(), initial_state=state
|
|
@@ -238,25 +243,25 @@ def test_gate_act_on_ch_form(phase):
|
|
|
238
243
|
assert state.state_vector() == [[phase]]
|
|
239
244
|
|
|
240
245
|
|
|
241
|
-
def test_gate_str():
|
|
246
|
+
def test_gate_str() -> None:
|
|
242
247
|
assert str(cirq.GlobalPhaseGate(1j)) == '1j'
|
|
243
248
|
|
|
244
249
|
|
|
245
|
-
def test_gate_repr():
|
|
250
|
+
def test_gate_repr() -> None:
|
|
246
251
|
gate = cirq.GlobalPhaseGate(1j)
|
|
247
252
|
cirq.testing.assert_equivalent_repr(gate)
|
|
248
253
|
|
|
249
254
|
|
|
250
|
-
def test_gate_op_repr():
|
|
255
|
+
def test_gate_op_repr() -> None:
|
|
251
256
|
gate = cirq.GlobalPhaseGate(1j)
|
|
252
257
|
cirq.testing.assert_equivalent_repr(gate.on())
|
|
253
258
|
|
|
254
259
|
|
|
255
|
-
def test_gate_global_phase_op_json_dict():
|
|
260
|
+
def test_gate_global_phase_op_json_dict() -> None:
|
|
256
261
|
assert cirq.GlobalPhaseGate(-1j)._json_dict_() == {'coefficient': -1j}
|
|
257
262
|
|
|
258
263
|
|
|
259
|
-
def test_parameterization():
|
|
264
|
+
def test_parameterization() -> None:
|
|
260
265
|
t = sympy.Symbol('t')
|
|
261
266
|
gpt = cirq.GlobalPhaseGate(coefficient=t)
|
|
262
267
|
assert cirq.is_parameterized(gpt)
|
|
@@ -267,14 +272,14 @@ def test_parameterization():
|
|
|
267
272
|
|
|
268
273
|
|
|
269
274
|
@pytest.mark.parametrize('resolve_fn', [cirq.resolve_parameters, cirq.resolve_parameters_once])
|
|
270
|
-
def test_resolve(resolve_fn):
|
|
275
|
+
def test_resolve(resolve_fn) -> None:
|
|
271
276
|
t = sympy.Symbol('t')
|
|
272
277
|
gpt = cirq.GlobalPhaseGate(coefficient=t)
|
|
273
278
|
assert resolve_fn(gpt, {'t': -1}) == cirq.GlobalPhaseGate(coefficient=-1)
|
|
274
279
|
|
|
275
280
|
|
|
276
281
|
@pytest.mark.parametrize('resolve_fn', [cirq.resolve_parameters, cirq.resolve_parameters_once])
|
|
277
|
-
def test_resolve_error(resolve_fn):
|
|
282
|
+
def test_resolve_error(resolve_fn) -> None:
|
|
278
283
|
t = sympy.Symbol('t')
|
|
279
284
|
gpt = cirq.GlobalPhaseGate(coefficient=t)
|
|
280
285
|
with pytest.raises(ValueError, match='Coefficient is not unitary'):
|
|
@@ -284,7 +289,7 @@ def test_resolve_error(resolve_fn):
|
|
|
284
289
|
@pytest.mark.parametrize(
|
|
285
290
|
'coeff, exp', [(-1, 1), (1j, 0.5), (-1j, -0.5), (1 / np.sqrt(2) * (1 + 1j), 0.25)]
|
|
286
291
|
)
|
|
287
|
-
def test_global_phase_gate_controlled(coeff, exp):
|
|
292
|
+
def test_global_phase_gate_controlled(coeff, exp) -> None:
|
|
288
293
|
g = cirq.GlobalPhaseGate(coeff)
|
|
289
294
|
op = cirq.global_phase_operation(coeff)
|
|
290
295
|
q = cirq.LineQubit.range(3)
|
|
@@ -300,3 +305,22 @@ def test_global_phase_gate_controlled(coeff, exp):
|
|
|
300
305
|
assert g.controlled(control_values=xor_control_values) == cirq.ControlledGate(
|
|
301
306
|
g, control_values=xor_control_values
|
|
302
307
|
)
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
def test_is_identity() -> None:
|
|
311
|
+
g = cirq.GlobalPhaseGate(1)
|
|
312
|
+
assert g.is_identity()
|
|
313
|
+
g = cirq.GlobalPhaseGate(1j)
|
|
314
|
+
assert not g.is_identity()
|
|
315
|
+
g = cirq.GlobalPhaseGate(-1)
|
|
316
|
+
assert not g.is_identity()
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
def test_from_phase_and_exponent() -> None:
|
|
320
|
+
g = global_phase_op.from_phase_and_exponent(2.5, 0.5)
|
|
321
|
+
assert g.coefficient == np.exp(1.25j * np.pi)
|
|
322
|
+
a, b = sympy.symbols('a, b')
|
|
323
|
+
g = global_phase_op.from_phase_and_exponent(a, b)
|
|
324
|
+
assert g.coefficient == 1j ** (2 * a * b)
|
|
325
|
+
g = global_phase_op.from_phase_and_exponent(1 / a, a)
|
|
326
|
+
assert g.coefficient == -1
|
cirq/ops/greedy_qubit_manager.py
CHANGED
|
@@ -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 Iterable, TYPE_CHECKING
|
|
16
18
|
|
|
17
19
|
from cirq.ops import named_qubit, qid_util, qubit_manager
|
|
18
20
|
|
|
@@ -49,25 +51,25 @@ class GreedyQubitManager(qubit_manager.QubitManager):
|
|
|
49
51
|
maximize_reuse: Flag to control a FIFO vs LIFO strategy, defaults to False (FIFO).
|
|
50
52
|
"""
|
|
51
53
|
self._prefix = prefix
|
|
52
|
-
self._used_qubits:
|
|
53
|
-
self._free_qubits:
|
|
54
|
+
self._used_qubits: set[cirq.Qid] = set()
|
|
55
|
+
self._free_qubits: list[cirq.Qid] = []
|
|
54
56
|
self._size = 0
|
|
55
57
|
self.maximize_reuse = maximize_reuse
|
|
56
58
|
self.resize(size)
|
|
57
59
|
|
|
58
|
-
def _allocate_qid(self, name: str, dim: int) ->
|
|
60
|
+
def _allocate_qid(self, name: str, dim: int) -> cirq.Qid:
|
|
59
61
|
return qid_util.q(name) if dim == 2 else named_qubit.NamedQid(name, dimension=dim)
|
|
60
62
|
|
|
61
63
|
def resize(self, new_size: int, dim: int = 2) -> None:
|
|
62
64
|
if new_size <= self._size:
|
|
63
65
|
return
|
|
64
|
-
new_qubits:
|
|
66
|
+
new_qubits: list[cirq.Qid] = [
|
|
65
67
|
self._allocate_qid(f'{self._prefix}_{s}', dim) for s in range(self._size, new_size)
|
|
66
68
|
]
|
|
67
69
|
self._free_qubits = new_qubits + self._free_qubits
|
|
68
70
|
self._size = new_size
|
|
69
71
|
|
|
70
|
-
def qalloc(self, n: int, dim: int = 2) ->
|
|
72
|
+
def qalloc(self, n: int, dim: int = 2) -> list[cirq.Qid]:
|
|
71
73
|
if not n:
|
|
72
74
|
return []
|
|
73
75
|
self.resize(self._size + n - len(self._free_qubits), dim=dim)
|
|
@@ -76,11 +78,11 @@ class GreedyQubitManager(qubit_manager.QubitManager):
|
|
|
76
78
|
self._used_qubits.update(ret_qubits)
|
|
77
79
|
return ret_qubits
|
|
78
80
|
|
|
79
|
-
def qfree(self, qubits: Iterable[
|
|
81
|
+
def qfree(self, qubits: Iterable[cirq.Qid]) -> None:
|
|
80
82
|
qs = list(dict(zip(qubits, qubits)).keys())
|
|
81
83
|
assert self._used_qubits.issuperset(qs), "Only managed qubits currently in-use can be freed"
|
|
82
84
|
self._used_qubits = self._used_qubits.difference(qs)
|
|
83
85
|
self._free_qubits.extend(qs)
|
|
84
86
|
|
|
85
|
-
def qborrow(self, n: int, dim: int = 2) ->
|
|
87
|
+
def qborrow(self, n: int, dim: int = 2) -> list[cirq.Qid]:
|
|
86
88
|
return self.qalloc(n, dim)
|
|
@@ -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 cirq
|
|
16
18
|
|
|
17
19
|
|
|
@@ -30,7 +32,7 @@ class GateAllocInDecompose(cirq.Gate):
|
|
|
30
32
|
qm.qfree([q])
|
|
31
33
|
|
|
32
34
|
|
|
33
|
-
def test_greedy_qubit_manager():
|
|
35
|
+
def test_greedy_qubit_manager() -> None:
|
|
34
36
|
def make_circuit(qm: cirq.QubitManager):
|
|
35
37
|
q = cirq.LineQubit.range(2)
|
|
36
38
|
g = GateAllocInDecompose(1)
|
|
@@ -90,12 +92,12 @@ ancilla_1: ───X───X───
|
|
|
90
92
|
)
|
|
91
93
|
|
|
92
94
|
|
|
93
|
-
def test_empty_qubits():
|
|
95
|
+
def test_empty_qubits() -> None:
|
|
94
96
|
qm = cirq.GreedyQubitManager(prefix="anc")
|
|
95
97
|
assert qm.qalloc(0) == []
|
|
96
98
|
|
|
97
99
|
|
|
98
|
-
def test_greedy_qubit_manager_preserves_order():
|
|
100
|
+
def test_greedy_qubit_manager_preserves_order() -> None:
|
|
99
101
|
qm = cirq.GreedyQubitManager(prefix="anc")
|
|
100
102
|
ancillae = [cirq.q(f"anc_{i}") for i in range(100)]
|
|
101
103
|
assert qm.qalloc(100) == ancillae
|