cirq-core 1.7.0.dev20250825174419__py3-none-any.whl → 1.7.0.dev20251203004401__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.
- cirq/__init__.py +1 -0
- cirq/_compat.py +3 -2
- cirq/_compat_test.py +16 -15
- cirq/_doc.py +4 -3
- cirq/_import.py +2 -1
- cirq/_version.py +1 -1
- cirq/_version_test.py +1 -1
- cirq/circuits/_bucket_priority_queue.py +2 -1
- cirq/circuits/circuit.py +19 -17
- cirq/circuits/circuit_operation.py +2 -1
- cirq/circuits/circuit_operation_test.py +19 -0
- cirq/circuits/circuit_test.py +31 -12
- cirq/circuits/frozen_circuit.py +3 -2
- cirq/circuits/moment.py +3 -15
- cirq/circuits/optimization_pass.py +2 -1
- cirq/circuits/qasm_output.py +39 -10
- cirq/circuits/qasm_output_test.py +51 -2
- cirq/circuits/text_diagram_drawer.py +2 -1
- cirq/contrib/acquaintance/bipartite.py +2 -1
- cirq/contrib/acquaintance/devices.py +1 -1
- cirq/contrib/acquaintance/executor.py +4 -5
- cirq/contrib/acquaintance/executor_test.py +2 -1
- cirq/contrib/acquaintance/gates.py +2 -1
- cirq/contrib/acquaintance/gates_test.py +1 -1
- cirq/contrib/acquaintance/inspection_utils.py +2 -1
- cirq/contrib/acquaintance/mutation_utils.py +2 -1
- cirq/contrib/acquaintance/optimizers.py +2 -1
- cirq/contrib/acquaintance/permutation.py +2 -1
- cirq/contrib/acquaintance/permutation_test.py +1 -1
- cirq/contrib/acquaintance/shift.py +2 -1
- cirq/contrib/acquaintance/shift_swap_network.py +2 -1
- cirq/contrib/acquaintance/strategies/complete.py +3 -2
- cirq/contrib/acquaintance/strategies/cubic.py +2 -1
- cirq/contrib/acquaintance/strategies/quartic_paired.py +2 -1
- cirq/contrib/acquaintance/strategies/quartic_paired_test.py +1 -1
- cirq/contrib/acquaintance/testing.py +2 -1
- cirq/contrib/acquaintance/topological_sort.py +2 -1
- cirq/contrib/bayesian_network/bayesian_network_gate.py +3 -2
- cirq/contrib/circuitdag/circuit_dag.py +4 -2
- cirq/contrib/custom_simulators/custom_state_simulator.py +2 -1
- cirq/contrib/custom_simulators/custom_state_simulator_test.py +1 -1
- cirq/contrib/graph_device/graph_device.py +2 -1
- cirq/contrib/graph_device/graph_device_test.py +2 -1
- cirq/contrib/graph_device/hypergraph.py +2 -1
- cirq/contrib/graph_device/uniform_graph_device.py +2 -1
- cirq/contrib/json.py +14 -2
- cirq/contrib/json_test_data/BayesianNetworkGate.json +10 -0
- cirq/contrib/json_test_data/BayesianNetworkGate.repr +3 -0
- cirq/contrib/json_test_data/QuantumVolumeResult.json +169 -0
- cirq/contrib/json_test_data/QuantumVolumeResult.repr +22 -0
- cirq/contrib/json_test_data/SwapPermutationGate.json +3 -0
- cirq/contrib/json_test_data/SwapPermutationGate.repr +1 -0
- cirq/contrib/json_test_data/spec.py +0 -2
- cirq/contrib/noise_models/noise_models.py +2 -1
- cirq/contrib/paulistring/clifford_optimize.py +20 -2
- cirq/contrib/paulistring/optimize.py +1 -1
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +146 -35
- cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +81 -178
- cirq/contrib/paulistring/recombine.py +5 -2
- cirq/contrib/paulistring/separate.py +1 -1
- cirq/contrib/qasm_import/_lexer.py +6 -1
- cirq/contrib/qasm_import/_lexer_test.py +1 -1
- cirq/contrib/qasm_import/_parser.py +24 -8
- cirq/contrib/qasm_import/_parser_test.py +44 -6
- cirq/contrib/qcircuit/qcircuit_pdf_test.py +6 -9
- cirq/contrib/quantikz/__init__.py +21 -0
- cirq/contrib/quantikz/circuit_to_latex_quantikz.py +680 -0
- cirq/contrib/quantikz/circuit_to_latex_quantikz_test.py +253 -0
- cirq/contrib/quantikz/circuit_to_latex_render.py +424 -0
- cirq/contrib/quantikz/circuit_to_latex_render_test.py +44 -0
- cirq/contrib/quantum_volume/quantum_volume.py +2 -1
- cirq/contrib/quimb/density_matrix.py +1 -1
- cirq/contrib/quimb/grid_circuits.py +2 -1
- cirq/contrib/quimb/grid_circuits_test.py +1 -1
- cirq/contrib/quimb/mps_simulator.py +4 -3
- cirq/contrib/quimb/state_vector.py +2 -1
- cirq/contrib/quirk/export_to_quirk.py +2 -1
- cirq/contrib/quirk/linearize_circuit.py +1 -1
- cirq/contrib/quirk/quirk_gate.py +2 -1
- cirq/contrib/routing/device.py +1 -1
- cirq/contrib/routing/greedy.py +2 -1
- cirq/contrib/routing/initialization.py +2 -1
- cirq/contrib/routing/router.py +2 -1
- cirq/contrib/routing/swap_network.py +2 -1
- cirq/contrib/routing/utils.py +2 -1
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +7 -5
- cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +6 -6
- cirq/devices/device.py +2 -1
- cirq/devices/grid_device_metadata.py +2 -1
- cirq/devices/grid_qubit.py +7 -6
- cirq/devices/insertion_noise_model.py +2 -1
- cirq/devices/line_qubit.py +2 -1
- cirq/devices/named_topologies.py +2 -1
- cirq/devices/noise_model.py +2 -1
- cirq/devices/noise_model_test.py +1 -1
- cirq/devices/noise_properties.py +2 -1
- cirq/devices/superconducting_qubits_noise_properties_test.py +2 -1
- cirq/devices/thermal_noise_model.py +2 -1
- cirq/experiments/__init__.py +2 -0
- cirq/experiments/benchmarking/parallel_xeb.py +2 -1
- cirq/experiments/benchmarking/parallel_xeb_test.py +1 -1
- cirq/experiments/fidelity_estimation.py +2 -1
- cirq/experiments/fidelity_estimation_test.py +1 -1
- cirq/experiments/ghz_2d.py +150 -0
- cirq/experiments/ghz_2d_test.py +155 -0
- cirq/experiments/n_qubit_tomography.py +2 -1
- cirq/experiments/n_qubit_tomography_test.py +1 -1
- cirq/experiments/purity_estimation.py +1 -1
- cirq/experiments/qubit_characterizations.py +33 -4
- cirq/experiments/qubit_characterizations_test.py +16 -0
- cirq/experiments/random_quantum_circuit_generation.py +2 -1
- cirq/experiments/random_quantum_circuit_generation_test.py +2 -1
- cirq/experiments/readout_confusion_matrix.py +2 -1
- cirq/experiments/readout_confusion_matrix_test.py +1 -1
- cirq/experiments/single_qubit_readout_calibration.py +2 -1
- cirq/experiments/single_qubit_readout_calibration_test.py +1 -1
- cirq/experiments/t1_decay_experiment.py +2 -1
- cirq/experiments/two_qubit_xeb.py +2 -1
- cirq/experiments/two_qubit_xeb_test.py +1 -1
- cirq/experiments/xeb_fitting.py +2 -1
- cirq/experiments/xeb_fitting_test.py +1 -1
- cirq/experiments/xeb_sampling.py +5 -3
- cirq/experiments/xeb_sampling_test.py +1 -1
- cirq/experiments/xeb_simulation.py +2 -1
- cirq/experiments/xeb_simulation_test.py +2 -1
- cirq/experiments/z_phase_calibration.py +2 -1
- cirq/experiments/z_phase_calibration_test.py +18 -3
- cirq/interop/quirk/cells/__init__.py +1 -2
- cirq/interop/quirk/cells/all_cells.py +2 -1
- cirq/interop/quirk/cells/arithmetic_cells.py +2 -1
- cirq/interop/quirk/cells/cell.py +2 -1
- cirq/interop/quirk/cells/composite_cell.py +2 -1
- cirq/interop/quirk/cells/composite_cell_test.py +1 -1
- cirq/interop/quirk/cells/control_cells.py +2 -1
- cirq/interop/quirk/cells/frequency_space_cells.py +1 -1
- cirq/interop/quirk/cells/ignored_cells.py +1 -1
- cirq/interop/quirk/cells/input_cells.py +2 -1
- cirq/interop/quirk/cells/input_rotation_cells.py +2 -1
- cirq/interop/quirk/cells/measurement_cells.py +2 -1
- cirq/interop/quirk/cells/parse.py +2 -11
- cirq/interop/quirk/cells/qubit_permutation_cells.py +2 -1
- cirq/interop/quirk/cells/scalar_cells.py +2 -1
- cirq/interop/quirk/cells/single_qubit_rotation_cells.py +2 -1
- cirq/interop/quirk/cells/swap_cell.py +2 -1
- cirq/interop/quirk/cells/unsupported_cells.py +1 -1
- cirq/interop/quirk/url_to_circuit.py +2 -1
- cirq/json_resolver_cache.py +0 -2
- cirq/linalg/decompositions.py +6 -2
- cirq/linalg/decompositions_test.py +1 -0
- cirq/linalg/diagonalize.py +1 -1
- cirq/linalg/predicates.py +2 -1
- cirq/linalg/tolerance.py +2 -1
- cirq/linalg/transformations.py +3 -2
- cirq/ops/arithmetic_operation.py +4 -3
- cirq/ops/arithmetic_operation_test.py +1 -1
- cirq/ops/boolean_hamiltonian.py +4 -3
- cirq/ops/classically_controlled_operation.py +11 -11
- cirq/ops/classically_controlled_operation_test.py +26 -2
- cirq/ops/clifford_gate.py +3 -2
- cirq/ops/clifford_gate_test.py +1 -2
- cirq/ops/common_channels.py +2 -1
- cirq/ops/common_gates.py +3 -2
- cirq/ops/control_values.py +2 -1
- cirq/ops/controlled_gate.py +3 -2
- cirq/ops/controlled_gate_test.py +2 -1
- cirq/ops/controlled_operation.py +3 -2
- cirq/ops/controlled_operation_test.py +2 -1
- cirq/ops/dense_pauli_string.py +44 -81
- cirq/ops/dense_pauli_string_test.py +21 -0
- cirq/ops/diagonal_gate.py +3 -2
- cirq/ops/eigen_gate.py +9 -7
- cirq/ops/fourier_transform.py +3 -2
- cirq/ops/fourier_transform_test.py +2 -4
- cirq/ops/fsim_gate.py +3 -2
- cirq/ops/gate_operation.py +23 -12
- cirq/ops/gateset.py +22 -2
- cirq/ops/global_phase_op.py +3 -2
- cirq/ops/greedy_qubit_manager.py +2 -1
- cirq/ops/identity.py +2 -1
- cirq/ops/kraus_channel.py +2 -1
- cirq/ops/linear_combinations.py +12 -17
- cirq/ops/linear_combinations_test.py +23 -1
- cirq/ops/matrix_gates.py +2 -1
- cirq/ops/measure_util.py +8 -6
- cirq/ops/measurement_gate.py +2 -1
- cirq/ops/mixed_unitary_channel.py +2 -1
- cirq/ops/named_qubit.py +2 -2
- cirq/ops/op_tree.py +2 -1
- cirq/ops/parallel_gate.py +3 -2
- cirq/ops/parity_gates.py +2 -1
- cirq/ops/parity_gates_test.py +35 -0
- cirq/ops/pauli_interaction_gate.py +2 -1
- cirq/ops/pauli_measurement_gate.py +2 -1
- cirq/ops/pauli_string.py +37 -57
- cirq/ops/pauli_string_phasor.py +6 -5
- cirq/ops/pauli_string_raw_types.py +2 -1
- cirq/ops/pauli_string_test.py +49 -6
- cirq/ops/pauli_sum_exponential.py +2 -1
- cirq/ops/permutation_gate.py +2 -1
- cirq/ops/phased_iswap_gate.py +3 -2
- cirq/ops/phased_x_gate.py +5 -4
- cirq/ops/phased_x_z_gate.py +12 -5
- cirq/ops/projector.py +2 -1
- cirq/ops/qubit_manager.py +2 -1
- cirq/ops/qubit_order.py +2 -1
- cirq/ops/qubit_order_or_list.py +1 -1
- cirq/ops/random_gate_channel.py +3 -2
- cirq/ops/raw_types.py +33 -16
- cirq/ops/raw_types_test.py +4 -3
- cirq/ops/state_preparation_channel.py +2 -1
- cirq/ops/three_qubit_gates.py +3 -2
- cirq/ops/two_qubit_diagonal_gate.py +3 -2
- cirq/ops/uniform_superposition_gate.py +2 -1
- cirq/ops/wait_gate.py +10 -4
- cirq/protocols/act_on_protocol.py +2 -1
- cirq/protocols/act_on_protocol_test.py +2 -1
- cirq/protocols/apply_channel_protocol.py +2 -1
- cirq/protocols/apply_mixture_protocol.py +2 -1
- cirq/protocols/apply_mixture_protocol_test.py +2 -1
- cirq/protocols/apply_unitary_protocol.py +2 -1
- cirq/protocols/apply_unitary_protocol_test.py +2 -0
- cirq/protocols/approximate_equality_protocol.py +2 -1
- cirq/protocols/circuit_diagram_info_protocol.py +2 -1
- cirq/protocols/control_key_protocol.py +7 -0
- cirq/protocols/decompose_protocol.py +2 -12
- cirq/protocols/has_stabilizer_effect_protocol.py +1 -1
- cirq/protocols/has_stabilizer_effect_protocol_test.py +11 -9
- cirq/protocols/has_unitary_protocol_test.py +3 -3
- cirq/protocols/hash_from_pickle_test.py +2 -2
- cirq/protocols/inverse_protocol.py +2 -1
- cirq/protocols/json_serialization.py +5 -4
- cirq/protocols/json_serialization_test.py +31 -31
- cirq/protocols/kraus_protocol.py +4 -3
- cirq/protocols/kraus_protocol_test.py +7 -7
- cirq/protocols/measurement_key_protocol.py +32 -8
- cirq/protocols/mixture_protocol.py +3 -2
- cirq/protocols/mixture_protocol_test.py +7 -7
- cirq/protocols/mul_protocol_test.py +4 -4
- cirq/protocols/phase_protocol.py +13 -4
- cirq/protocols/pow_protocol.py +2 -1
- cirq/protocols/pow_protocol_test.py +5 -5
- cirq/protocols/qasm.py +2 -1
- cirq/protocols/qid_shape_protocol.py +2 -1
- cirq/protocols/resolve_parameters.py +17 -15
- cirq/protocols/trace_distance_bound.py +2 -1
- cirq/protocols/unitary_protocol.py +21 -21
- cirq/protocols/unitary_protocol_test.py +31 -19
- cirq/qis/channels.py +1 -1
- cirq/qis/channels_test.py +1 -1
- cirq/qis/clifford_tableau.py +16 -15
- cirq/qis/clifford_tableau_test.py +17 -17
- cirq/qis/entropy.py +3 -3
- cirq/qis/entropy_test.py +1 -1
- cirq/qis/quantum_state_representation.py +2 -1
- cirq/qis/states.py +7 -2
- cirq/qis/states_test.py +54 -54
- cirq/sim/classical_simulator.py +25 -14
- cirq/sim/classical_simulator_test.py +85 -30
- cirq/sim/clifford/clifford_simulator.py +7 -6
- cirq/sim/clifford/clifford_simulator_test.py +51 -50
- cirq/sim/clifford/clifford_tableau_simulation_state.py +2 -1
- cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +2 -1
- cirq/sim/clifford/stabilizer_sampler.py +1 -1
- cirq/sim/clifford/stabilizer_simulation_state.py +2 -1
- cirq/sim/clifford/stabilizer_state_ch_form.py +16 -15
- cirq/sim/clifford/stabilizer_state_ch_form_test.py +0 -1
- cirq/sim/density_matrix_simulation_state.py +7 -6
- cirq/sim/density_matrix_simulator.py +3 -2
- cirq/sim/density_matrix_simulator_test.py +94 -84
- cirq/sim/density_matrix_utils.py +2 -1
- cirq/sim/density_matrix_utils_test.py +1 -1
- cirq/sim/mux.py +35 -8
- cirq/sim/mux_test.py +39 -26
- cirq/sim/simulation_product_state.py +2 -1
- cirq/sim/simulation_product_state_test.py +8 -7
- cirq/sim/simulation_state.py +6 -5
- cirq/sim/simulation_state_base.py +3 -2
- cirq/sim/simulation_state_test.py +7 -6
- cirq/sim/simulation_utils.py +2 -1
- cirq/sim/simulator.py +4 -3
- cirq/sim/simulator_base.py +2 -1
- cirq/sim/simulator_base_test.py +51 -36
- cirq/sim/simulator_test.py +41 -36
- cirq/sim/sparse_simulator.py +3 -2
- cirq/sim/sparse_simulator_test.py +92 -82
- cirq/sim/state_vector.py +5 -6
- cirq/sim/state_vector_simulation_state.py +10 -9
- cirq/sim/state_vector_simulator.py +2 -1
- cirq/sim/state_vector_simulator_test.py +9 -9
- cirq/sim/state_vector_test.py +40 -39
- cirq/study/__init__.py +1 -0
- cirq/study/flatten_expressions.py +2 -1
- cirq/study/resolver.py +31 -18
- cirq/study/resolver_test.py +1 -1
- cirq/study/result.py +2 -1
- cirq/study/result_test.py +20 -20
- cirq/study/sweepable.py +2 -1
- cirq/study/sweepable_test.py +20 -20
- cirq/study/sweeps.py +26 -1
- cirq/study/sweeps_test.py +67 -43
- cirq/testing/_compat_test_data/__init__.py +3 -3
- cirq/testing/circuit_compare.py +2 -1
- cirq/testing/circuit_compare_test.py +16 -14
- cirq/testing/consistent_act_on_test.py +1 -1
- cirq/testing/consistent_channels.py +2 -2
- cirq/testing/consistent_controlled_gate_op.py +2 -2
- cirq/testing/consistent_controlled_gate_op_test.py +2 -1
- cirq/testing/consistent_decomposition.py +4 -2
- cirq/testing/consistent_phase_by.py +1 -1
- cirq/testing/consistent_protocols.py +2 -1
- cirq/testing/consistent_protocols_test.py +3 -3
- cirq/testing/consistent_qasm.py +4 -3
- cirq/testing/consistent_qasm_test.py +3 -3
- cirq/testing/consistent_resolve_parameters.py +1 -1
- cirq/testing/consistent_unitary.py +1 -1
- cirq/testing/consistent_unitary_test.py +1 -1
- cirq/testing/deprecation.py +1 -1
- cirq/testing/devices.py +3 -2
- cirq/testing/equals_tester.py +4 -3
- cirq/testing/equivalent_basis_map.py +4 -2
- cirq/testing/json.py +3 -2
- cirq/testing/lin_alg_utils.py +1 -1
- cirq/testing/logs.py +1 -1
- cirq/testing/op_tree.py +1 -1
- cirq/testing/order_tester.py +2 -2
- cirq/testing/pytest_utils.py +2 -1
- cirq/testing/random_circuit.py +2 -1
- cirq/testing/random_circuit_test.py +2 -1
- cirq/testing/repr_pretty_tester.py +3 -3
- cirq/transformers/__init__.py +1 -0
- cirq/transformers/_connected_component.py +231 -0
- cirq/transformers/_connected_component_test.py +200 -0
- cirq/transformers/align_test.py +13 -13
- cirq/transformers/analytical_decompositions/clifford_decomposition.py +8 -7
- cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +5 -5
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +11 -10
- cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +6 -6
- cirq/transformers/analytical_decompositions/cphase_to_fsim.py +3 -2
- cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +11 -10
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +8 -7
- cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +17 -20
- cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +33 -27
- cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +1 -1
- cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +1 -1
- cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +12 -11
- cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +5 -2
- cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +3 -3
- cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +2 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +2 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +2 -2
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +2 -1
- cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +32 -30
- cirq/transformers/drop_negligible_operations_test.py +7 -7
- cirq/transformers/dynamical_decoupling.py +185 -112
- cirq/transformers/dynamical_decoupling_test.py +195 -201
- cirq/transformers/eject_phased_paulis.py +2 -1
- cirq/transformers/eject_phased_paulis_test.py +3 -2
- cirq/transformers/eject_z.py +5 -3
- cirq/transformers/eject_z_test.py +23 -25
- cirq/transformers/expand_composite.py +3 -2
- cirq/transformers/expand_composite_test.py +14 -14
- cirq/transformers/gauge_compiling/__init__.py +13 -0
- cirq/transformers/gauge_compiling/gauge_compiling.py +3 -2
- cirq/transformers/gauge_compiling/gauge_compiling_test.py +14 -12
- cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +3 -3
- cirq/transformers/gauge_compiling/idle_moments_gauge.py +225 -0
- cirq/transformers/gauge_compiling/idle_moments_gauge_test.py +193 -0
- cirq/transformers/gauge_compiling/multi_moment_cphase_gauge.py +242 -0
- cirq/transformers/gauge_compiling/multi_moment_cphase_gauge_test.py +243 -0
- cirq/transformers/gauge_compiling/multi_moment_gauge_compiling.py +151 -0
- cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +2 -1
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +1 -1
- cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +6 -6
- cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +3 -2
- cirq/transformers/measurement_transformers.py +2 -1
- cirq/transformers/measurement_transformers_test.py +45 -39
- cirq/transformers/merge_k_qubit_gates.py +2 -1
- cirq/transformers/merge_k_qubit_gates_test.py +1 -1
- cirq/transformers/merge_single_qubit_gates.py +9 -5
- cirq/transformers/merge_single_qubit_gates_test.py +22 -22
- cirq/transformers/noise_adding_test.py +2 -2
- cirq/transformers/optimize_for_target_gateset.py +2 -1
- cirq/transformers/optimize_for_target_gateset_test.py +11 -9
- cirq/transformers/qubit_management_transformers_test.py +6 -2
- cirq/transformers/routing/mapping_manager.py +2 -1
- cirq/transformers/routing/route_circuit_cqc.py +2 -1
- cirq/transformers/stratify.py +2 -1
- cirq/transformers/symbolize.py +2 -1
- cirq/transformers/tag_transformers.py +2 -1
- cirq/transformers/target_gatesets/compilation_target_gateset.py +2 -1
- cirq/transformers/target_gatesets/cz_gateset.py +2 -1
- cirq/transformers/target_gatesets/cz_gateset_test.py +1 -1
- cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +2 -1
- cirq/transformers/transformer_api.py +2 -1
- cirq/transformers/transformer_primitives.py +271 -145
- cirq/transformers/transformer_primitives_test.py +185 -1
- cirq/value/abc_alt.py +2 -1
- cirq/value/classical_data.py +2 -1
- cirq/value/condition.py +2 -1
- cirq/value/digits.py +9 -2
- cirq/value/duration.py +6 -5
- cirq/value/linear_dict.py +4 -9
- cirq/value/measurement_key.py +2 -1
- cirq/value/periodic_value.py +3 -2
- cirq/value/product_state.py +2 -1
- cirq/value/value_equality_attr.py +2 -1
- cirq/vis/density_matrix.py +1 -1
- cirq/vis/heatmap.py +2 -1
- cirq/vis/histogram.py +2 -1
- cirq/vis/state_histogram.py +2 -1
- cirq/work/collector.py +2 -1
- cirq/work/observable_grouping.py +2 -1
- cirq/work/observable_measurement.py +2 -1
- cirq/work/observable_measurement_data.py +2 -1
- cirq/work/observable_measurement_test.py +1 -1
- cirq/work/observable_readout_calibration.py +2 -1
- cirq/work/observable_readout_calibration_test.py +1 -1
- cirq/work/observable_settings.py +2 -1
- cirq/work/sampler.py +2 -1
- cirq/work/sampler_test.py +1 -1
- {cirq_core-1.7.0.dev20250825174419.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/METADATA +5 -6
- {cirq_core-1.7.0.dev20250825174419.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/RECORD +425 -406
- cirq/contrib/json_test.py +0 -33
- {cirq_core-1.7.0.dev20250825174419.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/WHEEL +0 -0
- {cirq_core-1.7.0.dev20250825174419.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/licenses/LICENSE +0 -0
- {cirq_core-1.7.0.dev20250825174419.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/top_level.txt +0 -0
cirq/qis/states_test.py
CHANGED
|
@@ -21,15 +21,15 @@ import cirq
|
|
|
21
21
|
import cirq.testing
|
|
22
22
|
|
|
23
23
|
|
|
24
|
-
def assert_dirac_notation_numpy(vec, expected, decimals=2):
|
|
24
|
+
def assert_dirac_notation_numpy(vec, expected, decimals=2) -> None:
|
|
25
25
|
assert cirq.dirac_notation(np.array(vec), decimals=decimals) == expected
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
def assert_dirac_notation_python(vec, expected, decimals=2):
|
|
28
|
+
def assert_dirac_notation_python(vec, expected, decimals=2) -> None:
|
|
29
29
|
assert cirq.dirac_notation(vec, decimals=decimals) == expected
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
def assert_valid_density_matrix(matrix, num_qubits=None, qid_shape=None):
|
|
32
|
+
def assert_valid_density_matrix(matrix, num_qubits=None, qid_shape=None) -> None:
|
|
33
33
|
if qid_shape is None and num_qubits is None:
|
|
34
34
|
num_qubits = 1
|
|
35
35
|
np.testing.assert_almost_equal(
|
|
@@ -40,7 +40,7 @@ def assert_valid_density_matrix(matrix, num_qubits=None, qid_shape=None):
|
|
|
40
40
|
)
|
|
41
41
|
|
|
42
42
|
|
|
43
|
-
def test_quantum_state():
|
|
43
|
+
def test_quantum_state() -> None:
|
|
44
44
|
state_vector_1 = cirq.one_hot(shape=(4,), dtype=np.complex128)
|
|
45
45
|
state_tensor_1 = np.reshape(state_vector_1, (2, 2))
|
|
46
46
|
density_matrix_1 = np.outer(state_vector_1, np.conj(state_vector_1))
|
|
@@ -73,7 +73,7 @@ def test_quantum_state():
|
|
|
73
73
|
np.testing.assert_array_equal(state.state_vector_or_density_matrix(), density_matrix_1)
|
|
74
74
|
|
|
75
75
|
|
|
76
|
-
def test_quantum_state_quantum_state():
|
|
76
|
+
def test_quantum_state_quantum_state() -> None:
|
|
77
77
|
state_vector_1 = cirq.one_hot(shape=(4,), dtype=np.complex128)
|
|
78
78
|
quantum_state = cirq.QuantumState(state_vector_1)
|
|
79
79
|
|
|
@@ -96,7 +96,7 @@ def test_quantum_state_quantum_state():
|
|
|
96
96
|
state = cirq.quantum_state(quantum_state, qid_shape=(4,))
|
|
97
97
|
|
|
98
98
|
|
|
99
|
-
def test_quantum_state_computational_basis_state():
|
|
99
|
+
def test_quantum_state_computational_basis_state() -> None:
|
|
100
100
|
state = cirq.quantum_state(7, qid_shape=(3, 4))
|
|
101
101
|
np.testing.assert_allclose(state.data, cirq.one_hot(index=7, shape=(12,), dtype=np.complex64))
|
|
102
102
|
assert state.qid_shape == (3, 4)
|
|
@@ -125,7 +125,7 @@ def test_quantum_state_computational_basis_state():
|
|
|
125
125
|
_ = cirq.quantum_state((0, 0, 1, 1), qid_shape=(1, 1, 2, 2))
|
|
126
126
|
|
|
127
127
|
|
|
128
|
-
def test_quantum_state_state_vector_state_tensor():
|
|
128
|
+
def test_quantum_state_state_vector_state_tensor() -> None:
|
|
129
129
|
state_vector_1 = cirq.one_hot(shape=(4,), dtype=np.complex128)
|
|
130
130
|
state_tensor_1 = np.reshape(state_vector_1, (2, 2))
|
|
131
131
|
|
|
@@ -146,7 +146,7 @@ def test_quantum_state_state_vector_state_tensor():
|
|
|
146
146
|
_ = cirq.quantum_state(state_tensor_1, qid_shape=(2, 3))
|
|
147
147
|
|
|
148
148
|
|
|
149
|
-
def test_quantum_state_density_matrix():
|
|
149
|
+
def test_quantum_state_density_matrix() -> None:
|
|
150
150
|
density_matrix_1 = np.eye(4, dtype=np.complex64) / 4
|
|
151
151
|
|
|
152
152
|
state = cirq.quantum_state(density_matrix_1, qid_shape=(4,), copy=True)
|
|
@@ -159,7 +159,7 @@ def test_quantum_state_density_matrix():
|
|
|
159
159
|
_ = cirq.quantum_state(density_matrix_1, qid_shape=(8,))
|
|
160
160
|
|
|
161
161
|
|
|
162
|
-
def test_quantum_state_product_state():
|
|
162
|
+
def test_quantum_state_product_state() -> None:
|
|
163
163
|
q0, q1, q2 = cirq.LineQubit.range(3)
|
|
164
164
|
product_state_1 = cirq.KET_PLUS(q0) * cirq.KET_PLUS(q1) * cirq.KET_ONE(q2)
|
|
165
165
|
|
|
@@ -172,7 +172,7 @@ def test_quantum_state_product_state():
|
|
|
172
172
|
_ = cirq.quantum_state(product_state_1, qid_shape=(2, 2))
|
|
173
173
|
|
|
174
174
|
|
|
175
|
-
def test_density_matrix():
|
|
175
|
+
def test_density_matrix() -> None:
|
|
176
176
|
density_matrix_1 = np.eye(4, dtype=np.complex64) / 4
|
|
177
177
|
state_vector_1 = cirq.one_hot(shape=(4,), dtype=np.complex64)
|
|
178
178
|
|
|
@@ -185,7 +185,7 @@ def test_density_matrix():
|
|
|
185
185
|
_ = cirq.density_matrix(state_vector_1)
|
|
186
186
|
|
|
187
187
|
|
|
188
|
-
def test_infer_qid_shape():
|
|
188
|
+
def test_infer_qid_shape() -> None:
|
|
189
189
|
computational_basis_state_1 = [0, 0, 0, 1]
|
|
190
190
|
computational_basis_state_2 = [0, 1, 2, 3]
|
|
191
191
|
computational_basis_state_3 = [0, 1, 2, 4]
|
|
@@ -261,7 +261,7 @@ def test_infer_qid_shape():
|
|
|
261
261
|
|
|
262
262
|
|
|
263
263
|
@pytest.mark.parametrize('global_phase', (1, 1j, np.exp(1j)))
|
|
264
|
-
def test_bloch_vector_zero_state(global_phase):
|
|
264
|
+
def test_bloch_vector_zero_state(global_phase) -> None:
|
|
265
265
|
zero_state = global_phase * np.array([1, 0])
|
|
266
266
|
|
|
267
267
|
bloch = cirq.bloch_vector_from_state_vector(zero_state, 0)
|
|
@@ -270,7 +270,7 @@ def test_bloch_vector_zero_state(global_phase):
|
|
|
270
270
|
|
|
271
271
|
|
|
272
272
|
@pytest.mark.parametrize('global_phase', (1, 1j, np.exp(1j)))
|
|
273
|
-
def test_bloch_vector_one_state(global_phase):
|
|
273
|
+
def test_bloch_vector_one_state(global_phase) -> None:
|
|
274
274
|
one_state = global_phase * np.array([0, 1])
|
|
275
275
|
|
|
276
276
|
bloch = cirq.bloch_vector_from_state_vector(one_state, 0)
|
|
@@ -279,7 +279,7 @@ def test_bloch_vector_one_state(global_phase):
|
|
|
279
279
|
|
|
280
280
|
|
|
281
281
|
@pytest.mark.parametrize('global_phase', (1, 1j, np.exp(1j)))
|
|
282
|
-
def test_bloch_vector_plus_state(global_phase):
|
|
282
|
+
def test_bloch_vector_plus_state(global_phase) -> None:
|
|
283
283
|
sqrt = np.sqrt(0.5)
|
|
284
284
|
plus_state = global_phase * np.array([sqrt, sqrt])
|
|
285
285
|
|
|
@@ -289,7 +289,7 @@ def test_bloch_vector_plus_state(global_phase):
|
|
|
289
289
|
|
|
290
290
|
|
|
291
291
|
@pytest.mark.parametrize('global_phase', (1, 1j, np.exp(1j)))
|
|
292
|
-
def test_bloch_vector_minus_state(global_phase):
|
|
292
|
+
def test_bloch_vector_minus_state(global_phase) -> None:
|
|
293
293
|
sqrt = np.sqrt(0.5)
|
|
294
294
|
minus_state = np.array([-1.0j * sqrt, 1.0j * sqrt])
|
|
295
295
|
bloch = cirq.bloch_vector_from_state_vector(minus_state, 0)
|
|
@@ -299,7 +299,7 @@ def test_bloch_vector_minus_state(global_phase):
|
|
|
299
299
|
|
|
300
300
|
|
|
301
301
|
@pytest.mark.parametrize('global_phase', (1, 1j, np.exp(1j)))
|
|
302
|
-
def test_bloch_vector_iplus_state(global_phase):
|
|
302
|
+
def test_bloch_vector_iplus_state(global_phase) -> None:
|
|
303
303
|
sqrt = np.sqrt(0.5)
|
|
304
304
|
iplus_state = global_phase * np.array([sqrt, 1j * sqrt])
|
|
305
305
|
|
|
@@ -309,7 +309,7 @@ def test_bloch_vector_iplus_state(global_phase):
|
|
|
309
309
|
|
|
310
310
|
|
|
311
311
|
@pytest.mark.parametrize('global_phase', (1, 1j, np.exp(1j)))
|
|
312
|
-
def test_bloch_vector_iminus_state(global_phase):
|
|
312
|
+
def test_bloch_vector_iminus_state(global_phase) -> None:
|
|
313
313
|
sqrt = np.sqrt(0.5)
|
|
314
314
|
iminus_state = global_phase * np.array([sqrt, -1j * sqrt])
|
|
315
315
|
|
|
@@ -318,7 +318,7 @@ def test_bloch_vector_iminus_state(global_phase):
|
|
|
318
318
|
np.testing.assert_array_almost_equal(bloch, desired_simple)
|
|
319
319
|
|
|
320
320
|
|
|
321
|
-
def test_bloch_vector_simple_th_zero():
|
|
321
|
+
def test_bloch_vector_simple_th_zero() -> None:
|
|
322
322
|
sqrt = np.sqrt(0.5)
|
|
323
323
|
# State TH|0>.
|
|
324
324
|
th_state = np.array([sqrt, 0.5 + 0.5j])
|
|
@@ -328,7 +328,7 @@ def test_bloch_vector_simple_th_zero():
|
|
|
328
328
|
np.testing.assert_array_almost_equal(bloch, desired_simple)
|
|
329
329
|
|
|
330
330
|
|
|
331
|
-
def test_bloch_vector_equal_sqrt3():
|
|
331
|
+
def test_bloch_vector_equal_sqrt3() -> None:
|
|
332
332
|
sqrt3 = 1 / np.sqrt(3)
|
|
333
333
|
test_state = np.array([0.888074, 0.325058 + 0.325058j])
|
|
334
334
|
bloch = cirq.bloch_vector_from_state_vector(test_state, 0)
|
|
@@ -337,7 +337,7 @@ def test_bloch_vector_equal_sqrt3():
|
|
|
337
337
|
np.testing.assert_array_almost_equal(bloch, desired_simple)
|
|
338
338
|
|
|
339
339
|
|
|
340
|
-
def test_bloch_vector_multi_pure():
|
|
340
|
+
def test_bloch_vector_multi_pure() -> None:
|
|
341
341
|
plus_plus_state = np.array([0.5, 0.5, 0.5, 0.5])
|
|
342
342
|
|
|
343
343
|
bloch_0 = cirq.bloch_vector_from_state_vector(plus_plus_state, 0)
|
|
@@ -348,7 +348,7 @@ def test_bloch_vector_multi_pure():
|
|
|
348
348
|
np.testing.assert_array_almost_equal(bloch_0, desired_simple)
|
|
349
349
|
|
|
350
350
|
|
|
351
|
-
def test_bloch_vector_multi_mixed():
|
|
351
|
+
def test_bloch_vector_multi_mixed() -> None:
|
|
352
352
|
sqrt = np.sqrt(0.5)
|
|
353
353
|
# Bell state 1/sqrt(2)(|00>+|11>)
|
|
354
354
|
phi_plus = np.array([sqrt, 0.0, 0.0, sqrt])
|
|
@@ -371,7 +371,7 @@ def test_bloch_vector_multi_mixed():
|
|
|
371
371
|
np.testing.assert_array_almost_equal(true_mixed_1, bloch_mixed_1)
|
|
372
372
|
|
|
373
373
|
|
|
374
|
-
def test_bloch_vector_multi_big():
|
|
374
|
+
def test_bloch_vector_multi_big() -> None:
|
|
375
375
|
five_qubit_plus_state = np.array([0.1767767] * 32)
|
|
376
376
|
desired_simple = np.array([1, 0, 0])
|
|
377
377
|
for qubit in range(5):
|
|
@@ -379,7 +379,7 @@ def test_bloch_vector_multi_big():
|
|
|
379
379
|
np.testing.assert_array_almost_equal(bloch_i, desired_simple)
|
|
380
380
|
|
|
381
381
|
|
|
382
|
-
def test_bloch_vector_invalid():
|
|
382
|
+
def test_bloch_vector_invalid() -> None:
|
|
383
383
|
with pytest.raises(ValueError):
|
|
384
384
|
_ = cirq.bloch_vector_from_state_vector(np.array([0.5, 0.5, 0.5]), 0)
|
|
385
385
|
with pytest.raises(IndexError):
|
|
@@ -388,7 +388,7 @@ def test_bloch_vector_invalid():
|
|
|
388
388
|
_ = cirq.bloch_vector_from_state_vector(np.array([0.5, 0.5, 0.5, 0.5]), 2)
|
|
389
389
|
|
|
390
390
|
|
|
391
|
-
def test_density_matrix_from_state_vector():
|
|
391
|
+
def test_density_matrix_from_state_vector() -> None:
|
|
392
392
|
test_state = np.array(
|
|
393
393
|
[
|
|
394
394
|
0.0 - 0.35355339j,
|
|
@@ -428,7 +428,7 @@ def test_density_matrix_from_state_vector():
|
|
|
428
428
|
np.testing.assert_array_almost_equal(rho_zero, true_two)
|
|
429
429
|
|
|
430
430
|
|
|
431
|
-
def test_density_matrix_invalid():
|
|
431
|
+
def test_density_matrix_invalid() -> None:
|
|
432
432
|
bad_state = np.array([0.5, 0.5, 0.5])
|
|
433
433
|
good_state = np.array([0.5, 0.5, 0.5, 0.5])
|
|
434
434
|
with pytest.raises(ValueError):
|
|
@@ -441,7 +441,7 @@ def test_density_matrix_invalid():
|
|
|
441
441
|
_ = cirq.density_matrix_from_state_vector(good_state, [-1])
|
|
442
442
|
|
|
443
443
|
|
|
444
|
-
def test_dirac_notation():
|
|
444
|
+
def test_dirac_notation() -> None:
|
|
445
445
|
sqrt = np.sqrt(0.5)
|
|
446
446
|
exp_pi_2 = 0.5 + 0.5j
|
|
447
447
|
assert_dirac_notation_numpy([0, 0], "0")
|
|
@@ -458,7 +458,7 @@ def test_dirac_notation():
|
|
|
458
458
|
assert_dirac_notation_python([0.71j, 0.71j], "0.71j|0⟩ + 0.71j|1⟩")
|
|
459
459
|
|
|
460
460
|
|
|
461
|
-
def test_dirac_notation_partial_state():
|
|
461
|
+
def test_dirac_notation_partial_state() -> None:
|
|
462
462
|
sqrt = np.sqrt(0.5)
|
|
463
463
|
exp_pi_2 = 0.5 + 0.5j
|
|
464
464
|
assert_dirac_notation_numpy([1, 0], "|0⟩")
|
|
@@ -471,20 +471,20 @@ def test_dirac_notation_partial_state():
|
|
|
471
471
|
assert_dirac_notation_python([0, 0, 0, 1], "|11⟩")
|
|
472
472
|
|
|
473
473
|
|
|
474
|
-
def test_dirac_notation_precision():
|
|
474
|
+
def test_dirac_notation_precision() -> None:
|
|
475
475
|
sqrt = np.sqrt(0.5)
|
|
476
476
|
assert_dirac_notation_numpy([sqrt, sqrt], "0.7|0⟩ + 0.7|1⟩", decimals=1)
|
|
477
477
|
assert_dirac_notation_python([sqrt, sqrt], "0.707|0⟩ + 0.707|1⟩", decimals=3)
|
|
478
478
|
|
|
479
479
|
|
|
480
|
-
def test_dirac_notation_invalid():
|
|
480
|
+
def test_dirac_notation_invalid() -> None:
|
|
481
481
|
with pytest.raises(ValueError, match='state_vector has incorrect size'):
|
|
482
|
-
_ = cirq.dirac_notation([0.0, 0.0, 1.0])
|
|
482
|
+
_ = cirq.dirac_notation(np.array([0.0, 0.0, 1.0]))
|
|
483
483
|
with pytest.raises(ValueError, match='state_vector has incorrect size'):
|
|
484
|
-
_ = cirq.dirac_notation([1.0, 1.0], qid_shape=(3,))
|
|
484
|
+
_ = cirq.dirac_notation(np.array([1.0, 1.0]), qid_shape=(3,))
|
|
485
485
|
|
|
486
486
|
|
|
487
|
-
def test_to_valid_state_vector():
|
|
487
|
+
def test_to_valid_state_vector() -> None:
|
|
488
488
|
with pytest.raises(ValueError, match='Computational basis state is out of range'):
|
|
489
489
|
cirq.to_valid_state_vector(2, 1)
|
|
490
490
|
np.testing.assert_almost_equal(
|
|
@@ -515,13 +515,13 @@ def test_to_valid_state_vector():
|
|
|
515
515
|
assert v[0] == 1
|
|
516
516
|
|
|
517
517
|
|
|
518
|
-
def test_to_valid_state_vector_creates_new_copy():
|
|
518
|
+
def test_to_valid_state_vector_creates_new_copy() -> None:
|
|
519
519
|
state = np.array([1.0, 0.0, 0.0, 0.0], dtype=np.complex64)
|
|
520
520
|
out = cirq.to_valid_state_vector(state, 2)
|
|
521
521
|
assert out is not state
|
|
522
522
|
|
|
523
523
|
|
|
524
|
-
def test_invalid_to_valid_state_vector():
|
|
524
|
+
def test_invalid_to_valid_state_vector() -> None:
|
|
525
525
|
with pytest.raises(ValueError, match="Please specify"):
|
|
526
526
|
_ = cirq.to_valid_state_vector(np.array([1]))
|
|
527
527
|
|
|
@@ -532,9 +532,9 @@ def test_invalid_to_valid_state_vector():
|
|
|
532
532
|
with pytest.raises(ValueError):
|
|
533
533
|
_ = cirq.to_valid_state_vector(5, 2)
|
|
534
534
|
with pytest.raises(ValueError, match='Invalid quantum state'):
|
|
535
|
-
_ = cirq.to_valid_state_vector('0000', 2)
|
|
535
|
+
_ = cirq.to_valid_state_vector('0000', 2) # type: ignore[arg-type]
|
|
536
536
|
with pytest.raises(ValueError, match='Invalid quantum state'):
|
|
537
|
-
_ = cirq.to_valid_state_vector('not an int', 2)
|
|
537
|
+
_ = cirq.to_valid_state_vector('not an int', 2) # type: ignore[arg-type]
|
|
538
538
|
with pytest.raises(ValueError, match=r'num_qubits != len\(qid_shape\)'):
|
|
539
539
|
_ = cirq.to_valid_state_vector(0, 5, qid_shape=(1, 2, 3))
|
|
540
540
|
|
|
@@ -552,7 +552,7 @@ def test_invalid_to_valid_state_vector():
|
|
|
552
552
|
_ = cirq.to_valid_state_vector(np.array([1, 0], dtype=np.int64), qid_shape=(2, 1))
|
|
553
553
|
|
|
554
554
|
|
|
555
|
-
def test_validate_normalized_state():
|
|
555
|
+
def test_validate_normalized_state() -> None:
|
|
556
556
|
cirq.validate_normalized_state_vector(cirq.testing.random_superposition(2), qid_shape=(2,))
|
|
557
557
|
cirq.validate_normalized_state_vector(
|
|
558
558
|
np.array([0.5, 0.5, 0.5, 0.5], dtype=np.complex64), qid_shape=(2, 2)
|
|
@@ -571,7 +571,7 @@ def test_validate_normalized_state():
|
|
|
571
571
|
)
|
|
572
572
|
|
|
573
573
|
|
|
574
|
-
def test_validate_density_matrix():
|
|
574
|
+
def test_validate_density_matrix() -> None:
|
|
575
575
|
cirq.validate_density_matrix(cirq.testing.random_density_matrix(2), qid_shape=(2,))
|
|
576
576
|
with pytest.raises(ValueError, match='dtype'):
|
|
577
577
|
cirq.to_valid_density_matrix(
|
|
@@ -589,7 +589,7 @@ def test_validate_density_matrix():
|
|
|
589
589
|
)
|
|
590
590
|
|
|
591
591
|
|
|
592
|
-
def test_to_valid_density_matrix_from_density_matrix():
|
|
592
|
+
def test_to_valid_density_matrix_from_density_matrix() -> None:
|
|
593
593
|
assert_valid_density_matrix(np.array([[1, 0], [0, 0]]))
|
|
594
594
|
assert_valid_density_matrix(np.array([[0.5, 0], [0, 0.5]]))
|
|
595
595
|
assert_valid_density_matrix(np.array([[0.5, 0.5], [0.5, 0.5]]))
|
|
@@ -615,7 +615,7 @@ def test_to_valid_density_matrix_from_density_matrix():
|
|
|
615
615
|
assert_valid_density_matrix(np.diag([0.2, 0.8, 0, 0]), qid_shape=(4,))
|
|
616
616
|
|
|
617
617
|
|
|
618
|
-
def test_to_valid_density_matrix_from_density_matrix_tensor():
|
|
618
|
+
def test_to_valid_density_matrix_from_density_matrix_tensor() -> None:
|
|
619
619
|
np.testing.assert_almost_equal(
|
|
620
620
|
cirq.to_valid_density_matrix(
|
|
621
621
|
cirq.one_hot(shape=(2, 2, 2, 2, 2, 2), dtype=np.complex64), num_qubits=3
|
|
@@ -630,19 +630,19 @@ def test_to_valid_density_matrix_from_density_matrix_tensor():
|
|
|
630
630
|
)
|
|
631
631
|
|
|
632
632
|
|
|
633
|
-
def test_to_valid_density_matrix_not_square():
|
|
633
|
+
def test_to_valid_density_matrix_not_square() -> None:
|
|
634
634
|
with pytest.raises(ValueError, match='shape'):
|
|
635
635
|
cirq.to_valid_density_matrix(np.array([[1], [0]]), num_qubits=1)
|
|
636
636
|
|
|
637
637
|
|
|
638
|
-
def test_to_valid_density_matrix_size_mismatch_num_qubits():
|
|
638
|
+
def test_to_valid_density_matrix_size_mismatch_num_qubits() -> None:
|
|
639
639
|
with pytest.raises(ValueError, match='shape'):
|
|
640
640
|
cirq.to_valid_density_matrix(np.array([[[1, 0], [0, 0]], [[0, 0], [0, 0]]]), num_qubits=2)
|
|
641
641
|
with pytest.raises(ValueError, match='shape'):
|
|
642
642
|
cirq.to_valid_density_matrix(np.eye(4) / 4.0, num_qubits=1)
|
|
643
643
|
|
|
644
644
|
|
|
645
|
-
def test_to_valid_density_matrix_not_hermitian():
|
|
645
|
+
def test_to_valid_density_matrix_not_hermitian() -> None:
|
|
646
646
|
with pytest.raises(ValueError, match='hermitian'):
|
|
647
647
|
cirq.to_valid_density_matrix(np.array([[0.5, 0.5j], [0.5, 0.5j]]), num_qubits=1)
|
|
648
648
|
with pytest.raises(ValueError, match='hermitian'):
|
|
@@ -654,7 +654,7 @@ def test_to_valid_density_matrix_not_hermitian():
|
|
|
654
654
|
)
|
|
655
655
|
|
|
656
656
|
|
|
657
|
-
def test_to_valid_density_matrix_mismatched_qid_shape():
|
|
657
|
+
def test_to_valid_density_matrix_mismatched_qid_shape() -> None:
|
|
658
658
|
with pytest.raises(ValueError, match=r'num_qubits != len\(qid_shape\)'):
|
|
659
659
|
cirq.to_valid_density_matrix(np.eye(4) / 4, num_qubits=1, qid_shape=(2, 2))
|
|
660
660
|
with pytest.raises(ValueError, match=r'num_qubits != len\(qid_shape\)'):
|
|
@@ -663,28 +663,28 @@ def test_to_valid_density_matrix_mismatched_qid_shape():
|
|
|
663
663
|
cirq.to_valid_density_matrix(np.eye(4) / 4)
|
|
664
664
|
|
|
665
665
|
|
|
666
|
-
def test_to_valid_density_matrix_not_unit_trace():
|
|
666
|
+
def test_to_valid_density_matrix_not_unit_trace() -> None:
|
|
667
667
|
with pytest.raises(ValueError, match='trace 1'):
|
|
668
668
|
cirq.to_valid_density_matrix(np.array([[1, 0], [0, -0.1]]), num_qubits=1)
|
|
669
669
|
with pytest.raises(ValueError, match='trace 1'):
|
|
670
670
|
cirq.to_valid_density_matrix(np.zeros([2, 2]), num_qubits=1)
|
|
671
671
|
|
|
672
672
|
|
|
673
|
-
def test_to_valid_density_matrix_not_positive_semidefinite():
|
|
673
|
+
def test_to_valid_density_matrix_not_positive_semidefinite() -> None:
|
|
674
674
|
with pytest.raises(ValueError, match='positive semidefinite'):
|
|
675
675
|
cirq.to_valid_density_matrix(
|
|
676
676
|
np.array([[0.6, 0.5], [0.5, 0.4]], dtype=np.complex64), num_qubits=1
|
|
677
677
|
)
|
|
678
678
|
|
|
679
679
|
|
|
680
|
-
def test_to_valid_density_matrix_wrong_dtype():
|
|
680
|
+
def test_to_valid_density_matrix_wrong_dtype() -> None:
|
|
681
681
|
with pytest.raises(ValueError, match='dtype'):
|
|
682
682
|
cirq.to_valid_density_matrix(
|
|
683
683
|
np.array([[1, 0], [0, 0]], dtype=np.complex64), num_qubits=1, dtype=np.complex128
|
|
684
684
|
)
|
|
685
685
|
|
|
686
686
|
|
|
687
|
-
def test_to_valid_density_matrix_from_state_vector():
|
|
687
|
+
def test_to_valid_density_matrix_from_state_vector() -> None:
|
|
688
688
|
np.testing.assert_almost_equal(
|
|
689
689
|
cirq.to_valid_density_matrix(
|
|
690
690
|
density_matrix_rep=np.array([1, 0], dtype=np.complex64), num_qubits=1
|
|
@@ -713,7 +713,7 @@ def test_to_valid_density_matrix_from_state_vector():
|
|
|
713
713
|
)
|
|
714
714
|
|
|
715
715
|
|
|
716
|
-
def test_to_valid_density_matrix_from_state_vector_tensor():
|
|
716
|
+
def test_to_valid_density_matrix_from_state_vector_tensor() -> None:
|
|
717
717
|
np.testing.assert_almost_equal(
|
|
718
718
|
cirq.to_valid_density_matrix(
|
|
719
719
|
density_matrix_rep=np.array(np.full((2, 2), 0.5), dtype=np.complex64), num_qubits=2
|
|
@@ -722,12 +722,12 @@ def test_to_valid_density_matrix_from_state_vector_tensor():
|
|
|
722
722
|
)
|
|
723
723
|
|
|
724
724
|
|
|
725
|
-
def test_to_valid_density_matrix_from_state_invalid_state():
|
|
725
|
+
def test_to_valid_density_matrix_from_state_invalid_state() -> None:
|
|
726
726
|
with pytest.raises(ValueError, match="Invalid quantum state"):
|
|
727
727
|
cirq.to_valid_density_matrix(np.array([1, 0, 0]), num_qubits=2)
|
|
728
728
|
|
|
729
729
|
|
|
730
|
-
def test_to_valid_density_matrix_from_computational_basis():
|
|
730
|
+
def test_to_valid_density_matrix_from_computational_basis() -> None:
|
|
731
731
|
np.testing.assert_almost_equal(
|
|
732
732
|
cirq.to_valid_density_matrix(density_matrix_rep=0, num_qubits=1), np.array([[1, 0], [0, 0]])
|
|
733
733
|
)
|
|
@@ -743,12 +743,12 @@ def test_to_valid_density_matrix_from_computational_basis():
|
|
|
743
743
|
)
|
|
744
744
|
|
|
745
745
|
|
|
746
|
-
def test_to_valid_density_matrix_from_state_invalid_computational_basis():
|
|
746
|
+
def test_to_valid_density_matrix_from_state_invalid_computational_basis() -> None:
|
|
747
747
|
with pytest.raises(ValueError, match="out of range"):
|
|
748
748
|
cirq.to_valid_density_matrix(-1, num_qubits=2)
|
|
749
749
|
|
|
750
750
|
|
|
751
|
-
def test_one_hot():
|
|
751
|
+
def test_one_hot() -> None:
|
|
752
752
|
result = cirq.one_hot(shape=4, dtype=np.int32)
|
|
753
753
|
assert result.dtype == np.int32
|
|
754
754
|
np.testing.assert_array_equal(result, [1, 0, 0, 0])
|
|
@@ -766,7 +766,7 @@ def test_one_hot():
|
|
|
766
766
|
)
|
|
767
767
|
|
|
768
768
|
|
|
769
|
-
def test_eye_tensor():
|
|
769
|
+
def test_eye_tensor() -> None:
|
|
770
770
|
assert np.all(cirq.eye_tensor((), dtype=int) == np.array(1))
|
|
771
771
|
assert np.all(cirq.eye_tensor((1,), dtype=int) == np.array([[1]]))
|
|
772
772
|
assert np.all(cirq.eye_tensor((2,), dtype=int) == np.array([[1, 0], [0, 1]])) # yapf: disable
|
cirq/sim/classical_simulator.py
CHANGED
|
@@ -14,8 +14,9 @@
|
|
|
14
14
|
|
|
15
15
|
from __future__ import annotations
|
|
16
16
|
|
|
17
|
+
from collections.abc import Sequence
|
|
17
18
|
from copy import copy, deepcopy
|
|
18
|
-
from typing import Any, Generic,
|
|
19
|
+
from typing import Any, Generic, TYPE_CHECKING
|
|
19
20
|
|
|
20
21
|
import numpy as np
|
|
21
22
|
|
|
@@ -77,7 +78,7 @@ class ClassicalBasisSimState(SimulationState[ClassicalBasisState]):
|
|
|
77
78
|
|
|
78
79
|
def __init__(
|
|
79
80
|
self,
|
|
80
|
-
initial_state: int |
|
|
81
|
+
initial_state: int | Sequence[int] = 0,
|
|
81
82
|
qubits: Sequence[cirq.Qid] | None = None,
|
|
82
83
|
classical_data: cirq.ClassicalDataStore | None = None,
|
|
83
84
|
):
|
|
@@ -85,25 +86,32 @@ class ClassicalBasisSimState(SimulationState[ClassicalBasisState]):
|
|
|
85
86
|
|
|
86
87
|
Args:
|
|
87
88
|
qubits: The qubits to simulate.
|
|
88
|
-
initial_state: The initial state for the simulation.
|
|
89
|
+
initial_state: The initial state for the simulation. Accepts int or Sequence[int].
|
|
89
90
|
classical_data: The classical data container for the simulation.
|
|
90
91
|
|
|
91
92
|
Raises:
|
|
92
93
|
ValueError: If qubits not provided and initial_state is int.
|
|
93
|
-
|
|
94
|
+
If initial_state is not an int or Sequence[int].
|
|
95
|
+
If initial_state is a np.ndarray and its shape is not 1-dimensional.
|
|
94
96
|
|
|
95
97
|
An initial_state value of type integer is parsed in big endian order.
|
|
96
98
|
"""
|
|
97
99
|
if isinstance(initial_state, int):
|
|
98
100
|
if qubits is None:
|
|
99
|
-
raise ValueError('qubits must be provided if initial_state is not
|
|
101
|
+
raise ValueError('qubits must be provided if initial_state is not Sequence[int]')
|
|
100
102
|
state = ClassicalBasisState(
|
|
101
103
|
big_endian_int_to_bits(initial_state, bit_count=len(qubits))
|
|
102
104
|
)
|
|
103
|
-
elif isinstance(initial_state,
|
|
104
|
-
|
|
105
|
+
elif isinstance(initial_state, np.ndarray):
|
|
106
|
+
if initial_state.ndim != 1:
|
|
107
|
+
raise ValueError(
|
|
108
|
+
f'initial_state must be 1-dimensional, got shape {initial_state.shape}'
|
|
109
|
+
)
|
|
110
|
+
state = ClassicalBasisState(list(initial_state))
|
|
111
|
+
elif isinstance(initial_state, Sequence) and not isinstance(initial_state, (str, bytes)):
|
|
112
|
+
state = ClassicalBasisState(list(initial_state))
|
|
105
113
|
else:
|
|
106
|
-
raise ValueError('initial_state must be an int or
|
|
114
|
+
raise ValueError('initial_state must be an int or Sequence[int]')
|
|
107
115
|
super().__init__(state=state, qubits=qubits, classical_data=classical_data)
|
|
108
116
|
|
|
109
117
|
def _act_on_fallback_(self, action, qubits: Sequence[cirq.Qid], allow_decompose: bool = True):
|
|
@@ -118,12 +126,9 @@ class ClassicalBasisSimState(SimulationState[ClassicalBasisState]):
|
|
|
118
126
|
True if the operation was applied successfully.
|
|
119
127
|
|
|
120
128
|
Raises:
|
|
121
|
-
ValueError: If
|
|
122
|
-
|
|
123
|
-
or a measurement.
|
|
129
|
+
ValueError: If gate is not one of X, SWAP, QubitPermutationGate, a controlled version
|
|
130
|
+
of X or SWAP, or a measurement.
|
|
124
131
|
"""
|
|
125
|
-
if isinstance(self._state.basis, np.ndarray) and len(self._state.basis.shape) != 1:
|
|
126
|
-
raise ValueError('initial_state shape for type np.ndarray is not equal to 1')
|
|
127
132
|
gate = action.gate if isinstance(action, ops.Operation) else action
|
|
128
133
|
mapped_qubits = [self.qubit_map[i] for i in qubits]
|
|
129
134
|
|
|
@@ -152,9 +157,15 @@ class ClassicalBasisSimState(SimulationState[ClassicalBasisState]):
|
|
|
152
157
|
elif gate == ops.TOFFOLI:
|
|
153
158
|
c1, c2, q = mapped_qubits
|
|
154
159
|
self._state.basis[q] ^= self._state.basis[c1] & self._state.basis[c2]
|
|
160
|
+
elif isinstance(gate, ops.QubitPermutationGate):
|
|
161
|
+
perm = gate.permutation
|
|
162
|
+
basis = self._state.basis
|
|
163
|
+
original_values = [basis[q] for q in mapped_qubits]
|
|
164
|
+
for i, q in enumerate(mapped_qubits):
|
|
165
|
+
basis[perm[i]] = original_values[i]
|
|
155
166
|
else:
|
|
156
167
|
raise ValueError(
|
|
157
|
-
f'{gate} is not one of X, SWAP; a controlled version '
|
|
168
|
+
f'{gate} is not one of X, SWAP, QubitPermutationGate; a controlled version '
|
|
158
169
|
'of X or SWAP; or a measurement'
|
|
159
170
|
)
|
|
160
171
|
return True
|