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
cirq/value/timestamp.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
|
"""A typed location in time that supports picosecond accuracy."""
|
|
15
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
16
19
|
from datetime import timedelta
|
|
17
20
|
from typing import overload
|
|
18
21
|
|
|
@@ -45,23 +48,26 @@ class Timestamp:
|
|
|
45
48
|
"""The timestamp's location in picoseconds from arbitrary time zero."""
|
|
46
49
|
return self._picos
|
|
47
50
|
|
|
48
|
-
def __add__(self, other) ->
|
|
51
|
+
def __add__(self, other) -> Timestamp:
|
|
49
52
|
if isinstance(other, timedelta):
|
|
50
53
|
return Timestamp(picos=self._picos + other.total_seconds() * 10**12)
|
|
51
54
|
if not isinstance(other, Duration):
|
|
52
55
|
return NotImplemented
|
|
53
56
|
return Timestamp(picos=self._picos + other.total_picos())
|
|
54
57
|
|
|
55
|
-
def __radd__(self, other) ->
|
|
58
|
+
def __radd__(self, other) -> Timestamp:
|
|
56
59
|
return self.__add__(other)
|
|
57
60
|
|
|
58
|
-
# pylint: disable=function-redefined
|
|
59
61
|
@overload
|
|
60
|
-
def __sub__(self, other:
|
|
62
|
+
def __sub__(self, other: Timestamp) -> Duration:
|
|
63
|
+
pass
|
|
64
|
+
|
|
65
|
+
@overload
|
|
66
|
+
def __sub__(self, other: Duration) -> Timestamp:
|
|
61
67
|
pass
|
|
62
68
|
|
|
63
69
|
@overload
|
|
64
|
-
def __sub__(self, other:
|
|
70
|
+
def __sub__(self, other: timedelta) -> Timestamp:
|
|
65
71
|
pass
|
|
66
72
|
|
|
67
73
|
def __sub__(self, other):
|
|
@@ -73,8 +79,6 @@ class Timestamp:
|
|
|
73
79
|
return Duration(picos=self._picos - other._picos)
|
|
74
80
|
return NotImplemented
|
|
75
81
|
|
|
76
|
-
# pylint: enable=function-redefined
|
|
77
|
-
|
|
78
82
|
def __eq__(self, other):
|
|
79
83
|
if not isinstance(other, type(self)):
|
|
80
84
|
return NotImplemented
|
cirq/value/timestamp_test.py
CHANGED
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
from datetime import timedelta
|
|
16
18
|
|
|
17
19
|
import pytest
|
|
@@ -20,7 +22,7 @@ import cirq
|
|
|
20
22
|
from cirq import Duration, Timestamp
|
|
21
23
|
|
|
22
24
|
|
|
23
|
-
def test_init():
|
|
25
|
+
def test_init() -> None:
|
|
24
26
|
assert Timestamp().raw_picos() == 0
|
|
25
27
|
assert Timestamp(picos=513).raw_picos() == 513
|
|
26
28
|
assert Timestamp(picos=-5).raw_picos() == -5
|
|
@@ -33,13 +35,13 @@ def test_init():
|
|
|
33
35
|
assert isinstance(Timestamp(nanos=1.0).raw_picos(), float)
|
|
34
36
|
|
|
35
37
|
|
|
36
|
-
def test_str():
|
|
38
|
+
def test_str() -> None:
|
|
37
39
|
assert str(Timestamp(picos=1000, nanos=1000)) == 't=1001000'
|
|
38
40
|
assert str(Timestamp(nanos=5.0)) == 't=5000.0'
|
|
39
41
|
assert str(Timestamp(picos=-100)) == 't=-100'
|
|
40
42
|
|
|
41
43
|
|
|
42
|
-
def test_repr():
|
|
44
|
+
def test_repr() -> None:
|
|
43
45
|
a = Timestamp(picos=1000, nanos=1000)
|
|
44
46
|
cirq.testing.assert_equivalent_repr(a)
|
|
45
47
|
b = Timestamp(nanos=5.0)
|
|
@@ -48,14 +50,14 @@ def test_repr():
|
|
|
48
50
|
cirq.testing.assert_equivalent_repr(c)
|
|
49
51
|
|
|
50
52
|
|
|
51
|
-
def test_eq():
|
|
53
|
+
def test_eq() -> None:
|
|
52
54
|
eq = cirq.testing.EqualsTester()
|
|
53
55
|
eq.add_equality_group(Timestamp(), Timestamp(picos=0), Timestamp(nanos=0.0))
|
|
54
56
|
eq.add_equality_group(Timestamp(picos=1000), Timestamp(nanos=1))
|
|
55
57
|
eq.make_equality_group(lambda: Timestamp(picos=-1))
|
|
56
58
|
|
|
57
59
|
|
|
58
|
-
def test_cmp():
|
|
60
|
+
def test_cmp() -> None:
|
|
59
61
|
ordered_groups = [
|
|
60
62
|
Timestamp(picos=-1),
|
|
61
63
|
Timestamp(),
|
|
@@ -75,13 +77,13 @@ def test_cmp():
|
|
|
75
77
|
assert (i >= j) == (a >= b)
|
|
76
78
|
assert (i > j) == (a > b)
|
|
77
79
|
|
|
78
|
-
assert not (Timestamp() == 0)
|
|
80
|
+
assert not (Timestamp() == 0) # noqa: SIM201
|
|
79
81
|
assert Timestamp() != 0
|
|
80
|
-
assert not (Timestamp() == Duration())
|
|
82
|
+
assert not (Timestamp() == Duration()) # noqa: SIM201
|
|
81
83
|
assert Timestamp() != Duration()
|
|
82
84
|
|
|
83
85
|
|
|
84
|
-
def test_cmp_vs_other_type():
|
|
86
|
+
def test_cmp_vs_other_type() -> None:
|
|
85
87
|
with pytest.raises(TypeError):
|
|
86
88
|
_ = Timestamp() < Duration()
|
|
87
89
|
with pytest.raises(TypeError):
|
|
@@ -94,7 +96,7 @@ def test_cmp_vs_other_type():
|
|
|
94
96
|
_ = Timestamp() > 0
|
|
95
97
|
|
|
96
98
|
|
|
97
|
-
def test_add():
|
|
99
|
+
def test_add() -> None:
|
|
98
100
|
assert Timestamp(picos=1) + Duration(picos=2) == Timestamp(picos=3)
|
|
99
101
|
assert Duration(picos=3) + Timestamp(picos=-5) == Timestamp(picos=-2)
|
|
100
102
|
|
|
@@ -109,7 +111,7 @@ def test_add():
|
|
|
109
111
|
_ = Timestamp() + 1
|
|
110
112
|
|
|
111
113
|
|
|
112
|
-
def test_sub():
|
|
114
|
+
def test_sub() -> None:
|
|
113
115
|
assert Timestamp() - Timestamp() == Duration()
|
|
114
116
|
assert Timestamp(picos=1) - Timestamp(picos=2) == Duration(picos=-1)
|
|
115
117
|
assert Timestamp(picos=5) - Duration(picos=2) == Timestamp(picos=3)
|
|
@@ -118,6 +120,6 @@ def test_sub():
|
|
|
118
120
|
with pytest.raises(TypeError):
|
|
119
121
|
_ = Duration() - Timestamp()
|
|
120
122
|
with pytest.raises(TypeError):
|
|
121
|
-
_ = 1 - Timestamp()
|
|
123
|
+
_ = 1 - Timestamp() # type: ignore[operator]
|
|
122
124
|
with pytest.raises(TypeError):
|
|
123
|
-
_ = Timestamp() - 1
|
|
125
|
+
_ = Timestamp() - 1 # type: ignore[operator]
|
cirq/value/type_alias.py
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
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
16
|
|
|
17
17
|
import numpy as np
|
|
18
18
|
import sympy
|
|
@@ -22,11 +22,11 @@ from cirq._doc import document
|
|
|
22
22
|
"""Supply aliases for commonly used types.
|
|
23
23
|
"""
|
|
24
24
|
|
|
25
|
-
TParamKey =
|
|
25
|
+
TParamKey = str | sympy.Expr
|
|
26
26
|
document(TParamKey, """A parameter that a parameter resolver may map to a value.""")
|
|
27
27
|
|
|
28
|
-
TParamVal =
|
|
28
|
+
TParamVal = float | sympy.Expr
|
|
29
29
|
document(TParamVal, """A value that a parameter resolver may return for a parameter.""")
|
|
30
30
|
|
|
31
|
-
TParamValComplex =
|
|
31
|
+
TParamValComplex = complex | np.number | sympy.Expr
|
|
32
32
|
document(TParamValComplex, """A complex value that parameter resolvers may use for parameters.""")
|
|
@@ -11,9 +11,12 @@
|
|
|
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
|
"""Defines `@cirq.value_equality`, for easy __eq__/__hash__ methods."""
|
|
15
16
|
|
|
16
|
-
from
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
from typing import Any, Callable, overload
|
|
17
20
|
|
|
18
21
|
from typing_extensions import Protocol
|
|
19
22
|
|
|
@@ -83,7 +86,7 @@ def _value_equality_eq(self: _SupportsValueEquality, other: _SupportsValueEquali
|
|
|
83
86
|
|
|
84
87
|
|
|
85
88
|
def _value_equality_ne(self: _SupportsValueEquality, other: _SupportsValueEquality) -> bool:
|
|
86
|
-
return not self == other
|
|
89
|
+
return not self == other # noqa: SIM201
|
|
87
90
|
|
|
88
91
|
|
|
89
92
|
def _value_equality_hash(self: _SupportsValueEquality) -> int:
|
|
@@ -110,7 +113,7 @@ def _value_equality_approx_eq(
|
|
|
110
113
|
)
|
|
111
114
|
|
|
112
115
|
|
|
113
|
-
def _value_equality_getstate(self: _SupportsValueEquality) ->
|
|
116
|
+
def _value_equality_getstate(self: _SupportsValueEquality) -> dict[str, Any]:
|
|
114
117
|
# clear cached hash value when pickling, see #6674
|
|
115
118
|
state = self.__dict__
|
|
116
119
|
hash_attr = _compat._method_cache_name(self.__hash__)
|
|
@@ -120,7 +123,6 @@ def _value_equality_getstate(self: _SupportsValueEquality) -> Dict[str, Any]:
|
|
|
120
123
|
return state
|
|
121
124
|
|
|
122
125
|
|
|
123
|
-
# pylint: disable=function-redefined
|
|
124
126
|
@overload
|
|
125
127
|
def value_equality(
|
|
126
128
|
cls: type,
|
|
@@ -145,13 +147,13 @@ def value_equality(
|
|
|
145
147
|
|
|
146
148
|
|
|
147
149
|
def value_equality(
|
|
148
|
-
cls:
|
|
150
|
+
cls: type | None = None,
|
|
149
151
|
*,
|
|
150
152
|
unhashable: bool = False,
|
|
151
153
|
distinct_child_types: bool = False,
|
|
152
154
|
manual_cls: bool = False,
|
|
153
155
|
approximate: bool = False,
|
|
154
|
-
) ->
|
|
156
|
+
) -> Callable[[type], type] | type:
|
|
155
157
|
"""Implements __eq__/__ne__/__hash__ via a _value_equality_values_ method.
|
|
156
158
|
|
|
157
159
|
_value_equality_values_ is a method that the decorated class must implement.
|
|
@@ -255,6 +257,3 @@ def value_equality(
|
|
|
255
257
|
setattr(cls, '_approx_eq_', _value_equality_approx_eq)
|
|
256
258
|
|
|
257
259
|
return cls
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
# pylint: enable=function-redefined
|
|
@@ -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 pytest
|
|
15
18
|
|
|
16
19
|
import cirq
|
|
@@ -54,7 +57,7 @@ class BasicCb(BasicC):
|
|
|
54
57
|
pass
|
|
55
58
|
|
|
56
59
|
|
|
57
|
-
def test_value_equality_basic():
|
|
60
|
+
def test_value_equality_basic() -> None:
|
|
58
61
|
|
|
59
62
|
# Lookup works across equivalent types.
|
|
60
63
|
v = {BasicC(1): 4, BasicCa(2): 5}
|
|
@@ -69,7 +72,7 @@ def test_value_equality_basic():
|
|
|
69
72
|
eq.add_equality_group(BasicCa(3))
|
|
70
73
|
|
|
71
74
|
|
|
72
|
-
def test_value_equality_manual():
|
|
75
|
+
def test_value_equality_manual() -> None:
|
|
73
76
|
eq = cirq.testing.EqualsTester()
|
|
74
77
|
eq.add_equality_group(MasqueradePositiveD(3), BasicD(3))
|
|
75
78
|
eq.add_equality_group(MasqueradePositiveD(4), MasqueradePositiveD(4), BasicD(4))
|
|
@@ -105,7 +108,7 @@ class UnhashableCb(UnhashableC):
|
|
|
105
108
|
pass
|
|
106
109
|
|
|
107
110
|
|
|
108
|
-
def test_value_equality_unhashable():
|
|
111
|
+
def test_value_equality_unhashable() -> None:
|
|
109
112
|
# Not possible to use as a dictionary key.
|
|
110
113
|
with pytest.raises(TypeError, match='unhashable'):
|
|
111
114
|
_ = {UnhashableC(1): 4}
|
|
@@ -143,7 +146,7 @@ class DistinctCb(DistinctC):
|
|
|
143
146
|
pass
|
|
144
147
|
|
|
145
148
|
|
|
146
|
-
def test_value_equality_distinct_child_types():
|
|
149
|
+
def test_value_equality_distinct_child_types() -> None:
|
|
147
150
|
# Lookup is distinct across child types.
|
|
148
151
|
v = {DistinctC(1): 4, DistinctCa(1): 5, DistinctCb(1): 6}
|
|
149
152
|
assert v[DistinctC(1)] == 4
|
|
@@ -168,7 +171,7 @@ class ApproxE:
|
|
|
168
171
|
return self.x
|
|
169
172
|
|
|
170
173
|
|
|
171
|
-
def test_value_equality_approximate():
|
|
174
|
+
def test_value_equality_approximate() -> None:
|
|
172
175
|
assert cirq.approx_eq(ApproxE(0.0), ApproxE(0.0), atol=0.1)
|
|
173
176
|
assert cirq.approx_eq(ApproxE(0.0), ApproxE(0.2), atol=0.3)
|
|
174
177
|
assert not cirq.approx_eq(ApproxE(0.0), ApproxE(0.2), atol=0.1)
|
|
@@ -187,13 +190,13 @@ class PeriodicF:
|
|
|
187
190
|
return self.x % self.n
|
|
188
191
|
|
|
189
192
|
|
|
190
|
-
def test_value_equality_approximate_specialized():
|
|
193
|
+
def test_value_equality_approximate_specialized() -> None:
|
|
191
194
|
assert PeriodicF(1, 4) != PeriodicF(5, 4)
|
|
192
195
|
assert cirq.approx_eq(PeriodicF(1, 4), PeriodicF(5, 4), atol=0.1)
|
|
193
196
|
assert not cirq.approx_eq(PeriodicF(1, 4), PeriodicF(6, 4), atol=0.1)
|
|
194
197
|
|
|
195
198
|
|
|
196
|
-
def test_value_equality_approximate_not_supported():
|
|
199
|
+
def test_value_equality_approximate_not_supported() -> None:
|
|
197
200
|
assert not cirq.approx_eq(BasicC(0.0), BasicC(0.1), atol=0.2)
|
|
198
201
|
|
|
199
202
|
|
|
@@ -222,7 +225,7 @@ class ApproxGb(ApproxG):
|
|
|
222
225
|
pass
|
|
223
226
|
|
|
224
227
|
|
|
225
|
-
def test_value_equality_approximate_typing():
|
|
228
|
+
def test_value_equality_approximate_typing() -> None:
|
|
226
229
|
assert not cirq.approx_eq(ApproxE(0.0), PeriodicF(0.0, 1.0), atol=0.1)
|
|
227
230
|
assert cirq.approx_eq(ApproxEa(0.0), ApproxEb(0.0), atol=0.1)
|
|
228
231
|
assert cirq.approx_eq(ApproxG(0.0), ApproxG(0.0), atol=0.1)
|
|
@@ -230,7 +233,7 @@ def test_value_equality_approximate_typing():
|
|
|
230
233
|
assert not cirq.approx_eq(ApproxG(0.0), ApproxGb(0.0), atol=0.1)
|
|
231
234
|
|
|
232
235
|
|
|
233
|
-
def test_value_equality_forgot_method():
|
|
236
|
+
def test_value_equality_forgot_method() -> None:
|
|
234
237
|
with pytest.raises(TypeError, match='_value_equality_values_'):
|
|
235
238
|
|
|
236
239
|
@cirq.value_equality
|
|
@@ -238,7 +241,7 @@ def test_value_equality_forgot_method():
|
|
|
238
241
|
pass
|
|
239
242
|
|
|
240
243
|
|
|
241
|
-
def test_bad_manual_cls_incompatible_args():
|
|
244
|
+
def test_bad_manual_cls_incompatible_args() -> None:
|
|
242
245
|
with pytest.raises(ValueError, match='incompatible'):
|
|
243
246
|
|
|
244
247
|
@cirq.value_equality(manual_cls=True, distinct_child_types=True)
|
|
@@ -246,7 +249,7 @@ def test_bad_manual_cls_incompatible_args():
|
|
|
246
249
|
pass
|
|
247
250
|
|
|
248
251
|
|
|
249
|
-
def test_bad_manual_cls_forgot_method():
|
|
252
|
+
def test_bad_manual_cls_forgot_method() -> None:
|
|
250
253
|
with pytest.raises(TypeError, match='_value_equality_values_cls_'):
|
|
251
254
|
|
|
252
255
|
@cirq.value_equality(manual_cls=True)
|
cirq/vis/density_matrix.py
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
"""Tool to visualize the magnitudes and phases in the density matrix"""
|
|
16
16
|
|
|
17
|
-
from
|
|
17
|
+
from __future__ import annotations
|
|
18
18
|
|
|
19
19
|
import matplotlib.pyplot as plt
|
|
20
20
|
import numpy as np
|
|
@@ -79,10 +79,10 @@ def _plot_element_of_density_matrix(ax, x, y, r, phase, show_rect=False, show_te
|
|
|
79
79
|
|
|
80
80
|
def plot_density_matrix(
|
|
81
81
|
matrix: np.ndarray,
|
|
82
|
-
ax:
|
|
82
|
+
ax: plt.Axes | None = None,
|
|
83
83
|
*,
|
|
84
84
|
show_text: bool = False,
|
|
85
|
-
title:
|
|
85
|
+
title: str | None = None,
|
|
86
86
|
) -> plt.Axes:
|
|
87
87
|
"""Generates a plot for a given density matrix.
|
|
88
88
|
|
cirq/vis/density_matrix_test.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
|
"""Tests for Density Matrix Plotter."""
|
|
15
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
16
19
|
import numpy as np
|
|
17
20
|
import pytest
|
|
18
21
|
from matplotlib import axis, lines, patches, pyplot as plt, spines, text
|
|
@@ -24,7 +27,7 @@ from cirq.vis.density_matrix import _plot_element_of_density_matrix, plot_densit
|
|
|
24
27
|
@pytest.mark.usefixtures('closefigures')
|
|
25
28
|
@pytest.mark.parametrize('show_text', [True, False])
|
|
26
29
|
@pytest.mark.parametrize('size', [2, 4, 8, 16])
|
|
27
|
-
def test_density_matrix_plotter(size, show_text):
|
|
30
|
+
def test_density_matrix_plotter(size, show_text) -> None:
|
|
28
31
|
matrix = cirq.testing.random_density_matrix(size)
|
|
29
32
|
# Check that the title shows back up
|
|
30
33
|
ax = plot_density_matrix(matrix, show_text=show_text, title='Test Density Matrix Plot')
|
|
@@ -48,16 +51,16 @@ def test_density_matrix_plotter(size, show_text):
|
|
|
48
51
|
@pytest.mark.usefixtures('closefigures')
|
|
49
52
|
@pytest.mark.parametrize('show_text', [True, False])
|
|
50
53
|
@pytest.mark.parametrize('size', [2, 4, 8, 16])
|
|
51
|
-
def test_density_matrix_circle_rectangle_sizes(size, show_text):
|
|
54
|
+
def test_density_matrix_circle_rectangle_sizes(size, show_text) -> None:
|
|
52
55
|
matrix = cirq.testing.random_density_matrix(size)
|
|
53
56
|
ax = plot_density_matrix(matrix, show_text=show_text, title='Test Density Matrix Plot')
|
|
54
57
|
# Check that the radius of all the circles in the matrix is correct
|
|
55
|
-
|
|
56
|
-
mean_radius = np.mean([c.radius for c in
|
|
58
|
+
circle_list = [c for c in ax.get_children() if isinstance(c, patches.Circle)]
|
|
59
|
+
mean_radius = np.mean([c.radius for c in circle_list if c.fill])
|
|
57
60
|
mean_value = np.mean(np.abs(matrix))
|
|
58
|
-
circles = np.array(
|
|
59
|
-
(
|
|
60
|
-
)
|
|
61
|
+
circles = np.array(
|
|
62
|
+
sorted(circle_list, key=lambda x: (x.fill, x.center[0], -x.center[1]))
|
|
63
|
+
).reshape((2, size, size))
|
|
61
64
|
for i in range(size):
|
|
62
65
|
for j in range(size):
|
|
63
66
|
assert np.isclose(
|
|
@@ -65,15 +68,15 @@ def test_density_matrix_circle_rectangle_sizes(size, show_text):
|
|
|
65
68
|
)
|
|
66
69
|
|
|
67
70
|
# Check that all the rectangles are of the right height, and only on the diagonal elements
|
|
68
|
-
|
|
71
|
+
rect_list = [
|
|
69
72
|
r
|
|
70
73
|
for r in ax.get_children()
|
|
71
74
|
if isinstance(r, patches.Rectangle) and r.get_alpha() is not None
|
|
72
75
|
]
|
|
73
|
-
assert len(
|
|
74
|
-
mean_size = np.mean([r.get_height() for r in
|
|
76
|
+
assert len(rect_list) == size
|
|
77
|
+
mean_size = np.mean([r.get_height() for r in rect_list])
|
|
75
78
|
mean_value = np.trace(np.abs(matrix)) / size
|
|
76
|
-
rects = np.array(sorted(
|
|
79
|
+
rects = np.array(sorted(rect_list, key=lambda x: x.get_x()))
|
|
77
80
|
for i in range(size):
|
|
78
81
|
# Ensuring that the rectangle is the right height
|
|
79
82
|
assert np.isclose(np.abs(matrix[i, i]) * mean_size / mean_value, rects[i].get_height())
|
|
@@ -90,7 +93,7 @@ def test_density_matrix_circle_rectangle_sizes(size, show_text):
|
|
|
90
93
|
@pytest.mark.usefixtures('closefigures')
|
|
91
94
|
@pytest.mark.parametrize('show_text', [True, False])
|
|
92
95
|
@pytest.mark.parametrize('size', [2, 4, 8, 16])
|
|
93
|
-
def test_density_matrix_sizes_upper_bounds(size, show_text):
|
|
96
|
+
def test_density_matrix_sizes_upper_bounds(size, show_text) -> None:
|
|
94
97
|
matrix = cirq.testing.random_density_matrix(size)
|
|
95
98
|
ax = plot_density_matrix(matrix, show_text=show_text, title='Test Density Matrix Plot')
|
|
96
99
|
|
|
@@ -113,7 +116,7 @@ def test_density_matrix_sizes_upper_bounds(size, show_text):
|
|
|
113
116
|
@pytest.mark.usefixtures('closefigures')
|
|
114
117
|
@pytest.mark.parametrize('show_rect', [True, False])
|
|
115
118
|
@pytest.mark.parametrize('value', [0.0, 1.0, 0.5 + 0.3j, 0.2 + 0.1j, 0.5 + 0.5j])
|
|
116
|
-
def test_density_element_plot(value, show_rect):
|
|
119
|
+
def test_density_element_plot(value, show_rect) -> None:
|
|
117
120
|
_, ax = plt.subplots(figsize=(10, 10))
|
|
118
121
|
_plot_element_of_density_matrix(
|
|
119
122
|
ax, 0, 0, np.abs(value), np.angle(value), show_rect=False, show_text=False
|
|
@@ -122,9 +125,9 @@ def test_density_element_plot(value, show_rect):
|
|
|
122
125
|
plotted_lines = [c for c in ax.get_children() if isinstance(c, lines.Line2D)]
|
|
123
126
|
assert len(plotted_lines) == 1
|
|
124
127
|
line_position = plotted_lines[0].get_xydata()
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
)
|
|
128
|
+
numerator = line_position[1, 1] - line_position[0, 1] # type: ignore
|
|
129
|
+
denumerator = line_position[1, 0] - line_position[0, 0] # type: ignore
|
|
130
|
+
angle = np.arctan(numerator / denumerator)
|
|
128
131
|
assert np.isclose(np.angle(value), angle)
|
|
129
132
|
# Check if the circles are the right size ratio, given the value of the element
|
|
130
133
|
circles_in = [c for c in ax.get_children() if isinstance(c, patches.Circle) and c.fill]
|
|
@@ -151,6 +154,6 @@ def test_density_element_plot(value, show_rect):
|
|
|
151
154
|
np.random.random((4, 8)) * np.exp(np.random.random((4, 8)) * 2 * np.pi * 1j),
|
|
152
155
|
],
|
|
153
156
|
)
|
|
154
|
-
def test_density_matrix_type_error(matrix):
|
|
157
|
+
def test_density_matrix_type_error(matrix) -> None:
|
|
155
158
|
with pytest.raises(ValueError, match="Incorrect shape for density matrix:*"):
|
|
156
159
|
plot_density_matrix(matrix)
|
cirq/vis/heatmap.py
CHANGED
|
@@ -16,19 +16,7 @@ from __future__ import annotations
|
|
|
16
16
|
|
|
17
17
|
import copy
|
|
18
18
|
from dataclasses import astuple, dataclass
|
|
19
|
-
from typing import
|
|
20
|
-
Any,
|
|
21
|
-
cast,
|
|
22
|
-
Dict,
|
|
23
|
-
List,
|
|
24
|
-
Mapping,
|
|
25
|
-
Optional,
|
|
26
|
-
overload,
|
|
27
|
-
Sequence,
|
|
28
|
-
SupportsFloat,
|
|
29
|
-
Tuple,
|
|
30
|
-
Union,
|
|
31
|
-
)
|
|
19
|
+
from typing import Any, cast, Mapping, overload, Sequence, SupportsFloat
|
|
32
20
|
|
|
33
21
|
import matplotlib as mpl
|
|
34
22
|
import matplotlib.collections as mpl_collections
|
|
@@ -39,9 +27,9 @@ from mpl_toolkits import axes_grid1
|
|
|
39
27
|
from cirq.devices import grid_qubit
|
|
40
28
|
from cirq.vis import vis_utils
|
|
41
29
|
|
|
42
|
-
QubitTuple =
|
|
30
|
+
QubitTuple = tuple[grid_qubit.GridQubit, ...]
|
|
43
31
|
|
|
44
|
-
Polygon = Sequence[
|
|
32
|
+
Polygon = Sequence[tuple[float, float]]
|
|
45
33
|
|
|
46
34
|
|
|
47
35
|
@dataclass
|
|
@@ -71,13 +59,12 @@ class PolygonUnit:
|
|
|
71
59
|
polygon: Polygon
|
|
72
60
|
value: float
|
|
73
61
|
center: Point
|
|
74
|
-
annot:
|
|
62
|
+
annot: str | None
|
|
75
63
|
|
|
76
64
|
|
|
77
65
|
class Heatmap:
|
|
78
66
|
"""Distribution of a value in 2D qubit lattice as a color map."""
|
|
79
67
|
|
|
80
|
-
# pylint: disable=function-redefined
|
|
81
68
|
@overload
|
|
82
69
|
def __init__(self, value_map: Mapping[QubitTuple, SupportsFloat], **kwargs):
|
|
83
70
|
pass
|
|
@@ -88,9 +75,9 @@ class Heatmap:
|
|
|
88
75
|
|
|
89
76
|
def __init__(
|
|
90
77
|
self,
|
|
91
|
-
value_map:
|
|
92
|
-
Mapping[QubitTuple, SupportsFloat]
|
|
93
|
-
|
|
78
|
+
value_map: (
|
|
79
|
+
Mapping[QubitTuple, SupportsFloat] | Mapping[grid_qubit.GridQubit, SupportsFloat]
|
|
80
|
+
),
|
|
94
81
|
**kwargs,
|
|
95
82
|
):
|
|
96
83
|
"""2D qubit grid Heatmaps
|
|
@@ -131,7 +118,7 @@ class Heatmap:
|
|
|
131
118
|
}
|
|
132
119
|
self._validate_kwargs(kwargs)
|
|
133
120
|
if '_config' not in self.__dict__:
|
|
134
|
-
self._config:
|
|
121
|
+
self._config: dict[str, Any] = {}
|
|
135
122
|
self._config.update(
|
|
136
123
|
{
|
|
137
124
|
"plot_colorbar": True,
|
|
@@ -144,7 +131,7 @@ class Heatmap:
|
|
|
144
131
|
)
|
|
145
132
|
self._config.update(kwargs)
|
|
146
133
|
|
|
147
|
-
def _extra_valid_kwargs(self) ->
|
|
134
|
+
def _extra_valid_kwargs(self) -> list[str]:
|
|
148
135
|
return []
|
|
149
136
|
|
|
150
137
|
def _validate_kwargs(self, kwargs) -> None:
|
|
@@ -173,13 +160,13 @@ class Heatmap:
|
|
|
173
160
|
invalid_args = ", ".join([k for k in kwargs if k not in valid_kwargs])
|
|
174
161
|
raise ValueError(f"Received invalid argument(s): {invalid_args}")
|
|
175
162
|
|
|
176
|
-
def update_config(self, **kwargs) ->
|
|
163
|
+
def update_config(self, **kwargs) -> Heatmap:
|
|
177
164
|
"""Add/Modify **kwargs args passed during initialisation."""
|
|
178
165
|
self._validate_kwargs(kwargs)
|
|
179
166
|
self._config.update(kwargs)
|
|
180
167
|
return self
|
|
181
168
|
|
|
182
|
-
def _qubits_to_polygon(self, qubits: QubitTuple) ->
|
|
169
|
+
def _qubits_to_polygon(self, qubits: QubitTuple) -> tuple[Polygon, Point]:
|
|
183
170
|
qubit = qubits[0]
|
|
184
171
|
x, y = float(qubit.row), float(qubit.col)
|
|
185
172
|
return (
|
|
@@ -187,7 +174,7 @@ class Heatmap:
|
|
|
187
174
|
Point(y, x),
|
|
188
175
|
)
|
|
189
176
|
|
|
190
|
-
def _get_annotation_value(self, key, value) ->
|
|
177
|
+
def _get_annotation_value(self, key, value) -> str | None:
|
|
191
178
|
if self._config.get('annotation_map'):
|
|
192
179
|
return self._config['annotation_map'].get(key)
|
|
193
180
|
elif self._config.get('annotation_format'):
|
|
@@ -198,8 +185,8 @@ class Heatmap:
|
|
|
198
185
|
else:
|
|
199
186
|
return None
|
|
200
187
|
|
|
201
|
-
def _get_polygon_units(self) ->
|
|
202
|
-
polygon_unit_list:
|
|
188
|
+
def _get_polygon_units(self) -> list[PolygonUnit]:
|
|
189
|
+
polygon_unit_list: list[PolygonUnit] = []
|
|
203
190
|
for qubits, value in sorted(self._value_map.items()):
|
|
204
191
|
polygon, center = self._qubits_to_polygon(qubits)
|
|
205
192
|
polygon_unit_list.append(
|
|
@@ -231,7 +218,7 @@ class Heatmap:
|
|
|
231
218
|
|
|
232
219
|
def _write_annotations(
|
|
233
220
|
self,
|
|
234
|
-
centers_and_annot:
|
|
221
|
+
centers_and_annot: list[tuple[Point, str | None]],
|
|
235
222
|
collection: mpl_collections.Collection,
|
|
236
223
|
ax: plt.Axes,
|
|
237
224
|
) -> None:
|
|
@@ -245,7 +232,7 @@ class Heatmap:
|
|
|
245
232
|
x, y = center
|
|
246
233
|
face_luminance = vis_utils.relative_luminance(facecolor)
|
|
247
234
|
text_color = 'black' if face_luminance > 0.4 else 'white'
|
|
248
|
-
text_kwargs:
|
|
235
|
+
text_kwargs: dict[str, Any] = dict(color=text_color, ha="center", va="center")
|
|
249
236
|
text_kwargs.update(self._config.get('annotation_text_kwargs', {}))
|
|
250
237
|
ax.text(x, y, annotation, **text_kwargs)
|
|
251
238
|
|
|
@@ -286,8 +273,8 @@ class Heatmap:
|
|
|
286
273
|
return collection
|
|
287
274
|
|
|
288
275
|
def plot(
|
|
289
|
-
self, ax:
|
|
290
|
-
) ->
|
|
276
|
+
self, ax: plt.Axes | None = None, **kwargs: Any
|
|
277
|
+
) -> tuple[plt.Axes, mpl_collections.Collection]:
|
|
291
278
|
"""Plots the heatmap on the given Axes.
|
|
292
279
|
Args:
|
|
293
280
|
ax: the Axes to plot on. If not given, a new figure is created,
|
|
@@ -358,13 +345,13 @@ class TwoQubitInteractionHeatmap(Heatmap):
|
|
|
358
345
|
coupler_margin: float, default = 0.03
|
|
359
346
|
coupler_width: float, default = 0.6
|
|
360
347
|
"""
|
|
361
|
-
self._config:
|
|
348
|
+
self._config: dict[str, Any] = {"coupler_margin": 0.03, "coupler_width": 0.6}
|
|
362
349
|
super().__init__(value_map, **kwargs)
|
|
363
350
|
|
|
364
|
-
def _extra_valid_kwargs(self) ->
|
|
351
|
+
def _extra_valid_kwargs(self) -> list[str]:
|
|
365
352
|
return ["coupler_margin", "coupler_width"]
|
|
366
353
|
|
|
367
|
-
def _qubits_to_polygon(self, qubits: QubitTuple) ->
|
|
354
|
+
def _qubits_to_polygon(self, qubits: QubitTuple) -> tuple[Polygon, Point]:
|
|
368
355
|
coupler_margin = self._config["coupler_margin"]
|
|
369
356
|
coupler_width = self._config["coupler_width"]
|
|
370
357
|
cwidth = coupler_width / 2.0
|
|
@@ -403,8 +390,8 @@ class TwoQubitInteractionHeatmap(Heatmap):
|
|
|
403
390
|
return (polygon, Point((col1 + col2) / 2.0, (row1 + row2) / 2.0))
|
|
404
391
|
|
|
405
392
|
def plot(
|
|
406
|
-
self, ax:
|
|
407
|
-
) ->
|
|
393
|
+
self, ax: plt.Axes | None = None, **kwargs: Any
|
|
394
|
+
) -> tuple[plt.Axes, mpl_collections.Collection]:
|
|
408
395
|
"""Plots the heatmap on the given Axes.
|
|
409
396
|
Args:
|
|
410
397
|
ax: the Axes to plot on. If not given, a new figure is created,
|
|
@@ -422,7 +409,7 @@ class TwoQubitInteractionHeatmap(Heatmap):
|
|
|
422
409
|
original_config = copy.deepcopy(self._config)
|
|
423
410
|
self.update_config(**kwargs)
|
|
424
411
|
qubits = set([q for qubits in self._value_map.keys() for q in qubits])
|
|
425
|
-
collection_options:
|
|
412
|
+
collection_options: dict[str, Any] = {"cmap": "binary"}
|
|
426
413
|
highlighted_qubits = frozenset(kwargs.get("highlighted_qubits", ()))
|
|
427
414
|
if not highlighted_qubits:
|
|
428
415
|
collection_options.update(
|
cirq/vis/heatmap_test.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
|
"""Tests for Heatmap."""
|
|
15
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
16
19
|
import pathlib
|
|
17
20
|
import shutil
|
|
18
21
|
import string
|