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,22 +12,12 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import dataclasses
|
|
16
18
|
import functools
|
|
17
19
|
import operator
|
|
18
|
-
from typing import
|
|
19
|
-
Any,
|
|
20
|
-
Callable,
|
|
21
|
-
cast,
|
|
22
|
-
Dict,
|
|
23
|
-
Iterable,
|
|
24
|
-
List,
|
|
25
|
-
Optional,
|
|
26
|
-
Set,
|
|
27
|
-
Tuple,
|
|
28
|
-
TYPE_CHECKING,
|
|
29
|
-
Union,
|
|
30
|
-
)
|
|
20
|
+
from typing import Any, Callable, cast, Iterable, TYPE_CHECKING
|
|
31
21
|
|
|
32
22
|
import numpy as np
|
|
33
23
|
import sympy
|
|
@@ -59,7 +49,7 @@ class Qasm:
|
|
|
59
49
|
self.circuit = c
|
|
60
50
|
|
|
61
51
|
|
|
62
|
-
def _generate_op_qubits(args:
|
|
52
|
+
def _generate_op_qubits(args: list[list[ops.Qid]], lineno: int) -> list[list[ops.Qid]]:
|
|
63
53
|
"""Generates the Cirq qubits for an operation from the OpenQASM qregs.
|
|
64
54
|
|
|
65
55
|
OpenQASM gates can be applied on single qubits and qubit registers.
|
|
@@ -76,7 +66,7 @@ def _generate_op_qubits(args: List[List[ops.Qid]], lineno: int) -> List[List[ops
|
|
|
76
66
|
f"Non matching quantum registers of length {reg_sizes} at line {lineno}"
|
|
77
67
|
)
|
|
78
68
|
op_qubits_gen = functools.reduce(
|
|
79
|
-
cast(Callable[[
|
|
69
|
+
cast(Callable[[list['cirq.Qid'], list['cirq.Qid']], list['cirq.Qid']], np.broadcast), args
|
|
80
70
|
)
|
|
81
71
|
op_qubits = [[q] if isinstance(q, ops.Qid) else q for q in op_qubits_gen]
|
|
82
72
|
if any(len(set(q)) < len(q) for q in op_qubits):
|
|
@@ -96,7 +86,7 @@ class QasmGateStatement:
|
|
|
96
86
|
def __init__(
|
|
97
87
|
self,
|
|
98
88
|
qasm_gate: str,
|
|
99
|
-
cirq_gate:
|
|
89
|
+
cirq_gate: ops.Gate | Callable[[list[float]], ops.Gate],
|
|
100
90
|
num_params: int,
|
|
101
91
|
num_args: int,
|
|
102
92
|
):
|
|
@@ -117,14 +107,14 @@ class QasmGateStatement:
|
|
|
117
107
|
assert num_args >= 1
|
|
118
108
|
self.num_args = num_args
|
|
119
109
|
|
|
120
|
-
def _validate_args(self, args:
|
|
110
|
+
def _validate_args(self, args: list[list[ops.Qid]], lineno: int):
|
|
121
111
|
if len(args) != self.num_args:
|
|
122
112
|
raise QasmException(
|
|
123
113
|
f"{self.qasm_gate} only takes {self.num_args} arg(s) (qubits and/or registers), "
|
|
124
114
|
f"got: {len(args)}, at line {lineno}"
|
|
125
115
|
)
|
|
126
116
|
|
|
127
|
-
def _validate_params(self, params:
|
|
117
|
+
def _validate_params(self, params: list[value.TParamVal], lineno: int):
|
|
128
118
|
if len(params) != self.num_params:
|
|
129
119
|
raise QasmException(
|
|
130
120
|
f"{self.qasm_gate} takes {self.num_params} parameter(s), "
|
|
@@ -132,7 +122,7 @@ class QasmGateStatement:
|
|
|
132
122
|
)
|
|
133
123
|
|
|
134
124
|
def on(
|
|
135
|
-
self, params:
|
|
125
|
+
self, params: list[value.TParamVal], args: list[list[ops.Qid]], lineno: int
|
|
136
126
|
) -> Iterable[ops.Operation]:
|
|
137
127
|
self._validate_args(args, lineno)
|
|
138
128
|
self._validate_params(params, lineno)
|
|
@@ -157,11 +147,11 @@ class CustomGate:
|
|
|
157
147
|
|
|
158
148
|
name: str
|
|
159
149
|
circuit: FrozenCircuit
|
|
160
|
-
params:
|
|
161
|
-
qubits:
|
|
150
|
+
params: tuple[str, ...]
|
|
151
|
+
qubits: tuple[ops.Qid, ...]
|
|
162
152
|
|
|
163
153
|
def on(
|
|
164
|
-
self, params:
|
|
154
|
+
self, params: list[value.TParamVal], args: list[list[ops.Qid]], lineno: int
|
|
165
155
|
) -> Iterable[ops.Operation]:
|
|
166
156
|
if len(params) != len(self.params):
|
|
167
157
|
raise QasmException(f"Wrong number of params for '{self.name}' at line {lineno}")
|
|
@@ -187,25 +177,25 @@ class QasmParser:
|
|
|
187
177
|
def __init__(self) -> None:
|
|
188
178
|
self.parser = yacc.yacc(module=self, debug=False, write_tables=False)
|
|
189
179
|
self.circuit = Circuit()
|
|
190
|
-
self.qregs:
|
|
191
|
-
self.cregs:
|
|
192
|
-
self.gate_set:
|
|
180
|
+
self.qregs: dict[str, int] = {}
|
|
181
|
+
self.cregs: dict[str, int] = {}
|
|
182
|
+
self.gate_set: dict[str, CustomGate | QasmGateStatement] = {**self.basic_gates}
|
|
193
183
|
"""The gates available to use in the circuit, including those from libraries, and
|
|
194
184
|
user-defined ones."""
|
|
195
185
|
self.in_custom_gate_scope = False
|
|
196
186
|
"""This is set to True when the parser is in the middle of parsing a custom gate
|
|
197
187
|
definition."""
|
|
198
|
-
self.custom_gate_scoped_params:
|
|
188
|
+
self.custom_gate_scoped_params: set[str] = set()
|
|
199
189
|
"""The params declared within the current custom gate definition. Empty if not in
|
|
200
190
|
custom gate scope."""
|
|
201
|
-
self.custom_gate_scoped_qubits:
|
|
191
|
+
self.custom_gate_scoped_qubits: dict[str, ops.Qid] = {}
|
|
202
192
|
"""The qubits declared within the current custom gate definition. Empty if not in
|
|
203
193
|
custom gate scope."""
|
|
204
194
|
self.qelibinc = False
|
|
205
195
|
self.lexer = QasmLexer()
|
|
206
196
|
self.supported_format = False
|
|
207
|
-
self.parsedQasm:
|
|
208
|
-
self.qubits:
|
|
197
|
+
self.parsedQasm: Qasm | None = None
|
|
198
|
+
self.qubits: dict[str, ops.Qid] = {}
|
|
209
199
|
self.functions = {
|
|
210
200
|
'sin': np.sin,
|
|
211
201
|
'cos': np.cos,
|
|
@@ -226,7 +216,7 @@ class QasmParser:
|
|
|
226
216
|
'^': operator.pow,
|
|
227
217
|
}
|
|
228
218
|
|
|
229
|
-
basic_gates:
|
|
219
|
+
basic_gates: dict[str, QasmGateStatement] = {
|
|
230
220
|
'CX': QasmGateStatement(qasm_gate='CX', cirq_gate=CX, num_params=0, num_args=2),
|
|
231
221
|
'U': QasmGateStatement(
|
|
232
222
|
qasm_gate='U',
|
|
@@ -238,41 +228,480 @@ class QasmParser:
|
|
|
238
228
|
}
|
|
239
229
|
|
|
240
230
|
qelib_gates = {
|
|
241
|
-
'
|
|
242
|
-
|
|
231
|
+
'ccx': QasmGateStatement(qasm_gate='ccx', num_params=0, num_args=3, cirq_gate=ops.CCX),
|
|
232
|
+
'rccx': QasmGateStatement(
|
|
233
|
+
qasm_gate='rccx',
|
|
234
|
+
num_params=0,
|
|
235
|
+
num_args=3,
|
|
236
|
+
cirq_gate=ops.MatrixGate(
|
|
237
|
+
np.array(
|
|
238
|
+
[
|
|
239
|
+
[
|
|
240
|
+
1.0 + 0.0j,
|
|
241
|
+
0.0 + 0.0j,
|
|
242
|
+
0.0 + 0.0j,
|
|
243
|
+
0.0 + 0.0j,
|
|
244
|
+
0.0 + 0.0j,
|
|
245
|
+
0.0 + 0.0j,
|
|
246
|
+
0.0 + 0.0j,
|
|
247
|
+
0.0 + 0.0j,
|
|
248
|
+
],
|
|
249
|
+
[
|
|
250
|
+
0.0 + 0.0j,
|
|
251
|
+
1.0 + 0.0j,
|
|
252
|
+
0.0 + 0.0j,
|
|
253
|
+
0.0 + 0.0j,
|
|
254
|
+
0.0 + 0.0j,
|
|
255
|
+
0.0 + 0.0j,
|
|
256
|
+
0.0 + 0.0j,
|
|
257
|
+
0.0 + 0.0j,
|
|
258
|
+
],
|
|
259
|
+
[
|
|
260
|
+
0.0 + 0.0j,
|
|
261
|
+
0.0 + 0.0j,
|
|
262
|
+
1.0 + 0.0j,
|
|
263
|
+
0.0 + 0.0j,
|
|
264
|
+
0.0 + 0.0j,
|
|
265
|
+
0.0 + 0.0j,
|
|
266
|
+
0.0 + 0.0j,
|
|
267
|
+
0.0 + 0.0j,
|
|
268
|
+
],
|
|
269
|
+
[
|
|
270
|
+
0.0 + 0.0j,
|
|
271
|
+
0.0 + 0.0j,
|
|
272
|
+
0.0 + 0.0j,
|
|
273
|
+
1.0 + 0.0j,
|
|
274
|
+
0.0 + 0.0j,
|
|
275
|
+
0.0 + 0.0j,
|
|
276
|
+
0.0 + 0.0j,
|
|
277
|
+
0.0 + 0.0j,
|
|
278
|
+
],
|
|
279
|
+
[
|
|
280
|
+
0.0 + 0.0j,
|
|
281
|
+
0.0 + 0.0j,
|
|
282
|
+
0.0 + 0.0j,
|
|
283
|
+
0.0 + 0.0j,
|
|
284
|
+
1.0 + 0.0j,
|
|
285
|
+
0.0 + 0.0j,
|
|
286
|
+
0.0 + 0.0j,
|
|
287
|
+
0.0 + 0.0j,
|
|
288
|
+
],
|
|
289
|
+
[
|
|
290
|
+
0.0 + 0.0j,
|
|
291
|
+
0.0 + 0.0j,
|
|
292
|
+
0.0 + 0.0j,
|
|
293
|
+
0.0 + 0.0j,
|
|
294
|
+
0.0 + 0.0j,
|
|
295
|
+
-1.0 + 0.0j,
|
|
296
|
+
0.0 + 0.0j,
|
|
297
|
+
0.0 + 0.0j,
|
|
298
|
+
],
|
|
299
|
+
[
|
|
300
|
+
0.0 + 0.0j,
|
|
301
|
+
0.0 + 0.0j,
|
|
302
|
+
0.0 + 0.0j,
|
|
303
|
+
0.0 + 0.0j,
|
|
304
|
+
0.0 + 0.0j,
|
|
305
|
+
0.0 + 0.0j,
|
|
306
|
+
0.0 + 0.0j,
|
|
307
|
+
0.0 - 1.0j,
|
|
308
|
+
],
|
|
309
|
+
[
|
|
310
|
+
0.0 + 0.0j,
|
|
311
|
+
0.0 + 0.0j,
|
|
312
|
+
0.0 + 0.0j,
|
|
313
|
+
0.0 + 0.0j,
|
|
314
|
+
0.0 + 0.0j,
|
|
315
|
+
0.0 + 0.0j,
|
|
316
|
+
0.0 + 1.0j,
|
|
317
|
+
0.0 + 0.0j,
|
|
318
|
+
],
|
|
319
|
+
]
|
|
320
|
+
)
|
|
321
|
+
),
|
|
243
322
|
),
|
|
244
|
-
'
|
|
245
|
-
qasm_gate='
|
|
323
|
+
'c3x': QasmGateStatement(
|
|
324
|
+
qasm_gate='c3x',
|
|
325
|
+
num_params=0,
|
|
326
|
+
num_args=4,
|
|
327
|
+
cirq_gate=ops.ControlledGate(sub_gate=ops.X, num_controls=3),
|
|
246
328
|
),
|
|
247
|
-
'
|
|
248
|
-
qasm_gate='
|
|
329
|
+
'rc3x': QasmGateStatement(
|
|
330
|
+
qasm_gate='rc3x',
|
|
331
|
+
num_params=0,
|
|
332
|
+
num_args=4,
|
|
333
|
+
cirq_gate=ops.MatrixGate(
|
|
334
|
+
np.array(
|
|
335
|
+
[
|
|
336
|
+
[
|
|
337
|
+
1.0 + 0.0j,
|
|
338
|
+
0.0 + 0.0j,
|
|
339
|
+
0.0 + 0.0j,
|
|
340
|
+
0.0 + 0.0j,
|
|
341
|
+
0.0 + 0.0j,
|
|
342
|
+
0.0 + 0.0j,
|
|
343
|
+
0.0 + 0.0j,
|
|
344
|
+
0.0 + 0.0j,
|
|
345
|
+
0.0 + 0.0j,
|
|
346
|
+
0.0 + 0.0j,
|
|
347
|
+
0.0 + 0.0j,
|
|
348
|
+
0.0 + 0.0j,
|
|
349
|
+
0.0 + 0.0j,
|
|
350
|
+
0.0 + 0.0j,
|
|
351
|
+
0.0 + 0.0j,
|
|
352
|
+
0.0 + 0.0j,
|
|
353
|
+
],
|
|
354
|
+
[
|
|
355
|
+
0.0 + 0.0j,
|
|
356
|
+
1.0 + 0.0j,
|
|
357
|
+
0.0 + 0.0j,
|
|
358
|
+
0.0 + 0.0j,
|
|
359
|
+
0.0 + 0.0j,
|
|
360
|
+
0.0 + 0.0j,
|
|
361
|
+
0.0 + 0.0j,
|
|
362
|
+
0.0 + 0.0j,
|
|
363
|
+
0.0 + 0.0j,
|
|
364
|
+
0.0 + 0.0j,
|
|
365
|
+
0.0 + 0.0j,
|
|
366
|
+
0.0 + 0.0j,
|
|
367
|
+
0.0 + 0.0j,
|
|
368
|
+
0.0 + 0.0j,
|
|
369
|
+
0.0 + 0.0j,
|
|
370
|
+
0.0 + 0.0j,
|
|
371
|
+
],
|
|
372
|
+
[
|
|
373
|
+
0.0 + 0.0j,
|
|
374
|
+
0.0 + 0.0j,
|
|
375
|
+
1.0 + 0.0j,
|
|
376
|
+
0.0 + 0.0j,
|
|
377
|
+
0.0 + 0.0j,
|
|
378
|
+
0.0 + 0.0j,
|
|
379
|
+
0.0 + 0.0j,
|
|
380
|
+
0.0 + 0.0j,
|
|
381
|
+
0.0 + 0.0j,
|
|
382
|
+
0.0 + 0.0j,
|
|
383
|
+
0.0 + 0.0j,
|
|
384
|
+
0.0 + 0.0j,
|
|
385
|
+
0.0 + 0.0j,
|
|
386
|
+
0.0 + 0.0j,
|
|
387
|
+
0.0 + 0.0j,
|
|
388
|
+
0.0 + 0.0j,
|
|
389
|
+
],
|
|
390
|
+
[
|
|
391
|
+
0.0 + 0.0j,
|
|
392
|
+
0.0 + 0.0j,
|
|
393
|
+
0.0 + 0.0j,
|
|
394
|
+
1.0 + 0.0j,
|
|
395
|
+
0.0 + 0.0j,
|
|
396
|
+
0.0 + 0.0j,
|
|
397
|
+
0.0 + 0.0j,
|
|
398
|
+
0.0 + 0.0j,
|
|
399
|
+
0.0 + 0.0j,
|
|
400
|
+
0.0 + 0.0j,
|
|
401
|
+
0.0 + 0.0j,
|
|
402
|
+
0.0 + 0.0j,
|
|
403
|
+
0.0 + 0.0j,
|
|
404
|
+
0.0 + 0.0j,
|
|
405
|
+
0.0 + 0.0j,
|
|
406
|
+
0.0 + 0.0j,
|
|
407
|
+
],
|
|
408
|
+
[
|
|
409
|
+
0.0 + 0.0j,
|
|
410
|
+
0.0 + 0.0j,
|
|
411
|
+
0.0 + 0.0j,
|
|
412
|
+
0.0 + 0.0j,
|
|
413
|
+
1.0 + 0.0j,
|
|
414
|
+
0.0 + 0.0j,
|
|
415
|
+
0.0 + 0.0j,
|
|
416
|
+
0.0 + 0.0j,
|
|
417
|
+
0.0 + 0.0j,
|
|
418
|
+
0.0 + 0.0j,
|
|
419
|
+
0.0 + 0.0j,
|
|
420
|
+
0.0 + 0.0j,
|
|
421
|
+
0.0 + 0.0j,
|
|
422
|
+
0.0 + 0.0j,
|
|
423
|
+
0.0 + 0.0j,
|
|
424
|
+
0.0 + 0.0j,
|
|
425
|
+
],
|
|
426
|
+
[
|
|
427
|
+
0.0 + 0.0j,
|
|
428
|
+
0.0 + 0.0j,
|
|
429
|
+
0.0 + 0.0j,
|
|
430
|
+
0.0 + 0.0j,
|
|
431
|
+
0.0 + 0.0j,
|
|
432
|
+
1.0 + 0.0j,
|
|
433
|
+
0.0 + 0.0j,
|
|
434
|
+
0.0 + 0.0j,
|
|
435
|
+
0.0 + 0.0j,
|
|
436
|
+
0.0 + 0.0j,
|
|
437
|
+
0.0 + 0.0j,
|
|
438
|
+
0.0 + 0.0j,
|
|
439
|
+
0.0 + 0.0j,
|
|
440
|
+
0.0 + 0.0j,
|
|
441
|
+
0.0 + 0.0j,
|
|
442
|
+
0.0 + 0.0j,
|
|
443
|
+
],
|
|
444
|
+
[
|
|
445
|
+
0.0 + 0.0j,
|
|
446
|
+
0.0 + 0.0j,
|
|
447
|
+
0.0 + 0.0j,
|
|
448
|
+
0.0 + 0.0j,
|
|
449
|
+
0.0 + 0.0j,
|
|
450
|
+
0.0 + 0.0j,
|
|
451
|
+
1.0 + 0.0j,
|
|
452
|
+
0.0 + 0.0j,
|
|
453
|
+
0.0 + 0.0j,
|
|
454
|
+
0.0 + 0.0j,
|
|
455
|
+
0.0 + 0.0j,
|
|
456
|
+
0.0 + 0.0j,
|
|
457
|
+
0.0 + 0.0j,
|
|
458
|
+
0.0 + 0.0j,
|
|
459
|
+
0.0 + 0.0j,
|
|
460
|
+
0.0 + 0.0j,
|
|
461
|
+
],
|
|
462
|
+
[
|
|
463
|
+
0.0 + 0.0j,
|
|
464
|
+
0.0 + 0.0j,
|
|
465
|
+
0.0 + 0.0j,
|
|
466
|
+
0.0 + 0.0j,
|
|
467
|
+
0.0 + 0.0j,
|
|
468
|
+
0.0 + 0.0j,
|
|
469
|
+
0.0 + 0.0j,
|
|
470
|
+
1.0 + 0.0j,
|
|
471
|
+
0.0 + 0.0j,
|
|
472
|
+
0.0 + 0.0j,
|
|
473
|
+
0.0 + 0.0j,
|
|
474
|
+
0.0 + 0.0j,
|
|
475
|
+
0.0 + 0.0j,
|
|
476
|
+
0.0 + 0.0j,
|
|
477
|
+
0.0 + 0.0j,
|
|
478
|
+
0.0 + 0.0j,
|
|
479
|
+
],
|
|
480
|
+
[
|
|
481
|
+
0.0 + 0.0j,
|
|
482
|
+
0.0 + 0.0j,
|
|
483
|
+
0.0 + 0.0j,
|
|
484
|
+
0.0 + 0.0j,
|
|
485
|
+
0.0 + 0.0j,
|
|
486
|
+
0.0 + 0.0j,
|
|
487
|
+
0.0 + 0.0j,
|
|
488
|
+
0.0 + 0.0j,
|
|
489
|
+
1.0 + 0.0j,
|
|
490
|
+
0.0 + 0.0j,
|
|
491
|
+
0.0 + 0.0j,
|
|
492
|
+
0.0 + 0.0j,
|
|
493
|
+
0.0 + 0.0j,
|
|
494
|
+
0.0 + 0.0j,
|
|
495
|
+
0.0 + 0.0j,
|
|
496
|
+
0.0 + 0.0j,
|
|
497
|
+
],
|
|
498
|
+
[
|
|
499
|
+
0.0 + 0.0j,
|
|
500
|
+
0.0 + 0.0j,
|
|
501
|
+
0.0 + 0.0j,
|
|
502
|
+
0.0 + 0.0j,
|
|
503
|
+
0.0 + 0.0j,
|
|
504
|
+
0.0 + 0.0j,
|
|
505
|
+
0.0 + 0.0j,
|
|
506
|
+
0.0 + 0.0j,
|
|
507
|
+
0.0 + 0.0j,
|
|
508
|
+
1.0 + 0.0j,
|
|
509
|
+
0.0 + 0.0j,
|
|
510
|
+
0.0 + 0.0j,
|
|
511
|
+
0.0 + 0.0j,
|
|
512
|
+
0.0 + 0.0j,
|
|
513
|
+
0.0 + 0.0j,
|
|
514
|
+
0.0 + 0.0j,
|
|
515
|
+
],
|
|
516
|
+
[
|
|
517
|
+
0.0 + 0.0j,
|
|
518
|
+
0.0 + 0.0j,
|
|
519
|
+
0.0 + 0.0j,
|
|
520
|
+
0.0 + 0.0j,
|
|
521
|
+
0.0 + 0.0j,
|
|
522
|
+
0.0 + 0.0j,
|
|
523
|
+
0.0 + 0.0j,
|
|
524
|
+
0.0 + 0.0j,
|
|
525
|
+
0.0 + 0.0j,
|
|
526
|
+
0.0 + 0.0j,
|
|
527
|
+
1.0 + 0.0j,
|
|
528
|
+
0.0 + 0.0j,
|
|
529
|
+
0.0 + 0.0j,
|
|
530
|
+
0.0 + 0.0j,
|
|
531
|
+
0.0 + 0.0j,
|
|
532
|
+
0.0 + 0.0j,
|
|
533
|
+
],
|
|
534
|
+
[
|
|
535
|
+
0.0 + 0.0j,
|
|
536
|
+
0.0 + 0.0j,
|
|
537
|
+
0.0 + 0.0j,
|
|
538
|
+
0.0 + 0.0j,
|
|
539
|
+
0.0 + 0.0j,
|
|
540
|
+
0.0 + 0.0j,
|
|
541
|
+
0.0 + 0.0j,
|
|
542
|
+
0.0 + 0.0j,
|
|
543
|
+
0.0 + 0.0j,
|
|
544
|
+
0.0 + 0.0j,
|
|
545
|
+
0.0 + 0.0j,
|
|
546
|
+
1.0 + 0.0j,
|
|
547
|
+
0.0 + 0.0j,
|
|
548
|
+
0.0 + 0.0j,
|
|
549
|
+
0.0 + 0.0j,
|
|
550
|
+
0.0 + 0.0j,
|
|
551
|
+
],
|
|
552
|
+
[
|
|
553
|
+
0.0 + 0.0j,
|
|
554
|
+
0.0 + 0.0j,
|
|
555
|
+
0.0 + 0.0j,
|
|
556
|
+
0.0 + 0.0j,
|
|
557
|
+
0.0 + 0.0j,
|
|
558
|
+
0.0 + 0.0j,
|
|
559
|
+
0.0 + 0.0j,
|
|
560
|
+
0.0 + 0.0j,
|
|
561
|
+
0.0 + 0.0j,
|
|
562
|
+
0.0 + 0.0j,
|
|
563
|
+
0.0 + 0.0j,
|
|
564
|
+
0.0 + 0.0j,
|
|
565
|
+
0.0 + 1.0j,
|
|
566
|
+
0.0 + 0.0j,
|
|
567
|
+
0.0 + 0.0j,
|
|
568
|
+
0.0 + 0.0j,
|
|
569
|
+
],
|
|
570
|
+
[
|
|
571
|
+
0.0 + 0.0j,
|
|
572
|
+
0.0 + 0.0j,
|
|
573
|
+
0.0 + 0.0j,
|
|
574
|
+
0.0 + 0.0j,
|
|
575
|
+
0.0 + 0.0j,
|
|
576
|
+
0.0 + 0.0j,
|
|
577
|
+
0.0 + 0.0j,
|
|
578
|
+
0.0 + 0.0j,
|
|
579
|
+
0.0 + 0.0j,
|
|
580
|
+
0.0 + 0.0j,
|
|
581
|
+
0.0 + 0.0j,
|
|
582
|
+
0.0 + 0.0j,
|
|
583
|
+
0.0 + 0.0j,
|
|
584
|
+
0.0 - 1.0j,
|
|
585
|
+
0.0 + 0.0j,
|
|
586
|
+
0.0 + 0.0j,
|
|
587
|
+
],
|
|
588
|
+
[
|
|
589
|
+
0.0 + 0.0j,
|
|
590
|
+
0.0 + 0.0j,
|
|
591
|
+
0.0 + 0.0j,
|
|
592
|
+
0.0 + 0.0j,
|
|
593
|
+
0.0 + 0.0j,
|
|
594
|
+
0.0 + 0.0j,
|
|
595
|
+
0.0 + 0.0j,
|
|
596
|
+
0.0 + 0.0j,
|
|
597
|
+
0.0 + 0.0j,
|
|
598
|
+
0.0 + 0.0j,
|
|
599
|
+
0.0 + 0.0j,
|
|
600
|
+
0.0 + 0.0j,
|
|
601
|
+
0.0 + 0.0j,
|
|
602
|
+
0.0 + 0.0j,
|
|
603
|
+
0.0 + 0.0j,
|
|
604
|
+
1.0 + 0.0j,
|
|
605
|
+
],
|
|
606
|
+
[
|
|
607
|
+
0.0 + 0.0j,
|
|
608
|
+
0.0 + 0.0j,
|
|
609
|
+
0.0 + 0.0j,
|
|
610
|
+
0.0 + 0.0j,
|
|
611
|
+
0.0 + 0.0j,
|
|
612
|
+
0.0 + 0.0j,
|
|
613
|
+
0.0 + 0.0j,
|
|
614
|
+
0.0 + 0.0j,
|
|
615
|
+
0.0 + 0.0j,
|
|
616
|
+
0.0 + 0.0j,
|
|
617
|
+
0.0 + 0.0j,
|
|
618
|
+
0.0 + 0.0j,
|
|
619
|
+
0.0 + 0.0j,
|
|
620
|
+
0.0 + 0.0j,
|
|
621
|
+
-1.0 + 0.0j,
|
|
622
|
+
0.0 + 0.0j,
|
|
623
|
+
],
|
|
624
|
+
]
|
|
625
|
+
)
|
|
626
|
+
),
|
|
249
627
|
),
|
|
250
|
-
'
|
|
251
|
-
qasm_gate='
|
|
628
|
+
'c4x': QasmGateStatement(
|
|
629
|
+
qasm_gate='c4x',
|
|
630
|
+
num_params=0,
|
|
631
|
+
num_args=5,
|
|
632
|
+
cirq_gate=ops.ControlledGate(sub_gate=ops.X, num_controls=4),
|
|
252
633
|
),
|
|
253
|
-
'
|
|
254
|
-
qasm_gate='
|
|
634
|
+
'ch': QasmGateStatement(
|
|
635
|
+
qasm_gate='ch', cirq_gate=ops.ControlledGate(ops.H), num_params=0, num_args=2
|
|
255
636
|
),
|
|
256
|
-
'
|
|
257
|
-
qasm_gate='
|
|
637
|
+
'crx': QasmGateStatement(
|
|
638
|
+
qasm_gate='crx',
|
|
639
|
+
num_params=1,
|
|
640
|
+
num_args=2,
|
|
641
|
+
cirq_gate=(lambda params: ops.ControlledGate(ops.rx(params[0]))),
|
|
258
642
|
),
|
|
259
|
-
'
|
|
260
|
-
qasm_gate='
|
|
261
|
-
cirq_gate=(lambda params: QasmUGate(0, 0, params[0] / np.pi)),
|
|
643
|
+
'cry': QasmGateStatement(
|
|
644
|
+
qasm_gate='cry',
|
|
262
645
|
num_params=1,
|
|
263
|
-
num_args=
|
|
646
|
+
num_args=2,
|
|
647
|
+
cirq_gate=(lambda params: ops.ControlledGate(ops.ry(params[0]))),
|
|
264
648
|
),
|
|
265
|
-
'
|
|
266
|
-
qasm_gate='
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
649
|
+
'crz': QasmGateStatement(
|
|
650
|
+
qasm_gate='crz',
|
|
651
|
+
num_params=1,
|
|
652
|
+
num_args=2,
|
|
653
|
+
cirq_gate=(lambda params: ops.ControlledGate(ops.rz(params[0]))),
|
|
270
654
|
),
|
|
271
|
-
'
|
|
272
|
-
qasm_gate='
|
|
655
|
+
'cp': QasmGateStatement(
|
|
656
|
+
qasm_gate='cp',
|
|
657
|
+
num_params=1,
|
|
658
|
+
num_args=2,
|
|
659
|
+
cirq_gate=(lambda params: ops.ControlledGate(ops.ZPowGate(exponent=params[0] / np.pi))),
|
|
660
|
+
),
|
|
661
|
+
'cswap': QasmGateStatement(
|
|
662
|
+
qasm_gate='cswap', num_params=0, num_args=3, cirq_gate=ops.CSWAP
|
|
663
|
+
),
|
|
664
|
+
'cu1': QasmGateStatement(
|
|
665
|
+
qasm_gate='cu1',
|
|
666
|
+
num_params=1,
|
|
667
|
+
num_args=2,
|
|
668
|
+
cirq_gate=(lambda params: ops.ControlledGate(QasmUGate(0, 0, params[0] / np.pi))),
|
|
669
|
+
),
|
|
670
|
+
'cu3': QasmGateStatement(
|
|
671
|
+
qasm_gate='cu3',
|
|
273
672
|
num_params=3,
|
|
274
|
-
num_args=
|
|
275
|
-
cirq_gate=(lambda params: QasmUGate(*[p / np.pi for p in params])),
|
|
673
|
+
num_args=2,
|
|
674
|
+
cirq_gate=(lambda params: ops.ControlledGate(QasmUGate(*[p / np.pi for p in params]))),
|
|
675
|
+
),
|
|
676
|
+
'cu': QasmGateStatement(
|
|
677
|
+
qasm_gate='cu',
|
|
678
|
+
num_params=3,
|
|
679
|
+
num_args=2,
|
|
680
|
+
cirq_gate=(lambda params: ops.ControlledGate(QasmUGate(*[p / np.pi for p in params]))),
|
|
681
|
+
),
|
|
682
|
+
'csx': QasmGateStatement(
|
|
683
|
+
qasm_gate='csx',
|
|
684
|
+
num_params=0,
|
|
685
|
+
num_args=2,
|
|
686
|
+
cirq_gate=ops.ControlledGate(ops.XPowGate(exponent=0.5)),
|
|
687
|
+
),
|
|
688
|
+
'c3sqrtx': QasmGateStatement(
|
|
689
|
+
qasm_gate='c3sqrtx',
|
|
690
|
+
num_params=0,
|
|
691
|
+
num_args=4,
|
|
692
|
+
cirq_gate=ops.ControlledGate(ops.XPowGate(exponent=0.5), num_controls=3),
|
|
693
|
+
),
|
|
694
|
+
'cx': QasmGateStatement(qasm_gate='cx', cirq_gate=CX, num_params=0, num_args=2),
|
|
695
|
+
'cy': QasmGateStatement(
|
|
696
|
+
qasm_gate='cy', cirq_gate=ops.ControlledGate(ops.Y), num_params=0, num_args=2
|
|
697
|
+
),
|
|
698
|
+
'cz': QasmGateStatement(qasm_gate='cz', cirq_gate=ops.CZ, num_params=0, num_args=2),
|
|
699
|
+
'h': QasmGateStatement(qasm_gate='h', num_params=0, num_args=1, cirq_gate=ops.H),
|
|
700
|
+
'id': QasmGateStatement(
|
|
701
|
+
qasm_gate='id', cirq_gate=ops.IdentityGate(1), num_params=0, num_args=1
|
|
702
|
+
),
|
|
703
|
+
'iswap': QasmGateStatement(
|
|
704
|
+
qasm_gate='iswap', cirq_gate=ops.ISwapPowGate(), num_params=0, num_args=2
|
|
276
705
|
),
|
|
277
706
|
'r': QasmGateStatement(
|
|
278
707
|
qasm_gate='r',
|
|
@@ -284,45 +713,80 @@ class QasmParser:
|
|
|
284
713
|
)
|
|
285
714
|
),
|
|
286
715
|
),
|
|
287
|
-
'
|
|
288
|
-
|
|
289
|
-
'z': QasmGateStatement(qasm_gate='z', num_params=0, num_args=1, cirq_gate=ops.Z),
|
|
290
|
-
'h': QasmGateStatement(qasm_gate='h', num_params=0, num_args=1, cirq_gate=ops.H),
|
|
291
|
-
's': QasmGateStatement(qasm_gate='s', num_params=0, num_args=1, cirq_gate=ops.S),
|
|
292
|
-
't': QasmGateStatement(qasm_gate='t', num_params=0, num_args=1, cirq_gate=ops.T),
|
|
293
|
-
'cx': QasmGateStatement(qasm_gate='cx', cirq_gate=CX, num_params=0, num_args=2),
|
|
294
|
-
'cy': QasmGateStatement(
|
|
295
|
-
qasm_gate='cy', cirq_gate=ops.ControlledGate(ops.Y), num_params=0, num_args=2
|
|
716
|
+
'rx': QasmGateStatement(
|
|
717
|
+
qasm_gate='rx', cirq_gate=(lambda params: ops.rx(params[0])), num_params=1, num_args=1
|
|
296
718
|
),
|
|
297
|
-
'
|
|
298
|
-
|
|
299
|
-
qasm_gate='ch', cirq_gate=ops.ControlledGate(ops.H), num_params=0, num_args=2
|
|
719
|
+
'ry': QasmGateStatement(
|
|
720
|
+
qasm_gate='ry', cirq_gate=(lambda params: ops.ry(params[0])), num_params=1, num_args=1
|
|
300
721
|
),
|
|
301
|
-
'
|
|
302
|
-
qasm_gate='
|
|
722
|
+
'rz': QasmGateStatement(
|
|
723
|
+
qasm_gate='rz', cirq_gate=(lambda params: ops.rz(params[0])), num_params=1, num_args=1
|
|
724
|
+
),
|
|
725
|
+
'rxx': QasmGateStatement(
|
|
726
|
+
qasm_gate='rxx',
|
|
303
727
|
num_params=1,
|
|
304
728
|
num_args=2,
|
|
305
|
-
cirq_gate=(lambda params: ops.
|
|
729
|
+
cirq_gate=(lambda params: ops.XXPowGate(exponent=params[0] / np.pi)),
|
|
306
730
|
),
|
|
307
|
-
'
|
|
308
|
-
qasm_gate='
|
|
309
|
-
num_params=
|
|
731
|
+
'ryy': QasmGateStatement(
|
|
732
|
+
qasm_gate='ryy',
|
|
733
|
+
num_params=1,
|
|
310
734
|
num_args=2,
|
|
311
|
-
cirq_gate=(lambda params: ops.
|
|
735
|
+
cirq_gate=(lambda params: ops.YYPowGate(exponent=params[0] / np.pi)),
|
|
312
736
|
),
|
|
313
|
-
'
|
|
314
|
-
qasm_gate='
|
|
737
|
+
'rzz': QasmGateStatement(
|
|
738
|
+
qasm_gate='rzz',
|
|
315
739
|
num_params=1,
|
|
316
740
|
num_args=2,
|
|
317
|
-
cirq_gate=(lambda params: ops.
|
|
741
|
+
cirq_gate=(lambda params: ops.ZZPowGate(exponent=params[0] / np.pi)),
|
|
318
742
|
),
|
|
743
|
+
's': QasmGateStatement(qasm_gate='s', num_params=0, num_args=1, cirq_gate=ops.S),
|
|
744
|
+
'sdg': QasmGateStatement(qasm_gate='sdg', num_params=0, num_args=1, cirq_gate=ops.S**-1),
|
|
319
745
|
'swap': QasmGateStatement(qasm_gate='swap', cirq_gate=ops.SWAP, num_params=0, num_args=2),
|
|
320
|
-
'
|
|
321
|
-
qasm_gate='
|
|
746
|
+
'sx': QasmGateStatement(
|
|
747
|
+
qasm_gate='sx', num_params=0, num_args=1, cirq_gate=ops.XPowGate(exponent=0.5)
|
|
322
748
|
),
|
|
323
|
-
'
|
|
324
|
-
|
|
749
|
+
'sxdg': QasmGateStatement(
|
|
750
|
+
qasm_gate='sxdg', num_params=0, num_args=1, cirq_gate=ops.XPowGate(exponent=-0.5)
|
|
751
|
+
),
|
|
752
|
+
't': QasmGateStatement(qasm_gate='t', num_params=0, num_args=1, cirq_gate=ops.T),
|
|
325
753
|
'tdg': QasmGateStatement(qasm_gate='tdg', num_params=0, num_args=1, cirq_gate=ops.T**-1),
|
|
754
|
+
'u0': QasmGateStatement(
|
|
755
|
+
qasm_gate='u0', cirq_gate=(lambda _: ops.I), num_params=1, num_args=1
|
|
756
|
+
),
|
|
757
|
+
'u1': QasmGateStatement(
|
|
758
|
+
qasm_gate='u1',
|
|
759
|
+
cirq_gate=(lambda params: QasmUGate(0, 0, params[0] / np.pi)),
|
|
760
|
+
num_params=1,
|
|
761
|
+
num_args=1,
|
|
762
|
+
),
|
|
763
|
+
'p': QasmGateStatement(
|
|
764
|
+
qasm_gate='p',
|
|
765
|
+
cirq_gate=(lambda params: ops.ZPowGate(exponent=params[0] / np.pi)),
|
|
766
|
+
num_params=1,
|
|
767
|
+
num_args=1,
|
|
768
|
+
),
|
|
769
|
+
'u2': QasmGateStatement(
|
|
770
|
+
qasm_gate='u2',
|
|
771
|
+
cirq_gate=(lambda params: QasmUGate(0.5, params[0] / np.pi, params[1] / np.pi)),
|
|
772
|
+
num_params=2,
|
|
773
|
+
num_args=1,
|
|
774
|
+
),
|
|
775
|
+
'u3': QasmGateStatement(
|
|
776
|
+
qasm_gate='u3',
|
|
777
|
+
num_params=3,
|
|
778
|
+
num_args=1,
|
|
779
|
+
cirq_gate=(lambda params: QasmUGate(*[p / np.pi for p in params])),
|
|
780
|
+
),
|
|
781
|
+
'u': QasmGateStatement(
|
|
782
|
+
qasm_gate='u',
|
|
783
|
+
num_params=3,
|
|
784
|
+
num_args=1,
|
|
785
|
+
cirq_gate=(lambda params: QasmUGate(*[p / np.pi for p in params])),
|
|
786
|
+
),
|
|
787
|
+
'x': QasmGateStatement(qasm_gate='x', num_params=0, num_args=1, cirq_gate=ops.X),
|
|
788
|
+
'y': QasmGateStatement(qasm_gate='y', num_params=0, num_args=1, cirq_gate=ops.Y),
|
|
789
|
+
'z': QasmGateStatement(qasm_gate='z', num_params=0, num_args=1, cirq_gate=ops.Z),
|
|
326
790
|
}
|
|
327
791
|
|
|
328
792
|
tokens = QasmLexer.tokens
|
|
@@ -441,7 +905,7 @@ class QasmParser:
|
|
|
441
905
|
self._resolve_gate_operation(args=p[5], gate=p[1], p=p, params=p[3])
|
|
442
906
|
|
|
443
907
|
def _resolve_gate_operation(
|
|
444
|
-
self, args:
|
|
908
|
+
self, args: list[list[ops.Qid]], gate: str, p: Any, params: list[value.TParamVal]
|
|
445
909
|
):
|
|
446
910
|
if gate not in self.gate_set:
|
|
447
911
|
tip = ", did you forget to include qelib1.inc?" if not self.qelibinc else ""
|
|
@@ -691,7 +1155,7 @@ class QasmParser:
|
|
|
691
1155
|
"""gate_def : GATE ID gate_qubits '{' gate_ops '}'"""
|
|
692
1156
|
self._gate_def(p, has_params=False)
|
|
693
1157
|
|
|
694
|
-
def _gate_def(self, p:
|
|
1158
|
+
def _gate_def(self, p: list[Any], *, has_params: bool):
|
|
695
1159
|
name = p[2]
|
|
696
1160
|
gate_params = tuple(p[4]) if has_params else ()
|
|
697
1161
|
offset = 3 if has_params else 0
|