cirq-core 1.5.0.dev20250409222543__py3-none-any.whl → 1.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of cirq-core might be problematic. Click here for more details.
- cirq/__init__.py +16 -17
- cirq/_compat.py +21 -20
- cirq/_compat_test.py +14 -34
- cirq/_doc.py +4 -2
- cirq/_import.py +8 -6
- cirq/_import_test.py +4 -2
- cirq/_version.py +6 -6
- cirq/_version_test.py +2 -2
- cirq/circuits/_block_diagram_drawer.py +11 -10
- cirq/circuits/_block_diagram_drawer_test.py +8 -6
- cirq/circuits/_box_drawing_character_data.py +8 -8
- cirq/circuits/_box_drawing_character_data_test.py +3 -1
- cirq/circuits/_bucket_priority_queue.py +9 -7
- cirq/circuits/_bucket_priority_queue_test.py +22 -20
- cirq/circuits/circuit.py +248 -172
- cirq/circuits/circuit_operation.py +73 -83
- cirq/circuits/circuit_operation_test.py +128 -90
- cirq/circuits/circuit_test.py +211 -151
- cirq/circuits/frozen_circuit.py +23 -60
- cirq/circuits/frozen_circuit_test.py +31 -8
- cirq/circuits/insert_strategy.py +7 -5
- cirq/circuits/insert_strategy_test.py +4 -2
- cirq/circuits/moment.py +88 -40
- cirq/circuits/moment_test.py +128 -51
- cirq/circuits/optimization_pass.py +5 -5
- cirq/circuits/optimization_pass_test.py +10 -10
- cirq/circuits/qasm_output.py +11 -11
- cirq/circuits/qasm_output_test.py +25 -22
- cirq/circuits/text_diagram_drawer.py +23 -38
- cirq/circuits/text_diagram_drawer_test.py +19 -17
- cirq/conftest.py +4 -3
- cirq/contrib/__init__.py +4 -4
- cirq/contrib/acquaintance/__init__.py +1 -1
- cirq/contrib/acquaintance/bipartite.py +5 -8
- cirq/contrib/acquaintance/bipartite_test.py +18 -13
- cirq/contrib/acquaintance/devices.py +2 -2
- cirq/contrib/acquaintance/devices_test.py +5 -3
- cirq/contrib/acquaintance/executor.py +5 -5
- cirq/contrib/acquaintance/executor_test.py +13 -9
- cirq/contrib/acquaintance/gates.py +18 -28
- cirq/contrib/acquaintance/gates_test.py +24 -20
- cirq/contrib/acquaintance/inspection_utils.py +8 -4
- cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
- cirq/contrib/acquaintance/mutation_utils.py +4 -4
- cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
- cirq/contrib/acquaintance/optimizers.py +4 -4
- cirq/contrib/acquaintance/optimizers_test.py +4 -1
- cirq/contrib/acquaintance/permutation.py +15 -27
- cirq/contrib/acquaintance/permutation_test.py +26 -17
- cirq/contrib/acquaintance/shift.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
- cirq/contrib/acquaintance/shift_test.py +8 -6
- cirq/contrib/acquaintance/strategies/cubic.py +2 -2
- cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
- cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
- cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
- cirq/contrib/acquaintance/testing.py +2 -0
- cirq/contrib/acquaintance/topological_sort.py +2 -2
- cirq/contrib/acquaintance/topological_sort_test.py +3 -1
- cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
- cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
- cirq/contrib/circuitdag/circuit_dag.py +4 -4
- cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
- cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
- cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
- cirq/contrib/graph_device/graph_device.py +12 -11
- cirq/contrib/graph_device/graph_device_test.py +18 -14
- cirq/contrib/graph_device/hypergraph.py +16 -14
- cirq/contrib/graph_device/hypergraph_test.py +13 -11
- cirq/contrib/graph_device/uniform_graph_device.py +6 -4
- cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
- cirq/contrib/hacks/disable_validation.py +6 -1
- cirq/contrib/hacks/disable_validation_test.py +3 -1
- cirq/contrib/json.py +31 -5
- cirq/contrib/json_test.py +6 -3
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/__init__.py +17 -0
- cirq/contrib/json_test_data/spec.py +32 -0
- cirq/contrib/noise_models/noise_models.py +119 -5
- cirq/contrib/noise_models/noise_models_test.py +37 -9
- cirq/contrib/paulistring/clifford_optimize.py +6 -4
- cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
- cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
- cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
- cirq/contrib/paulistring/optimize.py +2 -0
- cirq/contrib/paulistring/optimize_test.py +4 -3
- cirq/contrib/paulistring/pauli_string_dag.py +2 -0
- cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
- cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
- cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
- cirq/contrib/paulistring/recombine.py +6 -4
- cirq/contrib/paulistring/recombine_test.py +3 -1
- cirq/contrib/paulistring/separate.py +9 -6
- cirq/contrib/paulistring/separate_test.py +3 -1
- cirq/contrib/qasm_import/_lexer.py +3 -2
- cirq/contrib/qasm_import/_lexer_test.py +49 -13
- cirq/contrib/qasm_import/_parser.py +547 -83
- cirq/contrib/qasm_import/_parser_test.py +988 -97
- cirq/contrib/qasm_import/exception.py +2 -0
- cirq/contrib/qasm_import/qasm.py +8 -2
- cirq/contrib/qasm_import/qasm_test.py +7 -4
- cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
- cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
- cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
- cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
- cirq/contrib/qcircuit/qcircuit_test.py +10 -8
- cirq/contrib/quantum_volume/quantum_volume.py +31 -27
- cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
- cirq/contrib/quimb/density_matrix.py +15 -14
- cirq/contrib/quimb/density_matrix_test.py +10 -7
- cirq/contrib/quimb/grid_circuits.py +5 -2
- cirq/contrib/quimb/grid_circuits_test.py +3 -0
- cirq/contrib/quimb/mps_simulator.py +20 -20
- cirq/contrib/quimb/mps_simulator_test.py +3 -0
- cirq/contrib/quimb/state_vector.py +12 -11
- cirq/contrib/quimb/state_vector_test.py +3 -0
- cirq/contrib/quirk/export_to_quirk.py +5 -3
- cirq/contrib/quirk/export_to_quirk_test.py +18 -16
- cirq/contrib/quirk/linearize_circuit.py +2 -0
- cirq/contrib/quirk/quirk_gate.py +18 -17
- cirq/contrib/routing/device.py +5 -3
- cirq/contrib/routing/device_test.py +2 -0
- cirq/contrib/routing/greedy.py +10 -21
- cirq/contrib/routing/greedy_test.py +4 -2
- cirq/contrib/routing/initialization.py +2 -2
- cirq/contrib/routing/initialization_test.py +5 -3
- cirq/contrib/routing/router.py +9 -5
- cirq/contrib/routing/router_test.py +2 -0
- cirq/contrib/routing/swap_network.py +3 -3
- cirq/contrib/routing/swap_network_test.py +3 -1
- cirq/contrib/routing/utils.py +2 -2
- cirq/contrib/routing/utils_test.py +3 -0
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
- cirq/contrib/svg/svg.py +3 -3
- cirq/contrib/svg/svg_test.py +8 -5
- cirq/devices/device.py +4 -4
- cirq/devices/device_test.py +7 -4
- cirq/devices/grid_device_metadata.py +10 -10
- cirq/devices/grid_device_metadata_test.py +3 -0
- cirq/devices/grid_qubit.py +29 -21
- cirq/devices/grid_qubit_test.py +3 -0
- cirq/devices/insertion_noise_model.py +7 -7
- cirq/devices/insertion_noise_model_test.py +7 -5
- cirq/devices/line_qubit.py +13 -13
- cirq/devices/line_qubit_test.py +2 -0
- cirq/devices/named_topologies.py +18 -29
- cirq/devices/named_topologies_test.py +13 -10
- cirq/devices/noise_model.py +3 -3
- cirq/devices/noise_model_test.py +19 -15
- cirq/devices/noise_properties.py +15 -6
- cirq/devices/noise_properties_test.py +34 -3
- cirq/devices/noise_utils.py +11 -9
- cirq/devices/noise_utils_test.py +2 -0
- cirq/devices/superconducting_qubits_noise_properties.py +23 -22
- cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
- cirq/devices/thermal_noise_model.py +107 -37
- cirq/devices/thermal_noise_model_test.py +21 -0
- cirq/devices/unconstrained_device.py +5 -3
- cirq/devices/unconstrained_device_test.py +2 -0
- cirq/experiments/__init__.py +4 -2
- cirq/experiments/benchmarking/__init__.py +17 -0
- cirq/experiments/benchmarking/parallel_xeb.py +677 -0
- cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
- cirq/experiments/fidelity_estimation.py +14 -8
- cirq/experiments/fidelity_estimation_test.py +3 -0
- cirq/experiments/n_qubit_tomography.py +17 -16
- cirq/experiments/n_qubit_tomography_test.py +8 -5
- cirq/experiments/purity_estimation.py +2 -0
- cirq/experiments/purity_estimation_test.py +2 -0
- cirq/experiments/qubit_characterizations.py +207 -103
- cirq/experiments/qubit_characterizations_test.py +40 -12
- cirq/experiments/random_quantum_circuit_generation.py +56 -70
- cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
- cirq/experiments/readout_confusion_matrix.py +24 -22
- cirq/experiments/readout_confusion_matrix_test.py +2 -0
- cirq/experiments/single_qubit_readout_calibration.py +30 -15
- cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
- cirq/experiments/t1_decay_experiment.py +9 -7
- cirq/experiments/t1_decay_experiment_test.py +13 -11
- cirq/experiments/t2_decay_experiment.py +16 -13
- cirq/experiments/t2_decay_experiment_test.py +2 -0
- cirq/experiments/two_qubit_xeb.py +64 -57
- cirq/experiments/two_qubit_xeb_test.py +10 -6
- cirq/experiments/xeb_fitting.py +39 -35
- cirq/experiments/xeb_sampling.py +37 -44
- cirq/experiments/xeb_sampling_test.py +3 -0
- cirq/experiments/xeb_simulation.py +14 -10
- cirq/experiments/xeb_simulation_test.py +5 -5
- cirq/experiments/z_phase_calibration.py +32 -29
- cirq/experiments/z_phase_calibration_test.py +3 -4
- cirq/interop/quirk/cells/__init__.py +1 -1
- cirq/interop/quirk/cells/all_cells.py +7 -2
- cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
- cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
- cirq/interop/quirk/cells/cell.py +19 -28
- cirq/interop/quirk/cells/cell_test.py +3 -0
- cirq/interop/quirk/cells/composite_cell.py +13 -28
- cirq/interop/quirk/cells/composite_cell_test.py +2 -0
- cirq/interop/quirk/cells/control_cells.py +15 -15
- cirq/interop/quirk/cells/control_cells_test.py +7 -5
- cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
- cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
- cirq/interop/quirk/cells/ignored_cells.py +3 -0
- cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
- cirq/interop/quirk/cells/input_cells.py +7 -5
- cirq/interop/quirk/cells/input_cells_test.py +7 -5
- cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
- cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
- cirq/interop/quirk/cells/measurement_cells.py +5 -2
- cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
- cirq/interop/quirk/cells/parse.py +22 -23
- cirq/interop/quirk/cells/parse_test.py +12 -10
- cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
- cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
- cirq/interop/quirk/cells/scalar_cells.py +4 -1
- cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
- cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
- cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
- cirq/interop/quirk/cells/swap_cell.py +8 -6
- cirq/interop/quirk/cells/swap_cell_test.py +6 -4
- cirq/interop/quirk/cells/testing.py +6 -6
- cirq/interop/quirk/cells/testing_test.py +8 -6
- cirq/interop/quirk/cells/unsupported_cells.py +3 -0
- cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
- cirq/interop/quirk/url_to_circuit.py +23 -36
- cirq/interop/quirk/url_to_circuit_test.py +4 -1
- cirq/json_resolver_cache.py +14 -12
- cirq/linalg/__init__.py +4 -6
- cirq/linalg/combinators.py +7 -5
- cirq/linalg/combinators_test.py +10 -7
- cirq/linalg/decompositions.py +24 -35
- cirq/linalg/decompositions_test.py +3 -1
- cirq/linalg/diagonalize.py +6 -4
- cirq/linalg/diagonalize_test.py +15 -14
- cirq/linalg/operator_spaces.py +14 -14
- cirq/linalg/operator_spaces_test.py +13 -11
- cirq/linalg/predicates.py +18 -9
- cirq/linalg/predicates_test.py +5 -0
- cirq/linalg/tolerance.py +6 -3
- cirq/linalg/tolerance_test.py +6 -4
- cirq/linalg/transformations.py +23 -20
- cirq/linalg/transformations_test.py +73 -43
- cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
- cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
- cirq/neutral_atoms/neutral_atom_devices.py +2 -0
- cirq/ops/__init__.py +2 -0
- cirq/ops/arithmetic_operation.py +21 -21
- cirq/ops/arithmetic_operation_test.py +7 -8
- cirq/ops/boolean_hamiltonian.py +23 -22
- cirq/ops/boolean_hamiltonian_test.py +12 -9
- cirq/ops/classically_controlled_operation.py +31 -36
- cirq/ops/classically_controlled_operation_test.py +121 -117
- cirq/ops/clifford_gate.py +98 -81
- cirq/ops/clifford_gate_test.py +72 -57
- cirq/ops/common_channels.py +44 -44
- cirq/ops/common_channels_test.py +83 -81
- cirq/ops/common_gate_families.py +9 -7
- cirq/ops/common_gate_families_test.py +11 -7
- cirq/ops/common_gates.py +164 -183
- cirq/ops/common_gates_test.py +135 -95
- cirq/ops/control_values.py +23 -26
- cirq/ops/control_values_test.py +22 -20
- cirq/ops/controlled_gate.py +64 -112
- cirq/ops/controlled_gate_test.py +130 -35
- cirq/ops/controlled_operation.py +24 -35
- cirq/ops/controlled_operation_test.py +8 -6
- cirq/ops/dense_pauli_string.py +38 -49
- cirq/ops/dense_pauli_string_test.py +4 -2
- cirq/ops/diagonal_gate.py +18 -31
- cirq/ops/diagonal_gate_test.py +13 -13
- cirq/ops/eigen_gate.py +29 -29
- cirq/ops/eigen_gate_test.py +45 -28
- cirq/ops/fourier_transform.py +14 -20
- cirq/ops/fourier_transform_test.py +15 -12
- cirq/ops/fsim_gate.py +43 -42
- cirq/ops/fsim_gate_test.py +29 -29
- cirq/ops/gate_features.py +2 -0
- cirq/ops/gate_features_test.py +5 -3
- cirq/ops/gate_operation.py +43 -65
- cirq/ops/gate_operation_test.py +46 -42
- cirq/ops/gateset.py +28 -40
- cirq/ops/gateset_test.py +4 -2
- cirq/ops/global_phase_op.py +45 -20
- cirq/ops/global_phase_op_test.py +44 -20
- cirq/ops/greedy_qubit_manager.py +10 -8
- cirq/ops/greedy_qubit_manager_test.py +5 -3
- cirq/ops/identity.py +14 -12
- cirq/ops/identity_test.py +24 -20
- cirq/ops/kraus_channel.py +11 -8
- cirq/ops/kraus_channel_test.py +14 -11
- cirq/ops/linear_combinations.py +65 -77
- cirq/ops/linear_combinations_test.py +14 -9
- cirq/ops/matrix_gates.py +21 -18
- cirq/ops/matrix_gates_test.py +16 -0
- cirq/ops/measure_util.py +15 -20
- cirq/ops/measure_util_test.py +2 -0
- cirq/ops/measurement_gate.py +26 -37
- cirq/ops/measurement_gate_test.py +2 -0
- cirq/ops/mixed_unitary_channel.py +12 -9
- cirq/ops/mixed_unitary_channel_test.py +14 -11
- cirq/ops/named_qubit.py +16 -13
- cirq/ops/named_qubit_test.py +15 -13
- cirq/ops/op_tree.py +9 -7
- cirq/ops/op_tree_test.py +22 -19
- cirq/ops/parallel_gate.py +15 -17
- cirq/ops/parallel_gate_test.py +18 -16
- cirq/ops/parity_gates.py +23 -25
- cirq/ops/parity_gates_test.py +36 -32
- cirq/ops/pauli_gates.py +22 -21
- cirq/ops/pauli_gates_test.py +29 -20
- cirq/ops/pauli_interaction_gate.py +15 -19
- cirq/ops/pauli_interaction_gate_test.py +10 -8
- cirq/ops/pauli_measurement_gate.py +23 -35
- cirq/ops/pauli_measurement_gate_test.py +2 -0
- cirq/ops/pauli_string.py +92 -120
- cirq/ops/pauli_string_phasor.py +52 -45
- cirq/ops/pauli_string_phasor_test.py +4 -5
- cirq/ops/pauli_string_raw_types.py +9 -7
- cirq/ops/pauli_string_raw_types_test.py +2 -0
- cirq/ops/pauli_string_test.py +31 -154
- cirq/ops/pauli_sum_exponential.py +12 -12
- cirq/ops/pauli_sum_exponential_test.py +12 -10
- cirq/ops/permutation_gate.py +8 -6
- cirq/ops/permutation_gate_test.py +10 -8
- cirq/ops/phased_iswap_gate.py +16 -16
- cirq/ops/phased_iswap_gate_test.py +17 -15
- cirq/ops/phased_x_gate.py +16 -17
- cirq/ops/phased_x_gate_test.py +18 -16
- cirq/ops/phased_x_z_gate.py +24 -22
- cirq/ops/phased_x_z_gate_test.py +17 -11
- cirq/ops/projector.py +16 -11
- cirq/ops/projector_test.py +19 -16
- cirq/ops/qid_util.py +7 -5
- cirq/ops/qid_util_test.py +2 -0
- cirq/ops/qubit_manager.py +11 -9
- cirq/ops/qubit_manager_test.py +6 -4
- cirq/ops/qubit_order.py +11 -14
- cirq/ops/qubit_order_or_list.py +4 -2
- cirq/ops/qubit_order_test.py +12 -10
- cirq/ops/random_gate_channel.py +12 -10
- cirq/ops/random_gate_channel_test.py +14 -11
- cirq/ops/raw_types.py +109 -129
- cirq/ops/raw_types_test.py +63 -57
- cirq/ops/state_preparation_channel.py +7 -7
- cirq/ops/state_preparation_channel_test.py +11 -9
- cirq/ops/swap_gates.py +13 -15
- cirq/ops/swap_gates_test.py +19 -17
- cirq/ops/tags.py +5 -3
- cirq/ops/tags_test.py +4 -2
- cirq/ops/three_qubit_gates.py +43 -76
- cirq/ops/three_qubit_gates_test.py +19 -17
- cirq/ops/two_qubit_diagonal_gate.py +13 -13
- cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
- cirq/ops/uniform_superposition_gate.py +5 -3
- cirq/ops/uniform_superposition_gate_test.py +5 -3
- cirq/ops/wait_gate.py +17 -14
- cirq/ops/wait_gate_test.py +9 -6
- cirq/protocols/__init__.py +0 -3
- cirq/protocols/act_on_protocol.py +8 -6
- cirq/protocols/act_on_protocol_test.py +15 -12
- cirq/protocols/apply_channel_protocol.py +10 -14
- cirq/protocols/apply_channel_protocol_test.py +2 -0
- cirq/protocols/apply_mixture_protocol.py +13 -42
- cirq/protocols/apply_mixture_protocol_test.py +7 -5
- cirq/protocols/apply_unitary_protocol.py +39 -34
- cirq/protocols/apply_unitary_protocol_test.py +4 -1
- cirq/protocols/approximate_equality_protocol.py +2 -0
- cirq/protocols/approximate_equality_protocol_test.py +2 -0
- cirq/protocols/circuit_diagram_info_protocol.py +58 -42
- cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
- cirq/protocols/commutes_protocol.py +8 -7
- cirq/protocols/commutes_protocol_test.py +2 -0
- cirq/protocols/control_key_protocol.py +6 -4
- cirq/protocols/control_key_protocol_test.py +3 -1
- cirq/protocols/decompose_protocol.py +49 -48
- cirq/protocols/decompose_protocol_test.py +27 -16
- cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
- cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
- cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
- cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
- cirq/protocols/has_unitary_protocol.py +10 -6
- cirq/protocols/has_unitary_protocol_test.py +13 -8
- cirq/protocols/hash_from_pickle_test.py +2 -11
- cirq/protocols/inverse_protocol.py +13 -16
- cirq/protocols/inverse_protocol_test.py +5 -3
- cirq/protocols/json_serialization.py +35 -54
- cirq/protocols/json_serialization_test.py +14 -21
- cirq/protocols/json_test_data/CXSWAP.json +46 -0
- cirq/protocols/json_test_data/CXSWAP.repr +13 -0
- cirq/protocols/json_test_data/CZSWAP.json +46 -0
- cirq/protocols/json_test_data/CZSWAP.repr +13 -0
- cirq/protocols/json_test_data/CircuitOperation.json +6 -3
- cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
- cirq/protocols/json_test_data/Moment.json +24 -1
- cirq/protocols/json_test_data/Moment.repr +6 -1
- cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
- cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
- cirq/protocols/json_test_data/spec.py +6 -2
- cirq/protocols/kraus_protocol.py +47 -7
- cirq/protocols/kraus_protocol_test.py +86 -12
- cirq/protocols/measurement_key_protocol.py +15 -16
- cirq/protocols/measurement_key_protocol_test.py +13 -11
- cirq/protocols/mixture_protocol.py +7 -5
- cirq/protocols/mixture_protocol_test.py +4 -2
- cirq/protocols/mul_protocol.py +2 -3
- cirq/protocols/mul_protocol_test.py +2 -0
- cirq/protocols/pauli_expansion_protocol.py +6 -3
- cirq/protocols/pauli_expansion_protocol_test.py +5 -3
- cirq/protocols/phase_protocol.py +2 -0
- cirq/protocols/phase_protocol_test.py +3 -1
- cirq/protocols/pow_protocol.py +11 -16
- cirq/protocols/pow_protocol_test.py +2 -0
- cirq/protocols/qasm.py +14 -20
- cirq/protocols/qasm_test.py +6 -3
- cirq/protocols/qid_shape_protocol.py +8 -8
- cirq/protocols/qid_shape_protocol_test.py +3 -1
- cirq/protocols/resolve_parameters.py +5 -3
- cirq/protocols/resolve_parameters_test.py +8 -7
- cirq/protocols/trace_distance_bound.py +6 -4
- cirq/protocols/trace_distance_bound_test.py +3 -1
- cirq/protocols/unitary_protocol.py +17 -7
- cirq/protocols/unitary_protocol_test.py +12 -2
- cirq/qis/channels.py +6 -2
- cirq/qis/channels_test.py +20 -16
- cirq/qis/clifford_tableau.py +21 -19
- cirq/qis/clifford_tableau_test.py +2 -2
- cirq/qis/entropy.py +14 -3
- cirq/qis/entropy_test.py +3 -1
- cirq/qis/measures.py +13 -13
- cirq/qis/measures_test.py +20 -14
- cirq/qis/noise_utils.py +2 -0
- cirq/qis/noise_utils_test.py +9 -7
- cirq/qis/quantum_state_representation.py +7 -8
- cirq/qis/states.py +58 -56
- cirq/qis/states_test.py +2 -0
- cirq/sim/classical_simulator.py +23 -22
- cirq/sim/classical_simulator_test.py +2 -0
- cirq/sim/clifford/clifford_simulator.py +23 -21
- cirq/sim/clifford/clifford_simulator_test.py +7 -4
- cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
- cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
- cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
- cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
- cirq/sim/clifford/stabilizer_sampler.py +9 -7
- cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
- cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
- cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
- cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
- cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
- cirq/sim/density_matrix_simulation_state.py +26 -27
- cirq/sim/density_matrix_simulation_state_test.py +10 -8
- cirq/sim/density_matrix_simulator.py +30 -28
- cirq/sim/density_matrix_simulator_test.py +48 -48
- cirq/sim/density_matrix_utils.py +13 -11
- cirq/sim/density_matrix_utils_test.py +38 -36
- cirq/sim/mux.py +33 -31
- cirq/sim/mux_test.py +3 -0
- cirq/sim/simulation_product_state.py +15 -15
- cirq/sim/simulation_product_state_test.py +29 -26
- cirq/sim/simulation_state.py +29 -38
- cirq/sim/simulation_state_base.py +21 -32
- cirq/sim/simulation_state_test.py +15 -13
- cirq/sim/simulation_utils.py +5 -2
- cirq/sim/simulation_utils_test.py +5 -2
- cirq/sim/simulator.py +90 -106
- cirq/sim/simulator_base.py +33 -45
- cirq/sim/simulator_base_test.py +20 -15
- cirq/sim/simulator_test.py +23 -14
- cirq/sim/sparse_simulator.py +19 -17
- cirq/sim/sparse_simulator_test.py +41 -40
- cirq/sim/state_vector.py +15 -12
- cirq/sim/state_vector_simulation_state.py +31 -31
- cirq/sim/state_vector_simulation_state_test.py +16 -14
- cirq/sim/state_vector_simulator.py +17 -14
- cirq/sim/state_vector_simulator_test.py +2 -0
- cirq/sim/state_vector_test.py +6 -3
- cirq/study/flatten_expressions.py +16 -15
- cirq/study/flatten_expressions_test.py +13 -11
- cirq/study/resolver.py +18 -17
- cirq/study/resolver_test.py +22 -20
- cirq/study/result.py +17 -27
- cirq/study/result_test.py +2 -0
- cirq/study/sweepable.py +12 -10
- cirq/study/sweepable_test.py +3 -0
- cirq/study/sweeps.py +42 -61
- cirq/study/sweeps_test.py +33 -0
- cirq/testing/__init__.py +7 -11
- cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
- cirq/testing/circuit_compare.py +8 -17
- cirq/testing/circuit_compare_test.py +2 -0
- cirq/testing/consistent_act_on.py +13 -11
- cirq/testing/consistent_act_on_test.py +5 -3
- cirq/testing/consistent_channels.py +2 -0
- cirq/testing/consistent_channels_test.py +10 -8
- cirq/testing/consistent_controlled_gate_op.py +5 -5
- cirq/testing/consistent_controlled_gate_op_test.py +18 -18
- cirq/testing/consistent_decomposition.py +2 -2
- cirq/testing/consistent_decomposition_test.py +4 -2
- cirq/testing/consistent_pauli_expansion.py +2 -0
- cirq/testing/consistent_pauli_expansion_test.py +3 -1
- cirq/testing/consistent_phase_by.py +2 -0
- cirq/testing/consistent_phase_by_test.py +3 -1
- cirq/testing/consistent_protocols.py +14 -20
- cirq/testing/consistent_protocols_test.py +13 -11
- cirq/testing/consistent_qasm.py +6 -4
- cirq/testing/consistent_qasm_test.py +7 -7
- cirq/testing/consistent_resolve_parameters.py +2 -0
- cirq/testing/consistent_specified_has_unitary.py +2 -2
- cirq/testing/consistent_specified_has_unitary_test.py +6 -4
- cirq/testing/consistent_unitary.py +1 -0
- cirq/testing/consistent_unitary_test.py +4 -2
- cirq/testing/deprecation.py +5 -2
- cirq/testing/deprecation_test.py +5 -2
- cirq/testing/devices.py +7 -4
- cirq/testing/devices_test.py +7 -4
- cirq/testing/equals_tester.py +4 -2
- cirq/testing/equals_tester_test.py +21 -17
- cirq/testing/equivalent_basis_map.py +6 -4
- cirq/testing/equivalent_basis_map_test.py +6 -4
- cirq/testing/equivalent_repr_eval.py +6 -4
- cirq/testing/equivalent_repr_eval_test.py +5 -3
- cirq/testing/gate_features.py +2 -0
- cirq/testing/gate_features_test.py +7 -5
- cirq/testing/json.py +19 -15
- cirq/testing/json_test.py +5 -3
- cirq/testing/lin_alg_utils.py +10 -11
- cirq/testing/lin_alg_utils_test.py +14 -12
- cirq/testing/logs.py +7 -6
- cirq/testing/logs_test.py +9 -7
- cirq/testing/no_identifier_qubit.py +4 -2
- cirq/testing/no_identifier_qubit_test.py +5 -3
- cirq/testing/op_tree.py +2 -0
- cirq/testing/op_tree_test.py +4 -1
- cirq/testing/order_tester.py +2 -0
- cirq/testing/order_tester_test.py +8 -6
- cirq/testing/pytest_utils.py +2 -0
- cirq/testing/pytest_utils_test.py +4 -2
- cirq/testing/random_circuit.py +21 -20
- cirq/testing/random_circuit_test.py +12 -9
- cirq/testing/repr_pretty_tester.py +1 -0
- cirq/testing/repr_pretty_tester_test.py +5 -3
- cirq/testing/routing_devices.py +4 -1
- cirq/testing/routing_devices_test.py +9 -6
- cirq/testing/sample_circuits.py +4 -1
- cirq/testing/sample_circuits_test.py +3 -1
- cirq/testing/sample_gates.py +3 -0
- cirq/testing/sample_gates_test.py +5 -2
- cirq/transformers/__init__.py +11 -4
- cirq/transformers/align.py +9 -7
- cirq/transformers/align_test.py +2 -0
- cirq/transformers/analytical_decompositions/__init__.py +3 -6
- cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
- cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
- cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
- cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
- cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
- cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
- cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
- cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
- cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
- cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
- cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
- cirq/transformers/drop_empty_moments.py +5 -3
- cirq/transformers/drop_empty_moments_test.py +4 -2
- cirq/transformers/drop_negligible_operations.py +7 -5
- cirq/transformers/drop_negligible_operations_test.py +2 -0
- cirq/transformers/dynamical_decoupling.py +49 -42
- cirq/transformers/dynamical_decoupling_test.py +223 -205
- cirq/transformers/eject_phased_paulis.py +28 -26
- cirq/transformers/eject_phased_paulis_test.py +12 -9
- cirq/transformers/eject_z.py +12 -12
- cirq/transformers/eject_z_test.py +2 -2
- cirq/transformers/expand_composite.py +6 -4
- cirq/transformers/expand_composite_test.py +3 -1
- cirq/transformers/gauge_compiling/__init__.py +3 -1
- cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
- cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
- cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
- cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
- cirq/transformers/insertion_sort.py +8 -6
- cirq/transformers/insertion_sort_test.py +3 -1
- cirq/transformers/measurement_transformers.py +29 -29
- cirq/transformers/measurement_transformers_test.py +2 -0
- cirq/transformers/merge_k_qubit_gates.py +12 -10
- cirq/transformers/merge_k_qubit_gates_test.py +18 -18
- cirq/transformers/merge_single_qubit_gates.py +197 -20
- cirq/transformers/merge_single_qubit_gates_test.py +177 -5
- cirq/transformers/noise_adding.py +5 -3
- cirq/transformers/noise_adding_test.py +2 -0
- cirq/transformers/optimize_for_target_gateset.py +19 -17
- cirq/transformers/optimize_for_target_gateset_test.py +11 -8
- cirq/transformers/qubit_management_transformers.py +13 -11
- cirq/transformers/qubit_management_transformers_test.py +5 -3
- cirq/transformers/randomized_measurements.py +16 -14
- cirq/transformers/randomized_measurements_test.py +10 -4
- cirq/transformers/routing/initial_mapper.py +6 -4
- cirq/transformers/routing/initial_mapper_test.py +2 -0
- cirq/transformers/routing/line_initial_mapper.py +16 -14
- cirq/transformers/routing/line_initial_mapper_test.py +9 -7
- cirq/transformers/routing/mapping_manager.py +10 -10
- cirq/transformers/routing/mapping_manager_test.py +2 -0
- cirq/transformers/routing/route_circuit_cqc.py +33 -31
- cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
- cirq/transformers/routing/visualize_routed_circuit.py +8 -7
- cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
- cirq/transformers/stratify.py +17 -15
- cirq/transformers/stratify_test.py +3 -0
- cirq/transformers/symbolize.py +103 -0
- cirq/transformers/symbolize_test.py +62 -0
- cirq/transformers/synchronize_terminal_measurements.py +10 -10
- cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
- cirq/transformers/tag_transformers.py +97 -0
- cirq/transformers/tag_transformers_test.py +103 -0
- cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
- cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
- cirq/transformers/target_gatesets/cz_gateset.py +7 -5
- cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
- cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
- cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
- cirq/transformers/transformer_api.py +34 -47
- cirq/transformers/transformer_api_test.py +9 -8
- cirq/transformers/transformer_primitives.py +39 -49
- cirq/transformers/transformer_primitives_test.py +10 -17
- cirq/value/abc_alt.py +6 -4
- cirq/value/abc_alt_test.py +5 -3
- cirq/value/angle.py +11 -12
- cirq/value/angle_test.py +5 -3
- cirq/value/classical_data.py +27 -27
- cirq/value/classical_data_test.py +11 -8
- cirq/value/condition.py +26 -24
- cirq/value/condition_test.py +2 -0
- cirq/value/digits.py +14 -11
- cirq/value/digits_test.py +2 -0
- cirq/value/duration.py +23 -20
- cirq/value/duration_test.py +2 -0
- cirq/value/linear_dict.py +25 -30
- cirq/value/linear_dict_test.py +10 -8
- cirq/value/measurement_key.py +12 -12
- cirq/value/measurement_key_test.py +2 -0
- cirq/value/periodic_value.py +4 -4
- cirq/value/periodic_value_test.py +11 -7
- cirq/value/probability.py +3 -1
- cirq/value/probability_test.py +4 -2
- cirq/value/product_state.py +15 -13
- cirq/value/product_state_test.py +4 -1
- cirq/value/random_state.py +2 -0
- cirq/value/random_state_test.py +5 -3
- cirq/value/timestamp.py +11 -7
- cirq/value/timestamp_test.py +14 -12
- cirq/value/type_alias.py +4 -4
- cirq/value/value_equality_attr.py +8 -9
- cirq/value/value_equality_attr_test.py +14 -11
- cirq/vis/density_matrix.py +3 -3
- cirq/vis/density_matrix_test.py +20 -17
- cirq/vis/heatmap.py +24 -37
- cirq/vis/heatmap_test.py +3 -0
- cirq/vis/histogram.py +9 -6
- cirq/vis/histogram_test.py +5 -2
- cirq/vis/state_histogram.py +10 -8
- cirq/vis/state_histogram_test.py +7 -5
- cirq/vis/vis_utils.py +4 -1
- cirq/vis/vis_utils_test.py +4 -1
- cirq/work/collector.py +12 -18
- cirq/work/collector_test.py +15 -10
- cirq/work/observable_grouping.py +6 -7
- cirq/work/observable_grouping_test.py +10 -9
- cirq/work/observable_measurement.py +47 -45
- cirq/work/observable_measurement_data.py +22 -17
- cirq/work/observable_measurement_data_test.py +4 -1
- cirq/work/observable_measurement_test.py +48 -29
- cirq/work/observable_readout_calibration.py +5 -2
- cirq/work/observable_readout_calibration_test.py +5 -2
- cirq/work/observable_settings.py +13 -22
- cirq/work/observable_settings_test.py +9 -7
- cirq/work/pauli_sum_collector.py +12 -10
- cirq/work/pauli_sum_collector_test.py +9 -9
- cirq/work/sampler.py +42 -43
- cirq/work/sampler_test.py +31 -24
- cirq/work/zeros_sampler.py +6 -4
- cirq/work/zeros_sampler_test.py +7 -5
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
- cirq_core-1.6.0.dist-info/RECORD +1241 -0
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
- cirq_core-1.5.0.dev20250409222543.dist-info/RECORD +0 -1216
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
|
@@ -12,28 +12,27 @@
|
|
|
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 cmath
|
|
16
18
|
import re
|
|
17
19
|
from typing import (
|
|
18
20
|
Any,
|
|
19
21
|
Callable,
|
|
20
22
|
cast,
|
|
21
|
-
Dict,
|
|
22
23
|
Iterable,
|
|
23
24
|
Iterator,
|
|
24
|
-
List,
|
|
25
25
|
Mapping,
|
|
26
|
-
Optional,
|
|
27
26
|
SupportsFloat,
|
|
27
|
+
TypeAlias,
|
|
28
28
|
TypeVar,
|
|
29
|
-
Union,
|
|
30
29
|
)
|
|
31
30
|
|
|
32
31
|
import numpy as np
|
|
33
32
|
import sympy
|
|
34
33
|
|
|
35
34
|
|
|
36
|
-
def _merge_scientific_float_tokens(tokens: Iterable[str]) ->
|
|
35
|
+
def _merge_scientific_float_tokens(tokens: Iterable[str]) -> list[str]:
|
|
37
36
|
tokens = list(tokens)
|
|
38
37
|
i = 0
|
|
39
38
|
while 'e' in tokens[i + 1 :]:
|
|
@@ -54,8 +53,8 @@ def _merge_scientific_float_tokens(tokens: Iterable[str]) -> List[str]:
|
|
|
54
53
|
T = TypeVar('T')
|
|
55
54
|
|
|
56
55
|
|
|
57
|
-
def _segment_by(seq: Iterable[T], *, key: Callable[[T], Any]) -> Iterator[
|
|
58
|
-
group:
|
|
56
|
+
def _segment_by(seq: Iterable[T], *, key: Callable[[T], Any]) -> Iterator[list[T]]:
|
|
57
|
+
group: list[T] = []
|
|
59
58
|
last_key = None
|
|
60
59
|
for item in seq:
|
|
61
60
|
item_key = key(item)
|
|
@@ -68,8 +67,8 @@ def _segment_by(seq: Iterable[T], *, key: Callable[[T], Any]) -> Iterator[List[T
|
|
|
68
67
|
yield group
|
|
69
68
|
|
|
70
69
|
|
|
71
|
-
def _tokenize(text: str) ->
|
|
72
|
-
def classify(e: str) ->
|
|
70
|
+
def _tokenize(text: str) -> list[str]:
|
|
71
|
+
def classify(e: str) -> str | float:
|
|
73
72
|
assert e.strip() != '' # Because _segment_by drops empty entries.
|
|
74
73
|
if re.match(r'[.0-9]', e):
|
|
75
74
|
return "#"
|
|
@@ -85,14 +84,14 @@ def _tokenize(text: str) -> List[str]:
|
|
|
85
84
|
return _merge_scientific_float_tokens(g for g in result if g.strip())
|
|
86
85
|
|
|
87
86
|
|
|
88
|
-
_ResolvedToken =
|
|
87
|
+
_ResolvedToken: TypeAlias = sympy.Expr | complex
|
|
89
88
|
|
|
90
89
|
|
|
91
90
|
class _CustomQuirkOperationToken:
|
|
92
91
|
def __init__(
|
|
93
92
|
self,
|
|
94
|
-
unary_action:
|
|
95
|
-
binary_action:
|
|
93
|
+
unary_action: Callable[[_ResolvedToken], _ResolvedToken] | None,
|
|
94
|
+
binary_action: Callable[[_ResolvedToken, _ResolvedToken], _ResolvedToken] | None,
|
|
96
95
|
priority: float,
|
|
97
96
|
):
|
|
98
97
|
self.unary_action = unary_action
|
|
@@ -108,7 +107,7 @@ class _HangingNode:
|
|
|
108
107
|
self.weight = weight
|
|
109
108
|
|
|
110
109
|
|
|
111
|
-
_HangingToken =
|
|
110
|
+
_HangingToken: TypeAlias = _ResolvedToken | str | _CustomQuirkOperationToken
|
|
112
111
|
|
|
113
112
|
|
|
114
113
|
def _translate_token(token_id: str, token_map: Mapping[str, _HangingToken]) -> _HangingToken:
|
|
@@ -122,10 +121,10 @@ def _translate_token(token_id: str, token_map: Mapping[str, _HangingToken]) -> _
|
|
|
122
121
|
|
|
123
122
|
|
|
124
123
|
def _parse_formula_using_token_map(
|
|
125
|
-
text: str, token_map:
|
|
124
|
+
text: str, token_map: dict[str, _HangingToken]
|
|
126
125
|
) -> _ResolvedToken:
|
|
127
126
|
"""Parses a value from an infix arithmetic expression."""
|
|
128
|
-
tokens:
|
|
127
|
+
tokens: list[_HangingToken] = [_translate_token(e, token_map) for e in _tokenize(text)]
|
|
129
128
|
|
|
130
129
|
# Cut off trailing operation, so parse fails less often as users are typing.
|
|
131
130
|
if (
|
|
@@ -135,8 +134,8 @@ def _parse_formula_using_token_map(
|
|
|
135
134
|
):
|
|
136
135
|
tokens = tokens[:-1]
|
|
137
136
|
|
|
138
|
-
ops:
|
|
139
|
-
vals:
|
|
137
|
+
ops: list[str | _HangingNode] = []
|
|
138
|
+
vals: list[_HangingToken | None] = []
|
|
140
139
|
|
|
141
140
|
# Hack: use the 'priority' field as a signal of 'is an operation'
|
|
142
141
|
def is_valid_end_token(tok: _HangingToken) -> bool:
|
|
@@ -145,7 +144,7 @@ def _parse_formula_using_token_map(
|
|
|
145
144
|
def is_valid_end_state() -> bool:
|
|
146
145
|
return len(vals) == 1 and len(ops) == 0
|
|
147
146
|
|
|
148
|
-
def apply(op:
|
|
147
|
+
def apply(op: str | _HangingNode) -> None:
|
|
149
148
|
assert isinstance(op, _HangingNode)
|
|
150
149
|
if len(vals) < 2:
|
|
151
150
|
raise ValueError("Bad expression: operated on nothing.\ntext={text!r}")
|
|
@@ -237,7 +236,7 @@ UNICODE_FRACTIONS = {
|
|
|
237
236
|
"⅒": 1 / 10,
|
|
238
237
|
}
|
|
239
238
|
|
|
240
|
-
PARSE_COMPLEX_TOKEN_MAP_ALL:
|
|
239
|
+
PARSE_COMPLEX_TOKEN_MAP_ALL: dict[str, _HangingToken] = {
|
|
241
240
|
**UNICODE_FRACTIONS,
|
|
242
241
|
'i': 1j,
|
|
243
242
|
'e': sympy.E,
|
|
@@ -265,7 +264,7 @@ PARSE_COMPLEX_TOKEN_MAP_ALL: Dict[str, _HangingToken] = {
|
|
|
265
264
|
}
|
|
266
265
|
PARSE_COMPLEX_TOKEN_MAP_ALL["√"] = PARSE_COMPLEX_TOKEN_MAP_ALL["sqrt"]
|
|
267
266
|
|
|
268
|
-
PARSE_COMPLEX_TOKEN_MAP_DEG:
|
|
267
|
+
PARSE_COMPLEX_TOKEN_MAP_DEG: dict[str, _HangingToken] = {
|
|
269
268
|
**PARSE_COMPLEX_TOKEN_MAP_ALL,
|
|
270
269
|
"cos": _CustomQuirkOperationToken(
|
|
271
270
|
unary_action=lambda e: sympy.cos(e * sympy.pi / 180), binary_action=None, priority=4
|
|
@@ -283,7 +282,7 @@ PARSE_COMPLEX_TOKEN_MAP_DEG: Dict[str, _HangingToken] = {
|
|
|
283
282
|
PARSE_COMPLEX_TOKEN_MAP_DEG["arccos"] = PARSE_COMPLEX_TOKEN_MAP_DEG["acos"]
|
|
284
283
|
PARSE_COMPLEX_TOKEN_MAP_DEG["arcsin"] = PARSE_COMPLEX_TOKEN_MAP_DEG["asin"]
|
|
285
284
|
|
|
286
|
-
PARSE_COMPLEX_TOKEN_MAP_RAD:
|
|
285
|
+
PARSE_COMPLEX_TOKEN_MAP_RAD: dict[str, _HangingToken] = {
|
|
287
286
|
**PARSE_COMPLEX_TOKEN_MAP_ALL,
|
|
288
287
|
"cos": _CustomQuirkOperationToken(
|
|
289
288
|
unary_action=lambda e: sympy.cos(e) if isinstance(e, sympy.Basic) else cmath.cos(e),
|
|
@@ -337,12 +336,12 @@ def parse_complex(text: str) -> complex:
|
|
|
337
336
|
raise ValueError(f'Failed to parse complex from {text!r}') from ex
|
|
338
337
|
|
|
339
338
|
|
|
340
|
-
def parse_formula(formula: str) ->
|
|
339
|
+
def parse_formula(formula: str) -> float | sympy.Expr:
|
|
341
340
|
"""Attempts to parse formula text in exactly the same way as Quirk."""
|
|
342
341
|
if not isinstance(formula, str):
|
|
343
342
|
raise TypeError('formula must be a string')
|
|
344
343
|
|
|
345
|
-
token_map:
|
|
344
|
+
token_map: dict[str, _HangingToken] = {**PARSE_COMPLEX_TOKEN_MAP_RAD, 't': sympy.Symbol('t')}
|
|
346
345
|
result = _parse_formula_using_token_map(formula, token_map)
|
|
347
346
|
|
|
348
347
|
if isinstance(result, sympy.Basic):
|
|
@@ -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
|
import sympy
|
|
@@ -19,7 +21,7 @@ import sympy
|
|
|
19
21
|
from cirq.interop.quirk.cells.parse import parse_complex, parse_formula, parse_matrix
|
|
20
22
|
|
|
21
23
|
|
|
22
|
-
def test_parse_matrix():
|
|
24
|
+
def test_parse_matrix() -> None:
|
|
23
25
|
s = np.sqrt(0.5)
|
|
24
26
|
np.testing.assert_allclose(
|
|
25
27
|
parse_matrix('{{√½,√½},{-√½,√½}}'), np.array([[s, s], [-s, s]]), atol=1e-8
|
|
@@ -32,7 +34,7 @@ def test_parse_matrix():
|
|
|
32
34
|
)
|
|
33
35
|
|
|
34
36
|
|
|
35
|
-
def test_parse_matrix_failures():
|
|
37
|
+
def test_parse_matrix_failures() -> None:
|
|
36
38
|
with pytest.raises(ValueError, match='Not surrounded by {{}}'):
|
|
37
39
|
_ = parse_matrix('1')
|
|
38
40
|
with pytest.raises(ValueError, match='Not surrounded by {{}}'):
|
|
@@ -45,7 +47,7 @@ def test_parse_matrix_failures():
|
|
|
45
47
|
_ = parse_matrix('{{x}}')
|
|
46
48
|
|
|
47
49
|
|
|
48
|
-
def test_parse_real_formula():
|
|
50
|
+
def test_parse_real_formula() -> None:
|
|
49
51
|
t = sympy.Symbol('t')
|
|
50
52
|
assert parse_formula('1/2') == 0.5
|
|
51
53
|
assert parse_formula('t*t + ln(t)') == t * t + sympy.ln(t)
|
|
@@ -58,12 +60,12 @@ def test_parse_real_formula():
|
|
|
58
60
|
_ = parse_formula('i')
|
|
59
61
|
|
|
60
62
|
|
|
61
|
-
def test_parse_formula_failures():
|
|
63
|
+
def test_parse_formula_failures() -> None:
|
|
62
64
|
with pytest.raises(TypeError, match='formula must be a string'):
|
|
63
|
-
_ = parse_formula(2)
|
|
65
|
+
_ = parse_formula(2) # type: ignore[arg-type]
|
|
64
66
|
|
|
65
67
|
with pytest.raises(TypeError, match='formula must be a string'):
|
|
66
|
-
_ = parse_formula([])
|
|
68
|
+
_ = parse_formula([]) # type: ignore[arg-type]
|
|
67
69
|
|
|
68
70
|
with pytest.raises(ValueError, match='Unrecognized token'):
|
|
69
71
|
_ = parse_formula('5*__**DSA **)SADD')
|
|
@@ -72,7 +74,7 @@ def test_parse_formula_failures():
|
|
|
72
74
|
_ = parse_formula('5*x')
|
|
73
75
|
|
|
74
76
|
|
|
75
|
-
def test_parse_complex():
|
|
77
|
+
def test_parse_complex() -> None:
|
|
76
78
|
assert parse_complex('0') == 0
|
|
77
79
|
assert parse_complex('1') == 1
|
|
78
80
|
assert parse_complex('i') == 1j
|
|
@@ -84,7 +86,7 @@ def test_parse_complex():
|
|
|
84
86
|
np.testing.assert_allclose(parse_complex('exp 2'), np.e**2, atol=1e-8)
|
|
85
87
|
|
|
86
88
|
|
|
87
|
-
def test_parse_complex_raw_cases_from_quirk():
|
|
89
|
+
def test_parse_complex_raw_cases_from_quirk() -> None:
|
|
88
90
|
assert parse_complex("0") == 0
|
|
89
91
|
assert parse_complex("1") == 1
|
|
90
92
|
assert parse_complex("-1") == -1
|
|
@@ -116,7 +118,7 @@ def test_parse_complex_raw_cases_from_quirk():
|
|
|
116
118
|
np.testing.assert_allclose(parse_complex("2 pi"), 2 * np.pi)
|
|
117
119
|
|
|
118
120
|
|
|
119
|
-
def test_parse_complex_expression_cases_from_quirk():
|
|
121
|
+
def test_parse_complex_expression_cases_from_quirk() -> None:
|
|
120
122
|
np.testing.assert_allclose(parse_complex("1/3"), 1 / 3)
|
|
121
123
|
np.testing.assert_allclose(parse_complex("2/3/5"), (2 / 3) / 5)
|
|
122
124
|
np.testing.assert_allclose(parse_complex("2/3/5*7/13"), ((((2 / 3) / 5)) * 7) / 13)
|
|
@@ -152,7 +154,7 @@ def test_parse_complex_expression_cases_from_quirk():
|
|
|
152
154
|
np.testing.assert_allclose(parse_complex("cos(acos(0.5))"), 0.5, atol=1e-8)
|
|
153
155
|
|
|
154
156
|
|
|
155
|
-
def test_parse_complex_expression_failures():
|
|
157
|
+
def test_parse_complex_expression_failures() -> None:
|
|
156
158
|
with pytest.raises(ValueError, match='Incomplete expression'):
|
|
157
159
|
_ = parse_formula('(')
|
|
158
160
|
with pytest.raises(ValueError, match=r"unmatched '\)'"):
|
|
@@ -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 Callable, Iterator, Sequence, TYPE_CHECKING
|
|
16
18
|
|
|
17
19
|
from cirq import ops, value
|
|
18
20
|
from cirq.interop.quirk.cells.cell import CELL_SIZES, CellMaker
|
|
@@ -42,7 +44,7 @@ class QuirkQubitPermutationGate(ops.QubitPermutationGate):
|
|
|
42
44
|
def _value_equality_values_(self):
|
|
43
45
|
return self.identifier, self.name, self.permutation
|
|
44
46
|
|
|
45
|
-
def _circuit_diagram_info_(self, args:
|
|
47
|
+
def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> tuple[str, ...]:
|
|
46
48
|
return tuple(
|
|
47
49
|
f'{self.name}[{i}>{self.permutation[i]}]' for i in range(len(self.permutation))
|
|
48
50
|
)
|
|
@@ -72,7 +74,7 @@ def _permutation_family(
|
|
|
72
74
|
yield _permutation(identifier_prefix + str(n), name, permutation)
|
|
73
75
|
|
|
74
76
|
|
|
75
|
-
def _permutation(identifier: str, name: str, permutation:
|
|
77
|
+
def _permutation(identifier: str, name: str, permutation: tuple[int, ...]) -> CellMaker:
|
|
76
78
|
return CellMaker(
|
|
77
79
|
identifier,
|
|
78
80
|
size=len(permutation),
|
|
@@ -12,12 +12,14 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import cirq
|
|
16
18
|
from cirq.interop.quirk.cells.qubit_permutation_cells import QuirkQubitPermutationGate
|
|
17
19
|
from cirq.interop.quirk.cells.testing import assert_url_to_circuit_returns
|
|
18
20
|
|
|
19
21
|
|
|
20
|
-
def test_equality():
|
|
22
|
+
def test_equality() -> None:
|
|
21
23
|
eq = cirq.testing.EqualsTester()
|
|
22
24
|
eq.make_equality_group(lambda: QuirkQubitPermutationGate('a', 'b', [0, 1]))
|
|
23
25
|
eq.add_equality_group(QuirkQubitPermutationGate('x', 'b', [0, 1]))
|
|
@@ -25,11 +27,11 @@ def test_equality():
|
|
|
25
27
|
eq.add_equality_group(QuirkQubitPermutationGate('a', 'b', [1, 0]))
|
|
26
28
|
|
|
27
29
|
|
|
28
|
-
def test_repr():
|
|
30
|
+
def test_repr() -> None:
|
|
29
31
|
cirq.testing.assert_equivalent_repr(QuirkQubitPermutationGate('a', 'b', [0, 1]))
|
|
30
32
|
|
|
31
33
|
|
|
32
|
-
def test_right_rotate():
|
|
34
|
+
def test_right_rotate() -> None:
|
|
33
35
|
assert_url_to_circuit_returns(
|
|
34
36
|
'{"cols":[["X",">>4",1,1,1,"X"]]}',
|
|
35
37
|
diagram="""
|
|
@@ -57,7 +59,7 @@ def test_right_rotate():
|
|
|
57
59
|
)
|
|
58
60
|
|
|
59
61
|
|
|
60
|
-
def test_left_rotate():
|
|
62
|
+
def test_left_rotate() -> None:
|
|
61
63
|
assert_url_to_circuit_returns(
|
|
62
64
|
'{"cols":[["<<4"]]}',
|
|
63
65
|
maps={
|
|
@@ -72,7 +74,7 @@ def test_left_rotate():
|
|
|
72
74
|
)
|
|
73
75
|
|
|
74
76
|
|
|
75
|
-
def test_reverse():
|
|
77
|
+
def test_reverse() -> None:
|
|
76
78
|
assert_url_to_circuit_returns(
|
|
77
79
|
'{"cols":[["rev4"]]}',
|
|
78
80
|
maps={
|
|
@@ -98,7 +100,7 @@ def test_reverse():
|
|
|
98
100
|
)
|
|
99
101
|
|
|
100
102
|
|
|
101
|
-
def test_interleave():
|
|
103
|
+
def test_interleave() -> None:
|
|
102
104
|
assert_url_to_circuit_returns(
|
|
103
105
|
'{"cols":[["weave5"]]}',
|
|
104
106
|
maps={
|
|
@@ -128,7 +130,7 @@ def test_interleave():
|
|
|
128
130
|
)
|
|
129
131
|
|
|
130
132
|
|
|
131
|
-
def test_deinterleave():
|
|
133
|
+
def test_deinterleave() -> None:
|
|
132
134
|
assert_url_to_circuit_returns(
|
|
133
135
|
'{"cols":[["split5"]]}',
|
|
134
136
|
maps={
|
|
@@ -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 Iterator, TYPE_CHECKING
|
|
15
18
|
|
|
16
19
|
from cirq import ops
|
|
@@ -28,5 +31,5 @@ def generate_all_scalar_cell_makers() -> Iterator[CellMaker]:
|
|
|
28
31
|
yield _scalar("√-i", ops.global_phase_operation((-1j) ** 0.5))
|
|
29
32
|
|
|
30
33
|
|
|
31
|
-
def _scalar(identifier: str, operation:
|
|
34
|
+
def _scalar(identifier: str, operation: cirq.Operation) -> CellMaker:
|
|
32
35
|
return CellMaker(identifier, size=1, maker=lambda _: operation)
|
|
@@ -12,11 +12,13 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import cirq
|
|
16
18
|
from cirq.interop.quirk.cells.testing import assert_url_to_circuit_returns
|
|
17
19
|
|
|
18
20
|
|
|
19
|
-
def test_scalar_operations():
|
|
21
|
+
def test_scalar_operations() -> None:
|
|
20
22
|
assert_url_to_circuit_returns('{"cols":[["…"]]}', cirq.Circuit())
|
|
21
23
|
|
|
22
24
|
assert_url_to_circuit_returns(
|
|
@@ -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 Callable, Iterator, TYPE_CHECKING
|
|
15
18
|
|
|
16
19
|
import sympy
|
|
@@ -91,14 +94,14 @@ def generate_all_single_qubit_rotation_cell_makers() -> Iterator[CellMaker]:
|
|
|
91
94
|
yield _formula_gate("Rzft", "pi*t*t", ops.rz)
|
|
92
95
|
|
|
93
96
|
|
|
94
|
-
def _gate(identifier: str, gate:
|
|
97
|
+
def _gate(identifier: str, gate: cirq.Gate) -> CellMaker:
|
|
95
98
|
return CellMaker(
|
|
96
99
|
identifier=identifier, size=gate.num_qubits(), maker=lambda args: gate.on(*args.qubits)
|
|
97
100
|
)
|
|
98
101
|
|
|
99
102
|
|
|
100
103
|
def _formula_gate(
|
|
101
|
-
identifier: str, default_formula: str, gate_func: Callable[[
|
|
104
|
+
identifier: str, default_formula: str, gate_func: Callable[[cirq.TParamVal], cirq.Gate]
|
|
102
105
|
) -> CellMaker:
|
|
103
106
|
return CellMaker(
|
|
104
107
|
identifier=identifier,
|
|
@@ -12,13 +12,15 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import sympy
|
|
16
18
|
|
|
17
19
|
import cirq
|
|
18
20
|
from cirq.interop.quirk.cells.testing import assert_url_to_circuit_returns
|
|
19
21
|
|
|
20
22
|
|
|
21
|
-
def test_fixed_single_qubit_rotations():
|
|
23
|
+
def test_fixed_single_qubit_rotations() -> None:
|
|
22
24
|
a, b, c, d = cirq.LineQubit.range(4)
|
|
23
25
|
|
|
24
26
|
assert_url_to_circuit_returns(
|
|
@@ -89,7 +91,7 @@ def test_fixed_single_qubit_rotations():
|
|
|
89
91
|
)
|
|
90
92
|
|
|
91
93
|
|
|
92
|
-
def test_dynamic_single_qubit_rotations():
|
|
94
|
+
def test_dynamic_single_qubit_rotations() -> None:
|
|
93
95
|
a, b, c = cirq.LineQubit.range(3)
|
|
94
96
|
t = sympy.Symbol('t')
|
|
95
97
|
|
|
@@ -118,7 +120,7 @@ def test_dynamic_single_qubit_rotations():
|
|
|
118
120
|
)
|
|
119
121
|
|
|
120
122
|
|
|
121
|
-
def test_formulaic_gates():
|
|
123
|
+
def test_formulaic_gates() -> None:
|
|
122
124
|
a, b = cirq.LineQubit.range(2)
|
|
123
125
|
t = sympy.Symbol('t')
|
|
124
126
|
|
|
@@ -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 Any, Iterable, Iterator, TYPE_CHECKING
|
|
16
18
|
|
|
17
19
|
from cirq import ops, value
|
|
18
20
|
from cirq.interop.quirk.cells.cell import Cell, CellMaker
|
|
@@ -23,20 +25,20 @@ if TYPE_CHECKING:
|
|
|
23
25
|
|
|
24
26
|
@value.value_equality(unhashable=True)
|
|
25
27
|
class SwapCell(Cell):
|
|
26
|
-
def __init__(self, qubits: Iterable[
|
|
28
|
+
def __init__(self, qubits: Iterable[cirq.Qid], controls: Iterable[cirq.Qid]):
|
|
27
29
|
self._qubits = list(qubits)
|
|
28
30
|
self._controls = list(controls)
|
|
29
31
|
|
|
30
32
|
def gate_count(self) -> int:
|
|
31
33
|
return 1
|
|
32
34
|
|
|
33
|
-
def with_line_qubits_mapped_to(self, qubits:
|
|
35
|
+
def with_line_qubits_mapped_to(self, qubits: list[cirq.Qid]) -> Cell:
|
|
34
36
|
return SwapCell(
|
|
35
37
|
qubits=Cell._replace_qubits(self._qubits, qubits),
|
|
36
38
|
controls=Cell._replace_qubits(self._controls, qubits),
|
|
37
39
|
)
|
|
38
40
|
|
|
39
|
-
def modify_column(self, column:
|
|
41
|
+
def modify_column(self, column: list[Cell | None]):
|
|
40
42
|
# Swallow other swap cells.
|
|
41
43
|
for i in range(len(column)):
|
|
42
44
|
gate = column[i]
|
|
@@ -45,12 +47,12 @@ class SwapCell(Cell):
|
|
|
45
47
|
self._qubits += gate._qubits
|
|
46
48
|
column[i] = None
|
|
47
49
|
|
|
48
|
-
def operations(self) ->
|
|
50
|
+
def operations(self) -> cirq.OP_TREE:
|
|
49
51
|
if len(self._qubits) != 2:
|
|
50
52
|
raise ValueError('Wrong number of swap gates in a column.')
|
|
51
53
|
return ops.SWAP(*self._qubits).controlled_by(*self._controls)
|
|
52
54
|
|
|
53
|
-
def controlled_by(self, qubit:
|
|
55
|
+
def controlled_by(self, qubit: cirq.Qid):
|
|
54
56
|
return SwapCell(self._qubits, self._controls + [qubit])
|
|
55
57
|
|
|
56
58
|
def _value_equality_values_(self) -> Any:
|
|
@@ -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
|
|
@@ -19,7 +21,7 @@ from cirq import quirk_url_to_circuit
|
|
|
19
21
|
from cirq.interop.quirk.cells.testing import assert_url_to_circuit_returns
|
|
20
22
|
|
|
21
23
|
|
|
22
|
-
def test_swap():
|
|
24
|
+
def test_swap() -> None:
|
|
23
25
|
a, b, c = cirq.LineQubit.range(3)
|
|
24
26
|
assert_url_to_circuit_returns('{"cols":[["Swap","Swap"]]}', cirq.Circuit(cirq.SWAP(a, b)))
|
|
25
27
|
assert_url_to_circuit_returns(
|
|
@@ -34,7 +36,7 @@ def test_swap():
|
|
|
34
36
|
)
|
|
35
37
|
|
|
36
38
|
|
|
37
|
-
def test_controlled_swap():
|
|
39
|
+
def test_controlled_swap() -> None:
|
|
38
40
|
a, b, c, d = cirq.LineQubit.range(4)
|
|
39
41
|
assert_url_to_circuit_returns(
|
|
40
42
|
'{"cols":[["Swap","•","Swap"]]}', cirq.Circuit(cirq.SWAP(a, c).controlled_by(b))
|
|
@@ -44,7 +46,7 @@ def test_controlled_swap():
|
|
|
44
46
|
)
|
|
45
47
|
|
|
46
48
|
|
|
47
|
-
def test_with_line_qubits_mapped_to():
|
|
49
|
+
def test_with_line_qubits_mapped_to() -> None:
|
|
48
50
|
a, b, c, d = cirq.LineQubit.range(4)
|
|
49
51
|
a2, b2, c2, d2 = cirq.NamedQubit.range(4, prefix='q')
|
|
50
52
|
cell = cirq.interop.quirk.cells.swap_cell.SwapCell(qubits=[a, b], controls=[c, d])
|
|
@@ -53,7 +55,7 @@ def test_with_line_qubits_mapped_to():
|
|
|
53
55
|
assert cell.with_line_qubits_mapped_to([a2, b2, c2, d2]) == mapped_cell
|
|
54
56
|
|
|
55
57
|
|
|
56
|
-
def test_repr():
|
|
58
|
+
def test_repr() -> None:
|
|
57
59
|
a, b, c, d = cirq.LineQubit.range(4)
|
|
58
60
|
cirq.testing.assert_equivalent_repr(
|
|
59
61
|
cirq.interop.quirk.cells.swap_cell.SwapCell(qubits=[a, b], controls=[c, d])
|
|
@@ -12,7 +12,7 @@
|
|
|
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
16
|
|
|
17
17
|
import numpy as np
|
|
18
18
|
|
|
@@ -22,12 +22,12 @@ from cirq import quirk_url_to_circuit
|
|
|
22
22
|
|
|
23
23
|
def assert_url_to_circuit_returns(
|
|
24
24
|
json_text: str,
|
|
25
|
-
circuit:
|
|
25
|
+
circuit: cirq.Circuit | None = None,
|
|
26
26
|
*,
|
|
27
|
-
unitary:
|
|
28
|
-
diagram:
|
|
29
|
-
output_amplitudes_from_quirk:
|
|
30
|
-
maps:
|
|
27
|
+
unitary: np.ndarray | None = None,
|
|
28
|
+
diagram: str | None = None,
|
|
29
|
+
output_amplitudes_from_quirk: list[dict[str, float]] | None = None,
|
|
30
|
+
maps: dict[int, int] | None = None,
|
|
31
31
|
):
|
|
32
32
|
"""Assert that `quirk_url_to_circuit` functions correctly.
|
|
33
33
|
|
|
@@ -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,7 +21,7 @@ import cirq
|
|
|
19
21
|
from cirq.interop.quirk.cells.testing import assert_url_to_circuit_returns
|
|
20
22
|
|
|
21
23
|
|
|
22
|
-
def test_assert_url_to_circuit_returns_circuit():
|
|
24
|
+
def test_assert_url_to_circuit_returns_circuit() -> None:
|
|
23
25
|
assert_url_to_circuit_returns(
|
|
24
26
|
'{"cols":[["X"]]}', circuit=cirq.Circuit(cirq.X(cirq.LineQubit(0)))
|
|
25
27
|
)
|
|
@@ -30,21 +32,21 @@ def test_assert_url_to_circuit_returns_circuit():
|
|
|
30
32
|
)
|
|
31
33
|
|
|
32
34
|
|
|
33
|
-
def test_assert_url_to_circuit_returns_unitary():
|
|
35
|
+
def test_assert_url_to_circuit_returns_unitary() -> None:
|
|
34
36
|
assert_url_to_circuit_returns('{"cols":[["X"]]}', unitary=cirq.unitary(cirq.X))
|
|
35
37
|
|
|
36
38
|
with pytest.raises(AssertionError, match='Not equal to tolerance'):
|
|
37
39
|
assert_url_to_circuit_returns('{"cols":[["X"]]}', unitary=np.eye(2))
|
|
38
40
|
|
|
39
41
|
|
|
40
|
-
def test_assert_url_to_circuit_returns_diagram():
|
|
42
|
+
def test_assert_url_to_circuit_returns_diagram() -> None:
|
|
41
43
|
assert_url_to_circuit_returns('{"cols":[["X"]]}', diagram='0: ───X───')
|
|
42
44
|
|
|
43
45
|
with pytest.raises(AssertionError, match='text diagram differs'):
|
|
44
46
|
assert_url_to_circuit_returns('{"cols":[["X"]]}', diagram='not even close')
|
|
45
47
|
|
|
46
48
|
|
|
47
|
-
def test_assert_url_to_circuit_returns_maps():
|
|
49
|
+
def test_assert_url_to_circuit_returns_maps() -> None:
|
|
48
50
|
assert_url_to_circuit_returns('{"cols":[["X"]]}', maps={0: 1})
|
|
49
51
|
assert_url_to_circuit_returns('{"cols":[["X"]]}', maps={0: 1, 1: 0})
|
|
50
52
|
|
|
@@ -55,7 +57,7 @@ def test_assert_url_to_circuit_returns_maps():
|
|
|
55
57
|
assert_url_to_circuit_returns('{"cols":[["H"]]}', maps={0: 0})
|
|
56
58
|
|
|
57
59
|
|
|
58
|
-
def test_assert_url_to_circuit_returns_output_amplitudes_from_quirk():
|
|
60
|
+
def test_assert_url_to_circuit_returns_output_amplitudes_from_quirk() -> None:
|
|
59
61
|
assert_url_to_circuit_returns(
|
|
60
62
|
'{"cols":[["X","Z"]]}',
|
|
61
63
|
output_amplitudes_from_quirk=[
|
|
@@ -78,7 +80,7 @@ def test_assert_url_to_circuit_returns_output_amplitudes_from_quirk():
|
|
|
78
80
|
)
|
|
79
81
|
|
|
80
82
|
|
|
81
|
-
def test_assert_url_to_circuit_misc():
|
|
83
|
+
def test_assert_url_to_circuit_misc() -> None:
|
|
82
84
|
a, b = cirq.LineQubit.range(2)
|
|
83
85
|
|
|
84
86
|
assert_url_to_circuit_returns(
|
|
@@ -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 Iterator
|
|
15
18
|
|
|
16
19
|
from cirq.interop.quirk.cells.cell import CELL_SIZES, CellMaker
|
|
@@ -12,12 +12,14 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import pytest
|
|
16
18
|
|
|
17
19
|
from cirq import quirk_url_to_circuit
|
|
18
20
|
|
|
19
21
|
|
|
20
|
-
def test_non_physical_operations():
|
|
22
|
+
def test_non_physical_operations() -> None:
|
|
21
23
|
with pytest.raises(NotImplementedError, match="unphysical operation"):
|
|
22
24
|
_ = quirk_url_to_circuit('https://algassert.com/quirk#circuit={"cols":[["__error__"]]}')
|
|
23
25
|
with pytest.raises(NotImplementedError, match="unphysical operation"):
|
|
@@ -26,7 +28,7 @@ def test_non_physical_operations():
|
|
|
26
28
|
)
|
|
27
29
|
|
|
28
30
|
|
|
29
|
-
def test_not_implemented_gates():
|
|
31
|
+
def test_not_implemented_gates() -> None:
|
|
30
32
|
# This test mostly exists to ensure the gates are tested if added.
|
|
31
33
|
|
|
32
34
|
for k in ["X^⌈t⌉", "X^⌈t-¼⌉", "Counting4", "Uncounting4", ">>t3", "<<t3"]:
|