cirq-core 1.4.0.dev20240529225110__py3-none-any.whl → 1.5.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of cirq-core might be problematic. Click here for more details.
- cirq/__init__.py +587 -569
- cirq/_compat.py +9 -0
- cirq/_compat_test.py +11 -9
- cirq/_import.py +7 -8
- cirq/_version.py +31 -1
- cirq/_version_test.py +1 -1
- cirq/circuits/__init__.py +15 -9
- cirq/circuits/_block_diagram_drawer.py +1 -2
- cirq/circuits/_block_diagram_drawer_test.py +3 -3
- cirq/circuits/_box_drawing_character_data.py +0 -1
- cirq/circuits/_box_drawing_character_data_test.py +2 -2
- cirq/circuits/_bucket_priority_queue.py +0 -1
- cirq/circuits/_bucket_priority_queue_test.py +1 -1
- cirq/circuits/circuit.py +336 -234
- cirq/circuits/circuit_operation.py +102 -52
- cirq/circuits/circuit_operation_test.py +85 -4
- cirq/circuits/circuit_test.py +101 -32
- cirq/circuits/frozen_circuit.py +36 -32
- cirq/circuits/insert_strategy.py +10 -0
- cirq/circuits/insert_strategy_test.py +20 -0
- cirq/circuits/moment.py +79 -80
- cirq/circuits/moment_test.py +105 -2
- cirq/circuits/optimization_pass.py +15 -15
- cirq/circuits/optimization_pass_test.py +8 -9
- cirq/circuits/qasm_output.py +64 -33
- cirq/circuits/qasm_output_test.py +63 -2
- cirq/circuits/text_diagram_drawer.py +26 -56
- cirq/circuits/text_diagram_drawer_test.py +5 -4
- cirq/contrib/__init__.py +2 -2
- cirq/contrib/acquaintance/__init__.py +44 -29
- cirq/contrib/acquaintance/bipartite.py +8 -7
- cirq/contrib/acquaintance/bipartite_test.py +11 -1
- cirq/contrib/acquaintance/devices.py +5 -4
- cirq/contrib/acquaintance/devices_test.py +5 -1
- cirq/contrib/acquaintance/executor.py +18 -21
- cirq/contrib/acquaintance/executor_test.py +3 -2
- cirq/contrib/acquaintance/gates.py +36 -27
- cirq/contrib/acquaintance/gates_test.py +1 -1
- cirq/contrib/acquaintance/inspection_utils.py +10 -9
- cirq/contrib/acquaintance/inspection_utils_test.py +6 -1
- cirq/contrib/acquaintance/mutation_utils.py +10 -10
- cirq/contrib/acquaintance/optimizers.py +7 -6
- cirq/contrib/acquaintance/optimizers_test.py +1 -1
- cirq/contrib/acquaintance/permutation.py +22 -21
- cirq/contrib/acquaintance/permutation_test.py +1 -1
- cirq/contrib/acquaintance/shift.py +8 -6
- cirq/contrib/acquaintance/shift_swap_network.py +6 -4
- cirq/contrib/acquaintance/strategies/__init__.py +9 -3
- cirq/contrib/acquaintance/strategies/complete.py +4 -3
- cirq/contrib/acquaintance/strategies/cubic.py +5 -3
- cirq/contrib/acquaintance/strategies/quartic_paired.py +8 -6
- cirq/contrib/acquaintance/topological_sort.py +4 -2
- cirq/contrib/bayesian_network/__init__.py +3 -1
- cirq/contrib/bayesian_network/bayesian_network_gate.py +5 -3
- cirq/contrib/circuitdag/__init__.py +1 -1
- cirq/contrib/circuitdag/circuit_dag.py +24 -24
- cirq/contrib/circuitdag/circuit_dag_test.py +1 -1
- cirq/contrib/custom_simulators/custom_state_simulator.py +10 -8
- cirq/contrib/custom_simulators/custom_state_simulator_test.py +15 -11
- cirq/contrib/graph_device/__init__.py +8 -8
- cirq/contrib/graph_device/graph_device.py +8 -8
- cirq/contrib/graph_device/graph_device_test.py +0 -1
- cirq/contrib/graph_device/hypergraph_test.py +1 -0
- cirq/contrib/json.py +1 -2
- cirq/contrib/json_test.py +2 -2
- cirq/contrib/noise_models/__init__.py +5 -6
- cirq/contrib/noise_models/noise_models.py +8 -6
- cirq/contrib/paulistring/__init__.py +22 -10
- cirq/contrib/paulistring/clifford_optimize.py +1 -1
- cirq/contrib/paulistring/clifford_optimize_test.py +0 -1
- cirq/contrib/paulistring/clifford_target_gateset.py +15 -12
- cirq/contrib/paulistring/optimize.py +2 -2
- cirq/contrib/paulistring/optimize_test.py +0 -1
- cirq/contrib/paulistring/pauli_string_dag_test.py +0 -1
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +379 -0
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +523 -0
- cirq/contrib/paulistring/pauli_string_optimize.py +3 -1
- cirq/contrib/paulistring/pauli_string_optimize_test.py +1 -3
- cirq/contrib/paulistring/recombine.py +2 -2
- cirq/contrib/paulistring/recombine_test.py +2 -2
- cirq/contrib/paulistring/separate.py +3 -4
- cirq/contrib/qasm_import/__init__.py +2 -2
- cirq/contrib/qasm_import/_lexer.py +21 -26
- cirq/contrib/qasm_import/_lexer_test.py +90 -6
- cirq/contrib/qasm_import/_parser.py +238 -47
- cirq/contrib/qasm_import/_parser_test.py +514 -59
- cirq/contrib/qasm_import/qasm_test.py +1 -1
- cirq/contrib/qcircuit/__init__.py +6 -4
- cirq/contrib/qcircuit/qcircuit_diagram.py +5 -2
- cirq/contrib/qcircuit/qcircuit_pdf.py +1 -2
- cirq/{experiments/grid_parallel_two_qubit_xeb_test.py → contrib/qcircuit/qcircuit_pdf_test.py} +13 -12
- cirq/contrib/qcircuit/qcircuit_test.py +1 -1
- cirq/contrib/quantum_volume/__init__.py +7 -7
- cirq/contrib/quantum_volume/quantum_volume.py +6 -11
- cirq/contrib/quantum_volume/quantum_volume_test.py +3 -1
- cirq/contrib/quimb/__init__.py +16 -13
- cirq/contrib/quimb/density_matrix.py +1 -1
- cirq/contrib/quimb/mps_simulator.py +27 -28
- cirq/contrib/quimb/mps_simulator_test.py +5 -0
- cirq/contrib/quimb/state_vector.py +3 -10
- cirq/contrib/quirk/__init__.py +1 -1
- cirq/contrib/quirk/export_to_quirk.py +3 -3
- cirq/contrib/routing/__init__.py +12 -9
- cirq/contrib/routing/device.py +1 -1
- cirq/contrib/routing/device_test.py +1 -2
- cirq/contrib/routing/greedy.py +7 -5
- cirq/contrib/routing/greedy_test.py +5 -3
- cirq/contrib/routing/initialization.py +3 -1
- cirq/contrib/routing/initialization_test.py +1 -1
- cirq/contrib/routing/swap_network.py +6 -6
- cirq/contrib/routing/utils.py +6 -4
- cirq/contrib/routing/utils_test.py +1 -2
- cirq/{type_workarounds.py → contrib/shuffle_circuits/__init__.py} +5 -10
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +250 -0
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +363 -0
- cirq/contrib/svg/__init__.py +1 -1
- cirq/contrib/svg/svg.py +12 -10
- cirq/contrib/svg/svg_test.py +3 -2
- cirq/devices/__init__.py +34 -25
- cirq/devices/device.py +16 -12
- cirq/devices/device_test.py +1 -0
- cirq/devices/grid_device_metadata.py +16 -12
- cirq/devices/grid_device_metadata_test.py +2 -1
- cirq/devices/grid_qubit.py +31 -26
- cirq/devices/grid_qubit_test.py +30 -1
- cirq/devices/insertion_noise_model.py +6 -6
- cirq/devices/insertion_noise_model_test.py +1 -1
- cirq/devices/line_qubit.py +28 -20
- cirq/devices/line_qubit_test.py +26 -0
- cirq/devices/named_topologies.py +12 -10
- cirq/devices/named_topologies_test.py +5 -4
- cirq/devices/noise_model.py +29 -33
- cirq/devices/noise_properties.py +2 -2
- cirq/devices/noise_properties_test.py +2 -2
- cirq/devices/noise_utils.py +3 -3
- cirq/devices/superconducting_qubits_noise_properties.py +2 -2
- cirq/devices/superconducting_qubits_noise_properties_test.py +3 -3
- cirq/devices/thermal_noise_model.py +2 -1
- cirq/devices/unconstrained_device.py +1 -1
- cirq/devices/unconstrained_device_test.py +6 -0
- cirq/experiments/__init__.py +51 -34
- cirq/experiments/qubit_characterizations.py +17 -15
- cirq/experiments/qubit_characterizations_test.py +4 -6
- cirq/experiments/random_quantum_circuit_generation.py +10 -9
- cirq/experiments/random_quantum_circuit_generation_test.py +21 -4
- cirq/experiments/readout_confusion_matrix.py +73 -8
- cirq/experiments/readout_confusion_matrix_test.py +104 -1
- cirq/experiments/single_qubit_readout_calibration.py +8 -6
- cirq/experiments/single_qubit_readout_calibration_test.py +1 -1
- cirq/experiments/t1_decay_experiment.py +4 -5
- cirq/experiments/t1_decay_experiment_test.py +1 -2
- cirq/experiments/t2_decay_experiment.py +0 -1
- cirq/experiments/t2_decay_experiment_test.py +1 -2
- cirq/experiments/two_qubit_xeb.py +157 -33
- cirq/experiments/two_qubit_xeb_test.py +38 -22
- cirq/experiments/xeb_fitting.py +99 -19
- cirq/experiments/xeb_fitting_test.py +64 -25
- cirq/experiments/xeb_sampling.py +14 -18
- cirq/experiments/xeb_simulation.py +4 -3
- cirq/experiments/xeb_simulation_test.py +20 -14
- cirq/experiments/z_phase_calibration.py +368 -0
- cirq/experiments/z_phase_calibration_test.py +241 -0
- cirq/interop/__init__.py +4 -1
- cirq/interop/quirk/__init__.py +7 -4
- cirq/interop/quirk/cells/__init__.py +17 -6
- cirq/interop/quirk/cells/arithmetic_cells.py +8 -8
- cirq/interop/quirk/cells/arithmetic_cells_test.py +1 -1
- cirq/interop/quirk/cells/cell.py +6 -6
- cirq/interop/quirk/cells/composite_cell.py +5 -5
- cirq/interop/quirk/cells/composite_cell_test.py +1 -1
- cirq/interop/quirk/cells/control_cells.py +1 -1
- cirq/interop/quirk/cells/frequency_space_cells.py +2 -2
- cirq/interop/quirk/cells/ignored_cells.py +1 -1
- cirq/interop/quirk/cells/input_cells.py +1 -1
- cirq/interop/quirk/cells/input_cells_test.py +1 -1
- cirq/interop/quirk/cells/input_rotation_cells.py +1 -1
- cirq/interop/quirk/cells/input_rotation_cells_test.py +1 -1
- cirq/interop/quirk/cells/measurement_cells.py +1 -1
- cirq/interop/quirk/cells/parse.py +8 -7
- cirq/interop/quirk/cells/parse_test.py +2 -2
- cirq/interop/quirk/cells/single_qubit_rotation_cells.py +1 -1
- cirq/interop/quirk/cells/swap_cell_test.py +1 -1
- cirq/interop/quirk/cells/unsupported_cells.py +1 -1
- cirq/interop/quirk/url_to_circuit.py +7 -7
- cirq/interop/quirk/url_to_circuit_test.py +1 -1
- cirq/ion/__init__.py +4 -2
- cirq/json_resolver_cache.py +15 -7
- cirq/linalg/__init__.py +62 -51
- cirq/linalg/combinators.py +4 -4
- cirq/linalg/combinators_test.py +4 -1
- cirq/linalg/decompositions.py +15 -40
- cirq/linalg/decompositions_test.py +16 -22
- cirq/linalg/diagonalize.py +1 -1
- cirq/linalg/diagonalize_test.py +1 -1
- cirq/linalg/operator_spaces.py +20 -4
- cirq/linalg/operator_spaces_test.py +15 -2
- cirq/linalg/predicates.py +3 -3
- cirq/linalg/predicates_test.py +1 -0
- cirq/linalg/tolerance.py +2 -2
- cirq/linalg/transformations.py +30 -12
- cirq/linalg/transformations_test.py +13 -0
- cirq/neutral_atoms/__init__.py +2 -2
- cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +0 -1
- cirq/ops/__init__.py +172 -132
- cirq/ops/arithmetic_operation.py +2 -2
- cirq/ops/arithmetic_operation_test.py +2 -2
- cirq/ops/boolean_hamiltonian.py +3 -2
- cirq/ops/classically_controlled_operation.py +39 -12
- cirq/ops/classically_controlled_operation_test.py +147 -1
- cirq/ops/clifford_gate.py +38 -36
- cirq/ops/clifford_gate_test.py +75 -1
- cirq/ops/common_channels.py +16 -45
- cirq/ops/common_channels_test.py +10 -0
- cirq/ops/common_gate_families.py +1 -1
- cirq/ops/common_gate_families_test.py +1 -0
- cirq/ops/common_gates.py +48 -49
- cirq/ops/common_gates_test.py +18 -2
- cirq/ops/control_values.py +3 -3
- cirq/ops/control_values_test.py +2 -1
- cirq/ops/controlled_gate.py +36 -23
- cirq/ops/controlled_gate_test.py +70 -3
- cirq/ops/controlled_operation.py +6 -5
- cirq/ops/controlled_operation_test.py +7 -3
- cirq/ops/dense_pauli_string.py +11 -11
- cirq/ops/diagonal_gate.py +2 -2
- cirq/ops/diagonal_gate_test.py +1 -0
- cirq/ops/eigen_gate.py +16 -36
- cirq/ops/eigen_gate_test.py +60 -10
- cirq/ops/fourier_transform.py +1 -3
- cirq/ops/fourier_transform_test.py +2 -1
- cirq/ops/fsim_gate.py +42 -3
- cirq/ops/fsim_gate_test.py +21 -0
- cirq/ops/gate_operation.py +8 -8
- cirq/ops/gate_operation_test.py +4 -2
- cirq/ops/gateset_test.py +11 -2
- cirq/ops/global_phase_op.py +8 -7
- cirq/ops/global_phase_op_test.py +1 -1
- cirq/ops/greedy_qubit_manager_test.py +5 -0
- cirq/ops/identity.py +14 -4
- cirq/ops/identity_test.py +24 -0
- cirq/ops/kraus_channel.py +1 -0
- cirq/ops/kraus_channel_test.py +3 -1
- cirq/ops/linear_combinations.py +27 -21
- cirq/ops/linear_combinations_test.py +23 -4
- cirq/ops/matrix_gates.py +24 -8
- cirq/ops/measure_util.py +2 -2
- cirq/ops/measurement_gate.py +7 -4
- cirq/ops/measurement_gate_test.py +2 -1
- cirq/ops/mixed_unitary_channel.py +1 -0
- cirq/ops/mixed_unitary_channel_test.py +3 -1
- cirq/ops/named_qubit.py +8 -1
- cirq/ops/op_tree.py +3 -30
- cirq/ops/op_tree_test.py +4 -0
- cirq/ops/parallel_gate.py +2 -3
- cirq/ops/parallel_gate_test.py +2 -1
- cirq/ops/parity_gates.py +7 -8
- cirq/ops/parity_gates_test.py +1 -0
- cirq/ops/pauli_gates.py +5 -11
- cirq/ops/pauli_gates_test.py +1 -0
- cirq/ops/pauli_interaction_gate.py +11 -5
- cirq/ops/pauli_interaction_gate_test.py +2 -3
- cirq/ops/pauli_measurement_gate.py +6 -5
- cirq/ops/pauli_measurement_gate_test.py +1 -0
- cirq/ops/pauli_string.py +115 -130
- cirq/ops/pauli_string_phasor.py +21 -20
- cirq/ops/pauli_string_phasor_test.py +13 -3
- cirq/ops/pauli_string_raw_types.py +1 -0
- cirq/ops/pauli_string_test.py +192 -55
- cirq/ops/pauli_sum_exponential.py +3 -4
- cirq/ops/pauli_sum_exponential_test.py +0 -1
- cirq/ops/permutation_gate.py +2 -2
- cirq/ops/permutation_gate_test.py +1 -1
- cirq/ops/phased_iswap_gate.py +6 -7
- cirq/ops/phased_iswap_gate_test.py +21 -5
- cirq/ops/phased_x_gate.py +11 -25
- cirq/ops/phased_x_gate_test.py +19 -3
- cirq/ops/phased_x_z_gate.py +12 -11
- cirq/ops/projector.py +4 -5
- cirq/ops/qubit_manager.py +2 -1
- cirq/ops/qubit_manager_test.py +2 -1
- cirq/ops/qubit_order.py +1 -1
- cirq/ops/random_gate_channel.py +1 -1
- cirq/ops/random_gate_channel_test.py +0 -6
- cirq/ops/raw_types.py +146 -50
- cirq/ops/raw_types_test.py +37 -3
- cirq/ops/state_preparation_channel.py +2 -2
- cirq/ops/state_preparation_channel_test.py +2 -1
- cirq/ops/swap_gates.py +9 -4
- cirq/ops/three_qubit_gates.py +8 -8
- cirq/ops/three_qubit_gates_test.py +1 -0
- cirq/ops/two_qubit_diagonal_gate.py +4 -3
- cirq/ops/uniform_superposition_gate.py +4 -4
- cirq/ops/uniform_superposition_gate_test.py +1 -0
- cirq/ops/wait_gate.py +6 -8
- cirq/protocols/__init__.py +135 -83
- cirq/protocols/act_on_protocol.py +1 -1
- cirq/protocols/act_on_protocol_test.py +1 -1
- cirq/protocols/apply_channel_protocol.py +3 -3
- cirq/protocols/apply_mixture_protocol.py +15 -9
- cirq/protocols/apply_mixture_protocol_test.py +11 -0
- cirq/protocols/apply_unitary_protocol.py +2 -2
- cirq/protocols/apply_unitary_protocol_test.py +2 -1
- cirq/protocols/approximate_equality_protocol.py +7 -8
- cirq/protocols/approximate_equality_protocol_test.py +3 -1
- cirq/protocols/circuit_diagram_info_protocol.py +8 -6
- cirq/protocols/circuit_diagram_info_protocol_test.py +5 -0
- cirq/protocols/commutes_protocol.py +6 -6
- cirq/protocols/control_key_protocol.py +1 -1
- cirq/protocols/decompose_protocol.py +4 -5
- cirq/protocols/decompose_protocol_test.py +2 -1
- cirq/protocols/equal_up_to_global_phase_protocol.py +3 -3
- cirq/protocols/equal_up_to_global_phase_protocol_test.py +7 -0
- cirq/protocols/has_stabilizer_effect_protocol.py +5 -5
- cirq/protocols/has_unitary_protocol.py +1 -1
- cirq/protocols/has_unitary_protocol_test.py +8 -7
- cirq/protocols/hash_from_pickle_test.py +120 -0
- cirq/protocols/inverse_protocol.py +1 -1
- cirq/protocols/json_serialization.py +14 -1
- cirq/protocols/json_serialization_test.py +28 -7
- cirq/protocols/json_test_data/BitMaskKeyCondition.json +86 -0
- cirq/protocols/json_test_data/BitMaskKeyCondition.repr +7 -0
- cirq/protocols/json_test_data/Concat.json +19 -0
- cirq/protocols/json_test_data/Concat.repr +1 -0
- cirq/protocols/json_test_data/README.md +4 -2
- cirq/protocols/json_test_data/SympyCondition.json +60 -15
- cirq/protocols/json_test_data/SympyCondition.repr +4 -1
- cirq/protocols/json_test_data/_InverseCompositeGate.json +10 -0
- cirq/protocols/json_test_data/_InverseCompositeGate.repr +1 -0
- cirq/protocols/json_test_data/__init__.py +1 -1
- cirq/protocols/json_test_data/sympy.And.json +13 -0
- cirq/protocols/json_test_data/sympy.And.repr +1 -0
- cirq/protocols/json_test_data/sympy.Indexed.json +18 -0
- cirq/protocols/json_test_data/sympy.Indexed.repr +1 -0
- cirq/protocols/json_test_data/sympy.IndexedBase.json +9 -0
- cirq/protocols/json_test_data/sympy.IndexedBase.repr +1 -0
- cirq/protocols/json_test_data/sympy.Not.json +9 -0
- cirq/protocols/json_test_data/sympy.Not.repr +1 -0
- cirq/protocols/json_test_data/sympy.Or.json +13 -0
- cirq/protocols/json_test_data/sympy.Or.repr +1 -0
- cirq/protocols/json_test_data/sympy.Xor.json +13 -0
- cirq/protocols/json_test_data/sympy.Xor.repr +1 -0
- cirq/protocols/kraus_protocol.py +8 -8
- cirq/protocols/kraus_protocol_test.py +0 -1
- cirq/protocols/measurement_key_protocol.py +1 -1
- cirq/protocols/measurement_key_protocol_test.py +7 -7
- cirq/protocols/mixture_protocol.py +6 -4
- cirq/protocols/mixture_protocol_test.py +21 -13
- cirq/protocols/pauli_expansion_protocol.py +1 -0
- cirq/protocols/pow_protocol.py +1 -1
- cirq/protocols/qasm.py +25 -6
- cirq/protocols/qasm_test.py +17 -0
- cirq/protocols/qid_shape_protocol.py +2 -2
- cirq/protocols/resolve_parameters.py +2 -3
- cirq/protocols/resolve_parameters_test.py +2 -1
- cirq/protocols/trace_distance_bound.py +1 -1
- cirq/protocols/trace_distance_bound_test.py +1 -0
- cirq/protocols/unitary_protocol.py +3 -3
- cirq/protocols/unitary_protocol_test.py +1 -1
- cirq/qis/__init__.py +48 -35
- cirq/qis/channels_test.py +0 -9
- cirq/qis/clifford_tableau.py +46 -26
- cirq/qis/clifford_tableau_test.py +2 -1
- cirq/qis/entropy.py +115 -0
- cirq/qis/entropy_test.py +43 -0
- cirq/qis/measures.py +5 -4
- cirq/qis/measures_test.py +7 -0
- cirq/qis/noise_utils_test.py +4 -4
- cirq/qis/quantum_state_representation.py +1 -1
- cirq/qis/states.py +7 -7
- cirq/sim/__init__.py +55 -37
- cirq/sim/classical_simulator.py +7 -6
- cirq/sim/classical_simulator_test.py +3 -1
- cirq/sim/clifford/__init__.py +17 -9
- cirq/sim/clifford/clifford_simulator.py +5 -4
- cirq/sim/clifford/clifford_simulator_test.py +32 -9
- cirq/sim/clifford/clifford_tableau_simulation_state.py +1 -1
- cirq/sim/clifford/stabilizer_simulation_state.py +1 -1
- cirq/sim/clifford/stabilizer_state_ch_form.py +4 -3
- cirq/sim/density_matrix_simulator.py +3 -2
- cirq/sim/density_matrix_simulator_test.py +12 -4
- cirq/sim/density_matrix_utils.py +1 -1
- cirq/sim/mux.py +2 -2
- cirq/sim/simulation_state.py +4 -5
- cirq/sim/simulation_state_base.py +2 -2
- cirq/sim/simulation_state_test.py +1 -1
- cirq/sim/simulation_utils.py +3 -1
- cirq/sim/simulation_utils_test.py +2 -3
- cirq/sim/simulator.py +7 -6
- cirq/sim/simulator_base.py +5 -5
- cirq/sim/simulator_test.py +14 -3
- cirq/sim/sparse_simulator.py +4 -3
- cirq/sim/sparse_simulator_test.py +17 -9
- cirq/sim/state_vector.py +2 -2
- cirq/sim/state_vector_simulation_state_test.py +1 -1
- cirq/sim/state_vector_simulator.py +4 -4
- cirq/sim/state_vector_test.py +27 -32
- cirq/study/__init__.py +27 -21
- cirq/study/flatten_expressions.py +5 -6
- cirq/study/flatten_expressions_test.py +1 -1
- cirq/study/resolver.py +14 -11
- cirq/study/resolver_test.py +10 -1
- cirq/study/result.py +3 -3
- cirq/study/sweepable.py +15 -9
- cirq/study/sweepable_test.py +27 -0
- cirq/study/sweeps.py +65 -10
- cirq/study/sweeps_test.py +123 -0
- cirq/testing/__init__.py +86 -57
- cirq/testing/_compat_test_data/module_a/__init__.py +2 -2
- cirq/testing/_compat_test_data/module_a/sub/subsub/__init__.py +1 -1
- cirq/testing/circuit_compare.py +3 -4
- cirq/testing/circuit_compare_test.py +7 -8
- cirq/testing/consistent_act_on.py +3 -3
- cirq/testing/consistent_channels_test.py +2 -1
- cirq/testing/consistent_controlled_gate_op.py +3 -2
- cirq/testing/consistent_controlled_gate_op_test.py +2 -3
- cirq/testing/consistent_decomposition.py +1 -1
- cirq/testing/consistent_decomposition_test.py +1 -2
- cirq/testing/consistent_pauli_expansion_test.py +1 -1
- cirq/testing/consistent_phase_by.py +1 -1
- cirq/testing/consistent_phase_by_test.py +1 -2
- cirq/testing/consistent_protocols.py +11 -11
- cirq/testing/consistent_protocols_test.py +4 -5
- cirq/testing/consistent_qasm.py +8 -12
- cirq/testing/consistent_qasm_test.py +1 -1
- cirq/testing/consistent_resolve_parameters.py +2 -1
- cirq/testing/consistent_specified_has_unitary_test.py +1 -1
- cirq/testing/consistent_unitary.py +3 -1
- cirq/testing/consistent_unitary_test.py +3 -3
- cirq/testing/devices.py +1 -1
- cirq/testing/devices_test.py +1 -0
- cirq/testing/equals_tester.py +2 -4
- cirq/testing/equals_tester_test.py +6 -5
- cirq/testing/equivalent_basis_map.py +1 -0
- cirq/testing/equivalent_basis_map_test.py +0 -1
- cirq/testing/gate_features_test.py +5 -0
- cirq/testing/json.py +4 -4
- cirq/testing/lin_alg_utils_test.py +1 -1
- cirq/testing/order_tester.py +1 -1
- cirq/testing/order_tester_test.py +1 -1
- cirq/testing/pytest_utils.py +57 -0
- cirq/testing/pytest_utils_test.py +35 -0
- cirq/testing/random_circuit.py +2 -2
- cirq/testing/random_circuit_test.py +2 -2
- cirq/testing/routing_devices_test.py +2 -1
- cirq/testing/sample_circuits.py +1 -1
- cirq/testing/sample_gates.py +5 -4
- cirq/testing/sample_gates_test.py +2 -2
- cirq/transformers/__init__.py +101 -82
- cirq/transformers/align.py +12 -1
- cirq/transformers/align_test.py +13 -0
- cirq/transformers/analytical_decompositions/__init__.py +27 -24
- cirq/transformers/analytical_decompositions/clifford_decomposition.py +2 -1
- cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +1 -1
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +1 -1
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
- cirq/transformers/analytical_decompositions/cphase_to_fsim.py +1 -1
- cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +1 -1
- cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +2 -2
- cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +4 -4
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +99 -24
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +105 -14
- cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +1 -1
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +1 -1
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +1 -0
- cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +3 -4
- cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +1 -1
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +2 -1
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +5 -6
- cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +2 -2
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +1 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +1 -2
- cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +2 -2
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +2 -2
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -1
- cirq/transformers/drop_empty_moments.py +1 -0
- cirq/transformers/drop_negligible_operations.py +1 -0
- cirq/transformers/dynamical_decoupling.py +255 -43
- cirq/transformers/dynamical_decoupling_test.py +730 -17
- cirq/transformers/eject_phased_paulis.py +29 -15
- cirq/transformers/eject_phased_paulis_test.py +3 -8
- cirq/transformers/eject_z.py +3 -2
- cirq/transformers/eject_z_test.py +3 -3
- cirq/transformers/gauge_compiling/__init__.py +25 -9
- cirq/transformers/gauge_compiling/cphase_gauge.py +146 -0
- cirq/transformers/gauge_compiling/cphase_gauge_test.py +42 -0
- cirq/transformers/gauge_compiling/cz_gauge.py +4 -4
- cirq/transformers/gauge_compiling/gauge_compiling.py +245 -6
- cirq/transformers/gauge_compiling/gauge_compiling_test.py +107 -2
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +39 -2
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +10 -1
- cirq/transformers/gauge_compiling/iswap_gauge.py +2 -2
- cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -2
- cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +23 -5
- cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +3 -2
- cirq/transformers/heuristic_decompositions/__init__.py +3 -3
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +2 -1
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +1 -1
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +4 -4
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +4 -4
- cirq/transformers/insertion_sort.py +64 -0
- cirq/transformers/insertion_sort_test.py +34 -0
- cirq/transformers/measurement_transformers.py +14 -1
- cirq/transformers/measurement_transformers_test.py +35 -0
- cirq/transformers/merge_k_qubit_gates.py +2 -2
- cirq/transformers/merge_single_qubit_gates.py +1 -1
- cirq/transformers/merge_single_qubit_gates_test.py +1 -1
- cirq/transformers/noise_adding.py +115 -0
- cirq/transformers/noise_adding_test.py +54 -0
- cirq/transformers/optimize_for_target_gateset.py +1 -1
- cirq/transformers/optimize_for_target_gateset_test.py +3 -2
- cirq/transformers/qubit_management_transformers.py +1 -1
- cirq/transformers/randomized_measurements.py +171 -0
- cirq/transformers/randomized_measurements_test.py +68 -0
- cirq/transformers/routing/__init__.py +14 -5
- cirq/transformers/routing/initial_mapper.py +1 -1
- cirq/transformers/routing/initial_mapper_test.py +1 -0
- cirq/transformers/routing/line_initial_mapper.py +3 -2
- cirq/transformers/routing/mapping_manager.py +2 -2
- cirq/transformers/routing/mapping_manager_test.py +2 -2
- cirq/transformers/routing/route_circuit_cqc.py +3 -2
- cirq/transformers/routing/route_circuit_cqc_test.py +2 -1
- cirq/transformers/routing/visualize_routed_circuit.py +1 -0
- cirq/transformers/routing/visualize_routed_circuit_test.py +1 -0
- cirq/transformers/stratify.py +2 -2
- cirq/transformers/synchronize_terminal_measurements.py +2 -1
- cirq/transformers/target_gatesets/__init__.py +7 -5
- cirq/transformers/target_gatesets/compilation_target_gateset.py +16 -3
- cirq/transformers/target_gatesets/compilation_target_gateset_test.py +2 -0
- cirq/transformers/target_gatesets/cz_gateset.py +5 -1
- cirq/transformers/target_gatesets/cz_gateset_test.py +23 -2
- cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +1 -1
- cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +3 -2
- cirq/transformers/transformer_api.py +5 -4
- cirq/transformers/transformer_api_test.py +11 -3
- cirq/transformers/transformer_primitives.py +9 -31
- cirq/transformers/transformer_primitives_test.py +6 -5
- cirq/value/__init__.py +51 -30
- cirq/value/abc_alt.py +1 -2
- cirq/value/angle.py +2 -0
- cirq/value/classical_data.py +1 -0
- cirq/value/condition.py +149 -3
- cirq/value/condition_test.py +254 -0
- cirq/value/digits.py +1 -1
- cirq/value/duration.py +4 -4
- cirq/value/duration_test.py +2 -1
- cirq/value/linear_dict.py +85 -24
- cirq/value/linear_dict_test.py +94 -3
- cirq/value/measurement_key.py +9 -2
- cirq/value/periodic_value.py +2 -3
- cirq/value/periodic_value_test.py +5 -0
- cirq/value/probability.py +1 -0
- cirq/value/random_state.py +1 -1
- cirq/value/timestamp.py +2 -4
- cirq/value/timestamp_test.py +2 -1
- cirq/value/type_alias.py +2 -2
- cirq/value/value_equality_attr.py +14 -2
- cirq/value/value_equality_attr_test.py +1 -1
- cirq/vis/__init__.py +9 -6
- cirq/vis/density_matrix.py +1 -1
- cirq/vis/density_matrix_test.py +2 -5
- cirq/vis/heatmap.py +49 -12
- cirq/vis/heatmap_test.py +168 -4
- cirq/vis/histogram.py +1 -1
- cirq/vis/histogram_test.py +1 -2
- cirq/vis/state_histogram.py +7 -5
- cirq/vis/state_histogram_test.py +2 -2
- cirq/work/__init__.py +19 -13
- cirq/work/collector.py +2 -2
- cirq/work/observable_grouping.py +2 -2
- cirq/work/observable_measurement.py +3 -3
- cirq/work/observable_measurement_data.py +5 -2
- cirq/work/observable_measurement_test.py +8 -8
- cirq/work/observable_readout_calibration.py +2 -2
- cirq/work/observable_readout_calibration_test.py +2 -1
- cirq/work/observable_settings.py +8 -7
- cirq/work/observable_settings_test.py +3 -2
- cirq/work/pauli_sum_collector.py +1 -1
- cirq/work/sampler.py +8 -20
- cirq/work/sampler_test.py +4 -3
- cirq/work/zeros_sampler.py +1 -1
- cirq_core-1.5.0.dist-info/METADATA +125 -0
- {cirq_core-1.4.0.dev20240529225110.dist-info → cirq_core-1.5.0.dist-info}/RECORD +586 -552
- {cirq_core-1.4.0.dev20240529225110.dist-info → cirq_core-1.5.0.dist-info}/WHEEL +1 -1
- cirq/experiments/grid_parallel_two_qubit_xeb.py +0 -62
- cirq/protocols/json_test_data/GridParallelXEBMetadata.json +0 -119
- cirq/protocols/json_test_data/GridParallelXEBMetadata.repr +0 -1
- cirq_core-1.4.0.dev20240529225110.dist-info/METADATA +0 -50
- {cirq_core-1.4.0.dev20240529225110.dist-info → cirq_core-1.5.0.dist-info}/LICENSE +0 -0
- {cirq_core-1.4.0.dev20240529225110.dist-info → cirq_core-1.5.0.dist-info}/top_level.txt +0 -0
|
@@ -1,4 +1,16 @@
|
|
|
1
|
-
#
|
|
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.
|
|
2
14
|
import itertools
|
|
3
15
|
|
|
4
16
|
import numpy as np
|
|
@@ -91,12 +103,17 @@ def test_simulate_initial_state():
|
|
|
91
103
|
circuit.append(cirq.X(q1))
|
|
92
104
|
circuit.append(cirq.measure(q0, q1))
|
|
93
105
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
106
|
+
for initial_state in [
|
|
107
|
+
cirq.StabilizerChFormSimulationState(
|
|
108
|
+
qubits=cirq.LineQubit.range(2), initial_state=1
|
|
109
|
+
)
|
|
110
|
+
]:
|
|
111
|
+
result = simulator.simulate(circuit, initial_state=initial_state)
|
|
112
|
+
expected_state = np.zeros(shape=(2, 2))
|
|
113
|
+
expected_state[b0][1 - b1] = 1.0
|
|
114
|
+
np.testing.assert_almost_equal(
|
|
115
|
+
result.final_state.to_numpy(), np.reshape(expected_state, 4)
|
|
116
|
+
)
|
|
100
117
|
|
|
101
118
|
|
|
102
119
|
def test_simulation_state():
|
|
@@ -208,6 +225,8 @@ def test_clifford_state_initial_state():
|
|
|
208
225
|
state = cirq.CliffordState(qubit_map={q0: 0}, initial_state=1)
|
|
209
226
|
np.testing.assert_allclose(state.state_vector(), [0, 1])
|
|
210
227
|
|
|
228
|
+
assert state.copy() == state
|
|
229
|
+
|
|
211
230
|
|
|
212
231
|
def test_clifford_trial_result_repr():
|
|
213
232
|
q0 = cirq.LineQubit(0)
|
|
@@ -476,10 +495,10 @@ def test_is_supported_operation():
|
|
|
476
495
|
raise NotImplementedError()
|
|
477
496
|
|
|
478
497
|
def _has_unitary_(self):
|
|
479
|
-
return True
|
|
498
|
+
return True # pragma: no cover
|
|
480
499
|
|
|
481
500
|
def _unitary_(self):
|
|
482
|
-
assert False
|
|
501
|
+
assert False # pragma: no cover
|
|
483
502
|
|
|
484
503
|
q1, q2 = cirq.LineQubit.range(2)
|
|
485
504
|
assert cirq.CliffordSimulator.is_supported_operation(cirq.X(q1))
|
|
@@ -548,6 +567,10 @@ def test_valid_apply_measurement():
|
|
|
548
567
|
q0 = cirq.LineQubit(0)
|
|
549
568
|
state = cirq.CliffordState(qubit_map={q0: 0}, initial_state=1)
|
|
550
569
|
measurements = {}
|
|
570
|
+
_ = state.apply_measurement(
|
|
571
|
+
cirq.measure(q0), measurements, np.random.RandomState(), collapse_state_vector=False
|
|
572
|
+
)
|
|
573
|
+
assert measurements == {'q(0)': [1]}
|
|
551
574
|
state.apply_measurement(cirq.measure(q0), measurements, np.random.RandomState())
|
|
552
575
|
assert measurements == {'q(0)': [1]}
|
|
553
576
|
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
"""A protocol for implementing high performance clifford tableau evolutions
|
|
15
|
-
|
|
15
|
+
for Clifford Simulator."""
|
|
16
16
|
|
|
17
17
|
from typing import Optional, Sequence, TYPE_CHECKING
|
|
18
18
|
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
import abc
|
|
16
|
+
from types import NotImplementedType
|
|
16
17
|
from typing import Any, cast, Generic, Optional, Sequence, TYPE_CHECKING, TypeVar, Union
|
|
17
18
|
|
|
18
19
|
import numpy as np
|
|
@@ -23,7 +24,6 @@ from cirq.ops import common_gates, global_phase_op, matrix_gates, swap_gates
|
|
|
23
24
|
from cirq.ops.clifford_gate import SingleQubitCliffordGate
|
|
24
25
|
from cirq.protocols import has_unitary, num_qubits, unitary
|
|
25
26
|
from cirq.sim.simulation_state import SimulationState
|
|
26
|
-
from cirq.type_workarounds import NotImplementedType
|
|
27
27
|
|
|
28
28
|
if TYPE_CHECKING:
|
|
29
29
|
import cirq
|
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from typing import Any, Dict, List, Sequence
|
|
15
|
+
from typing import Any, Dict, List, Sequence
|
|
16
|
+
|
|
16
17
|
import numpy as np
|
|
17
18
|
|
|
18
19
|
import cirq
|
|
@@ -20,7 +21,7 @@ from cirq import protocols, qis, value
|
|
|
20
21
|
from cirq.value import big_endian_int_to_digits, random_state
|
|
21
22
|
|
|
22
23
|
|
|
23
|
-
@value.value_equality
|
|
24
|
+
@value.value_equality(unhashable=True)
|
|
24
25
|
class StabilizerStateChForm(qis.StabilizerState):
|
|
25
26
|
r"""A representation of stabilizer states using the CH form,
|
|
26
27
|
|
|
@@ -101,7 +102,7 @@ class StabilizerStateChForm(qis.StabilizerState):
|
|
|
101
102
|
"""Return the CH form representation of the state."""
|
|
102
103
|
return f'StabilizerStateChForm(num_qubits={self.n!r})'
|
|
103
104
|
|
|
104
|
-
def inner_product_of_state_and_x(self, x: int) ->
|
|
105
|
+
def inner_product_of_state_and_x(self, x: int) -> complex:
|
|
105
106
|
"""Returns the amplitude of x'th element of
|
|
106
107
|
the state vector, i.e. <x|psi>"""
|
|
107
108
|
if type(x) == int:
|
|
@@ -18,7 +18,7 @@ import numpy as np
|
|
|
18
18
|
|
|
19
19
|
from cirq import ops, protocols, study, value
|
|
20
20
|
from cirq._compat import proper_repr
|
|
21
|
-
from cirq.sim import
|
|
21
|
+
from cirq.sim import density_matrix_simulation_state, simulator, simulator_base
|
|
22
22
|
|
|
23
23
|
if TYPE_CHECKING:
|
|
24
24
|
import cirq
|
|
@@ -168,7 +168,8 @@ class DensityMatrixSimulator(
|
|
|
168
168
|
DensityMatrixSimulationState for the circuit.
|
|
169
169
|
"""
|
|
170
170
|
if isinstance(initial_state, density_matrix_simulation_state.DensityMatrixSimulationState):
|
|
171
|
-
|
|
171
|
+
# Instances of SimulationStateBase usually returned before this point
|
|
172
|
+
return initial_state # pragma: no cover
|
|
172
173
|
|
|
173
174
|
return density_matrix_simulation_state.DensityMatrixSimulationState(
|
|
174
175
|
qubits=qubits,
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
import itertools
|
|
15
15
|
import random
|
|
16
|
-
from typing import Type
|
|
16
|
+
from typing import Type, Union
|
|
17
17
|
from unittest import mock
|
|
18
18
|
|
|
19
19
|
import numpy as np
|
|
@@ -402,10 +402,10 @@ def test_run_param_resolver(dtype: Type[np.complexfloating], split: bool):
|
|
|
402
402
|
cirq.measure(q1),
|
|
403
403
|
)
|
|
404
404
|
param_resolver = {'b0': b0, 'b1': b1}
|
|
405
|
-
result = simulator.run(circuit, param_resolver=param_resolver)
|
|
405
|
+
result = simulator.run(circuit, param_resolver=param_resolver)
|
|
406
406
|
np.testing.assert_equal(result.measurements, {'q(0)': [[b0]], 'q(1)': [[b1]]})
|
|
407
407
|
# pylint: disable=line-too-long
|
|
408
|
-
np.testing.assert_equal(result.params, cirq.ParamResolver(param_resolver))
|
|
408
|
+
np.testing.assert_equal(result.params, cirq.ParamResolver(param_resolver))
|
|
409
409
|
|
|
410
410
|
|
|
411
411
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
@@ -584,7 +584,15 @@ def test_simulate_qudit_increments(dtype: Type[np.complexfloating], split: bool)
|
|
|
584
584
|
|
|
585
585
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
586
586
|
@pytest.mark.parametrize('split', [True, False])
|
|
587
|
-
|
|
587
|
+
@pytest.mark.parametrize(
|
|
588
|
+
'initial_state',
|
|
589
|
+
[1, cirq.DensityMatrixSimulationState(initial_state=1, qubits=cirq.LineQubit.range(2))],
|
|
590
|
+
)
|
|
591
|
+
def test_simulate_initial_state(
|
|
592
|
+
dtype: Type[np.complexfloating],
|
|
593
|
+
split: bool,
|
|
594
|
+
initial_state: Union[int, cirq.DensityMatrixSimulationState],
|
|
595
|
+
):
|
|
588
596
|
q0, q1 = cirq.LineQubit.range(2)
|
|
589
597
|
simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
|
|
590
598
|
for b0 in [0, 1]:
|
cirq/sim/density_matrix_utils.py
CHANGED
cirq/sim/mux.py
CHANGED
|
@@ -21,9 +21,9 @@ from typing import List, Optional, Sequence, Type, TYPE_CHECKING, Union
|
|
|
21
21
|
|
|
22
22
|
import numpy as np
|
|
23
23
|
|
|
24
|
-
from cirq import circuits,
|
|
24
|
+
from cirq import circuits, devices, ops, protocols, study, value
|
|
25
25
|
from cirq._doc import document
|
|
26
|
-
from cirq.sim import
|
|
26
|
+
from cirq.sim import density_matrix_simulator, sparse_simulator
|
|
27
27
|
from cirq.sim.clifford import clifford_simulator
|
|
28
28
|
from cirq.transformers import measurement_transformers
|
|
29
29
|
|
cirq/sim/simulation_state.py
CHANGED
|
@@ -24,16 +24,15 @@ from typing import (
|
|
|
24
24
|
Optional,
|
|
25
25
|
Sequence,
|
|
26
26
|
Set,
|
|
27
|
-
TypeVar,
|
|
28
|
-
TYPE_CHECKING,
|
|
29
27
|
Tuple,
|
|
28
|
+
TYPE_CHECKING,
|
|
29
|
+
TypeVar,
|
|
30
30
|
)
|
|
31
|
-
from typing_extensions import Self
|
|
32
31
|
|
|
33
32
|
import numpy as np
|
|
33
|
+
from typing_extensions import Self
|
|
34
34
|
|
|
35
35
|
from cirq import ops, protocols, value
|
|
36
|
-
|
|
37
36
|
from cirq.sim.simulation_state_base import SimulationStateBase
|
|
38
37
|
|
|
39
38
|
TState = TypeVar('TState', bound='cirq.QuantumStateRepresentation')
|
|
@@ -337,7 +336,7 @@ def strat_act_on_from_apply_decompose(
|
|
|
337
336
|
curr_ancilla = tuple(q for q in operation.qubits if q not in args.qubits)
|
|
338
337
|
args = args.add_qubits(curr_ancilla)
|
|
339
338
|
if args is NotImplemented:
|
|
340
|
-
return NotImplemented
|
|
339
|
+
return NotImplemented # pragma: no cover
|
|
341
340
|
all_ancilla.update(curr_ancilla)
|
|
342
341
|
protocols.act_on(operation, args)
|
|
343
342
|
args = args.remove_qubits(tuple(all_ancilla))
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
"""An interface for quantum states as targets for operations."""
|
|
15
15
|
import abc
|
|
16
|
+
from types import NotImplementedType
|
|
16
17
|
from typing import (
|
|
17
18
|
Any,
|
|
18
19
|
Dict,
|
|
@@ -27,12 +28,11 @@ from typing import (
|
|
|
27
28
|
TypeVar,
|
|
28
29
|
Union,
|
|
29
30
|
)
|
|
30
|
-
from typing_extensions import Self
|
|
31
31
|
|
|
32
32
|
import numpy as np
|
|
33
|
+
from typing_extensions import Self
|
|
33
34
|
|
|
34
35
|
from cirq import protocols, value
|
|
35
|
-
from cirq.type_workarounds import NotImplementedType
|
|
36
36
|
|
|
37
37
|
if TYPE_CHECKING:
|
|
38
38
|
import cirq
|
cirq/sim/simulation_utils.py
CHANGED
|
@@ -11,12 +11,11 @@
|
|
|
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
|
-
import pytest
|
|
15
|
-
|
|
16
14
|
import numpy as np
|
|
15
|
+
import pytest
|
|
17
16
|
|
|
18
|
-
from cirq.sim import simulation_utils
|
|
19
17
|
from cirq import testing
|
|
18
|
+
from cirq.sim import simulation_utils
|
|
20
19
|
|
|
21
20
|
|
|
22
21
|
@pytest.mark.parametrize('n,m', [(n, m) for n in range(1, 4) for m in range(1, n + 1)])
|
cirq/sim/simulator.py
CHANGED
|
@@ -912,7 +912,7 @@ class SimulationTrialResult(Generic[TSimulatorState]):
|
|
|
912
912
|
def __str__(self) -> str:
|
|
913
913
|
def bitstring(vals):
|
|
914
914
|
separator = ' ' if np.max(vals) >= 10 else ''
|
|
915
|
-
return separator.join(str(
|
|
915
|
+
return separator.join(str(v.item()) for v in vals)
|
|
916
916
|
|
|
917
917
|
results = sorted([(key, bitstring(val)) for key, val in self.measurements.items()])
|
|
918
918
|
if not results:
|
|
@@ -973,9 +973,10 @@ def split_into_matching_protocol_then_general(
|
|
|
973
973
|
qubit A will cause later operations on A to be part of the non-matching
|
|
974
974
|
suffix, but later operations on other qubits will continue to be put into
|
|
975
975
|
the matching part (as long as those qubits have had no non-matching operation
|
|
976
|
-
up to that point).
|
|
976
|
+
up to that point). Measurement keys are handled equivalently.
|
|
977
977
|
"""
|
|
978
978
|
blocked_qubits: Set[cirq.Qid] = set()
|
|
979
|
+
blocked_keys: Set[cirq.MeasurementKey] = set()
|
|
979
980
|
matching_prefix = circuits.Circuit()
|
|
980
981
|
general_suffix = circuits.Circuit()
|
|
981
982
|
for moment in circuit:
|
|
@@ -983,12 +984,12 @@ def split_into_matching_protocol_then_general(
|
|
|
983
984
|
general_part = []
|
|
984
985
|
for op in moment:
|
|
985
986
|
qs = set(op.qubits)
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
if qs.isdisjoint(blocked_qubits):
|
|
987
|
+
keys = protocols.measurement_keys_touched(op)
|
|
988
|
+
if predicate(op) and qs.isdisjoint(blocked_qubits) and keys.isdisjoint(blocked_keys):
|
|
990
989
|
matching_part.append(op)
|
|
991
990
|
else:
|
|
991
|
+
blocked_qubits |= qs
|
|
992
|
+
blocked_keys |= keys
|
|
992
993
|
general_part.append(op)
|
|
993
994
|
if matching_part:
|
|
994
995
|
matching_prefix.append(circuits.Moment(matching_part))
|
cirq/sim/simulator_base.py
CHANGED
|
@@ -20,15 +20,15 @@ from typing import (
|
|
|
20
20
|
Any,
|
|
21
21
|
cast,
|
|
22
22
|
Dict,
|
|
23
|
-
Iterator,
|
|
24
23
|
Generic,
|
|
24
|
+
Iterator,
|
|
25
25
|
List,
|
|
26
26
|
Optional,
|
|
27
27
|
Sequence,
|
|
28
28
|
Tuple,
|
|
29
29
|
Type,
|
|
30
|
-
TypeVar,
|
|
31
30
|
TYPE_CHECKING,
|
|
31
|
+
TypeVar,
|
|
32
32
|
)
|
|
33
33
|
|
|
34
34
|
import numpy as np
|
|
@@ -38,13 +38,13 @@ from cirq.sim.simulation_product_state import SimulationProductState
|
|
|
38
38
|
from cirq.sim.simulation_state import TSimulationState
|
|
39
39
|
from cirq.sim.simulation_state_base import SimulationStateBase
|
|
40
40
|
from cirq.sim.simulator import (
|
|
41
|
-
|
|
41
|
+
check_all_resolved,
|
|
42
42
|
SimulatesIntermediateState,
|
|
43
43
|
SimulatesSamples,
|
|
44
|
-
StepResult,
|
|
45
44
|
SimulationTrialResult,
|
|
46
|
-
check_all_resolved,
|
|
47
45
|
split_into_matching_protocol_then_general,
|
|
46
|
+
StepResult,
|
|
47
|
+
TSimulationTrialResult,
|
|
48
48
|
)
|
|
49
49
|
|
|
50
50
|
if TYPE_CHECKING:
|
cirq/sim/simulator_test.py
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
"""Tests for simulator.py"""
|
|
15
15
|
import abc
|
|
16
|
-
from typing import
|
|
16
|
+
from typing import Any, Dict, Generic, List, Sequence, Union
|
|
17
17
|
from unittest import mock
|
|
18
18
|
|
|
19
19
|
import duet
|
|
@@ -24,13 +24,13 @@ import cirq
|
|
|
24
24
|
from cirq import study
|
|
25
25
|
from cirq.sim.simulation_state import TSimulationState
|
|
26
26
|
from cirq.sim.simulator import (
|
|
27
|
-
TStepResult,
|
|
28
27
|
SimulatesAmplitudes,
|
|
29
28
|
SimulatesExpectationValues,
|
|
30
29
|
SimulatesFinalState,
|
|
31
30
|
SimulatesIntermediateState,
|
|
32
31
|
SimulatesSamples,
|
|
33
32
|
SimulationTrialResult,
|
|
33
|
+
TStepResult,
|
|
34
34
|
)
|
|
35
35
|
|
|
36
36
|
|
|
@@ -50,7 +50,7 @@ class FakeStepResult(cirq.StepResult):
|
|
|
50
50
|
self._final_state = final_state
|
|
51
51
|
|
|
52
52
|
def _simulator_state(self):
|
|
53
|
-
return self._final_state
|
|
53
|
+
return self._final_state # pragma: no cover
|
|
54
54
|
|
|
55
55
|
def state_vector(self):
|
|
56
56
|
pass
|
|
@@ -399,6 +399,17 @@ def test_sample_repeated_measurement_keys():
|
|
|
399
399
|
assert len(result.records['b'][0]) == 2
|
|
400
400
|
|
|
401
401
|
|
|
402
|
+
def test_classical_controls_go_to_suffix_if_corresponding_measurement_does():
|
|
403
|
+
subcircuit = cirq.CircuitOperation(cirq.FrozenCircuit()).with_classical_controls('a')
|
|
404
|
+
m = cirq.measure(cirq.LineQubit(0), key='a')
|
|
405
|
+
circuit = cirq.Circuit(m, subcircuit)
|
|
406
|
+
prefix, suffix = cirq.sim.simulator.split_into_matching_protocol_then_general(
|
|
407
|
+
circuit, lambda op: op != m # any op but m goes into prefix
|
|
408
|
+
)
|
|
409
|
+
assert not prefix
|
|
410
|
+
assert suffix == circuit
|
|
411
|
+
|
|
412
|
+
|
|
402
413
|
def test_simulate_with_invert_mask():
|
|
403
414
|
q0, q1, q2, q3, q4 = cirq.LineQid.for_qid_shape((2, 3, 3, 3, 4))
|
|
404
415
|
c = cirq.Circuit(
|
cirq/sim/sparse_simulator.py
CHANGED
|
@@ -14,12 +14,12 @@
|
|
|
14
14
|
|
|
15
15
|
"""A simulator that uses numpy's einsum for sparse matrix operations."""
|
|
16
16
|
|
|
17
|
-
from typing import Any, Iterator, List,
|
|
17
|
+
from typing import Any, Iterator, List, Optional, Sequence, Type, TYPE_CHECKING, Union
|
|
18
18
|
|
|
19
19
|
import numpy as np
|
|
20
20
|
|
|
21
21
|
from cirq import ops
|
|
22
|
-
from cirq.sim import simulator, state_vector,
|
|
22
|
+
from cirq.sim import simulator, state_vector, state_vector_simulation_state, state_vector_simulator
|
|
23
23
|
|
|
24
24
|
if TYPE_CHECKING:
|
|
25
25
|
import cirq
|
|
@@ -171,7 +171,8 @@ class Simulator(
|
|
|
171
171
|
StateVectorSimulationState for the circuit.
|
|
172
172
|
"""
|
|
173
173
|
if isinstance(initial_state, state_vector_simulation_state.StateVectorSimulationState):
|
|
174
|
-
|
|
174
|
+
# Instances of SimulationStateBase usually returned before this point
|
|
175
|
+
return initial_state # pragma: no cover
|
|
175
176
|
|
|
176
177
|
return state_vector_simulation_state.StateVectorSimulationState(
|
|
177
178
|
qubits=qubits,
|
|
@@ -13,9 +13,9 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
import itertools
|
|
15
15
|
import random
|
|
16
|
-
from typing import Type
|
|
17
|
-
|
|
16
|
+
from typing import Type, Union
|
|
18
17
|
from unittest import mock
|
|
18
|
+
|
|
19
19
|
import numpy as np
|
|
20
20
|
import pytest
|
|
21
21
|
import sympy
|
|
@@ -115,7 +115,7 @@ def test_run_repetitions_terminal_measurement_stochastic():
|
|
|
115
115
|
q = cirq.LineQubit(0)
|
|
116
116
|
c = cirq.Circuit(cirq.H(q), cirq.measure(q, key='q'))
|
|
117
117
|
results = cirq.Simulator().run(c, repetitions=10000)
|
|
118
|
-
assert 1000 <=
|
|
118
|
+
assert 1000 <= np.count_nonzero(results.measurements['q']) < 9000
|
|
119
119
|
|
|
120
120
|
|
|
121
121
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
@@ -255,7 +255,7 @@ def test_run_mixture(dtype: Type[np.complexfloating], split: bool):
|
|
|
255
255
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
256
256
|
circuit = cirq.Circuit(cirq.bit_flip(0.5)(q0), cirq.measure(q0))
|
|
257
257
|
result = simulator.run(circuit, repetitions=100)
|
|
258
|
-
assert 20 <
|
|
258
|
+
assert 20 < np.count_nonzero(result.measurements['q(0)']) < 80
|
|
259
259
|
|
|
260
260
|
|
|
261
261
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
@@ -265,8 +265,8 @@ def test_run_mixture_with_gates(dtype: Type[np.complexfloating], split: bool):
|
|
|
265
265
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split, seed=23)
|
|
266
266
|
circuit = cirq.Circuit(cirq.H(q0), cirq.phase_flip(0.5)(q0), cirq.H(q0), cirq.measure(q0))
|
|
267
267
|
result = simulator.run(circuit, repetitions=100)
|
|
268
|
-
assert
|
|
269
|
-
assert
|
|
268
|
+
assert np.count_nonzero(result.measurements['q(0)']) < 80
|
|
269
|
+
assert np.count_nonzero(result.measurements['q(0)']) > 20
|
|
270
270
|
|
|
271
271
|
|
|
272
272
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
@@ -446,7 +446,15 @@ def test_simulate_bit_flips(dtype: Type[np.complexfloating], split: bool):
|
|
|
446
446
|
|
|
447
447
|
@pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
|
|
448
448
|
@pytest.mark.parametrize('split', [True, False])
|
|
449
|
-
|
|
449
|
+
@pytest.mark.parametrize(
|
|
450
|
+
'initial_state',
|
|
451
|
+
[1, cirq.StateVectorSimulationState(initial_state=1, qubits=cirq.LineQubit.range(2))],
|
|
452
|
+
)
|
|
453
|
+
def test_simulate_initial_state(
|
|
454
|
+
dtype: Type[np.complexfloating],
|
|
455
|
+
split: bool,
|
|
456
|
+
initial_state: Union[int, cirq.StateVectorSimulationState],
|
|
457
|
+
):
|
|
450
458
|
q0, q1 = cirq.LineQubit.range(2)
|
|
451
459
|
simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
|
|
452
460
|
for b0 in [0, 1]:
|
|
@@ -498,11 +506,11 @@ def test_simulate_param_resolver(dtype: Type[np.complexfloating], split: bool):
|
|
|
498
506
|
(cirq.X ** sympy.Symbol('b0'))(q0), (cirq.X ** sympy.Symbol('b1'))(q1)
|
|
499
507
|
)
|
|
500
508
|
resolver = {'b0': b0, 'b1': b1}
|
|
501
|
-
result = simulator.simulate(circuit, param_resolver=resolver)
|
|
509
|
+
result = simulator.simulate(circuit, param_resolver=resolver)
|
|
502
510
|
expected_state = np.zeros(shape=(2, 2))
|
|
503
511
|
expected_state[b0][b1] = 1.0
|
|
504
512
|
np.testing.assert_equal(result.final_state_vector, np.reshape(expected_state, 4))
|
|
505
|
-
assert result.params == cirq.ParamResolver(resolver)
|
|
513
|
+
assert result.params == cirq.ParamResolver(resolver)
|
|
506
514
|
assert len(result.measurements) == 0
|
|
507
515
|
|
|
508
516
|
|
cirq/sim/state_vector.py
CHANGED
|
@@ -14,12 +14,12 @@
|
|
|
14
14
|
"""Helpers for handling quantum state vectors."""
|
|
15
15
|
|
|
16
16
|
import abc
|
|
17
|
-
from typing import List, Mapping, Optional, Tuple, TYPE_CHECKING
|
|
17
|
+
from typing import List, Mapping, Optional, Sequence, Tuple, TYPE_CHECKING
|
|
18
18
|
|
|
19
19
|
import numpy as np
|
|
20
20
|
|
|
21
21
|
from cirq import linalg, qis, value
|
|
22
|
-
from cirq.sim import
|
|
22
|
+
from cirq.sim import simulation_utils, simulator
|
|
23
23
|
|
|
24
24
|
if TYPE_CHECKING:
|
|
25
25
|
import cirq
|
|
@@ -14,15 +14,15 @@
|
|
|
14
14
|
"""Abstract classes for simulations which keep track of state vector."""
|
|
15
15
|
|
|
16
16
|
import abc
|
|
17
|
-
from functools import cached_property
|
|
18
|
-
from typing import Any, Dict, Iterator, Sequence, Type, TYPE_CHECKING, Generic, TypeVar
|
|
19
17
|
import warnings
|
|
18
|
+
from functools import cached_property
|
|
19
|
+
from typing import Any, Dict, Generic, Iterator, Sequence, Type, TYPE_CHECKING, TypeVar
|
|
20
20
|
|
|
21
21
|
import numpy as np
|
|
22
22
|
|
|
23
|
-
from cirq import _compat, ops,
|
|
24
|
-
from cirq.sim import simulator, state_vector, simulator_base
|
|
23
|
+
from cirq import _compat, ops, qis, value
|
|
25
24
|
from cirq.protocols import qid_shape
|
|
25
|
+
from cirq.sim import simulator, simulator_base, state_vector
|
|
26
26
|
|
|
27
27
|
if TYPE_CHECKING:
|
|
28
28
|
import cirq
|