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/qubit_manager.py
CHANGED
|
@@ -12,9 +12,11 @@
|
|
|
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 dataclasses
|
|
17
|
-
from typing import Iterable,
|
|
19
|
+
from typing import Iterable, TYPE_CHECKING
|
|
18
20
|
|
|
19
21
|
from cirq.ops import raw_types
|
|
20
22
|
|
|
@@ -24,15 +26,15 @@ if TYPE_CHECKING:
|
|
|
24
26
|
|
|
25
27
|
class QubitManager(metaclass=abc.ABCMeta):
|
|
26
28
|
@abc.abstractmethod
|
|
27
|
-
def qalloc(self, n: int, dim: int = 2) ->
|
|
29
|
+
def qalloc(self, n: int, dim: int = 2) -> list[cirq.Qid]:
|
|
28
30
|
"""Allocate `n` clean qubits, i.e. qubits guaranteed to be in state |0>."""
|
|
29
31
|
|
|
30
32
|
@abc.abstractmethod
|
|
31
|
-
def qborrow(self, n: int, dim: int = 2) ->
|
|
33
|
+
def qborrow(self, n: int, dim: int = 2) -> list[cirq.Qid]:
|
|
32
34
|
"""Allocate `n` dirty qubits, i.e. the returned qubits can be in any state."""
|
|
33
35
|
|
|
34
36
|
@abc.abstractmethod
|
|
35
|
-
def qfree(self, qubits: Iterable[
|
|
37
|
+
def qfree(self, qubits: Iterable[cirq.Qid]) -> None:
|
|
36
38
|
"""Free pre-allocated clean or dirty qubits managed by this qubit manager."""
|
|
37
39
|
|
|
38
40
|
|
|
@@ -42,14 +44,14 @@ class _BaseAncillaQid(raw_types.Qid):
|
|
|
42
44
|
dim: int = 2
|
|
43
45
|
prefix: str = ''
|
|
44
46
|
|
|
45
|
-
def _comparison_key(self) ->
|
|
47
|
+
def _comparison_key(self) -> tuple[str, int]:
|
|
46
48
|
return self.prefix, self.id
|
|
47
49
|
|
|
48
50
|
@property
|
|
49
51
|
def dimension(self) -> int:
|
|
50
52
|
return self.dim
|
|
51
53
|
|
|
52
|
-
def with_dimension(self, dimension: int) ->
|
|
54
|
+
def with_dimension(self, dimension: int) -> _BaseAncillaQid:
|
|
53
55
|
return dataclasses.replace(self, dim=dimension)
|
|
54
56
|
|
|
55
57
|
def __repr__(self) -> str:
|
|
@@ -82,18 +84,18 @@ class SimpleQubitManager(QubitManager):
|
|
|
82
84
|
self._borrow_id = 0
|
|
83
85
|
self._prefix = prefix
|
|
84
86
|
|
|
85
|
-
def qalloc(self, n: int, dim: int = 2) ->
|
|
87
|
+
def qalloc(self, n: int, dim: int = 2) -> list[cirq.Qid]:
|
|
86
88
|
self._clean_id += n
|
|
87
89
|
return [CleanQubit(i, dim, self._prefix) for i in range(self._clean_id - n, self._clean_id)]
|
|
88
90
|
|
|
89
|
-
def qborrow(self, n: int, dim: int = 2) ->
|
|
91
|
+
def qborrow(self, n: int, dim: int = 2) -> list[cirq.Qid]:
|
|
90
92
|
self._borrow_id = self._borrow_id + n
|
|
91
93
|
return [
|
|
92
94
|
BorrowableQubit(i, dim, self._prefix)
|
|
93
95
|
for i in range(self._borrow_id - n, self._borrow_id)
|
|
94
96
|
]
|
|
95
97
|
|
|
96
|
-
def qfree(self, qubits: Iterable[
|
|
98
|
+
def qfree(self, qubits: Iterable[cirq.Qid]) -> None:
|
|
97
99
|
for q in qubits:
|
|
98
100
|
good = isinstance(q, CleanQubit) and q.id < self._clean_id
|
|
99
101
|
good |= isinstance(q, BorrowableQubit) and q.id < self._borrow_id
|
cirq/ops/qubit_manager_test.py
CHANGED
|
@@ -12,13 +12,15 @@
|
|
|
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 pytest
|
|
16
18
|
|
|
17
19
|
import cirq
|
|
18
20
|
from cirq.ops import qubit_manager as cqi
|
|
19
21
|
|
|
20
22
|
|
|
21
|
-
def test_clean_qubits():
|
|
23
|
+
def test_clean_qubits() -> None:
|
|
22
24
|
q = cqi.CleanQubit(1)
|
|
23
25
|
assert q.id == 1
|
|
24
26
|
assert q.dimension == 2
|
|
@@ -39,7 +41,7 @@ def test_clean_qubits():
|
|
|
39
41
|
assert cqi.CleanQubit(1) < cqi.CleanQubit(2)
|
|
40
42
|
|
|
41
43
|
|
|
42
|
-
def test_ancilla_qubits_prefix():
|
|
44
|
+
def test_ancilla_qubits_prefix() -> None:
|
|
43
45
|
assert cqi.CleanQubit(1, prefix="1") != cqi.CleanQubit(1, prefix="2")
|
|
44
46
|
assert cqi.CleanQubit(1, prefix="1") < cqi.CleanQubit(1, prefix="2")
|
|
45
47
|
assert cqi.CleanQubit(1, prefix="1") < cqi.CleanQubit(2, prefix="1")
|
|
@@ -49,7 +51,7 @@ def test_ancilla_qubits_prefix():
|
|
|
49
51
|
assert cqi.CleanQubit(1, prefix="1") != cqi.BorrowableQubit(1, prefix="1")
|
|
50
52
|
|
|
51
53
|
|
|
52
|
-
def test_borrow_qubits():
|
|
54
|
+
def test_borrow_qubits() -> None:
|
|
53
55
|
q = cqi.BorrowableQubit(10)
|
|
54
56
|
assert q.id == 10
|
|
55
57
|
assert q.dimension == 2
|
|
@@ -71,7 +73,7 @@ def test_borrow_qubits():
|
|
|
71
73
|
|
|
72
74
|
|
|
73
75
|
@pytest.mark.parametrize('_', range(2))
|
|
74
|
-
def test_simple_qubit_manager(_):
|
|
76
|
+
def test_simple_qubit_manager(_) -> None:
|
|
75
77
|
qm = cirq.ops.SimpleQubitManager()
|
|
76
78
|
assert qm.qalloc(1) == [cqi.CleanQubit(0)]
|
|
77
79
|
assert qm.qalloc(2) == [cqi.CleanQubit(1), cqi.CleanQubit(2)]
|
cirq/ops/qubit_order.py
CHANGED
|
@@ -12,13 +12,12 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
15
16
|
|
|
16
|
-
from typing import Any, Callable, Iterable,
|
|
17
|
-
|
|
18
|
-
from cirq.ops import raw_types
|
|
17
|
+
from typing import Any, Callable, Iterable, TYPE_CHECKING, TypeVar
|
|
19
18
|
|
|
20
19
|
if TYPE_CHECKING:
|
|
21
|
-
|
|
20
|
+
import cirq
|
|
22
21
|
|
|
23
22
|
|
|
24
23
|
TInternalQubit = TypeVar('TInternalQubit')
|
|
@@ -28,12 +27,10 @@ TExternalQubit = TypeVar('TExternalQubit')
|
|
|
28
27
|
class QubitOrder:
|
|
29
28
|
"""Defines the kronecker product order of qubits."""
|
|
30
29
|
|
|
31
|
-
def __init__(
|
|
32
|
-
self, explicit_func: Callable[[Iterable[raw_types.Qid]], Tuple[raw_types.Qid, ...]]
|
|
33
|
-
) -> None:
|
|
30
|
+
def __init__(self, explicit_func: Callable[[Iterable[cirq.Qid]], tuple[cirq.Qid, ...]]) -> None:
|
|
34
31
|
self._explicit_func = explicit_func
|
|
35
32
|
|
|
36
|
-
DEFAULT:
|
|
33
|
+
DEFAULT: QubitOrder
|
|
37
34
|
"""A basis that orders qubits in the same way that calling `sorted` does.
|
|
38
35
|
|
|
39
36
|
Specifically, qubits are ordered first by their type name and then by
|
|
@@ -43,8 +40,8 @@ class QubitOrder:
|
|
|
43
40
|
|
|
44
41
|
@staticmethod
|
|
45
42
|
def explicit(
|
|
46
|
-
fixed_qubits: Iterable[
|
|
47
|
-
) ->
|
|
43
|
+
fixed_qubits: Iterable[cirq.Qid], fallback: QubitOrder | None = None
|
|
44
|
+
) -> QubitOrder:
|
|
48
45
|
"""A basis that contains exactly the given qubits in the given order.
|
|
49
46
|
|
|
50
47
|
Args:
|
|
@@ -77,7 +74,7 @@ class QubitOrder:
|
|
|
77
74
|
return QubitOrder(func)
|
|
78
75
|
|
|
79
76
|
@staticmethod
|
|
80
|
-
def sorted_by(key: Callable[[
|
|
77
|
+
def sorted_by(key: Callable[[cirq.Qid], Any]) -> QubitOrder:
|
|
81
78
|
"""A basis that orders qubits ascending based on a key function.
|
|
82
79
|
|
|
83
80
|
Args:
|
|
@@ -89,7 +86,7 @@ class QubitOrder:
|
|
|
89
86
|
"""
|
|
90
87
|
return QubitOrder(lambda qubits: tuple(sorted(qubits, key=key)))
|
|
91
88
|
|
|
92
|
-
def order_for(self, qubits: Iterable[
|
|
89
|
+
def order_for(self, qubits: Iterable[cirq.Qid]) -> tuple[cirq.Qid, ...]:
|
|
93
90
|
"""Returns a qubit tuple ordered corresponding to the basis.
|
|
94
91
|
|
|
95
92
|
Args:
|
|
@@ -104,7 +101,7 @@ class QubitOrder:
|
|
|
104
101
|
return self._explicit_func(qubits)
|
|
105
102
|
|
|
106
103
|
@staticmethod
|
|
107
|
-
def as_qubit_order(val:
|
|
104
|
+
def as_qubit_order(val: cirq.QubitOrderOrList) -> QubitOrder:
|
|
108
105
|
"""Converts a value into a basis.
|
|
109
106
|
|
|
110
107
|
Args:
|
|
@@ -126,7 +123,7 @@ class QubitOrder:
|
|
|
126
123
|
self,
|
|
127
124
|
internalize: Callable[[TExternalQubit], TInternalQubit],
|
|
128
125
|
externalize: Callable[[TInternalQubit], TExternalQubit],
|
|
129
|
-
) ->
|
|
126
|
+
) -> QubitOrder:
|
|
130
127
|
"""Transforms the Basis so that it applies to wrapped qubits.
|
|
131
128
|
|
|
132
129
|
Args:
|
cirq/ops/qubit_order_or_list.py
CHANGED
|
@@ -18,12 +18,14 @@ This type is defined in its own file to work around an "invalid type" bug in
|
|
|
18
18
|
mypy.
|
|
19
19
|
"""
|
|
20
20
|
|
|
21
|
-
from
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
from typing import Iterable
|
|
22
24
|
|
|
23
25
|
from cirq._doc import document
|
|
24
26
|
from cirq.ops import qubit_order, raw_types
|
|
25
27
|
|
|
26
|
-
QubitOrderOrList =
|
|
28
|
+
QubitOrderOrList = qubit_order.QubitOrder | Iterable[raw_types.Qid]
|
|
27
29
|
document(
|
|
28
30
|
QubitOrderOrList,
|
|
29
31
|
"""Specifies a qubit ordering.
|
cirq/ops/qubit_order_test.py
CHANGED
|
@@ -12,12 +12,14 @@
|
|
|
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 pytest
|
|
16
18
|
|
|
17
19
|
import cirq
|
|
18
20
|
|
|
19
21
|
|
|
20
|
-
def test_default():
|
|
22
|
+
def test_default() -> None:
|
|
21
23
|
a2 = cirq.NamedQubit('a2')
|
|
22
24
|
a10 = cirq.NamedQubit('a10')
|
|
23
25
|
b = cirq.NamedQubit('b')
|
|
@@ -30,7 +32,7 @@ def test_default():
|
|
|
30
32
|
assert sorted([q5, a10, a2, b, q4]) == [q4, q5, a2, a10, b]
|
|
31
33
|
|
|
32
34
|
|
|
33
|
-
def test_default_grouping():
|
|
35
|
+
def test_default_grouping() -> None:
|
|
34
36
|
presorted = (
|
|
35
37
|
cirq.GridQubit(0, 1),
|
|
36
38
|
cirq.GridQubit(1, 0),
|
|
@@ -48,7 +50,7 @@ def test_default_grouping():
|
|
|
48
50
|
assert cirq.QubitOrder.DEFAULT.order_for(reversed(presorted)) == presorted
|
|
49
51
|
|
|
50
52
|
|
|
51
|
-
def test_explicit():
|
|
53
|
+
def test_explicit() -> None:
|
|
52
54
|
a2 = cirq.NamedQubit('a2')
|
|
53
55
|
a10 = cirq.NamedQubit('a10')
|
|
54
56
|
b = cirq.NamedQubit('b')
|
|
@@ -62,7 +64,7 @@ def test_explicit():
|
|
|
62
64
|
_ = q.order_for([cirq.NamedQubit('c')])
|
|
63
65
|
|
|
64
66
|
|
|
65
|
-
def test_explicit_with_fallback():
|
|
67
|
+
def test_explicit_with_fallback() -> None:
|
|
66
68
|
a2 = cirq.NamedQubit('a2')
|
|
67
69
|
a10 = cirq.NamedQubit('a10')
|
|
68
70
|
b = cirq.NamedQubit('b')
|
|
@@ -74,7 +76,7 @@ def test_explicit_with_fallback():
|
|
|
74
76
|
assert q.order_for([a10, a2]) == (b, a2, a10)
|
|
75
77
|
|
|
76
78
|
|
|
77
|
-
def test_sorted_by():
|
|
79
|
+
def test_sorted_by() -> None:
|
|
78
80
|
a = cirq.NamedQubit('2')
|
|
79
81
|
b = cirq.NamedQubit('10')
|
|
80
82
|
c = cirq.NamedQubit('-5')
|
|
@@ -86,7 +88,7 @@ def test_sorted_by():
|
|
|
86
88
|
assert q.order_for([a, b, c]) == (b, a, c)
|
|
87
89
|
|
|
88
90
|
|
|
89
|
-
def test_map():
|
|
91
|
+
def test_map() -> None:
|
|
90
92
|
b = cirq.NamedQubit('b!')
|
|
91
93
|
q = cirq.QubitOrder.explicit([cirq.NamedQubit('b')]).map(
|
|
92
94
|
internalize=lambda e: cirq.NamedQubit(e.name[:-1]),
|
|
@@ -97,7 +99,7 @@ def test_map():
|
|
|
97
99
|
assert q.order_for([b]) == (b,)
|
|
98
100
|
|
|
99
101
|
|
|
100
|
-
def test_qubit_order_or_list():
|
|
102
|
+
def test_qubit_order_or_list() -> None:
|
|
101
103
|
b = cirq.NamedQubit('b')
|
|
102
104
|
|
|
103
105
|
implied_by_list = cirq.QubitOrder.as_qubit_order([b])
|
|
@@ -114,7 +116,7 @@ def test_qubit_order_or_list():
|
|
|
114
116
|
assert ordered is passed_through
|
|
115
117
|
|
|
116
118
|
|
|
117
|
-
def test_qubit_order_iterator():
|
|
119
|
+
def test_qubit_order_iterator() -> None:
|
|
118
120
|
generator = (q for q in cirq.LineQubit.range(5))
|
|
119
121
|
assert cirq.QubitOrder.explicit(generator).order_for((cirq.LineQubit(3),)) == tuple(
|
|
120
122
|
cirq.LineQubit.range(5)
|
|
@@ -126,6 +128,6 @@ def test_qubit_order_iterator():
|
|
|
126
128
|
)
|
|
127
129
|
|
|
128
130
|
|
|
129
|
-
def test_qubit_order_invalid():
|
|
131
|
+
def test_qubit_order_invalid() -> None:
|
|
130
132
|
with pytest.raises(ValueError, match="Don't know how to interpret <5> as a Basis."):
|
|
131
|
-
_ = cirq.QubitOrder.as_qubit_order(5)
|
|
133
|
+
_ = cirq.QubitOrder.as_qubit_order(5) # type: ignore[arg-type]
|
cirq/ops/random_gate_channel.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 numbers
|
|
16
|
-
from typing import AbstractSet, Any, cast,
|
|
18
|
+
from typing import AbstractSet, Any, cast, SupportsFloat, TYPE_CHECKING
|
|
17
19
|
|
|
18
20
|
import numpy as np
|
|
19
21
|
|
|
@@ -29,7 +31,7 @@ if TYPE_CHECKING:
|
|
|
29
31
|
class RandomGateChannel(raw_types.Gate):
|
|
30
32
|
"""Applies a sub gate with some probability."""
|
|
31
33
|
|
|
32
|
-
def __init__(self, *, sub_gate:
|
|
34
|
+
def __init__(self, *, sub_gate: cirq.Gate, probability: cirq.TParamVal):
|
|
33
35
|
if (
|
|
34
36
|
isinstance(probability, numbers.Number)
|
|
35
37
|
and not 0 <= float(cast(SupportsFloat, probability)) <= 1
|
|
@@ -45,14 +47,14 @@ class RandomGateChannel(raw_types.Gate):
|
|
|
45
47
|
self._sub_gate = self.sub_gate.sub_gate
|
|
46
48
|
|
|
47
49
|
@property
|
|
48
|
-
def sub_gate(self) ->
|
|
50
|
+
def sub_gate(self) -> cirq.Gate:
|
|
49
51
|
return self._sub_gate
|
|
50
52
|
|
|
51
53
|
@property
|
|
52
|
-
def probability(self) ->
|
|
54
|
+
def probability(self) -> cirq.TParamVal:
|
|
53
55
|
return self._probability
|
|
54
56
|
|
|
55
|
-
def _qid_shape_(self) ->
|
|
57
|
+
def _qid_shape_(self) -> tuple[int, ...]:
|
|
56
58
|
return protocols.qid_shape(self.sub_gate)
|
|
57
59
|
|
|
58
60
|
def _value_equality_values_(self):
|
|
@@ -78,8 +80,8 @@ class RandomGateChannel(raw_types.Gate):
|
|
|
78
80
|
)
|
|
79
81
|
|
|
80
82
|
def _resolve_parameters_(
|
|
81
|
-
self, resolver:
|
|
82
|
-
) ->
|
|
83
|
+
self, resolver: cirq.ParamResolver, recursive: bool
|
|
84
|
+
) -> RandomGateChannel:
|
|
83
85
|
return RandomGateChannel(
|
|
84
86
|
sub_gate=protocols.resolve_parameters(self.sub_gate, resolver, recursive),
|
|
85
87
|
probability=protocols.resolve_parameters(self.probability, resolver, recursive),
|
|
@@ -121,7 +123,7 @@ class RandomGateChannel(raw_types.Gate):
|
|
|
121
123
|
result *= float(self.probability)
|
|
122
124
|
return result
|
|
123
125
|
|
|
124
|
-
def _json_dict_(self) ->
|
|
126
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
125
127
|
return protocols.obj_to_dict_helper(self, ['sub_gate', 'probability'])
|
|
126
128
|
|
|
127
129
|
@classmethod
|
|
@@ -129,8 +131,8 @@ class RandomGateChannel(raw_types.Gate):
|
|
|
129
131
|
return cls(sub_gate=sub_gate, probability=probability)
|
|
130
132
|
|
|
131
133
|
def _circuit_diagram_info_(
|
|
132
|
-
self, args:
|
|
133
|
-
) ->
|
|
134
|
+
self, args: cirq.CircuitDiagramInfoArgs
|
|
135
|
+
) -> cirq.CircuitDiagramInfo | None:
|
|
134
136
|
result = protocols.circuit_diagram_info(self.sub_gate, args, None)
|
|
135
137
|
if result is None:
|
|
136
138
|
return None
|
|
@@ -11,6 +11,9 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
14
17
|
import numpy as np
|
|
15
18
|
import pytest
|
|
16
19
|
import sympy
|
|
@@ -18,7 +21,7 @@ import sympy
|
|
|
18
21
|
import cirq
|
|
19
22
|
|
|
20
23
|
|
|
21
|
-
def test_init():
|
|
24
|
+
def test_init() -> None:
|
|
22
25
|
p = cirq.RandomGateChannel(sub_gate=cirq.X, probability=0.5)
|
|
23
26
|
assert p.sub_gate is cirq.X
|
|
24
27
|
assert p.probability == 0.5
|
|
@@ -29,7 +32,7 @@ def test_init():
|
|
|
29
32
|
_ = cirq.RandomGateChannel(sub_gate=cirq.X, probability=-1)
|
|
30
33
|
|
|
31
34
|
|
|
32
|
-
def test_eq():
|
|
35
|
+
def test_eq() -> None:
|
|
33
36
|
eq = cirq.testing.EqualsTester()
|
|
34
37
|
q = cirq.LineQubit(0)
|
|
35
38
|
|
|
@@ -67,7 +70,7 @@ def test_eq():
|
|
|
67
70
|
)
|
|
68
71
|
|
|
69
72
|
|
|
70
|
-
def test_consistent_protocols():
|
|
73
|
+
def test_consistent_protocols() -> None:
|
|
71
74
|
cirq.testing.assert_implements_consistent_protocols(
|
|
72
75
|
cirq.RandomGateChannel(sub_gate=cirq.X, probability=1),
|
|
73
76
|
ignore_decompose_to_default_gateset=True,
|
|
@@ -86,7 +89,7 @@ def test_consistent_protocols():
|
|
|
86
89
|
)
|
|
87
90
|
|
|
88
91
|
|
|
89
|
-
def test_diagram():
|
|
92
|
+
def test_diagram() -> None:
|
|
90
93
|
class NoDetailsGate(cirq.Gate):
|
|
91
94
|
def num_qubits(self) -> int:
|
|
92
95
|
raise NotImplementedError()
|
|
@@ -115,7 +118,7 @@ def test_diagram():
|
|
|
115
118
|
|
|
116
119
|
|
|
117
120
|
@pytest.mark.parametrize('resolve_fn', [cirq.resolve_parameters, cirq.resolve_parameters_once])
|
|
118
|
-
def test_parameterized(resolve_fn):
|
|
121
|
+
def test_parameterized(resolve_fn) -> None:
|
|
119
122
|
op = cirq.X.with_probability(sympy.Symbol('x'))
|
|
120
123
|
assert cirq.is_parameterized(op)
|
|
121
124
|
assert not cirq.has_kraus(op)
|
|
@@ -128,7 +131,7 @@ def test_parameterized(resolve_fn):
|
|
|
128
131
|
assert cirq.has_mixture(op2)
|
|
129
132
|
|
|
130
133
|
|
|
131
|
-
def test_mixture():
|
|
134
|
+
def test_mixture() -> None:
|
|
132
135
|
class NoDetailsGate(cirq.Gate):
|
|
133
136
|
def num_qubits(self) -> int:
|
|
134
137
|
return 1
|
|
@@ -150,7 +153,7 @@ def test_mixture():
|
|
|
150
153
|
assert {p for p, _ in m} == {7 / 8, 1 / 32, 3 / 32}
|
|
151
154
|
|
|
152
155
|
|
|
153
|
-
def test_channel():
|
|
156
|
+
def test_channel() -> None:
|
|
154
157
|
class NoDetailsGate(cirq.Gate):
|
|
155
158
|
def num_qubits(self) -> int:
|
|
156
159
|
return 1
|
|
@@ -192,7 +195,7 @@ def test_channel():
|
|
|
192
195
|
np.testing.assert_allclose(m[2], cirq.unitary(cirq.I) * np.sqrt(0.75), atol=1e-8)
|
|
193
196
|
|
|
194
197
|
|
|
195
|
-
def test_trace_distance():
|
|
198
|
+
def test_trace_distance() -> None:
|
|
196
199
|
t = cirq.trace_distance_bound
|
|
197
200
|
assert 0.999 <= t(cirq.X.with_probability(sympy.Symbol('x')))
|
|
198
201
|
assert t(cirq.X.with_probability(0)) == 0
|
|
@@ -201,18 +204,18 @@ def test_trace_distance():
|
|
|
201
204
|
assert 0.35 <= t(cirq.S.with_probability(0.5)) <= 0.36
|
|
202
205
|
|
|
203
206
|
|
|
204
|
-
def test_str():
|
|
207
|
+
def test_str() -> None:
|
|
205
208
|
assert str(cirq.X.with_probability(0.5)) == 'X[prob=0.5]'
|
|
206
209
|
|
|
207
210
|
|
|
208
|
-
def test_stabilizer_supports_probability():
|
|
211
|
+
def test_stabilizer_supports_probability() -> None:
|
|
209
212
|
q = cirq.LineQubit(0)
|
|
210
213
|
c = cirq.Circuit(cirq.X(q).with_probability(0.5), cirq.measure(q, key='m'))
|
|
211
214
|
m = np.sum(cirq.StabilizerSampler().sample(c, repetitions=100)['m'])
|
|
212
215
|
assert 5 < m < 95
|
|
213
216
|
|
|
214
217
|
|
|
215
|
-
def test_unsupported_stabilizer_safety():
|
|
218
|
+
def test_unsupported_stabilizer_safety() -> None:
|
|
216
219
|
from cirq.protocols.act_on_protocol_test import ExampleSimulationState
|
|
217
220
|
|
|
218
221
|
with pytest.raises(TypeError, match="act_on"):
|