cirq-core 1.5.0.dev20250409222543__py3-none-any.whl → 1.6.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 +16 -17
- cirq/_compat.py +21 -20
- cirq/_compat_test.py +14 -34
- cirq/_doc.py +4 -2
- cirq/_import.py +8 -6
- cirq/_import_test.py +4 -2
- cirq/_version.py +6 -6
- cirq/_version_test.py +2 -2
- cirq/circuits/_block_diagram_drawer.py +11 -10
- cirq/circuits/_block_diagram_drawer_test.py +8 -6
- cirq/circuits/_box_drawing_character_data.py +8 -8
- cirq/circuits/_box_drawing_character_data_test.py +3 -1
- cirq/circuits/_bucket_priority_queue.py +9 -7
- cirq/circuits/_bucket_priority_queue_test.py +22 -20
- cirq/circuits/circuit.py +248 -172
- cirq/circuits/circuit_operation.py +73 -83
- cirq/circuits/circuit_operation_test.py +128 -90
- cirq/circuits/circuit_test.py +211 -151
- cirq/circuits/frozen_circuit.py +23 -60
- cirq/circuits/frozen_circuit_test.py +31 -8
- cirq/circuits/insert_strategy.py +7 -5
- cirq/circuits/insert_strategy_test.py +4 -2
- cirq/circuits/moment.py +88 -40
- cirq/circuits/moment_test.py +128 -51
- cirq/circuits/optimization_pass.py +5 -5
- cirq/circuits/optimization_pass_test.py +10 -10
- cirq/circuits/qasm_output.py +11 -11
- cirq/circuits/qasm_output_test.py +25 -22
- cirq/circuits/text_diagram_drawer.py +23 -38
- cirq/circuits/text_diagram_drawer_test.py +19 -17
- cirq/conftest.py +4 -3
- cirq/contrib/__init__.py +4 -4
- cirq/contrib/acquaintance/__init__.py +1 -1
- cirq/contrib/acquaintance/bipartite.py +5 -8
- cirq/contrib/acquaintance/bipartite_test.py +18 -13
- cirq/contrib/acquaintance/devices.py +2 -2
- cirq/contrib/acquaintance/devices_test.py +5 -3
- cirq/contrib/acquaintance/executor.py +5 -5
- cirq/contrib/acquaintance/executor_test.py +13 -9
- cirq/contrib/acquaintance/gates.py +18 -28
- cirq/contrib/acquaintance/gates_test.py +24 -20
- cirq/contrib/acquaintance/inspection_utils.py +8 -4
- cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
- cirq/contrib/acquaintance/mutation_utils.py +4 -4
- cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
- cirq/contrib/acquaintance/optimizers.py +4 -4
- cirq/contrib/acquaintance/optimizers_test.py +4 -1
- cirq/contrib/acquaintance/permutation.py +15 -27
- cirq/contrib/acquaintance/permutation_test.py +26 -17
- cirq/contrib/acquaintance/shift.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network.py +4 -4
- cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
- cirq/contrib/acquaintance/shift_test.py +8 -6
- cirq/contrib/acquaintance/strategies/cubic.py +2 -2
- cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
- cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
- cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
- cirq/contrib/acquaintance/testing.py +2 -0
- cirq/contrib/acquaintance/topological_sort.py +2 -2
- cirq/contrib/acquaintance/topological_sort_test.py +3 -1
- cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
- cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
- cirq/contrib/circuitdag/circuit_dag.py +4 -4
- cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
- cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
- cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
- cirq/contrib/graph_device/graph_device.py +12 -11
- cirq/contrib/graph_device/graph_device_test.py +18 -14
- cirq/contrib/graph_device/hypergraph.py +16 -14
- cirq/contrib/graph_device/hypergraph_test.py +13 -11
- cirq/contrib/graph_device/uniform_graph_device.py +6 -4
- cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
- cirq/contrib/hacks/disable_validation.py +6 -1
- cirq/contrib/hacks/disable_validation_test.py +3 -1
- cirq/contrib/json.py +31 -5
- cirq/contrib/json_test.py +6 -3
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
- cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
- cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
- cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
- cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
- cirq/contrib/json_test_data/__init__.py +17 -0
- cirq/contrib/json_test_data/spec.py +32 -0
- cirq/contrib/noise_models/noise_models.py +119 -5
- cirq/contrib/noise_models/noise_models_test.py +37 -9
- cirq/contrib/paulistring/clifford_optimize.py +6 -4
- cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
- cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
- cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
- cirq/contrib/paulistring/optimize.py +2 -0
- cirq/contrib/paulistring/optimize_test.py +4 -3
- cirq/contrib/paulistring/pauli_string_dag.py +2 -0
- cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
- cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
- cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
- cirq/contrib/paulistring/recombine.py +6 -4
- cirq/contrib/paulistring/recombine_test.py +3 -1
- cirq/contrib/paulistring/separate.py +9 -6
- cirq/contrib/paulistring/separate_test.py +3 -1
- cirq/contrib/qasm_import/_lexer.py +3 -2
- cirq/contrib/qasm_import/_lexer_test.py +49 -13
- cirq/contrib/qasm_import/_parser.py +547 -83
- cirq/contrib/qasm_import/_parser_test.py +988 -97
- cirq/contrib/qasm_import/exception.py +2 -0
- cirq/contrib/qasm_import/qasm.py +8 -2
- cirq/contrib/qasm_import/qasm_test.py +7 -4
- cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
- cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
- cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
- cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
- cirq/contrib/qcircuit/qcircuit_test.py +10 -8
- cirq/contrib/quantum_volume/quantum_volume.py +31 -27
- cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
- cirq/contrib/quimb/density_matrix.py +15 -14
- cirq/contrib/quimb/density_matrix_test.py +10 -7
- cirq/contrib/quimb/grid_circuits.py +5 -2
- cirq/contrib/quimb/grid_circuits_test.py +3 -0
- cirq/contrib/quimb/mps_simulator.py +20 -20
- cirq/contrib/quimb/mps_simulator_test.py +3 -0
- cirq/contrib/quimb/state_vector.py +12 -11
- cirq/contrib/quimb/state_vector_test.py +3 -0
- cirq/contrib/quirk/export_to_quirk.py +5 -3
- cirq/contrib/quirk/export_to_quirk_test.py +18 -16
- cirq/contrib/quirk/linearize_circuit.py +2 -0
- cirq/contrib/quirk/quirk_gate.py +18 -17
- cirq/contrib/routing/device.py +5 -3
- cirq/contrib/routing/device_test.py +2 -0
- cirq/contrib/routing/greedy.py +10 -21
- cirq/contrib/routing/greedy_test.py +4 -2
- cirq/contrib/routing/initialization.py +2 -2
- cirq/contrib/routing/initialization_test.py +5 -3
- cirq/contrib/routing/router.py +9 -5
- cirq/contrib/routing/router_test.py +2 -0
- cirq/contrib/routing/swap_network.py +3 -3
- cirq/contrib/routing/swap_network_test.py +3 -1
- cirq/contrib/routing/utils.py +2 -2
- cirq/contrib/routing/utils_test.py +3 -0
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
- cirq/contrib/svg/svg.py +3 -3
- cirq/contrib/svg/svg_test.py +8 -5
- cirq/devices/device.py +4 -4
- cirq/devices/device_test.py +7 -4
- cirq/devices/grid_device_metadata.py +10 -10
- cirq/devices/grid_device_metadata_test.py +3 -0
- cirq/devices/grid_qubit.py +29 -21
- cirq/devices/grid_qubit_test.py +3 -0
- cirq/devices/insertion_noise_model.py +7 -7
- cirq/devices/insertion_noise_model_test.py +7 -5
- cirq/devices/line_qubit.py +13 -13
- cirq/devices/line_qubit_test.py +2 -0
- cirq/devices/named_topologies.py +18 -29
- cirq/devices/named_topologies_test.py +13 -10
- cirq/devices/noise_model.py +3 -3
- cirq/devices/noise_model_test.py +19 -15
- cirq/devices/noise_properties.py +15 -6
- cirq/devices/noise_properties_test.py +34 -3
- cirq/devices/noise_utils.py +11 -9
- cirq/devices/noise_utils_test.py +2 -0
- cirq/devices/superconducting_qubits_noise_properties.py +23 -22
- cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
- cirq/devices/thermal_noise_model.py +107 -37
- cirq/devices/thermal_noise_model_test.py +21 -0
- cirq/devices/unconstrained_device.py +5 -3
- cirq/devices/unconstrained_device_test.py +2 -0
- cirq/experiments/__init__.py +4 -2
- cirq/experiments/benchmarking/__init__.py +17 -0
- cirq/experiments/benchmarking/parallel_xeb.py +677 -0
- cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
- cirq/experiments/fidelity_estimation.py +14 -8
- cirq/experiments/fidelity_estimation_test.py +3 -0
- cirq/experiments/n_qubit_tomography.py +17 -16
- cirq/experiments/n_qubit_tomography_test.py +8 -5
- cirq/experiments/purity_estimation.py +2 -0
- cirq/experiments/purity_estimation_test.py +2 -0
- cirq/experiments/qubit_characterizations.py +207 -103
- cirq/experiments/qubit_characterizations_test.py +40 -12
- cirq/experiments/random_quantum_circuit_generation.py +56 -70
- cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
- cirq/experiments/readout_confusion_matrix.py +24 -22
- cirq/experiments/readout_confusion_matrix_test.py +2 -0
- cirq/experiments/single_qubit_readout_calibration.py +30 -15
- cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
- cirq/experiments/t1_decay_experiment.py +9 -7
- cirq/experiments/t1_decay_experiment_test.py +13 -11
- cirq/experiments/t2_decay_experiment.py +16 -13
- cirq/experiments/t2_decay_experiment_test.py +2 -0
- cirq/experiments/two_qubit_xeb.py +64 -57
- cirq/experiments/two_qubit_xeb_test.py +10 -6
- cirq/experiments/xeb_fitting.py +39 -35
- cirq/experiments/xeb_sampling.py +37 -44
- cirq/experiments/xeb_sampling_test.py +3 -0
- cirq/experiments/xeb_simulation.py +14 -10
- cirq/experiments/xeb_simulation_test.py +5 -5
- cirq/experiments/z_phase_calibration.py +32 -29
- cirq/experiments/z_phase_calibration_test.py +3 -4
- cirq/interop/quirk/cells/__init__.py +1 -1
- cirq/interop/quirk/cells/all_cells.py +7 -2
- cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
- cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
- cirq/interop/quirk/cells/cell.py +19 -28
- cirq/interop/quirk/cells/cell_test.py +3 -0
- cirq/interop/quirk/cells/composite_cell.py +13 -28
- cirq/interop/quirk/cells/composite_cell_test.py +2 -0
- cirq/interop/quirk/cells/control_cells.py +15 -15
- cirq/interop/quirk/cells/control_cells_test.py +7 -5
- cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
- cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
- cirq/interop/quirk/cells/ignored_cells.py +3 -0
- cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
- cirq/interop/quirk/cells/input_cells.py +7 -5
- cirq/interop/quirk/cells/input_cells_test.py +7 -5
- cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
- cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
- cirq/interop/quirk/cells/measurement_cells.py +5 -2
- cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
- cirq/interop/quirk/cells/parse.py +22 -23
- cirq/interop/quirk/cells/parse_test.py +12 -10
- cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
- cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
- cirq/interop/quirk/cells/scalar_cells.py +4 -1
- cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
- cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
- cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
- cirq/interop/quirk/cells/swap_cell.py +8 -6
- cirq/interop/quirk/cells/swap_cell_test.py +6 -4
- cirq/interop/quirk/cells/testing.py +6 -6
- cirq/interop/quirk/cells/testing_test.py +8 -6
- cirq/interop/quirk/cells/unsupported_cells.py +3 -0
- cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
- cirq/interop/quirk/url_to_circuit.py +23 -36
- cirq/interop/quirk/url_to_circuit_test.py +4 -1
- cirq/json_resolver_cache.py +14 -12
- cirq/linalg/__init__.py +4 -6
- cirq/linalg/combinators.py +7 -5
- cirq/linalg/combinators_test.py +10 -7
- cirq/linalg/decompositions.py +24 -35
- cirq/linalg/decompositions_test.py +3 -1
- cirq/linalg/diagonalize.py +6 -4
- cirq/linalg/diagonalize_test.py +15 -14
- cirq/linalg/operator_spaces.py +14 -14
- cirq/linalg/operator_spaces_test.py +13 -11
- cirq/linalg/predicates.py +18 -9
- cirq/linalg/predicates_test.py +5 -0
- cirq/linalg/tolerance.py +6 -3
- cirq/linalg/tolerance_test.py +6 -4
- cirq/linalg/transformations.py +23 -20
- cirq/linalg/transformations_test.py +73 -43
- cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
- cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
- cirq/neutral_atoms/neutral_atom_devices.py +2 -0
- cirq/ops/__init__.py +2 -0
- cirq/ops/arithmetic_operation.py +21 -21
- cirq/ops/arithmetic_operation_test.py +7 -8
- cirq/ops/boolean_hamiltonian.py +23 -22
- cirq/ops/boolean_hamiltonian_test.py +12 -9
- cirq/ops/classically_controlled_operation.py +31 -36
- cirq/ops/classically_controlled_operation_test.py +121 -117
- cirq/ops/clifford_gate.py +98 -81
- cirq/ops/clifford_gate_test.py +72 -57
- cirq/ops/common_channels.py +44 -44
- cirq/ops/common_channels_test.py +83 -81
- cirq/ops/common_gate_families.py +9 -7
- cirq/ops/common_gate_families_test.py +11 -7
- cirq/ops/common_gates.py +164 -183
- cirq/ops/common_gates_test.py +135 -95
- cirq/ops/control_values.py +23 -26
- cirq/ops/control_values_test.py +22 -20
- cirq/ops/controlled_gate.py +64 -112
- cirq/ops/controlled_gate_test.py +130 -35
- cirq/ops/controlled_operation.py +24 -35
- cirq/ops/controlled_operation_test.py +8 -6
- cirq/ops/dense_pauli_string.py +38 -49
- cirq/ops/dense_pauli_string_test.py +4 -2
- cirq/ops/diagonal_gate.py +18 -31
- cirq/ops/diagonal_gate_test.py +13 -13
- cirq/ops/eigen_gate.py +29 -29
- cirq/ops/eigen_gate_test.py +45 -28
- cirq/ops/fourier_transform.py +14 -20
- cirq/ops/fourier_transform_test.py +15 -12
- cirq/ops/fsim_gate.py +43 -42
- cirq/ops/fsim_gate_test.py +29 -29
- cirq/ops/gate_features.py +2 -0
- cirq/ops/gate_features_test.py +5 -3
- cirq/ops/gate_operation.py +43 -65
- cirq/ops/gate_operation_test.py +46 -42
- cirq/ops/gateset.py +28 -40
- cirq/ops/gateset_test.py +4 -2
- cirq/ops/global_phase_op.py +45 -20
- cirq/ops/global_phase_op_test.py +44 -20
- cirq/ops/greedy_qubit_manager.py +10 -8
- cirq/ops/greedy_qubit_manager_test.py +5 -3
- cirq/ops/identity.py +14 -12
- cirq/ops/identity_test.py +24 -20
- cirq/ops/kraus_channel.py +11 -8
- cirq/ops/kraus_channel_test.py +14 -11
- cirq/ops/linear_combinations.py +65 -77
- cirq/ops/linear_combinations_test.py +14 -9
- cirq/ops/matrix_gates.py +21 -18
- cirq/ops/matrix_gates_test.py +16 -0
- cirq/ops/measure_util.py +15 -20
- cirq/ops/measure_util_test.py +2 -0
- cirq/ops/measurement_gate.py +26 -37
- cirq/ops/measurement_gate_test.py +2 -0
- cirq/ops/mixed_unitary_channel.py +12 -9
- cirq/ops/mixed_unitary_channel_test.py +14 -11
- cirq/ops/named_qubit.py +16 -13
- cirq/ops/named_qubit_test.py +15 -13
- cirq/ops/op_tree.py +9 -7
- cirq/ops/op_tree_test.py +22 -19
- cirq/ops/parallel_gate.py +15 -17
- cirq/ops/parallel_gate_test.py +18 -16
- cirq/ops/parity_gates.py +23 -25
- cirq/ops/parity_gates_test.py +36 -32
- cirq/ops/pauli_gates.py +22 -21
- cirq/ops/pauli_gates_test.py +29 -20
- cirq/ops/pauli_interaction_gate.py +15 -19
- cirq/ops/pauli_interaction_gate_test.py +10 -8
- cirq/ops/pauli_measurement_gate.py +23 -35
- cirq/ops/pauli_measurement_gate_test.py +2 -0
- cirq/ops/pauli_string.py +92 -120
- cirq/ops/pauli_string_phasor.py +52 -45
- cirq/ops/pauli_string_phasor_test.py +4 -5
- cirq/ops/pauli_string_raw_types.py +9 -7
- cirq/ops/pauli_string_raw_types_test.py +2 -0
- cirq/ops/pauli_string_test.py +31 -154
- cirq/ops/pauli_sum_exponential.py +12 -12
- cirq/ops/pauli_sum_exponential_test.py +12 -10
- cirq/ops/permutation_gate.py +8 -6
- cirq/ops/permutation_gate_test.py +10 -8
- cirq/ops/phased_iswap_gate.py +16 -16
- cirq/ops/phased_iswap_gate_test.py +17 -15
- cirq/ops/phased_x_gate.py +16 -17
- cirq/ops/phased_x_gate_test.py +18 -16
- cirq/ops/phased_x_z_gate.py +24 -22
- cirq/ops/phased_x_z_gate_test.py +17 -11
- cirq/ops/projector.py +16 -11
- cirq/ops/projector_test.py +19 -16
- cirq/ops/qid_util.py +7 -5
- cirq/ops/qid_util_test.py +2 -0
- cirq/ops/qubit_manager.py +11 -9
- cirq/ops/qubit_manager_test.py +6 -4
- cirq/ops/qubit_order.py +11 -14
- cirq/ops/qubit_order_or_list.py +4 -2
- cirq/ops/qubit_order_test.py +12 -10
- cirq/ops/random_gate_channel.py +12 -10
- cirq/ops/random_gate_channel_test.py +14 -11
- cirq/ops/raw_types.py +109 -129
- cirq/ops/raw_types_test.py +63 -57
- cirq/ops/state_preparation_channel.py +7 -7
- cirq/ops/state_preparation_channel_test.py +11 -9
- cirq/ops/swap_gates.py +13 -15
- cirq/ops/swap_gates_test.py +19 -17
- cirq/ops/tags.py +5 -3
- cirq/ops/tags_test.py +4 -2
- cirq/ops/three_qubit_gates.py +43 -76
- cirq/ops/three_qubit_gates_test.py +19 -17
- cirq/ops/two_qubit_diagonal_gate.py +13 -13
- cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
- cirq/ops/uniform_superposition_gate.py +5 -3
- cirq/ops/uniform_superposition_gate_test.py +5 -3
- cirq/ops/wait_gate.py +17 -14
- cirq/ops/wait_gate_test.py +9 -6
- cirq/protocols/__init__.py +0 -3
- cirq/protocols/act_on_protocol.py +8 -6
- cirq/protocols/act_on_protocol_test.py +15 -12
- cirq/protocols/apply_channel_protocol.py +10 -14
- cirq/protocols/apply_channel_protocol_test.py +2 -0
- cirq/protocols/apply_mixture_protocol.py +13 -42
- cirq/protocols/apply_mixture_protocol_test.py +7 -5
- cirq/protocols/apply_unitary_protocol.py +39 -34
- cirq/protocols/apply_unitary_protocol_test.py +4 -1
- cirq/protocols/approximate_equality_protocol.py +2 -0
- cirq/protocols/approximate_equality_protocol_test.py +2 -0
- cirq/protocols/circuit_diagram_info_protocol.py +58 -42
- cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
- cirq/protocols/commutes_protocol.py +8 -7
- cirq/protocols/commutes_protocol_test.py +2 -0
- cirq/protocols/control_key_protocol.py +6 -4
- cirq/protocols/control_key_protocol_test.py +3 -1
- cirq/protocols/decompose_protocol.py +49 -48
- cirq/protocols/decompose_protocol_test.py +27 -16
- cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
- cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
- cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
- cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
- cirq/protocols/has_unitary_protocol.py +10 -6
- cirq/protocols/has_unitary_protocol_test.py +13 -8
- cirq/protocols/hash_from_pickle_test.py +2 -11
- cirq/protocols/inverse_protocol.py +13 -16
- cirq/protocols/inverse_protocol_test.py +5 -3
- cirq/protocols/json_serialization.py +35 -54
- cirq/protocols/json_serialization_test.py +14 -21
- cirq/protocols/json_test_data/CXSWAP.json +46 -0
- cirq/protocols/json_test_data/CXSWAP.repr +13 -0
- cirq/protocols/json_test_data/CZSWAP.json +46 -0
- cirq/protocols/json_test_data/CZSWAP.repr +13 -0
- cirq/protocols/json_test_data/CircuitOperation.json +6 -3
- cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
- cirq/protocols/json_test_data/Moment.json +24 -1
- cirq/protocols/json_test_data/Moment.repr +6 -1
- cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
- cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
- cirq/protocols/json_test_data/spec.py +6 -2
- cirq/protocols/kraus_protocol.py +47 -7
- cirq/protocols/kraus_protocol_test.py +86 -12
- cirq/protocols/measurement_key_protocol.py +15 -16
- cirq/protocols/measurement_key_protocol_test.py +13 -11
- cirq/protocols/mixture_protocol.py +7 -5
- cirq/protocols/mixture_protocol_test.py +4 -2
- cirq/protocols/mul_protocol.py +2 -3
- cirq/protocols/mul_protocol_test.py +2 -0
- cirq/protocols/pauli_expansion_protocol.py +6 -3
- cirq/protocols/pauli_expansion_protocol_test.py +5 -3
- cirq/protocols/phase_protocol.py +2 -0
- cirq/protocols/phase_protocol_test.py +3 -1
- cirq/protocols/pow_protocol.py +11 -16
- cirq/protocols/pow_protocol_test.py +2 -0
- cirq/protocols/qasm.py +14 -20
- cirq/protocols/qasm_test.py +6 -3
- cirq/protocols/qid_shape_protocol.py +8 -8
- cirq/protocols/qid_shape_protocol_test.py +3 -1
- cirq/protocols/resolve_parameters.py +5 -3
- cirq/protocols/resolve_parameters_test.py +8 -7
- cirq/protocols/trace_distance_bound.py +6 -4
- cirq/protocols/trace_distance_bound_test.py +3 -1
- cirq/protocols/unitary_protocol.py +17 -7
- cirq/protocols/unitary_protocol_test.py +12 -2
- cirq/qis/channels.py +6 -2
- cirq/qis/channels_test.py +20 -16
- cirq/qis/clifford_tableau.py +21 -19
- cirq/qis/clifford_tableau_test.py +2 -2
- cirq/qis/entropy.py +14 -3
- cirq/qis/entropy_test.py +3 -1
- cirq/qis/measures.py +13 -13
- cirq/qis/measures_test.py +20 -14
- cirq/qis/noise_utils.py +2 -0
- cirq/qis/noise_utils_test.py +9 -7
- cirq/qis/quantum_state_representation.py +7 -8
- cirq/qis/states.py +58 -56
- cirq/qis/states_test.py +2 -0
- cirq/sim/classical_simulator.py +23 -22
- cirq/sim/classical_simulator_test.py +2 -0
- cirq/sim/clifford/clifford_simulator.py +23 -21
- cirq/sim/clifford/clifford_simulator_test.py +7 -4
- cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
- cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
- cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
- cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
- cirq/sim/clifford/stabilizer_sampler.py +9 -7
- cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
- cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
- cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
- cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
- cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
- cirq/sim/density_matrix_simulation_state.py +26 -27
- cirq/sim/density_matrix_simulation_state_test.py +10 -8
- cirq/sim/density_matrix_simulator.py +30 -28
- cirq/sim/density_matrix_simulator_test.py +48 -48
- cirq/sim/density_matrix_utils.py +13 -11
- cirq/sim/density_matrix_utils_test.py +38 -36
- cirq/sim/mux.py +33 -31
- cirq/sim/mux_test.py +3 -0
- cirq/sim/simulation_product_state.py +15 -15
- cirq/sim/simulation_product_state_test.py +29 -26
- cirq/sim/simulation_state.py +29 -38
- cirq/sim/simulation_state_base.py +21 -32
- cirq/sim/simulation_state_test.py +15 -13
- cirq/sim/simulation_utils.py +5 -2
- cirq/sim/simulation_utils_test.py +5 -2
- cirq/sim/simulator.py +90 -106
- cirq/sim/simulator_base.py +33 -45
- cirq/sim/simulator_base_test.py +20 -15
- cirq/sim/simulator_test.py +23 -14
- cirq/sim/sparse_simulator.py +19 -17
- cirq/sim/sparse_simulator_test.py +41 -40
- cirq/sim/state_vector.py +15 -12
- cirq/sim/state_vector_simulation_state.py +31 -31
- cirq/sim/state_vector_simulation_state_test.py +16 -14
- cirq/sim/state_vector_simulator.py +17 -14
- cirq/sim/state_vector_simulator_test.py +2 -0
- cirq/sim/state_vector_test.py +6 -3
- cirq/study/flatten_expressions.py +16 -15
- cirq/study/flatten_expressions_test.py +13 -11
- cirq/study/resolver.py +18 -17
- cirq/study/resolver_test.py +22 -20
- cirq/study/result.py +17 -27
- cirq/study/result_test.py +2 -0
- cirq/study/sweepable.py +12 -10
- cirq/study/sweepable_test.py +3 -0
- cirq/study/sweeps.py +42 -61
- cirq/study/sweeps_test.py +33 -0
- cirq/testing/__init__.py +7 -11
- cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
- cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
- cirq/testing/circuit_compare.py +8 -17
- cirq/testing/circuit_compare_test.py +2 -0
- cirq/testing/consistent_act_on.py +13 -11
- cirq/testing/consistent_act_on_test.py +5 -3
- cirq/testing/consistent_channels.py +2 -0
- cirq/testing/consistent_channels_test.py +10 -8
- cirq/testing/consistent_controlled_gate_op.py +5 -5
- cirq/testing/consistent_controlled_gate_op_test.py +18 -18
- cirq/testing/consistent_decomposition.py +2 -2
- cirq/testing/consistent_decomposition_test.py +4 -2
- cirq/testing/consistent_pauli_expansion.py +2 -0
- cirq/testing/consistent_pauli_expansion_test.py +3 -1
- cirq/testing/consistent_phase_by.py +2 -0
- cirq/testing/consistent_phase_by_test.py +3 -1
- cirq/testing/consistent_protocols.py +14 -20
- cirq/testing/consistent_protocols_test.py +13 -11
- cirq/testing/consistent_qasm.py +6 -4
- cirq/testing/consistent_qasm_test.py +7 -7
- cirq/testing/consistent_resolve_parameters.py +2 -0
- cirq/testing/consistent_specified_has_unitary.py +2 -2
- cirq/testing/consistent_specified_has_unitary_test.py +6 -4
- cirq/testing/consistent_unitary.py +1 -0
- cirq/testing/consistent_unitary_test.py +4 -2
- cirq/testing/deprecation.py +5 -2
- cirq/testing/deprecation_test.py +5 -2
- cirq/testing/devices.py +7 -4
- cirq/testing/devices_test.py +7 -4
- cirq/testing/equals_tester.py +4 -2
- cirq/testing/equals_tester_test.py +21 -17
- cirq/testing/equivalent_basis_map.py +6 -4
- cirq/testing/equivalent_basis_map_test.py +6 -4
- cirq/testing/equivalent_repr_eval.py +6 -4
- cirq/testing/equivalent_repr_eval_test.py +5 -3
- cirq/testing/gate_features.py +2 -0
- cirq/testing/gate_features_test.py +7 -5
- cirq/testing/json.py +19 -15
- cirq/testing/json_test.py +5 -3
- cirq/testing/lin_alg_utils.py +10 -11
- cirq/testing/lin_alg_utils_test.py +14 -12
- cirq/testing/logs.py +7 -6
- cirq/testing/logs_test.py +9 -7
- cirq/testing/no_identifier_qubit.py +4 -2
- cirq/testing/no_identifier_qubit_test.py +5 -3
- cirq/testing/op_tree.py +2 -0
- cirq/testing/op_tree_test.py +4 -1
- cirq/testing/order_tester.py +2 -0
- cirq/testing/order_tester_test.py +8 -6
- cirq/testing/pytest_utils.py +2 -0
- cirq/testing/pytest_utils_test.py +4 -2
- cirq/testing/random_circuit.py +21 -20
- cirq/testing/random_circuit_test.py +12 -9
- cirq/testing/repr_pretty_tester.py +1 -0
- cirq/testing/repr_pretty_tester_test.py +5 -3
- cirq/testing/routing_devices.py +4 -1
- cirq/testing/routing_devices_test.py +9 -6
- cirq/testing/sample_circuits.py +4 -1
- cirq/testing/sample_circuits_test.py +3 -1
- cirq/testing/sample_gates.py +3 -0
- cirq/testing/sample_gates_test.py +5 -2
- cirq/transformers/__init__.py +11 -4
- cirq/transformers/align.py +9 -7
- cirq/transformers/align_test.py +2 -0
- cirq/transformers/analytical_decompositions/__init__.py +3 -6
- cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
- cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
- cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
- cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
- cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
- cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
- cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
- cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
- cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
- cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
- cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
- cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
- cirq/transformers/drop_empty_moments.py +5 -3
- cirq/transformers/drop_empty_moments_test.py +4 -2
- cirq/transformers/drop_negligible_operations.py +7 -5
- cirq/transformers/drop_negligible_operations_test.py +2 -0
- cirq/transformers/dynamical_decoupling.py +49 -42
- cirq/transformers/dynamical_decoupling_test.py +223 -205
- cirq/transformers/eject_phased_paulis.py +28 -26
- cirq/transformers/eject_phased_paulis_test.py +12 -9
- cirq/transformers/eject_z.py +12 -12
- cirq/transformers/eject_z_test.py +2 -2
- cirq/transformers/expand_composite.py +6 -4
- cirq/transformers/expand_composite_test.py +3 -1
- cirq/transformers/gauge_compiling/__init__.py +3 -1
- cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
- cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
- cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
- cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
- cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
- cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
- cirq/transformers/insertion_sort.py +8 -6
- cirq/transformers/insertion_sort_test.py +3 -1
- cirq/transformers/measurement_transformers.py +29 -29
- cirq/transformers/measurement_transformers_test.py +2 -0
- cirq/transformers/merge_k_qubit_gates.py +12 -10
- cirq/transformers/merge_k_qubit_gates_test.py +18 -18
- cirq/transformers/merge_single_qubit_gates.py +197 -20
- cirq/transformers/merge_single_qubit_gates_test.py +177 -5
- cirq/transformers/noise_adding.py +5 -3
- cirq/transformers/noise_adding_test.py +2 -0
- cirq/transformers/optimize_for_target_gateset.py +19 -17
- cirq/transformers/optimize_for_target_gateset_test.py +11 -8
- cirq/transformers/qubit_management_transformers.py +13 -11
- cirq/transformers/qubit_management_transformers_test.py +5 -3
- cirq/transformers/randomized_measurements.py +16 -14
- cirq/transformers/randomized_measurements_test.py +10 -4
- cirq/transformers/routing/initial_mapper.py +6 -4
- cirq/transformers/routing/initial_mapper_test.py +2 -0
- cirq/transformers/routing/line_initial_mapper.py +16 -14
- cirq/transformers/routing/line_initial_mapper_test.py +9 -7
- cirq/transformers/routing/mapping_manager.py +10 -10
- cirq/transformers/routing/mapping_manager_test.py +2 -0
- cirq/transformers/routing/route_circuit_cqc.py +33 -31
- cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
- cirq/transformers/routing/visualize_routed_circuit.py +8 -7
- cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
- cirq/transformers/stratify.py +17 -15
- cirq/transformers/stratify_test.py +3 -0
- cirq/transformers/symbolize.py +103 -0
- cirq/transformers/symbolize_test.py +62 -0
- cirq/transformers/synchronize_terminal_measurements.py +10 -10
- cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
- cirq/transformers/tag_transformers.py +97 -0
- cirq/transformers/tag_transformers_test.py +103 -0
- cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
- cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
- cirq/transformers/target_gatesets/cz_gateset.py +7 -5
- cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
- cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
- cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
- cirq/transformers/transformer_api.py +34 -47
- cirq/transformers/transformer_api_test.py +9 -8
- cirq/transformers/transformer_primitives.py +39 -49
- cirq/transformers/transformer_primitives_test.py +10 -17
- cirq/value/abc_alt.py +6 -4
- cirq/value/abc_alt_test.py +5 -3
- cirq/value/angle.py +11 -12
- cirq/value/angle_test.py +5 -3
- cirq/value/classical_data.py +27 -27
- cirq/value/classical_data_test.py +11 -8
- cirq/value/condition.py +26 -24
- cirq/value/condition_test.py +2 -0
- cirq/value/digits.py +14 -11
- cirq/value/digits_test.py +2 -0
- cirq/value/duration.py +23 -20
- cirq/value/duration_test.py +2 -0
- cirq/value/linear_dict.py +25 -30
- cirq/value/linear_dict_test.py +10 -8
- cirq/value/measurement_key.py +12 -12
- cirq/value/measurement_key_test.py +2 -0
- cirq/value/periodic_value.py +4 -4
- cirq/value/periodic_value_test.py +11 -7
- cirq/value/probability.py +3 -1
- cirq/value/probability_test.py +4 -2
- cirq/value/product_state.py +15 -13
- cirq/value/product_state_test.py +4 -1
- cirq/value/random_state.py +2 -0
- cirq/value/random_state_test.py +5 -3
- cirq/value/timestamp.py +11 -7
- cirq/value/timestamp_test.py +14 -12
- cirq/value/type_alias.py +4 -4
- cirq/value/value_equality_attr.py +8 -9
- cirq/value/value_equality_attr_test.py +14 -11
- cirq/vis/density_matrix.py +3 -3
- cirq/vis/density_matrix_test.py +20 -17
- cirq/vis/heatmap.py +24 -37
- cirq/vis/heatmap_test.py +3 -0
- cirq/vis/histogram.py +9 -6
- cirq/vis/histogram_test.py +5 -2
- cirq/vis/state_histogram.py +10 -8
- cirq/vis/state_histogram_test.py +7 -5
- cirq/vis/vis_utils.py +4 -1
- cirq/vis/vis_utils_test.py +4 -1
- cirq/work/collector.py +12 -18
- cirq/work/collector_test.py +15 -10
- cirq/work/observable_grouping.py +6 -7
- cirq/work/observable_grouping_test.py +10 -9
- cirq/work/observable_measurement.py +47 -45
- cirq/work/observable_measurement_data.py +22 -17
- cirq/work/observable_measurement_data_test.py +4 -1
- cirq/work/observable_measurement_test.py +48 -29
- cirq/work/observable_readout_calibration.py +5 -2
- cirq/work/observable_readout_calibration_test.py +5 -2
- cirq/work/observable_settings.py +13 -22
- cirq/work/observable_settings_test.py +9 -7
- cirq/work/pauli_sum_collector.py +12 -10
- cirq/work/pauli_sum_collector_test.py +9 -9
- cirq/work/sampler.py +42 -43
- cirq/work/sampler_test.py +31 -24
- cirq/work/zeros_sampler.py +6 -4
- cirq/work/zeros_sampler_test.py +7 -5
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
- cirq_core-1.6.0.dist-info/RECORD +1241 -0
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
- cirq_core-1.5.0.dev20250409222543.dist-info/RECORD +0 -1216
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
- {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
|
@@ -11,21 +11,12 @@
|
|
|
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
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
14
17
|
import json
|
|
15
18
|
import urllib.parse
|
|
16
|
-
from typing import
|
|
17
|
-
Any,
|
|
18
|
-
cast,
|
|
19
|
-
Dict,
|
|
20
|
-
Iterable,
|
|
21
|
-
List,
|
|
22
|
-
Mapping,
|
|
23
|
-
Optional,
|
|
24
|
-
Sequence,
|
|
25
|
-
Tuple,
|
|
26
|
-
TYPE_CHECKING,
|
|
27
|
-
Union,
|
|
28
|
-
)
|
|
19
|
+
from typing import Any, cast, Iterable, Mapping, Sequence, TYPE_CHECKING
|
|
29
20
|
|
|
30
21
|
import numpy as np
|
|
31
22
|
|
|
@@ -47,12 +38,10 @@ if TYPE_CHECKING:
|
|
|
47
38
|
def quirk_url_to_circuit(
|
|
48
39
|
quirk_url: str,
|
|
49
40
|
*,
|
|
50
|
-
qubits:
|
|
51
|
-
extra_cell_makers:
|
|
52
|
-
Dict[str, 'cirq.Gate'], Iterable['cirq.interop.quirk.cells.CellMaker']
|
|
53
|
-
] = (),
|
|
41
|
+
qubits: Sequence[cirq.Qid] | None = None,
|
|
42
|
+
extra_cell_makers: dict[str, cirq.Gate] | Iterable[cirq.interop.quirk.cells.CellMaker] = (),
|
|
54
43
|
max_operation_count: int = 10**6,
|
|
55
|
-
) ->
|
|
44
|
+
) -> cirq.Circuit:
|
|
56
45
|
"""Parses a Cirq circuit out of a Quirk URL.
|
|
57
46
|
|
|
58
47
|
Args:
|
|
@@ -150,13 +139,11 @@ def quirk_url_to_circuit(
|
|
|
150
139
|
def quirk_json_to_circuit(
|
|
151
140
|
data: dict,
|
|
152
141
|
*,
|
|
153
|
-
qubits:
|
|
154
|
-
extra_cell_makers:
|
|
155
|
-
|
|
156
|
-
] = (),
|
|
157
|
-
quirk_url: Optional[str] = None,
|
|
142
|
+
qubits: Sequence[cirq.Qid] | None = None,
|
|
143
|
+
extra_cell_makers: dict[str, cirq.Gate] | Iterable[cirq.interop.quirk.cells.CellMaker] = (),
|
|
144
|
+
quirk_url: str | None = None,
|
|
158
145
|
max_operation_count: int = 10**6,
|
|
159
|
-
) ->
|
|
146
|
+
) -> cirq.Circuit:
|
|
160
147
|
"""Constructs a Cirq circuit from Quirk's JSON format.
|
|
161
148
|
|
|
162
149
|
Args:
|
|
@@ -239,7 +226,7 @@ def quirk_json_to_circuit(
|
|
|
239
226
|
if qubits is not None:
|
|
240
227
|
qs = qubits
|
|
241
228
|
|
|
242
|
-
def map_qubit(qubit:
|
|
229
|
+
def map_qubit(qubit: cirq.Qid) -> cirq.Qid:
|
|
243
230
|
q = cast(devices.LineQubit, qubit)
|
|
244
231
|
if q.x >= len(qs):
|
|
245
232
|
raise IndexError(
|
|
@@ -255,9 +242,9 @@ def quirk_json_to_circuit(
|
|
|
255
242
|
|
|
256
243
|
|
|
257
244
|
def _parse_cols_into_composite_cell(
|
|
258
|
-
data:
|
|
245
|
+
data: dict[str, Any], registry: dict[str, CellMaker]
|
|
259
246
|
) -> CompositeCell:
|
|
260
|
-
if not isinstance(data,
|
|
247
|
+
if not isinstance(data, dict):
|
|
261
248
|
raise ValueError('Circuit JSON must be a dictionary.')
|
|
262
249
|
if 'cols' not in data:
|
|
263
250
|
raise ValueError(f'Circuit JSON dict must have a "cols" entry.\nJSON={data}')
|
|
@@ -266,7 +253,7 @@ def _parse_cols_into_composite_cell(
|
|
|
266
253
|
raise ValueError(f'Circuit JSON cols must be a list.\nJSON={data}')
|
|
267
254
|
|
|
268
255
|
# Parse column json into cells.
|
|
269
|
-
parsed_cols:
|
|
256
|
+
parsed_cols: list[list[Cell | None]] = []
|
|
270
257
|
height = 0
|
|
271
258
|
for i, col in enumerate(cols):
|
|
272
259
|
parsed_col, h = _parse_col_cells_with_height(registry, i, col)
|
|
@@ -300,8 +287,8 @@ def _parse_cols_into_composite_cell(
|
|
|
300
287
|
return CompositeCell(height, parsed_cols, gate_count=gate_count)
|
|
301
288
|
|
|
302
289
|
|
|
303
|
-
def _register_custom_gate(gate_json: Any, registry:
|
|
304
|
-
if not isinstance(gate_json,
|
|
290
|
+
def _register_custom_gate(gate_json: Any, registry: dict[str, CellMaker]):
|
|
291
|
+
if not isinstance(gate_json, dict):
|
|
305
292
|
raise ValueError(f'Custom gate json must be a dictionary.\nCustom gate json={gate_json!r}.')
|
|
306
293
|
|
|
307
294
|
if 'id' not in gate_json:
|
|
@@ -343,11 +330,11 @@ def _register_custom_gate(gate_json: Any, registry: Dict[str, CellMaker]):
|
|
|
343
330
|
)
|
|
344
331
|
|
|
345
332
|
|
|
346
|
-
def _init_ops(data:
|
|
333
|
+
def _init_ops(data: dict[str, Any]) -> cirq.OP_TREE:
|
|
347
334
|
if 'init' not in data:
|
|
348
335
|
return []
|
|
349
336
|
init = data['init']
|
|
350
|
-
if not isinstance(init,
|
|
337
|
+
if not isinstance(init, list):
|
|
351
338
|
raise ValueError(f'Circuit JSON init must be a list but was {init!r}.')
|
|
352
339
|
init_ops = []
|
|
353
340
|
for i in range(len(init)):
|
|
@@ -371,8 +358,8 @@ def _init_ops(data: Dict[str, Any]) -> 'cirq.OP_TREE':
|
|
|
371
358
|
|
|
372
359
|
|
|
373
360
|
def _parse_col_cells_with_height(
|
|
374
|
-
registry:
|
|
375
|
-
) ->
|
|
361
|
+
registry: dict[str, CellMaker], col: int, col_data: Any
|
|
362
|
+
) -> tuple[list[Cell | None], int]:
|
|
376
363
|
if not isinstance(col_data, list):
|
|
377
364
|
raise ValueError(f'col must be a list.\ncol: {col_data!r}')
|
|
378
365
|
result = []
|
|
@@ -385,8 +372,8 @@ def _parse_col_cells_with_height(
|
|
|
385
372
|
|
|
386
373
|
|
|
387
374
|
def _parse_cell_with_height(
|
|
388
|
-
registry:
|
|
389
|
-
) ->
|
|
375
|
+
registry: dict[str, CellMaker], row: int, col: int, entry: Any
|
|
376
|
+
) -> tuple[Cell | None, int]:
|
|
390
377
|
if entry == 1:
|
|
391
378
|
return None, 0
|
|
392
379
|
|
|
@@ -11,6 +11,9 @@
|
|
|
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
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
14
17
|
import json
|
|
15
18
|
import urllib
|
|
16
19
|
|
|
@@ -353,7 +356,7 @@ def test_example_qft_circuit():
|
|
|
353
356
|
6: ───┼───×─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────@^0.016───@^0.031───@^(1/16)───@^(1/8)───@^0.25───@^0.5───H───┼─────────┼─────────┼─────────┼──────────┼─────────┼────────@───────────
|
|
354
357
|
│ │ │ │ │ │ │ │
|
|
355
358
|
7: ───×───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────@^0.008───@^0.016───@^0.031───@^(1/16)───@^(1/8)───@^0.25───@^0.5───H───
|
|
356
|
-
"""
|
|
359
|
+
""" # noqa: E501
|
|
357
360
|
|
|
358
361
|
qft_example_json = (
|
|
359
362
|
'{"cols":['
|
cirq/json_resolver_cache.py
CHANGED
|
@@ -12,16 +12,18 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
"""Methods for resolving JSON types during serialization."""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
15
18
|
import datetime
|
|
16
19
|
import functools
|
|
17
|
-
from typing import
|
|
18
|
-
|
|
19
|
-
from cirq.protocols.json_serialization import ObjectFactory
|
|
20
|
+
from typing import NamedTuple, TYPE_CHECKING
|
|
20
21
|
|
|
21
22
|
if TYPE_CHECKING:
|
|
22
23
|
import cirq
|
|
23
24
|
import cirq.devices.unconstrained_device
|
|
24
25
|
import cirq.ops.pauli_gates
|
|
26
|
+
from cirq.protocols.json_serialization import ObjectFactory
|
|
25
27
|
|
|
26
28
|
|
|
27
29
|
# Needed for backwards compatible named tuples of CrossEntropyResult
|
|
@@ -30,23 +32,23 @@ SpecklePurityPair = NamedTuple('SpecklePurityPair', [('num_cycle', int), ('purit
|
|
|
30
32
|
CrossEntropyResult = NamedTuple(
|
|
31
33
|
'CrossEntropyResult',
|
|
32
34
|
[
|
|
33
|
-
('data',
|
|
35
|
+
('data', list[CrossEntropyPair]),
|
|
34
36
|
('repetitions', int),
|
|
35
|
-
('purity_data',
|
|
37
|
+
('purity_data', list[SpecklePurityPair] | None),
|
|
36
38
|
],
|
|
37
39
|
)
|
|
38
40
|
CrossEntropyResultDict = NamedTuple(
|
|
39
|
-
'CrossEntropyResultDict', [('results',
|
|
41
|
+
'CrossEntropyResultDict', [('results', dict[tuple['cirq.Qid', ...], CrossEntropyResult])]
|
|
40
42
|
)
|
|
41
43
|
|
|
42
44
|
|
|
43
45
|
@functools.lru_cache()
|
|
44
|
-
def _class_resolver_dictionary() ->
|
|
46
|
+
def _class_resolver_dictionary() -> dict[str, ObjectFactory]:
|
|
45
47
|
import numpy as np
|
|
46
48
|
import pandas as pd
|
|
47
49
|
|
|
48
50
|
import cirq
|
|
49
|
-
from cirq.devices import InsertionNoiseModel
|
|
51
|
+
from cirq.devices import InsertionNoiseModel, NoiseModelFromNoiseProperties, ThermalNoiseModel
|
|
50
52
|
from cirq.devices.noise_model import _NoNoiseModel
|
|
51
53
|
from cirq.experiments import GridInteractionLayer
|
|
52
54
|
from cirq.ops import raw_types
|
|
@@ -80,7 +82,7 @@ def _class_resolver_dictionary() -> Dict[str, ObjectFactory]:
|
|
|
80
82
|
)
|
|
81
83
|
|
|
82
84
|
def _cross_entropy_result_dict(
|
|
83
|
-
results:
|
|
85
|
+
results: list[tuple[list[cirq.Qid], CrossEntropyResult]], **kwargs
|
|
84
86
|
) -> CrossEntropyResultDict:
|
|
85
87
|
return CrossEntropyResultDict(results={tuple(qubits): result for qubits, result in results})
|
|
86
88
|
|
|
@@ -173,6 +175,7 @@ def _class_resolver_dictionary() -> Dict[str, ObjectFactory]:
|
|
|
173
175
|
'NamedQubit': cirq.NamedQubit,
|
|
174
176
|
'NamedQid': cirq.NamedQid,
|
|
175
177
|
'NoIdentifierQubit': cirq.testing.NoIdentifierQubit,
|
|
178
|
+
'NoiseModelFromNoiseProperties': NoiseModelFromNoiseProperties,
|
|
176
179
|
'ObservableMeasuredResult': cirq.work.ObservableMeasuredResult,
|
|
177
180
|
'OpIdentifier': cirq.OpIdentifier,
|
|
178
181
|
'ParamResolver': cirq.ParamResolver,
|
|
@@ -224,6 +227,7 @@ def _class_resolver_dictionary() -> Dict[str, ObjectFactory]:
|
|
|
224
227
|
'SympyCondition': cirq.SympyCondition,
|
|
225
228
|
'TaggedOperation': cirq.TaggedOperation,
|
|
226
229
|
'TensoredConfusionMatrices': cirq.TensoredConfusionMatrices,
|
|
230
|
+
'ThermalNoiseModel': ThermalNoiseModel,
|
|
227
231
|
'TiltedSquareLattice': cirq.TiltedSquareLattice,
|
|
228
232
|
'ThreeQubitDiagonalGate': cirq.ThreeQubitDiagonalGate,
|
|
229
233
|
'TrialResult': cirq.ResultDict, # keep support for Cirq < 0.11.
|
|
@@ -235,9 +239,7 @@ def _class_resolver_dictionary() -> Dict[str, ObjectFactory]:
|
|
|
235
239
|
'VirtualTag': cirq.VirtualTag,
|
|
236
240
|
'WaitGate': cirq.WaitGate,
|
|
237
241
|
# The formatter keeps putting this back
|
|
238
|
-
#
|
|
239
|
-
'XEBPhasedFSimCharacterizationOptions': cirq.experiments.XEBPhasedFSimCharacterizationOptions,
|
|
240
|
-
# pylint: enable=line-too-long
|
|
242
|
+
'XEBPhasedFSimCharacterizationOptions': cirq.experiments.XEBPhasedFSimCharacterizationOptions, # noqa: E501
|
|
241
243
|
'_XEigenState': cirq.value.product_state._XEigenState,
|
|
242
244
|
'XPowGate': cirq.XPowGate,
|
|
243
245
|
'XXPowGate': cirq.XXPowGate,
|
cirq/linalg/__init__.py
CHANGED
|
@@ -26,7 +26,6 @@ from cirq.linalg.combinators import (
|
|
|
26
26
|
)
|
|
27
27
|
|
|
28
28
|
from cirq.linalg.decompositions import (
|
|
29
|
-
# pylint: disable=line-too-long
|
|
30
29
|
axis_angle as axis_angle,
|
|
31
30
|
AxisAngleDecomposition as AxisAngleDecomposition,
|
|
32
31
|
deconstruct_single_qubit_matrix_into_angles as deconstruct_single_qubit_matrix_into_angles,
|
|
@@ -39,15 +38,14 @@ from cirq.linalg.decompositions import (
|
|
|
39
38
|
map_eigenvalues as map_eigenvalues,
|
|
40
39
|
num_cnots_required as num_cnots_required,
|
|
41
40
|
unitary_eig as unitary_eig,
|
|
42
|
-
scatter_plot_normalized_kak_interaction_coefficients as scatter_plot_normalized_kak_interaction_coefficients,
|
|
41
|
+
scatter_plot_normalized_kak_interaction_coefficients as scatter_plot_normalized_kak_interaction_coefficients, # noqa: E501
|
|
43
42
|
so4_to_magic_su2s as so4_to_magic_su2s,
|
|
44
43
|
)
|
|
45
44
|
|
|
46
45
|
from cirq.linalg.diagonalize import (
|
|
47
|
-
#
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
diagonalize_real_symmetric_and_sorted_diagonal_matrices as diagonalize_real_symmetric_and_sorted_diagonal_matrices,
|
|
46
|
+
bidiagonalize_real_matrix_pair_with_symmetric_products as bidiagonalize_real_matrix_pair_with_symmetric_products, # noqa: E501
|
|
47
|
+
bidiagonalize_unitary_with_special_orthogonals as bidiagonalize_unitary_with_special_orthogonals, # noqa: E501
|
|
48
|
+
diagonalize_real_symmetric_and_sorted_diagonal_matrices as diagonalize_real_symmetric_and_sorted_diagonal_matrices, # noqa: E501
|
|
51
49
|
diagonalize_real_symmetric_matrix as diagonalize_real_symmetric_matrix,
|
|
52
50
|
)
|
|
53
51
|
|
cirq/linalg/combinators.py
CHANGED
|
@@ -14,8 +14,10 @@
|
|
|
14
14
|
|
|
15
15
|
"""Utility methods for combining matrices."""
|
|
16
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
17
19
|
import functools
|
|
18
|
-
from typing import TYPE_CHECKING
|
|
20
|
+
from typing import TYPE_CHECKING
|
|
19
21
|
|
|
20
22
|
import numpy as np
|
|
21
23
|
|
|
@@ -25,7 +27,7 @@ if TYPE_CHECKING:
|
|
|
25
27
|
from numpy.typing import ArrayLike, DTypeLike
|
|
26
28
|
|
|
27
29
|
|
|
28
|
-
def kron(*factors:
|
|
30
|
+
def kron(*factors: np.ndarray | complex, shape_len: int = 2) -> np.ndarray:
|
|
29
31
|
"""Computes the kronecker product of a sequence of values.
|
|
30
32
|
|
|
31
33
|
A *args version of lambda args: functools.reduce(np.kron, args).
|
|
@@ -56,7 +58,7 @@ document(
|
|
|
56
58
|
)
|
|
57
59
|
|
|
58
60
|
|
|
59
|
-
def kron_with_controls(*factors:
|
|
61
|
+
def kron_with_controls(*factors: np.ndarray | complex) -> np.ndarray:
|
|
60
62
|
"""Computes the kronecker product of a sequence of values and control tags.
|
|
61
63
|
|
|
62
64
|
Use `cirq.CONTROL_TAG` to represent controls. Any entry of the output
|
|
@@ -107,7 +109,7 @@ def kron_with_controls(*factors: Union[np.ndarray, complex]) -> np.ndarray:
|
|
|
107
109
|
return product
|
|
108
110
|
|
|
109
111
|
|
|
110
|
-
def dot(*values:
|
|
112
|
+
def dot(*values: ArrayLike) -> np.ndarray:
|
|
111
113
|
"""Computes the dot/matrix product of a sequence of values.
|
|
112
114
|
|
|
113
115
|
Performs the computation in serial order without regard to the matrix
|
|
@@ -136,7 +138,7 @@ def dot(*values: 'ArrayLike') -> np.ndarray:
|
|
|
136
138
|
return result
|
|
137
139
|
|
|
138
140
|
|
|
139
|
-
def _merge_dtypes(dtype1:
|
|
141
|
+
def _merge_dtypes(dtype1: DTypeLike, dtype2: DTypeLike) -> np.dtype:
|
|
140
142
|
return (np.zeros(0, dtype1) + np.zeros(0, dtype2)).dtype
|
|
141
143
|
|
|
142
144
|
|
cirq/linalg/combinators_test.py
CHANGED
|
@@ -11,13 +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
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
14
17
|
import numpy as np
|
|
15
18
|
import pytest
|
|
16
19
|
|
|
17
20
|
import cirq
|
|
18
21
|
|
|
19
22
|
|
|
20
|
-
def test_dot():
|
|
23
|
+
def test_dot() -> None:
|
|
21
24
|
assert cirq.dot(2) == 2
|
|
22
25
|
assert cirq.dot(2.5, 2.5) == 6.25
|
|
23
26
|
|
|
@@ -33,7 +36,7 @@ def test_dot():
|
|
|
33
36
|
cirq.dot()
|
|
34
37
|
|
|
35
38
|
|
|
36
|
-
def test_kron_multiplies_sizes():
|
|
39
|
+
def test_kron_multiplies_sizes() -> None:
|
|
37
40
|
assert cirq.kron(np.array([1, 2])).shape == (1, 2)
|
|
38
41
|
assert cirq.kron(np.array([1, 2]), shape_len=1).shape == (2,)
|
|
39
42
|
assert cirq.kron(np.array([1, 2]), np.array([3, 4, 5]), shape_len=1).shape == (6,)
|
|
@@ -51,7 +54,7 @@ def test_kron_multiplies_sizes():
|
|
|
51
54
|
assert np.allclose(cirq.kron(np.eye(2), np.eye(3), np.eye(4)), np.eye(24))
|
|
52
55
|
|
|
53
56
|
|
|
54
|
-
def test_kron_spreads_values():
|
|
57
|
+
def test_kron_spreads_values() -> None:
|
|
55
58
|
u = np.array([[2, 3], [5, 7]])
|
|
56
59
|
|
|
57
60
|
assert np.allclose(
|
|
@@ -68,7 +71,7 @@ def test_kron_spreads_values():
|
|
|
68
71
|
)
|
|
69
72
|
|
|
70
73
|
|
|
71
|
-
def test_acts_like_kron_multiplies_sizes():
|
|
74
|
+
def test_acts_like_kron_multiplies_sizes() -> None:
|
|
72
75
|
assert np.allclose(cirq.kron_with_controls(), np.eye(1))
|
|
73
76
|
assert np.allclose(cirq.kron_with_controls(np.eye(2), np.eye(3), np.eye(4)), np.eye(24))
|
|
74
77
|
|
|
@@ -79,7 +82,7 @@ def test_acts_like_kron_multiplies_sizes():
|
|
|
79
82
|
)
|
|
80
83
|
|
|
81
84
|
|
|
82
|
-
def test_supports_controls():
|
|
85
|
+
def test_supports_controls() -> None:
|
|
83
86
|
u = np.array([[2, 3], [5, 7]])
|
|
84
87
|
assert np.allclose(cirq.kron_with_controls(cirq.CONTROL_TAG), np.array([[1, 0], [0, 1]]))
|
|
85
88
|
assert np.allclose(
|
|
@@ -92,7 +95,7 @@ def test_supports_controls():
|
|
|
92
95
|
)
|
|
93
96
|
|
|
94
97
|
|
|
95
|
-
def test_block_diag():
|
|
98
|
+
def test_block_diag() -> None:
|
|
96
99
|
assert np.allclose(cirq.block_diag(), np.zeros((0, 0)))
|
|
97
100
|
|
|
98
101
|
assert np.allclose(cirq.block_diag(np.array([[1, 2], [3, 4]])), np.array([[1, 2], [3, 4]]))
|
|
@@ -108,7 +111,7 @@ def test_block_diag():
|
|
|
108
111
|
_ = cirq.block_diag(np.array([[1, 2, 3], [3, 4, 5]]))
|
|
109
112
|
|
|
110
113
|
|
|
111
|
-
def test_block_diag_dtype():
|
|
114
|
+
def test_block_diag_dtype() -> None:
|
|
112
115
|
assert cirq.block_diag().dtype == np.complex128
|
|
113
116
|
|
|
114
117
|
assert cirq.block_diag(np.array([[1]], dtype=np.int8)).dtype == np.int8
|
cirq/linalg/decompositions.py
CHANGED
|
@@ -12,23 +12,13 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
|
|
16
15
|
"""Utility methods for breaking matrices into useful pieces."""
|
|
17
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
18
19
|
import cmath
|
|
19
20
|
import math
|
|
20
|
-
from typing import
|
|
21
|
-
Any,
|
|
22
|
-
Callable,
|
|
23
|
-
cast,
|
|
24
|
-
Iterable,
|
|
25
|
-
List,
|
|
26
|
-
Optional,
|
|
27
|
-
Tuple,
|
|
28
|
-
TYPE_CHECKING,
|
|
29
|
-
TypeVar,
|
|
30
|
-
Union,
|
|
31
|
-
)
|
|
21
|
+
from typing import Any, Callable, cast, Iterable, TYPE_CHECKING, TypeVar
|
|
32
22
|
|
|
33
23
|
import matplotlib.pyplot as plt
|
|
34
24
|
import numpy as np
|
|
@@ -69,7 +59,7 @@ def _rotation_matrix(angle: float) -> np.ndarray:
|
|
|
69
59
|
return np.array([[c, -s], [s, c]])
|
|
70
60
|
|
|
71
61
|
|
|
72
|
-
def deconstruct_single_qubit_matrix_into_angles(mat: np.ndarray) ->
|
|
62
|
+
def deconstruct_single_qubit_matrix_into_angles(mat: np.ndarray) -> tuple[float, float, float]:
|
|
73
63
|
r"""Breaks down a 2x2 unitary into ZYZ angle parameters.
|
|
74
64
|
|
|
75
65
|
Given a unitary U, this function returns three angles: $\phi_0, \phi_1, \phi_2$,
|
|
@@ -107,7 +97,7 @@ def deconstruct_single_qubit_matrix_into_angles(mat: np.ndarray) -> Tuple[float,
|
|
|
107
97
|
|
|
108
98
|
def unitary_eig(
|
|
109
99
|
matrix: np.ndarray, check_preconditions: bool = True, atol: float = 1e-8
|
|
110
|
-
) ->
|
|
100
|
+
) -> tuple[np.ndarray, np.ndarray]:
|
|
111
101
|
r"""Gives the guaranteed unitary eigendecomposition of a normal matrix.
|
|
112
102
|
|
|
113
103
|
All hermitian and unitary matrices are normal matrices. This method was
|
|
@@ -126,7 +116,7 @@ def unitary_eig(
|
|
|
126
116
|
was unitary.
|
|
127
117
|
|
|
128
118
|
Returns:
|
|
129
|
-
A
|
|
119
|
+
A tuple of
|
|
130
120
|
eigvals: The eigenvalues of `matrix`.
|
|
131
121
|
V: The unitary matrix with the eigenvectors as columns.
|
|
132
122
|
|
|
@@ -140,7 +130,6 @@ def unitary_eig(
|
|
|
140
130
|
return R.diagonal(), V
|
|
141
131
|
|
|
142
132
|
|
|
143
|
-
# pylint: enable=missing-raises-doc
|
|
144
133
|
def map_eigenvalues(
|
|
145
134
|
matrix: np.ndarray, func: Callable[[complex], complex], *, atol: float = 1e-8
|
|
146
135
|
) -> np.ndarray:
|
|
@@ -168,7 +157,7 @@ def map_eigenvalues(
|
|
|
168
157
|
|
|
169
158
|
def kron_factor_4x4_to_2x2s(
|
|
170
159
|
matrix: np.ndarray, rtol=1e-5, atol=1e-8
|
|
171
|
-
) ->
|
|
160
|
+
) -> tuple[complex, np.ndarray, np.ndarray]:
|
|
172
161
|
"""Splits a 4x4 matrix U = kron(A, B) into A, B, and a global factor.
|
|
173
162
|
|
|
174
163
|
Requires the matrix to be the kronecker product of two 2x2 unitaries.
|
|
@@ -218,7 +207,7 @@ def kron_factor_4x4_to_2x2s(
|
|
|
218
207
|
|
|
219
208
|
def so4_to_magic_su2s(
|
|
220
209
|
mat: np.ndarray, *, rtol: float = 1e-5, atol: float = 1e-8, check_preconditions: bool = True
|
|
221
|
-
) ->
|
|
210
|
+
) -> tuple[np.ndarray, np.ndarray]:
|
|
222
211
|
"""Finds 2x2 special-unitaries A, B where mat = Mag.H @ kron(A, B) @ Mag.
|
|
223
212
|
|
|
224
213
|
Mag is the magic basis matrix:
|
|
@@ -264,14 +253,14 @@ class AxisAngleDecomposition:
|
|
|
264
253
|
rotation axis, and g is the global phase.
|
|
265
254
|
"""
|
|
266
255
|
|
|
267
|
-
def __init__(self, *, angle: float, axis:
|
|
256
|
+
def __init__(self, *, angle: float, axis: tuple[float, float, float], global_phase: complex):
|
|
268
257
|
if not np.isclose(np.linalg.norm(axis, 2), 1, atol=1e-8):
|
|
269
258
|
raise ValueError('Axis vector must be normalized.')
|
|
270
259
|
self.global_phase = complex(global_phase)
|
|
271
260
|
self.axis = tuple(axis)
|
|
272
261
|
self.angle = float(angle)
|
|
273
262
|
|
|
274
|
-
def canonicalize(self, atol: float = 1e-8) ->
|
|
263
|
+
def canonicalize(self, atol: float = 1e-8) -> AxisAngleDecomposition:
|
|
275
264
|
"""Returns a standardized AxisAngleDecomposition with the same unitary.
|
|
276
265
|
|
|
277
266
|
Ensures the axis (x, y, z) satisfies x+y+z >= 0.
|
|
@@ -412,9 +401,9 @@ class KakDecomposition:
|
|
|
412
401
|
self,
|
|
413
402
|
*,
|
|
414
403
|
global_phase: complex = complex(1),
|
|
415
|
-
single_qubit_operations_before:
|
|
416
|
-
interaction_coefficients:
|
|
417
|
-
single_qubit_operations_after:
|
|
404
|
+
single_qubit_operations_before: tuple[np.ndarray, np.ndarray] | None = None,
|
|
405
|
+
interaction_coefficients: tuple[float, float, float],
|
|
406
|
+
single_qubit_operations_after: tuple[np.ndarray, np.ndarray] | None = None,
|
|
418
407
|
):
|
|
419
408
|
"""Initializes a decomposition for a two-qubit operation U.
|
|
420
409
|
|
|
@@ -427,12 +416,12 @@ class KakDecomposition:
|
|
|
427
416
|
single_qubit_operations_after: a0, a1 from the above equation.
|
|
428
417
|
"""
|
|
429
418
|
self.global_phase: complex = global_phase
|
|
430
|
-
self.single_qubit_operations_before:
|
|
419
|
+
self.single_qubit_operations_before: tuple[np.ndarray, np.ndarray] = (
|
|
431
420
|
single_qubit_operations_before
|
|
432
421
|
or (np.eye(2, dtype=np.complex64), np.eye(2, dtype=np.complex64))
|
|
433
422
|
)
|
|
434
423
|
self.interaction_coefficients = interaction_coefficients
|
|
435
|
-
self.single_qubit_operations_after:
|
|
424
|
+
self.single_qubit_operations_after: tuple[np.ndarray, np.ndarray] = (
|
|
436
425
|
single_qubit_operations_after
|
|
437
426
|
or (np.eye(2, dtype=np.complex64), np.eye(2, dtype=np.complex64))
|
|
438
427
|
)
|
|
@@ -524,10 +513,10 @@ class KakDecomposition:
|
|
|
524
513
|
|
|
525
514
|
|
|
526
515
|
def scatter_plot_normalized_kak_interaction_coefficients(
|
|
527
|
-
interactions: Iterable[
|
|
516
|
+
interactions: Iterable[np.ndarray | cirq.SupportsUnitary | KakDecomposition],
|
|
528
517
|
*,
|
|
529
518
|
include_frame: bool = True,
|
|
530
|
-
ax:
|
|
519
|
+
ax: mplot3d.axes3d.Axes3D | None = None,
|
|
531
520
|
**kwargs,
|
|
532
521
|
):
|
|
533
522
|
r"""Plots the interaction coefficients of many two-qubit operations.
|
|
@@ -609,8 +598,8 @@ def scatter_plot_normalized_kak_interaction_coefficients(
|
|
|
609
598
|
ax = cast(mplot3d.axes3d.Axes3D, fig.add_subplot(1, 1, 1, projection='3d'))
|
|
610
599
|
|
|
611
600
|
def coord_transform(
|
|
612
|
-
pts:
|
|
613
|
-
) ->
|
|
601
|
+
pts: list[tuple[int, int, int]] | np.ndarray,
|
|
602
|
+
) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
|
|
614
603
|
if len(pts) == 0:
|
|
615
604
|
return np.array([]), np.array([]), np.array([])
|
|
616
605
|
xs, ys, zs = np.transpose(pts)
|
|
@@ -636,7 +625,7 @@ def scatter_plot_normalized_kak_interaction_coefficients(
|
|
|
636
625
|
|
|
637
626
|
# parse input and extract KAK vector
|
|
638
627
|
if not isinstance(interactions, np.ndarray):
|
|
639
|
-
interactions_extracted:
|
|
628
|
+
interactions_extracted: list[np.ndarray] = [
|
|
640
629
|
a if isinstance(a, np.ndarray) else protocols.unitary(a) for a in interactions
|
|
641
630
|
]
|
|
642
631
|
else:
|
|
@@ -785,9 +774,9 @@ KAK_GAMMA = np.array([[1, 1, 1, 1],
|
|
|
785
774
|
|
|
786
775
|
|
|
787
776
|
def kak_decomposition(
|
|
788
|
-
unitary_object:
|
|
789
|
-
np.ndarray
|
|
790
|
-
|
|
777
|
+
unitary_object: (
|
|
778
|
+
np.ndarray | cirq.SupportsUnitary | cirq.Gate | cirq.Operation | KakDecomposition
|
|
779
|
+
),
|
|
791
780
|
*,
|
|
792
781
|
rtol: float = 1e-5,
|
|
793
782
|
atol: float = 1e-8,
|
|
@@ -857,7 +846,7 @@ def kak_decomposition(
|
|
|
857
846
|
|
|
858
847
|
|
|
859
848
|
def kak_vector(
|
|
860
|
-
unitary:
|
|
849
|
+
unitary: Iterable[np.ndarray] | np.ndarray,
|
|
861
850
|
*,
|
|
862
851
|
rtol: float = 1e-5,
|
|
863
852
|
atol: float = 1e-8,
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
15
17
|
import random
|
|
16
18
|
|
|
17
19
|
import numpy as np
|
|
@@ -582,7 +584,7 @@ def _local_two_qubit_unitaries(samples, random_state):
|
|
|
582
584
|
_kak_gens = np.array([np.kron(X, X), np.kron(Y, Y), np.kron(Z, Z)])
|
|
583
585
|
|
|
584
586
|
|
|
585
|
-
def _random_two_qubit_unitaries(num_samples: int, random_state:
|
|
587
|
+
def _random_two_qubit_unitaries(num_samples: int, random_state: cirq.RANDOM_STATE_OR_SEED_LIKE):
|
|
586
588
|
# Randomly generated two-qubit unitaries and the KAK vectors (not canonical)
|
|
587
589
|
kl = _local_two_qubit_unitaries(num_samples, random_state)
|
|
588
590
|
|
cirq/linalg/diagonalize.py
CHANGED
|
@@ -14,7 +14,9 @@
|
|
|
14
14
|
|
|
15
15
|
"""Utility methods for diagonalizing matrices."""
|
|
16
16
|
|
|
17
|
-
from
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
from typing import Callable
|
|
18
20
|
|
|
19
21
|
import numpy as np
|
|
20
22
|
|
|
@@ -52,7 +54,7 @@ def diagonalize_real_symmetric_matrix(
|
|
|
52
54
|
|
|
53
55
|
def _contiguous_groups(
|
|
54
56
|
length: int, comparator: Callable[[int, int], bool]
|
|
55
|
-
) ->
|
|
57
|
+
) -> list[tuple[int, int]]:
|
|
56
58
|
"""Splits range(length) into approximate equivalence classes.
|
|
57
59
|
|
|
58
60
|
Args:
|
|
@@ -155,7 +157,7 @@ def bidiagonalize_real_matrix_pair_with_symmetric_products(
|
|
|
155
157
|
rtol: float = 1e-5,
|
|
156
158
|
atol: float = 1e-8,
|
|
157
159
|
check_preconditions: bool = True,
|
|
158
|
-
) ->
|
|
160
|
+
) -> tuple[np.ndarray, np.ndarray]:
|
|
159
161
|
"""Finds orthogonal matrices that diagonalize both mat1 and mat2.
|
|
160
162
|
|
|
161
163
|
Requires mat1 and mat2 to be real.
|
|
@@ -226,7 +228,7 @@ def bidiagonalize_real_matrix_pair_with_symmetric_products(
|
|
|
226
228
|
|
|
227
229
|
def bidiagonalize_unitary_with_special_orthogonals(
|
|
228
230
|
mat: np.ndarray, *, rtol: float = 1e-5, atol: float = 1e-8, check_preconditions: bool = True
|
|
229
|
-
) ->
|
|
231
|
+
) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
|
|
230
232
|
"""Finds orthogonal matrices L, R such that L @ matrix @ R is diagonal.
|
|
231
233
|
|
|
232
234
|
Args:
|