cirq-core 1.4.1__py3-none-any.whl → 1.5.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of cirq-core might be problematic. Click here for more details.
- cirq/__init__.py +587 -569
- cirq/_compat.py +9 -0
- cirq/_compat_test.py +11 -9
- cirq/_import.py +7 -8
- cirq/_version.py +1 -1
- cirq/_version_test.py +1 -1
- cirq/circuits/__init__.py +15 -9
- cirq/circuits/_block_diagram_drawer.py +1 -2
- cirq/circuits/_block_diagram_drawer_test.py +3 -3
- cirq/circuits/_box_drawing_character_data.py +0 -1
- cirq/circuits/_box_drawing_character_data_test.py +2 -2
- cirq/circuits/_bucket_priority_queue.py +0 -1
- cirq/circuits/_bucket_priority_queue_test.py +1 -1
- cirq/circuits/circuit.py +336 -234
- cirq/circuits/circuit_operation.py +102 -52
- cirq/circuits/circuit_operation_test.py +85 -4
- cirq/circuits/circuit_test.py +101 -32
- cirq/circuits/frozen_circuit.py +36 -32
- cirq/circuits/insert_strategy.py +10 -0
- cirq/circuits/insert_strategy_test.py +20 -0
- cirq/circuits/moment.py +79 -80
- cirq/circuits/moment_test.py +105 -2
- cirq/circuits/optimization_pass.py +15 -15
- cirq/circuits/optimization_pass_test.py +8 -9
- cirq/circuits/qasm_output.py +64 -33
- cirq/circuits/qasm_output_test.py +63 -2
- cirq/circuits/text_diagram_drawer.py +26 -56
- cirq/circuits/text_diagram_drawer_test.py +5 -4
- cirq/contrib/__init__.py +2 -2
- cirq/contrib/acquaintance/__init__.py +44 -29
- cirq/contrib/acquaintance/bipartite.py +8 -7
- cirq/contrib/acquaintance/bipartite_test.py +11 -1
- cirq/contrib/acquaintance/devices.py +5 -4
- cirq/contrib/acquaintance/devices_test.py +5 -1
- cirq/contrib/acquaintance/executor.py +18 -21
- cirq/contrib/acquaintance/executor_test.py +3 -2
- cirq/contrib/acquaintance/gates.py +36 -27
- cirq/contrib/acquaintance/gates_test.py +1 -1
- cirq/contrib/acquaintance/inspection_utils.py +10 -9
- cirq/contrib/acquaintance/inspection_utils_test.py +6 -1
- cirq/contrib/acquaintance/mutation_utils.py +10 -10
- cirq/contrib/acquaintance/optimizers.py +7 -6
- cirq/contrib/acquaintance/optimizers_test.py +1 -1
- cirq/contrib/acquaintance/permutation.py +22 -21
- cirq/contrib/acquaintance/permutation_test.py +1 -1
- cirq/contrib/acquaintance/shift.py +8 -6
- cirq/contrib/acquaintance/shift_swap_network.py +6 -4
- cirq/contrib/acquaintance/strategies/__init__.py +9 -3
- cirq/contrib/acquaintance/strategies/complete.py +4 -3
- cirq/contrib/acquaintance/strategies/cubic.py +5 -3
- cirq/contrib/acquaintance/strategies/quartic_paired.py +8 -6
- cirq/contrib/acquaintance/topological_sort.py +4 -2
- cirq/contrib/bayesian_network/__init__.py +3 -1
- cirq/contrib/bayesian_network/bayesian_network_gate.py +5 -3
- cirq/contrib/circuitdag/__init__.py +1 -1
- cirq/contrib/circuitdag/circuit_dag.py +24 -24
- cirq/contrib/circuitdag/circuit_dag_test.py +1 -1
- cirq/contrib/custom_simulators/custom_state_simulator.py +10 -8
- cirq/contrib/custom_simulators/custom_state_simulator_test.py +15 -11
- cirq/contrib/graph_device/__init__.py +8 -8
- cirq/contrib/graph_device/graph_device.py +8 -8
- cirq/contrib/graph_device/graph_device_test.py +0 -1
- cirq/contrib/graph_device/hypergraph_test.py +1 -0
- cirq/contrib/json.py +1 -2
- cirq/contrib/json_test.py +2 -2
- cirq/contrib/noise_models/__init__.py +5 -6
- cirq/contrib/noise_models/noise_models.py +8 -6
- cirq/contrib/paulistring/__init__.py +22 -10
- cirq/contrib/paulistring/clifford_optimize.py +1 -1
- cirq/contrib/paulistring/clifford_optimize_test.py +0 -1
- cirq/contrib/paulistring/clifford_target_gateset.py +15 -12
- cirq/contrib/paulistring/optimize.py +2 -2
- cirq/contrib/paulistring/optimize_test.py +0 -1
- cirq/contrib/paulistring/pauli_string_dag_test.py +0 -1
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +379 -0
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +523 -0
- cirq/contrib/paulistring/pauli_string_optimize.py +3 -1
- cirq/contrib/paulistring/pauli_string_optimize_test.py +1 -3
- cirq/contrib/paulistring/recombine.py +2 -2
- cirq/contrib/paulistring/recombine_test.py +2 -2
- cirq/contrib/paulistring/separate.py +3 -4
- cirq/contrib/qasm_import/__init__.py +2 -2
- cirq/contrib/qasm_import/_lexer.py +21 -26
- cirq/contrib/qasm_import/_lexer_test.py +90 -6
- cirq/contrib/qasm_import/_parser.py +238 -47
- cirq/contrib/qasm_import/_parser_test.py +514 -59
- cirq/contrib/qasm_import/qasm_test.py +1 -1
- cirq/contrib/qcircuit/__init__.py +6 -4
- cirq/contrib/qcircuit/qcircuit_diagram.py +5 -2
- cirq/contrib/qcircuit/qcircuit_pdf.py +1 -2
- cirq/{experiments/grid_parallel_two_qubit_xeb_test.py → contrib/qcircuit/qcircuit_pdf_test.py} +13 -12
- cirq/contrib/qcircuit/qcircuit_test.py +1 -1
- cirq/contrib/quantum_volume/__init__.py +7 -7
- cirq/contrib/quantum_volume/quantum_volume.py +6 -11
- cirq/contrib/quantum_volume/quantum_volume_test.py +3 -1
- cirq/contrib/quimb/__init__.py +16 -13
- cirq/contrib/quimb/density_matrix.py +1 -1
- cirq/contrib/quimb/mps_simulator.py +27 -28
- cirq/contrib/quimb/mps_simulator_test.py +5 -0
- cirq/contrib/quimb/state_vector.py +3 -10
- cirq/contrib/quirk/__init__.py +1 -1
- cirq/contrib/quirk/export_to_quirk.py +3 -3
- cirq/contrib/routing/__init__.py +12 -9
- cirq/contrib/routing/device.py +1 -1
- cirq/contrib/routing/device_test.py +1 -2
- cirq/contrib/routing/greedy.py +7 -5
- cirq/contrib/routing/greedy_test.py +5 -3
- cirq/contrib/routing/initialization.py +3 -1
- cirq/contrib/routing/initialization_test.py +1 -1
- cirq/contrib/routing/swap_network.py +6 -6
- cirq/contrib/routing/utils.py +6 -4
- cirq/contrib/routing/utils_test.py +1 -2
- cirq/{type_workarounds.py → contrib/shuffle_circuits/__init__.py} +5 -10
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +250 -0
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +363 -0
- cirq/contrib/svg/__init__.py +1 -1
- cirq/contrib/svg/svg.py +12 -10
- cirq/contrib/svg/svg_test.py +3 -2
- cirq/devices/__init__.py +34 -25
- cirq/devices/device.py +16 -12
- cirq/devices/device_test.py +1 -0
- cirq/devices/grid_device_metadata.py +16 -12
- cirq/devices/grid_device_metadata_test.py +2 -1
- cirq/devices/grid_qubit.py +31 -26
- cirq/devices/grid_qubit_test.py +30 -1
- cirq/devices/insertion_noise_model.py +6 -6
- cirq/devices/insertion_noise_model_test.py +1 -1
- cirq/devices/line_qubit.py +28 -20
- cirq/devices/line_qubit_test.py +26 -0
- cirq/devices/named_topologies.py +12 -10
- cirq/devices/named_topologies_test.py +5 -4
- cirq/devices/noise_model.py +29 -33
- cirq/devices/noise_properties.py +2 -2
- cirq/devices/noise_properties_test.py +2 -2
- cirq/devices/noise_utils.py +3 -3
- cirq/devices/superconducting_qubits_noise_properties.py +2 -2
- cirq/devices/superconducting_qubits_noise_properties_test.py +3 -3
- cirq/devices/thermal_noise_model.py +2 -1
- cirq/devices/unconstrained_device.py +1 -1
- cirq/devices/unconstrained_device_test.py +6 -0
- cirq/experiments/__init__.py +51 -34
- cirq/experiments/qubit_characterizations.py +17 -15
- cirq/experiments/qubit_characterizations_test.py +4 -6
- cirq/experiments/random_quantum_circuit_generation.py +10 -9
- cirq/experiments/random_quantum_circuit_generation_test.py +21 -4
- cirq/experiments/readout_confusion_matrix.py +73 -8
- cirq/experiments/readout_confusion_matrix_test.py +104 -1
- cirq/experiments/single_qubit_readout_calibration.py +8 -6
- cirq/experiments/single_qubit_readout_calibration_test.py +1 -1
- cirq/experiments/t1_decay_experiment.py +4 -5
- cirq/experiments/t1_decay_experiment_test.py +1 -2
- cirq/experiments/t2_decay_experiment.py +0 -1
- cirq/experiments/t2_decay_experiment_test.py +1 -2
- cirq/experiments/two_qubit_xeb.py +157 -33
- cirq/experiments/two_qubit_xeb_test.py +38 -22
- cirq/experiments/xeb_fitting.py +99 -19
- cirq/experiments/xeb_fitting_test.py +64 -25
- cirq/experiments/xeb_sampling.py +14 -18
- cirq/experiments/xeb_simulation.py +4 -3
- cirq/experiments/xeb_simulation_test.py +20 -14
- cirq/experiments/z_phase_calibration.py +368 -0
- cirq/experiments/z_phase_calibration_test.py +241 -0
- cirq/interop/__init__.py +4 -1
- cirq/interop/quirk/__init__.py +7 -4
- cirq/interop/quirk/cells/__init__.py +17 -6
- cirq/interop/quirk/cells/arithmetic_cells.py +8 -8
- cirq/interop/quirk/cells/arithmetic_cells_test.py +1 -1
- cirq/interop/quirk/cells/cell.py +6 -6
- cirq/interop/quirk/cells/composite_cell.py +5 -5
- cirq/interop/quirk/cells/composite_cell_test.py +1 -1
- cirq/interop/quirk/cells/control_cells.py +1 -1
- cirq/interop/quirk/cells/frequency_space_cells.py +2 -2
- cirq/interop/quirk/cells/ignored_cells.py +1 -1
- cirq/interop/quirk/cells/input_cells.py +1 -1
- cirq/interop/quirk/cells/input_cells_test.py +1 -1
- cirq/interop/quirk/cells/input_rotation_cells.py +1 -1
- cirq/interop/quirk/cells/input_rotation_cells_test.py +1 -1
- cirq/interop/quirk/cells/measurement_cells.py +1 -1
- cirq/interop/quirk/cells/parse.py +8 -7
- cirq/interop/quirk/cells/parse_test.py +2 -2
- cirq/interop/quirk/cells/single_qubit_rotation_cells.py +1 -1
- cirq/interop/quirk/cells/swap_cell_test.py +1 -1
- cirq/interop/quirk/cells/unsupported_cells.py +1 -1
- cirq/interop/quirk/url_to_circuit.py +7 -7
- cirq/interop/quirk/url_to_circuit_test.py +1 -1
- cirq/ion/__init__.py +4 -2
- cirq/json_resolver_cache.py +15 -7
- cirq/linalg/__init__.py +62 -51
- cirq/linalg/combinators.py +4 -4
- cirq/linalg/combinators_test.py +4 -1
- cirq/linalg/decompositions.py +15 -40
- cirq/linalg/decompositions_test.py +16 -22
- cirq/linalg/diagonalize.py +1 -1
- cirq/linalg/diagonalize_test.py +1 -1
- cirq/linalg/operator_spaces.py +20 -4
- cirq/linalg/operator_spaces_test.py +15 -2
- cirq/linalg/predicates.py +3 -3
- cirq/linalg/predicates_test.py +1 -0
- cirq/linalg/tolerance.py +2 -2
- cirq/linalg/transformations.py +30 -12
- cirq/linalg/transformations_test.py +13 -0
- cirq/neutral_atoms/__init__.py +2 -2
- cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +0 -1
- cirq/ops/__init__.py +172 -132
- cirq/ops/arithmetic_operation.py +2 -2
- cirq/ops/arithmetic_operation_test.py +2 -2
- cirq/ops/boolean_hamiltonian.py +3 -2
- cirq/ops/classically_controlled_operation.py +39 -12
- cirq/ops/classically_controlled_operation_test.py +147 -1
- cirq/ops/clifford_gate.py +38 -36
- cirq/ops/clifford_gate_test.py +75 -1
- cirq/ops/common_channels.py +16 -45
- cirq/ops/common_channels_test.py +10 -0
- cirq/ops/common_gate_families.py +1 -1
- cirq/ops/common_gate_families_test.py +1 -0
- cirq/ops/common_gates.py +48 -49
- cirq/ops/common_gates_test.py +18 -2
- cirq/ops/control_values.py +3 -3
- cirq/ops/control_values_test.py +2 -1
- cirq/ops/controlled_gate.py +36 -23
- cirq/ops/controlled_gate_test.py +70 -3
- cirq/ops/controlled_operation.py +6 -5
- cirq/ops/controlled_operation_test.py +7 -3
- cirq/ops/dense_pauli_string.py +11 -11
- cirq/ops/diagonal_gate.py +2 -2
- cirq/ops/diagonal_gate_test.py +1 -0
- cirq/ops/eigen_gate.py +16 -36
- cirq/ops/eigen_gate_test.py +60 -10
- cirq/ops/fourier_transform.py +1 -3
- cirq/ops/fourier_transform_test.py +2 -1
- cirq/ops/fsim_gate.py +42 -3
- cirq/ops/fsim_gate_test.py +21 -0
- cirq/ops/gate_operation.py +8 -8
- cirq/ops/gate_operation_test.py +4 -2
- cirq/ops/gateset_test.py +11 -2
- cirq/ops/global_phase_op.py +8 -7
- cirq/ops/global_phase_op_test.py +1 -1
- cirq/ops/greedy_qubit_manager_test.py +5 -0
- cirq/ops/identity.py +14 -4
- cirq/ops/identity_test.py +24 -0
- cirq/ops/kraus_channel.py +1 -0
- cirq/ops/kraus_channel_test.py +3 -1
- cirq/ops/linear_combinations.py +27 -21
- cirq/ops/linear_combinations_test.py +23 -4
- cirq/ops/matrix_gates.py +24 -8
- cirq/ops/measure_util.py +2 -2
- cirq/ops/measurement_gate.py +7 -4
- cirq/ops/measurement_gate_test.py +2 -1
- cirq/ops/mixed_unitary_channel.py +1 -0
- cirq/ops/mixed_unitary_channel_test.py +3 -1
- cirq/ops/named_qubit.py +8 -1
- cirq/ops/op_tree.py +3 -30
- cirq/ops/op_tree_test.py +4 -0
- cirq/ops/parallel_gate.py +2 -3
- cirq/ops/parallel_gate_test.py +2 -1
- cirq/ops/parity_gates.py +7 -8
- cirq/ops/parity_gates_test.py +1 -0
- cirq/ops/pauli_gates.py +5 -11
- cirq/ops/pauli_gates_test.py +1 -0
- cirq/ops/pauli_interaction_gate.py +11 -5
- cirq/ops/pauli_interaction_gate_test.py +2 -3
- cirq/ops/pauli_measurement_gate.py +6 -5
- cirq/ops/pauli_measurement_gate_test.py +1 -0
- cirq/ops/pauli_string.py +115 -130
- cirq/ops/pauli_string_phasor.py +21 -20
- cirq/ops/pauli_string_phasor_test.py +13 -3
- cirq/ops/pauli_string_raw_types.py +1 -0
- cirq/ops/pauli_string_test.py +192 -55
- cirq/ops/pauli_sum_exponential.py +3 -4
- cirq/ops/pauli_sum_exponential_test.py +0 -1
- cirq/ops/permutation_gate.py +2 -2
- cirq/ops/permutation_gate_test.py +1 -1
- cirq/ops/phased_iswap_gate.py +6 -7
- cirq/ops/phased_iswap_gate_test.py +21 -5
- cirq/ops/phased_x_gate.py +11 -25
- cirq/ops/phased_x_gate_test.py +19 -3
- cirq/ops/phased_x_z_gate.py +12 -11
- cirq/ops/projector.py +4 -5
- cirq/ops/qubit_manager.py +2 -1
- cirq/ops/qubit_manager_test.py +2 -1
- cirq/ops/qubit_order.py +1 -1
- cirq/ops/random_gate_channel.py +1 -1
- cirq/ops/random_gate_channel_test.py +0 -6
- cirq/ops/raw_types.py +146 -50
- cirq/ops/raw_types_test.py +37 -3
- cirq/ops/state_preparation_channel.py +2 -2
- cirq/ops/state_preparation_channel_test.py +2 -1
- cirq/ops/swap_gates.py +9 -4
- cirq/ops/three_qubit_gates.py +8 -8
- cirq/ops/three_qubit_gates_test.py +1 -0
- cirq/ops/two_qubit_diagonal_gate.py +4 -3
- cirq/ops/uniform_superposition_gate.py +4 -4
- cirq/ops/uniform_superposition_gate_test.py +1 -0
- cirq/ops/wait_gate.py +6 -8
- cirq/protocols/__init__.py +135 -83
- cirq/protocols/act_on_protocol.py +1 -1
- cirq/protocols/act_on_protocol_test.py +1 -1
- cirq/protocols/apply_channel_protocol.py +3 -3
- cirq/protocols/apply_mixture_protocol.py +15 -9
- cirq/protocols/apply_mixture_protocol_test.py +11 -0
- cirq/protocols/apply_unitary_protocol.py +2 -2
- cirq/protocols/apply_unitary_protocol_test.py +2 -1
- cirq/protocols/approximate_equality_protocol.py +7 -8
- cirq/protocols/approximate_equality_protocol_test.py +3 -1
- cirq/protocols/circuit_diagram_info_protocol.py +8 -6
- cirq/protocols/circuit_diagram_info_protocol_test.py +5 -0
- cirq/protocols/commutes_protocol.py +6 -6
- cirq/protocols/control_key_protocol.py +1 -1
- cirq/protocols/decompose_protocol.py +4 -5
- cirq/protocols/decompose_protocol_test.py +2 -1
- cirq/protocols/equal_up_to_global_phase_protocol.py +3 -3
- cirq/protocols/equal_up_to_global_phase_protocol_test.py +7 -0
- cirq/protocols/has_stabilizer_effect_protocol.py +5 -5
- cirq/protocols/has_unitary_protocol.py +1 -1
- cirq/protocols/has_unitary_protocol_test.py +8 -7
- cirq/protocols/hash_from_pickle_test.py +120 -0
- cirq/protocols/inverse_protocol.py +1 -1
- cirq/protocols/json_serialization.py +14 -1
- cirq/protocols/json_serialization_test.py +28 -7
- cirq/protocols/json_test_data/BitMaskKeyCondition.json +86 -0
- cirq/protocols/json_test_data/BitMaskKeyCondition.repr +7 -0
- cirq/protocols/json_test_data/Concat.json +19 -0
- cirq/protocols/json_test_data/Concat.repr +1 -0
- cirq/protocols/json_test_data/README.md +4 -2
- cirq/protocols/json_test_data/SympyCondition.json +60 -15
- cirq/protocols/json_test_data/SympyCondition.repr +4 -1
- cirq/protocols/json_test_data/_InverseCompositeGate.json +10 -0
- cirq/protocols/json_test_data/_InverseCompositeGate.repr +1 -0
- cirq/protocols/json_test_data/__init__.py +1 -1
- cirq/protocols/json_test_data/sympy.And.json +13 -0
- cirq/protocols/json_test_data/sympy.And.repr +1 -0
- cirq/protocols/json_test_data/sympy.Indexed.json +18 -0
- cirq/protocols/json_test_data/sympy.Indexed.repr +1 -0
- cirq/protocols/json_test_data/sympy.IndexedBase.json +9 -0
- cirq/protocols/json_test_data/sympy.IndexedBase.repr +1 -0
- cirq/protocols/json_test_data/sympy.Not.json +9 -0
- cirq/protocols/json_test_data/sympy.Not.repr +1 -0
- cirq/protocols/json_test_data/sympy.Or.json +13 -0
- cirq/protocols/json_test_data/sympy.Or.repr +1 -0
- cirq/protocols/json_test_data/sympy.Xor.json +13 -0
- cirq/protocols/json_test_data/sympy.Xor.repr +1 -0
- cirq/protocols/kraus_protocol.py +8 -8
- cirq/protocols/kraus_protocol_test.py +0 -1
- cirq/protocols/measurement_key_protocol.py +1 -1
- cirq/protocols/measurement_key_protocol_test.py +7 -7
- cirq/protocols/mixture_protocol.py +6 -4
- cirq/protocols/mixture_protocol_test.py +21 -13
- cirq/protocols/pauli_expansion_protocol.py +1 -0
- cirq/protocols/pow_protocol.py +1 -1
- cirq/protocols/qasm.py +25 -6
- cirq/protocols/qasm_test.py +17 -0
- cirq/protocols/qid_shape_protocol.py +2 -2
- cirq/protocols/resolve_parameters.py +2 -3
- cirq/protocols/resolve_parameters_test.py +2 -1
- cirq/protocols/trace_distance_bound.py +1 -1
- cirq/protocols/trace_distance_bound_test.py +1 -0
- cirq/protocols/unitary_protocol.py +3 -3
- cirq/protocols/unitary_protocol_test.py +1 -1
- cirq/qis/__init__.py +48 -35
- cirq/qis/channels_test.py +0 -9
- cirq/qis/clifford_tableau.py +46 -26
- cirq/qis/clifford_tableau_test.py +2 -1
- cirq/qis/entropy.py +115 -0
- cirq/qis/entropy_test.py +43 -0
- cirq/qis/measures.py +5 -4
- cirq/qis/measures_test.py +7 -0
- cirq/qis/noise_utils_test.py +4 -4
- cirq/qis/quantum_state_representation.py +1 -1
- cirq/qis/states.py +7 -7
- cirq/sim/__init__.py +55 -37
- cirq/sim/classical_simulator.py +7 -6
- cirq/sim/classical_simulator_test.py +3 -1
- cirq/sim/clifford/__init__.py +17 -9
- cirq/sim/clifford/clifford_simulator.py +5 -4
- cirq/sim/clifford/clifford_simulator_test.py +32 -9
- cirq/sim/clifford/clifford_tableau_simulation_state.py +1 -1
- cirq/sim/clifford/stabilizer_simulation_state.py +1 -1
- cirq/sim/clifford/stabilizer_state_ch_form.py +4 -3
- cirq/sim/density_matrix_simulator.py +3 -2
- cirq/sim/density_matrix_simulator_test.py +12 -4
- cirq/sim/density_matrix_utils.py +1 -1
- cirq/sim/mux.py +2 -2
- cirq/sim/simulation_state.py +4 -5
- cirq/sim/simulation_state_base.py +2 -2
- cirq/sim/simulation_state_test.py +1 -1
- cirq/sim/simulation_utils.py +3 -1
- cirq/sim/simulation_utils_test.py +2 -3
- cirq/sim/simulator.py +7 -6
- cirq/sim/simulator_base.py +5 -5
- cirq/sim/simulator_test.py +14 -3
- cirq/sim/sparse_simulator.py +4 -3
- cirq/sim/sparse_simulator_test.py +17 -9
- cirq/sim/state_vector.py +2 -2
- cirq/sim/state_vector_simulation_state_test.py +1 -1
- cirq/sim/state_vector_simulator.py +4 -4
- cirq/sim/state_vector_test.py +27 -32
- cirq/study/__init__.py +27 -21
- cirq/study/flatten_expressions.py +5 -6
- cirq/study/flatten_expressions_test.py +1 -1
- cirq/study/resolver.py +14 -11
- cirq/study/resolver_test.py +10 -1
- cirq/study/result.py +3 -3
- cirq/study/sweepable.py +15 -9
- cirq/study/sweepable_test.py +27 -0
- cirq/study/sweeps.py +65 -10
- cirq/study/sweeps_test.py +123 -0
- cirq/testing/__init__.py +86 -57
- cirq/testing/_compat_test_data/module_a/__init__.py +2 -2
- cirq/testing/_compat_test_data/module_a/sub/subsub/__init__.py +1 -1
- cirq/testing/circuit_compare.py +3 -4
- cirq/testing/circuit_compare_test.py +7 -8
- cirq/testing/consistent_act_on.py +3 -3
- cirq/testing/consistent_channels_test.py +2 -1
- cirq/testing/consistent_controlled_gate_op.py +3 -2
- cirq/testing/consistent_controlled_gate_op_test.py +2 -3
- cirq/testing/consistent_decomposition.py +1 -1
- cirq/testing/consistent_decomposition_test.py +1 -2
- cirq/testing/consistent_pauli_expansion_test.py +1 -1
- cirq/testing/consistent_phase_by.py +1 -1
- cirq/testing/consistent_phase_by_test.py +1 -2
- cirq/testing/consistent_protocols.py +11 -11
- cirq/testing/consistent_protocols_test.py +4 -5
- cirq/testing/consistent_qasm.py +8 -12
- cirq/testing/consistent_qasm_test.py +1 -1
- cirq/testing/consistent_resolve_parameters.py +2 -1
- cirq/testing/consistent_specified_has_unitary_test.py +1 -1
- cirq/testing/consistent_unitary.py +3 -1
- cirq/testing/consistent_unitary_test.py +3 -3
- cirq/testing/devices.py +1 -1
- cirq/testing/devices_test.py +1 -0
- cirq/testing/equals_tester.py +2 -4
- cirq/testing/equals_tester_test.py +6 -5
- cirq/testing/equivalent_basis_map.py +1 -0
- cirq/testing/equivalent_basis_map_test.py +0 -1
- cirq/testing/gate_features_test.py +5 -0
- cirq/testing/json.py +4 -4
- cirq/testing/lin_alg_utils_test.py +1 -1
- cirq/testing/order_tester.py +1 -1
- cirq/testing/order_tester_test.py +1 -1
- cirq/testing/pytest_utils.py +57 -0
- cirq/testing/pytest_utils_test.py +35 -0
- cirq/testing/random_circuit.py +2 -2
- cirq/testing/random_circuit_test.py +2 -2
- cirq/testing/routing_devices_test.py +2 -1
- cirq/testing/sample_circuits.py +1 -1
- cirq/testing/sample_gates.py +5 -4
- cirq/testing/sample_gates_test.py +2 -2
- cirq/transformers/__init__.py +101 -82
- cirq/transformers/align.py +12 -1
- cirq/transformers/align_test.py +13 -0
- cirq/transformers/analytical_decompositions/__init__.py +27 -24
- cirq/transformers/analytical_decompositions/clifford_decomposition.py +2 -1
- cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +1 -1
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +1 -1
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/cphase_to_fsim.py +1 -1
- cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +1 -1
- cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +2 -2
- cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +4 -4
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +99 -24
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +105 -14
- cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +1 -1
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +1 -1
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +1 -0
- cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +3 -4
- cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +1 -1
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +2 -1
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +5 -6
- cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +2 -2
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +1 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +1 -2
- cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +2 -2
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +2 -2
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -1
- cirq/transformers/drop_empty_moments.py +1 -0
- cirq/transformers/drop_negligible_operations.py +1 -0
- cirq/transformers/dynamical_decoupling.py +255 -43
- cirq/transformers/dynamical_decoupling_test.py +730 -17
- cirq/transformers/eject_phased_paulis.py +29 -15
- cirq/transformers/eject_phased_paulis_test.py +3 -8
- cirq/transformers/eject_z.py +3 -2
- cirq/transformers/eject_z_test.py +3 -3
- cirq/transformers/gauge_compiling/__init__.py +25 -9
- cirq/transformers/gauge_compiling/cphase_gauge.py +146 -0
- cirq/transformers/gauge_compiling/cphase_gauge_test.py +42 -0
- cirq/transformers/gauge_compiling/cz_gauge.py +4 -4
- cirq/transformers/gauge_compiling/gauge_compiling.py +245 -6
- cirq/transformers/gauge_compiling/gauge_compiling_test.py +107 -2
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +39 -2
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +10 -1
- cirq/transformers/gauge_compiling/iswap_gauge.py +2 -2
- cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -2
- cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +23 -5
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +3 -2
- cirq/transformers/heuristic_decompositions/__init__.py +3 -3
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +2 -1
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +1 -1
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +4 -4
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +4 -4
- cirq/transformers/insertion_sort.py +64 -0
- cirq/transformers/insertion_sort_test.py +34 -0
- cirq/transformers/measurement_transformers.py +14 -1
- cirq/transformers/measurement_transformers_test.py +35 -0
- cirq/transformers/merge_k_qubit_gates.py +2 -2
- cirq/transformers/merge_single_qubit_gates.py +1 -1
- cirq/transformers/merge_single_qubit_gates_test.py +1 -1
- cirq/transformers/noise_adding.py +115 -0
- cirq/transformers/noise_adding_test.py +54 -0
- cirq/transformers/optimize_for_target_gateset.py +1 -1
- cirq/transformers/optimize_for_target_gateset_test.py +3 -2
- cirq/transformers/qubit_management_transformers.py +1 -1
- cirq/transformers/randomized_measurements.py +171 -0
- cirq/transformers/randomized_measurements_test.py +68 -0
- cirq/transformers/routing/__init__.py +14 -5
- cirq/transformers/routing/initial_mapper.py +1 -1
- cirq/transformers/routing/initial_mapper_test.py +1 -0
- cirq/transformers/routing/line_initial_mapper.py +3 -2
- cirq/transformers/routing/mapping_manager.py +2 -2
- cirq/transformers/routing/mapping_manager_test.py +2 -2
- cirq/transformers/routing/route_circuit_cqc.py +3 -2
- cirq/transformers/routing/route_circuit_cqc_test.py +2 -1
- cirq/transformers/routing/visualize_routed_circuit.py +1 -0
- cirq/transformers/routing/visualize_routed_circuit_test.py +1 -0
- cirq/transformers/stratify.py +2 -2
- cirq/transformers/synchronize_terminal_measurements.py +2 -1
- cirq/transformers/target_gatesets/__init__.py +7 -5
- cirq/transformers/target_gatesets/compilation_target_gateset.py +16 -3
- cirq/transformers/target_gatesets/compilation_target_gateset_test.py +2 -0
- cirq/transformers/target_gatesets/cz_gateset.py +5 -1
- cirq/transformers/target_gatesets/cz_gateset_test.py +23 -2
- cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +1 -1
- cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +3 -2
- cirq/transformers/transformer_api.py +5 -4
- cirq/transformers/transformer_api_test.py +11 -3
- cirq/transformers/transformer_primitives.py +9 -31
- cirq/transformers/transformer_primitives_test.py +6 -5
- cirq/value/__init__.py +51 -30
- cirq/value/abc_alt.py +1 -2
- cirq/value/angle.py +2 -0
- cirq/value/classical_data.py +1 -0
- cirq/value/condition.py +149 -3
- cirq/value/condition_test.py +254 -0
- cirq/value/digits.py +1 -1
- cirq/value/duration.py +4 -4
- cirq/value/duration_test.py +2 -1
- cirq/value/linear_dict.py +85 -24
- cirq/value/linear_dict_test.py +94 -3
- cirq/value/measurement_key.py +9 -2
- cirq/value/periodic_value.py +2 -3
- cirq/value/periodic_value_test.py +5 -0
- cirq/value/probability.py +1 -0
- cirq/value/random_state.py +1 -1
- cirq/value/timestamp.py +2 -4
- cirq/value/timestamp_test.py +2 -1
- cirq/value/type_alias.py +2 -2
- cirq/value/value_equality_attr.py +14 -2
- cirq/value/value_equality_attr_test.py +1 -1
- cirq/vis/__init__.py +9 -6
- cirq/vis/density_matrix.py +1 -1
- cirq/vis/density_matrix_test.py +2 -5
- cirq/vis/heatmap.py +49 -12
- cirq/vis/heatmap_test.py +168 -4
- cirq/vis/histogram.py +1 -1
- cirq/vis/histogram_test.py +1 -2
- cirq/vis/state_histogram.py +7 -5
- cirq/vis/state_histogram_test.py +2 -2
- cirq/work/__init__.py +19 -13
- cirq/work/collector.py +2 -2
- cirq/work/observable_grouping.py +2 -2
- cirq/work/observable_measurement.py +3 -3
- cirq/work/observable_measurement_data.py +5 -2
- cirq/work/observable_measurement_test.py +8 -8
- cirq/work/observable_readout_calibration.py +2 -2
- cirq/work/observable_readout_calibration_test.py +2 -1
- cirq/work/observable_settings.py +8 -7
- cirq/work/observable_settings_test.py +3 -2
- cirq/work/pauli_sum_collector.py +1 -1
- cirq/work/sampler.py +8 -20
- cirq/work/sampler_test.py +4 -3
- cirq/work/zeros_sampler.py +1 -1
- cirq_core-1.5.0.dist-info/METADATA +125 -0
- {cirq_core-1.4.1.dist-info → cirq_core-1.5.0.dist-info}/RECORD +586 -552
- {cirq_core-1.4.1.dist-info → cirq_core-1.5.0.dist-info}/WHEEL +1 -1
- cirq/experiments/grid_parallel_two_qubit_xeb.py +0 -62
- cirq/protocols/json_test_data/GridParallelXEBMetadata.json +0 -119
- cirq/protocols/json_test_data/GridParallelXEBMetadata.repr +0 -1
- cirq_core-1.4.1.dist-info/METADATA +0 -45
- {cirq_core-1.4.1.dist-info → cirq_core-1.5.0.dist-info}/LICENSE +0 -0
- {cirq_core-1.4.1.dist-info → cirq_core-1.5.0.dist-info}/top_level.txt +0 -0
cirq/ops/identity.py
CHANGED
|
@@ -13,7 +13,9 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
"""IdentityGate."""
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
import numbers
|
|
17
|
+
from types import NotImplementedType
|
|
18
|
+
from typing import Any, Dict, Optional, Sequence, Tuple, TYPE_CHECKING, Union
|
|
17
19
|
|
|
18
20
|
import numpy as np
|
|
19
21
|
import sympy
|
|
@@ -71,10 +73,16 @@ class IdentityGate(raw_types.Gate):
|
|
|
71
73
|
return len(self._qid_shape)
|
|
72
74
|
|
|
73
75
|
def __pow__(self, power: Any) -> Any:
|
|
74
|
-
if isinstance(power, (
|
|
76
|
+
if isinstance(power, (numbers.Complex, sympy.Basic)):
|
|
75
77
|
return self
|
|
76
78
|
return NotImplemented
|
|
77
79
|
|
|
80
|
+
def _commutes_(self, other: Any, *, atol: float = 1e-8) -> Union[bool, NotImplementedType]:
|
|
81
|
+
"""The identity gate commutes with all other gates."""
|
|
82
|
+
if not isinstance(other, raw_types.Gate):
|
|
83
|
+
return NotImplemented
|
|
84
|
+
return True
|
|
85
|
+
|
|
78
86
|
def _has_unitary_(self) -> bool:
|
|
79
87
|
return True
|
|
80
88
|
|
|
@@ -119,7 +127,7 @@ class IdentityGate(raw_types.Gate):
|
|
|
119
127
|
def _mul_with_qubits(self, qubits: Tuple['cirq.Qid', ...], other):
|
|
120
128
|
if isinstance(other, raw_types.Operation):
|
|
121
129
|
return other
|
|
122
|
-
if isinstance(other,
|
|
130
|
+
if isinstance(other, numbers.Complex):
|
|
123
131
|
from cirq.ops.pauli_string import PauliString
|
|
124
132
|
|
|
125
133
|
return PauliString(coefficient=other)
|
|
@@ -128,10 +136,12 @@ class IdentityGate(raw_types.Gate):
|
|
|
128
136
|
_rmul_with_qubits = _mul_with_qubits
|
|
129
137
|
|
|
130
138
|
def _circuit_diagram_info_(self, args) -> Tuple[str, ...]:
|
|
139
|
+
if self.num_qubits() <= 0:
|
|
140
|
+
return NotImplemented
|
|
131
141
|
return ('I',) * self.num_qubits()
|
|
132
142
|
|
|
133
143
|
def _qasm_(self, args: 'cirq.QasmArgs', qubits: Tuple['cirq.Qid', ...]) -> Optional[str]:
|
|
134
|
-
args.validate_version('2.0')
|
|
144
|
+
args.validate_version('2.0', '3.0')
|
|
135
145
|
return ''.join([args.format('id {0};\n', qubit) for qubit in qubits])
|
|
136
146
|
|
|
137
147
|
@classmethod
|
cirq/ops/identity_test.py
CHANGED
|
@@ -208,3 +208,27 @@ def test_identity_short_circuits_act_on():
|
|
|
208
208
|
args = mock.Mock(cirq.SimulationState)
|
|
209
209
|
args._act_on_fallback_.side_effect = mock.Mock(side_effect=Exception('No!'))
|
|
210
210
|
cirq.act_on(cirq.IdentityGate(1)(cirq.LineQubit(0)), args)
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def test_identity_commutes():
|
|
214
|
+
assert cirq.commutes(cirq.I, cirq.X)
|
|
215
|
+
with pytest.raises(TypeError):
|
|
216
|
+
cirq.commutes(cirq.I, "Gate")
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def test_identity_diagram():
|
|
220
|
+
cirq.testing.assert_has_diagram(
|
|
221
|
+
cirq.Circuit(cirq.IdentityGate(3).on_each(cirq.LineQubit.range(3))),
|
|
222
|
+
"""
|
|
223
|
+
0: ───I───
|
|
224
|
+
│
|
|
225
|
+
1: ───I───
|
|
226
|
+
│
|
|
227
|
+
2: ───I───
|
|
228
|
+
""",
|
|
229
|
+
)
|
|
230
|
+
cirq.testing.assert_has_diagram(
|
|
231
|
+
cirq.Circuit(cirq.IdentityGate(0)()),
|
|
232
|
+
"""
|
|
233
|
+
I(0)""",
|
|
234
|
+
)
|
cirq/ops/kraus_channel.py
CHANGED
cirq/ops/kraus_channel_test.py
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
# pylint: disable=wrong-or-nonexistent-copyright-notice
|
|
2
|
-
import cirq
|
|
3
2
|
import numpy as np
|
|
4
3
|
import pytest
|
|
5
4
|
|
|
5
|
+
import cirq
|
|
6
|
+
|
|
6
7
|
|
|
7
8
|
def test_kraus_channel_from_channel():
|
|
8
9
|
q0 = cirq.LineQubit(0)
|
|
@@ -53,6 +54,7 @@ def test_kraus_channel_remap_keys():
|
|
|
53
54
|
kc_x = cirq.KrausChannel.from_channel(dp, key='x')
|
|
54
55
|
assert cirq.with_measurement_key_mapping(kc_x, {'a': 'b'}) is kc_x
|
|
55
56
|
assert cirq.measurement_key_name(cirq.with_key_path(kc_x, ('path',))) == 'path:x'
|
|
57
|
+
assert cirq.measurement_key_name(cirq.with_key_path_prefix(kc_x, ('path',))) == 'path:x'
|
|
56
58
|
|
|
57
59
|
kc_a = cirq.KrausChannel.from_channel(dp, key='a')
|
|
58
60
|
kc_b = cirq.KrausChannel.from_channel(dp, key='b')
|
cirq/ops/linear_combinations.py
CHANGED
|
@@ -12,34 +12,34 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
import numbers
|
|
15
16
|
from collections import defaultdict
|
|
16
17
|
from typing import (
|
|
17
18
|
AbstractSet,
|
|
18
19
|
Any,
|
|
20
|
+
DefaultDict,
|
|
19
21
|
Dict,
|
|
22
|
+
FrozenSet,
|
|
20
23
|
Iterable,
|
|
24
|
+
List,
|
|
21
25
|
Mapping,
|
|
22
26
|
Optional,
|
|
23
27
|
Tuple,
|
|
24
|
-
Union,
|
|
25
|
-
List,
|
|
26
|
-
FrozenSet,
|
|
27
|
-
DefaultDict,
|
|
28
28
|
TYPE_CHECKING,
|
|
29
|
+
Union,
|
|
29
30
|
)
|
|
30
|
-
import numbers
|
|
31
31
|
|
|
32
32
|
import numpy as np
|
|
33
|
-
from
|
|
33
|
+
from scipy.sparse import csr_matrix
|
|
34
34
|
from sympy.core.expr import Expr
|
|
35
35
|
from sympy.core.symbol import Symbol
|
|
36
|
-
from
|
|
36
|
+
from sympy.logic.boolalg import And, Not, Or, Xor
|
|
37
37
|
|
|
38
38
|
from cirq import linalg, protocols, qis, value
|
|
39
39
|
from cirq._doc import document
|
|
40
40
|
from cirq.linalg import operator_spaces
|
|
41
|
-
from cirq.ops import identity,
|
|
42
|
-
from cirq.ops.pauli_string import
|
|
41
|
+
from cirq.ops import identity, pauli_gates, pauli_string, raw_types
|
|
42
|
+
from cirq.ops.pauli_string import _validate_qubit_mapping, PauliString
|
|
43
43
|
from cirq.ops.projector import ProjectorString
|
|
44
44
|
from cirq.value.linear_dict import _format_terms
|
|
45
45
|
|
|
@@ -48,7 +48,7 @@ if TYPE_CHECKING:
|
|
|
48
48
|
|
|
49
49
|
UnitPauliStringT = FrozenSet[Tuple[raw_types.Qid, pauli_gates.Pauli]]
|
|
50
50
|
PauliSumLike = Union[
|
|
51
|
-
|
|
51
|
+
complex, PauliString, 'PauliSum', pauli_string.SingleQubitPauliStringGateOperation
|
|
52
52
|
]
|
|
53
53
|
document(
|
|
54
54
|
PauliSumLike,
|
|
@@ -81,7 +81,7 @@ class LinearCombinationOfGates(value.LinearDict[raw_types.Gate]):
|
|
|
81
81
|
2 * cirq.X - 2 * cirq.Z
|
|
82
82
|
"""
|
|
83
83
|
|
|
84
|
-
def __init__(self, terms: Mapping[raw_types.Gate,
|
|
84
|
+
def __init__(self, terms: Mapping[raw_types.Gate, 'cirq.TParamValComplex']) -> None:
|
|
85
85
|
"""Initializes linear combination from a collection of terms.
|
|
86
86
|
|
|
87
87
|
Args:
|
|
@@ -149,17 +149,19 @@ class LinearCombinationOfGates(value.LinearDict[raw_types.Gate]):
|
|
|
149
149
|
)
|
|
150
150
|
|
|
151
151
|
def _is_parameterized_(self) -> bool:
|
|
152
|
-
return any(protocols.is_parameterized(
|
|
152
|
+
return any(protocols.is_parameterized(item) for item in self.items())
|
|
153
153
|
|
|
154
154
|
def _parameter_names_(self) -> AbstractSet[str]:
|
|
155
|
-
return {name for
|
|
155
|
+
return {name for item in self.items() for name in protocols.parameter_names(item)}
|
|
156
156
|
|
|
157
157
|
def _resolve_parameters_(
|
|
158
158
|
self, resolver: 'cirq.ParamResolver', recursive: bool
|
|
159
159
|
) -> 'LinearCombinationOfGates':
|
|
160
160
|
return self.__class__(
|
|
161
161
|
{
|
|
162
|
-
protocols.resolve_parameters(
|
|
162
|
+
protocols.resolve_parameters(
|
|
163
|
+
gate, resolver, recursive
|
|
164
|
+
): protocols.resolve_parameters(coeff, resolver, recursive)
|
|
163
165
|
for gate, coeff in self.items()
|
|
164
166
|
}
|
|
165
167
|
)
|
|
@@ -222,7 +224,7 @@ class LinearCombinationOfOperations(value.LinearDict[raw_types.Operation]):
|
|
|
222
224
|
by the identity operator. Note that A may not be unitary or even normal.
|
|
223
225
|
"""
|
|
224
226
|
|
|
225
|
-
def __init__(self, terms: Mapping[raw_types.Operation,
|
|
227
|
+
def __init__(self, terms: Mapping[raw_types.Operation, 'cirq.TParamValComplex']) -> None:
|
|
226
228
|
"""Initializes linear combination from a collection of terms.
|
|
227
229
|
|
|
228
230
|
Args:
|
|
@@ -264,17 +266,19 @@ class LinearCombinationOfOperations(value.LinearDict[raw_types.Operation]):
|
|
|
264
266
|
return LinearCombinationOfOperations({i: bi, x: bx, y: by, z: bz})
|
|
265
267
|
|
|
266
268
|
def _is_parameterized_(self) -> bool:
|
|
267
|
-
return any(protocols.is_parameterized(
|
|
269
|
+
return any(protocols.is_parameterized(item) for item in self.items())
|
|
268
270
|
|
|
269
271
|
def _parameter_names_(self) -> AbstractSet[str]:
|
|
270
|
-
return {name for
|
|
272
|
+
return {name for item in self.items() for name in protocols.parameter_names(item)}
|
|
271
273
|
|
|
272
274
|
def _resolve_parameters_(
|
|
273
275
|
self, resolver: 'cirq.ParamResolver', recursive: bool
|
|
274
276
|
) -> 'LinearCombinationOfOperations':
|
|
275
277
|
return self.__class__(
|
|
276
278
|
{
|
|
277
|
-
protocols.resolve_parameters(op, resolver, recursive):
|
|
279
|
+
protocols.resolve_parameters(op, resolver, recursive): protocols.resolve_parameters(
|
|
280
|
+
coeff, resolver, recursive
|
|
281
|
+
)
|
|
278
282
|
for op, coeff in self.items()
|
|
279
283
|
}
|
|
280
284
|
)
|
|
@@ -353,7 +357,9 @@ def _is_linear_dict_of_unit_pauli_string(linear_dict: value.LinearDict[UnitPauli
|
|
|
353
357
|
return True
|
|
354
358
|
|
|
355
359
|
|
|
356
|
-
def _pauli_string_from_unit(
|
|
360
|
+
def _pauli_string_from_unit(
|
|
361
|
+
unit: UnitPauliStringT, coefficient: Union[int, float, 'cirq.TParamValComplex'] = 1
|
|
362
|
+
):
|
|
357
363
|
return PauliString(qubit_pauli_map=dict(unit), coefficient=coefficient)
|
|
358
364
|
|
|
359
365
|
|
|
@@ -805,7 +811,7 @@ class PauliSum:
|
|
|
805
811
|
if not isinstance(other, (numbers.Complex, PauliString, PauliSum)):
|
|
806
812
|
return NotImplemented
|
|
807
813
|
if isinstance(other, numbers.Complex):
|
|
808
|
-
self._linear_dict *= other
|
|
814
|
+
self._linear_dict *= complex(other)
|
|
809
815
|
elif isinstance(other, PauliString):
|
|
810
816
|
temp = PauliSum.from_pauli_strings([term * other for term in self])
|
|
811
817
|
self._linear_dict = temp._linear_dict
|
|
@@ -870,7 +876,7 @@ def _projector_string_from_projector_dict(projector_dict, coefficient=1.0):
|
|
|
870
876
|
return ProjectorString(dict(projector_dict), coefficient)
|
|
871
877
|
|
|
872
878
|
|
|
873
|
-
@value.value_equality(approximate=True)
|
|
879
|
+
@value.value_equality(approximate=True, unhashable=True)
|
|
874
880
|
class ProjectorSum:
|
|
875
881
|
"""List of mappings representing a sum of projector operators."""
|
|
876
882
|
|
|
@@ -153,6 +153,10 @@ def test_non_unitary_linear_combination_of_gates_has_no_unitary(terms):
|
|
|
153
153
|
),
|
|
154
154
|
({cirq.X: 2, cirq.H: 1}, {'X': 2 + np.sqrt(0.5), 'Z': np.sqrt(0.5)}),
|
|
155
155
|
({cirq.XX: -2, cirq.YY: 3j, cirq.ZZ: 4}, {'XX': -2, 'YY': 3j, 'ZZ': 4}),
|
|
156
|
+
(
|
|
157
|
+
{cirq.X: sympy.Symbol('x'), cirq.Y: -sympy.Symbol('y')},
|
|
158
|
+
{'X': sympy.Symbol('x'), 'Y': -sympy.Symbol('y')},
|
|
159
|
+
),
|
|
156
160
|
),
|
|
157
161
|
)
|
|
158
162
|
def test_linear_combination_of_gates_has_correct_pauli_expansion(terms, expected_expansion):
|
|
@@ -206,7 +210,11 @@ def test_linear_combinations_of_gates_invalid_powers(terms, exponent):
|
|
|
206
210
|
|
|
207
211
|
@pytest.mark.parametrize(
|
|
208
212
|
'terms, is_parameterized, parameter_names',
|
|
209
|
-
[
|
|
213
|
+
[
|
|
214
|
+
({cirq.H: 1}, False, set()),
|
|
215
|
+
({cirq.X ** sympy.Symbol('t'): 1}, True, {'t'}),
|
|
216
|
+
({cirq.X: sympy.Symbol('t')}, True, {'t'}),
|
|
217
|
+
],
|
|
210
218
|
)
|
|
211
219
|
@pytest.mark.parametrize('resolve_fn', [cirq.resolve_parameters, cirq.resolve_parameters_once])
|
|
212
220
|
def test_parameterized_linear_combination_of_gates(
|
|
@@ -225,7 +233,7 @@ def get_matrix(
|
|
|
225
233
|
cirq.GateOperation,
|
|
226
234
|
cirq.LinearCombinationOfGates,
|
|
227
235
|
cirq.LinearCombinationOfOperations,
|
|
228
|
-
]
|
|
236
|
+
],
|
|
229
237
|
) -> np.ndarray:
|
|
230
238
|
if isinstance(operator, (cirq.LinearCombinationOfGates, cirq.LinearCombinationOfOperations)):
|
|
231
239
|
return operator.matrix()
|
|
@@ -243,13 +251,13 @@ def assert_linear_combinations_are_equal(
|
|
|
243
251
|
|
|
244
252
|
actual_matrix = get_matrix(actual)
|
|
245
253
|
expected_matrix = get_matrix(expected)
|
|
246
|
-
assert
|
|
254
|
+
assert cirq.approx_eq(actual_matrix, expected_matrix)
|
|
247
255
|
|
|
248
256
|
actual_expansion = cirq.pauli_expansion(actual)
|
|
249
257
|
expected_expansion = cirq.pauli_expansion(expected)
|
|
250
258
|
assert set(actual_expansion.keys()) == set(expected_expansion.keys())
|
|
251
259
|
for name in actual_expansion.keys():
|
|
252
|
-
assert
|
|
260
|
+
assert cirq.approx_eq(actual_expansion[name], expected_expansion[name])
|
|
253
261
|
|
|
254
262
|
|
|
255
263
|
@pytest.mark.parametrize(
|
|
@@ -279,6 +287,8 @@ def assert_linear_combinations_are_equal(
|
|
|
279
287
|
),
|
|
280
288
|
((cirq.X + cirq.Y + cirq.Z) ** 0, cirq.I),
|
|
281
289
|
((cirq.X - 1j * cirq.Y) ** 0, cirq.I),
|
|
290
|
+
(cirq.Y - sympy.Symbol('s') * cirq.Y, (1 - sympy.Symbol('s')) * cirq.Y),
|
|
291
|
+
((cirq.X + cirq.Z) * sympy.Symbol('s') / np.sqrt(2), cirq.H * sympy.Symbol('s')),
|
|
282
292
|
),
|
|
283
293
|
)
|
|
284
294
|
def test_gate_expressions(expression, expected_result):
|
|
@@ -659,6 +669,10 @@ def test_non_unitary_linear_combination_of_operations_has_no_unitary(terms):
|
|
|
659
669
|
{'IIZI': 1, 'IZII': 1, 'IZZI': -1},
|
|
660
670
|
),
|
|
661
671
|
({cirq.CNOT(q0, q1): 2, cirq.Z(q0): -1, cirq.X(q1): -1}, {'II': 1, 'ZX': -1}),
|
|
672
|
+
(
|
|
673
|
+
{cirq.X(q0): -sympy.Symbol('x'), cirq.Y(q0): sympy.Symbol('y')},
|
|
674
|
+
{'X': -sympy.Symbol('x'), 'Y': sympy.Symbol('y')},
|
|
675
|
+
),
|
|
662
676
|
),
|
|
663
677
|
)
|
|
664
678
|
def test_linear_combination_of_operations_has_correct_pauli_expansion(terms, expected_expansion):
|
|
@@ -716,6 +730,7 @@ def test_linear_combinations_of_operations_invalid_powers(terms, exponent):
|
|
|
716
730
|
[
|
|
717
731
|
({cirq.H(cirq.LineQubit(0)): 1}, False, set()),
|
|
718
732
|
({cirq.X(cirq.LineQubit(0)) ** sympy.Symbol('t'): 1}, True, {'t'}),
|
|
733
|
+
({cirq.X(cirq.LineQubit(0)): sympy.Symbol('t')}, True, {'t'}),
|
|
719
734
|
],
|
|
720
735
|
)
|
|
721
736
|
@pytest.mark.parametrize('resolve_fn', [cirq.resolve_parameters, cirq.resolve_parameters_once])
|
|
@@ -788,6 +803,10 @@ def test_parameterized_linear_combination_of_ops(
|
|
|
788
803
|
cirq.LinearCombinationOfOperations({cirq.X(q1): 2, cirq.Z(q1): 3}) ** 0,
|
|
789
804
|
cirq.LinearCombinationOfOperations({cirq.I(q1): 1}),
|
|
790
805
|
),
|
|
806
|
+
(
|
|
807
|
+
cirq.LinearCombinationOfOperations({cirq.X(q0): sympy.Symbol('s')}) ** 2,
|
|
808
|
+
cirq.LinearCombinationOfOperations({cirq.I(q0): sympy.Symbol('s') ** 2}),
|
|
809
|
+
),
|
|
791
810
|
),
|
|
792
811
|
)
|
|
793
812
|
def test_operation_expressions(expression, expected_result):
|
cirq/ops/matrix_gates.py
CHANGED
|
@@ -14,13 +14,13 @@
|
|
|
14
14
|
|
|
15
15
|
"""Quantum gates defined by a matrix."""
|
|
16
16
|
|
|
17
|
-
from typing import Any, Dict, Iterable, Optional, Tuple, TYPE_CHECKING
|
|
17
|
+
from typing import Any, Dict, Iterable, List, Optional, Tuple, TYPE_CHECKING
|
|
18
18
|
|
|
19
19
|
import numpy as np
|
|
20
20
|
|
|
21
|
-
from cirq import linalg, protocols
|
|
21
|
+
from cirq import _import, linalg, protocols
|
|
22
22
|
from cirq._compat import proper_repr
|
|
23
|
-
from cirq.ops import
|
|
23
|
+
from cirq.ops import global_phase_op, identity, phased_x_z_gate, raw_types
|
|
24
24
|
|
|
25
25
|
if TYPE_CHECKING:
|
|
26
26
|
import cirq
|
|
@@ -148,18 +148,34 @@ class MatrixGate(raw_types.Gate):
|
|
|
148
148
|
return MatrixGate(matrix=result.reshape(self._matrix.shape), qid_shape=self._qid_shape)
|
|
149
149
|
|
|
150
150
|
def _decompose_(self, qubits: Tuple['cirq.Qid', ...]) -> 'cirq.OP_TREE':
|
|
151
|
+
from cirq.circuits import Circuit
|
|
152
|
+
|
|
153
|
+
decomposed: List['cirq.Operation'] = NotImplemented
|
|
151
154
|
if self._qid_shape == (2,):
|
|
152
|
-
|
|
155
|
+
decomposed = [
|
|
153
156
|
g.on(qubits[0])
|
|
154
157
|
for g in single_qubit_decompositions.single_qubit_matrix_to_gates(self._matrix)
|
|
155
158
|
]
|
|
156
159
|
if self._qid_shape == (2,) * 2:
|
|
157
|
-
|
|
160
|
+
decomposed = two_qubit_to_cz.two_qubit_matrix_to_cz_operations(
|
|
158
161
|
*qubits, self._matrix, allow_partial_czs=True
|
|
159
162
|
)
|
|
160
163
|
if self._qid_shape == (2,) * 3:
|
|
161
|
-
|
|
162
|
-
|
|
164
|
+
decomposed = three_qubit_decomposition.three_qubit_matrix_to_operations(
|
|
165
|
+
*qubits, self._matrix
|
|
166
|
+
)
|
|
167
|
+
if decomposed is NotImplemented:
|
|
168
|
+
return NotImplemented
|
|
169
|
+
# The above algorithms ignore phase, but phase is important to maintain if the gate is
|
|
170
|
+
# controlled. Here, we add it back in with a global phase op.
|
|
171
|
+
ident = identity.IdentityGate(qid_shape=self._qid_shape).on(*qubits) # Preserve qid order
|
|
172
|
+
u = protocols.unitary(Circuit(ident, *decomposed)).reshape(self._matrix.shape)
|
|
173
|
+
phase_delta = linalg.phase_delta(u, self._matrix)
|
|
174
|
+
# Phase delta is on the complex unit circle, so if real(phase_delta) >= 1, that means
|
|
175
|
+
# no phase delta. (>1 is rounding error).
|
|
176
|
+
if phase_delta.real < 1:
|
|
177
|
+
decomposed.append(global_phase_op.global_phase_operation(phase_delta))
|
|
178
|
+
return decomposed
|
|
163
179
|
|
|
164
180
|
def _has_unitary_(self) -> bool:
|
|
165
181
|
return True
|
|
@@ -181,7 +197,7 @@ class MatrixGate(raw_types.Gate):
|
|
|
181
197
|
return protocols.CircuitDiagramInfo(wire_symbols=[main, *rest])
|
|
182
198
|
|
|
183
199
|
def _qasm_(self, args: 'cirq.QasmArgs', qubits: Tuple['cirq.Qid', ...]) -> Optional[str]:
|
|
184
|
-
args.validate_version('2.0')
|
|
200
|
+
args.validate_version('2.0', '3.0')
|
|
185
201
|
if self._qid_shape == (2,):
|
|
186
202
|
return protocols.qasm(
|
|
187
203
|
phased_x_z_gate.PhasedXZGate.from_matrix(self._matrix), args=args, qubits=qubits
|
cirq/ops/measure_util.py
CHANGED
|
@@ -12,12 +12,12 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from typing import Callable, Dict, Iterable, List,
|
|
15
|
+
from typing import Callable, Dict, Iterable, List, Optional, overload, Tuple, TYPE_CHECKING, Union
|
|
16
16
|
|
|
17
17
|
import numpy as np
|
|
18
18
|
|
|
19
19
|
from cirq import protocols
|
|
20
|
-
from cirq.ops import
|
|
20
|
+
from cirq.ops import pauli_string, raw_types
|
|
21
21
|
from cirq.ops.measurement_gate import MeasurementGate
|
|
22
22
|
from cirq.ops.pauli_measurement_gate import PauliMeasurementGate
|
|
23
23
|
|
cirq/ops/measurement_gate.py
CHANGED
|
@@ -19,8 +19,8 @@ from typing import (
|
|
|
19
19
|
Iterable,
|
|
20
20
|
Mapping,
|
|
21
21
|
Optional,
|
|
22
|
-
Tuple,
|
|
23
22
|
Sequence,
|
|
23
|
+
Tuple,
|
|
24
24
|
TYPE_CHECKING,
|
|
25
25
|
Union,
|
|
26
26
|
)
|
|
@@ -227,7 +227,7 @@ class MeasurementGate(raw_types.Gate):
|
|
|
227
227
|
def _qasm_(self, args: 'cirq.QasmArgs', qubits: Tuple['cirq.Qid', ...]) -> Optional[str]:
|
|
228
228
|
if self.confusion_map or not all(d == 2 for d in self._qid_shape):
|
|
229
229
|
return NotImplemented
|
|
230
|
-
args.validate_version('2.0')
|
|
230
|
+
args.validate_version('2.0', '3.0')
|
|
231
231
|
invert_mask = self.invert_mask
|
|
232
232
|
if len(invert_mask) < len(qubits):
|
|
233
233
|
invert_mask = invert_mask + (False,) * (len(qubits) - len(invert_mask))
|
|
@@ -235,7 +235,10 @@ class MeasurementGate(raw_types.Gate):
|
|
|
235
235
|
for i, (qubit, inv) in enumerate(zip(qubits, invert_mask)):
|
|
236
236
|
if inv:
|
|
237
237
|
lines.append(args.format('x {0}; // Invert the following measurement\n', qubit))
|
|
238
|
-
|
|
238
|
+
if args.version == '2.0':
|
|
239
|
+
lines.append(args.format('measure {0} -> {1:meas}[{2}];\n', qubit, self.key, i))
|
|
240
|
+
else:
|
|
241
|
+
lines.append(args.format('{1:meas}[{2}] = measure {0};\n', qubit, self.key, i))
|
|
239
242
|
if inv:
|
|
240
243
|
lines.append(args.format('x {0}; // Undo the inversion\n', qubit))
|
|
241
244
|
return ''.join(lines)
|
|
@@ -270,7 +273,7 @@ class MeasurementGate(raw_types.Gate):
|
|
|
270
273
|
(idxs, tuple(v for _, v in np.ndenumerate(cmap)))
|
|
271
274
|
for idxs, cmap in self._confusion_map.items()
|
|
272
275
|
)
|
|
273
|
-
return self.key, self.
|
|
276
|
+
return self.key, self.full_invert_mask(), self._qid_shape, hashable_cmap
|
|
274
277
|
|
|
275
278
|
def _json_dict_(self) -> Dict[str, Any]:
|
|
276
279
|
other: Dict[str, Any] = {}
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
from typing import cast
|
|
16
|
+
|
|
16
17
|
import numpy as np
|
|
17
18
|
import pytest
|
|
18
19
|
|
|
@@ -74,11 +75,11 @@ def test_measurement_eq():
|
|
|
74
75
|
eq.make_equality_group(
|
|
75
76
|
lambda: cirq.MeasurementGate(1, 'a'),
|
|
76
77
|
lambda: cirq.MeasurementGate(1, 'a', invert_mask=()),
|
|
78
|
+
lambda: cirq.MeasurementGate(1, 'a', invert_mask=(False,)),
|
|
77
79
|
lambda: cirq.MeasurementGate(1, 'a', qid_shape=(2,)),
|
|
78
80
|
lambda: cirq.MeasurementGate(1, 'a', confusion_map={}),
|
|
79
81
|
)
|
|
80
82
|
eq.add_equality_group(cirq.MeasurementGate(1, 'a', invert_mask=(True,)))
|
|
81
|
-
eq.add_equality_group(cirq.MeasurementGate(1, 'a', invert_mask=(False,)))
|
|
82
83
|
eq.add_equality_group(
|
|
83
84
|
cirq.MeasurementGate(1, 'a', confusion_map={(0,): np.array([[0, 1], [1, 0]])})
|
|
84
85
|
)
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
# pylint: disable=wrong-or-nonexistent-copyright-notice
|
|
2
|
-
import cirq
|
|
3
2
|
import numpy as np
|
|
4
3
|
import pytest
|
|
5
4
|
|
|
5
|
+
import cirq
|
|
6
|
+
|
|
6
7
|
|
|
7
8
|
def test_matrix_mixture_from_mixture():
|
|
8
9
|
q0 = cirq.LineQubit(0)
|
|
@@ -54,6 +55,7 @@ def test_matrix_mixture_remap_keys():
|
|
|
54
55
|
mm_x = cirq.MixedUnitaryChannel.from_mixture(dp, key='x')
|
|
55
56
|
assert cirq.with_measurement_key_mapping(mm_x, {'a': 'b'}) is mm_x
|
|
56
57
|
assert cirq.measurement_key_name(cirq.with_key_path(mm_x, ('path',))) == 'path:x'
|
|
58
|
+
assert cirq.measurement_key_name(cirq.with_key_path_prefix(mm_x, ('path',))) == 'path:x'
|
|
57
59
|
|
|
58
60
|
mm_a = cirq.MixedUnitaryChannel.from_mixture(dp, key='a')
|
|
59
61
|
mm_b = cirq.MixedUnitaryChannel.from_mixture(dp, key='b')
|
cirq/ops/named_qubit.py
CHANGED
|
@@ -18,7 +18,6 @@ from typing import Any, Dict, List, Optional, Tuple, TYPE_CHECKING
|
|
|
18
18
|
from cirq import protocols
|
|
19
19
|
from cirq.ops import raw_types
|
|
20
20
|
|
|
21
|
-
|
|
22
21
|
if TYPE_CHECKING:
|
|
23
22
|
import cirq
|
|
24
23
|
|
|
@@ -134,6 +133,10 @@ class NamedQid(_BaseNamedQid):
|
|
|
134
133
|
"""Returns a tuple of args to pass to __new__ when unpickling."""
|
|
135
134
|
return (self._name, self._dimension)
|
|
136
135
|
|
|
136
|
+
# avoid pickling the _hash value, attributes are already stored with __getnewargs__
|
|
137
|
+
def __getstate__(self) -> Dict[str, Any]:
|
|
138
|
+
return {}
|
|
139
|
+
|
|
137
140
|
def __repr__(self) -> str:
|
|
138
141
|
return f'cirq.NamedQid({self._name!r}, dimension={self._dimension})'
|
|
139
142
|
|
|
@@ -202,6 +205,10 @@ class NamedQubit(_BaseNamedQid):
|
|
|
202
205
|
"""Returns a tuple of args to pass to __new__ when unpickling."""
|
|
203
206
|
return (self._name,)
|
|
204
207
|
|
|
208
|
+
# avoid pickling the _hash value, attributes are already stored with __getnewargs__
|
|
209
|
+
def __getstate__(self) -> Dict[str, Any]:
|
|
210
|
+
return {}
|
|
211
|
+
|
|
205
212
|
def __str__(self) -> str:
|
|
206
213
|
return self._name
|
|
207
214
|
|
cirq/ops/op_tree.py
CHANGED
|
@@ -12,11 +12,9 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
"""A recursive type describing trees of operations, and utility methods for it.
|
|
16
|
-
"""
|
|
15
|
+
"""A recursive type describing trees of operations, and utility methods for it."""
|
|
17
16
|
|
|
18
|
-
from typing import Callable, Iterable, Iterator, NoReturn,
|
|
19
|
-
from typing_extensions import Protocol
|
|
17
|
+
from typing import Callable, Iterable, Iterator, NoReturn, TYPE_CHECKING, Union
|
|
20
18
|
|
|
21
19
|
from cirq._doc import document
|
|
22
20
|
from cirq._import import LazyLoader
|
|
@@ -28,32 +26,7 @@ if TYPE_CHECKING:
|
|
|
28
26
|
moment = LazyLoader("moment", globals(), "cirq.circuits.moment")
|
|
29
27
|
|
|
30
28
|
|
|
31
|
-
|
|
32
|
-
"""The recursive type consumed by circuit builder methods.
|
|
33
|
-
|
|
34
|
-
An OpTree is a type protocol, satisfied by anything that can be recursively
|
|
35
|
-
flattened into Operations. We also define the Union type OP_TREE which
|
|
36
|
-
can be an OpTree or just a single Operation.
|
|
37
|
-
|
|
38
|
-
For example:
|
|
39
|
-
- An Operation is an OP_TREE all by itself.
|
|
40
|
-
- A list of operations is an OP_TREE.
|
|
41
|
-
- A list of tuples of operations is an OP_TREE.
|
|
42
|
-
- A list with a mix of operations and lists of operations is an OP_TREE.
|
|
43
|
-
- A generator yielding operations is an OP_TREE.
|
|
44
|
-
|
|
45
|
-
Note: once mypy supports recursive types this could be defined as an alias:
|
|
46
|
-
|
|
47
|
-
OP_TREE = Union[Operation, Iterable['OP_TREE']]
|
|
48
|
-
|
|
49
|
-
See: https://github.com/python/mypy/issues/731
|
|
50
|
-
"""
|
|
51
|
-
|
|
52
|
-
def __iter__(self) -> Iterator[Union[Operation, 'OpTree']]:
|
|
53
|
-
pass
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
OP_TREE = Union[Operation, OpTree]
|
|
29
|
+
OP_TREE = Union[Operation, Iterable['OP_TREE']]
|
|
57
30
|
document(
|
|
58
31
|
OP_TREE,
|
|
59
32
|
"""An operation or nested collections of operations.
|
cirq/ops/op_tree_test.py
CHANGED
|
@@ -135,6 +135,10 @@ def test_transform_leaves():
|
|
|
135
135
|
# Just an item.
|
|
136
136
|
assert move_tree_left_freeze(operations[0]) == expected[0]
|
|
137
137
|
|
|
138
|
+
# Just a moment
|
|
139
|
+
m = cirq.Moment(cirq.X(cirq.q(1)))
|
|
140
|
+
assert cirq.transform_op_tree(m, preserve_moments=True) is m
|
|
141
|
+
|
|
138
142
|
# Flat list.
|
|
139
143
|
assert move_tree_left_freeze(operations) == tuple(expected)
|
|
140
144
|
|
cirq/ops/parallel_gate.py
CHANGED
|
@@ -12,14 +12,13 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
from typing import AbstractSet,
|
|
15
|
+
from types import NotImplementedType
|
|
16
|
+
from typing import AbstractSet, Any, Dict, Optional, Tuple, TYPE_CHECKING, Union
|
|
17
17
|
|
|
18
18
|
import numpy as np
|
|
19
19
|
|
|
20
20
|
from cirq import protocols, value
|
|
21
21
|
from cirq.ops import raw_types
|
|
22
|
-
from cirq.type_workarounds import NotImplementedType
|
|
23
22
|
|
|
24
23
|
if TYPE_CHECKING:
|
|
25
24
|
import cirq
|