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,8 +12,11 @@
|
|
|
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 itertools
|
|
16
18
|
import random
|
|
19
|
+
from typing import Iterable
|
|
17
20
|
|
|
18
21
|
import pytest
|
|
19
22
|
|
|
@@ -21,27 +24,28 @@ import cirq
|
|
|
21
24
|
import cirq.contrib.acquaintance as cca
|
|
22
25
|
|
|
23
26
|
|
|
24
|
-
def test_bad_qubit_pairs():
|
|
27
|
+
def test_bad_qubit_pairs() -> None:
|
|
25
28
|
a, b, c, d, e = cirq.LineQubit.range(5)
|
|
26
29
|
bad_qubit_pairs = [(a, b), (c, d), (e,)]
|
|
27
30
|
with pytest.raises(ValueError):
|
|
28
31
|
cca.strategies.quartic_paired.qubit_pairs_to_qubit_order(bad_qubit_pairs)
|
|
29
32
|
|
|
30
33
|
|
|
31
|
-
def random_index_pairs(n_pairs: int):
|
|
34
|
+
def random_index_pairs(n_pairs: int) -> tuple[tuple[int, int], ...]:
|
|
32
35
|
indices = list(range(2 * n_pairs))
|
|
33
36
|
random.shuffle(indices)
|
|
34
|
-
return tuple(indices[2
|
|
37
|
+
return tuple(zip(indices[0::2], indices[1::2]))
|
|
35
38
|
|
|
36
39
|
|
|
37
40
|
@pytest.mark.parametrize(
|
|
38
41
|
'index_pairs', [random_index_pairs(n_pairs) for n_pairs in range(2, 7) for _ in range(2)]
|
|
39
42
|
)
|
|
40
|
-
def test_quartic_paired_acquaintances(index_pairs):
|
|
43
|
+
def test_quartic_paired_acquaintances(index_pairs) -> None:
|
|
41
44
|
n_pairs = len(index_pairs)
|
|
42
|
-
qubit_pairs
|
|
45
|
+
qubit_pairs: Iterable[tuple[cirq.Qid, cirq.Qid]]
|
|
46
|
+
qubit_pairs = tuple((cirq.LineQubit(x), cirq.LineQubit(y)) for x, y in index_pairs)
|
|
43
47
|
strategy, qubits = cca.quartic_paired_acquaintance_strategy(qubit_pairs)
|
|
44
|
-
initial_mapping = {q: q.x for q in qubits}
|
|
48
|
+
initial_mapping = {q: q.x for q in qubits} # type: ignore[attr-defined]
|
|
45
49
|
opps = cca.get_logical_acquaintance_opportunities(strategy, initial_mapping)
|
|
46
50
|
assert set(len(opp) for opp in opps) == set([2, 4])
|
|
47
51
|
quadratic_opps = set(opp for opp in opps if len(opp) == 2)
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import pytest
|
|
16
18
|
|
|
17
19
|
import cirq
|
|
@@ -29,7 +31,7 @@ import cirq.contrib.acquaintance as cca
|
|
|
29
31
|
for _ in range(5)
|
|
30
32
|
],
|
|
31
33
|
)
|
|
32
|
-
def test_topological_sort(circuit_dag, sorted_nodes):
|
|
34
|
+
def test_topological_sort(circuit_dag, sorted_nodes) -> None:
|
|
33
35
|
sorted_nodes = list(sorted_nodes)
|
|
34
36
|
assert cca.is_topologically_sorted(circuit_dag, (node.val for node in sorted_nodes))
|
|
35
37
|
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
from __future__ import annotations
|
|
16
16
|
|
|
17
17
|
import math
|
|
18
|
-
from typing import Any, cast,
|
|
18
|
+
from typing import Any, cast, Iterator, Sequence, TYPE_CHECKING
|
|
19
19
|
|
|
20
20
|
from sympy.combinatorics import GrayCode
|
|
21
21
|
|
|
@@ -96,8 +96,8 @@ class BayesianNetworkGate(raw_types.Gate):
|
|
|
96
96
|
|
|
97
97
|
def __init__(
|
|
98
98
|
self,
|
|
99
|
-
init_probs:
|
|
100
|
-
arc_probs:
|
|
99
|
+
init_probs: list[tuple[str, float | None]],
|
|
100
|
+
arc_probs: list[tuple[str, tuple[str, ...], list[float]]],
|
|
101
101
|
):
|
|
102
102
|
"""Builds a BayesianNetworkGate.
|
|
103
103
|
|
|
@@ -175,28 +175,27 @@ class BayesianNetworkGate(raw_types.Gate):
|
|
|
175
175
|
def _has_unitary_(self) -> bool:
|
|
176
176
|
return True
|
|
177
177
|
|
|
178
|
-
def _qid_shape_(self) ->
|
|
178
|
+
def _qid_shape_(self) -> tuple[int, ...]:
|
|
179
179
|
return (2,) * len(self._init_probs)
|
|
180
180
|
|
|
181
181
|
def _value_equality_values_(self):
|
|
182
182
|
return self._init_probs, self._arc_probs
|
|
183
183
|
|
|
184
|
-
def _json_dict_(self) ->
|
|
184
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
185
185
|
return {'init_probs': self._init_probs, 'arc_probs': self._arc_probs}
|
|
186
186
|
|
|
187
187
|
@classmethod
|
|
188
188
|
def _from_json_dict_(
|
|
189
189
|
cls,
|
|
190
|
-
init_probs:
|
|
191
|
-
arc_probs:
|
|
190
|
+
init_probs: list[list[str | float | None]],
|
|
191
|
+
arc_probs: list[list[str | list[str] | list[float]]],
|
|
192
192
|
**kwargs,
|
|
193
193
|
) -> BayesianNetworkGate:
|
|
194
194
|
converted_init_probs = cast(
|
|
195
|
-
|
|
196
|
-
[(param, init_prob) for param, init_prob in init_probs],
|
|
195
|
+
list[tuple[str, float | None]], [(param, init_prob) for param, init_prob in init_probs]
|
|
197
196
|
)
|
|
198
197
|
converted_cond_probs = cast(
|
|
199
|
-
|
|
198
|
+
list[tuple[str, tuple[str, ...], list[float]]],
|
|
200
199
|
[(target, tuple(params), cond_probs) for target, params, cond_probs in arc_probs],
|
|
201
200
|
)
|
|
202
201
|
return cls(converted_init_probs, converted_cond_probs)
|
|
@@ -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
|
import pytest
|
|
16
19
|
|
|
@@ -18,14 +21,14 @@ import cirq
|
|
|
18
21
|
import cirq.contrib.bayesian_network as ccb
|
|
19
22
|
|
|
20
23
|
|
|
21
|
-
def test_basic_properties():
|
|
24
|
+
def test_basic_properties() -> None:
|
|
22
25
|
gate = ccb.BayesianNetworkGate([('q0', None), ('q1', None), ('q2', None)], [])
|
|
23
26
|
|
|
24
27
|
assert gate._has_unitary_()
|
|
25
28
|
assert gate._qid_shape_() == (2, 2, 2)
|
|
26
29
|
|
|
27
30
|
|
|
28
|
-
def test_incorrect_constructor():
|
|
31
|
+
def test_incorrect_constructor() -> None:
|
|
29
32
|
# Success building.
|
|
30
33
|
ccb.BayesianNetworkGate([('q0', 0.0), ('q1', None)], [('q1', ('q0',), [0.0, 0.0])])
|
|
31
34
|
|
|
@@ -34,7 +37,9 @@ def test_incorrect_constructor():
|
|
|
34
37
|
|
|
35
38
|
# This is an easy mistake where the tuple for q0 doesn't have the comma at the end.
|
|
36
39
|
with pytest.raises(ValueError, match='Conditional prob params must be a tuple.'):
|
|
37
|
-
ccb.BayesianNetworkGate(
|
|
40
|
+
ccb.BayesianNetworkGate(
|
|
41
|
+
[('q0', 0.0), ('q1', None)], [('q1', ('q0'), [0.0, 0.0])] # type: ignore
|
|
42
|
+
)
|
|
38
43
|
|
|
39
44
|
with pytest.raises(ValueError, match='Incorrect number of conditional probs.'):
|
|
40
45
|
ccb.BayesianNetworkGate([('q0', 0.0), ('q1', None)], [('q1', ('q0',), [0.0])])
|
|
@@ -43,17 +48,17 @@ def test_incorrect_constructor():
|
|
|
43
48
|
ccb.BayesianNetworkGate([('q0', 0.0), ('q1', None)], [('q1', ('q0',), [2016.0913, 0.0])])
|
|
44
49
|
|
|
45
50
|
|
|
46
|
-
def test_repr():
|
|
51
|
+
def test_repr() -> None:
|
|
47
52
|
gate = ccb.BayesianNetworkGate([('q0', 0.0), ('q1', None)], [('q1', ('q0',), [0.0, 0.0])])
|
|
48
53
|
|
|
49
54
|
assert repr(gate) == (
|
|
50
55
|
"cirq.BayesianNetworkGate(init_probs=[('q0', 0.0), ('q1', None)],"
|
|
51
|
-
|
|
56
|
+
" arc_probs=[('q1', ('q0',), [0.0, 0.0])])"
|
|
52
57
|
)
|
|
53
58
|
|
|
54
59
|
|
|
55
60
|
@pytest.mark.parametrize('input_prob', [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0])
|
|
56
|
-
def test_prob_encoding(input_prob):
|
|
61
|
+
def test_prob_encoding(input_prob) -> None:
|
|
57
62
|
q = cirq.NamedQubit('q')
|
|
58
63
|
gate = ccb.BayesianNetworkGate([('q', input_prob)], [])
|
|
59
64
|
circuit = cirq.Circuit(gate.on(q))
|
|
@@ -79,7 +84,7 @@ def test_prob_encoding(input_prob):
|
|
|
79
84
|
],
|
|
80
85
|
)
|
|
81
86
|
@pytest.mark.parametrize('decompose', [True, False])
|
|
82
|
-
def test_initial_probs(p0, p1, p2, expected_probs, decompose):
|
|
87
|
+
def test_initial_probs(p0, p1, p2, expected_probs, decompose) -> None:
|
|
83
88
|
q0, q1, q2 = cirq.LineQubit.range(3)
|
|
84
89
|
gate = ccb.BayesianNetworkGate([('q0', p0), ('q1', p1), ('q2', p2)], [])
|
|
85
90
|
if decompose:
|
|
@@ -99,7 +104,7 @@ def test_initial_probs(p0, p1, p2, expected_probs, decompose):
|
|
|
99
104
|
[(0.0, 0.0, 0.1), (0.0, 1.0, 0.2), (1.0, 0.0, 0.3), (1.0, 1.0, 0.4)],
|
|
100
105
|
)
|
|
101
106
|
@pytest.mark.parametrize('decompose', [True, False])
|
|
102
|
-
def test_arc_probs(input_prob_q0, input_prob_q1, expected_prob_q2, decompose):
|
|
107
|
+
def test_arc_probs(input_prob_q0, input_prob_q1, expected_prob_q2, decompose) -> None:
|
|
103
108
|
q0, q1, q2 = cirq.LineQubit.range(3)
|
|
104
109
|
gate = ccb.BayesianNetworkGate(
|
|
105
110
|
[('q0', input_prob_q0), ('q1', input_prob_q1), ('q2', None)],
|
|
@@ -119,7 +124,7 @@ def test_arc_probs(input_prob_q0, input_prob_q1, expected_prob_q2, decompose):
|
|
|
119
124
|
np.testing.assert_almost_equal(actual_prob_q2_is_one, expected_prob_q2, decimal=4)
|
|
120
125
|
|
|
121
126
|
|
|
122
|
-
def test_repro_figure_10_of_paper():
|
|
127
|
+
def test_repro_figure_10_of_paper() -> None:
|
|
123
128
|
# We try to create the network of figure 10 and check that the probabilities are the same as
|
|
124
129
|
# the ones in table 10 of https://arxiv.org/abs/2004.14803.
|
|
125
130
|
ir = cirq.NamedQubit('q4_IR')
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
from __future__ import annotations
|
|
16
16
|
|
|
17
17
|
import functools
|
|
18
|
-
from typing import Any, Callable, cast,
|
|
18
|
+
from typing import Any, Callable, cast, Generic, Iterator, TypeVar
|
|
19
19
|
|
|
20
20
|
import networkx
|
|
21
21
|
|
|
@@ -44,7 +44,7 @@ class Unique(Generic[T]):
|
|
|
44
44
|
def __repr__(self) -> str:
|
|
45
45
|
return f'cirq.contrib.Unique({id(self)}, {self.val!r})'
|
|
46
46
|
|
|
47
|
-
def __lt__(self, other):
|
|
47
|
+
def __lt__(self, other) -> bool:
|
|
48
48
|
if not isinstance(other, type(self)):
|
|
49
49
|
return NotImplemented
|
|
50
50
|
return id(self) < id(other)
|
|
@@ -132,7 +132,7 @@ class CircuitDag(networkx.DiGraph):
|
|
|
132
132
|
for node, attr in g2.nodes(data=True):
|
|
133
133
|
attr['val'] = node.val
|
|
134
134
|
|
|
135
|
-
def node_match(attr1:
|
|
135
|
+
def node_match(attr1: dict[Any, Any], attr2: dict[Any, Any]) -> bool:
|
|
136
136
|
return attr1['val'] == attr2['val']
|
|
137
137
|
|
|
138
138
|
return networkx.is_isomorphic(g1, g2, node_match=node_match)
|
|
@@ -176,7 +176,7 @@ class CircuitDag(networkx.DiGraph):
|
|
|
176
176
|
def all_operations(self) -> Iterator[cirq.Operation]:
|
|
177
177
|
return (node.val for node in self.ordered_nodes())
|
|
178
178
|
|
|
179
|
-
def all_qubits(self):
|
|
179
|
+
def all_qubits(self) -> frozenset[cirq.Qid]:
|
|
180
180
|
return frozenset(q for node in self.nodes for q in node.val.qubits)
|
|
181
181
|
|
|
182
182
|
def to_circuit(self) -> cirq.Circuit:
|
|
@@ -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 itertools
|
|
16
18
|
import random
|
|
17
19
|
|
|
@@ -25,7 +27,7 @@ class FakeDevice(cirq.Device):
|
|
|
25
27
|
pass
|
|
26
28
|
|
|
27
29
|
|
|
28
|
-
def test_wrapper_eq():
|
|
30
|
+
def test_wrapper_eq() -> None:
|
|
29
31
|
q0, q1 = cirq.LineQubit.range(2)
|
|
30
32
|
eq = cirq.testing.EqualsTester()
|
|
31
33
|
eq.add_equality_group(cirq.contrib.CircuitDag.make_node(cirq.X(q0)))
|
|
@@ -34,7 +36,7 @@ def test_wrapper_eq():
|
|
|
34
36
|
eq.add_equality_group(cirq.contrib.CircuitDag.make_node(cirq.X(q1)))
|
|
35
37
|
|
|
36
38
|
|
|
37
|
-
def test_wrapper_cmp():
|
|
39
|
+
def test_wrapper_cmp() -> None:
|
|
38
40
|
u0 = cirq.contrib.Unique(0)
|
|
39
41
|
u1 = cirq.contrib.Unique(1)
|
|
40
42
|
# The ordering of Unique instances is unpredictable
|
|
@@ -49,14 +51,14 @@ def test_wrapper_cmp():
|
|
|
49
51
|
assert u1 >= u0
|
|
50
52
|
|
|
51
53
|
|
|
52
|
-
def test_wrapper_cmp_failure():
|
|
54
|
+
def test_wrapper_cmp_failure() -> None:
|
|
53
55
|
with pytest.raises(TypeError):
|
|
54
56
|
_ = object() < cirq.contrib.Unique(1)
|
|
55
57
|
with pytest.raises(TypeError):
|
|
56
58
|
_ = cirq.contrib.Unique(1) < object()
|
|
57
59
|
|
|
58
60
|
|
|
59
|
-
def test_wrapper_repr():
|
|
61
|
+
def test_wrapper_repr() -> None:
|
|
60
62
|
q0 = cirq.LineQubit(0)
|
|
61
63
|
|
|
62
64
|
node = cirq.contrib.CircuitDag.make_node(cirq.X(q0))
|
|
@@ -64,14 +66,14 @@ def test_wrapper_repr():
|
|
|
64
66
|
assert repr(node) == expected
|
|
65
67
|
|
|
66
68
|
|
|
67
|
-
def test_init():
|
|
69
|
+
def test_init() -> None:
|
|
68
70
|
dag = cirq.contrib.CircuitDag()
|
|
69
71
|
assert networkx.dag.is_directed_acyclic_graph(dag)
|
|
70
72
|
assert list(dag.nodes()) == []
|
|
71
73
|
assert list(dag.edges()) == []
|
|
72
74
|
|
|
73
75
|
|
|
74
|
-
def test_append():
|
|
76
|
+
def test_append() -> None:
|
|
75
77
|
q0 = cirq.LineQubit(0)
|
|
76
78
|
dag = cirq.contrib.CircuitDag()
|
|
77
79
|
dag.append(cirq.X(q0))
|
|
@@ -81,7 +83,7 @@ def test_append():
|
|
|
81
83
|
assert [(n1.val, n2.val) for n1, n2 in dag.edges()] == [(cirq.X(q0), cirq.Y(q0))]
|
|
82
84
|
|
|
83
85
|
|
|
84
|
-
def test_two_identical_ops():
|
|
86
|
+
def test_two_identical_ops() -> None:
|
|
85
87
|
q0 = cirq.LineQubit(0)
|
|
86
88
|
dag = cirq.contrib.CircuitDag()
|
|
87
89
|
dag.append(cirq.X(q0))
|
|
@@ -96,7 +98,7 @@ def test_two_identical_ops():
|
|
|
96
98
|
}
|
|
97
99
|
|
|
98
100
|
|
|
99
|
-
def test_from_ops():
|
|
101
|
+
def test_from_ops() -> None:
|
|
100
102
|
q0 = cirq.LineQubit(0)
|
|
101
103
|
dag = cirq.contrib.CircuitDag.from_ops(cirq.X(q0), cirq.Y(q0))
|
|
102
104
|
assert networkx.dag.is_directed_acyclic_graph(dag)
|
|
@@ -104,7 +106,7 @@ def test_from_ops():
|
|
|
104
106
|
assert [(n1.val, n2.val) for n1, n2 in dag.edges()] == [(cirq.X(q0), cirq.Y(q0))]
|
|
105
107
|
|
|
106
108
|
|
|
107
|
-
def test_from_circuit():
|
|
109
|
+
def test_from_circuit() -> None:
|
|
108
110
|
q0 = cirq.LineQubit(0)
|
|
109
111
|
circuit = cirq.Circuit(cirq.X(q0), cirq.Y(q0))
|
|
110
112
|
dag = cirq.contrib.CircuitDag.from_circuit(circuit)
|
|
@@ -114,14 +116,14 @@ def test_from_circuit():
|
|
|
114
116
|
assert sorted(circuit.all_qubits()) == sorted(dag.all_qubits())
|
|
115
117
|
|
|
116
118
|
|
|
117
|
-
def test_to_empty_circuit():
|
|
119
|
+
def test_to_empty_circuit() -> None:
|
|
118
120
|
circuit = cirq.Circuit()
|
|
119
121
|
dag = cirq.contrib.CircuitDag.from_circuit(circuit)
|
|
120
122
|
assert networkx.dag.is_directed_acyclic_graph(dag)
|
|
121
123
|
assert circuit == dag.to_circuit()
|
|
122
124
|
|
|
123
125
|
|
|
124
|
-
def test_to_circuit():
|
|
126
|
+
def test_to_circuit() -> None:
|
|
125
127
|
q0 = cirq.LineQubit(0)
|
|
126
128
|
circuit = cirq.Circuit(cirq.X(q0), cirq.Y(q0))
|
|
127
129
|
dag = cirq.contrib.CircuitDag.from_circuit(circuit)
|
|
@@ -135,7 +137,7 @@ def test_to_circuit():
|
|
|
135
137
|
)
|
|
136
138
|
|
|
137
139
|
|
|
138
|
-
def test_equality():
|
|
140
|
+
def test_equality() -> None:
|
|
139
141
|
q0, q1 = cirq.LineQubit.range(2)
|
|
140
142
|
circuit1 = cirq.Circuit(
|
|
141
143
|
cirq.X(q0), cirq.Y(q0), cirq.Z(q1), cirq.CZ(q0, q1), cirq.X(q1), cirq.Y(q1), cirq.Z(q0)
|
|
@@ -165,7 +167,7 @@ def test_equality():
|
|
|
165
167
|
eq.add_equality_group(cirq.contrib.CircuitDag.from_circuit(circuit4))
|
|
166
168
|
|
|
167
169
|
|
|
168
|
-
def test_larger_circuit():
|
|
170
|
+
def test_larger_circuit() -> None:
|
|
169
171
|
q0, q1, q2, q3 = [
|
|
170
172
|
cirq.GridQubit(0, 5),
|
|
171
173
|
cirq.GridQubit(1, 5),
|
|
@@ -211,7 +213,7 @@ def test_larger_circuit():
|
|
|
211
213
|
|
|
212
214
|
|
|
213
215
|
@pytest.mark.parametrize('circuit', [cirq.testing.random_circuit(10, 10, 0.5) for _ in range(3)])
|
|
214
|
-
def test_is_maximalist(circuit):
|
|
216
|
+
def test_is_maximalist(circuit) -> None:
|
|
215
217
|
dag = cirq.contrib.CircuitDag.from_circuit(circuit)
|
|
216
218
|
transitive_closure = networkx.dag.transitive_closure(dag)
|
|
217
219
|
assert cirq.contrib.CircuitDag(incoming_graph_data=transitive_closure) == dag
|
|
@@ -230,7 +232,7 @@ def _get_circuits_and_is_blockers():
|
|
|
230
232
|
|
|
231
233
|
|
|
232
234
|
@pytest.mark.parametrize('circuit, is_blocker', _get_circuits_and_is_blockers())
|
|
233
|
-
def test_findall_nodes_until_blocked(circuit, is_blocker):
|
|
235
|
+
def test_findall_nodes_until_blocked(circuit, is_blocker) -> None:
|
|
234
236
|
dag = cirq.contrib.CircuitDag.from_circuit(circuit)
|
|
235
237
|
all_nodes = list(dag.ordered_nodes())
|
|
236
238
|
found_nodes = list(dag.findall_nodes_until_blocked(is_blocker))
|
|
@@ -14,14 +14,14 @@
|
|
|
14
14
|
|
|
15
15
|
from __future__ import annotations
|
|
16
16
|
|
|
17
|
-
from typing import Any,
|
|
18
|
-
|
|
19
|
-
import numpy as np
|
|
17
|
+
from typing import Any, Generic, Sequence, TYPE_CHECKING
|
|
20
18
|
|
|
21
19
|
from cirq import sim
|
|
22
20
|
from cirq.sim.simulation_state import TSimulationState
|
|
23
21
|
|
|
24
22
|
if TYPE_CHECKING:
|
|
23
|
+
import numpy as np
|
|
24
|
+
|
|
25
25
|
import cirq
|
|
26
26
|
|
|
27
27
|
|
|
@@ -47,7 +47,7 @@ class CustomStateSimulator(
|
|
|
47
47
|
|
|
48
48
|
def __init__(
|
|
49
49
|
self,
|
|
50
|
-
state_type:
|
|
50
|
+
state_type: type[TSimulationState],
|
|
51
51
|
*,
|
|
52
52
|
noise: cirq.NOISE_MODEL_LIKE = None,
|
|
53
53
|
split_untangled_states: bool = False,
|
|
@@ -66,7 +66,7 @@ class CustomStateSimulator(
|
|
|
66
66
|
def _create_simulator_trial_result(
|
|
67
67
|
self,
|
|
68
68
|
params: cirq.ParamResolver,
|
|
69
|
-
measurements:
|
|
69
|
+
measurements: dict[str, np.ndarray],
|
|
70
70
|
final_simulator_state: cirq.SimulationStateBase[TSimulationState],
|
|
71
71
|
) -> CustomStateTrialResult[TSimulationState]:
|
|
72
72
|
return CustomStateTrialResult(
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
from __future__ import annotations
|
|
16
16
|
|
|
17
|
-
from typing import
|
|
17
|
+
from typing import Sequence
|
|
18
18
|
|
|
19
19
|
import numpy as np
|
|
20
20
|
import sympy
|
|
@@ -24,13 +24,15 @@ from cirq.contrib.custom_simulators.custom_state_simulator import CustomStateSim
|
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
class ComputationalBasisState(cirq.qis.QuantumStateRepresentation):
|
|
27
|
-
def __init__(self, initial_state:
|
|
27
|
+
def __init__(self, initial_state: list[int]):
|
|
28
28
|
self.basis = initial_state
|
|
29
29
|
|
|
30
30
|
def copy(self, deep_copy_buffers: bool = True) -> ComputationalBasisState:
|
|
31
31
|
return ComputationalBasisState(self.basis) # pragma: no cover
|
|
32
32
|
|
|
33
|
-
def measure(
|
|
33
|
+
def measure(
|
|
34
|
+
self, axes: Sequence[int], seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None
|
|
35
|
+
) -> list[int]:
|
|
34
36
|
return [self.basis[i] for i in axes]
|
|
35
37
|
|
|
36
38
|
|
|
@@ -49,7 +51,7 @@ class ComputationalBasisSimState(cirq.SimulationState[ComputationalBasisState]):
|
|
|
49
51
|
return True
|
|
50
52
|
|
|
51
53
|
|
|
52
|
-
def create_test_circuit():
|
|
54
|
+
def create_test_circuit() -> cirq.Circuit:
|
|
53
55
|
q0, q1 = cirq.LineQid.range(2, dimension=3)
|
|
54
56
|
x = cirq.XPowGate(dimension=3)
|
|
55
57
|
return cirq.Circuit(
|
|
@@ -64,26 +66,27 @@ def create_test_circuit():
|
|
|
64
66
|
)
|
|
65
67
|
|
|
66
68
|
|
|
67
|
-
def test_basis_state_simulator():
|
|
69
|
+
def test_basis_state_simulator() -> None:
|
|
68
70
|
sim = CustomStateSimulator(ComputationalBasisSimState)
|
|
69
71
|
circuit = create_test_circuit()
|
|
70
72
|
r = sim.simulate(circuit)
|
|
71
73
|
assert r.measurements == {'a': np.array([1]), 'b': np.array([2])}
|
|
72
|
-
assert r._final_simulator_state._state.basis == [2, 2]
|
|
74
|
+
assert r._final_simulator_state._state.basis == [2, 2] # type: ignore[attr-defined]
|
|
73
75
|
|
|
74
76
|
|
|
75
|
-
def test_built_in_states():
|
|
77
|
+
def test_built_in_states() -> None:
|
|
76
78
|
# Verify this works for the built-in states too, you just lose the custom step/trial results.
|
|
77
79
|
sim = CustomStateSimulator(cirq.StateVectorSimulationState)
|
|
78
80
|
circuit = create_test_circuit()
|
|
79
81
|
r = sim.simulate(circuit)
|
|
80
82
|
assert r.measurements == {'a': np.array([1]), 'b': np.array([2])}
|
|
81
83
|
assert np.allclose(
|
|
82
|
-
r._final_simulator_state._state._state_vector,
|
|
84
|
+
r._final_simulator_state._state._state_vector, # type: ignore[attr-defined]
|
|
85
|
+
[[0, 0, 0], [0, 0, 0], [0, 0, 1]],
|
|
83
86
|
)
|
|
84
87
|
|
|
85
88
|
|
|
86
|
-
def test_product_state_mode_built_in_state():
|
|
89
|
+
def test_product_state_mode_built_in_state() -> None:
|
|
87
90
|
sim = CustomStateSimulator(cirq.StateVectorSimulationState, split_untangled_states=True)
|
|
88
91
|
circuit = create_test_circuit()
|
|
89
92
|
r = sim.simulate(circuit)
|
|
@@ -99,16 +102,16 @@ def test_product_state_mode_built_in_state():
|
|
|
99
102
|
)
|
|
100
103
|
|
|
101
104
|
|
|
102
|
-
def test_noise():
|
|
105
|
+
def test_noise() -> None:
|
|
103
106
|
x = cirq.XPowGate(dimension=3)
|
|
104
107
|
sim = CustomStateSimulator(ComputationalBasisSimState, noise=x**2)
|
|
105
108
|
circuit = create_test_circuit()
|
|
106
109
|
r = sim.simulate(circuit)
|
|
107
110
|
assert r.measurements == {'a': np.array([2]), 'b': np.array([2])}
|
|
108
|
-
assert r._final_simulator_state._state.basis == [1, 2]
|
|
111
|
+
assert r._final_simulator_state._state.basis == [1, 2] # type: ignore[attr-defined]
|
|
109
112
|
|
|
110
113
|
|
|
111
|
-
def test_run():
|
|
114
|
+
def test_run() -> None:
|
|
112
115
|
sim = CustomStateSimulator(ComputationalBasisSimState)
|
|
113
116
|
circuit = create_test_circuit()
|
|
114
117
|
r = sim.run(circuit)
|
|
@@ -116,7 +119,7 @@ def test_run():
|
|
|
116
119
|
assert np.allclose(r.records['b'], np.array([[1], [2]]))
|
|
117
120
|
|
|
118
121
|
|
|
119
|
-
def test_parameterized_repetitions():
|
|
122
|
+
def test_parameterized_repetitions() -> None:
|
|
120
123
|
q = cirq.LineQid(0, dimension=5)
|
|
121
124
|
x = cirq.XPowGate(dimension=5)
|
|
122
125
|
circuit = cirq.Circuit(
|
|
@@ -136,13 +139,15 @@ def test_parameterized_repetitions():
|
|
|
136
139
|
|
|
137
140
|
|
|
138
141
|
class ComputationalBasisProductState(cirq.qis.QuantumStateRepresentation):
|
|
139
|
-
def __init__(self, initial_state:
|
|
142
|
+
def __init__(self, initial_state: list[int]):
|
|
140
143
|
self.basis = initial_state
|
|
141
144
|
|
|
142
145
|
def copy(self, deep_copy_buffers: bool = True) -> ComputationalBasisProductState:
|
|
143
146
|
return ComputationalBasisProductState(self.basis)
|
|
144
147
|
|
|
145
|
-
def measure(
|
|
148
|
+
def measure(
|
|
149
|
+
self, axes: Sequence[int], seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None
|
|
150
|
+
) -> list[int]:
|
|
146
151
|
return [self.basis[i] for i in axes]
|
|
147
152
|
|
|
148
153
|
def kron(self, other: ComputationalBasisProductState) -> ComputationalBasisProductState:
|
|
@@ -150,7 +155,7 @@ class ComputationalBasisProductState(cirq.qis.QuantumStateRepresentation):
|
|
|
150
155
|
|
|
151
156
|
def factor(
|
|
152
157
|
self, axes: Sequence[int], *, validate=True, atol=1e-07
|
|
153
|
-
) ->
|
|
158
|
+
) -> tuple[ComputationalBasisProductState, ComputationalBasisProductState]:
|
|
154
159
|
extracted = ComputationalBasisProductState(
|
|
155
160
|
[self.basis[i] for i in axes]
|
|
156
161
|
) # pragma: no cover
|
|
@@ -182,7 +187,7 @@ class ComputationalBasisSimProductState(cirq.SimulationState[ComputationalBasisP
|
|
|
182
187
|
return True
|
|
183
188
|
|
|
184
189
|
|
|
185
|
-
def test_product_state_mode():
|
|
190
|
+
def test_product_state_mode() -> None:
|
|
186
191
|
sim = CustomStateSimulator(ComputationalBasisSimProductState, split_untangled_states=True)
|
|
187
192
|
circuit = create_test_circuit()
|
|
188
193
|
r = sim.simulate(circuit)
|
|
@@ -16,7 +16,7 @@ from __future__ import annotations
|
|
|
16
16
|
|
|
17
17
|
import abc
|
|
18
18
|
import itertools
|
|
19
|
-
from typing import cast,
|
|
19
|
+
from typing import Any, cast, Hashable, Iterable, NoReturn, TYPE_CHECKING
|
|
20
20
|
|
|
21
21
|
from cirq import devices, ops, value
|
|
22
22
|
from cirq.contrib.graph_device.hypergraph import UndirectedHypergraph
|
|
@@ -98,7 +98,7 @@ def is_crosstalk_graph(graph: UndirectedHypergraph) -> bool:
|
|
|
98
98
|
return True
|
|
99
99
|
|
|
100
100
|
|
|
101
|
-
def raise_crosstalk_error(*ops: ops.Operation):
|
|
101
|
+
def raise_crosstalk_error(*ops: ops.Operation) -> NoReturn:
|
|
102
102
|
raise ValueError(f'crosstalk on {ops}')
|
|
103
103
|
|
|
104
104
|
|
|
@@ -122,8 +122,8 @@ class UndirectedGraphDevice(devices.Device):
|
|
|
122
122
|
|
|
123
123
|
def __init__(
|
|
124
124
|
self,
|
|
125
|
-
device_graph:
|
|
126
|
-
crosstalk_graph:
|
|
125
|
+
device_graph: UndirectedHypergraph | None = None,
|
|
126
|
+
crosstalk_graph: UndirectedHypergraph | None = None,
|
|
127
127
|
) -> None:
|
|
128
128
|
"""Inits UndirectedGraphDevice.
|
|
129
129
|
|
|
@@ -152,15 +152,15 @@ class UndirectedGraphDevice(devices.Device):
|
|
|
152
152
|
self.crosstalk_graph = crosstalk_graph
|
|
153
153
|
|
|
154
154
|
@property
|
|
155
|
-
def qubits(self) ->
|
|
156
|
-
return cast(
|
|
155
|
+
def qubits(self) -> tuple[cirq.Qid, ...]:
|
|
156
|
+
return cast(tuple['cirq.Qid', ...], tuple(sorted(self.device_graph.vertices)))
|
|
157
157
|
|
|
158
158
|
@property
|
|
159
|
-
def edges(self):
|
|
159
|
+
def edges(self) -> tuple[frozenset[Hashable], ...]:
|
|
160
160
|
return tuple(sorted(self.device_graph.edges))
|
|
161
161
|
|
|
162
162
|
@property
|
|
163
|
-
def labelled_edges(self):
|
|
163
|
+
def labelled_edges(self) -> dict[frozenset, Any]:
|
|
164
164
|
return self.device_graph.labelled_edges
|
|
165
165
|
|
|
166
166
|
def get_device_edge_from_op(self, operation: ops.Operation) -> UndirectedGraphDeviceEdge:
|
|
@@ -174,8 +174,8 @@ class UndirectedGraphDevice(devices.Device):
|
|
|
174
174
|
device_edge = self.get_device_edge_from_op(operation)
|
|
175
175
|
except Exception as error:
|
|
176
176
|
if frozenset(operation.qubits) not in self.device_graph.edges:
|
|
177
|
-
|
|
178
|
-
raise
|
|
177
|
+
raise ValueError(f'{operation.qubits} not in device graph edges') from error
|
|
178
|
+
raise # pragma: no cover
|
|
179
179
|
device_edge.validate_operation(operation)
|
|
180
180
|
|
|
181
181
|
def validate_crosstalk(
|
|
@@ -185,6 +185,7 @@ class UndirectedGraphDevice(devices.Device):
|
|
|
185
185
|
self.crosstalk_graph._adjacency_lists.get(frozenset(operation.qubits), ())
|
|
186
186
|
)
|
|
187
187
|
for crosstalk_edge in adjacent_crosstalk_edges:
|
|
188
|
+
# pylint: disable=unreachable
|
|
188
189
|
label = self.crosstalk_graph.labelled_edges[crosstalk_edge]
|
|
189
190
|
validator = (
|
|
190
191
|
raise_crosstalk_error(operation, *other_operations) if (label is None) else label
|
|
@@ -194,7 +195,7 @@ class UndirectedGraphDevice(devices.Device):
|
|
|
194
195
|
):
|
|
195
196
|
validator(operation, *crosstalk_operations)
|
|
196
197
|
|
|
197
|
-
def validate_moment(self, moment: cirq.Moment):
|
|
198
|
+
def validate_moment(self, moment: cirq.Moment) -> None:
|
|
198
199
|
super().validate_moment(moment)
|
|
199
200
|
ops = moment.operations
|
|
200
201
|
for i, op in enumerate(ops):
|