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
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import numpy as np
|
|
16
18
|
import pytest
|
|
17
19
|
|
|
@@ -19,8 +21,10 @@ import cirq
|
|
|
19
21
|
import cirq.testing
|
|
20
22
|
from cirq import linalg
|
|
21
23
|
|
|
24
|
+
_DEFAULT_ARRAY = np.asarray([1])
|
|
25
|
+
|
|
22
26
|
|
|
23
|
-
def test_reflection_matrix_pow_consistent_results():
|
|
27
|
+
def test_reflection_matrix_pow_consistent_results() -> None:
|
|
24
28
|
x = np.array([[0, 1], [1, 0]])
|
|
25
29
|
sqrt_x = cirq.reflection_matrix_pow(x, 0.5)
|
|
26
30
|
np.testing.assert_allclose(np.dot(sqrt_x, sqrt_x), x, atol=1e-10)
|
|
@@ -40,7 +44,7 @@ def test_reflection_matrix_pow_consistent_results():
|
|
|
40
44
|
np.testing.assert_allclose(np.dot(sqrt_yh, sqrt_yh), yh, atol=1e-10)
|
|
41
45
|
|
|
42
46
|
|
|
43
|
-
def test_reflection_matrix_sign_preference_under_perturbation():
|
|
47
|
+
def test_reflection_matrix_sign_preference_under_perturbation() -> None:
|
|
44
48
|
x = np.array([[0, 1], [1, 0]])
|
|
45
49
|
sqrt_x = np.array([[1, -1j], [-1j, 1]]) * (1 + 1j) / 2
|
|
46
50
|
np.testing.assert_allclose(cirq.reflection_matrix_pow(x, 0.5), sqrt_x, atol=1e-8)
|
|
@@ -55,7 +59,7 @@ def test_reflection_matrix_sign_preference_under_perturbation():
|
|
|
55
59
|
np.testing.assert_allclose(sqrt_px, expected_sqrt_px, atol=1e-10)
|
|
56
60
|
|
|
57
61
|
|
|
58
|
-
def test_match_global_phase():
|
|
62
|
+
def test_match_global_phase() -> None:
|
|
59
63
|
a = np.array([[5, 4], [3, -2]])
|
|
60
64
|
b = np.array([[0.000001, 0], [0, 1j]])
|
|
61
65
|
c, d = cirq.match_global_phase(a, b)
|
|
@@ -63,7 +67,7 @@ def test_match_global_phase():
|
|
|
63
67
|
np.testing.assert_allclose(d, b * -1j, atol=1e-10)
|
|
64
68
|
|
|
65
69
|
|
|
66
|
-
def test_match_global_phase_incompatible_shape():
|
|
70
|
+
def test_match_global_phase_incompatible_shape() -> None:
|
|
67
71
|
a = np.array([1])
|
|
68
72
|
b = np.array([1, 2])
|
|
69
73
|
c, d = cirq.match_global_phase(a, b)
|
|
@@ -85,7 +89,7 @@ def test_match_global_phase_incompatible_shape():
|
|
|
85
89
|
assert np.allclose(d, b)
|
|
86
90
|
|
|
87
91
|
|
|
88
|
-
def test_match_global_phase_zeros():
|
|
92
|
+
def test_match_global_phase_zeros() -> None:
|
|
89
93
|
z = np.array([[0, 0], [0, 0]])
|
|
90
94
|
b = np.array([[1, 1], [1, 1]])
|
|
91
95
|
|
|
@@ -102,7 +106,7 @@ def test_match_global_phase_zeros():
|
|
|
102
106
|
np.testing.assert_allclose(z, z4, atol=1e-10)
|
|
103
107
|
|
|
104
108
|
|
|
105
|
-
def test_match_global_no_float_error_when_axis_aligned():
|
|
109
|
+
def test_match_global_no_float_error_when_axis_aligned() -> None:
|
|
106
110
|
a = np.array([[1, 1.1], [-1.3, np.pi]])
|
|
107
111
|
a2, _ = cirq.match_global_phase(a, a)
|
|
108
112
|
a3, _ = cirq.match_global_phase(a * 1j, a * 1j)
|
|
@@ -115,7 +119,7 @@ def test_match_global_no_float_error_when_axis_aligned():
|
|
|
115
119
|
assert np.all(a5 == a)
|
|
116
120
|
|
|
117
121
|
|
|
118
|
-
def test_targeted_left_multiply_matches_kron_then_dot():
|
|
122
|
+
def test_targeted_left_multiply_matches_kron_then_dot() -> None:
|
|
119
123
|
t = np.array([1, 2, 3, 4, 5, 6, 7, 8])
|
|
120
124
|
m = np.array([[2, 3], [5, 7]])
|
|
121
125
|
i = np.eye(2)
|
|
@@ -159,7 +163,7 @@ def test_targeted_left_multiply_matches_kron_then_dot():
|
|
|
159
163
|
cirq.targeted_left_multiply(left_matrix=m, right_target=common, out=m, target_axes=[2])
|
|
160
164
|
|
|
161
165
|
|
|
162
|
-
def test_targeted_left_multiply_reorders_matrices():
|
|
166
|
+
def test_targeted_left_multiply_reorders_matrices() -> None:
|
|
163
167
|
t = np.eye(4).reshape((2, 2, 2, 2))
|
|
164
168
|
m = np.array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0]).reshape((2, 2, 2, 2))
|
|
165
169
|
|
|
@@ -174,7 +178,7 @@ def test_targeted_left_multiply_reorders_matrices():
|
|
|
174
178
|
)
|
|
175
179
|
|
|
176
180
|
|
|
177
|
-
def test_targeted_left_multiply_out():
|
|
181
|
+
def test_targeted_left_multiply_out() -> None:
|
|
178
182
|
left = np.array([[2, 3], [5, 7]])
|
|
179
183
|
right = np.array([1, -1])
|
|
180
184
|
out = np.zeros(2)
|
|
@@ -186,7 +190,7 @@ def test_targeted_left_multiply_out():
|
|
|
186
190
|
np.testing.assert_allclose(result, np.array([-1, -2]), atol=1e-8)
|
|
187
191
|
|
|
188
192
|
|
|
189
|
-
def test_targeted_conjugate_simple():
|
|
193
|
+
def test_targeted_conjugate_simple() -> None:
|
|
190
194
|
a = np.array([[0, 1j], [0, 0]])
|
|
191
195
|
# yapf: disable
|
|
192
196
|
b = np.reshape(
|
|
@@ -210,7 +214,7 @@ def test_targeted_conjugate_simple():
|
|
|
210
214
|
np.testing.assert_almost_equal(result, expected)
|
|
211
215
|
|
|
212
216
|
|
|
213
|
-
def test_targeted_conjugate():
|
|
217
|
+
def test_targeted_conjugate() -> None:
|
|
214
218
|
a = np.reshape([0, 1, 2j, 3j], (2, 2))
|
|
215
219
|
b = np.reshape(np.arange(16), (2,) * 4)
|
|
216
220
|
result = cirq.targeted_conjugate_about(a, b, [0])
|
|
@@ -222,7 +226,7 @@ def test_targeted_conjugate():
|
|
|
222
226
|
np.testing.assert_almost_equal(result, expected)
|
|
223
227
|
|
|
224
228
|
|
|
225
|
-
def test_targeted_conjugate_multiple_indices():
|
|
229
|
+
def test_targeted_conjugate_multiple_indices() -> None:
|
|
226
230
|
a = np.reshape(np.arange(16) + 1j, (2, 2, 2, 2))
|
|
227
231
|
b = np.reshape(np.arange(16), (2,) * 4)
|
|
228
232
|
result = cirq.targeted_conjugate_about(a, b, [0, 1])
|
|
@@ -230,7 +234,7 @@ def test_targeted_conjugate_multiple_indices():
|
|
|
230
234
|
np.testing.assert_almost_equal(result, expected)
|
|
231
235
|
|
|
232
236
|
|
|
233
|
-
def test_targeted_conjugate_multiple_indices_flip_order():
|
|
237
|
+
def test_targeted_conjugate_multiple_indices_flip_order() -> None:
|
|
234
238
|
a = np.reshape(np.arange(16) + 1j, (2, 2, 2, 2))
|
|
235
239
|
b = np.reshape(np.arange(16), (2,) * 4)
|
|
236
240
|
result = cirq.targeted_conjugate_about(a, b, [1, 0], [3, 2])
|
|
@@ -238,7 +242,7 @@ def test_targeted_conjugate_multiple_indices_flip_order():
|
|
|
238
242
|
np.testing.assert_almost_equal(result, expected)
|
|
239
243
|
|
|
240
244
|
|
|
241
|
-
def test_targeted_conjugate_out():
|
|
245
|
+
def test_targeted_conjugate_out() -> None:
|
|
242
246
|
a = np.reshape([0, 1, 2j, 3j], (2, 2))
|
|
243
247
|
b = np.reshape(np.arange(16), (2,) * 4)
|
|
244
248
|
buffer = np.empty((2,) * 4, dtype=a.dtype)
|
|
@@ -249,7 +253,7 @@ def test_targeted_conjugate_out():
|
|
|
249
253
|
np.testing.assert_almost_equal(result, expected)
|
|
250
254
|
|
|
251
255
|
|
|
252
|
-
def test_apply_matrix_to_slices():
|
|
256
|
+
def test_apply_matrix_to_slices() -> None:
|
|
253
257
|
# Output is input.
|
|
254
258
|
with pytest.raises(ValueError, match='out'):
|
|
255
259
|
target = np.eye(2)
|
|
@@ -301,7 +305,7 @@ def test_apply_matrix_to_slices():
|
|
|
301
305
|
np.testing.assert_allclose(actual, np.array([1, 13, 31, 4]))
|
|
302
306
|
|
|
303
307
|
|
|
304
|
-
def test_partial_trace():
|
|
308
|
+
def test_partial_trace() -> None:
|
|
305
309
|
a = np.reshape(np.arange(4), (2, 2))
|
|
306
310
|
b = np.reshape(np.arange(9) + 4, (3, 3))
|
|
307
311
|
c = np.reshape(np.arange(16) + 13, (4, 4))
|
|
@@ -335,21 +339,21 @@ def test_partial_trace():
|
|
|
335
339
|
)
|
|
336
340
|
|
|
337
341
|
|
|
338
|
-
def test_partial_trace_non_kron():
|
|
342
|
+
def test_partial_trace_non_kron() -> None:
|
|
339
343
|
tensor = np.zeros((2, 2, 2, 2))
|
|
340
344
|
tensor[0, 0, 0, 0] = 1
|
|
341
345
|
tensor[1, 1, 1, 1] = 4
|
|
342
346
|
np.testing.assert_almost_equal(cirq.partial_trace(tensor, [0]), np.array([[1, 0], [0, 4]]))
|
|
343
347
|
|
|
344
348
|
|
|
345
|
-
def test_partial_trace_invalid_inputs():
|
|
349
|
+
def test_partial_trace_invalid_inputs() -> None:
|
|
346
350
|
with pytest.raises(ValueError, match='2, 3, 2, 2'):
|
|
347
351
|
cirq.partial_trace(np.reshape(np.arange(2 * 3 * 2 * 2), (2, 3, 2, 2)), [1])
|
|
348
352
|
with pytest.raises(ValueError, match='2'):
|
|
349
353
|
cirq.partial_trace(np.reshape(np.arange(2 * 2 * 2 * 2), (2,) * 4), [2])
|
|
350
354
|
|
|
351
355
|
|
|
352
|
-
def test_sub_state_vector():
|
|
356
|
+
def test_sub_state_vector() -> None:
|
|
353
357
|
a = np.arange(4) / np.linalg.norm(np.arange(4))
|
|
354
358
|
b = (np.arange(8) + 3) / np.linalg.norm(np.arange(8) + 3)
|
|
355
359
|
c = (np.arange(16) + 1) / np.linalg.norm(np.arange(16) + 1)
|
|
@@ -382,40 +386,66 @@ def test_sub_state_vector():
|
|
|
382
386
|
)
|
|
383
387
|
|
|
384
388
|
# Reject factoring for very tight tolerance.
|
|
385
|
-
assert
|
|
386
|
-
|
|
387
|
-
|
|
389
|
+
assert (
|
|
390
|
+
cirq.sub_state_vector(state, [0, 1], default=_DEFAULT_ARRAY, atol=1e-16) is _DEFAULT_ARRAY
|
|
391
|
+
)
|
|
392
|
+
assert (
|
|
393
|
+
cirq.sub_state_vector(state, [2, 3, 4], default=_DEFAULT_ARRAY, atol=1e-16)
|
|
394
|
+
is _DEFAULT_ARRAY
|
|
395
|
+
)
|
|
396
|
+
assert (
|
|
397
|
+
cirq.sub_state_vector(state, [5, 6, 7, 8], default=_DEFAULT_ARRAY, atol=1e-16)
|
|
398
|
+
is _DEFAULT_ARRAY
|
|
399
|
+
)
|
|
388
400
|
|
|
389
401
|
# Permit invalid factoring for loose tolerance.
|
|
390
402
|
for q1 in range(9):
|
|
391
|
-
assert
|
|
403
|
+
assert (
|
|
404
|
+
cirq.sub_state_vector(state, [q1], default=_DEFAULT_ARRAY, atol=1) is not _DEFAULT_ARRAY
|
|
405
|
+
)
|
|
392
406
|
|
|
393
407
|
|
|
394
|
-
def test_sub_state_vector_bad_subset():
|
|
408
|
+
def test_sub_state_vector_bad_subset() -> None:
|
|
395
409
|
a = cirq.testing.random_superposition(4)
|
|
396
410
|
b = cirq.testing.random_superposition(8)
|
|
397
411
|
state = np.kron(a, b).reshape((2, 2, 2, 2, 2))
|
|
398
412
|
|
|
399
413
|
for q1 in range(5):
|
|
400
|
-
assert
|
|
414
|
+
assert (
|
|
415
|
+
cirq.sub_state_vector(state, [q1], default=_DEFAULT_ARRAY, atol=1e-8) is _DEFAULT_ARRAY
|
|
416
|
+
)
|
|
401
417
|
for q1 in range(2):
|
|
402
418
|
for q2 in range(2, 5):
|
|
403
|
-
assert
|
|
419
|
+
assert (
|
|
420
|
+
cirq.sub_state_vector(state, [q1, q2], default=_DEFAULT_ARRAY, atol=1e-8)
|
|
421
|
+
is _DEFAULT_ARRAY
|
|
422
|
+
)
|
|
404
423
|
for q3 in range(2, 5):
|
|
405
|
-
assert
|
|
424
|
+
assert (
|
|
425
|
+
cirq.sub_state_vector(state, [0, 1, q3], default=_DEFAULT_ARRAY, atol=1e-8)
|
|
426
|
+
is _DEFAULT_ARRAY
|
|
427
|
+
)
|
|
406
428
|
for q4 in range(2):
|
|
407
|
-
assert
|
|
429
|
+
assert (
|
|
430
|
+
cirq.sub_state_vector(state, [2, 3, 4, q4], default=_DEFAULT_ARRAY, atol=1e-8)
|
|
431
|
+
is _DEFAULT_ARRAY
|
|
432
|
+
)
|
|
408
433
|
|
|
409
434
|
|
|
410
|
-
def test_sub_state_vector_non_kron():
|
|
435
|
+
def test_sub_state_vector_non_kron() -> None:
|
|
411
436
|
a = np.array([1, 0, 0, 0, 0, 0, 0, 1]) / np.sqrt(2)
|
|
412
437
|
b = np.array([1, 1]) / np.sqrt(2)
|
|
413
438
|
state = np.kron(a, b).reshape((2, 2, 2, 2))
|
|
414
439
|
|
|
415
440
|
for q1 in [0, 1, 2]:
|
|
416
|
-
assert
|
|
441
|
+
assert (
|
|
442
|
+
cirq.sub_state_vector(state, [q1], default=_DEFAULT_ARRAY, atol=1e-8) is _DEFAULT_ARRAY
|
|
443
|
+
)
|
|
417
444
|
for q1 in [0, 1, 2]:
|
|
418
|
-
assert
|
|
445
|
+
assert (
|
|
446
|
+
cirq.sub_state_vector(state, [q1, 3], default=_DEFAULT_ARRAY, atol=1e-8)
|
|
447
|
+
is _DEFAULT_ARRAY
|
|
448
|
+
)
|
|
419
449
|
|
|
420
450
|
with pytest.raises(ValueError, match='factored'):
|
|
421
451
|
_ = cirq.sub_state_vector(a, [0], atol=1e-8)
|
|
@@ -423,7 +453,7 @@ def test_sub_state_vector_non_kron():
|
|
|
423
453
|
assert cirq.equal_up_to_global_phase(cirq.sub_state_vector(state, [3]), b, atol=1e-8)
|
|
424
454
|
|
|
425
455
|
|
|
426
|
-
def test_sub_state_vector_invalid_inputs():
|
|
456
|
+
def test_sub_state_vector_invalid_inputs() -> None:
|
|
427
457
|
|
|
428
458
|
# State cannot be expressed as a separable pure state.
|
|
429
459
|
with pytest.raises(ValueError, match='7'):
|
|
@@ -450,7 +480,7 @@ def test_sub_state_vector_invalid_inputs():
|
|
|
450
480
|
cirq.sub_state_vector(state, [0, 1, 2], atol=1e-8)
|
|
451
481
|
|
|
452
482
|
|
|
453
|
-
def test_partial_trace_of_state_vector_as_mixture_invalid_input():
|
|
483
|
+
def test_partial_trace_of_state_vector_as_mixture_invalid_input() -> None:
|
|
454
484
|
|
|
455
485
|
with pytest.raises(ValueError, match='7'):
|
|
456
486
|
cirq.partial_trace_of_state_vector_as_mixture(np.arange(7), [1, 2], atol=1e-8)
|
|
@@ -469,7 +499,7 @@ def test_partial_trace_of_state_vector_as_mixture_invalid_input():
|
|
|
469
499
|
cirq.partial_trace_of_state_vector_as_mixture(state, [0, 1, 2], atol=1e-8)
|
|
470
500
|
|
|
471
501
|
|
|
472
|
-
def mixtures_equal(m1, m2, atol=1e-7):
|
|
502
|
+
def mixtures_equal(m1, m2, atol=1e-7) -> bool:
|
|
473
503
|
for (p1, v1), (p2, v2) in zip(m1, m2):
|
|
474
504
|
if not (
|
|
475
505
|
cirq.approx_eq(p1, p2, atol=atol) and cirq.equal_up_to_global_phase(v1, v2, atol=atol)
|
|
@@ -478,7 +508,7 @@ def mixtures_equal(m1, m2, atol=1e-7):
|
|
|
478
508
|
return True
|
|
479
509
|
|
|
480
510
|
|
|
481
|
-
def test_partial_trace_of_state_vector_as_mixture_pure_result():
|
|
511
|
+
def test_partial_trace_of_state_vector_as_mixture_pure_result() -> None:
|
|
482
512
|
a = cirq.testing.random_superposition(4)
|
|
483
513
|
b = cirq.testing.random_superposition(8)
|
|
484
514
|
c = cirq.testing.random_superposition(16)
|
|
@@ -532,7 +562,7 @@ def test_partial_trace_of_state_vector_as_mixture_pure_result():
|
|
|
532
562
|
)
|
|
533
563
|
|
|
534
564
|
|
|
535
|
-
def test_partial_trace_of_state_vector_as_mixture_pure_result_qudits():
|
|
565
|
+
def test_partial_trace_of_state_vector_as_mixture_pure_result_qudits() -> None:
|
|
536
566
|
a = cirq.testing.random_superposition(2)
|
|
537
567
|
b = cirq.testing.random_superposition(3)
|
|
538
568
|
c = cirq.testing.random_superposition(4)
|
|
@@ -561,7 +591,7 @@ def test_partial_trace_of_state_vector_as_mixture_pure_result_qudits():
|
|
|
561
591
|
)
|
|
562
592
|
|
|
563
593
|
|
|
564
|
-
def test_partial_trace_of_state_vector_as_mixture_mixed_result():
|
|
594
|
+
def test_partial_trace_of_state_vector_as_mixture_mixed_result() -> None:
|
|
565
595
|
state = np.array([1, 0, 0, 1]) / np.sqrt(2)
|
|
566
596
|
truth = ((0.5, np.array([1, 0])), (0.5, np.array([0, 1])))
|
|
567
597
|
for q1 in [0, 1]:
|
|
@@ -589,7 +619,7 @@ def test_partial_trace_of_state_vector_as_mixture_mixed_result():
|
|
|
589
619
|
assert mixtures_equal(mixture, truth)
|
|
590
620
|
|
|
591
621
|
|
|
592
|
-
def test_partial_trace_of_state_vector_as_mixture_mixed_result_qudits():
|
|
622
|
+
def test_partial_trace_of_state_vector_as_mixture_mixed_result_qudits() -> None:
|
|
593
623
|
state = np.array([[1, 0, 0], [0, 0, 0], [0, 0, 1]]) / np.sqrt(2)
|
|
594
624
|
truth = ((0.5, np.array([1, 0, 0])), (0.5, np.array([0, 0, 1])))
|
|
595
625
|
for q1 in [0, 1]:
|
|
@@ -597,14 +627,14 @@ def test_partial_trace_of_state_vector_as_mixture_mixed_result_qudits():
|
|
|
597
627
|
assert mixtures_equal(mixture, truth)
|
|
598
628
|
|
|
599
629
|
|
|
600
|
-
def test_to_special():
|
|
630
|
+
def test_to_special() -> None:
|
|
601
631
|
u = cirq.testing.random_unitary(4)
|
|
602
632
|
su = cirq.to_special(u)
|
|
603
633
|
assert not cirq.is_special_unitary(u)
|
|
604
634
|
assert cirq.is_special_unitary(su)
|
|
605
635
|
|
|
606
636
|
|
|
607
|
-
def test_default_tolerance():
|
|
637
|
+
def test_default_tolerance() -> None:
|
|
608
638
|
a, b = cirq.LineQubit.range(2)
|
|
609
639
|
final_state_vector = (
|
|
610
640
|
cirq.Simulator()
|
|
@@ -618,7 +648,7 @@ def test_default_tolerance():
|
|
|
618
648
|
|
|
619
649
|
@pytest.mark.parametrize('state_1', [0, 1])
|
|
620
650
|
@pytest.mark.parametrize('state_2', [0, 1])
|
|
621
|
-
def test_factor_state_vector(state_1: int, state_2: int):
|
|
651
|
+
def test_factor_state_vector(state_1: int, state_2: int) -> None:
|
|
622
652
|
# Kron two state vectors and apply a phase. Factoring should produce the expected results.
|
|
623
653
|
n = 12
|
|
624
654
|
for i in range(n):
|
|
@@ -636,7 +666,7 @@ def test_factor_state_vector(state_1: int, state_2: int):
|
|
|
636
666
|
|
|
637
667
|
|
|
638
668
|
@pytest.mark.parametrize('num_dimensions', [*range(1, 7)])
|
|
639
|
-
def test_transpose_flattened_array(num_dimensions):
|
|
669
|
+
def test_transpose_flattened_array(num_dimensions) -> None:
|
|
640
670
|
np.random.seed(0)
|
|
641
671
|
for _ in range(10):
|
|
642
672
|
shape = np.random.randint(1, 5, (num_dimensions,)).tolist()
|
|
@@ -656,7 +686,7 @@ def test_can_numpy_support_shape(shape: tuple[int, ...], result: bool) -> None:
|
|
|
656
686
|
|
|
657
687
|
|
|
658
688
|
@pytest.mark.parametrize('coeff', [1, 1j, -1, -1j, 1j**0.5, 1j**0.3])
|
|
659
|
-
def test_phase_delta(coeff):
|
|
689
|
+
def test_phase_delta(coeff) -> None:
|
|
660
690
|
u1 = cirq.testing.random_unitary(4)
|
|
661
691
|
u2 = u1 * coeff
|
|
662
692
|
np.testing.assert_almost_equal(linalg.phase_delta(u1, u2), coeff)
|
|
@@ -12,15 +12,21 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import TYPE_CHECKING
|
|
18
|
+
|
|
16
19
|
from cirq.neutral_atoms import neutral_atom_devices
|
|
17
20
|
|
|
21
|
+
if TYPE_CHECKING:
|
|
22
|
+
import cirq
|
|
23
|
+
|
|
18
24
|
|
|
19
|
-
def is_native_neutral_atom_op(operation:
|
|
25
|
+
def is_native_neutral_atom_op(operation: cirq.Operation) -> bool:
|
|
20
26
|
"""Returns true if the operation is in the default neutral atom gateset."""
|
|
21
27
|
return operation in neutral_atom_devices.neutral_atom_gateset()
|
|
22
28
|
|
|
23
29
|
|
|
24
|
-
def is_native_neutral_atom_gate(gate:
|
|
30
|
+
def is_native_neutral_atom_gate(gate: cirq.Gate) -> bool:
|
|
25
31
|
"""Returns true if the gate is in the default neutral atom gateset."""
|
|
26
32
|
return gate in neutral_atom_devices.neutral_atom_gateset()
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import pytest
|
|
16
18
|
|
|
17
19
|
import cirq
|
|
@@ -43,7 +45,7 @@ Q, Q2, Q3 = cirq.LineQubit.range(3)
|
|
|
43
45
|
(cirq.ZPowGate(exponent=0.5)(Q).controlled_by(Q2, Q3), False),
|
|
44
46
|
],
|
|
45
47
|
)
|
|
46
|
-
def test_gateset(op: cirq.Operation, expected: bool):
|
|
48
|
+
def test_gateset(op: cirq.Operation, expected: bool) -> None:
|
|
47
49
|
assert cirq.is_native_neutral_atom_op(op) == expected
|
|
48
50
|
if op.gate is not None:
|
|
49
51
|
assert cirq.is_native_neutral_atom_gate(op.gate) == expected
|
cirq/ops/__init__.py
CHANGED
cirq/ops/arithmetic_operation.py
CHANGED
|
@@ -13,9 +13,11 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
"""Helper class for implementing classical arithmetic operations."""
|
|
15
15
|
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
16
18
|
import abc
|
|
17
19
|
import itertools
|
|
18
|
-
from typing import cast, Iterable,
|
|
20
|
+
from typing import cast, Iterable, Sequence, TYPE_CHECKING
|
|
19
21
|
|
|
20
22
|
import numpy as np
|
|
21
23
|
from typing_extensions import Self
|
|
@@ -42,21 +44,21 @@ class ArithmeticGate(Gate, metaclass=abc.ABCMeta):
|
|
|
42
44
|
>>> class Add(cirq.ArithmeticGate):
|
|
43
45
|
... def __init__(
|
|
44
46
|
... self,
|
|
45
|
-
... target_register:
|
|
46
|
-
... input_register:
|
|
47
|
+
... target_register: int | Sequence[int],
|
|
48
|
+
... input_register: int | Sequence[int],
|
|
47
49
|
... ):
|
|
48
50
|
... self.target_register = target_register
|
|
49
51
|
... self.input_register = input_register
|
|
50
52
|
...
|
|
51
|
-
... def registers(self) ->
|
|
53
|
+
... def registers(self) -> Sequence[int | Sequence[int]]:
|
|
52
54
|
... return self.target_register, self.input_register
|
|
53
55
|
...
|
|
54
56
|
... def with_registers(
|
|
55
|
-
... self, *new_registers:
|
|
57
|
+
... self, *new_registers: int | Sequence[int]
|
|
56
58
|
... ) -> 'Add':
|
|
57
59
|
... return Add(*new_registers)
|
|
58
60
|
...
|
|
59
|
-
... def apply(self, *register_values: int) ->
|
|
61
|
+
... def apply(self, *register_values: int) -> int | Iterable[int]:
|
|
60
62
|
... return sum(register_values)
|
|
61
63
|
>>> cirq.unitary(
|
|
62
64
|
... Add(target_register=[2, 2],
|
|
@@ -86,7 +88,7 @@ class ArithmeticGate(Gate, metaclass=abc.ABCMeta):
|
|
|
86
88
|
"""
|
|
87
89
|
|
|
88
90
|
@abc.abstractmethod
|
|
89
|
-
def registers(self) -> Sequence[
|
|
91
|
+
def registers(self) -> Sequence[int | Sequence[int]]:
|
|
90
92
|
"""The data acted upon by the arithmetic gate.
|
|
91
93
|
|
|
92
94
|
Each register in the list can either be a classical constant (an `int`),
|
|
@@ -103,7 +105,7 @@ class ArithmeticGate(Gate, metaclass=abc.ABCMeta):
|
|
|
103
105
|
raise NotImplementedError()
|
|
104
106
|
|
|
105
107
|
@abc.abstractmethod
|
|
106
|
-
def with_registers(self, *new_registers:
|
|
108
|
+
def with_registers(self, *new_registers: int | Sequence[int]) -> Self:
|
|
107
109
|
"""Returns the same fate targeting different registers.
|
|
108
110
|
|
|
109
111
|
Args:
|
|
@@ -117,7 +119,7 @@ class ArithmeticGate(Gate, metaclass=abc.ABCMeta):
|
|
|
117
119
|
raise NotImplementedError()
|
|
118
120
|
|
|
119
121
|
@abc.abstractmethod
|
|
120
|
-
def apply(self, *register_values: int) ->
|
|
122
|
+
def apply(self, *register_values: int) -> int | Iterable[int]:
|
|
121
123
|
"""Returns the result of the gate operating on classical values.
|
|
122
124
|
|
|
123
125
|
For example, an addition takes two values (the target and the source),
|
|
@@ -162,7 +164,7 @@ class ArithmeticGate(Gate, metaclass=abc.ABCMeta):
|
|
|
162
164
|
"""
|
|
163
165
|
raise NotImplementedError()
|
|
164
166
|
|
|
165
|
-
def _qid_shape_(self) ->
|
|
167
|
+
def _qid_shape_(self) -> tuple[int, ...]:
|
|
166
168
|
shape = []
|
|
167
169
|
for r in self.registers():
|
|
168
170
|
if isinstance(r, Sequence):
|
|
@@ -170,11 +172,11 @@ class ArithmeticGate(Gate, metaclass=abc.ABCMeta):
|
|
|
170
172
|
shape.append(i)
|
|
171
173
|
return tuple(shape)
|
|
172
174
|
|
|
173
|
-
def _apply_unitary_(self, args:
|
|
175
|
+
def _apply_unitary_(self, args: cirq.ApplyUnitaryArgs):
|
|
174
176
|
registers = self.registers()
|
|
175
|
-
input_ranges:
|
|
176
|
-
shape:
|
|
177
|
-
overflow_sizes:
|
|
177
|
+
input_ranges: list[Sequence[int]] = []
|
|
178
|
+
shape: list[int] = []
|
|
179
|
+
overflow_sizes: list[int] = []
|
|
178
180
|
for register in registers:
|
|
179
181
|
if isinstance(register, int):
|
|
180
182
|
input_ranges.append([register])
|
|
@@ -196,8 +198,8 @@ class ArithmeticGate(Gate, metaclass=abc.ABCMeta):
|
|
|
196
198
|
output = self.apply(*input_seq)
|
|
197
199
|
|
|
198
200
|
# Wrap into list.
|
|
199
|
-
inputs:
|
|
200
|
-
outputs:
|
|
201
|
+
inputs: list[int] = list(input_seq)
|
|
202
|
+
outputs: list[int] = [output] if isinstance(output, int) else list(output)
|
|
201
203
|
|
|
202
204
|
# Omitted tail values default to the corresponding input value.
|
|
203
205
|
if len(outputs) < len(inputs):
|
|
@@ -219,8 +221,8 @@ class ArithmeticGate(Gate, metaclass=abc.ABCMeta):
|
|
|
219
221
|
outputs[i] %= overflow_sizes[i]
|
|
220
222
|
|
|
221
223
|
# Copy amplitude to new location.
|
|
222
|
-
cast(
|
|
223
|
-
cast(
|
|
224
|
+
cast(list[int | slice], outputs).append(slice(None))
|
|
225
|
+
cast(list[int | slice], inputs).append(slice(None))
|
|
224
226
|
dst[tuple(outputs)] = src[tuple(inputs)]
|
|
225
227
|
|
|
226
228
|
# In case the reshaped arrays were copies instead of views.
|
|
@@ -231,9 +233,7 @@ class ArithmeticGate(Gate, metaclass=abc.ABCMeta):
|
|
|
231
233
|
|
|
232
234
|
|
|
233
235
|
def _describe_bad_arithmetic_changed_const(
|
|
234
|
-
registers: Sequence[
|
|
235
|
-
inputs: List[int],
|
|
236
|
-
outputs: List[int],
|
|
236
|
+
registers: Sequence[int | Sequence[cirq.Qid | int]], inputs: list[int], outputs: list[int]
|
|
237
237
|
) -> str:
|
|
238
238
|
from cirq.circuits import TextDiagramDrawer
|
|
239
239
|
|
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import Sequence
|
|
16
18
|
|
|
17
19
|
import numpy as np
|
|
18
20
|
import pytest
|
|
@@ -32,11 +34,10 @@ def adder_matrix(target_width: int, source_width: int) -> np.ndarray:
|
|
|
32
34
|
result = np.zeros((t, s, t, s))
|
|
33
35
|
for k in range(s):
|
|
34
36
|
result[:, k, :, k] = shift_matrix(t, k)
|
|
35
|
-
result.
|
|
36
|
-
return result
|
|
37
|
+
return result.reshape(t * s, t * s)
|
|
37
38
|
|
|
38
39
|
|
|
39
|
-
def test_the_tests():
|
|
40
|
+
def test_the_tests() -> None:
|
|
40
41
|
# fmt: off
|
|
41
42
|
np.testing.assert_allclose(
|
|
42
43
|
shift_matrix(4, 1),
|
|
@@ -85,12 +86,10 @@ def test_the_tests():
|
|
|
85
86
|
)
|
|
86
87
|
|
|
87
88
|
|
|
88
|
-
def test_arithmetic_gate_apply_unitary():
|
|
89
|
+
def test_arithmetic_gate_apply_unitary() -> None:
|
|
89
90
|
class Add(cirq.ArithmeticGate):
|
|
90
91
|
def __init__(
|
|
91
|
-
self,
|
|
92
|
-
target_register: Union[int, Sequence[int]],
|
|
93
|
-
input_register: Union[int, Sequence[int]],
|
|
92
|
+
self, target_register: int | Sequence[int], input_register: int | Sequence[int]
|
|
94
93
|
):
|
|
95
94
|
self.target_register = target_register
|
|
96
95
|
self.input_register = input_register
|