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
|
@@ -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 cast
|
|
16
18
|
from unittest import mock
|
|
17
19
|
|
|
18
20
|
import numpy as np
|
|
@@ -21,7 +23,7 @@ import pytest
|
|
|
21
23
|
import cirq
|
|
22
24
|
|
|
23
25
|
|
|
24
|
-
def test_default_parameter():
|
|
26
|
+
def test_default_parameter() -> None:
|
|
25
27
|
dtype = np.complex64
|
|
26
28
|
tensor = cirq.one_hot(shape=(2, 2, 2), dtype=np.complex64)
|
|
27
29
|
qubits = cirq.LineQubit.range(3)
|
|
@@ -33,7 +35,7 @@ def test_default_parameter():
|
|
|
33
35
|
assert args.available_buffer.dtype == tensor.dtype
|
|
34
36
|
|
|
35
37
|
|
|
36
|
-
def test_infer_target_tensor():
|
|
38
|
+
def test_infer_target_tensor() -> None:
|
|
37
39
|
dtype = np.complex64
|
|
38
40
|
args = cirq.StateVectorSimulationState(
|
|
39
41
|
qubits=cirq.LineQubit.range(2),
|
|
@@ -54,13 +56,13 @@ def test_infer_target_tensor():
|
|
|
54
56
|
)
|
|
55
57
|
|
|
56
58
|
|
|
57
|
-
def test_shallow_copy_buffers():
|
|
59
|
+
def test_shallow_copy_buffers() -> None:
|
|
58
60
|
args = cirq.StateVectorSimulationState(qubits=cirq.LineQubit.range(1), initial_state=0)
|
|
59
61
|
copy = args.copy(deep_copy_buffers=False)
|
|
60
62
|
assert copy.available_buffer is args.available_buffer
|
|
61
63
|
|
|
62
64
|
|
|
63
|
-
def test_decomposed_fallback():
|
|
65
|
+
def test_decomposed_fallback() -> None:
|
|
64
66
|
class Composite(cirq.Gate):
|
|
65
67
|
def num_qubits(self) -> int:
|
|
66
68
|
return 1 # pragma: no cover
|
|
@@ -82,7 +84,7 @@ def test_decomposed_fallback():
|
|
|
82
84
|
)
|
|
83
85
|
|
|
84
86
|
|
|
85
|
-
def test_cannot_act():
|
|
87
|
+
def test_cannot_act() -> None:
|
|
86
88
|
class NoDetails:
|
|
87
89
|
pass
|
|
88
90
|
|
|
@@ -98,7 +100,7 @@ def test_cannot_act():
|
|
|
98
100
|
cirq.act_on(NoDetails(), args, qubits=())
|
|
99
101
|
|
|
100
102
|
|
|
101
|
-
def test_act_using_probabilistic_single_qubit_channel():
|
|
103
|
+
def test_act_using_probabilistic_single_qubit_channel() -> None:
|
|
102
104
|
class ProbabilisticSorX(cirq.Gate):
|
|
103
105
|
def num_qubits(self) -> int:
|
|
104
106
|
return 1
|
|
@@ -148,7 +150,7 @@ def test_act_using_probabilistic_single_qubit_channel():
|
|
|
148
150
|
)
|
|
149
151
|
|
|
150
152
|
|
|
151
|
-
def test_act_using_adaptive_two_qubit_channel():
|
|
153
|
+
def test_act_using_adaptive_two_qubit_channel() -> None:
|
|
152
154
|
class Decay11(cirq.Gate):
|
|
153
155
|
def num_qubits(self) -> int:
|
|
154
156
|
return 2
|
|
@@ -171,7 +173,7 @@ def test_act_using_adaptive_two_qubit_channel():
|
|
|
171
173
|
qubits=cirq.LineQubit.range(4),
|
|
172
174
|
prng=mock_prng,
|
|
173
175
|
initial_state=np.copy(state),
|
|
174
|
-
dtype=cast(
|
|
176
|
+
dtype=cast(type[np.complexfloating], state.dtype),
|
|
175
177
|
)
|
|
176
178
|
cirq.act_on(Decay11(), args, [cirq.LineQubit(1), cirq.LineQubit(3)])
|
|
177
179
|
return args.target_tensor
|
|
@@ -210,7 +212,7 @@ def test_act_using_adaptive_two_qubit_channel():
|
|
|
210
212
|
assert_not_affected(projected_state, sample=3 / 4 + 1e-8)
|
|
211
213
|
|
|
212
214
|
|
|
213
|
-
def test_probability_comes_up_short_results_in_fallback():
|
|
215
|
+
def test_probability_comes_up_short_results_in_fallback() -> None:
|
|
214
216
|
class Short(cirq.Gate):
|
|
215
217
|
def num_qubits(self) -> int:
|
|
216
218
|
return 1
|
|
@@ -234,7 +236,7 @@ def test_probability_comes_up_short_results_in_fallback():
|
|
|
234
236
|
np.testing.assert_allclose(args.target_tensor, np.array([0, 1]))
|
|
235
237
|
|
|
236
238
|
|
|
237
|
-
def test_random_channel_has_random_behavior():
|
|
239
|
+
def test_random_channel_has_random_behavior() -> None:
|
|
238
240
|
q = cirq.LineQubit(0)
|
|
239
241
|
s = cirq.Simulator().sample(
|
|
240
242
|
cirq.Circuit(cirq.X(q), cirq.amplitude_damp(0.4).on(q), cirq.measure(q, key='out')),
|
|
@@ -245,7 +247,7 @@ def test_random_channel_has_random_behavior():
|
|
|
245
247
|
assert v[1] > 1
|
|
246
248
|
|
|
247
249
|
|
|
248
|
-
def test_measured_channel():
|
|
250
|
+
def test_measured_channel() -> None:
|
|
249
251
|
# This behaves like an X-basis measurement.
|
|
250
252
|
kc = cirq.KrausChannel(
|
|
251
253
|
kraus_ops=(np.array([[1, 1], [1, 1]]) * 0.5, np.array([[1, -1], [-1, 1]]) * 0.5), key='m'
|
|
@@ -257,7 +259,7 @@ def test_measured_channel():
|
|
|
257
259
|
assert results.histogram(key='m') == {0: 100}
|
|
258
260
|
|
|
259
261
|
|
|
260
|
-
def test_measured_mixture():
|
|
262
|
+
def test_measured_mixture() -> None:
|
|
261
263
|
# This behaves like an X-basis measurement.
|
|
262
264
|
mm = cirq.MixedUnitaryChannel(
|
|
263
265
|
mixture=((0.5, np.array([[1, 0], [0, 1]])), (0.5, np.array([[0, 1], [1, 0]]))), key='flip'
|
|
@@ -269,6 +271,6 @@ def test_measured_mixture():
|
|
|
269
271
|
assert results.histogram(key='flip') == results.histogram(key='m')
|
|
270
272
|
|
|
271
273
|
|
|
272
|
-
def test_qid_shape_error():
|
|
274
|
+
def test_qid_shape_error() -> None:
|
|
273
275
|
with pytest.raises(ValueError, match="qid_shape must be provided"):
|
|
274
276
|
cirq.sim.state_vector_simulation_state._BufferedStateVector.create(initial_state=0)
|
|
@@ -11,12 +11,15 @@
|
|
|
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
|
+
|
|
14
15
|
"""Abstract classes for simulations which keep track of state vector."""
|
|
15
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
16
19
|
import abc
|
|
17
20
|
import warnings
|
|
18
21
|
from functools import cached_property
|
|
19
|
-
from typing import Any,
|
|
22
|
+
from typing import Any, Generic, Iterator, Sequence, TYPE_CHECKING, TypeVar
|
|
20
23
|
|
|
21
24
|
import numpy as np
|
|
22
25
|
|
|
@@ -47,9 +50,9 @@ class SimulatesIntermediateStateVector(
|
|
|
47
50
|
def __init__(
|
|
48
51
|
self,
|
|
49
52
|
*,
|
|
50
|
-
dtype:
|
|
51
|
-
noise:
|
|
52
|
-
seed:
|
|
53
|
+
dtype: type[np.complexfloating] = np.complex64,
|
|
54
|
+
noise: cirq.NOISE_MODEL_LIKE = None,
|
|
55
|
+
seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
|
|
53
56
|
split_untangled_states: bool = False,
|
|
54
57
|
):
|
|
55
58
|
super().__init__(
|
|
@@ -58,20 +61,20 @@ class SimulatesIntermediateStateVector(
|
|
|
58
61
|
|
|
59
62
|
def _create_simulator_trial_result(
|
|
60
63
|
self,
|
|
61
|
-
params:
|
|
62
|
-
measurements:
|
|
63
|
-
final_simulator_state:
|
|
64
|
-
) ->
|
|
64
|
+
params: cirq.ParamResolver,
|
|
65
|
+
measurements: dict[str, np.ndarray],
|
|
66
|
+
final_simulator_state: cirq.SimulationStateBase[cirq.StateVectorSimulationState],
|
|
67
|
+
) -> cirq.StateVectorTrialResult:
|
|
65
68
|
return StateVectorTrialResult(
|
|
66
69
|
params=params, measurements=measurements, final_simulator_state=final_simulator_state
|
|
67
70
|
)
|
|
68
71
|
|
|
69
72
|
def compute_amplitudes_sweep_iter(
|
|
70
73
|
self,
|
|
71
|
-
program:
|
|
74
|
+
program: cirq.AbstractCircuit,
|
|
72
75
|
bitstrings: Sequence[int],
|
|
73
|
-
params:
|
|
74
|
-
qubit_order:
|
|
76
|
+
params: cirq.Sweepable,
|
|
77
|
+
qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
|
|
75
78
|
) -> Iterator[Sequence[complex]]:
|
|
76
79
|
if isinstance(bitstrings, np.ndarray) and len(bitstrings.shape) > 1:
|
|
77
80
|
raise ValueError(
|
|
@@ -112,9 +115,9 @@ class StateVectorTrialResult(
|
|
|
112
115
|
|
|
113
116
|
def __init__(
|
|
114
117
|
self,
|
|
115
|
-
params:
|
|
116
|
-
measurements:
|
|
117
|
-
final_simulator_state:
|
|
118
|
+
params: cirq.ParamResolver,
|
|
119
|
+
measurements: dict[str, np.ndarray],
|
|
120
|
+
final_simulator_state: cirq.SimulationStateBase[cirq.StateVectorSimulationState],
|
|
118
121
|
) -> None:
|
|
119
122
|
super().__init__(
|
|
120
123
|
params=params,
|
cirq/sim/state_vector_test.py
CHANGED
|
@@ -11,10 +11,13 @@
|
|
|
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
|
+
|
|
14
15
|
"""Tests for state_vector.py"""
|
|
15
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
16
19
|
import itertools
|
|
17
|
-
from typing import Iterator
|
|
20
|
+
from typing import Iterator
|
|
18
21
|
from unittest import mock
|
|
19
22
|
|
|
20
23
|
import numpy as np
|
|
@@ -34,7 +37,7 @@ def use_np_transpose(request) -> Iterator[bool]:
|
|
|
34
37
|
|
|
35
38
|
def test_state_mixin():
|
|
36
39
|
class TestClass(cirq.StateVectorMixin):
|
|
37
|
-
def state_vector(self, copy:
|
|
40
|
+
def state_vector(self, copy: bool | None = None) -> np.ndarray:
|
|
38
41
|
return np.array([0, 0, 1, 0])
|
|
39
42
|
|
|
40
43
|
qubits = cirq.LineQubit.range(2)
|
|
@@ -357,7 +360,7 @@ def test_measure_state_empty_state(use_np_transpose: bool):
|
|
|
357
360
|
|
|
358
361
|
|
|
359
362
|
class BasicStateVector(cirq.StateVectorMixin):
|
|
360
|
-
def state_vector(self, copy:
|
|
363
|
+
def state_vector(self, copy: bool | None = None) -> np.ndarray:
|
|
361
364
|
return np.array([0, 1, 0, 0])
|
|
362
365
|
|
|
363
366
|
|
|
@@ -11,10 +11,13 @@
|
|
|
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
|
+
|
|
14
15
|
"""Resolves symbolic expressions to unique symbols."""
|
|
15
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
16
19
|
import numbers
|
|
17
|
-
from typing import Any, Callable,
|
|
20
|
+
from typing import Any, Callable, TYPE_CHECKING
|
|
18
21
|
|
|
19
22
|
import sympy
|
|
20
23
|
|
|
@@ -25,7 +28,7 @@ if TYPE_CHECKING:
|
|
|
25
28
|
import cirq
|
|
26
29
|
|
|
27
30
|
|
|
28
|
-
def flatten(val: Any) ->
|
|
31
|
+
def flatten(val: Any) -> tuple[Any, ExpressionMap]:
|
|
29
32
|
"""Creates a copy of `val` with any symbols or expressions replaced with
|
|
30
33
|
new symbols. `val` can be a `Circuit`, `Gate`, `Operation`, or other
|
|
31
34
|
type.
|
|
@@ -111,8 +114,8 @@ def flatten(val: Any) -> Tuple[Any, 'ExpressionMap']:
|
|
|
111
114
|
|
|
112
115
|
|
|
113
116
|
def flatten_with_sweep(
|
|
114
|
-
val: Any, sweep:
|
|
115
|
-
) ->
|
|
117
|
+
val: Any, sweep: sweeps.Sweep | list[resolver.ParamResolver]
|
|
118
|
+
) -> tuple[Any, sweeps.Sweep]:
|
|
116
119
|
"""Creates a copy of `val` with any symbols or expressions replaced with
|
|
117
120
|
new symbols. `val` can be a `Circuit`, `Gate`, `Operation`, or other
|
|
118
121
|
type. Also transforms a sweep over the symbols in `val` to a sweep over the
|
|
@@ -146,7 +149,7 @@ def flatten_with_sweep(
|
|
|
146
149
|
|
|
147
150
|
def flatten_with_params(
|
|
148
151
|
val: Any, params: resolver.ParamResolverOrSimilarType
|
|
149
|
-
) ->
|
|
152
|
+
) -> tuple[Any, resolver.ParamDictType]:
|
|
150
153
|
"""Creates a copy of `val` with any symbols or expressions replaced with
|
|
151
154
|
new symbols. `val` can be a `Circuit`, `Gate`, `Operation`, or other
|
|
152
155
|
type. Also transforms a dictionary of symbol values for `val` to an
|
|
@@ -198,9 +201,9 @@ class _ParamFlattener(resolver.ParamResolver):
|
|
|
198
201
|
|
|
199
202
|
def __init__(
|
|
200
203
|
self,
|
|
201
|
-
param_dict:
|
|
204
|
+
param_dict: resolver.ParamResolverOrSimilarType | None = None,
|
|
202
205
|
*, # Force keyword args
|
|
203
|
-
get_param_name:
|
|
206
|
+
get_param_name: Callable[[sympy.Expr], str] | None = None,
|
|
204
207
|
):
|
|
205
208
|
"""Initializes a new _ParamFlattener.
|
|
206
209
|
|
|
@@ -250,8 +253,8 @@ class _ParamFlattener(resolver.ParamResolver):
|
|
|
250
253
|
return symbol
|
|
251
254
|
|
|
252
255
|
def value_of(
|
|
253
|
-
self, value:
|
|
254
|
-
) ->
|
|
256
|
+
self, value: cirq.TParamKey | cirq.TParamValComplex, recursive: bool = False
|
|
257
|
+
) -> cirq.TParamValComplex:
|
|
255
258
|
"""Resolves a symbol or expression to a new symbol unique to that value.
|
|
256
259
|
|
|
257
260
|
- If value is a float, returns it.
|
|
@@ -326,9 +329,7 @@ class ExpressionMap(dict):
|
|
|
326
329
|
"""
|
|
327
330
|
super().__init__(*args, **kwargs)
|
|
328
331
|
|
|
329
|
-
def transform_sweep(
|
|
330
|
-
self, sweep: Union[sweeps.Sweep, List[resolver.ParamResolver]]
|
|
331
|
-
) -> sweeps.Sweep:
|
|
332
|
+
def transform_sweep(self, sweep: sweeps.Sweep | list[resolver.ParamResolver]) -> sweeps.Sweep:
|
|
332
333
|
"""Returns a sweep to use with a circuit flattened earlier with
|
|
333
334
|
`cirq.flatten`.
|
|
334
335
|
|
|
@@ -343,7 +344,7 @@ class ExpressionMap(dict):
|
|
|
343
344
|
sweep: The sweep to transform.
|
|
344
345
|
"""
|
|
345
346
|
sweep = sweepable.to_sweep(sweep)
|
|
346
|
-
param_list:
|
|
347
|
+
param_list: list[resolver.ParamDictType] = []
|
|
347
348
|
for r in sweep:
|
|
348
349
|
param_dict: resolver.ParamDictType = {}
|
|
349
350
|
for formula, sym in self.items():
|
|
@@ -380,8 +381,8 @@ class ExpressionMap(dict):
|
|
|
380
381
|
|
|
381
382
|
|
|
382
383
|
def _ensure_not_str(
|
|
383
|
-
param:
|
|
384
|
-
) ->
|
|
384
|
+
param: sympy.Expr | cirq.TParamValComplex | str,
|
|
385
|
+
) -> sympy.Expr | cirq.TParamValComplex:
|
|
385
386
|
if isinstance(param, str):
|
|
386
387
|
return sympy.Symbol(param)
|
|
387
388
|
return param
|
|
@@ -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 sympy
|
|
16
18
|
|
|
17
19
|
import cirq
|
|
@@ -23,14 +25,14 @@ from cirq.study import flatten_expressions
|
|
|
23
25
|
# factor, is not consistent between sympy versions <1.4 and >=1.4.
|
|
24
26
|
|
|
25
27
|
|
|
26
|
-
def test_expr_map_names():
|
|
28
|
+
def test_expr_map_names() -> None:
|
|
27
29
|
flattener = flatten_expressions._ParamFlattener({'collision': '<x + 2>'})
|
|
28
30
|
expressions = [sympy.Symbol('x') + i for i in range(3)]
|
|
29
31
|
syms = flattener.flatten(expressions)
|
|
30
32
|
assert syms == [sympy.Symbol(name) for name in ('x', '<x + 1>', '<x + 2>_1')]
|
|
31
33
|
|
|
32
34
|
|
|
33
|
-
def test_flattener_value_of():
|
|
35
|
+
def test_flattener_value_of() -> None:
|
|
34
36
|
flattener = flatten_expressions._ParamFlattener({'c': 5, 'x1': 'x1'})
|
|
35
37
|
assert flattener.value_of(9) == 9
|
|
36
38
|
assert flattener.value_of('c') == 5
|
|
@@ -54,18 +56,18 @@ def test_flattener_value_of():
|
|
|
54
56
|
]
|
|
55
57
|
|
|
56
58
|
|
|
57
|
-
def test_flattener_repr():
|
|
59
|
+
def test_flattener_repr() -> None:
|
|
58
60
|
assert repr(flatten_expressions._ParamFlattener({'a': 1})) == ("_ParamFlattener({a: 1})")
|
|
59
61
|
assert repr(
|
|
60
62
|
flatten_expressions._ParamFlattener({'a': 1}, get_param_name=lambda expr: 'x')
|
|
61
63
|
).startswith("_ParamFlattener({a: 1}, get_param_name=<function ")
|
|
62
64
|
|
|
63
65
|
|
|
64
|
-
def test_expression_map_repr():
|
|
66
|
+
def test_expression_map_repr() -> None:
|
|
65
67
|
cirq.testing.assert_equivalent_repr(cirq.ExpressionMap({'a': 'b'}))
|
|
66
68
|
|
|
67
69
|
|
|
68
|
-
def test_flatten_circuit():
|
|
70
|
+
def test_flatten_circuit() -> None:
|
|
69
71
|
qubit = cirq.LineQubit(0)
|
|
70
72
|
a = sympy.Symbol('a')
|
|
71
73
|
circuit = cirq.Circuit(cirq.X(qubit) ** a, cirq.X(qubit) ** (1 + a / 2))
|
|
@@ -78,7 +80,7 @@ def test_flatten_circuit():
|
|
|
78
80
|
assert expr_map == {a: a, 1 + a / 2: sympy.Symbol('<a/2 + 1>')}
|
|
79
81
|
|
|
80
82
|
|
|
81
|
-
def test_transform_params():
|
|
83
|
+
def test_transform_params() -> None:
|
|
82
84
|
qubit = cirq.LineQubit(0)
|
|
83
85
|
a = sympy.Symbol('a')
|
|
84
86
|
circuit = cirq.Circuit(cirq.X(qubit) ** (a / 4), cirq.X(qubit) ** (1 + a / 2))
|
|
@@ -90,7 +92,7 @@ def test_transform_params():
|
|
|
90
92
|
assert new_params == expected_params
|
|
91
93
|
|
|
92
94
|
|
|
93
|
-
def test_transform_sweep():
|
|
95
|
+
def test_transform_sweep() -> None:
|
|
94
96
|
qubit = cirq.LineQubit(0)
|
|
95
97
|
a = sympy.Symbol('a')
|
|
96
98
|
circuit = cirq.Circuit(cirq.X(qubit) ** (a / 4), cirq.X(qubit) ** (1 + a / 2))
|
|
@@ -109,20 +111,20 @@ def test_transform_sweep():
|
|
|
109
111
|
assert resolvers == expected_resolvers
|
|
110
112
|
|
|
111
113
|
|
|
112
|
-
def test_flattener_new():
|
|
114
|
+
def test_flattener_new() -> None:
|
|
113
115
|
flattener = flatten_expressions._ParamFlattener({'a': 'b'})
|
|
114
116
|
flattener2 = flatten_expressions._ParamFlattener(flattener)
|
|
115
117
|
assert isinstance(flattener2, flatten_expressions._ParamFlattener)
|
|
116
118
|
assert flattener2.param_dict == flattener.param_dict
|
|
117
119
|
|
|
118
120
|
|
|
119
|
-
def test_resolver_new():
|
|
121
|
+
def test_resolver_new() -> None:
|
|
120
122
|
flattener = flatten_expressions._ParamFlattener({'a': 'b'})
|
|
121
123
|
flattener2 = cirq.ParamResolver(flattener)
|
|
122
124
|
assert flattener2 is flattener
|
|
123
125
|
|
|
124
126
|
|
|
125
|
-
def test_transformed_sweep():
|
|
127
|
+
def test_transformed_sweep() -> None:
|
|
126
128
|
a = sympy.Symbol('a')
|
|
127
129
|
sweep = cirq.Linspace('a', start=0, stop=3, length=4)
|
|
128
130
|
expr_map = cirq.ExpressionMap({a / 4: 'x0', 1 - a / 2: 'x1'})
|
|
@@ -134,7 +136,7 @@ def test_transformed_sweep():
|
|
|
134
136
|
assert params[1] == (('x0', 1 / 4), ('x1', 1 - 1 / 2))
|
|
135
137
|
|
|
136
138
|
|
|
137
|
-
def test_transformed_sweep_equality():
|
|
139
|
+
def test_transformed_sweep_equality() -> None:
|
|
138
140
|
a = sympy.Symbol('a')
|
|
139
141
|
sweep = cirq.Linspace('a', start=0, stop=3, length=4)
|
|
140
142
|
expr_map = cirq.ExpressionMap({a / 4: 'x0', 1 - a / 4: 'x1'})
|
cirq/study/resolver.py
CHANGED
|
@@ -13,8 +13,11 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
"""Resolves ParameterValues to assigned values."""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
16
19
|
import numbers
|
|
17
|
-
from typing import Any, cast,
|
|
20
|
+
from typing import Any, cast, Iterator, Mapping, TYPE_CHECKING, Union
|
|
18
21
|
|
|
19
22
|
import numpy as np
|
|
20
23
|
import sympy
|
|
@@ -27,7 +30,7 @@ if TYPE_CHECKING:
|
|
|
27
30
|
import cirq
|
|
28
31
|
|
|
29
32
|
|
|
30
|
-
ParamDictType =
|
|
33
|
+
ParamDictType = dict['cirq.TParamKey', 'cirq.TParamValComplex']
|
|
31
34
|
ParamMappingType = Mapping['cirq.TParamKey', 'cirq.TParamValComplex']
|
|
32
35
|
document(ParamDictType, """Dictionary from symbols to values.""")
|
|
33
36
|
document(ParamMappingType, """Immutable map from symbols to values.""")
|
|
@@ -61,16 +64,16 @@ class ParamResolver:
|
|
|
61
64
|
TypeError if formulas are passed as keys.
|
|
62
65
|
"""
|
|
63
66
|
|
|
64
|
-
def __new__(cls, param_dict:
|
|
67
|
+
def __new__(cls, param_dict: cirq.ParamResolverOrSimilarType = None):
|
|
65
68
|
if isinstance(param_dict, ParamResolver):
|
|
66
69
|
return param_dict
|
|
67
70
|
return super().__new__(cls)
|
|
68
71
|
|
|
69
|
-
def __init__(self, param_dict:
|
|
72
|
+
def __init__(self, param_dict: cirq.ParamResolverOrSimilarType = None) -> None:
|
|
70
73
|
if hasattr(self, 'param_dict'):
|
|
71
74
|
return # Already initialized. Got wrapped as part of the __new__.
|
|
72
75
|
|
|
73
|
-
self._param_hash:
|
|
76
|
+
self._param_hash: int | None = None
|
|
74
77
|
self._param_dict = cast(ParamDictType, {} if param_dict is None else param_dict)
|
|
75
78
|
for key in self._param_dict:
|
|
76
79
|
if isinstance(key, sympy.Expr) and not isinstance(key, sympy.Symbol):
|
|
@@ -82,8 +85,8 @@ class ParamResolver:
|
|
|
82
85
|
return self._param_dict
|
|
83
86
|
|
|
84
87
|
def value_of(
|
|
85
|
-
self, value:
|
|
86
|
-
) ->
|
|
88
|
+
self, value: cirq.TParamKey | cirq.TParamValComplex, recursive: bool = True
|
|
89
|
+
) -> cirq.TParamValComplex:
|
|
87
90
|
"""Attempt to resolve a parameter to its assigned value.
|
|
88
91
|
|
|
89
92
|
Scalars are returned without modification. Strings are resolved via
|
|
@@ -193,7 +196,7 @@ class ParamResolver:
|
|
|
193
196
|
|
|
194
197
|
return self._value_of_recursive(value)
|
|
195
198
|
|
|
196
|
-
def _value_of_recursive(self, value:
|
|
199
|
+
def _value_of_recursive(self, value: cirq.TParamKey) -> cirq.TParamValComplex:
|
|
197
200
|
# Recursive parameter resolution. We can safely assume that value is a
|
|
198
201
|
# single symbol, since combinations are handled earlier in the method.
|
|
199
202
|
if value in self._deep_eval_map:
|
|
@@ -213,8 +216,8 @@ class ParamResolver:
|
|
|
213
216
|
self._deep_eval_map[value] = self.value_of(v, recursive=True)
|
|
214
217
|
return self._deep_eval_map[value]
|
|
215
218
|
|
|
216
|
-
def _resolve_parameters_(self, resolver:
|
|
217
|
-
new_dict:
|
|
219
|
+
def _resolve_parameters_(self, resolver: ParamResolver, recursive: bool) -> ParamResolver:
|
|
220
|
+
new_dict: dict[cirq.TParamKey, float | str | sympy.Symbol | sympy.Expr] = {
|
|
218
221
|
k: k for k in resolver
|
|
219
222
|
}
|
|
220
223
|
new_dict.update({k: self.value_of(k, recursive) for k in self})
|
|
@@ -225,15 +228,13 @@ class ParamResolver:
|
|
|
225
228
|
return ParamResolver()._resolve_parameters_(new_resolver, recursive=True)
|
|
226
229
|
return ParamResolver(cast(ParamDictType, new_dict))
|
|
227
230
|
|
|
228
|
-
def __iter__(self) -> Iterator[
|
|
231
|
+
def __iter__(self) -> Iterator[str | sympy.Expr]:
|
|
229
232
|
return iter(self._param_dict)
|
|
230
233
|
|
|
231
234
|
def __bool__(self) -> bool:
|
|
232
235
|
return bool(self._param_dict)
|
|
233
236
|
|
|
234
|
-
def __getitem__(
|
|
235
|
-
self, key: Union['cirq.TParamKey', 'cirq.TParamValComplex']
|
|
236
|
-
) -> 'cirq.TParamValComplex':
|
|
237
|
+
def __getitem__(self, key: cirq.TParamKey | cirq.TParamValComplex) -> cirq.TParamValComplex:
|
|
237
238
|
return self.value_of(key)
|
|
238
239
|
|
|
239
240
|
def __hash__(self) -> int:
|
|
@@ -241,7 +242,7 @@ class ParamResolver:
|
|
|
241
242
|
self._param_hash = hash(frozenset(self._param_dict.items()))
|
|
242
243
|
return self._param_hash
|
|
243
244
|
|
|
244
|
-
def __getstate__(self) ->
|
|
245
|
+
def __getstate__(self) -> dict[str, Any]:
|
|
245
246
|
# clear cached hash value when pickling, see #6674
|
|
246
247
|
state = self.__dict__
|
|
247
248
|
if state["_param_hash"] is not None:
|
|
@@ -265,7 +266,7 @@ class ParamResolver:
|
|
|
265
266
|
)
|
|
266
267
|
return f'cirq.ParamResolver({param_dict_repr})'
|
|
267
268
|
|
|
268
|
-
def _json_dict_(self) ->
|
|
269
|
+
def _json_dict_(self) -> dict[str, Any]:
|
|
269
270
|
return {
|
|
270
271
|
# JSON requires mappings to have keys of basic types.
|
|
271
272
|
'param_dict': list(self._param_dict.items())
|
|
@@ -285,7 +286,7 @@ def _resolve_value(val: Any) -> Any:
|
|
|
285
286
|
return val.p
|
|
286
287
|
if isinstance(val, sympy_numbers.RationalConstant):
|
|
287
288
|
return val.p / val.q
|
|
288
|
-
if val
|
|
289
|
+
if val is sympy.pi:
|
|
289
290
|
return np.pi
|
|
290
291
|
|
|
291
292
|
getter = getattr(val, '_resolved_value_', None)
|