cirq-core 1.7.0.dev20250924231107__py3-none-any.whl → 1.7.0.dev20251203004401__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.
- cirq/__init__.py +1 -0
- cirq/_compat.py +3 -2
- cirq/_compat_test.py +16 -15
- cirq/_doc.py +4 -3
- cirq/_import.py +2 -1
- cirq/_version.py +1 -1
- cirq/_version_test.py +1 -1
- cirq/circuits/_bucket_priority_queue.py +2 -1
- cirq/circuits/circuit.py +7 -13
- cirq/circuits/circuit_operation.py +2 -1
- cirq/circuits/circuit_test.py +13 -12
- cirq/circuits/frozen_circuit.py +3 -2
- cirq/circuits/moment.py +3 -15
- cirq/circuits/optimization_pass.py +2 -1
- cirq/circuits/qasm_output.py +39 -10
- cirq/circuits/qasm_output_test.py +51 -2
- cirq/circuits/text_diagram_drawer.py +2 -1
- cirq/contrib/acquaintance/bipartite.py +2 -1
- cirq/contrib/acquaintance/devices.py +1 -1
- cirq/contrib/acquaintance/executor.py +4 -5
- cirq/contrib/acquaintance/executor_test.py +2 -1
- cirq/contrib/acquaintance/gates.py +2 -1
- cirq/contrib/acquaintance/gates_test.py +1 -1
- cirq/contrib/acquaintance/inspection_utils.py +2 -1
- cirq/contrib/acquaintance/mutation_utils.py +2 -1
- cirq/contrib/acquaintance/optimizers.py +2 -1
- cirq/contrib/acquaintance/permutation.py +2 -1
- cirq/contrib/acquaintance/permutation_test.py +1 -1
- cirq/contrib/acquaintance/shift.py +2 -1
- cirq/contrib/acquaintance/shift_swap_network.py +2 -1
- cirq/contrib/acquaintance/strategies/complete.py +3 -2
- cirq/contrib/acquaintance/strategies/cubic.py +2 -1
- cirq/contrib/acquaintance/strategies/quartic_paired.py +2 -1
- cirq/contrib/acquaintance/strategies/quartic_paired_test.py +1 -1
- cirq/contrib/acquaintance/testing.py +2 -1
- cirq/contrib/acquaintance/topological_sort.py +2 -1
- cirq/contrib/bayesian_network/bayesian_network_gate.py +3 -2
- cirq/contrib/circuitdag/circuit_dag.py +4 -2
- cirq/contrib/custom_simulators/custom_state_simulator.py +2 -1
- cirq/contrib/custom_simulators/custom_state_simulator_test.py +1 -1
- cirq/contrib/graph_device/graph_device.py +2 -1
- cirq/contrib/graph_device/graph_device_test.py +2 -1
- cirq/contrib/graph_device/hypergraph.py +2 -1
- cirq/contrib/graph_device/uniform_graph_device.py +2 -1
- cirq/contrib/json.py +14 -2
- cirq/contrib/json_test_data/BayesianNetworkGate.json +10 -0
- cirq/contrib/json_test_data/BayesianNetworkGate.repr +3 -0
- cirq/contrib/json_test_data/QuantumVolumeResult.json +169 -0
- cirq/contrib/json_test_data/QuantumVolumeResult.repr +22 -0
- cirq/contrib/json_test_data/SwapPermutationGate.json +3 -0
- cirq/contrib/json_test_data/SwapPermutationGate.repr +1 -0
- cirq/contrib/json_test_data/spec.py +0 -2
- cirq/contrib/noise_models/noise_models.py +2 -1
- cirq/contrib/paulistring/clifford_optimize.py +20 -2
- cirq/contrib/paulistring/optimize.py +1 -1
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +146 -35
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +74 -171
- cirq/contrib/paulistring/recombine.py +5 -2
- cirq/contrib/paulistring/separate.py +1 -1
- cirq/contrib/qasm_import/_parser.py +2 -1
- cirq/contrib/qasm_import/_parser_test.py +3 -3
- cirq/contrib/quantikz/__init__.py +21 -0
- cirq/contrib/quantikz/circuit_to_latex_quantikz.py +680 -0
- cirq/contrib/quantikz/circuit_to_latex_quantikz_test.py +253 -0
- cirq/contrib/quantikz/circuit_to_latex_render.py +424 -0
- cirq/contrib/quantikz/circuit_to_latex_render_test.py +44 -0
- cirq/contrib/quantum_volume/quantum_volume.py +2 -1
- cirq/contrib/quimb/density_matrix.py +1 -1
- cirq/contrib/quimb/grid_circuits.py +2 -1
- cirq/contrib/quimb/grid_circuits_test.py +1 -1
- cirq/contrib/quimb/mps_simulator.py +4 -3
- cirq/contrib/quimb/state_vector.py +2 -1
- cirq/contrib/quirk/export_to_quirk.py +2 -1
- cirq/contrib/quirk/linearize_circuit.py +1 -1
- cirq/contrib/quirk/quirk_gate.py +2 -1
- cirq/contrib/routing/device.py +1 -1
- cirq/contrib/routing/greedy.py +2 -1
- cirq/contrib/routing/initialization.py +2 -1
- cirq/contrib/routing/router.py +2 -1
- cirq/contrib/routing/swap_network.py +2 -1
- cirq/contrib/routing/utils.py +2 -1
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +7 -5
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +6 -6
- cirq/devices/device.py +2 -1
- cirq/devices/grid_device_metadata.py +2 -1
- cirq/devices/grid_qubit.py +7 -6
- cirq/devices/insertion_noise_model.py +2 -1
- cirq/devices/line_qubit.py +2 -1
- cirq/devices/named_topologies.py +2 -1
- cirq/devices/noise_model.py +2 -1
- cirq/devices/noise_model_test.py +1 -1
- cirq/devices/noise_properties.py +2 -1
- cirq/devices/superconducting_qubits_noise_properties_test.py +2 -1
- cirq/devices/thermal_noise_model.py +2 -1
- cirq/experiments/__init__.py +2 -0
- cirq/experiments/benchmarking/parallel_xeb.py +2 -1
- cirq/experiments/benchmarking/parallel_xeb_test.py +1 -1
- cirq/experiments/fidelity_estimation.py +2 -1
- cirq/experiments/fidelity_estimation_test.py +1 -1
- cirq/experiments/ghz_2d.py +150 -0
- cirq/experiments/ghz_2d_test.py +155 -0
- cirq/experiments/n_qubit_tomography.py +2 -1
- cirq/experiments/n_qubit_tomography_test.py +1 -1
- cirq/experiments/purity_estimation.py +1 -1
- cirq/experiments/qubit_characterizations.py +2 -1
- cirq/experiments/random_quantum_circuit_generation.py +2 -1
- cirq/experiments/random_quantum_circuit_generation_test.py +2 -1
- cirq/experiments/readout_confusion_matrix.py +2 -1
- cirq/experiments/readout_confusion_matrix_test.py +1 -1
- cirq/experiments/single_qubit_readout_calibration.py +2 -1
- cirq/experiments/single_qubit_readout_calibration_test.py +1 -1
- cirq/experiments/t1_decay_experiment.py +2 -1
- cirq/experiments/two_qubit_xeb.py +2 -1
- cirq/experiments/two_qubit_xeb_test.py +1 -1
- cirq/experiments/xeb_fitting.py +2 -1
- cirq/experiments/xeb_fitting_test.py +1 -1
- cirq/experiments/xeb_sampling.py +5 -3
- cirq/experiments/xeb_sampling_test.py +1 -1
- cirq/experiments/xeb_simulation.py +2 -1
- cirq/experiments/xeb_simulation_test.py +2 -1
- cirq/experiments/z_phase_calibration.py +2 -1
- cirq/experiments/z_phase_calibration_test.py +18 -3
- cirq/interop/quirk/cells/__init__.py +1 -2
- cirq/interop/quirk/cells/all_cells.py +2 -1
- cirq/interop/quirk/cells/arithmetic_cells.py +2 -1
- cirq/interop/quirk/cells/cell.py +2 -1
- cirq/interop/quirk/cells/composite_cell.py +2 -1
- cirq/interop/quirk/cells/composite_cell_test.py +1 -1
- cirq/interop/quirk/cells/control_cells.py +2 -1
- cirq/interop/quirk/cells/frequency_space_cells.py +1 -1
- cirq/interop/quirk/cells/ignored_cells.py +1 -1
- cirq/interop/quirk/cells/input_cells.py +2 -1
- cirq/interop/quirk/cells/input_rotation_cells.py +2 -1
- cirq/interop/quirk/cells/measurement_cells.py +2 -1
- cirq/interop/quirk/cells/parse.py +2 -11
- cirq/interop/quirk/cells/qubit_permutation_cells.py +2 -1
- cirq/interop/quirk/cells/scalar_cells.py +2 -1
- cirq/interop/quirk/cells/single_qubit_rotation_cells.py +2 -1
- cirq/interop/quirk/cells/swap_cell.py +2 -1
- cirq/interop/quirk/cells/unsupported_cells.py +1 -1
- cirq/interop/quirk/url_to_circuit.py +2 -1
- cirq/json_resolver_cache.py +0 -2
- cirq/linalg/decompositions.py +6 -2
- cirq/linalg/decompositions_test.py +1 -0
- cirq/linalg/diagonalize.py +1 -1
- cirq/linalg/predicates.py +2 -1
- cirq/linalg/tolerance.py +2 -1
- cirq/linalg/transformations.py +2 -1
- cirq/ops/arithmetic_operation.py +2 -1
- cirq/ops/arithmetic_operation_test.py +1 -1
- cirq/ops/boolean_hamiltonian.py +4 -3
- cirq/ops/classically_controlled_operation.py +3 -2
- cirq/ops/clifford_gate.py +2 -1
- cirq/ops/clifford_gate_test.py +1 -2
- cirq/ops/common_channels.py +2 -1
- cirq/ops/common_gates.py +2 -1
- cirq/ops/control_values.py +2 -1
- cirq/ops/controlled_gate.py +3 -2
- cirq/ops/controlled_gate_test.py +2 -1
- cirq/ops/controlled_operation.py +3 -2
- cirq/ops/controlled_operation_test.py +2 -1
- cirq/ops/dense_pauli_string.py +3 -13
- cirq/ops/diagonal_gate.py +3 -2
- cirq/ops/eigen_gate.py +9 -7
- cirq/ops/fourier_transform.py +3 -2
- cirq/ops/fourier_transform_test.py +2 -4
- cirq/ops/fsim_gate.py +3 -2
- cirq/ops/gate_operation.py +8 -12
- cirq/ops/gateset.py +22 -2
- cirq/ops/global_phase_op.py +3 -2
- cirq/ops/greedy_qubit_manager.py +2 -1
- cirq/ops/identity.py +2 -1
- cirq/ops/kraus_channel.py +2 -1
- cirq/ops/linear_combinations.py +8 -3
- cirq/ops/linear_combinations_test.py +23 -1
- cirq/ops/matrix_gates.py +2 -1
- cirq/ops/measure_util.py +2 -1
- cirq/ops/measurement_gate.py +2 -1
- cirq/ops/mixed_unitary_channel.py +2 -1
- cirq/ops/named_qubit.py +2 -2
- cirq/ops/op_tree.py +2 -1
- cirq/ops/parallel_gate.py +3 -2
- cirq/ops/parity_gates.py +2 -1
- cirq/ops/pauli_interaction_gate.py +2 -1
- cirq/ops/pauli_measurement_gate.py +2 -1
- cirq/ops/pauli_string.py +6 -12
- cirq/ops/pauli_string_phasor.py +3 -2
- cirq/ops/pauli_string_raw_types.py +2 -1
- cirq/ops/pauli_string_test.py +2 -2
- cirq/ops/pauli_sum_exponential.py +2 -1
- cirq/ops/permutation_gate.py +2 -1
- cirq/ops/phased_iswap_gate.py +3 -2
- cirq/ops/phased_x_gate.py +5 -4
- cirq/ops/phased_x_z_gate.py +12 -5
- cirq/ops/projector.py +2 -1
- cirq/ops/qubit_manager.py +2 -1
- cirq/ops/qubit_order.py +2 -1
- cirq/ops/qubit_order_or_list.py +1 -1
- cirq/ops/random_gate_channel.py +3 -2
- cirq/ops/raw_types.py +7 -15
- cirq/ops/raw_types_test.py +4 -3
- cirq/ops/state_preparation_channel.py +2 -1
- cirq/ops/three_qubit_gates.py +3 -2
- cirq/ops/two_qubit_diagonal_gate.py +3 -2
- cirq/ops/uniform_superposition_gate.py +2 -1
- cirq/ops/wait_gate.py +10 -4
- cirq/protocols/act_on_protocol.py +2 -1
- cirq/protocols/act_on_protocol_test.py +2 -1
- cirq/protocols/apply_channel_protocol.py +2 -1
- cirq/protocols/apply_mixture_protocol.py +2 -1
- cirq/protocols/apply_mixture_protocol_test.py +2 -1
- cirq/protocols/apply_unitary_protocol.py +2 -1
- cirq/protocols/apply_unitary_protocol_test.py +2 -0
- cirq/protocols/approximate_equality_protocol.py +2 -1
- cirq/protocols/circuit_diagram_info_protocol.py +2 -1
- cirq/protocols/decompose_protocol.py +2 -12
- cirq/protocols/has_stabilizer_effect_protocol.py +1 -1
- cirq/protocols/hash_from_pickle_test.py +2 -2
- cirq/protocols/inverse_protocol.py +2 -1
- cirq/protocols/json_serialization.py +2 -1
- cirq/protocols/kraus_protocol.py +4 -3
- cirq/protocols/kraus_protocol_test.py +2 -2
- cirq/protocols/measurement_key_protocol.py +2 -1
- cirq/protocols/mixture_protocol.py +2 -1
- cirq/protocols/pow_protocol.py +2 -1
- cirq/protocols/qasm.py +2 -1
- cirq/protocols/qid_shape_protocol.py +2 -1
- cirq/protocols/resolve_parameters.py +16 -14
- cirq/protocols/trace_distance_bound.py +2 -1
- cirq/protocols/unitary_protocol.py +21 -21
- cirq/qis/channels.py +1 -1
- cirq/qis/channels_test.py +1 -1
- cirq/qis/clifford_tableau.py +2 -1
- cirq/qis/entropy.py +2 -2
- cirq/qis/quantum_state_representation.py +2 -1
- cirq/qis/states.py +7 -2
- cirq/sim/classical_simulator.py +2 -1
- cirq/sim/clifford/clifford_simulator.py +2 -1
- cirq/sim/clifford/clifford_simulator_test.py +1 -1
- cirq/sim/clifford/clifford_tableau_simulation_state.py +2 -1
- cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +2 -1
- cirq/sim/clifford/stabilizer_sampler.py +1 -1
- cirq/sim/clifford/stabilizer_simulation_state.py +2 -1
- cirq/sim/clifford/stabilizer_state_ch_form.py +3 -2
- cirq/sim/clifford/stabilizer_state_ch_form_test.py +0 -1
- cirq/sim/density_matrix_simulation_state.py +2 -1
- cirq/sim/density_matrix_simulator.py +2 -1
- cirq/sim/density_matrix_utils.py +2 -1
- cirq/sim/mux.py +2 -1
- cirq/sim/mux_test.py +0 -1
- cirq/sim/simulation_product_state.py +2 -1
- cirq/sim/simulation_product_state_test.py +2 -1
- cirq/sim/simulation_state.py +2 -1
- cirq/sim/simulation_state_base.py +2 -1
- cirq/sim/simulation_state_test.py +2 -1
- cirq/sim/simulation_utils.py +2 -1
- cirq/sim/simulator.py +2 -1
- cirq/sim/simulator_base.py +2 -1
- cirq/sim/simulator_base_test.py +2 -1
- cirq/sim/simulator_test.py +2 -1
- cirq/sim/sparse_simulator.py +2 -1
- cirq/sim/state_vector.py +2 -1
- cirq/sim/state_vector_simulation_state.py +2 -1
- cirq/sim/state_vector_simulator.py +2 -1
- cirq/sim/state_vector_test.py +1 -2
- cirq/study/__init__.py +1 -0
- cirq/study/flatten_expressions.py +2 -1
- cirq/study/resolver.py +31 -18
- cirq/study/resolver_test.py +1 -1
- cirq/study/result.py +2 -1
- cirq/study/sweepable.py +2 -1
- cirq/study/sweeps.py +26 -1
- cirq/study/sweeps_test.py +24 -0
- cirq/testing/_compat_test_data/__init__.py +3 -3
- cirq/testing/circuit_compare.py +2 -1
- cirq/testing/consistent_act_on_test.py +1 -1
- cirq/testing/consistent_controlled_gate_op.py +1 -1
- cirq/testing/consistent_controlled_gate_op_test.py +2 -1
- cirq/testing/consistent_protocols.py +2 -1
- cirq/testing/consistent_protocols_test.py +3 -3
- cirq/testing/consistent_qasm.py +2 -1
- cirq/testing/consistent_resolve_parameters.py +1 -1
- cirq/testing/consistent_unitary.py +1 -1
- cirq/testing/consistent_unitary_test.py +1 -1
- cirq/testing/deprecation.py +1 -1
- cirq/testing/devices.py +3 -2
- cirq/testing/equals_tester.py +4 -3
- cirq/testing/equivalent_basis_map.py +4 -2
- cirq/testing/json.py +3 -2
- cirq/testing/logs.py +1 -1
- cirq/testing/op_tree.py +1 -1
- cirq/testing/order_tester.py +2 -2
- cirq/testing/pytest_utils.py +2 -1
- cirq/testing/random_circuit.py +2 -1
- cirq/testing/random_circuit_test.py +2 -1
- cirq/testing/repr_pretty_tester.py +3 -3
- cirq/transformers/__init__.py +1 -0
- cirq/transformers/_connected_component.py +231 -0
- cirq/transformers/_connected_component_test.py +200 -0
- cirq/transformers/align_test.py +13 -13
- cirq/transformers/analytical_decompositions/clifford_decomposition.py +8 -7
- cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +5 -5
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +11 -10
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +6 -6
- cirq/transformers/analytical_decompositions/cphase_to_fsim.py +3 -2
- cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +11 -10
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +8 -7
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +17 -20
- cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +33 -27
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +1 -1
- cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +1 -1
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +12 -11
- cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +5 -2
- cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +3 -3
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +2 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +2 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +2 -2
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +2 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +32 -30
- cirq/transformers/drop_negligible_operations_test.py +7 -7
- cirq/transformers/dynamical_decoupling.py +185 -112
- cirq/transformers/dynamical_decoupling_test.py +195 -201
- cirq/transformers/eject_phased_paulis.py +2 -1
- cirq/transformers/eject_phased_paulis_test.py +3 -2
- cirq/transformers/eject_z.py +4 -3
- cirq/transformers/eject_z_test.py +23 -25
- cirq/transformers/expand_composite.py +3 -2
- cirq/transformers/expand_composite_test.py +14 -14
- cirq/transformers/gauge_compiling/__init__.py +8 -0
- cirq/transformers/gauge_compiling/gauge_compiling.py +3 -2
- cirq/transformers/gauge_compiling/gauge_compiling_test.py +14 -12
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +3 -3
- cirq/transformers/gauge_compiling/idle_moments_gauge.py +5 -2
- cirq/transformers/gauge_compiling/multi_moment_cphase_gauge.py +242 -0
- cirq/transformers/gauge_compiling/multi_moment_cphase_gauge_test.py +243 -0
- cirq/transformers/gauge_compiling/multi_moment_gauge_compiling.py +151 -0
- cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +2 -1
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +1 -1
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +6 -6
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +2 -1
- cirq/transformers/measurement_transformers.py +2 -1
- cirq/transformers/measurement_transformers_test.py +45 -39
- cirq/transformers/merge_k_qubit_gates.py +2 -1
- cirq/transformers/merge_k_qubit_gates_test.py +1 -1
- cirq/transformers/merge_single_qubit_gates.py +2 -1
- cirq/transformers/merge_single_qubit_gates_test.py +22 -22
- cirq/transformers/noise_adding_test.py +2 -2
- cirq/transformers/optimize_for_target_gateset.py +2 -1
- cirq/transformers/optimize_for_target_gateset_test.py +11 -9
- cirq/transformers/qubit_management_transformers_test.py +6 -2
- cirq/transformers/routing/mapping_manager.py +2 -1
- cirq/transformers/routing/route_circuit_cqc.py +2 -1
- cirq/transformers/stratify.py +2 -1
- cirq/transformers/symbolize.py +2 -1
- cirq/transformers/tag_transformers.py +2 -1
- cirq/transformers/target_gatesets/compilation_target_gateset.py +2 -1
- cirq/transformers/target_gatesets/cz_gateset.py +2 -1
- cirq/transformers/target_gatesets/cz_gateset_test.py +1 -1
- cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +2 -1
- cirq/transformers/transformer_api.py +2 -1
- cirq/transformers/transformer_primitives.py +271 -145
- cirq/transformers/transformer_primitives_test.py +185 -1
- cirq/value/abc_alt.py +2 -1
- cirq/value/classical_data.py +2 -1
- cirq/value/condition.py +2 -1
- cirq/value/digits.py +9 -2
- cirq/value/duration.py +6 -5
- cirq/value/linear_dict.py +4 -9
- cirq/value/measurement_key.py +2 -1
- cirq/value/periodic_value.py +3 -2
- cirq/value/product_state.py +2 -1
- cirq/value/value_equality_attr.py +2 -1
- cirq/vis/density_matrix.py +1 -1
- cirq/vis/heatmap.py +2 -1
- cirq/vis/histogram.py +2 -1
- cirq/vis/state_histogram.py +2 -1
- cirq/work/collector.py +2 -1
- cirq/work/observable_grouping.py +2 -1
- cirq/work/observable_measurement.py +2 -1
- cirq/work/observable_measurement_data.py +2 -1
- cirq/work/observable_measurement_test.py +1 -1
- cirq/work/observable_readout_calibration.py +2 -1
- cirq/work/observable_readout_calibration_test.py +1 -1
- cirq/work/observable_settings.py +2 -1
- cirq/work/sampler.py +2 -1
- cirq/work/sampler_test.py +1 -1
- {cirq_core-1.7.0.dev20250924231107.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/METADATA +4 -4
- {cirq_core-1.7.0.dev20250924231107.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/RECORD +391 -374
- cirq/contrib/json_test.py +0 -33
- {cirq_core-1.7.0.dev20250924231107.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/WHEEL +0 -0
- {cirq_core-1.7.0.dev20250924231107.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/licenses/LICENSE +0 -0
- {cirq_core-1.7.0.dev20250924231107.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/top_level.txt +0 -0
|
@@ -18,20 +18,22 @@ from __future__ import annotations
|
|
|
18
18
|
|
|
19
19
|
import itertools
|
|
20
20
|
import time
|
|
21
|
-
from
|
|
21
|
+
from collections.abc import Sequence
|
|
22
|
+
from typing import cast, TYPE_CHECKING
|
|
22
23
|
|
|
23
24
|
import attrs
|
|
24
25
|
import numpy as np
|
|
26
|
+
import sympy
|
|
25
27
|
|
|
26
28
|
import cirq.contrib.shuffle_circuits.shuffle_circuits_with_readout_benchmarking as sc_readout
|
|
27
29
|
from cirq import circuits, ops, study, work
|
|
28
30
|
from cirq.experiments.readout_confusion_matrix import TensoredConfusionMatrices
|
|
31
|
+
from cirq.study import ResultDict
|
|
29
32
|
|
|
30
33
|
if TYPE_CHECKING:
|
|
31
34
|
from cirq.experiments.single_qubit_readout_calibration import (
|
|
32
35
|
SingleQubitReadoutCalibrationResult,
|
|
33
36
|
)
|
|
34
|
-
from cirq.study import ResultDict
|
|
35
37
|
|
|
36
38
|
|
|
37
39
|
@attrs.frozen
|
|
@@ -188,7 +190,7 @@ def _validate_input(
|
|
|
188
190
|
|
|
189
191
|
# Check pauli_repetitions is bigger than 0
|
|
190
192
|
if pauli_repetitions <= 0:
|
|
191
|
-
raise ValueError("Must provide
|
|
193
|
+
raise ValueError("Must provide positive pauli_repetitions.")
|
|
192
194
|
|
|
193
195
|
# Check num_random_bitstrings is bigger than or equal to 0
|
|
194
196
|
if num_random_bitstrings < 0:
|
|
@@ -196,7 +198,7 @@ def _validate_input(
|
|
|
196
198
|
|
|
197
199
|
# Check readout_repetitions is bigger than 0
|
|
198
200
|
if readout_repetitions <= 0:
|
|
199
|
-
raise ValueError("Must provide
|
|
201
|
+
raise ValueError("Must provide positive readout_repetitions for readout calibration.")
|
|
200
202
|
|
|
201
203
|
|
|
202
204
|
def _normalize_input_paulis(
|
|
@@ -240,6 +242,90 @@ def _pauli_strings_to_basis_change_ops(
|
|
|
240
242
|
return operations
|
|
241
243
|
|
|
242
244
|
|
|
245
|
+
def _pauli_strings_to_basis_change_with_sweep(
|
|
246
|
+
pauli_strings: list[ops.PauliString], qid_list: list[ops.Qid]
|
|
247
|
+
) -> dict[str, float]:
|
|
248
|
+
"""Decide single-qubit rotation sweep parameters for basis change.
|
|
249
|
+
|
|
250
|
+
Args:
|
|
251
|
+
pauli_strings: A list of QWC Pauli strings.
|
|
252
|
+
qid_list: A list of qubits to apply the basis change on.
|
|
253
|
+
Returns:
|
|
254
|
+
A dictionary mapping parameter names to their values for basis change.
|
|
255
|
+
"""
|
|
256
|
+
params_dict = {}
|
|
257
|
+
|
|
258
|
+
for qid, qubit in enumerate(qid_list):
|
|
259
|
+
params_dict[f"phi{qid}"] = 1.0
|
|
260
|
+
params_dict[f"theta{qid}"] = 0.0
|
|
261
|
+
for pauli_str in pauli_strings:
|
|
262
|
+
pauli_op = pauli_str.get(qubit, default=ops.I)
|
|
263
|
+
if pauli_op == ops.X:
|
|
264
|
+
params_dict[f"phi{qid}"] = 0.0
|
|
265
|
+
params_dict[f"theta{qid}"] = 1 / 2
|
|
266
|
+
break
|
|
267
|
+
elif pauli_op == ops.Y:
|
|
268
|
+
params_dict[f"phi{qid}"] = 1.0
|
|
269
|
+
params_dict[f"theta{qid}"] = 1 / 2
|
|
270
|
+
break
|
|
271
|
+
return params_dict
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
def _generate_basis_change_circuits(
|
|
275
|
+
normalized_circuits_to_pauli: dict[circuits.FrozenCircuit, list[list[ops.PauliString]]],
|
|
276
|
+
insert_strategy: circuits.InsertStrategy,
|
|
277
|
+
) -> list[circuits.Circuit]:
|
|
278
|
+
"""Generates basis change circuits for each group of Pauli strings."""
|
|
279
|
+
pauli_measurement_circuits = list[circuits.Circuit]()
|
|
280
|
+
|
|
281
|
+
for input_circuit, pauli_string_groups in normalized_circuits_to_pauli.items():
|
|
282
|
+
qid_list = list(sorted(input_circuit.all_qubits()))
|
|
283
|
+
basis_change_circuits = []
|
|
284
|
+
input_circuit_unfrozen = input_circuit.unfreeze()
|
|
285
|
+
for pauli_strings in pauli_string_groups:
|
|
286
|
+
basis_change_circuit = circuits.Circuit(
|
|
287
|
+
input_circuit_unfrozen,
|
|
288
|
+
_pauli_strings_to_basis_change_ops(pauli_strings, qid_list),
|
|
289
|
+
ops.measure(*qid_list, key="result"),
|
|
290
|
+
strategy=insert_strategy,
|
|
291
|
+
)
|
|
292
|
+
basis_change_circuits.append(basis_change_circuit)
|
|
293
|
+
pauli_measurement_circuits.extend(basis_change_circuits)
|
|
294
|
+
|
|
295
|
+
return pauli_measurement_circuits
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
def _generate_basis_change_circuits_with_sweep(
|
|
299
|
+
normalized_circuits_to_pauli: dict[circuits.FrozenCircuit, list[list[ops.PauliString]]],
|
|
300
|
+
insert_strategy: circuits.InsertStrategy,
|
|
301
|
+
) -> tuple[list[circuits.Circuit], list[study.Sweepable]]:
|
|
302
|
+
"""Generates basis change circuits for each group of Pauli strings with sweep."""
|
|
303
|
+
parameterized_circuits = list[circuits.Circuit]()
|
|
304
|
+
sweep_params = list[study.Sweepable]()
|
|
305
|
+
for input_circuit, pauli_string_groups in normalized_circuits_to_pauli.items():
|
|
306
|
+
qid_list = list(sorted(input_circuit.all_qubits()))
|
|
307
|
+
phi_symbols = sympy.symbols(f"phi:{len(qid_list)}")
|
|
308
|
+
theta_symbols = sympy.symbols(f"theta:{len(qid_list)}")
|
|
309
|
+
|
|
310
|
+
# Create phased gates and measurement operator
|
|
311
|
+
phased_gates = [
|
|
312
|
+
ops.PhasedXPowGate(phase_exponent=(a - 1) / 2, exponent=b)(qubit)
|
|
313
|
+
for a, b, qubit in zip(phi_symbols, theta_symbols, qid_list)
|
|
314
|
+
]
|
|
315
|
+
measurement_op = ops.M(*qid_list, key="result")
|
|
316
|
+
|
|
317
|
+
parameterized_circuit = circuits.Circuit(
|
|
318
|
+
input_circuit.unfreeze(), phased_gates, measurement_op, strategy=insert_strategy
|
|
319
|
+
)
|
|
320
|
+
sweep_param = []
|
|
321
|
+
for pauli_strings in pauli_string_groups:
|
|
322
|
+
sweep_param.append(_pauli_strings_to_basis_change_with_sweep(pauli_strings, qid_list))
|
|
323
|
+
sweep_params.append(sweep_param)
|
|
324
|
+
parameterized_circuits.append(parameterized_circuit)
|
|
325
|
+
|
|
326
|
+
return parameterized_circuits, sweep_params
|
|
327
|
+
|
|
328
|
+
|
|
243
329
|
def _build_one_qubit_confusion_matrix(e0: float, e1: float) -> np.ndarray:
|
|
244
330
|
"""Builds a 2x2 confusion matrix for a single qubit.
|
|
245
331
|
|
|
@@ -288,7 +374,7 @@ def _build_many_one_qubits_empty_confusion_matrix(qubits_length: int) -> list[np
|
|
|
288
374
|
def _process_pauli_measurement_results(
|
|
289
375
|
qubits: Sequence[ops.Qid],
|
|
290
376
|
pauli_string_groups: list[list[ops.PauliString]],
|
|
291
|
-
circuit_results:
|
|
377
|
+
circuit_results: Sequence[ResultDict] | Sequence[study.Result],
|
|
292
378
|
calibration_results: dict[tuple[ops.Qid, ...], SingleQubitReadoutCalibrationResult],
|
|
293
379
|
pauli_repetitions: int,
|
|
294
380
|
timestamp: float,
|
|
@@ -321,7 +407,7 @@ def _process_pauli_measurement_results(
|
|
|
321
407
|
pauli_measurement_results: list[PauliStringMeasurementResult] = []
|
|
322
408
|
|
|
323
409
|
for pauli_group_index, circuit_result in enumerate(circuit_results):
|
|
324
|
-
measurement_results = circuit_result.measurements["
|
|
410
|
+
measurement_results = circuit_result.measurements["result"]
|
|
325
411
|
pauli_strs = pauli_string_groups[pauli_group_index]
|
|
326
412
|
pauli_readout_qubits = _extract_readout_qubits(pauli_strs)
|
|
327
413
|
|
|
@@ -403,6 +489,8 @@ def measure_pauli_strings(
|
|
|
403
489
|
readout_repetitions: int,
|
|
404
490
|
num_random_bitstrings: int,
|
|
405
491
|
rng_or_seed: np.random.Generator | int,
|
|
492
|
+
use_sweep: bool = False,
|
|
493
|
+
insert_strategy: circuits.InsertStrategy = circuits.InsertStrategy.INLINE,
|
|
406
494
|
) -> list[CircuitToPauliStringsMeasurementResult]:
|
|
407
495
|
"""Measures expectation values of Pauli strings on given circuits with/without
|
|
408
496
|
readout error mitigation.
|
|
@@ -411,10 +499,11 @@ def measure_pauli_strings(
|
|
|
411
499
|
For each circuit and its associated list of QWC pauli string group, it:
|
|
412
500
|
1. Constructs circuits to measure the Pauli string expectation value by
|
|
413
501
|
adding basis change moments and measurement operations.
|
|
414
|
-
2.
|
|
502
|
+
2. If `num_random_bitstrings` is greater than zero, performing readout
|
|
503
|
+
benchmarking (shuffled or sweep-based) to calibrate readout errors.
|
|
415
504
|
3. Mitigates readout errors using the calibrated confusion matrices.
|
|
416
505
|
4. Calculates and returns both error-mitigated and unmitigated expectation values for
|
|
417
|
-
|
|
506
|
+
each Pauli string.
|
|
418
507
|
|
|
419
508
|
Args:
|
|
420
509
|
circuits_to_pauli: A dictionary mapping circuits to either:
|
|
@@ -432,6 +521,10 @@ def measure_pauli_strings(
|
|
|
432
521
|
num_random_bitstrings: The number of random bitstrings to use in readout
|
|
433
522
|
benchmarking.
|
|
434
523
|
rng_or_seed: A random number generator or seed for the readout benchmarking.
|
|
524
|
+
use_sweep: If True, uses parameterized circuits and sweeps parameters
|
|
525
|
+
for both Pauli measurements and readout benchmarking. Defaults to False.
|
|
526
|
+
insert_strategy: The strategy for inserting measurement operations into the circuit.
|
|
527
|
+
Defaults to circuits.InsertStrategy.INLINE.
|
|
435
528
|
|
|
436
529
|
Returns:
|
|
437
530
|
A list of CircuitToPauliStringsMeasurementResult objects, where each object contains:
|
|
@@ -460,49 +553,68 @@ def measure_pauli_strings(
|
|
|
460
553
|
|
|
461
554
|
# Build the basis-change circuits for each Pauli string group
|
|
462
555
|
pauli_measurement_circuits: list[circuits.Circuit] = []
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
pauli_measurement_circuits
|
|
556
|
+
sweep_params: list[study.Sweepable] = []
|
|
557
|
+
circuits_results: Sequence[ResultDict] | Sequence[Sequence[study.Result]] = []
|
|
558
|
+
calibration_results: dict[tuple[ops.Qid, ...], SingleQubitReadoutCalibrationResult] = {}
|
|
559
|
+
|
|
560
|
+
benchmarking_params = sc_readout.ReadoutBenchmarkingParams(
|
|
561
|
+
circuit_repetitions=pauli_repetitions,
|
|
562
|
+
num_random_bitstrings=num_random_bitstrings,
|
|
563
|
+
readout_repetitions=readout_repetitions,
|
|
564
|
+
)
|
|
565
|
+
|
|
566
|
+
if use_sweep:
|
|
567
|
+
pauli_measurement_circuits, sweep_params = _generate_basis_change_circuits_with_sweep(
|
|
568
|
+
normalized_circuits_to_pauli, insert_strategy
|
|
569
|
+
)
|
|
475
570
|
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
sc_readout.run_shuffled_circuits_with_readout_benchmarking(
|
|
571
|
+
# Run benchmarking using sweep for readout calibration
|
|
572
|
+
circuits_results, calibration_results = sc_readout.run_sweep_with_readout_benchmarking(
|
|
479
573
|
sampler=sampler,
|
|
480
574
|
input_circuits=pauli_measurement_circuits,
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
num_random_bitstrings=num_random_bitstrings,
|
|
484
|
-
readout_repetitions=readout_repetitions,
|
|
485
|
-
),
|
|
575
|
+
sweep_params=sweep_params,
|
|
576
|
+
parameters=benchmarking_params,
|
|
486
577
|
rng_or_seed=rng_or_seed,
|
|
487
578
|
qubits=[list(qubits) for qubits in qubits_list],
|
|
488
579
|
)
|
|
489
|
-
|
|
580
|
+
|
|
581
|
+
else:
|
|
582
|
+
pauli_measurement_circuits = _generate_basis_change_circuits(
|
|
583
|
+
normalized_circuits_to_pauli, insert_strategy
|
|
584
|
+
)
|
|
585
|
+
|
|
586
|
+
# Run shuffled benchmarking for readout calibration
|
|
587
|
+
circuits_results, calibration_results = (
|
|
588
|
+
sc_readout.run_shuffled_circuits_with_readout_benchmarking(
|
|
589
|
+
sampler=sampler,
|
|
590
|
+
input_circuits=pauli_measurement_circuits,
|
|
591
|
+
parameters=benchmarking_params,
|
|
592
|
+
rng_or_seed=rng_or_seed,
|
|
593
|
+
qubits=[list(qubits) for qubits in qubits_list],
|
|
594
|
+
)
|
|
595
|
+
)
|
|
490
596
|
|
|
491
597
|
# Process the results to calculate expectation values
|
|
492
598
|
results: list[CircuitToPauliStringsMeasurementResult] = []
|
|
493
599
|
circuit_result_index = 0
|
|
494
|
-
for input_circuit, pauli_string_groups in normalized_circuits_to_pauli.items():
|
|
495
|
-
|
|
600
|
+
for i, (input_circuit, pauli_string_groups) in enumerate(normalized_circuits_to_pauli.items()):
|
|
496
601
|
qubits_in_circuit = tuple(sorted(input_circuit.all_qubits()))
|
|
497
602
|
|
|
498
603
|
disable_readout_mitigation = False if num_random_bitstrings != 0 else True
|
|
499
604
|
|
|
605
|
+
circuits_results_for_group: Sequence[ResultDict] | Sequence[study.Result] = []
|
|
606
|
+
if use_sweep:
|
|
607
|
+
circuits_results_for_group = cast(Sequence[Sequence[study.Result]], circuits_results)[i]
|
|
608
|
+
else:
|
|
609
|
+
circuits_results_for_group = cast(Sequence[ResultDict], circuits_results)[
|
|
610
|
+
circuit_result_index : circuit_result_index + len(pauli_string_groups)
|
|
611
|
+
]
|
|
612
|
+
circuit_result_index += len(pauli_string_groups)
|
|
613
|
+
|
|
500
614
|
pauli_measurement_results = _process_pauli_measurement_results(
|
|
501
615
|
list(qubits_in_circuit),
|
|
502
616
|
pauli_string_groups,
|
|
503
|
-
|
|
504
|
-
circuit_result_index : circuit_result_index + len(pauli_string_groups)
|
|
505
|
-
],
|
|
617
|
+
circuits_results_for_group,
|
|
506
618
|
calibration_results,
|
|
507
619
|
pauli_repetitions,
|
|
508
620
|
time.time(),
|
|
@@ -514,5 +626,4 @@ def measure_pauli_strings(
|
|
|
514
626
|
)
|
|
515
627
|
)
|
|
516
628
|
|
|
517
|
-
circuit_result_index += len(pauli_string_groups)
|
|
518
629
|
return results
|