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
cirq/value/classical_data.py
CHANGED
cirq/value/condition.py
CHANGED
|
@@ -14,8 +14,9 @@
|
|
|
14
14
|
|
|
15
15
|
import abc
|
|
16
16
|
import dataclasses
|
|
17
|
-
from typing import Mapping, Tuple, TYPE_CHECKING
|
|
17
|
+
from typing import Any, Dict, FrozenSet, Mapping, Optional, Tuple, TYPE_CHECKING
|
|
18
18
|
|
|
19
|
+
import attrs
|
|
19
20
|
import sympy
|
|
20
21
|
|
|
21
22
|
from cirq._compat import proper_repr
|
|
@@ -47,6 +48,9 @@ class Condition(abc.ABC):
|
|
|
47
48
|
def qasm(self):
|
|
48
49
|
"""Returns the qasm of this condition."""
|
|
49
50
|
|
|
51
|
+
def _qasm_(self, args: 'cirq.QasmArgs', **kwargs) -> Optional[str]:
|
|
52
|
+
return self.qasm
|
|
53
|
+
|
|
50
54
|
def _with_measurement_key_mapping_(self, key_map: Mapping[str, str]) -> 'cirq.Condition':
|
|
51
55
|
condition = self
|
|
52
56
|
for k in self.keys:
|
|
@@ -115,6 +119,128 @@ class KeyCondition(Condition):
|
|
|
115
119
|
def qasm(self):
|
|
116
120
|
raise ValueError('QASM is defined only for SympyConditions of type key == constant.')
|
|
117
121
|
|
|
122
|
+
def _qasm_(self, args: 'cirq.QasmArgs', **kwargs) -> Optional[str]:
|
|
123
|
+
args.validate_version('2.0', '3.0')
|
|
124
|
+
key_str = str(self.key)
|
|
125
|
+
if key_str not in args.meas_key_id_map:
|
|
126
|
+
raise ValueError(f'Key "{key_str}" not in QasmArgs.meas_key_id_map.')
|
|
127
|
+
key = args.meas_key_id_map[key_str]
|
|
128
|
+
# QASM 3.0 supports !=, so we return it directly.
|
|
129
|
+
if args.version == '3.0':
|
|
130
|
+
return f'{key}!=0'
|
|
131
|
+
# QASM 2.0 only has == operator, so we must limit to single-bit measurement keys == 1.
|
|
132
|
+
if key not in args.meas_key_bitcount:
|
|
133
|
+
raise ValueError(f'Key "{key}" not in QasmArgs.meas_key_bitcount.')
|
|
134
|
+
if args.meas_key_bitcount[str(key)] != 1:
|
|
135
|
+
raise ValueError('QASM is defined only for single-bit classical conditions.')
|
|
136
|
+
return f'{key}==1'
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
@attrs.frozen
|
|
140
|
+
class BitMaskKeyCondition(Condition):
|
|
141
|
+
"""A multiqubit classical control condition with a bitmask.
|
|
142
|
+
|
|
143
|
+
The control is based on a single measurement key and allows comparing equality or inequality
|
|
144
|
+
after taking the bitwise and with a bitmask.
|
|
145
|
+
|
|
146
|
+
Examples:
|
|
147
|
+
- BitMaskKeyCondition('a') -> a != 0
|
|
148
|
+
- BitMaskKeyCondition('a', bitmask=13) -> (a & 13) != 0
|
|
149
|
+
- BitMaskKeyCondition('a', bitmask=13, target_value=9) -> (a & 13) != 9
|
|
150
|
+
- BitMaskKeyCondition('a', bitmask=13, target_value=9, equal_target=True) -> (a & 13) == 9
|
|
151
|
+
- BitMaskKeyCondition.create_equal_mask('a', 13) -> (a & 13) == 13
|
|
152
|
+
- BitMaskKeyCondition.create_not_equal_mask('a', 13) -> (a & 13) != 13
|
|
153
|
+
|
|
154
|
+
The bits in the bitmask have the same order as the qubits passed to `cirq.measure(...)`. That's
|
|
155
|
+
the most significant bit corresponds to the the first (left most) qubit.
|
|
156
|
+
|
|
157
|
+
Attributes:
|
|
158
|
+
- key: Measurement key.
|
|
159
|
+
- index: integer index (same as KeyCondition.index).
|
|
160
|
+
- target_value: The value we compare with.
|
|
161
|
+
- equal_target: Whether to comapre with == or !=.
|
|
162
|
+
- bitmask: Optional bitmask to apply before doing the comparison.
|
|
163
|
+
"""
|
|
164
|
+
|
|
165
|
+
key: 'cirq.MeasurementKey' = attrs.field(
|
|
166
|
+
converter=lambda x: (
|
|
167
|
+
x
|
|
168
|
+
if isinstance(x, measurement_key.MeasurementKey)
|
|
169
|
+
else measurement_key.MeasurementKey(x)
|
|
170
|
+
)
|
|
171
|
+
)
|
|
172
|
+
index: int = -1
|
|
173
|
+
target_value: int = 0
|
|
174
|
+
equal_target: bool = False
|
|
175
|
+
bitmask: Optional[int] = None
|
|
176
|
+
|
|
177
|
+
@property
|
|
178
|
+
def keys(self):
|
|
179
|
+
return (self.key,)
|
|
180
|
+
|
|
181
|
+
@staticmethod
|
|
182
|
+
def create_equal_mask(
|
|
183
|
+
key: 'cirq.MeasurementKey', bitmask: int, *, index: int = -1
|
|
184
|
+
) -> 'BitMaskKeyCondition':
|
|
185
|
+
"""Creates a condition that evaluates (meas & bitmask) == bitmask."""
|
|
186
|
+
return BitMaskKeyCondition(
|
|
187
|
+
key, index, target_value=bitmask, equal_target=True, bitmask=bitmask
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
@staticmethod
|
|
191
|
+
def create_not_equal_mask(
|
|
192
|
+
key: 'cirq.MeasurementKey', bitmask: int, *, index: int = -1
|
|
193
|
+
) -> 'BitMaskKeyCondition':
|
|
194
|
+
"""Creates a condition that evaluates (meas & bitmask) != bitmask."""
|
|
195
|
+
return BitMaskKeyCondition(
|
|
196
|
+
key, index, target_value=bitmask, equal_target=False, bitmask=bitmask
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
def replace_key(self, current: 'cirq.MeasurementKey', replacement: 'cirq.MeasurementKey'):
|
|
200
|
+
return BitMaskKeyCondition(replacement) if self.key == current else self
|
|
201
|
+
|
|
202
|
+
def __str__(self):
|
|
203
|
+
s = str(self.key) if self.index == -1 else f'{self.key}[{self.index}]'
|
|
204
|
+
if self.bitmask is not None:
|
|
205
|
+
s = f'{s} & {self.bitmask}'
|
|
206
|
+
if self.equal_target:
|
|
207
|
+
if self.bitmask is not None:
|
|
208
|
+
s = f'({s})'
|
|
209
|
+
s = f'{s} == {self.target_value}'
|
|
210
|
+
elif self.target_value != 0:
|
|
211
|
+
if self.bitmask is not None:
|
|
212
|
+
s = f'({s})'
|
|
213
|
+
s = f'{s} != {self.target_value}'
|
|
214
|
+
return s
|
|
215
|
+
|
|
216
|
+
def __repr__(self):
|
|
217
|
+
values = attrs.asdict(self)
|
|
218
|
+
parameters = ', '.join(f'{f.name}={repr(values[f.name])}' for f in attrs.fields(type(self)))
|
|
219
|
+
return f'cirq.BitMaskKeyCondition({parameters})'
|
|
220
|
+
|
|
221
|
+
def resolve(self, classical_data: 'cirq.ClassicalDataStoreReader') -> bool:
|
|
222
|
+
if self.key not in classical_data.keys():
|
|
223
|
+
raise ValueError(f'Measurement key {self.key} missing when testing classical control')
|
|
224
|
+
value = classical_data.get_int(self.key, self.index)
|
|
225
|
+
if self.bitmask is not None:
|
|
226
|
+
value &= self.bitmask
|
|
227
|
+
if self.equal_target:
|
|
228
|
+
return value == self.target_value
|
|
229
|
+
return value != self.target_value
|
|
230
|
+
|
|
231
|
+
def _json_dict_(self):
|
|
232
|
+
return json_serialization.attrs_json_dict(self)
|
|
233
|
+
|
|
234
|
+
@classmethod
|
|
235
|
+
def _from_json_dict_(cls, key, **kwargs):
|
|
236
|
+
parameter_names = [f.name for f in attrs.fields(cls)[1:]]
|
|
237
|
+
parameters = {k: kwargs[k] for k in parameter_names if k in kwargs}
|
|
238
|
+
return cls(key=key, **parameters)
|
|
239
|
+
|
|
240
|
+
@property
|
|
241
|
+
def qasm(self):
|
|
242
|
+
raise NotImplementedError()
|
|
243
|
+
|
|
118
244
|
|
|
119
245
|
@dataclasses.dataclass(frozen=True)
|
|
120
246
|
class SympyCondition(Condition):
|
|
@@ -123,6 +249,12 @@ class SympyCondition(Condition):
|
|
|
123
249
|
This condition resolves to True iff the sympy expression resolves to a
|
|
124
250
|
truthy value (i.e. `bool(x) == True`) when the measurement keys are
|
|
125
251
|
substituted in as the free variables.
|
|
252
|
+
|
|
253
|
+
`sympy.IndexedBase` can be used for bitwise conditions. For example, the
|
|
254
|
+
following will create a condition that is controlled by the XOR of the
|
|
255
|
+
first two bits (big-endian) of measurement 'a'.
|
|
256
|
+
>>> a = sympy.IndexedBase('a')
|
|
257
|
+
>>> cond = cirq.SympyCondition(sympy.Xor(a[0], a[1]))
|
|
126
258
|
"""
|
|
127
259
|
|
|
128
260
|
expr: sympy.Basic
|
|
@@ -132,6 +264,9 @@ class SympyCondition(Condition):
|
|
|
132
264
|
return tuple(
|
|
133
265
|
measurement_key.MeasurementKey.parse_serialized(symbol.name)
|
|
134
266
|
for symbol in self.expr.free_symbols
|
|
267
|
+
if isinstance(symbol, sympy.Symbol)
|
|
268
|
+
# For bitwise ops, both Symbol ('a') and Indexed ('a[0]') are returned. We only want to
|
|
269
|
+
# keep the former here.
|
|
135
270
|
)
|
|
136
271
|
|
|
137
272
|
def replace_key(self, current: 'cirq.MeasurementKey', replacement: 'cirq.MeasurementKey'):
|
|
@@ -148,8 +283,19 @@ class SympyCondition(Condition):
|
|
|
148
283
|
if missing:
|
|
149
284
|
raise ValueError(f'Measurement keys {missing} missing when testing classical control')
|
|
150
285
|
|
|
151
|
-
replacements
|
|
152
|
-
|
|
286
|
+
replacements: Dict[str, Any] = {}
|
|
287
|
+
for symbol in self.expr.free_symbols:
|
|
288
|
+
if isinstance(symbol, sympy.Symbol):
|
|
289
|
+
name = symbol.name
|
|
290
|
+
key = measurement_key.MeasurementKey.parse_serialized(name)
|
|
291
|
+
replacements[str(key)] = classical_data.get_int(key)
|
|
292
|
+
for symbol in self.expr.free_symbols:
|
|
293
|
+
if isinstance(symbol, sympy.Indexed):
|
|
294
|
+
name = symbol.base.name
|
|
295
|
+
key = measurement_key.MeasurementKey.parse_serialized(name)
|
|
296
|
+
replacements[str(key)] = tuple(classical_data.get_digits(key))
|
|
297
|
+
value = self.expr.subs(replacements)
|
|
298
|
+
return bool(value)
|
|
153
299
|
|
|
154
300
|
def _json_dict_(self):
|
|
155
301
|
return json_serialization.dataclass_json_dict(self)
|
cirq/value/condition_test.py
CHANGED
|
@@ -71,6 +71,35 @@ def test_key_condition_qasm():
|
|
|
71
71
|
_ = cirq.KeyCondition(cirq.MeasurementKey('a')).qasm
|
|
72
72
|
|
|
73
73
|
|
|
74
|
+
def test_key_condition_qasm_protocol():
|
|
75
|
+
cond = cirq.KeyCondition(cirq.MeasurementKey('a'))
|
|
76
|
+
args = cirq.QasmArgs(meas_key_id_map={'a': 'm_a'}, meas_key_bitcount={'m_a': 1})
|
|
77
|
+
qasm = cirq.qasm(cond, args=args)
|
|
78
|
+
assert qasm == 'm_a==1'
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def test_key_condition_qasm_protocol_v3():
|
|
82
|
+
cond = cirq.KeyCondition(cirq.MeasurementKey('a'))
|
|
83
|
+
args = cirq.QasmArgs(meas_key_id_map={'a': 'm_a'}, version='3.0')
|
|
84
|
+
qasm = cirq.qasm(cond, args=args)
|
|
85
|
+
assert qasm == 'm_a!=0'
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def test_key_condition_qasm_protocol_invalid_args():
|
|
89
|
+
cond = cirq.KeyCondition(cirq.MeasurementKey('a'))
|
|
90
|
+
args = cirq.QasmArgs()
|
|
91
|
+
with pytest.raises(ValueError, match='Key "a" not in QasmArgs.meas_key_id_map.'):
|
|
92
|
+
_ = cirq.qasm(cond, args=args)
|
|
93
|
+
args = cirq.QasmArgs(meas_key_id_map={'a': 'm_a'})
|
|
94
|
+
with pytest.raises(ValueError, match='Key "m_a" not in QasmArgs.meas_key_bitcount.'):
|
|
95
|
+
_ = cirq.qasm(cond, args=args)
|
|
96
|
+
args = cirq.QasmArgs(meas_key_id_map={'a': 'm_a'}, meas_key_bitcount={'m_a': 2})
|
|
97
|
+
with pytest.raises(
|
|
98
|
+
ValueError, match='QASM is defined only for single-bit classical conditions.'
|
|
99
|
+
):
|
|
100
|
+
_ = cirq.qasm(cond, args=args)
|
|
101
|
+
|
|
102
|
+
|
|
74
103
|
def test_sympy_condition_with_keys():
|
|
75
104
|
c = init_sympy_condition.replace_key(key_a, key_b)
|
|
76
105
|
assert c.keys == (key_b,)
|
|
@@ -111,6 +140,52 @@ def test_sympy_condition_resolve():
|
|
|
111
140
|
_ = resolve({'0:b': [[1]]})
|
|
112
141
|
|
|
113
142
|
|
|
143
|
+
def test_sympy_indexed_condition():
|
|
144
|
+
a = sympy.IndexedBase('a')
|
|
145
|
+
cond = cirq.SympyCondition(sympy.Xor(a[0], a[1]))
|
|
146
|
+
assert cond.keys == (cirq.MeasurementKey('a'),)
|
|
147
|
+
assert str(cond) == 'a[0] ^ a[1]'
|
|
148
|
+
|
|
149
|
+
def resolve(records):
|
|
150
|
+
classical_data = cirq.ClassicalDataDictionaryStore(_records=records)
|
|
151
|
+
return cond.resolve(classical_data)
|
|
152
|
+
|
|
153
|
+
assert not resolve({'a': [(0, 0)]})
|
|
154
|
+
assert resolve({'a': [(1, 0)]})
|
|
155
|
+
assert resolve({'a': [(0, 1)]})
|
|
156
|
+
assert not resolve({'a': [(1, 1)]})
|
|
157
|
+
assert resolve({'a': [(0, 1, 0)]})
|
|
158
|
+
assert resolve({'a': [(0, 1, 1)]})
|
|
159
|
+
assert not resolve({'a': [(1, 1, 0)]})
|
|
160
|
+
assert not resolve({'a': [(1, 1, 1)]})
|
|
161
|
+
with pytest.raises(IndexError):
|
|
162
|
+
assert resolve({'a': [()]})
|
|
163
|
+
with pytest.raises(IndexError):
|
|
164
|
+
assert resolve({'a': [(0,)]})
|
|
165
|
+
with pytest.raises(IndexError):
|
|
166
|
+
assert resolve({'a': [(1,)]})
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def test_sympy_indexed_condition_qudits():
|
|
170
|
+
a = sympy.IndexedBase('a')
|
|
171
|
+
cond = cirq.SympyCondition(sympy.And(a[1] >= 2, a[2] <= 3))
|
|
172
|
+
assert cond.keys == (cirq.MeasurementKey('a'),)
|
|
173
|
+
assert str(cond) == '(a[1] >= 2) & (a[2] <= 3)'
|
|
174
|
+
|
|
175
|
+
def resolve(records):
|
|
176
|
+
classical_data = cirq.ClassicalDataDictionaryStore(_records=records)
|
|
177
|
+
return cond.resolve(classical_data)
|
|
178
|
+
|
|
179
|
+
assert not resolve({'a': [(0, 0, 0)]})
|
|
180
|
+
assert not resolve({'a': [(0, 1, 0)]})
|
|
181
|
+
assert resolve({'a': [(0, 2, 0)]})
|
|
182
|
+
assert resolve({'a': [(0, 3, 0)]})
|
|
183
|
+
assert not resolve({'a': [(0, 0, 4)]})
|
|
184
|
+
assert not resolve({'a': [(0, 1, 4)]})
|
|
185
|
+
assert not resolve({'a': [(0, 2, 4)]})
|
|
186
|
+
assert not resolve({'a': [(0, 3, 4)]})
|
|
187
|
+
|
|
188
|
+
|
|
114
189
|
def test_sympy_condition_qasm():
|
|
115
190
|
# Measurements get prepended with "m_", so the condition needs to be too.
|
|
116
191
|
assert cirq.SympyCondition(sympy.Eq(sympy.Symbol('a'), 2)).qasm == 'm_a==2'
|
|
@@ -118,3 +193,182 @@ def test_sympy_condition_qasm():
|
|
|
118
193
|
ValueError, match='QASM is defined only for SympyConditions of type key == constant'
|
|
119
194
|
):
|
|
120
195
|
_ = cirq.SympyCondition(sympy.Symbol('a') != 2).qasm
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
@pytest.mark.parametrize(
|
|
199
|
+
['cond', 'cond_str'],
|
|
200
|
+
[
|
|
201
|
+
(
|
|
202
|
+
cirq.BitMaskKeyCondition(
|
|
203
|
+
bitmask=None, equal_target=False, index=59, key='a', target_value=0
|
|
204
|
+
),
|
|
205
|
+
'a[59]',
|
|
206
|
+
),
|
|
207
|
+
(
|
|
208
|
+
cirq.BitMaskKeyCondition(
|
|
209
|
+
bitmask=None, equal_target=False, index=-1, key='a', target_value=0
|
|
210
|
+
),
|
|
211
|
+
'a',
|
|
212
|
+
),
|
|
213
|
+
(
|
|
214
|
+
cirq.BitMaskKeyCondition(
|
|
215
|
+
bitmask=None, equal_target=False, index=58, key='b', target_value=3
|
|
216
|
+
),
|
|
217
|
+
'b[58] != 3',
|
|
218
|
+
),
|
|
219
|
+
(
|
|
220
|
+
cirq.BitMaskKeyCondition(
|
|
221
|
+
bitmask=None, equal_target=False, index=-1, key='b', target_value=3
|
|
222
|
+
),
|
|
223
|
+
'b != 3',
|
|
224
|
+
),
|
|
225
|
+
(
|
|
226
|
+
cirq.BitMaskKeyCondition(
|
|
227
|
+
bitmask=13, equal_target=False, index=57, key='c', target_value=0
|
|
228
|
+
),
|
|
229
|
+
'c[57] & 13',
|
|
230
|
+
),
|
|
231
|
+
(
|
|
232
|
+
cirq.BitMaskKeyCondition(
|
|
233
|
+
bitmask=13, equal_target=False, index=-1, key='c', target_value=0
|
|
234
|
+
),
|
|
235
|
+
'c & 13',
|
|
236
|
+
),
|
|
237
|
+
(
|
|
238
|
+
cirq.BitMaskKeyCondition(
|
|
239
|
+
bitmask=13, equal_target=False, index=56, key='d', target_value=12
|
|
240
|
+
),
|
|
241
|
+
'(d[56] & 13) != 12',
|
|
242
|
+
),
|
|
243
|
+
(
|
|
244
|
+
cirq.BitMaskKeyCondition(
|
|
245
|
+
bitmask=13, equal_target=False, index=-1, key='d', target_value=12
|
|
246
|
+
),
|
|
247
|
+
'(d & 13) != 12',
|
|
248
|
+
),
|
|
249
|
+
(
|
|
250
|
+
cirq.BitMaskKeyCondition(
|
|
251
|
+
bitmask=13, equal_target=True, index=55, key='d', target_value=12
|
|
252
|
+
),
|
|
253
|
+
'(d[55] & 13) == 12',
|
|
254
|
+
),
|
|
255
|
+
(
|
|
256
|
+
cirq.BitMaskKeyCondition(
|
|
257
|
+
bitmask=13, equal_target=True, index=-1, key='d', target_value=12
|
|
258
|
+
),
|
|
259
|
+
'(d & 13) == 12',
|
|
260
|
+
),
|
|
261
|
+
(
|
|
262
|
+
cirq.BitMaskKeyCondition(
|
|
263
|
+
bitmask=11, equal_target=True, index=54, key='e', target_value=11
|
|
264
|
+
),
|
|
265
|
+
'(e[54] & 11) == 11',
|
|
266
|
+
),
|
|
267
|
+
(
|
|
268
|
+
cirq.BitMaskKeyCondition(
|
|
269
|
+
bitmask=11, equal_target=True, index=-1, key='e', target_value=11
|
|
270
|
+
),
|
|
271
|
+
'(e & 11) == 11',
|
|
272
|
+
),
|
|
273
|
+
(
|
|
274
|
+
cirq.BitMaskKeyCondition(
|
|
275
|
+
bitmask=9, equal_target=False, index=53, key='e', target_value=9
|
|
276
|
+
),
|
|
277
|
+
'(e[53] & 9) != 9',
|
|
278
|
+
),
|
|
279
|
+
(
|
|
280
|
+
cirq.BitMaskKeyCondition(
|
|
281
|
+
bitmask=9, equal_target=False, index=-1, key='e', target_value=9
|
|
282
|
+
),
|
|
283
|
+
'(e & 9) != 9',
|
|
284
|
+
),
|
|
285
|
+
],
|
|
286
|
+
)
|
|
287
|
+
def test_bitmask_condition_str(cond: cirq.BitMaskKeyCondition, cond_str: str):
|
|
288
|
+
assert str(cond) == cond_str
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
@pytest.mark.parametrize(
|
|
292
|
+
['cond', 'value'],
|
|
293
|
+
[
|
|
294
|
+
(cirq.BitMaskKeyCondition('c', bitmask=13, target_value=9), False),
|
|
295
|
+
(cirq.BitMaskKeyCondition('d', bitmask=13, target_value=12, equal_target=True), True),
|
|
296
|
+
],
|
|
297
|
+
)
|
|
298
|
+
def test_bitmask_condition_resolve(cond: cirq.BitMaskKeyCondition, value: bool):
|
|
299
|
+
resolver = cirq.ClassicalDataDictionaryStore(
|
|
300
|
+
_records={
|
|
301
|
+
cirq.MeasurementKey('c'): [(1, 0, 0, 1)],
|
|
302
|
+
cirq.MeasurementKey('d'): [(1, 0, 1, 1, 0, 0)],
|
|
303
|
+
}
|
|
304
|
+
)
|
|
305
|
+
assert cond.resolve(resolver) == value
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
def test_bitmask_condition_resolve_invalid_input_raises():
|
|
309
|
+
cond = cirq.BitMaskKeyCondition('a')
|
|
310
|
+
resolver = cirq.ClassicalDataDictionaryStore(
|
|
311
|
+
_records={
|
|
312
|
+
cirq.MeasurementKey('c'): [(1, 0, 0, 1)],
|
|
313
|
+
cirq.MeasurementKey('d'): [(1, 0, 1, 1, 0, 0)],
|
|
314
|
+
}
|
|
315
|
+
)
|
|
316
|
+
with pytest.raises(ValueError):
|
|
317
|
+
_ = cond.resolve(resolver)
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
@pytest.mark.parametrize(
|
|
321
|
+
'cond',
|
|
322
|
+
[
|
|
323
|
+
cirq.BitMaskKeyCondition(
|
|
324
|
+
bitmask=None, equal_target=False, index=59, key='a', target_value=0
|
|
325
|
+
),
|
|
326
|
+
cirq.BitMaskKeyCondition(
|
|
327
|
+
bitmask=None, equal_target=False, index=-1, key='a', target_value=0
|
|
328
|
+
),
|
|
329
|
+
cirq.BitMaskKeyCondition(
|
|
330
|
+
bitmask=None, equal_target=False, index=58, key='b', target_value=3
|
|
331
|
+
),
|
|
332
|
+
cirq.BitMaskKeyCondition(
|
|
333
|
+
bitmask=None, equal_target=False, index=-1, key='b', target_value=3
|
|
334
|
+
),
|
|
335
|
+
cirq.BitMaskKeyCondition(bitmask=13, equal_target=False, index=57, key='c', target_value=0),
|
|
336
|
+
cirq.BitMaskKeyCondition(bitmask=13, equal_target=False, index=-1, key='c', target_value=0),
|
|
337
|
+
cirq.BitMaskKeyCondition(
|
|
338
|
+
bitmask=13, equal_target=False, index=56, key='d', target_value=12
|
|
339
|
+
),
|
|
340
|
+
cirq.BitMaskKeyCondition(
|
|
341
|
+
bitmask=13, equal_target=False, index=-1, key='d', target_value=12
|
|
342
|
+
),
|
|
343
|
+
cirq.BitMaskKeyCondition(bitmask=13, equal_target=True, index=55, key='d', target_value=12),
|
|
344
|
+
cirq.BitMaskKeyCondition(bitmask=13, equal_target=True, index=-1, key='d', target_value=12),
|
|
345
|
+
cirq.BitMaskKeyCondition(bitmask=11, equal_target=True, index=54, key='e', target_value=11),
|
|
346
|
+
cirq.BitMaskKeyCondition(bitmask=11, equal_target=True, index=-1, key='e', target_value=11),
|
|
347
|
+
cirq.BitMaskKeyCondition(bitmask=9, equal_target=False, index=53, key='e', target_value=9),
|
|
348
|
+
cirq.BitMaskKeyCondition(bitmask=9, equal_target=False, index=-1, key='e', target_value=9),
|
|
349
|
+
],
|
|
350
|
+
)
|
|
351
|
+
def test_bitmask_condition_repr(cond):
|
|
352
|
+
cirq.testing.assert_equivalent_repr(cond)
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
def test_bitmask_condition_keys():
|
|
356
|
+
assert cirq.BitMaskKeyCondition('test').keys == ('test',)
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
def test_bitmask_create_equal_mask():
|
|
360
|
+
assert cirq.BitMaskKeyCondition.create_equal_mask('a', 9) == cirq.BitMaskKeyCondition(
|
|
361
|
+
'a', equal_target=True, bitmask=9, target_value=9
|
|
362
|
+
)
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
def test_bitmask_create_not_equal_mask():
|
|
366
|
+
assert cirq.BitMaskKeyCondition.create_not_equal_mask('b', 14) == cirq.BitMaskKeyCondition(
|
|
367
|
+
'b', equal_target=False, bitmask=14, target_value=14
|
|
368
|
+
)
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
def test_bitmask_replace_key():
|
|
372
|
+
cond = cirq.BitMaskKeyCondition('a')
|
|
373
|
+
assert cond.replace_key('a', 'b') == cirq.BitMaskKeyCondition('b')
|
|
374
|
+
assert cond.replace_key('c', 'd') is cond
|
cirq/value/digits.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
|
|
15
|
+
from typing import Any, Iterable, List, Optional, overload, Union
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
def big_endian_bits_to_int(bits: Iterable[Any]) -> int:
|
cirq/value/duration.py
CHANGED
|
@@ -13,14 +13,14 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
"""A typed time delta that supports picosecond accuracy."""
|
|
15
15
|
|
|
16
|
-
from typing import AbstractSet, Any, Dict, Optional, Tuple, TYPE_CHECKING, Union, List
|
|
17
16
|
import datetime
|
|
17
|
+
from typing import AbstractSet, Any, Dict, List, Optional, Tuple, TYPE_CHECKING, Union
|
|
18
18
|
|
|
19
|
-
import sympy
|
|
20
19
|
import numpy as np
|
|
20
|
+
import sympy
|
|
21
21
|
|
|
22
22
|
from cirq import protocols
|
|
23
|
-
from cirq._compat import
|
|
23
|
+
from cirq._compat import cached_method, proper_repr
|
|
24
24
|
from cirq._doc import document
|
|
25
25
|
|
|
26
26
|
if TYPE_CHECKING:
|
|
@@ -165,7 +165,7 @@ class Duration:
|
|
|
165
165
|
if other_duration is not None:
|
|
166
166
|
return self.total_picos() / other_duration.total_picos()
|
|
167
167
|
|
|
168
|
-
return NotImplemented
|
|
168
|
+
return NotImplemented # pragma: no cover
|
|
169
169
|
|
|
170
170
|
def __eq__(self, other):
|
|
171
171
|
other = _attempt_duration_like_to_duration(other)
|