cirq-core 1.4.1__py3-none-any.whl → 1.5.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 +587 -569
- cirq/_compat.py +9 -0
- cirq/_compat_test.py +11 -9
- cirq/_import.py +7 -8
- cirq/_version.py +1 -1
- cirq/_version_test.py +1 -1
- cirq/circuits/__init__.py +15 -9
- cirq/circuits/_block_diagram_drawer.py +1 -2
- cirq/circuits/_block_diagram_drawer_test.py +3 -3
- cirq/circuits/_box_drawing_character_data.py +0 -1
- cirq/circuits/_box_drawing_character_data_test.py +2 -2
- cirq/circuits/_bucket_priority_queue.py +0 -1
- cirq/circuits/_bucket_priority_queue_test.py +1 -1
- cirq/circuits/circuit.py +336 -234
- cirq/circuits/circuit_operation.py +102 -52
- cirq/circuits/circuit_operation_test.py +85 -4
- cirq/circuits/circuit_test.py +101 -32
- cirq/circuits/frozen_circuit.py +36 -32
- cirq/circuits/insert_strategy.py +10 -0
- cirq/circuits/insert_strategy_test.py +20 -0
- cirq/circuits/moment.py +79 -80
- cirq/circuits/moment_test.py +105 -2
- cirq/circuits/optimization_pass.py +15 -15
- cirq/circuits/optimization_pass_test.py +8 -9
- cirq/circuits/qasm_output.py +64 -33
- cirq/circuits/qasm_output_test.py +63 -2
- cirq/circuits/text_diagram_drawer.py +26 -56
- cirq/circuits/text_diagram_drawer_test.py +5 -4
- cirq/contrib/__init__.py +2 -2
- cirq/contrib/acquaintance/__init__.py +44 -29
- cirq/contrib/acquaintance/bipartite.py +8 -7
- cirq/contrib/acquaintance/bipartite_test.py +11 -1
- cirq/contrib/acquaintance/devices.py +5 -4
- cirq/contrib/acquaintance/devices_test.py +5 -1
- cirq/contrib/acquaintance/executor.py +18 -21
- cirq/contrib/acquaintance/executor_test.py +3 -2
- cirq/contrib/acquaintance/gates.py +36 -27
- cirq/contrib/acquaintance/gates_test.py +1 -1
- cirq/contrib/acquaintance/inspection_utils.py +10 -9
- cirq/contrib/acquaintance/inspection_utils_test.py +6 -1
- cirq/contrib/acquaintance/mutation_utils.py +10 -10
- cirq/contrib/acquaintance/optimizers.py +7 -6
- cirq/contrib/acquaintance/optimizers_test.py +1 -1
- cirq/contrib/acquaintance/permutation.py +22 -21
- cirq/contrib/acquaintance/permutation_test.py +1 -1
- cirq/contrib/acquaintance/shift.py +8 -6
- cirq/contrib/acquaintance/shift_swap_network.py +6 -4
- cirq/contrib/acquaintance/strategies/__init__.py +9 -3
- cirq/contrib/acquaintance/strategies/complete.py +4 -3
- cirq/contrib/acquaintance/strategies/cubic.py +5 -3
- cirq/contrib/acquaintance/strategies/quartic_paired.py +8 -6
- cirq/contrib/acquaintance/topological_sort.py +4 -2
- cirq/contrib/bayesian_network/__init__.py +3 -1
- cirq/contrib/bayesian_network/bayesian_network_gate.py +5 -3
- cirq/contrib/circuitdag/__init__.py +1 -1
- cirq/contrib/circuitdag/circuit_dag.py +24 -24
- cirq/contrib/circuitdag/circuit_dag_test.py +1 -1
- cirq/contrib/custom_simulators/custom_state_simulator.py +10 -8
- cirq/contrib/custom_simulators/custom_state_simulator_test.py +15 -11
- cirq/contrib/graph_device/__init__.py +8 -8
- cirq/contrib/graph_device/graph_device.py +8 -8
- cirq/contrib/graph_device/graph_device_test.py +0 -1
- cirq/contrib/graph_device/hypergraph_test.py +1 -0
- cirq/contrib/json.py +1 -2
- cirq/contrib/json_test.py +2 -2
- cirq/contrib/noise_models/__init__.py +5 -6
- cirq/contrib/noise_models/noise_models.py +8 -6
- cirq/contrib/paulistring/__init__.py +22 -10
- cirq/contrib/paulistring/clifford_optimize.py +1 -1
- cirq/contrib/paulistring/clifford_optimize_test.py +0 -1
- cirq/contrib/paulistring/clifford_target_gateset.py +15 -12
- cirq/contrib/paulistring/optimize.py +2 -2
- cirq/contrib/paulistring/optimize_test.py +0 -1
- cirq/contrib/paulistring/pauli_string_dag_test.py +0 -1
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +379 -0
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +523 -0
- cirq/contrib/paulistring/pauli_string_optimize.py +3 -1
- cirq/contrib/paulistring/pauli_string_optimize_test.py +1 -3
- cirq/contrib/paulistring/recombine.py +2 -2
- cirq/contrib/paulistring/recombine_test.py +2 -2
- cirq/contrib/paulistring/separate.py +3 -4
- cirq/contrib/qasm_import/__init__.py +2 -2
- cirq/contrib/qasm_import/_lexer.py +21 -26
- cirq/contrib/qasm_import/_lexer_test.py +90 -6
- cirq/contrib/qasm_import/_parser.py +238 -47
- cirq/contrib/qasm_import/_parser_test.py +514 -59
- cirq/contrib/qasm_import/qasm_test.py +1 -1
- cirq/contrib/qcircuit/__init__.py +6 -4
- cirq/contrib/qcircuit/qcircuit_diagram.py +5 -2
- cirq/contrib/qcircuit/qcircuit_pdf.py +1 -2
- cirq/{experiments/grid_parallel_two_qubit_xeb_test.py → contrib/qcircuit/qcircuit_pdf_test.py} +13 -12
- cirq/contrib/qcircuit/qcircuit_test.py +1 -1
- cirq/contrib/quantum_volume/__init__.py +7 -7
- cirq/contrib/quantum_volume/quantum_volume.py +6 -11
- cirq/contrib/quantum_volume/quantum_volume_test.py +3 -1
- cirq/contrib/quimb/__init__.py +16 -13
- cirq/contrib/quimb/density_matrix.py +1 -1
- cirq/contrib/quimb/mps_simulator.py +27 -28
- cirq/contrib/quimb/mps_simulator_test.py +5 -0
- cirq/contrib/quimb/state_vector.py +3 -10
- cirq/contrib/quirk/__init__.py +1 -1
- cirq/contrib/quirk/export_to_quirk.py +3 -3
- cirq/contrib/routing/__init__.py +12 -9
- cirq/contrib/routing/device.py +1 -1
- cirq/contrib/routing/device_test.py +1 -2
- cirq/contrib/routing/greedy.py +7 -5
- cirq/contrib/routing/greedy_test.py +5 -3
- cirq/contrib/routing/initialization.py +3 -1
- cirq/contrib/routing/initialization_test.py +1 -1
- cirq/contrib/routing/swap_network.py +6 -6
- cirq/contrib/routing/utils.py +6 -4
- cirq/contrib/routing/utils_test.py +1 -2
- cirq/{type_workarounds.py → contrib/shuffle_circuits/__init__.py} +5 -10
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +250 -0
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +363 -0
- cirq/contrib/svg/__init__.py +1 -1
- cirq/contrib/svg/svg.py +12 -10
- cirq/contrib/svg/svg_test.py +3 -2
- cirq/devices/__init__.py +34 -25
- cirq/devices/device.py +16 -12
- cirq/devices/device_test.py +1 -0
- cirq/devices/grid_device_metadata.py +16 -12
- cirq/devices/grid_device_metadata_test.py +2 -1
- cirq/devices/grid_qubit.py +31 -26
- cirq/devices/grid_qubit_test.py +30 -1
- cirq/devices/insertion_noise_model.py +6 -6
- cirq/devices/insertion_noise_model_test.py +1 -1
- cirq/devices/line_qubit.py +28 -20
- cirq/devices/line_qubit_test.py +26 -0
- cirq/devices/named_topologies.py +12 -10
- cirq/devices/named_topologies_test.py +5 -4
- cirq/devices/noise_model.py +29 -33
- cirq/devices/noise_properties.py +2 -2
- cirq/devices/noise_properties_test.py +2 -2
- cirq/devices/noise_utils.py +3 -3
- cirq/devices/superconducting_qubits_noise_properties.py +2 -2
- cirq/devices/superconducting_qubits_noise_properties_test.py +3 -3
- cirq/devices/thermal_noise_model.py +2 -1
- cirq/devices/unconstrained_device.py +1 -1
- cirq/devices/unconstrained_device_test.py +6 -0
- cirq/experiments/__init__.py +51 -34
- cirq/experiments/qubit_characterizations.py +17 -15
- cirq/experiments/qubit_characterizations_test.py +4 -6
- cirq/experiments/random_quantum_circuit_generation.py +10 -9
- cirq/experiments/random_quantum_circuit_generation_test.py +21 -4
- cirq/experiments/readout_confusion_matrix.py +73 -8
- cirq/experiments/readout_confusion_matrix_test.py +104 -1
- cirq/experiments/single_qubit_readout_calibration.py +8 -6
- cirq/experiments/single_qubit_readout_calibration_test.py +1 -1
- cirq/experiments/t1_decay_experiment.py +4 -5
- cirq/experiments/t1_decay_experiment_test.py +1 -2
- cirq/experiments/t2_decay_experiment.py +0 -1
- cirq/experiments/t2_decay_experiment_test.py +1 -2
- cirq/experiments/two_qubit_xeb.py +157 -33
- cirq/experiments/two_qubit_xeb_test.py +38 -22
- cirq/experiments/xeb_fitting.py +99 -19
- cirq/experiments/xeb_fitting_test.py +64 -25
- cirq/experiments/xeb_sampling.py +14 -18
- cirq/experiments/xeb_simulation.py +4 -3
- cirq/experiments/xeb_simulation_test.py +20 -14
- cirq/experiments/z_phase_calibration.py +368 -0
- cirq/experiments/z_phase_calibration_test.py +241 -0
- cirq/interop/__init__.py +4 -1
- cirq/interop/quirk/__init__.py +7 -4
- cirq/interop/quirk/cells/__init__.py +17 -6
- cirq/interop/quirk/cells/arithmetic_cells.py +8 -8
- cirq/interop/quirk/cells/arithmetic_cells_test.py +1 -1
- cirq/interop/quirk/cells/cell.py +6 -6
- cirq/interop/quirk/cells/composite_cell.py +5 -5
- cirq/interop/quirk/cells/composite_cell_test.py +1 -1
- cirq/interop/quirk/cells/control_cells.py +1 -1
- cirq/interop/quirk/cells/frequency_space_cells.py +2 -2
- cirq/interop/quirk/cells/ignored_cells.py +1 -1
- cirq/interop/quirk/cells/input_cells.py +1 -1
- cirq/interop/quirk/cells/input_cells_test.py +1 -1
- cirq/interop/quirk/cells/input_rotation_cells.py +1 -1
- cirq/interop/quirk/cells/input_rotation_cells_test.py +1 -1
- cirq/interop/quirk/cells/measurement_cells.py +1 -1
- cirq/interop/quirk/cells/parse.py +8 -7
- cirq/interop/quirk/cells/parse_test.py +2 -2
- cirq/interop/quirk/cells/single_qubit_rotation_cells.py +1 -1
- cirq/interop/quirk/cells/swap_cell_test.py +1 -1
- cirq/interop/quirk/cells/unsupported_cells.py +1 -1
- cirq/interop/quirk/url_to_circuit.py +7 -7
- cirq/interop/quirk/url_to_circuit_test.py +1 -1
- cirq/ion/__init__.py +4 -2
- cirq/json_resolver_cache.py +15 -7
- cirq/linalg/__init__.py +62 -51
- cirq/linalg/combinators.py +4 -4
- cirq/linalg/combinators_test.py +4 -1
- cirq/linalg/decompositions.py +15 -40
- cirq/linalg/decompositions_test.py +16 -22
- cirq/linalg/diagonalize.py +1 -1
- cirq/linalg/diagonalize_test.py +1 -1
- cirq/linalg/operator_spaces.py +20 -4
- cirq/linalg/operator_spaces_test.py +15 -2
- cirq/linalg/predicates.py +3 -3
- cirq/linalg/predicates_test.py +1 -0
- cirq/linalg/tolerance.py +2 -2
- cirq/linalg/transformations.py +30 -12
- cirq/linalg/transformations_test.py +13 -0
- cirq/neutral_atoms/__init__.py +2 -2
- cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +0 -1
- cirq/ops/__init__.py +172 -132
- cirq/ops/arithmetic_operation.py +2 -2
- cirq/ops/arithmetic_operation_test.py +2 -2
- cirq/ops/boolean_hamiltonian.py +3 -2
- cirq/ops/classically_controlled_operation.py +39 -12
- cirq/ops/classically_controlled_operation_test.py +147 -1
- cirq/ops/clifford_gate.py +38 -36
- cirq/ops/clifford_gate_test.py +75 -1
- cirq/ops/common_channels.py +16 -45
- cirq/ops/common_channels_test.py +10 -0
- cirq/ops/common_gate_families.py +1 -1
- cirq/ops/common_gate_families_test.py +1 -0
- cirq/ops/common_gates.py +48 -49
- cirq/ops/common_gates_test.py +18 -2
- cirq/ops/control_values.py +3 -3
- cirq/ops/control_values_test.py +2 -1
- cirq/ops/controlled_gate.py +36 -23
- cirq/ops/controlled_gate_test.py +70 -3
- cirq/ops/controlled_operation.py +6 -5
- cirq/ops/controlled_operation_test.py +7 -3
- cirq/ops/dense_pauli_string.py +11 -11
- cirq/ops/diagonal_gate.py +2 -2
- cirq/ops/diagonal_gate_test.py +1 -0
- cirq/ops/eigen_gate.py +16 -36
- cirq/ops/eigen_gate_test.py +60 -10
- cirq/ops/fourier_transform.py +1 -3
- cirq/ops/fourier_transform_test.py +2 -1
- cirq/ops/fsim_gate.py +42 -3
- cirq/ops/fsim_gate_test.py +21 -0
- cirq/ops/gate_operation.py +8 -8
- cirq/ops/gate_operation_test.py +4 -2
- cirq/ops/gateset_test.py +11 -2
- cirq/ops/global_phase_op.py +8 -7
- cirq/ops/global_phase_op_test.py +1 -1
- cirq/ops/greedy_qubit_manager_test.py +5 -0
- cirq/ops/identity.py +14 -4
- cirq/ops/identity_test.py +24 -0
- cirq/ops/kraus_channel.py +1 -0
- cirq/ops/kraus_channel_test.py +3 -1
- cirq/ops/linear_combinations.py +27 -21
- cirq/ops/linear_combinations_test.py +23 -4
- cirq/ops/matrix_gates.py +24 -8
- cirq/ops/measure_util.py +2 -2
- cirq/ops/measurement_gate.py +7 -4
- cirq/ops/measurement_gate_test.py +2 -1
- cirq/ops/mixed_unitary_channel.py +1 -0
- cirq/ops/mixed_unitary_channel_test.py +3 -1
- cirq/ops/named_qubit.py +8 -1
- cirq/ops/op_tree.py +3 -30
- cirq/ops/op_tree_test.py +4 -0
- cirq/ops/parallel_gate.py +2 -3
- cirq/ops/parallel_gate_test.py +2 -1
- cirq/ops/parity_gates.py +7 -8
- cirq/ops/parity_gates_test.py +1 -0
- cirq/ops/pauli_gates.py +5 -11
- cirq/ops/pauli_gates_test.py +1 -0
- cirq/ops/pauli_interaction_gate.py +11 -5
- cirq/ops/pauli_interaction_gate_test.py +2 -3
- cirq/ops/pauli_measurement_gate.py +6 -5
- cirq/ops/pauli_measurement_gate_test.py +1 -0
- cirq/ops/pauli_string.py +115 -130
- cirq/ops/pauli_string_phasor.py +21 -20
- cirq/ops/pauli_string_phasor_test.py +13 -3
- cirq/ops/pauli_string_raw_types.py +1 -0
- cirq/ops/pauli_string_test.py +192 -55
- cirq/ops/pauli_sum_exponential.py +3 -4
- cirq/ops/pauli_sum_exponential_test.py +0 -1
- cirq/ops/permutation_gate.py +2 -2
- cirq/ops/permutation_gate_test.py +1 -1
- cirq/ops/phased_iswap_gate.py +6 -7
- cirq/ops/phased_iswap_gate_test.py +21 -5
- cirq/ops/phased_x_gate.py +11 -25
- cirq/ops/phased_x_gate_test.py +19 -3
- cirq/ops/phased_x_z_gate.py +12 -11
- cirq/ops/projector.py +4 -5
- cirq/ops/qubit_manager.py +2 -1
- cirq/ops/qubit_manager_test.py +2 -1
- cirq/ops/qubit_order.py +1 -1
- cirq/ops/random_gate_channel.py +1 -1
- cirq/ops/random_gate_channel_test.py +0 -6
- cirq/ops/raw_types.py +146 -50
- cirq/ops/raw_types_test.py +37 -3
- cirq/ops/state_preparation_channel.py +2 -2
- cirq/ops/state_preparation_channel_test.py +2 -1
- cirq/ops/swap_gates.py +9 -4
- cirq/ops/three_qubit_gates.py +8 -8
- cirq/ops/three_qubit_gates_test.py +1 -0
- cirq/ops/two_qubit_diagonal_gate.py +4 -3
- cirq/ops/uniform_superposition_gate.py +4 -4
- cirq/ops/uniform_superposition_gate_test.py +1 -0
- cirq/ops/wait_gate.py +6 -8
- cirq/protocols/__init__.py +135 -83
- cirq/protocols/act_on_protocol.py +1 -1
- cirq/protocols/act_on_protocol_test.py +1 -1
- cirq/protocols/apply_channel_protocol.py +3 -3
- cirq/protocols/apply_mixture_protocol.py +15 -9
- cirq/protocols/apply_mixture_protocol_test.py +11 -0
- cirq/protocols/apply_unitary_protocol.py +2 -2
- cirq/protocols/apply_unitary_protocol_test.py +2 -1
- cirq/protocols/approximate_equality_protocol.py +7 -8
- cirq/protocols/approximate_equality_protocol_test.py +3 -1
- cirq/protocols/circuit_diagram_info_protocol.py +8 -6
- cirq/protocols/circuit_diagram_info_protocol_test.py +5 -0
- cirq/protocols/commutes_protocol.py +6 -6
- cirq/protocols/control_key_protocol.py +1 -1
- cirq/protocols/decompose_protocol.py +4 -5
- cirq/protocols/decompose_protocol_test.py +2 -1
- cirq/protocols/equal_up_to_global_phase_protocol.py +3 -3
- cirq/protocols/equal_up_to_global_phase_protocol_test.py +7 -0
- cirq/protocols/has_stabilizer_effect_protocol.py +5 -5
- cirq/protocols/has_unitary_protocol.py +1 -1
- cirq/protocols/has_unitary_protocol_test.py +8 -7
- cirq/protocols/hash_from_pickle_test.py +120 -0
- cirq/protocols/inverse_protocol.py +1 -1
- cirq/protocols/json_serialization.py +14 -1
- cirq/protocols/json_serialization_test.py +28 -7
- cirq/protocols/json_test_data/BitMaskKeyCondition.json +86 -0
- cirq/protocols/json_test_data/BitMaskKeyCondition.repr +7 -0
- cirq/protocols/json_test_data/Concat.json +19 -0
- cirq/protocols/json_test_data/Concat.repr +1 -0
- cirq/protocols/json_test_data/README.md +4 -2
- cirq/protocols/json_test_data/SympyCondition.json +60 -15
- cirq/protocols/json_test_data/SympyCondition.repr +4 -1
- cirq/protocols/json_test_data/_InverseCompositeGate.json +10 -0
- cirq/protocols/json_test_data/_InverseCompositeGate.repr +1 -0
- cirq/protocols/json_test_data/__init__.py +1 -1
- cirq/protocols/json_test_data/sympy.And.json +13 -0
- cirq/protocols/json_test_data/sympy.And.repr +1 -0
- cirq/protocols/json_test_data/sympy.Indexed.json +18 -0
- cirq/protocols/json_test_data/sympy.Indexed.repr +1 -0
- cirq/protocols/json_test_data/sympy.IndexedBase.json +9 -0
- cirq/protocols/json_test_data/sympy.IndexedBase.repr +1 -0
- cirq/protocols/json_test_data/sympy.Not.json +9 -0
- cirq/protocols/json_test_data/sympy.Not.repr +1 -0
- cirq/protocols/json_test_data/sympy.Or.json +13 -0
- cirq/protocols/json_test_data/sympy.Or.repr +1 -0
- cirq/protocols/json_test_data/sympy.Xor.json +13 -0
- cirq/protocols/json_test_data/sympy.Xor.repr +1 -0
- cirq/protocols/kraus_protocol.py +8 -8
- cirq/protocols/kraus_protocol_test.py +0 -1
- cirq/protocols/measurement_key_protocol.py +1 -1
- cirq/protocols/measurement_key_protocol_test.py +7 -7
- cirq/protocols/mixture_protocol.py +6 -4
- cirq/protocols/mixture_protocol_test.py +21 -13
- cirq/protocols/pauli_expansion_protocol.py +1 -0
- cirq/protocols/pow_protocol.py +1 -1
- cirq/protocols/qasm.py +25 -6
- cirq/protocols/qasm_test.py +17 -0
- cirq/protocols/qid_shape_protocol.py +2 -2
- cirq/protocols/resolve_parameters.py +2 -3
- cirq/protocols/resolve_parameters_test.py +2 -1
- cirq/protocols/trace_distance_bound.py +1 -1
- cirq/protocols/trace_distance_bound_test.py +1 -0
- cirq/protocols/unitary_protocol.py +3 -3
- cirq/protocols/unitary_protocol_test.py +1 -1
- cirq/qis/__init__.py +48 -35
- cirq/qis/channels_test.py +0 -9
- cirq/qis/clifford_tableau.py +46 -26
- cirq/qis/clifford_tableau_test.py +2 -1
- cirq/qis/entropy.py +115 -0
- cirq/qis/entropy_test.py +43 -0
- cirq/qis/measures.py +5 -4
- cirq/qis/measures_test.py +7 -0
- cirq/qis/noise_utils_test.py +4 -4
- cirq/qis/quantum_state_representation.py +1 -1
- cirq/qis/states.py +7 -7
- cirq/sim/__init__.py +55 -37
- cirq/sim/classical_simulator.py +7 -6
- cirq/sim/classical_simulator_test.py +3 -1
- cirq/sim/clifford/__init__.py +17 -9
- cirq/sim/clifford/clifford_simulator.py +5 -4
- cirq/sim/clifford/clifford_simulator_test.py +32 -9
- cirq/sim/clifford/clifford_tableau_simulation_state.py +1 -1
- cirq/sim/clifford/stabilizer_simulation_state.py +1 -1
- cirq/sim/clifford/stabilizer_state_ch_form.py +4 -3
- cirq/sim/density_matrix_simulator.py +3 -2
- cirq/sim/density_matrix_simulator_test.py +12 -4
- cirq/sim/density_matrix_utils.py +1 -1
- cirq/sim/mux.py +2 -2
- cirq/sim/simulation_state.py +4 -5
- cirq/sim/simulation_state_base.py +2 -2
- cirq/sim/simulation_state_test.py +1 -1
- cirq/sim/simulation_utils.py +3 -1
- cirq/sim/simulation_utils_test.py +2 -3
- cirq/sim/simulator.py +7 -6
- cirq/sim/simulator_base.py +5 -5
- cirq/sim/simulator_test.py +14 -3
- cirq/sim/sparse_simulator.py +4 -3
- cirq/sim/sparse_simulator_test.py +17 -9
- cirq/sim/state_vector.py +2 -2
- cirq/sim/state_vector_simulation_state_test.py +1 -1
- cirq/sim/state_vector_simulator.py +4 -4
- cirq/sim/state_vector_test.py +27 -32
- cirq/study/__init__.py +27 -21
- cirq/study/flatten_expressions.py +5 -6
- cirq/study/flatten_expressions_test.py +1 -1
- cirq/study/resolver.py +14 -11
- cirq/study/resolver_test.py +10 -1
- cirq/study/result.py +3 -3
- cirq/study/sweepable.py +15 -9
- cirq/study/sweepable_test.py +27 -0
- cirq/study/sweeps.py +65 -10
- cirq/study/sweeps_test.py +123 -0
- cirq/testing/__init__.py +86 -57
- cirq/testing/_compat_test_data/module_a/__init__.py +2 -2
- cirq/testing/_compat_test_data/module_a/sub/subsub/__init__.py +1 -1
- cirq/testing/circuit_compare.py +3 -4
- cirq/testing/circuit_compare_test.py +7 -8
- cirq/testing/consistent_act_on.py +3 -3
- cirq/testing/consistent_channels_test.py +2 -1
- cirq/testing/consistent_controlled_gate_op.py +3 -2
- cirq/testing/consistent_controlled_gate_op_test.py +2 -3
- cirq/testing/consistent_decomposition.py +1 -1
- cirq/testing/consistent_decomposition_test.py +1 -2
- cirq/testing/consistent_pauli_expansion_test.py +1 -1
- cirq/testing/consistent_phase_by.py +1 -1
- cirq/testing/consistent_phase_by_test.py +1 -2
- cirq/testing/consistent_protocols.py +11 -11
- cirq/testing/consistent_protocols_test.py +4 -5
- cirq/testing/consistent_qasm.py +8 -12
- cirq/testing/consistent_qasm_test.py +1 -1
- cirq/testing/consistent_resolve_parameters.py +2 -1
- cirq/testing/consistent_specified_has_unitary_test.py +1 -1
- cirq/testing/consistent_unitary.py +3 -1
- cirq/testing/consistent_unitary_test.py +3 -3
- cirq/testing/devices.py +1 -1
- cirq/testing/devices_test.py +1 -0
- cirq/testing/equals_tester.py +2 -4
- cirq/testing/equals_tester_test.py +6 -5
- cirq/testing/equivalent_basis_map.py +1 -0
- cirq/testing/equivalent_basis_map_test.py +0 -1
- cirq/testing/gate_features_test.py +5 -0
- cirq/testing/json.py +4 -4
- cirq/testing/lin_alg_utils_test.py +1 -1
- cirq/testing/order_tester.py +1 -1
- cirq/testing/order_tester_test.py +1 -1
- cirq/testing/pytest_utils.py +57 -0
- cirq/testing/pytest_utils_test.py +35 -0
- cirq/testing/random_circuit.py +2 -2
- cirq/testing/random_circuit_test.py +2 -2
- cirq/testing/routing_devices_test.py +2 -1
- cirq/testing/sample_circuits.py +1 -1
- cirq/testing/sample_gates.py +5 -4
- cirq/testing/sample_gates_test.py +2 -2
- cirq/transformers/__init__.py +101 -82
- cirq/transformers/align.py +12 -1
- cirq/transformers/align_test.py +13 -0
- cirq/transformers/analytical_decompositions/__init__.py +27 -24
- cirq/transformers/analytical_decompositions/clifford_decomposition.py +2 -1
- cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +1 -1
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +1 -1
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/cphase_to_fsim.py +1 -1
- cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +1 -1
- cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +2 -2
- cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +4 -4
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +99 -24
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +105 -14
- cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +1 -1
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +1 -1
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +1 -0
- cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +3 -4
- cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +1 -1
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +2 -1
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +5 -6
- cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +2 -2
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +1 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +1 -2
- cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +2 -2
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +2 -2
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -1
- cirq/transformers/drop_empty_moments.py +1 -0
- cirq/transformers/drop_negligible_operations.py +1 -0
- cirq/transformers/dynamical_decoupling.py +255 -43
- cirq/transformers/dynamical_decoupling_test.py +730 -17
- cirq/transformers/eject_phased_paulis.py +29 -15
- cirq/transformers/eject_phased_paulis_test.py +3 -8
- cirq/transformers/eject_z.py +3 -2
- cirq/transformers/eject_z_test.py +3 -3
- cirq/transformers/gauge_compiling/__init__.py +25 -9
- cirq/transformers/gauge_compiling/cphase_gauge.py +146 -0
- cirq/transformers/gauge_compiling/cphase_gauge_test.py +42 -0
- cirq/transformers/gauge_compiling/cz_gauge.py +4 -4
- cirq/transformers/gauge_compiling/gauge_compiling.py +245 -6
- cirq/transformers/gauge_compiling/gauge_compiling_test.py +107 -2
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +39 -2
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +10 -1
- cirq/transformers/gauge_compiling/iswap_gauge.py +2 -2
- cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -2
- cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +23 -5
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +3 -2
- cirq/transformers/heuristic_decompositions/__init__.py +3 -3
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +2 -1
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +1 -1
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +4 -4
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +4 -4
- cirq/transformers/insertion_sort.py +64 -0
- cirq/transformers/insertion_sort_test.py +34 -0
- cirq/transformers/measurement_transformers.py +14 -1
- cirq/transformers/measurement_transformers_test.py +35 -0
- cirq/transformers/merge_k_qubit_gates.py +2 -2
- cirq/transformers/merge_single_qubit_gates.py +1 -1
- cirq/transformers/merge_single_qubit_gates_test.py +1 -1
- cirq/transformers/noise_adding.py +115 -0
- cirq/transformers/noise_adding_test.py +54 -0
- cirq/transformers/optimize_for_target_gateset.py +1 -1
- cirq/transformers/optimize_for_target_gateset_test.py +3 -2
- cirq/transformers/qubit_management_transformers.py +1 -1
- cirq/transformers/randomized_measurements.py +171 -0
- cirq/transformers/randomized_measurements_test.py +68 -0
- cirq/transformers/routing/__init__.py +14 -5
- cirq/transformers/routing/initial_mapper.py +1 -1
- cirq/transformers/routing/initial_mapper_test.py +1 -0
- cirq/transformers/routing/line_initial_mapper.py +3 -2
- cirq/transformers/routing/mapping_manager.py +2 -2
- cirq/transformers/routing/mapping_manager_test.py +2 -2
- cirq/transformers/routing/route_circuit_cqc.py +3 -2
- cirq/transformers/routing/route_circuit_cqc_test.py +2 -1
- cirq/transformers/routing/visualize_routed_circuit.py +1 -0
- cirq/transformers/routing/visualize_routed_circuit_test.py +1 -0
- cirq/transformers/stratify.py +2 -2
- cirq/transformers/synchronize_terminal_measurements.py +2 -1
- cirq/transformers/target_gatesets/__init__.py +7 -5
- cirq/transformers/target_gatesets/compilation_target_gateset.py +16 -3
- cirq/transformers/target_gatesets/compilation_target_gateset_test.py +2 -0
- cirq/transformers/target_gatesets/cz_gateset.py +5 -1
- cirq/transformers/target_gatesets/cz_gateset_test.py +23 -2
- cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +1 -1
- cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +3 -2
- cirq/transformers/transformer_api.py +5 -4
- cirq/transformers/transformer_api_test.py +11 -3
- cirq/transformers/transformer_primitives.py +9 -31
- cirq/transformers/transformer_primitives_test.py +6 -5
- cirq/value/__init__.py +51 -30
- cirq/value/abc_alt.py +1 -2
- cirq/value/angle.py +2 -0
- cirq/value/classical_data.py +1 -0
- cirq/value/condition.py +149 -3
- cirq/value/condition_test.py +254 -0
- cirq/value/digits.py +1 -1
- cirq/value/duration.py +4 -4
- cirq/value/duration_test.py +2 -1
- cirq/value/linear_dict.py +85 -24
- cirq/value/linear_dict_test.py +94 -3
- cirq/value/measurement_key.py +9 -2
- cirq/value/periodic_value.py +2 -3
- cirq/value/periodic_value_test.py +5 -0
- cirq/value/probability.py +1 -0
- cirq/value/random_state.py +1 -1
- cirq/value/timestamp.py +2 -4
- cirq/value/timestamp_test.py +2 -1
- cirq/value/type_alias.py +2 -2
- cirq/value/value_equality_attr.py +14 -2
- cirq/value/value_equality_attr_test.py +1 -1
- cirq/vis/__init__.py +9 -6
- cirq/vis/density_matrix.py +1 -1
- cirq/vis/density_matrix_test.py +2 -5
- cirq/vis/heatmap.py +49 -12
- cirq/vis/heatmap_test.py +168 -4
- cirq/vis/histogram.py +1 -1
- cirq/vis/histogram_test.py +1 -2
- cirq/vis/state_histogram.py +7 -5
- cirq/vis/state_histogram_test.py +2 -2
- cirq/work/__init__.py +19 -13
- cirq/work/collector.py +2 -2
- cirq/work/observable_grouping.py +2 -2
- cirq/work/observable_measurement.py +3 -3
- cirq/work/observable_measurement_data.py +5 -2
- cirq/work/observable_measurement_test.py +8 -8
- cirq/work/observable_readout_calibration.py +2 -2
- cirq/work/observable_readout_calibration_test.py +2 -1
- cirq/work/observable_settings.py +8 -7
- cirq/work/observable_settings_test.py +3 -2
- cirq/work/pauli_sum_collector.py +1 -1
- cirq/work/sampler.py +8 -20
- cirq/work/sampler_test.py +4 -3
- cirq/work/zeros_sampler.py +1 -1
- cirq_core-1.5.0.dist-info/METADATA +125 -0
- {cirq_core-1.4.1.dist-info → cirq_core-1.5.0.dist-info}/RECORD +586 -552
- {cirq_core-1.4.1.dist-info → cirq_core-1.5.0.dist-info}/WHEEL +1 -1
- cirq/experiments/grid_parallel_two_qubit_xeb.py +0 -62
- cirq/protocols/json_test_data/GridParallelXEBMetadata.json +0 -119
- cirq/protocols/json_test_data/GridParallelXEBMetadata.repr +0 -1
- cirq_core-1.4.1.dist-info/METADATA +0 -45
- {cirq_core-1.4.1.dist-info → cirq_core-1.5.0.dist-info}/LICENSE +0 -0
- {cirq_core-1.4.1.dist-info → cirq_core-1.5.0.dist-info}/top_level.txt +0 -0
cirq/qis/clifford_tableau.py
CHANGED
|
@@ -14,10 +14,11 @@
|
|
|
14
14
|
|
|
15
15
|
import abc
|
|
16
16
|
from typing import Any, Dict, List, Optional, Sequence, TYPE_CHECKING
|
|
17
|
+
|
|
17
18
|
import numpy as np
|
|
18
19
|
|
|
19
20
|
from cirq import protocols
|
|
20
|
-
from cirq._compat import
|
|
21
|
+
from cirq._compat import _method_cache_name, cached_method, proper_repr
|
|
21
22
|
from cirq.qis import quantum_state_representation
|
|
22
23
|
from cirq.value import big_endian_int_to_digits, linear_dict, random_state
|
|
23
24
|
|
|
@@ -326,32 +327,42 @@ class CliffordTableau(StabilizerState):
|
|
|
326
327
|
return string
|
|
327
328
|
|
|
328
329
|
def _str_full_(self) -> str:
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
330
|
+
left_col_width = max(7, self.n * 2 + 3)
|
|
331
|
+
right_col_width = max(10, self.n * 2 + 4)
|
|
332
|
+
|
|
333
|
+
def _fill_row(left: str, right: str, mid='|', fill=' ') -> str:
|
|
334
|
+
"""Builds a left-aligned fixed-width row with 2 columns."""
|
|
335
|
+
return f"{left:{fill}<{left_col_width}}{mid}{right:{fill}<{right_col_width}}".rstrip()
|
|
336
|
+
|
|
337
|
+
def _pauli_from_matrix(r: int, c: int) -> str:
|
|
338
|
+
match (bool(self.xs[r, c]), bool(self.zs[r, c])):
|
|
339
|
+
case (True, False):
|
|
340
|
+
return f'X{c}'
|
|
341
|
+
case (False, True):
|
|
342
|
+
return f'Z{c}'
|
|
343
|
+
case (True, True):
|
|
344
|
+
return f'Y{c}'
|
|
345
|
+
case _:
|
|
346
|
+
# (False, False) is the only leftover option
|
|
347
|
+
return ' '
|
|
348
|
+
|
|
349
|
+
title_row = _fill_row('stable', ' destable')
|
|
350
|
+
divider = _fill_row('', '', mid='+', fill='-')
|
|
351
|
+
contents = [
|
|
352
|
+
_fill_row(
|
|
353
|
+
left=(
|
|
354
|
+
f"{'-' if self.rs[i + self.n] else '+'} "
|
|
355
|
+
f"{''.join(_pauli_from_matrix(i + self.n, j) for j in range(self.n))}"
|
|
356
|
+
),
|
|
357
|
+
right=(
|
|
358
|
+
f" {'-' if self.rs[i] else '+'} "
|
|
359
|
+
f"{''.join(_pauli_from_matrix(i, j) for j in range(self.n))}"
|
|
360
|
+
),
|
|
361
|
+
)
|
|
362
|
+
for i in range(self.n)
|
|
363
|
+
]
|
|
353
364
|
|
|
354
|
-
return
|
|
365
|
+
return '\n'.join([title_row, divider, *contents]) + '\n'
|
|
355
366
|
|
|
356
367
|
def then(self, second: 'CliffordTableau') -> 'CliffordTableau':
|
|
357
368
|
"""Returns a composed CliffordTableau of this tableau and the second tableau.
|
|
@@ -658,3 +669,12 @@ class CliffordTableau(StabilizerState):
|
|
|
658
669
|
@cached_method
|
|
659
670
|
def __hash__(self) -> int:
|
|
660
671
|
return hash(self.matrix().tobytes() + self.rs.tobytes())
|
|
672
|
+
|
|
673
|
+
def __getstate__(self) -> Dict[str, Any]:
|
|
674
|
+
# clear cached hash value when pickling, see #6674
|
|
675
|
+
state = self.__dict__
|
|
676
|
+
hash_attr = _method_cache_name(self.__hash__)
|
|
677
|
+
if hash_attr in state:
|
|
678
|
+
state = state.copy()
|
|
679
|
+
del state[hash_attr]
|
|
680
|
+
return state
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
"""Tests for clifford tableau."""
|
|
16
|
+
|
|
16
17
|
import numpy as np
|
|
17
18
|
import pytest
|
|
18
19
|
|
|
@@ -308,7 +309,7 @@ def test_str_full():
|
|
|
308
309
|
t = cirq.CliffordTableau(num_qubits=2)
|
|
309
310
|
expected_str = r"""stable | destable
|
|
310
311
|
-------+----------
|
|
311
|
-
+ Z0 | + X0
|
|
312
|
+
+ Z0 | + X0
|
|
312
313
|
+ Z1 | + X1
|
|
313
314
|
"""
|
|
314
315
|
assert t._str_full_() == expected_str
|
cirq/qis/entropy.py
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# Copyright 2024 The Cirq Developers
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from collections.abc import Sequence
|
|
16
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
17
|
+
from itertools import product
|
|
18
|
+
from typing import Any, Optional
|
|
19
|
+
|
|
20
|
+
import numpy as np
|
|
21
|
+
import numpy.typing as npt
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _get_hamming_distance(
|
|
25
|
+
bitstring_1: npt.NDArray[np.int8], bitstring_2: npt.NDArray[np.int8]
|
|
26
|
+
) -> int:
|
|
27
|
+
"""Calculates the Hamming distance between two bitstrings.
|
|
28
|
+
Args:
|
|
29
|
+
bitstring_1: Bitstring 1
|
|
30
|
+
bitstring_2: Bitstring 2
|
|
31
|
+
Returns: The Hamming distance
|
|
32
|
+
"""
|
|
33
|
+
return (bitstring_1 ^ bitstring_2).sum().item()
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _bitstrings_to_probs(
|
|
37
|
+
bitstrings: npt.NDArray[np.int8],
|
|
38
|
+
) -> tuple[npt.NDArray[np.int8], npt.NDArray[Any]]:
|
|
39
|
+
"""Given a list of bitstrings from different measurements returns a probability distribution.
|
|
40
|
+
Args:
|
|
41
|
+
bitstrings: The bitstring
|
|
42
|
+
Returns:
|
|
43
|
+
A tuple of bitstrings and their corresponding probabilities.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
num_shots = bitstrings.shape[0]
|
|
47
|
+
unique_bitstrings, counts = np.unique(bitstrings, return_counts=True, axis=0)
|
|
48
|
+
probs = counts / num_shots
|
|
49
|
+
|
|
50
|
+
return (unique_bitstrings, probs)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _bitstring_format_helper(
|
|
54
|
+
measured_bitstrings: npt.NDArray[np.int8], subsystem: Sequence[int] | None = None
|
|
55
|
+
) -> npt.NDArray[np.int8]:
|
|
56
|
+
"""Formats the bitstring for analysis based on the selected subsystem.
|
|
57
|
+
Args:
|
|
58
|
+
measured_bitstrings: List of sampled measurement outcomes as a numpy array of bitstrings.
|
|
59
|
+
subsystem: Subsystem of interest
|
|
60
|
+
Returns: The bitstring string for the subsystem
|
|
61
|
+
"""
|
|
62
|
+
if subsystem is None:
|
|
63
|
+
return measured_bitstrings
|
|
64
|
+
|
|
65
|
+
return measured_bitstrings[:, :, subsystem]
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _compute_bitstrings_contribution_to_purity(bitstrings: npt.NDArray[np.int8]) -> float:
|
|
69
|
+
"""Computes the contribution to the purity of the bitstrings.
|
|
70
|
+
Args:
|
|
71
|
+
bitstrings: The bitstrings measured using the same unitary operators
|
|
72
|
+
Returns: The purity of the bitstring
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
bitstrings, probs = _bitstrings_to_probs(bitstrings)
|
|
76
|
+
purity = 0
|
|
77
|
+
for (s, p), (s_prime, p_prime) in product(zip(bitstrings, probs), repeat=2):
|
|
78
|
+
purity += (-2.0) ** float(-_get_hamming_distance(s, s_prime)) * p * p_prime
|
|
79
|
+
|
|
80
|
+
return purity * 2 ** (bitstrings.shape[-1])
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def process_renyi_entropy_from_bitstrings(
|
|
84
|
+
measured_bitstrings: npt.NDArray[np.int8],
|
|
85
|
+
subsystem: tuple[int] | None = None,
|
|
86
|
+
pool: Optional[ThreadPoolExecutor] = None,
|
|
87
|
+
) -> float:
|
|
88
|
+
"""Compute the Rényi entropy of an array of bitstrings.
|
|
89
|
+
Args:
|
|
90
|
+
measured_bitstrings: List of sampled measurement outcomes as a numpy array of bitstrings.
|
|
91
|
+
subsystem: Subsystem of interest
|
|
92
|
+
pool: ThreadPoolExecutor used to paralelleize the computation.
|
|
93
|
+
|
|
94
|
+
Returns:
|
|
95
|
+
A float indicating the computed entropy.
|
|
96
|
+
"""
|
|
97
|
+
bitstrings = _bitstring_format_helper(measured_bitstrings, subsystem)
|
|
98
|
+
num_shots = bitstrings.shape[1]
|
|
99
|
+
num_qubits = bitstrings.shape[-1]
|
|
100
|
+
|
|
101
|
+
if num_shots == 1:
|
|
102
|
+
return 0
|
|
103
|
+
|
|
104
|
+
if pool is not None:
|
|
105
|
+
purities = list(pool.map(_compute_bitstrings_contribution_to_purity, list(bitstrings)))
|
|
106
|
+
purity = np.mean(purities)
|
|
107
|
+
|
|
108
|
+
else:
|
|
109
|
+
purity = np.mean(
|
|
110
|
+
[_compute_bitstrings_contribution_to_purity(bitstring) for bitstring in bitstrings]
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
purity_unbiased = purity * num_shots / (num_shots - 1) - (2**num_qubits) / (num_shots - 1)
|
|
114
|
+
|
|
115
|
+
return -np.log2(purity_unbiased)
|
cirq/qis/entropy_test.py
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Copyright 2024 The Cirq Developers
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
16
|
+
|
|
17
|
+
import numpy as np
|
|
18
|
+
import pytest
|
|
19
|
+
|
|
20
|
+
from cirq.qis.entropy import process_renyi_entropy_from_bitstrings
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@pytest.mark.parametrize('pool', [None, ThreadPoolExecutor(max_workers=1)])
|
|
24
|
+
def test_process_renyi_entropy_from_bitstrings(pool):
|
|
25
|
+
bitstrings = np.array(
|
|
26
|
+
[
|
|
27
|
+
[[0, 1, 1, 0], [1, 0, 0, 0], [0, 0, 0, 1], [0, 1, 1, 1]],
|
|
28
|
+
[[0, 1, 1, 0], [0, 1, 1, 0], [1, 1, 0, 0], [1, 1, 0, 1]],
|
|
29
|
+
[[0, 0, 1, 1], [0, 0, 0, 0], [0, 1, 1, 1], [0, 1, 1, 1]],
|
|
30
|
+
[[1, 0, 1, 1], [0, 1, 0, 0], [0, 1, 0, 1], [0, 1, 0, 0]],
|
|
31
|
+
[[1, 0, 1, 1], [0, 0, 1, 0], [0, 0, 1, 0], [0, 0, 0, 1]],
|
|
32
|
+
]
|
|
33
|
+
)
|
|
34
|
+
substsytem = (0, 1)
|
|
35
|
+
entropy = process_renyi_entropy_from_bitstrings(bitstrings, substsytem, pool)
|
|
36
|
+
assert entropy == 0.5145731728297583
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def test_process_renyi_entropy_from_bitstrings_safeguards_against_divide_by_0_error():
|
|
40
|
+
bitstrings = np.array([[[0, 1, 1, 0]], [[0, 1, 1, 0]], [[0, 0, 1, 1]]])
|
|
41
|
+
|
|
42
|
+
entropy = process_renyi_entropy_from_bitstrings(bitstrings)
|
|
43
|
+
assert entropy == 0
|
cirq/qis/measures.py
CHANGED
|
@@ -14,15 +14,15 @@
|
|
|
14
14
|
"""Measures on and between quantum states and operations."""
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
from typing import Optional,
|
|
17
|
+
from typing import Optional, Tuple, TYPE_CHECKING
|
|
18
18
|
|
|
19
19
|
import numpy as np
|
|
20
20
|
|
|
21
|
-
from cirq import protocols, value
|
|
21
|
+
from cirq import _import, protocols, value
|
|
22
22
|
from cirq.qis.states import (
|
|
23
|
-
QuantumState,
|
|
24
23
|
infer_qid_shape,
|
|
25
24
|
quantum_state,
|
|
25
|
+
QuantumState,
|
|
26
26
|
validate_density_matrix,
|
|
27
27
|
validate_normalized_state_vector,
|
|
28
28
|
)
|
|
@@ -247,7 +247,8 @@ def _fidelity_state_vectors_or_density_matrices(state1: np.ndarray, state2: np.n
|
|
|
247
247
|
eigs = linalg.eigvalsh(state1_sqrt @ state2 @ state1_sqrt)
|
|
248
248
|
trace = np.sum(np.sqrt(np.abs(eigs)))
|
|
249
249
|
return trace**2
|
|
250
|
-
|
|
250
|
+
# matrix is reshaped before this point
|
|
251
|
+
raise ValueError( # pragma: no cover
|
|
251
252
|
'The given arrays must be one- or two-dimensional. '
|
|
252
253
|
f'Got shapes {state1.shape} and {state2.shape}.'
|
|
253
254
|
)
|
cirq/qis/measures_test.py
CHANGED
|
@@ -34,6 +34,13 @@ def test_fidelity_symmetric():
|
|
|
34
34
|
)
|
|
35
35
|
|
|
36
36
|
|
|
37
|
+
def test_bad_fidelity():
|
|
38
|
+
arr = np.asarray([[[1j, 0], [0, 0]], [[0, 0], [0, 0]]])
|
|
39
|
+
assert arr.ndim > 2
|
|
40
|
+
assert arr.dtype.kind == 'c'
|
|
41
|
+
_ = cirq.fidelity(arr, arr)
|
|
42
|
+
|
|
43
|
+
|
|
37
44
|
def test_fidelity_between_zero_and_one():
|
|
38
45
|
assert 0 <= cirq.fidelity(VEC1, VEC2) <= 1
|
|
39
46
|
assert 0 <= cirq.fidelity(VEC1, MAT1) <= 1
|
cirq/qis/noise_utils_test.py
CHANGED
|
@@ -16,13 +16,13 @@ import numpy as np
|
|
|
16
16
|
import pytest
|
|
17
17
|
|
|
18
18
|
from cirq.qis.noise_utils import (
|
|
19
|
-
|
|
19
|
+
average_error,
|
|
20
20
|
decay_constant_to_pauli_error,
|
|
21
|
+
decay_constant_to_xeb_fidelity,
|
|
22
|
+
decoherence_pauli_error,
|
|
23
|
+
pauli_error_from_t1,
|
|
21
24
|
pauli_error_to_decay_constant,
|
|
22
25
|
xeb_fidelity_to_decay_constant,
|
|
23
|
-
pauli_error_from_t1,
|
|
24
|
-
average_error,
|
|
25
|
-
decoherence_pauli_error,
|
|
26
26
|
)
|
|
27
27
|
|
|
28
28
|
|
cirq/qis/states.py
CHANGED
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
|
|
15
15
|
"""Classes and methods for quantum states."""
|
|
16
16
|
|
|
17
|
-
from typing import Any, cast, Iterable, List, Optional, Sequence, Set, TYPE_CHECKING, Tuple, Union
|
|
18
17
|
import itertools
|
|
18
|
+
from typing import Any, cast, Iterable, List, Optional, Sequence, Set, Tuple, TYPE_CHECKING, Union
|
|
19
19
|
|
|
20
20
|
import numpy as np
|
|
21
21
|
|
|
@@ -23,9 +23,10 @@ from cirq import value
|
|
|
23
23
|
from cirq._doc import document
|
|
24
24
|
|
|
25
25
|
if TYPE_CHECKING:
|
|
26
|
-
import cirq
|
|
27
26
|
from numpy.typing import DTypeLike
|
|
28
27
|
|
|
28
|
+
import cirq
|
|
29
|
+
|
|
29
30
|
DEFAULT_COMPLEX_DTYPE = np.complex64
|
|
30
31
|
|
|
31
32
|
STATE_VECTOR_LIKE = Union[
|
|
@@ -35,7 +36,7 @@ STATE_VECTOR_LIKE = Union[
|
|
|
35
36
|
Sequence[int],
|
|
36
37
|
# Explicit state vector or state tensor.
|
|
37
38
|
np.ndarray,
|
|
38
|
-
Sequence[
|
|
39
|
+
Sequence[complex],
|
|
39
40
|
# Product state object
|
|
40
41
|
'cirq.ProductState',
|
|
41
42
|
]
|
|
@@ -264,7 +265,7 @@ def quantum_state(
|
|
|
264
265
|
dtype = DEFAULT_COMPLEX_DTYPE
|
|
265
266
|
data = one_hot(index=state, shape=(dim,), dtype=dtype)
|
|
266
267
|
else:
|
|
267
|
-
data = np.
|
|
268
|
+
data = np.asarray(state)
|
|
268
269
|
if qid_shape is None:
|
|
269
270
|
qid_shape = infer_qid_shape(state)
|
|
270
271
|
if data.ndim == 1 and data.dtype.kind != 'c':
|
|
@@ -341,7 +342,7 @@ _NON_INT_STATE_LIKE = Union[
|
|
|
341
342
|
Sequence[int],
|
|
342
343
|
# Explicit state vector or state tensor.
|
|
343
344
|
np.ndarray,
|
|
344
|
-
Sequence[
|
|
345
|
+
Sequence[complex],
|
|
345
346
|
# Product state object
|
|
346
347
|
'cirq.ProductState',
|
|
347
348
|
# Quantum state object
|
|
@@ -677,7 +678,6 @@ def density_matrix_from_state_vector(
|
|
|
677
678
|
sum_inds = np.array(range(n_qubits))
|
|
678
679
|
sum_inds[indices] += n_qubits
|
|
679
680
|
|
|
680
|
-
# TODO(#5757): remove type ignore when numpy has proper override signature.
|
|
681
681
|
rho = np.einsum(
|
|
682
682
|
state_vector,
|
|
683
683
|
list(range(n_qubits)),
|
|
@@ -845,7 +845,7 @@ def _qudit_values_to_state_tensor(
|
|
|
845
845
|
)
|
|
846
846
|
|
|
847
847
|
if state_vector.dtype.kind[0] not in '?bBiu':
|
|
848
|
-
raise ValueError(
|
|
848
|
+
raise ValueError( # pragma: no cover
|
|
849
849
|
f'Expected a bool or int entry for each qudit in '
|
|
850
850
|
f'`state`, because len(state) == len(qid_shape), '
|
|
851
851
|
f'but got dtype {state_vector.dtype}.'
|
cirq/sim/__init__.py
CHANGED
|
@@ -15,63 +15,81 @@
|
|
|
15
15
|
"""Classes for circuit simulators and base implementations of these classes."""
|
|
16
16
|
|
|
17
17
|
from cirq.sim.clifford import (
|
|
18
|
-
CliffordSimulator,
|
|
19
|
-
CliffordSimulatorStepResult,
|
|
20
|
-
CliffordState,
|
|
21
|
-
CliffordTrialResult,
|
|
22
|
-
CliffordTableauSimulationState,
|
|
23
|
-
StabilizerChFormSimulationState,
|
|
24
|
-
StabilizerSampler,
|
|
25
|
-
StabilizerSimulationState,
|
|
26
|
-
StabilizerStateChForm,
|
|
18
|
+
CliffordSimulator as CliffordSimulator,
|
|
19
|
+
CliffordSimulatorStepResult as CliffordSimulatorStepResult,
|
|
20
|
+
CliffordState as CliffordState,
|
|
21
|
+
CliffordTrialResult as CliffordTrialResult,
|
|
22
|
+
CliffordTableauSimulationState as CliffordTableauSimulationState,
|
|
23
|
+
StabilizerChFormSimulationState as StabilizerChFormSimulationState,
|
|
24
|
+
StabilizerSampler as StabilizerSampler,
|
|
25
|
+
StabilizerSimulationState as StabilizerSimulationState,
|
|
26
|
+
StabilizerStateChForm as StabilizerStateChForm,
|
|
27
27
|
)
|
|
28
28
|
|
|
29
|
-
from cirq.sim.density_matrix_simulation_state import
|
|
29
|
+
from cirq.sim.density_matrix_simulation_state import (
|
|
30
|
+
DensityMatrixSimulationState as DensityMatrixSimulationState,
|
|
31
|
+
)
|
|
30
32
|
|
|
31
33
|
from cirq.sim.density_matrix_simulator import (
|
|
32
|
-
DensityMatrixSimulator,
|
|
33
|
-
DensityMatrixStepResult,
|
|
34
|
-
DensityMatrixTrialResult,
|
|
34
|
+
DensityMatrixSimulator as DensityMatrixSimulator,
|
|
35
|
+
DensityMatrixStepResult as DensityMatrixStepResult,
|
|
36
|
+
DensityMatrixTrialResult as DensityMatrixTrialResult,
|
|
35
37
|
)
|
|
36
38
|
|
|
37
|
-
from cirq.sim.density_matrix_utils import
|
|
39
|
+
from cirq.sim.density_matrix_utils import (
|
|
40
|
+
measure_density_matrix as measure_density_matrix,
|
|
41
|
+
sample_density_matrix as sample_density_matrix,
|
|
42
|
+
)
|
|
38
43
|
|
|
39
44
|
from cirq.sim.mux import (
|
|
40
|
-
CIRCUIT_LIKE,
|
|
41
|
-
final_density_matrix,
|
|
42
|
-
final_state_vector,
|
|
43
|
-
sample,
|
|
44
|
-
sample_sweep,
|
|
45
|
+
CIRCUIT_LIKE as CIRCUIT_LIKE,
|
|
46
|
+
final_density_matrix as final_density_matrix,
|
|
47
|
+
final_state_vector as final_state_vector,
|
|
48
|
+
sample as sample,
|
|
49
|
+
sample_sweep as sample_sweep,
|
|
45
50
|
)
|
|
46
51
|
|
|
47
|
-
from cirq.sim.simulation_product_state import SimulationProductState
|
|
52
|
+
from cirq.sim.simulation_product_state import SimulationProductState as SimulationProductState
|
|
48
53
|
|
|
49
|
-
from cirq.sim.simulation_state import SimulationState
|
|
54
|
+
from cirq.sim.simulation_state import SimulationState as SimulationState
|
|
50
55
|
|
|
51
|
-
from cirq.sim.simulation_state_base import SimulationStateBase
|
|
56
|
+
from cirq.sim.simulation_state_base import SimulationStateBase as SimulationStateBase
|
|
52
57
|
|
|
53
58
|
from cirq.sim.simulator import (
|
|
54
|
-
SimulatesAmplitudes,
|
|
55
|
-
SimulatesExpectationValues,
|
|
56
|
-
SimulatesFinalState,
|
|
57
|
-
SimulatesIntermediateState,
|
|
58
|
-
SimulatesSamples,
|
|
59
|
-
SimulationTrialResult,
|
|
60
|
-
StepResult,
|
|
59
|
+
SimulatesAmplitudes as SimulatesAmplitudes,
|
|
60
|
+
SimulatesExpectationValues as SimulatesExpectationValues,
|
|
61
|
+
SimulatesFinalState as SimulatesFinalState,
|
|
62
|
+
SimulatesIntermediateState as SimulatesIntermediateState,
|
|
63
|
+
SimulatesSamples as SimulatesSamples,
|
|
64
|
+
SimulationTrialResult as SimulationTrialResult,
|
|
65
|
+
StepResult as StepResult,
|
|
61
66
|
)
|
|
62
67
|
|
|
63
|
-
from cirq.sim.simulator_base import
|
|
68
|
+
from cirq.sim.simulator_base import (
|
|
69
|
+
SimulationTrialResultBase as SimulationTrialResultBase,
|
|
70
|
+
SimulatorBase as SimulatorBase,
|
|
71
|
+
StepResultBase as StepResultBase,
|
|
72
|
+
)
|
|
64
73
|
|
|
65
|
-
from cirq.sim.sparse_simulator import
|
|
74
|
+
from cirq.sim.sparse_simulator import (
|
|
75
|
+
Simulator as Simulator,
|
|
76
|
+
SparseSimulatorStep as SparseSimulatorStep,
|
|
77
|
+
)
|
|
66
78
|
|
|
67
|
-
from cirq.sim.state_vector import
|
|
79
|
+
from cirq.sim.state_vector import (
|
|
80
|
+
measure_state_vector as measure_state_vector,
|
|
81
|
+
sample_state_vector as sample_state_vector,
|
|
82
|
+
StateVectorMixin as StateVectorMixin,
|
|
83
|
+
)
|
|
68
84
|
|
|
69
|
-
from cirq.sim.state_vector_simulation_state import
|
|
85
|
+
from cirq.sim.state_vector_simulation_state import (
|
|
86
|
+
StateVectorSimulationState as StateVectorSimulationState,
|
|
87
|
+
)
|
|
70
88
|
|
|
71
|
-
from cirq.sim.classical_simulator import ClassicalStateSimulator
|
|
89
|
+
from cirq.sim.classical_simulator import ClassicalStateSimulator as ClassicalStateSimulator
|
|
72
90
|
|
|
73
91
|
from cirq.sim.state_vector_simulator import (
|
|
74
|
-
SimulatesIntermediateStateVector,
|
|
75
|
-
StateVectorStepResult,
|
|
76
|
-
StateVectorTrialResult,
|
|
92
|
+
SimulatesIntermediateStateVector as SimulatesIntermediateStateVector,
|
|
93
|
+
StateVectorStepResult as StateVectorStepResult,
|
|
94
|
+
StateVectorTrialResult as StateVectorTrialResult,
|
|
77
95
|
)
|
cirq/sim/classical_simulator.py
CHANGED
|
@@ -13,14 +13,15 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
from
|
|
17
|
-
from
|
|
18
|
-
|
|
19
|
-
from cirq.value import big_endian_int_to_bits
|
|
20
|
-
from cirq import sim
|
|
21
|
-
from cirq.sim.simulation_state import TSimulationState, SimulationState
|
|
16
|
+
from copy import copy, deepcopy
|
|
17
|
+
from typing import Any, Dict, Generic, List, Optional, Sequence, TYPE_CHECKING, Union
|
|
18
|
+
|
|
22
19
|
import numpy as np
|
|
23
20
|
|
|
21
|
+
from cirq import ops, qis, sim
|
|
22
|
+
from cirq.sim.simulation_state import SimulationState, TSimulationState
|
|
23
|
+
from cirq.value import big_endian_int_to_bits
|
|
24
|
+
|
|
24
25
|
if TYPE_CHECKING:
|
|
25
26
|
import cirq
|
|
26
27
|
|
cirq/sim/clifford/__init__.py
CHANGED
|
@@ -1,18 +1,26 @@
|
|
|
1
1
|
# pylint: disable=wrong-or-nonexistent-copyright-notice
|
|
2
2
|
|
|
3
3
|
from cirq.sim.clifford.clifford_simulator import (
|
|
4
|
-
CliffordSimulator,
|
|
5
|
-
CliffordSimulatorStepResult,
|
|
6
|
-
CliffordState,
|
|
7
|
-
CliffordTrialResult,
|
|
4
|
+
CliffordSimulator as CliffordSimulator,
|
|
5
|
+
CliffordSimulatorStepResult as CliffordSimulatorStepResult,
|
|
6
|
+
CliffordState as CliffordState,
|
|
7
|
+
CliffordTrialResult as CliffordTrialResult,
|
|
8
8
|
)
|
|
9
9
|
|
|
10
|
-
from cirq.sim.clifford.clifford_tableau_simulation_state import
|
|
10
|
+
from cirq.sim.clifford.clifford_tableau_simulation_state import (
|
|
11
|
+
CliffordTableauSimulationState as CliffordTableauSimulationState,
|
|
12
|
+
)
|
|
11
13
|
|
|
12
|
-
from cirq.sim.clifford.stabilizer_ch_form_simulation_state import
|
|
14
|
+
from cirq.sim.clifford.stabilizer_ch_form_simulation_state import (
|
|
15
|
+
StabilizerChFormSimulationState as StabilizerChFormSimulationState,
|
|
16
|
+
)
|
|
13
17
|
|
|
14
|
-
from cirq.sim.clifford.stabilizer_sampler import StabilizerSampler
|
|
18
|
+
from cirq.sim.clifford.stabilizer_sampler import StabilizerSampler as StabilizerSampler
|
|
15
19
|
|
|
16
|
-
from cirq.sim.clifford.stabilizer_simulation_state import
|
|
20
|
+
from cirq.sim.clifford.stabilizer_simulation_state import (
|
|
21
|
+
StabilizerSimulationState as StabilizerSimulationState,
|
|
22
|
+
)
|
|
17
23
|
|
|
18
|
-
from cirq.sim.clifford.stabilizer_state_ch_form import
|
|
24
|
+
from cirq.sim.clifford.stabilizer_state_ch_form import (
|
|
25
|
+
StabilizerStateChForm as StabilizerStateChForm,
|
|
26
|
+
)
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
"""An efficient simulator for Clifford circuits.
|
|
16
16
|
|
|
17
17
|
Allowed operations include:
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
- X,Y,Z,H,S,CNOT,CZ
|
|
19
|
+
- measurements in the computational basis
|
|
20
20
|
|
|
21
21
|
The quantum state is specified in two forms:
|
|
22
22
|
1. In terms of stabilizer generators. These are a set of n Pauli operators
|
|
@@ -90,7 +90,8 @@ class CliffordSimulator(
|
|
|
90
90
|
StabilizerChFormSimulationState for the circuit.
|
|
91
91
|
"""
|
|
92
92
|
if isinstance(initial_state, clifford.StabilizerChFormSimulationState):
|
|
93
|
-
|
|
93
|
+
# Instances of SimulationStateBase usually returned before this point
|
|
94
|
+
return initial_state # pragma: no cover
|
|
94
95
|
|
|
95
96
|
return clifford.StabilizerChFormSimulationState(
|
|
96
97
|
prng=self._prng,
|
|
@@ -188,7 +189,7 @@ class CliffordSimulatorStepResult(
|
|
|
188
189
|
return self._clifford_state
|
|
189
190
|
|
|
190
191
|
|
|
191
|
-
@value.value_equality
|
|
192
|
+
@value.value_equality(unhashable=True)
|
|
192
193
|
class CliffordState:
|
|
193
194
|
"""A state of the Clifford simulation.
|
|
194
195
|
|