cirq-core 1.5.0.dev20250409225226__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.dev20250409225226.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.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
- cirq_core-1.5.0.dev20250409225226.dist-info/RECORD +0 -1216
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
- {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
|
@@ -12,6 +12,10 @@
|
|
|
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
|
+
|
|
17
|
+
from typing import Any, Hashable, Iterable
|
|
18
|
+
|
|
15
19
|
import pytest
|
|
16
20
|
|
|
17
21
|
import cirq
|
|
@@ -19,7 +23,7 @@ import cirq.contrib.graph_device as ccgd
|
|
|
19
23
|
import cirq.contrib.graph_device.graph_device as ccgdgd
|
|
20
24
|
|
|
21
25
|
|
|
22
|
-
def test_fixed_duration_undirected_graph_device_edge_eq():
|
|
26
|
+
def test_fixed_duration_undirected_graph_device_edge_eq() -> None:
|
|
23
27
|
e = ccgd.FixedDurationUndirectedGraphDeviceEdge(cirq.Duration(picos=4))
|
|
24
28
|
f = ccgd.FixedDurationUndirectedGraphDeviceEdge(cirq.Duration(picos=4))
|
|
25
29
|
g = ccgd.FixedDurationUndirectedGraphDeviceEdge(cirq.Duration(picos=5))
|
|
@@ -28,15 +32,15 @@ def test_fixed_duration_undirected_graph_device_edge_eq():
|
|
|
28
32
|
assert e != 4
|
|
29
33
|
|
|
30
34
|
|
|
31
|
-
def test_unconstrained_undirected_graph_device_edge_eq():
|
|
35
|
+
def test_unconstrained_undirected_graph_device_edge_eq() -> None:
|
|
32
36
|
e = ccgdgd._UnconstrainedUndirectedGraphDeviceEdge()
|
|
33
37
|
f = ccgd.UnconstrainedUndirectedGraphDeviceEdge
|
|
34
38
|
assert e == f
|
|
35
39
|
assert e != 3
|
|
36
40
|
|
|
37
41
|
|
|
38
|
-
def test_is_undirected_device_graph():
|
|
39
|
-
assert not ccgd.is_undirected_device_graph('abc')
|
|
42
|
+
def test_is_undirected_device_graph() -> None:
|
|
43
|
+
assert not ccgd.is_undirected_device_graph('abc') # type: ignore[arg-type]
|
|
40
44
|
graph = ccgd.UndirectedHypergraph()
|
|
41
45
|
assert ccgd.is_undirected_device_graph(graph)
|
|
42
46
|
a, b, c, d, e = cirq.LineQubit.range(5)
|
|
@@ -50,9 +54,9 @@ def test_is_undirected_device_graph():
|
|
|
50
54
|
assert not ccgd.is_undirected_device_graph(graph)
|
|
51
55
|
|
|
52
56
|
|
|
53
|
-
def test_is_crosstalk_graph():
|
|
57
|
+
def test_is_crosstalk_graph() -> None:
|
|
54
58
|
a, b, c, d, e, f = cirq.LineQubit.range(6)
|
|
55
|
-
assert not ccgd.is_crosstalk_graph('abc')
|
|
59
|
+
assert not ccgd.is_crosstalk_graph('abc') # type: ignore[arg-type]
|
|
56
60
|
graph = ccgd.UndirectedHypergraph()
|
|
57
61
|
graph.add_vertex('abc')
|
|
58
62
|
assert not ccgd.is_crosstalk_graph(graph)
|
|
@@ -74,14 +78,14 @@ def test_is_crosstalk_graph():
|
|
|
74
78
|
assert not ccgd.is_crosstalk_graph(graph)
|
|
75
79
|
|
|
76
80
|
|
|
77
|
-
def test_unconstrained_undirected_graph_device_edge():
|
|
81
|
+
def test_unconstrained_undirected_graph_device_edge() -> None:
|
|
78
82
|
edge = ccgd.UnconstrainedUndirectedGraphDeviceEdge
|
|
79
83
|
qubits = cirq.LineQubit.range(2)
|
|
80
84
|
assert edge.duration_of(cirq.X(qubits[0])) == cirq.Duration(picos=0)
|
|
81
85
|
assert edge.duration_of(cirq.CZ(*qubits[:2])) == cirq.Duration(picos=0)
|
|
82
86
|
|
|
83
87
|
|
|
84
|
-
def test_graph_device():
|
|
88
|
+
def test_graph_device() -> None:
|
|
85
89
|
one_qubit_duration = cirq.Duration(picos=10)
|
|
86
90
|
two_qubit_duration = cirq.Duration(picos=1)
|
|
87
91
|
one_qubit_edge = ccgd.FixedDurationUndirectedGraphDeviceEdge(one_qubit_duration)
|
|
@@ -93,7 +97,7 @@ def test_graph_device():
|
|
|
93
97
|
|
|
94
98
|
n_qubits = 4
|
|
95
99
|
qubits = cirq.LineQubit.range(n_qubits)
|
|
96
|
-
edges = {
|
|
100
|
+
edges: dict[Iterable[Hashable], Any] = {
|
|
97
101
|
(cirq.LineQubit(i), cirq.LineQubit((i + 1) % n_qubits)): two_qubit_edge
|
|
98
102
|
for i in range(n_qubits)
|
|
99
103
|
}
|
|
@@ -109,8 +113,8 @@ def test_graph_device():
|
|
|
109
113
|
|
|
110
114
|
assert ccgd.is_undirected_device_graph(device_graph)
|
|
111
115
|
with pytest.raises(TypeError):
|
|
112
|
-
ccgd.UndirectedGraphDevice('abc')
|
|
113
|
-
constraint_edges = {
|
|
116
|
+
ccgd.UndirectedGraphDevice('abc') # type: ignore[arg-type]
|
|
117
|
+
constraint_edges: dict[Iterable[Hashable], Any] = {
|
|
114
118
|
(frozenset(cirq.LineQubit.range(2)), frozenset(cirq.LineQubit.range(2, 4))): None,
|
|
115
119
|
(
|
|
116
120
|
frozenset(cirq.LineQubit.range(1, 3)),
|
|
@@ -121,7 +125,7 @@ def test_graph_device():
|
|
|
121
125
|
assert ccgd.is_crosstalk_graph(crosstalk_graph)
|
|
122
126
|
|
|
123
127
|
with pytest.raises(TypeError):
|
|
124
|
-
ccgd.UndirectedGraphDevice(device_graph, crosstalk_graph='abc')
|
|
128
|
+
ccgd.UndirectedGraphDevice(device_graph, crosstalk_graph='abc') # type: ignore[arg-type]
|
|
125
129
|
|
|
126
130
|
graph_device = ccgd.UndirectedGraphDevice(device_graph)
|
|
127
131
|
assert graph_device.crosstalk_graph == ccgd.UndirectedHypergraph()
|
|
@@ -139,7 +143,7 @@ def test_graph_device():
|
|
|
139
143
|
with pytest.raises(ValueError):
|
|
140
144
|
graph_device.validate_operation(cirq.CNOT(qubits[0], qubits[2]))
|
|
141
145
|
with pytest.raises(AttributeError):
|
|
142
|
-
graph_device.validate_operation(list((2, 3)))
|
|
146
|
+
graph_device.validate_operation(list((2, 3))) # type: ignore[arg-type]
|
|
143
147
|
|
|
144
148
|
moment = cirq.Moment([cirq.CNOT(*qubits[:2]), cirq.CNOT(*qubits[2:])])
|
|
145
149
|
with pytest.raises(ValueError):
|
|
@@ -153,7 +157,7 @@ def test_graph_device():
|
|
|
153
157
|
graph_device.validate_moment(moment)
|
|
154
158
|
|
|
155
159
|
|
|
156
|
-
def test_graph_device_copy_and_add():
|
|
160
|
+
def test_graph_device_copy_and_add() -> None:
|
|
157
161
|
a, b, c, d, e, f = cirq.LineQubit.range(6)
|
|
158
162
|
device_graph = ccgd.UndirectedHypergraph(labelled_edges={(a, b): None, (c, d): None})
|
|
159
163
|
crosstalk_graph = ccgd.UndirectedHypergraph(
|
|
@@ -12,19 +12,21 @@
|
|
|
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 itertools
|
|
16
18
|
import random
|
|
17
|
-
from typing import Any,
|
|
19
|
+
from typing import Any, Hashable, Iterable, Mapping
|
|
18
20
|
|
|
19
|
-
AdjacencyList =
|
|
21
|
+
AdjacencyList = set[frozenset[Hashable]]
|
|
20
22
|
|
|
21
23
|
|
|
22
24
|
class UndirectedHypergraph:
|
|
23
25
|
def __init__(
|
|
24
26
|
self,
|
|
25
27
|
*,
|
|
26
|
-
vertices:
|
|
27
|
-
labelled_edges:
|
|
28
|
+
vertices: Iterable[Hashable] | None = None,
|
|
29
|
+
labelled_edges: dict[Iterable[Hashable], Any] | None = None,
|
|
28
30
|
) -> None:
|
|
29
31
|
"""A labelled, undirected hypergraph.
|
|
30
32
|
|
|
@@ -35,23 +37,23 @@ class UndirectedHypergraph:
|
|
|
35
37
|
automatically added.
|
|
36
38
|
"""
|
|
37
39
|
|
|
38
|
-
self._adjacency_lists:
|
|
39
|
-
self._labelled_edges:
|
|
40
|
+
self._adjacency_lists: dict[Hashable, AdjacencyList] = {}
|
|
41
|
+
self._labelled_edges: dict[frozenset[Hashable], Any] = {}
|
|
40
42
|
if vertices is not None:
|
|
41
43
|
self.add_vertices(vertices)
|
|
42
44
|
if labelled_edges is not None:
|
|
43
45
|
self.add_edges(labelled_edges)
|
|
44
46
|
|
|
45
47
|
@property
|
|
46
|
-
def vertices(self) ->
|
|
48
|
+
def vertices(self) -> tuple[Hashable, ...]:
|
|
47
49
|
return tuple(self._adjacency_lists.keys())
|
|
48
50
|
|
|
49
51
|
@property
|
|
50
|
-
def edges(self) ->
|
|
52
|
+
def edges(self) -> tuple[frozenset[Hashable], ...]:
|
|
51
53
|
return tuple(self._labelled_edges.keys())
|
|
52
54
|
|
|
53
55
|
@property
|
|
54
|
-
def labelled_edges(self) ->
|
|
56
|
+
def labelled_edges(self) -> dict[frozenset, Any]:
|
|
55
57
|
return dict(self._labelled_edges)
|
|
56
58
|
|
|
57
59
|
def add_vertex(self, vertex: Hashable) -> None:
|
|
@@ -69,7 +71,7 @@ class UndirectedHypergraph:
|
|
|
69
71
|
self._adjacency_lists[neighbor].difference_update((edge,))
|
|
70
72
|
del self._adjacency_lists[vertex]
|
|
71
73
|
|
|
72
|
-
def remove_vertices(self, vertices):
|
|
74
|
+
def remove_vertices(self, vertices) -> None:
|
|
73
75
|
for vertex in vertices:
|
|
74
76
|
self.remove_vertex(vertex)
|
|
75
77
|
|
|
@@ -80,7 +82,7 @@ class UndirectedHypergraph:
|
|
|
80
82
|
self._adjacency_lists[vertex].update((vertices,))
|
|
81
83
|
self._labelled_edges[vertices] = label
|
|
82
84
|
|
|
83
|
-
def add_edges(self, edges:
|
|
85
|
+
def add_edges(self, edges: dict[Iterable[Hashable], Any]) -> None:
|
|
84
86
|
for vertices, label in edges.items():
|
|
85
87
|
self.add_edge(vertices, label)
|
|
86
88
|
|
|
@@ -102,8 +104,8 @@ class UndirectedHypergraph:
|
|
|
102
104
|
|
|
103
105
|
@classmethod
|
|
104
106
|
def random(
|
|
105
|
-
cls, vertices:
|
|
106
|
-
) ->
|
|
107
|
+
cls, vertices: int | Iterable, edge_probs: Mapping[int, float]
|
|
108
|
+
) -> UndirectedHypergraph:
|
|
107
109
|
"""A random hypergraph.
|
|
108
110
|
|
|
109
111
|
Every possible edge is included with probability edge_prob[len(edge)].
|
|
@@ -125,5 +127,5 @@ class UndirectedHypergraph:
|
|
|
125
127
|
for potential_edge in itertools.combinations(vertices, edge_size):
|
|
126
128
|
if random.random() < edge_prob:
|
|
127
129
|
edges.append(potential_edge)
|
|
128
|
-
labelled_edges:
|
|
130
|
+
labelled_edges: dict[Iterable[Hashable], Any] = {edge: None for edge in edges}
|
|
129
131
|
return cls(vertices=vertices, labelled_edges=labelled_edges)
|
|
@@ -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 pytest
|
|
@@ -19,7 +21,7 @@ import pytest
|
|
|
19
21
|
import cirq.contrib.graph_device as ccgd
|
|
20
22
|
|
|
21
23
|
|
|
22
|
-
def test_update_edge_label():
|
|
24
|
+
def test_update_edge_label() -> None:
|
|
23
25
|
edge = frozenset(range(3))
|
|
24
26
|
graph = ccgd.UndirectedHypergraph(labelled_edges={edge: 'a'})
|
|
25
27
|
assert graph.labelled_edges[edge] == 'a'
|
|
@@ -27,7 +29,7 @@ def test_update_edge_label():
|
|
|
27
29
|
assert graph.labelled_edges[edge] == 'b'
|
|
28
30
|
|
|
29
31
|
|
|
30
|
-
def test_hypergraph():
|
|
32
|
+
def test_hypergraph() -> None:
|
|
31
33
|
vertices = range(4)
|
|
32
34
|
graph = ccgd.UndirectedHypergraph(vertices=vertices)
|
|
33
35
|
assert graph.vertices == tuple(vertices)
|
|
@@ -53,7 +55,7 @@ def test_hypergraph():
|
|
|
53
55
|
for _ in range(10)
|
|
54
56
|
],
|
|
55
57
|
)
|
|
56
|
-
def test_eq(vertices, edges):
|
|
58
|
+
def test_eq(vertices, edges) -> None:
|
|
57
59
|
vertices = set(vertices).union(*edges)
|
|
58
60
|
graph_initialized = ccgd.UndirectedHypergraph(vertices=vertices, labelled_edges=edges)
|
|
59
61
|
graph_added_parallel = ccgd.UndirectedHypergraph()
|
|
@@ -67,15 +69,15 @@ def test_eq(vertices, edges):
|
|
|
67
69
|
assert graph_initialized == graph_added_parallel == graph_added_sequential
|
|
68
70
|
|
|
69
71
|
|
|
70
|
-
def test_random_hypergraph():
|
|
72
|
+
def test_random_hypergraph() -> None:
|
|
71
73
|
n_vertices = 4
|
|
72
74
|
graph = ccgd.UndirectedHypergraph.random(n_vertices, {1: 1.0})
|
|
73
|
-
assert sorted(graph.vertices) == sorted(range(n_vertices))
|
|
75
|
+
assert sorted(graph.vertices) == sorted(range(n_vertices)) # type: ignore[type-var]
|
|
74
76
|
assert set(graph.labelled_edges.values()) == set((None,))
|
|
75
77
|
assert tuple(len(edge) for edge in graph.edges) == (1,) * n_vertices
|
|
76
78
|
|
|
77
79
|
|
|
78
|
-
def test_copy():
|
|
80
|
+
def test_copy() -> None:
|
|
79
81
|
graph_original = ccgd.UndirectedHypergraph(labelled_edges={(0, 1): None})
|
|
80
82
|
graph_copy = graph_original.__copy__()
|
|
81
83
|
assert graph_copy == graph_original
|
|
@@ -83,20 +85,20 @@ def test_copy():
|
|
|
83
85
|
assert graph_copy != graph_original
|
|
84
86
|
|
|
85
87
|
|
|
86
|
-
def test_iadd():
|
|
88
|
+
def test_iadd() -> None:
|
|
87
89
|
graph = ccgd.UndirectedHypergraph(labelled_edges={(0, 1): None})
|
|
88
90
|
addend = ccgd.UndirectedHypergraph(labelled_edges={(1, 2): None})
|
|
89
91
|
graph += addend
|
|
90
92
|
assert set(graph.edges) == set(frozenset(e) for e in ((0, 1), (1, 2)))
|
|
91
|
-
assert sorted(graph.vertices) == [0, 1, 2]
|
|
93
|
+
assert sorted(graph.vertices) == [0, 1, 2] # type: ignore[type-var]
|
|
92
94
|
|
|
93
95
|
|
|
94
|
-
def test_add():
|
|
96
|
+
def test_add() -> None:
|
|
95
97
|
first_addend = ccgd.UndirectedHypergraph(labelled_edges={('a', 'b'): None})
|
|
96
98
|
second_addend = ccgd.UndirectedHypergraph(labelled_edges={('c', 'b'): None})
|
|
97
99
|
graph_sum = first_addend + second_addend
|
|
98
|
-
assert sorted(first_addend.vertices) == list('ab')
|
|
99
|
-
assert sorted(second_addend.vertices) == list('bc')
|
|
100
|
+
assert sorted(first_addend.vertices) == list('ab') # type: ignore[type-var]
|
|
101
|
+
assert sorted(second_addend.vertices) == list('bc') # type: ignore[type-var]
|
|
100
102
|
assert sorted(graph_sum.vertices) == list('abc')
|
|
101
103
|
assert sorted(first_addend.edges) == [frozenset('ab')]
|
|
102
104
|
assert sorted(second_addend.edges) == [frozenset('bc')]
|
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import Any, Hashable, Iterable, Mapping
|
|
16
18
|
|
|
17
19
|
from cirq import devices, ops
|
|
18
20
|
from cirq.contrib.graph_device.graph_device import UndirectedGraphDevice, UndirectedGraphDeviceEdge
|
|
@@ -20,7 +22,7 @@ from cirq.contrib.graph_device.hypergraph import UndirectedHypergraph
|
|
|
20
22
|
|
|
21
23
|
|
|
22
24
|
def uniform_undirected_graph_device(
|
|
23
|
-
edges: Iterable[Iterable[ops.Qid]], edge_label:
|
|
25
|
+
edges: Iterable[Iterable[ops.Qid]], edge_label: UndirectedGraphDeviceEdge | None = None
|
|
24
26
|
) -> UndirectedGraphDevice:
|
|
25
27
|
"""An undirected graph device all of whose edges are the same.
|
|
26
28
|
|
|
@@ -29,13 +31,13 @@ def uniform_undirected_graph_device(
|
|
|
29
31
|
edge_label: The label to apply to all edges. Defaults to None.
|
|
30
32
|
"""
|
|
31
33
|
|
|
32
|
-
labelled_edges:
|
|
34
|
+
labelled_edges: dict[Iterable[Hashable], Any] = {frozenset(edge): edge_label for edge in edges}
|
|
33
35
|
device_graph = UndirectedHypergraph(labelled_edges=labelled_edges)
|
|
34
36
|
return UndirectedGraphDevice(device_graph=device_graph)
|
|
35
37
|
|
|
36
38
|
|
|
37
39
|
def uniform_undirected_linear_device(
|
|
38
|
-
n_qubits: int, edge_labels: Mapping[int,
|
|
40
|
+
n_qubits: int, edge_labels: Mapping[int, UndirectedGraphDeviceEdge | None]
|
|
39
41
|
) -> UndirectedGraphDevice:
|
|
40
42
|
"""A uniform , undirected graph device whose qubits are arranged
|
|
41
43
|
on a line.
|
|
@@ -12,21 +12,29 @@
|
|
|
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
|
+
|
|
17
|
+
from typing import TYPE_CHECKING
|
|
18
|
+
|
|
15
19
|
import pytest
|
|
16
20
|
|
|
17
21
|
import cirq
|
|
18
22
|
import cirq.contrib.graph_device as ccgd
|
|
19
23
|
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from cirq.contrib.graph_device.graph_device import UndirectedGraphDeviceEdge
|
|
26
|
+
|
|
20
27
|
|
|
21
|
-
def test_empty_uniform_undirected_linear_device():
|
|
28
|
+
def test_empty_uniform_undirected_linear_device() -> None:
|
|
22
29
|
n_qubits = 4
|
|
30
|
+
edge_labels: dict[int, UndirectedGraphDeviceEdge | None]
|
|
23
31
|
edge_labels = {}
|
|
24
32
|
device = ccgd.uniform_undirected_linear_device(n_qubits, edge_labels)
|
|
25
33
|
assert device.qubits == tuple()
|
|
26
34
|
assert device.edges == tuple()
|
|
27
35
|
|
|
28
36
|
|
|
29
|
-
def test_negative_arity_arg_uniform_undirected_linear_device():
|
|
37
|
+
def test_negative_arity_arg_uniform_undirected_linear_device() -> None:
|
|
30
38
|
with pytest.raises(ValueError):
|
|
31
39
|
ccgd.uniform_undirected_linear_device(5, {-1: None})
|
|
32
40
|
with pytest.raises(ValueError):
|
|
@@ -34,7 +42,7 @@ def test_negative_arity_arg_uniform_undirected_linear_device():
|
|
|
34
42
|
|
|
35
43
|
|
|
36
44
|
@pytest.mark.parametrize('arity', range(1, 5))
|
|
37
|
-
def test_regular_uniform_undirected_linear_device(arity):
|
|
45
|
+
def test_regular_uniform_undirected_linear_device(arity) -> None:
|
|
38
46
|
n_qubits = 10
|
|
39
47
|
edge_labels = {arity: None}
|
|
40
48
|
device = ccgd.uniform_undirected_linear_device(n_qubits, edge_labels)
|
|
@@ -14,11 +14,16 @@
|
|
|
14
14
|
|
|
15
15
|
"""Tools for disabling validation in circuit construction."""
|
|
16
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
17
19
|
import contextlib
|
|
20
|
+
from collections.abc import Generator
|
|
18
21
|
|
|
19
22
|
|
|
20
23
|
@contextlib.contextmanager
|
|
21
|
-
def disable_op_validation(
|
|
24
|
+
def disable_op_validation(
|
|
25
|
+
*, accept_debug_responsibility: bool = False
|
|
26
|
+
) -> Generator[None, None, None]:
|
|
22
27
|
if not accept_debug_responsibility:
|
|
23
28
|
raise ValueError(
|
|
24
29
|
"WARNING! Using disable_op_validation with invalid ops can cause "
|
|
@@ -12,13 +12,15 @@
|
|
|
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 pytest
|
|
16
18
|
|
|
17
19
|
import cirq
|
|
18
20
|
from cirq.contrib.hacks.disable_validation import disable_op_validation
|
|
19
21
|
|
|
20
22
|
|
|
21
|
-
def test_disable_op_validation():
|
|
23
|
+
def test_disable_op_validation() -> None:
|
|
22
24
|
q0, q1 = cirq.LineQubit.range(2)
|
|
23
25
|
|
|
24
26
|
# Fails normally.
|
cirq/contrib/json.py
CHANGED
|
@@ -1,18 +1,44 @@
|
|
|
1
1
|
# pylint: disable=wrong-or-nonexistent-copyright-notice
|
|
2
2
|
"""Functions for JSON serialization and de-serialization for classes in Contrib."""
|
|
3
3
|
|
|
4
|
-
from
|
|
4
|
+
from __future__ import annotations
|
|
5
5
|
|
|
6
|
+
import functools
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
from cirq.protocols.json_serialization import _register_resolver, DEFAULT_RESOLVERS, ObjectFactory
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def contrib_class_resolver(cirq_type: str) -> ObjectFactory | None:
|
|
8
12
|
"""Extend cirq's JSON API with resolvers for cirq contrib classes."""
|
|
13
|
+
return _class_resolver_dictionary().get(cirq_type, None)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@functools.cache
|
|
17
|
+
def _class_resolver_dictionary() -> dict[str, ObjectFactory]:
|
|
9
18
|
from cirq.contrib.acquaintance import SwapPermutationGate
|
|
10
19
|
from cirq.contrib.bayesian_network import BayesianNetworkGate
|
|
20
|
+
from cirq.contrib.noise_models import (
|
|
21
|
+
DampedReadoutNoiseModel,
|
|
22
|
+
DepolarizingNoiseModel,
|
|
23
|
+
DepolarizingWithDampedReadoutNoiseModel,
|
|
24
|
+
DepolarizingWithReadoutNoiseModel,
|
|
25
|
+
ReadoutNoiseModel,
|
|
26
|
+
)
|
|
11
27
|
from cirq.contrib.quantum_volume import QuantumVolumeResult
|
|
12
28
|
|
|
13
|
-
classes = [
|
|
14
|
-
|
|
15
|
-
|
|
29
|
+
classes = [
|
|
30
|
+
BayesianNetworkGate,
|
|
31
|
+
QuantumVolumeResult,
|
|
32
|
+
SwapPermutationGate,
|
|
33
|
+
DepolarizingNoiseModel,
|
|
34
|
+
ReadoutNoiseModel,
|
|
35
|
+
DampedReadoutNoiseModel,
|
|
36
|
+
DepolarizingWithReadoutNoiseModel,
|
|
37
|
+
DepolarizingWithDampedReadoutNoiseModel,
|
|
38
|
+
]
|
|
39
|
+
return {cls.__name__: cls for cls in classes}
|
|
16
40
|
|
|
17
41
|
|
|
18
42
|
DEFAULT_CONTRIB_RESOLVERS = [contrib_class_resolver] + DEFAULT_RESOLVERS
|
|
43
|
+
|
|
44
|
+
_register_resolver(_class_resolver_dictionary)
|
cirq/contrib/json_test.py
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
# pylint: disable=wrong-or-nonexistent-copyright-notice
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
2
5
|
import cirq
|
|
3
6
|
from cirq.contrib.acquaintance import SwapPermutationGate
|
|
4
7
|
from cirq.contrib.bayesian_network import BayesianNetworkGate
|
|
@@ -7,14 +10,14 @@ from cirq.contrib.quantum_volume import QuantumVolumeResult
|
|
|
7
10
|
from cirq.testing import assert_json_roundtrip_works
|
|
8
11
|
|
|
9
12
|
|
|
10
|
-
def test_bayesian_network_gate():
|
|
13
|
+
def test_bayesian_network_gate() -> None:
|
|
11
14
|
gate = BayesianNetworkGate(
|
|
12
15
|
init_probs=[('q0', 0.125), ('q1', None)], arc_probs=[('q1', ('q0',), [0.25, 0.5])]
|
|
13
16
|
)
|
|
14
17
|
assert_json_roundtrip_works(gate, resolvers=DEFAULT_CONTRIB_RESOLVERS)
|
|
15
18
|
|
|
16
19
|
|
|
17
|
-
def test_quantum_volume():
|
|
20
|
+
def test_quantum_volume() -> None:
|
|
18
21
|
qubits = cirq.LineQubit.range(5)
|
|
19
22
|
qvr = QuantumVolumeResult(
|
|
20
23
|
model_circuit=cirq.Circuit(cirq.H.on_each(qubits)),
|
|
@@ -25,6 +28,6 @@ def test_quantum_volume():
|
|
|
25
28
|
assert_json_roundtrip_works(qvr, resolvers=DEFAULT_CONTRIB_RESOLVERS)
|
|
26
29
|
|
|
27
30
|
|
|
28
|
-
def test_swap_permutation_gate():
|
|
31
|
+
def test_swap_permutation_gate() -> None:
|
|
29
32
|
gate = SwapPermutationGate(swap_gate=cirq.SWAP)
|
|
30
33
|
assert_json_roundtrip_works(gate, resolvers=DEFAULT_CONTRIB_RESOLVERS)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
cirq.contrib.noise_models.DepolarizingWithDampedReadoutNoiseModel(0.1, 0.2, 0.3)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
cirq.contrib.noise_models.DepolarizingWithReadoutNoiseModel(0.1, 0.2)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Copyright 2025 The Cirq Developers
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
"""Test data for JSON serialization of :mod:`cirq.contrib` objects."""
|
|
16
|
+
|
|
17
|
+
from cirq.contrib.json_test_data.spec import TestSpec as TestSpec
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Copyright 2025 The Cirq Developers
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
import pathlib
|
|
17
|
+
|
|
18
|
+
import cirq
|
|
19
|
+
from cirq.contrib.json import _class_resolver_dictionary
|
|
20
|
+
from cirq.testing.json import ModuleJsonTestSpec
|
|
21
|
+
|
|
22
|
+
TestSpec = ModuleJsonTestSpec(
|
|
23
|
+
name="cirq.contrib",
|
|
24
|
+
packages=[cirq.contrib],
|
|
25
|
+
test_data_path=pathlib.Path(__file__).parent,
|
|
26
|
+
not_yet_serializable=[],
|
|
27
|
+
should_not_be_serialized=["Unique", "CircuitDag"],
|
|
28
|
+
resolver_cache=_class_resolver_dictionary(),
|
|
29
|
+
deprecated={},
|
|
30
|
+
# TODO: #7520 - create .json and .repr for these so they can be tested here
|
|
31
|
+
tested_elsewhere=["QuantumVolumeResult", "SwapPermutationGate", "BayesianNetworkGate"],
|
|
32
|
+
)
|