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/value/linear_dict.py
CHANGED
|
@@ -14,11 +14,12 @@
|
|
|
14
14
|
|
|
15
15
|
"""Linear combination represented as mapping of things to coefficients."""
|
|
16
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
17
19
|
from typing import (
|
|
18
20
|
AbstractSet,
|
|
19
21
|
Any,
|
|
20
22
|
Callable,
|
|
21
|
-
Dict,
|
|
22
23
|
Generic,
|
|
23
24
|
ItemsView,
|
|
24
25
|
Iterable,
|
|
@@ -26,12 +27,9 @@ from typing import (
|
|
|
26
27
|
KeysView,
|
|
27
28
|
Mapping,
|
|
28
29
|
MutableMapping,
|
|
29
|
-
Optional,
|
|
30
30
|
overload,
|
|
31
|
-
Tuple,
|
|
32
31
|
TYPE_CHECKING,
|
|
33
32
|
TypeVar,
|
|
34
|
-
Union,
|
|
35
33
|
ValuesView,
|
|
36
34
|
)
|
|
37
35
|
|
|
@@ -44,7 +42,7 @@ from cirq import protocols
|
|
|
44
42
|
if TYPE_CHECKING:
|
|
45
43
|
import cirq
|
|
46
44
|
|
|
47
|
-
Scalar =
|
|
45
|
+
Scalar = complex | np.number
|
|
48
46
|
TVector = TypeVar('TVector')
|
|
49
47
|
|
|
50
48
|
TDefault = TypeVar('TDefault')
|
|
@@ -63,7 +61,7 @@ class _SympyPrinter(sympy.printing.str.StrPrinter):
|
|
|
63
61
|
return super()._print(expr, **kwargs)
|
|
64
62
|
|
|
65
63
|
|
|
66
|
-
def _format_coefficient(format_spec: str, coefficient:
|
|
64
|
+
def _format_coefficient(format_spec: str, coefficient: cirq.TParamValComplex) -> str:
|
|
67
65
|
if isinstance(coefficient, sympy.Basic):
|
|
68
66
|
printer = _SympyPrinter(format_spec)
|
|
69
67
|
return printer.doprint(coefficient)
|
|
@@ -83,7 +81,7 @@ def _format_coefficient(format_spec: str, coefficient: 'cirq.TParamValComplex')
|
|
|
83
81
|
return f'({real_str}+{imag_str}j)'
|
|
84
82
|
|
|
85
83
|
|
|
86
|
-
def _format_term(format_spec: str, vector: TVector, coefficient:
|
|
84
|
+
def _format_term(format_spec: str, vector: TVector, coefficient: cirq.TParamValComplex) -> str:
|
|
87
85
|
coefficient_str = _format_coefficient(format_spec, coefficient)
|
|
88
86
|
if not coefficient_str:
|
|
89
87
|
return coefficient_str
|
|
@@ -93,7 +91,7 @@ def _format_term(format_spec: str, vector: TVector, coefficient: 'cirq.TParamVal
|
|
|
93
91
|
return '+' + result
|
|
94
92
|
|
|
95
93
|
|
|
96
|
-
def _format_terms(terms: Iterable[
|
|
94
|
+
def _format_terms(terms: Iterable[tuple[TVector, cirq.TParamValComplex]], format_spec: str):
|
|
97
95
|
formatted_terms = [_format_term(format_spec, vector, coeff) for vector, coeff in terms]
|
|
98
96
|
s = ''.join(formatted_terms)
|
|
99
97
|
if not s:
|
|
@@ -120,8 +118,8 @@ class LinearDict(Generic[TVector], MutableMapping[TVector, 'cirq.TParamValComple
|
|
|
120
118
|
|
|
121
119
|
def __init__(
|
|
122
120
|
self,
|
|
123
|
-
terms:
|
|
124
|
-
validator:
|
|
121
|
+
terms: Mapping[TVector, cirq.TParamValComplex] | None = None,
|
|
122
|
+
validator: Callable[[TVector], bool] | None = None,
|
|
125
123
|
) -> None:
|
|
126
124
|
"""Initializes linear combination from a collection of terms.
|
|
127
125
|
|
|
@@ -136,7 +134,7 @@ class LinearDict(Generic[TVector], MutableMapping[TVector, 'cirq.TParamValComple
|
|
|
136
134
|
"""
|
|
137
135
|
self._has_validator = validator is not None
|
|
138
136
|
self._is_valid = validator or (lambda x: True)
|
|
139
|
-
self._terms:
|
|
137
|
+
self._terms: dict[TVector, cirq.TParamValComplex] = {}
|
|
140
138
|
if terms is not None:
|
|
141
139
|
self.update(terms)
|
|
142
140
|
|
|
@@ -172,31 +170,30 @@ class LinearDict(Generic[TVector], MutableMapping[TVector, 'cirq.TParamValComple
|
|
|
172
170
|
snapshot = self.copy().clean(atol=0)
|
|
173
171
|
return snapshot._terms.keys()
|
|
174
172
|
|
|
175
|
-
def values(self) -> ValuesView[
|
|
173
|
+
def values(self) -> ValuesView[cirq.TParamValComplex]:
|
|
176
174
|
snapshot = self.copy().clean(atol=0)
|
|
177
175
|
return snapshot._terms.values()
|
|
178
176
|
|
|
179
|
-
def items(self) -> ItemsView[TVector,
|
|
177
|
+
def items(self) -> ItemsView[TVector, cirq.TParamValComplex]:
|
|
180
178
|
snapshot = self.copy().clean(atol=0)
|
|
181
179
|
return snapshot._terms.items()
|
|
182
180
|
|
|
183
|
-
# pylint: disable=function-redefined
|
|
184
181
|
@overload
|
|
185
182
|
def update(
|
|
186
|
-
self, other: Mapping[TVector,
|
|
183
|
+
self, other: Mapping[TVector, cirq.TParamValComplex], **kwargs: cirq.TParamValComplex
|
|
187
184
|
) -> None:
|
|
188
185
|
pass
|
|
189
186
|
|
|
190
187
|
@overload
|
|
191
188
|
def update(
|
|
192
189
|
self,
|
|
193
|
-
other: Iterable[
|
|
194
|
-
**kwargs:
|
|
190
|
+
other: Iterable[tuple[TVector, cirq.TParamValComplex]],
|
|
191
|
+
**kwargs: cirq.TParamValComplex,
|
|
195
192
|
) -> None:
|
|
196
193
|
pass
|
|
197
194
|
|
|
198
195
|
@overload
|
|
199
|
-
def update(self, *args: Any, **kwargs:
|
|
196
|
+
def update(self, *args: Any, **kwargs: cirq.TParamValComplex) -> None:
|
|
200
197
|
pass
|
|
201
198
|
|
|
202
199
|
def update(self, *args, **kwargs):
|
|
@@ -211,11 +208,11 @@ class LinearDict(Generic[TVector], MutableMapping[TVector, 'cirq.TParamValComple
|
|
|
211
208
|
self.clean(atol=0)
|
|
212
209
|
|
|
213
210
|
@overload
|
|
214
|
-
def get(self, vector: TVector) ->
|
|
211
|
+
def get(self, vector: TVector) -> cirq.TParamValComplex:
|
|
215
212
|
pass
|
|
216
213
|
|
|
217
214
|
@overload
|
|
218
|
-
def get(self, vector: TVector, default: TDefault) ->
|
|
215
|
+
def get(self, vector: TVector, default: TDefault) -> cirq.TParamValComplex | TDefault:
|
|
219
216
|
pass
|
|
220
217
|
|
|
221
218
|
def get(self, vector, default=0):
|
|
@@ -223,15 +220,13 @@ class LinearDict(Generic[TVector], MutableMapping[TVector, 'cirq.TParamValComple
|
|
|
223
220
|
return default
|
|
224
221
|
return self._terms.get(vector)
|
|
225
222
|
|
|
226
|
-
# pylint: enable=function-redefined
|
|
227
|
-
|
|
228
223
|
def __contains__(self, vector: Any) -> bool:
|
|
229
224
|
return vector in self._terms and self._terms[vector] != 0
|
|
230
225
|
|
|
231
|
-
def __getitem__(self, vector: TVector) ->
|
|
226
|
+
def __getitem__(self, vector: TVector) -> cirq.TParamValComplex:
|
|
232
227
|
return self._terms.get(vector, 0)
|
|
233
228
|
|
|
234
|
-
def __setitem__(self, vector: TVector, coefficient:
|
|
229
|
+
def __setitem__(self, vector: TVector, coefficient: cirq.TParamValComplex) -> None:
|
|
235
230
|
self._check_vector_valid(vector)
|
|
236
231
|
if coefficient != 0:
|
|
237
232
|
self._terms[vector] = coefficient
|
|
@@ -279,21 +274,21 @@ class LinearDict(Generic[TVector], MutableMapping[TVector, 'cirq.TParamValComple
|
|
|
279
274
|
factory = type(self)
|
|
280
275
|
return factory({v: -c for v, c in self.items()})
|
|
281
276
|
|
|
282
|
-
def __imul__(self, a:
|
|
277
|
+
def __imul__(self, a: cirq.TParamValComplex) -> Self:
|
|
283
278
|
for vector in self:
|
|
284
279
|
self._terms[vector] *= a
|
|
285
280
|
self.clean(atol=0)
|
|
286
281
|
return self
|
|
287
282
|
|
|
288
|
-
def __mul__(self, a:
|
|
283
|
+
def __mul__(self, a: cirq.TParamValComplex) -> Self:
|
|
289
284
|
result = self.copy()
|
|
290
285
|
result *= a
|
|
291
286
|
return result.copy()
|
|
292
287
|
|
|
293
|
-
def __rmul__(self, a:
|
|
288
|
+
def __rmul__(self, a: cirq.TParamValComplex) -> Self:
|
|
294
289
|
return self.__mul__(a)
|
|
295
290
|
|
|
296
|
-
def __truediv__(self, a:
|
|
291
|
+
def __truediv__(self, a: cirq.TParamValComplex) -> Self:
|
|
297
292
|
return self.__mul__(1 / a)
|
|
298
293
|
|
|
299
294
|
def __bool__(self) -> bool:
|
|
@@ -352,7 +347,7 @@ class LinearDict(Generic[TVector], MutableMapping[TVector, 'cirq.TParamValComple
|
|
|
352
347
|
else:
|
|
353
348
|
p.text(str(self))
|
|
354
349
|
|
|
355
|
-
def _json_dict_(self) ->
|
|
350
|
+
def _json_dict_(self) -> dict[Any, Any]:
|
|
356
351
|
if self._has_validator:
|
|
357
352
|
raise ValueError('LinearDict with a validator is not json serializable.')
|
|
358
353
|
return {
|
|
@@ -370,7 +365,7 @@ class LinearDict(Generic[TVector], MutableMapping[TVector, 'cirq.TParamValComple
|
|
|
370
365
|
def _parameter_names_(self) -> AbstractSet[str]:
|
|
371
366
|
return set(name for v in self._terms.values() for name in protocols.parameter_names(v))
|
|
372
367
|
|
|
373
|
-
def _resolve_parameters_(self, resolver:
|
|
368
|
+
def _resolve_parameters_(self, resolver: cirq.ParamResolver, recursive: bool) -> LinearDict:
|
|
374
369
|
result = self.copy()
|
|
375
370
|
result.update(
|
|
376
371
|
{
|
cirq/value/linear_dict_test.py
CHANGED
|
@@ -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 numpy as np
|
|
16
18
|
import pytest
|
|
17
19
|
import sympy
|
|
@@ -27,7 +29,7 @@ def test_empty_init():
|
|
|
27
29
|
|
|
28
30
|
sym = sympy.Symbol('sym')
|
|
29
31
|
expr = sym * -(2 + 3j)
|
|
30
|
-
symval = expr.subs({'sym': 5})
|
|
32
|
+
symval = expr.subs({'sym': 5}) # pylint: disable=assignment-from-no-return
|
|
31
33
|
symvalresolved = -10 - 15j
|
|
32
34
|
|
|
33
35
|
|
|
@@ -391,8 +393,8 @@ def test_scalar_division(scalar, terms, terms_expected):
|
|
|
391
393
|
linear_dict = cirq.LinearDict(terms)
|
|
392
394
|
actual = linear_dict / scalar
|
|
393
395
|
expected = cirq.LinearDict(terms_expected)
|
|
394
|
-
assert actual
|
|
395
|
-
assert expected
|
|
396
|
+
assert cirq.approx_eq(actual, expected)
|
|
397
|
+
assert cirq.approx_eq(expected, actual)
|
|
396
398
|
|
|
397
399
|
|
|
398
400
|
@pytest.mark.parametrize(
|
|
@@ -408,7 +410,7 @@ def test_scalar_division(scalar, terms, terms_expected):
|
|
|
408
410
|
)
|
|
409
411
|
def test_expressions(expression, expected):
|
|
410
412
|
assert expression == expected
|
|
411
|
-
assert not expression != expected
|
|
413
|
+
assert not expression != expected # noqa: SIM202
|
|
412
414
|
assert cirq.approx_eq(expression, expected)
|
|
413
415
|
|
|
414
416
|
|
|
@@ -435,8 +437,8 @@ def test_equal(terms_1, terms_2):
|
|
|
435
437
|
linear_dict_2 = cirq.LinearDict(terms_2)
|
|
436
438
|
assert linear_dict_1 == linear_dict_2
|
|
437
439
|
assert linear_dict_2 == linear_dict_1
|
|
438
|
-
assert not linear_dict_1 != linear_dict_2
|
|
439
|
-
assert not linear_dict_2 != linear_dict_1
|
|
440
|
+
assert not linear_dict_1 != linear_dict_2 # noqa: SIM202
|
|
441
|
+
assert not linear_dict_2 != linear_dict_1 # noqa: SIM202
|
|
440
442
|
|
|
441
443
|
|
|
442
444
|
@pytest.mark.parametrize(
|
|
@@ -454,8 +456,8 @@ def test_unequal(terms_1, terms_2):
|
|
|
454
456
|
linear_dict_2 = cirq.LinearDict(terms_2)
|
|
455
457
|
assert linear_dict_1 != linear_dict_2
|
|
456
458
|
assert linear_dict_2 != linear_dict_1
|
|
457
|
-
assert not linear_dict_1 == linear_dict_2
|
|
458
|
-
assert not linear_dict_2 == linear_dict_1
|
|
459
|
+
assert not linear_dict_1 == linear_dict_2 # noqa: SIM201
|
|
460
|
+
assert not linear_dict_2 == linear_dict_1 # noqa: SIM201
|
|
459
461
|
|
|
460
462
|
|
|
461
463
|
@pytest.mark.parametrize(
|
cirq/value/measurement_key.py
CHANGED
|
@@ -12,8 +12,10 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import dataclasses
|
|
16
|
-
from typing import Any,
|
|
18
|
+
from typing import Any, Mapping
|
|
17
19
|
|
|
18
20
|
MEASUREMENT_KEY_SEPARATOR = ':'
|
|
19
21
|
|
|
@@ -33,11 +35,11 @@ class MeasurementKey:
|
|
|
33
35
|
appears first in the tuple.
|
|
34
36
|
"""
|
|
35
37
|
|
|
36
|
-
_hash:
|
|
37
|
-
_str:
|
|
38
|
+
_hash: int | None = dataclasses.field(default=None, init=False)
|
|
39
|
+
_str: str | None = dataclasses.field(default=None, init=False)
|
|
38
40
|
|
|
39
41
|
name: str
|
|
40
|
-
path:
|
|
42
|
+
path: tuple[str, ...] = dataclasses.field(default_factory=tuple)
|
|
41
43
|
|
|
42
44
|
def __post_init__(self):
|
|
43
45
|
if not isinstance(self.name, str):
|
|
@@ -49,7 +51,7 @@ class MeasurementKey:
|
|
|
49
51
|
'`MeasurementKey.parse_serialized` for correct behavior.'
|
|
50
52
|
)
|
|
51
53
|
|
|
52
|
-
def replace(self, **changes) ->
|
|
54
|
+
def replace(self, **changes) -> MeasurementKey:
|
|
53
55
|
"""Returns a copy of this MeasurementKey with the specified changes."""
|
|
54
56
|
return dataclasses.replace(self, **changes)
|
|
55
57
|
|
|
@@ -76,7 +78,7 @@ class MeasurementKey:
|
|
|
76
78
|
object.__setattr__(self, '_hash', hash(str(self)))
|
|
77
79
|
return self._hash
|
|
78
80
|
|
|
79
|
-
def __getstate__(self) ->
|
|
81
|
+
def __getstate__(self) -> dict[str, Any]:
|
|
80
82
|
# clear cached hash value when pickling, see #6674
|
|
81
83
|
state = self.__dict__
|
|
82
84
|
if "_hash" in state:
|
|
@@ -102,7 +104,7 @@ class MeasurementKey:
|
|
|
102
104
|
return cls(name=name, path=tuple(path))
|
|
103
105
|
|
|
104
106
|
@classmethod
|
|
105
|
-
def parse_serialized(cls, key_str: str) ->
|
|
107
|
+
def parse_serialized(cls, key_str: str) -> MeasurementKey:
|
|
106
108
|
"""Parses the serialized string representation of `Measurementkey` into a `MeasurementKey`.
|
|
107
109
|
|
|
108
110
|
This is the only way to construct a `MeasurementKey` from a nested string representation
|
|
@@ -110,10 +112,10 @@ class MeasurementKey:
|
|
|
110
112
|
components = key_str.split(MEASUREMENT_KEY_SEPARATOR)
|
|
111
113
|
return MeasurementKey(name=components[-1], path=tuple(components[:-1]))
|
|
112
114
|
|
|
113
|
-
def _with_key_path_(self, path:
|
|
115
|
+
def _with_key_path_(self, path: tuple[str, ...]):
|
|
114
116
|
return self.replace(path=path)
|
|
115
117
|
|
|
116
|
-
def _with_key_path_prefix_(self, prefix:
|
|
118
|
+
def _with_key_path_prefix_(self, prefix: tuple[str, ...]):
|
|
117
119
|
return self._with_key_path_(path=prefix + self.path)
|
|
118
120
|
|
|
119
121
|
def with_key_path_prefix(self, *path_component: str):
|
|
@@ -124,9 +126,7 @@ class MeasurementKey:
|
|
|
124
126
|
"""
|
|
125
127
|
return self.replace(path=path_component + self.path)
|
|
126
128
|
|
|
127
|
-
def _with_rescoped_keys_(
|
|
128
|
-
self, path: Tuple[str, ...], bindable_keys: FrozenSet['MeasurementKey']
|
|
129
|
-
):
|
|
129
|
+
def _with_rescoped_keys_(self, path: tuple[str, ...], bindable_keys: frozenset[MeasurementKey]):
|
|
130
130
|
return self.replace(path=path + self.path)
|
|
131
131
|
|
|
132
132
|
def _with_measurement_key_mapping_(self, key_map: Mapping[str, str]):
|
cirq/value/periodic_value.py
CHANGED
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
from typing import AbstractSet, Any, TYPE_CHECKING
|
|
16
18
|
|
|
17
19
|
import sympy
|
|
@@ -35,7 +37,7 @@ class PeriodicValue:
|
|
|
35
37
|
interval.
|
|
36
38
|
"""
|
|
37
39
|
|
|
38
|
-
def __init__(self, value:
|
|
40
|
+
def __init__(self, value: cirq.TParamVal, period: cirq.TParamVal):
|
|
39
41
|
"""Initializes the equivalence class.
|
|
40
42
|
|
|
41
43
|
Args:
|
|
@@ -99,9 +101,7 @@ class PeriodicValue:
|
|
|
99
101
|
|
|
100
102
|
return parameter_names(self.value) | parameter_names(self.period)
|
|
101
103
|
|
|
102
|
-
def _resolve_parameters_(
|
|
103
|
-
self, resolver: 'cirq.ParamResolver', recursive: bool
|
|
104
|
-
) -> 'PeriodicValue':
|
|
104
|
+
def _resolve_parameters_(self, resolver: cirq.ParamResolver, recursive: bool) -> PeriodicValue:
|
|
105
105
|
# HACK: Avoids circular dependencies.
|
|
106
106
|
from cirq.protocols import resolve_parameters
|
|
107
107
|
|
|
@@ -12,13 +12,15 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import pytest
|
|
16
18
|
import sympy
|
|
17
19
|
|
|
18
20
|
import cirq
|
|
19
21
|
|
|
20
22
|
|
|
21
|
-
def test_periodic_value_equality():
|
|
23
|
+
def test_periodic_value_equality() -> None:
|
|
22
24
|
eq = cirq.testing.EqualsTester()
|
|
23
25
|
eq.add_equality_group(
|
|
24
26
|
cirq.PeriodicValue(1, 2),
|
|
@@ -34,7 +36,7 @@ def test_periodic_value_equality():
|
|
|
34
36
|
eq.add_equality_group(cirq.PeriodicValue(2, 4))
|
|
35
37
|
|
|
36
38
|
|
|
37
|
-
def test_periodic_value_approx_eq_basic():
|
|
39
|
+
def test_periodic_value_approx_eq_basic() -> None:
|
|
38
40
|
assert cirq.approx_eq(cirq.PeriodicValue(1.0, 2.0), cirq.PeriodicValue(1.0, 2.0), atol=0.1)
|
|
39
41
|
assert cirq.approx_eq(cirq.PeriodicValue(1.0, 2.0), cirq.PeriodicValue(1.2, 2.0), atol=0.3)
|
|
40
42
|
assert not cirq.approx_eq(cirq.PeriodicValue(1.0, 2.0), cirq.PeriodicValue(1.2, 2.0), atol=0.1)
|
|
@@ -49,12 +51,12 @@ def test_periodic_value_approx_eq_basic():
|
|
|
49
51
|
)
|
|
50
52
|
|
|
51
53
|
|
|
52
|
-
def test_periodic_value_approx_eq_normalized():
|
|
54
|
+
def test_periodic_value_approx_eq_normalized() -> None:
|
|
53
55
|
assert cirq.approx_eq(cirq.PeriodicValue(1.0, 3.0), cirq.PeriodicValue(4.1, 3.0), atol=0.2)
|
|
54
56
|
assert cirq.approx_eq(cirq.PeriodicValue(1.0, 3.0), cirq.PeriodicValue(-2.1, 3.0), atol=0.2)
|
|
55
57
|
|
|
56
58
|
|
|
57
|
-
def test_periodic_value_approx_eq_boundary():
|
|
59
|
+
def test_periodic_value_approx_eq_boundary() -> None:
|
|
58
60
|
assert cirq.approx_eq(cirq.PeriodicValue(0.0, 2.0), cirq.PeriodicValue(1.9, 2.0), atol=0.2)
|
|
59
61
|
assert cirq.approx_eq(cirq.PeriodicValue(0.1, 2.0), cirq.PeriodicValue(1.9, 2.0), atol=0.3)
|
|
60
62
|
assert cirq.approx_eq(cirq.PeriodicValue(1.9, 2.0), cirq.PeriodicValue(0.1, 2.0), atol=0.3)
|
|
@@ -64,7 +66,7 @@ def test_periodic_value_approx_eq_boundary():
|
|
|
64
66
|
assert cirq.approx_eq(cirq.PeriodicValue(0.4, 1.0), cirq.PeriodicValue(0.6, 1.0), atol=0.3)
|
|
65
67
|
|
|
66
68
|
|
|
67
|
-
def test_periodic_value_types_mismatch():
|
|
69
|
+
def test_periodic_value_types_mismatch() -> None:
|
|
68
70
|
assert not cirq.approx_eq(cirq.PeriodicValue(0.0, 2.0), 0.0, atol=0.2)
|
|
69
71
|
assert not cirq.approx_eq(0.0, cirq.PeriodicValue(0.0, 2.0), atol=0.2)
|
|
70
72
|
|
|
@@ -79,7 +81,9 @@ def test_periodic_value_types_mismatch():
|
|
|
79
81
|
],
|
|
80
82
|
)
|
|
81
83
|
@pytest.mark.parametrize('resolve_fn', [cirq.resolve_parameters, cirq.resolve_parameters_once])
|
|
82
|
-
def test_periodic_value_is_parameterized(
|
|
84
|
+
def test_periodic_value_is_parameterized(
|
|
85
|
+
value, is_parameterized, parameter_names, resolve_fn
|
|
86
|
+
) -> None:
|
|
83
87
|
assert cirq.is_parameterized(value) == is_parameterized
|
|
84
88
|
assert cirq.parameter_names(value) == parameter_names
|
|
85
89
|
resolved = resolve_fn(value, {p: 1 for p in parameter_names})
|
|
@@ -98,5 +102,5 @@ def test_periodic_value_is_parameterized(value, is_parameterized, parameter_name
|
|
|
98
102
|
cirq.PeriodicValue(sympy.Symbol('v'), 3),
|
|
99
103
|
],
|
|
100
104
|
)
|
|
101
|
-
def test_periodic_value_repr(val):
|
|
105
|
+
def test_periodic_value_repr(val) -> None:
|
|
102
106
|
cirq.testing.assert_equivalent_repr(val)
|
cirq/value/probability.py
CHANGED
|
@@ -14,6 +14,8 @@
|
|
|
14
14
|
|
|
15
15
|
"""Utilities for handling probabilities."""
|
|
16
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
17
19
|
from typing import TYPE_CHECKING
|
|
18
20
|
|
|
19
21
|
import numpy as np
|
|
@@ -44,7 +46,7 @@ def validate_probability(p: float, p_str: str) -> float:
|
|
|
44
46
|
return p
|
|
45
47
|
|
|
46
48
|
|
|
47
|
-
def state_vector_to_probabilities(state_vector:
|
|
49
|
+
def state_vector_to_probabilities(state_vector: cirq.STATE_VECTOR_LIKE) -> np.ndarray:
|
|
48
50
|
"""Function to transform a state vector like object into a numpy array of probabilities."""
|
|
49
51
|
valid_state_vector = to_valid_state_vector(state_vector)
|
|
50
52
|
return np.abs(valid_state_vector) ** 2
|
cirq/value/probability_test.py
CHANGED
|
@@ -12,17 +12,19 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import pytest
|
|
16
18
|
|
|
17
19
|
import cirq
|
|
18
20
|
|
|
19
21
|
|
|
20
22
|
@pytest.mark.parametrize('p', [0.0, 0.1, 0.6, 1.0])
|
|
21
|
-
def test_validate_probability_valid(p):
|
|
23
|
+
def test_validate_probability_valid(p) -> None:
|
|
22
24
|
assert p == cirq.validate_probability(p, 'p')
|
|
23
25
|
|
|
24
26
|
|
|
25
27
|
@pytest.mark.parametrize('p', [-0.1, 1.1])
|
|
26
|
-
def test_validate_probability_invalid(p):
|
|
28
|
+
def test_validate_probability_invalid(p) -> None:
|
|
27
29
|
with pytest.raises(ValueError, match='p'):
|
|
28
30
|
cirq.validate_probability(p, 'p')
|
cirq/value/product_state.py
CHANGED
|
@@ -12,9 +12,11 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import abc
|
|
16
18
|
from dataclasses import dataclass
|
|
17
|
-
from typing import
|
|
19
|
+
from typing import Iterator, Sequence, TYPE_CHECKING
|
|
18
20
|
|
|
19
21
|
import numpy as np
|
|
20
22
|
|
|
@@ -28,7 +30,7 @@ if TYPE_CHECKING:
|
|
|
28
30
|
class _NamedOneQubitState(metaclass=abc.ABCMeta):
|
|
29
31
|
"""Abstract class representing a one-qubit state of note."""
|
|
30
32
|
|
|
31
|
-
def on(self, qubit:
|
|
33
|
+
def on(self, qubit: cirq.Qid) -> ProductState:
|
|
32
34
|
"""Associates one qubit with this named state.
|
|
33
35
|
|
|
34
36
|
The returned object is a ProductState of length 1.
|
|
@@ -57,7 +59,7 @@ class ProductState:
|
|
|
57
59
|
with `cirq.KET_PLUS(q0)`.
|
|
58
60
|
"""
|
|
59
61
|
|
|
60
|
-
states:
|
|
62
|
+
states: dict[cirq.Qid, _NamedOneQubitState]
|
|
61
63
|
|
|
62
64
|
def __init__(self, states=None):
|
|
63
65
|
if states is None:
|
|
@@ -66,10 +68,10 @@ class ProductState:
|
|
|
66
68
|
object.__setattr__(self, 'states', states)
|
|
67
69
|
|
|
68
70
|
@property
|
|
69
|
-
def qubits(self) -> Sequence[
|
|
71
|
+
def qubits(self) -> Sequence[cirq.Qid]:
|
|
70
72
|
return sorted(self.states.keys())
|
|
71
73
|
|
|
72
|
-
def __mul__(self, other:
|
|
74
|
+
def __mul__(self, other: cirq.ProductState) -> cirq.ProductState:
|
|
73
75
|
if not isinstance(other, ProductState):
|
|
74
76
|
raise ValueError("Multiplication is only supported with other TensorProductStates.")
|
|
75
77
|
|
|
@@ -93,11 +95,11 @@ class ProductState:
|
|
|
93
95
|
)
|
|
94
96
|
return f'cirq.ProductState({{{states_dict_repr}}})'
|
|
95
97
|
|
|
96
|
-
def __getitem__(self, qubit:
|
|
98
|
+
def __getitem__(self, qubit: cirq.Qid) -> _NamedOneQubitState:
|
|
97
99
|
"""Return the _NamedOneQubitState at the given qubit."""
|
|
98
100
|
return self.states[qubit]
|
|
99
101
|
|
|
100
|
-
def __iter__(self) -> Iterator[
|
|
102
|
+
def __iter__(self) -> Iterator[tuple[cirq.Qid, _NamedOneQubitState]]:
|
|
101
103
|
yield from self.states.items()
|
|
102
104
|
|
|
103
105
|
def __len__(self) -> int:
|
|
@@ -119,7 +121,7 @@ class ProductState:
|
|
|
119
121
|
def _from_json_dict_(cls, states, **kwargs):
|
|
120
122
|
return cls(states=dict(states))
|
|
121
123
|
|
|
122
|
-
def state_vector(self, qubit_order:
|
|
124
|
+
def state_vector(self, qubit_order: cirq.QubitOrder | None = None) -> np.ndarray:
|
|
123
125
|
"""The state-vector representation of this state."""
|
|
124
126
|
from cirq import ops
|
|
125
127
|
|
|
@@ -136,7 +138,7 @@ class ProductState:
|
|
|
136
138
|
|
|
137
139
|
return mat
|
|
138
140
|
|
|
139
|
-
def projector(self, qubit_order:
|
|
141
|
+
def projector(self, qubit_order: cirq.QubitOrder | None = None) -> np.ndarray:
|
|
140
142
|
"""The projector associated with this state expressed as a matrix.
|
|
141
143
|
|
|
142
144
|
This is |s⟩⟨s| where |s⟩ is this state.
|
|
@@ -174,7 +176,7 @@ class _PauliEigenState(_NamedOneQubitState):
|
|
|
174
176
|
return f'cirq.{self._symbol}.basis[{self.eigenvalue:+d}]'
|
|
175
177
|
|
|
176
178
|
@abc.abstractmethod
|
|
177
|
-
def stabilized_by(self) ->
|
|
179
|
+
def stabilized_by(self) -> tuple[int, cirq.Pauli]:
|
|
178
180
|
pass
|
|
179
181
|
|
|
180
182
|
def __eq__(self, other) -> bool:
|
|
@@ -201,7 +203,7 @@ class _XEigenState(_PauliEigenState):
|
|
|
201
203
|
return np.array([1, -1]) / np.sqrt(2)
|
|
202
204
|
raise ValueError(f"Bad eigenvalue: {self.eigenvalue}") # pragma: no cover
|
|
203
205
|
|
|
204
|
-
def stabilized_by(self) ->
|
|
206
|
+
def stabilized_by(self) -> tuple[int, cirq.Pauli]:
|
|
205
207
|
# Prevent circular import from `value.value_equality`
|
|
206
208
|
from cirq import ops
|
|
207
209
|
|
|
@@ -218,7 +220,7 @@ class _YEigenState(_PauliEigenState):
|
|
|
218
220
|
return np.array([1, -1j]) / np.sqrt(2)
|
|
219
221
|
raise ValueError(f"Bad eigenvalue: {self.eigenvalue}") # pragma: no cover
|
|
220
222
|
|
|
221
|
-
def stabilized_by(self) ->
|
|
223
|
+
def stabilized_by(self) -> tuple[int, cirq.Pauli]:
|
|
222
224
|
from cirq import ops
|
|
223
225
|
|
|
224
226
|
return self.eigenvalue, ops.Y
|
|
@@ -234,7 +236,7 @@ class _ZEigenState(_PauliEigenState):
|
|
|
234
236
|
return np.array([0, 1])
|
|
235
237
|
raise ValueError(f"Bad eigenvalue: {self.eigenvalue}") # pragma: no cover
|
|
236
238
|
|
|
237
|
-
def stabilized_by(self) ->
|
|
239
|
+
def stabilized_by(self) -> tuple[int, cirq.Pauli]:
|
|
238
240
|
from cirq import ops
|
|
239
241
|
|
|
240
242
|
return self.eigenvalue, ops.Z
|
cirq/value/product_state_test.py
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
# pylint: disable=wrong-or-nonexistent-copyright-notice
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
2
5
|
import numpy as np
|
|
3
6
|
import pytest
|
|
4
7
|
|
|
@@ -85,7 +88,7 @@ def test_product_state():
|
|
|
85
88
|
with pytest.raises(ValueError) as e:
|
|
86
89
|
# Re-use q2
|
|
87
90
|
ps *= cirq.KET_PLUS(q2)
|
|
88
|
-
assert e.match(r'.*both contain factors for these qubits:
|
|
91
|
+
assert e.match(r'.*both contain factors for these qubits: \[cirq.LineQubit\(2\)\]')
|
|
89
92
|
|
|
90
93
|
ps2 = eval(repr(ps))
|
|
91
94
|
assert ps == ps2
|
cirq/value/random_state.py
CHANGED
cirq/value/random_state_test.py
CHANGED
|
@@ -12,12 +12,14 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import numpy as np
|
|
16
18
|
|
|
17
19
|
import cirq
|
|
18
20
|
|
|
19
21
|
|
|
20
|
-
def test_parse_random_state():
|
|
22
|
+
def test_parse_random_state() -> None:
|
|
21
23
|
global_state = np.random.get_state()
|
|
22
24
|
|
|
23
25
|
def rand(prng):
|
|
@@ -34,11 +36,11 @@ def test_parse_random_state():
|
|
|
34
36
|
eq.add_equality_group(*vals)
|
|
35
37
|
|
|
36
38
|
seed = np.random.randint(2**31)
|
|
37
|
-
|
|
39
|
+
prngs1 = [
|
|
38
40
|
np.random.RandomState(seed),
|
|
39
41
|
cirq.value.parse_random_state(np.random.RandomState(seed)),
|
|
40
42
|
cirq.value.parse_random_state(seed),
|
|
41
43
|
]
|
|
42
|
-
vals = [prng.rand() for prng in
|
|
44
|
+
vals = [prng.rand() for prng in prngs1]
|
|
43
45
|
eq = cirq.testing.EqualsTester()
|
|
44
46
|
eq.add_equality_group(*vals)
|