cirq-core 1.5.0.dev20250409222543__py3-none-any.whl → 1.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of cirq-core might be problematic. Click here for more details.
- cirq/__init__.py +16 -17
- cirq/_compat.py +21 -20
- cirq/_compat_test.py +14 -34
- cirq/_doc.py +4 -2
- cirq/_import.py +8 -6
- cirq/_import_test.py +4 -2
- cirq/_version.py +6 -6
- cirq/_version_test.py +2 -2
- cirq/circuits/_block_diagram_drawer.py +11 -10
- cirq/circuits/_block_diagram_drawer_test.py +8 -6
- cirq/circuits/_box_drawing_character_data.py +8 -8
- cirq/circuits/_box_drawing_character_data_test.py +3 -1
- cirq/circuits/_bucket_priority_queue.py +9 -7
- cirq/circuits/_bucket_priority_queue_test.py +22 -20
- cirq/circuits/circuit.py +248 -172
- cirq/circuits/circuit_operation.py +73 -83
- cirq/circuits/circuit_operation_test.py +128 -90
- cirq/circuits/circuit_test.py +211 -151
- cirq/circuits/frozen_circuit.py +23 -60
- cirq/circuits/frozen_circuit_test.py +31 -8
- cirq/circuits/insert_strategy.py +7 -5
- cirq/circuits/insert_strategy_test.py +4 -2
- cirq/circuits/moment.py +88 -40
- cirq/circuits/moment_test.py +128 -51
- cirq/circuits/optimization_pass.py +5 -5
- cirq/circuits/optimization_pass_test.py +10 -10
- cirq/circuits/qasm_output.py +11 -11
- cirq/circuits/qasm_output_test.py +25 -22
- cirq/circuits/text_diagram_drawer.py +23 -38
- cirq/circuits/text_diagram_drawer_test.py +19 -17
- cirq/conftest.py +4 -3
- cirq/contrib/__init__.py +4 -4
- cirq/contrib/acquaintance/__init__.py +1 -1
- cirq/contrib/acquaintance/bipartite.py +5 -8
- cirq/contrib/acquaintance/bipartite_test.py +18 -13
- cirq/contrib/acquaintance/devices.py +2 -2
- cirq/contrib/acquaintance/devices_test.py +5 -3
- cirq/contrib/acquaintance/executor.py +5 -5
- cirq/contrib/acquaintance/executor_test.py +13 -9
- cirq/contrib/acquaintance/gates.py +18 -28
- cirq/contrib/acquaintance/gates_test.py +24 -20
- cirq/contrib/acquaintance/inspection_utils.py +8 -4
- cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
- cirq/contrib/acquaintance/mutation_utils.py +4 -4
- cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
- cirq/contrib/acquaintance/optimizers.py +4 -4
- cirq/contrib/acquaintance/optimizers_test.py +4 -1
- cirq/contrib/acquaintance/permutation.py +15 -27
- cirq/contrib/acquaintance/permutation_test.py +26 -17
- cirq/contrib/acquaintance/shift.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
- cirq/contrib/acquaintance/shift_test.py +8 -6
- cirq/contrib/acquaintance/strategies/cubic.py +2 -2
- cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
- cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
- cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
- cirq/contrib/acquaintance/testing.py +2 -0
- cirq/contrib/acquaintance/topological_sort.py +2 -2
- cirq/contrib/acquaintance/topological_sort_test.py +3 -1
- cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
- cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
- cirq/contrib/circuitdag/circuit_dag.py +4 -4
- cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
- cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
- cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
- cirq/contrib/graph_device/graph_device.py +12 -11
- cirq/contrib/graph_device/graph_device_test.py +18 -14
- cirq/contrib/graph_device/hypergraph.py +16 -14
- cirq/contrib/graph_device/hypergraph_test.py +13 -11
- cirq/contrib/graph_device/uniform_graph_device.py +6 -4
- cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
- cirq/contrib/hacks/disable_validation.py +6 -1
- cirq/contrib/hacks/disable_validation_test.py +3 -1
- cirq/contrib/json.py +31 -5
- cirq/contrib/json_test.py +6 -3
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/__init__.py +17 -0
- cirq/contrib/json_test_data/spec.py +32 -0
- cirq/contrib/noise_models/noise_models.py +119 -5
- cirq/contrib/noise_models/noise_models_test.py +37 -9
- cirq/contrib/paulistring/clifford_optimize.py +6 -4
- cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
- cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
- cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
- cirq/contrib/paulistring/optimize.py +2 -0
- cirq/contrib/paulistring/optimize_test.py +4 -3
- cirq/contrib/paulistring/pauli_string_dag.py +2 -0
- cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
- cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
- cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
- cirq/contrib/paulistring/recombine.py +6 -4
- cirq/contrib/paulistring/recombine_test.py +3 -1
- cirq/contrib/paulistring/separate.py +9 -6
- cirq/contrib/paulistring/separate_test.py +3 -1
- cirq/contrib/qasm_import/_lexer.py +3 -2
- cirq/contrib/qasm_import/_lexer_test.py +49 -13
- cirq/contrib/qasm_import/_parser.py +547 -83
- cirq/contrib/qasm_import/_parser_test.py +988 -97
- cirq/contrib/qasm_import/exception.py +2 -0
- cirq/contrib/qasm_import/qasm.py +8 -2
- cirq/contrib/qasm_import/qasm_test.py +7 -4
- cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
- cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
- cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
- cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
- cirq/contrib/qcircuit/qcircuit_test.py +10 -8
- cirq/contrib/quantum_volume/quantum_volume.py +31 -27
- cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
- cirq/contrib/quimb/density_matrix.py +15 -14
- cirq/contrib/quimb/density_matrix_test.py +10 -7
- cirq/contrib/quimb/grid_circuits.py +5 -2
- cirq/contrib/quimb/grid_circuits_test.py +3 -0
- cirq/contrib/quimb/mps_simulator.py +20 -20
- cirq/contrib/quimb/mps_simulator_test.py +3 -0
- cirq/contrib/quimb/state_vector.py +12 -11
- cirq/contrib/quimb/state_vector_test.py +3 -0
- cirq/contrib/quirk/export_to_quirk.py +5 -3
- cirq/contrib/quirk/export_to_quirk_test.py +18 -16
- cirq/contrib/quirk/linearize_circuit.py +2 -0
- cirq/contrib/quirk/quirk_gate.py +18 -17
- cirq/contrib/routing/device.py +5 -3
- cirq/contrib/routing/device_test.py +2 -0
- cirq/contrib/routing/greedy.py +10 -21
- cirq/contrib/routing/greedy_test.py +4 -2
- cirq/contrib/routing/initialization.py +2 -2
- cirq/contrib/routing/initialization_test.py +5 -3
- cirq/contrib/routing/router.py +9 -5
- cirq/contrib/routing/router_test.py +2 -0
- cirq/contrib/routing/swap_network.py +3 -3
- cirq/contrib/routing/swap_network_test.py +3 -1
- cirq/contrib/routing/utils.py +2 -2
- cirq/contrib/routing/utils_test.py +3 -0
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
- cirq/contrib/svg/svg.py +3 -3
- cirq/contrib/svg/svg_test.py +8 -5
- cirq/devices/device.py +4 -4
- cirq/devices/device_test.py +7 -4
- cirq/devices/grid_device_metadata.py +10 -10
- cirq/devices/grid_device_metadata_test.py +3 -0
- cirq/devices/grid_qubit.py +29 -21
- cirq/devices/grid_qubit_test.py +3 -0
- cirq/devices/insertion_noise_model.py +7 -7
- cirq/devices/insertion_noise_model_test.py +7 -5
- cirq/devices/line_qubit.py +13 -13
- cirq/devices/line_qubit_test.py +2 -0
- cirq/devices/named_topologies.py +18 -29
- cirq/devices/named_topologies_test.py +13 -10
- cirq/devices/noise_model.py +3 -3
- cirq/devices/noise_model_test.py +19 -15
- cirq/devices/noise_properties.py +15 -6
- cirq/devices/noise_properties_test.py +34 -3
- cirq/devices/noise_utils.py +11 -9
- cirq/devices/noise_utils_test.py +2 -0
- cirq/devices/superconducting_qubits_noise_properties.py +23 -22
- cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
- cirq/devices/thermal_noise_model.py +107 -37
- cirq/devices/thermal_noise_model_test.py +21 -0
- cirq/devices/unconstrained_device.py +5 -3
- cirq/devices/unconstrained_device_test.py +2 -0
- cirq/experiments/__init__.py +4 -2
- cirq/experiments/benchmarking/__init__.py +17 -0
- cirq/experiments/benchmarking/parallel_xeb.py +677 -0
- cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
- cirq/experiments/fidelity_estimation.py +14 -8
- cirq/experiments/fidelity_estimation_test.py +3 -0
- cirq/experiments/n_qubit_tomography.py +17 -16
- cirq/experiments/n_qubit_tomography_test.py +8 -5
- cirq/experiments/purity_estimation.py +2 -0
- cirq/experiments/purity_estimation_test.py +2 -0
- cirq/experiments/qubit_characterizations.py +207 -103
- cirq/experiments/qubit_characterizations_test.py +40 -12
- cirq/experiments/random_quantum_circuit_generation.py +56 -70
- cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
- cirq/experiments/readout_confusion_matrix.py +24 -22
- cirq/experiments/readout_confusion_matrix_test.py +2 -0
- cirq/experiments/single_qubit_readout_calibration.py +30 -15
- cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
- cirq/experiments/t1_decay_experiment.py +9 -7
- cirq/experiments/t1_decay_experiment_test.py +13 -11
- cirq/experiments/t2_decay_experiment.py +16 -13
- cirq/experiments/t2_decay_experiment_test.py +2 -0
- cirq/experiments/two_qubit_xeb.py +64 -57
- cirq/experiments/two_qubit_xeb_test.py +10 -6
- cirq/experiments/xeb_fitting.py +39 -35
- cirq/experiments/xeb_sampling.py +37 -44
- cirq/experiments/xeb_sampling_test.py +3 -0
- cirq/experiments/xeb_simulation.py +14 -10
- cirq/experiments/xeb_simulation_test.py +5 -5
- cirq/experiments/z_phase_calibration.py +32 -29
- cirq/experiments/z_phase_calibration_test.py +3 -4
- cirq/interop/quirk/cells/__init__.py +1 -1
- cirq/interop/quirk/cells/all_cells.py +7 -2
- cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
- cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
- cirq/interop/quirk/cells/cell.py +19 -28
- cirq/interop/quirk/cells/cell_test.py +3 -0
- cirq/interop/quirk/cells/composite_cell.py +13 -28
- cirq/interop/quirk/cells/composite_cell_test.py +2 -0
- cirq/interop/quirk/cells/control_cells.py +15 -15
- cirq/interop/quirk/cells/control_cells_test.py +7 -5
- cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
- cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
- cirq/interop/quirk/cells/ignored_cells.py +3 -0
- cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
- cirq/interop/quirk/cells/input_cells.py +7 -5
- cirq/interop/quirk/cells/input_cells_test.py +7 -5
- cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
- cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
- cirq/interop/quirk/cells/measurement_cells.py +5 -2
- cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
- cirq/interop/quirk/cells/parse.py +22 -23
- cirq/interop/quirk/cells/parse_test.py +12 -10
- cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
- cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
- cirq/interop/quirk/cells/scalar_cells.py +4 -1
- cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
- cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
- cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
- cirq/interop/quirk/cells/swap_cell.py +8 -6
- cirq/interop/quirk/cells/swap_cell_test.py +6 -4
- cirq/interop/quirk/cells/testing.py +6 -6
- cirq/interop/quirk/cells/testing_test.py +8 -6
- cirq/interop/quirk/cells/unsupported_cells.py +3 -0
- cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
- cirq/interop/quirk/url_to_circuit.py +23 -36
- cirq/interop/quirk/url_to_circuit_test.py +4 -1
- cirq/json_resolver_cache.py +14 -12
- cirq/linalg/__init__.py +4 -6
- cirq/linalg/combinators.py +7 -5
- cirq/linalg/combinators_test.py +10 -7
- cirq/linalg/decompositions.py +24 -35
- cirq/linalg/decompositions_test.py +3 -1
- cirq/linalg/diagonalize.py +6 -4
- cirq/linalg/diagonalize_test.py +15 -14
- cirq/linalg/operator_spaces.py +14 -14
- cirq/linalg/operator_spaces_test.py +13 -11
- cirq/linalg/predicates.py +18 -9
- cirq/linalg/predicates_test.py +5 -0
- cirq/linalg/tolerance.py +6 -3
- cirq/linalg/tolerance_test.py +6 -4
- cirq/linalg/transformations.py +23 -20
- cirq/linalg/transformations_test.py +73 -43
- cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
- cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
- cirq/neutral_atoms/neutral_atom_devices.py +2 -0
- cirq/ops/__init__.py +2 -0
- cirq/ops/arithmetic_operation.py +21 -21
- cirq/ops/arithmetic_operation_test.py +7 -8
- cirq/ops/boolean_hamiltonian.py +23 -22
- cirq/ops/boolean_hamiltonian_test.py +12 -9
- cirq/ops/classically_controlled_operation.py +31 -36
- cirq/ops/classically_controlled_operation_test.py +121 -117
- cirq/ops/clifford_gate.py +98 -81
- cirq/ops/clifford_gate_test.py +72 -57
- cirq/ops/common_channels.py +44 -44
- cirq/ops/common_channels_test.py +83 -81
- cirq/ops/common_gate_families.py +9 -7
- cirq/ops/common_gate_families_test.py +11 -7
- cirq/ops/common_gates.py +164 -183
- cirq/ops/common_gates_test.py +135 -95
- cirq/ops/control_values.py +23 -26
- cirq/ops/control_values_test.py +22 -20
- cirq/ops/controlled_gate.py +64 -112
- cirq/ops/controlled_gate_test.py +130 -35
- cirq/ops/controlled_operation.py +24 -35
- cirq/ops/controlled_operation_test.py +8 -6
- cirq/ops/dense_pauli_string.py +38 -49
- cirq/ops/dense_pauli_string_test.py +4 -2
- cirq/ops/diagonal_gate.py +18 -31
- cirq/ops/diagonal_gate_test.py +13 -13
- cirq/ops/eigen_gate.py +29 -29
- cirq/ops/eigen_gate_test.py +45 -28
- cirq/ops/fourier_transform.py +14 -20
- cirq/ops/fourier_transform_test.py +15 -12
- cirq/ops/fsim_gate.py +43 -42
- cirq/ops/fsim_gate_test.py +29 -29
- cirq/ops/gate_features.py +2 -0
- cirq/ops/gate_features_test.py +5 -3
- cirq/ops/gate_operation.py +43 -65
- cirq/ops/gate_operation_test.py +46 -42
- cirq/ops/gateset.py +28 -40
- cirq/ops/gateset_test.py +4 -2
- cirq/ops/global_phase_op.py +45 -20
- cirq/ops/global_phase_op_test.py +44 -20
- cirq/ops/greedy_qubit_manager.py +10 -8
- cirq/ops/greedy_qubit_manager_test.py +5 -3
- cirq/ops/identity.py +14 -12
- cirq/ops/identity_test.py +24 -20
- cirq/ops/kraus_channel.py +11 -8
- cirq/ops/kraus_channel_test.py +14 -11
- cirq/ops/linear_combinations.py +65 -77
- cirq/ops/linear_combinations_test.py +14 -9
- cirq/ops/matrix_gates.py +21 -18
- cirq/ops/matrix_gates_test.py +16 -0
- cirq/ops/measure_util.py +15 -20
- cirq/ops/measure_util_test.py +2 -0
- cirq/ops/measurement_gate.py +26 -37
- cirq/ops/measurement_gate_test.py +2 -0
- cirq/ops/mixed_unitary_channel.py +12 -9
- cirq/ops/mixed_unitary_channel_test.py +14 -11
- cirq/ops/named_qubit.py +16 -13
- cirq/ops/named_qubit_test.py +15 -13
- cirq/ops/op_tree.py +9 -7
- cirq/ops/op_tree_test.py +22 -19
- cirq/ops/parallel_gate.py +15 -17
- cirq/ops/parallel_gate_test.py +18 -16
- cirq/ops/parity_gates.py +23 -25
- cirq/ops/parity_gates_test.py +36 -32
- cirq/ops/pauli_gates.py +22 -21
- cirq/ops/pauli_gates_test.py +29 -20
- cirq/ops/pauli_interaction_gate.py +15 -19
- cirq/ops/pauli_interaction_gate_test.py +10 -8
- cirq/ops/pauli_measurement_gate.py +23 -35
- cirq/ops/pauli_measurement_gate_test.py +2 -0
- cirq/ops/pauli_string.py +92 -120
- cirq/ops/pauli_string_phasor.py +52 -45
- cirq/ops/pauli_string_phasor_test.py +4 -5
- cirq/ops/pauli_string_raw_types.py +9 -7
- cirq/ops/pauli_string_raw_types_test.py +2 -0
- cirq/ops/pauli_string_test.py +31 -154
- cirq/ops/pauli_sum_exponential.py +12 -12
- cirq/ops/pauli_sum_exponential_test.py +12 -10
- cirq/ops/permutation_gate.py +8 -6
- cirq/ops/permutation_gate_test.py +10 -8
- cirq/ops/phased_iswap_gate.py +16 -16
- cirq/ops/phased_iswap_gate_test.py +17 -15
- cirq/ops/phased_x_gate.py +16 -17
- cirq/ops/phased_x_gate_test.py +18 -16
- cirq/ops/phased_x_z_gate.py +24 -22
- cirq/ops/phased_x_z_gate_test.py +17 -11
- cirq/ops/projector.py +16 -11
- cirq/ops/projector_test.py +19 -16
- cirq/ops/qid_util.py +7 -5
- cirq/ops/qid_util_test.py +2 -0
- cirq/ops/qubit_manager.py +11 -9
- cirq/ops/qubit_manager_test.py +6 -4
- cirq/ops/qubit_order.py +11 -14
- cirq/ops/qubit_order_or_list.py +4 -2
- cirq/ops/qubit_order_test.py +12 -10
- cirq/ops/random_gate_channel.py +12 -10
- cirq/ops/random_gate_channel_test.py +14 -11
- cirq/ops/raw_types.py +109 -129
- cirq/ops/raw_types_test.py +63 -57
- cirq/ops/state_preparation_channel.py +7 -7
- cirq/ops/state_preparation_channel_test.py +11 -9
- cirq/ops/swap_gates.py +13 -15
- cirq/ops/swap_gates_test.py +19 -17
- cirq/ops/tags.py +5 -3
- cirq/ops/tags_test.py +4 -2
- cirq/ops/three_qubit_gates.py +43 -76
- cirq/ops/three_qubit_gates_test.py +19 -17
- cirq/ops/two_qubit_diagonal_gate.py +13 -13
- cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
- cirq/ops/uniform_superposition_gate.py +5 -3
- cirq/ops/uniform_superposition_gate_test.py +5 -3
- cirq/ops/wait_gate.py +17 -14
- cirq/ops/wait_gate_test.py +9 -6
- cirq/protocols/__init__.py +0 -3
- cirq/protocols/act_on_protocol.py +8 -6
- cirq/protocols/act_on_protocol_test.py +15 -12
- cirq/protocols/apply_channel_protocol.py +10 -14
- cirq/protocols/apply_channel_protocol_test.py +2 -0
- cirq/protocols/apply_mixture_protocol.py +13 -42
- cirq/protocols/apply_mixture_protocol_test.py +7 -5
- cirq/protocols/apply_unitary_protocol.py +39 -34
- cirq/protocols/apply_unitary_protocol_test.py +4 -1
- cirq/protocols/approximate_equality_protocol.py +2 -0
- cirq/protocols/approximate_equality_protocol_test.py +2 -0
- cirq/protocols/circuit_diagram_info_protocol.py +58 -42
- cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
- cirq/protocols/commutes_protocol.py +8 -7
- cirq/protocols/commutes_protocol_test.py +2 -0
- cirq/protocols/control_key_protocol.py +6 -4
- cirq/protocols/control_key_protocol_test.py +3 -1
- cirq/protocols/decompose_protocol.py +49 -48
- cirq/protocols/decompose_protocol_test.py +27 -16
- cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
- cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
- cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
- cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
- cirq/protocols/has_unitary_protocol.py +10 -6
- cirq/protocols/has_unitary_protocol_test.py +13 -8
- cirq/protocols/hash_from_pickle_test.py +2 -11
- cirq/protocols/inverse_protocol.py +13 -16
- cirq/protocols/inverse_protocol_test.py +5 -3
- cirq/protocols/json_serialization.py +35 -54
- cirq/protocols/json_serialization_test.py +14 -21
- cirq/protocols/json_test_data/CXSWAP.json +46 -0
- cirq/protocols/json_test_data/CXSWAP.repr +13 -0
- cirq/protocols/json_test_data/CZSWAP.json +46 -0
- cirq/protocols/json_test_data/CZSWAP.repr +13 -0
- cirq/protocols/json_test_data/CircuitOperation.json +6 -3
- cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
- cirq/protocols/json_test_data/Moment.json +24 -1
- cirq/protocols/json_test_data/Moment.repr +6 -1
- cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
- cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
- cirq/protocols/json_test_data/spec.py +6 -2
- cirq/protocols/kraus_protocol.py +47 -7
- cirq/protocols/kraus_protocol_test.py +86 -12
- cirq/protocols/measurement_key_protocol.py +15 -16
- cirq/protocols/measurement_key_protocol_test.py +13 -11
- cirq/protocols/mixture_protocol.py +7 -5
- cirq/protocols/mixture_protocol_test.py +4 -2
- cirq/protocols/mul_protocol.py +2 -3
- cirq/protocols/mul_protocol_test.py +2 -0
- cirq/protocols/pauli_expansion_protocol.py +6 -3
- cirq/protocols/pauli_expansion_protocol_test.py +5 -3
- cirq/protocols/phase_protocol.py +2 -0
- cirq/protocols/phase_protocol_test.py +3 -1
- cirq/protocols/pow_protocol.py +11 -16
- cirq/protocols/pow_protocol_test.py +2 -0
- cirq/protocols/qasm.py +14 -20
- cirq/protocols/qasm_test.py +6 -3
- cirq/protocols/qid_shape_protocol.py +8 -8
- cirq/protocols/qid_shape_protocol_test.py +3 -1
- cirq/protocols/resolve_parameters.py +5 -3
- cirq/protocols/resolve_parameters_test.py +8 -7
- cirq/protocols/trace_distance_bound.py +6 -4
- cirq/protocols/trace_distance_bound_test.py +3 -1
- cirq/protocols/unitary_protocol.py +17 -7
- cirq/protocols/unitary_protocol_test.py +12 -2
- cirq/qis/channels.py +6 -2
- cirq/qis/channels_test.py +20 -16
- cirq/qis/clifford_tableau.py +21 -19
- cirq/qis/clifford_tableau_test.py +2 -2
- cirq/qis/entropy.py +14 -3
- cirq/qis/entropy_test.py +3 -1
- cirq/qis/measures.py +13 -13
- cirq/qis/measures_test.py +20 -14
- cirq/qis/noise_utils.py +2 -0
- cirq/qis/noise_utils_test.py +9 -7
- cirq/qis/quantum_state_representation.py +7 -8
- cirq/qis/states.py +58 -56
- cirq/qis/states_test.py +2 -0
- cirq/sim/classical_simulator.py +23 -22
- cirq/sim/classical_simulator_test.py +2 -0
- cirq/sim/clifford/clifford_simulator.py +23 -21
- cirq/sim/clifford/clifford_simulator_test.py +7 -4
- cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
- cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
- cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
- cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
- cirq/sim/clifford/stabilizer_sampler.py +9 -7
- cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
- cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
- cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
- cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
- cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
- cirq/sim/density_matrix_simulation_state.py +26 -27
- cirq/sim/density_matrix_simulation_state_test.py +10 -8
- cirq/sim/density_matrix_simulator.py +30 -28
- cirq/sim/density_matrix_simulator_test.py +48 -48
- cirq/sim/density_matrix_utils.py +13 -11
- cirq/sim/density_matrix_utils_test.py +38 -36
- cirq/sim/mux.py +33 -31
- cirq/sim/mux_test.py +3 -0
- cirq/sim/simulation_product_state.py +15 -15
- cirq/sim/simulation_product_state_test.py +29 -26
- cirq/sim/simulation_state.py +29 -38
- cirq/sim/simulation_state_base.py +21 -32
- cirq/sim/simulation_state_test.py +15 -13
- cirq/sim/simulation_utils.py +5 -2
- cirq/sim/simulation_utils_test.py +5 -2
- cirq/sim/simulator.py +90 -106
- cirq/sim/simulator_base.py +33 -45
- cirq/sim/simulator_base_test.py +20 -15
- cirq/sim/simulator_test.py +23 -14
- cirq/sim/sparse_simulator.py +19 -17
- cirq/sim/sparse_simulator_test.py +41 -40
- cirq/sim/state_vector.py +15 -12
- cirq/sim/state_vector_simulation_state.py +31 -31
- cirq/sim/state_vector_simulation_state_test.py +16 -14
- cirq/sim/state_vector_simulator.py +17 -14
- cirq/sim/state_vector_simulator_test.py +2 -0
- cirq/sim/state_vector_test.py +6 -3
- cirq/study/flatten_expressions.py +16 -15
- cirq/study/flatten_expressions_test.py +13 -11
- cirq/study/resolver.py +18 -17
- cirq/study/resolver_test.py +22 -20
- cirq/study/result.py +17 -27
- cirq/study/result_test.py +2 -0
- cirq/study/sweepable.py +12 -10
- cirq/study/sweepable_test.py +3 -0
- cirq/study/sweeps.py +42 -61
- cirq/study/sweeps_test.py +33 -0
- cirq/testing/__init__.py +7 -11
- cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
- cirq/testing/circuit_compare.py +8 -17
- cirq/testing/circuit_compare_test.py +2 -0
- cirq/testing/consistent_act_on.py +13 -11
- cirq/testing/consistent_act_on_test.py +5 -3
- cirq/testing/consistent_channels.py +2 -0
- cirq/testing/consistent_channels_test.py +10 -8
- cirq/testing/consistent_controlled_gate_op.py +5 -5
- cirq/testing/consistent_controlled_gate_op_test.py +18 -18
- cirq/testing/consistent_decomposition.py +2 -2
- cirq/testing/consistent_decomposition_test.py +4 -2
- cirq/testing/consistent_pauli_expansion.py +2 -0
- cirq/testing/consistent_pauli_expansion_test.py +3 -1
- cirq/testing/consistent_phase_by.py +2 -0
- cirq/testing/consistent_phase_by_test.py +3 -1
- cirq/testing/consistent_protocols.py +14 -20
- cirq/testing/consistent_protocols_test.py +13 -11
- cirq/testing/consistent_qasm.py +6 -4
- cirq/testing/consistent_qasm_test.py +7 -7
- cirq/testing/consistent_resolve_parameters.py +2 -0
- cirq/testing/consistent_specified_has_unitary.py +2 -2
- cirq/testing/consistent_specified_has_unitary_test.py +6 -4
- cirq/testing/consistent_unitary.py +1 -0
- cirq/testing/consistent_unitary_test.py +4 -2
- cirq/testing/deprecation.py +5 -2
- cirq/testing/deprecation_test.py +5 -2
- cirq/testing/devices.py +7 -4
- cirq/testing/devices_test.py +7 -4
- cirq/testing/equals_tester.py +4 -2
- cirq/testing/equals_tester_test.py +21 -17
- cirq/testing/equivalent_basis_map.py +6 -4
- cirq/testing/equivalent_basis_map_test.py +6 -4
- cirq/testing/equivalent_repr_eval.py +6 -4
- cirq/testing/equivalent_repr_eval_test.py +5 -3
- cirq/testing/gate_features.py +2 -0
- cirq/testing/gate_features_test.py +7 -5
- cirq/testing/json.py +19 -15
- cirq/testing/json_test.py +5 -3
- cirq/testing/lin_alg_utils.py +10 -11
- cirq/testing/lin_alg_utils_test.py +14 -12
- cirq/testing/logs.py +7 -6
- cirq/testing/logs_test.py +9 -7
- cirq/testing/no_identifier_qubit.py +4 -2
- cirq/testing/no_identifier_qubit_test.py +5 -3
- cirq/testing/op_tree.py +2 -0
- cirq/testing/op_tree_test.py +4 -1
- cirq/testing/order_tester.py +2 -0
- cirq/testing/order_tester_test.py +8 -6
- cirq/testing/pytest_utils.py +2 -0
- cirq/testing/pytest_utils_test.py +4 -2
- cirq/testing/random_circuit.py +21 -20
- cirq/testing/random_circuit_test.py +12 -9
- cirq/testing/repr_pretty_tester.py +1 -0
- cirq/testing/repr_pretty_tester_test.py +5 -3
- cirq/testing/routing_devices.py +4 -1
- cirq/testing/routing_devices_test.py +9 -6
- cirq/testing/sample_circuits.py +4 -1
- cirq/testing/sample_circuits_test.py +3 -1
- cirq/testing/sample_gates.py +3 -0
- cirq/testing/sample_gates_test.py +5 -2
- cirq/transformers/__init__.py +11 -4
- cirq/transformers/align.py +9 -7
- cirq/transformers/align_test.py +2 -0
- cirq/transformers/analytical_decompositions/__init__.py +3 -6
- cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
- cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
- cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
- cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
- cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
- cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
- cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
- cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
- cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
- cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
- cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
- cirq/transformers/drop_empty_moments.py +5 -3
- cirq/transformers/drop_empty_moments_test.py +4 -2
- cirq/transformers/drop_negligible_operations.py +7 -5
- cirq/transformers/drop_negligible_operations_test.py +2 -0
- cirq/transformers/dynamical_decoupling.py +49 -42
- cirq/transformers/dynamical_decoupling_test.py +223 -205
- cirq/transformers/eject_phased_paulis.py +28 -26
- cirq/transformers/eject_phased_paulis_test.py +12 -9
- cirq/transformers/eject_z.py +12 -12
- cirq/transformers/eject_z_test.py +2 -2
- cirq/transformers/expand_composite.py +6 -4
- cirq/transformers/expand_composite_test.py +3 -1
- cirq/transformers/gauge_compiling/__init__.py +3 -1
- cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
- cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
- cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
- cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
- cirq/transformers/insertion_sort.py +8 -6
- cirq/transformers/insertion_sort_test.py +3 -1
- cirq/transformers/measurement_transformers.py +29 -29
- cirq/transformers/measurement_transformers_test.py +2 -0
- cirq/transformers/merge_k_qubit_gates.py +12 -10
- cirq/transformers/merge_k_qubit_gates_test.py +18 -18
- cirq/transformers/merge_single_qubit_gates.py +197 -20
- cirq/transformers/merge_single_qubit_gates_test.py +177 -5
- cirq/transformers/noise_adding.py +5 -3
- cirq/transformers/noise_adding_test.py +2 -0
- cirq/transformers/optimize_for_target_gateset.py +19 -17
- cirq/transformers/optimize_for_target_gateset_test.py +11 -8
- cirq/transformers/qubit_management_transformers.py +13 -11
- cirq/transformers/qubit_management_transformers_test.py +5 -3
- cirq/transformers/randomized_measurements.py +16 -14
- cirq/transformers/randomized_measurements_test.py +10 -4
- cirq/transformers/routing/initial_mapper.py +6 -4
- cirq/transformers/routing/initial_mapper_test.py +2 -0
- cirq/transformers/routing/line_initial_mapper.py +16 -14
- cirq/transformers/routing/line_initial_mapper_test.py +9 -7
- cirq/transformers/routing/mapping_manager.py +10 -10
- cirq/transformers/routing/mapping_manager_test.py +2 -0
- cirq/transformers/routing/route_circuit_cqc.py +33 -31
- cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
- cirq/transformers/routing/visualize_routed_circuit.py +8 -7
- cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
- cirq/transformers/stratify.py +17 -15
- cirq/transformers/stratify_test.py +3 -0
- cirq/transformers/symbolize.py +103 -0
- cirq/transformers/symbolize_test.py +62 -0
- cirq/transformers/synchronize_terminal_measurements.py +10 -10
- cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
- cirq/transformers/tag_transformers.py +97 -0
- cirq/transformers/tag_transformers_test.py +103 -0
- cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
- cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
- cirq/transformers/target_gatesets/cz_gateset.py +7 -5
- cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
- cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
- cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
- cirq/transformers/transformer_api.py +34 -47
- cirq/transformers/transformer_api_test.py +9 -8
- cirq/transformers/transformer_primitives.py +39 -49
- cirq/transformers/transformer_primitives_test.py +10 -17
- cirq/value/abc_alt.py +6 -4
- cirq/value/abc_alt_test.py +5 -3
- cirq/value/angle.py +11 -12
- cirq/value/angle_test.py +5 -3
- cirq/value/classical_data.py +27 -27
- cirq/value/classical_data_test.py +11 -8
- cirq/value/condition.py +26 -24
- cirq/value/condition_test.py +2 -0
- cirq/value/digits.py +14 -11
- cirq/value/digits_test.py +2 -0
- cirq/value/duration.py +23 -20
- cirq/value/duration_test.py +2 -0
- cirq/value/linear_dict.py +25 -30
- cirq/value/linear_dict_test.py +10 -8
- cirq/value/measurement_key.py +12 -12
- cirq/value/measurement_key_test.py +2 -0
- cirq/value/periodic_value.py +4 -4
- cirq/value/periodic_value_test.py +11 -7
- cirq/value/probability.py +3 -1
- cirq/value/probability_test.py +4 -2
- cirq/value/product_state.py +15 -13
- cirq/value/product_state_test.py +4 -1
- cirq/value/random_state.py +2 -0
- cirq/value/random_state_test.py +5 -3
- cirq/value/timestamp.py +11 -7
- cirq/value/timestamp_test.py +14 -12
- cirq/value/type_alias.py +4 -4
- cirq/value/value_equality_attr.py +8 -9
- cirq/value/value_equality_attr_test.py +14 -11
- cirq/vis/density_matrix.py +3 -3
- cirq/vis/density_matrix_test.py +20 -17
- cirq/vis/heatmap.py +24 -37
- cirq/vis/heatmap_test.py +3 -0
- cirq/vis/histogram.py +9 -6
- cirq/vis/histogram_test.py +5 -2
- cirq/vis/state_histogram.py +10 -8
- cirq/vis/state_histogram_test.py +7 -5
- cirq/vis/vis_utils.py +4 -1
- cirq/vis/vis_utils_test.py +4 -1
- cirq/work/collector.py +12 -18
- cirq/work/collector_test.py +15 -10
- cirq/work/observable_grouping.py +6 -7
- cirq/work/observable_grouping_test.py +10 -9
- cirq/work/observable_measurement.py +47 -45
- cirq/work/observable_measurement_data.py +22 -17
- cirq/work/observable_measurement_data_test.py +4 -1
- cirq/work/observable_measurement_test.py +48 -29
- cirq/work/observable_readout_calibration.py +5 -2
- cirq/work/observable_readout_calibration_test.py +5 -2
- cirq/work/observable_settings.py +13 -22
- cirq/work/observable_settings_test.py +9 -7
- cirq/work/pauli_sum_collector.py +12 -10
- cirq/work/pauli_sum_collector_test.py +9 -9
- cirq/work/sampler.py +42 -43
- cirq/work/sampler_test.py +31 -24
- cirq/work/zeros_sampler.py +6 -4
- cirq/work/zeros_sampler_test.py +7 -5
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
- cirq_core-1.6.0.dist-info/RECORD +1241 -0
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
- cirq_core-1.5.0.dev20250409222543.dist-info/RECORD +0 -1216
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
cirq/ops/identity.py
CHANGED
|
@@ -13,9 +13,11 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
"""IdentityGate."""
|
|
15
15
|
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
16
18
|
import numbers
|
|
17
19
|
from types import NotImplementedType
|
|
18
|
-
from typing import Any,
|
|
20
|
+
from typing import Any, Sequence, TYPE_CHECKING
|
|
19
21
|
|
|
20
22
|
import numpy as np
|
|
21
23
|
import sympy
|
|
@@ -39,7 +41,7 @@ class IdentityGate(raw_types.Gate):
|
|
|
39
41
|
"""
|
|
40
42
|
|
|
41
43
|
def __init__(
|
|
42
|
-
self, num_qubits:
|
|
44
|
+
self, num_qubits: int | None = None, qid_shape: tuple[int, ...] | None = None
|
|
43
45
|
) -> None:
|
|
44
46
|
"""Inits IdentityGate.
|
|
45
47
|
|
|
@@ -63,10 +65,10 @@ class IdentityGate(raw_types.Gate):
|
|
|
63
65
|
if len(self._qid_shape) != num_qubits:
|
|
64
66
|
raise ValueError('len(qid_shape) != num_qubits')
|
|
65
67
|
|
|
66
|
-
def _act_on_(self, sim_state:
|
|
68
|
+
def _act_on_(self, sim_state: cirq.SimulationStateBase, qubits: Sequence[cirq.Qid]):
|
|
67
69
|
return True
|
|
68
70
|
|
|
69
|
-
def _qid_shape_(self) ->
|
|
71
|
+
def _qid_shape_(self) -> tuple[int, ...]:
|
|
70
72
|
return self._qid_shape
|
|
71
73
|
|
|
72
74
|
def num_qubits(self) -> int:
|
|
@@ -77,7 +79,7 @@ class IdentityGate(raw_types.Gate):
|
|
|
77
79
|
return self
|
|
78
80
|
return NotImplemented
|
|
79
81
|
|
|
80
|
-
def _commutes_(self, other: Any, *, atol: float = 1e-8) ->
|
|
82
|
+
def _commutes_(self, other: Any, *, atol: float = 1e-8) -> bool | NotImplementedType:
|
|
81
83
|
"""The identity gate commutes with all other gates."""
|
|
82
84
|
if not isinstance(other, raw_types.Gate):
|
|
83
85
|
return NotImplemented
|
|
@@ -89,7 +91,7 @@ class IdentityGate(raw_types.Gate):
|
|
|
89
91
|
def _unitary_(self) -> np.ndarray:
|
|
90
92
|
return np.identity(np.prod(self._qid_shape, dtype=np.int64).item())
|
|
91
93
|
|
|
92
|
-
def _apply_unitary_(self, args:
|
|
94
|
+
def _apply_unitary_(self, args: protocols.ApplyUnitaryArgs) -> np.ndarray | None:
|
|
93
95
|
return args.target_tensor
|
|
94
96
|
|
|
95
97
|
def _pauli_expansion_(self) -> value.LinearDict[str]:
|
|
@@ -104,7 +106,7 @@ class IdentityGate(raw_types.Gate):
|
|
|
104
106
|
return f'cirq.IdentityGate({len(self._qid_shape)})'
|
|
105
107
|
return f'cirq.IdentityGate(qid_shape={self._qid_shape!r})'
|
|
106
108
|
|
|
107
|
-
def _decompose_(self, qubits) ->
|
|
109
|
+
def _decompose_(self, qubits) -> cirq.OP_TREE:
|
|
108
110
|
return []
|
|
109
111
|
|
|
110
112
|
def __str__(self) -> str:
|
|
@@ -118,13 +120,13 @@ class IdentityGate(raw_types.Gate):
|
|
|
118
120
|
def _trace_distance_bound_(self) -> float:
|
|
119
121
|
return 0.0
|
|
120
122
|
|
|
121
|
-
def _json_dict_(self) ->
|
|
123
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
122
124
|
other = {}
|
|
123
125
|
if not all(d == 2 for d in self._qid_shape):
|
|
124
126
|
other['qid_shape'] = self._qid_shape
|
|
125
127
|
return {'num_qubits': len(self._qid_shape), **other}
|
|
126
128
|
|
|
127
|
-
def _mul_with_qubits(self, qubits:
|
|
129
|
+
def _mul_with_qubits(self, qubits: tuple[cirq.Qid, ...], other):
|
|
128
130
|
if isinstance(other, raw_types.Operation):
|
|
129
131
|
return other
|
|
130
132
|
if isinstance(other, numbers.Complex):
|
|
@@ -135,12 +137,12 @@ class IdentityGate(raw_types.Gate):
|
|
|
135
137
|
|
|
136
138
|
_rmul_with_qubits = _mul_with_qubits
|
|
137
139
|
|
|
138
|
-
def _circuit_diagram_info_(self, args) ->
|
|
140
|
+
def _circuit_diagram_info_(self, args) -> tuple[str, ...]:
|
|
139
141
|
if self.num_qubits() <= 0:
|
|
140
142
|
return NotImplemented
|
|
141
143
|
return ('I',) * self.num_qubits()
|
|
142
144
|
|
|
143
|
-
def _qasm_(self, args:
|
|
145
|
+
def _qasm_(self, args: cirq.QasmArgs, qubits: tuple[cirq.Qid, ...]) -> str | None:
|
|
144
146
|
args.validate_version('2.0', '3.0')
|
|
145
147
|
return ''.join([args.format('id {0};\n', qubit) for qubit in qubits])
|
|
146
148
|
|
|
@@ -163,7 +165,7 @@ document(
|
|
|
163
165
|
)
|
|
164
166
|
|
|
165
167
|
|
|
166
|
-
def identity_each(*qubits:
|
|
168
|
+
def identity_each(*qubits: cirq.Qid) -> cirq.Operation:
|
|
167
169
|
"""Returns a single IdentityGate applied to all the given qubits.
|
|
168
170
|
|
|
169
171
|
Args:
|
cirq/ops/identity_test.py
CHANGED
|
@@ -11,6 +11,9 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
14
17
|
import itertools
|
|
15
18
|
from typing import Any
|
|
16
19
|
from unittest import mock
|
|
@@ -23,7 +26,7 @@ import cirq
|
|
|
23
26
|
|
|
24
27
|
|
|
25
28
|
@pytest.mark.parametrize('num_qubits', [1, 2, 4])
|
|
26
|
-
def test_identity_init(num_qubits):
|
|
29
|
+
def test_identity_init(num_qubits) -> None:
|
|
27
30
|
assert cirq.IdentityGate(num_qubits).num_qubits() == num_qubits
|
|
28
31
|
assert cirq.qid_shape(cirq.IdentityGate(num_qubits)) == (2,) * num_qubits
|
|
29
32
|
assert cirq.qid_shape(cirq.IdentityGate(3, (1, 2, 3))) == (1, 2, 3)
|
|
@@ -34,7 +37,7 @@ def test_identity_init(num_qubits):
|
|
|
34
37
|
cirq.IdentityGate()
|
|
35
38
|
|
|
36
39
|
|
|
37
|
-
def test_identity_on_each():
|
|
40
|
+
def test_identity_on_each() -> None:
|
|
38
41
|
q0, q1, q2 = cirq.LineQubit.range(3)
|
|
39
42
|
assert cirq.I.on_each(q0, q1, q2) == [cirq.I(q0), cirq.I(q1), cirq.I(q2)]
|
|
40
43
|
assert cirq.I.on_each([q0, [q1], q2]) == [cirq.I(q0), cirq.I(q1), cirq.I(q2)]
|
|
@@ -43,7 +46,7 @@ def test_identity_on_each():
|
|
|
43
46
|
cirq.I.on_each('abc')
|
|
44
47
|
|
|
45
48
|
|
|
46
|
-
def test_identity_on_each_iter_second():
|
|
49
|
+
def test_identity_on_each_iter_second() -> None:
|
|
47
50
|
class Q(cirq.Qid):
|
|
48
51
|
@property
|
|
49
52
|
def dimension(self) -> int:
|
|
@@ -60,7 +63,7 @@ def test_identity_on_each_iter_second():
|
|
|
60
63
|
assert cirq.I.on_each(q) == [cirq.I(q)]
|
|
61
64
|
|
|
62
65
|
|
|
63
|
-
def test_identity_on_each_only_single_qubit():
|
|
66
|
+
def test_identity_on_each_only_single_qubit() -> None:
|
|
64
67
|
q0, q1 = cirq.LineQubit.range(2)
|
|
65
68
|
q0_3, q1_3 = q0.with_dimension(3), q1.with_dimension(3)
|
|
66
69
|
assert cirq.I.on_each(q0, q1) == [cirq.I.on(q0), cirq.I.on(q1)]
|
|
@@ -70,7 +73,7 @@ def test_identity_on_each_only_single_qubit():
|
|
|
70
73
|
]
|
|
71
74
|
|
|
72
75
|
|
|
73
|
-
def test_identity_on_each_two_qubits():
|
|
76
|
+
def test_identity_on_each_two_qubits() -> None:
|
|
74
77
|
q0, q1, q2, q3 = cirq.LineQubit.range(4)
|
|
75
78
|
q0_3, q1_3 = q0.with_dimension(3), q1.with_dimension(3)
|
|
76
79
|
assert cirq.IdentityGate(2).on_each([(q0, q1)]) == [cirq.IdentityGate(2)(q0, q1)]
|
|
@@ -93,14 +96,14 @@ def test_identity_on_each_two_qubits():
|
|
|
93
96
|
|
|
94
97
|
|
|
95
98
|
@pytest.mark.parametrize('num_qubits', [1, 2, 4])
|
|
96
|
-
def test_identity_unitary(num_qubits):
|
|
99
|
+
def test_identity_unitary(num_qubits) -> None:
|
|
97
100
|
i = cirq.IdentityGate(num_qubits)
|
|
98
101
|
assert np.allclose(cirq.unitary(i), np.identity(2**num_qubits))
|
|
99
102
|
i3 = cirq.IdentityGate(num_qubits, (3,) * num_qubits)
|
|
100
103
|
assert np.allclose(cirq.unitary(i3), np.identity(3**num_qubits))
|
|
101
104
|
|
|
102
105
|
|
|
103
|
-
def test_identity_str():
|
|
106
|
+
def test_identity_str() -> None:
|
|
104
107
|
assert str(cirq.IdentityGate(1)) == 'I'
|
|
105
108
|
assert str(cirq.IdentityGate(2)) == 'I(2)'
|
|
106
109
|
# Qid shape is not included in str
|
|
@@ -108,13 +111,13 @@ def test_identity_str():
|
|
|
108
111
|
assert str(cirq.IdentityGate(2, (1, 2))) == 'I(2)'
|
|
109
112
|
|
|
110
113
|
|
|
111
|
-
def test_identity_repr():
|
|
114
|
+
def test_identity_repr() -> None:
|
|
112
115
|
assert repr(cirq.I) == 'cirq.I'
|
|
113
116
|
assert repr(cirq.IdentityGate(5)) == 'cirq.IdentityGate(5)'
|
|
114
117
|
assert repr(cirq.IdentityGate(qid_shape=(2, 3))) == 'cirq.IdentityGate(qid_shape=(2, 3))'
|
|
115
118
|
|
|
116
119
|
|
|
117
|
-
def test_identity_apply_unitary():
|
|
120
|
+
def test_identity_apply_unitary() -> None:
|
|
118
121
|
v = np.array([1, 0])
|
|
119
122
|
result = cirq.apply_unitary(cirq.I, cirq.ApplyUnitaryArgs(v, np.array([0, 1]), (0,)))
|
|
120
123
|
assert result is v
|
|
@@ -126,7 +129,7 @@ def test_identity_apply_unitary():
|
|
|
126
129
|
assert result is v
|
|
127
130
|
|
|
128
131
|
|
|
129
|
-
def test_identity_eq():
|
|
132
|
+
def test_identity_eq() -> None:
|
|
130
133
|
equals_tester = cirq.testing.EqualsTester()
|
|
131
134
|
equals_tester.make_equality_group(
|
|
132
135
|
lambda: cirq.I, lambda: cirq.IdentityGate(1), lambda: cirq.IdentityGate(1, (2,))
|
|
@@ -137,12 +140,12 @@ def test_identity_eq():
|
|
|
137
140
|
equals_tester.add_equality_group(cirq.IdentityGate(4, (1, 2, 3, 4)))
|
|
138
141
|
|
|
139
142
|
|
|
140
|
-
def test_identity_trace_distance_bound():
|
|
143
|
+
def test_identity_trace_distance_bound() -> None:
|
|
141
144
|
assert cirq.I._trace_distance_bound_() == 0
|
|
142
145
|
assert cirq.IdentityGate(num_qubits=2)._trace_distance_bound_() == 0
|
|
143
146
|
|
|
144
147
|
|
|
145
|
-
def test_identity_pow():
|
|
148
|
+
def test_identity_pow() -> None:
|
|
146
149
|
I = cirq.I
|
|
147
150
|
q = cirq.NamedQubit('q')
|
|
148
151
|
|
|
@@ -156,28 +159,29 @@ def test_identity_pow():
|
|
|
156
159
|
_ = I(q) ** q
|
|
157
160
|
|
|
158
161
|
|
|
159
|
-
def test_pauli_expansion_notimplemented():
|
|
162
|
+
def test_pauli_expansion_notimplemented() -> None:
|
|
160
163
|
assert cirq.IdentityGate(1, (3,))._pauli_expansion_() == NotImplemented
|
|
161
164
|
|
|
162
165
|
|
|
163
166
|
@pytest.mark.parametrize(
|
|
164
167
|
'gate_type, num_qubits', itertools.product((cirq.IdentityGate,), range(1, 5))
|
|
165
168
|
)
|
|
166
|
-
def test_consistent_protocols(gate_type, num_qubits):
|
|
169
|
+
def test_consistent_protocols(gate_type, num_qubits) -> None:
|
|
167
170
|
gate = gate_type(num_qubits=num_qubits)
|
|
168
171
|
cirq.testing.assert_implements_consistent_protocols(gate, qubit_count=num_qubits)
|
|
169
172
|
|
|
170
173
|
|
|
171
|
-
def test_identity_global():
|
|
174
|
+
def test_identity_global() -> None:
|
|
172
175
|
qubits = cirq.LineQubit.range(3)
|
|
173
176
|
assert cirq.identity_each(*qubits) == cirq.IdentityGate(3).on(*qubits)
|
|
174
177
|
qids = cirq.LineQid.for_qid_shape((1, 2, 3))
|
|
175
178
|
assert cirq.identity_each(*qids) == cirq.IdentityGate(3, (1, 2, 3)).on(*qids)
|
|
176
179
|
with pytest.raises(ValueError, match='Not a cirq.Qid'):
|
|
177
|
-
|
|
180
|
+
# The user forgot to expand the list for example.
|
|
181
|
+
cirq.identity_each(qubits) # type: ignore[arg-type]
|
|
178
182
|
|
|
179
183
|
|
|
180
|
-
def test_identity_mul():
|
|
184
|
+
def test_identity_mul() -> None:
|
|
181
185
|
class UnknownGate(cirq.testing.SingleQubitGate):
|
|
182
186
|
pass
|
|
183
187
|
|
|
@@ -204,19 +208,19 @@ def test_identity_mul():
|
|
|
204
208
|
assert 1j * i == cirq.PauliString(coefficient=1j)
|
|
205
209
|
|
|
206
210
|
|
|
207
|
-
def test_identity_short_circuits_act_on():
|
|
211
|
+
def test_identity_short_circuits_act_on() -> None:
|
|
208
212
|
args = mock.Mock(cirq.SimulationState)
|
|
209
213
|
args._act_on_fallback_.side_effect = mock.Mock(side_effect=Exception('No!'))
|
|
210
214
|
cirq.act_on(cirq.IdentityGate(1)(cirq.LineQubit(0)), args)
|
|
211
215
|
|
|
212
216
|
|
|
213
|
-
def test_identity_commutes():
|
|
217
|
+
def test_identity_commutes() -> None:
|
|
214
218
|
assert cirq.commutes(cirq.I, cirq.X)
|
|
215
219
|
with pytest.raises(TypeError):
|
|
216
220
|
cirq.commutes(cirq.I, "Gate")
|
|
217
221
|
|
|
218
222
|
|
|
219
|
-
def test_identity_diagram():
|
|
223
|
+
def test_identity_diagram() -> None:
|
|
220
224
|
cirq.testing.assert_has_diagram(
|
|
221
225
|
cirq.Circuit(cirq.IdentityGate(3).on_each(cirq.LineQubit.range(3))),
|
|
222
226
|
"""
|
cirq/ops/kraus_channel.py
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
# pylint: disable=wrong-or-nonexistent-copyright-notice
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any, Iterable, Mapping, TYPE_CHECKING
|
|
3
6
|
|
|
4
7
|
import numpy as np
|
|
5
8
|
|
|
@@ -29,7 +32,7 @@ class KrausChannel(raw_types.Gate):
|
|
|
29
32
|
def __init__(
|
|
30
33
|
self,
|
|
31
34
|
kraus_ops: Iterable[np.ndarray],
|
|
32
|
-
key:
|
|
35
|
+
key: str | cirq.MeasurementKey | None = None,
|
|
33
36
|
validate: bool = False,
|
|
34
37
|
):
|
|
35
38
|
kraus_ops = list(kraus_ops)
|
|
@@ -56,7 +59,7 @@ class KrausChannel(raw_types.Gate):
|
|
|
56
59
|
self._key = key
|
|
57
60
|
|
|
58
61
|
@staticmethod
|
|
59
|
-
def from_channel(channel:
|
|
62
|
+
def from_channel(channel: cirq.Gate, key: str | cirq.MeasurementKey | None = None):
|
|
60
63
|
"""Creates a copy of a channel with the given measurement key."""
|
|
61
64
|
return KrausChannel(kraus_ops=list(protocols.kraus(channel)), key=key)
|
|
62
65
|
|
|
@@ -80,7 +83,7 @@ class KrausChannel(raw_types.Gate):
|
|
|
80
83
|
return NotImplemented
|
|
81
84
|
return str(self._key)
|
|
82
85
|
|
|
83
|
-
def _measurement_key_obj_(self) ->
|
|
86
|
+
def _measurement_key_obj_(self) -> cirq.MeasurementKey:
|
|
84
87
|
if self._key is None:
|
|
85
88
|
return NotImplemented
|
|
86
89
|
return self._key
|
|
@@ -92,16 +95,16 @@ class KrausChannel(raw_types.Gate):
|
|
|
92
95
|
return self
|
|
93
96
|
return KrausChannel(kraus_ops=self._kraus_ops, key=key_map[str(self._key)])
|
|
94
97
|
|
|
95
|
-
def _with_key_path_(self, path:
|
|
98
|
+
def _with_key_path_(self, path: tuple[str, ...]):
|
|
96
99
|
return KrausChannel(kraus_ops=self._kraus_ops, key=protocols.with_key_path(self._key, path))
|
|
97
100
|
|
|
98
|
-
def _with_key_path_prefix_(self, prefix:
|
|
101
|
+
def _with_key_path_prefix_(self, prefix: tuple[str, ...]):
|
|
99
102
|
return KrausChannel(
|
|
100
103
|
kraus_ops=self._kraus_ops, key=protocols.with_key_path_prefix(self._key, prefix)
|
|
101
104
|
)
|
|
102
105
|
|
|
103
106
|
def _with_rescoped_keys_(
|
|
104
|
-
self, path:
|
|
107
|
+
self, path: tuple[str, ...], bindable_keys: frozenset[cirq.MeasurementKey]
|
|
105
108
|
):
|
|
106
109
|
return KrausChannel(
|
|
107
110
|
kraus_ops=self._kraus_ops,
|
|
@@ -119,7 +122,7 @@ class KrausChannel(raw_types.Gate):
|
|
|
119
122
|
args.append(f'key=\'{self._key}\'')
|
|
120
123
|
return f'cirq.KrausChannel({", ".join(args)})'
|
|
121
124
|
|
|
122
|
-
def _json_dict_(self) ->
|
|
125
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
123
126
|
return protocols.obj_to_dict_helper(self, ['_kraus_ops', '_key'])
|
|
124
127
|
|
|
125
128
|
@classmethod
|
cirq/ops/kraus_channel_test.py
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
# pylint: disable=wrong-or-nonexistent-copyright-notice
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
2
5
|
import numpy as np
|
|
3
6
|
import pytest
|
|
4
7
|
|
|
5
8
|
import cirq
|
|
6
9
|
|
|
7
10
|
|
|
8
|
-
def test_kraus_channel_from_channel():
|
|
11
|
+
def test_kraus_channel_from_channel() -> None:
|
|
9
12
|
q0 = cirq.LineQubit(0)
|
|
10
13
|
dp = cirq.depolarize(0.1)
|
|
11
14
|
kc = cirq.KrausChannel.from_channel(dp, key='dp')
|
|
@@ -21,7 +24,7 @@ def test_kraus_channel_from_channel():
|
|
|
21
24
|
assert results.measurements['dp'] in range(4)
|
|
22
25
|
|
|
23
26
|
|
|
24
|
-
def test_kraus_channel_equality():
|
|
27
|
+
def test_kraus_channel_equality() -> None:
|
|
25
28
|
dp_pt1 = cirq.depolarize(0.1)
|
|
26
29
|
dp_pt2 = cirq.depolarize(0.2)
|
|
27
30
|
kc_a1 = cirq.KrausChannel.from_channel(dp_pt1, key='a')
|
|
@@ -44,7 +47,7 @@ def test_kraus_channel_equality():
|
|
|
44
47
|
assert x_meas != x_meas_inv
|
|
45
48
|
|
|
46
49
|
|
|
47
|
-
def test_kraus_channel_remap_keys():
|
|
50
|
+
def test_kraus_channel_remap_keys() -> None:
|
|
48
51
|
dp = cirq.depolarize(0.1)
|
|
49
52
|
kc = cirq.KrausChannel.from_channel(dp)
|
|
50
53
|
with pytest.raises(TypeError):
|
|
@@ -62,7 +65,7 @@ def test_kraus_channel_remap_keys():
|
|
|
62
65
|
assert cirq.with_measurement_key_mapping(kc_a, {'a': 'b'}) == kc_b
|
|
63
66
|
|
|
64
67
|
|
|
65
|
-
def test_kraus_channel_from_kraus():
|
|
68
|
+
def test_kraus_channel_from_kraus() -> None:
|
|
66
69
|
q0 = cirq.LineQubit(0)
|
|
67
70
|
# This is equivalent to an X-basis measurement.
|
|
68
71
|
ops = [np.array([[1, 1], [1, 1]]) * 0.5, np.array([[1, -1], [-1, 1]]) * 0.5]
|
|
@@ -77,7 +80,7 @@ def test_kraus_channel_from_kraus():
|
|
|
77
80
|
assert results.measurements['x_meas'] == 0
|
|
78
81
|
|
|
79
82
|
|
|
80
|
-
def test_kraus_channel_str():
|
|
83
|
+
def test_kraus_channel_str() -> None:
|
|
81
84
|
# This is equivalent to an X-basis measurement.
|
|
82
85
|
ops = [np.array([[1, 1], [1, 1]]) * 0.5, np.array([[1, -1], [-1, 1]]) * 0.5]
|
|
83
86
|
x_meas = cirq.KrausChannel(ops)
|
|
@@ -96,7 +99,7 @@ def test_kraus_channel_str():
|
|
|
96
99
|
)
|
|
97
100
|
|
|
98
101
|
|
|
99
|
-
def test_kraus_channel_repr():
|
|
102
|
+
def test_kraus_channel_repr() -> None:
|
|
100
103
|
# This is equivalent to an X-basis measurement.
|
|
101
104
|
ops = [
|
|
102
105
|
np.array([[1, 1], [1, 1]], dtype=np.complex64) * 0.5,
|
|
@@ -113,14 +116,14 @@ key='x_meas')"""
|
|
|
113
116
|
)
|
|
114
117
|
|
|
115
118
|
|
|
116
|
-
def test_empty_ops_fails():
|
|
117
|
-
ops = []
|
|
119
|
+
def test_empty_ops_fails() -> None:
|
|
120
|
+
ops: list[np.ndarray] = []
|
|
118
121
|
|
|
119
122
|
with pytest.raises(ValueError, match='must have at least one operation'):
|
|
120
123
|
_ = cirq.KrausChannel(kraus_ops=ops, key='m')
|
|
121
124
|
|
|
122
125
|
|
|
123
|
-
def test_ops_mismatch_fails():
|
|
126
|
+
def test_ops_mismatch_fails() -> None:
|
|
124
127
|
op2 = np.zeros((4, 4))
|
|
125
128
|
op2[1][1] = 1
|
|
126
129
|
ops = [np.array([[1, 0], [0, 0]]), op2]
|
|
@@ -129,14 +132,14 @@ def test_ops_mismatch_fails():
|
|
|
129
132
|
_ = cirq.KrausChannel(kraus_ops=ops, key='m')
|
|
130
133
|
|
|
131
134
|
|
|
132
|
-
def test_nonqubit_kraus_ops_fails():
|
|
135
|
+
def test_nonqubit_kraus_ops_fails() -> None:
|
|
133
136
|
ops = [np.array([[1, 0, 0], [0, 0, 0]]), np.array([[0, 0, 0], [0, 1, 0]])]
|
|
134
137
|
|
|
135
138
|
with pytest.raises(ValueError, match='Input Kraus ops'):
|
|
136
139
|
_ = cirq.KrausChannel(kraus_ops=ops, key='m')
|
|
137
140
|
|
|
138
141
|
|
|
139
|
-
def test_validate():
|
|
142
|
+
def test_validate() -> None:
|
|
140
143
|
# Not quite CPTP.
|
|
141
144
|
ops = [np.array([[1, 0], [0, 0]]), np.array([[0, 0], [0, 0.9]])]
|
|
142
145
|
with pytest.raises(ValueError, match='CPTP map'):
|