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
cirq/contrib/qasm_import/qasm.py
CHANGED
|
@@ -12,11 +12,17 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import TYPE_CHECKING
|
|
18
|
+
|
|
16
19
|
from cirq.contrib.qasm_import._parser import QasmParser
|
|
17
20
|
|
|
21
|
+
if TYPE_CHECKING:
|
|
22
|
+
import cirq
|
|
23
|
+
|
|
18
24
|
|
|
19
|
-
def circuit_from_qasm(qasm: str) ->
|
|
25
|
+
def circuit_from_qasm(qasm: str) -> cirq.Circuit:
|
|
20
26
|
"""Parses an OpenQASM string to `cirq.Circuit`.
|
|
21
27
|
|
|
22
28
|
Args:
|
|
@@ -11,6 +11,9 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
14
17
|
import numpy as np
|
|
15
18
|
|
|
16
19
|
import cirq
|
|
@@ -19,7 +22,7 @@ from cirq.contrib.qasm_import import circuit_from_qasm
|
|
|
19
22
|
from cirq.testing import consistent_qasm as cq
|
|
20
23
|
|
|
21
24
|
|
|
22
|
-
def test_consistency_with_qasm_output_and_qiskit():
|
|
25
|
+
def test_consistency_with_qasm_output_and_qiskit() -> None:
|
|
23
26
|
qubits = [cirq.NamedQubit(f'q_{i}') for i in range(4)]
|
|
24
27
|
a, b, c, d = qubits
|
|
25
28
|
circuit1 = cirq.Circuit(
|
|
@@ -32,9 +35,9 @@ def test_consistency_with_qasm_output_and_qiskit():
|
|
|
32
35
|
cirq.H.on(d),
|
|
33
36
|
cirq.S.on(a),
|
|
34
37
|
cirq.T.on(b),
|
|
35
|
-
cirq.S.on(c)
|
|
36
|
-
cirq.T.on(d)
|
|
37
|
-
cirq.X.on(d)
|
|
38
|
+
(cirq.S**-1).on(c),
|
|
39
|
+
(cirq.T**-1).on(d),
|
|
40
|
+
(cirq.X**0.125).on(d),
|
|
38
41
|
cirq.TOFFOLI.on(a, b, c),
|
|
39
42
|
cirq.CSWAP.on(d, a, b),
|
|
40
43
|
cirq.SWAP.on(c, d),
|
|
@@ -12,12 +12,12 @@
|
|
|
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
|
from cirq import ops, protocols
|
|
18
18
|
|
|
19
19
|
|
|
20
|
-
def escape_text_for_latex(text):
|
|
20
|
+
def escape_text_for_latex(text: str) -> str:
|
|
21
21
|
escaped = (
|
|
22
22
|
text.replace('\\', r'\textbackslash{}')
|
|
23
23
|
.replace('{', r'\{')
|
|
@@ -33,7 +33,7 @@ def escape_text_for_latex(text):
|
|
|
33
33
|
return r'\text{' + escaped + '}'
|
|
34
34
|
|
|
35
35
|
|
|
36
|
-
def get_multigate_parameters(args: protocols.CircuitDiagramInfoArgs) ->
|
|
36
|
+
def get_multigate_parameters(args: protocols.CircuitDiagramInfoArgs) -> tuple[int, int] | None:
|
|
37
37
|
if (args.label_map is None) or (args.known_qubits is None):
|
|
38
38
|
return None
|
|
39
39
|
|
|
@@ -45,7 +45,7 @@ def get_multigate_parameters(args: protocols.CircuitDiagramInfoArgs) -> Optional
|
|
|
45
45
|
return min_index, n_qubits
|
|
46
46
|
|
|
47
47
|
|
|
48
|
-
def hardcoded_qcircuit_diagram_info(op: ops.Operation) ->
|
|
48
|
+
def hardcoded_qcircuit_diagram_info(op: ops.Operation) -> protocols.CircuitDiagramInfo | None:
|
|
49
49
|
if not isinstance(op, ops.GateOperation):
|
|
50
50
|
return None
|
|
51
51
|
symbols = (
|
|
@@ -76,7 +76,7 @@ def convert_text_diagram_info_to_qcircuit_diagram_info(
|
|
|
76
76
|
|
|
77
77
|
def multigate_qcircuit_diagram_info(
|
|
78
78
|
op: ops.Operation, args: protocols.CircuitDiagramInfoArgs
|
|
79
|
-
) ->
|
|
79
|
+
) -> protocols.CircuitDiagramInfo | None:
|
|
80
80
|
if not (
|
|
81
81
|
isinstance(op, ops.GateOperation) and isinstance(op.gate, ops.InterchangeableQubitsGate)
|
|
82
82
|
):
|
|
@@ -12,11 +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
|
import cirq.contrib.qcircuit as ccq
|
|
17
19
|
|
|
18
20
|
|
|
19
|
-
def test_get_qcircuit_diagram_info():
|
|
21
|
+
def test_get_qcircuit_diagram_info() -> None:
|
|
22
|
+
qubit_map: dict[cirq.LabelEntity, int]
|
|
20
23
|
qubits = cirq.NamedQubit('x'), cirq.NamedQubit('y')
|
|
21
24
|
|
|
22
25
|
gate = cirq.SwapPowGate(exponent=0.5)
|
|
@@ -12,24 +12,28 @@
|
|
|
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
|
|
15
16
|
|
|
16
17
|
import errno
|
|
17
18
|
import os
|
|
19
|
+
from typing import TYPE_CHECKING
|
|
18
20
|
|
|
19
21
|
from pylatex import Document, NoEscape, Package
|
|
20
22
|
|
|
21
|
-
from cirq import circuits
|
|
22
23
|
from cirq.contrib.qcircuit.qcircuit_diagram import circuit_to_latex_using_qcircuit
|
|
23
24
|
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
import cirq
|
|
27
|
+
|
|
24
28
|
|
|
25
29
|
def circuit_to_pdf_using_qcircuit_via_tex(
|
|
26
|
-
circuit:
|
|
30
|
+
circuit: cirq.Circuit,
|
|
27
31
|
filepath: str,
|
|
28
32
|
pdf_kwargs=None,
|
|
29
33
|
qcircuit_kwargs=None,
|
|
30
34
|
clean_ext=('dvi', 'ps'),
|
|
31
35
|
documentclass='article',
|
|
32
|
-
):
|
|
36
|
+
) -> None:
|
|
33
37
|
"""Compiles the QCircuit-based latex diagram of the given circuit.
|
|
34
38
|
|
|
35
39
|
Args:
|
|
@@ -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
|
from unittest import mock
|
|
16
18
|
|
|
17
19
|
import pylatex
|
|
@@ -21,7 +23,7 @@ import cirq.contrib.qcircuit.qcircuit_pdf as qcircuit_pdf
|
|
|
21
23
|
|
|
22
24
|
|
|
23
25
|
@mock.patch.object(pylatex.Document, "generate_pdf")
|
|
24
|
-
def test_qcircuit_pdf(mock_generate_pdf):
|
|
26
|
+
def test_qcircuit_pdf(mock_generate_pdf) -> None:
|
|
25
27
|
circuit = cirq.Circuit(cirq.X(cirq.q(0)), cirq.CZ(cirq.q(0), cirq.q(1)))
|
|
26
28
|
qcircuit_pdf.circuit_to_pdf_using_qcircuit_via_tex(circuit, "/tmp/test_file")
|
|
27
29
|
mock_generate_pdf.assert_called_once_with(
|
|
@@ -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 cirq
|
|
16
18
|
import cirq.contrib.qcircuit as ccq
|
|
17
19
|
import cirq.testing as ct
|
|
@@ -43,7 +45,7 @@ def assert_has_qcircuit_diagram(actual: cirq.Circuit, desired: str, **kwargs) ->
|
|
|
43
45
|
)
|
|
44
46
|
|
|
45
47
|
|
|
46
|
-
def test_fallback_diagram():
|
|
48
|
+
def test_fallback_diagram() -> None:
|
|
47
49
|
class MagicGate(cirq.testing.ThreeQubitGate):
|
|
48
50
|
def __str__(self):
|
|
49
51
|
return 'MagicGate'
|
|
@@ -77,7 +79,7 @@ def test_fallback_diagram():
|
|
|
77
79
|
assert_has_qcircuit_diagram(circuit, expected_diagram)
|
|
78
80
|
|
|
79
81
|
|
|
80
|
-
def test_teleportation_diagram():
|
|
82
|
+
def test_teleportation_diagram() -> None:
|
|
81
83
|
ali = cirq.NamedQubit('alice')
|
|
82
84
|
car = cirq.NamedQubit('carrier')
|
|
83
85
|
bob = cirq.NamedQubit('bob')
|
|
@@ -100,13 +102,13 @@ def test_teleportation_diagram():
|
|
|
100
102
|
&\lstick{\text{carrier}}& \qw&\gate{\text{H}} \qw&\control \qw &\targ \qw\qwx&\meter \qw&\control \qw & \qw\qwx&\qw\\
|
|
101
103
|
&\lstick{\text{bob}}& \qw& \qw&\targ \qw\qwx& \qw & \qw&\targ \qw\qwx&\control \qw\qwx&\qw\\
|
|
102
104
|
\\
|
|
103
|
-
}""".strip()
|
|
105
|
+
}""".strip() # noqa: E501
|
|
104
106
|
assert_has_qcircuit_diagram(
|
|
105
107
|
circuit, expected_diagram, qubit_order=cirq.QubitOrder.explicit([ali, car, bob])
|
|
106
108
|
)
|
|
107
109
|
|
|
108
110
|
|
|
109
|
-
def test_other_diagram():
|
|
111
|
+
def test_other_diagram() -> None:
|
|
110
112
|
a, b, c = cirq.LineQubit.range(3)
|
|
111
113
|
|
|
112
114
|
circuit = cirq.Circuit(cirq.X(a), cirq.Y(b), cirq.Z(c))
|
|
@@ -122,7 +124,7 @@ def test_other_diagram():
|
|
|
122
124
|
assert_has_qcircuit_diagram(circuit, expected_diagram)
|
|
123
125
|
|
|
124
126
|
|
|
125
|
-
def test_qcircuit_qubit_namer():
|
|
127
|
+
def test_qcircuit_qubit_namer() -> None:
|
|
126
128
|
from cirq.contrib.qcircuit import qcircuit_diagram
|
|
127
129
|
|
|
128
130
|
assert qcircuit_diagram.qcircuit_qubit_namer(cirq.NamedQubit('q')) == r'\lstick{\text{q}}&'
|
|
@@ -137,7 +139,7 @@ def test_qcircuit_qubit_namer():
|
|
|
137
139
|
)
|
|
138
140
|
|
|
139
141
|
|
|
140
|
-
def test_two_cx_diagram():
|
|
142
|
+
def test_two_cx_diagram() -> None:
|
|
141
143
|
# test for no moment indication
|
|
142
144
|
q0, q1, q2, q3 = cirq.LineQubit.range(4)
|
|
143
145
|
circuit = cirq.Circuit(cirq.CX(q0, q2), cirq.CX(q1, q3), cirq.CX(q0, q2), cirq.CX(q1, q3))
|
|
@@ -149,11 +151,11 @@ def test_two_cx_diagram():
|
|
|
149
151
|
&\lstick{\text{q(2)}}& \qw&\targ \qw\qwx& \qw\qwx&\targ \qw\qwx& \qw\qwx&\qw\\
|
|
150
152
|
&\lstick{\text{q(3)}}& \qw& \qw &\targ \qw\qwx& \qw &\targ \qw\qwx&\qw\\
|
|
151
153
|
\\
|
|
152
|
-
}""".strip()
|
|
154
|
+
}""".strip() # noqa: E501
|
|
153
155
|
assert_has_qcircuit_diagram(circuit, expected_diagram)
|
|
154
156
|
|
|
155
157
|
|
|
156
|
-
def test_sqrt_iswap_diagram():
|
|
158
|
+
def test_sqrt_iswap_diagram() -> None:
|
|
157
159
|
# test for proper rendering of ISWAP^{0.5}
|
|
158
160
|
q0, q1 = cirq.LineQubit.range(2)
|
|
159
161
|
circuit = cirq.Circuit(cirq.ISWAP(q0, q1) ** 0.5)
|
|
@@ -3,16 +3,20 @@
|
|
|
3
3
|
https://arxiv.org/abs/1811.12926.
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
6
8
|
from dataclasses import dataclass
|
|
7
|
-
from typing import Callable,
|
|
9
|
+
from typing import Callable, TYPE_CHECKING
|
|
8
10
|
|
|
9
|
-
import networkx as nx
|
|
10
11
|
import numpy as np
|
|
11
|
-
import pandas as pd
|
|
12
12
|
|
|
13
13
|
import cirq
|
|
14
14
|
import cirq.contrib.routing as ccr
|
|
15
15
|
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
import networkx as nx
|
|
18
|
+
import pandas as pd
|
|
19
|
+
|
|
16
20
|
|
|
17
21
|
def generate_model_circuit(
|
|
18
22
|
num_qubits: int, depth: int, *, random_state: cirq.RANDOM_STATE_OR_SEED_LIKE = None
|
|
@@ -60,7 +64,7 @@ def generate_model_circuit(
|
|
|
60
64
|
return circuit
|
|
61
65
|
|
|
62
66
|
|
|
63
|
-
def compute_heavy_set(circuit: cirq.Circuit) ->
|
|
67
|
+
def compute_heavy_set(circuit: cirq.Circuit) -> list[int]:
|
|
64
68
|
"""Classically compute the heavy set of the given circuit.
|
|
65
69
|
|
|
66
70
|
The heavy set is defined as the output bit-strings that have a greater than
|
|
@@ -92,13 +96,13 @@ def compute_heavy_set(circuit: cirq.Circuit) -> List[int]:
|
|
|
92
96
|
@dataclass
|
|
93
97
|
class CompilationResult:
|
|
94
98
|
circuit: cirq.Circuit
|
|
95
|
-
mapping:
|
|
96
|
-
parity_map:
|
|
99
|
+
mapping: dict[cirq.Qid, cirq.Qid]
|
|
100
|
+
parity_map: dict[cirq.Qid, cirq.Qid]
|
|
97
101
|
|
|
98
102
|
|
|
99
103
|
def sample_heavy_set(
|
|
100
104
|
compilation_result: CompilationResult,
|
|
101
|
-
heavy_set:
|
|
105
|
+
heavy_set: list[int],
|
|
102
106
|
*,
|
|
103
107
|
repetitions=10_000,
|
|
104
108
|
sampler: cirq.Sampler = cirq.Simulator(),
|
|
@@ -123,7 +127,7 @@ def sample_heavy_set(
|
|
|
123
127
|
# Add measure gates to the end of (a copy of) the circuit. Ensure that those
|
|
124
128
|
# gates measure those in the given mapping, preserving this order.
|
|
125
129
|
qubits = circuit.all_qubits()
|
|
126
|
-
key = None
|
|
130
|
+
key: Callable[[cirq.Qid], cirq.Qid] | None = None
|
|
127
131
|
if mapping:
|
|
128
132
|
# Add any qubits that were not explicitly mapped, so they aren't lost in
|
|
129
133
|
# the sorting.
|
|
@@ -154,8 +158,8 @@ def sample_heavy_set(
|
|
|
154
158
|
|
|
155
159
|
|
|
156
160
|
def process_results(
|
|
157
|
-
mapping:
|
|
158
|
-
parity_mapping:
|
|
161
|
+
mapping: dict[cirq.Qid, cirq.Qid],
|
|
162
|
+
parity_mapping: dict[cirq.Qid, cirq.Qid],
|
|
159
163
|
trial_result: cirq.Result,
|
|
160
164
|
) -> pd.DataFrame:
|
|
161
165
|
"""Checks the given results for parity and throws away all of the runs that
|
|
@@ -172,11 +176,11 @@ def process_results(
|
|
|
172
176
|
|
|
173
177
|
"""
|
|
174
178
|
# The circuit's mapping from physical qubit to logical qubit.
|
|
175
|
-
inverse_mapping:
|
|
179
|
+
inverse_mapping: dict[cirq.Qid, cirq.Qid] = {v: k for k, v in mapping.items()}
|
|
176
180
|
|
|
177
181
|
# Calculate all the invalid parity pairs.
|
|
178
182
|
data = trial_result.data
|
|
179
|
-
bad_measurements:
|
|
183
|
+
bad_measurements: set[int] = set()
|
|
180
184
|
for final_qubit, original_qubit in mapping.items():
|
|
181
185
|
if original_qubit in parity_mapping:
|
|
182
186
|
final_parity_qubit = inverse_mapping[parity_mapping[original_qubit]]
|
|
@@ -200,9 +204,9 @@ def compile_circuit(
|
|
|
200
204
|
*,
|
|
201
205
|
device_graph: nx.Graph,
|
|
202
206
|
routing_attempts: int,
|
|
203
|
-
compiler:
|
|
204
|
-
routing_algo_name:
|
|
205
|
-
router:
|
|
207
|
+
compiler: Callable[[cirq.Circuit], cirq.Circuit] | None = None,
|
|
208
|
+
routing_algo_name: str | None = None,
|
|
209
|
+
router: Callable[..., ccr.SwapNetwork] | None = None,
|
|
206
210
|
add_readout_error_correction=False,
|
|
207
211
|
) -> CompilationResult:
|
|
208
212
|
"""Compile the given model circuit onto the given device graph. This uses a
|
|
@@ -233,7 +237,7 @@ def compile_circuit(
|
|
|
233
237
|
compiled_circuit = circuit.copy()
|
|
234
238
|
|
|
235
239
|
# Optionally add some the parity check bits.
|
|
236
|
-
parity_map:
|
|
240
|
+
parity_map: dict[cirq.Qid, cirq.Qid] = {} # original -> parity
|
|
237
241
|
if add_readout_error_correction:
|
|
238
242
|
num_qubits = len(compiled_circuit.all_qubits())
|
|
239
243
|
# Sort just to make it deterministic.
|
|
@@ -258,7 +262,7 @@ def compile_circuit(
|
|
|
258
262
|
# Github issue: https://github.com/quantumlib/Cirq/issues/2967
|
|
259
263
|
routing_algo_name = 'greedy'
|
|
260
264
|
|
|
261
|
-
swap_networks:
|
|
265
|
+
swap_networks: list[ccr.SwapNetwork] = []
|
|
262
266
|
for _ in range(routing_attempts):
|
|
263
267
|
swap_network = ccr.route_circuit(
|
|
264
268
|
compiled_circuit, device_graph, router=router, algo_name=routing_algo_name
|
|
@@ -309,7 +313,7 @@ class QuantumVolumeResult:
|
|
|
309
313
|
# The model circuit used.
|
|
310
314
|
model_circuit: cirq.Circuit
|
|
311
315
|
# The heavy set computed from the above model circuit.
|
|
312
|
-
heavy_set:
|
|
316
|
+
heavy_set: list[int]
|
|
313
317
|
# The model circuit after being compiled.
|
|
314
318
|
compiled_circuit: cirq.Circuit
|
|
315
319
|
# The percentage of outputs that this sampler had that were in the heavy
|
|
@@ -328,7 +332,7 @@ def prepare_circuits(
|
|
|
328
332
|
depth: int,
|
|
329
333
|
num_circuits: int,
|
|
330
334
|
random_state: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
|
|
331
|
-
) ->
|
|
335
|
+
) -> list[tuple[cirq.Circuit, list[int]]]:
|
|
332
336
|
"""Generates circuits and computes their heavy set.
|
|
333
337
|
|
|
334
338
|
Args:
|
|
@@ -354,13 +358,13 @@ def prepare_circuits(
|
|
|
354
358
|
def execute_circuits(
|
|
355
359
|
*,
|
|
356
360
|
device_graph: nx.Graph,
|
|
357
|
-
samplers:
|
|
358
|
-
circuits:
|
|
361
|
+
samplers: list[cirq.Sampler],
|
|
362
|
+
circuits: list[tuple[cirq.Circuit, list[int]]],
|
|
359
363
|
routing_attempts: int,
|
|
360
|
-
compiler:
|
|
364
|
+
compiler: Callable[[cirq.Circuit], cirq.Circuit] | None = None,
|
|
361
365
|
repetitions: int = 10_000,
|
|
362
366
|
add_readout_error_correction=False,
|
|
363
|
-
) ->
|
|
367
|
+
) -> list[QuantumVolumeResult]:
|
|
364
368
|
"""Executes the given circuits on the given samplers.
|
|
365
369
|
|
|
366
370
|
Args
|
|
@@ -381,7 +385,7 @@ def execute_circuits(
|
|
|
381
385
|
"""
|
|
382
386
|
# First, compile all of the model circuits.
|
|
383
387
|
print("Compiling model circuits")
|
|
384
|
-
compiled_circuits:
|
|
388
|
+
compiled_circuits: list[CompilationResult] = []
|
|
385
389
|
for idx, (model_circuit, heavy_set) in enumerate(circuits):
|
|
386
390
|
print(f" Compiling model circuit #{idx + 1}")
|
|
387
391
|
compiled_circuits.append(
|
|
@@ -422,13 +426,13 @@ def calculate_quantum_volume(
|
|
|
422
426
|
depth: int,
|
|
423
427
|
num_circuits: int,
|
|
424
428
|
device_graph: nx.Graph,
|
|
425
|
-
samplers:
|
|
429
|
+
samplers: list[cirq.Sampler],
|
|
426
430
|
random_state: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
|
|
427
|
-
compiler:
|
|
431
|
+
compiler: Callable[[cirq.Circuit], cirq.Circuit] | None = None,
|
|
428
432
|
repetitions=10_000,
|
|
429
433
|
routing_attempts=30,
|
|
430
434
|
add_readout_error_correction=False,
|
|
431
|
-
) ->
|
|
435
|
+
) -> list[QuantumVolumeResult]:
|
|
432
436
|
"""Run the quantum volume algorithm.
|
|
433
437
|
|
|
434
438
|
This algorithm should compute the same values as Algorithm 1 in
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# pylint: disable=wrong-or-nonexistent-copyright-notice
|
|
2
2
|
"""Tests for the Quantum Volume utilities."""
|
|
3
3
|
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
4
6
|
import io
|
|
5
7
|
from unittest.mock import MagicMock, Mock
|
|
6
8
|
|
|
@@ -16,7 +18,7 @@ class FakeDevice(cirq.Device):
|
|
|
16
18
|
qubits = cirq.GridQubit.rect(5, 5)
|
|
17
19
|
|
|
18
20
|
|
|
19
|
-
def test_generate_model_circuit():
|
|
21
|
+
def test_generate_model_circuit() -> None:
|
|
20
22
|
"""Test that a model circuit is randomly generated."""
|
|
21
23
|
model_circuit = cirq.contrib.quantum_volume.generate_model_circuit(
|
|
22
24
|
3, 3, random_state=np.random.RandomState(1)
|
|
@@ -27,7 +29,7 @@ def test_generate_model_circuit():
|
|
|
27
29
|
assert list(model_circuit.findall_operations_with_gate_type(cirq.MeasurementGate)) == []
|
|
28
30
|
|
|
29
31
|
|
|
30
|
-
def test_generate_model_circuit_without_seed():
|
|
32
|
+
def test_generate_model_circuit_without_seed() -> None:
|
|
31
33
|
"""Test that a model circuit is randomly generated without a seed."""
|
|
32
34
|
model_circuit = cirq.contrib.quantum_volume.generate_model_circuit(3, 3)
|
|
33
35
|
|
|
@@ -36,7 +38,7 @@ def test_generate_model_circuit_without_seed():
|
|
|
36
38
|
assert list(model_circuit.findall_operations_with_gate_type(cirq.MeasurementGate)) == []
|
|
37
39
|
|
|
38
40
|
|
|
39
|
-
def test_generate_model_circuit_seed():
|
|
41
|
+
def test_generate_model_circuit_seed() -> None:
|
|
40
42
|
"""Test that a model circuit is determined by its seed ."""
|
|
41
43
|
model_circuit_1 = cirq.contrib.quantum_volume.generate_model_circuit(
|
|
42
44
|
3, 3, random_state=np.random.RandomState(1)
|
|
@@ -52,7 +54,7 @@ def test_generate_model_circuit_seed():
|
|
|
52
54
|
assert model_circuit_2 != model_circuit_3
|
|
53
55
|
|
|
54
56
|
|
|
55
|
-
def test_compute_heavy_set():
|
|
57
|
+
def test_compute_heavy_set() -> None:
|
|
56
58
|
"""Test that the heavy set can be computed from a given circuit."""
|
|
57
59
|
a, b, c = cirq.LineQubit.range(3)
|
|
58
60
|
model_circuit = cirq.Circuit(
|
|
@@ -67,7 +69,7 @@ def test_compute_heavy_set():
|
|
|
67
69
|
assert cirq.contrib.quantum_volume.compute_heavy_set(model_circuit) == [5, 7]
|
|
68
70
|
|
|
69
71
|
|
|
70
|
-
def test_sample_heavy_set():
|
|
72
|
+
def test_sample_heavy_set() -> None:
|
|
71
73
|
"""Test that we correctly sample a circuit's heavy set"""
|
|
72
74
|
|
|
73
75
|
sampler = Mock(spec=cirq.Simulator)
|
|
@@ -87,7 +89,7 @@ def test_sample_heavy_set():
|
|
|
87
89
|
assert probability == 0.75
|
|
88
90
|
|
|
89
91
|
|
|
90
|
-
def test_sample_heavy_set_with_parity():
|
|
92
|
+
def test_sample_heavy_set_with_parity() -> None:
|
|
91
93
|
"""Test that we correctly sample a circuit's heavy set with a parity map"""
|
|
92
94
|
|
|
93
95
|
sampler = Mock(spec=cirq.Simulator)
|
|
@@ -120,7 +122,7 @@ def test_sample_heavy_set_with_parity():
|
|
|
120
122
|
assert probability == 0.5
|
|
121
123
|
|
|
122
124
|
|
|
123
|
-
def test_compile_circuit_router():
|
|
125
|
+
def test_compile_circuit_router() -> None:
|
|
124
126
|
"""Tests that the given router is used."""
|
|
125
127
|
router_mock = MagicMock()
|
|
126
128
|
cirq.contrib.quantum_volume.compile_circuit(
|
|
@@ -132,7 +134,7 @@ def test_compile_circuit_router():
|
|
|
132
134
|
router_mock.assert_called()
|
|
133
135
|
|
|
134
136
|
|
|
135
|
-
def test_compile_circuit():
|
|
137
|
+
def test_compile_circuit() -> None:
|
|
136
138
|
"""Tests that we are able to compile a model circuit."""
|
|
137
139
|
compiler_mock = MagicMock(side_effect=lambda circuit: circuit)
|
|
138
140
|
a, b, c = cirq.LineQubit.range(3)
|
|
@@ -152,7 +154,7 @@ def test_compile_circuit():
|
|
|
152
154
|
compiler_mock.assert_called_with(compilation_result.circuit)
|
|
153
155
|
|
|
154
156
|
|
|
155
|
-
def test_compile_circuit_replaces_swaps():
|
|
157
|
+
def test_compile_circuit_replaces_swaps() -> None:
|
|
156
158
|
"""Tests that the compiler never sees the SwapPermutationGates from the
|
|
157
159
|
router."""
|
|
158
160
|
compiler_mock = MagicMock(side_effect=lambda circuit: circuit)
|
|
@@ -193,7 +195,7 @@ def test_compile_circuit_replaces_swaps():
|
|
|
193
195
|
)
|
|
194
196
|
|
|
195
197
|
|
|
196
|
-
def test_compile_circuit_with_readout_correction():
|
|
198
|
+
def test_compile_circuit_with_readout_correction() -> None:
|
|
197
199
|
"""Tests that we are able to compile a model circuit with readout error
|
|
198
200
|
correction."""
|
|
199
201
|
compiler_mock = MagicMock(side_effect=lambda circuit: circuit)
|
|
@@ -220,9 +222,10 @@ def test_compile_circuit_with_readout_correction():
|
|
|
220
222
|
)
|
|
221
223
|
|
|
222
224
|
|
|
223
|
-
def test_compile_circuit_multiple_routing_attempts():
|
|
225
|
+
def test_compile_circuit_multiple_routing_attempts() -> None:
|
|
224
226
|
"""Tests that we make multiple attempts at routing and keep the best one."""
|
|
225
227
|
qubits = cirq.LineQubit.range(3)
|
|
228
|
+
initial_mapping: dict[cirq.Qid, cirq.Qid]
|
|
226
229
|
initial_mapping = dict(zip(qubits, qubits))
|
|
227
230
|
more_operations = cirq.Circuit([cirq.X.on_each(qubits), cirq.Y.on_each(qubits)])
|
|
228
231
|
more_qubits = cirq.Circuit([cirq.X.on_each(cirq.LineQubit.range(4))])
|
|
@@ -250,7 +253,7 @@ def test_compile_circuit_multiple_routing_attempts():
|
|
|
250
253
|
compiler_mock.assert_called_with(well_routed)
|
|
251
254
|
|
|
252
255
|
|
|
253
|
-
def test_compile_circuit_no_routing_attempts():
|
|
256
|
+
def test_compile_circuit_no_routing_attempts() -> None:
|
|
254
257
|
"""Tests that setting no routing attempts throws an error."""
|
|
255
258
|
a, b, c = cirq.LineQubit.range(3)
|
|
256
259
|
model_circuit = cirq.Circuit([cirq.Moment([cirq.X(a), cirq.Y(b), cirq.Z(c)])])
|
|
@@ -264,7 +267,7 @@ def test_compile_circuit_no_routing_attempts():
|
|
|
264
267
|
assert e.match('Unable to get routing for circuit')
|
|
265
268
|
|
|
266
269
|
|
|
267
|
-
def test_calculate_quantum_volume_result():
|
|
270
|
+
def test_calculate_quantum_volume_result() -> None:
|
|
268
271
|
"""Test that running the main loop returns the desired result"""
|
|
269
272
|
results = cirq.contrib.quantum_volume.calculate_quantum_volume(
|
|
270
273
|
num_qubits=3,
|
|
@@ -285,7 +288,7 @@ def test_calculate_quantum_volume_result():
|
|
|
285
288
|
cirq.to_json(results, buffer)
|
|
286
289
|
|
|
287
290
|
|
|
288
|
-
def test_calculate_quantum_volume_result_with_device_graph():
|
|
291
|
+
def test_calculate_quantum_volume_result_with_device_graph() -> None:
|
|
289
292
|
"""Test that running the main loop routes the circuit onto the given device
|
|
290
293
|
graph"""
|
|
291
294
|
device_qubits = [cirq.GridQubit(i, j) for i in range(2) for j in range(3)]
|
|
@@ -306,7 +309,7 @@ def test_calculate_quantum_volume_result_with_device_graph():
|
|
|
306
309
|
)
|
|
307
310
|
|
|
308
311
|
|
|
309
|
-
def test_calculate_quantum_volume_loop():
|
|
312
|
+
def test_calculate_quantum_volume_loop() -> None:
|
|
310
313
|
"""Test that calculate_quantum_volume is able to run without erring."""
|
|
311
314
|
# Keep test from taking a long time by lowering circuits and routing
|
|
312
315
|
# attempts.
|
|
@@ -321,7 +324,7 @@ def test_calculate_quantum_volume_loop():
|
|
|
321
324
|
)
|
|
322
325
|
|
|
323
326
|
|
|
324
|
-
def test_calculate_quantum_volume_loop_with_readout_correction():
|
|
327
|
+
def test_calculate_quantum_volume_loop_with_readout_correction() -> None:
|
|
325
328
|
"""Test that calculate_quantum_volume is able to run without erring with
|
|
326
329
|
readout error correction."""
|
|
327
330
|
# Keep test from taking a long time by lowering circuits and routing
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
# pylint: disable=wrong-or-nonexistent-copyright-notice
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
2
5
|
from functools import lru_cache
|
|
3
|
-
from typing import
|
|
6
|
+
from typing import Sequence
|
|
4
7
|
|
|
5
8
|
import numpy as np
|
|
6
9
|
import quimb
|
|
@@ -10,7 +13,7 @@ import cirq
|
|
|
10
13
|
|
|
11
14
|
|
|
12
15
|
@lru_cache()
|
|
13
|
-
def _qpos_tag(qubits:
|
|
16
|
+
def _qpos_tag(qubits: cirq.Qid | tuple[cirq.Qid]):
|
|
14
17
|
"""Given a qubit or qubits, return a "position tag" (used for drawing).
|
|
15
18
|
|
|
16
19
|
For multiple qubits, the tag is for the first qubit.
|
|
@@ -22,9 +25,7 @@ def _qpos_tag(qubits: Union[cirq.Qid, Tuple[cirq.Qid]]):
|
|
|
22
25
|
|
|
23
26
|
|
|
24
27
|
@lru_cache()
|
|
25
|
-
def _qpos_y(
|
|
26
|
-
qubits: Union[cirq.Qid, Tuple[cirq.Qid, ...]], all_qubits: Tuple[cirq.Qid, ...]
|
|
27
|
-
) -> float:
|
|
28
|
+
def _qpos_y(qubits: cirq.Qid | tuple[cirq.Qid, ...], all_qubits: tuple[cirq.Qid, ...]) -> float:
|
|
28
29
|
"""Given a qubit or qubits, return the position y value (used for drawing).
|
|
29
30
|
|
|
30
31
|
For multiple qubits, the position is the mean of the qubit indices.
|
|
@@ -44,11 +45,11 @@ def _qpos_y(
|
|
|
44
45
|
|
|
45
46
|
|
|
46
47
|
def _add_to_positions(
|
|
47
|
-
positions:
|
|
48
|
+
positions: dict[tuple[str, str], tuple[float, float]],
|
|
48
49
|
mi: int,
|
|
49
|
-
qubits:
|
|
50
|
+
qubits: cirq.Qid | tuple[cirq.Qid],
|
|
50
51
|
*,
|
|
51
|
-
all_qubits:
|
|
52
|
+
all_qubits: tuple[cirq.Qid, ...],
|
|
52
53
|
x_scale,
|
|
53
54
|
y_scale,
|
|
54
55
|
x_nudge,
|
|
@@ -76,8 +77,8 @@ def _add_to_positions(
|
|
|
76
77
|
|
|
77
78
|
|
|
78
79
|
def circuit_to_density_matrix_tensors(
|
|
79
|
-
circuit: cirq.Circuit, qubits:
|
|
80
|
-
) ->
|
|
80
|
+
circuit: cirq.Circuit, qubits: Sequence[cirq.Qid] | None = None
|
|
81
|
+
) -> tuple[list[qtn.Tensor], dict[cirq.Qid, int], dict[tuple[str, str], tuple[float, float]]]:
|
|
81
82
|
"""Given a circuit with mixtures or channels, construct a tensor network
|
|
82
83
|
representation of the density matrix.
|
|
83
84
|
|
|
@@ -109,10 +110,10 @@ def circuit_to_density_matrix_tensors(
|
|
|
109
110
|
qubits = sorted(circuit.all_qubits()) # pragma: no cover
|
|
110
111
|
qubits = tuple(qubits)
|
|
111
112
|
|
|
112
|
-
qubit_frontier:
|
|
113
|
+
qubit_frontier: dict[cirq.Qid, int] = {q: 0 for q in qubits}
|
|
113
114
|
kraus_frontier = 0
|
|
114
|
-
positions:
|
|
115
|
-
tensors:
|
|
115
|
+
positions: dict[tuple[str, str], tuple[float, float]] = {}
|
|
116
|
+
tensors: list[qtn.Tensor] = []
|
|
116
117
|
|
|
117
118
|
x_scale = 2
|
|
118
119
|
y_scale = 3
|
|
@@ -196,7 +197,7 @@ def circuit_to_density_matrix_tensors(
|
|
|
196
197
|
|
|
197
198
|
|
|
198
199
|
def tensor_density_matrix(
|
|
199
|
-
circuit: cirq.Circuit, qubits:
|
|
200
|
+
circuit: cirq.Circuit, qubits: Sequence[cirq.Qid] | None = None
|
|
200
201
|
) -> np.ndarray:
|
|
201
202
|
"""Given a circuit with mixtures or channels, contract a tensor network
|
|
202
203
|
representing the resultant density matrix.
|