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
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
# pylint: disable=wrong-or-nonexistent-copyright-notice
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
2
5
|
import numpy as np
|
|
3
6
|
|
|
4
7
|
import cirq
|
|
5
8
|
import cirq.contrib.quimb as ccq
|
|
6
9
|
|
|
7
10
|
|
|
8
|
-
def test_tensor_density_matrix_1():
|
|
11
|
+
def test_tensor_density_matrix_1() -> None:
|
|
9
12
|
q = cirq.LineQubit.range(2)
|
|
10
13
|
c = cirq.Circuit(cirq.YPowGate(exponent=0.25).on(q[0]))
|
|
11
14
|
|
|
@@ -14,7 +17,7 @@ def test_tensor_density_matrix_1():
|
|
|
14
17
|
np.testing.assert_allclose(rho1, rho2, atol=1e-15)
|
|
15
18
|
|
|
16
19
|
|
|
17
|
-
def test_tensor_density_matrix_optional_qubits():
|
|
20
|
+
def test_tensor_density_matrix_optional_qubits() -> None:
|
|
18
21
|
q = cirq.LineQubit.range(2)
|
|
19
22
|
c = cirq.Circuit(cirq.YPowGate(exponent=0.25).on(q[0]))
|
|
20
23
|
|
|
@@ -23,7 +26,7 @@ def test_tensor_density_matrix_optional_qubits():
|
|
|
23
26
|
np.testing.assert_allclose(rho1, rho2, atol=1e-15)
|
|
24
27
|
|
|
25
28
|
|
|
26
|
-
def test_tensor_density_matrix_noise_1():
|
|
29
|
+
def test_tensor_density_matrix_noise_1() -> None:
|
|
27
30
|
q = cirq.LineQubit.range(2)
|
|
28
31
|
c = cirq.Circuit(
|
|
29
32
|
cirq.YPowGate(exponent=0.25).on(q[0]),
|
|
@@ -36,7 +39,7 @@ def test_tensor_density_matrix_noise_1():
|
|
|
36
39
|
np.testing.assert_allclose(rho1, rho2, atol=1e-15)
|
|
37
40
|
|
|
38
41
|
|
|
39
|
-
def test_tensor_density_matrix_2():
|
|
42
|
+
def test_tensor_density_matrix_2() -> None:
|
|
40
43
|
q = cirq.LineQubit.range(2)
|
|
41
44
|
rs = np.random.RandomState(52)
|
|
42
45
|
for _ in range(10):
|
|
@@ -47,7 +50,7 @@ def test_tensor_density_matrix_2():
|
|
|
47
50
|
np.testing.assert_allclose(rho1, rho2, atol=1e-8)
|
|
48
51
|
|
|
49
52
|
|
|
50
|
-
def test_tensor_density_matrix_3():
|
|
53
|
+
def test_tensor_density_matrix_3() -> None:
|
|
51
54
|
qubits = cirq.LineQubit.range(10)
|
|
52
55
|
circuit = cirq.testing.random_circuit(qubits=qubits, n_moments=10, op_density=0.8)
|
|
53
56
|
rho1 = cirq.final_density_matrix(circuit, dtype=np.complex128)
|
|
@@ -55,7 +58,7 @@ def test_tensor_density_matrix_3():
|
|
|
55
58
|
np.testing.assert_allclose(rho1, rho2, atol=1e-8)
|
|
56
59
|
|
|
57
60
|
|
|
58
|
-
def test_tensor_density_matrix_4():
|
|
61
|
+
def test_tensor_density_matrix_4() -> None:
|
|
59
62
|
qubits = cirq.LineQubit.range(4)
|
|
60
63
|
circuit = cirq.testing.random_circuit(qubits=qubits, n_moments=100, op_density=0.8)
|
|
61
64
|
circuit = cirq.drop_empty_moments(circuit)
|
|
@@ -66,7 +69,7 @@ def test_tensor_density_matrix_4():
|
|
|
66
69
|
np.testing.assert_allclose(rho1, rho2, atol=1e-8)
|
|
67
70
|
|
|
68
71
|
|
|
69
|
-
def test_tensor_density_matrix_gridqubit():
|
|
72
|
+
def test_tensor_density_matrix_gridqubit() -> None:
|
|
70
73
|
qubits = cirq.GridQubit.rect(2, 2)
|
|
71
74
|
circuit = cirq.testing.random_circuit(qubits=qubits, n_moments=10, op_density=0.8)
|
|
72
75
|
circuit = cirq.drop_empty_moments(circuit)
|
|
@@ -12,12 +12,15 @@
|
|
|
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
|
-
import
|
|
17
|
+
from typing import Iterator, TYPE_CHECKING
|
|
18
18
|
|
|
19
19
|
import cirq
|
|
20
20
|
|
|
21
|
+
if TYPE_CHECKING:
|
|
22
|
+
import networkx as nx
|
|
23
|
+
|
|
21
24
|
|
|
22
25
|
def get_grid_moments(
|
|
23
26
|
problem_graph: nx.Graph, two_qubit_gate=cirq.ZZPowGate
|
|
@@ -21,7 +21,7 @@ from __future__ import annotations
|
|
|
21
21
|
|
|
22
22
|
import dataclasses
|
|
23
23
|
import math
|
|
24
|
-
from typing import Any,
|
|
24
|
+
from typing import Any, Sequence, TYPE_CHECKING
|
|
25
25
|
|
|
26
26
|
import numpy as np
|
|
27
27
|
import quimb.tensor as qtn
|
|
@@ -43,7 +43,7 @@ class MPSOptions:
|
|
|
43
43
|
# How to split the tensor. Refer to the Quimb documentation for the exact meaning.
|
|
44
44
|
method: str = 'svds'
|
|
45
45
|
# If integer, the maxmimum number of singular values to keep, regardless of ``cutoff``.
|
|
46
|
-
max_bond:
|
|
46
|
+
max_bond: int | None = None
|
|
47
47
|
# Method with which to apply the cutoff threshold. Refer to the Quimb documentation.
|
|
48
48
|
cutoff_mode: str = 'rsum2'
|
|
49
49
|
# The threshold below which to discard singular values. Refer to the Quimb documentation.
|
|
@@ -63,7 +63,7 @@ class MPSSimulator(
|
|
|
63
63
|
noise: cirq.NOISE_MODEL_LIKE = None,
|
|
64
64
|
seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
|
|
65
65
|
simulation_options: MPSOptions = MPSOptions(),
|
|
66
|
-
grouping:
|
|
66
|
+
grouping: dict[cirq.Qid, int] | None = None,
|
|
67
67
|
):
|
|
68
68
|
"""Creates instance of `MPSSimulator`.
|
|
69
69
|
|
|
@@ -86,7 +86,7 @@ class MPSSimulator(
|
|
|
86
86
|
|
|
87
87
|
def _create_partial_simulation_state(
|
|
88
88
|
self,
|
|
89
|
-
initial_state:
|
|
89
|
+
initial_state: int | MPSState,
|
|
90
90
|
qubits: Sequence[cirq.Qid],
|
|
91
91
|
classical_data: cirq.ClassicalDataStore,
|
|
92
92
|
) -> MPSState:
|
|
@@ -122,7 +122,7 @@ class MPSSimulator(
|
|
|
122
122
|
def _create_simulator_trial_result(
|
|
123
123
|
self,
|
|
124
124
|
params: cirq.ParamResolver,
|
|
125
|
-
measurements:
|
|
125
|
+
measurements: dict[str, np.ndarray],
|
|
126
126
|
final_simulator_state: cirq.SimulationStateBase[MPSState],
|
|
127
127
|
) -> MPSTrialResult:
|
|
128
128
|
"""Creates a single trial results with the measurements.
|
|
@@ -147,7 +147,7 @@ class MPSTrialResult(simulator_base.SimulationTrialResultBase['MPSState']):
|
|
|
147
147
|
def __init__(
|
|
148
148
|
self,
|
|
149
149
|
params: cirq.ParamResolver,
|
|
150
|
-
measurements:
|
|
150
|
+
measurements: dict[str, np.ndarray],
|
|
151
151
|
final_simulator_state: cirq.SimulationStateBase[MPSState],
|
|
152
152
|
) -> None:
|
|
153
153
|
super().__init__(
|
|
@@ -212,11 +212,11 @@ class _MPSHandler(qis.QuantumStateRepresentation):
|
|
|
212
212
|
|
|
213
213
|
def __init__(
|
|
214
214
|
self,
|
|
215
|
-
qid_shape:
|
|
216
|
-
grouping:
|
|
217
|
-
M:
|
|
215
|
+
qid_shape: tuple[int, ...],
|
|
216
|
+
grouping: dict[int, int],
|
|
217
|
+
M: list[qtn.Tensor],
|
|
218
218
|
format_i: str,
|
|
219
|
-
estimated_gate_error_list:
|
|
219
|
+
estimated_gate_error_list: list[float],
|
|
220
220
|
simulation_options: MPSOptions = MPSOptions(),
|
|
221
221
|
):
|
|
222
222
|
"""Creates an MPSQuantumState
|
|
@@ -241,8 +241,8 @@ class _MPSHandler(qis.QuantumStateRepresentation):
|
|
|
241
241
|
def create(
|
|
242
242
|
cls,
|
|
243
243
|
*,
|
|
244
|
-
qid_shape:
|
|
245
|
-
grouping:
|
|
244
|
+
qid_shape: tuple[int, ...],
|
|
245
|
+
grouping: dict[int, int],
|
|
246
246
|
initial_state: int = 0,
|
|
247
247
|
simulation_options: MPSOptions = MPSOptions(),
|
|
248
248
|
):
|
|
@@ -342,7 +342,7 @@ class _MPSHandler(qis.QuantumStateRepresentation):
|
|
|
342
342
|
sorted_ind = tuple(sorted(state_vector.inds))
|
|
343
343
|
return state_vector.fuse({'i': sorted_ind}).data
|
|
344
344
|
|
|
345
|
-
def partial_trace(self, keep_axes:
|
|
345
|
+
def partial_trace(self, keep_axes: set[int]) -> np.ndarray:
|
|
346
346
|
"""Traces out all qubits except keep_axes.
|
|
347
347
|
|
|
348
348
|
Args:
|
|
@@ -484,8 +484,8 @@ class _MPSHandler(qis.QuantumStateRepresentation):
|
|
|
484
484
|
|
|
485
485
|
def _measure(
|
|
486
486
|
self, axes: Sequence[int], prng: np.random.RandomState, collapse_state_vector=True
|
|
487
|
-
) ->
|
|
488
|
-
results:
|
|
487
|
+
) -> list[int]:
|
|
488
|
+
results: list[int] = []
|
|
489
489
|
|
|
490
490
|
if collapse_state_vector:
|
|
491
491
|
state = self
|
|
@@ -523,7 +523,7 @@ class _MPSHandler(qis.QuantumStateRepresentation):
|
|
|
523
523
|
|
|
524
524
|
def measure(
|
|
525
525
|
self, axes: Sequence[int], seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None
|
|
526
|
-
) ->
|
|
526
|
+
) -> list[int]:
|
|
527
527
|
"""Measures the MPS.
|
|
528
528
|
|
|
529
529
|
Args:
|
|
@@ -547,7 +547,7 @@ class _MPSHandler(qis.QuantumStateRepresentation):
|
|
|
547
547
|
The samples in order.
|
|
548
548
|
"""
|
|
549
549
|
|
|
550
|
-
measurements:
|
|
550
|
+
measurements: list[list[int]] = []
|
|
551
551
|
prng = value.parse_random_state(seed)
|
|
552
552
|
|
|
553
553
|
for _ in range(repetitions):
|
|
@@ -566,9 +566,9 @@ class MPSState(SimulationState[_MPSHandler]):
|
|
|
566
566
|
qubits: Sequence[cirq.Qid],
|
|
567
567
|
prng: np.random.RandomState,
|
|
568
568
|
simulation_options: MPSOptions = MPSOptions(),
|
|
569
|
-
grouping:
|
|
569
|
+
grouping: dict[cirq.Qid, int] | None = None,
|
|
570
570
|
initial_state: int = 0,
|
|
571
|
-
classical_data:
|
|
571
|
+
classical_data: cirq.ClassicalDataStore | None = None,
|
|
572
572
|
):
|
|
573
573
|
"""Creates and MPSState
|
|
574
574
|
|
|
@@ -622,7 +622,7 @@ class MPSState(SimulationState[_MPSHandler]):
|
|
|
622
622
|
"""
|
|
623
623
|
return self._state.state_vector()
|
|
624
624
|
|
|
625
|
-
def partial_trace(self, keep_qubits:
|
|
625
|
+
def partial_trace(self, keep_qubits: set[cirq.Qid]) -> np.ndarray:
|
|
626
626
|
"""Traces out all qubits except keep_qubits.
|
|
627
627
|
|
|
628
628
|
Args:
|
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
# pylint: disable=wrong-or-nonexistent-copyright-notice
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
2
5
|
import warnings
|
|
3
|
-
from typing import cast,
|
|
6
|
+
from typing import cast, Sequence, TYPE_CHECKING
|
|
4
7
|
|
|
5
|
-
import numpy as np
|
|
6
8
|
import quimb
|
|
7
9
|
import quimb.tensor as qtn
|
|
8
10
|
|
|
9
11
|
import cirq
|
|
10
12
|
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
import numpy as np
|
|
15
|
+
|
|
11
16
|
|
|
12
17
|
def _get_quimb_version():
|
|
13
18
|
"""Returns the quimb version and parsed (major,minor) numbers if possible.
|
|
@@ -25,10 +30,8 @@ QUIMB_VERSION = _get_quimb_version()
|
|
|
25
30
|
|
|
26
31
|
|
|
27
32
|
def circuit_to_tensors(
|
|
28
|
-
circuit: cirq.Circuit,
|
|
29
|
-
|
|
30
|
-
initial_state: Union[int, None] = 0,
|
|
31
|
-
) -> Tuple[List[qtn.Tensor], Dict['cirq.Qid', int], None]:
|
|
33
|
+
circuit: cirq.Circuit, qubits: Sequence[cirq.Qid] | None = None, initial_state: int | None = 0
|
|
34
|
+
) -> tuple[list[qtn.Tensor], dict[cirq.Qid, int], None]:
|
|
32
35
|
"""Given a circuit, construct a tensor network representation.
|
|
33
36
|
|
|
34
37
|
Indices are named "i{i}_q{x}" where i is a time index and x is a
|
|
@@ -62,7 +65,7 @@ def circuit_to_tensors(
|
|
|
62
65
|
|
|
63
66
|
qubit_frontier = {q: 0 for q in qubits}
|
|
64
67
|
positions = None
|
|
65
|
-
tensors:
|
|
68
|
+
tensors: list[qtn.Tensor] = []
|
|
66
69
|
|
|
67
70
|
if initial_state == 0:
|
|
68
71
|
for q in qubits:
|
|
@@ -89,7 +92,7 @@ def circuit_to_tensors(
|
|
|
89
92
|
|
|
90
93
|
|
|
91
94
|
def tensor_state_vector(
|
|
92
|
-
circuit: cirq.Circuit, qubits:
|
|
95
|
+
circuit: cirq.Circuit, qubits: Sequence[cirq.Qid] | None = None
|
|
93
96
|
) -> np.ndarray:
|
|
94
97
|
"""Given a circuit contract a tensor network into a final state vector."""
|
|
95
98
|
if qubits is None:
|
|
@@ -102,9 +105,7 @@ def tensor_state_vector(
|
|
|
102
105
|
return tn.to_dense(f_inds)
|
|
103
106
|
|
|
104
107
|
|
|
105
|
-
def tensor_unitary(
|
|
106
|
-
circuit: cirq.Circuit, qubits: Optional[Sequence[cirq.Qid]] = None
|
|
107
|
-
) -> np.ndarray:
|
|
108
|
+
def tensor_unitary(circuit: cirq.Circuit, qubits: Sequence[cirq.Qid] | None = None) -> np.ndarray:
|
|
108
109
|
"""Given a circuit contract a tensor network into a dense unitary
|
|
109
110
|
of the circuit."""
|
|
110
111
|
if qubits is None:
|
|
@@ -12,9 +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 json
|
|
16
18
|
import urllib.parse
|
|
17
|
-
from typing import Any, cast, Iterable
|
|
19
|
+
from typing import Any, cast, Iterable
|
|
18
20
|
|
|
19
21
|
from cirq import circuits, devices, ops, protocols
|
|
20
22
|
from cirq.contrib.quirk.linearize_circuit import linearize_circuit_qubits
|
|
@@ -40,7 +42,7 @@ def _try_convert_to_quirk_gate(op: ops.Operation, prefer_unknown_gate_to_failure
|
|
|
40
42
|
|
|
41
43
|
def _to_quirk_cols(
|
|
42
44
|
op: ops.Operation, prefer_unknown_gate_to_failure: bool
|
|
43
|
-
) -> Iterable[
|
|
45
|
+
) -> Iterable[tuple[list[Any], bool]]:
|
|
44
46
|
gate = _try_convert_to_quirk_gate(op, prefer_unknown_gate_to_failure)
|
|
45
47
|
qubits = cast(Iterable[devices.LineQubit], op.qubits)
|
|
46
48
|
|
|
@@ -76,7 +78,7 @@ def circuit_to_quirk_url(
|
|
|
76
78
|
circuit = circuit.copy()
|
|
77
79
|
linearize_circuit_qubits(circuit)
|
|
78
80
|
|
|
79
|
-
cols:
|
|
81
|
+
cols: list[list[Any]] = []
|
|
80
82
|
for moment in circuit:
|
|
81
83
|
can_merges = []
|
|
82
84
|
for op in moment.operations:
|
|
@@ -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
|
import sympy
|
|
17
19
|
|
|
@@ -19,7 +21,7 @@ import cirq
|
|
|
19
21
|
from cirq.contrib.quirk.export_to_quirk import circuit_to_quirk_url
|
|
20
22
|
|
|
21
23
|
|
|
22
|
-
def assert_links_to(circuit: cirq.Circuit, expected: str, **kwargs):
|
|
24
|
+
def assert_links_to(circuit: cirq.Circuit, expected: str, **kwargs) -> None:
|
|
23
25
|
actual = circuit_to_quirk_url(circuit, **kwargs)
|
|
24
26
|
actual = actual.replace('\n', '').replace(' ', '').strip()
|
|
25
27
|
expected = expected.replace('],[', '],\n[').strip()
|
|
@@ -27,7 +29,7 @@ def assert_links_to(circuit: cirq.Circuit, expected: str, **kwargs):
|
|
|
27
29
|
assert actual == expected
|
|
28
30
|
|
|
29
31
|
|
|
30
|
-
def test_x_z_same_col():
|
|
32
|
+
def test_x_z_same_col() -> None:
|
|
31
33
|
a = cirq.NamedQubit('a')
|
|
32
34
|
b = cirq.NamedQubit('b')
|
|
33
35
|
circuit = cirq.Circuit(cirq.X(a), cirq.Z(b))
|
|
@@ -44,7 +46,7 @@ def test_x_z_same_col():
|
|
|
44
46
|
)
|
|
45
47
|
|
|
46
48
|
|
|
47
|
-
def test_x_cnot_split_cols():
|
|
49
|
+
def test_x_cnot_split_cols() -> None:
|
|
48
50
|
a = cirq.NamedQubit('a')
|
|
49
51
|
b = cirq.NamedQubit('b')
|
|
50
52
|
c = cirq.NamedQubit('c')
|
|
@@ -58,7 +60,7 @@ def test_x_cnot_split_cols():
|
|
|
58
60
|
)
|
|
59
61
|
|
|
60
62
|
|
|
61
|
-
def test_cz_cnot_split_cols():
|
|
63
|
+
def test_cz_cnot_split_cols() -> None:
|
|
62
64
|
a = cirq.NamedQubit('a')
|
|
63
65
|
b = cirq.NamedQubit('b')
|
|
64
66
|
c = cirq.NamedQubit('c')
|
|
@@ -72,7 +74,7 @@ def test_cz_cnot_split_cols():
|
|
|
72
74
|
)
|
|
73
75
|
|
|
74
76
|
|
|
75
|
-
def test_various_known_gate_types():
|
|
77
|
+
def test_various_known_gate_types() -> None:
|
|
76
78
|
a = cirq.NamedQubit('a')
|
|
77
79
|
b = cirq.NamedQubit('b')
|
|
78
80
|
circuit = cirq.Circuit(
|
|
@@ -116,7 +118,7 @@ def test_various_known_gate_types():
|
|
|
116
118
|
)
|
|
117
119
|
|
|
118
120
|
|
|
119
|
-
def test_parameterized_gates():
|
|
121
|
+
def test_parameterized_gates() -> None:
|
|
120
122
|
a = cirq.LineQubit(0)
|
|
121
123
|
s = sympy.Symbol('s')
|
|
122
124
|
t = sympy.Symbol('t')
|
|
@@ -182,7 +184,7 @@ class MysteryGate(cirq.testing.SingleQubitGate):
|
|
|
182
184
|
return True
|
|
183
185
|
|
|
184
186
|
|
|
185
|
-
def test_various_unknown_gate_types():
|
|
187
|
+
def test_various_unknown_gate_types() -> None:
|
|
186
188
|
a = cirq.NamedQubit('a')
|
|
187
189
|
b = cirq.NamedQubit('b')
|
|
188
190
|
circuit = cirq.Circuit(
|
|
@@ -225,7 +227,7 @@ def test_various_unknown_gate_types():
|
|
|
225
227
|
)
|
|
226
228
|
|
|
227
229
|
|
|
228
|
-
def test_formulaic_exponent_export():
|
|
230
|
+
def test_formulaic_exponent_export() -> None:
|
|
229
231
|
a = cirq.LineQubit(0)
|
|
230
232
|
t = sympy.Symbol('t')
|
|
231
233
|
assert_links_to(
|
|
@@ -241,7 +243,7 @@ def test_formulaic_exponent_export():
|
|
|
241
243
|
)
|
|
242
244
|
|
|
243
245
|
|
|
244
|
-
def test_formulaic_rotation_xyz_export():
|
|
246
|
+
def test_formulaic_rotation_xyz_export() -> None:
|
|
245
247
|
a = cirq.LineQubit(0)
|
|
246
248
|
t = sympy.Symbol('t')
|
|
247
249
|
assert_links_to(
|
|
@@ -262,9 +264,9 @@ def test_formulaic_rotation_xyz_export():
|
|
|
262
264
|
_ = circuit_to_quirk_url(cirq.Circuit(cirq.rx(sympy.FallingFactorial(t, t)).on(a)))
|
|
263
265
|
|
|
264
266
|
|
|
265
|
-
def test_unrecognized_single_qubit_gate_with_matrix():
|
|
267
|
+
def test_unrecognized_single_qubit_gate_with_matrix() -> None:
|
|
266
268
|
a = cirq.NamedQubit('a')
|
|
267
|
-
circuit = cirq.Circuit(cirq.PhasedXPowGate(phase_exponent=0).on(a)
|
|
269
|
+
circuit = cirq.Circuit(cirq.PhasedXPowGate(exponent=0.2731, phase_exponent=0).on(a))
|
|
268
270
|
assert_links_to(
|
|
269
271
|
circuit,
|
|
270
272
|
"""
|
|
@@ -279,7 +281,7 @@ def test_unrecognized_single_qubit_gate_with_matrix():
|
|
|
279
281
|
)
|
|
280
282
|
|
|
281
283
|
|
|
282
|
-
def test_unknown_gate():
|
|
284
|
+
def test_unknown_gate() -> None:
|
|
283
285
|
class UnknownGate(cirq.testing.SingleQubitGate):
|
|
284
286
|
pass
|
|
285
287
|
|
|
@@ -299,7 +301,7 @@ def test_unknown_gate():
|
|
|
299
301
|
)
|
|
300
302
|
|
|
301
303
|
|
|
302
|
-
def test_controlled_gate():
|
|
304
|
+
def test_controlled_gate() -> None:
|
|
303
305
|
a, b, c, d = cirq.LineQubit.range(4)
|
|
304
306
|
circuit = cirq.Circuit(cirq.ControlledGate(cirq.ControlledGate(cirq.CZ)).on(a, d, c, b))
|
|
305
307
|
assert_links_to(
|
|
@@ -334,7 +336,7 @@ def test_controlled_gate():
|
|
|
334
336
|
)
|
|
335
337
|
|
|
336
338
|
|
|
337
|
-
def test_toffoli():
|
|
339
|
+
def test_toffoli() -> None:
|
|
338
340
|
a, b, c, d = cirq.LineQubit.range(4)
|
|
339
341
|
|
|
340
342
|
# Raw.
|
|
@@ -372,7 +374,7 @@ def test_toffoli():
|
|
|
372
374
|
)
|
|
373
375
|
|
|
374
376
|
|
|
375
|
-
def test_fredkin():
|
|
377
|
+
def test_fredkin() -> None:
|
|
376
378
|
a, b, c = cirq.LineQubit.range(3)
|
|
377
379
|
circuit = cirq.Circuit(cirq.FREDKIN(a, b, c))
|
|
378
380
|
assert_links_to(
|
|
@@ -398,7 +400,7 @@ def test_fredkin():
|
|
|
398
400
|
)
|
|
399
401
|
|
|
400
402
|
|
|
401
|
-
def test_ccz():
|
|
403
|
+
def test_ccz() -> None:
|
|
402
404
|
a, b, c, d = cirq.LineQubit.range(4)
|
|
403
405
|
|
|
404
406
|
# Raw.
|
cirq/contrib/quirk/quirk_gate.py
CHANGED
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import Any, Callable, cast
|
|
16
18
|
|
|
17
19
|
import numpy as np
|
|
18
20
|
import sympy
|
|
@@ -46,7 +48,7 @@ class QuirkOp:
|
|
|
46
48
|
self.keys = keys
|
|
47
49
|
self.can_merge = can_merge
|
|
48
50
|
|
|
49
|
-
def controlled(self, control_count: int = 1) ->
|
|
51
|
+
def controlled(self, control_count: int = 1) -> QuirkOp:
|
|
50
52
|
return QuirkOp(*['•'] * control_count, *self.keys, can_merge=False)
|
|
51
53
|
|
|
52
54
|
|
|
@@ -68,7 +70,7 @@ def _is_supported_formula(formula: sympy.Basic) -> bool:
|
|
|
68
70
|
return False
|
|
69
71
|
|
|
70
72
|
|
|
71
|
-
def _val_to_quirk_formula(t:
|
|
73
|
+
def _val_to_quirk_formula(t: float | sympy.Basic) -> str:
|
|
72
74
|
if isinstance(t, sympy.Basic):
|
|
73
75
|
if not set(t.free_symbols) <= {sympy.Symbol('t')}:
|
|
74
76
|
raise ValueError(f'Symbol other than "t": {t!r}.')
|
|
@@ -79,7 +81,7 @@ def _val_to_quirk_formula(t: Union[float, sympy.Basic]) -> str:
|
|
|
79
81
|
return f'{float(t):.4f}'
|
|
80
82
|
|
|
81
83
|
|
|
82
|
-
def angle_to_exponent_key(t:
|
|
84
|
+
def angle_to_exponent_key(t: float | sympy.Basic) -> str | None:
|
|
83
85
|
if isinstance(t, sympy.Basic):
|
|
84
86
|
if t == sympy.Symbol('t'):
|
|
85
87
|
return '^t'
|
|
@@ -107,11 +109,10 @@ def angle_to_exponent_key(t: Union[float, sympy.Basic]) -> Optional[str]:
|
|
|
107
109
|
return None
|
|
108
110
|
|
|
109
111
|
|
|
110
|
-
def single_qubit_matrix_gate(matrix:
|
|
112
|
+
def single_qubit_matrix_gate(matrix: np.ndarray | None) -> QuirkOp | None:
|
|
111
113
|
if matrix is None or matrix.shape[0] != 2:
|
|
112
114
|
return None
|
|
113
115
|
|
|
114
|
-
# pylint: disable=consider-using-f-string
|
|
115
116
|
matrix = matrix.round(6)
|
|
116
117
|
matrix_repr = '{{%s+%si,%s+%si},{%s+%si,%s+%si}}' % (
|
|
117
118
|
np.real(matrix[0, 0]),
|
|
@@ -135,7 +136,7 @@ def single_qubit_matrix_gate(matrix: Optional[np.ndarray]) -> Optional[QuirkOp]:
|
|
|
135
136
|
return QuirkOp({'id': '?', 'matrix': matrix_repr})
|
|
136
137
|
|
|
137
138
|
|
|
138
|
-
def known_quirk_op_for_operation(op: ops.Operation) ->
|
|
139
|
+
def known_quirk_op_for_operation(op: ops.Operation) -> QuirkOp | None:
|
|
139
140
|
if isinstance(op, ops.GateOperation):
|
|
140
141
|
return _gate_to_quirk_op(op.gate)
|
|
141
142
|
if isinstance(op, ops.ControlledOperation):
|
|
@@ -143,7 +144,7 @@ def known_quirk_op_for_operation(op: ops.Operation) -> Optional[QuirkOp]:
|
|
|
143
144
|
return None
|
|
144
145
|
|
|
145
146
|
|
|
146
|
-
def _gate_to_quirk_op(gate: ops.Gate) ->
|
|
147
|
+
def _gate_to_quirk_op(gate: ops.Gate) -> QuirkOp | None:
|
|
147
148
|
for gate_type, func in _known_gate_conversions.items():
|
|
148
149
|
if isinstance(gate, gate_type):
|
|
149
150
|
return func(gate)
|
|
@@ -176,45 +177,45 @@ def z_to_quirk_op(gate: ops.ZPowGate) -> QuirkOp:
|
|
|
176
177
|
return xyz_to_quirk_op('z', gate)
|
|
177
178
|
|
|
178
179
|
|
|
179
|
-
def cz_to_quirk_op(gate: ops.CZPowGate) ->
|
|
180
|
+
def cz_to_quirk_op(gate: ops.CZPowGate) -> QuirkOp | None:
|
|
180
181
|
return z_to_quirk_op(ops.Z**gate.exponent).controlled()
|
|
181
182
|
|
|
182
183
|
|
|
183
|
-
def cnot_to_quirk_op(gate: ops.CXPowGate) ->
|
|
184
|
+
def cnot_to_quirk_op(gate: ops.CXPowGate) -> QuirkOp | None:
|
|
184
185
|
return x_to_quirk_op(ops.X**gate.exponent).controlled()
|
|
185
186
|
|
|
186
187
|
|
|
187
|
-
def h_to_quirk_op(gate: ops.HPowGate) ->
|
|
188
|
+
def h_to_quirk_op(gate: ops.HPowGate) -> QuirkOp | None:
|
|
188
189
|
if gate.exponent == 1:
|
|
189
190
|
return QuirkOp('H')
|
|
190
191
|
return None
|
|
191
192
|
|
|
192
193
|
|
|
193
|
-
def swap_to_quirk_op(gate: ops.SwapPowGate) ->
|
|
194
|
+
def swap_to_quirk_op(gate: ops.SwapPowGate) -> QuirkOp | None:
|
|
194
195
|
if gate.exponent == 1:
|
|
195
196
|
return QuirkOp('Swap', 'Swap', can_merge=False)
|
|
196
197
|
return None
|
|
197
198
|
|
|
198
199
|
|
|
199
|
-
def cswap_to_quirk_op(gate: ops.CSwapGate) ->
|
|
200
|
+
def cswap_to_quirk_op(gate: ops.CSwapGate) -> QuirkOp | None:
|
|
200
201
|
return QuirkOp('•', 'Swap', 'Swap', can_merge=False)
|
|
201
202
|
|
|
202
203
|
|
|
203
|
-
def ccx_to_quirk_op(gate: ops.CCXPowGate) ->
|
|
204
|
+
def ccx_to_quirk_op(gate: ops.CCXPowGate) -> QuirkOp | None:
|
|
204
205
|
e = angle_to_exponent_key(gate.exponent)
|
|
205
206
|
if e is None:
|
|
206
207
|
return None
|
|
207
208
|
return QuirkOp('•', '•', 'X' + e, can_merge=False)
|
|
208
209
|
|
|
209
210
|
|
|
210
|
-
def ccz_to_quirk_op(gate: ops.CCZPowGate) ->
|
|
211
|
+
def ccz_to_quirk_op(gate: ops.CCZPowGate) -> QuirkOp | None:
|
|
211
212
|
e = angle_to_exponent_key(gate.exponent)
|
|
212
213
|
if e is None:
|
|
213
214
|
return None
|
|
214
215
|
return QuirkOp('•', '•', 'Z' + e, can_merge=False)
|
|
215
216
|
|
|
216
217
|
|
|
217
|
-
def controlled_unwrap(op: ops.ControlledOperation) ->
|
|
218
|
+
def controlled_unwrap(op: ops.ControlledOperation) -> QuirkOp | None:
|
|
218
219
|
sub = known_quirk_op_for_operation(op.sub_operation)
|
|
219
220
|
if sub is None:
|
|
220
221
|
return None
|
|
@@ -222,7 +223,7 @@ def controlled_unwrap(op: ops.ControlledOperation) -> Optional[QuirkOp]:
|
|
|
222
223
|
|
|
223
224
|
|
|
224
225
|
_known_gate_conversions = cast(
|
|
225
|
-
|
|
226
|
+
dict[type, Callable[[ops.Gate], QuirkOp | None]],
|
|
226
227
|
{
|
|
227
228
|
ops.CCXPowGate: ccx_to_quirk_op,
|
|
228
229
|
ops.CCZPowGate: ccz_to_quirk_op,
|
cirq/contrib/routing/device.py
CHANGED
|
@@ -12,8 +12,10 @@
|
|
|
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
|
-
from typing import
|
|
18
|
+
from typing import Iterable
|
|
17
19
|
|
|
18
20
|
import networkx as nx
|
|
19
21
|
|
|
@@ -45,7 +47,7 @@ def _manhattan_distance(qubit1: cirq.GridQubit, qubit2: cirq.GridQubit) -> int:
|
|
|
45
47
|
return abs(qubit1.row - qubit2.row) + abs(qubit1.col - qubit2.col)
|
|
46
48
|
|
|
47
49
|
|
|
48
|
-
def nx_qubit_layout(graph: nx.Graph) ->
|
|
50
|
+
def nx_qubit_layout(graph: nx.Graph) -> dict[cirq.Qid, tuple[float, float]]:
|
|
49
51
|
"""Return a layout for a graph for nodes which are qubits.
|
|
50
52
|
|
|
51
53
|
This can be used in place of nx.spring_layout or other networkx layouts.
|
|
@@ -62,7 +64,7 @@ def nx_qubit_layout(graph: nx.Graph) -> Dict[cirq.Qid, Tuple[float, float]]:
|
|
|
62
64
|
>>> nx.draw_networkx(g, pos=pos)
|
|
63
65
|
|
|
64
66
|
"""
|
|
65
|
-
pos:
|
|
67
|
+
pos: dict[cirq.Qid, tuple[float, float]] = {}
|
|
66
68
|
|
|
67
69
|
_node_to_i_cache = None
|
|
68
70
|
for node in graph.nodes:
|