cirq-core 1.5.0.dev20250409225226__py3-none-any.whl → 1.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of cirq-core might be problematic. Click here for more details.
- cirq/__init__.py +16 -17
- cirq/_compat.py +21 -20
- cirq/_compat_test.py +14 -34
- cirq/_doc.py +4 -2
- cirq/_import.py +8 -6
- cirq/_import_test.py +4 -2
- cirq/_version.py +6 -6
- cirq/_version_test.py +2 -2
- cirq/circuits/_block_diagram_drawer.py +11 -10
- cirq/circuits/_block_diagram_drawer_test.py +8 -6
- cirq/circuits/_box_drawing_character_data.py +8 -8
- cirq/circuits/_box_drawing_character_data_test.py +3 -1
- cirq/circuits/_bucket_priority_queue.py +9 -7
- cirq/circuits/_bucket_priority_queue_test.py +22 -20
- cirq/circuits/circuit.py +248 -172
- cirq/circuits/circuit_operation.py +73 -83
- cirq/circuits/circuit_operation_test.py +128 -90
- cirq/circuits/circuit_test.py +211 -151
- cirq/circuits/frozen_circuit.py +23 -60
- cirq/circuits/frozen_circuit_test.py +31 -8
- cirq/circuits/insert_strategy.py +7 -5
- cirq/circuits/insert_strategy_test.py +4 -2
- cirq/circuits/moment.py +88 -40
- cirq/circuits/moment_test.py +128 -51
- cirq/circuits/optimization_pass.py +5 -5
- cirq/circuits/optimization_pass_test.py +10 -10
- cirq/circuits/qasm_output.py +11 -11
- cirq/circuits/qasm_output_test.py +25 -22
- cirq/circuits/text_diagram_drawer.py +23 -38
- cirq/circuits/text_diagram_drawer_test.py +19 -17
- cirq/conftest.py +4 -3
- cirq/contrib/__init__.py +4 -4
- cirq/contrib/acquaintance/__init__.py +1 -1
- cirq/contrib/acquaintance/bipartite.py +5 -8
- cirq/contrib/acquaintance/bipartite_test.py +18 -13
- cirq/contrib/acquaintance/devices.py +2 -2
- cirq/contrib/acquaintance/devices_test.py +5 -3
- cirq/contrib/acquaintance/executor.py +5 -5
- cirq/contrib/acquaintance/executor_test.py +13 -9
- cirq/contrib/acquaintance/gates.py +18 -28
- cirq/contrib/acquaintance/gates_test.py +24 -20
- cirq/contrib/acquaintance/inspection_utils.py +8 -4
- cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
- cirq/contrib/acquaintance/mutation_utils.py +4 -4
- cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
- cirq/contrib/acquaintance/optimizers.py +4 -4
- cirq/contrib/acquaintance/optimizers_test.py +4 -1
- cirq/contrib/acquaintance/permutation.py +15 -27
- cirq/contrib/acquaintance/permutation_test.py +26 -17
- cirq/contrib/acquaintance/shift.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
- cirq/contrib/acquaintance/shift_test.py +8 -6
- cirq/contrib/acquaintance/strategies/cubic.py +2 -2
- cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
- cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
- cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
- cirq/contrib/acquaintance/testing.py +2 -0
- cirq/contrib/acquaintance/topological_sort.py +2 -2
- cirq/contrib/acquaintance/topological_sort_test.py +3 -1
- cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
- cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
- cirq/contrib/circuitdag/circuit_dag.py +4 -4
- cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
- cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
- cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
- cirq/contrib/graph_device/graph_device.py +12 -11
- cirq/contrib/graph_device/graph_device_test.py +18 -14
- cirq/contrib/graph_device/hypergraph.py +16 -14
- cirq/contrib/graph_device/hypergraph_test.py +13 -11
- cirq/contrib/graph_device/uniform_graph_device.py +6 -4
- cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
- cirq/contrib/hacks/disable_validation.py +6 -1
- cirq/contrib/hacks/disable_validation_test.py +3 -1
- cirq/contrib/json.py +31 -5
- cirq/contrib/json_test.py +6 -3
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/__init__.py +17 -0
- cirq/contrib/json_test_data/spec.py +32 -0
- cirq/contrib/noise_models/noise_models.py +119 -5
- cirq/contrib/noise_models/noise_models_test.py +37 -9
- cirq/contrib/paulistring/clifford_optimize.py +6 -4
- cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
- cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
- cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
- cirq/contrib/paulistring/optimize.py +2 -0
- cirq/contrib/paulistring/optimize_test.py +4 -3
- cirq/contrib/paulistring/pauli_string_dag.py +2 -0
- cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
- cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
- cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
- cirq/contrib/paulistring/recombine.py +6 -4
- cirq/contrib/paulistring/recombine_test.py +3 -1
- cirq/contrib/paulistring/separate.py +9 -6
- cirq/contrib/paulistring/separate_test.py +3 -1
- cirq/contrib/qasm_import/_lexer.py +3 -2
- cirq/contrib/qasm_import/_lexer_test.py +49 -13
- cirq/contrib/qasm_import/_parser.py +547 -83
- cirq/contrib/qasm_import/_parser_test.py +988 -97
- cirq/contrib/qasm_import/exception.py +2 -0
- cirq/contrib/qasm_import/qasm.py +8 -2
- cirq/contrib/qasm_import/qasm_test.py +7 -4
- cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
- cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
- cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
- cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
- cirq/contrib/qcircuit/qcircuit_test.py +10 -8
- cirq/contrib/quantum_volume/quantum_volume.py +31 -27
- cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
- cirq/contrib/quimb/density_matrix.py +15 -14
- cirq/contrib/quimb/density_matrix_test.py +10 -7
- cirq/contrib/quimb/grid_circuits.py +5 -2
- cirq/contrib/quimb/grid_circuits_test.py +3 -0
- cirq/contrib/quimb/mps_simulator.py +20 -20
- cirq/contrib/quimb/mps_simulator_test.py +3 -0
- cirq/contrib/quimb/state_vector.py +12 -11
- cirq/contrib/quimb/state_vector_test.py +3 -0
- cirq/contrib/quirk/export_to_quirk.py +5 -3
- cirq/contrib/quirk/export_to_quirk_test.py +18 -16
- cirq/contrib/quirk/linearize_circuit.py +2 -0
- cirq/contrib/quirk/quirk_gate.py +18 -17
- cirq/contrib/routing/device.py +5 -3
- cirq/contrib/routing/device_test.py +2 -0
- cirq/contrib/routing/greedy.py +10 -21
- cirq/contrib/routing/greedy_test.py +4 -2
- cirq/contrib/routing/initialization.py +2 -2
- cirq/contrib/routing/initialization_test.py +5 -3
- cirq/contrib/routing/router.py +9 -5
- cirq/contrib/routing/router_test.py +2 -0
- cirq/contrib/routing/swap_network.py +3 -3
- cirq/contrib/routing/swap_network_test.py +3 -1
- cirq/contrib/routing/utils.py +2 -2
- cirq/contrib/routing/utils_test.py +3 -0
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
- cirq/contrib/svg/svg.py +3 -3
- cirq/contrib/svg/svg_test.py +8 -5
- cirq/devices/device.py +4 -4
- cirq/devices/device_test.py +7 -4
- cirq/devices/grid_device_metadata.py +10 -10
- cirq/devices/grid_device_metadata_test.py +3 -0
- cirq/devices/grid_qubit.py +29 -21
- cirq/devices/grid_qubit_test.py +3 -0
- cirq/devices/insertion_noise_model.py +7 -7
- cirq/devices/insertion_noise_model_test.py +7 -5
- cirq/devices/line_qubit.py +13 -13
- cirq/devices/line_qubit_test.py +2 -0
- cirq/devices/named_topologies.py +18 -29
- cirq/devices/named_topologies_test.py +13 -10
- cirq/devices/noise_model.py +3 -3
- cirq/devices/noise_model_test.py +19 -15
- cirq/devices/noise_properties.py +15 -6
- cirq/devices/noise_properties_test.py +34 -3
- cirq/devices/noise_utils.py +11 -9
- cirq/devices/noise_utils_test.py +2 -0
- cirq/devices/superconducting_qubits_noise_properties.py +23 -22
- cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
- cirq/devices/thermal_noise_model.py +107 -37
- cirq/devices/thermal_noise_model_test.py +21 -0
- cirq/devices/unconstrained_device.py +5 -3
- cirq/devices/unconstrained_device_test.py +2 -0
- cirq/experiments/__init__.py +4 -2
- cirq/experiments/benchmarking/__init__.py +17 -0
- cirq/experiments/benchmarking/parallel_xeb.py +677 -0
- cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
- cirq/experiments/fidelity_estimation.py +14 -8
- cirq/experiments/fidelity_estimation_test.py +3 -0
- cirq/experiments/n_qubit_tomography.py +17 -16
- cirq/experiments/n_qubit_tomography_test.py +8 -5
- cirq/experiments/purity_estimation.py +2 -0
- cirq/experiments/purity_estimation_test.py +2 -0
- cirq/experiments/qubit_characterizations.py +207 -103
- cirq/experiments/qubit_characterizations_test.py +40 -12
- cirq/experiments/random_quantum_circuit_generation.py +56 -70
- cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
- cirq/experiments/readout_confusion_matrix.py +24 -22
- cirq/experiments/readout_confusion_matrix_test.py +2 -0
- cirq/experiments/single_qubit_readout_calibration.py +30 -15
- cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
- cirq/experiments/t1_decay_experiment.py +9 -7
- cirq/experiments/t1_decay_experiment_test.py +13 -11
- cirq/experiments/t2_decay_experiment.py +16 -13
- cirq/experiments/t2_decay_experiment_test.py +2 -0
- cirq/experiments/two_qubit_xeb.py +64 -57
- cirq/experiments/two_qubit_xeb_test.py +10 -6
- cirq/experiments/xeb_fitting.py +39 -35
- cirq/experiments/xeb_sampling.py +37 -44
- cirq/experiments/xeb_sampling_test.py +3 -0
- cirq/experiments/xeb_simulation.py +14 -10
- cirq/experiments/xeb_simulation_test.py +5 -5
- cirq/experiments/z_phase_calibration.py +32 -29
- cirq/experiments/z_phase_calibration_test.py +3 -4
- cirq/interop/quirk/cells/__init__.py +1 -1
- cirq/interop/quirk/cells/all_cells.py +7 -2
- cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
- cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
- cirq/interop/quirk/cells/cell.py +19 -28
- cirq/interop/quirk/cells/cell_test.py +3 -0
- cirq/interop/quirk/cells/composite_cell.py +13 -28
- cirq/interop/quirk/cells/composite_cell_test.py +2 -0
- cirq/interop/quirk/cells/control_cells.py +15 -15
- cirq/interop/quirk/cells/control_cells_test.py +7 -5
- cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
- cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
- cirq/interop/quirk/cells/ignored_cells.py +3 -0
- cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
- cirq/interop/quirk/cells/input_cells.py +7 -5
- cirq/interop/quirk/cells/input_cells_test.py +7 -5
- cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
- cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
- cirq/interop/quirk/cells/measurement_cells.py +5 -2
- cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
- cirq/interop/quirk/cells/parse.py +22 -23
- cirq/interop/quirk/cells/parse_test.py +12 -10
- cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
- cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
- cirq/interop/quirk/cells/scalar_cells.py +4 -1
- cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
- cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
- cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
- cirq/interop/quirk/cells/swap_cell.py +8 -6
- cirq/interop/quirk/cells/swap_cell_test.py +6 -4
- cirq/interop/quirk/cells/testing.py +6 -6
- cirq/interop/quirk/cells/testing_test.py +8 -6
- cirq/interop/quirk/cells/unsupported_cells.py +3 -0
- cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
- cirq/interop/quirk/url_to_circuit.py +23 -36
- cirq/interop/quirk/url_to_circuit_test.py +4 -1
- cirq/json_resolver_cache.py +14 -12
- cirq/linalg/__init__.py +4 -6
- cirq/linalg/combinators.py +7 -5
- cirq/linalg/combinators_test.py +10 -7
- cirq/linalg/decompositions.py +24 -35
- cirq/linalg/decompositions_test.py +3 -1
- cirq/linalg/diagonalize.py +6 -4
- cirq/linalg/diagonalize_test.py +15 -14
- cirq/linalg/operator_spaces.py +14 -14
- cirq/linalg/operator_spaces_test.py +13 -11
- cirq/linalg/predicates.py +18 -9
- cirq/linalg/predicates_test.py +5 -0
- cirq/linalg/tolerance.py +6 -3
- cirq/linalg/tolerance_test.py +6 -4
- cirq/linalg/transformations.py +23 -20
- cirq/linalg/transformations_test.py +73 -43
- cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
- cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
- cirq/neutral_atoms/neutral_atom_devices.py +2 -0
- cirq/ops/__init__.py +2 -0
- cirq/ops/arithmetic_operation.py +21 -21
- cirq/ops/arithmetic_operation_test.py +7 -8
- cirq/ops/boolean_hamiltonian.py +23 -22
- cirq/ops/boolean_hamiltonian_test.py +12 -9
- cirq/ops/classically_controlled_operation.py +31 -36
- cirq/ops/classically_controlled_operation_test.py +121 -117
- cirq/ops/clifford_gate.py +98 -81
- cirq/ops/clifford_gate_test.py +72 -57
- cirq/ops/common_channels.py +44 -44
- cirq/ops/common_channels_test.py +83 -81
- cirq/ops/common_gate_families.py +9 -7
- cirq/ops/common_gate_families_test.py +11 -7
- cirq/ops/common_gates.py +164 -183
- cirq/ops/common_gates_test.py +135 -95
- cirq/ops/control_values.py +23 -26
- cirq/ops/control_values_test.py +22 -20
- cirq/ops/controlled_gate.py +64 -112
- cirq/ops/controlled_gate_test.py +130 -35
- cirq/ops/controlled_operation.py +24 -35
- cirq/ops/controlled_operation_test.py +8 -6
- cirq/ops/dense_pauli_string.py +38 -49
- cirq/ops/dense_pauli_string_test.py +4 -2
- cirq/ops/diagonal_gate.py +18 -31
- cirq/ops/diagonal_gate_test.py +13 -13
- cirq/ops/eigen_gate.py +29 -29
- cirq/ops/eigen_gate_test.py +45 -28
- cirq/ops/fourier_transform.py +14 -20
- cirq/ops/fourier_transform_test.py +15 -12
- cirq/ops/fsim_gate.py +43 -42
- cirq/ops/fsim_gate_test.py +29 -29
- cirq/ops/gate_features.py +2 -0
- cirq/ops/gate_features_test.py +5 -3
- cirq/ops/gate_operation.py +43 -65
- cirq/ops/gate_operation_test.py +46 -42
- cirq/ops/gateset.py +28 -40
- cirq/ops/gateset_test.py +4 -2
- cirq/ops/global_phase_op.py +45 -20
- cirq/ops/global_phase_op_test.py +44 -20
- cirq/ops/greedy_qubit_manager.py +10 -8
- cirq/ops/greedy_qubit_manager_test.py +5 -3
- cirq/ops/identity.py +14 -12
- cirq/ops/identity_test.py +24 -20
- cirq/ops/kraus_channel.py +11 -8
- cirq/ops/kraus_channel_test.py +14 -11
- cirq/ops/linear_combinations.py +65 -77
- cirq/ops/linear_combinations_test.py +14 -9
- cirq/ops/matrix_gates.py +21 -18
- cirq/ops/matrix_gates_test.py +16 -0
- cirq/ops/measure_util.py +15 -20
- cirq/ops/measure_util_test.py +2 -0
- cirq/ops/measurement_gate.py +26 -37
- cirq/ops/measurement_gate_test.py +2 -0
- cirq/ops/mixed_unitary_channel.py +12 -9
- cirq/ops/mixed_unitary_channel_test.py +14 -11
- cirq/ops/named_qubit.py +16 -13
- cirq/ops/named_qubit_test.py +15 -13
- cirq/ops/op_tree.py +9 -7
- cirq/ops/op_tree_test.py +22 -19
- cirq/ops/parallel_gate.py +15 -17
- cirq/ops/parallel_gate_test.py +18 -16
- cirq/ops/parity_gates.py +23 -25
- cirq/ops/parity_gates_test.py +36 -32
- cirq/ops/pauli_gates.py +22 -21
- cirq/ops/pauli_gates_test.py +29 -20
- cirq/ops/pauli_interaction_gate.py +15 -19
- cirq/ops/pauli_interaction_gate_test.py +10 -8
- cirq/ops/pauli_measurement_gate.py +23 -35
- cirq/ops/pauli_measurement_gate_test.py +2 -0
- cirq/ops/pauli_string.py +92 -120
- cirq/ops/pauli_string_phasor.py +52 -45
- cirq/ops/pauli_string_phasor_test.py +4 -5
- cirq/ops/pauli_string_raw_types.py +9 -7
- cirq/ops/pauli_string_raw_types_test.py +2 -0
- cirq/ops/pauli_string_test.py +31 -154
- cirq/ops/pauli_sum_exponential.py +12 -12
- cirq/ops/pauli_sum_exponential_test.py +12 -10
- cirq/ops/permutation_gate.py +8 -6
- cirq/ops/permutation_gate_test.py +10 -8
- cirq/ops/phased_iswap_gate.py +16 -16
- cirq/ops/phased_iswap_gate_test.py +17 -15
- cirq/ops/phased_x_gate.py +16 -17
- cirq/ops/phased_x_gate_test.py +18 -16
- cirq/ops/phased_x_z_gate.py +24 -22
- cirq/ops/phased_x_z_gate_test.py +17 -11
- cirq/ops/projector.py +16 -11
- cirq/ops/projector_test.py +19 -16
- cirq/ops/qid_util.py +7 -5
- cirq/ops/qid_util_test.py +2 -0
- cirq/ops/qubit_manager.py +11 -9
- cirq/ops/qubit_manager_test.py +6 -4
- cirq/ops/qubit_order.py +11 -14
- cirq/ops/qubit_order_or_list.py +4 -2
- cirq/ops/qubit_order_test.py +12 -10
- cirq/ops/random_gate_channel.py +12 -10
- cirq/ops/random_gate_channel_test.py +14 -11
- cirq/ops/raw_types.py +109 -129
- cirq/ops/raw_types_test.py +63 -57
- cirq/ops/state_preparation_channel.py +7 -7
- cirq/ops/state_preparation_channel_test.py +11 -9
- cirq/ops/swap_gates.py +13 -15
- cirq/ops/swap_gates_test.py +19 -17
- cirq/ops/tags.py +5 -3
- cirq/ops/tags_test.py +4 -2
- cirq/ops/three_qubit_gates.py +43 -76
- cirq/ops/three_qubit_gates_test.py +19 -17
- cirq/ops/two_qubit_diagonal_gate.py +13 -13
- cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
- cirq/ops/uniform_superposition_gate.py +5 -3
- cirq/ops/uniform_superposition_gate_test.py +5 -3
- cirq/ops/wait_gate.py +17 -14
- cirq/ops/wait_gate_test.py +9 -6
- cirq/protocols/__init__.py +0 -3
- cirq/protocols/act_on_protocol.py +8 -6
- cirq/protocols/act_on_protocol_test.py +15 -12
- cirq/protocols/apply_channel_protocol.py +10 -14
- cirq/protocols/apply_channel_protocol_test.py +2 -0
- cirq/protocols/apply_mixture_protocol.py +13 -42
- cirq/protocols/apply_mixture_protocol_test.py +7 -5
- cirq/protocols/apply_unitary_protocol.py +39 -34
- cirq/protocols/apply_unitary_protocol_test.py +4 -1
- cirq/protocols/approximate_equality_protocol.py +2 -0
- cirq/protocols/approximate_equality_protocol_test.py +2 -0
- cirq/protocols/circuit_diagram_info_protocol.py +58 -42
- cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
- cirq/protocols/commutes_protocol.py +8 -7
- cirq/protocols/commutes_protocol_test.py +2 -0
- cirq/protocols/control_key_protocol.py +6 -4
- cirq/protocols/control_key_protocol_test.py +3 -1
- cirq/protocols/decompose_protocol.py +49 -48
- cirq/protocols/decompose_protocol_test.py +27 -16
- cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
- cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
- cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
- cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
- cirq/protocols/has_unitary_protocol.py +10 -6
- cirq/protocols/has_unitary_protocol_test.py +13 -8
- cirq/protocols/hash_from_pickle_test.py +2 -11
- cirq/protocols/inverse_protocol.py +13 -16
- cirq/protocols/inverse_protocol_test.py +5 -3
- cirq/protocols/json_serialization.py +35 -54
- cirq/protocols/json_serialization_test.py +14 -21
- cirq/protocols/json_test_data/CXSWAP.json +46 -0
- cirq/protocols/json_test_data/CXSWAP.repr +13 -0
- cirq/protocols/json_test_data/CZSWAP.json +46 -0
- cirq/protocols/json_test_data/CZSWAP.repr +13 -0
- cirq/protocols/json_test_data/CircuitOperation.json +6 -3
- cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
- cirq/protocols/json_test_data/Moment.json +24 -1
- cirq/protocols/json_test_data/Moment.repr +6 -1
- cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
- cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
- cirq/protocols/json_test_data/spec.py +6 -2
- cirq/protocols/kraus_protocol.py +47 -7
- cirq/protocols/kraus_protocol_test.py +86 -12
- cirq/protocols/measurement_key_protocol.py +15 -16
- cirq/protocols/measurement_key_protocol_test.py +13 -11
- cirq/protocols/mixture_protocol.py +7 -5
- cirq/protocols/mixture_protocol_test.py +4 -2
- cirq/protocols/mul_protocol.py +2 -3
- cirq/protocols/mul_protocol_test.py +2 -0
- cirq/protocols/pauli_expansion_protocol.py +6 -3
- cirq/protocols/pauli_expansion_protocol_test.py +5 -3
- cirq/protocols/phase_protocol.py +2 -0
- cirq/protocols/phase_protocol_test.py +3 -1
- cirq/protocols/pow_protocol.py +11 -16
- cirq/protocols/pow_protocol_test.py +2 -0
- cirq/protocols/qasm.py +14 -20
- cirq/protocols/qasm_test.py +6 -3
- cirq/protocols/qid_shape_protocol.py +8 -8
- cirq/protocols/qid_shape_protocol_test.py +3 -1
- cirq/protocols/resolve_parameters.py +5 -3
- cirq/protocols/resolve_parameters_test.py +8 -7
- cirq/protocols/trace_distance_bound.py +6 -4
- cirq/protocols/trace_distance_bound_test.py +3 -1
- cirq/protocols/unitary_protocol.py +17 -7
- cirq/protocols/unitary_protocol_test.py +12 -2
- cirq/qis/channels.py +6 -2
- cirq/qis/channels_test.py +20 -16
- cirq/qis/clifford_tableau.py +21 -19
- cirq/qis/clifford_tableau_test.py +2 -2
- cirq/qis/entropy.py +14 -3
- cirq/qis/entropy_test.py +3 -1
- cirq/qis/measures.py +13 -13
- cirq/qis/measures_test.py +20 -14
- cirq/qis/noise_utils.py +2 -0
- cirq/qis/noise_utils_test.py +9 -7
- cirq/qis/quantum_state_representation.py +7 -8
- cirq/qis/states.py +58 -56
- cirq/qis/states_test.py +2 -0
- cirq/sim/classical_simulator.py +23 -22
- cirq/sim/classical_simulator_test.py +2 -0
- cirq/sim/clifford/clifford_simulator.py +23 -21
- cirq/sim/clifford/clifford_simulator_test.py +7 -4
- cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
- cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
- cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
- cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
- cirq/sim/clifford/stabilizer_sampler.py +9 -7
- cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
- cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
- cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
- cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
- cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
- cirq/sim/density_matrix_simulation_state.py +26 -27
- cirq/sim/density_matrix_simulation_state_test.py +10 -8
- cirq/sim/density_matrix_simulator.py +30 -28
- cirq/sim/density_matrix_simulator_test.py +48 -48
- cirq/sim/density_matrix_utils.py +13 -11
- cirq/sim/density_matrix_utils_test.py +38 -36
- cirq/sim/mux.py +33 -31
- cirq/sim/mux_test.py +3 -0
- cirq/sim/simulation_product_state.py +15 -15
- cirq/sim/simulation_product_state_test.py +29 -26
- cirq/sim/simulation_state.py +29 -38
- cirq/sim/simulation_state_base.py +21 -32
- cirq/sim/simulation_state_test.py +15 -13
- cirq/sim/simulation_utils.py +5 -2
- cirq/sim/simulation_utils_test.py +5 -2
- cirq/sim/simulator.py +90 -106
- cirq/sim/simulator_base.py +33 -45
- cirq/sim/simulator_base_test.py +20 -15
- cirq/sim/simulator_test.py +23 -14
- cirq/sim/sparse_simulator.py +19 -17
- cirq/sim/sparse_simulator_test.py +41 -40
- cirq/sim/state_vector.py +15 -12
- cirq/sim/state_vector_simulation_state.py +31 -31
- cirq/sim/state_vector_simulation_state_test.py +16 -14
- cirq/sim/state_vector_simulator.py +17 -14
- cirq/sim/state_vector_simulator_test.py +2 -0
- cirq/sim/state_vector_test.py +6 -3
- cirq/study/flatten_expressions.py +16 -15
- cirq/study/flatten_expressions_test.py +13 -11
- cirq/study/resolver.py +18 -17
- cirq/study/resolver_test.py +22 -20
- cirq/study/result.py +17 -27
- cirq/study/result_test.py +2 -0
- cirq/study/sweepable.py +12 -10
- cirq/study/sweepable_test.py +3 -0
- cirq/study/sweeps.py +42 -61
- cirq/study/sweeps_test.py +33 -0
- cirq/testing/__init__.py +7 -11
- cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
- cirq/testing/circuit_compare.py +8 -17
- cirq/testing/circuit_compare_test.py +2 -0
- cirq/testing/consistent_act_on.py +13 -11
- cirq/testing/consistent_act_on_test.py +5 -3
- cirq/testing/consistent_channels.py +2 -0
- cirq/testing/consistent_channels_test.py +10 -8
- cirq/testing/consistent_controlled_gate_op.py +5 -5
- cirq/testing/consistent_controlled_gate_op_test.py +18 -18
- cirq/testing/consistent_decomposition.py +2 -2
- cirq/testing/consistent_decomposition_test.py +4 -2
- cirq/testing/consistent_pauli_expansion.py +2 -0
- cirq/testing/consistent_pauli_expansion_test.py +3 -1
- cirq/testing/consistent_phase_by.py +2 -0
- cirq/testing/consistent_phase_by_test.py +3 -1
- cirq/testing/consistent_protocols.py +14 -20
- cirq/testing/consistent_protocols_test.py +13 -11
- cirq/testing/consistent_qasm.py +6 -4
- cirq/testing/consistent_qasm_test.py +7 -7
- cirq/testing/consistent_resolve_parameters.py +2 -0
- cirq/testing/consistent_specified_has_unitary.py +2 -2
- cirq/testing/consistent_specified_has_unitary_test.py +6 -4
- cirq/testing/consistent_unitary.py +1 -0
- cirq/testing/consistent_unitary_test.py +4 -2
- cirq/testing/deprecation.py +5 -2
- cirq/testing/deprecation_test.py +5 -2
- cirq/testing/devices.py +7 -4
- cirq/testing/devices_test.py +7 -4
- cirq/testing/equals_tester.py +4 -2
- cirq/testing/equals_tester_test.py +21 -17
- cirq/testing/equivalent_basis_map.py +6 -4
- cirq/testing/equivalent_basis_map_test.py +6 -4
- cirq/testing/equivalent_repr_eval.py +6 -4
- cirq/testing/equivalent_repr_eval_test.py +5 -3
- cirq/testing/gate_features.py +2 -0
- cirq/testing/gate_features_test.py +7 -5
- cirq/testing/json.py +19 -15
- cirq/testing/json_test.py +5 -3
- cirq/testing/lin_alg_utils.py +10 -11
- cirq/testing/lin_alg_utils_test.py +14 -12
- cirq/testing/logs.py +7 -6
- cirq/testing/logs_test.py +9 -7
- cirq/testing/no_identifier_qubit.py +4 -2
- cirq/testing/no_identifier_qubit_test.py +5 -3
- cirq/testing/op_tree.py +2 -0
- cirq/testing/op_tree_test.py +4 -1
- cirq/testing/order_tester.py +2 -0
- cirq/testing/order_tester_test.py +8 -6
- cirq/testing/pytest_utils.py +2 -0
- cirq/testing/pytest_utils_test.py +4 -2
- cirq/testing/random_circuit.py +21 -20
- cirq/testing/random_circuit_test.py +12 -9
- cirq/testing/repr_pretty_tester.py +1 -0
- cirq/testing/repr_pretty_tester_test.py +5 -3
- cirq/testing/routing_devices.py +4 -1
- cirq/testing/routing_devices_test.py +9 -6
- cirq/testing/sample_circuits.py +4 -1
- cirq/testing/sample_circuits_test.py +3 -1
- cirq/testing/sample_gates.py +3 -0
- cirq/testing/sample_gates_test.py +5 -2
- cirq/transformers/__init__.py +11 -4
- cirq/transformers/align.py +9 -7
- cirq/transformers/align_test.py +2 -0
- cirq/transformers/analytical_decompositions/__init__.py +3 -6
- cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
- cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
- cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
- cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
- cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
- cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
- cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
- cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
- cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
- cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
- cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
- cirq/transformers/drop_empty_moments.py +5 -3
- cirq/transformers/drop_empty_moments_test.py +4 -2
- cirq/transformers/drop_negligible_operations.py +7 -5
- cirq/transformers/drop_negligible_operations_test.py +2 -0
- cirq/transformers/dynamical_decoupling.py +49 -42
- cirq/transformers/dynamical_decoupling_test.py +223 -205
- cirq/transformers/eject_phased_paulis.py +28 -26
- cirq/transformers/eject_phased_paulis_test.py +12 -9
- cirq/transformers/eject_z.py +12 -12
- cirq/transformers/eject_z_test.py +2 -2
- cirq/transformers/expand_composite.py +6 -4
- cirq/transformers/expand_composite_test.py +3 -1
- cirq/transformers/gauge_compiling/__init__.py +3 -1
- cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
- cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
- cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
- cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
- cirq/transformers/insertion_sort.py +8 -6
- cirq/transformers/insertion_sort_test.py +3 -1
- cirq/transformers/measurement_transformers.py +29 -29
- cirq/transformers/measurement_transformers_test.py +2 -0
- cirq/transformers/merge_k_qubit_gates.py +12 -10
- cirq/transformers/merge_k_qubit_gates_test.py +18 -18
- cirq/transformers/merge_single_qubit_gates.py +197 -20
- cirq/transformers/merge_single_qubit_gates_test.py +177 -5
- cirq/transformers/noise_adding.py +5 -3
- cirq/transformers/noise_adding_test.py +2 -0
- cirq/transformers/optimize_for_target_gateset.py +19 -17
- cirq/transformers/optimize_for_target_gateset_test.py +11 -8
- cirq/transformers/qubit_management_transformers.py +13 -11
- cirq/transformers/qubit_management_transformers_test.py +5 -3
- cirq/transformers/randomized_measurements.py +16 -14
- cirq/transformers/randomized_measurements_test.py +10 -4
- cirq/transformers/routing/initial_mapper.py +6 -4
- cirq/transformers/routing/initial_mapper_test.py +2 -0
- cirq/transformers/routing/line_initial_mapper.py +16 -14
- cirq/transformers/routing/line_initial_mapper_test.py +9 -7
- cirq/transformers/routing/mapping_manager.py +10 -10
- cirq/transformers/routing/mapping_manager_test.py +2 -0
- cirq/transformers/routing/route_circuit_cqc.py +33 -31
- cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
- cirq/transformers/routing/visualize_routed_circuit.py +8 -7
- cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
- cirq/transformers/stratify.py +17 -15
- cirq/transformers/stratify_test.py +3 -0
- cirq/transformers/symbolize.py +103 -0
- cirq/transformers/symbolize_test.py +62 -0
- cirq/transformers/synchronize_terminal_measurements.py +10 -10
- cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
- cirq/transformers/tag_transformers.py +97 -0
- cirq/transformers/tag_transformers_test.py +103 -0
- cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
- cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
- cirq/transformers/target_gatesets/cz_gateset.py +7 -5
- cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
- cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
- cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
- cirq/transformers/transformer_api.py +34 -47
- cirq/transformers/transformer_api_test.py +9 -8
- cirq/transformers/transformer_primitives.py +39 -49
- cirq/transformers/transformer_primitives_test.py +10 -17
- cirq/value/abc_alt.py +6 -4
- cirq/value/abc_alt_test.py +5 -3
- cirq/value/angle.py +11 -12
- cirq/value/angle_test.py +5 -3
- cirq/value/classical_data.py +27 -27
- cirq/value/classical_data_test.py +11 -8
- cirq/value/condition.py +26 -24
- cirq/value/condition_test.py +2 -0
- cirq/value/digits.py +14 -11
- cirq/value/digits_test.py +2 -0
- cirq/value/duration.py +23 -20
- cirq/value/duration_test.py +2 -0
- cirq/value/linear_dict.py +25 -30
- cirq/value/linear_dict_test.py +10 -8
- cirq/value/measurement_key.py +12 -12
- cirq/value/measurement_key_test.py +2 -0
- cirq/value/periodic_value.py +4 -4
- cirq/value/periodic_value_test.py +11 -7
- cirq/value/probability.py +3 -1
- cirq/value/probability_test.py +4 -2
- cirq/value/product_state.py +15 -13
- cirq/value/product_state_test.py +4 -1
- cirq/value/random_state.py +2 -0
- cirq/value/random_state_test.py +5 -3
- cirq/value/timestamp.py +11 -7
- cirq/value/timestamp_test.py +14 -12
- cirq/value/type_alias.py +4 -4
- cirq/value/value_equality_attr.py +8 -9
- cirq/value/value_equality_attr_test.py +14 -11
- cirq/vis/density_matrix.py +3 -3
- cirq/vis/density_matrix_test.py +20 -17
- cirq/vis/heatmap.py +24 -37
- cirq/vis/heatmap_test.py +3 -0
- cirq/vis/histogram.py +9 -6
- cirq/vis/histogram_test.py +5 -2
- cirq/vis/state_histogram.py +10 -8
- cirq/vis/state_histogram_test.py +7 -5
- cirq/vis/vis_utils.py +4 -1
- cirq/vis/vis_utils_test.py +4 -1
- cirq/work/collector.py +12 -18
- cirq/work/collector_test.py +15 -10
- cirq/work/observable_grouping.py +6 -7
- cirq/work/observable_grouping_test.py +10 -9
- cirq/work/observable_measurement.py +47 -45
- cirq/work/observable_measurement_data.py +22 -17
- cirq/work/observable_measurement_data_test.py +4 -1
- cirq/work/observable_measurement_test.py +48 -29
- cirq/work/observable_readout_calibration.py +5 -2
- cirq/work/observable_readout_calibration_test.py +5 -2
- cirq/work/observable_settings.py +13 -22
- cirq/work/observable_settings_test.py +9 -7
- cirq/work/pauli_sum_collector.py +12 -10
- cirq/work/pauli_sum_collector_test.py +9 -9
- cirq/work/sampler.py +42 -43
- cirq/work/sampler_test.py +31 -24
- cirq/work/zeros_sampler.py +6 -4
- cirq/work/zeros_sampler_test.py +7 -5
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
- cirq_core-1.6.0.dist-info/RECORD +1241 -0
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
- cirq_core-1.5.0.dev20250409225226.dist-info/RECORD +0 -1216
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
|
@@ -11,12 +11,15 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
14
17
|
import numpy as np
|
|
15
18
|
|
|
16
19
|
import cirq
|
|
17
20
|
|
|
18
21
|
|
|
19
|
-
def test_equal_up_to_global_phase_primitives():
|
|
22
|
+
def test_equal_up_to_global_phase_primitives() -> None:
|
|
20
23
|
assert cirq.equal_up_to_global_phase(1.0 + 1j, 1.0 + 1j, atol=1e-9)
|
|
21
24
|
assert not cirq.equal_up_to_global_phase(2.0, 1.0 + 1j, atol=1e-9)
|
|
22
25
|
assert cirq.equal_up_to_global_phase(1.0 + 1j, 1.0 - 1j, atol=1e-9)
|
|
@@ -34,7 +37,7 @@ def test_equal_up_to_global_phase_primitives():
|
|
|
34
37
|
assert cirq.equal_up_to_global_phase(1.0 + 1e-10j, 1.0, atol=1e-15)
|
|
35
38
|
|
|
36
39
|
|
|
37
|
-
def test_equal_up_to_global_numeric_iterables():
|
|
40
|
+
def test_equal_up_to_global_numeric_iterables() -> None:
|
|
38
41
|
assert cirq.equal_up_to_global_phase([], [], atol=1e-9)
|
|
39
42
|
assert cirq.equal_up_to_global_phase([[]], [[]], atol=1e-9)
|
|
40
43
|
assert cirq.equal_up_to_global_phase([1j, 1], [1j, 1], atol=1e-9)
|
|
@@ -49,7 +52,7 @@ def test_equal_up_to_global_numeric_iterables():
|
|
|
49
52
|
assert not cirq.equal_up_to_global_phase((1j, 1), (1, 1j), atol=1e-09)
|
|
50
53
|
|
|
51
54
|
|
|
52
|
-
def test_equal_up_to_global_numpy_array():
|
|
55
|
+
def test_equal_up_to_global_numpy_array() -> None:
|
|
53
56
|
assert cirq.equal_up_to_global_phase(
|
|
54
57
|
np.asarray([1j, 1j]), np.asarray([1, 1], dtype=np.complex64)
|
|
55
58
|
)
|
|
@@ -60,7 +63,7 @@ def test_equal_up_to_global_numpy_array():
|
|
|
60
63
|
assert cirq.equal_up_to_global_phase(np.asarray([[]]), np.asarray([[]]))
|
|
61
64
|
|
|
62
65
|
|
|
63
|
-
def test_equal_up_to_global_mixed_array_types():
|
|
66
|
+
def test_equal_up_to_global_mixed_array_types() -> None:
|
|
64
67
|
a = [1j, 1, -1j, -1]
|
|
65
68
|
b = [-1, 1j, 1, -1j]
|
|
66
69
|
c = [-1, 1, -1, 1]
|
|
@@ -108,7 +111,7 @@ class B:
|
|
|
108
111
|
return cirq.equal_up_to_global_phase(self.val[0], other, atol=atol)
|
|
109
112
|
|
|
110
113
|
|
|
111
|
-
def test_equal_up_to_global_phase_eq_supported():
|
|
114
|
+
def test_equal_up_to_global_phase_eq_supported() -> None:
|
|
112
115
|
assert cirq.equal_up_to_global_phase(A(0.1 + 0j), A(0.1j), atol=1e-2)
|
|
113
116
|
assert not cirq.equal_up_to_global_phase(A(0.0 + 0j), A(0.1j), atol=0.0)
|
|
114
117
|
assert not cirq.equal_up_to_global_phase(A(0.0 + 0j), 0.1j, atol=0.0)
|
|
@@ -120,7 +123,7 @@ def test_equal_up_to_global_phase_eq_supported():
|
|
|
120
123
|
assert not cirq.equal_up_to_global_phase(1e-8j, B(0.0), atol=1e-10)
|
|
121
124
|
|
|
122
125
|
|
|
123
|
-
def test_equal_up_to_global_phase_non_eigen_gates():
|
|
126
|
+
def test_equal_up_to_global_phase_non_eigen_gates() -> None:
|
|
124
127
|
gate1 = cirq.PhasedXPowGate(phase_exponent=1.5, exponent=1.0)
|
|
125
128
|
gate2 = cirq.PhasedXPowGate(phase_exponent=0.5, exponent=1.0)
|
|
126
129
|
assert cirq.equal_up_to_global_phase(gate1, gate2)
|
|
@@ -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
|
import cirq.protocols.decompose_protocol as decompose_protocol
|
|
18
20
|
import cirq.protocols.has_unitary_protocol as has_unitary_protocol
|
|
@@ -50,7 +52,7 @@ def has_stabilizer_effect(val: Any) -> bool:
|
|
|
50
52
|
return False
|
|
51
53
|
|
|
52
54
|
|
|
53
|
-
def _strat_has_stabilizer_effect_from_has_stabilizer_effect(val: Any) ->
|
|
55
|
+
def _strat_has_stabilizer_effect_from_has_stabilizer_effect(val: Any) -> bool | None:
|
|
54
56
|
"""Infer whether val has stabilizer effect via its `_has_stabilizer_effect_` method."""
|
|
55
57
|
if hasattr(val, '_has_stabilizer_effect_'):
|
|
56
58
|
result = val._has_stabilizer_effect_()
|
|
@@ -59,14 +61,14 @@ def _strat_has_stabilizer_effect_from_has_stabilizer_effect(val: Any) -> Optiona
|
|
|
59
61
|
return None
|
|
60
62
|
|
|
61
63
|
|
|
62
|
-
def _strat_has_stabilizer_effect_from_gate(val: Any) ->
|
|
64
|
+
def _strat_has_stabilizer_effect_from_gate(val: Any) -> bool | None:
|
|
63
65
|
"""Infer whether val's gate has stabilizer effect via the _has_stabilizer_effect_ method."""
|
|
64
66
|
if hasattr(val, 'gate'):
|
|
65
67
|
return _strat_has_stabilizer_effect_from_has_stabilizer_effect(val.gate)
|
|
66
68
|
return None
|
|
67
69
|
|
|
68
70
|
|
|
69
|
-
def _strat_has_stabilizer_effect_from_unitary(val: Any) ->
|
|
71
|
+
def _strat_has_stabilizer_effect_from_unitary(val: Any) -> bool | None:
|
|
70
72
|
"""Attempts to infer whether val has stabilizer effect from its unitary.
|
|
71
73
|
|
|
72
74
|
Returns whether unitary of `val` normalizes the Pauli group. Works only for
|
|
@@ -101,7 +103,7 @@ def _strat_has_stabilizer_effect_from_unitary(val: Any) -> Optional[bool]:
|
|
|
101
103
|
return True
|
|
102
104
|
|
|
103
105
|
|
|
104
|
-
def _strat_has_stabilizer_effect_from_decompose(val: Any) ->
|
|
106
|
+
def _strat_has_stabilizer_effect_from_decompose(val: Any) -> bool | None:
|
|
105
107
|
decomposition, _, _ = decompose_protocol._try_decompose_into_operations_and_qubits(val)
|
|
106
108
|
if decomposition is None:
|
|
107
109
|
return None
|
|
@@ -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
|
|
|
17
19
|
import cirq
|
|
@@ -105,7 +107,7 @@ class GateDecomposes(cirq.Gate):
|
|
|
105
107
|
yield YesOp(*qubits)
|
|
106
108
|
|
|
107
109
|
|
|
108
|
-
def test_inconclusive():
|
|
110
|
+
def test_inconclusive() -> None:
|
|
109
111
|
assert not cirq.has_stabilizer_effect(object())
|
|
110
112
|
assert not cirq.has_stabilizer_effect('boo')
|
|
111
113
|
assert not cirq.has_stabilizer_effect(cirq.testing.SingleQubitGate())
|
|
@@ -113,21 +115,21 @@ def test_inconclusive():
|
|
|
113
115
|
assert not cirq.has_stabilizer_effect(NoOp())
|
|
114
116
|
|
|
115
117
|
|
|
116
|
-
def test_via_has_stabilizer_effect_method():
|
|
118
|
+
def test_via_has_stabilizer_effect_method() -> None:
|
|
117
119
|
assert not cirq.has_stabilizer_effect(No1())
|
|
118
120
|
assert not cirq.has_stabilizer_effect(No2())
|
|
119
121
|
assert not cirq.has_stabilizer_effect(No3())
|
|
120
122
|
assert cirq.has_stabilizer_effect(Yes())
|
|
121
123
|
|
|
122
124
|
|
|
123
|
-
def test_via_gate_of_op():
|
|
125
|
+
def test_via_gate_of_op() -> None:
|
|
124
126
|
assert cirq.has_stabilizer_effect(YesOp())
|
|
125
127
|
assert not cirq.has_stabilizer_effect(NoOp1())
|
|
126
128
|
assert not cirq.has_stabilizer_effect(NoOp2())
|
|
127
129
|
assert not cirq.has_stabilizer_effect(NoOp3())
|
|
128
130
|
|
|
129
131
|
|
|
130
|
-
def test_via_unitary():
|
|
132
|
+
def test_via_unitary() -> None:
|
|
131
133
|
op1 = OpWithUnitary(np.array([[0, 1], [1, 0]]))
|
|
132
134
|
assert cirq.has_stabilizer_effect(op1)
|
|
133
135
|
|
|
@@ -148,7 +150,7 @@ def test_via_unitary():
|
|
|
148
150
|
assert not cirq.has_stabilizer_effect(cirq.CCZ)
|
|
149
151
|
|
|
150
152
|
|
|
151
|
-
def test_via_decompose():
|
|
153
|
+
def test_via_decompose() -> None:
|
|
152
154
|
assert cirq.has_stabilizer_effect(cirq.Circuit(cirq.H.on_each(cirq.LineQubit.range(4))))
|
|
153
155
|
assert not cirq.has_stabilizer_effect(cirq.Circuit(cirq.T.on_each(cirq.LineQubit.range(4))))
|
|
154
156
|
assert not cirq.has_stabilizer_effect(
|
|
@@ -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
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import Any, TypeVar
|
|
16
18
|
|
|
17
19
|
import numpy as np
|
|
18
20
|
from typing_extensions import Protocol
|
|
19
21
|
|
|
20
|
-
from cirq import qis
|
|
22
|
+
from cirq import linalg, qis
|
|
21
23
|
from cirq._doc import doc_private
|
|
22
24
|
from cirq.protocols import qid_shape_protocol
|
|
23
25
|
from cirq.protocols.apply_unitary_protocol import ApplyUnitaryArgs
|
|
@@ -108,8 +110,10 @@ def has_unitary(val: Any, *, allow_decompose: bool = True) -> bool:
|
|
|
108
110
|
return False
|
|
109
111
|
|
|
110
112
|
|
|
111
|
-
def _strat_has_unitary_from_has_unitary(val: Any) ->
|
|
113
|
+
def _strat_has_unitary_from_has_unitary(val: Any) -> bool | None:
|
|
112
114
|
"""Attempts to infer a value's unitary-ness via its _has_unitary_ method."""
|
|
115
|
+
if isinstance(val, np.ndarray):
|
|
116
|
+
return linalg.is_unitary(val)
|
|
113
117
|
if hasattr(val, '_has_unitary_'):
|
|
114
118
|
result = val._has_unitary_()
|
|
115
119
|
if result is NotImplemented:
|
|
@@ -118,7 +122,7 @@ def _strat_has_unitary_from_has_unitary(val: Any) -> Optional[bool]:
|
|
|
118
122
|
return None
|
|
119
123
|
|
|
120
124
|
|
|
121
|
-
def _strat_has_unitary_from_unitary(val: Any) ->
|
|
125
|
+
def _strat_has_unitary_from_unitary(val: Any) -> bool | None:
|
|
122
126
|
"""Attempts to infer a value's unitary-ness via its _unitary_ method."""
|
|
123
127
|
getter = getattr(val, '_unitary_', None)
|
|
124
128
|
if getter is None:
|
|
@@ -127,7 +131,7 @@ def _strat_has_unitary_from_unitary(val: Any) -> Optional[bool]:
|
|
|
127
131
|
return result is not NotImplemented and result is not None
|
|
128
132
|
|
|
129
133
|
|
|
130
|
-
def _strat_has_unitary_from_decompose(val: Any) ->
|
|
134
|
+
def _strat_has_unitary_from_decompose(val: Any) -> bool | None:
|
|
131
135
|
"""Attempts to infer a value's unitary-ness via its _decompose_ method."""
|
|
132
136
|
operations, _, _ = _try_decompose_into_operations_and_qubits(val)
|
|
133
137
|
if operations is None:
|
|
@@ -135,7 +139,7 @@ def _strat_has_unitary_from_decompose(val: Any) -> Optional[bool]:
|
|
|
135
139
|
return all(has_unitary(op) for op in operations)
|
|
136
140
|
|
|
137
141
|
|
|
138
|
-
def _strat_has_unitary_from_apply_unitary(val: Any) ->
|
|
142
|
+
def _strat_has_unitary_from_apply_unitary(val: Any) -> bool | None:
|
|
139
143
|
"""Attempts to infer a value's unitary-ness via its _apply_unitary_ method."""
|
|
140
144
|
method = getattr(val, '_apply_unitary_', None)
|
|
141
145
|
if method is None:
|
|
@@ -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_inconclusive():
|
|
23
|
+
def test_inconclusive() -> None:
|
|
22
24
|
class No:
|
|
23
25
|
pass
|
|
24
26
|
|
|
@@ -30,7 +32,7 @@ def test_inconclusive():
|
|
|
30
32
|
@pytest.mark.parametrize(
|
|
31
33
|
'measurement_gate', (cirq.MeasurementGate(1, 'a'), cirq.PauliMeasurementGate([cirq.X], 'a'))
|
|
32
34
|
)
|
|
33
|
-
def test_fail_fast_measure(measurement_gate):
|
|
35
|
+
def test_fail_fast_measure(measurement_gate) -> None:
|
|
34
36
|
assert not cirq.has_unitary(measurement_gate)
|
|
35
37
|
|
|
36
38
|
qubit = cirq.NamedQubit('q0')
|
|
@@ -40,13 +42,13 @@ def test_fail_fast_measure(measurement_gate):
|
|
|
40
42
|
assert not cirq.has_unitary(circuit)
|
|
41
43
|
|
|
42
44
|
|
|
43
|
-
def test_fail_fast_measure_large_memory():
|
|
45
|
+
def test_fail_fast_measure_large_memory() -> None:
|
|
44
46
|
num_qubits = 100
|
|
45
47
|
measurement_op = cirq.MeasurementGate(num_qubits, 'a').on(*cirq.LineQubit.range(num_qubits))
|
|
46
48
|
assert not cirq.has_unitary(measurement_op)
|
|
47
49
|
|
|
48
50
|
|
|
49
|
-
def test_via_unitary():
|
|
51
|
+
def test_via_unitary() -> None:
|
|
50
52
|
class No1:
|
|
51
53
|
def _unitary_(self):
|
|
52
54
|
return NotImplemented
|
|
@@ -59,13 +61,16 @@ def test_via_unitary():
|
|
|
59
61
|
def _unitary_(self):
|
|
60
62
|
return np.array([[1]])
|
|
61
63
|
|
|
64
|
+
m = np.diag([1, -1])
|
|
62
65
|
assert not cirq.has_unitary(No1())
|
|
63
66
|
assert not cirq.has_unitary(No2())
|
|
67
|
+
assert not cirq.has_unitary(m * 2)
|
|
64
68
|
assert cirq.has_unitary(Yes())
|
|
65
69
|
assert cirq.has_unitary(Yes(), allow_decompose=False)
|
|
70
|
+
assert cirq.has_unitary(m)
|
|
66
71
|
|
|
67
72
|
|
|
68
|
-
def test_via_apply_unitary():
|
|
73
|
+
def test_via_apply_unitary() -> None:
|
|
69
74
|
class No1(EmptyOp):
|
|
70
75
|
def _apply_unitary_(self, args):
|
|
71
76
|
return None
|
|
@@ -100,7 +105,7 @@ def test_via_apply_unitary():
|
|
|
100
105
|
assert not cirq.has_unitary(No4())
|
|
101
106
|
|
|
102
107
|
|
|
103
|
-
def test_via_decompose():
|
|
108
|
+
def test_via_decompose() -> None:
|
|
104
109
|
class Yes1:
|
|
105
110
|
def _decompose_(self):
|
|
106
111
|
return []
|
|
@@ -132,7 +137,7 @@ def test_via_decompose():
|
|
|
132
137
|
assert not cirq.has_unitary(No1(), allow_decompose=False)
|
|
133
138
|
|
|
134
139
|
|
|
135
|
-
def test_via_has_unitary():
|
|
140
|
+
def test_via_has_unitary() -> None:
|
|
136
141
|
class No1:
|
|
137
142
|
def _has_unitary_(self):
|
|
138
143
|
return NotImplemented
|
|
@@ -150,7 +155,7 @@ def test_via_has_unitary():
|
|
|
150
155
|
assert cirq.has_unitary(Yes())
|
|
151
156
|
|
|
152
157
|
|
|
153
|
-
def test_order():
|
|
158
|
+
def test_order() -> None:
|
|
154
159
|
class Yes1(EmptyOp):
|
|
155
160
|
def _has_unitary_(self):
|
|
156
161
|
return True
|
|
@@ -50,13 +50,6 @@ _EXCLUDE_JSON_FILES = (
|
|
|
50
50
|
"cirq/protocols/json_test_data/sympy.Indexed.json",
|
|
51
51
|
"cirq/protocols/json_test_data/sympy.IndexedBase.json",
|
|
52
52
|
"cirq/protocols/json_test_data/sympy.pi.json",
|
|
53
|
-
# Cirq-Rigetti is deprecated per #7058
|
|
54
|
-
# Instead of handling deprecation-in-test errors we exclude
|
|
55
|
-
# all cirq_rigetti classes here.
|
|
56
|
-
"cirq_rigetti/json_test_data/AspenQubit.json",
|
|
57
|
-
"cirq_rigetti/json_test_data/OctagonalQubit.json",
|
|
58
|
-
# RigettiQCSAspenDevice does not pickle
|
|
59
|
-
"cirq_rigetti/json_test_data/RigettiQCSAspenDevice.json",
|
|
60
53
|
)
|
|
61
54
|
|
|
62
55
|
|
|
@@ -87,11 +80,9 @@ def _read_json(json_filename: str) -> Any:
|
|
|
87
80
|
|
|
88
81
|
def test_exclude_json_files_has_valid_entries() -> None:
|
|
89
82
|
"""Verify _EXCLUDE_JSON_FILES has valid entries."""
|
|
90
|
-
# do not check rigetti files if not installed
|
|
91
|
-
skip_rigetti = all(m.name != "cirq_rigetti" for m in MODULE_TEST_SPECS)
|
|
92
83
|
json_file_validates = lambda f: any(
|
|
93
84
|
m.test_data_path.joinpath(os.path.basename(f)).is_file() for m in MODULE_TEST_SPECS
|
|
94
|
-
)
|
|
85
|
+
)
|
|
95
86
|
invalid_json_paths = [f for f in _EXCLUDE_JSON_FILES if not json_file_validates(f)]
|
|
96
87
|
assert invalid_json_paths == []
|
|
97
88
|
|
|
@@ -105,7 +96,7 @@ def test_exclude_json_files_has_valid_entries() -> None:
|
|
|
105
96
|
if _is_included(f"{abs_path}.json")
|
|
106
97
|
],
|
|
107
98
|
)
|
|
108
|
-
def test_hash_from_pickle(json_filename: str, pool: multiprocessing.pool.Pool):
|
|
99
|
+
def test_hash_from_pickle(json_filename: str, pool: multiprocessing.pool.Pool) -> None:
|
|
109
100
|
obj_local = _read_json(json_filename)
|
|
110
101
|
if not isinstance(obj_local, Hashable):
|
|
111
102
|
return
|
|
@@ -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, Iterable, overload, TYPE_CHECKING, TypeVar
|
|
16
18
|
|
|
17
19
|
from cirq import ops
|
|
18
20
|
|
|
@@ -21,49 +23,48 @@ if TYPE_CHECKING:
|
|
|
21
23
|
|
|
22
24
|
# This is a special indicator value used by the inverse method to determine
|
|
23
25
|
# whether or not the caller provided a 'default' argument.
|
|
24
|
-
RaiseTypeErrorIfNotProvided:
|
|
26
|
+
RaiseTypeErrorIfNotProvided: tuple[list[Any]] = ([],)
|
|
25
27
|
|
|
26
28
|
TDefault = TypeVar('TDefault')
|
|
27
29
|
|
|
28
30
|
|
|
29
|
-
# pylint: disable=function-redefined
|
|
30
31
|
@overload
|
|
31
|
-
def inverse(val:
|
|
32
|
+
def inverse(val: cirq.Gate) -> cirq.Gate:
|
|
32
33
|
pass
|
|
33
34
|
|
|
34
35
|
|
|
35
36
|
@overload
|
|
36
|
-
def inverse(val:
|
|
37
|
+
def inverse(val: cirq.Operation) -> cirq.Operation:
|
|
37
38
|
pass
|
|
38
39
|
|
|
39
40
|
|
|
40
41
|
@overload
|
|
41
|
-
def inverse(val:
|
|
42
|
+
def inverse(val: cirq.Circuit) -> cirq.Circuit:
|
|
42
43
|
pass
|
|
43
44
|
|
|
44
45
|
|
|
45
46
|
@overload
|
|
46
|
-
def inverse(val:
|
|
47
|
+
def inverse(val: cirq.OP_TREE) -> cirq.OP_TREE:
|
|
47
48
|
pass
|
|
48
49
|
|
|
49
50
|
|
|
50
51
|
@overload
|
|
51
|
-
def inverse(val:
|
|
52
|
+
def inverse(val: cirq.Gate, default: TDefault) -> TDefault | cirq.Gate:
|
|
52
53
|
pass
|
|
53
54
|
|
|
54
55
|
|
|
55
56
|
@overload
|
|
56
|
-
def inverse(val:
|
|
57
|
+
def inverse(val: cirq.Operation, default: TDefault) -> TDefault | cirq.Operation:
|
|
57
58
|
pass
|
|
58
59
|
|
|
59
60
|
|
|
60
61
|
@overload
|
|
61
|
-
def inverse(val:
|
|
62
|
+
def inverse(val: cirq.Circuit, default: TDefault) -> TDefault | cirq.Circuit:
|
|
62
63
|
pass
|
|
63
64
|
|
|
64
65
|
|
|
65
66
|
@overload
|
|
66
|
-
def inverse(val:
|
|
67
|
+
def inverse(val: cirq.OP_TREE, default: TDefault) -> TDefault | cirq.OP_TREE:
|
|
67
68
|
pass
|
|
68
69
|
|
|
69
70
|
|
|
@@ -98,7 +99,6 @@ def inverse(val: Any, default: Any = RaiseTypeErrorIfNotProvided) -> Any:
|
|
|
98
99
|
# Check if object defines an inverse via __pow__.
|
|
99
100
|
raiser = getattr(val, '__pow__', None)
|
|
100
101
|
|
|
101
|
-
# pylint: disable=not-callable
|
|
102
102
|
result = NotImplemented if raiser is None else raiser(-1)
|
|
103
103
|
if result is not NotImplemented:
|
|
104
104
|
return result
|
|
@@ -106,7 +106,7 @@ def inverse(val: Any, default: Any = RaiseTypeErrorIfNotProvided) -> Any:
|
|
|
106
106
|
# Maybe it's an iterable of invertible items?
|
|
107
107
|
# Note: we avoid str because 'a'[0] == 'a', which creates an infinite loop.
|
|
108
108
|
if isinstance(val, Iterable) and not isinstance(val, (str, ops.Operation)):
|
|
109
|
-
unique_indicator:
|
|
109
|
+
unique_indicator: list[Any] = []
|
|
110
110
|
results = tuple(inverse(e, unique_indicator) for e in val)
|
|
111
111
|
if all(e is not unique_indicator for e in results):
|
|
112
112
|
return results[::-1]
|
|
@@ -119,6 +119,3 @@ def inverse(val: Any, default: Any = RaiseTypeErrorIfNotProvided) -> Any:
|
|
|
119
119
|
"It has no __pow__ method (or the method returned NotImplemented) "
|
|
120
120
|
"and it isn't an iterable of invertible objects."
|
|
121
121
|
)
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
# pylint: enable=function-redefined
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import pytest
|
|
16
18
|
|
|
17
19
|
import cirq
|
|
@@ -32,7 +34,7 @@ class ReturnsFive:
|
|
|
32
34
|
|
|
33
35
|
|
|
34
36
|
class SelfInverse:
|
|
35
|
-
def __pow__(self, exponent) ->
|
|
37
|
+
def __pow__(self, exponent) -> SelfInverse:
|
|
36
38
|
return self
|
|
37
39
|
|
|
38
40
|
|
|
@@ -50,7 +52,7 @@ class IsIterable:
|
|
|
50
52
|
@pytest.mark.parametrize(
|
|
51
53
|
'val', (NoMethod(), 'text', object(), ReturnsNotImplemented(), [NoMethod(), 5])
|
|
52
54
|
)
|
|
53
|
-
def test_objects_with_no_inverse(val):
|
|
55
|
+
def test_objects_with_no_inverse(val) -> None:
|
|
54
56
|
with pytest.raises(TypeError, match="isn't invertible"):
|
|
55
57
|
_ = cirq.inverse(val)
|
|
56
58
|
assert cirq.inverse(val, None) is None
|
|
@@ -76,6 +78,6 @@ def test_objects_with_no_inverse(val):
|
|
|
76
78
|
(IsIterable(), (0.5, 1)),
|
|
77
79
|
),
|
|
78
80
|
)
|
|
79
|
-
def test_objects_with_inverse(val, inv):
|
|
81
|
+
def test_objects_with_inverse(val, inv) -> None:
|
|
80
82
|
assert cirq.inverse(val) == inv
|
|
81
83
|
assert cirq.inverse(val, 0) == inv
|