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/vis/histogram.py
CHANGED
|
@@ -11,25 +11,28 @@
|
|
|
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
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import Any, Mapping, Sequence, SupportsFloat
|
|
15
18
|
|
|
16
19
|
import numpy as np
|
|
17
20
|
from matplotlib import pyplot as plt
|
|
18
21
|
|
|
19
22
|
|
|
20
23
|
def integrated_histogram(
|
|
21
|
-
data:
|
|
22
|
-
ax:
|
|
24
|
+
data: Sequence[SupportsFloat] | Mapping[Any, SupportsFloat],
|
|
25
|
+
ax: plt.Axes | None = None,
|
|
23
26
|
*,
|
|
24
27
|
cdf_on_x: bool = False,
|
|
25
28
|
axis_label: str = '',
|
|
26
29
|
semilog: bool = True,
|
|
27
30
|
median_line: bool = True,
|
|
28
|
-
median_label:
|
|
31
|
+
median_label: str | None = 'median',
|
|
29
32
|
mean_line: bool = False,
|
|
30
|
-
mean_label:
|
|
33
|
+
mean_label: str | None = 'mean',
|
|
31
34
|
show_zero: bool = False,
|
|
32
|
-
title:
|
|
35
|
+
title: str | None = None,
|
|
33
36
|
**kwargs,
|
|
34
37
|
) -> plt.Axes:
|
|
35
38
|
"""Plot the integrated histogram for an array of data.
|
cirq/vis/histogram_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 Histogram."""
|
|
15
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
16
19
|
import matplotlib.pyplot as plt
|
|
17
20
|
import numpy as np
|
|
18
21
|
import pytest
|
|
@@ -22,7 +25,7 @@ from cirq.vis import integrated_histogram
|
|
|
22
25
|
|
|
23
26
|
@pytest.mark.usefixtures('closefigures')
|
|
24
27
|
@pytest.mark.parametrize('data', [range(10), {f'key_{i}': i for i in range(10)}])
|
|
25
|
-
def test_integrated_histogram(data):
|
|
28
|
+
def test_integrated_histogram(data) -> None:
|
|
26
29
|
ax = integrated_histogram(
|
|
27
30
|
data,
|
|
28
31
|
title='Test Plot',
|
|
@@ -40,7 +43,7 @@ def test_integrated_histogram(data):
|
|
|
40
43
|
|
|
41
44
|
|
|
42
45
|
@pytest.mark.usefixtures('closefigures')
|
|
43
|
-
def test_multiple_plots():
|
|
46
|
+
def test_multiple_plots() -> None:
|
|
44
47
|
_, ax = plt.subplots(1, 1)
|
|
45
48
|
n = 53
|
|
46
49
|
data = np.random.random_sample((2, n))
|
cirq/vis/state_histogram.py
CHANGED
|
@@ -14,8 +14,10 @@
|
|
|
14
14
|
|
|
15
15
|
"""Tool to visualize the results of a study."""
|
|
16
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
17
19
|
import collections
|
|
18
|
-
from typing import
|
|
20
|
+
from typing import Sequence, SupportsFloat
|
|
19
21
|
|
|
20
22
|
import matplotlib.pyplot as plt
|
|
21
23
|
import numpy as np
|
|
@@ -23,7 +25,7 @@ import numpy as np
|
|
|
23
25
|
import cirq.study.result as result
|
|
24
26
|
|
|
25
27
|
|
|
26
|
-
def get_state_histogram(result:
|
|
28
|
+
def get_state_histogram(result: result.Result) -> np.ndarray:
|
|
27
29
|
"""Computes a state histogram from a single result with repetitions.
|
|
28
30
|
|
|
29
31
|
Args:
|
|
@@ -52,13 +54,13 @@ def get_state_histogram(result: 'result.Result') -> np.ndarray:
|
|
|
52
54
|
|
|
53
55
|
|
|
54
56
|
def plot_state_histogram(
|
|
55
|
-
data:
|
|
56
|
-
ax:
|
|
57
|
+
data: result.Result | collections.Counter | Sequence[SupportsFloat],
|
|
58
|
+
ax: plt.Axes | None = None,
|
|
57
59
|
*,
|
|
58
|
-
tick_label:
|
|
59
|
-
xlabel:
|
|
60
|
-
ylabel:
|
|
61
|
-
title:
|
|
60
|
+
tick_label: Sequence[str] | None = None,
|
|
61
|
+
xlabel: str | None = 'qubit state',
|
|
62
|
+
ylabel: str | None = 'result count',
|
|
63
|
+
title: str | None = 'Result State Histogram',
|
|
62
64
|
) -> plt.Axes:
|
|
63
65
|
"""Plot the state histogram from either a single result with repetitions or
|
|
64
66
|
a histogram computed using `result.histogram()` or a flattened histogram
|
cirq/vis/state_histogram_test.py
CHANGED
|
@@ -14,6 +14,8 @@
|
|
|
14
14
|
|
|
15
15
|
"""Tests for state_histogram."""
|
|
16
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
17
19
|
import matplotlib as mpl
|
|
18
20
|
import numpy as np
|
|
19
21
|
import pytest
|
|
@@ -24,7 +26,7 @@ from cirq.devices import GridQubit
|
|
|
24
26
|
from cirq.vis import state_histogram
|
|
25
27
|
|
|
26
28
|
|
|
27
|
-
def test_get_state_histogram():
|
|
29
|
+
def test_get_state_histogram() -> None:
|
|
28
30
|
simulator = cirq.Simulator()
|
|
29
31
|
|
|
30
32
|
q0 = GridQubit(0, 0)
|
|
@@ -40,7 +42,7 @@ def test_get_state_histogram():
|
|
|
40
42
|
np.testing.assert_equal(values_to_plot, expected_values)
|
|
41
43
|
|
|
42
44
|
|
|
43
|
-
def test_get_state_histogram_multi_1():
|
|
45
|
+
def test_get_state_histogram_multi_1() -> None:
|
|
44
46
|
qubits = cirq.LineQubit.range(4)
|
|
45
47
|
c = cirq.Circuit(
|
|
46
48
|
cirq.X.on_each(*qubits[1:]), cirq.measure(*qubits) # One multi-qubit measurement
|
|
@@ -51,7 +53,7 @@ def test_get_state_histogram_multi_1():
|
|
|
51
53
|
np.testing.assert_equal(values_to_plot, expected_values)
|
|
52
54
|
|
|
53
55
|
|
|
54
|
-
def test_get_state_histogram_multi_2():
|
|
56
|
+
def test_get_state_histogram_multi_2() -> None:
|
|
55
57
|
qubits = cirq.LineQubit.range(4)
|
|
56
58
|
c = cirq.Circuit(
|
|
57
59
|
cirq.X.on_each(*qubits[1:]),
|
|
@@ -65,7 +67,7 @@ def test_get_state_histogram_multi_2():
|
|
|
65
67
|
|
|
66
68
|
|
|
67
69
|
@pytest.mark.usefixtures('closefigures')
|
|
68
|
-
def test_plot_state_histogram_result():
|
|
70
|
+
def test_plot_state_histogram_result() -> None:
|
|
69
71
|
qubits = cirq.LineQubit.range(4)
|
|
70
72
|
c = cirq.Circuit(
|
|
71
73
|
cirq.X.on_each(*qubits[1:]), cirq.measure(*qubits) # One multi-qubit measurement
|
|
@@ -83,7 +85,7 @@ def test_plot_state_histogram_result():
|
|
|
83
85
|
|
|
84
86
|
|
|
85
87
|
@pytest.mark.usefixtures('closefigures')
|
|
86
|
-
def test_plot_state_histogram_collection():
|
|
88
|
+
def test_plot_state_histogram_collection() -> None:
|
|
87
89
|
qubits = cirq.LineQubit.range(4)
|
|
88
90
|
c = cirq.Circuit(
|
|
89
91
|
cirq.X.on_each(*qubits[1:]), cirq.measure(*qubits) # One multi-qubit measurement
|
cirq/vis/vis_utils.py
CHANGED
|
@@ -11,6 +11,9 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
14
17
|
from typing import TYPE_CHECKING
|
|
15
18
|
|
|
16
19
|
import numpy as np
|
|
@@ -19,7 +22,7 @@ if TYPE_CHECKING:
|
|
|
19
22
|
from numpy.typing import ArrayLike
|
|
20
23
|
|
|
21
24
|
|
|
22
|
-
def relative_luminance(color:
|
|
25
|
+
def relative_luminance(color: ArrayLike) -> float:
|
|
23
26
|
"""Returns the relative luminance according to W3C specification.
|
|
24
27
|
|
|
25
28
|
Spec: https://www.w3.org/TR/WCAG21/#dfn-relative-luminance.
|
cirq/vis/vis_utils_test.py
CHANGED
|
@@ -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_relative_luminance():
|
|
22
|
+
def test_relative_luminance() -> None:
|
|
20
23
|
rl = cirq.vis.relative_luminance([100, 100, 100])
|
|
21
24
|
assert np.isclose(rl, 55560.6360)
|
|
22
25
|
rl = cirq.vis.relative_luminance([0, 1, 2])
|
cirq/work/collector.py
CHANGED
|
@@ -12,8 +12,10 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import abc
|
|
16
|
-
from typing import Any, Iterator,
|
|
18
|
+
from typing import Any, Iterator, TYPE_CHECKING
|
|
17
19
|
|
|
18
20
|
import duet
|
|
19
21
|
import numpy as np
|
|
@@ -29,7 +31,7 @@ if TYPE_CHECKING:
|
|
|
29
31
|
class CircuitSampleJob:
|
|
30
32
|
"""Describes a sampling task."""
|
|
31
33
|
|
|
32
|
-
def __init__(self, circuit:
|
|
34
|
+
def __init__(self, circuit: cirq.AbstractCircuit, *, repetitions: int, tag: Any = None):
|
|
33
35
|
"""Inits CircuitSampleJob.
|
|
34
36
|
|
|
35
37
|
Args:
|
|
@@ -57,11 +59,11 @@ class CircuitSampleJob:
|
|
|
57
59
|
|
|
58
60
|
|
|
59
61
|
class CircuitSampleJobTree(Protocol):
|
|
60
|
-
def __iter__(self) -> Iterator[
|
|
62
|
+
def __iter__(self) -> Iterator[CircuitSampleJob | CircuitSampleJobTree]:
|
|
61
63
|
pass
|
|
62
64
|
|
|
63
65
|
|
|
64
|
-
CIRCUIT_SAMPLE_JOB_TREE =
|
|
66
|
+
CIRCUIT_SAMPLE_JOB_TREE = CircuitSampleJob | CircuitSampleJobTree
|
|
65
67
|
|
|
66
68
|
|
|
67
69
|
class Collector(metaclass=abc.ABCMeta):
|
|
@@ -75,7 +77,7 @@ class Collector(metaclass=abc.ABCMeta):
|
|
|
75
77
|
"""
|
|
76
78
|
|
|
77
79
|
@abc.abstractmethod
|
|
78
|
-
def next_job(self) ->
|
|
80
|
+
def next_job(self) -> CIRCUIT_SAMPLE_JOB_TREE | None:
|
|
79
81
|
"""Determines what to sample next.
|
|
80
82
|
|
|
81
83
|
This method is called by driving code when more samples can be
|
|
@@ -105,11 +107,7 @@ class Collector(metaclass=abc.ABCMeta):
|
|
|
105
107
|
"""
|
|
106
108
|
|
|
107
109
|
def collect(
|
|
108
|
-
self,
|
|
109
|
-
sampler: 'cirq.Sampler',
|
|
110
|
-
*,
|
|
111
|
-
concurrency: int = 2,
|
|
112
|
-
max_total_samples: Optional[int] = None,
|
|
110
|
+
self, sampler: cirq.Sampler, *, concurrency: int = 2, max_total_samples: int | None = None
|
|
113
111
|
) -> None:
|
|
114
112
|
"""Collects needed samples from a sampler.
|
|
115
113
|
|
|
@@ -140,11 +138,7 @@ class Collector(metaclass=abc.ABCMeta):
|
|
|
140
138
|
)
|
|
141
139
|
|
|
142
140
|
async def collect_async(
|
|
143
|
-
self,
|
|
144
|
-
sampler: 'cirq.Sampler',
|
|
145
|
-
*,
|
|
146
|
-
concurrency: int = 2,
|
|
147
|
-
max_total_samples: Optional[int] = None,
|
|
141
|
+
self, sampler: cirq.Sampler, *, concurrency: int = 2, max_total_samples: int | None = None
|
|
148
142
|
) -> None:
|
|
149
143
|
"""Asynchronously collects needed samples from a sampler.
|
|
150
144
|
|
|
@@ -167,10 +161,10 @@ class Collector(metaclass=abc.ABCMeta):
|
|
|
167
161
|
The collector's result after all desired samples have been
|
|
168
162
|
collected.
|
|
169
163
|
"""
|
|
170
|
-
results: duet.AsyncCollector[
|
|
164
|
+
results: duet.AsyncCollector[tuple[CircuitSampleJob, cirq.Result]] = duet.AsyncCollector()
|
|
171
165
|
job_error = None
|
|
172
166
|
running_jobs = 0
|
|
173
|
-
queued_jobs:
|
|
167
|
+
queued_jobs: list[CircuitSampleJob] = []
|
|
174
168
|
remaining_samples = np.inf if max_total_samples is None else max_total_samples
|
|
175
169
|
|
|
176
170
|
async def run_job(job):
|
|
@@ -213,7 +207,7 @@ class Collector(metaclass=abc.ABCMeta):
|
|
|
213
207
|
self.on_job_result(job, result)
|
|
214
208
|
|
|
215
209
|
|
|
216
|
-
def _flatten_jobs(tree:
|
|
210
|
+
def _flatten_jobs(tree: CIRCUIT_SAMPLE_JOB_TREE | None) -> Iterator[CircuitSampleJob]:
|
|
217
211
|
if isinstance(tree, CircuitSampleJob):
|
|
218
212
|
yield tree
|
|
219
213
|
elif tree is not None:
|
cirq/work/collector_test.py
CHANGED
|
@@ -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 duet
|
|
16
18
|
import pytest
|
|
17
19
|
|
|
18
20
|
import cirq
|
|
19
21
|
|
|
20
22
|
|
|
21
|
-
def test_circuit_sample_job_equality():
|
|
23
|
+
def test_circuit_sample_job_equality() -> None:
|
|
22
24
|
eq = cirq.testing.EqualsTester()
|
|
23
25
|
c1 = cirq.Circuit()
|
|
24
26
|
c2 = cirq.Circuit(cirq.measure(cirq.LineQubit(0)))
|
|
@@ -32,14 +34,14 @@ def test_circuit_sample_job_equality():
|
|
|
32
34
|
eq.add_equality_group(cirq.CircuitSampleJob(c1, repetitions=10, tag='test'))
|
|
33
35
|
|
|
34
36
|
|
|
35
|
-
def test_circuit_sample_job_repr():
|
|
37
|
+
def test_circuit_sample_job_repr() -> None:
|
|
36
38
|
cirq.testing.assert_equivalent_repr(
|
|
37
39
|
cirq.CircuitSampleJob(cirq.Circuit(cirq.H(cirq.LineQubit(0))), repetitions=10, tag='guess')
|
|
38
40
|
)
|
|
39
41
|
|
|
40
42
|
|
|
41
43
|
@duet.sync
|
|
42
|
-
async def test_async_collect():
|
|
44
|
+
async def test_async_collect() -> None:
|
|
43
45
|
received = []
|
|
44
46
|
|
|
45
47
|
class TestCollector(cirq.Collector):
|
|
@@ -51,14 +53,13 @@ async def test_async_collect():
|
|
|
51
53
|
def on_job_result(self, job, result):
|
|
52
54
|
received.append(job.tag)
|
|
53
55
|
|
|
54
|
-
|
|
56
|
+
await TestCollector().collect_async(
|
|
55
57
|
sampler=cirq.Simulator(), max_total_samples=100, concurrency=5
|
|
56
58
|
)
|
|
57
|
-
assert result is None
|
|
58
59
|
assert received == ['test'] * 10
|
|
59
60
|
|
|
60
61
|
|
|
61
|
-
def test_collect():
|
|
62
|
+
def test_collect() -> None:
|
|
62
63
|
received = []
|
|
63
64
|
|
|
64
65
|
class TestCollector(cirq.Collector):
|
|
@@ -74,7 +75,7 @@ def test_collect():
|
|
|
74
75
|
assert received == ['test'] * 10
|
|
75
76
|
|
|
76
77
|
|
|
77
|
-
def test_failed_job():
|
|
78
|
+
def test_failed_job() -> None:
|
|
78
79
|
class FailingSampler:
|
|
79
80
|
async def run_async(self, circuit, repetitions):
|
|
80
81
|
await duet.completed_future(None)
|
|
@@ -90,10 +91,14 @@ def test_failed_job():
|
|
|
90
91
|
pass
|
|
91
92
|
|
|
92
93
|
with pytest.raises(Exception, match='job failed!'):
|
|
93
|
-
TestCollector().collect(
|
|
94
|
+
TestCollector().collect(
|
|
95
|
+
sampler=FailingSampler(), # type:ignore
|
|
96
|
+
max_total_samples=100,
|
|
97
|
+
concurrency=5,
|
|
98
|
+
)
|
|
94
99
|
|
|
95
100
|
|
|
96
|
-
def test_collect_with_reaction():
|
|
101
|
+
def test_collect_with_reaction() -> None:
|
|
97
102
|
events = [0]
|
|
98
103
|
sent = 0
|
|
99
104
|
received = 0
|
|
@@ -123,7 +128,7 @@ def test_collect_with_reaction():
|
|
|
123
128
|
assert all(events.index(-k) > events.index(k) for k in range(1, 11))
|
|
124
129
|
|
|
125
130
|
|
|
126
|
-
def test_flatten_jobs_terminate_from_collector():
|
|
131
|
+
def test_flatten_jobs_terminate_from_collector() -> None:
|
|
127
132
|
sent = False
|
|
128
133
|
received = []
|
|
129
134
|
|
cirq/work/observable_grouping.py
CHANGED
|
@@ -12,20 +12,19 @@
|
|
|
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 Callable, cast, Iterable
|
|
16
18
|
|
|
17
19
|
from cirq import ops, value
|
|
18
20
|
from cirq.work.observable_settings import _max_weight_observable, _max_weight_state, InitObsSetting
|
|
19
21
|
|
|
20
|
-
|
|
21
|
-
pass
|
|
22
|
-
|
|
23
|
-
GROUPER_T = Callable[[Iterable[InitObsSetting]], Dict[InitObsSetting, List[InitObsSetting]]]
|
|
22
|
+
GROUPER_T = Callable[[Iterable[InitObsSetting]], dict[InitObsSetting, list[InitObsSetting]]]
|
|
24
23
|
|
|
25
24
|
|
|
26
25
|
def group_settings_greedy(
|
|
27
26
|
settings: Iterable[InitObsSetting],
|
|
28
|
-
) ->
|
|
27
|
+
) -> dict[InitObsSetting, list[InitObsSetting]]:
|
|
29
28
|
"""Greedily group settings which can be simultaneously measured.
|
|
30
29
|
|
|
31
30
|
We construct a dictionary keyed by `max_setting` (see docstrings
|
|
@@ -46,7 +45,7 @@ def group_settings_greedy(
|
|
|
46
45
|
input list of settings. Each dictionary value is a list of
|
|
47
46
|
settings compatible with `max_setting`.
|
|
48
47
|
"""
|
|
49
|
-
grouped_settings:
|
|
48
|
+
grouped_settings: dict[InitObsSetting, list[InitObsSetting]] = {}
|
|
50
49
|
for setting in settings:
|
|
51
50
|
for max_setting, simul_settings in grouped_settings.items():
|
|
52
51
|
trial_grouped_settings = simul_settings + [setting]
|
|
@@ -12,10 +12,12 @@
|
|
|
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 cirq
|
|
16
18
|
|
|
17
19
|
|
|
18
|
-
def test_group_settings_greedy_one_group():
|
|
20
|
+
def test_group_settings_greedy_one_group() -> None:
|
|
19
21
|
qubits = cirq.LineQubit.range(2)
|
|
20
22
|
q0, q1 = qubits
|
|
21
23
|
terms = [cirq.X(q0), cirq.Y(q1)]
|
|
@@ -33,7 +35,7 @@ def test_group_settings_greedy_one_group():
|
|
|
33
35
|
assert set(the_group) == set(settings)
|
|
34
36
|
|
|
35
37
|
|
|
36
|
-
def test_group_settings_greedy_two_groups():
|
|
38
|
+
def test_group_settings_greedy_two_groups() -> None:
|
|
37
39
|
qubits = cirq.LineQubit.range(2)
|
|
38
40
|
q0, q1 = qubits
|
|
39
41
|
terms = [cirq.X(q0) * cirq.X(q1), cirq.Y(q0) * cirq.Y(q1)]
|
|
@@ -48,7 +50,7 @@ def test_group_settings_greedy_two_groups():
|
|
|
48
50
|
assert set(grouped_settings.keys()) == set(group_max_settings_should_be)
|
|
49
51
|
|
|
50
52
|
|
|
51
|
-
def test_group_settings_greedy_single_item():
|
|
53
|
+
def test_group_settings_greedy_single_item() -> None:
|
|
52
54
|
qubits = cirq.LineQubit.range(2)
|
|
53
55
|
q0, q1 = qubits
|
|
54
56
|
term = cirq.X(q0) * cirq.X(q1)
|
|
@@ -60,11 +62,11 @@ def test_group_settings_greedy_single_item():
|
|
|
60
62
|
assert list(grouped_settings.values())[0][0] == settings[0]
|
|
61
63
|
|
|
62
64
|
|
|
63
|
-
def test_group_settings_greedy_empty():
|
|
65
|
+
def test_group_settings_greedy_empty() -> None:
|
|
64
66
|
assert cirq.work.group_settings_greedy([]) == dict()
|
|
65
67
|
|
|
66
68
|
|
|
67
|
-
def test_group_settings_greedy_init_state_compat():
|
|
69
|
+
def test_group_settings_greedy_init_state_compat() -> None:
|
|
68
70
|
q0, q1 = cirq.LineQubit.range(2)
|
|
69
71
|
settings = [
|
|
70
72
|
cirq.work.InitObsSetting(
|
|
@@ -78,14 +80,13 @@ def test_group_settings_greedy_init_state_compat():
|
|
|
78
80
|
assert len(grouped_settings) == 1
|
|
79
81
|
|
|
80
82
|
|
|
81
|
-
def test_group_settings_greedy_init_state_compat_sparse():
|
|
83
|
+
def test_group_settings_greedy_init_state_compat_sparse() -> None:
|
|
82
84
|
q0, q1 = cirq.LineQubit.range(2)
|
|
83
85
|
settings = [
|
|
84
86
|
cirq.work.InitObsSetting(init_state=cirq.KET_PLUS(q0), observable=cirq.X(q0)),
|
|
85
87
|
cirq.work.InitObsSetting(init_state=cirq.KET_ZERO(q1), observable=cirq.Z(q1)),
|
|
86
88
|
]
|
|
87
89
|
grouped_settings = cirq.work.group_settings_greedy(settings)
|
|
88
|
-
# pylint: disable=line-too-long
|
|
89
90
|
grouped_settings_should_be = {
|
|
90
91
|
cirq.work.InitObsSetting(
|
|
91
92
|
init_state=cirq.KET_PLUS(q0) * cirq.KET_ZERO(q1), observable=cirq.X(q0) * cirq.Z(q1)
|
|
@@ -94,7 +95,7 @@ def test_group_settings_greedy_init_state_compat_sparse():
|
|
|
94
95
|
assert grouped_settings == grouped_settings_should_be
|
|
95
96
|
|
|
96
97
|
|
|
97
|
-
def test_group_settings_greedy_init_state_incompat():
|
|
98
|
+
def test_group_settings_greedy_init_state_incompat() -> None:
|
|
98
99
|
q0, q1 = cirq.LineQubit.range(2)
|
|
99
100
|
settings = [
|
|
100
101
|
cirq.work.InitObsSetting(
|
|
@@ -106,7 +107,7 @@ def test_group_settings_greedy_init_state_incompat():
|
|
|
106
107
|
assert len(grouped_settings) == 2
|
|
107
108
|
|
|
108
109
|
|
|
109
|
-
def test_group_settings_greedy_hydrogen():
|
|
110
|
+
def test_group_settings_greedy_hydrogen() -> None:
|
|
110
111
|
qubits = cirq.LineQubit.range(4)
|
|
111
112
|
q0, q1, q2, q3 = qubits
|
|
112
113
|
terms = [
|