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/testing/deprecation.py
CHANGED
|
@@ -11,16 +11,19 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
14
17
|
import contextlib
|
|
15
18
|
import logging
|
|
16
19
|
import os
|
|
17
|
-
from typing import Iterator
|
|
20
|
+
from typing import Iterator
|
|
18
21
|
|
|
19
22
|
from cirq._compat import ALLOW_DEPRECATION_IN_TEST
|
|
20
23
|
|
|
21
24
|
|
|
22
25
|
@contextlib.contextmanager
|
|
23
|
-
def assert_deprecated(*msgs: str, deadline: str, count:
|
|
26
|
+
def assert_deprecated(*msgs: str, deadline: str, count: int | None = 1) -> Iterator[None]:
|
|
24
27
|
"""Allows deprecated functions, classes, decorators in tests.
|
|
25
28
|
|
|
26
29
|
It acts as a contextmanager that can be used in with statements:
|
cirq/testing/deprecation_test.py
CHANGED
|
@@ -11,6 +11,9 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
14
17
|
import warnings
|
|
15
18
|
|
|
16
19
|
import pytest
|
|
@@ -18,14 +21,14 @@ import pytest
|
|
|
18
21
|
from cirq.testing import assert_deprecated
|
|
19
22
|
|
|
20
23
|
|
|
21
|
-
def test_nested_assert_deprecation():
|
|
24
|
+
def test_nested_assert_deprecation() -> None:
|
|
22
25
|
with assert_deprecated(deadline="v1.2", count=1):
|
|
23
26
|
with assert_deprecated(deadline="v1.2", count=1):
|
|
24
27
|
with assert_deprecated(deadline="v1.2", count=1):
|
|
25
28
|
warnings.warn("hello, this is deprecated in v1.2")
|
|
26
29
|
|
|
27
30
|
|
|
28
|
-
def test_assert_deprecated_log_handling():
|
|
31
|
+
def test_assert_deprecated_log_handling() -> None:
|
|
29
32
|
# correct deprecation message
|
|
30
33
|
with assert_deprecated("hello", deadline="v1.2"):
|
|
31
34
|
warnings.warn("hello, this is deprecated in v1.2")
|
cirq/testing/devices.py
CHANGED
|
@@ -11,8 +11,11 @@
|
|
|
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
|
"""Provides test devices that can validate circuits."""
|
|
15
|
-
from
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
from typing import AbstractSet, cast
|
|
16
19
|
|
|
17
20
|
from cirq import devices, ops
|
|
18
21
|
|
|
@@ -37,10 +40,10 @@ class ValidatingTestDevice(devices.Device):
|
|
|
37
40
|
self,
|
|
38
41
|
qubits: AbstractSet[ops.Qid],
|
|
39
42
|
name: str = "ValidatingTestDevice",
|
|
40
|
-
allowed_gates:
|
|
41
|
-
allowed_qubit_types:
|
|
43
|
+
allowed_gates: tuple[type, ...] = (ops.Gate,),
|
|
44
|
+
allowed_qubit_types: tuple[type, ...] = (devices.GridQubit,),
|
|
42
45
|
validate_locality: bool = False,
|
|
43
|
-
auto_decompose_gates:
|
|
46
|
+
auto_decompose_gates: tuple[type, ...] = tuple(),
|
|
44
47
|
):
|
|
45
48
|
self.allowed_qubit_types = allowed_qubit_types
|
|
46
49
|
self.allowed_gates = allowed_gates
|
cirq/testing/devices_test.py
CHANGED
|
@@ -11,13 +11,16 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
14
17
|
import pytest
|
|
15
18
|
|
|
16
19
|
import cirq
|
|
17
20
|
from cirq.testing.devices import ValidatingTestDevice
|
|
18
21
|
|
|
19
22
|
|
|
20
|
-
def test_validating_types_and_qubits():
|
|
23
|
+
def test_validating_types_and_qubits() -> None:
|
|
21
24
|
dev = ValidatingTestDevice(
|
|
22
25
|
allowed_qubit_types=(cirq.GridQubit,),
|
|
23
26
|
allowed_gates=(cirq.XPowGate,),
|
|
@@ -37,7 +40,7 @@ def test_validating_types_and_qubits():
|
|
|
37
40
|
dev.validate_operation(cirq.Y(cirq.GridQubit(0, 0)))
|
|
38
41
|
|
|
39
42
|
|
|
40
|
-
def test_validating_locality():
|
|
43
|
+
def test_validating_locality() -> None:
|
|
41
44
|
dev = ValidatingTestDevice(
|
|
42
45
|
allowed_qubit_types=(cirq.GridQubit,),
|
|
43
46
|
allowed_gates=(cirq.CZPowGate, cirq.MeasurementGate),
|
|
@@ -62,7 +65,7 @@ def test_validating_locality():
|
|
|
62
65
|
)
|
|
63
66
|
|
|
64
67
|
|
|
65
|
-
def test_repr():
|
|
68
|
+
def test_repr() -> None:
|
|
66
69
|
dev = ValidatingTestDevice(
|
|
67
70
|
allowed_qubit_types=(cirq.GridQubit,),
|
|
68
71
|
allowed_gates=(cirq.CZPowGate, cirq.MeasurementGate),
|
|
@@ -73,7 +76,7 @@ def test_repr():
|
|
|
73
76
|
assert repr(dev) == 'test'
|
|
74
77
|
|
|
75
78
|
|
|
76
|
-
def test_defaults():
|
|
79
|
+
def test_defaults() -> None:
|
|
77
80
|
dev = ValidatingTestDevice(qubits={cirq.GridQubit(0, 0)})
|
|
78
81
|
assert repr(dev) == 'ValidatingTestDevice'
|
|
79
82
|
assert dev.allowed_qubit_types == (cirq.GridQubit,)
|
cirq/testing/equals_tester.py
CHANGED
|
@@ -20,16 +20,18 @@ group are all equal to each other, but that items between each group are never
|
|
|
20
20
|
equal to each other. It will also check that a==b implies hash(a)==hash(b).
|
|
21
21
|
"""
|
|
22
22
|
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
23
25
|
import collections
|
|
24
26
|
import itertools
|
|
25
|
-
from typing import Any, Callable
|
|
27
|
+
from typing import Any, Callable
|
|
26
28
|
|
|
27
29
|
|
|
28
30
|
class EqualsTester:
|
|
29
31
|
"""Tests equality against user-provided disjoint equivalence groups."""
|
|
30
32
|
|
|
31
33
|
def __init__(self) -> None:
|
|
32
|
-
self._groups:
|
|
34
|
+
self._groups: list[tuple[Any | _ClassUnknownToSubjects, ...]] = [
|
|
33
35
|
(_ClassUnknownToSubjects(),)
|
|
34
36
|
]
|
|
35
37
|
|
|
@@ -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 fractions
|
|
16
18
|
|
|
17
19
|
import pytest
|
|
@@ -19,7 +21,7 @@ import pytest
|
|
|
19
21
|
from cirq.testing.equals_tester import EqualsTester
|
|
20
22
|
|
|
21
23
|
|
|
22
|
-
def test_add_equality_group_correct():
|
|
24
|
+
def test_add_equality_group_correct() -> None:
|
|
23
25
|
eq = EqualsTester()
|
|
24
26
|
|
|
25
27
|
eq.add_equality_group(fractions.Fraction(1, 1))
|
|
@@ -39,7 +41,7 @@ def test_add_equality_group_correct():
|
|
|
39
41
|
eq.add_equality_group('unrelated')
|
|
40
42
|
|
|
41
43
|
|
|
42
|
-
def test_assert_make_equality_group():
|
|
44
|
+
def test_assert_make_equality_group() -> None:
|
|
43
45
|
eq = EqualsTester()
|
|
44
46
|
|
|
45
47
|
with pytest.raises(AssertionError, match="can't be in the same"):
|
|
@@ -57,20 +59,20 @@ def test_assert_make_equality_group():
|
|
|
57
59
|
eq.make_equality_group(lambda: 3)
|
|
58
60
|
|
|
59
61
|
|
|
60
|
-
def test_add_equality_group_not_equivalent():
|
|
62
|
+
def test_add_equality_group_not_equivalent() -> None:
|
|
61
63
|
eq = EqualsTester()
|
|
62
64
|
with pytest.raises(AssertionError, match="can't be in the same"):
|
|
63
65
|
eq.add_equality_group(1, 2)
|
|
64
66
|
|
|
65
67
|
|
|
66
|
-
def test_add_equality_group_not_disjoint():
|
|
68
|
+
def test_add_equality_group_not_disjoint() -> None:
|
|
67
69
|
eq = EqualsTester()
|
|
68
70
|
eq.add_equality_group(1)
|
|
69
71
|
with pytest.raises(AssertionError, match="can't be in different"):
|
|
70
72
|
eq.add_equality_group(1)
|
|
71
73
|
|
|
72
74
|
|
|
73
|
-
def test_add_equality_group_bad_hash():
|
|
75
|
+
def test_add_equality_group_bad_hash() -> None:
|
|
74
76
|
class KeyHash:
|
|
75
77
|
def __init__(self, k, h):
|
|
76
78
|
self._k = k
|
|
@@ -94,7 +96,7 @@ def test_add_equality_group_bad_hash():
|
|
|
94
96
|
eq.add_equality_group(KeyHash('c', 2), KeyHash('c', 3))
|
|
95
97
|
|
|
96
98
|
|
|
97
|
-
def test_add_equality_group_exception_hash():
|
|
99
|
+
def test_add_equality_group_exception_hash() -> None:
|
|
98
100
|
class FailHash:
|
|
99
101
|
def __hash__(self):
|
|
100
102
|
raise ValueError('injected failure')
|
|
@@ -104,7 +106,7 @@ def test_add_equality_group_exception_hash():
|
|
|
104
106
|
eq.add_equality_group(FailHash())
|
|
105
107
|
|
|
106
108
|
|
|
107
|
-
def test_fails_when_forgot_type_check():
|
|
109
|
+
def test_fails_when_forgot_type_check() -> None:
|
|
108
110
|
eq = EqualsTester()
|
|
109
111
|
|
|
110
112
|
class NoTypeCheckEqualImplementation:
|
|
@@ -124,11 +126,12 @@ def test_fails_when_forgot_type_check():
|
|
|
124
126
|
eq.add_equality_group(NoTypeCheckEqualImplementation())
|
|
125
127
|
|
|
126
128
|
|
|
127
|
-
def test_fails_when_equal_to_everything():
|
|
129
|
+
def test_fails_when_equal_to_everything() -> None:
|
|
128
130
|
eq = EqualsTester()
|
|
129
131
|
|
|
130
132
|
class AllEqual:
|
|
131
|
-
__hash__
|
|
133
|
+
def __hash__(self) -> int:
|
|
134
|
+
return 0
|
|
132
135
|
|
|
133
136
|
def __eq__(self, other):
|
|
134
137
|
return True
|
|
@@ -136,11 +139,12 @@ def test_fails_when_equal_to_everything():
|
|
|
136
139
|
def __ne__(self, other):
|
|
137
140
|
return False
|
|
138
141
|
|
|
142
|
+
assert hash(AllEqual()) == 0
|
|
139
143
|
with pytest.raises(AssertionError, match="can't be in different"):
|
|
140
144
|
eq.add_equality_group(AllEqual())
|
|
141
145
|
|
|
142
146
|
|
|
143
|
-
def test_fails_hash_is_default_and_inconsistent():
|
|
147
|
+
def test_fails_hash_is_default_and_inconsistent() -> None:
|
|
144
148
|
eq = EqualsTester()
|
|
145
149
|
|
|
146
150
|
class DefaultHashImplementation:
|
|
@@ -161,7 +165,7 @@ def test_fails_hash_is_default_and_inconsistent():
|
|
|
161
165
|
eq.make_equality_group(DefaultHashImplementation)
|
|
162
166
|
|
|
163
167
|
|
|
164
|
-
def test_fails_when_ne_is_inconsistent():
|
|
168
|
+
def test_fails_when_ne_is_inconsistent() -> None:
|
|
165
169
|
eq = EqualsTester()
|
|
166
170
|
|
|
167
171
|
class InconsistentNeImplementation:
|
|
@@ -185,7 +189,7 @@ def test_fails_when_ne_is_inconsistent():
|
|
|
185
189
|
eq.make_equality_group(InconsistentNeImplementation)
|
|
186
190
|
|
|
187
191
|
|
|
188
|
-
def test_fails_when_ne_is_inconsistent_due_to_not_implemented():
|
|
192
|
+
def test_fails_when_ne_is_inconsistent_due_to_not_implemented() -> None:
|
|
189
193
|
eq = EqualsTester()
|
|
190
194
|
|
|
191
195
|
class InconsistentNeImplementation:
|
|
@@ -207,7 +211,7 @@ def test_fails_when_ne_is_inconsistent_due_to_not_implemented():
|
|
|
207
211
|
eq.make_equality_group(InconsistentNeImplementation)
|
|
208
212
|
|
|
209
213
|
|
|
210
|
-
def test_fails_when_not_reflexive():
|
|
214
|
+
def test_fails_when_not_reflexive() -> None:
|
|
211
215
|
eq = EqualsTester()
|
|
212
216
|
|
|
213
217
|
class NotReflexiveImplementation:
|
|
@@ -226,7 +230,7 @@ def test_fails_when_not_reflexive():
|
|
|
226
230
|
eq.add_equality_group(NotReflexiveImplementation())
|
|
227
231
|
|
|
228
232
|
|
|
229
|
-
def test_fails_when_not_commutative():
|
|
233
|
+
def test_fails_when_not_commutative() -> None:
|
|
230
234
|
eq = EqualsTester()
|
|
231
235
|
|
|
232
236
|
class NotCommutativeImplementation:
|
|
@@ -248,14 +252,14 @@ def test_fails_when_not_commutative():
|
|
|
248
252
|
eq.add_equality_group(NotCommutativeImplementation(1), NotCommutativeImplementation(0))
|
|
249
253
|
|
|
250
254
|
|
|
251
|
-
def test_works_on_types():
|
|
255
|
+
def test_works_on_types() -> None:
|
|
252
256
|
eq = EqualsTester()
|
|
253
257
|
eq.add_equality_group(object)
|
|
254
258
|
eq.add_equality_group(int)
|
|
255
259
|
eq.add_equality_group(object())
|
|
256
260
|
|
|
257
261
|
|
|
258
|
-
def test_returns_not_implemented_for_other_types():
|
|
262
|
+
def test_returns_not_implemented_for_other_types() -> None:
|
|
259
263
|
# First we demonstrate an example of the problem.
|
|
260
264
|
|
|
261
265
|
# FirstClass is the class that is broken.
|
|
@@ -323,7 +327,7 @@ def test_returns_not_implemented_for_other_types():
|
|
|
323
327
|
eq.add_equality_group(ThirdClass("a"), ThirdClass("a"))
|
|
324
328
|
|
|
325
329
|
|
|
326
|
-
def test_not_implemented_error():
|
|
330
|
+
def test_not_implemented_error() -> None:
|
|
327
331
|
# Common bug is to return NotImplementedError instead of NotImplemented.
|
|
328
332
|
class NotImplementedErrorCase:
|
|
329
333
|
def __init__(self, val):
|
|
@@ -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 Sequence
|
|
16
18
|
|
|
17
19
|
import numpy as np
|
|
18
20
|
|
|
@@ -20,7 +22,7 @@ import cirq
|
|
|
20
22
|
from cirq import circuits
|
|
21
23
|
|
|
22
24
|
|
|
23
|
-
def assert_equivalent_computational_basis_map(maps:
|
|
25
|
+
def assert_equivalent_computational_basis_map(maps: dict[int, int], circuit: circuits.Circuit):
|
|
24
26
|
"""Ensure equivalence of basis state mapping.
|
|
25
27
|
|
|
26
28
|
Args:
|
|
@@ -47,7 +49,7 @@ def assert_equivalent_computational_basis_map(maps: Dict[int, int], circuit: cir
|
|
|
47
49
|
|
|
48
50
|
def _sparse_computational_basis_map(
|
|
49
51
|
inputs: Sequence[int], circuit: circuits.Circuit
|
|
50
|
-
) ->
|
|
52
|
+
) -> dict[int, int]:
|
|
51
53
|
# Pick a unique amplitude for each computational basis input state.
|
|
52
54
|
amps = [np.exp(1j * i / len(inputs)) / len(inputs) ** 0.5 for i in range(len(inputs))]
|
|
53
55
|
|
|
@@ -67,7 +69,7 @@ def _sparse_computational_basis_map(
|
|
|
67
69
|
return actual_map
|
|
68
70
|
|
|
69
71
|
|
|
70
|
-
def _bin_dec(x:
|
|
72
|
+
def _bin_dec(x: int | None, num_bits: int) -> str:
|
|
71
73
|
if x is None:
|
|
72
74
|
return 'None'
|
|
73
75
|
return f'0b{bin(x)[2:].zfill(num_bits)} ({x})'
|
|
@@ -11,13 +11,16 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
14
17
|
import pytest
|
|
15
18
|
|
|
16
19
|
import cirq
|
|
17
20
|
from cirq import circuits
|
|
18
21
|
|
|
19
22
|
|
|
20
|
-
def test_correct_mappings():
|
|
23
|
+
def test_correct_mappings() -> None:
|
|
21
24
|
a, b, c = cirq.LineQubit.range(3)
|
|
22
25
|
cirq.testing.assert_equivalent_computational_basis_map(
|
|
23
26
|
maps={0b01: 0b01, 0b10: 0b10},
|
|
@@ -30,11 +33,10 @@ def test_correct_mappings():
|
|
|
30
33
|
)
|
|
31
34
|
|
|
32
35
|
|
|
33
|
-
def test_incorrect_mappings():
|
|
36
|
+
def test_incorrect_mappings() -> None:
|
|
34
37
|
a, b, c = cirq.LineQubit.range(3)
|
|
35
38
|
with pytest.raises(
|
|
36
|
-
AssertionError,
|
|
37
|
-
match=r"0b001 \(1\) was mapped to " r"0b100 \(4\) instead of " r"0b010 \(2\)",
|
|
39
|
+
AssertionError, match=r"0b001 \(1\) was mapped to 0b100 \(4\) instead of 0b010 \(2\)"
|
|
38
40
|
):
|
|
39
41
|
cirq.testing.assert_equivalent_computational_basis_map(
|
|
40
42
|
maps={0b001: 0b010, 0b010: 0b100, 0b100: 0b001},
|
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import Any
|
|
16
18
|
|
|
17
19
|
|
|
18
20
|
def assert_equivalent_repr(
|
|
@@ -21,8 +23,8 @@ def assert_equivalent_repr(
|
|
|
21
23
|
setup_code: str = (
|
|
22
24
|
'import cirq\nimport numpy as np\nimport sympy\nimport pandas as pd\nimport datetime\n'
|
|
23
25
|
),
|
|
24
|
-
global_vals:
|
|
25
|
-
local_vals:
|
|
26
|
+
global_vals: dict[str, Any] | None = None,
|
|
27
|
+
local_vals: dict[str, Any] | None = None,
|
|
26
28
|
) -> None:
|
|
27
29
|
"""Checks that eval(repr(v)) == v.
|
|
28
30
|
|
|
@@ -39,7 +41,7 @@ def assert_equivalent_repr(
|
|
|
39
41
|
Raises:
|
|
40
42
|
AssertionError: If the assertion fails, or eval(repr(value)) raises an error.
|
|
41
43
|
"""
|
|
42
|
-
__tracebackhide__ = True
|
|
44
|
+
__tracebackhide__ = True
|
|
43
45
|
|
|
44
46
|
global_vals = global_vals or {}
|
|
45
47
|
local_vals = local_vals or {}
|
|
@@ -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 numpy as np
|
|
16
18
|
import pytest
|
|
17
19
|
|
|
18
20
|
import cirq
|
|
19
21
|
|
|
20
22
|
|
|
21
|
-
def test_external():
|
|
23
|
+
def test_external() -> None:
|
|
22
24
|
for t in ['a', 1j]:
|
|
23
25
|
cirq.testing.assert_equivalent_repr(t)
|
|
24
26
|
cirq.testing.assert_equivalent_repr(t, setup_code='')
|
|
@@ -29,7 +31,7 @@ def test_external():
|
|
|
29
31
|
cirq.testing.assert_equivalent_repr(np.array([5]))
|
|
30
32
|
|
|
31
33
|
|
|
32
|
-
def test_custom_class_repr():
|
|
34
|
+
def test_custom_class_repr() -> None:
|
|
33
35
|
class CustomRepr: # pragma: no cover
|
|
34
36
|
setup_code = """class CustomRepr:
|
|
35
37
|
def __init__(self, eq_val):
|
|
@@ -81,5 +83,5 @@ def test_custom_class_repr():
|
|
|
81
83
|
)
|
|
82
84
|
|
|
83
85
|
|
|
84
|
-
def test_imports_cirq_by_default():
|
|
86
|
+
def test_imports_cirq_by_default() -> None:
|
|
85
87
|
cirq.testing.assert_equivalent_repr(cirq.NamedQubit('a'))
|
cirq/testing/gate_features.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 pytest
|
|
16
18
|
|
|
17
19
|
import cirq
|
|
18
20
|
|
|
19
21
|
|
|
20
|
-
def test_two_qubit_gate_is_abstract_can_implement():
|
|
22
|
+
def test_two_qubit_gate_is_abstract_can_implement() -> None:
|
|
21
23
|
class Included(cirq.testing.TwoQubitGate):
|
|
22
24
|
def matrix(self):
|
|
23
25
|
pass
|
|
@@ -25,7 +27,7 @@ def test_two_qubit_gate_is_abstract_can_implement():
|
|
|
25
27
|
assert isinstance(Included(), cirq.testing.TwoQubitGate)
|
|
26
28
|
|
|
27
29
|
|
|
28
|
-
def test_two_qubit_gate_validate_pass():
|
|
30
|
+
def test_two_qubit_gate_validate_pass() -> None:
|
|
29
31
|
class Example(cirq.testing.TwoQubitGate):
|
|
30
32
|
def matrix(self):
|
|
31
33
|
pass
|
|
@@ -41,7 +43,7 @@ def test_two_qubit_gate_validate_pass():
|
|
|
41
43
|
g.validate_args([q3, q2])
|
|
42
44
|
|
|
43
45
|
|
|
44
|
-
def test_two_qubit_gate_validate_wrong_number():
|
|
46
|
+
def test_two_qubit_gate_validate_wrong_number() -> None:
|
|
45
47
|
class Example(cirq.testing.TwoQubitGate):
|
|
46
48
|
def matrix(self):
|
|
47
49
|
pass
|
|
@@ -59,7 +61,7 @@ def test_two_qubit_gate_validate_wrong_number():
|
|
|
59
61
|
g.validate_args([q1, q2, q3])
|
|
60
62
|
|
|
61
63
|
|
|
62
|
-
def test_three_qubit_gate_validate():
|
|
64
|
+
def test_three_qubit_gate_validate() -> None:
|
|
63
65
|
class Example(cirq.testing.ThreeQubitGate):
|
|
64
66
|
def matrix(self):
|
|
65
67
|
pass
|
|
@@ -80,6 +82,6 @@ def test_three_qubit_gate_validate():
|
|
|
80
82
|
g.validate_args([a, b, c, d])
|
|
81
83
|
|
|
82
84
|
|
|
83
|
-
def test_does_not_support_serialization_gate():
|
|
85
|
+
def test_does_not_support_serialization_gate() -> None:
|
|
84
86
|
g = cirq.testing.DoesNotSupportSerializationGate(n_qubits=4)
|
|
85
87
|
assert g.num_qubits() == 4
|
cirq/testing/json.py
CHANGED
|
@@ -12,19 +12,23 @@
|
|
|
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
18
|
import inspect
|
|
17
19
|
import io
|
|
18
20
|
import pathlib
|
|
19
21
|
from dataclasses import dataclass
|
|
20
22
|
from types import ModuleType
|
|
21
|
-
from typing import
|
|
23
|
+
from typing import Iterator, TYPE_CHECKING
|
|
22
24
|
|
|
23
25
|
import numpy as np
|
|
24
26
|
import pandas as pd
|
|
25
27
|
|
|
26
28
|
import cirq
|
|
27
|
-
|
|
29
|
+
|
|
30
|
+
if TYPE_CHECKING:
|
|
31
|
+
from cirq.protocols.json_serialization import ObjectFactory
|
|
28
32
|
|
|
29
33
|
# This is the testing framework for json serialization
|
|
30
34
|
# The actual tests live in cirq.protocols.json_serialization_test.py.
|
|
@@ -44,28 +48,28 @@ class ModuleJsonTestSpec:
|
|
|
44
48
|
# for test failures, a better representation
|
|
45
49
|
name: str
|
|
46
50
|
# the packages that have the public classes to be checked for serialization
|
|
47
|
-
packages:
|
|
51
|
+
packages: list[ModuleType]
|
|
48
52
|
# the path for the folder containing the test files
|
|
49
53
|
test_data_path: pathlib.Path
|
|
50
54
|
# these public class names are planned to be serializable but not yet
|
|
51
|
-
not_yet_serializable:
|
|
55
|
+
not_yet_serializable: list[str]
|
|
52
56
|
# these public class names do not need to be serialized ever
|
|
53
|
-
should_not_be_serialized:
|
|
57
|
+
should_not_be_serialized: list[str]
|
|
54
58
|
# points to the resolver cache's dict for this module
|
|
55
|
-
resolver_cache:
|
|
59
|
+
resolver_cache: dict[str, ObjectFactory]
|
|
56
60
|
# {DeprecatedClass: deprecation_deadline} pairs to avoid deprecation errors
|
|
57
61
|
# in serialization tests.
|
|
58
|
-
deprecated:
|
|
62
|
+
deprecated: dict[str, str]
|
|
59
63
|
# The unqualified public name is different from the cirq_type field of the json object,
|
|
60
64
|
# usually due to namespacing.
|
|
61
|
-
custom_class_name_to_cirq_type:
|
|
65
|
+
custom_class_name_to_cirq_type: dict[str, str] = dataclasses.field(default_factory=dict)
|
|
62
66
|
# Special cases where classes cannot be tested using the normal infrastructure.
|
|
63
|
-
tested_elsewhere:
|
|
67
|
+
tested_elsewhere: list[str] = dataclasses.field(default_factory=list)
|
|
64
68
|
|
|
65
69
|
def __repr__(self):
|
|
66
70
|
return self.name
|
|
67
71
|
|
|
68
|
-
def _get_all_public_classes(self) -> Iterator[
|
|
72
|
+
def _get_all_public_classes(self) -> Iterator[tuple[str, type]]:
|
|
69
73
|
for module in self.packages:
|
|
70
74
|
for name, obj in inspect.getmembers(module):
|
|
71
75
|
if inspect.isfunction(obj) or inspect.ismodule(obj):
|
|
@@ -87,16 +91,16 @@ class ModuleJsonTestSpec:
|
|
|
87
91
|
name = self.custom_class_name_to_cirq_type.get(name, name)
|
|
88
92
|
yield name, obj
|
|
89
93
|
|
|
90
|
-
def find_classes_that_should_serialize(self) ->
|
|
91
|
-
result:
|
|
94
|
+
def find_classes_that_should_serialize(self) -> set[tuple[str, type]]:
|
|
95
|
+
result: set[tuple[str, type]] = set()
|
|
92
96
|
|
|
93
97
|
result.update({(name, obj) for name, obj in self._get_all_public_classes()})
|
|
94
98
|
result.update(self.get_resolver_cache_types())
|
|
95
99
|
|
|
96
100
|
return result
|
|
97
101
|
|
|
98
|
-
def get_resolver_cache_types(self) ->
|
|
99
|
-
result:
|
|
102
|
+
def get_resolver_cache_types(self) -> set[tuple[str, type]]:
|
|
103
|
+
result: set[tuple[str, type]] = set()
|
|
100
104
|
for k, v in self.resolver_cache.items():
|
|
101
105
|
if isinstance(v, type):
|
|
102
106
|
result.add((k, v))
|
|
@@ -113,7 +117,7 @@ class ModuleJsonTestSpec:
|
|
|
113
117
|
for name, _ in self.get_resolver_cache_types():
|
|
114
118
|
yield name
|
|
115
119
|
|
|
116
|
-
def all_test_data_keys(self) ->
|
|
120
|
+
def all_test_data_keys(self) -> list[str]:
|
|
117
121
|
seen = set()
|
|
118
122
|
|
|
119
123
|
for file in self.test_data_path.iterdir():
|
cirq/testing/json_test.py
CHANGED
|
@@ -12,21 +12,23 @@
|
|
|
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
|
from cirq.testing.json import spec_for
|
|
18
20
|
|
|
19
21
|
|
|
20
|
-
def test_module_missing_json_test_data():
|
|
22
|
+
def test_module_missing_json_test_data() -> None:
|
|
21
23
|
with pytest.raises(ValueError, match="json_test_data"):
|
|
22
24
|
spec_for('cirq.testing.test_data.test_module_missing_json_test_data')
|
|
23
25
|
|
|
24
26
|
|
|
25
|
-
def test_module_missing_testspec():
|
|
27
|
+
def test_module_missing_testspec() -> None:
|
|
26
28
|
with pytest.raises(ValueError, match="TestSpec"):
|
|
27
29
|
spec_for('cirq.testing.test_data.test_module_missing_testspec')
|
|
28
30
|
|
|
29
31
|
|
|
30
|
-
def test_missing_module():
|
|
32
|
+
def test_missing_module() -> None:
|
|
31
33
|
with pytest.raises(ModuleNotFoundError):
|
|
32
34
|
spec_for('non_existent')
|