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 pandas as pd
|
|
17
19
|
import pytest
|
|
@@ -72,10 +74,7 @@ class _TestSimulator(cirq.Simulator):
|
|
|
72
74
|
self.replacement = replacement
|
|
73
75
|
|
|
74
76
|
def _core_iterator(
|
|
75
|
-
self,
|
|
76
|
-
circuit: 'cirq.AbstractCircuit',
|
|
77
|
-
sim_state,
|
|
78
|
-
all_measurements_are_terminal: bool = False,
|
|
77
|
+
self, circuit: cirq.AbstractCircuit, sim_state, all_measurements_are_terminal: bool = False
|
|
79
78
|
):
|
|
80
79
|
new_circuit = cirq.Circuit(
|
|
81
80
|
[
|
|
@@ -11,10 +11,12 @@
|
|
|
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
|
-
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import Iterator, TYPE_CHECKING
|
|
15
18
|
|
|
16
19
|
from cirq.interop.quirk.cells.arithmetic_cells import generate_all_arithmetic_cell_makers
|
|
17
|
-
from cirq.interop.quirk.cells.cell import CellMaker
|
|
18
20
|
from cirq.interop.quirk.cells.control_cells import generate_all_control_cell_makers
|
|
19
21
|
from cirq.interop.quirk.cells.frequency_space_cells import generate_all_frequency_space_cell_makers
|
|
20
22
|
from cirq.interop.quirk.cells.ignored_cells import generate_all_ignored_cell_makers
|
|
@@ -31,6 +33,9 @@ from cirq.interop.quirk.cells.single_qubit_rotation_cells import (
|
|
|
31
33
|
from cirq.interop.quirk.cells.swap_cell import generate_all_swap_cell_makers
|
|
32
34
|
from cirq.interop.quirk.cells.unsupported_cells import generate_all_unsupported_cell_makers
|
|
33
35
|
|
|
36
|
+
if TYPE_CHECKING:
|
|
37
|
+
from cirq.interop.quirk.cells.cell import CellMaker
|
|
38
|
+
|
|
34
39
|
|
|
35
40
|
def generate_all_quirk_cell_makers() -> Iterator[CellMaker]:
|
|
36
41
|
"""Yields a `CellMaker` for every known Quirk gate, display, etc."""
|
|
@@ -11,21 +11,11 @@
|
|
|
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 inspect
|
|
15
|
-
from typing import
|
|
16
|
-
Any,
|
|
17
|
-
Callable,
|
|
18
|
-
cast,
|
|
19
|
-
Dict,
|
|
20
|
-
Iterable,
|
|
21
|
-
Iterator,
|
|
22
|
-
List,
|
|
23
|
-
Optional,
|
|
24
|
-
Sequence,
|
|
25
|
-
Tuple,
|
|
26
|
-
TYPE_CHECKING,
|
|
27
|
-
Union,
|
|
28
|
-
)
|
|
18
|
+
from typing import Any, Callable, cast, Iterable, Iterator, Sequence, TYPE_CHECKING
|
|
29
19
|
|
|
30
20
|
from cirq import ops, value
|
|
31
21
|
from cirq.interop.quirk.cells.cell import Cell, CELL_SIZES, CellMaker
|
|
@@ -49,7 +39,7 @@ class QuirkArithmeticGate(ops.ArithmeticGate):
|
|
|
49
39
|
"""
|
|
50
40
|
|
|
51
41
|
def __init__(
|
|
52
|
-
self, identifier: str, target: Sequence[int], inputs: Sequence[
|
|
42
|
+
self, identifier: str, target: Sequence[int], inputs: Sequence[Sequence[int] | int]
|
|
53
43
|
):
|
|
54
44
|
"""Inits QuirkArithmeticGate.
|
|
55
45
|
|
|
@@ -65,8 +55,8 @@ class QuirkArithmeticGate(ops.ArithmeticGate):
|
|
|
65
55
|
too small modulus.
|
|
66
56
|
"""
|
|
67
57
|
self.identifier = identifier
|
|
68
|
-
self.target:
|
|
69
|
-
self.inputs:
|
|
58
|
+
self.target: tuple[int, ...] = tuple(target)
|
|
59
|
+
self.inputs: tuple[Sequence[int] | int, ...] = tuple(
|
|
70
60
|
e if isinstance(e, int) else tuple(e) for e in inputs
|
|
71
61
|
)
|
|
72
62
|
|
|
@@ -80,16 +70,16 @@ class QuirkArithmeticGate(ops.ArithmeticGate):
|
|
|
80
70
|
raise ValueError(f'Target too small for modulus.\nTarget: {target}\nModulus: {r}')
|
|
81
71
|
|
|
82
72
|
@property
|
|
83
|
-
def operation(self) ->
|
|
73
|
+
def operation(self) -> _QuirkArithmeticCallable:
|
|
84
74
|
return ARITHMETIC_OP_TABLE[self.identifier]
|
|
85
75
|
|
|
86
76
|
def _value_equality_values_(self) -> Any:
|
|
87
77
|
return self.identifier, self.target, self.inputs
|
|
88
78
|
|
|
89
|
-
def registers(self) -> Sequence[
|
|
79
|
+
def registers(self) -> Sequence[int | Sequence[int]]:
|
|
90
80
|
return [self.target, *self.inputs]
|
|
91
81
|
|
|
92
|
-
def with_registers(self, *new_registers:
|
|
82
|
+
def with_registers(self, *new_registers: int | Sequence[int]) -> QuirkArithmeticGate:
|
|
93
83
|
if len(new_registers) != len(self.inputs) + 1:
|
|
94
84
|
raise ValueError(
|
|
95
85
|
'Wrong number of registers.\n'
|
|
@@ -106,13 +96,13 @@ class QuirkArithmeticGate(ops.ArithmeticGate):
|
|
|
106
96
|
|
|
107
97
|
return QuirkArithmeticGate(self.identifier, new_registers[0], new_registers[1:])
|
|
108
98
|
|
|
109
|
-
def apply(self, *registers: int) ->
|
|
99
|
+
def apply(self, *registers: int) -> int | Iterable[int]:
|
|
110
100
|
return self.operation(*registers)
|
|
111
101
|
|
|
112
|
-
def _circuit_diagram_info_(self, args:
|
|
102
|
+
def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> list[str]:
|
|
113
103
|
lettered_args = list(zip(self.operation.letters, self.inputs))
|
|
114
104
|
|
|
115
|
-
result:
|
|
105
|
+
result: list[str] = []
|
|
116
106
|
|
|
117
107
|
# Target register labels.
|
|
118
108
|
consts = ''.join(
|
|
@@ -138,12 +128,12 @@ class QuirkArithmeticGate(ops.ArithmeticGate):
|
|
|
138
128
|
)
|
|
139
129
|
|
|
140
130
|
|
|
141
|
-
_IntsToIntCallable =
|
|
142
|
-
Callable[[int], int]
|
|
143
|
-
Callable[[int, int], int]
|
|
144
|
-
Callable[[int, int, int], int]
|
|
145
|
-
Callable[[int, int, int, int], int]
|
|
146
|
-
|
|
131
|
+
_IntsToIntCallable = (
|
|
132
|
+
Callable[[int], int]
|
|
133
|
+
| Callable[[int, int], int]
|
|
134
|
+
| Callable[[int, int, int], int]
|
|
135
|
+
| Callable[[int, int, int, int], int]
|
|
136
|
+
)
|
|
147
137
|
|
|
148
138
|
|
|
149
139
|
class _QuirkArithmeticCallable:
|
|
@@ -158,7 +148,7 @@ class _QuirkArithmeticCallable:
|
|
|
158
148
|
self.func = func
|
|
159
149
|
|
|
160
150
|
# The lambda parameter names indicate the input letter to match.
|
|
161
|
-
letters:
|
|
151
|
+
letters: list[str] = list(inspect.signature(self.func).parameters)
|
|
162
152
|
# The target is always first, and should be ignored.
|
|
163
153
|
assert letters and letters[0] == 'x'
|
|
164
154
|
self.letters = tuple(letters[1:])
|
|
@@ -183,8 +173,8 @@ class ArithmeticCell(Cell):
|
|
|
183
173
|
def __init__(
|
|
184
174
|
self,
|
|
185
175
|
identifier: str,
|
|
186
|
-
target: Sequence[
|
|
187
|
-
inputs: Sequence[
|
|
176
|
+
target: Sequence[cirq.Qid],
|
|
177
|
+
inputs: Sequence[None | Sequence[cirq.Qid] | int],
|
|
188
178
|
):
|
|
189
179
|
self.identifier = identifier
|
|
190
180
|
self.target = tuple(target)
|
|
@@ -204,7 +194,7 @@ class ArithmeticCell(Cell):
|
|
|
204
194
|
f'\n {self.inputs!r})'
|
|
205
195
|
)
|
|
206
196
|
|
|
207
|
-
def with_line_qubits_mapped_to(self, qubits:
|
|
197
|
+
def with_line_qubits_mapped_to(self, qubits: list[cirq.Qid]) -> Cell:
|
|
208
198
|
return ArithmeticCell(
|
|
209
199
|
identifier=self.identifier,
|
|
210
200
|
target=Cell._replace_qubits(self.target, qubits),
|
|
@@ -218,23 +208,21 @@ class ArithmeticCell(Cell):
|
|
|
218
208
|
def operation(self):
|
|
219
209
|
return ARITHMETIC_OP_TABLE[self.identifier]
|
|
220
210
|
|
|
221
|
-
def with_input(
|
|
222
|
-
self, letter: str, register: Union[Sequence['cirq.Qid'], int]
|
|
223
|
-
) -> 'ArithmeticCell':
|
|
211
|
+
def with_input(self, letter: str, register: Sequence[cirq.Qid] | int) -> ArithmeticCell:
|
|
224
212
|
new_inputs = [
|
|
225
213
|
reg if letter != reg_letter else register
|
|
226
214
|
for reg, reg_letter in zip(self.inputs, self.operation.letters)
|
|
227
215
|
]
|
|
228
216
|
return ArithmeticCell(self.identifier, self.target, new_inputs)
|
|
229
217
|
|
|
230
|
-
def operations(self) ->
|
|
218
|
+
def operations(self) -> cirq.OP_TREE:
|
|
231
219
|
missing_inputs = [
|
|
232
220
|
letter for reg, letter in zip(self.inputs, self.operation.letters) if reg is None
|
|
233
221
|
]
|
|
234
222
|
if missing_inputs:
|
|
235
223
|
raise ValueError(f'Missing input: {sorted(missing_inputs)}')
|
|
236
224
|
|
|
237
|
-
inputs = cast(Sequence[
|
|
225
|
+
inputs = cast(Sequence[Sequence['cirq.Qid'] | int], self.inputs)
|
|
238
226
|
qubits = self.target + tuple(q for i in self.inputs if isinstance(i, Sequence) for q in i)
|
|
239
227
|
return QuirkArithmeticGate(
|
|
240
228
|
self.identifier,
|
|
@@ -303,7 +291,7 @@ def _generate_helper() -> Iterator[CellMaker]:
|
|
|
303
291
|
)
|
|
304
292
|
|
|
305
293
|
|
|
306
|
-
def _extended_gcd(a: int, b: int) ->
|
|
294
|
+
def _extended_gcd(a: int, b: int) -> tuple[int, int, int]:
|
|
307
295
|
if a == 0:
|
|
308
296
|
return b, 0, 1
|
|
309
297
|
gcd, y, x = _extended_gcd(b % a, a)
|
|
@@ -359,9 +347,9 @@ def _arithmetic_gate(identifier: str, size: int, func: _IntsToIntCallable) -> Ce
|
|
|
359
347
|
)
|
|
360
348
|
|
|
361
349
|
|
|
362
|
-
ARITHMETIC_OP_TABLE:
|
|
350
|
+
ARITHMETIC_OP_TABLE: dict[str, _QuirkArithmeticCallable] = {}
|
|
363
351
|
# Caching is necessary in order to avoid overwriting entries in the table.
|
|
364
|
-
_cached_cells:
|
|
352
|
+
_cached_cells: tuple[CellMaker, ...] | None = None
|
|
365
353
|
|
|
366
354
|
|
|
367
355
|
def generate_all_arithmetic_cell_makers() -> Iterable[CellMaker]:
|
|
@@ -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
|
from typing import cast
|
|
15
18
|
|
|
16
19
|
import numpy as np
|
|
@@ -22,7 +25,7 @@ from cirq.interop.quirk.cells import arithmetic_cells
|
|
|
22
25
|
from cirq.interop.quirk.cells.testing import assert_url_to_circuit_returns
|
|
23
26
|
|
|
24
27
|
|
|
25
|
-
def test_arithmetic_comparison_gates():
|
|
28
|
+
def test_arithmetic_comparison_gates() -> None:
|
|
26
29
|
with pytest.raises(ValueError, match='Missing input'):
|
|
27
30
|
_ = quirk_url_to_circuit('https://algassert.com/quirk#circuit={"cols":[["^A<B"]]}')
|
|
28
31
|
assert_url_to_circuit_returns(
|
|
@@ -73,7 +76,7 @@ def test_arithmetic_comparison_gates():
|
|
|
73
76
|
)
|
|
74
77
|
|
|
75
78
|
|
|
76
|
-
def test_arithmetic_unlisted_misc_gates():
|
|
79
|
+
def test_arithmetic_unlisted_misc_gates() -> None:
|
|
77
80
|
assert_url_to_circuit_returns(
|
|
78
81
|
'{"cols":[["^=A3",1,1,"inputA2"]]}',
|
|
79
82
|
maps={
|
|
@@ -141,7 +144,7 @@ def test_arithmetic_unlisted_misc_gates():
|
|
|
141
144
|
)
|
|
142
145
|
|
|
143
146
|
|
|
144
|
-
def test_arithmetic_addition_gates():
|
|
147
|
+
def test_arithmetic_addition_gates() -> None:
|
|
145
148
|
assert_url_to_circuit_returns(
|
|
146
149
|
'{"cols":[["inc3"]]}',
|
|
147
150
|
diagram="""
|
|
@@ -164,7 +167,7 @@ def test_arithmetic_addition_gates():
|
|
|
164
167
|
)
|
|
165
168
|
|
|
166
169
|
|
|
167
|
-
def test_arithmetic_multiply_accumulate_gates():
|
|
170
|
+
def test_arithmetic_multiply_accumulate_gates() -> None:
|
|
168
171
|
assert_url_to_circuit_returns(
|
|
169
172
|
'{"cols":[["+=AA4",1,1,1,"inputA2"]]}',
|
|
170
173
|
maps={0b_0000_00: 0b_0000_00, 0b_0100_10: 0b_1000_10, 0b_1000_11: 0b_0001_11},
|
|
@@ -186,7 +189,7 @@ def test_arithmetic_multiply_accumulate_gates():
|
|
|
186
189
|
)
|
|
187
190
|
|
|
188
191
|
|
|
189
|
-
def test_modular_arithmetic_modulus_size():
|
|
192
|
+
def test_modular_arithmetic_modulus_size() -> None:
|
|
190
193
|
with pytest.raises(ValueError, match='too small for modulus'):
|
|
191
194
|
_ = quirk_url_to_circuit(
|
|
192
195
|
'https://algassert.com/quirk#circuit={"cols":['
|
|
@@ -208,7 +211,7 @@ def test_modular_arithmetic_modulus_size():
|
|
|
208
211
|
assert_url_to_circuit_returns('{"cols":[["incmodR2",1,"inputR2"]]}')
|
|
209
212
|
|
|
210
213
|
|
|
211
|
-
def test_arithmetic_modular_addition_gates():
|
|
214
|
+
def test_arithmetic_modular_addition_gates() -> None:
|
|
212
215
|
assert_url_to_circuit_returns(
|
|
213
216
|
'{"cols":[[{"id":"setR","arg":16}],["incmodR4"]]}',
|
|
214
217
|
diagram="""
|
|
@@ -242,7 +245,7 @@ def test_arithmetic_modular_addition_gates():
|
|
|
242
245
|
)
|
|
243
246
|
|
|
244
247
|
|
|
245
|
-
def test_arithmetic_modular_multiply_accumulate_gates():
|
|
248
|
+
def test_arithmetic_modular_multiply_accumulate_gates() -> None:
|
|
246
249
|
assert_url_to_circuit_returns(
|
|
247
250
|
'{"cols":[[{"id":"setR","arg":5},{"id":"setA","arg":3},'
|
|
248
251
|
'{"id":"setB","arg":4}],["+ABmodR4"]]}',
|
|
@@ -256,7 +259,7 @@ def test_arithmetic_modular_multiply_accumulate_gates():
|
|
|
256
259
|
)
|
|
257
260
|
|
|
258
261
|
|
|
259
|
-
def test_arithmetic_multiply_gates():
|
|
262
|
+
def test_arithmetic_multiply_gates() -> None:
|
|
260
263
|
assert_url_to_circuit_returns(
|
|
261
264
|
'{"cols":[[{"id":"setA","arg":3}],["*A4"]]}', maps={0: 0, 1: 3, 3: 9, 9: 11, 11: 1}
|
|
262
265
|
)
|
|
@@ -273,7 +276,7 @@ def test_arithmetic_multiply_gates():
|
|
|
273
276
|
)
|
|
274
277
|
|
|
275
278
|
|
|
276
|
-
def test_arithmetic_modular_multiply_gates():
|
|
279
|
+
def test_arithmetic_modular_multiply_gates() -> None:
|
|
277
280
|
assert_url_to_circuit_returns(
|
|
278
281
|
'{"cols":[[{"id":"setA","arg":3},{"id":"setR","arg":7}],["*AmodR4"]]}',
|
|
279
282
|
maps={0: 0, 1: 3, 3: 2, 2: 6, 6: 4, 4: 5, 5: 1, 7: 7, 15: 15},
|
|
@@ -294,7 +297,7 @@ def test_arithmetic_modular_multiply_gates():
|
|
|
294
297
|
)
|
|
295
298
|
|
|
296
299
|
|
|
297
|
-
def test_arithmetic_modular_exponentiation_gates():
|
|
300
|
+
def test_arithmetic_modular_exponentiation_gates() -> None:
|
|
298
301
|
assert_url_to_circuit_returns(
|
|
299
302
|
'{"cols":[[{"id":"setA","arg":5},{"id":"setB","arg":3},'
|
|
300
303
|
'{"id":"setR","arg":7}],["*BToAmodR4"]]}',
|
|
@@ -318,7 +321,7 @@ def test_arithmetic_modular_exponentiation_gates():
|
|
|
318
321
|
)
|
|
319
322
|
|
|
320
323
|
|
|
321
|
-
def test_repr():
|
|
324
|
+
def test_repr() -> None:
|
|
322
325
|
circuit = quirk_url_to_circuit(
|
|
323
326
|
'https://algassert.com/quirk#circuit={"cols":'
|
|
324
327
|
'['
|
|
@@ -336,7 +339,7 @@ def test_repr():
|
|
|
336
339
|
)
|
|
337
340
|
|
|
338
341
|
|
|
339
|
-
def test_with_registers():
|
|
342
|
+
def test_with_registers() -> None:
|
|
340
343
|
circuit = quirk_url_to_circuit(
|
|
341
344
|
'https://algassert.com/quirk#circuit={"cols":'
|
|
342
345
|
'['
|
|
@@ -363,7 +366,7 @@ def test_with_registers():
|
|
|
363
366
|
)
|
|
364
367
|
|
|
365
368
|
|
|
366
|
-
def test_helpers():
|
|
369
|
+
def test_helpers() -> None:
|
|
367
370
|
f = arithmetic_cells._popcnt
|
|
368
371
|
assert f(0) == 0
|
|
369
372
|
assert f(1) == 1
|
|
@@ -414,7 +417,7 @@ def test_helpers():
|
|
|
414
417
|
assert h(7, 16) == 7
|
|
415
418
|
|
|
416
419
|
|
|
417
|
-
def test_with_line_qubits_mapped_to():
|
|
420
|
+
def test_with_line_qubits_mapped_to() -> None:
|
|
418
421
|
a, b, c, d, e = cirq.LineQubit.range(5)
|
|
419
422
|
a2, b2, c2, d2, e2 = cirq.NamedQubit.range(5, prefix='p')
|
|
420
423
|
|
cirq/interop/quirk/cells/cell.py
CHANGED
|
@@ -11,20 +11,11 @@
|
|
|
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 abc
|
|
15
|
-
from typing import
|
|
16
|
-
Any,
|
|
17
|
-
Callable,
|
|
18
|
-
Dict,
|
|
19
|
-
Iterable,
|
|
20
|
-
List,
|
|
21
|
-
NamedTuple,
|
|
22
|
-
Optional,
|
|
23
|
-
Sequence,
|
|
24
|
-
Tuple,
|
|
25
|
-
TYPE_CHECKING,
|
|
26
|
-
Union,
|
|
27
|
-
)
|
|
18
|
+
from typing import Any, Callable, Iterable, NamedTuple, Sequence, TYPE_CHECKING, Union
|
|
28
19
|
|
|
29
20
|
from cirq import devices, ops, value
|
|
30
21
|
|
|
@@ -41,7 +32,7 @@ class Cell(metaclass=abc.ABCMeta):
|
|
|
41
32
|
"""
|
|
42
33
|
|
|
43
34
|
@classmethod
|
|
44
|
-
def _replace_qubit(cls, old_qubit:
|
|
35
|
+
def _replace_qubit(cls, old_qubit: cirq.Qid, qubits: list[cirq.Qid]) -> cirq.Qid:
|
|
45
36
|
if not isinstance(old_qubit, devices.LineQubit):
|
|
46
37
|
raise ValueError(f'Can only map from line qubits, but got {old_qubit!r}.')
|
|
47
38
|
if not 0 <= old_qubit.x < len(qubits):
|
|
@@ -50,12 +41,12 @@ class Cell(metaclass=abc.ABCMeta):
|
|
|
50
41
|
|
|
51
42
|
@classmethod
|
|
52
43
|
def _replace_qubits(
|
|
53
|
-
cls, old_qubits: Iterable[
|
|
54
|
-
) ->
|
|
44
|
+
cls, old_qubits: Iterable[cirq.Qid], qubits: list[cirq.Qid]
|
|
45
|
+
) -> tuple[cirq.Qid, ...]:
|
|
55
46
|
return tuple(Cell._replace_qubit(e, qubits) for e in old_qubits)
|
|
56
47
|
|
|
57
48
|
@abc.abstractmethod
|
|
58
|
-
def with_line_qubits_mapped_to(self, qubits:
|
|
49
|
+
def with_line_qubits_mapped_to(self, qubits: list[cirq.Qid]) -> Cell:
|
|
59
50
|
"""Returns the same cell, but targeting different qubits.
|
|
60
51
|
|
|
61
52
|
It is assumed that the cell is currently targeting `LineQubit`
|
|
@@ -84,7 +75,7 @@ class Cell(metaclass=abc.ABCMeta):
|
|
|
84
75
|
extremely adversarial conditions.
|
|
85
76
|
"""
|
|
86
77
|
|
|
87
|
-
def with_input(self, letter: str, register:
|
|
78
|
+
def with_input(self, letter: str, register: Sequence[cirq.Qid] | int) -> Cell:
|
|
88
79
|
"""The same cell, but linked to an explicit input register or constant.
|
|
89
80
|
|
|
90
81
|
If the cell doesn't need the input, it is returned unchanged.
|
|
@@ -99,7 +90,7 @@ class Cell(metaclass=abc.ABCMeta):
|
|
|
99
90
|
"""
|
|
100
91
|
return self
|
|
101
92
|
|
|
102
|
-
def controlled_by(self, qubit:
|
|
93
|
+
def controlled_by(self, qubit: cirq.Qid) -> Cell:
|
|
103
94
|
"""The same cell, but with an explicit control on its main operations.
|
|
104
95
|
|
|
105
96
|
Cells with effects that do not need to be controlled are permitted to
|
|
@@ -113,7 +104,7 @@ class Cell(metaclass=abc.ABCMeta):
|
|
|
113
104
|
"""
|
|
114
105
|
return self
|
|
115
106
|
|
|
116
|
-
def operations(self) ->
|
|
107
|
+
def operations(self) -> cirq.OP_TREE:
|
|
117
108
|
"""Returns operations that implement the cell's main action.
|
|
118
109
|
|
|
119
110
|
Returns:
|
|
@@ -126,7 +117,7 @@ class Cell(metaclass=abc.ABCMeta):
|
|
|
126
117
|
"""
|
|
127
118
|
return ()
|
|
128
119
|
|
|
129
|
-
def basis_change(self) ->
|
|
120
|
+
def basis_change(self) -> cirq.OP_TREE:
|
|
130
121
|
"""Operations to conjugate a column with.
|
|
131
122
|
|
|
132
123
|
The main distinctions between operations performed during the body of a
|
|
@@ -143,7 +134,7 @@ class Cell(metaclass=abc.ABCMeta):
|
|
|
143
134
|
"""
|
|
144
135
|
return ()
|
|
145
136
|
|
|
146
|
-
def modify_column(self, column:
|
|
137
|
+
def modify_column(self, column: list[Cell | None]) -> None:
|
|
147
138
|
"""Applies this cell's modification to its column.
|
|
148
139
|
|
|
149
140
|
For example, a control cell will add a control qubit to other operations
|
|
@@ -159,7 +150,7 @@ class Cell(metaclass=abc.ABCMeta):
|
|
|
159
150
|
Nothing. The `column` argument is mutated in place.
|
|
160
151
|
"""
|
|
161
152
|
|
|
162
|
-
def persistent_modifiers(self) ->
|
|
153
|
+
def persistent_modifiers(self) -> dict[str, Callable[[Cell], Cell]]:
|
|
163
154
|
"""Overridable modifications to apply to the rest of the circuit.
|
|
164
155
|
|
|
165
156
|
Persistent modifiers apply to all cells in the same column and also to
|
|
@@ -186,7 +177,7 @@ class ExplicitOperationsCell(Cell):
|
|
|
186
177
|
def gate_count(self) -> int:
|
|
187
178
|
return len(self._operations) + 2 * len(self._basis_change)
|
|
188
179
|
|
|
189
|
-
def with_line_qubits_mapped_to(self, qubits:
|
|
180
|
+
def with_line_qubits_mapped_to(self, qubits: list[cirq.Qid]) -> Cell:
|
|
190
181
|
return ExplicitOperationsCell(
|
|
191
182
|
operations=tuple(
|
|
192
183
|
op.with_qubits(*Cell._replace_qubits(op.qubits, qubits)) for op in self._operations
|
|
@@ -200,13 +191,13 @@ class ExplicitOperationsCell(Cell):
|
|
|
200
191
|
def _value_equality_values_(self):
|
|
201
192
|
return self._operations, self._basis_change
|
|
202
193
|
|
|
203
|
-
def basis_change(self) ->
|
|
194
|
+
def basis_change(self) -> cirq.OP_TREE:
|
|
204
195
|
return self._basis_change
|
|
205
196
|
|
|
206
|
-
def operations(self) ->
|
|
197
|
+
def operations(self) -> cirq.OP_TREE:
|
|
207
198
|
return self._operations
|
|
208
199
|
|
|
209
|
-
def controlled_by(self, qubit:
|
|
200
|
+
def controlled_by(self, qubit: cirq.Qid) -> ExplicitOperationsCell:
|
|
210
201
|
return ExplicitOperationsCell(
|
|
211
202
|
[op.controlled_by(qubit) for op in self._operations], self._basis_change
|
|
212
203
|
)
|
|
@@ -223,7 +214,7 @@ CellMaker = NamedTuple(
|
|
|
223
214
|
[
|
|
224
215
|
('identifier', str),
|
|
225
216
|
('size', int),
|
|
226
|
-
('maker', Callable[[CellMakerArgs], Union[None,
|
|
217
|
+
('maker', Callable[[CellMakerArgs], Union[None, Cell, 'cirq.Operation']]),
|
|
227
218
|
],
|
|
228
219
|
)
|
|
229
220
|
CellMaker.__doc__ = """Turns Quirk identifiers into Cirq operations.
|
|
@@ -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 pytest
|
|
15
18
|
|
|
16
19
|
import cirq
|
|
@@ -12,18 +12,9 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
Iterable,
|
|
19
|
-
Iterator,
|
|
20
|
-
List,
|
|
21
|
-
Optional,
|
|
22
|
-
Sequence,
|
|
23
|
-
TYPE_CHECKING,
|
|
24
|
-
TypeVar,
|
|
25
|
-
Union,
|
|
26
|
-
)
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import Callable, cast, Iterable, Iterator, Sequence, TYPE_CHECKING, TypeVar
|
|
27
18
|
|
|
28
19
|
from cirq import circuits
|
|
29
20
|
from cirq.interop.quirk.cells.cell import Cell
|
|
@@ -39,11 +30,7 @@ class CompositeCell(Cell):
|
|
|
39
30
|
"""
|
|
40
31
|
|
|
41
32
|
def __init__(
|
|
42
|
-
self,
|
|
43
|
-
height: int,
|
|
44
|
-
sub_cell_cols_generator: Iterable[List[Optional[Cell]]],
|
|
45
|
-
*,
|
|
46
|
-
gate_count: int,
|
|
33
|
+
self, height: int, sub_cell_cols_generator: Iterable[list[Cell | None]], *, gate_count: int
|
|
47
34
|
):
|
|
48
35
|
"""Inits CompositeCell.
|
|
49
36
|
|
|
@@ -79,7 +66,7 @@ class CompositeCell(Cell):
|
|
|
79
66
|
def gate_count(self) -> int:
|
|
80
67
|
return self._gate_count
|
|
81
68
|
|
|
82
|
-
def _transform_cells(self, func: Callable[[Cell], Cell]) ->
|
|
69
|
+
def _transform_cells(self, func: Callable[[Cell], Cell]) -> CompositeCell:
|
|
83
70
|
return CompositeCell(
|
|
84
71
|
height=self.height,
|
|
85
72
|
# It is important that this is a generator instead of a list!
|
|
@@ -91,23 +78,21 @@ class CompositeCell(Cell):
|
|
|
91
78
|
gate_count=self._gate_count,
|
|
92
79
|
)
|
|
93
80
|
|
|
94
|
-
def _sub_cell_cols_sealed(self) ->
|
|
81
|
+
def _sub_cell_cols_sealed(self) -> list[list[Cell | None]]:
|
|
95
82
|
if not isinstance(self._sub_cell_cols_generator, list):
|
|
96
83
|
self._sub_cell_cols_generator = list(self._sub_cell_cols_generator)
|
|
97
|
-
return cast(
|
|
84
|
+
return cast(list[list[Cell | None]], self._sub_cell_cols_generator)
|
|
98
85
|
|
|
99
|
-
def with_line_qubits_mapped_to(self, qubits:
|
|
86
|
+
def with_line_qubits_mapped_to(self, qubits: list[cirq.Qid]) -> Cell:
|
|
100
87
|
return self._transform_cells(lambda cell: cell.with_line_qubits_mapped_to(qubits))
|
|
101
88
|
|
|
102
|
-
def with_input(
|
|
103
|
-
self, letter: str, register: Union[Sequence['cirq.Qid'], int]
|
|
104
|
-
) -> 'CompositeCell':
|
|
89
|
+
def with_input(self, letter: str, register: Sequence[cirq.Qid] | int) -> CompositeCell:
|
|
105
90
|
return self._transform_cells(lambda cell: cell.with_input(letter, register))
|
|
106
91
|
|
|
107
|
-
def controlled_by(self, qubit:
|
|
92
|
+
def controlled_by(self, qubit: cirq.Qid) -> CompositeCell:
|
|
108
93
|
return self._transform_cells(lambda cell: cell.controlled_by(qubit))
|
|
109
94
|
|
|
110
|
-
def circuit(self) ->
|
|
95
|
+
def circuit(self) -> cirq.Circuit:
|
|
111
96
|
result = circuits.Circuit()
|
|
112
97
|
for col in self._sub_cell_cols_sealed():
|
|
113
98
|
body = circuits.Circuit(cell.operations() for cell in col if cell is not None)
|
|
@@ -120,7 +105,7 @@ class CompositeCell(Cell):
|
|
|
120
105
|
result += basis_change**-1
|
|
121
106
|
return result
|
|
122
107
|
|
|
123
|
-
def operations(self) ->
|
|
108
|
+
def operations(self) -> cirq.OP_TREE:
|
|
124
109
|
return self.circuit()
|
|
125
110
|
|
|
126
111
|
|
|
@@ -129,7 +114,7 @@ T = TypeVar('T')
|
|
|
129
114
|
|
|
130
115
|
def _iterator_to_iterable(iterator: Iterator[T]) -> Iterable[T]:
|
|
131
116
|
done = False
|
|
132
|
-
items:
|
|
117
|
+
items: list[T] = []
|
|
133
118
|
|
|
134
119
|
class IterIntoItems:
|
|
135
120
|
def __iter__(self):
|