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/ops/phased_iswap_gate.py
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
"""ISWAPPowGate conjugated by tensor product Rz(phi) and Rz(-phi)."""
|
|
15
15
|
|
|
16
|
-
from typing import AbstractSet, Any, cast, Dict, List, Optional, Sequence, Tuple, Union
|
|
16
|
+
from typing import AbstractSet, Any, cast, Dict, Iterator, List, Optional, Sequence, Tuple, Union
|
|
17
17
|
|
|
18
18
|
import numpy as np
|
|
19
19
|
import sympy
|
|
@@ -93,15 +93,14 @@ class PhasedISwapPowGate(eigen_gate.EigenGate):
|
|
|
93
93
|
}
|
|
94
94
|
|
|
95
95
|
def _value_equality_values_cls_(self):
|
|
96
|
-
if self.phase_exponent == 0:
|
|
97
|
-
return swap_gates.ISwapPowGate
|
|
98
96
|
return PhasedISwapPowGate
|
|
99
97
|
|
|
100
98
|
def _value_equality_values_(self):
|
|
101
|
-
if self.phase_exponent == 0:
|
|
102
|
-
return self._iswap._value_equality_values_()
|
|
103
99
|
return (self.phase_exponent, *self._iswap._value_equality_values_())
|
|
104
100
|
|
|
101
|
+
def _value_equality_approximate_values_(self):
|
|
102
|
+
return (self.phase_exponent, *self._iswap._value_equality_approximate_values_())
|
|
103
|
+
|
|
105
104
|
def _is_parameterized_(self) -> bool:
|
|
106
105
|
return protocols.is_parameterized(self._iswap) or protocols.is_parameterized(
|
|
107
106
|
self._phase_exponent
|
|
@@ -157,7 +156,7 @@ class PhasedISwapPowGate(eigen_gate.EigenGate):
|
|
|
157
156
|
)
|
|
158
157
|
return args.available_buffer
|
|
159
158
|
|
|
160
|
-
def _decompose_(self, qubits: Sequence['cirq.Qid']) -> 'cirq.OP_TREE':
|
|
159
|
+
def _decompose_(self, qubits: Sequence['cirq.Qid']) -> Iterator['cirq.OP_TREE']:
|
|
161
160
|
if len(qubits) != 2:
|
|
162
161
|
raise ValueError(f'Expected two qubits, got {len(qubits)}')
|
|
163
162
|
a, b = qubits
|
|
@@ -253,4 +252,4 @@ def givens(angle_rads: value.TParamVal) -> PhasedISwapPowGate:
|
|
|
253
252
|
A phased iswap gate for the given rotation.
|
|
254
253
|
"""
|
|
255
254
|
pi = sympy.pi if protocols.is_parameterized(angle_rads) else np.pi
|
|
256
|
-
return PhasedISwapPowGate() ** (2 * angle_rads / pi)
|
|
255
|
+
return cast(PhasedISwapPowGate, PhasedISwapPowGate() ** (2 * angle_rads / pi))
|
|
@@ -34,11 +34,10 @@ def test_phased_iswap_init():
|
|
|
34
34
|
|
|
35
35
|
def test_phased_iswap_equality():
|
|
36
36
|
eq = cirq.testing.EqualsTester()
|
|
37
|
-
eq.add_equality_group(cirq.PhasedISwapPowGate(phase_exponent=0, exponent=0.4)
|
|
38
|
-
eq.add_equality_group(
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
)
|
|
37
|
+
eq.add_equality_group(cirq.PhasedISwapPowGate(phase_exponent=0, exponent=0.4))
|
|
38
|
+
eq.add_equality_group(cirq.ISWAP**0.4)
|
|
39
|
+
eq.add_equality_group(cirq.PhasedISwapPowGate(phase_exponent=0, exponent=0.4, global_shift=0.3))
|
|
40
|
+
eq.add_equality_group(cirq.ISwapPowGate(global_shift=0.3) ** 0.4)
|
|
42
41
|
|
|
43
42
|
|
|
44
43
|
def test_repr():
|
|
@@ -204,3 +203,20 @@ def test_givens_rotation_equivalent_circuit():
|
|
|
204
203
|
@pytest.mark.parametrize('angle_rads', (-np.pi / 5, 0.4, 2, np.pi))
|
|
205
204
|
def test_givens_rotation_has_consistent_protocols(angle_rads):
|
|
206
205
|
cirq.testing.assert_implements_consistent_protocols(cirq.givens(angle_rads))
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def test_approx_eq():
|
|
209
|
+
gate0 = cirq.PhasedISwapPowGate(phase_exponent=0)
|
|
210
|
+
gate1 = cirq.PhasedISwapPowGate(phase_exponent=1e-12)
|
|
211
|
+
gate2 = cirq.PhasedISwapPowGate(phase_exponent=2e-12)
|
|
212
|
+
gate3 = cirq.PhasedISwapPowGate(phase_exponent=0.345)
|
|
213
|
+
gate4 = cirq.ISwapPowGate()
|
|
214
|
+
|
|
215
|
+
assert cirq.approx_eq(gate1, gate2)
|
|
216
|
+
assert cirq.approx_eq(gate1, gate0)
|
|
217
|
+
assert not cirq.approx_eq(gate1, gate3)
|
|
218
|
+
assert not cirq.approx_eq(gate0, gate4)
|
|
219
|
+
|
|
220
|
+
assert cirq.equal_up_to_global_phase(gate1, gate2)
|
|
221
|
+
assert cirq.equal_up_to_global_phase(gate1, gate0)
|
|
222
|
+
assert not cirq.equal_up_to_global_phase(gate1, gate3)
|
cirq/ops/phased_x_gate.py
CHANGED
|
@@ -12,21 +12,22 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
"""An `XPowGate` conjugated by `ZPowGate`s."""
|
|
15
|
-
from typing import AbstractSet, Any, cast, Dict, Optional, Sequence, Tuple, Union
|
|
16
15
|
|
|
17
16
|
import math
|
|
18
17
|
import numbers
|
|
18
|
+
from types import NotImplementedType
|
|
19
|
+
from typing import AbstractSet, Any, cast, Dict, Optional, Sequence, Tuple, Union
|
|
20
|
+
|
|
19
21
|
import numpy as np
|
|
20
22
|
import sympy
|
|
21
23
|
|
|
22
24
|
import cirq
|
|
23
|
-
from cirq import
|
|
25
|
+
from cirq import protocols, value
|
|
24
26
|
from cirq._compat import proper_repr
|
|
25
|
-
from cirq.ops import
|
|
26
|
-
from cirq.type_workarounds import NotImplementedType
|
|
27
|
+
from cirq.ops import raw_types
|
|
27
28
|
|
|
28
29
|
|
|
29
|
-
@value.value_equality(
|
|
30
|
+
@value.value_equality(approximate=True)
|
|
30
31
|
class PhasedXPowGate(raw_types.Gate):
|
|
31
32
|
r"""A gate equivalent to $Z^{-p} X^t Z^{p}$ (in time order).
|
|
32
33
|
|
|
@@ -67,7 +68,7 @@ class PhasedXPowGate(raw_types.Gate):
|
|
|
67
68
|
if cirq.is_parameterized(self):
|
|
68
69
|
return None
|
|
69
70
|
|
|
70
|
-
args.validate_version('2.0')
|
|
71
|
+
args.validate_version('2.0', '3.0')
|
|
71
72
|
|
|
72
73
|
e = cast(float, value.canonicalize_half_turns(self._exponent))
|
|
73
74
|
p = cast(float, self.phase_exponent)
|
|
@@ -115,7 +116,7 @@ class PhasedXPowGate(raw_types.Gate):
|
|
|
115
116
|
def __pow__(self, exponent: Union[float, sympy.Expr]) -> 'PhasedXPowGate':
|
|
116
117
|
new_exponent = protocols.mul(self._exponent, exponent, NotImplemented)
|
|
117
118
|
if new_exponent is NotImplemented:
|
|
118
|
-
return NotImplemented
|
|
119
|
+
return NotImplemented # pragma: no cover
|
|
119
120
|
return PhasedXPowGate(
|
|
120
121
|
phase_exponent=self._phase_exponent,
|
|
121
122
|
exponent=new_exponent,
|
|
@@ -130,7 +131,7 @@ class PhasedXPowGate(raw_types.Gate):
|
|
|
130
131
|
def _has_unitary_(self):
|
|
131
132
|
return not self._is_parameterized_()
|
|
132
133
|
|
|
133
|
-
def _unitary_(self) -> Union[np.ndarray, NotImplementedType]:
|
|
134
|
+
def _unitary_(self) -> Optional[Union[np.ndarray, NotImplementedType]]:
|
|
134
135
|
"""See `cirq.SupportsUnitary`."""
|
|
135
136
|
if self._is_parameterized_():
|
|
136
137
|
return None
|
|
@@ -174,12 +175,12 @@ class PhasedXPowGate(raw_types.Gate):
|
|
|
174
175
|
"""See `cirq.SupportsParameterization`."""
|
|
175
176
|
phase_exponent = resolver.value_of(self._phase_exponent, recursive)
|
|
176
177
|
exponent = resolver.value_of(self._exponent, recursive)
|
|
177
|
-
if isinstance(phase_exponent,
|
|
178
|
+
if isinstance(phase_exponent, numbers.Complex):
|
|
178
179
|
if isinstance(phase_exponent, numbers.Real):
|
|
179
180
|
phase_exponent = float(phase_exponent)
|
|
180
181
|
else:
|
|
181
182
|
raise ValueError(f'PhasedXPowGate does not support complex value {phase_exponent}')
|
|
182
|
-
if isinstance(exponent,
|
|
183
|
+
if isinstance(exponent, numbers.Complex):
|
|
183
184
|
if isinstance(exponent, numbers.Real):
|
|
184
185
|
exponent = float(exponent)
|
|
185
186
|
else:
|
|
@@ -240,22 +241,7 @@ class PhasedXPowGate(raw_types.Gate):
|
|
|
240
241
|
|
|
241
242
|
return self._exponent % period
|
|
242
243
|
|
|
243
|
-
def _value_equality_values_cls_(self):
|
|
244
|
-
if self.phase_exponent == 0:
|
|
245
|
-
return common_gates.XPowGate
|
|
246
|
-
if self.phase_exponent == 0.5:
|
|
247
|
-
return common_gates.YPowGate
|
|
248
|
-
return PhasedXPowGate
|
|
249
|
-
|
|
250
244
|
def _value_equality_values_(self):
|
|
251
|
-
if self.phase_exponent == 0:
|
|
252
|
-
return common_gates.XPowGate(
|
|
253
|
-
exponent=self._exponent, global_shift=self._global_shift
|
|
254
|
-
)._value_equality_values_()
|
|
255
|
-
if self.phase_exponent == 0.5:
|
|
256
|
-
return common_gates.YPowGate(
|
|
257
|
-
exponent=self._exponent, global_shift=self._global_shift
|
|
258
|
-
)._value_equality_values_()
|
|
259
245
|
return self.phase_exponent, self._canonical_exponent, self._global_shift
|
|
260
246
|
|
|
261
247
|
def _json_dict_(self) -> Dict[str, Any]:
|
cirq/ops/phased_x_gate_test.py
CHANGED
|
@@ -79,16 +79,17 @@ def test_eq():
|
|
|
79
79
|
cirq.PhasedXPowGate(exponent=1, phase_exponent=0),
|
|
80
80
|
cirq.PhasedXPowGate(exponent=1, phase_exponent=2),
|
|
81
81
|
cirq.PhasedXPowGate(exponent=1, phase_exponent=-2),
|
|
82
|
-
cirq.X,
|
|
83
82
|
)
|
|
83
|
+
eq.add_equality_group(cirq.X)
|
|
84
84
|
eq.add_equality_group(cirq.PhasedXPowGate(exponent=1, phase_exponent=2, global_shift=0.1))
|
|
85
85
|
|
|
86
86
|
eq.add_equality_group(
|
|
87
87
|
cirq.PhasedXPowGate(phase_exponent=0.5, exponent=1),
|
|
88
88
|
cirq.PhasedXPowGate(phase_exponent=2.5, exponent=3),
|
|
89
|
-
cirq.Y,
|
|
90
89
|
)
|
|
91
|
-
eq.add_equality_group(cirq.
|
|
90
|
+
eq.add_equality_group(cirq.Y)
|
|
91
|
+
eq.add_equality_group(cirq.PhasedXPowGate(phase_exponent=0.5, exponent=0.25))
|
|
92
|
+
eq.add_equality_group(cirq.Y**0.25)
|
|
92
93
|
|
|
93
94
|
eq.add_equality_group(cirq.PhasedXPowGate(phase_exponent=0.25, exponent=0.25, global_shift=0.1))
|
|
94
95
|
eq.add_equality_group(cirq.PhasedXPowGate(phase_exponent=2.25, exponent=0.25, global_shift=0.2))
|
|
@@ -266,3 +267,18 @@ def test_exponent_consistency(exponent, phase_exponent):
|
|
|
266
267
|
u = cirq.protocols.unitary(g)
|
|
267
268
|
u2 = cirq.protocols.unitary(g2)
|
|
268
269
|
assert np.all(u == u2)
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
def test_approx_eq_for_close_phase_exponents():
|
|
273
|
+
gate1 = cirq.PhasedXPowGate(phase_exponent=0)
|
|
274
|
+
gate2 = cirq.PhasedXPowGate(phase_exponent=1e-12)
|
|
275
|
+
gate3 = cirq.PhasedXPowGate(phase_exponent=2e-12)
|
|
276
|
+
gate4 = cirq.PhasedXPowGate(phase_exponent=0.345)
|
|
277
|
+
|
|
278
|
+
assert cirq.approx_eq(gate2, gate3)
|
|
279
|
+
assert cirq.approx_eq(gate2, gate1)
|
|
280
|
+
assert not cirq.approx_eq(gate2, gate4)
|
|
281
|
+
|
|
282
|
+
assert cirq.equal_up_to_global_phase(gate2, gate3)
|
|
283
|
+
assert cirq.equal_up_to_global_phase(gate2, gate1)
|
|
284
|
+
assert not cirq.equal_up_to_global_phase(gate2, gate4)
|
cirq/ops/phased_x_z_gate.py
CHANGED
|
@@ -11,15 +11,16 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
-
|
|
14
|
+
|
|
15
15
|
import numbers
|
|
16
|
+
from typing import AbstractSet, Any, Dict, Iterator, Optional, Sequence, Tuple, TYPE_CHECKING, Union
|
|
16
17
|
|
|
17
18
|
import numpy as np
|
|
18
19
|
import sympy
|
|
19
20
|
|
|
20
|
-
from cirq import
|
|
21
|
-
from cirq.ops import raw_types
|
|
21
|
+
from cirq import linalg, ops, protocols, value
|
|
22
22
|
from cirq._compat import proper_repr
|
|
23
|
+
from cirq.ops import raw_types
|
|
23
24
|
|
|
24
25
|
if TYPE_CHECKING:
|
|
25
26
|
import cirq
|
|
@@ -69,9 +70,9 @@ class PhasedXZGate(raw_types.Gate):
|
|
|
69
70
|
|
|
70
71
|
@classmethod
|
|
71
72
|
def from_zyz_angles(cls, z0_rad: float, y_rad: float, z1_rad: float) -> 'cirq.PhasedXZGate':
|
|
72
|
-
"""Create a PhasedXZGate from ZYZ angles.
|
|
73
|
+
r"""Create a PhasedXZGate from ZYZ angles.
|
|
73
74
|
|
|
74
|
-
The returned gate is equivalent to $Rz(
|
|
75
|
+
The returned gate is equivalent to $Rz(z0\_rad) Ry(y\_rad) Rz(z1\_rad)$ (in time order).
|
|
75
76
|
"""
|
|
76
77
|
return cls.from_zyz_exponents(z0=z0_rad / np.pi, y=y_rad / np.pi, z1=z1_rad / np.pi)
|
|
77
78
|
|
|
@@ -79,7 +80,7 @@ class PhasedXZGate(raw_types.Gate):
|
|
|
79
80
|
def from_zyz_exponents(cls, z0: float, y: float, z1: float) -> 'cirq.PhasedXZGate':
|
|
80
81
|
"""Create a PhasedXZGate from ZYZ exponents.
|
|
81
82
|
|
|
82
|
-
The returned gate is equivalent to $Z^z0 Y^y Z^z1$ (in time order).
|
|
83
|
+
The returned gate is equivalent to $Z^{z0} Y^y Z^{z1}$ (in time order).
|
|
83
84
|
"""
|
|
84
85
|
return PhasedXZGate(axis_phase_exponent=-z0 + 0.5, x_exponent=y, z_exponent=z0 + z1)
|
|
85
86
|
|
|
@@ -188,13 +189,13 @@ class PhasedXZGate(raw_types.Gate):
|
|
|
188
189
|
z_post = protocols.unitary(ops.Z ** (self._axis_phase_exponent + self._z_exponent))
|
|
189
190
|
return z_post @ x @ z_pre
|
|
190
191
|
|
|
191
|
-
def _decompose_(self, qubits: Sequence['cirq.Qid']) -> 'cirq.OP_TREE':
|
|
192
|
+
def _decompose_(self, qubits: Sequence['cirq.Qid']) -> Iterator['cirq.OP_TREE']:
|
|
192
193
|
q = qubits[0]
|
|
193
194
|
yield ops.Z(q) ** -self._axis_phase_exponent
|
|
194
195
|
yield ops.X(q) ** self._x_exponent
|
|
195
196
|
yield ops.Z(q) ** (self._axis_phase_exponent + self._z_exponent)
|
|
196
197
|
|
|
197
|
-
def __pow__(self, exponent:
|
|
198
|
+
def __pow__(self, exponent: float) -> 'PhasedXZGate':
|
|
198
199
|
if exponent == 1:
|
|
199
200
|
return self
|
|
200
201
|
if exponent == -1:
|
|
@@ -228,17 +229,17 @@ class PhasedXZGate(raw_types.Gate):
|
|
|
228
229
|
z_exponent = resolver.value_of(self._z_exponent, recursive)
|
|
229
230
|
x_exponent = resolver.value_of(self._x_exponent, recursive)
|
|
230
231
|
axis_phase_exponent = resolver.value_of(self._axis_phase_exponent, recursive)
|
|
231
|
-
if isinstance(z_exponent,
|
|
232
|
+
if isinstance(z_exponent, numbers.Complex):
|
|
232
233
|
if isinstance(z_exponent, numbers.Real):
|
|
233
234
|
z_exponent = float(z_exponent)
|
|
234
235
|
else:
|
|
235
236
|
raise ValueError(f'Complex exponent {z_exponent} not allowed in cirq.PhasedXZGate')
|
|
236
|
-
if isinstance(x_exponent,
|
|
237
|
+
if isinstance(x_exponent, numbers.Complex):
|
|
237
238
|
if isinstance(x_exponent, numbers.Real):
|
|
238
239
|
x_exponent = float(x_exponent)
|
|
239
240
|
else:
|
|
240
241
|
raise ValueError(f'Complex exponent {x_exponent} not allowed in cirq.PhasedXZGate')
|
|
241
|
-
if isinstance(axis_phase_exponent,
|
|
242
|
+
if isinstance(axis_phase_exponent, numbers.Complex):
|
|
242
243
|
if isinstance(axis_phase_exponent, numbers.Real):
|
|
243
244
|
axis_phase_exponent = float(axis_phase_exponent)
|
|
244
245
|
else:
|
cirq/ops/projector.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# pylint: disable=wrong-or-nonexistent-copyright-notice
|
|
2
2
|
import itertools
|
|
3
|
-
|
|
3
|
+
import math
|
|
4
|
+
from typing import Any, Dict, Iterable, List, Mapping, Optional
|
|
4
5
|
|
|
5
6
|
import numpy as np
|
|
6
7
|
from scipy.sparse import csr_matrix
|
|
@@ -20,9 +21,7 @@ def _check_qids_dimension(qids):
|
|
|
20
21
|
class ProjectorString:
|
|
21
22
|
"""Mapping of `cirq.Qid` to measurement values (with a coefficient) representing a projector."""
|
|
22
23
|
|
|
23
|
-
def __init__(
|
|
24
|
-
self, projector_dict: Dict[raw_types.Qid, int], coefficient: Union[int, float, complex] = 1
|
|
25
|
-
):
|
|
24
|
+
def __init__(self, projector_dict: Dict[raw_types.Qid, int], coefficient: complex = 1):
|
|
26
25
|
"""Constructor for ProjectorString
|
|
27
26
|
|
|
28
27
|
Args:
|
|
@@ -61,7 +60,7 @@ class ProjectorString:
|
|
|
61
60
|
for qid in projector_qids
|
|
62
61
|
]
|
|
63
62
|
|
|
64
|
-
total_d =
|
|
63
|
+
total_d = math.prod(qid.dimension for qid in projector_qids)
|
|
65
64
|
|
|
66
65
|
ones_idx = []
|
|
67
66
|
for idx in itertools.product(*idx_to_keep):
|
cirq/ops/qubit_manager.py
CHANGED
cirq/ops/qubit_manager_test.py
CHANGED
cirq/ops/qubit_order.py
CHANGED
cirq/ops/random_gate_channel.py
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
import numbers
|
|
16
|
-
from typing import AbstractSet,
|
|
16
|
+
from typing import AbstractSet, Any, cast, Dict, Optional, SupportsFloat, Tuple, TYPE_CHECKING
|
|
17
17
|
|
|
18
18
|
import numpy as np
|
|
19
19
|
|
|
@@ -150,12 +150,6 @@ def test_mixture():
|
|
|
150
150
|
assert {p for p, _ in m} == {7 / 8, 1 / 32, 3 / 32}
|
|
151
151
|
|
|
152
152
|
|
|
153
|
-
def assert_channel_sums_to_identity(val):
|
|
154
|
-
m = cirq.kraus(val)
|
|
155
|
-
s = sum(np.conj(e.T) @ e for e in m)
|
|
156
|
-
np.testing.assert_allclose(s, np.eye(np.prod(cirq.qid_shape(val), dtype=np.int64)), atol=1e-8)
|
|
157
|
-
|
|
158
|
-
|
|
159
153
|
def test_channel():
|
|
160
154
|
class NoDetailsGate(cirq.Gate):
|
|
161
155
|
def num_qubits(self) -> int:
|