cirq-core 1.4.0.dev20240529225110__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 +31 -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.0.dev20240529225110.dist-info → cirq_core-1.5.0.dist-info}/RECORD +586 -552
- {cirq_core-1.4.0.dev20240529225110.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.0.dev20240529225110.dist-info/METADATA +0 -50
- {cirq_core-1.4.0.dev20240529225110.dist-info → cirq_core-1.5.0.dist-info}/LICENSE +0 -0
- {cirq_core-1.4.0.dev20240529225110.dist-info → cirq_core-1.5.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
sympy.Indexed(sympy.IndexedBase(sympy.Symbol('s')),sympy.Integer(1))
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
sympy.IndexedBase(sympy.Symbol('s'))
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
sympy.Not(sympy.Symbol('s'))
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
sympy.Or(sympy.Symbol('s'), sympy.Symbol('t'))
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
sympy.Xor(sympy.Symbol('s'), sympy.Symbol('t'))
|
cirq/protocols/kraus_protocol.py
CHANGED
|
@@ -14,8 +14,9 @@
|
|
|
14
14
|
|
|
15
15
|
"""Protocol and methods for obtaining Kraus representation of quantum channels."""
|
|
16
16
|
|
|
17
|
-
from typing import Any, Sequence, Tuple, TypeVar, Union
|
|
18
17
|
import warnings
|
|
18
|
+
from types import NotImplementedType
|
|
19
|
+
from typing import Any, Sequence, Tuple, TypeVar, Union
|
|
19
20
|
|
|
20
21
|
import numpy as np
|
|
21
22
|
from typing_extensions import Protocol
|
|
@@ -23,10 +24,7 @@ from typing_extensions import Protocol
|
|
|
23
24
|
from cirq._doc import doc_private
|
|
24
25
|
from cirq.protocols.decompose_protocol import _try_decompose_into_operations_and_qubits
|
|
25
26
|
from cirq.protocols.mixture_protocol import has_mixture
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
from cirq.type_workarounds import NotImplementedType
|
|
29
|
-
|
|
27
|
+
from cirq.protocols.unitary_protocol import unitary
|
|
30
28
|
|
|
31
29
|
# This is a special indicator value used by the channel method to determine
|
|
32
30
|
# whether or not the caller provided a 'default' argument. It must be of type
|
|
@@ -135,7 +133,7 @@ def kraus(
|
|
|
135
133
|
"""
|
|
136
134
|
channel_getter = getattr(val, '_channel_', None)
|
|
137
135
|
if channel_getter is not None:
|
|
138
|
-
warnings.warn(
|
|
136
|
+
warnings.warn( # pragma: no cover
|
|
139
137
|
'_channel_ is deprecated and will be removed in cirq 0.13, rename to _kraus_',
|
|
140
138
|
DeprecationWarning,
|
|
141
139
|
)
|
|
@@ -148,7 +146,9 @@ def kraus(
|
|
|
148
146
|
mixture_getter = getattr(val, '_mixture_', None)
|
|
149
147
|
mixture_result = NotImplemented if mixture_getter is None else mixture_getter()
|
|
150
148
|
if mixture_result is not NotImplemented and mixture_result is not None:
|
|
151
|
-
return tuple(
|
|
149
|
+
return tuple(
|
|
150
|
+
np.sqrt(p) * (u if isinstance(u, np.ndarray) else unitary(u)) for p, u in mixture_result
|
|
151
|
+
)
|
|
152
152
|
|
|
153
153
|
unitary_getter = getattr(val, '_unitary_', None)
|
|
154
154
|
unitary_result = NotImplemented if unitary_getter is None else unitary_getter()
|
|
@@ -157,7 +157,7 @@ def kraus(
|
|
|
157
157
|
|
|
158
158
|
channel_result = NotImplemented if channel_getter is None else channel_getter()
|
|
159
159
|
if channel_result is not NotImplemented:
|
|
160
|
-
return tuple(channel_result)
|
|
160
|
+
return tuple(channel_result) # pragma: no cover
|
|
161
161
|
|
|
162
162
|
if default is not RaiseTypeErrorIfNotProvided:
|
|
163
163
|
return default
|
|
@@ -13,13 +13,13 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
"""Protocol for object that have measurement keys."""
|
|
15
15
|
|
|
16
|
+
from types import NotImplementedType
|
|
16
17
|
from typing import Any, FrozenSet, Mapping, Optional, Tuple, TYPE_CHECKING, Union
|
|
17
18
|
|
|
18
19
|
from typing_extensions import Protocol
|
|
19
20
|
|
|
20
21
|
from cirq import value
|
|
21
22
|
from cirq._doc import doc_private
|
|
22
|
-
from cirq.type_workarounds import NotImplementedType
|
|
23
23
|
|
|
24
24
|
if TYPE_CHECKING:
|
|
25
25
|
import cirq
|
|
@@ -104,7 +104,7 @@ def test_is_measurement():
|
|
|
104
104
|
|
|
105
105
|
@property
|
|
106
106
|
def qubits(self):
|
|
107
|
-
return cirq.LineQubit.range(2)
|
|
107
|
+
return cirq.LineQubit.range(2) # pragma: no cover
|
|
108
108
|
|
|
109
109
|
assert not cirq.is_measurement(NotImplementedOperation())
|
|
110
110
|
|
|
@@ -123,27 +123,27 @@ def test_measurement_without_key():
|
|
|
123
123
|
def test_non_measurement_with_key():
|
|
124
124
|
class NonMeasurementGate(cirq.Gate):
|
|
125
125
|
def _is_measurement_(self):
|
|
126
|
-
return False
|
|
126
|
+
return False # pragma: no cover
|
|
127
127
|
|
|
128
128
|
def _decompose_(self, qubits):
|
|
129
129
|
# Decompose should not be called by `is_measurement`
|
|
130
|
-
assert False
|
|
130
|
+
assert False # pragma: no cover
|
|
131
131
|
|
|
132
132
|
def _measurement_key_name_(self):
|
|
133
133
|
# `measurement_key_name`` should not be called by `is_measurement`
|
|
134
|
-
assert False
|
|
134
|
+
assert False # pragma: no cover
|
|
135
135
|
|
|
136
136
|
def _measurement_key_names_(self):
|
|
137
137
|
# `measurement_key_names`` should not be called by `is_measurement`
|
|
138
|
-
assert False
|
|
138
|
+
assert False # pragma: no cover
|
|
139
139
|
|
|
140
140
|
def _measurement_key_obj_(self):
|
|
141
141
|
# `measurement_key_obj`` should not be called by `is_measurement`
|
|
142
|
-
assert False
|
|
142
|
+
assert False # pragma: no cover
|
|
143
143
|
|
|
144
144
|
def _measurement_key_objs_(self):
|
|
145
145
|
# `measurement_key_objs`` should not be called by `is_measurement`
|
|
146
|
-
assert False
|
|
146
|
+
assert False # pragma: no cover
|
|
147
147
|
|
|
148
148
|
def num_qubits(self) -> int:
|
|
149
149
|
return 2 # pragma: no cover
|
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
"""Protocol for objects that are mixtures (probabilistic combinations)."""
|
|
16
|
+
|
|
17
|
+
from types import NotImplementedType
|
|
16
18
|
from typing import Any, Sequence, Tuple, Union
|
|
17
19
|
|
|
18
20
|
import numpy as np
|
|
@@ -21,7 +23,7 @@ from typing_extensions import Protocol
|
|
|
21
23
|
from cirq._doc import doc_private
|
|
22
24
|
from cirq.protocols.decompose_protocol import _try_decompose_into_operations_and_qubits
|
|
23
25
|
from cirq.protocols.has_unitary_protocol import has_unitary
|
|
24
|
-
from cirq.
|
|
26
|
+
from cirq.protocols.unitary_protocol import unitary
|
|
25
27
|
|
|
26
28
|
# This is a special indicator value used by the inverse method to determine
|
|
27
29
|
# whether or not the caller provided a 'default' argument.
|
|
@@ -83,14 +85,14 @@ def mixture(
|
|
|
83
85
|
with that probability in the mixture. The probabilities will sum to 1.0.
|
|
84
86
|
|
|
85
87
|
Raises:
|
|
86
|
-
TypeError: If `val` has no `_mixture_` or `_unitary_`
|
|
88
|
+
TypeError: If `val` has no `_mixture_` or `_unitary_` method, or if it
|
|
87
89
|
does and this method returned `NotImplemented`.
|
|
88
90
|
"""
|
|
89
91
|
|
|
90
92
|
mixture_getter = getattr(val, '_mixture_', None)
|
|
91
93
|
result = NotImplemented if mixture_getter is None else mixture_getter()
|
|
92
|
-
if result is not NotImplemented:
|
|
93
|
-
return result
|
|
94
|
+
if result is not NotImplemented and result is not None:
|
|
95
|
+
return tuple((p, u if isinstance(u, np.ndarray) else unitary(u)) for p, u in result)
|
|
94
96
|
|
|
95
97
|
unitary_getter = getattr(val, '_unitary_', None)
|
|
96
98
|
result = NotImplemented if unitary_getter is None else unitary_getter()
|
|
@@ -12,12 +12,14 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
import pytest
|
|
16
|
-
|
|
17
15
|
import numpy as np
|
|
16
|
+
import pytest
|
|
18
17
|
|
|
19
18
|
import cirq
|
|
20
19
|
|
|
20
|
+
a = np.array([1])
|
|
21
|
+
b = np.array([1j])
|
|
22
|
+
|
|
21
23
|
|
|
22
24
|
class NoMethod:
|
|
23
25
|
pass
|
|
@@ -33,7 +35,7 @@ class ReturnsNotImplemented:
|
|
|
33
35
|
|
|
34
36
|
class ReturnsValidTuple(cirq.SupportsMixture):
|
|
35
37
|
def _mixture_(self):
|
|
36
|
-
return ((0.4,
|
|
38
|
+
return ((0.4, a), (0.6, b))
|
|
37
39
|
|
|
38
40
|
def _has_mixture_(self):
|
|
39
41
|
return True
|
|
@@ -41,27 +43,27 @@ class ReturnsValidTuple(cirq.SupportsMixture):
|
|
|
41
43
|
|
|
42
44
|
class ReturnsNonnormalizedTuple:
|
|
43
45
|
def _mixture_(self):
|
|
44
|
-
return ((0.4,
|
|
46
|
+
return ((0.4, a), (0.4, b))
|
|
45
47
|
|
|
46
48
|
|
|
47
49
|
class ReturnsNegativeProbability:
|
|
48
50
|
def _mixture_(self):
|
|
49
|
-
return ((0.4,
|
|
51
|
+
return ((0.4, a), (-0.4, b))
|
|
50
52
|
|
|
51
53
|
|
|
52
54
|
class ReturnsGreaterThanUnityProbability:
|
|
53
55
|
def _mixture_(self):
|
|
54
|
-
return ((1.2,
|
|
56
|
+
return ((1.2, a), (0.4, b))
|
|
55
57
|
|
|
56
58
|
|
|
57
59
|
class ReturnsMixtureButNoHasMixture:
|
|
58
60
|
def _mixture_(self):
|
|
59
|
-
return ((0.4,
|
|
61
|
+
return ((0.4, a), (0.6, b))
|
|
60
62
|
|
|
61
63
|
|
|
62
64
|
class ReturnsUnitary:
|
|
63
65
|
def _unitary_(self):
|
|
64
|
-
return np.
|
|
66
|
+
return np.eye(2)
|
|
65
67
|
|
|
66
68
|
def _has_unitary_(self):
|
|
67
69
|
return True
|
|
@@ -75,12 +77,18 @@ class ReturnsNotImplementedUnitary:
|
|
|
75
77
|
return NotImplemented
|
|
76
78
|
|
|
77
79
|
|
|
80
|
+
class ReturnsMixtureOfReturnsUnitary:
|
|
81
|
+
def _mixture_(self):
|
|
82
|
+
return ((0.4, ReturnsUnitary()), (0.6, ReturnsUnitary()))
|
|
83
|
+
|
|
84
|
+
|
|
78
85
|
@pytest.mark.parametrize(
|
|
79
86
|
'val,mixture',
|
|
80
87
|
(
|
|
81
|
-
(ReturnsValidTuple(), ((0.4,
|
|
82
|
-
(ReturnsNonnormalizedTuple(), ((0.4,
|
|
83
|
-
(ReturnsUnitary(), ((1.0, np.
|
|
88
|
+
(ReturnsValidTuple(), ((0.4, a), (0.6, b))),
|
|
89
|
+
(ReturnsNonnormalizedTuple(), ((0.4, a), (0.4, b))),
|
|
90
|
+
(ReturnsUnitary(), ((1.0, np.eye(2)),)),
|
|
91
|
+
(ReturnsMixtureOfReturnsUnitary(), ((0.4, np.eye(2)), (0.6, np.eye(2)))),
|
|
84
92
|
),
|
|
85
93
|
)
|
|
86
94
|
def test_objects_with_mixture(val, mixture):
|
|
@@ -89,7 +97,7 @@ def test_objects_with_mixture(val, mixture):
|
|
|
89
97
|
np.testing.assert_almost_equal(keys, expected_keys)
|
|
90
98
|
np.testing.assert_equal(values, expected_values)
|
|
91
99
|
|
|
92
|
-
keys, values = zip(*cirq.mixture(val, ((0.3,
|
|
100
|
+
keys, values = zip(*cirq.mixture(val, ((0.3, a), (0.7, b))))
|
|
93
101
|
np.testing.assert_almost_equal(keys, expected_keys)
|
|
94
102
|
np.testing.assert_equal(values, expected_values)
|
|
95
103
|
|
|
@@ -102,7 +110,7 @@ def test_objects_with_no_mixture(val):
|
|
|
102
110
|
_ = cirq.mixture(val)
|
|
103
111
|
assert cirq.mixture(val, None) is None
|
|
104
112
|
assert cirq.mixture(val, NotImplemented) is NotImplemented
|
|
105
|
-
default = ((0.4,
|
|
113
|
+
default = ((0.4, a), (0.6, b))
|
|
106
114
|
assert cirq.mixture(val, default) == default
|
|
107
115
|
|
|
108
116
|
|
cirq/protocols/pow_protocol.py
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from typing import Any, Callable, Optional, overload,
|
|
15
|
+
from typing import Any, Callable, Optional, overload, TYPE_CHECKING, TypeVar, Union
|
|
16
16
|
|
|
17
17
|
if TYPE_CHECKING:
|
|
18
18
|
import cirq
|
cirq/protocols/qasm.py
CHANGED
|
@@ -13,13 +13,13 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
import string
|
|
16
|
-
from
|
|
16
|
+
from types import NotImplementedType
|
|
17
|
+
from typing import Any, Dict, Iterable, Optional, Tuple, TYPE_CHECKING, TypeVar, Union
|
|
17
18
|
|
|
18
19
|
from typing_extensions import Protocol
|
|
19
20
|
|
|
20
21
|
from cirq import ops
|
|
21
22
|
from cirq._doc import doc_private
|
|
22
|
-
from cirq.type_workarounds import NotImplementedType
|
|
23
23
|
|
|
24
24
|
if TYPE_CHECKING:
|
|
25
25
|
import cirq
|
|
@@ -38,6 +38,7 @@ class QasmArgs(string.Formatter):
|
|
|
38
38
|
version: str = '2.0',
|
|
39
39
|
qubit_id_map: Optional[Dict['cirq.Qid', str]] = None,
|
|
40
40
|
meas_key_id_map: Optional[Dict[str, str]] = None,
|
|
41
|
+
meas_key_bitcount: Optional[Dict[str, int]] = None,
|
|
41
42
|
) -> None:
|
|
42
43
|
"""Inits QasmArgs.
|
|
43
44
|
|
|
@@ -49,11 +50,21 @@ class QasmArgs(string.Formatter):
|
|
|
49
50
|
qubit_id_map: A dictionary mapping qubits to qreg QASM identifiers.
|
|
50
51
|
meas_key_id_map: A dictionary mapping measurement keys to creg QASM
|
|
51
52
|
identifiers.
|
|
53
|
+
meas_key_bitcount: A dictionary with of bits for each measurement
|
|
54
|
+
key.
|
|
52
55
|
"""
|
|
53
56
|
self.precision = precision
|
|
54
57
|
self.version = version
|
|
55
58
|
self.qubit_id_map = {} if qubit_id_map is None else qubit_id_map
|
|
56
59
|
self.meas_key_id_map = {} if meas_key_id_map is None else meas_key_id_map
|
|
60
|
+
self.meas_key_bitcount = {} if meas_key_bitcount is None else meas_key_bitcount
|
|
61
|
+
|
|
62
|
+
def _format_number(self, value) -> str:
|
|
63
|
+
"""OpenQASM 2.0 does not support '1e-5' and wants '1.0e-5'"""
|
|
64
|
+
s = f'{value}'
|
|
65
|
+
if 'e' in s and not '.' in s:
|
|
66
|
+
return s.replace('e', '.0e')
|
|
67
|
+
return s
|
|
57
68
|
|
|
58
69
|
def format_field(self, value: Any, spec: str) -> str:
|
|
59
70
|
"""Method of string.Formatter that specifies the output of format()."""
|
|
@@ -61,8 +72,10 @@ class QasmArgs(string.Formatter):
|
|
|
61
72
|
if isinstance(value, float):
|
|
62
73
|
value = round(value, self.precision)
|
|
63
74
|
if spec == 'half_turns':
|
|
64
|
-
value = f'pi*{value}' if value != 0 else '0'
|
|
75
|
+
value = f'pi*{self._format_number(value)}' if value != 0 else '0'
|
|
65
76
|
spec = ''
|
|
77
|
+
else:
|
|
78
|
+
value = self._format_number(value)
|
|
66
79
|
elif isinstance(value, ops.Qid):
|
|
67
80
|
value = self.qubit_id_map[value]
|
|
68
81
|
elif isinstance(value, str) and spec == 'meas':
|
|
@@ -138,7 +151,7 @@ def qasm(
|
|
|
138
151
|
involving qubits that the operation wouldn't otherwise know about.
|
|
139
152
|
qubits: A list of qubits that the value is being applied to. This is
|
|
140
153
|
needed for `cirq.Gate` values, which otherwise wouldn't know what
|
|
141
|
-
qubits to talk about.
|
|
154
|
+
qubits to talk about. It should generally not be specified otherwise.
|
|
142
155
|
default: A default result to use if the value doesn't have a
|
|
143
156
|
`_qasm_` method or that method returns `NotImplemented` or `None`.
|
|
144
157
|
If not specified, non-decomposable values cause a `TypeError`.
|
|
@@ -159,10 +172,16 @@ def qasm(
|
|
|
159
172
|
kwargs: Dict[str, Any] = {}
|
|
160
173
|
if args is not None:
|
|
161
174
|
kwargs['args'] = args
|
|
175
|
+
# pylint: disable=not-callable
|
|
162
176
|
if qubits is not None:
|
|
163
177
|
kwargs['qubits'] = tuple(qubits)
|
|
164
|
-
|
|
165
|
-
|
|
178
|
+
try:
|
|
179
|
+
result = method(**kwargs)
|
|
180
|
+
except TypeError as error:
|
|
181
|
+
raise TypeError(
|
|
182
|
+
"cirq.qasm does not expect qubits or args to be specified"
|
|
183
|
+
f"for the given value of type {type(val)}."
|
|
184
|
+
) from error
|
|
166
185
|
# pylint: enable=not-callable
|
|
167
186
|
if result is not None and result is not NotImplemented:
|
|
168
187
|
return result
|
cirq/protocols/qasm_test.py
CHANGED
|
@@ -52,3 +52,20 @@ def test_qasm():
|
|
|
52
52
|
|
|
53
53
|
assert cirq.qasm(ExpectsArgs(), args=cirq.QasmArgs()) == 'text'
|
|
54
54
|
assert cirq.qasm(ExpectsArgsQubits(), args=cirq.QasmArgs(), qubits=()) == 'text'
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def test_qasm_qubits_improperly_supplied():
|
|
58
|
+
with pytest.raises(TypeError, match="does not expect qubits or args to be specified"):
|
|
59
|
+
_ = cirq.qasm(cirq.Circuit(), qubits=[cirq.LineQubit(1)])
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def test_qasm_args_formatting():
|
|
63
|
+
args = cirq.QasmArgs()
|
|
64
|
+
assert args.format_field(0.01, '') == '0.01'
|
|
65
|
+
assert args.format_field(0.01, 'half_turns') == 'pi*0.01'
|
|
66
|
+
assert args.format_field(0.00001, '') == '1.0e-05'
|
|
67
|
+
assert args.format_field(0.00001, 'half_turns') == 'pi*1.0e-05'
|
|
68
|
+
assert args.format_field(1e-10, 'half_turns') == 'pi*1.0e-10'
|
|
69
|
+
args = cirq.QasmArgs(precision=6)
|
|
70
|
+
assert args.format_field(0.00001234, '') == '1.2e-05'
|
|
71
|
+
assert args.format_field(0.00001234, 'half_turns') == 'pi*1.2e-05'
|
|
@@ -12,13 +12,13 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from types import NotImplementedType
|
|
15
16
|
from typing import Any, Sequence, Tuple, TypeVar, Union
|
|
16
17
|
|
|
17
18
|
from typing_extensions import Protocol
|
|
18
19
|
|
|
19
20
|
from cirq import ops
|
|
20
|
-
from cirq._doc import
|
|
21
|
-
from cirq.type_workarounds import NotImplementedType
|
|
21
|
+
from cirq._doc import doc_private, document
|
|
22
22
|
|
|
23
23
|
# This is a special indicator value used by the methods to determine whether or
|
|
24
24
|
# not the caller provided a 'default' argument. It must be of type
|
|
@@ -14,10 +14,9 @@
|
|
|
14
14
|
|
|
15
15
|
import numbers
|
|
16
16
|
from typing import AbstractSet, Any, cast, TYPE_CHECKING, TypeVar
|
|
17
|
-
from typing_extensions import Self
|
|
18
17
|
|
|
19
18
|
import sympy
|
|
20
|
-
from typing_extensions import Protocol
|
|
19
|
+
from typing_extensions import Protocol, Self
|
|
21
20
|
|
|
22
21
|
from cirq import study
|
|
23
22
|
from cirq._doc import doc_private
|
|
@@ -68,7 +67,7 @@ def is_parameterized(val: Any) -> bool:
|
|
|
68
67
|
|
|
69
68
|
A value is parameterized when it has an `_is_parameterized_` method and
|
|
70
69
|
that method returns a truthy value, or if the value is an instance of
|
|
71
|
-
sympy.Basic.
|
|
70
|
+
sympy.Basic. Note this covers sympy constants such as `sympy.pi`.
|
|
72
71
|
|
|
73
72
|
Returns:
|
|
74
73
|
True if the gate has any unresolved Symbols
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from typing import Any,
|
|
15
|
+
from typing import Any, Optional, Sequence, TypeVar, Union
|
|
16
16
|
|
|
17
17
|
import numpy as np
|
|
18
18
|
from typing_extensions import Protocol
|
|
@@ -12,16 +12,16 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from
|
|
15
|
+
from types import NotImplementedType
|
|
16
|
+
from typing import Any, Optional, TypeVar, Union
|
|
16
17
|
|
|
17
18
|
import numpy as np
|
|
18
19
|
from typing_extensions import Protocol
|
|
19
20
|
|
|
20
21
|
from cirq._doc import doc_private
|
|
21
22
|
from cirq.protocols import qid_shape_protocol
|
|
22
|
-
from cirq.protocols.apply_unitary_protocol import
|
|
23
|
+
from cirq.protocols.apply_unitary_protocol import apply_unitaries, ApplyUnitaryArgs
|
|
23
24
|
from cirq.protocols.decompose_protocol import _try_decompose_into_operations_and_qubits
|
|
24
|
-
from cirq.type_workarounds import NotImplementedType
|
|
25
25
|
|
|
26
26
|
# This is a special indicator value used by the unitary method to determine
|
|
27
27
|
# whether or not the caller provided a 'default' argument. It must be of type
|
cirq/qis/__init__.py
CHANGED
|
@@ -15,48 +15,61 @@
|
|
|
15
15
|
"""Tools and methods for primitives used in quantum information science."""
|
|
16
16
|
|
|
17
17
|
from cirq.qis.channels import (
|
|
18
|
-
choi_to_kraus,
|
|
19
|
-
choi_to_superoperator,
|
|
20
|
-
kraus_to_choi,
|
|
21
|
-
kraus_to_superoperator,
|
|
22
|
-
operation_to_choi,
|
|
23
|
-
operation_to_superoperator,
|
|
24
|
-
superoperator_to_choi,
|
|
25
|
-
superoperator_to_kraus,
|
|
18
|
+
choi_to_kraus as choi_to_kraus,
|
|
19
|
+
choi_to_superoperator as choi_to_superoperator,
|
|
20
|
+
kraus_to_choi as kraus_to_choi,
|
|
21
|
+
kraus_to_superoperator as kraus_to_superoperator,
|
|
22
|
+
operation_to_choi as operation_to_choi,
|
|
23
|
+
operation_to_superoperator as operation_to_superoperator,
|
|
24
|
+
superoperator_to_choi as superoperator_to_choi,
|
|
25
|
+
superoperator_to_kraus as superoperator_to_kraus,
|
|
26
26
|
)
|
|
27
27
|
|
|
28
|
-
from cirq.qis.clifford_tableau import
|
|
28
|
+
from cirq.qis.clifford_tableau import (
|
|
29
|
+
CliffordTableau as CliffordTableau,
|
|
30
|
+
StabilizerState as StabilizerState,
|
|
31
|
+
)
|
|
29
32
|
|
|
30
|
-
from cirq.qis.measures import
|
|
33
|
+
from cirq.qis.measures import (
|
|
34
|
+
entanglement_fidelity as entanglement_fidelity,
|
|
35
|
+
fidelity as fidelity,
|
|
36
|
+
von_neumann_entropy as von_neumann_entropy,
|
|
37
|
+
)
|
|
31
38
|
|
|
32
|
-
from cirq.qis.quantum_state_representation import
|
|
39
|
+
from cirq.qis.quantum_state_representation import (
|
|
40
|
+
QuantumStateRepresentation as QuantumStateRepresentation,
|
|
41
|
+
)
|
|
33
42
|
|
|
34
43
|
from cirq.qis.states import (
|
|
35
|
-
bloch_vector_from_state_vector,
|
|
36
|
-
density_matrix,
|
|
37
|
-
density_matrix_from_state_vector,
|
|
38
|
-
dirac_notation,
|
|
39
|
-
eye_tensor,
|
|
40
|
-
infer_qid_shape,
|
|
41
|
-
one_hot,
|
|
42
|
-
QUANTUM_STATE_LIKE,
|
|
43
|
-
QuantumState,
|
|
44
|
-
quantum_state,
|
|
45
|
-
STATE_VECTOR_LIKE,
|
|
46
|
-
to_valid_density_matrix,
|
|
47
|
-
to_valid_state_vector,
|
|
48
|
-
validate_density_matrix,
|
|
49
|
-
validate_indices,
|
|
50
|
-
validate_qid_shape,
|
|
51
|
-
validate_normalized_state_vector,
|
|
44
|
+
bloch_vector_from_state_vector as bloch_vector_from_state_vector,
|
|
45
|
+
density_matrix as density_matrix,
|
|
46
|
+
density_matrix_from_state_vector as density_matrix_from_state_vector,
|
|
47
|
+
dirac_notation as dirac_notation,
|
|
48
|
+
eye_tensor as eye_tensor,
|
|
49
|
+
infer_qid_shape as infer_qid_shape,
|
|
50
|
+
one_hot as one_hot,
|
|
51
|
+
QUANTUM_STATE_LIKE as QUANTUM_STATE_LIKE,
|
|
52
|
+
QuantumState as QuantumState,
|
|
53
|
+
quantum_state as quantum_state,
|
|
54
|
+
STATE_VECTOR_LIKE as STATE_VECTOR_LIKE,
|
|
55
|
+
to_valid_density_matrix as to_valid_density_matrix,
|
|
56
|
+
to_valid_state_vector as to_valid_state_vector,
|
|
57
|
+
validate_density_matrix as validate_density_matrix,
|
|
58
|
+
validate_indices as validate_indices,
|
|
59
|
+
validate_qid_shape as validate_qid_shape,
|
|
60
|
+
validate_normalized_state_vector as validate_normalized_state_vector,
|
|
52
61
|
)
|
|
53
62
|
|
|
54
63
|
from cirq.qis.noise_utils import (
|
|
55
|
-
decay_constant_to_xeb_fidelity,
|
|
56
|
-
decay_constant_to_pauli_error,
|
|
57
|
-
pauli_error_to_decay_constant,
|
|
58
|
-
xeb_fidelity_to_decay_constant,
|
|
59
|
-
pauli_error_from_t1,
|
|
60
|
-
average_error,
|
|
61
|
-
decoherence_pauli_error,
|
|
64
|
+
decay_constant_to_xeb_fidelity as decay_constant_to_xeb_fidelity,
|
|
65
|
+
decay_constant_to_pauli_error as decay_constant_to_pauli_error,
|
|
66
|
+
pauli_error_to_decay_constant as pauli_error_to_decay_constant,
|
|
67
|
+
xeb_fidelity_to_decay_constant as xeb_fidelity_to_decay_constant,
|
|
68
|
+
pauli_error_from_t1 as pauli_error_from_t1,
|
|
69
|
+
average_error as average_error,
|
|
70
|
+
decoherence_pauli_error as decoherence_pauli_error,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
from cirq.qis.entropy import (
|
|
74
|
+
process_renyi_entropy_from_bitstrings as process_renyi_entropy_from_bitstrings,
|
|
62
75
|
)
|
cirq/qis/channels_test.py
CHANGED
|
@@ -51,15 +51,6 @@ def compute_choi(channel: cirq.SupportsKraus) -> np.ndarray:
|
|
|
51
51
|
return c
|
|
52
52
|
|
|
53
53
|
|
|
54
|
-
def compute_superoperator(channel: cirq.SupportsKraus) -> np.ndarray:
|
|
55
|
-
ks = cirq.kraus(channel)
|
|
56
|
-
d_out, d_in = ks[0].shape
|
|
57
|
-
m = np.zeros((d_out * d_out, d_in * d_in), dtype=np.complex128)
|
|
58
|
-
for k, e_in in enumerate(generate_standard_operator_basis(d_in, d_in)):
|
|
59
|
-
m[:, k] = np.reshape(apply_channel(channel, e_in), d_out * d_out)
|
|
60
|
-
return m
|
|
61
|
-
|
|
62
|
-
|
|
63
54
|
@pytest.mark.parametrize(
|
|
64
55
|
'kraus_operators, expected_choi',
|
|
65
56
|
(
|