cirq-core 1.7.0.dev20250924231107__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 +7 -13
- cirq/circuits/circuit_operation.py +2 -1
- cirq/circuits/circuit_test.py +13 -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 +74 -171
- cirq/contrib/paulistring/recombine.py +5 -2
- cirq/contrib/paulistring/separate.py +1 -1
- cirq/contrib/qasm_import/_parser.py +2 -1
- cirq/contrib/qasm_import/_parser_test.py +3 -3
- 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 +2 -1
- 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 +2 -1
- cirq/ops/arithmetic_operation.py +2 -1
- cirq/ops/arithmetic_operation_test.py +1 -1
- cirq/ops/boolean_hamiltonian.py +4 -3
- cirq/ops/classically_controlled_operation.py +3 -2
- cirq/ops/clifford_gate.py +2 -1
- cirq/ops/clifford_gate_test.py +1 -2
- cirq/ops/common_channels.py +2 -1
- cirq/ops/common_gates.py +2 -1
- 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 +3 -13
- 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 +8 -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 +8 -3
- cirq/ops/linear_combinations_test.py +23 -1
- cirq/ops/matrix_gates.py +2 -1
- cirq/ops/measure_util.py +2 -1
- 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/pauli_interaction_gate.py +2 -1
- cirq/ops/pauli_measurement_gate.py +2 -1
- cirq/ops/pauli_string.py +6 -12
- cirq/ops/pauli_string_phasor.py +3 -2
- cirq/ops/pauli_string_raw_types.py +2 -1
- cirq/ops/pauli_string_test.py +2 -2
- 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 +7 -15
- 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/decompose_protocol.py +2 -12
- cirq/protocols/has_stabilizer_effect_protocol.py +1 -1
- cirq/protocols/hash_from_pickle_test.py +2 -2
- cirq/protocols/inverse_protocol.py +2 -1
- cirq/protocols/json_serialization.py +2 -1
- cirq/protocols/kraus_protocol.py +4 -3
- cirq/protocols/kraus_protocol_test.py +2 -2
- cirq/protocols/measurement_key_protocol.py +2 -1
- cirq/protocols/mixture_protocol.py +2 -1
- cirq/protocols/pow_protocol.py +2 -1
- cirq/protocols/qasm.py +2 -1
- cirq/protocols/qid_shape_protocol.py +2 -1
- cirq/protocols/resolve_parameters.py +16 -14
- cirq/protocols/trace_distance_bound.py +2 -1
- cirq/protocols/unitary_protocol.py +21 -21
- cirq/qis/channels.py +1 -1
- cirq/qis/channels_test.py +1 -1
- cirq/qis/clifford_tableau.py +2 -1
- cirq/qis/entropy.py +2 -2
- cirq/qis/quantum_state_representation.py +2 -1
- cirq/qis/states.py +7 -2
- cirq/sim/classical_simulator.py +2 -1
- cirq/sim/clifford/clifford_simulator.py +2 -1
- cirq/sim/clifford/clifford_simulator_test.py +1 -1
- 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 +3 -2
- cirq/sim/clifford/stabilizer_state_ch_form_test.py +0 -1
- cirq/sim/density_matrix_simulation_state.py +2 -1
- cirq/sim/density_matrix_simulator.py +2 -1
- cirq/sim/density_matrix_utils.py +2 -1
- cirq/sim/mux.py +2 -1
- cirq/sim/mux_test.py +0 -1
- cirq/sim/simulation_product_state.py +2 -1
- cirq/sim/simulation_product_state_test.py +2 -1
- cirq/sim/simulation_state.py +2 -1
- cirq/sim/simulation_state_base.py +2 -1
- cirq/sim/simulation_state_test.py +2 -1
- cirq/sim/simulation_utils.py +2 -1
- cirq/sim/simulator.py +2 -1
- cirq/sim/simulator_base.py +2 -1
- cirq/sim/simulator_base_test.py +2 -1
- cirq/sim/simulator_test.py +2 -1
- cirq/sim/sparse_simulator.py +2 -1
- cirq/sim/state_vector.py +2 -1
- cirq/sim/state_vector_simulation_state.py +2 -1
- cirq/sim/state_vector_simulator.py +2 -1
- cirq/sim/state_vector_test.py +1 -2
- 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/sweepable.py +2 -1
- cirq/study/sweeps.py +26 -1
- cirq/study/sweeps_test.py +24 -0
- cirq/testing/_compat_test_data/__init__.py +3 -3
- cirq/testing/circuit_compare.py +2 -1
- cirq/testing/consistent_act_on_test.py +1 -1
- cirq/testing/consistent_controlled_gate_op.py +1 -1
- cirq/testing/consistent_controlled_gate_op_test.py +2 -1
- cirq/testing/consistent_protocols.py +2 -1
- cirq/testing/consistent_protocols_test.py +3 -3
- cirq/testing/consistent_qasm.py +2 -1
- 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/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 +4 -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 +8 -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 +5 -2
- 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 +2 -1
- 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 +2 -1
- 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.dev20250924231107.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/METADATA +4 -4
- {cirq_core-1.7.0.dev20250924231107.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/RECORD +391 -374
- cirq/contrib/json_test.py +0 -33
- {cirq_core-1.7.0.dev20250924231107.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/WHEEL +0 -0
- {cirq_core-1.7.0.dev20250924231107.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/licenses/LICENSE +0 -0
- {cirq_core-1.7.0.dev20250924231107.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/top_level.txt +0 -0
cirq/ops/raw_types.py
CHANGED
|
@@ -18,20 +18,9 @@ from __future__ import annotations
|
|
|
18
18
|
|
|
19
19
|
import abc
|
|
20
20
|
import functools
|
|
21
|
+
from collections.abc import Callable, Collection, Hashable, Iterable, Mapping, Sequence, Set
|
|
21
22
|
from types import NotImplementedType
|
|
22
|
-
from typing import
|
|
23
|
-
AbstractSet,
|
|
24
|
-
Any,
|
|
25
|
-
Callable,
|
|
26
|
-
cast,
|
|
27
|
-
Collection,
|
|
28
|
-
Hashable,
|
|
29
|
-
Iterable,
|
|
30
|
-
Mapping,
|
|
31
|
-
overload,
|
|
32
|
-
Sequence,
|
|
33
|
-
TYPE_CHECKING,
|
|
34
|
-
)
|
|
23
|
+
from typing import Any, cast, overload, TYPE_CHECKING
|
|
35
24
|
|
|
36
25
|
import numpy as np
|
|
37
26
|
|
|
@@ -528,6 +517,9 @@ class Operation(metaclass=abc.ABCMeta):
|
|
|
528
517
|
def _qid_shape_(self) -> tuple[int, ...]:
|
|
529
518
|
return protocols.qid_shape(self.qubits)
|
|
530
519
|
|
|
520
|
+
def __pow__(self, exponent: Any) -> Operation:
|
|
521
|
+
return NotImplemented # pragma: no cover
|
|
522
|
+
|
|
531
523
|
@abc.abstractmethod
|
|
532
524
|
def with_qubits(self, *new_qubits: cirq.Qid) -> cirq.Operation:
|
|
533
525
|
"""Returns the same operation, but applied to different qubits.
|
|
@@ -909,7 +901,7 @@ class TaggedOperation(Operation):
|
|
|
909
901
|
return NotImplemented
|
|
910
902
|
|
|
911
903
|
@cached_method
|
|
912
|
-
def _parameter_names_(self) ->
|
|
904
|
+
def _parameter_names_(self) -> Set[str]:
|
|
913
905
|
tag_params = {name for tag in self.tags for name in protocols.parameter_names(tag)}
|
|
914
906
|
return protocols.parameter_names(self.sub_operation) | tag_params
|
|
915
907
|
|
|
@@ -1023,7 +1015,7 @@ class _InverseCompositeGate(Gate):
|
|
|
1023
1015
|
return protocols.is_parameterized(self._original)
|
|
1024
1016
|
|
|
1025
1017
|
@cached_method
|
|
1026
|
-
def _parameter_names_(self) ->
|
|
1018
|
+
def _parameter_names_(self) -> Set[str]:
|
|
1027
1019
|
return protocols.parameter_names(self._original)
|
|
1028
1020
|
|
|
1029
1021
|
def _resolve_parameters_(
|
cirq/ops/raw_types_test.py
CHANGED
|
@@ -14,7 +14,8 @@
|
|
|
14
14
|
|
|
15
15
|
from __future__ import annotations
|
|
16
16
|
|
|
17
|
-
from
|
|
17
|
+
from collections.abc import Iterator, Set
|
|
18
|
+
from typing import Any, cast
|
|
18
19
|
|
|
19
20
|
import numpy as np
|
|
20
21
|
import pytest
|
|
@@ -739,7 +740,7 @@ class ParameterizableTag:
|
|
|
739
740
|
def _is_parameterized_(self) -> bool:
|
|
740
741
|
return cirq.is_parameterized(self.value)
|
|
741
742
|
|
|
742
|
-
def _parameter_names_(self) ->
|
|
743
|
+
def _parameter_names_(self) -> Set[str]:
|
|
743
744
|
return cirq.parameter_names(self.value)
|
|
744
745
|
|
|
745
746
|
def _resolve_parameters_(
|
|
@@ -781,7 +782,7 @@ def test_inverse_composite_standards() -> None:
|
|
|
781
782
|
def _value_equality_values_(self):
|
|
782
783
|
return (self._param,)
|
|
783
784
|
|
|
784
|
-
def _parameter_names_(self) ->
|
|
785
|
+
def _parameter_names_(self) -> Set[str]:
|
|
785
786
|
return cirq.parameter_names(self._param)
|
|
786
787
|
|
|
787
788
|
def _is_parameterized_(self) -> bool:
|
cirq/ops/three_qubit_gates.py
CHANGED
|
@@ -16,7 +16,8 @@
|
|
|
16
16
|
|
|
17
17
|
from __future__ import annotations
|
|
18
18
|
|
|
19
|
-
from
|
|
19
|
+
from collections.abc import Collection, Iterator, Sequence, Set
|
|
20
|
+
from typing import Any, TYPE_CHECKING
|
|
20
21
|
|
|
21
22
|
import numpy as np
|
|
22
23
|
import sympy
|
|
@@ -224,7 +225,7 @@ class ThreeQubitDiagonalGate(raw_types.Gate):
|
|
|
224
225
|
def _is_parameterized_(self) -> bool:
|
|
225
226
|
return any(protocols.is_parameterized(angle) for angle in self._diag_angles_radians)
|
|
226
227
|
|
|
227
|
-
def _parameter_names_(self) ->
|
|
228
|
+
def _parameter_names_(self) -> Set[str]:
|
|
228
229
|
return {
|
|
229
230
|
name for angle in self._diag_angles_radians for name in protocols.parameter_names(angle)
|
|
230
231
|
}
|
|
@@ -20,7 +20,8 @@ passed as a list.
|
|
|
20
20
|
|
|
21
21
|
from __future__ import annotations
|
|
22
22
|
|
|
23
|
-
from
|
|
23
|
+
from collections.abc import Iterator, Sequence, Set
|
|
24
|
+
from typing import Any, TYPE_CHECKING
|
|
24
25
|
|
|
25
26
|
import numpy as np
|
|
26
27
|
import sympy
|
|
@@ -76,7 +77,7 @@ class TwoQubitDiagonalGate(raw_types.Gate):
|
|
|
76
77
|
def _is_parameterized_(self) -> bool:
|
|
77
78
|
return any(protocols.is_parameterized(angle) for angle in self._diag_angles_radians)
|
|
78
79
|
|
|
79
|
-
def _parameter_names_(self) ->
|
|
80
|
+
def _parameter_names_(self) -> Set[str]:
|
|
80
81
|
return {
|
|
81
82
|
name for angle in self._diag_angles_radians for name in protocols.parameter_names(angle)
|
|
82
83
|
}
|
cirq/ops/wait_gate.py
CHANGED
|
@@ -14,7 +14,10 @@
|
|
|
14
14
|
|
|
15
15
|
from __future__ import annotations
|
|
16
16
|
|
|
17
|
-
from
|
|
17
|
+
from collections.abc import Set
|
|
18
|
+
from typing import Any, TYPE_CHECKING
|
|
19
|
+
|
|
20
|
+
import sympy
|
|
18
21
|
|
|
19
22
|
from cirq import protocols, value
|
|
20
23
|
from cirq.ops import raw_types
|
|
@@ -51,8 +54,11 @@ class WaitGate(raw_types.Gate):
|
|
|
51
54
|
ValueError: If the `qid_shape` provided is empty or `num_qubits` contradicts
|
|
52
55
|
`qid_shape`.
|
|
53
56
|
"""
|
|
54
|
-
self._duration =
|
|
55
|
-
|
|
57
|
+
self._duration = (
|
|
58
|
+
duration if isinstance(duration, value.Duration) else value.Duration(duration)
|
|
59
|
+
)
|
|
60
|
+
total_picos = self.duration.total_picos()
|
|
61
|
+
if not isinstance(total_picos, sympy.Basic) and total_picos < 0:
|
|
56
62
|
raise ValueError('duration < 0')
|
|
57
63
|
if qid_shape is None:
|
|
58
64
|
if num_qubits is None:
|
|
@@ -75,7 +81,7 @@ class WaitGate(raw_types.Gate):
|
|
|
75
81
|
def _is_parameterized_(self) -> bool:
|
|
76
82
|
return protocols.is_parameterized(self.duration)
|
|
77
83
|
|
|
78
|
-
def _parameter_names_(self) ->
|
|
84
|
+
def _parameter_names_(self) -> Set[str]:
|
|
79
85
|
return protocols.parameter_names(self.duration)
|
|
80
86
|
|
|
81
87
|
def _resolve_parameters_(self, resolver: cirq.ParamResolver, recursive: bool) -> WaitGate:
|
|
@@ -14,8 +14,9 @@
|
|
|
14
14
|
|
|
15
15
|
from __future__ import annotations
|
|
16
16
|
|
|
17
|
+
from collections.abc import Sequence
|
|
17
18
|
from types import NotImplementedType
|
|
18
|
-
from typing import Any, Protocol,
|
|
19
|
+
from typing import Any, Protocol, TYPE_CHECKING
|
|
19
20
|
|
|
20
21
|
from cirq import ops
|
|
21
22
|
from cirq._doc import doc_private
|
|
@@ -16,8 +16,9 @@
|
|
|
16
16
|
|
|
17
17
|
from __future__ import annotations
|
|
18
18
|
|
|
19
|
+
from collections.abc import Iterable, Sequence
|
|
19
20
|
from types import NotImplementedType
|
|
20
|
-
from typing import Any,
|
|
21
|
+
from typing import Any, Protocol, TypeVar
|
|
21
22
|
|
|
22
23
|
import numpy as np
|
|
23
24
|
|
|
@@ -16,8 +16,9 @@
|
|
|
16
16
|
|
|
17
17
|
from __future__ import annotations
|
|
18
18
|
|
|
19
|
+
from collections.abc import Iterable
|
|
19
20
|
from types import NotImplementedType
|
|
20
|
-
from typing import Any, cast,
|
|
21
|
+
from typing import Any, cast, Protocol, TypeVar
|
|
21
22
|
|
|
22
23
|
import numpy as np
|
|
23
24
|
|
|
@@ -17,8 +17,9 @@
|
|
|
17
17
|
from __future__ import annotations
|
|
18
18
|
|
|
19
19
|
import warnings
|
|
20
|
+
from collections.abc import Iterable, Sequence
|
|
20
21
|
from types import EllipsisType, NotImplementedType
|
|
21
|
-
from typing import Any, cast,
|
|
22
|
+
from typing import Any, cast, Protocol, TYPE_CHECKING, TypeVar
|
|
22
23
|
|
|
23
24
|
import numpy as np
|
|
24
25
|
|
|
@@ -240,6 +240,7 @@ def test_apply_unitary_args_tensor_manipulation() -> None:
|
|
|
240
240
|
op_indices, tuple(qid_shape[i] for i in op_indices)
|
|
241
241
|
)
|
|
242
242
|
sub_result = val._apply_unitary_(sub_args)
|
|
243
|
+
assert isinstance(sub_result, np.ndarray)
|
|
243
244
|
result = _incorporate_result_into_target(args, sub_args, sub_result)
|
|
244
245
|
np.testing.assert_allclose(result, expected, atol=1e-8)
|
|
245
246
|
|
|
@@ -258,6 +259,7 @@ def test_apply_unitary_args_tensor_manipulation() -> None:
|
|
|
258
259
|
op_indices, tuple(qid_shape[i] for i in op_indices)
|
|
259
260
|
)
|
|
260
261
|
sub_result = val._apply_unitary_(sub_args)
|
|
262
|
+
assert isinstance(sub_result, np.ndarray)
|
|
261
263
|
result = _incorporate_result_into_target(args, sub_args, sub_result)
|
|
262
264
|
np.testing.assert_allclose(result, expected, atol=1e-8, verbose=True)
|
|
263
265
|
|
|
@@ -15,9 +15,10 @@
|
|
|
15
15
|
from __future__ import annotations
|
|
16
16
|
|
|
17
17
|
import numbers
|
|
18
|
+
from collections.abc import Iterable
|
|
18
19
|
from decimal import Decimal
|
|
19
20
|
from fractions import Fraction
|
|
20
|
-
from typing import Any,
|
|
21
|
+
from typing import Any, Protocol
|
|
21
22
|
|
|
22
23
|
import numpy as np
|
|
23
24
|
import sympy
|
|
@@ -15,8 +15,9 @@
|
|
|
15
15
|
from __future__ import annotations
|
|
16
16
|
|
|
17
17
|
import re
|
|
18
|
+
from collections.abc import Iterable, Sequence
|
|
18
19
|
from fractions import Fraction
|
|
19
|
-
from typing import Any,
|
|
20
|
+
from typing import Any, overload, Protocol, Self, TYPE_CHECKING, TypeVar, Union
|
|
20
21
|
|
|
21
22
|
import numpy as np
|
|
22
23
|
import sympy
|
|
@@ -18,19 +18,9 @@ import dataclasses
|
|
|
18
18
|
import inspect
|
|
19
19
|
import itertools
|
|
20
20
|
from collections import defaultdict
|
|
21
|
+
from collections.abc import Callable, Iterable, Iterator, Sequence
|
|
21
22
|
from types import NotImplementedType
|
|
22
|
-
from typing import
|
|
23
|
-
Any,
|
|
24
|
-
Callable,
|
|
25
|
-
Iterable,
|
|
26
|
-
Iterator,
|
|
27
|
-
overload,
|
|
28
|
-
Protocol,
|
|
29
|
-
Sequence,
|
|
30
|
-
TYPE_CHECKING,
|
|
31
|
-
TypeVar,
|
|
32
|
-
Union,
|
|
33
|
-
)
|
|
23
|
+
from typing import Any, overload, Protocol, TYPE_CHECKING, TypeVar, Union
|
|
34
24
|
|
|
35
25
|
from cirq import devices, ops
|
|
36
26
|
from cirq._doc import doc_private
|
|
@@ -97,7 +97,7 @@ def _strat_has_stabilizer_effect_from_unitary(val: Any) -> bool | None:
|
|
|
97
97
|
ps = DensePauliString(pauli_string)
|
|
98
98
|
p = ps._unitary_()
|
|
99
99
|
if not pauli_string_decomposition.unitary_to_pauli_string(
|
|
100
|
-
|
|
100
|
+
unitary @ p @ unitary.T.conj()
|
|
101
101
|
):
|
|
102
102
|
return False
|
|
103
103
|
return True
|
|
@@ -20,8 +20,9 @@ import gzip
|
|
|
20
20
|
import json
|
|
21
21
|
import numbers
|
|
22
22
|
import pathlib
|
|
23
|
+
from collections.abc import Callable, Iterable, Sequence
|
|
23
24
|
from types import NotImplementedType
|
|
24
|
-
from typing import Any,
|
|
25
|
+
from typing import Any, cast, IO, overload, Protocol
|
|
25
26
|
|
|
26
27
|
import attrs
|
|
27
28
|
import numpy as np
|
cirq/protocols/kraus_protocol.py
CHANGED
|
@@ -17,8 +17,9 @@
|
|
|
17
17
|
from __future__ import annotations
|
|
18
18
|
|
|
19
19
|
import warnings
|
|
20
|
+
from collections.abc import Iterable
|
|
20
21
|
from types import NotImplementedType
|
|
21
|
-
from typing import Any, Protocol,
|
|
22
|
+
from typing import Any, Protocol, TypeVar
|
|
22
23
|
|
|
23
24
|
import numpy as np
|
|
24
25
|
|
|
@@ -31,7 +32,7 @@ from cirq.protocols.unitary_protocol import unitary
|
|
|
31
32
|
|
|
32
33
|
# This is a special indicator value used by the channel method to determine
|
|
33
34
|
# whether or not the caller provided a 'default' argument. It must be of type
|
|
34
|
-
#
|
|
35
|
+
# Iterable[np.ndarray] to ensure the method has the correct type signature in
|
|
35
36
|
# that case. It is checked for using `is`, so it won't have a false positive
|
|
36
37
|
# if the user provides a different (np.array([]),) value.
|
|
37
38
|
RaiseTypeErrorIfNotProvided: tuple[np.ndarray] = (np.array([]),)
|
|
@@ -44,7 +45,7 @@ class SupportsKraus(Protocol):
|
|
|
44
45
|
"""An object that may be describable as a quantum channel."""
|
|
45
46
|
|
|
46
47
|
@doc_private
|
|
47
|
-
def _kraus_(self) ->
|
|
48
|
+
def _kraus_(self) -> Iterable[np.ndarray] | NotImplementedType:
|
|
48
49
|
r"""A list of Kraus matrices describing the quantum channel.
|
|
49
50
|
|
|
50
51
|
These matrices are the terms in the operator sum representation of a
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
from __future__ import annotations
|
|
18
18
|
|
|
19
|
-
from
|
|
19
|
+
from collections.abc import Iterable
|
|
20
20
|
|
|
21
21
|
import numpy as np
|
|
22
22
|
import pytest
|
|
@@ -89,7 +89,7 @@ def test_explicit_kraus() -> None:
|
|
|
89
89
|
c = (a0, a1)
|
|
90
90
|
|
|
91
91
|
class ReturnsKraus:
|
|
92
|
-
def _kraus_(self) ->
|
|
92
|
+
def _kraus_(self) -> Iterable[np.ndarray]:
|
|
93
93
|
return c
|
|
94
94
|
|
|
95
95
|
assert cirq.kraus(ReturnsKraus()) is c
|
|
@@ -16,8 +16,9 @@
|
|
|
16
16
|
|
|
17
17
|
from __future__ import annotations
|
|
18
18
|
|
|
19
|
+
from collections.abc import Mapping
|
|
19
20
|
from types import NotImplementedType
|
|
20
|
-
from typing import Any,
|
|
21
|
+
from typing import Any, overload, Protocol, TYPE_CHECKING, TypeVar
|
|
21
22
|
|
|
22
23
|
from cirq import value
|
|
23
24
|
from cirq._doc import doc_private
|
cirq/protocols/pow_protocol.py
CHANGED
cirq/protocols/qasm.py
CHANGED
|
@@ -15,8 +15,9 @@
|
|
|
15
15
|
from __future__ import annotations
|
|
16
16
|
|
|
17
17
|
import string
|
|
18
|
+
from collections.abc import Iterable, Mapping
|
|
18
19
|
from types import NotImplementedType
|
|
19
|
-
from typing import Any,
|
|
20
|
+
from typing import Any, Protocol, TYPE_CHECKING, TypeVar
|
|
20
21
|
|
|
21
22
|
from cirq import ops
|
|
22
23
|
from cirq._doc import doc_private
|
|
@@ -14,8 +14,9 @@
|
|
|
14
14
|
|
|
15
15
|
from __future__ import annotations
|
|
16
16
|
|
|
17
|
+
from collections.abc import Sequence
|
|
17
18
|
from types import NotImplementedType
|
|
18
|
-
from typing import Any, Protocol,
|
|
19
|
+
from typing import Any, Protocol, TypeVar
|
|
19
20
|
|
|
20
21
|
from cirq import ops
|
|
21
22
|
from cirq._doc import doc_private, document
|
|
@@ -15,7 +15,8 @@
|
|
|
15
15
|
from __future__ import annotations
|
|
16
16
|
|
|
17
17
|
import numbers
|
|
18
|
-
from
|
|
18
|
+
from collections.abc import Set
|
|
19
|
+
from typing import Any, cast, Protocol, Self, TYPE_CHECKING, TypeVar
|
|
19
20
|
|
|
20
21
|
import sympy
|
|
21
22
|
|
|
@@ -40,7 +41,7 @@ class SupportsParameterization(Protocol):
|
|
|
40
41
|
and False otherwise."""
|
|
41
42
|
|
|
42
43
|
@doc_private
|
|
43
|
-
def _parameter_names_(self) ->
|
|
44
|
+
def _parameter_names_(self) -> Set[str]:
|
|
44
45
|
"""Returns a collection of string names of parameters that require
|
|
45
46
|
resolution. If _is_parameterized_ is False, the collection is empty.
|
|
46
47
|
The converse is not necessarily true, because some objects may report
|
|
@@ -92,7 +93,7 @@ def is_parameterized(val: Any) -> bool:
|
|
|
92
93
|
return bool(parameter_names(val))
|
|
93
94
|
|
|
94
95
|
|
|
95
|
-
def parameter_names(val: Any) ->
|
|
96
|
+
def parameter_names(val: Any) -> Set[str]:
|
|
96
97
|
"""Returns parameter names for this object.
|
|
97
98
|
|
|
98
99
|
Args:
|
|
@@ -119,7 +120,7 @@ def parameter_names(val: Any) -> AbstractSet[str]:
|
|
|
119
120
|
return set()
|
|
120
121
|
|
|
121
122
|
|
|
122
|
-
def parameter_symbols(val: Any) ->
|
|
123
|
+
def parameter_symbols(val: Any) -> Set[sympy.Symbol]:
|
|
123
124
|
"""Returns parameter symbols for this object.
|
|
124
125
|
|
|
125
126
|
Args:
|
|
@@ -169,14 +170,8 @@ def resolve_parameters(
|
|
|
169
170
|
return val
|
|
170
171
|
|
|
171
172
|
# Ensure it is a dictionary wrapped in a ParamResolver.
|
|
172
|
-
param_resolver
|
|
173
|
-
|
|
174
|
-
# Handle special cases for sympy expressions and sequences.
|
|
175
|
-
# These may not in fact preserve types, but we pretend they do by casting.
|
|
176
|
-
if isinstance(val, sympy.Expr):
|
|
177
|
-
return cast(T, param_resolver.value_of(val, recursive))
|
|
178
|
-
if isinstance(val, (list, tuple)):
|
|
179
|
-
return cast(T, type(val)(resolve_parameters(e, param_resolver, recursive) for e in val))
|
|
173
|
+
if not isinstance(param_resolver, study.ParamResolver):
|
|
174
|
+
param_resolver = study.ParamResolver(param_resolver)
|
|
180
175
|
|
|
181
176
|
is_parameterized = (
|
|
182
177
|
val._is_parameterized_() if hasattr(val, '_is_parameterized_') else NotImplemented
|
|
@@ -192,8 +187,15 @@ def resolve_parameters(
|
|
|
192
187
|
|
|
193
188
|
if result is not NotImplemented:
|
|
194
189
|
return result
|
|
195
|
-
|
|
196
|
-
|
|
190
|
+
|
|
191
|
+
# Handle special cases for sympy expressions and sequences.
|
|
192
|
+
# These may not in fact preserve types, but we pretend they do by casting.
|
|
193
|
+
if isinstance(val, sympy.Expr):
|
|
194
|
+
return cast(T, param_resolver.value_of(val, recursive))
|
|
195
|
+
if isinstance(val, (list, tuple)):
|
|
196
|
+
return cast(T, type(val)(resolve_parameters(e, param_resolver, recursive) for e in val))
|
|
197
|
+
|
|
198
|
+
return val
|
|
197
199
|
|
|
198
200
|
|
|
199
201
|
def resolve_parameters_once(val: T, param_resolver: cirq.ParamResolverOrSimilarType) -> T:
|
|
@@ -24,7 +24,7 @@ from cirq.protocols import qid_shape_protocol
|
|
|
24
24
|
from cirq.protocols.apply_unitary_protocol import apply_unitaries, ApplyUnitaryArgs
|
|
25
25
|
from cirq.protocols.decompose_protocol import _try_decompose_into_operations_and_qubits
|
|
26
26
|
|
|
27
|
-
# This is a special indicator value used by the unitary
|
|
27
|
+
# This is a special indicator value used by the function unitary() to determine
|
|
28
28
|
# whether or not the caller provided a 'default' argument. It must be of type
|
|
29
29
|
# np.ndarray to ensure the method has the correct type signature in that case.
|
|
30
30
|
# It is checked for using `is`, so it won't have a false positive if the user
|
|
@@ -38,23 +38,23 @@ class SupportsUnitary(Protocol):
|
|
|
38
38
|
"""An object that may be describable by a unitary matrix."""
|
|
39
39
|
|
|
40
40
|
@doc_private
|
|
41
|
-
def _unitary_(self) -> np.ndarray | NotImplementedType:
|
|
41
|
+
def _unitary_(self) -> np.ndarray | NotImplementedType | None:
|
|
42
42
|
"""A unitary matrix describing this value, e.g. the matrix of a gate.
|
|
43
43
|
|
|
44
44
|
This method is used by the global `cirq.unitary` method. If this method
|
|
45
45
|
is not present, or returns NotImplemented, it is assumed that the
|
|
46
46
|
receiving object doesn't have a unitary matrix (resulting in a TypeError
|
|
47
|
-
or default result when calling `cirq.unitary` on it).
|
|
47
|
+
or default result when calling `cirq.unitary` on it). The ability to
|
|
48
48
|
return NotImplemented is useful when a class cannot know if it has a
|
|
49
|
-
matrix until runtime
|
|
50
|
-
cirq.X**sympy.Symbol('a') doesn't.
|
|
49
|
+
matrix until runtime; e.g., `cirq.X**c` normally has a matrix but
|
|
50
|
+
`cirq.X**sympy.Symbol('a')` doesn't.
|
|
51
51
|
|
|
52
52
|
The order of cells in the matrix is always implicit with respect to the
|
|
53
|
-
object being called. For example, for gates the matrix must be ordered
|
|
53
|
+
object being called. For example, for gates, the matrix must be ordered
|
|
54
54
|
with respect to the list of qubits that the gate is applied to. For
|
|
55
55
|
operations, the matrix is ordered to match the list returned by its
|
|
56
56
|
`qubits` attribute. The qubit-to-amplitude order mapping matches the
|
|
57
|
-
ordering of numpy.kron(A, B)
|
|
57
|
+
ordering of `numpy.kron(A, B)`, where A is a qubit earlier in the list
|
|
58
58
|
than the qubit B.
|
|
59
59
|
|
|
60
60
|
Returns:
|
|
@@ -68,7 +68,7 @@ class SupportsUnitary(Protocol):
|
|
|
68
68
|
|
|
69
69
|
This method is used by the global `cirq.has_unitary` method. If this
|
|
70
70
|
method is not present, or returns NotImplemented, it will fallback
|
|
71
|
-
to using _unitary_ with a default value, or False if neither exist.
|
|
71
|
+
to using `_unitary_()` with a default value, or False if neither exist.
|
|
72
72
|
|
|
73
73
|
Returns:
|
|
74
74
|
True if the value has a unitary matrix representation, False
|
|
@@ -81,17 +81,17 @@ def unitary(
|
|
|
81
81
|
) -> np.ndarray | TDefault:
|
|
82
82
|
"""Returns a unitary matrix describing the given value.
|
|
83
83
|
|
|
84
|
-
The matrix is determined by
|
|
84
|
+
The matrix is determined by the first of these strategies that succeeds:
|
|
85
85
|
|
|
86
|
-
- If the value is a
|
|
87
|
-
- The value has a `_unitary_` method that returns something besides None or
|
|
88
|
-
NotImplemented
|
|
86
|
+
- If the value is a NumPy array, it is returned directly.
|
|
87
|
+
- The value has a `_unitary_` method that returns something besides `None` or
|
|
88
|
+
`NotImplemented`. The matrix is whatever the method returned.
|
|
89
|
+
- The value has an `_apply_unitary_` method, and it returns something
|
|
90
|
+
besides `None` or `NotImplemented`. The matrix is created by applying
|
|
91
|
+
`_apply_unitary_` to an identity matrix.
|
|
89
92
|
- The value has a `_decompose_` method that returns a list of operations,
|
|
90
93
|
and each operation in the list has a unitary effect. The matrix is
|
|
91
94
|
created by aggregating the sub-operations' unitary effects.
|
|
92
|
-
- The value has an `_apply_unitary_` method, and it returns something
|
|
93
|
-
besides None or NotImplemented. The matrix is created by applying
|
|
94
|
-
`_apply_unitary_` to an identity matrix.
|
|
95
95
|
|
|
96
96
|
If none of these techniques succeeds, it is assumed that `val` doesn't have
|
|
97
97
|
a unitary effect. The order in which techniques are attempted is
|
|
@@ -100,8 +100,8 @@ def unitary(
|
|
|
100
100
|
Args:
|
|
101
101
|
val: The value to describe with a unitary matrix.
|
|
102
102
|
default: Determines the fallback behavior when `val` doesn't have
|
|
103
|
-
a unitary effect. If `default` is not set, a TypeError is raised.
|
|
104
|
-
`default` is set to a value, that value is returned.
|
|
103
|
+
a unitary effect. If `default` is not set, a `TypeError` is raised.
|
|
104
|
+
If `default` is set to a value, that value is returned.
|
|
105
105
|
|
|
106
106
|
Returns:
|
|
107
107
|
If `val` has a unitary effect, the corresponding unitary matrix.
|
|
@@ -135,13 +135,13 @@ def unitary(
|
|
|
135
135
|
f"type: {type(val)}\n"
|
|
136
136
|
f"value: {val!r}\n"
|
|
137
137
|
"\n"
|
|
138
|
-
"The value failed to satisfy any of the following criteria:\n"
|
|
138
|
+
"The given value failed to satisfy any of the following criteria:\n"
|
|
139
139
|
"- A `_unitary_(self)` method that returned a value "
|
|
140
|
-
"besides None or NotImplemented
|
|
140
|
+
"besides `None` or `NotImplemented`.\n"
|
|
141
141
|
"- A `_decompose_(self)` method that returned a "
|
|
142
142
|
"list of unitary operations.\n"
|
|
143
|
-
"- An `_apply_unitary_(self, args) method that returned a value "
|
|
144
|
-
"besides None or NotImplemented
|
|
143
|
+
"- An `_apply_unitary_(self, args)` method that returned a value "
|
|
144
|
+
"besides `None` or `NotImplemented`."
|
|
145
145
|
)
|
|
146
146
|
|
|
147
147
|
|