cirq-core 1.5.0.dev20250409222543__py3-none-any.whl → 1.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of cirq-core might be problematic. Click here for more details.
- cirq/__init__.py +16 -17
- cirq/_compat.py +21 -20
- cirq/_compat_test.py +14 -34
- cirq/_doc.py +4 -2
- cirq/_import.py +8 -6
- cirq/_import_test.py +4 -2
- cirq/_version.py +6 -6
- cirq/_version_test.py +2 -2
- cirq/circuits/_block_diagram_drawer.py +11 -10
- cirq/circuits/_block_diagram_drawer_test.py +8 -6
- cirq/circuits/_box_drawing_character_data.py +8 -8
- cirq/circuits/_box_drawing_character_data_test.py +3 -1
- cirq/circuits/_bucket_priority_queue.py +9 -7
- cirq/circuits/_bucket_priority_queue_test.py +22 -20
- cirq/circuits/circuit.py +248 -172
- cirq/circuits/circuit_operation.py +73 -83
- cirq/circuits/circuit_operation_test.py +128 -90
- cirq/circuits/circuit_test.py +211 -151
- cirq/circuits/frozen_circuit.py +23 -60
- cirq/circuits/frozen_circuit_test.py +31 -8
- cirq/circuits/insert_strategy.py +7 -5
- cirq/circuits/insert_strategy_test.py +4 -2
- cirq/circuits/moment.py +88 -40
- cirq/circuits/moment_test.py +128 -51
- cirq/circuits/optimization_pass.py +5 -5
- cirq/circuits/optimization_pass_test.py +10 -10
- cirq/circuits/qasm_output.py +11 -11
- cirq/circuits/qasm_output_test.py +25 -22
- cirq/circuits/text_diagram_drawer.py +23 -38
- cirq/circuits/text_diagram_drawer_test.py +19 -17
- cirq/conftest.py +4 -3
- cirq/contrib/__init__.py +4 -4
- cirq/contrib/acquaintance/__init__.py +1 -1
- cirq/contrib/acquaintance/bipartite.py +5 -8
- cirq/contrib/acquaintance/bipartite_test.py +18 -13
- cirq/contrib/acquaintance/devices.py +2 -2
- cirq/contrib/acquaintance/devices_test.py +5 -3
- cirq/contrib/acquaintance/executor.py +5 -5
- cirq/contrib/acquaintance/executor_test.py +13 -9
- cirq/contrib/acquaintance/gates.py +18 -28
- cirq/contrib/acquaintance/gates_test.py +24 -20
- cirq/contrib/acquaintance/inspection_utils.py +8 -4
- cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
- cirq/contrib/acquaintance/mutation_utils.py +4 -4
- cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
- cirq/contrib/acquaintance/optimizers.py +4 -4
- cirq/contrib/acquaintance/optimizers_test.py +4 -1
- cirq/contrib/acquaintance/permutation.py +15 -27
- cirq/contrib/acquaintance/permutation_test.py +26 -17
- cirq/contrib/acquaintance/shift.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
- cirq/contrib/acquaintance/shift_test.py +8 -6
- cirq/contrib/acquaintance/strategies/cubic.py +2 -2
- cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
- cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
- cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
- cirq/contrib/acquaintance/testing.py +2 -0
- cirq/contrib/acquaintance/topological_sort.py +2 -2
- cirq/contrib/acquaintance/topological_sort_test.py +3 -1
- cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
- cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
- cirq/contrib/circuitdag/circuit_dag.py +4 -4
- cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
- cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
- cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
- cirq/contrib/graph_device/graph_device.py +12 -11
- cirq/contrib/graph_device/graph_device_test.py +18 -14
- cirq/contrib/graph_device/hypergraph.py +16 -14
- cirq/contrib/graph_device/hypergraph_test.py +13 -11
- cirq/contrib/graph_device/uniform_graph_device.py +6 -4
- cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
- cirq/contrib/hacks/disable_validation.py +6 -1
- cirq/contrib/hacks/disable_validation_test.py +3 -1
- cirq/contrib/json.py +31 -5
- cirq/contrib/json_test.py +6 -3
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/__init__.py +17 -0
- cirq/contrib/json_test_data/spec.py +32 -0
- cirq/contrib/noise_models/noise_models.py +119 -5
- cirq/contrib/noise_models/noise_models_test.py +37 -9
- cirq/contrib/paulistring/clifford_optimize.py +6 -4
- cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
- cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
- cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
- cirq/contrib/paulistring/optimize.py +2 -0
- cirq/contrib/paulistring/optimize_test.py +4 -3
- cirq/contrib/paulistring/pauli_string_dag.py +2 -0
- cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
- cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
- cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
- cirq/contrib/paulistring/recombine.py +6 -4
- cirq/contrib/paulistring/recombine_test.py +3 -1
- cirq/contrib/paulistring/separate.py +9 -6
- cirq/contrib/paulistring/separate_test.py +3 -1
- cirq/contrib/qasm_import/_lexer.py +3 -2
- cirq/contrib/qasm_import/_lexer_test.py +49 -13
- cirq/contrib/qasm_import/_parser.py +547 -83
- cirq/contrib/qasm_import/_parser_test.py +988 -97
- cirq/contrib/qasm_import/exception.py +2 -0
- cirq/contrib/qasm_import/qasm.py +8 -2
- cirq/contrib/qasm_import/qasm_test.py +7 -4
- cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
- cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
- cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
- cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
- cirq/contrib/qcircuit/qcircuit_test.py +10 -8
- cirq/contrib/quantum_volume/quantum_volume.py +31 -27
- cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
- cirq/contrib/quimb/density_matrix.py +15 -14
- cirq/contrib/quimb/density_matrix_test.py +10 -7
- cirq/contrib/quimb/grid_circuits.py +5 -2
- cirq/contrib/quimb/grid_circuits_test.py +3 -0
- cirq/contrib/quimb/mps_simulator.py +20 -20
- cirq/contrib/quimb/mps_simulator_test.py +3 -0
- cirq/contrib/quimb/state_vector.py +12 -11
- cirq/contrib/quimb/state_vector_test.py +3 -0
- cirq/contrib/quirk/export_to_quirk.py +5 -3
- cirq/contrib/quirk/export_to_quirk_test.py +18 -16
- cirq/contrib/quirk/linearize_circuit.py +2 -0
- cirq/contrib/quirk/quirk_gate.py +18 -17
- cirq/contrib/routing/device.py +5 -3
- cirq/contrib/routing/device_test.py +2 -0
- cirq/contrib/routing/greedy.py +10 -21
- cirq/contrib/routing/greedy_test.py +4 -2
- cirq/contrib/routing/initialization.py +2 -2
- cirq/contrib/routing/initialization_test.py +5 -3
- cirq/contrib/routing/router.py +9 -5
- cirq/contrib/routing/router_test.py +2 -0
- cirq/contrib/routing/swap_network.py +3 -3
- cirq/contrib/routing/swap_network_test.py +3 -1
- cirq/contrib/routing/utils.py +2 -2
- cirq/contrib/routing/utils_test.py +3 -0
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
- cirq/contrib/svg/svg.py +3 -3
- cirq/contrib/svg/svg_test.py +8 -5
- cirq/devices/device.py +4 -4
- cirq/devices/device_test.py +7 -4
- cirq/devices/grid_device_metadata.py +10 -10
- cirq/devices/grid_device_metadata_test.py +3 -0
- cirq/devices/grid_qubit.py +29 -21
- cirq/devices/grid_qubit_test.py +3 -0
- cirq/devices/insertion_noise_model.py +7 -7
- cirq/devices/insertion_noise_model_test.py +7 -5
- cirq/devices/line_qubit.py +13 -13
- cirq/devices/line_qubit_test.py +2 -0
- cirq/devices/named_topologies.py +18 -29
- cirq/devices/named_topologies_test.py +13 -10
- cirq/devices/noise_model.py +3 -3
- cirq/devices/noise_model_test.py +19 -15
- cirq/devices/noise_properties.py +15 -6
- cirq/devices/noise_properties_test.py +34 -3
- cirq/devices/noise_utils.py +11 -9
- cirq/devices/noise_utils_test.py +2 -0
- cirq/devices/superconducting_qubits_noise_properties.py +23 -22
- cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
- cirq/devices/thermal_noise_model.py +107 -37
- cirq/devices/thermal_noise_model_test.py +21 -0
- cirq/devices/unconstrained_device.py +5 -3
- cirq/devices/unconstrained_device_test.py +2 -0
- cirq/experiments/__init__.py +4 -2
- cirq/experiments/benchmarking/__init__.py +17 -0
- cirq/experiments/benchmarking/parallel_xeb.py +677 -0
- cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
- cirq/experiments/fidelity_estimation.py +14 -8
- cirq/experiments/fidelity_estimation_test.py +3 -0
- cirq/experiments/n_qubit_tomography.py +17 -16
- cirq/experiments/n_qubit_tomography_test.py +8 -5
- cirq/experiments/purity_estimation.py +2 -0
- cirq/experiments/purity_estimation_test.py +2 -0
- cirq/experiments/qubit_characterizations.py +207 -103
- cirq/experiments/qubit_characterizations_test.py +40 -12
- cirq/experiments/random_quantum_circuit_generation.py +56 -70
- cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
- cirq/experiments/readout_confusion_matrix.py +24 -22
- cirq/experiments/readout_confusion_matrix_test.py +2 -0
- cirq/experiments/single_qubit_readout_calibration.py +30 -15
- cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
- cirq/experiments/t1_decay_experiment.py +9 -7
- cirq/experiments/t1_decay_experiment_test.py +13 -11
- cirq/experiments/t2_decay_experiment.py +16 -13
- cirq/experiments/t2_decay_experiment_test.py +2 -0
- cirq/experiments/two_qubit_xeb.py +64 -57
- cirq/experiments/two_qubit_xeb_test.py +10 -6
- cirq/experiments/xeb_fitting.py +39 -35
- cirq/experiments/xeb_sampling.py +37 -44
- cirq/experiments/xeb_sampling_test.py +3 -0
- cirq/experiments/xeb_simulation.py +14 -10
- cirq/experiments/xeb_simulation_test.py +5 -5
- cirq/experiments/z_phase_calibration.py +32 -29
- cirq/experiments/z_phase_calibration_test.py +3 -4
- cirq/interop/quirk/cells/__init__.py +1 -1
- cirq/interop/quirk/cells/all_cells.py +7 -2
- cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
- cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
- cirq/interop/quirk/cells/cell.py +19 -28
- cirq/interop/quirk/cells/cell_test.py +3 -0
- cirq/interop/quirk/cells/composite_cell.py +13 -28
- cirq/interop/quirk/cells/composite_cell_test.py +2 -0
- cirq/interop/quirk/cells/control_cells.py +15 -15
- cirq/interop/quirk/cells/control_cells_test.py +7 -5
- cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
- cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
- cirq/interop/quirk/cells/ignored_cells.py +3 -0
- cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
- cirq/interop/quirk/cells/input_cells.py +7 -5
- cirq/interop/quirk/cells/input_cells_test.py +7 -5
- cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
- cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
- cirq/interop/quirk/cells/measurement_cells.py +5 -2
- cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
- cirq/interop/quirk/cells/parse.py +22 -23
- cirq/interop/quirk/cells/parse_test.py +12 -10
- cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
- cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
- cirq/interop/quirk/cells/scalar_cells.py +4 -1
- cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
- cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
- cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
- cirq/interop/quirk/cells/swap_cell.py +8 -6
- cirq/interop/quirk/cells/swap_cell_test.py +6 -4
- cirq/interop/quirk/cells/testing.py +6 -6
- cirq/interop/quirk/cells/testing_test.py +8 -6
- cirq/interop/quirk/cells/unsupported_cells.py +3 -0
- cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
- cirq/interop/quirk/url_to_circuit.py +23 -36
- cirq/interop/quirk/url_to_circuit_test.py +4 -1
- cirq/json_resolver_cache.py +14 -12
- cirq/linalg/__init__.py +4 -6
- cirq/linalg/combinators.py +7 -5
- cirq/linalg/combinators_test.py +10 -7
- cirq/linalg/decompositions.py +24 -35
- cirq/linalg/decompositions_test.py +3 -1
- cirq/linalg/diagonalize.py +6 -4
- cirq/linalg/diagonalize_test.py +15 -14
- cirq/linalg/operator_spaces.py +14 -14
- cirq/linalg/operator_spaces_test.py +13 -11
- cirq/linalg/predicates.py +18 -9
- cirq/linalg/predicates_test.py +5 -0
- cirq/linalg/tolerance.py +6 -3
- cirq/linalg/tolerance_test.py +6 -4
- cirq/linalg/transformations.py +23 -20
- cirq/linalg/transformations_test.py +73 -43
- cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
- cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
- cirq/neutral_atoms/neutral_atom_devices.py +2 -0
- cirq/ops/__init__.py +2 -0
- cirq/ops/arithmetic_operation.py +21 -21
- cirq/ops/arithmetic_operation_test.py +7 -8
- cirq/ops/boolean_hamiltonian.py +23 -22
- cirq/ops/boolean_hamiltonian_test.py +12 -9
- cirq/ops/classically_controlled_operation.py +31 -36
- cirq/ops/classically_controlled_operation_test.py +121 -117
- cirq/ops/clifford_gate.py +98 -81
- cirq/ops/clifford_gate_test.py +72 -57
- cirq/ops/common_channels.py +44 -44
- cirq/ops/common_channels_test.py +83 -81
- cirq/ops/common_gate_families.py +9 -7
- cirq/ops/common_gate_families_test.py +11 -7
- cirq/ops/common_gates.py +164 -183
- cirq/ops/common_gates_test.py +135 -95
- cirq/ops/control_values.py +23 -26
- cirq/ops/control_values_test.py +22 -20
- cirq/ops/controlled_gate.py +64 -112
- cirq/ops/controlled_gate_test.py +130 -35
- cirq/ops/controlled_operation.py +24 -35
- cirq/ops/controlled_operation_test.py +8 -6
- cirq/ops/dense_pauli_string.py +38 -49
- cirq/ops/dense_pauli_string_test.py +4 -2
- cirq/ops/diagonal_gate.py +18 -31
- cirq/ops/diagonal_gate_test.py +13 -13
- cirq/ops/eigen_gate.py +29 -29
- cirq/ops/eigen_gate_test.py +45 -28
- cirq/ops/fourier_transform.py +14 -20
- cirq/ops/fourier_transform_test.py +15 -12
- cirq/ops/fsim_gate.py +43 -42
- cirq/ops/fsim_gate_test.py +29 -29
- cirq/ops/gate_features.py +2 -0
- cirq/ops/gate_features_test.py +5 -3
- cirq/ops/gate_operation.py +43 -65
- cirq/ops/gate_operation_test.py +46 -42
- cirq/ops/gateset.py +28 -40
- cirq/ops/gateset_test.py +4 -2
- cirq/ops/global_phase_op.py +45 -20
- cirq/ops/global_phase_op_test.py +44 -20
- cirq/ops/greedy_qubit_manager.py +10 -8
- cirq/ops/greedy_qubit_manager_test.py +5 -3
- cirq/ops/identity.py +14 -12
- cirq/ops/identity_test.py +24 -20
- cirq/ops/kraus_channel.py +11 -8
- cirq/ops/kraus_channel_test.py +14 -11
- cirq/ops/linear_combinations.py +65 -77
- cirq/ops/linear_combinations_test.py +14 -9
- cirq/ops/matrix_gates.py +21 -18
- cirq/ops/matrix_gates_test.py +16 -0
- cirq/ops/measure_util.py +15 -20
- cirq/ops/measure_util_test.py +2 -0
- cirq/ops/measurement_gate.py +26 -37
- cirq/ops/measurement_gate_test.py +2 -0
- cirq/ops/mixed_unitary_channel.py +12 -9
- cirq/ops/mixed_unitary_channel_test.py +14 -11
- cirq/ops/named_qubit.py +16 -13
- cirq/ops/named_qubit_test.py +15 -13
- cirq/ops/op_tree.py +9 -7
- cirq/ops/op_tree_test.py +22 -19
- cirq/ops/parallel_gate.py +15 -17
- cirq/ops/parallel_gate_test.py +18 -16
- cirq/ops/parity_gates.py +23 -25
- cirq/ops/parity_gates_test.py +36 -32
- cirq/ops/pauli_gates.py +22 -21
- cirq/ops/pauli_gates_test.py +29 -20
- cirq/ops/pauli_interaction_gate.py +15 -19
- cirq/ops/pauli_interaction_gate_test.py +10 -8
- cirq/ops/pauli_measurement_gate.py +23 -35
- cirq/ops/pauli_measurement_gate_test.py +2 -0
- cirq/ops/pauli_string.py +92 -120
- cirq/ops/pauli_string_phasor.py +52 -45
- cirq/ops/pauli_string_phasor_test.py +4 -5
- cirq/ops/pauli_string_raw_types.py +9 -7
- cirq/ops/pauli_string_raw_types_test.py +2 -0
- cirq/ops/pauli_string_test.py +31 -154
- cirq/ops/pauli_sum_exponential.py +12 -12
- cirq/ops/pauli_sum_exponential_test.py +12 -10
- cirq/ops/permutation_gate.py +8 -6
- cirq/ops/permutation_gate_test.py +10 -8
- cirq/ops/phased_iswap_gate.py +16 -16
- cirq/ops/phased_iswap_gate_test.py +17 -15
- cirq/ops/phased_x_gate.py +16 -17
- cirq/ops/phased_x_gate_test.py +18 -16
- cirq/ops/phased_x_z_gate.py +24 -22
- cirq/ops/phased_x_z_gate_test.py +17 -11
- cirq/ops/projector.py +16 -11
- cirq/ops/projector_test.py +19 -16
- cirq/ops/qid_util.py +7 -5
- cirq/ops/qid_util_test.py +2 -0
- cirq/ops/qubit_manager.py +11 -9
- cirq/ops/qubit_manager_test.py +6 -4
- cirq/ops/qubit_order.py +11 -14
- cirq/ops/qubit_order_or_list.py +4 -2
- cirq/ops/qubit_order_test.py +12 -10
- cirq/ops/random_gate_channel.py +12 -10
- cirq/ops/random_gate_channel_test.py +14 -11
- cirq/ops/raw_types.py +109 -129
- cirq/ops/raw_types_test.py +63 -57
- cirq/ops/state_preparation_channel.py +7 -7
- cirq/ops/state_preparation_channel_test.py +11 -9
- cirq/ops/swap_gates.py +13 -15
- cirq/ops/swap_gates_test.py +19 -17
- cirq/ops/tags.py +5 -3
- cirq/ops/tags_test.py +4 -2
- cirq/ops/three_qubit_gates.py +43 -76
- cirq/ops/three_qubit_gates_test.py +19 -17
- cirq/ops/two_qubit_diagonal_gate.py +13 -13
- cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
- cirq/ops/uniform_superposition_gate.py +5 -3
- cirq/ops/uniform_superposition_gate_test.py +5 -3
- cirq/ops/wait_gate.py +17 -14
- cirq/ops/wait_gate_test.py +9 -6
- cirq/protocols/__init__.py +0 -3
- cirq/protocols/act_on_protocol.py +8 -6
- cirq/protocols/act_on_protocol_test.py +15 -12
- cirq/protocols/apply_channel_protocol.py +10 -14
- cirq/protocols/apply_channel_protocol_test.py +2 -0
- cirq/protocols/apply_mixture_protocol.py +13 -42
- cirq/protocols/apply_mixture_protocol_test.py +7 -5
- cirq/protocols/apply_unitary_protocol.py +39 -34
- cirq/protocols/apply_unitary_protocol_test.py +4 -1
- cirq/protocols/approximate_equality_protocol.py +2 -0
- cirq/protocols/approximate_equality_protocol_test.py +2 -0
- cirq/protocols/circuit_diagram_info_protocol.py +58 -42
- cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
- cirq/protocols/commutes_protocol.py +8 -7
- cirq/protocols/commutes_protocol_test.py +2 -0
- cirq/protocols/control_key_protocol.py +6 -4
- cirq/protocols/control_key_protocol_test.py +3 -1
- cirq/protocols/decompose_protocol.py +49 -48
- cirq/protocols/decompose_protocol_test.py +27 -16
- cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
- cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
- cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
- cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
- cirq/protocols/has_unitary_protocol.py +10 -6
- cirq/protocols/has_unitary_protocol_test.py +13 -8
- cirq/protocols/hash_from_pickle_test.py +2 -11
- cirq/protocols/inverse_protocol.py +13 -16
- cirq/protocols/inverse_protocol_test.py +5 -3
- cirq/protocols/json_serialization.py +35 -54
- cirq/protocols/json_serialization_test.py +14 -21
- cirq/protocols/json_test_data/CXSWAP.json +46 -0
- cirq/protocols/json_test_data/CXSWAP.repr +13 -0
- cirq/protocols/json_test_data/CZSWAP.json +46 -0
- cirq/protocols/json_test_data/CZSWAP.repr +13 -0
- cirq/protocols/json_test_data/CircuitOperation.json +6 -3
- cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
- cirq/protocols/json_test_data/Moment.json +24 -1
- cirq/protocols/json_test_data/Moment.repr +6 -1
- cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
- cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
- cirq/protocols/json_test_data/spec.py +6 -2
- cirq/protocols/kraus_protocol.py +47 -7
- cirq/protocols/kraus_protocol_test.py +86 -12
- cirq/protocols/measurement_key_protocol.py +15 -16
- cirq/protocols/measurement_key_protocol_test.py +13 -11
- cirq/protocols/mixture_protocol.py +7 -5
- cirq/protocols/mixture_protocol_test.py +4 -2
- cirq/protocols/mul_protocol.py +2 -3
- cirq/protocols/mul_protocol_test.py +2 -0
- cirq/protocols/pauli_expansion_protocol.py +6 -3
- cirq/protocols/pauli_expansion_protocol_test.py +5 -3
- cirq/protocols/phase_protocol.py +2 -0
- cirq/protocols/phase_protocol_test.py +3 -1
- cirq/protocols/pow_protocol.py +11 -16
- cirq/protocols/pow_protocol_test.py +2 -0
- cirq/protocols/qasm.py +14 -20
- cirq/protocols/qasm_test.py +6 -3
- cirq/protocols/qid_shape_protocol.py +8 -8
- cirq/protocols/qid_shape_protocol_test.py +3 -1
- cirq/protocols/resolve_parameters.py +5 -3
- cirq/protocols/resolve_parameters_test.py +8 -7
- cirq/protocols/trace_distance_bound.py +6 -4
- cirq/protocols/trace_distance_bound_test.py +3 -1
- cirq/protocols/unitary_protocol.py +17 -7
- cirq/protocols/unitary_protocol_test.py +12 -2
- cirq/qis/channels.py +6 -2
- cirq/qis/channels_test.py +20 -16
- cirq/qis/clifford_tableau.py +21 -19
- cirq/qis/clifford_tableau_test.py +2 -2
- cirq/qis/entropy.py +14 -3
- cirq/qis/entropy_test.py +3 -1
- cirq/qis/measures.py +13 -13
- cirq/qis/measures_test.py +20 -14
- cirq/qis/noise_utils.py +2 -0
- cirq/qis/noise_utils_test.py +9 -7
- cirq/qis/quantum_state_representation.py +7 -8
- cirq/qis/states.py +58 -56
- cirq/qis/states_test.py +2 -0
- cirq/sim/classical_simulator.py +23 -22
- cirq/sim/classical_simulator_test.py +2 -0
- cirq/sim/clifford/clifford_simulator.py +23 -21
- cirq/sim/clifford/clifford_simulator_test.py +7 -4
- cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
- cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
- cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
- cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
- cirq/sim/clifford/stabilizer_sampler.py +9 -7
- cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
- cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
- cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
- cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
- cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
- cirq/sim/density_matrix_simulation_state.py +26 -27
- cirq/sim/density_matrix_simulation_state_test.py +10 -8
- cirq/sim/density_matrix_simulator.py +30 -28
- cirq/sim/density_matrix_simulator_test.py +48 -48
- cirq/sim/density_matrix_utils.py +13 -11
- cirq/sim/density_matrix_utils_test.py +38 -36
- cirq/sim/mux.py +33 -31
- cirq/sim/mux_test.py +3 -0
- cirq/sim/simulation_product_state.py +15 -15
- cirq/sim/simulation_product_state_test.py +29 -26
- cirq/sim/simulation_state.py +29 -38
- cirq/sim/simulation_state_base.py +21 -32
- cirq/sim/simulation_state_test.py +15 -13
- cirq/sim/simulation_utils.py +5 -2
- cirq/sim/simulation_utils_test.py +5 -2
- cirq/sim/simulator.py +90 -106
- cirq/sim/simulator_base.py +33 -45
- cirq/sim/simulator_base_test.py +20 -15
- cirq/sim/simulator_test.py +23 -14
- cirq/sim/sparse_simulator.py +19 -17
- cirq/sim/sparse_simulator_test.py +41 -40
- cirq/sim/state_vector.py +15 -12
- cirq/sim/state_vector_simulation_state.py +31 -31
- cirq/sim/state_vector_simulation_state_test.py +16 -14
- cirq/sim/state_vector_simulator.py +17 -14
- cirq/sim/state_vector_simulator_test.py +2 -0
- cirq/sim/state_vector_test.py +6 -3
- cirq/study/flatten_expressions.py +16 -15
- cirq/study/flatten_expressions_test.py +13 -11
- cirq/study/resolver.py +18 -17
- cirq/study/resolver_test.py +22 -20
- cirq/study/result.py +17 -27
- cirq/study/result_test.py +2 -0
- cirq/study/sweepable.py +12 -10
- cirq/study/sweepable_test.py +3 -0
- cirq/study/sweeps.py +42 -61
- cirq/study/sweeps_test.py +33 -0
- cirq/testing/__init__.py +7 -11
- cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
- cirq/testing/circuit_compare.py +8 -17
- cirq/testing/circuit_compare_test.py +2 -0
- cirq/testing/consistent_act_on.py +13 -11
- cirq/testing/consistent_act_on_test.py +5 -3
- cirq/testing/consistent_channels.py +2 -0
- cirq/testing/consistent_channels_test.py +10 -8
- cirq/testing/consistent_controlled_gate_op.py +5 -5
- cirq/testing/consistent_controlled_gate_op_test.py +18 -18
- cirq/testing/consistent_decomposition.py +2 -2
- cirq/testing/consistent_decomposition_test.py +4 -2
- cirq/testing/consistent_pauli_expansion.py +2 -0
- cirq/testing/consistent_pauli_expansion_test.py +3 -1
- cirq/testing/consistent_phase_by.py +2 -0
- cirq/testing/consistent_phase_by_test.py +3 -1
- cirq/testing/consistent_protocols.py +14 -20
- cirq/testing/consistent_protocols_test.py +13 -11
- cirq/testing/consistent_qasm.py +6 -4
- cirq/testing/consistent_qasm_test.py +7 -7
- cirq/testing/consistent_resolve_parameters.py +2 -0
- cirq/testing/consistent_specified_has_unitary.py +2 -2
- cirq/testing/consistent_specified_has_unitary_test.py +6 -4
- cirq/testing/consistent_unitary.py +1 -0
- cirq/testing/consistent_unitary_test.py +4 -2
- cirq/testing/deprecation.py +5 -2
- cirq/testing/deprecation_test.py +5 -2
- cirq/testing/devices.py +7 -4
- cirq/testing/devices_test.py +7 -4
- cirq/testing/equals_tester.py +4 -2
- cirq/testing/equals_tester_test.py +21 -17
- cirq/testing/equivalent_basis_map.py +6 -4
- cirq/testing/equivalent_basis_map_test.py +6 -4
- cirq/testing/equivalent_repr_eval.py +6 -4
- cirq/testing/equivalent_repr_eval_test.py +5 -3
- cirq/testing/gate_features.py +2 -0
- cirq/testing/gate_features_test.py +7 -5
- cirq/testing/json.py +19 -15
- cirq/testing/json_test.py +5 -3
- cirq/testing/lin_alg_utils.py +10 -11
- cirq/testing/lin_alg_utils_test.py +14 -12
- cirq/testing/logs.py +7 -6
- cirq/testing/logs_test.py +9 -7
- cirq/testing/no_identifier_qubit.py +4 -2
- cirq/testing/no_identifier_qubit_test.py +5 -3
- cirq/testing/op_tree.py +2 -0
- cirq/testing/op_tree_test.py +4 -1
- cirq/testing/order_tester.py +2 -0
- cirq/testing/order_tester_test.py +8 -6
- cirq/testing/pytest_utils.py +2 -0
- cirq/testing/pytest_utils_test.py +4 -2
- cirq/testing/random_circuit.py +21 -20
- cirq/testing/random_circuit_test.py +12 -9
- cirq/testing/repr_pretty_tester.py +1 -0
- cirq/testing/repr_pretty_tester_test.py +5 -3
- cirq/testing/routing_devices.py +4 -1
- cirq/testing/routing_devices_test.py +9 -6
- cirq/testing/sample_circuits.py +4 -1
- cirq/testing/sample_circuits_test.py +3 -1
- cirq/testing/sample_gates.py +3 -0
- cirq/testing/sample_gates_test.py +5 -2
- cirq/transformers/__init__.py +11 -4
- cirq/transformers/align.py +9 -7
- cirq/transformers/align_test.py +2 -0
- cirq/transformers/analytical_decompositions/__init__.py +3 -6
- cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
- cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
- cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
- cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
- cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
- cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
- cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
- cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
- cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
- cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
- cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
- cirq/transformers/drop_empty_moments.py +5 -3
- cirq/transformers/drop_empty_moments_test.py +4 -2
- cirq/transformers/drop_negligible_operations.py +7 -5
- cirq/transformers/drop_negligible_operations_test.py +2 -0
- cirq/transformers/dynamical_decoupling.py +49 -42
- cirq/transformers/dynamical_decoupling_test.py +223 -205
- cirq/transformers/eject_phased_paulis.py +28 -26
- cirq/transformers/eject_phased_paulis_test.py +12 -9
- cirq/transformers/eject_z.py +12 -12
- cirq/transformers/eject_z_test.py +2 -2
- cirq/transformers/expand_composite.py +6 -4
- cirq/transformers/expand_composite_test.py +3 -1
- cirq/transformers/gauge_compiling/__init__.py +3 -1
- cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
- cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
- cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
- cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
- cirq/transformers/insertion_sort.py +8 -6
- cirq/transformers/insertion_sort_test.py +3 -1
- cirq/transformers/measurement_transformers.py +29 -29
- cirq/transformers/measurement_transformers_test.py +2 -0
- cirq/transformers/merge_k_qubit_gates.py +12 -10
- cirq/transformers/merge_k_qubit_gates_test.py +18 -18
- cirq/transformers/merge_single_qubit_gates.py +197 -20
- cirq/transformers/merge_single_qubit_gates_test.py +177 -5
- cirq/transformers/noise_adding.py +5 -3
- cirq/transformers/noise_adding_test.py +2 -0
- cirq/transformers/optimize_for_target_gateset.py +19 -17
- cirq/transformers/optimize_for_target_gateset_test.py +11 -8
- cirq/transformers/qubit_management_transformers.py +13 -11
- cirq/transformers/qubit_management_transformers_test.py +5 -3
- cirq/transformers/randomized_measurements.py +16 -14
- cirq/transformers/randomized_measurements_test.py +10 -4
- cirq/transformers/routing/initial_mapper.py +6 -4
- cirq/transformers/routing/initial_mapper_test.py +2 -0
- cirq/transformers/routing/line_initial_mapper.py +16 -14
- cirq/transformers/routing/line_initial_mapper_test.py +9 -7
- cirq/transformers/routing/mapping_manager.py +10 -10
- cirq/transformers/routing/mapping_manager_test.py +2 -0
- cirq/transformers/routing/route_circuit_cqc.py +33 -31
- cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
- cirq/transformers/routing/visualize_routed_circuit.py +8 -7
- cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
- cirq/transformers/stratify.py +17 -15
- cirq/transformers/stratify_test.py +3 -0
- cirq/transformers/symbolize.py +103 -0
- cirq/transformers/symbolize_test.py +62 -0
- cirq/transformers/synchronize_terminal_measurements.py +10 -10
- cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
- cirq/transformers/tag_transformers.py +97 -0
- cirq/transformers/tag_transformers_test.py +103 -0
- cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
- cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
- cirq/transformers/target_gatesets/cz_gateset.py +7 -5
- cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
- cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
- cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
- cirq/transformers/transformer_api.py +34 -47
- cirq/transformers/transformer_api_test.py +9 -8
- cirq/transformers/transformer_primitives.py +39 -49
- cirq/transformers/transformer_primitives_test.py +10 -17
- cirq/value/abc_alt.py +6 -4
- cirq/value/abc_alt_test.py +5 -3
- cirq/value/angle.py +11 -12
- cirq/value/angle_test.py +5 -3
- cirq/value/classical_data.py +27 -27
- cirq/value/classical_data_test.py +11 -8
- cirq/value/condition.py +26 -24
- cirq/value/condition_test.py +2 -0
- cirq/value/digits.py +14 -11
- cirq/value/digits_test.py +2 -0
- cirq/value/duration.py +23 -20
- cirq/value/duration_test.py +2 -0
- cirq/value/linear_dict.py +25 -30
- cirq/value/linear_dict_test.py +10 -8
- cirq/value/measurement_key.py +12 -12
- cirq/value/measurement_key_test.py +2 -0
- cirq/value/periodic_value.py +4 -4
- cirq/value/periodic_value_test.py +11 -7
- cirq/value/probability.py +3 -1
- cirq/value/probability_test.py +4 -2
- cirq/value/product_state.py +15 -13
- cirq/value/product_state_test.py +4 -1
- cirq/value/random_state.py +2 -0
- cirq/value/random_state_test.py +5 -3
- cirq/value/timestamp.py +11 -7
- cirq/value/timestamp_test.py +14 -12
- cirq/value/type_alias.py +4 -4
- cirq/value/value_equality_attr.py +8 -9
- cirq/value/value_equality_attr_test.py +14 -11
- cirq/vis/density_matrix.py +3 -3
- cirq/vis/density_matrix_test.py +20 -17
- cirq/vis/heatmap.py +24 -37
- cirq/vis/heatmap_test.py +3 -0
- cirq/vis/histogram.py +9 -6
- cirq/vis/histogram_test.py +5 -2
- cirq/vis/state_histogram.py +10 -8
- cirq/vis/state_histogram_test.py +7 -5
- cirq/vis/vis_utils.py +4 -1
- cirq/vis/vis_utils_test.py +4 -1
- cirq/work/collector.py +12 -18
- cirq/work/collector_test.py +15 -10
- cirq/work/observable_grouping.py +6 -7
- cirq/work/observable_grouping_test.py +10 -9
- cirq/work/observable_measurement.py +47 -45
- cirq/work/observable_measurement_data.py +22 -17
- cirq/work/observable_measurement_data_test.py +4 -1
- cirq/work/observable_measurement_test.py +48 -29
- cirq/work/observable_readout_calibration.py +5 -2
- cirq/work/observable_readout_calibration_test.py +5 -2
- cirq/work/observable_settings.py +13 -22
- cirq/work/observable_settings_test.py +9 -7
- cirq/work/pauli_sum_collector.py +12 -10
- cirq/work/pauli_sum_collector_test.py +9 -9
- cirq/work/sampler.py +42 -43
- cirq/work/sampler_test.py +31 -24
- cirq/work/zeros_sampler.py +6 -4
- cirq/work/zeros_sampler_test.py +7 -5
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
- cirq_core-1.6.0.dist-info/RECORD +1241 -0
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
- cirq_core-1.5.0.dev20250409222543.dist-info/RECORD +0 -1216
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
cirq/ops/boolean_hamiltonian.py
CHANGED
|
@@ -22,9 +22,12 @@ References:
|
|
|
22
22
|
[4] Efficient Quantum Circuits for Diagonal Unitaries Without Ancillas by Jonathan Welch, Daniel
|
|
23
23
|
Greenbaum, Sarah Mostame, and Alán Aspuru-Guzik, https://arxiv.org/abs/1306.3991
|
|
24
24
|
"""
|
|
25
|
+
|
|
26
|
+
from __future__ import annotations
|
|
27
|
+
|
|
25
28
|
import functools
|
|
26
29
|
import itertools
|
|
27
|
-
from typing import Any,
|
|
30
|
+
from typing import Any, Generator, Sequence
|
|
28
31
|
|
|
29
32
|
import sympy.parsing.sympy_parser as sympy_parser
|
|
30
33
|
|
|
@@ -77,13 +80,13 @@ class BooleanHamiltonianGate(raw_types.Gate):
|
|
|
77
80
|
self._boolean_strs: Sequence[str] = boolean_strs
|
|
78
81
|
self._theta: float = theta
|
|
79
82
|
|
|
80
|
-
def _qid_shape_(self) ->
|
|
83
|
+
def _qid_shape_(self) -> tuple[int, ...]:
|
|
81
84
|
return (2,) * len(self._parameter_names)
|
|
82
85
|
|
|
83
86
|
def _value_equality_values_(self) -> Any:
|
|
84
87
|
return tuple(self._parameter_names), tuple(self._boolean_strs), self._theta
|
|
85
88
|
|
|
86
|
-
def _json_dict_(self) ->
|
|
89
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
87
90
|
return {
|
|
88
91
|
'parameter_names': self._parameter_names,
|
|
89
92
|
'boolean_strs': self._boolean_strs,
|
|
@@ -93,10 +96,10 @@ class BooleanHamiltonianGate(raw_types.Gate):
|
|
|
93
96
|
@classmethod
|
|
94
97
|
def _from_json_dict_(
|
|
95
98
|
cls, parameter_names, boolean_strs, theta, **kwargs
|
|
96
|
-
) ->
|
|
99
|
+
) -> cirq.BooleanHamiltonianGate:
|
|
97
100
|
return cls(parameter_names, boolean_strs, theta)
|
|
98
101
|
|
|
99
|
-
def _decompose_(self, qubits: Sequence[
|
|
102
|
+
def _decompose_(self, qubits: Sequence[cirq.Qid]) -> cirq.OP_TREE:
|
|
100
103
|
qubit_map = dict(zip(self._parameter_names, qubits))
|
|
101
104
|
boolean_exprs = [sympy_parser.parse_expr(boolean_str) for boolean_str in self._boolean_strs]
|
|
102
105
|
hamiltonian_polynomial_list = [
|
|
@@ -118,7 +121,7 @@ class BooleanHamiltonianGate(raw_types.Gate):
|
|
|
118
121
|
)
|
|
119
122
|
|
|
120
123
|
|
|
121
|
-
def _gray_code_comparator(k1:
|
|
124
|
+
def _gray_code_comparator(k1: tuple[int, ...], k2: tuple[int, ...], flip: bool = False) -> int:
|
|
122
125
|
"""Compares two Gray-encoded binary numbers.
|
|
123
126
|
|
|
124
127
|
Args:
|
|
@@ -141,8 +144,8 @@ def _gray_code_comparator(k1: Tuple[int, ...], k2: Tuple[int, ...], flip: bool =
|
|
|
141
144
|
|
|
142
145
|
|
|
143
146
|
def _simplify_commuting_cnots(
|
|
144
|
-
cnots:
|
|
145
|
-
) ->
|
|
147
|
+
cnots: list[tuple[int, int]], flip_control_and_target: bool
|
|
148
|
+
) -> tuple[bool, list[tuple[int, int]]]:
|
|
146
149
|
"""Attempts to commute CNOTs and remove cancelling pairs.
|
|
147
150
|
|
|
148
151
|
Commutation relations are based on 9 (flip_control_and_target=False) or 10
|
|
@@ -181,7 +184,7 @@ def _simplify_commuting_cnots(
|
|
|
181
184
|
target, control = (0, 1) if flip_control_and_target else (1, 0)
|
|
182
185
|
|
|
183
186
|
to_remove = set()
|
|
184
|
-
qubit_to_index:
|
|
187
|
+
qubit_to_index: list[tuple[int, dict[int, int]]] = []
|
|
185
188
|
for j in range(len(cnots)):
|
|
186
189
|
if not qubit_to_index or cnots[j][target] != qubit_to_index[-1][0]:
|
|
187
190
|
# The targets (resp. control) don't match, so we create a new dict.
|
|
@@ -202,8 +205,8 @@ def _simplify_commuting_cnots(
|
|
|
202
205
|
|
|
203
206
|
|
|
204
207
|
def _simplify_cnots_triplets(
|
|
205
|
-
cnots:
|
|
206
|
-
) ->
|
|
208
|
+
cnots: list[tuple[int, int]], flip_control_and_target: bool
|
|
209
|
+
) -> tuple[bool, list[tuple[int, int]]]:
|
|
207
210
|
"""Simplifies CNOT pairs according to equation 11 of [4].
|
|
208
211
|
|
|
209
212
|
CNOT(i, j) @ CNOT(j, k) == CNOT(j, k) @ CNOT(i, k) @ CNOT(i, j)
|
|
@@ -228,7 +231,7 @@ def _simplify_cnots_triplets(
|
|
|
228
231
|
# First, we look back for as long as the controls (resp. targets) are the same.
|
|
229
232
|
# They all commute, so all are potential candidates for being simplified.
|
|
230
233
|
# prev_match_index is qubit to index in `cnots` array.
|
|
231
|
-
prev_match_index:
|
|
234
|
+
prev_match_index: dict[int, int] = {}
|
|
232
235
|
for i in range(j - 1, -1, -1):
|
|
233
236
|
# These CNOTs have the same target (resp. control) and though they are not candidates
|
|
234
237
|
# for simplification, since they commute, we can keep looking for candidates.
|
|
@@ -242,7 +245,7 @@ def _simplify_cnots_triplets(
|
|
|
242
245
|
# Next, we look forward for as long as the targets (resp. controls) are the
|
|
243
246
|
# same. They all commute, so all are potential candidates for being simplified.
|
|
244
247
|
# post_match_index is qubit to index in `cnots` array.
|
|
245
|
-
post_match_index:
|
|
248
|
+
post_match_index: dict[int, int] = {}
|
|
246
249
|
for k in range(j + 1, len(cnots)):
|
|
247
250
|
# These CNOTs have the same control (resp. target) and though they are not candidates
|
|
248
251
|
# for simplification, since they commute, we can keep looking for candidates.
|
|
@@ -257,7 +260,7 @@ def _simplify_cnots_triplets(
|
|
|
257
260
|
keys = prev_match_index.keys() & post_match_index.keys()
|
|
258
261
|
for key in keys:
|
|
259
262
|
# We perform the swap which removes the pivot.
|
|
260
|
-
new_idx:
|
|
263
|
+
new_idx: list[int] = (
|
|
261
264
|
# Anything strictly before the pivot that is not the CNOT to swap.
|
|
262
265
|
[idx for idx in range(j) if idx != prev_match_index[key]]
|
|
263
266
|
# The two swapped CNOTs.
|
|
@@ -272,7 +275,7 @@ def _simplify_cnots_triplets(
|
|
|
272
275
|
return False, cnots
|
|
273
276
|
|
|
274
277
|
|
|
275
|
-
def _simplify_cnots(cnots:
|
|
278
|
+
def _simplify_cnots(cnots: list[tuple[int, int]]) -> list[tuple[int, int]]:
|
|
276
279
|
"""Takes a series of CNOTs and tries to applies rule to cancel out gates.
|
|
277
280
|
|
|
278
281
|
Algorithm based on "Efficient quantum circuits for diagonal unitaries without ancillas" by
|
|
@@ -299,10 +302,8 @@ def _simplify_cnots(cnots: List[Tuple[int, int]]) -> List[Tuple[int, int]]:
|
|
|
299
302
|
|
|
300
303
|
|
|
301
304
|
def _get_gates_from_hamiltonians(
|
|
302
|
-
hamiltonian_polynomial_list:
|
|
303
|
-
|
|
304
|
-
theta: float,
|
|
305
|
-
) -> Generator['cirq.Operation', None, None]:
|
|
305
|
+
hamiltonian_polynomial_list: list[cirq.PauliSum], qubit_map: dict[str, cirq.Qid], theta: float
|
|
306
|
+
) -> Generator[cirq.Operation, None, None]:
|
|
306
307
|
"""Builds a circuit according to [1].
|
|
307
308
|
|
|
308
309
|
Args:
|
|
@@ -325,8 +326,8 @@ def _get_gates_from_hamiltonians(
|
|
|
325
326
|
qubit_idx = tuple(sorted(qubit_indices[qubit] for qubit in pauli_string.qubits))
|
|
326
327
|
hamiltonians[qubit_idx] = w
|
|
327
328
|
|
|
328
|
-
def _apply_cnots(prevh:
|
|
329
|
-
cnots:
|
|
329
|
+
def _apply_cnots(prevh: tuple[int, ...], currh: tuple[int, ...]):
|
|
330
|
+
cnots: list[tuple[int, int]] = []
|
|
330
331
|
|
|
331
332
|
cnots.extend((prevh[i], prevh[-1]) for i in range(len(prevh) - 1))
|
|
332
333
|
cnots.extend((currh[i], currh[-1]) for i in range(len(currh) - 1))
|
|
@@ -340,7 +341,7 @@ def _get_gates_from_hamiltonians(
|
|
|
340
341
|
hamiltonians.keys(), key=functools.cmp_to_key(_gray_code_comparator)
|
|
341
342
|
)
|
|
342
343
|
|
|
343
|
-
previous_h:
|
|
344
|
+
previous_h: tuple[int, ...] = ()
|
|
344
345
|
for h in sorted_hamiltonian_keys:
|
|
345
346
|
w = hamiltonians[h]
|
|
346
347
|
yield _apply_cnots(previous_h, h)
|
|
@@ -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 functools
|
|
15
18
|
import itertools
|
|
16
19
|
import math
|
|
@@ -53,7 +56,7 @@ import cirq.ops.boolean_hamiltonian as bh
|
|
|
53
56
|
'(x2 | x1) ^ x0',
|
|
54
57
|
],
|
|
55
58
|
)
|
|
56
|
-
def test_circuit(boolean_str):
|
|
59
|
+
def test_circuit(boolean_str) -> None:
|
|
57
60
|
boolean_expr = sympy_parser.parse_expr(boolean_str)
|
|
58
61
|
var_names = cirq.parameter_names(boolean_expr)
|
|
59
62
|
qubits = [cirq.NamedQubit(name) for name in var_names]
|
|
@@ -73,7 +76,7 @@ def test_circuit(boolean_str):
|
|
|
73
76
|
circuit.append(cirq.H.on_each(*qubits))
|
|
74
77
|
|
|
75
78
|
hamiltonian_gate = cirq.BooleanHamiltonianGate(
|
|
76
|
-
|
|
79
|
+
[q.name for q in qubits], [boolean_str], 0.1 * math.pi
|
|
77
80
|
)
|
|
78
81
|
|
|
79
82
|
assert hamiltonian_gate.num_qubits() == n
|
|
@@ -87,7 +90,7 @@ def test_circuit(boolean_str):
|
|
|
87
90
|
np.testing.assert_array_equal(actual, expected)
|
|
88
91
|
|
|
89
92
|
|
|
90
|
-
def test_gate_with_custom_names():
|
|
93
|
+
def test_gate_with_custom_names() -> None:
|
|
91
94
|
q0, q1, q2, q3 = cirq.LineQubit.range(4)
|
|
92
95
|
gate = cirq.BooleanHamiltonianGate(['a', 'b'], ['a'], 0.1)
|
|
93
96
|
assert cirq.decompose(gate.on(q0, q1)) == [cirq.Rz(rads=-0.05).on(q0)]
|
|
@@ -101,7 +104,7 @@ def test_gate_with_custom_names():
|
|
|
101
104
|
gate.on(q0, cirq.LineQid(1, 3))
|
|
102
105
|
|
|
103
106
|
|
|
104
|
-
def test_gate_consistent():
|
|
107
|
+
def test_gate_consistent() -> None:
|
|
105
108
|
gate = cirq.BooleanHamiltonianGate(['a', 'b'], ['a'], 0.1)
|
|
106
109
|
op = gate.on(*cirq.LineQubit.range(2))
|
|
107
110
|
cirq.testing.assert_implements_consistent_protocols(gate)
|
|
@@ -116,7 +119,7 @@ def test_gate_consistent():
|
|
|
116
119
|
(3, [(), (0,), (0, 1), (1,), (1, 2), (0, 1, 2), (0, 2), (2,)]),
|
|
117
120
|
],
|
|
118
121
|
)
|
|
119
|
-
def test_gray_code_sorting(n_bits, expected_hs):
|
|
122
|
+
def test_gray_code_sorting(n_bits, expected_hs) -> None:
|
|
120
123
|
hs_template = []
|
|
121
124
|
for x in range(2**n_bits):
|
|
122
125
|
h = []
|
|
@@ -139,7 +142,7 @@ def test_gray_code_sorting(n_bits, expected_hs):
|
|
|
139
142
|
@pytest.mark.parametrize(
|
|
140
143
|
'seq_a,seq_b,expected', [((), (), 0), ((), (0,), -1), ((0,), (), 1), ((0,), (0,), 0)]
|
|
141
144
|
)
|
|
142
|
-
def test_gray_code_comparison(seq_a, seq_b, expected):
|
|
145
|
+
def test_gray_code_comparison(seq_a, seq_b, expected) -> None:
|
|
143
146
|
assert bh._gray_code_comparator(seq_a, seq_b) == expected
|
|
144
147
|
|
|
145
148
|
|
|
@@ -170,7 +173,7 @@ def test_gray_code_comparison(seq_a, seq_b, expected):
|
|
|
170
173
|
)
|
|
171
174
|
def test_simplify_commuting_cnots(
|
|
172
175
|
input_cnots, input_flip_control_and_target, expected_simplified, expected_output_cnots
|
|
173
|
-
):
|
|
176
|
+
) -> None:
|
|
174
177
|
actual_simplified, actual_output_cnots = bh._simplify_commuting_cnots(
|
|
175
178
|
input_cnots, input_flip_control_and_target
|
|
176
179
|
)
|
|
@@ -203,7 +206,7 @@ def test_simplify_commuting_cnots(
|
|
|
203
206
|
)
|
|
204
207
|
def test_simplify_cnots_triplets(
|
|
205
208
|
input_cnots, input_flip_control_and_target, expected_simplified, expected_output_cnots
|
|
206
|
-
):
|
|
209
|
+
) -> None:
|
|
207
210
|
actual_simplified, actual_output_cnots = bh._simplify_cnots_triplets(
|
|
208
211
|
input_cnots, input_flip_control_and_target
|
|
209
212
|
)
|
|
@@ -211,7 +214,7 @@ def test_simplify_cnots_triplets(
|
|
|
211
214
|
assert actual_output_cnots == expected_output_cnots
|
|
212
215
|
|
|
213
216
|
# Check that the unitaries are the same.
|
|
214
|
-
qubit_ids = set(
|
|
217
|
+
qubit_ids = set(itertools.chain.from_iterable(input_cnots))
|
|
215
218
|
qubits = {qubit_id: cirq.NamedQubit(f"{qubit_id}") for qubit_id in qubit_ids}
|
|
216
219
|
|
|
217
220
|
target, control = (0, 1) if input_flip_control_and_target else (1, 0)
|
|
@@ -11,19 +11,10 @@
|
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
FrozenSet,
|
|
19
|
-
List,
|
|
20
|
-
Mapping,
|
|
21
|
-
Optional,
|
|
22
|
-
Sequence,
|
|
23
|
-
Tuple,
|
|
24
|
-
TYPE_CHECKING,
|
|
25
|
-
Union,
|
|
26
|
-
)
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import AbstractSet, Any, cast, Mapping, Sequence, TYPE_CHECKING
|
|
27
18
|
|
|
28
19
|
import sympy
|
|
29
20
|
|
|
@@ -79,8 +70,8 @@ class ClassicallyControlledOperation(raw_types.Operation):
|
|
|
79
70
|
|
|
80
71
|
def __init__(
|
|
81
72
|
self,
|
|
82
|
-
sub_operation:
|
|
83
|
-
conditions: Sequence[
|
|
73
|
+
sub_operation: cirq.Operation,
|
|
74
|
+
conditions: Sequence[str | cirq.MeasurementKey | cirq.Condition | sympy.Basic],
|
|
84
75
|
):
|
|
85
76
|
"""Initializes a `ClassicallyControlledOperation`.
|
|
86
77
|
|
|
@@ -106,7 +97,7 @@ class ClassicallyControlledOperation(raw_types.Operation):
|
|
|
106
97
|
if isinstance(sub_operation, ClassicallyControlledOperation):
|
|
107
98
|
conditions += sub_operation._conditions
|
|
108
99
|
sub_operation = sub_operation._sub_operation
|
|
109
|
-
conds:
|
|
100
|
+
conds: list[cirq.Condition] = []
|
|
110
101
|
for c in conditions:
|
|
111
102
|
if isinstance(c, str):
|
|
112
103
|
c = value.MeasurementKey.parse_serialized(c)
|
|
@@ -115,14 +106,14 @@ class ClassicallyControlledOperation(raw_types.Operation):
|
|
|
115
106
|
if isinstance(c, sympy.Basic):
|
|
116
107
|
c = value.SympyCondition(c)
|
|
117
108
|
conds.append(c)
|
|
118
|
-
self._conditions:
|
|
119
|
-
self._sub_operation:
|
|
109
|
+
self._conditions: tuple[cirq.Condition, ...] = tuple(conds)
|
|
110
|
+
self._sub_operation: cirq.Operation = sub_operation
|
|
120
111
|
|
|
121
112
|
@property
|
|
122
|
-
def classical_controls(self) ->
|
|
113
|
+
def classical_controls(self) -> frozenset[cirq.Condition]:
|
|
123
114
|
return frozenset(self._conditions).union(self._sub_operation.classical_controls)
|
|
124
115
|
|
|
125
|
-
def without_classical_controls(self) ->
|
|
116
|
+
def without_classical_controls(self) -> cirq.Operation:
|
|
126
117
|
return self._sub_operation.without_classical_controls()
|
|
127
118
|
|
|
128
119
|
@property
|
|
@@ -137,7 +128,7 @@ class ClassicallyControlledOperation(raw_types.Operation):
|
|
|
137
128
|
def _decompose_(self):
|
|
138
129
|
return self._decompose_with_context_()
|
|
139
130
|
|
|
140
|
-
def _decompose_with_context_(self, context:
|
|
131
|
+
def _decompose_with_context_(self, context: cirq.DecompositionContext | None = None):
|
|
141
132
|
result = protocols.decompose_once(
|
|
142
133
|
self._sub_operation, NotImplemented, flatten=False, context=context
|
|
143
134
|
)
|
|
@@ -168,14 +159,14 @@ class ClassicallyControlledOperation(raw_types.Operation):
|
|
|
168
159
|
return protocols.parameter_names(self._sub_operation)
|
|
169
160
|
|
|
170
161
|
def _resolve_parameters_(
|
|
171
|
-
self, resolver:
|
|
172
|
-
) ->
|
|
162
|
+
self, resolver: cirq.ParamResolver, recursive: bool
|
|
163
|
+
) -> ClassicallyControlledOperation:
|
|
173
164
|
new_sub_op = protocols.resolve_parameters(self._sub_operation, resolver, recursive)
|
|
174
165
|
return ClassicallyControlledOperation(new_sub_op, self._conditions)
|
|
175
166
|
|
|
176
167
|
def _circuit_diagram_info_(
|
|
177
|
-
self, args:
|
|
178
|
-
) ->
|
|
168
|
+
self, args: cirq.CircuitDiagramInfoArgs
|
|
169
|
+
) -> protocols.CircuitDiagramInfo | None:
|
|
179
170
|
sub_args = protocols.CircuitDiagramInfoArgs(
|
|
180
171
|
known_qubit_count=args.known_qubit_count,
|
|
181
172
|
known_qubits=args.known_qubits,
|
|
@@ -207,42 +198,46 @@ class ClassicallyControlledOperation(raw_types.Operation):
|
|
|
207
198
|
wire_symbols=wire_symbols, exponent=sub_info.exponent, exponent_qubit_index=exp_index
|
|
208
199
|
)
|
|
209
200
|
|
|
210
|
-
def _json_dict_(self) ->
|
|
201
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
211
202
|
return {'conditions': self._conditions, 'sub_operation': self._sub_operation}
|
|
212
203
|
|
|
213
|
-
def _act_on_(self, sim_state:
|
|
204
|
+
def _act_on_(self, sim_state: cirq.SimulationStateBase) -> bool:
|
|
214
205
|
if all(c.resolve(sim_state.classical_data) for c in self._conditions):
|
|
215
206
|
protocols.act_on(self._sub_operation, sim_state)
|
|
216
207
|
return True
|
|
217
208
|
|
|
218
209
|
def _with_measurement_key_mapping_(
|
|
219
210
|
self, key_map: Mapping[str, str]
|
|
220
|
-
) ->
|
|
211
|
+
) -> ClassicallyControlledOperation:
|
|
221
212
|
conditions = [protocols.with_measurement_key_mapping(c, key_map) for c in self._conditions]
|
|
222
213
|
sub_operation = protocols.with_measurement_key_mapping(self._sub_operation, key_map)
|
|
223
214
|
sub_operation = self._sub_operation if sub_operation is NotImplemented else sub_operation
|
|
224
|
-
return
|
|
215
|
+
return cast(
|
|
216
|
+
ClassicallyControlledOperation, sub_operation.with_classical_controls(*conditions)
|
|
217
|
+
)
|
|
225
218
|
|
|
226
|
-
def _with_key_path_prefix_(self, prefix:
|
|
219
|
+
def _with_key_path_prefix_(self, prefix: tuple[str, ...]) -> ClassicallyControlledOperation:
|
|
227
220
|
conditions = [protocols.with_key_path_prefix(c, prefix) for c in self._conditions]
|
|
228
221
|
sub_operation = protocols.with_key_path_prefix(self._sub_operation, prefix)
|
|
229
222
|
sub_operation = self._sub_operation if sub_operation is NotImplemented else sub_operation
|
|
230
|
-
return
|
|
223
|
+
return cast(
|
|
224
|
+
ClassicallyControlledOperation, sub_operation.with_classical_controls(*conditions)
|
|
225
|
+
)
|
|
231
226
|
|
|
232
227
|
def _with_rescoped_keys_(
|
|
233
|
-
self, path:
|
|
234
|
-
) ->
|
|
228
|
+
self, path: tuple[str, ...], bindable_keys: frozenset[cirq.MeasurementKey]
|
|
229
|
+
) -> ClassicallyControlledOperation:
|
|
235
230
|
conds = [protocols.with_rescoped_keys(c, path, bindable_keys) for c in self._conditions]
|
|
236
231
|
sub_operation = protocols.with_rescoped_keys(self._sub_operation, path, bindable_keys)
|
|
237
232
|
return sub_operation.with_classical_controls(*conds)
|
|
238
233
|
|
|
239
|
-
def _control_keys_(self) ->
|
|
240
|
-
local_keys:
|
|
234
|
+
def _control_keys_(self) -> frozenset[cirq.MeasurementKey]:
|
|
235
|
+
local_keys: frozenset[cirq.MeasurementKey] = frozenset(
|
|
241
236
|
k for condition in self._conditions for k in condition.keys
|
|
242
237
|
)
|
|
243
238
|
return local_keys.union(protocols.control_keys(self._sub_operation))
|
|
244
239
|
|
|
245
|
-
def _qasm_(self, args:
|
|
240
|
+
def _qasm_(self, args: cirq.QasmArgs) -> str | None:
|
|
246
241
|
args.validate_version('2.0', '3.0')
|
|
247
242
|
if len(self._conditions) > 1:
|
|
248
243
|
raise ValueError('QASM does not support multiple conditions.')
|